@hyalo/angular 0.1.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +95 -41
- package/README.md +46 -32
- package/fesm2022/hyalo-angular-accordion.mjs +6 -6
- package/fesm2022/hyalo-angular-accordion.mjs.map +1 -1
- package/fesm2022/hyalo-angular-alert.mjs +171 -0
- package/fesm2022/hyalo-angular-alert.mjs.map +1 -0
- package/fesm2022/hyalo-angular-aspect-ratio.mjs +64 -0
- package/fesm2022/hyalo-angular-aspect-ratio.mjs.map +1 -0
- package/fesm2022/hyalo-angular-avatar.mjs +169 -0
- package/fesm2022/hyalo-angular-avatar.mjs.map +1 -0
- package/fesm2022/hyalo-angular-badge.mjs +268 -0
- package/fesm2022/hyalo-angular-badge.mjs.map +1 -0
- package/fesm2022/hyalo-angular-bento.mjs +132 -0
- package/fesm2022/hyalo-angular-bento.mjs.map +1 -0
- package/fesm2022/hyalo-angular-blocks.mjs +985 -0
- package/fesm2022/hyalo-angular-blocks.mjs.map +1 -0
- package/fesm2022/hyalo-angular-border-beam.mjs +73 -0
- package/fesm2022/hyalo-angular-border-beam.mjs.map +1 -0
- package/fesm2022/hyalo-angular-breadcrumb.mjs +77 -0
- package/fesm2022/hyalo-angular-breadcrumb.mjs.map +1 -0
- package/fesm2022/hyalo-angular-button-group.mjs +90 -0
- package/fesm2022/hyalo-angular-button-group.mjs.map +1 -0
- package/fesm2022/hyalo-angular-button.mjs +4 -3
- package/fesm2022/hyalo-angular-button.mjs.map +1 -1
- package/fesm2022/hyalo-angular-card.mjs +2 -2
- package/fesm2022/hyalo-angular-card.mjs.map +1 -1
- package/fesm2022/hyalo-angular-carousel.mjs +709 -0
- package/fesm2022/hyalo-angular-carousel.mjs.map +1 -0
- package/fesm2022/hyalo-angular-chapter-nav.mjs +336 -0
- package/fesm2022/hyalo-angular-chapter-nav.mjs.map +1 -0
- package/fesm2022/hyalo-angular-chart-engine-DSJop6He.mjs +5 -0
- package/fesm2022/hyalo-angular-chart-engine-DSJop6He.mjs.map +1 -0
- package/fesm2022/hyalo-angular-chart.mjs +391 -0
- package/fesm2022/hyalo-angular-chart.mjs.map +1 -0
- package/fesm2022/hyalo-angular-choice.mjs +2 -1
- package/fesm2022/hyalo-angular-choice.mjs.map +1 -1
- package/fesm2022/hyalo-angular-code-block-highlight-B20d5C76.mjs +40 -0
- package/fesm2022/hyalo-angular-code-block-highlight-B20d5C76.mjs.map +1 -0
- package/fesm2022/hyalo-angular-code-block.mjs +161 -0
- package/fesm2022/hyalo-angular-code-block.mjs.map +1 -0
- package/fesm2022/hyalo-angular-command.mjs +193 -0
- package/fesm2022/hyalo-angular-command.mjs.map +1 -0
- package/fesm2022/hyalo-angular-copy.mjs +138 -0
- package/fesm2022/hyalo-angular-copy.mjs.map +1 -0
- package/fesm2022/hyalo-angular-core.mjs +424 -0
- package/fesm2022/hyalo-angular-core.mjs.map +1 -0
- package/fesm2022/hyalo-angular-description-list.mjs +57 -0
- package/fesm2022/hyalo-angular-description-list.mjs.map +1 -0
- package/fesm2022/hyalo-angular-dialog.mjs +51 -22
- package/fesm2022/hyalo-angular-dialog.mjs.map +1 -1
- package/fesm2022/hyalo-angular-divider.mjs +66 -0
- package/fesm2022/hyalo-angular-divider.mjs.map +1 -0
- package/fesm2022/hyalo-angular-empty-state.mjs +123 -0
- package/fesm2022/hyalo-angular-empty-state.mjs.map +1 -0
- package/fesm2022/hyalo-angular-field.mjs +41 -9
- package/fesm2022/hyalo-angular-field.mjs.map +1 -1
- package/fesm2022/hyalo-angular-filter.mjs +309 -0
- package/fesm2022/hyalo-angular-filter.mjs.map +1 -0
- package/fesm2022/hyalo-angular-hotspot.mjs +225 -0
- package/fesm2022/hyalo-angular-hotspot.mjs.map +1 -0
- package/fesm2022/hyalo-angular-hover-card.mjs +233 -0
- package/fesm2022/hyalo-angular-hover-card.mjs.map +1 -0
- package/fesm2022/hyalo-angular-icon.mjs +42 -0
- package/fesm2022/hyalo-angular-icon.mjs.map +1 -1
- package/fesm2022/hyalo-angular-image-compare.mjs +168 -0
- package/fesm2022/hyalo-angular-image-compare.mjs.map +1 -0
- package/fesm2022/hyalo-angular-interaction.mjs +32 -41
- package/fesm2022/hyalo-angular-interaction.mjs.map +1 -1
- package/fesm2022/hyalo-angular-kbd.mjs +41 -0
- package/fesm2022/hyalo-angular-kbd.mjs.map +1 -0
- package/fesm2022/hyalo-angular-lightbox.mjs +228 -0
- package/fesm2022/hyalo-angular-lightbox.mjs.map +1 -0
- package/fesm2022/hyalo-angular-link.mjs +42 -0
- package/fesm2022/hyalo-angular-link.mjs.map +1 -0
- package/fesm2022/hyalo-angular-list.mjs +131 -0
- package/fesm2022/hyalo-angular-list.mjs.map +1 -0
- package/fesm2022/hyalo-angular-marquee.mjs +197 -0
- package/fesm2022/hyalo-angular-marquee.mjs.map +1 -0
- package/fesm2022/hyalo-angular-menu.mjs +423 -0
- package/fesm2022/hyalo-angular-menu.mjs.map +1 -0
- package/fesm2022/hyalo-angular-mesh.mjs +126 -0
- package/fesm2022/hyalo-angular-mesh.mjs.map +1 -0
- package/fesm2022/hyalo-angular-motion.mjs +620 -0
- package/fesm2022/hyalo-angular-motion.mjs.map +1 -0
- package/fesm2022/hyalo-angular-navbar.mjs +1 -1
- package/fesm2022/hyalo-angular-navbar.mjs.map +1 -1
- package/fesm2022/hyalo-angular-navigation-menu.mjs +222 -0
- package/fesm2022/hyalo-angular-navigation-menu.mjs.map +1 -0
- package/fesm2022/hyalo-angular-number-ticker.mjs +174 -0
- package/fesm2022/hyalo-angular-number-ticker.mjs.map +1 -0
- package/fesm2022/hyalo-angular-overlay.mjs +71 -2
- package/fesm2022/hyalo-angular-overlay.mjs.map +1 -1
- package/fesm2022/hyalo-angular-pagination.mjs +187 -0
- package/fesm2022/hyalo-angular-pagination.mjs.map +1 -0
- package/fesm2022/hyalo-angular-popover.mjs +34 -5
- package/fesm2022/hyalo-angular-popover.mjs.map +1 -1
- package/fesm2022/hyalo-angular-progress.mjs +209 -0
- package/fesm2022/hyalo-angular-progress.mjs.map +1 -0
- package/fesm2022/hyalo-angular-progressive-blur.mjs +73 -0
- package/fesm2022/hyalo-angular-progressive-blur.mjs.map +1 -0
- package/fesm2022/hyalo-angular-refraction-renderer-5ZA-kfsA.mjs +186 -0
- package/fesm2022/hyalo-angular-refraction-renderer-5ZA-kfsA.mjs.map +1 -0
- package/fesm2022/hyalo-angular-refraction.mjs +178 -0
- package/fesm2022/hyalo-angular-refraction.mjs.map +1 -0
- package/fesm2022/hyalo-angular-scroll-area.mjs +93 -0
- package/fesm2022/hyalo-angular-scroll-area.mjs.map +1 -0
- package/fesm2022/hyalo-angular-scroll-to-top.mjs +127 -0
- package/fesm2022/hyalo-angular-scroll-to-top.mjs.map +1 -0
- package/fesm2022/hyalo-angular-segmented.mjs +1 -1
- package/fesm2022/hyalo-angular-segmented.mjs.map +1 -1
- package/fesm2022/hyalo-angular-select.mjs +112 -15
- package/fesm2022/hyalo-angular-select.mjs.map +1 -1
- package/fesm2022/hyalo-angular-sidebar.mjs +241 -0
- package/fesm2022/hyalo-angular-sidebar.mjs.map +1 -0
- package/fesm2022/hyalo-angular-skeleton.mjs +131 -0
- package/fesm2022/hyalo-angular-skeleton.mjs.map +1 -0
- package/fesm2022/hyalo-angular-sparkline.mjs +110 -0
- package/fesm2022/hyalo-angular-sparkline.mjs.map +1 -0
- package/fesm2022/hyalo-angular-split-text.mjs +126 -0
- package/fesm2022/hyalo-angular-split-text.mjs.map +1 -0
- package/fesm2022/hyalo-angular-stat.mjs +193 -0
- package/fesm2022/hyalo-angular-stat.mjs.map +1 -0
- package/fesm2022/hyalo-angular-stepper.mjs +254 -0
- package/fesm2022/hyalo-angular-stepper.mjs.map +1 -0
- package/fesm2022/hyalo-angular-table.mjs +335 -0
- package/fesm2022/hyalo-angular-table.mjs.map +1 -0
- package/fesm2022/hyalo-angular-tabs.mjs +1 -1
- package/fesm2022/hyalo-angular-tabs.mjs.map +1 -1
- package/fesm2022/hyalo-angular-theme.mjs +1 -1
- package/fesm2022/hyalo-angular-theme.mjs.map +1 -1
- package/fesm2022/hyalo-angular-timeline.mjs +157 -0
- package/fesm2022/hyalo-angular-timeline.mjs.map +1 -0
- package/fesm2022/hyalo-angular-toast.mjs +2 -1
- package/fesm2022/hyalo-angular-toast.mjs.map +1 -1
- package/fesm2022/hyalo-angular.mjs +2 -473
- package/package.json +198 -2
- package/styles/parts/field.css +44 -36
- package/styles/parts/glass.css +2 -0
- package/styles/parts/motion.css +19 -0
- package/styles/parts/typography.css +17 -0
- package/types/hyalo-angular-accordion.d.ts +1 -1
- package/types/hyalo-angular-alert.d.ts +47 -0
- package/types/hyalo-angular-aspect-ratio.d.ts +13 -0
- package/types/hyalo-angular-avatar.d.ts +39 -0
- package/types/hyalo-angular-badge.d.ts +82 -0
- package/types/hyalo-angular-bento.d.ts +25 -0
- package/types/hyalo-angular-blocks.d.ts +272 -0
- package/types/hyalo-angular-border-beam.d.ts +15 -0
- package/types/hyalo-angular-breadcrumb.d.ts +22 -0
- package/types/hyalo-angular-button-group.d.ts +19 -0
- package/types/hyalo-angular-button.d.ts +4 -3
- package/types/hyalo-angular-card.d.ts +1 -1
- package/types/hyalo-angular-carousel.d.ts +147 -0
- package/types/hyalo-angular-chapter-nav.d.ts +79 -0
- package/types/hyalo-angular-chart.d.ts +90 -0
- package/types/hyalo-angular-code-block.d.ts +46 -0
- package/types/hyalo-angular-command.d.ts +41 -0
- package/types/hyalo-angular-copy.d.ts +39 -0
- package/types/hyalo-angular-core.d.ts +210 -0
- package/types/hyalo-angular-description-list.d.ts +16 -0
- package/types/hyalo-angular-dialog.d.ts +2 -1
- package/types/hyalo-angular-divider.d.ts +12 -0
- package/types/hyalo-angular-empty-state.d.ts +30 -0
- package/types/hyalo-angular-field.d.ts +10 -4
- package/types/hyalo-angular-filter.d.ts +122 -0
- package/types/hyalo-angular-hotspot.d.ts +70 -0
- package/types/hyalo-angular-hover-card.d.ts +47 -0
- package/types/hyalo-angular-image-compare.d.ts +55 -0
- package/types/hyalo-angular-kbd.d.ts +5 -0
- package/types/hyalo-angular-lightbox.d.ts +67 -0
- package/types/hyalo-angular-link.d.ts +5 -0
- package/types/hyalo-angular-list.d.ts +30 -0
- package/types/hyalo-angular-marquee.d.ts +48 -0
- package/types/hyalo-angular-menu.d.ts +105 -0
- package/types/hyalo-angular-mesh.d.ts +36 -0
- package/types/hyalo-angular-motion.d.ts +218 -0
- package/types/hyalo-angular-navigation-menu.d.ts +47 -0
- package/types/hyalo-angular-number-ticker.d.ts +52 -0
- package/types/hyalo-angular-overlay.d.ts +9 -0
- package/types/hyalo-angular-pagination.d.ts +59 -0
- package/types/hyalo-angular-popover.d.ts +10 -0
- package/types/hyalo-angular-progress.d.ts +46 -0
- package/types/hyalo-angular-progressive-blur.d.ts +14 -0
- package/types/hyalo-angular-refraction.d.ts +46 -0
- package/types/hyalo-angular-scroll-area.d.ts +18 -0
- package/types/hyalo-angular-scroll-to-top.d.ts +31 -0
- package/types/hyalo-angular-segmented.d.ts +1 -1
- package/types/hyalo-angular-select.d.ts +49 -3
- package/types/hyalo-angular-sidebar.d.ts +57 -0
- package/types/hyalo-angular-skeleton.d.ts +34 -0
- package/types/hyalo-angular-sparkline.d.ts +19 -0
- package/types/hyalo-angular-split-text.d.ts +24 -0
- package/types/hyalo-angular-stat.d.ts +56 -0
- package/types/hyalo-angular-stepper.d.ts +63 -0
- package/types/hyalo-angular-table.d.ts +125 -0
- package/types/hyalo-angular-timeline.d.ts +36 -0
- package/types/hyalo-angular.d.ts +2 -345
- package/fesm2022/hyalo-angular.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyalo-angular-carousel.mjs","names":[],"sources":["../../../projects/hyalo/carousel/carousel.ts","../../../projects/hyalo/carousel/carousel.html"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Directive,\r\n DestroyRef,\r\n ElementRef,\r\n TemplateRef,\r\n booleanAttribute,\r\n afterNextRender,\r\n afterRenderEffect,\r\n computed,\r\n contentChildren,\r\n contentChild,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { ɵinjectIsBrowser } from '@hyalo/angular/core';\r\nimport { HyMotion } from '@hyalo/angular/motion';\r\nimport { HyButton } from '@hyalo/angular/button';\r\nimport { HyIcon } from '@hyalo/angular/icon';\r\nexport type HyCarouselMode = 'slide' | 'fade';\r\nexport type HyCarouselPagination = 'dots' | 'counter' | 'none';\r\nexport type HyCarouselNavigationMode = 'text' | 'icons' | 'none';\r\nexport type HyCarouselNavigationPosition = 'below' | 'inside-bottom' | 'sides';\r\nexport interface HyCarouselNavigationContext {\r\n readonly $implicit: HyCarousel;\r\n}\r\n@Directive({ selector: 'ng-template[hyCarouselNavigation]' })\r\nexport class HyCarouselNavigation {\r\n readonly template = inject<TemplateRef<HyCarouselNavigationContext>>(TemplateRef);\r\n}\r\n\r\n@Component({\r\n selector: 'hy-slide',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n role: 'group',\r\n 'aria-roledescription': 'slide',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.data-mode]': 'carousel?.mode()',\r\n '[attr.data-active]': 'active()',\r\n '[attr.inert]': 'inactive() ? \"\" : null',\r\n '[attr.aria-hidden]': 'inactive() ? true : null',\r\n },\r\n template: '<ng-content />',\r\n styleUrl: './slide.css',\r\n})\r\nexport class HySlide {\r\n protected readonly carousel = inject(HyCarousel, { optional: true });\r\n readonly label = input.required<string>();\r\n protected readonly active = computed(\r\n () => this.carousel?.slides()[this.carousel.current()] === this,\r\n );\r\n protected readonly inactive = computed(() => this.carousel?.mode() === 'fade' && !this.active());\r\n}\r\n\r\n/** Scroll-snap carousel. Touch uses browser inertia; mouse dragging projects velocity. */\r\n@Component({\r\n selector: 'hy-carousel',\r\n imports: [HyButton, HyIcon, NgTemplateOutlet],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n role: 'region',\r\n 'aria-roledescription': 'carousel',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.data-mode]': 'mode()',\r\n '[attr.data-scrollbar]': 'scrollbar()',\r\n '[attr.data-navigation-position]': 'navPosition()',\r\n '[style.--hy-carousel-duration]':\r\n 'animated() && motion.enabled() ? \"var(--hy-dur-quick)\" : \"0ms\"',\r\n },\r\n templateUrl: './carousel.html',\r\n styleUrl: './carousel.css',\r\n})\r\nexport class HyCarousel {\r\n protected readonly motion = inject(HyMotion);\r\n private readonly browser = ɵinjectIsBrowser();\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly viewport = viewChild.required<ElementRef<HTMLElement>>('viewport');\r\n readonly label = input('Gallery');\r\n readonly previousLabel = input('Previous slide');\r\n readonly nextLabel = input('Next slide');\r\n readonly index = model(0);\r\n readonly mode = input<HyCarouselMode>('slide');\r\n readonly pagination = input<HyCarouselPagination>('dots');\r\n readonly paginationLabel = input('Choose slide');\r\n readonly loop = input(false, { transform: booleanAttribute });\r\n readonly scrollbar = input(false, { transform: booleanAttribute });\r\n readonly navigation = input<HyCarouselNavigationMode>('text');\r\n readonly navPosition = input<HyCarouselNavigationPosition>('below');\r\n protected readonly customNavigation = contentChild(HyCarouselNavigation);\r\n protected readonly navigationContext: HyCarouselNavigationContext = { $implicit: this };\r\n readonly slides = contentChildren(HySlide);\r\n readonly current = computed(() =>\r\n Math.max(0, Math.min(this.slides().length - 1, Math.trunc(this.index()) || 0)),\r\n );\r\n private drag: { x: number; scroll: number; time: number; moved: boolean } | null = null;\r\n private suppressClick = false;\r\n private readonly ready = signal(false);\r\n private syncedIndex = -1;\r\n private syncedMode: HyCarouselMode | null = null;\r\n protected readonly animated = signal(false);\r\n private viewportWidth = 0;\r\n private scrollFrame = 0;\r\n private scrollTarget: number | null = null;\r\n private settleTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n constructor() {\r\n afterRenderEffect(() => {\r\n const current = this.current();\r\n const mode = this.mode();\r\n if (this.ready() && (current !== this.syncedIndex || mode !== this.syncedMode)) {\r\n this.syncedIndex = current;\r\n this.syncedMode = mode;\r\n this.animated.set(false);\r\n this.scrollToSlide(false);\r\n }\r\n });\r\n afterNextRender(() => {\r\n const viewport = this.viewport().nativeElement;\r\n this.viewportWidth = viewport.clientWidth;\r\n const resize =\r\n typeof ResizeObserver === 'function'\r\n ? new ResizeObserver(([entry]) => {\r\n this.viewportWidth = entry?.contentRect.width ?? viewport.clientWidth;\r\n this.scrollToSlide(false);\r\n })\r\n : null;\r\n resize?.observe(viewport);\r\n const onClick = (event: MouseEvent): void => {\r\n if (!this.suppressClick) return;\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n this.suppressClick = false;\r\n };\r\n viewport.addEventListener('click', onClick, true);\r\n this.ready.set(true);\r\n this.goTo(this.current(), false);\r\n this.destroyRef.onDestroy(() => {\r\n viewport.removeEventListener('click', onClick, true);\r\n viewport.ownerDocument.defaultView?.cancelAnimationFrame(this.scrollFrame);\r\n resize?.disconnect();\r\n clearTimeout(this.settleTimer);\r\n });\r\n });\r\n }\r\n\r\n goTo(index: number, smooth = true): void {\r\n const count = this.slides().length;\r\n const requested = Number.isFinite(index) ? Math.trunc(index) : 0;\r\n this.index.set(\r\n this.loop() && count\r\n ? ((requested % count) + count) % count\r\n : Math.max(0, Math.min(count - 1, requested)),\r\n );\r\n this.syncedIndex = this.current();\r\n this.animated.set(smooth);\r\n this.scrollToSlide(smooth);\r\n }\r\n\r\n private scrollToSlide(smooth: boolean): void {\r\n if (!this.browser || this.mode() !== 'slide') return;\r\n const viewport = this.viewport().nativeElement;\r\n const slide = viewport.children[this.current()];\r\n if (!slide) return;\r\n const delta = slide.getBoundingClientRect().x - viewport.getBoundingClientRect().x;\r\n clearTimeout(this.settleTimer);\r\n this.scrollTarget =\r\n smooth && this.motion.enabled() && Math.abs(delta) > 1 ? this.current() : null;\r\n if (this.scrollTarget !== null)\r\n this.settleTimer = setTimeout(() => {\r\n this.scrollToSlide(false);\r\n }, 800);\r\n // Both slide and viewport have the same width; x works in both directions.\r\n viewport.scrollBy?.({\r\n left: delta,\r\n behavior: smooth && this.motion.enabled() ? 'smooth' : 'instant',\r\n });\r\n }\r\n\r\n protected onScroll(): void {\r\n if (this.drag || this.scrollTarget !== null || this.mode() !== 'slide' || this.scrollFrame)\r\n return;\r\n const viewport = this.viewport().nativeElement;\r\n this.scrollFrame =\r\n viewport.ownerDocument.defaultView?.requestAnimationFrame(() => {\r\n this.scrollFrame = 0;\r\n if (this.drag || this.scrollTarget !== null || this.mode() !== 'slide') return;\r\n const width = this.viewportWidth || viewport.clientWidth;\r\n if (!width) return;\r\n const closest = Math.max(\r\n 0,\r\n Math.min(this.slides().length - 1, Math.round(Math.abs(viewport.scrollLeft) / width)),\r\n );\r\n this.syncedIndex = closest;\r\n this.index.set(closest);\r\n }) ?? 0;\r\n }\r\n protected onScrollEnd(): void {\r\n if (this.scrollTarget === null) return;\r\n const viewport = this.viewport().nativeElement;\r\n const slide = viewport.children[this.scrollTarget];\r\n if (slide && Math.abs(slide.getBoundingClientRect().x - viewport.getBoundingClientRect().x) > 1)\r\n return;\r\n this.scrollTarget = null;\r\n clearTimeout(this.settleTimer);\r\n }\r\n\r\n protected onKey(event: KeyboardEvent): void {\r\n if (event.target !== this.viewport().nativeElement) return;\r\n const rtl =\r\n this.viewport().nativeElement.ownerDocument.defaultView?.getComputedStyle(\r\n this.viewport().nativeElement,\r\n ).direction === 'rtl';\r\n let next = this.current();\r\n if (event.key === 'ArrowRight') next += rtl ? -1 : 1;\r\n else if (event.key === 'ArrowLeft') next += rtl ? 1 : -1;\r\n else if (event.key === 'Home') next = 0;\r\n else if (event.key === 'End') next = this.slides().length - 1;\r\n else return;\r\n event.preventDefault();\r\n this.goTo(next, false);\r\n }\r\n\r\n protected pointerDown(event: PointerEvent): void {\r\n this.suppressClick = false;\r\n this.scrollTarget = null;\r\n clearTimeout(this.settleTimer);\r\n if (\r\n (event.pointerType !== 'mouse' && this.mode() !== 'fade') ||\r\n event.button !== 0 ||\r\n (event.target as HTMLElement).closest('button, a, input, textarea, select')\r\n )\r\n return;\r\n this.viewport().nativeElement.style.scrollSnapType = 'none';\r\n this.drag = {\r\n x: event.clientX,\r\n scroll: this.viewport().nativeElement.scrollLeft,\r\n time: event.timeStamp,\r\n moved: false,\r\n };\r\n this.viewport().nativeElement.setPointerCapture?.(event.pointerId);\r\n }\r\n protected pointerMove(event: PointerEvent): void {\r\n if (!this.drag) return;\r\n if (event.buttons === 0) {\r\n this.pointerCancel();\r\n return;\r\n }\r\n const distance = event.clientX - this.drag.x;\r\n if (Math.abs(distance) < 6 && !this.drag.moved) return;\r\n this.drag.moved = true;\r\n const viewport = this.viewport().nativeElement;\r\n viewport.setPointerCapture?.(event.pointerId);\r\n if (this.mode() === 'slide') viewport.scrollLeft = this.drag.scroll - distance;\r\n event.preventDefault();\r\n }\r\n protected pointerUp(event: PointerEvent): void {\r\n if (!this.drag) return;\r\n const drag = this.drag;\r\n this.drag = null;\r\n const viewport = this.viewport().nativeElement;\r\n if (viewport.hasPointerCapture?.(event.pointerId))\r\n viewport.releasePointerCapture(event.pointerId);\r\n viewport.style.removeProperty('scroll-snap-type');\r\n if (!drag.moved) return;\r\n this.suppressClick = true;\r\n const rtl = viewport.ownerDocument.defaultView?.getComputedStyle(viewport).direction === 'rtl';\r\n const distance = (event.clientX - drag.x) * (rtl ? -1 : 1);\r\n const projected = distance + (distance / Math.max(1, event.timeStamp - drag.time)) * 180;\r\n const shift = Math.round(-projected / Math.max(1, viewport.clientWidth));\r\n this.goTo(this.current() + shift);\r\n }\r\n protected pointerCancel(): void {\r\n this.drag = null;\r\n this.viewport().nativeElement.style.removeProperty('scroll-snap-type');\r\n this.goTo(this.current(), false);\r\n }\r\n protected preventNativeDrag(event: DragEvent): void {\r\n if (this.drag) event.preventDefault();\r\n }\r\n}\r\n@Directive({\r\n selector: 'button[hyCarouselPrevious]',\r\n host: {\r\n class: 'nav-prev',\r\n type: 'button',\r\n '[disabled]': 'blocked()',\r\n '[attr.aria-label]': 'carousel.previousLabel()',\r\n '(click)': 'previous()',\r\n },\r\n})\r\nexport class HyCarouselPrevious {\r\n protected readonly carousel = inject(HyCarousel);\r\n protected readonly blocked = computed(\r\n () =>\r\n !this.carousel.slides().length || (!this.carousel.loop() && this.carousel.current() === 0),\r\n );\r\n protected previous(): void {\r\n if (!this.blocked()) this.carousel.goTo(this.carousel.current() - 1);\r\n }\r\n}\r\n@Directive({\r\n selector: 'button[hyCarouselNext]',\r\n host: {\r\n class: 'nav-next',\r\n type: 'button',\r\n '[disabled]': 'blocked()',\r\n '[attr.aria-label]': 'carousel.nextLabel()',\r\n '(click)': 'next()',\r\n },\r\n})\r\nexport class HyCarouselNext {\r\n protected readonly carousel = inject(HyCarousel);\r\n protected readonly blocked = computed(\r\n () =>\r\n !this.carousel.slides().length ||\r\n (!this.carousel.loop() && this.carousel.current() >= this.carousel.slides().length - 1),\r\n );\r\n protected next(): void {\r\n if (!this.blocked()) this.carousel.goTo(this.carousel.current() + 1);\r\n }\r\n}\r\nexport const HY_CAROUSEL = [\r\n HyCarousel,\r\n HySlide,\r\n HyCarouselNavigation,\r\n HyCarouselPrevious,\r\n HyCarouselNext,\r\n] as const;\r\n","<div class=\"frame\">\r\n <div\r\n #viewport\r\n class=\"viewport\"\r\n tabindex=\"0\"\r\n role=\"group\"\r\n [attr.aria-label]=\"label()\"\r\n (scroll)=\"onScroll()\"\r\n (scrollend)=\"onScrollEnd()\"\r\n (keydown)=\"onKey($event)\"\r\n (pointerdown)=\"pointerDown($event)\"\r\n (pointermove)=\"pointerMove($event)\"\r\n (pointerup)=\"pointerUp($event)\"\r\n (pointercancel)=\"pointerCancel()\"\r\n (dragstart)=\"preventNativeDrag($event)\"\r\n >\r\n <ng-content select=\"hy-slide\" />\r\n </div>\r\n <div\r\n class=\"controls\"\r\n [class.controls--custom]=\"!!customNavigation()\"\r\n [class.controls--no-buttons]=\"navigation() === 'none'\"\r\n >\r\n @if (navigation() !== 'none') {\r\n @if (customNavigation(); as custom) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"custom.template\"\r\n [ngTemplateOutletContext]=\"navigationContext\"\r\n />\r\n } @else {\r\n <button\r\n class=\"nav-prev\"\r\n hyButton\r\n type=\"button\"\r\n [variant]=\"navPosition() === 'below' ? 'glass' : 'solid'\"\r\n [iconOnly]=\"navigation() === 'icons'\"\r\n [attr.aria-label]=\"previousLabel()\"\r\n [disabled]=\"!slides().length || (!loop() && current() === 0)\"\r\n (click)=\"goTo(current() - 1)\"\r\n >\r\n @if (navigation() === 'icons') {\r\n <hy-icon class=\"previous-icon\" name=\"chevron-end\" />\r\n } @else {\r\n {{ previousLabel() }}\r\n }\r\n </button>\r\n }\r\n }\r\n @if (pagination() === 'dots') {\r\n <div class=\"dots\" role=\"group\" [attr.aria-label]=\"paginationLabel()\">\r\n @for (slide of slides(); track slide; let i = $index) {\r\n <button\r\n type=\"button\"\r\n [attr.aria-label]=\"slide.label()\"\r\n [attr.aria-current]=\"current() === i ? 'true' : null\"\r\n (click)=\"goTo(i)\"\r\n >\r\n <span></span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n <span [class.sr-only]=\"pagination() !== 'counter'\" aria-live=\"polite\" aria-atomic=\"true\"\r\n >{{ slides().length ? current() + 1 : 0 }} / {{ slides().length }}</span\r\n >\r\n @if (navigation() !== 'none' && !customNavigation()) {\r\n <button\r\n class=\"nav-next\"\r\n hyButton\r\n type=\"button\"\r\n [variant]=\"navPosition() === 'below' ? 'glass' : 'solid'\"\r\n [iconOnly]=\"navigation() === 'icons'\"\r\n [attr.aria-label]=\"nextLabel()\"\r\n [disabled]=\"!slides().length || (!loop() && current() >= slides().length - 1)\"\r\n (click)=\"goTo(current() + 1)\"\r\n >\r\n @if (navigation() === 'icons') {\r\n <hy-icon name=\"chevron-end\" />\r\n } @else {\r\n {{ nextLabel() }}\r\n }\r\n </button>\r\n }\r\n </div>\r\n <ng-content select=\"ng-template[hyCarouselNavigation]\" />\r\n</div>\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, DOCUMENT, DestroyRef, afterNextRender, afterRenderEffect, booleanAttribute, computed, inject, input, numberAttribute, signal } from "@angular/core";
|
|
3
|
+
import { PlatformLocation } from "@angular/common";
|
|
4
|
+
import { HyMotion } from "@hyalo/angular/motion";
|
|
5
|
+
var HyChapterNav = class HyChapterNav {
|
|
6
|
+
document = inject(DOCUMENT);
|
|
7
|
+
location = inject(PlatformLocation);
|
|
8
|
+
motion = inject(HyMotion);
|
|
9
|
+
ready = signal(false, ...ngDevMode ? [{ debugName: "ready" }] : /* istanbul ignore next */ []);
|
|
10
|
+
current = signal("", ...ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []);
|
|
11
|
+
navigation = null;
|
|
12
|
+
frame = 0;
|
|
13
|
+
dispose;
|
|
14
|
+
chapters = input.required(...ngDevMode ? [{ debugName: "chapters" }] : /* istanbul ignore next */ []);
|
|
15
|
+
label = input("On this page", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
|
|
16
|
+
sticky = input(false, {
|
|
17
|
+
...ngDevMode ? { debugName: "sticky" } : /* istanbul ignore next */ {},
|
|
18
|
+
transform: booleanAttribute
|
|
19
|
+
});
|
|
20
|
+
stickyTop = input("6rem", ...ngDevMode ? [{ debugName: "stickyTop" }] : /* istanbul ignore next */ []);
|
|
21
|
+
scrollBehavior = input("smooth", ...ngDevMode ? [{ debugName: "scrollBehavior" }] : /* istanbul ignore next */ []);
|
|
22
|
+
scrollRoot = input(null, ...ngDevMode ? [{ debugName: "scrollRoot" }] : /* istanbul ignore next */ []);
|
|
23
|
+
offset = input(96, {
|
|
24
|
+
...ngDevMode ? { debugName: "offset" } : /* istanbul ignore next */ {},
|
|
25
|
+
transform: numberAttribute
|
|
26
|
+
});
|
|
27
|
+
active = this.current.asReadonly();
|
|
28
|
+
links = computed(() => this.chapters().map((chapter) => ({
|
|
29
|
+
...chapter,
|
|
30
|
+
href: this.location.pathname + this.location.search + "#" + encodeURIComponent(chapter.id)
|
|
31
|
+
})), ...ngDevMode ? [{ debugName: "links" }] : /* istanbul ignore next */ []);
|
|
32
|
+
progress = computed(() => {
|
|
33
|
+
const index = this.chapters().findIndex((chapter) => chapter.id === this.current());
|
|
34
|
+
return index < 0 ? 0 : (index + 1) / Math.max(1, this.chapters().length) * 100;
|
|
35
|
+
}, ...ngDevMode ? [{ debugName: "progress" }] : /* istanbul ignore next */ []);
|
|
36
|
+
constructor() {
|
|
37
|
+
afterNextRender(() => this.ready.set(true));
|
|
38
|
+
afterRenderEffect(() => {
|
|
39
|
+
this.chapters();
|
|
40
|
+
this.scrollRoot();
|
|
41
|
+
this.offset();
|
|
42
|
+
if (!this.ready()) return;
|
|
43
|
+
this.dispose?.();
|
|
44
|
+
this.navigation = null;
|
|
45
|
+
const window = this.document.defaultView;
|
|
46
|
+
if (!window) return;
|
|
47
|
+
const root = this.scrollRoot() ?? window;
|
|
48
|
+
const schedule = () => {
|
|
49
|
+
if (this.frame) return;
|
|
50
|
+
this.frame = window.requestAnimationFrame(() => {
|
|
51
|
+
this.frame = 0;
|
|
52
|
+
this.track();
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
const interrupt = (event) => {
|
|
56
|
+
if (event instanceof KeyboardEvent && ![
|
|
57
|
+
"ArrowUp",
|
|
58
|
+
"ArrowDown",
|
|
59
|
+
"PageUp",
|
|
60
|
+
"PageDown",
|
|
61
|
+
"Home",
|
|
62
|
+
"End",
|
|
63
|
+
" "
|
|
64
|
+
].includes(event.key)) return;
|
|
65
|
+
this.navigation = null;
|
|
66
|
+
schedule();
|
|
67
|
+
};
|
|
68
|
+
const settled = () => {
|
|
69
|
+
if (this.navigation && Math.abs(this.scrollPosition() - this.navigation.destination) <= 1) this.navigation.settled = true;
|
|
70
|
+
};
|
|
71
|
+
const history = () => {
|
|
72
|
+
let id;
|
|
73
|
+
try {
|
|
74
|
+
id = decodeURIComponent(this.location.hash.slice(1));
|
|
75
|
+
} catch {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (id) this.navigate(id, false, false);
|
|
79
|
+
else {
|
|
80
|
+
this.navigation = null;
|
|
81
|
+
this.track();
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
root.addEventListener("scroll", schedule, { passive: true });
|
|
85
|
+
root.addEventListener("scrollend", settled);
|
|
86
|
+
root.addEventListener("wheel", interrupt, { passive: true });
|
|
87
|
+
root.addEventListener("touchstart", interrupt, { passive: true });
|
|
88
|
+
root.addEventListener("keydown", interrupt);
|
|
89
|
+
window.addEventListener("resize", interrupt);
|
|
90
|
+
window.addEventListener("popstate", history);
|
|
91
|
+
window.addEventListener("hashchange", history);
|
|
92
|
+
this.track();
|
|
93
|
+
history();
|
|
94
|
+
this.dispose = () => {
|
|
95
|
+
root.removeEventListener("scroll", schedule);
|
|
96
|
+
root.removeEventListener("scrollend", settled);
|
|
97
|
+
root.removeEventListener("wheel", interrupt);
|
|
98
|
+
root.removeEventListener("touchstart", interrupt);
|
|
99
|
+
root.removeEventListener("keydown", interrupt);
|
|
100
|
+
window.removeEventListener("resize", interrupt);
|
|
101
|
+
window.removeEventListener("popstate", history);
|
|
102
|
+
window.removeEventListener("hashchange", history);
|
|
103
|
+
window.cancelAnimationFrame(this.frame);
|
|
104
|
+
this.frame = 0;
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
inject(DestroyRef).onDestroy(() => this.dispose?.());
|
|
108
|
+
}
|
|
109
|
+
goTo(id) {
|
|
110
|
+
return this.navigate(id, true, true);
|
|
111
|
+
}
|
|
112
|
+
onLinkClick(event, id) {
|
|
113
|
+
if (event.defaultPrevented || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;
|
|
114
|
+
event.preventDefault();
|
|
115
|
+
this.goTo(id);
|
|
116
|
+
}
|
|
117
|
+
targets() {
|
|
118
|
+
const root = this.scrollRoot();
|
|
119
|
+
return this.chapters().flatMap((chapter) => {
|
|
120
|
+
const element = this.document.getElementById(chapter.id);
|
|
121
|
+
return element && (!root || root.contains(element)) ? [{
|
|
122
|
+
id: chapter.id,
|
|
123
|
+
element
|
|
124
|
+
}] : [];
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
scrollPosition() {
|
|
128
|
+
return this.scrollRoot()?.scrollTop ?? this.document.defaultView?.scrollY ?? 0;
|
|
129
|
+
}
|
|
130
|
+
clearance() {
|
|
131
|
+
return Number.isFinite(this.offset()) ? Math.max(0, this.offset()) : 96;
|
|
132
|
+
}
|
|
133
|
+
navigate(id, writeHistory, focus) {
|
|
134
|
+
if (!this.ready()) return false;
|
|
135
|
+
const window = this.document.defaultView;
|
|
136
|
+
const target = this.targets().find((target) => target.id === id)?.element;
|
|
137
|
+
if (!window || !target) return false;
|
|
138
|
+
const root = this.scrollRoot();
|
|
139
|
+
const origin = root ? root.getBoundingClientRect().top + root.clientTop : 0;
|
|
140
|
+
const margin = parseFloat(window.getComputedStyle(target).scrollMarginTop) || 0;
|
|
141
|
+
const scrolling = this.document.scrollingElement ?? this.document.documentElement;
|
|
142
|
+
const maximum = Math.max(0, root ? root.scrollHeight - root.clientHeight : scrolling.scrollHeight - window.innerHeight);
|
|
143
|
+
const destination = Math.min(maximum, Math.max(0, this.scrollPosition() + target.getBoundingClientRect().top - origin - Math.max(margin, this.clearance())));
|
|
144
|
+
const smooth = writeHistory && this.scrollBehavior() === "smooth" && !this.motion.reduced();
|
|
145
|
+
this.navigation = {
|
|
146
|
+
id,
|
|
147
|
+
destination,
|
|
148
|
+
settled: !smooth || Math.abs(this.scrollPosition() - destination) < 1
|
|
149
|
+
};
|
|
150
|
+
this.current.set(id);
|
|
151
|
+
if (writeHistory && this.location.hash !== "#" + encodeURIComponent(id)) this.location.pushState(this.location.getState(), "", this.location.pathname + this.location.search + "#" + encodeURIComponent(id));
|
|
152
|
+
if (focus) {
|
|
153
|
+
if (target.getAttribute("tabindex") === null) {
|
|
154
|
+
target.setAttribute("tabindex", "-1");
|
|
155
|
+
target.addEventListener("blur", () => target.removeAttribute("tabindex"), { once: true });
|
|
156
|
+
}
|
|
157
|
+
target.focus({ preventScroll: true });
|
|
158
|
+
}
|
|
159
|
+
const options = {
|
|
160
|
+
top: destination,
|
|
161
|
+
behavior: smooth ? "smooth" : "instant"
|
|
162
|
+
};
|
|
163
|
+
if (root) root.scrollTo(options);
|
|
164
|
+
else window.scrollTo(options);
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
track() {
|
|
168
|
+
const position = this.scrollPosition();
|
|
169
|
+
if (this.navigation) {
|
|
170
|
+
if (Math.abs(position - this.navigation.destination) <= 1) this.navigation.settled = true;
|
|
171
|
+
if (!this.navigation.settled || Math.abs(position - this.navigation.destination) <= 1) return;
|
|
172
|
+
this.navigation = null;
|
|
173
|
+
}
|
|
174
|
+
const targets = this.targets();
|
|
175
|
+
const root = this.scrollRoot();
|
|
176
|
+
const line = (root ? root.getBoundingClientRect().top + root.clientTop : 0) + this.clearance() + 1;
|
|
177
|
+
let active = targets[0]?.id ?? "";
|
|
178
|
+
for (const target of targets) if (target.element.getBoundingClientRect().top <= line) active = target.id;
|
|
179
|
+
this.current.set(active);
|
|
180
|
+
}
|
|
181
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
182
|
+
minVersion: "12.0.0",
|
|
183
|
+
version: "22.2.3",
|
|
184
|
+
ngImport: i0,
|
|
185
|
+
type: HyChapterNav,
|
|
186
|
+
deps: [],
|
|
187
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
188
|
+
});
|
|
189
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
190
|
+
minVersion: "17.0.0",
|
|
191
|
+
version: "22.2.3",
|
|
192
|
+
type: HyChapterNav,
|
|
193
|
+
isStandalone: true,
|
|
194
|
+
selector: "hy-chapter-nav",
|
|
195
|
+
inputs: {
|
|
196
|
+
chapters: {
|
|
197
|
+
classPropertyName: "chapters",
|
|
198
|
+
publicName: "chapters",
|
|
199
|
+
isSignal: true,
|
|
200
|
+
isRequired: true,
|
|
201
|
+
transformFunction: null
|
|
202
|
+
},
|
|
203
|
+
label: {
|
|
204
|
+
classPropertyName: "label",
|
|
205
|
+
publicName: "label",
|
|
206
|
+
isSignal: true,
|
|
207
|
+
isRequired: false,
|
|
208
|
+
transformFunction: null
|
|
209
|
+
},
|
|
210
|
+
sticky: {
|
|
211
|
+
classPropertyName: "sticky",
|
|
212
|
+
publicName: "sticky",
|
|
213
|
+
isSignal: true,
|
|
214
|
+
isRequired: false,
|
|
215
|
+
transformFunction: null
|
|
216
|
+
},
|
|
217
|
+
stickyTop: {
|
|
218
|
+
classPropertyName: "stickyTop",
|
|
219
|
+
publicName: "stickyTop",
|
|
220
|
+
isSignal: true,
|
|
221
|
+
isRequired: false,
|
|
222
|
+
transformFunction: null
|
|
223
|
+
},
|
|
224
|
+
scrollBehavior: {
|
|
225
|
+
classPropertyName: "scrollBehavior",
|
|
226
|
+
publicName: "scrollBehavior",
|
|
227
|
+
isSignal: true,
|
|
228
|
+
isRequired: false,
|
|
229
|
+
transformFunction: null
|
|
230
|
+
},
|
|
231
|
+
scrollRoot: {
|
|
232
|
+
classPropertyName: "scrollRoot",
|
|
233
|
+
publicName: "scrollRoot",
|
|
234
|
+
isSignal: true,
|
|
235
|
+
isRequired: false,
|
|
236
|
+
transformFunction: null
|
|
237
|
+
},
|
|
238
|
+
offset: {
|
|
239
|
+
classPropertyName: "offset",
|
|
240
|
+
publicName: "offset",
|
|
241
|
+
isSignal: true,
|
|
242
|
+
isRequired: false,
|
|
243
|
+
transformFunction: null
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
host: { properties: {
|
|
247
|
+
"attr.data-sticky": "sticky()",
|
|
248
|
+
"style.--hy-chapter-sticky-top": "stickyTop()"
|
|
249
|
+
} },
|
|
250
|
+
ngImport: i0,
|
|
251
|
+
template: "<nav [attr.aria-label]=\"label()\">\r\n <span class=\"heading\" aria-hidden=\"true\">{{ label() }}</span>\r\n <span\r\n class=\"thread\"\r\n aria-hidden=\"true\"\r\n [style.transform]=\"'scaleY(' + progress() / 100 + ')'\"\r\n ></span>\r\n <ol>\r\n @for (chapter of links(); track chapter.id) {\r\n <li>\r\n <a\r\n [href]=\"chapter.href\"\r\n [attr.aria-current]=\"active() === chapter.id ? 'location' : null\"\r\n (click)=\"onLinkClick($event, chapter.id)\"\r\n ><span aria-hidden=\"true\">●</span>{{ chapter.label }}</a\r\n >\r\n </li>\r\n }\r\n </ol>\r\n</nav>\r\n",
|
|
252
|
+
styles: [":host{display:block;align-self:start;min-inline-size:0}:host([data-sticky=\"true\"]){position:sticky;inset-block-start:var(--hy-chapter-sticky-top, 6rem);z-index:1}nav{position:relative;padding:var(--hy-space-3);border:1px solid var(--hy-line);border-radius:var(--hy-radius-m);background:var(--hy-surface-1)}.heading{display:block;padding:var(--hy-space-2) var(--hy-space-3);font-size:var(--hy-step--1);color:var(--hy-ink-3)}.thread{position:absolute;inset-block:var(--hy-space-4);inset-inline-start:0;inline-size:2px;background:var(--hy-primary);transform-origin:top}ol{list-style:none;margin:0;padding:0;display:grid;gap:var(--hy-space-1)}a{display:flex;align-items:center;gap:var(--hy-space-3);min-block-size:2.75rem;padding:var(--hy-space-2) var(--hy-space-3);border-radius:var(--hy-radius-s);color:var(--hy-ink-2);text-decoration:none;font-size:var(--hy-step--1);font-weight:600;transition:background-color var(--hy-dur-quick) ease,color var(--hy-dur-quick) ease}a>span{font-size:.5rem;opacity:.4}a[aria-current]{background:var(--hy-primary-wash);color:var(--hy-primary)}a[aria-current]>span{opacity:1}a:focus-visible{outline:2px solid var(--hy-primary);outline-offset:2px}@media(hover:hover)and (pointer:fine){a:hover{background:var(--hy-surface-3)}a[aria-current]:hover{background:var(--hy-primary-wash)}}\n"],
|
|
253
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
257
|
+
minVersion: "12.0.0",
|
|
258
|
+
version: "22.2.3",
|
|
259
|
+
ngImport: i0,
|
|
260
|
+
type: HyChapterNav,
|
|
261
|
+
decorators: [{
|
|
262
|
+
type: Component,
|
|
263
|
+
args: [{
|
|
264
|
+
selector: "hy-chapter-nav",
|
|
265
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
266
|
+
host: {
|
|
267
|
+
"[attr.data-sticky]": "sticky()",
|
|
268
|
+
"[style.--hy-chapter-sticky-top]": "stickyTop()"
|
|
269
|
+
},
|
|
270
|
+
template: "<nav [attr.aria-label]=\"label()\">\r\n <span class=\"heading\" aria-hidden=\"true\">{{ label() }}</span>\r\n <span\r\n class=\"thread\"\r\n aria-hidden=\"true\"\r\n [style.transform]=\"'scaleY(' + progress() / 100 + ')'\"\r\n ></span>\r\n <ol>\r\n @for (chapter of links(); track chapter.id) {\r\n <li>\r\n <a\r\n [href]=\"chapter.href\"\r\n [attr.aria-current]=\"active() === chapter.id ? 'location' : null\"\r\n (click)=\"onLinkClick($event, chapter.id)\"\r\n ><span aria-hidden=\"true\">●</span>{{ chapter.label }}</a\r\n >\r\n </li>\r\n }\r\n </ol>\r\n</nav>\r\n",
|
|
271
|
+
styles: [":host{display:block;align-self:start;min-inline-size:0}:host([data-sticky=\"true\"]){position:sticky;inset-block-start:var(--hy-chapter-sticky-top, 6rem);z-index:1}nav{position:relative;padding:var(--hy-space-3);border:1px solid var(--hy-line);border-radius:var(--hy-radius-m);background:var(--hy-surface-1)}.heading{display:block;padding:var(--hy-space-2) var(--hy-space-3);font-size:var(--hy-step--1);color:var(--hy-ink-3)}.thread{position:absolute;inset-block:var(--hy-space-4);inset-inline-start:0;inline-size:2px;background:var(--hy-primary);transform-origin:top}ol{list-style:none;margin:0;padding:0;display:grid;gap:var(--hy-space-1)}a{display:flex;align-items:center;gap:var(--hy-space-3);min-block-size:2.75rem;padding:var(--hy-space-2) var(--hy-space-3);border-radius:var(--hy-radius-s);color:var(--hy-ink-2);text-decoration:none;font-size:var(--hy-step--1);font-weight:600;transition:background-color var(--hy-dur-quick) ease,color var(--hy-dur-quick) ease}a>span{font-size:.5rem;opacity:.4}a[aria-current]{background:var(--hy-primary-wash);color:var(--hy-primary)}a[aria-current]>span{opacity:1}a:focus-visible{outline:2px solid var(--hy-primary);outline-offset:2px}@media(hover:hover)and (pointer:fine){a:hover{background:var(--hy-surface-3)}a[aria-current]:hover{background:var(--hy-primary-wash)}}\n"]
|
|
272
|
+
}]
|
|
273
|
+
}],
|
|
274
|
+
ctorParameters: () => [],
|
|
275
|
+
propDecorators: {
|
|
276
|
+
chapters: [{
|
|
277
|
+
type: i0.Input,
|
|
278
|
+
args: [{
|
|
279
|
+
isSignal: true,
|
|
280
|
+
alias: "chapters",
|
|
281
|
+
required: true
|
|
282
|
+
}]
|
|
283
|
+
}],
|
|
284
|
+
label: [{
|
|
285
|
+
type: i0.Input,
|
|
286
|
+
args: [{
|
|
287
|
+
isSignal: true,
|
|
288
|
+
alias: "label",
|
|
289
|
+
required: false
|
|
290
|
+
}]
|
|
291
|
+
}],
|
|
292
|
+
sticky: [{
|
|
293
|
+
type: i0.Input,
|
|
294
|
+
args: [{
|
|
295
|
+
isSignal: true,
|
|
296
|
+
alias: "sticky",
|
|
297
|
+
required: false
|
|
298
|
+
}]
|
|
299
|
+
}],
|
|
300
|
+
stickyTop: [{
|
|
301
|
+
type: i0.Input,
|
|
302
|
+
args: [{
|
|
303
|
+
isSignal: true,
|
|
304
|
+
alias: "stickyTop",
|
|
305
|
+
required: false
|
|
306
|
+
}]
|
|
307
|
+
}],
|
|
308
|
+
scrollBehavior: [{
|
|
309
|
+
type: i0.Input,
|
|
310
|
+
args: [{
|
|
311
|
+
isSignal: true,
|
|
312
|
+
alias: "scrollBehavior",
|
|
313
|
+
required: false
|
|
314
|
+
}]
|
|
315
|
+
}],
|
|
316
|
+
scrollRoot: [{
|
|
317
|
+
type: i0.Input,
|
|
318
|
+
args: [{
|
|
319
|
+
isSignal: true,
|
|
320
|
+
alias: "scrollRoot",
|
|
321
|
+
required: false
|
|
322
|
+
}]
|
|
323
|
+
}],
|
|
324
|
+
offset: [{
|
|
325
|
+
type: i0.Input,
|
|
326
|
+
args: [{
|
|
327
|
+
isSignal: true,
|
|
328
|
+
alias: "offset",
|
|
329
|
+
required: false
|
|
330
|
+
}]
|
|
331
|
+
}]
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
export { HyChapterNav };
|
|
335
|
+
|
|
336
|
+
//# sourceMappingURL=hyalo-angular-chapter-nav.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyalo-angular-chapter-nav.mjs","names":[],"sources":["../../../projects/hyalo/chapter-nav/chapter-nav.ts","../../../projects/hyalo/chapter-nav/chapter-nav.html"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DOCUMENT,\r\n DestroyRef,\r\n afterNextRender,\r\n afterRenderEffect,\r\n computed,\r\n inject,\r\n input,\r\n numberAttribute,\r\n booleanAttribute,\r\n signal,\r\n} from '@angular/core';\r\nimport { PlatformLocation } from '@angular/common';\r\nimport { HyMotion } from '@hyalo/angular/motion';\r\n\r\nexport interface HyChapter {\r\n readonly id: string;\r\n readonly label: string;\r\n}\r\ninterface ChapterTarget {\r\n readonly id: string;\r\n readonly element: HTMLElement;\r\n}\r\ninterface ChapterScroll {\r\n readonly id: string;\r\n destination: number;\r\n settled: boolean;\r\n}\r\n\r\n/** Route-safe section navigation for a page or an explicitly supplied reading pane. */\r\n@Component({\r\n selector: 'hy-chapter-nav',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './chapter-nav.html',\r\n styleUrl: './chapter-nav.css',\r\n host: { '[attr.data-sticky]': 'sticky()', '[style.--hy-chapter-sticky-top]': 'stickyTop()' },\r\n})\r\nexport class HyChapterNav {\r\n private readonly document = inject(DOCUMENT);\r\n private readonly location = inject(PlatformLocation);\r\n private readonly motion = inject(HyMotion);\r\n private readonly ready = signal(false);\r\n private readonly current = signal('');\r\n private navigation: ChapterScroll | null = null;\r\n private frame = 0;\r\n private dispose: (() => void) | undefined;\r\n readonly chapters = input.required<readonly HyChapter[]>();\r\n readonly label = input('On this page');\r\n readonly sticky = input(false, { transform: booleanAttribute });\r\n readonly stickyTop = input('6rem');\r\n readonly scrollBehavior = input<'smooth' | 'instant'>('smooth');\r\n /** Null scrolls the page; pass an overflow container to scroll a reading pane. */\r\n readonly scrollRoot = input<HTMLElement | null>(null);\r\n /** Clearance below a sticky header, in pixels. Target scroll-margin is respected too. */\r\n readonly offset = input(96, { transform: numberAttribute });\r\n readonly active = this.current.asReadonly();\r\n protected readonly links = computed(() =>\r\n this.chapters().map((chapter) => ({\r\n ...chapter,\r\n href: this.location.pathname + this.location.search + '#' + encodeURIComponent(chapter.id),\r\n })),\r\n );\r\n protected readonly progress = computed(() => {\r\n const index = this.chapters().findIndex((chapter) => chapter.id === this.current());\r\n return index < 0 ? 0 : ((index + 1) / Math.max(1, this.chapters().length)) * 100;\r\n });\r\n\r\n constructor() {\r\n afterNextRender(() => this.ready.set(true));\r\n afterRenderEffect(() => {\r\n this.chapters();\r\n this.scrollRoot();\r\n this.offset();\r\n if (!this.ready()) return;\r\n this.dispose?.();\r\n this.navigation = null;\r\n const window = this.document.defaultView;\r\n if (!window) return;\r\n const root: EventTarget = this.scrollRoot() ?? window;\r\n const schedule = (): void => {\r\n if (this.frame) return;\r\n this.frame = window.requestAnimationFrame(() => {\r\n this.frame = 0;\r\n this.track();\r\n });\r\n };\r\n const interrupt = (event: Event): void => {\r\n if (\r\n event instanceof KeyboardEvent &&\r\n !['ArrowUp', 'ArrowDown', 'PageUp', 'PageDown', 'Home', 'End', ' '].includes(event.key)\r\n )\r\n return;\r\n this.navigation = null;\r\n schedule();\r\n };\r\n const settled = (): void => {\r\n if (this.navigation && Math.abs(this.scrollPosition() - this.navigation.destination) <= 1) {\r\n this.navigation.settled = true;\r\n }\r\n };\r\n const history = (): void => {\r\n let id: string;\r\n try {\r\n id = decodeURIComponent(this.location.hash.slice(1));\r\n } catch {\r\n return;\r\n }\r\n if (id) this.navigate(id, false, false);\r\n else {\r\n this.navigation = null;\r\n this.track();\r\n }\r\n };\r\n root.addEventListener('scroll', schedule, { passive: true });\r\n root.addEventListener('scrollend', settled);\r\n root.addEventListener('wheel', interrupt, { passive: true });\r\n root.addEventListener('touchstart', interrupt, { passive: true });\r\n root.addEventListener('keydown', interrupt);\r\n window.addEventListener('resize', interrupt);\r\n window.addEventListener('popstate', history);\r\n window.addEventListener('hashchange', history);\r\n this.track();\r\n history();\r\n this.dispose = () => {\r\n root.removeEventListener('scroll', schedule);\r\n root.removeEventListener('scrollend', settled);\r\n root.removeEventListener('wheel', interrupt);\r\n root.removeEventListener('touchstart', interrupt);\r\n root.removeEventListener('keydown', interrupt);\r\n window.removeEventListener('resize', interrupt);\r\n window.removeEventListener('popstate', history);\r\n window.removeEventListener('hashchange', history);\r\n window.cancelAnimationFrame(this.frame);\r\n this.frame = 0;\r\n };\r\n });\r\n inject(DestroyRef).onDestroy(() => this.dispose?.());\r\n }\r\n\r\n /** Selects, focuses and scrolls to a chapter. Missing targets leave state unchanged. */\r\n goTo(id: string): boolean {\r\n return this.navigate(id, true, true);\r\n }\r\n\r\n protected onLinkClick(event: MouseEvent, id: string): void {\r\n if (\r\n event.defaultPrevented ||\r\n event.button !== 0 ||\r\n event.ctrlKey ||\r\n event.metaKey ||\r\n event.shiftKey ||\r\n event.altKey\r\n )\r\n return;\r\n event.preventDefault();\r\n this.goTo(id);\r\n }\r\n\r\n private targets(): ChapterTarget[] {\r\n const root = this.scrollRoot();\r\n return this.chapters().flatMap((chapter) => {\r\n const element = this.document.getElementById(chapter.id);\r\n return element && (!root || root.contains(element)) ? [{ id: chapter.id, element }] : [];\r\n });\r\n }\r\n private scrollPosition(): number {\r\n return this.scrollRoot()?.scrollTop ?? this.document.defaultView?.scrollY ?? 0;\r\n }\r\n private clearance(): number {\r\n return Number.isFinite(this.offset()) ? Math.max(0, this.offset()) : 96;\r\n }\r\n private navigate(id: string, writeHistory: boolean, focus: boolean): boolean {\r\n if (!this.ready()) return false;\r\n const window = this.document.defaultView;\r\n const target = this.targets().find((target) => target.id === id)?.element;\r\n if (!window || !target) return false;\r\n const root = this.scrollRoot();\r\n const origin = root ? root.getBoundingClientRect().top + root.clientTop : 0;\r\n const margin = parseFloat(window.getComputedStyle(target).scrollMarginTop) || 0;\r\n const scrolling = this.document.scrollingElement ?? this.document.documentElement;\r\n const maximum = Math.max(\r\n 0,\r\n root ? root.scrollHeight - root.clientHeight : scrolling.scrollHeight - window.innerHeight,\r\n );\r\n const destination = Math.min(\r\n maximum,\r\n Math.max(\r\n 0,\r\n this.scrollPosition() +\r\n target.getBoundingClientRect().top -\r\n origin -\r\n Math.max(margin, this.clearance()),\r\n ),\r\n );\r\n const smooth = writeHistory && this.scrollBehavior() === 'smooth' && !this.motion.reduced();\r\n this.navigation = {\r\n id,\r\n destination,\r\n settled: !smooth || Math.abs(this.scrollPosition() - destination) < 1,\r\n };\r\n this.current.set(id);\r\n if (writeHistory && this.location.hash !== '#' + encodeURIComponent(id)) {\r\n this.location.pushState(\r\n this.location.getState(),\r\n '',\r\n this.location.pathname + this.location.search + '#' + encodeURIComponent(id),\r\n );\r\n }\r\n if (focus) {\r\n const tabindex = target.getAttribute('tabindex');\r\n if (tabindex === null) {\r\n target.setAttribute('tabindex', '-1');\r\n target.addEventListener('blur', () => target.removeAttribute('tabindex'), { once: true });\r\n }\r\n target.focus({ preventScroll: true });\r\n }\r\n const options: ScrollToOptions = { top: destination, behavior: smooth ? 'smooth' : 'instant' };\r\n if (root) root.scrollTo(options);\r\n else window.scrollTo(options);\r\n return true;\r\n }\r\n private track(): void {\r\n const position = this.scrollPosition();\r\n if (this.navigation) {\r\n if (Math.abs(position - this.navigation.destination) <= 1) this.navigation.settled = true;\r\n if (!this.navigation.settled || Math.abs(position - this.navigation.destination) <= 1) return;\r\n this.navigation = null;\r\n }\r\n const targets = this.targets();\r\n const root = this.scrollRoot();\r\n const line =\r\n (root ? root.getBoundingClientRect().top + root.clientTop : 0) + this.clearance() + 1;\r\n let active = targets[0]?.id ?? '';\r\n for (const target of targets)\r\n if (target.element.getBoundingClientRect().top <= line) active = target.id;\r\n this.current.set(active);\r\n }\r\n}\r\n","<nav [attr.aria-label]=\"label()\">\r\n <span class=\"heading\" aria-hidden=\"true\">{{ label() }}</span>\r\n <span\r\n class=\"thread\"\r\n aria-hidden=\"true\"\r\n [style.transform]=\"'scaleY(' + progress() / 100 + ')'\"\r\n ></span>\r\n <ol>\r\n @for (chapter of links(); track chapter.id) {\r\n <li>\r\n <a\r\n [href]=\"chapter.href\"\r\n [attr.aria-current]=\"active() === chapter.id ? 'location' : null\"\r\n (click)=\"onLinkClick($event, chapter.id)\"\r\n ><span aria-hidden=\"true\">●</span>{{ chapter.label }}</a\r\n >\r\n </li>\r\n }\r\n </ol>\r\n</nav>\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ArcElement, BarController, BarElement, CategoryScale, Chart, DoughnutController, Filler, Legend, LineController, LineElement, LinearScale, PointElement, Tooltip } from "chart.js";
|
|
2
|
+
Chart.register(LineController, BarController, DoughnutController, CategoryScale, LinearScale, PointElement, LineElement, BarElement, ArcElement, Tooltip, Legend, Filler);
|
|
3
|
+
export { Chart };
|
|
4
|
+
|
|
5
|
+
//# sourceMappingURL=hyalo-angular-chart-engine-DSJop6He.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyalo-angular-chart-engine-DSJop6He.mjs","names":[],"sources":["../../../projects/hyalo/chart/engine.ts"],"sourcesContent":["import {\r\n Chart,\r\n LineController,\r\n BarController,\r\n DoughnutController,\r\n CategoryScale,\r\n LinearScale,\r\n PointElement,\r\n LineElement,\r\n BarElement,\r\n ArcElement,\r\n Tooltip,\r\n Legend,\r\n Filler,\r\n} from 'chart.js';\r\nChart.register(\r\n LineController,\r\n BarController,\r\n DoughnutController,\r\n CategoryScale,\r\n LinearScale,\r\n PointElement,\r\n LineElement,\r\n BarElement,\r\n ArcElement,\r\n Tooltip,\r\n Legend,\r\n Filler,\r\n);\r\nexport { Chart };\r\n"],"mappings":";AAeA,MAAM,SACJ,gBACA,eACA,oBACA,eACA,aACA,cACA,aACA,YACA,YACA,SACA,QACA,MAAM"}
|