@edsis/ui 21.3.8 → 21.3.10

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.
@@ -257,7 +257,7 @@ class UiPageComponent {
257
257
  <ng-content select="ui-page-side" />
258
258
  }
259
259
 
260
- <ng-content select="ui-page-content" />
260
+ <ng-content select="ui-page-content, ui-page-dashboard" />
261
261
  </div>
262
262
 
263
263
  <ng-content select="ui-page-footer" />
@@ -299,7 +299,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
299
299
  <ng-content select="ui-page-side" />
300
300
  }
301
301
 
302
- <ng-content select="ui-page-content" />
302
+ <ng-content select="ui-page-content, ui-page-dashboard" />
303
303
  </div>
304
304
 
305
305
  <ng-content select="ui-page-footer" />
@@ -357,6 +357,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
357
357
  }]
358
358
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], toggled: [{ type: i0.Output, args: ["toggled"] }] } });
359
359
 
360
+ function buildPageBodyClasses(scroll, customClass) {
361
+ return cn('block min-w-0', scroll === 'content' && 'h-full min-h-0 overflow-auto', scroll === 'page' && 'overflow-visible', customClass);
362
+ }
360
363
  class UiPageHeaderComponent {
361
364
  page = inject(UiPageStateService, { optional: true });
362
365
  class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
@@ -381,7 +384,7 @@ class UiPageContentComponent {
381
384
  page = inject(UiPageStateService, { optional: true });
382
385
  class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
383
386
  resolvedScroll = computed(() => this.page?.scroll() ?? UI_PAGE_DEFAULT_SCROLL, ...(ngDevMode ? [{ debugName: "resolvedScroll" }] : /* istanbul ignore next */ []));
384
- classes = computed(() => cn('block min-w-0', this.resolvedScroll() === 'content' && 'h-full min-h-0 overflow-auto', this.resolvedScroll() === 'page' && 'overflow-visible', this.class()), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
387
+ classes = computed(() => buildPageBodyClasses(this.resolvedScroll(), this.class()), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
385
388
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiPageContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
386
389
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.15", type: UiPageContentComponent, isStandalone: true, selector: "ui-page-content", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-page-slot": "content" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
387
390
  }
@@ -397,6 +400,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
397
400
  template: `<ng-content />`,
398
401
  }]
399
402
  }], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
403
+ class UiPageDashboardComponent {
404
+ page = inject(UiPageStateService, { optional: true });
405
+ class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
406
+ resolvedScroll = computed(() => this.page?.scroll() ?? UI_PAGE_DEFAULT_SCROLL, ...(ngDevMode ? [{ debugName: "resolvedScroll" }] : /* istanbul ignore next */ []));
407
+ classes = computed(() => buildPageBodyClasses(this.resolvedScroll(), this.class()), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
408
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiPageDashboardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
409
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.15", type: UiPageDashboardComponent, isStandalone: true, selector: "ui-page-dashboard", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-page-slot": "dashboard" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
410
+ }
411
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiPageDashboardComponent, decorators: [{
412
+ type: Component,
413
+ args: [{
414
+ selector: 'ui-page-dashboard',
415
+ changeDetection: ChangeDetectionStrategy.OnPush,
416
+ host: {
417
+ '[class]': 'classes()',
418
+ 'data-page-slot': 'dashboard',
419
+ },
420
+ template: `<ng-content />`,
421
+ }]
422
+ }], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
400
423
  class UiPageFooterComponent {
401
424
  page = inject(UiPageStateService, { optional: true });
402
425
  class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
@@ -422,5 +445,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
422
445
  * Generated bundle index. Do not edit.
423
446
  */
424
447
 
425
- export { UI_PAGE_DEFAULT_HEIGHT, UI_PAGE_DEFAULT_SCROLL, UI_PAGE_DEFAULT_SIDE_MODE, UI_PAGE_DEFAULT_SIDE_POSITION, UI_PAGE_DEFAULT_SIDE_WIDTH, UI_PAGE_DEFAULT_VARIANT, UI_PAGE_HEIGHT_VALUES, UI_PAGE_SCROLL_VALUES, UI_PAGE_SIDE_MODES, UI_PAGE_SIDE_POSITIONS, UI_PAGE_VARIANTS, UiPageComponent, UiPageContentComponent, UiPageFooterComponent, UiPageHeaderComponent, UiPageSideComponent, UiPageSideToggleComponent, isUiPageHeight, isUiPageScroll, isUiPageSideMode, isUiPageSidePosition, isUiPageVariant };
448
+ export { UI_PAGE_DEFAULT_HEIGHT, UI_PAGE_DEFAULT_SCROLL, UI_PAGE_DEFAULT_SIDE_MODE, UI_PAGE_DEFAULT_SIDE_POSITION, UI_PAGE_DEFAULT_SIDE_WIDTH, UI_PAGE_DEFAULT_VARIANT, UI_PAGE_HEIGHT_VALUES, UI_PAGE_SCROLL_VALUES, UI_PAGE_SIDE_MODES, UI_PAGE_SIDE_POSITIONS, UI_PAGE_VARIANTS, UiPageComponent, UiPageContentComponent, UiPageDashboardComponent, UiPageFooterComponent, UiPageHeaderComponent, UiPageSideComponent, UiPageSideToggleComponent, isUiPageHeight, isUiPageScroll, isUiPageSideMode, isUiPageSidePosition, isUiPageVariant };
426
449
  //# sourceMappingURL=edsis-ui-page.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"edsis-ui-page.mjs","sources":["../../../library/ui/page/page.types.ts","../../../library/ui/page/page-state.service.ts","../../../library/ui/page/page-side.component.ts","../../../library/ui/page/page.component.ts","../../../library/ui/page/page-side-toggle.component.ts","../../../library/ui/page/page-slots.component.ts","../../../library/ui/page/edsis-ui-page.ts"],"sourcesContent":["export const UI_PAGE_VARIANTS = ['stacked', 'side'] as const;\nexport const UI_PAGE_SIDE_POSITIONS = ['left', 'right'] as const;\nexport const UI_PAGE_SIDE_MODES = ['sticky', 'drawer', 'overlay'] as const;\nexport const UI_PAGE_SCROLL_VALUES = ['content', 'page'] as const;\nexport const UI_PAGE_HEIGHT_VALUES = ['auto', 'fix'] as const;\n\nexport type UiPageVariant = (typeof UI_PAGE_VARIANTS)[number];\nexport type UiPageSidePosition = (typeof UI_PAGE_SIDE_POSITIONS)[number];\nexport type UiPageSideMode = (typeof UI_PAGE_SIDE_MODES)[number];\nexport type UiPageScroll = (typeof UI_PAGE_SCROLL_VALUES)[number];\nexport type UiPageHeight = (typeof UI_PAGE_HEIGHT_VALUES)[number];\n\nexport const UI_PAGE_DEFAULT_VARIANT: UiPageVariant = 'stacked';\nexport const UI_PAGE_DEFAULT_SIDE_POSITION: UiPageSidePosition = 'left';\nexport const UI_PAGE_DEFAULT_SIDE_MODE: UiPageSideMode = 'sticky';\nexport const UI_PAGE_DEFAULT_SCROLL: UiPageScroll = 'content';\nexport const UI_PAGE_DEFAULT_HEIGHT: UiPageHeight = 'auto';\nexport const UI_PAGE_DEFAULT_SIDE_WIDTH = '16rem';\n\nexport function isUiPageVariant(value: string | null): value is UiPageVariant {\n return value !== null && (UI_PAGE_VARIANTS as readonly string[]).includes(value);\n}\n\nexport function isUiPageSidePosition(value: string | null): value is UiPageSidePosition {\n return value !== null && (UI_PAGE_SIDE_POSITIONS as readonly string[]).includes(value);\n}\n\nexport function isUiPageSideMode(value: string | null): value is UiPageSideMode {\n return value !== null && (UI_PAGE_SIDE_MODES as readonly string[]).includes(value);\n}\n\nexport function isUiPageScroll(value: string | null): value is UiPageScroll {\n return value !== null && (UI_PAGE_SCROLL_VALUES as readonly string[]).includes(value);\n}\n\nexport function isUiPageHeight(value: string | null): value is UiPageHeight {\n return value !== null && (UI_PAGE_HEIGHT_VALUES as readonly string[]).includes(value);\n}\n","import { Injectable, computed, signal } from '@angular/core';\nimport {\n UI_PAGE_DEFAULT_HEIGHT,\n UI_PAGE_DEFAULT_SCROLL,\n UI_PAGE_DEFAULT_SIDE_MODE,\n UI_PAGE_DEFAULT_SIDE_POSITION,\n UI_PAGE_DEFAULT_SIDE_WIDTH,\n UI_PAGE_DEFAULT_VARIANT,\n type UiPageHeight,\n type UiPageScroll,\n type UiPageSideMode,\n type UiPageSidePosition,\n type UiPageVariant,\n} from './page.types';\n\n@Injectable()\nexport class UiPageStateService {\n private readonly variantState = signal<UiPageVariant>(UI_PAGE_DEFAULT_VARIANT);\n private readonly heightState = signal<UiPageHeight>(UI_PAGE_DEFAULT_HEIGHT);\n private readonly scrollState = signal<UiPageScroll>(UI_PAGE_DEFAULT_SCROLL);\n private readonly positionState = signal<UiPageSidePosition>(UI_PAGE_DEFAULT_SIDE_POSITION);\n private readonly sideModeState = signal<UiPageSideMode>(UI_PAGE_DEFAULT_SIDE_MODE);\n private readonly internalSideOpenState = signal(false);\n private readonly controlledSideOpenState = signal<boolean | null>(null);\n private readonly sideWidthState = signal(UI_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: UiPageVariant;\n height: UiPageHeight;\n scroll: UiPageScroll;\n position: UiPageSidePosition;\n sideMode: UiPageSideMode;\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: UiPageSideMode; position: UiPageSidePosition; 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 '@edsis/ui/utils';\nimport { UiPageStateService } from './page-state.service';\nimport {\n UI_PAGE_DEFAULT_SCROLL,\n UI_PAGE_DEFAULT_SIDE_WIDTH,\n type UiPageSideMode,\n type UiPageSidePosition,\n} from './page.types';\n\nlet nextPageSideId = 0;\n\n@Component({\n selector: 'ui-page-side',\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.--ui-page-side-width]': 'resolvedWidth()',\n },\n template: `<ng-content />`,\n})\nexport class UiPageSideComponent {\n private readonly document = inject(DOCUMENT, { optional: true });\n protected readonly page = inject(UiPageStateService);\n protected readonly resolvedId = `ui-page-side-${++nextPageSideId}`;\n\n readonly mode = input<UiPageSideMode>('sticky');\n readonly position = input<UiPageSidePosition | 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(\n () => this.width() ?? this.page.sideWidth() ?? UI_PAGE_DEFAULT_SIDE_WIDTH,\n );\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() ?? UI_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(--ui-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(--ui-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(--ui-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 '@edsis/ui/utils';\nimport { UiPageSideComponent } from './page-side.component';\nimport { UiPageStateService } from './page-state.service';\nimport {\n UI_PAGE_DEFAULT_HEIGHT,\n UI_PAGE_DEFAULT_SCROLL,\n UI_PAGE_DEFAULT_SIDE_MODE,\n UI_PAGE_DEFAULT_SIDE_POSITION,\n UI_PAGE_DEFAULT_SIDE_WIDTH,\n UI_PAGE_DEFAULT_VARIANT,\n type UiPageHeight,\n type UiPageScroll,\n type UiPageSideMode,\n type UiPageSidePosition,\n type UiPageVariant,\n} from './page.types';\n\n@Component({\n selector: 'ui-page',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [UiPageStateService],\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.--ui-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=\"ui-page-header\" />\n <ng-content select=\"ui-page-side-toggle\" />\n\n <div [class]=\"bodyClasses()\">\n @if (variant() === 'side') {\n <ng-content select=\"ui-page-side\" />\n }\n\n <ng-content select=\"ui-page-content\" />\n </div>\n\n <ng-content select=\"ui-page-footer\" />\n </div>\n `,\n})\nexport class UiPageComponent {\n protected readonly page = inject(UiPageStateService);\n protected readonly projectedSide = contentChild(UiPageSideComponent);\n\n readonly variant = input<UiPageVariant>(UI_PAGE_DEFAULT_VARIANT);\n readonly height = input<UiPageHeight>(UI_PAGE_DEFAULT_HEIGHT);\n readonly scroll = input<UiPageScroll>(UI_PAGE_DEFAULT_SCROLL);\n readonly position = input<UiPageSidePosition>(UI_PAGE_DEFAULT_SIDE_POSITION);\n readonly sideMode = input<UiPageSideMode>(UI_PAGE_DEFAULT_SIDE_MODE);\n readonly sideOpen = input<boolean | null>(null);\n readonly sideWidth = input<string>(UI_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(--ui-page-side-width)_minmax(0,1fr)]'\n : 'grid-cols-[minmax(0,1fr)_var(--ui-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 '@edsis/ui/utils';\nimport { UiPageStateService } from './page-state.service';\n\n@Component({\n selector: 'ui-page-side-toggle',\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 UiPageSideToggleComponent {\n protected readonly page = inject(UiPageStateService);\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 '@edsis/ui/utils';\nimport { UiPageStateService } from './page-state.service';\nimport { UI_PAGE_DEFAULT_HEIGHT, UI_PAGE_DEFAULT_SCROLL } from './page.types';\n\n@Component({\n selector: 'ui-page-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'header',\n },\n template: `<ng-content />`,\n})\nexport class UiPageHeaderComponent {\n private readonly page = inject(UiPageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedHeight = computed(() => this.page?.height() ?? UI_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: 'ui-page-content',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'content',\n },\n template: `<ng-content />`,\n})\nexport class UiPageContentComponent {\n private readonly page = inject(UiPageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedScroll = computed(() => this.page?.scroll() ?? UI_PAGE_DEFAULT_SCROLL);\n\n protected readonly classes = computed(() =>\n cn(\n 'block min-w-0',\n this.resolvedScroll() === 'content' && 'h-full min-h-0 overflow-auto',\n this.resolvedScroll() === 'page' && 'overflow-visible',\n this.class(),\n ),\n );\n}\n\n@Component({\n selector: 'ui-page-footer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'footer',\n },\n template: `<ng-content />`,\n})\nexport class UiPageFooterComponent {\n private readonly page = inject(UiPageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedHeight = computed(() => this.page?.height() ?? UI_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
+ {"version":3,"file":"edsis-ui-page.mjs","sources":["../../../library/ui/page/page.types.ts","../../../library/ui/page/page-state.service.ts","../../../library/ui/page/page-side.component.ts","../../../library/ui/page/page.component.ts","../../../library/ui/page/page-side-toggle.component.ts","../../../library/ui/page/page-slots.component.ts","../../../library/ui/page/edsis-ui-page.ts"],"sourcesContent":["export const UI_PAGE_VARIANTS = ['stacked', 'side'] as const;\nexport const UI_PAGE_SIDE_POSITIONS = ['left', 'right'] as const;\nexport const UI_PAGE_SIDE_MODES = ['sticky', 'drawer', 'overlay'] as const;\nexport const UI_PAGE_SCROLL_VALUES = ['content', 'page'] as const;\nexport const UI_PAGE_HEIGHT_VALUES = ['auto', 'fix'] as const;\n\nexport type UiPageVariant = (typeof UI_PAGE_VARIANTS)[number];\nexport type UiPageSidePosition = (typeof UI_PAGE_SIDE_POSITIONS)[number];\nexport type UiPageSideMode = (typeof UI_PAGE_SIDE_MODES)[number];\nexport type UiPageScroll = (typeof UI_PAGE_SCROLL_VALUES)[number];\nexport type UiPageHeight = (typeof UI_PAGE_HEIGHT_VALUES)[number];\n\nexport const UI_PAGE_DEFAULT_VARIANT: UiPageVariant = 'stacked';\nexport const UI_PAGE_DEFAULT_SIDE_POSITION: UiPageSidePosition = 'left';\nexport const UI_PAGE_DEFAULT_SIDE_MODE: UiPageSideMode = 'sticky';\nexport const UI_PAGE_DEFAULT_SCROLL: UiPageScroll = 'content';\nexport const UI_PAGE_DEFAULT_HEIGHT: UiPageHeight = 'auto';\nexport const UI_PAGE_DEFAULT_SIDE_WIDTH = '16rem';\n\nexport function isUiPageVariant(value: string | null): value is UiPageVariant {\n return value !== null && (UI_PAGE_VARIANTS as readonly string[]).includes(value);\n}\n\nexport function isUiPageSidePosition(value: string | null): value is UiPageSidePosition {\n return value !== null && (UI_PAGE_SIDE_POSITIONS as readonly string[]).includes(value);\n}\n\nexport function isUiPageSideMode(value: string | null): value is UiPageSideMode {\n return value !== null && (UI_PAGE_SIDE_MODES as readonly string[]).includes(value);\n}\n\nexport function isUiPageScroll(value: string | null): value is UiPageScroll {\n return value !== null && (UI_PAGE_SCROLL_VALUES as readonly string[]).includes(value);\n}\n\nexport function isUiPageHeight(value: string | null): value is UiPageHeight {\n return value !== null && (UI_PAGE_HEIGHT_VALUES as readonly string[]).includes(value);\n}\n","import { Injectable, computed, signal } from '@angular/core';\nimport {\n UI_PAGE_DEFAULT_HEIGHT,\n UI_PAGE_DEFAULT_SCROLL,\n UI_PAGE_DEFAULT_SIDE_MODE,\n UI_PAGE_DEFAULT_SIDE_POSITION,\n UI_PAGE_DEFAULT_SIDE_WIDTH,\n UI_PAGE_DEFAULT_VARIANT,\n type UiPageHeight,\n type UiPageScroll,\n type UiPageSideMode,\n type UiPageSidePosition,\n type UiPageVariant,\n} from './page.types';\n\n@Injectable()\nexport class UiPageStateService {\n private readonly variantState = signal<UiPageVariant>(UI_PAGE_DEFAULT_VARIANT);\n private readonly heightState = signal<UiPageHeight>(UI_PAGE_DEFAULT_HEIGHT);\n private readonly scrollState = signal<UiPageScroll>(UI_PAGE_DEFAULT_SCROLL);\n private readonly positionState = signal<UiPageSidePosition>(UI_PAGE_DEFAULT_SIDE_POSITION);\n private readonly sideModeState = signal<UiPageSideMode>(UI_PAGE_DEFAULT_SIDE_MODE);\n private readonly internalSideOpenState = signal(false);\n private readonly controlledSideOpenState = signal<boolean | null>(null);\n private readonly sideWidthState = signal(UI_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: UiPageVariant;\n height: UiPageHeight;\n scroll: UiPageScroll;\n position: UiPageSidePosition;\n sideMode: UiPageSideMode;\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: UiPageSideMode; position: UiPageSidePosition; 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 '@edsis/ui/utils';\nimport { UiPageStateService } from './page-state.service';\nimport {\n UI_PAGE_DEFAULT_SCROLL,\n UI_PAGE_DEFAULT_SIDE_WIDTH,\n type UiPageSideMode,\n type UiPageSidePosition,\n} from './page.types';\n\nlet nextPageSideId = 0;\n\n@Component({\n selector: 'ui-page-side',\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.--ui-page-side-width]': 'resolvedWidth()',\n },\n template: `<ng-content />`,\n})\nexport class UiPageSideComponent {\n private readonly document = inject(DOCUMENT, { optional: true });\n protected readonly page = inject(UiPageStateService);\n protected readonly resolvedId = `ui-page-side-${++nextPageSideId}`;\n\n readonly mode = input<UiPageSideMode>('sticky');\n readonly position = input<UiPageSidePosition | 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(\n () => this.width() ?? this.page.sideWidth() ?? UI_PAGE_DEFAULT_SIDE_WIDTH,\n );\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() ?? UI_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(--ui-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(--ui-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(--ui-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 '@edsis/ui/utils';\nimport { UiPageSideComponent } from './page-side.component';\nimport { UiPageStateService } from './page-state.service';\nimport {\n UI_PAGE_DEFAULT_HEIGHT,\n UI_PAGE_DEFAULT_SCROLL,\n UI_PAGE_DEFAULT_SIDE_MODE,\n UI_PAGE_DEFAULT_SIDE_POSITION,\n UI_PAGE_DEFAULT_SIDE_WIDTH,\n UI_PAGE_DEFAULT_VARIANT,\n type UiPageHeight,\n type UiPageScroll,\n type UiPageSideMode,\n type UiPageSidePosition,\n type UiPageVariant,\n} from './page.types';\n\n@Component({\n selector: 'ui-page',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [UiPageStateService],\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.--ui-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=\"ui-page-header\" />\n <ng-content select=\"ui-page-side-toggle\" />\n\n <div [class]=\"bodyClasses()\">\n @if (variant() === 'side') {\n <ng-content select=\"ui-page-side\" />\n }\n\n <ng-content select=\"ui-page-content, ui-page-dashboard\" />\n </div>\n\n <ng-content select=\"ui-page-footer\" />\n </div>\n `,\n})\nexport class UiPageComponent {\n protected readonly page = inject(UiPageStateService);\n protected readonly projectedSide = contentChild(UiPageSideComponent);\n\n readonly variant = input<UiPageVariant>(UI_PAGE_DEFAULT_VARIANT);\n readonly height = input<UiPageHeight>(UI_PAGE_DEFAULT_HEIGHT);\n readonly scroll = input<UiPageScroll>(UI_PAGE_DEFAULT_SCROLL);\n readonly position = input<UiPageSidePosition>(UI_PAGE_DEFAULT_SIDE_POSITION);\n readonly sideMode = input<UiPageSideMode>(UI_PAGE_DEFAULT_SIDE_MODE);\n readonly sideOpen = input<boolean | null>(null);\n readonly sideWidth = input<string>(UI_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(--ui-page-side-width)_minmax(0,1fr)]'\n : 'grid-cols-[minmax(0,1fr)_var(--ui-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 '@edsis/ui/utils';\nimport { UiPageStateService } from './page-state.service';\n\n@Component({\n selector: 'ui-page-side-toggle',\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 UiPageSideToggleComponent {\n protected readonly page = inject(UiPageStateService);\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 '@edsis/ui/utils';\nimport { UiPageStateService } from './page-state.service';\nimport { UI_PAGE_DEFAULT_HEIGHT, UI_PAGE_DEFAULT_SCROLL, type UiPageScroll } from './page.types';\n\nfunction buildPageBodyClasses(scroll: UiPageScroll, 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: 'ui-page-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'header',\n },\n template: `<ng-content />`,\n})\nexport class UiPageHeaderComponent {\n private readonly page = inject(UiPageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedHeight = computed(() => this.page?.height() ?? UI_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: 'ui-page-content',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'content',\n },\n template: `<ng-content />`,\n})\nexport class UiPageContentComponent {\n private readonly page = inject(UiPageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedScroll = computed(() => this.page?.scroll() ?? UI_PAGE_DEFAULT_SCROLL);\n\n protected readonly classes = computed(() => buildPageBodyClasses(this.resolvedScroll(), this.class()));\n}\n\n@Component({\n selector: 'ui-page-dashboard',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'dashboard',\n },\n template: `<ng-content />`,\n})\nexport class UiPageDashboardComponent {\n private readonly page = inject(UiPageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedScroll = computed(() => this.page?.scroll() ?? UI_PAGE_DEFAULT_SCROLL);\n\n protected readonly classes = computed(() => buildPageBodyClasses(this.resolvedScroll(), this.class()));\n}\n\n@Component({\n selector: 'ui-page-footer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'footer',\n },\n template: `<ng-content />`,\n})\nexport class UiPageFooterComponent {\n private readonly page = inject(UiPageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedHeight = computed(() => this.page?.height() ?? UI_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,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, DestroyRef, signal, computed, effect, Injectable, makeEnvironmentProviders, provideEnvironmentInitializer } from '@angular/core';
3
3
  import { DOCUMENT } from '@angular/common';
4
+ import { UiMaterialSymbolsService } from '@edsis/ui/icon';
4
5
 
5
6
  const UI_THEME_OPTIONS = new InjectionToken('UI_THEME_OPTIONS');
6
7
 
@@ -199,6 +200,9 @@ function provideUiTheme(options = {}) {
199
200
  },
200
201
  provideEnvironmentInitializer(() => {
201
202
  inject(DOCUMENT, { optional: true })?.documentElement.setAttribute('theme-brand', normalizeThemeBrand(options.brand));
203
+ if (options.icons?.materialSymbols !== false) {
204
+ inject(UiMaterialSymbolsService).ensureLoaded();
205
+ }
202
206
  inject(ThemeModeService);
203
207
  inject(ThemeSeasonService);
204
208
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"edsis-ui-theme.mjs","sources":["../../../library/ui/theme/theme.config.ts","../../../library/ui/theme/theme.types.ts","../../../library/ui/theme/theme-mode.service.ts","../../../library/ui/theme/theme-season.service.ts","../../../library/ui/theme/theme.provider.ts","../../../library/ui/theme/edsis-ui-theme.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport type { ThemeBrand, ThemeMode, ThemeSeason } from './theme.types';\n\nexport interface UiThemeOptions {\n readonly brand?: ThemeBrand;\n readonly mode?: ThemeMode;\n readonly season?: ThemeSeason;\n}\n\nexport const UI_THEME_OPTIONS = new InjectionToken<Readonly<UiThemeOptions>>('UI_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 ThemeBrand = string;\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_BRAND: ThemeBrand = 'etos';\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 normalizeThemeBrand(value: string | null | undefined): ThemeBrand {\n const normalized = value?.trim();\n\n return normalized ? normalized : DEFAULT_THEME_BRAND;\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, Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { UI_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@Injectable({ providedIn: 'root' })\nexport class ThemeModeService {\n private readonly documentRef = inject(DOCUMENT, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n private readonly options = inject(UI_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 { Injectable, effect, inject, signal } from '@angular/core';\nimport { UI_THEME_OPTIONS } from './theme.config';\nimport { DEFAULT_THEME_SEASON, THEME_SEASON_STORAGE_KEY, type ThemeSeason, normalizeThemeSeason } from './theme.types';\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeSeasonService {\n private readonly documentRef = inject(DOCUMENT, { optional: true });\n private readonly options = inject(UI_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 });\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 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 {\n type EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { UI_THEME_OPTIONS, type UiThemeOptions } from './theme.config';\nimport { ThemeModeService } from './theme-mode.service';\nimport { ThemeSeasonService } from './theme-season.service';\nimport { normalizeThemeBrand } from './theme.types';\n\nexport function provideUiTheme(options: UiThemeOptions = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: UI_THEME_OPTIONS,\n useValue: options,\n },\n provideEnvironmentInitializer(() => {\n inject(DOCUMENT, { optional: true })?.documentElement.setAttribute(\n 'theme-brand',\n normalizeThemeBrand(options.brand),\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
+ {"version":3,"file":"edsis-ui-theme.mjs","sources":["../../../library/ui/theme/theme.config.ts","../../../library/ui/theme/theme.types.ts","../../../library/ui/theme/theme-mode.service.ts","../../../library/ui/theme/theme-season.service.ts","../../../library/ui/theme/theme.provider.ts","../../../library/ui/theme/edsis-ui-theme.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport type { ThemeBrand, ThemeMode, ThemeSeason } from './theme.types';\n\nexport interface UiThemeIconOptions {\n readonly materialSymbols?: boolean;\n}\n\nexport interface UiThemeOptions {\n readonly brand?: ThemeBrand;\n readonly mode?: ThemeMode;\n readonly season?: ThemeSeason;\n readonly icons?: UiThemeIconOptions;\n}\n\nexport const UI_THEME_OPTIONS = new InjectionToken<Readonly<UiThemeOptions>>('UI_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 ThemeBrand = string;\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_BRAND: ThemeBrand = 'etos';\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 normalizeThemeBrand(value: string | null | undefined): ThemeBrand {\n const normalized = value?.trim();\n\n return normalized ? normalized : DEFAULT_THEME_BRAND;\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, Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { UI_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@Injectable({ providedIn: 'root' })\nexport class ThemeModeService {\n private readonly documentRef = inject(DOCUMENT, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n private readonly options = inject(UI_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 { Injectable, effect, inject, signal } from '@angular/core';\nimport { UI_THEME_OPTIONS } from './theme.config';\nimport { DEFAULT_THEME_SEASON, THEME_SEASON_STORAGE_KEY, type ThemeSeason, normalizeThemeSeason } from './theme.types';\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeSeasonService {\n private readonly documentRef = inject(DOCUMENT, { optional: true });\n private readonly options = inject(UI_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 });\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 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 {\n type EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { UiMaterialSymbolsService } from '@edsis/ui/icon';\nimport { UI_THEME_OPTIONS, type UiThemeOptions } from './theme.config';\nimport { ThemeModeService } from './theme-mode.service';\nimport { ThemeSeasonService } from './theme-season.service';\nimport { normalizeThemeBrand } from './theme.types';\n\nexport function provideUiTheme(options: UiThemeOptions = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: UI_THEME_OPTIONS,\n useValue: options,\n },\n provideEnvironmentInitializer(() => {\n inject(DOCUMENT, { optional: true })?.documentElement.setAttribute(\n 'theme-brand',\n normalizeThemeBrand(options.brand),\n );\n\n if (options.icons?.materialSymbols !== false) {\n inject(UiMaterialSymbolsService).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":";;;;;MAca,gBAAgB,GAAG,IAAI,cAAc,CAA2B,kBAAkB;;ACdxF,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ;MACxC,oBAAoB,GAAG,CAAC,OAAO,EAAE,MAAM;AAC7C,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU;AAO9E,MAAM,mBAAmB,GAAe;AACxC,MAAM,kBAAkB,GAAc;AACtC,MAAM,oBAAoB,GAAgB;AAE1C,MAAM,sBAAsB,GAAG;AAC/B,MAAM,wBAAwB,GAAG;AAElC,SAAU,WAAW,CAAC,KAAgC,EAAA;IAC1D,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAkB,CAAC;AAC9E;AAEM,SAAU,mBAAmB,CAAC,KAAgC,EAAA;IAClE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAA0B,CAAC;AAC/F;AAEM,SAAU,aAAa,CAAC,KAAgC,EAAA;IAC5D,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAoB,CAAC;AAClF;AAEM,SAAU,kBAAkB,CAAC,KAAgC,EAAA;AACjE,IAAA,OAAO,WAAW,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,kBAAkB;AACxD;AAEM,SAAU,mBAAmB,CAAC,KAAgC,EAAA;AAClE,IAAA,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI,EAAE;IAEhC,OAAO,UAAU,GAAG,UAAU,GAAG,mBAAmB;AACtD;AAEM,SAAU,oBAAoB,CAAC,KAAgC,EAAA;AACnE,IAAA,OAAO,aAAa,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,oBAAoB;AAC5D;;MC5Ba,gBAAgB,CAAA;IACV,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClD,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/B,OAAO,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACtD,IAAA,SAAS,GAAG,MAAM,CAAY,kBAAkB,gFAAC;IACjD,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,wFAAC;AAE/D,IAAA,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAClC,IAAA,YAAY,GAAG,QAAQ,CAAoB,MAAK;AACvD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAE7B,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,iBAAiB,EAAE,GAAG,MAAM,GAAG,OAAO;QACpD;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,mFAAC;AAEO,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,KAAK,MAAM,6EAAC;AAEhE,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,4BAA4B,EAAE;QACnC,IAAI,CAAC,cAAc,EAAE;QAErB,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AAExC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACtB,YAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC;AACxC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,OAAO,CAAC,IAAe,EAAA;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC;IAChD;IAEQ,cAAc,GAAA;QACpB,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,IAAI,WAAW;QAE1E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACpD;AAEQ,IAAA,WAAW,CAAC,IAAe,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE,IAAI,CAAC;IACjD;AAEQ,IAAA,mBAAmB,CAAC,IAAuB,EAAA;AACjD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe;QAE9C,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IAC7B;IAEQ,oBAAoB,GAAA;QAC1B,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,IAAI,KAAK;IAChD;IAEQ,4BAA4B,GAAA;AAClC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;QAE5C,IAAI,CAAC,cAAc,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,CAAC,KAA0B,KAAI;YAC9C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAC3C,QAAA,CAAC;AAED,QAAA,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACnD,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzF;IAEQ,cAAc,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,GAAG,8BAA8B,CAAC,IAAI,IAAI;IAC5F;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,IAAI,IAAI;QAC5D;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;AAEQ,IAAA,WAAW,CAAC,GAAW,EAAA;AAC7B,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI;QAC7C;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;IAEQ,YAAY,CAAC,GAAW,EAAE,KAAa,EAAA;AAC7C,QAAA,IAAI;YACF,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;QACrC;AAAE,QAAA,MAAM;YACN;QACF;IACF;wGA5GW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA;;4FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCLrB,kBAAkB,CAAA;IACZ,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAClD,OAAO,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACtD,IAAA,WAAW,GAAG,MAAM,CAAc,oBAAoB,kFAAC;AAE/D,IAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;AAE/C,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,cAAc,EAAE;QAErB,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;AAEjC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1B,YAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;AACnC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,SAAS,CAAC,MAAmB,EAAA;AAC3B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;IAC9B;IAEQ,cAAc,GAAA;QACpB,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,IAAI,aAAa;QAEhF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAC1D;AAEQ,IAAA,aAAa,CAAC,MAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,wBAAwB,EAAE,MAAM,CAAC;IACrD;AAEQ,IAAA,oBAAoB,CAAC,MAAmB,EAAA;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe;QAE9C,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC;IAC3C;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,IAAI,IAAI;QAC5D;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;AAEQ,IAAA,WAAW,CAAC,GAAW,EAAA;AAC7B,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI;QAC7C;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;IAEQ,YAAY,CAAC,GAAW,EAAE,KAAa,EAAA;AAC7C,QAAA,IAAI;YACF,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;QACrC;AAAE,QAAA,MAAM;YACN;QACF;IACF;wGAjEW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA;;4FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACQ5B,SAAU,cAAc,CAAC,OAAA,GAA0B,EAAE,EAAA;AACzD,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA;AACE,YAAA,OAAO,EAAE,gBAAgB;AACzB,YAAA,QAAQ,EAAE,OAAO;AAClB,SAAA;QACD,6BAA6B,CAAC,MAAK;YACjC,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,YAAY,CAChE,aAAa,EACb,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CACnC;YAED,IAAI,OAAO,CAAC,KAAK,EAAE,eAAe,KAAK,KAAK,EAAE;AAC5C,gBAAA,MAAM,CAAC,wBAAwB,CAAC,CAAC,YAAY,EAAE;YACjD;YAEA,MAAM,CAAC,gBAAgB,CAAC;YACxB,MAAM,CAAC,kBAAkB,CAAC;AAC5B,QAAA,CAAC,CAAC;AACH,KAAA,CAAC;AACJ;;ACjCA;;AAEG;;;;"}
package/icon/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # Icon
2
+
3
+ `@edsis/ui/icon` menyediakan primitive icon berbasis Material Symbols untuk library UI ini.
4
+
5
+ ```ts
6
+ import { UiIconComponent } from '@edsis/ui/icon';
7
+ import { provideUiTheme } from '@edsis/ui/theme';
8
+ ```
9
+
10
+ ```html
11
+ <ui-icon name="dashboard" [size]="20" class="text-primary" />
12
+ ```
13
+
14
+ ## API Notes
15
+
16
+ - `name` menerima nama glyph Material Symbols, misalnya `dashboard` atau `left_panel_close`.
17
+ - `size` mengatur `font-size` dan `line-height` host dalam pixel.
18
+ - `fill`, `weight`, `grade`, dan `opticalSize` diteruskan ke `font-variation-settings`.
19
+ - `class` menerima utilitas Tailwind tambahan pada host.
20
+
21
+ ## Font Loading
22
+
23
+ - `UiIconComponent` akan memastikan stylesheet Material Symbols tersedia saat icon pertama dirender.
24
+ - `provideUiTheme()` juga mem-bootstrap stylesheet yang sama lebih awal pada level aplikasi.
25
+ - Gunakan `provideUiTheme({ icons: { materialSymbols: false } })` bila consumer ingin menonaktifkan preload global.
package/nav/README.md CHANGED
@@ -81,16 +81,22 @@ Instance preferences are stored under:
81
81
 
82
82
  ## Icons
83
83
 
84
- `ui-nav` does not load icon fonts or depend on an icon package. Pass an optional icon template when you need custom rendering.
84
+ Saat `item.icon` tersedia, `ui-nav` akan merender Material Symbols secara default melalui `@edsis/ui/icon`. Jalankan `provideUiTheme()` untuk preload global, atau biarkan `UiIconComponent` melakukan lazy-load saat icon pertama dipakai.
85
+
86
+ ```html
87
+ <ui-nav [items]="items" />
88
+ ```
89
+
90
+ Gunakan template `uiNavIcon` hanya bila consumer ingin override renderer bawaan.
85
91
 
86
92
  ```html
87
93
  <ui-nav [items]="items">
88
94
  <ng-template uiNavIcon let-icon>
89
- <span class="material-symbols-outlined" aria-hidden="true">{{ icon }}</span>
95
+ <ui-icon [name]="icon" class="text-primary" />
90
96
  </ng-template>
91
97
  </ui-nav>
92
98
  ```
93
99
 
94
100
  ## Boundaries
95
101
 
96
- This entry point must stay consumer-agnostic. Layout and theme composition belong to the consumer layer, while nav appearance defaults, instance registration, and overlay state now live inside `NavService`.
102
+ Entry point ini tetap extensible di layer consumer. Appearance defaults, instance registration, overlay state, dan affordance icon bawaan dikelola di library, sementara consumer masih bisa mengganti renderer icon dan komposisi layout sesuai kebutuhan.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edsis/ui",
3
- "version": "21.3.8",
3
+ "version": "21.3.10",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/edsis/angular.git"
@@ -174,6 +174,10 @@
174
174
  "types": "./types/edsis-ui-hover-card.d.ts",
175
175
  "default": "./fesm2022/edsis-ui-hover-card.mjs"
176
176
  },
177
+ "./icon": {
178
+ "types": "./types/edsis-ui-icon.d.ts",
179
+ "default": "./fesm2022/edsis-ui-icon.mjs"
180
+ },
177
181
  "./input": {
178
182
  "types": "./types/edsis-ui-input.d.ts",
179
183
  "default": "./fesm2022/edsis-ui-input.mjs"
package/page/README.md CHANGED
@@ -2,16 +2,70 @@
2
2
 
3
3
  Primitive page shell untuk layout halaman dengan pendekatan nested component.
4
4
 
5
+ Dokumentasi ini mengikuti API publik terbaru dari `@edsis/ui/page`, termasuk mode `height`, slot `ui-page-dashboard`, controlled side state, dan override untuk side rail.
6
+
5
7
  ## Components
6
8
 
7
9
  - `ui-page`
8
10
  - `ui-page-header`
9
11
  - `ui-page-content`
12
+ - `ui-page-dashboard`
10
13
  - `ui-page-footer`
11
14
  - `ui-page-side`
12
15
  - `ui-page-side-toggle`
13
16
 
14
17
  `ui-page-side-toggle` menerima projected content untuk label atau ikon kustom. Jika tidak ada projected content, komponen akan memakai ikon fallback bawaan.
18
+ `ui-page-dashboard` mengikuti perilaku layout dan scroll yang sama dengan `ui-page-content`, tetapi disediakan sebagai slot semantik untuk dashboard, board, dan surface analitik.
19
+
20
+ ## Root API
21
+
22
+ ### `ui-page`
23
+
24
+ | Input | Type | Default | Keterangan |
25
+ | ----------- | ----------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------- |
26
+ | `variant` | `'stacked' \| 'side'` | `'stacked'` | Menentukan struktur utama page shell. |
27
+ | `scroll` | `'content' \| 'page'` | `'content'` | Menentukan apakah body slot scroll sendiri atau seluruh root `ui-page` scroll bersama. |
28
+ | `height` | `'auto' \| 'fix'` | `'auto'` | Mengontrol tinggi `ui-page-header` dan `ui-page-footer`. |
29
+ | `position` | `'left' \| 'right'` | `'left'` | Posisi default untuk `ui-page-side` jika side tidak memberi override sendiri. |
30
+ | `sideMode` | `'sticky' \| 'drawer' \| 'overlay'` | `'sticky'` | Mode default untuk `ui-page-side` jika side tidak memberi override sendiri. |
31
+ | `sideWidth` | `string` | `'16rem'` | Lebar default side rail; dipakai juga untuk drawer dan overlay. |
32
+ | `sideOpen` | `boolean \| null` | `null` | Saat `null`, state side tidak dikontrol dari parent. Saat `true/false`, komponen masuk controlled mode. |
33
+ | `class` | `string` | `''` | Class tambahan pada host `ui-page`. |
34
+
35
+ | Output | Payload | Keterangan |
36
+ | ---------------- | --------- | -------------------------------------------------------------------------------------------- |
37
+ | `sideOpenChange` | `boolean` | Emit setiap ada permintaan buka/tutup side, baik dari toggle, backdrop, maupun tombol `Esc`. |
38
+
39
+ `ui-page` juga menambahkan atribut host `data-page-variant`, `data-page-height`, `data-page-scroll`, `data-page-position`, `data-page-side-mode`, dan `data-page-side-open` untuk styling atau inspeksi.
40
+
41
+ ## Slot API
42
+
43
+ ### Body slots
44
+
45
+ | Component | Input | Default | Keterangan |
46
+ | ------------------- | --------------- | ------- | ------------------------------------------------------------------------------------------ |
47
+ | `ui-page-header` | `class: string` | `''` | Slot header dengan border bawah. Saat `height="fix"`, tinggi dipaksa `h-12`. |
48
+ | `ui-page-content` | `class: string` | `''` | Body slot utama. Mengikuti mode `scroll` dari root `ui-page`. |
49
+ | `ui-page-dashboard` | `class: string` | `''` | Setara dengan `ui-page-content`, tetapi untuk kebutuhan dashboard/board/analytics surface. |
50
+ | `ui-page-footer` | `class: string` | `''` | Slot footer dengan border atas. Saat `height="fix"`, tinggi dipaksa `h-12`. |
51
+
52
+ ### `ui-page-side`
53
+
54
+ | Input | Type | Default | Keterangan |
55
+ | ------------ | ----------------------------------- | ---------- | -------------------------------------------------------------------------------------------------- |
56
+ | `mode` | `'sticky' \| 'drawer' \| 'overlay'` | `'sticky'` | Override mode side untuk instance tersebut. |
57
+ | `position` | `'left' \| 'right' \| null` | `null` | Override posisi side untuk instance tersebut. Jika `null`, memakai nilai dari root `ui-page`. |
58
+ | `width` | `string \| null` | `null` | Override lebar side untuk instance tersebut. Jika `null`, memakai `sideWidth` dari root `ui-page`. |
59
+ | `closeOnEsc` | `boolean` | `true` | Berlaku untuk `drawer` dan `overlay`; menutup side ketika tombol `Esc` ditekan. |
60
+ | `class` | `string` | `''` | Class tambahan pada host `ui-page-side`. |
61
+
62
+ ### `ui-page-side-toggle`
63
+
64
+ | Input / Output | Type | Default | Keterangan |
65
+ | -------------- | --------- | -------------------- | ----------------------------------------------------------- |
66
+ | `ariaLabel` | `string` | `'Toggle page side'` | Label aksesibilitas untuk tombol toggle. |
67
+ | `class` | `string` | `''` | Class tambahan pada host toggle. |
68
+ | `toggled` | `boolean` | - | Emit nilai open state terbaru setelah tombol toggle diklik. |
15
69
 
16
70
  ## Variants
17
71
 
@@ -20,7 +74,7 @@ Primitive page shell untuk layout halaman dengan pendekatan nested component.
20
74
 
21
75
  ## Scroll Modes
22
76
 
23
- - `content` (default): hanya `ui-page-content` yang menjadi area scroll. Pada variant `side`, `ui-page-side` dan `ui-page-content` sama-sama stretch ke parent dan masing-masing punya scroll sendiri.
77
+ - `content` (default): `ui-page-content` atau `ui-page-dashboard` menjadi area scroll. Pada variant `side`, `ui-page-side` dan body slot yang dipakai sama-sama stretch ke parent dan masing-masing punya scroll sendiri.
24
78
  - `page`: seluruh isi `ui-page` menjadi area scroll. Header, content, footer, dan pada variant `side` juga `ui-page-side` akan mengikuti tinggi content induk tanpa scroll internal.
25
79
 
26
80
  ## Height Modes
@@ -28,12 +82,14 @@ Primitive page shell untuk layout halaman dengan pendekatan nested component.
28
82
  - `auto` (default): tinggi `ui-page-header` dan `ui-page-footer` mengikuti isi.
29
83
  - `fix`: `ui-page-header` dan `ui-page-footer` dipaksa `h-12` dan `overflow-hidden`, sehingga isi yang melebihi tinggi tersebut akan terpotong.
30
84
 
85
+ Dalam mode `fix`, pastikan isi header/footer memang dirancang sebagai rail ringkas. Konten yang lebih tinggi dari `h-12` tidak akan ikut menambah tinggi slot.
86
+
31
87
  ## Behavior Summary
32
88
 
33
- | Variant | `scroll="content"` | `scroll="page"` |
34
- | --------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
35
- | `stacked` | `ui-page-content` stretch ke tinggi yang tersedia dan menjadi area scroll | seluruh `ui-page` scroll bersama; header, content, footer ikut satu kanvas |
36
- | `side` | `ui-page-side` dan `ui-page-content` sama-sama stretch ke parent dan punya scroll sendiri | `ui-page-side` dan `ui-page-content` mengikuti tinggi content induk tanpa scroll internal |
89
+ | Variant | `scroll="content"` | `scroll="page"` |
90
+ | --------- | ------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
91
+ | `stacked` | `ui-page-content` atau `ui-page-dashboard` stretch ke tinggi yang tersedia dan menjadi area scroll | seluruh `ui-page` scroll bersama; header, content, footer ikut satu kanvas |
92
+ | `side` | `ui-page-side` dan body slot (`ui-page-content`/`ui-page-dashboard`) sama-sama stretch ke parent dan punya scroll sendiri | `ui-page-side` dan body slot mengikuti tinggi content induk tanpa scroll internal |
37
93
 
38
94
  ## Header And Footer Height
39
95
 
@@ -68,6 +124,24 @@ Saat memakai `height="fix"`, slot berikut tidak boleh melebihi tinggi tetap yang
68
124
  </ui-page>
69
125
  ```
70
126
 
127
+ ### Stacked dashboard surface
128
+
129
+ ```html
130
+ <ui-page variant="stacked">
131
+ <ui-page-header>
132
+ <h1>Executive dashboard</h1>
133
+ </ui-page-header>
134
+
135
+ <ui-page-dashboard>
136
+ <p>Gunakan slot ini ketika area utama secara semantik adalah dashboard atau board analitik.</p>
137
+ </ui-page-dashboard>
138
+
139
+ <ui-page-footer>
140
+ <button type="button">Open insight</button>
141
+ </ui-page-footer>
142
+ </ui-page>
143
+ ```
144
+
71
145
  ### Stacked with fixed header and footer height
72
146
 
73
147
  ```html
@@ -142,3 +216,24 @@ Saat memakai `height="fix"`, slot berikut tidak boleh melebihi tinggi tetap yang
142
216
  </ui-page-content>
143
217
  </ui-page>
144
218
  ```
219
+
220
+ ### Controlled side state
221
+
222
+ ```html
223
+ <ui-page variant="side" sideMode="drawer" [sideOpen]="filtersOpen()" (sideOpenChange)="filtersOpen.set($event)">
224
+ <ui-page-header>
225
+ <ui-page-side-toggle ariaLabel="Toggle filters">
226
+ <span>Filters</span>
227
+ </ui-page-side-toggle>
228
+ <h1>Pipeline board</h1>
229
+ </ui-page-header>
230
+
231
+ <ui-page-side>
232
+ <p>Drawer ini mengikuti state dari parent.</p>
233
+ </ui-page-side>
234
+
235
+ <ui-page-dashboard>
236
+ <p>Dashboard tetap memakai body behavior yang sama seperti ui-page-content.</p>
237
+ </ui-page-dashboard>
238
+ </ui-page>
239
+ ```
@@ -0,0 +1,30 @@
1
+ # Theme
2
+
3
+ `@edsis/ui/theme` menyediakan provider untuk brand, mode, season, dan preload aset tema global.
4
+
5
+ ```ts
6
+ import { provideUiTheme } from '@edsis/ui/theme';
7
+
8
+ export const appConfig = {
9
+ providers: [
10
+ provideUiTheme({
11
+ brand: 'etos',
12
+ mode: 'light',
13
+ season: 'base',
14
+ }),
15
+ ],
16
+ };
17
+ ```
18
+
19
+ ## API Notes
20
+
21
+ - `brand` mengatur atribut `theme-brand` pada `documentElement`.
22
+ - `mode` mem-bootstrap `ThemeModeService` dan default mode yang disimpan di storage.
23
+ - `season` mem-bootstrap `ThemeSeasonService` dan default season yang disimpan di storage.
24
+ - `icons.materialSymbols` mengontrol preload stylesheet Material Symbols pada bootstrap aplikasi.
25
+
26
+ ## Default Behavior
27
+
28
+ - Material Symbols di-preload secara default saat `provideUiTheme()` dijalankan.
29
+ - Untuk menonaktifkan preload global, set `icons.materialSymbols` ke `false`.
30
+ - Komponen dari `@edsis/ui/icon` tetap punya fallback lazy-load bila provider tema tidak dipakai.