@hyalo/angular 0.0.0-stage → 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.
Files changed (229) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/LICENSE +21 -0
  3. package/README.md +45 -2
  4. package/fesm2022/hyalo-angular-accordion.mjs +230 -0
  5. package/fesm2022/hyalo-angular-accordion.mjs.map +1 -0
  6. package/fesm2022/hyalo-angular-alert.mjs +171 -0
  7. package/fesm2022/hyalo-angular-alert.mjs.map +1 -0
  8. package/fesm2022/hyalo-angular-aspect-ratio.mjs +64 -0
  9. package/fesm2022/hyalo-angular-aspect-ratio.mjs.map +1 -0
  10. package/fesm2022/hyalo-angular-avatar.mjs +169 -0
  11. package/fesm2022/hyalo-angular-avatar.mjs.map +1 -0
  12. package/fesm2022/hyalo-angular-badge.mjs +268 -0
  13. package/fesm2022/hyalo-angular-badge.mjs.map +1 -0
  14. package/fesm2022/hyalo-angular-bento.mjs +132 -0
  15. package/fesm2022/hyalo-angular-bento.mjs.map +1 -0
  16. package/fesm2022/hyalo-angular-blocks.mjs +985 -0
  17. package/fesm2022/hyalo-angular-blocks.mjs.map +1 -0
  18. package/fesm2022/hyalo-angular-border-beam.mjs +73 -0
  19. package/fesm2022/hyalo-angular-border-beam.mjs.map +1 -0
  20. package/fesm2022/hyalo-angular-breadcrumb.mjs +77 -0
  21. package/fesm2022/hyalo-angular-breadcrumb.mjs.map +1 -0
  22. package/fesm2022/hyalo-angular-button-group.mjs +90 -0
  23. package/fesm2022/hyalo-angular-button-group.mjs.map +1 -0
  24. package/fesm2022/hyalo-angular-button.mjs +204 -0
  25. package/fesm2022/hyalo-angular-button.mjs.map +1 -0
  26. package/fesm2022/hyalo-angular-card.mjs +221 -0
  27. package/fesm2022/hyalo-angular-card.mjs.map +1 -0
  28. package/fesm2022/hyalo-angular-carousel.mjs +709 -0
  29. package/fesm2022/hyalo-angular-carousel.mjs.map +1 -0
  30. package/fesm2022/hyalo-angular-chapter-nav.mjs +336 -0
  31. package/fesm2022/hyalo-angular-chapter-nav.mjs.map +1 -0
  32. package/fesm2022/hyalo-angular-chart-engine-DSJop6He.mjs +5 -0
  33. package/fesm2022/hyalo-angular-chart-engine-DSJop6He.mjs.map +1 -0
  34. package/fesm2022/hyalo-angular-chart.mjs +391 -0
  35. package/fesm2022/hyalo-angular-chart.mjs.map +1 -0
  36. package/fesm2022/hyalo-angular-choice.mjs +789 -0
  37. package/fesm2022/hyalo-angular-choice.mjs.map +1 -0
  38. package/fesm2022/hyalo-angular-code-block-highlight-B20d5C76.mjs +40 -0
  39. package/fesm2022/hyalo-angular-code-block-highlight-B20d5C76.mjs.map +1 -0
  40. package/fesm2022/hyalo-angular-code-block.mjs +161 -0
  41. package/fesm2022/hyalo-angular-code-block.mjs.map +1 -0
  42. package/fesm2022/hyalo-angular-command.mjs +193 -0
  43. package/fesm2022/hyalo-angular-command.mjs.map +1 -0
  44. package/fesm2022/hyalo-angular-copy.mjs +138 -0
  45. package/fesm2022/hyalo-angular-copy.mjs.map +1 -0
  46. package/fesm2022/hyalo-angular-core.mjs +424 -0
  47. package/fesm2022/hyalo-angular-core.mjs.map +1 -0
  48. package/fesm2022/hyalo-angular-description-list.mjs +57 -0
  49. package/fesm2022/hyalo-angular-description-list.mjs.map +1 -0
  50. package/fesm2022/hyalo-angular-dialog.mjs +600 -0
  51. package/fesm2022/hyalo-angular-dialog.mjs.map +1 -0
  52. package/fesm2022/hyalo-angular-divider.mjs +66 -0
  53. package/fesm2022/hyalo-angular-divider.mjs.map +1 -0
  54. package/fesm2022/hyalo-angular-empty-state.mjs +123 -0
  55. package/fesm2022/hyalo-angular-empty-state.mjs.map +1 -0
  56. package/fesm2022/hyalo-angular-field.mjs +344 -0
  57. package/fesm2022/hyalo-angular-field.mjs.map +1 -0
  58. package/fesm2022/hyalo-angular-filter.mjs +309 -0
  59. package/fesm2022/hyalo-angular-filter.mjs.map +1 -0
  60. package/fesm2022/hyalo-angular-hotspot.mjs +225 -0
  61. package/fesm2022/hyalo-angular-hotspot.mjs.map +1 -0
  62. package/fesm2022/hyalo-angular-hover-card.mjs +233 -0
  63. package/fesm2022/hyalo-angular-hover-card.mjs.map +1 -0
  64. package/fesm2022/hyalo-angular-icon.mjs +385 -0
  65. package/fesm2022/hyalo-angular-icon.mjs.map +1 -0
  66. package/fesm2022/hyalo-angular-image-compare.mjs +168 -0
  67. package/fesm2022/hyalo-angular-image-compare.mjs.map +1 -0
  68. package/fesm2022/hyalo-angular-interaction.mjs +446 -0
  69. package/fesm2022/hyalo-angular-interaction.mjs.map +1 -0
  70. package/fesm2022/hyalo-angular-kbd.mjs +41 -0
  71. package/fesm2022/hyalo-angular-kbd.mjs.map +1 -0
  72. package/fesm2022/hyalo-angular-lightbox.mjs +228 -0
  73. package/fesm2022/hyalo-angular-lightbox.mjs.map +1 -0
  74. package/fesm2022/hyalo-angular-link.mjs +42 -0
  75. package/fesm2022/hyalo-angular-link.mjs.map +1 -0
  76. package/fesm2022/hyalo-angular-list.mjs +131 -0
  77. package/fesm2022/hyalo-angular-list.mjs.map +1 -0
  78. package/fesm2022/hyalo-angular-marquee.mjs +197 -0
  79. package/fesm2022/hyalo-angular-marquee.mjs.map +1 -0
  80. package/fesm2022/hyalo-angular-menu.mjs +423 -0
  81. package/fesm2022/hyalo-angular-menu.mjs.map +1 -0
  82. package/fesm2022/hyalo-angular-mesh.mjs +126 -0
  83. package/fesm2022/hyalo-angular-mesh.mjs.map +1 -0
  84. package/fesm2022/hyalo-angular-motion.mjs +620 -0
  85. package/fesm2022/hyalo-angular-motion.mjs.map +1 -0
  86. package/fesm2022/hyalo-angular-navbar.mjs +343 -0
  87. package/fesm2022/hyalo-angular-navbar.mjs.map +1 -0
  88. package/fesm2022/hyalo-angular-navigation-menu.mjs +222 -0
  89. package/fesm2022/hyalo-angular-navigation-menu.mjs.map +1 -0
  90. package/fesm2022/hyalo-angular-number-ticker.mjs +174 -0
  91. package/fesm2022/hyalo-angular-number-ticker.mjs.map +1 -0
  92. package/fesm2022/hyalo-angular-overlay.mjs +163 -0
  93. package/fesm2022/hyalo-angular-overlay.mjs.map +1 -0
  94. package/fesm2022/hyalo-angular-pagination.mjs +187 -0
  95. package/fesm2022/hyalo-angular-pagination.mjs.map +1 -0
  96. package/fesm2022/hyalo-angular-popover-overlay-kit-6wPwnxln.mjs +3 -0
  97. package/fesm2022/hyalo-angular-popover.mjs +516 -0
  98. package/fesm2022/hyalo-angular-popover.mjs.map +1 -0
  99. package/fesm2022/hyalo-angular-progress.mjs +209 -0
  100. package/fesm2022/hyalo-angular-progress.mjs.map +1 -0
  101. package/fesm2022/hyalo-angular-progressive-blur.mjs +73 -0
  102. package/fesm2022/hyalo-angular-progressive-blur.mjs.map +1 -0
  103. package/fesm2022/hyalo-angular-refraction-renderer-5ZA-kfsA.mjs +186 -0
  104. package/fesm2022/hyalo-angular-refraction-renderer-5ZA-kfsA.mjs.map +1 -0
  105. package/fesm2022/hyalo-angular-refraction.mjs +178 -0
  106. package/fesm2022/hyalo-angular-refraction.mjs.map +1 -0
  107. package/fesm2022/hyalo-angular-scroll-area.mjs +93 -0
  108. package/fesm2022/hyalo-angular-scroll-area.mjs.map +1 -0
  109. package/fesm2022/hyalo-angular-scroll-to-top.mjs +127 -0
  110. package/fesm2022/hyalo-angular-scroll-to-top.mjs.map +1 -0
  111. package/fesm2022/hyalo-angular-segmented.mjs +223 -0
  112. package/fesm2022/hyalo-angular-segmented.mjs.map +1 -0
  113. package/fesm2022/hyalo-angular-select.mjs +561 -0
  114. package/fesm2022/hyalo-angular-select.mjs.map +1 -0
  115. package/fesm2022/hyalo-angular-sidebar.mjs +241 -0
  116. package/fesm2022/hyalo-angular-sidebar.mjs.map +1 -0
  117. package/fesm2022/hyalo-angular-skeleton.mjs +131 -0
  118. package/fesm2022/hyalo-angular-skeleton.mjs.map +1 -0
  119. package/fesm2022/hyalo-angular-sparkline.mjs +110 -0
  120. package/fesm2022/hyalo-angular-sparkline.mjs.map +1 -0
  121. package/fesm2022/hyalo-angular-split-text.mjs +126 -0
  122. package/fesm2022/hyalo-angular-split-text.mjs.map +1 -0
  123. package/fesm2022/hyalo-angular-stat.mjs +193 -0
  124. package/fesm2022/hyalo-angular-stat.mjs.map +1 -0
  125. package/fesm2022/hyalo-angular-stepper.mjs +254 -0
  126. package/fesm2022/hyalo-angular-stepper.mjs.map +1 -0
  127. package/fesm2022/hyalo-angular-table.mjs +335 -0
  128. package/fesm2022/hyalo-angular-table.mjs.map +1 -0
  129. package/fesm2022/hyalo-angular-tabs.mjs +324 -0
  130. package/fesm2022/hyalo-angular-tabs.mjs.map +1 -0
  131. package/fesm2022/hyalo-angular-theme.mjs +94 -0
  132. package/fesm2022/hyalo-angular-theme.mjs.map +1 -0
  133. package/fesm2022/hyalo-angular-timeline.mjs +157 -0
  134. package/fesm2022/hyalo-angular-timeline.mjs.map +1 -0
  135. package/fesm2022/hyalo-angular-toast.mjs +323 -0
  136. package/fesm2022/hyalo-angular-toast.mjs.map +1 -0
  137. package/fesm2022/hyalo-angular.mjs +2 -0
  138. package/package.json +329 -3
  139. package/styles/hyalo-core.css +25 -0
  140. package/styles/hyalo.css +17 -0
  141. package/styles/overlays/dialog.css +9 -0
  142. package/styles/overlays/popover.css +9 -0
  143. package/styles/overlays/select.css +9 -0
  144. package/styles/overlays/toast.css +8 -0
  145. package/styles/palettes/aurora.css +47 -0
  146. package/styles/palettes/ember.css +47 -0
  147. package/styles/palettes/graphite.css +47 -0
  148. package/styles/palettes/ocean.css +47 -0
  149. package/styles/palettes/orchid.css +47 -0
  150. package/styles/palettes/rose.css +47 -0
  151. package/styles/parts/card.css +49 -0
  152. package/styles/parts/dialog.css +116 -0
  153. package/styles/parts/drawer.css +124 -0
  154. package/styles/parts/field.css +44 -0
  155. package/styles/parts/glass.css +139 -0
  156. package/styles/parts/motion.css +101 -0
  157. package/styles/parts/navbar.css +55 -0
  158. package/styles/parts/popover.css +27 -0
  159. package/styles/parts/presence.css +55 -0
  160. package/styles/parts/reset.css +42 -0
  161. package/styles/parts/select.css +46 -0
  162. package/styles/parts/themes.css +105 -0
  163. package/styles/parts/toast.css +128 -0
  164. package/styles/parts/tokens.css +151 -0
  165. package/styles/parts/typography.css +81 -0
  166. package/types/hyalo-angular-accordion.d.ts +74 -0
  167. package/types/hyalo-angular-alert.d.ts +47 -0
  168. package/types/hyalo-angular-aspect-ratio.d.ts +13 -0
  169. package/types/hyalo-angular-avatar.d.ts +39 -0
  170. package/types/hyalo-angular-badge.d.ts +82 -0
  171. package/types/hyalo-angular-bento.d.ts +25 -0
  172. package/types/hyalo-angular-blocks.d.ts +272 -0
  173. package/types/hyalo-angular-border-beam.d.ts +15 -0
  174. package/types/hyalo-angular-breadcrumb.d.ts +22 -0
  175. package/types/hyalo-angular-button-group.d.ts +19 -0
  176. package/types/hyalo-angular-button.d.ts +89 -0
  177. package/types/hyalo-angular-card.d.ts +61 -0
  178. package/types/hyalo-angular-carousel.d.ts +147 -0
  179. package/types/hyalo-angular-chapter-nav.d.ts +79 -0
  180. package/types/hyalo-angular-chart.d.ts +90 -0
  181. package/types/hyalo-angular-choice.d.ts +259 -0
  182. package/types/hyalo-angular-code-block.d.ts +46 -0
  183. package/types/hyalo-angular-command.d.ts +41 -0
  184. package/types/hyalo-angular-copy.d.ts +39 -0
  185. package/types/hyalo-angular-core.d.ts +210 -0
  186. package/types/hyalo-angular-description-list.d.ts +16 -0
  187. package/types/hyalo-angular-dialog.d.ts +171 -0
  188. package/types/hyalo-angular-divider.d.ts +12 -0
  189. package/types/hyalo-angular-empty-state.d.ts +30 -0
  190. package/types/hyalo-angular-field.d.ts +141 -0
  191. package/types/hyalo-angular-filter.d.ts +122 -0
  192. package/types/hyalo-angular-hotspot.d.ts +70 -0
  193. package/types/hyalo-angular-hover-card.d.ts +47 -0
  194. package/types/hyalo-angular-icon.d.ts +122 -0
  195. package/types/hyalo-angular-image-compare.d.ts +55 -0
  196. package/types/hyalo-angular-interaction.d.ts +131 -0
  197. package/types/hyalo-angular-kbd.d.ts +5 -0
  198. package/types/hyalo-angular-lightbox.d.ts +67 -0
  199. package/types/hyalo-angular-link.d.ts +5 -0
  200. package/types/hyalo-angular-list.d.ts +30 -0
  201. package/types/hyalo-angular-marquee.d.ts +48 -0
  202. package/types/hyalo-angular-menu.d.ts +105 -0
  203. package/types/hyalo-angular-mesh.d.ts +36 -0
  204. package/types/hyalo-angular-motion.d.ts +218 -0
  205. package/types/hyalo-angular-navbar.d.ts +110 -0
  206. package/types/hyalo-angular-navigation-menu.d.ts +47 -0
  207. package/types/hyalo-angular-number-ticker.d.ts +52 -0
  208. package/types/hyalo-angular-overlay.d.ts +40 -0
  209. package/types/hyalo-angular-pagination.d.ts +59 -0
  210. package/types/hyalo-angular-popover.d.ts +152 -0
  211. package/types/hyalo-angular-progress.d.ts +46 -0
  212. package/types/hyalo-angular-progressive-blur.d.ts +14 -0
  213. package/types/hyalo-angular-refraction.d.ts +46 -0
  214. package/types/hyalo-angular-scroll-area.d.ts +18 -0
  215. package/types/hyalo-angular-scroll-to-top.d.ts +31 -0
  216. package/types/hyalo-angular-segmented.d.ts +79 -0
  217. package/types/hyalo-angular-select.d.ts +176 -0
  218. package/types/hyalo-angular-sidebar.d.ts +57 -0
  219. package/types/hyalo-angular-skeleton.d.ts +34 -0
  220. package/types/hyalo-angular-sparkline.d.ts +19 -0
  221. package/types/hyalo-angular-split-text.d.ts +24 -0
  222. package/types/hyalo-angular-stat.d.ts +56 -0
  223. package/types/hyalo-angular-stepper.d.ts +63 -0
  224. package/types/hyalo-angular-table.d.ts +125 -0
  225. package/types/hyalo-angular-tabs.d.ts +102 -0
  226. package/types/hyalo-angular-theme.d.ts +46 -0
  227. package/types/hyalo-angular-timeline.d.ts +36 -0
  228. package/types/hyalo-angular-toast.d.ts +79 -0
  229. package/types/hyalo-angular.d.ts +2 -0
@@ -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"}