@ojiepermana/angular-theme 22.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/fesm2022/ojiepermana-angular-theme-layout-services.mjs +364 -0
  2. package/fesm2022/ojiepermana-angular-theme-layout-services.mjs.map +1 -0
  3. package/fesm2022/ojiepermana-angular-theme-layout-types.mjs +32 -0
  4. package/fesm2022/ojiepermana-angular-theme-layout-types.mjs.map +1 -0
  5. package/fesm2022/ojiepermana-angular-theme-layout.mjs +574 -0
  6. package/fesm2022/ojiepermana-angular-theme-layout.mjs.map +1 -0
  7. package/fesm2022/ojiepermana-angular-theme-page.mjs +510 -0
  8. package/fesm2022/ojiepermana-angular-theme-page.mjs.map +1 -0
  9. package/fesm2022/ojiepermana-angular-theme-styles.mjs +244 -0
  10. package/fesm2022/ojiepermana-angular-theme-styles.mjs.map +1 -0
  11. package/fesm2022/ojiepermana-angular-theme.mjs +11 -0
  12. package/fesm2022/ojiepermana-angular-theme.mjs.map +1 -0
  13. package/layout/README.md +471 -0
  14. package/package.json +60 -0
  15. package/page/README.md +239 -0
  16. package/styles/README.md +28 -0
  17. package/styles/css/index.css +9 -0
  18. package/styles/css/seasonal/base/components.css +129 -0
  19. package/styles/css/seasonal/base/package.css +6 -0
  20. package/styles/css/seasonal/base/tailwind.css +144 -0
  21. package/styles/css/seasonal/base/theme.css +287 -0
  22. package/styles/css/seasonal/base/tokens.css +152 -0
  23. package/styles/css/seasonal/ied/package.css +4 -0
  24. package/styles/css/seasonal/ied/theme.css +78 -0
  25. package/styles/css/seasonal/imlek/components.css +87 -0
  26. package/styles/css/seasonal/imlek/package.css +6 -0
  27. package/styles/css/seasonal/imlek/tailwind.css +144 -0
  28. package/styles/css/seasonal/imlek/theme.css +95 -0
  29. package/styles/css/seasonal/imlek/tokens.css +152 -0
  30. package/styles/css/seasonal/index.css +6 -0
  31. package/styles/css/seasonal/natal/package.css +4 -0
  32. package/styles/css/seasonal/natal/theme.css +78 -0
  33. package/styles/css/seasonal/new-year/package.css +4 -0
  34. package/styles/css/seasonal/new-year/theme.css +78 -0
  35. package/styles/css/seasonal/ramadhan/package.css +4 -0
  36. package/styles/css/seasonal/ramadhan/theme.css +78 -0
  37. package/types/ojiepermana-angular-theme-layout-services.d.ts +120 -0
  38. package/types/ojiepermana-angular-theme-layout-types.d.ts +33 -0
  39. package/types/ojiepermana-angular-theme-layout.d.ts +117 -0
  40. package/types/ojiepermana-angular-theme-page.d.ts +168 -0
  41. package/types/ojiepermana-angular-theme-styles.d.ts +89 -0
  42. package/types/ojiepermana-angular-theme.d.ts +2 -0
@@ -0,0 +1,364 @@
1
+ import { isPlatformBrowser } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, PLATFORM_ID, signal, Service, computed, DestroyRef } from '@angular/core';
4
+ import { LAYOUT_SURFACE_STORAGE_KEY, isUiLayoutSurface, LAYOUT_TYPE_STORAGE_KEY, isUiLayoutType, LAYOUT_WIDTH_STORAGE_KEY, isUiLayoutWidth, LAYOUT_APPEARANCE_STORAGE_KEY, LAYOUT_STYLE_STORAGE_KEY, LAYOUT_DEFAULT_SURFACE, LAYOUT_DEFAULT_TYPE, LAYOUT_DEFAULT_STYLE, LAYOUT_DEFAULT_WIDTH, isUiLayoutStyle } from '@ojiepermana/angular-theme/layout/types';
5
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
+ import { Router, NavigationStart, NavigationEnd, NavigationCancel, NavigationError, NavigationSkipped } from '@angular/router';
7
+ import { HttpContextToken } from '@angular/common/http';
8
+ import { finalize } from 'rxjs';
9
+
10
+ class LayoutService {
11
+ platformId = inject(PLATFORM_ID);
12
+ surfaceState = signal(this.getStoredSurface(), /* @ts-ignore */
13
+ ...(ngDevMode ? [{ debugName: "surfaceState" }] : /* istanbul ignore next */ []));
14
+ typeState = signal(this.getStoredType(), /* @ts-ignore */
15
+ ...(ngDevMode ? [{ debugName: "typeState" }] : /* istanbul ignore next */ []));
16
+ styleState = signal(this.getStoredStyle(), /* @ts-ignore */
17
+ ...(ngDevMode ? [{ debugName: "styleState" }] : /* istanbul ignore next */ []));
18
+ widthState = signal(this.getStoredWidth(), /* @ts-ignore */
19
+ ...(ngDevMode ? [{ debugName: "widthState" }] : /* istanbul ignore next */ []));
20
+ surface = this.surfaceState.asReadonly();
21
+ type = this.typeState.asReadonly();
22
+ appearance = this.styleState.asReadonly();
23
+ width = this.widthState.asReadonly();
24
+ registerDefaults(defaults) {
25
+ if (defaults.surface !== undefined) {
26
+ this.registerSurface(defaults.surface);
27
+ }
28
+ if (defaults.appearance !== undefined) {
29
+ this.registerAppearance(defaults.appearance);
30
+ }
31
+ if (defaults.type !== undefined) {
32
+ this.registerType(defaults.type);
33
+ }
34
+ if (defaults.width !== undefined) {
35
+ this.registerWidth(defaults.width);
36
+ }
37
+ return this;
38
+ }
39
+ registerSurface(surface) {
40
+ const storedSurface = this.readStorage(LAYOUT_SURFACE_STORAGE_KEY);
41
+ if (isUiLayoutSurface(storedSurface)) {
42
+ this.surfaceState.set(storedSurface);
43
+ return;
44
+ }
45
+ this.setSurface(surface);
46
+ }
47
+ registerType(type) {
48
+ const storedType = this.readStorage(LAYOUT_TYPE_STORAGE_KEY);
49
+ if (isUiLayoutType(storedType)) {
50
+ this.typeState.set(storedType);
51
+ return;
52
+ }
53
+ this.setType(type);
54
+ }
55
+ registerAppearance(appearance) {
56
+ this.setAppearance(this.getStoredAppearanceOrDefault(appearance));
57
+ }
58
+ registerWidth(width) {
59
+ const storedWidth = this.readStorage(LAYOUT_WIDTH_STORAGE_KEY);
60
+ if (isUiLayoutWidth(storedWidth)) {
61
+ this.widthState.set(storedWidth);
62
+ return;
63
+ }
64
+ this.setWidth(width);
65
+ }
66
+ setSurface(surface, options = {}) {
67
+ this.surfaceState.set(surface);
68
+ if (options.persist === false) {
69
+ return;
70
+ }
71
+ this.writeStorage(LAYOUT_SURFACE_STORAGE_KEY, surface);
72
+ }
73
+ setType(type, options = {}) {
74
+ this.typeState.set(type);
75
+ if (options.persist === false) {
76
+ return;
77
+ }
78
+ this.writeStorage(LAYOUT_TYPE_STORAGE_KEY, type);
79
+ }
80
+ setAppearance(appearance, options = {}) {
81
+ this.styleState.set(appearance);
82
+ if (options.persist === false) {
83
+ return;
84
+ }
85
+ this.writeStorage(LAYOUT_APPEARANCE_STORAGE_KEY, appearance);
86
+ this.removeStorage(LAYOUT_STYLE_STORAGE_KEY);
87
+ }
88
+ setWidth(width, options = {}) {
89
+ this.widthState.set(width);
90
+ if (options.persist === false) {
91
+ return;
92
+ }
93
+ this.writeStorage(LAYOUT_WIDTH_STORAGE_KEY, width);
94
+ }
95
+ getStoredSurface() {
96
+ const value = this.readStorage(LAYOUT_SURFACE_STORAGE_KEY);
97
+ return isUiLayoutSurface(value) ? value : LAYOUT_DEFAULT_SURFACE;
98
+ }
99
+ getStoredType() {
100
+ const value = this.readStorage(LAYOUT_TYPE_STORAGE_KEY);
101
+ return isUiLayoutType(value) ? value : LAYOUT_DEFAULT_TYPE;
102
+ }
103
+ getStoredAppearance() {
104
+ const value = this.readStoredAppearance();
105
+ return value ?? LAYOUT_DEFAULT_STYLE;
106
+ }
107
+ getStoredStyle() {
108
+ return this.getStoredAppearance();
109
+ }
110
+ getStoredWidth() {
111
+ const value = this.readStorage(LAYOUT_WIDTH_STORAGE_KEY);
112
+ return isUiLayoutWidth(value) ? value : LAYOUT_DEFAULT_WIDTH;
113
+ }
114
+ readStorage(key) {
115
+ const storage = this.getStorage();
116
+ if (!storage) {
117
+ return null;
118
+ }
119
+ try {
120
+ return storage.getItem(key);
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ }
126
+ removeStorage(key) {
127
+ const storage = this.getStorage();
128
+ if (!storage) {
129
+ return;
130
+ }
131
+ try {
132
+ storage.removeItem(key);
133
+ }
134
+ catch {
135
+ return;
136
+ }
137
+ }
138
+ writeStorage(key, value) {
139
+ const storage = this.getStorage();
140
+ if (!storage) {
141
+ return;
142
+ }
143
+ try {
144
+ storage.setItem(key, value);
145
+ }
146
+ catch {
147
+ return;
148
+ }
149
+ }
150
+ getStorage() {
151
+ if (!isPlatformBrowser(this.platformId)) {
152
+ return null;
153
+ }
154
+ try {
155
+ return localStorage;
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ }
161
+ readStoredAppearance() {
162
+ const appearance = this.readStorage(LAYOUT_APPEARANCE_STORAGE_KEY);
163
+ if (isUiLayoutStyle(appearance)) {
164
+ return appearance;
165
+ }
166
+ const legacyStyle = this.readStorage(LAYOUT_STYLE_STORAGE_KEY);
167
+ return isUiLayoutStyle(legacyStyle) ? legacyStyle : null;
168
+ }
169
+ getStoredAppearanceOrDefault(fallback) {
170
+ return this.readStoredAppearance() ?? fallback;
171
+ }
172
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Service });
173
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.2", ngImport: i0, type: LayoutService });
174
+ }
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutService, decorators: [{
176
+ type: Service
177
+ }] });
178
+
179
+ /** Progres awal saat bar mulai tampil, supaya garis langsung terlihat bergerak. */
180
+ const LAYOUT_LOADING_INITIAL_PROGRESS = 8;
181
+ /** Batas atas progres trickle; sisanya menunggu seluruh pekerjaan selesai. */
182
+ const LAYOUT_LOADING_TRICKLE_CEILING = 90;
183
+ /** Interval kenaikan progres trickle selama masih ada pekerjaan tertunda. */
184
+ const LAYOUT_LOADING_TRICKLE_INTERVAL_MS = 250;
185
+ /** Jeda setelah progres 100% sebelum bar disembunyikan, agar transisi terbaca. */
186
+ const LAYOUT_LOADING_HIDE_DELAY_MS = 200;
187
+ /**
188
+ * Pelacak loading global untuk garis progres di tepi atas browser.
189
+ *
190
+ * Otomatis aktif saat router memulai navigasi (membuka halaman) dan saat
191
+ * request HTTP berjalan lewat `layoutLoadingInterceptor`. Sumber loading lain
192
+ * (mis. pemuatan data manual) bisa ikut dilacak lewat pasangan
193
+ * `start()`/`done()` yang dihitung secara ref-count.
194
+ */
195
+ class LayoutLoadingService {
196
+ platformId = inject(PLATFORM_ID);
197
+ router = inject(Router, { optional: true });
198
+ pendingCount = signal(0, /* @ts-ignore */
199
+ ...(ngDevMode ? [{ debugName: "pendingCount" }] : /* istanbul ignore next */ []));
200
+ activeState = signal(false, /* @ts-ignore */
201
+ ...(ngDevMode ? [{ debugName: "activeState" }] : /* istanbul ignore next */ []));
202
+ progressState = signal(0, /* @ts-ignore */
203
+ ...(ngDevMode ? [{ debugName: "progressState" }] : /* istanbul ignore next */ []));
204
+ /** Bar sedang tampil (termasuk jeda singkat penyelesaian ke 100%). */
205
+ active = this.activeState.asReadonly();
206
+ /** Progres garis 0–100. */
207
+ progress = this.progressState.asReadonly();
208
+ /** Masih ada pekerjaan (navigasi/request/data) yang belum selesai. */
209
+ pending = computed(() => this.pendingCount() > 0, /* @ts-ignore */
210
+ ...(ngDevMode ? [{ debugName: "pending" }] : /* istanbul ignore next */ []));
211
+ hostRegistry = signal([], /* @ts-ignore */
212
+ ...(ngDevMode ? [{ debugName: "hostRegistry" }] : /* istanbul ignore next */ []));
213
+ /**
214
+ * Host `LayoutLoading` terdaftar paling awal yang menggambar bar. Instance
215
+ * lain (mis. di dalam `Layout` saat app root juga memasang `LayoutLoading`)
216
+ * menjadi inert supaya garis progres tidak dirender ganda.
217
+ */
218
+ primaryHostId = computed(() => this.hostRegistry()[0] ?? null, /* @ts-ignore */
219
+ ...(ngDevMode ? [{ debugName: "primaryHostId" }] : /* istanbul ignore next */ []));
220
+ trickleTimer = null;
221
+ hideTimer = null;
222
+ navigationPending = false;
223
+ nextHostId = 0;
224
+ constructor() {
225
+ this.observeRouterNavigation();
226
+ inject(DestroyRef).onDestroy(() => {
227
+ this.stopTrickle();
228
+ this.cancelScheduledHide();
229
+ });
230
+ }
231
+ /** Menandai satu pekerjaan dimulai; bar tampil saat pekerjaan pertama masuk. */
232
+ start() {
233
+ this.pendingCount.update((count) => count + 1);
234
+ if (this.pendingCount() === 1) {
235
+ this.show();
236
+ }
237
+ }
238
+ /** Menandai satu pekerjaan selesai; bar dituntaskan saat hitungan kembali nol. */
239
+ done() {
240
+ if (this.pendingCount() === 0) {
241
+ return;
242
+ }
243
+ this.pendingCount.update((count) => count - 1);
244
+ if (this.pendingCount() === 0) {
245
+ this.finish();
246
+ }
247
+ }
248
+ /** Mendaftarkan satu host `LayoutLoading`; mengembalikan id untuk unregister. */
249
+ registerHost() {
250
+ const hostId = this.nextHostId++;
251
+ this.hostRegistry.update((hosts) => [...hosts, hostId]);
252
+ return hostId;
253
+ }
254
+ /** Melepas host; host terdaftar berikutnya otomatis menjadi primary. */
255
+ unregisterHost(hostId) {
256
+ this.hostRegistry.update((hosts) => hosts.filter((registered) => registered !== hostId));
257
+ }
258
+ /** Memaksa nilai progres (0–100) selama bar aktif, mis. untuk upload besar. */
259
+ setProgress(value) {
260
+ if (!this.activeState()) {
261
+ return;
262
+ }
263
+ this.progressState.set(Math.min(100, Math.max(0, value)));
264
+ }
265
+ observeRouterNavigation() {
266
+ if (!this.router) {
267
+ return;
268
+ }
269
+ this.router.events.pipe(takeUntilDestroyed()).subscribe((event) => {
270
+ if (event instanceof NavigationStart) {
271
+ if (!this.navigationPending) {
272
+ this.navigationPending = true;
273
+ this.start();
274
+ }
275
+ return;
276
+ }
277
+ const navigationSettled = event instanceof NavigationEnd ||
278
+ event instanceof NavigationCancel ||
279
+ event instanceof NavigationError ||
280
+ event instanceof NavigationSkipped;
281
+ if (navigationSettled && this.navigationPending) {
282
+ this.navigationPending = false;
283
+ this.done();
284
+ }
285
+ });
286
+ }
287
+ show() {
288
+ this.cancelScheduledHide();
289
+ this.activeState.set(true);
290
+ this.progressState.set(LAYOUT_LOADING_INITIAL_PROGRESS);
291
+ this.startTrickle();
292
+ }
293
+ finish() {
294
+ this.stopTrickle();
295
+ this.progressState.set(100);
296
+ if (!this.isBrowser()) {
297
+ this.hide();
298
+ return;
299
+ }
300
+ this.hideTimer = setTimeout(() => {
301
+ this.hideTimer = null;
302
+ this.hide();
303
+ }, LAYOUT_LOADING_HIDE_DELAY_MS);
304
+ }
305
+ hide() {
306
+ this.activeState.set(false);
307
+ this.progressState.set(0);
308
+ }
309
+ startTrickle() {
310
+ if (!this.isBrowser() || this.trickleTimer !== null) {
311
+ return;
312
+ }
313
+ this.trickleTimer = setInterval(() => {
314
+ const current = this.progressState();
315
+ const next = current + (LAYOUT_LOADING_TRICKLE_CEILING - current) * 0.15;
316
+ this.progressState.set(Math.min(LAYOUT_LOADING_TRICKLE_CEILING, next));
317
+ }, LAYOUT_LOADING_TRICKLE_INTERVAL_MS);
318
+ }
319
+ stopTrickle() {
320
+ if (this.trickleTimer !== null) {
321
+ clearInterval(this.trickleTimer);
322
+ this.trickleTimer = null;
323
+ }
324
+ }
325
+ cancelScheduledHide() {
326
+ if (this.hideTimer !== null) {
327
+ clearTimeout(this.hideTimer);
328
+ this.hideTimer = null;
329
+ }
330
+ }
331
+ isBrowser() {
332
+ return isPlatformBrowser(this.platformId);
333
+ }
334
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutLoadingService, deps: [], target: i0.ɵɵFactoryTarget.Service });
335
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.2", ngImport: i0, type: LayoutLoadingService });
336
+ }
337
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutLoadingService, decorators: [{
338
+ type: Service
339
+ }], ctorParameters: () => [] });
340
+
341
+ /**
342
+ * Set `true` pada `HttpContext` request untuk mengecualikannya dari garis
343
+ * progres, mis. polling/heartbeat yang tidak boleh memicu indikator loading.
344
+ */
345
+ const LAYOUT_LOADING_SKIP = new HttpContextToken(() => false);
346
+ /**
347
+ * Interceptor yang menyalakan garis progres `LayoutLoading` selama request
348
+ * HTTP berjalan. Daftarkan lewat `withInterceptors([...])` di aplikasi.
349
+ */
350
+ const layoutLoadingInterceptor = (request, next) => {
351
+ if (request.context.get(LAYOUT_LOADING_SKIP)) {
352
+ return next(request);
353
+ }
354
+ const loading = inject(LayoutLoadingService);
355
+ loading.start();
356
+ return next(request).pipe(finalize(() => loading.done()));
357
+ };
358
+
359
+ /**
360
+ * Generated bundle index. Do not edit.
361
+ */
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
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,32 @@
1
+ const LAYOUT_TYPES = ['vertical', 'horizontal', 'empty', 'fluid'];
2
+ const LAYOUT_SURFACES = ['flat', 'grid', 'honeycome', 'line-vertical', 'line-horizontal'];
3
+ const LAYOUT_STYLES = ['flat', 'border-rail'];
4
+ const LAYOUT_WIDTHS = ['full', 'wide', 'container', 'fluid'];
5
+ const LAYOUT_DEFAULT_SURFACE = 'flat';
6
+ const LAYOUT_DEFAULT_TYPE = 'vertical';
7
+ const LAYOUT_DEFAULT_STYLE = 'flat';
8
+ const LAYOUT_DEFAULT_WIDTH = 'full';
9
+ const LAYOUT_SURFACE_STORAGE_KEY = 'layout-surface';
10
+ const LAYOUT_APPEARANCE_STORAGE_KEY = 'layout-appearance';
11
+ const LAYOUT_TYPE_STORAGE_KEY = 'layout-type';
12
+ const LAYOUT_STYLE_STORAGE_KEY = 'layout-style';
13
+ const LAYOUT_WIDTH_STORAGE_KEY = 'layout-width';
14
+ function isUiLayoutSurface(value) {
15
+ return value !== null && LAYOUT_SURFACES.includes(value);
16
+ }
17
+ function isUiLayoutType(value) {
18
+ return value !== null && LAYOUT_TYPES.includes(value);
19
+ }
20
+ function isUiLayoutStyle(value) {
21
+ return value !== null && LAYOUT_STYLES.includes(value);
22
+ }
23
+ function isUiLayoutWidth(value) {
24
+ return value !== null && LAYOUT_WIDTHS.includes(value);
25
+ }
26
+
27
+ /**
28
+ * Generated bundle index. Do not edit.
29
+ */
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
@@ -0,0 +1 @@
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;;;;"}