@gunkin/uiify 0.0.11-alpha → 0.0.13-alpha

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 (247) hide show
  1. package/dist/components/behavior.css +21 -6
  2. package/dist/components/behavior.css.map +1 -1
  3. package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -1
  4. package/dist/components/breadcrumb/Breadcrumb.js +5 -4
  5. package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
  6. package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
  7. package/dist/components/carousel/CarouselMarkup.js +2 -1
  8. package/dist/components/carousel/CarouselMarkup.js.map +1 -1
  9. package/dist/components/carousel/client/CarouselClientView.d.ts.map +1 -1
  10. package/dist/components/carousel/client/CarouselClientView.js +1 -0
  11. package/dist/components/carousel/client/CarouselClientView.js.map +1 -1
  12. package/dist/components/carousel/client/carousel-controller.d.ts.map +1 -1
  13. package/dist/components/carousel/client/carousel-controller.js +25 -4
  14. package/dist/components/carousel/client/carousel-controller.js.map +1 -1
  15. package/dist/components/carousel/client/carousel-observer.d.ts.map +1 -1
  16. package/dist/components/carousel/client/carousel-observer.js +40 -0
  17. package/dist/components/carousel/client/carousel-observer.js.map +1 -1
  18. package/dist/components/carousel/fade/fade-controller.d.ts.map +1 -1
  19. package/dist/components/carousel/fade/fade-controller.js +3 -0
  20. package/dist/components/carousel/fade/fade-controller.js.map +1 -1
  21. package/dist/components/carousel/types.d.ts +2 -0
  22. package/dist/components/carousel/types.d.ts.map +1 -1
  23. package/dist/components/checkbox/Checkbox.d.ts +1 -6
  24. package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
  25. package/dist/components/checkbox/Checkbox.js +2 -52
  26. package/dist/components/checkbox/Checkbox.js.map +1 -1
  27. package/dist/components/drawer/Drawer.d.ts +1 -1
  28. package/dist/components/drawer/Drawer.d.ts.map +1 -1
  29. package/dist/components/drawer/Drawer.js +46 -9
  30. package/dist/components/drawer/Drawer.js.map +1 -1
  31. package/dist/components/drawer/DrawerNative.d.ts +8 -16
  32. package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
  33. package/dist/components/drawer/DrawerNative.js +80 -34
  34. package/dist/components/drawer/DrawerNative.js.map +1 -1
  35. package/dist/components/drawer/drawer-store.d.ts +1 -1
  36. package/dist/components/drawer/drawer-store.d.ts.map +1 -1
  37. package/dist/components/drawer/drawer-store.js +7 -3
  38. package/dist/components/drawer/drawer-store.js.map +1 -1
  39. package/dist/components/drawer/index.d.ts +3 -3
  40. package/dist/components/drawer/index.d.ts.map +1 -1
  41. package/dist/components/drawer/index.js +9 -1
  42. package/dist/components/drawer/index.js.map +1 -1
  43. package/dist/components/drawer/types.d.ts +114 -3
  44. package/dist/components/drawer/types.d.ts.map +1 -1
  45. package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
  46. package/dist/components/dropdown-menu/DropdownMenu.js +1 -0
  47. package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
  48. package/dist/components/enhance/dialog-dismiss.d.ts +1 -1
  49. package/dist/components/enhance/dialog-dismiss.d.ts.map +1 -1
  50. package/dist/components/enhance/dialog-dismiss.js +19 -10
  51. package/dist/components/enhance/dialog-dismiss.js.map +1 -1
  52. package/dist/components/enhance/internal/box-observer.d.ts +4 -0
  53. package/dist/components/enhance/internal/box-observer.d.ts.map +1 -0
  54. package/dist/components/enhance/internal/box-observer.js +32 -0
  55. package/dist/components/enhance/internal/box-observer.js.map +1 -0
  56. package/dist/components/enhance/sheet-swipe.d.ts.map +1 -1
  57. package/dist/components/enhance/sheet-swipe.js +42 -14
  58. package/dist/components/enhance/sheet-swipe.js.map +1 -1
  59. package/dist/components/enhance/types.d.ts +5 -0
  60. package/dist/components/enhance/types.d.ts.map +1 -0
  61. package/dist/components/field/Field.d.ts.map +1 -1
  62. package/dist/components/field/Field.js +1 -0
  63. package/dist/components/field/Field.js.map +1 -1
  64. package/dist/components/file-upload/FileUpload.d.ts +4 -7
  65. package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
  66. package/dist/components/file-upload/FileUpload.js +28 -122
  67. package/dist/components/file-upload/FileUpload.js.map +1 -1
  68. package/dist/components/file-upload/FileUploadInput.d.ts +7 -0
  69. package/dist/components/file-upload/FileUploadInput.d.ts.map +1 -0
  70. package/dist/components/file-upload/FileUploadInput.js +60 -0
  71. package/dist/components/file-upload/FileUploadInput.js.map +1 -0
  72. package/dist/components/file-upload/FileUploadRoot.d.ts +8 -0
  73. package/dist/components/file-upload/FileUploadRoot.d.ts.map +1 -0
  74. package/dist/components/file-upload/FileUploadRoot.js +70 -0
  75. package/dist/components/file-upload/FileUploadRoot.js.map +1 -0
  76. package/dist/components/file-upload/file-upload-context.d.ts +3 -0
  77. package/dist/components/file-upload/file-upload-context.d.ts.map +1 -0
  78. package/dist/components/file-upload/file-upload-context.js +8 -0
  79. package/dist/components/file-upload/file-upload-context.js.map +1 -0
  80. package/dist/components/file-upload/index.d.ts +1 -1
  81. package/dist/components/file-upload/index.d.ts.map +1 -1
  82. package/dist/components/file-upload/index.js.map +1 -1
  83. package/dist/components/file-upload/types.d.ts +8 -10
  84. package/dist/components/file-upload/types.d.ts.map +1 -1
  85. package/dist/components/form/Form.d.ts.map +1 -1
  86. package/dist/components/form/Form.js +2 -1
  87. package/dist/components/form/Form.js.map +1 -1
  88. package/dist/components/header/Header.d.ts +3 -19
  89. package/dist/components/header/Header.d.ts.map +1 -1
  90. package/dist/components/header/Header.js +4 -253
  91. package/dist/components/header/Header.js.map +1 -1
  92. package/dist/components/header/client/HeaderClient.d.ts +7 -0
  93. package/dist/components/header/client/HeaderClient.d.ts.map +1 -0
  94. package/dist/components/header/client/HeaderClient.js +93 -0
  95. package/dist/components/header/client/HeaderClient.js.map +1 -0
  96. package/dist/components/header/client/index.d.ts +3 -0
  97. package/dist/components/header/client/index.d.ts.map +1 -0
  98. package/dist/components/header/client/index.js +6 -0
  99. package/dist/components/header/client/index.js.map +1 -0
  100. package/dist/components/header/client.d.ts +1 -0
  101. package/dist/components/header/client.js +1 -0
  102. package/dist/components/header/index.d.ts +2 -3
  103. package/dist/components/header/index.d.ts.map +1 -1
  104. package/dist/components/header/index.js +2 -15
  105. package/dist/components/header/index.js.map +1 -1
  106. package/dist/components/header/types.d.ts +7 -63
  107. package/dist/components/header/types.d.ts.map +1 -1
  108. package/dist/components/hover-card/HoverCard.js +1 -1
  109. package/dist/components/hover-card/HoverCard.js.map +1 -1
  110. package/dist/components/index.d.ts +0 -1
  111. package/dist/components/index.d.ts.map +1 -1
  112. package/dist/components/index.js +0 -1
  113. package/dist/components/index.js.map +1 -1
  114. package/dist/components/input/Input.d.ts.map +1 -1
  115. package/dist/components/input/Input.js +1 -1
  116. package/dist/components/input/Input.js.map +1 -1
  117. package/dist/components/internal/choice-family/ChoiceGroup.js +1 -1
  118. package/dist/components/internal/choice-family/ChoiceGroup.js.map +1 -1
  119. package/dist/components/internal/choice-family/types.d.ts +3 -3
  120. package/dist/components/internal/choice-family/types.d.ts.map +1 -1
  121. package/dist/components/internal/native-check-control/NativeCheckControl.d.ts +7 -0
  122. package/dist/components/internal/native-check-control/NativeCheckControl.d.ts.map +1 -0
  123. package/dist/components/internal/native-check-control/NativeCheckControl.js +56 -0
  124. package/dist/components/internal/native-check-control/NativeCheckControl.js.map +1 -0
  125. package/dist/components/internal/native-check-control/types.d.ts +13 -0
  126. package/dist/components/internal/native-check-control/types.d.ts.map +1 -0
  127. package/dist/components/internal/native-check-control/types.js +1 -0
  128. package/dist/components/number-field/NumberField.d.ts.map +1 -1
  129. package/dist/components/number-field/NumberField.js +11 -2
  130. package/dist/components/number-field/NumberField.js.map +1 -1
  131. package/dist/components/number-field/format.d.ts +1 -0
  132. package/dist/components/number-field/format.d.ts.map +1 -1
  133. package/dist/components/number-field/format.js +18 -6
  134. package/dist/components/number-field/format.js.map +1 -1
  135. package/dist/components/popup/PopupParts.d.ts.map +1 -1
  136. package/dist/components/popup/PopupParts.js +2 -0
  137. package/dist/components/popup/PopupParts.js.map +1 -1
  138. package/dist/components/select/Select.d.ts.map +1 -1
  139. package/dist/components/select/Select.js +1 -1
  140. package/dist/components/select/Select.js.map +1 -1
  141. package/dist/components/skeleton/Skeleton.d.ts.map +1 -1
  142. package/dist/components/skeleton/Skeleton.js +14 -35
  143. package/dist/components/skeleton/Skeleton.js.map +1 -1
  144. package/dist/components/skeleton/types.d.ts +1 -8
  145. package/dist/components/skeleton/types.d.ts.map +1 -1
  146. package/dist/components/table/Table.d.ts +1 -40
  147. package/dist/components/table/Table.d.ts.map +1 -1
  148. package/dist/components/table/Table.js +9 -259
  149. package/dist/components/table/Table.js.map +1 -1
  150. package/dist/components/table/TableShell.d.ts +5 -1
  151. package/dist/components/table/TableShell.d.ts.map +1 -1
  152. package/dist/components/table/TableShell.js +63 -9
  153. package/dist/components/table/TableShell.js.map +1 -1
  154. package/dist/components/table/client/Table.d.ts +30 -0
  155. package/dist/components/table/client/Table.d.ts.map +1 -0
  156. package/dist/components/table/client/Table.js +135 -0
  157. package/dist/components/table/client/Table.js.map +1 -0
  158. package/dist/components/table/client/TableBody.d.ts +7 -0
  159. package/dist/components/table/client/TableBody.d.ts.map +1 -0
  160. package/dist/components/table/client/TableBody.js +35 -0
  161. package/dist/components/table/client/TableBody.js.map +1 -0
  162. package/dist/components/table/client/TableColumnHeader.d.ts +7 -0
  163. package/dist/components/table/client/TableColumnHeader.d.ts.map +1 -0
  164. package/dist/components/table/client/TableColumnHeader.js +69 -0
  165. package/dist/components/table/client/TableColumnHeader.js.map +1 -0
  166. package/dist/components/table/client/TableExpansion.d.ts +11 -0
  167. package/dist/components/table/client/TableExpansion.d.ts.map +1 -0
  168. package/dist/components/table/client/TableExpansion.js +43 -0
  169. package/dist/components/table/client/TableExpansion.js.map +1 -0
  170. package/dist/components/table/client/TableRow.d.ts +7 -0
  171. package/dist/components/table/client/TableRow.d.ts.map +1 -0
  172. package/dist/components/table/client/TableRow.js +95 -0
  173. package/dist/components/table/client/TableRow.js.map +1 -0
  174. package/dist/components/table/client/TableSelection.d.ts +11 -0
  175. package/dist/components/table/client/TableSelection.d.ts.map +1 -0
  176. package/dist/components/table/client/TableSelection.js +48 -0
  177. package/dist/components/table/client/TableSelection.js.map +1 -0
  178. package/dist/components/table/client/table-context.d.ts +3 -0
  179. package/dist/components/table/client/table-context.d.ts.map +1 -0
  180. package/dist/components/table/client/table-context.js +8 -0
  181. package/dist/components/table/client/table-context.js.map +1 -0
  182. package/dist/components/table/client.d.ts +4 -0
  183. package/dist/components/table/client.d.ts.map +1 -0
  184. package/dist/components/table/client.js +30 -0
  185. package/dist/components/table/client.js.map +1 -0
  186. package/dist/components/table/index.d.ts +2 -2
  187. package/dist/components/table/index.d.ts.map +1 -1
  188. package/dist/components/table/index.js +7 -7
  189. package/dist/components/table/index.js.map +1 -1
  190. package/dist/components/table/types.d.ts +42 -15
  191. package/dist/components/table/types.d.ts.map +1 -1
  192. package/dist/components/textarea/Textarea.d.ts.map +1 -1
  193. package/dist/components/textarea/Textarea.js +1 -1
  194. package/dist/components/textarea/Textarea.js.map +1 -1
  195. package/dist/components/tooltip/Tooltip.js +1 -1
  196. package/dist/components/tooltip/Tooltip.js.map +1 -1
  197. package/dist/components/virtual-scroll/VirtualScroll.d.ts.map +1 -1
  198. package/dist/components/virtual-scroll/VirtualScroll.js +54 -34
  199. package/dist/components/virtual-scroll/VirtualScroll.js.map +1 -1
  200. package/dist/components/virtual-scroll/types.d.ts +2 -2
  201. package/dist/components/virtual-scroll/types.d.ts.map +1 -1
  202. package/dist/components/virtual-scroll/types.js.map +1 -1
  203. package/dist/components/virtual-scroll/virtual-scroll-scroll.d.ts.map +1 -1
  204. package/dist/components/virtual-scroll/virtual-scroll-scroll.js +0 -1
  205. package/dist/components/virtual-scroll/virtual-scroll-scroll.js.map +1 -1
  206. package/dist/core/roving-focus.d.ts +2 -1
  207. package/dist/core/roving-focus.d.ts.map +1 -1
  208. package/dist/core/roving-focus.js.map +1 -1
  209. package/dist/core/use-popover.d.ts.map +1 -1
  210. package/dist/core/use-popover.js +6 -1
  211. package/dist/core/use-popover.js.map +1 -1
  212. package/dist/elements/choice/types.d.ts +1 -1
  213. package/dist/elements/choice/types.d.ts.map +1 -1
  214. package/dist/styles/index.css +1 -1
  215. package/dist/styles/tailwind.css +1 -0
  216. package/dist/styles/tokens.css +1 -1
  217. package/package.json +1 -1
  218. package/dist/components/drawer/client-types.d.ts +0 -99
  219. package/dist/components/drawer/client-types.d.ts.map +0 -1
  220. package/dist/components/drawer/client-types.js +0 -1
  221. package/dist/components/enhance/internal/read-box.d.ts +0 -3
  222. package/dist/components/enhance/internal/read-box.d.ts.map +0 -1
  223. package/dist/components/enhance/internal/read-box.js +0 -7
  224. package/dist/components/enhance/internal/read-box.js.map +0 -1
  225. package/dist/components/header/use-header-scroll-state.d.ts +0 -4
  226. package/dist/components/header/use-header-scroll-state.d.ts.map +0 -1
  227. package/dist/components/header/use-header-scroll-state.js +0 -83
  228. package/dist/components/header/use-header-scroll-state.js.map +0 -1
  229. package/dist/components/header/use-header.d.ts +0 -4
  230. package/dist/components/header/use-header.d.ts.map +0 -1
  231. package/dist/components/header/use-header.js +0 -80
  232. package/dist/components/header/use-header.js.map +0 -1
  233. package/dist/components/stepper/Stepper.d.ts +0 -7
  234. package/dist/components/stepper/Stepper.d.ts.map +0 -1
  235. package/dist/components/stepper/Stepper.js +0 -35
  236. package/dist/components/stepper/Stepper.js.map +0 -1
  237. package/dist/components/stepper/index.d.ts +0 -3
  238. package/dist/components/stepper/index.d.ts.map +0 -1
  239. package/dist/components/stepper/index.js +0 -5
  240. package/dist/components/stepper/index.js.map +0 -1
  241. package/dist/components/stepper/types.d.ts +0 -14
  242. package/dist/components/stepper/types.d.ts.map +0 -1
  243. package/dist/components/stepper.d.ts +0 -1
  244. package/dist/components/stepper.js +0 -1
  245. /package/dist/components/{stepper → enhance}/types.js +0 -0
  246. /package/dist/components/{stepper → enhance}/types.js.map +0 -0
  247. /package/dist/components/{drawer/client-types.js.map → internal/native-check-control/types.js.map} +0 -0
@@ -1,5 +1,25 @@
1
1
  @layer ui.reset, ui.behavior, ui.tokens, ui.theme, app;
2
2
  @layer ui.behavior {
3
+ [data-uiify-file-upload] > [data-part=input] {
4
+ position: absolute;
5
+ inline-size: 1px;
6
+ block-size: 1px;
7
+ clip-path: inset(50%);
8
+ overflow: hidden;
9
+ white-space: nowrap;
10
+ }
11
+ [data-uiify-header][data-placement=sticky] {
12
+ position: sticky;
13
+ inset-block-start: 0;
14
+ }
15
+ [data-uiify-header][data-placement=sticky][data-state=hidden]:not(:focus-within, :has(dialog[open], details[open], :popover-open)) {
16
+ translate: 0 -100%;
17
+ }
18
+ @media (prefers-reduced-motion: no-preference) {
19
+ [data-uiify-header][data-placement=sticky][data-state] {
20
+ transition: translate 200ms ease-out;
21
+ }
22
+ }
3
23
  [popover]:not(:popover-open) {
4
24
  display: none;
5
25
  }
@@ -105,12 +125,6 @@
105
125
  [data-uiify-tabs] > [data-part=item] > [data-part=control]:checked ~ [data-part=panel] {
106
126
  display: block;
107
127
  }
108
- [data-uiify-stepper] > [data-part=step] > [data-part=panel] {
109
- display: none;
110
- }
111
- [data-uiify-stepper] > [data-part=step] > [data-part=control]:checked ~ [data-part=panel] {
112
- display: block;
113
- }
114
128
  [data-uiify-tabs] [data-part=trigger][data-disabled] {
115
129
  cursor: not-allowed;
116
130
  pointer-events: none;
@@ -157,6 +171,7 @@
157
171
  min-inline-size: 0;
158
172
  min-block-size: 0;
159
173
  scroll-snap-align: start;
174
+ scroll-snap-stop: always;
160
175
  }
161
176
  [data-uiify-carousel] > [data-part=viewport]:focus-visible,
162
177
  [data-uiify-carousel] > button[data-part=controls]:focus-visible,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/behavior.css"],"sourcesContent":["/* Behavioral rules for @gunkin/uiify/components — zero visual opinion.\n * Import is required: @import \"@gunkin/uiify/components/behavior.css\";\n * Cascade order: consumer app layer wins without specificity fights. */\n@layer ui.reset, ui.behavior, ui.tokens, ui.theme, app;\n\n@layer ui.behavior {\n [popover]:not(:popover-open) {\n display: none;\n }\n\n /* Native modal dialogs: wheel/touch scrolling inside the dialog must not chain to the page behind it. */\n dialog:modal {\n overscroll-behavior: contain;\n }\n\n /* Open modal dialogs lock the page scroll, iOS Safari included (checked on iOS 27: a swipe on\n the backdrop or the dialog leaves scrollY unchanged). The stable gutter keeps a classic\n scrollbar's width, so the page does not shift when the dialog opens. */\n :root:has(dialog:modal) {\n overflow: hidden;\n scrollbar-gutter: stable;\n }\n\n /* Closed dialogs stay hidden even when author CSS sets display. */\n dialog:not([open]) {\n display: none;\n }\n\n [data-anchor]:not([data-positioning]) {\n anchor-name: var(--uiify-anchor, attr(data-anchor type(<custom-ident>)));\n }\n\n [data-positioning=\"native\"] {\n position: fixed;\n inset: auto;\n margin: 0;\n position-try-fallbacks: flip-block, flip-inline;\n }\n\n [data-positioning=\"native\"][data-anchor] {\n position-anchor: var(--uiify-anchor, attr(data-anchor type(<custom-ident>)));\n }\n\n [data-positioning=\"native\"][data-side=\"top\"] {\n position-area: top;\n margin-block-end: var(--uiify-anchor-offset, 0);\n }\n\n [data-positioning=\"native\"][data-side=\"right\"] {\n position-area: right;\n margin-inline-start: var(--uiify-anchor-offset, 0);\n }\n\n [data-positioning=\"native\"][data-side=\"bottom\"] {\n position-area: bottom;\n margin-block-start: var(--uiify-anchor-offset, 0);\n }\n\n [data-positioning=\"native\"][data-side=\"left\"] {\n position-area: left;\n margin-inline-end: var(--uiify-anchor-offset, 0);\n }\n\n [data-positioning=\"native\"][data-side=\"top\"][data-align=\"start\"] {\n position-area: top span-right;\n justify-self: start;\n }\n\n [data-positioning=\"native\"][data-side=\"top\"][data-align=\"end\"] {\n position-area: top span-left;\n justify-self: end;\n }\n\n [data-positioning=\"native\"][data-side=\"bottom\"][data-align=\"start\"] {\n position-area: bottom span-right;\n justify-self: start;\n }\n\n [data-positioning=\"native\"][data-side=\"bottom\"][data-align=\"end\"] {\n position-area: bottom span-left;\n justify-self: end;\n }\n\n [data-positioning=\"native\"][data-side=\"right\"][data-align=\"start\"] {\n align-self: start;\n position-area: right span-bottom;\n }\n\n [data-positioning=\"native\"][data-side=\"right\"][data-align=\"end\"] {\n align-self: end;\n position-area: right span-top;\n }\n\n [data-positioning=\"native\"][data-side=\"left\"][data-align=\"start\"] {\n align-self: start;\n position-area: left span-bottom;\n }\n\n [data-positioning=\"native\"][data-side=\"left\"][data-align=\"end\"] {\n align-self: end;\n position-area: left span-top;\n }\n\n /*\n * Local open-state hooks. Top layer does not change DOM ancestry, so a scope\n * that directly contains its surface can read the native state. Consumers\n * style with the selector or with the variable; neither is a second source of truth.\n *\n * Compound roots and their public trigger parts share one component identity plus\n * `data-part`, so native state stays readable without a second scope convention.\n */\n [data-uiify-modal][data-part=\"root\"]:has(> [data-uiify-modal][data-part=\"content\"][open])\n > [data-uiify-modal][data-part=\"trigger\"],\n [data-uiify-alert-modal][data-part=\"root\"]:has(\n > [data-uiify-alert-modal][data-part=\"content\"][open]\n )\n > [data-uiify-alert-modal][data-part=\"trigger\"],\n [data-uiify-popup][data-part=\"root\"]:has(> [data-uiify-popup][data-part=\"content\"]:popover-open)\n > [data-uiify-popup][data-part=\"trigger\"] {\n --uiify-trigger-open: 1;\n }\n\n [data-uiify-accordion] > [data-part=\"item\"][data-disabled] > summary,\n [data-uiify-collapsible][data-disabled] > summary {\n cursor: not-allowed;\n pointer-events: none;\n }\n\n /* Customizable select: opts the control and its picker into the browser's\n base styles so the picker becomes a styleable, top-layer popover with\n implicit anchor positioning. Behavior only — no visual opinion. Engines\n without support ignore this and keep the classic OS picker, which stays\n fully functional. */\n [data-uiify-select],\n [data-uiify-select]::picker(select) {\n appearance: base-select;\n }\n\n [data-uiify-tabs] > [data-part=\"item\"] > [data-part=\"control\"] {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n /* stylelint-disable-next-line property-no-deprecated -- kept for older browser support alongside clip-path */\n clip: rect(0, 0, 0, 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n }\n\n [data-uiify-tabs] > [data-part=\"item\"] > [data-part=\"panel\"] {\n display: none;\n }\n\n [data-uiify-tabs] > [data-part=\"item\"] > [data-part=\"control\"]:checked ~ [data-part=\"panel\"] {\n display: block;\n }\n\n [data-uiify-stepper] > [data-part=\"step\"] > [data-part=\"panel\"] {\n display: none;\n }\n\n [data-uiify-stepper] > [data-part=\"step\"] > [data-part=\"control\"]:checked ~ [data-part=\"panel\"] {\n display: block;\n }\n\n [data-uiify-tabs] [data-part=\"trigger\"][data-disabled] {\n cursor: not-allowed;\n pointer-events: none;\n }\n\n [data-uiify-spinner][data-state=\"delayed\"] {\n animation-name: uiify-spinner-show;\n animation-duration: 0s;\n animation-delay: attr(data-delay type(<time>), 0s);\n animation-fill-mode: forwards;\n visibility: hidden;\n }\n\n @keyframes uiify-spinner-show {\n to {\n visibility: visible;\n }\n }\n\n [data-uiify-breadcrumb] [data-part=\"ellipsis\"] > ol {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n [data-uiify-carousel] > [data-part=\"viewport\"] {\n display: grid;\n min-inline-size: 0;\n min-block-size: 0;\n gap: var(--uiify-carousel-gap, 0);\n scroll-behavior: auto;\n }\n\n [data-uiify-carousel][data-axis=\"inline\"] > [data-part=\"viewport\"] {\n grid-auto-flow: column;\n grid-auto-columns: var(--uiify-carousel-slide-size, 100%);\n overflow-inline: auto;\n overflow-block: hidden;\n scroll-snap-type: inline mandatory;\n }\n\n [data-uiify-carousel][data-axis=\"block\"] > [data-part=\"viewport\"] {\n grid-auto-flow: row;\n grid-auto-rows: var(--uiify-carousel-slide-size, 100%);\n overflow-block: auto;\n overflow-inline: hidden;\n scroll-snap-type: block mandatory;\n }\n\n [data-uiify-carousel] > [data-part=\"viewport\"] > [data-part=\"slide\"] {\n min-inline-size: 0;\n min-block-size: 0;\n scroll-snap-align: start;\n }\n\n [data-uiify-carousel] > [data-part=\"viewport\"]:focus-visible,\n [data-uiify-carousel] > button[data-part=\"controls\"]:focus-visible,\n [data-uiify-carousel] > [data-part=\"dots\"] > a:focus-visible {\n outline: auto;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n [data-uiify-carousel] > [data-part=\"viewport\"] {\n scroll-behavior: smooth;\n }\n }\n\n [data-uiify-carousel] > [data-part=\"viewport\"][data-dragging] {\n scroll-behavior: auto;\n scroll-snap-type: none;\n }\n\n [data-uiify-carousel][data-mode=\"fade\"][data-enhanced] > [data-part=\"viewport\"] {\n grid-auto-flow: row;\n grid-template-columns: 100%;\n grid-auto-columns: auto;\n overflow: hidden;\n scroll-snap-type: none;\n touch-action: pan-y pinch-zoom;\n }\n\n [data-uiify-carousel][data-mode=\"fade\"][data-enhanced]\n > [data-part=\"viewport\"]\n > [data-part=\"slide\"] {\n grid-area: 1 / 1;\n opacity: 0;\n pointer-events: none;\n }\n\n [data-uiify-carousel][data-mode=\"fade\"][data-enhanced]\n > [data-part=\"viewport\"]\n > [data-part=\"slide\"][data-state=\"active\"] {\n opacity: 1;\n pointer-events: auto;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n [data-uiify-carousel][data-mode=\"fade\"][data-enhanced]\n > [data-part=\"viewport\"]\n > [data-part=\"slide\"] {\n transition: opacity var(--uiify-carousel-fade-duration, 300ms) ease;\n }\n }\n\n [data-uiify-virtual-scroll] {\n --uiify-virtual-scroll-row-height: 64px;\n\n overflow-y: auto;\n }\n\n [data-uiify-virtual-scroll] > [data-part=\"spacer\"] {\n position: relative;\n block-size: var(\n --uiify-virtual-scroll-total-size,\n calc(var(--uiify-virtual-scroll-count, 0) * var(--uiify-virtual-scroll-row-height))\n );\n }\n\n [data-uiify-virtual-scroll] [data-part=\"row\"] {\n --uiify-row-position: var(\n --uiify-row-offset,\n calc(\n (var(--uiify-range-start, 0) + var(--uiify-slot-index, 0)) *\n var(--uiify-virtual-scroll-row-height)\n )\n );\n\n position: absolute;\n inset-inline: 0;\n block-size: var(--uiify-row-height, var(--uiify-virtual-scroll-row-height));\n translate: 0 var(--uiify-row-position);\n }\n\n /* Horizontal: the row size runs along the inline axis. Rows sit at a logical\n inline offset so RTL needs no direction selector; child combinators keep a\n vertical list nested inside a horizontal row on the vertical rules. */\n [data-uiify-virtual-scroll][data-orientation=\"horizontal\"] {\n overflow: auto hidden;\n }\n\n [data-uiify-virtual-scroll][data-orientation=\"horizontal\"] > [data-part=\"spacer\"] {\n block-size: 100%;\n inline-size: var(\n --uiify-virtual-scroll-total-size,\n calc(var(--uiify-virtual-scroll-count, 0) * var(--uiify-virtual-scroll-row-height))\n );\n }\n\n [data-uiify-virtual-scroll][data-orientation=\"horizontal\"]\n > [data-part=\"spacer\"]\n > [data-part=\"row\"] {\n inset-block: 0;\n inset-inline: var(--uiify-row-position) auto;\n block-size: auto;\n inline-size: var(--uiify-row-height, var(--uiify-virtual-scroll-row-height));\n translate: none;\n }\n\n /*\n * Toast list changes commit as React view transitions typed \"uiify-toast\".\n * Only the toast cards are captured: the page root is not snapshotted and\n * stays clickable while they move.\n */\n :root:active-view-transition-type(uiify-toast) {\n view-transition-name: none;\n }\n\n :root:active-view-transition-type(uiify-toast)::view-transition {\n pointer-events: none;\n }\n\n @media (prefers-reduced-motion: reduce) {\n ::view-transition-group(.uiify-toast),\n ::view-transition-old(.uiify-toast),\n ::view-transition-new(.uiify-toast) {\n animation: none;\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/behavior.css"],"sourcesContent":["/* Behavioral rules for @gunkin/uiify/components — zero visual opinion.\n * Import is required: @import \"@gunkin/uiify/components/behavior.css\";\n * Cascade order: consumer app layer wins without specificity fights. */\n@layer ui.reset, ui.behavior, ui.tokens, ui.theme, app;\n\n@layer ui.behavior {\n [data-uiify-file-upload] > [data-part=\"input\"] {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n clip-path: inset(50%);\n overflow: hidden;\n white-space: nowrap;\n }\n [data-uiify-header][data-placement=\"sticky\"] {\n position: sticky;\n inset-block-start: 0;\n }\n\n [data-uiify-header][data-placement=\"sticky\"][data-state=\"hidden\"]:not(\n :focus-within,\n :has(dialog[open], details[open], :popover-open)\n ) {\n translate: 0 -100%;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n [data-uiify-header][data-placement=\"sticky\"][data-state] {\n transition: translate 200ms ease-out;\n }\n }\n\n [popover]:not(:popover-open) {\n display: none;\n }\n\n /* Native modal dialogs: wheel/touch scrolling inside the dialog must not chain to the page behind it. */\n dialog:modal {\n overscroll-behavior: contain;\n }\n\n /* Open modal dialogs lock the page scroll, iOS Safari included (checked on iOS 27: a swipe on\n the backdrop or the dialog leaves scrollY unchanged). The stable gutter keeps a classic\n scrollbar's width, so the page does not shift when the dialog opens. */\n :root:has(dialog:modal) {\n overflow: hidden;\n scrollbar-gutter: stable;\n }\n\n /* Closed dialogs stay hidden even when author CSS sets display. */\n dialog:not([open]) {\n display: none;\n }\n\n [data-anchor]:not([data-positioning]) {\n anchor-name: var(--uiify-anchor, attr(data-anchor type(<custom-ident>)));\n }\n\n [data-positioning=\"native\"] {\n position: fixed;\n inset: auto;\n margin: 0;\n position-try-fallbacks: flip-block, flip-inline;\n }\n\n [data-positioning=\"native\"][data-anchor] {\n position-anchor: var(--uiify-anchor, attr(data-anchor type(<custom-ident>)));\n }\n\n [data-positioning=\"native\"][data-side=\"top\"] {\n position-area: top;\n margin-block-end: var(--uiify-anchor-offset, 0);\n }\n\n [data-positioning=\"native\"][data-side=\"right\"] {\n position-area: right;\n margin-inline-start: var(--uiify-anchor-offset, 0);\n }\n\n [data-positioning=\"native\"][data-side=\"bottom\"] {\n position-area: bottom;\n margin-block-start: var(--uiify-anchor-offset, 0);\n }\n\n [data-positioning=\"native\"][data-side=\"left\"] {\n position-area: left;\n margin-inline-end: var(--uiify-anchor-offset, 0);\n }\n\n [data-positioning=\"native\"][data-side=\"top\"][data-align=\"start\"] {\n position-area: top span-right;\n justify-self: start;\n }\n\n [data-positioning=\"native\"][data-side=\"top\"][data-align=\"end\"] {\n position-area: top span-left;\n justify-self: end;\n }\n\n [data-positioning=\"native\"][data-side=\"bottom\"][data-align=\"start\"] {\n position-area: bottom span-right;\n justify-self: start;\n }\n\n [data-positioning=\"native\"][data-side=\"bottom\"][data-align=\"end\"] {\n position-area: bottom span-left;\n justify-self: end;\n }\n\n [data-positioning=\"native\"][data-side=\"right\"][data-align=\"start\"] {\n align-self: start;\n position-area: right span-bottom;\n }\n\n [data-positioning=\"native\"][data-side=\"right\"][data-align=\"end\"] {\n align-self: end;\n position-area: right span-top;\n }\n\n [data-positioning=\"native\"][data-side=\"left\"][data-align=\"start\"] {\n align-self: start;\n position-area: left span-bottom;\n }\n\n [data-positioning=\"native\"][data-side=\"left\"][data-align=\"end\"] {\n align-self: end;\n position-area: left span-top;\n }\n\n /*\n * Local open-state hooks. Top layer does not change DOM ancestry, so a scope\n * that directly contains its surface can read the native state. Consumers\n * style with the selector or with the variable; neither is a second source of truth.\n *\n * Compound roots and their public trigger parts share one component identity plus\n * `data-part`, so native state stays readable without a second scope convention.\n */\n [data-uiify-modal][data-part=\"root\"]:has(> [data-uiify-modal][data-part=\"content\"][open])\n > [data-uiify-modal][data-part=\"trigger\"],\n [data-uiify-alert-modal][data-part=\"root\"]:has(\n > [data-uiify-alert-modal][data-part=\"content\"][open]\n )\n > [data-uiify-alert-modal][data-part=\"trigger\"],\n [data-uiify-popup][data-part=\"root\"]:has(> [data-uiify-popup][data-part=\"content\"]:popover-open)\n > [data-uiify-popup][data-part=\"trigger\"] {\n --uiify-trigger-open: 1;\n }\n\n [data-uiify-accordion] > [data-part=\"item\"][data-disabled] > summary,\n [data-uiify-collapsible][data-disabled] > summary {\n cursor: not-allowed;\n pointer-events: none;\n }\n\n /* Customizable select: opts the control and its picker into the browser's\n base styles so the picker becomes a styleable, top-layer popover with\n implicit anchor positioning. Behavior only — no visual opinion. Engines\n without support ignore this and keep the classic OS picker, which stays\n fully functional. */\n [data-uiify-select],\n [data-uiify-select]::picker(select) {\n appearance: base-select;\n }\n\n [data-uiify-tabs] > [data-part=\"item\"] > [data-part=\"control\"] {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n /* stylelint-disable-next-line property-no-deprecated -- kept for older browser support alongside clip-path */\n clip: rect(0, 0, 0, 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n }\n\n [data-uiify-tabs] > [data-part=\"item\"] > [data-part=\"panel\"] {\n display: none;\n }\n\n [data-uiify-tabs] > [data-part=\"item\"] > [data-part=\"control\"]:checked ~ [data-part=\"panel\"] {\n display: block;\n }\n\n [data-uiify-tabs] [data-part=\"trigger\"][data-disabled] {\n cursor: not-allowed;\n pointer-events: none;\n }\n\n [data-uiify-spinner][data-state=\"delayed\"] {\n animation-name: uiify-spinner-show;\n animation-duration: 0s;\n animation-delay: attr(data-delay type(<time>), 0s);\n animation-fill-mode: forwards;\n visibility: hidden;\n }\n\n @keyframes uiify-spinner-show {\n to {\n visibility: visible;\n }\n }\n\n [data-uiify-breadcrumb] [data-part=\"ellipsis\"] > ol {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n [data-uiify-carousel] > [data-part=\"viewport\"] {\n display: grid;\n min-inline-size: 0;\n min-block-size: 0;\n gap: var(--uiify-carousel-gap, 0);\n scroll-behavior: auto;\n }\n\n [data-uiify-carousel][data-axis=\"inline\"] > [data-part=\"viewport\"] {\n grid-auto-flow: column;\n grid-auto-columns: var(--uiify-carousel-slide-size, 100%);\n overflow-inline: auto;\n overflow-block: hidden;\n scroll-snap-type: inline mandatory;\n }\n\n [data-uiify-carousel][data-axis=\"block\"] > [data-part=\"viewport\"] {\n grid-auto-flow: row;\n grid-auto-rows: var(--uiify-carousel-slide-size, 100%);\n overflow-block: auto;\n overflow-inline: hidden;\n scroll-snap-type: block mandatory;\n }\n\n [data-uiify-carousel] > [data-part=\"viewport\"] > [data-part=\"slide\"] {\n min-inline-size: 0;\n min-block-size: 0;\n scroll-snap-align: start;\n scroll-snap-stop: always;\n }\n\n [data-uiify-carousel] > [data-part=\"viewport\"]:focus-visible,\n [data-uiify-carousel] > button[data-part=\"controls\"]:focus-visible,\n [data-uiify-carousel] > [data-part=\"dots\"] > a:focus-visible {\n outline: auto;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n [data-uiify-carousel] > [data-part=\"viewport\"] {\n scroll-behavior: smooth;\n }\n }\n\n [data-uiify-carousel] > [data-part=\"viewport\"][data-dragging] {\n scroll-behavior: auto;\n scroll-snap-type: none;\n }\n\n [data-uiify-carousel][data-mode=\"fade\"][data-enhanced] > [data-part=\"viewport\"] {\n grid-auto-flow: row;\n grid-template-columns: 100%;\n grid-auto-columns: auto;\n overflow: hidden;\n scroll-snap-type: none;\n touch-action: pan-y pinch-zoom;\n }\n\n [data-uiify-carousel][data-mode=\"fade\"][data-enhanced]\n > [data-part=\"viewport\"]\n > [data-part=\"slide\"] {\n grid-area: 1 / 1;\n opacity: 0;\n pointer-events: none;\n }\n\n [data-uiify-carousel][data-mode=\"fade\"][data-enhanced]\n > [data-part=\"viewport\"]\n > [data-part=\"slide\"][data-state=\"active\"] {\n opacity: 1;\n pointer-events: auto;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n [data-uiify-carousel][data-mode=\"fade\"][data-enhanced]\n > [data-part=\"viewport\"]\n > [data-part=\"slide\"] {\n transition: opacity var(--uiify-carousel-fade-duration, 300ms) ease;\n }\n }\n\n [data-uiify-virtual-scroll] {\n --uiify-virtual-scroll-row-height: 64px;\n\n overflow-y: auto;\n }\n\n [data-uiify-virtual-scroll] > [data-part=\"spacer\"] {\n position: relative;\n block-size: var(\n --uiify-virtual-scroll-total-size,\n calc(var(--uiify-virtual-scroll-count, 0) * var(--uiify-virtual-scroll-row-height))\n );\n }\n\n [data-uiify-virtual-scroll] [data-part=\"row\"] {\n --uiify-row-position: var(\n --uiify-row-offset,\n calc(\n (var(--uiify-range-start, 0) + var(--uiify-slot-index, 0)) *\n var(--uiify-virtual-scroll-row-height)\n )\n );\n\n position: absolute;\n inset-inline: 0;\n block-size: var(--uiify-row-height, var(--uiify-virtual-scroll-row-height));\n translate: 0 var(--uiify-row-position);\n }\n\n /* Horizontal: the row size runs along the inline axis. Rows sit at a logical\n inline offset so RTL needs no direction selector; child combinators keep a\n vertical list nested inside a horizontal row on the vertical rules. */\n [data-uiify-virtual-scroll][data-orientation=\"horizontal\"] {\n overflow: auto hidden;\n }\n\n [data-uiify-virtual-scroll][data-orientation=\"horizontal\"] > [data-part=\"spacer\"] {\n block-size: 100%;\n inline-size: var(\n --uiify-virtual-scroll-total-size,\n calc(var(--uiify-virtual-scroll-count, 0) * var(--uiify-virtual-scroll-row-height))\n );\n }\n\n [data-uiify-virtual-scroll][data-orientation=\"horizontal\"]\n > [data-part=\"spacer\"]\n > [data-part=\"row\"] {\n inset-block: 0;\n inset-inline: var(--uiify-row-position) auto;\n block-size: auto;\n inline-size: var(--uiify-row-height, var(--uiify-virtual-scroll-row-height));\n translate: none;\n }\n\n /*\n * Toast list changes commit as React view transitions typed \"uiify-toast\".\n * Only the toast cards are captured: the page root is not snapshotted and\n * stays clickable while they move.\n */\n :root:active-view-transition-type(uiify-toast) {\n view-transition-name: none;\n }\n\n :root:active-view-transition-type(uiify-toast)::view-transition {\n pointer-events: none;\n }\n\n @media (prefers-reduced-motion: reduce) {\n ::view-transition-group(.uiify-toast),\n ::view-transition-old(.uiify-toast),\n ::view-transition-new(.uiify-toast) {\n animation: none;\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumb/Breadcrumb.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAa,MAAM,OAAO,CAAC;AAIlE,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EAEnB,mBAAmB,EACnB,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC5D,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,GAAG,IAAI,CAerB;AAgBD,wBAAgB,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,IAAI,EAC3D,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,GAAG,IAAI,CAoDrB;yBAtDe,cAAc;;;AAyD9B,wBAAgB,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,IAAI,EAC3D,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,GAAG,IAAI,CAUrB;AAED,wBAAgB,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,GAAG,EAC1D,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,GAAG,IAAI,CAuBrB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,SAAS,WAAW,GAAG,MAAM,EAClE,KAAK,EAAE,wBAAwB,CAAC,GAAG,CAAC,GACnC,YAAY,GAAG,IAAI,CAerB;AA8BD,wBAAgB,sBAAsB,IAAI,YAAY,CAMrD;yBANe,sBAAsB;;;AAStC,eAAO,MAAM,UAAU;;;;;;;CAOtB,CAAC"}
1
+ {"version":3,"file":"Breadcrumb.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumb/Breadcrumb.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAa,MAAM,OAAO,CAAC;AAIlE,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EAEnB,mBAAmB,EACnB,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC5D,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,GAAG,IAAI,CAerB;AAgBD,wBAAgB,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,IAAI,EAC3D,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,GAAG,IAAI,CAoDrB;yBAtDe,cAAc;;;AAyD9B,wBAAgB,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,IAAI,EAC3D,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,GAAG,IAAI,CAUrB;AAED,wBAAgB,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,GAAG,EAC1D,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,GAAG,IAAI,CAwBrB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,SAAS,WAAW,GAAG,MAAM,EAClE,KAAK,EAAE,wBAAwB,CAAC,GAAG,CAAC,GACnC,YAAY,GAAG,IAAI,CAerB;AA8BD,wBAAgB,sBAAsB,IAAI,YAAY,CAMrD;yBANe,sBAAsB;;;AAStC,eAAO,MAAM,UAAU;;;;;;;CAOtB,CAAC"}
@@ -12,7 +12,7 @@ function BreadcrumbRoot(props) {
12
12
  return useRenderElement({
13
13
  as,
14
14
  defaultTag: "nav",
15
- props: { ...consumerProps, "aria-label": ariaLabel },
15
+ props: { ...consumerProps, "aria-label": ariaLabel, "data-uiify-breadcrumb": "" },
16
16
  render,
17
17
  state: {}
18
18
  });
@@ -70,7 +70,7 @@ function BreadcrumbList(props) {
70
70
  return useRenderElement({
71
71
  as,
72
72
  defaultTag: "ol",
73
- props: { ...consumerProps, children: content },
73
+ props: { ...consumerProps, children: content, "data-part": "list" },
74
74
  render,
75
75
  state: {}
76
76
  });
@@ -81,7 +81,7 @@ function BreadcrumbItem(props) {
81
81
  return useRenderElement({
82
82
  as,
83
83
  defaultTag: "li",
84
- props: { ...consumerProps, children },
84
+ props: { ...consumerProps, children, "data-part": "item" },
85
85
  render,
86
86
  state: {}
87
87
  });
@@ -100,6 +100,7 @@ function BreadcrumbLink(props) {
100
100
  defaultTag: "a",
101
101
  props: {
102
102
  ...consumerProps,
103
+ "data-part": "link",
103
104
  "aria-current": current ? "page" : void 0,
104
105
  "data-current": current ? "" : void 0,
105
106
  href,
@@ -119,7 +120,7 @@ function BreadcrumbSeparator(props) {
119
120
  return useRenderElement({
120
121
  as,
121
122
  defaultTag: "span",
122
- props: { ...consumerProps, "aria-hidden": true, children },
123
+ props: { ...consumerProps, "aria-hidden": true, children, "data-part": "separator" },
123
124
  render,
124
125
  state: {}
125
126
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import type { ElementType, ReactElement, ReactNode } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { DetailsContent, DetailsRoot, DetailsSummary } from \"../../elements/details/index.js\";\nimport { collapseBreadcrumbItems } from \"./breadcrumb-collapse.js\";\nimport type {\n BreadcrumbRootProps,\n BreadcrumbListProps,\n BreadcrumbItemProps,\n BreadcrumbItemData,\n BreadcrumbLinkProps,\n BreadcrumbSeparatorProps,\n BreadcrumbEllipsisProps,\n} from \"./types.js\";\n\nexport function BreadcrumbRoot<TAs extends ElementType = \"nav\">(\n props: BreadcrumbRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n \"aria-label\": ariaLabel = \"Breadcrumb\",\n ...consumerProps\n } = props as BreadcrumbRootProps<\"nav\">;\n\n return useRenderElement({\n as,\n defaultTag: \"nav\",\n props: { ...consumerProps, \"aria-label\": ariaLabel },\n render,\n state: {},\n });\n}\n\nfunction renderDataItem(item: BreadcrumbItemData, separator: ReactNode): ReactElement {\n return (\n <BreadcrumbItem key={item.key}>\n <BreadcrumbLink\n {...(item.current !== undefined ? { current: item.current } : {})}\n {...(item.href !== undefined ? { href: item.href } : {})}\n >\n {item.label}\n </BreadcrumbLink>\n {separator}\n </BreadcrumbItem>\n );\n}\n\nexport function BreadcrumbList<TAs extends ElementType = \"ol\">(\n props: BreadcrumbListProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n items,\n itemsAfterCollapse = 1,\n itemsBeforeCollapse = 1,\n maxItems,\n separator,\n ...consumerProps\n } = props as BreadcrumbListProps<\"ol\">;\n\n if (maxItems !== undefined && items === undefined) {\n throw new Error(\n \"Breadcrumb.List: maxItems requires the data-driven `items` prop — collapsing can't \" +\n \"safely introspect `children` (a .map() through a wrapper component hides real \" +\n \"elements from child traversal until React actually renders them).\",\n );\n }\n\n let content: ReactNode = children;\n if (items !== undefined) {\n const collapsed =\n maxItems === undefined\n ? undefined\n : collapseBreadcrumbItems(items, maxItems, itemsBeforeCollapse, itemsAfterCollapse);\n\n content = collapsed\n ? [\n ...collapsed.before.map((item) => renderDataItem(item, separator)),\n <BreadcrumbEllipsis\n hiddenItems={collapsed.hidden}\n key=\"ellipsis\"\n separator={separator}\n />,\n ...collapsed.after.map((item, index) =>\n renderDataItem(item, index === collapsed.after.length - 1 ? null : separator),\n ),\n ]\n : items.map((item, index) =>\n renderDataItem(item, index === items.length - 1 ? null : separator),\n );\n }\n\n return useRenderElement({\n as,\n defaultTag: \"ol\",\n props: { ...consumerProps, children: content },\n render,\n state: {},\n });\n}\nBreadcrumbList.displayName = \"BreadcrumbList\";\n\nexport function BreadcrumbItem<TAs extends ElementType = \"li\">(\n props: BreadcrumbItemProps<TAs>,\n): ReactElement | null {\n const { as, render, children, ...consumerProps } = props as BreadcrumbItemProps<\"li\">;\n\n return useRenderElement({\n as,\n defaultTag: \"li\",\n props: { ...consumerProps, children },\n render,\n state: {},\n });\n}\n\nexport function BreadcrumbLink<TAs extends ElementType = \"a\">(\n props: BreadcrumbLinkProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n current = false,\n href,\n ...consumerProps\n } = props as BreadcrumbLinkProps<\"a\">;\n\n return useRenderElement({\n as,\n defaultTag: \"a\",\n props: {\n ...consumerProps,\n \"aria-current\": current ? \"page\" : undefined,\n \"data-current\": current ? \"\" : undefined,\n href,\n children,\n },\n render,\n state: { current },\n });\n}\n\nexport function BreadcrumbSeparator<TAs extends ElementType = \"span\">(\n props: BreadcrumbSeparatorProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children = \"/\",\n ...consumerProps\n } = props as BreadcrumbSeparatorProps<\"span\">;\n\n return useRenderElement({\n as,\n defaultTag: \"span\",\n props: { ...consumerProps, \"aria-hidden\": true, children },\n render,\n state: {},\n });\n}\n\n/**\n * Built on `@gunkin/uiify/elements/details`: `Details.Summary`/`Details.Content` are used without a\n * `part` (this trigger and panel carry no `data-part`, unlike Accordion/Collapsible's), and\n * `Details.Content` renders as `<ol>` via `as` instead of the default `<div>`.\n */\nfunction BreadcrumbEllipsis({ hiddenItems, separator }: BreadcrumbEllipsisProps): ReactElement {\n return (\n <BreadcrumbItem>\n <DetailsRoot data-part=\"ellipsis\" data-uiify-breadcrumb=\"\">\n <DetailsSummary aria-label=\"Show collapsed breadcrumbs\">…</DetailsSummary>\n <DetailsContent as=\"ol\">\n {hiddenItems.map((item) => (\n <BreadcrumbLink\n key={item.key}\n {...(item.current !== undefined ? { current: item.current } : {})}\n {...(item.href !== undefined ? { href: item.href } : {})}\n >\n {item.label}\n </BreadcrumbLink>\n ))}\n </DetailsContent>\n </DetailsRoot>\n {separator}\n </BreadcrumbItem>\n );\n}\nBreadcrumbEllipsis.displayName = \"BreadcrumbEllipsis\";\n\nexport function BreadcrumbEllipsisPart(): ReactElement {\n return (\n <BreadcrumbItem>\n <span aria-hidden=\"true\">…</span>\n </BreadcrumbItem>\n );\n}\nBreadcrumbEllipsisPart.displayName = \"BreadcrumbEllipsisPart\";\n\nexport const Breadcrumb = {\n Ellipsis: BreadcrumbEllipsisPart,\n Item: BreadcrumbItem,\n Link: BreadcrumbLink,\n List: BreadcrumbList,\n Root: BreadcrumbRoot,\n Separator: BreadcrumbSeparator,\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import type { ElementType, ReactElement, ReactNode } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { DetailsContent, DetailsRoot, DetailsSummary } from \"../../elements/details/index.js\";\nimport { collapseBreadcrumbItems } from \"./breadcrumb-collapse.js\";\nimport type {\n BreadcrumbRootProps,\n BreadcrumbListProps,\n BreadcrumbItemProps,\n BreadcrumbItemData,\n BreadcrumbLinkProps,\n BreadcrumbSeparatorProps,\n BreadcrumbEllipsisProps,\n} from \"./types.js\";\n\nexport function BreadcrumbRoot<TAs extends ElementType = \"nav\">(\n props: BreadcrumbRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n \"aria-label\": ariaLabel = \"Breadcrumb\",\n ...consumerProps\n } = props as BreadcrumbRootProps<\"nav\">;\n\n return useRenderElement({\n as,\n defaultTag: \"nav\",\n props: { ...consumerProps, \"aria-label\": ariaLabel, \"data-uiify-breadcrumb\": \"\" },\n render,\n state: {},\n });\n}\n\nfunction renderDataItem(item: BreadcrumbItemData, separator: ReactNode): ReactElement {\n return (\n <BreadcrumbItem key={item.key}>\n <BreadcrumbLink\n {...(item.current !== undefined ? { current: item.current } : {})}\n {...(item.href !== undefined ? { href: item.href } : {})}\n >\n {item.label}\n </BreadcrumbLink>\n {separator}\n </BreadcrumbItem>\n );\n}\n\nexport function BreadcrumbList<TAs extends ElementType = \"ol\">(\n props: BreadcrumbListProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n items,\n itemsAfterCollapse = 1,\n itemsBeforeCollapse = 1,\n maxItems,\n separator,\n ...consumerProps\n } = props as BreadcrumbListProps<\"ol\">;\n\n if (maxItems !== undefined && items === undefined) {\n throw new Error(\n \"Breadcrumb.List: maxItems requires the data-driven `items` prop — collapsing can't \" +\n \"safely introspect `children` (a .map() through a wrapper component hides real \" +\n \"elements from child traversal until React actually renders them).\",\n );\n }\n\n let content: ReactNode = children;\n if (items !== undefined) {\n const collapsed =\n maxItems === undefined\n ? undefined\n : collapseBreadcrumbItems(items, maxItems, itemsBeforeCollapse, itemsAfterCollapse);\n\n content = collapsed\n ? [\n ...collapsed.before.map((item) => renderDataItem(item, separator)),\n <BreadcrumbEllipsis\n hiddenItems={collapsed.hidden}\n key=\"ellipsis\"\n separator={separator}\n />,\n ...collapsed.after.map((item, index) =>\n renderDataItem(item, index === collapsed.after.length - 1 ? null : separator),\n ),\n ]\n : items.map((item, index) =>\n renderDataItem(item, index === items.length - 1 ? null : separator),\n );\n }\n\n return useRenderElement({\n as,\n defaultTag: \"ol\",\n props: { ...consumerProps, children: content, \"data-part\": \"list\" },\n render,\n state: {},\n });\n}\nBreadcrumbList.displayName = \"BreadcrumbList\";\n\nexport function BreadcrumbItem<TAs extends ElementType = \"li\">(\n props: BreadcrumbItemProps<TAs>,\n): ReactElement | null {\n const { as, render, children, ...consumerProps } = props as BreadcrumbItemProps<\"li\">;\n\n return useRenderElement({\n as,\n defaultTag: \"li\",\n props: { ...consumerProps, children, \"data-part\": \"item\" },\n render,\n state: {},\n });\n}\n\nexport function BreadcrumbLink<TAs extends ElementType = \"a\">(\n props: BreadcrumbLinkProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n current = false,\n href,\n ...consumerProps\n } = props as BreadcrumbLinkProps<\"a\">;\n\n return useRenderElement({\n as,\n defaultTag: \"a\",\n props: {\n ...consumerProps,\n \"data-part\": \"link\",\n \"aria-current\": current ? \"page\" : undefined,\n \"data-current\": current ? \"\" : undefined,\n href,\n children,\n },\n render,\n state: { current },\n });\n}\n\nexport function BreadcrumbSeparator<TAs extends ElementType = \"span\">(\n props: BreadcrumbSeparatorProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children = \"/\",\n ...consumerProps\n } = props as BreadcrumbSeparatorProps<\"span\">;\n\n return useRenderElement({\n as,\n defaultTag: \"span\",\n props: { ...consumerProps, \"aria-hidden\": true, children, \"data-part\": \"separator\" },\n render,\n state: {},\n });\n}\n\n/**\n * Built on `@gunkin/uiify/elements/details`: `Details.Summary`/`Details.Content` are used without a\n * `part` (this trigger and panel carry no `data-part`, unlike Accordion/Collapsible's), and\n * `Details.Content` renders as `<ol>` via `as` instead of the default `<div>`.\n */\nfunction BreadcrumbEllipsis({ hiddenItems, separator }: BreadcrumbEllipsisProps): ReactElement {\n return (\n <BreadcrumbItem>\n <DetailsRoot data-part=\"ellipsis\" data-uiify-breadcrumb=\"\">\n <DetailsSummary aria-label=\"Show collapsed breadcrumbs\">…</DetailsSummary>\n <DetailsContent as=\"ol\">\n {hiddenItems.map((item) => (\n <BreadcrumbLink\n key={item.key}\n {...(item.current !== undefined ? { current: item.current } : {})}\n {...(item.href !== undefined ? { href: item.href } : {})}\n >\n {item.label}\n </BreadcrumbLink>\n ))}\n </DetailsContent>\n </DetailsRoot>\n {separator}\n </BreadcrumbItem>\n );\n}\nBreadcrumbEllipsis.displayName = \"BreadcrumbEllipsis\";\n\nexport function BreadcrumbEllipsisPart(): ReactElement {\n return (\n <BreadcrumbItem>\n <span aria-hidden=\"true\">…</span>\n </BreadcrumbItem>\n );\n}\nBreadcrumbEllipsisPart.displayName = \"BreadcrumbEllipsisPart\";\n\nexport const Breadcrumb = {\n Ellipsis: BreadcrumbEllipsisPart,\n Item: BreadcrumbItem,\n Link: BreadcrumbLink,\n List: BreadcrumbList,\n Root: BreadcrumbRoot,\n Separator: BreadcrumbSeparator,\n};\n"],"mappings":"AAmCI,SACE,KADF;AAlCJ,SAAS,wBAAwB;AACjC,SAAS,gBAAgB,aAAa,sBAAsB;AAC5D,SAAS,+BAA+B;AAWjC,SAAS,eACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,cAAc,YAAY;AAAA,IAC1B,GAAG;AAAA,EACL,IAAI;AAEJ,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO,EAAE,GAAG,eAAe,cAAc,WAAW,yBAAyB,GAAG;AAAA,IAChF;AAAA,IACA,OAAO,CAAC;AAAA,EACV,CAAC;AACH;AAEA,SAAS,eAAe,MAA0B,WAAoC;AACpF,SACE,qBAAC,kBACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAC9D,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,QAErD,eAAK;AAAA;AAAA,IACR;AAAA,IACC;AAAA,OAPkB,KAAK,GAQ1B;AAEJ;AAEO,SAAS,eACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,MAAI,aAAa,UAAa,UAAU,QAAW;AACjD,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,MAAI,UAAqB;AACzB,MAAI,UAAU,QAAW;AACvB,UAAM,YACJ,aAAa,SACT,SACA,wBAAwB,OAAO,UAAU,qBAAqB,kBAAkB;AAEtF,cAAU,YACN;AAAA,MACE,GAAG,UAAU,OAAO,IAAI,CAAC,SAAS,eAAe,MAAM,SAAS,CAAC;AAAA,MACjE;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,UAAU;AAAA,UAEvB;AAAA;AAAA,QADI;AAAA,MAEN;AAAA,MACA,GAAG,UAAU,MAAM;AAAA,QAAI,CAAC,MAAM,UAC5B,eAAe,MAAM,UAAU,UAAU,MAAM,SAAS,IAAI,OAAO,SAAS;AAAA,MAC9E;AAAA,IACF,IACA,MAAM;AAAA,MAAI,CAAC,MAAM,UACf,eAAe,MAAM,UAAU,MAAM,SAAS,IAAI,OAAO,SAAS;AAAA,IACpE;AAAA,EACN;AAEA,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO,EAAE,GAAG,eAAe,UAAU,SAAS,aAAa,OAAO;AAAA,IAClE;AAAA,IACA,OAAO,CAAC;AAAA,EACV,CAAC;AACH;AACA,eAAe,cAAc;AAEtB,SAAS,eACd,OACqB;AACrB,QAAM,EAAE,IAAI,QAAQ,UAAU,GAAG,cAAc,IAAI;AAEnD,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO,EAAE,GAAG,eAAe,UAAU,aAAa,OAAO;AAAA,IACzD;AAAA,IACA,OAAO,CAAC;AAAA,EACV,CAAC;AACH;AAEO,SAAS,eACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,aAAa;AAAA,MACb,gBAAgB,UAAU,SAAS;AAAA,MACnC,gBAAgB,UAAU,KAAK;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA,OAAO,EAAE,QAAQ;AAAA,EACnB,CAAC;AACH;AAEO,SAAS,oBACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,GAAG;AAAA,EACL,IAAI;AAEJ,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO,EAAE,GAAG,eAAe,eAAe,MAAM,UAAU,aAAa,YAAY;AAAA,IACnF;AAAA,IACA,OAAO,CAAC;AAAA,EACV,CAAC;AACH;AAOA,SAAS,mBAAmB,EAAE,aAAa,UAAU,GAA0C;AAC7F,SACE,qBAAC,kBACC;AAAA,yBAAC,eAAY,aAAU,YAAW,yBAAsB,IACtD;AAAA,0BAAC,kBAAe,cAAW,8BAA6B,oBAAC;AAAA,MACzD,oBAAC,kBAAe,IAAG,MAChB,sBAAY,IAAI,CAAC,SAChB;AAAA,QAAC;AAAA;AAAA,UAEE,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,UAC9D,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,UAErD,eAAK;AAAA;AAAA,QAJD,KAAK;AAAA,MAKZ,CACD,GACH;AAAA,OACF;AAAA,IACC;AAAA,KACH;AAEJ;AACA,mBAAmB,cAAc;AAE1B,SAAS,yBAAuC;AACrD,SACE,oBAAC,kBACC,8BAAC,UAAK,eAAY,QAAO,oBAAC,GAC5B;AAEJ;AACA,uBAAuB,cAAc;AAE9B,MAAM,aAAa;AAAA,EACxB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AACb;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"CarouselMarkup.d.ts","sourceRoot":"","sources":["../../../src/components/carousel/CarouselMarkup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EAAE,OAAO,EACb,OAAO,EACP,YAAY,GACb,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CAsI3C;yBA1Ie,cAAc"}
1
+ {"version":3,"file":"CarouselMarkup.d.ts","sourceRoot":"","sources":["../../../src/components/carousel/CarouselMarkup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EAAE,OAAO,EACb,OAAO,EACP,YAAY,GACb,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CAuI3C;yBA3Ie,cAAc"}
@@ -12,6 +12,7 @@ function CarouselMarkup({
12
12
  const enhanced = presentation?.snapshot.ready === true;
13
13
  const showActiveDot = enhanced || presentation?.mounted === true;
14
14
  const activeIndex = presentation?.snapshot.index;
15
+ const announcedIndex = presentation?.snapshot.settledIndex;
15
16
  const fade = enhanced && presentation.mode === "fade";
16
17
  const presentedIndex = fade ? presentation.snapshot.requestedIndex ?? activeIndex : activeIndex;
17
18
  const dotIndices = enhanced && !presentation.preserveFallbackFocus ? presentation.snapshot.pages.map((page) => page.index) : items.map((_, index) => index);
@@ -115,7 +116,7 @@ function CarouselMarkup({
115
116
  "aria-live": presentation.autoplay?.playing ? "off" : "polite",
116
117
  "aria-atomic": "true",
117
118
  "data-part": "status",
118
- children: enhanced && activeIndex !== void 0 ? `${items[activeIndex]?.label ?? ""}, ${activeIndex + 1} ${labels.of} ${items.length}` : null
119
+ children: enhanced && announcedIndex !== void 0 ? `${items[announcedIndex]?.label ?? ""}, ${announcedIndex + 1} ${labels.of} ${items.length}` : null
119
120
  }
120
121
  ) : null
121
122
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/carousel/CarouselMarkup.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport { carouselFragment, carouselSlideId, normalizeCarouselProps } from \"./carousel-markup.js\";\nimport type { CarouselMarkupProps } from \"./types.js\";\n\nexport function CarouselMarkup({\n base: rawBase,\n rootRef,\n presentation,\n}: CarouselMarkupProps): ReactElement | null {\n const base = normalizeCarouselProps(rawBase);\n const { items, labels } = base;\n const hasControls = items.length > 1;\n\n if (items.length === 0) return null;\n\n const enhanced = presentation?.snapshot.ready === true;\n // Pagination claims a current slide as soon as the client has mounted, even before\n // the controller reports `ready` — SSR/pre-hydration markup still claims nothing.\n const showActiveDot = enhanced || presentation?.mounted === true;\n const activeIndex = presentation?.snapshot.index;\n const fade = enhanced && presentation.mode === \"fade\";\n const presentedIndex = fade ? (presentation.snapshot.requestedIndex ?? activeIndex) : activeIndex;\n const dotIndices =\n enhanced && !presentation.preserveFallbackFocus\n ? presentation.snapshot.pages.map((page) => page.index)\n : items.map((_, index) => index);\n\n return (\n <section\n ref={rootRef}\n id={base.id}\n aria-label={base[\"aria-label\"]}\n aria-roledescription=\"carousel\"\n data-uiify-carousel=\"\"\n data-axis={base.axis}\n {...(presentation ? { \"data-mode\": presentation.mode } : {})}\n {...(enhanced ? { \"data-enhanced\": \"\" } : {})}\n {...(base.dir ? { dir: base.dir } : {})}\n {...(base.className ? { className: base.className } : {})}\n {...(base.style ? { style: base.style } : {})}\n >\n {presentation && hasControls && presentation.autoplay ? (\n <button\n type=\"button\"\n data-part=\"controls\"\n data-carousel-action=\"rotation\"\n hidden={!enhanced}\n >\n {presentation.autoplay.requested ? labels.stop : labels.start}\n </button>\n ) : null}\n\n <div\n id={`${base.id}--viewport`}\n tabIndex={0}\n role=\"group\"\n aria-label={base[\"aria-label\"]}\n data-part=\"viewport\"\n >\n {items.map((item, index) => {\n const slideId = carouselSlideId(base.id, item.id);\n return (\n <div\n key={item.id}\n id={slideId}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${item.label}, ${index + 1} ${labels.of} ${items.length}`}\n className={item.className}\n data-part=\"slide\"\n data-carousel-index={index}\n {...(enhanced\n ? { \"data-state\": index === presentedIndex ? \"active\" : \"inactive\" }\n : {})}\n {...(fade && index !== presentedIndex ? { inert: true, \"aria-hidden\": true } : {})}\n >\n <div data-part=\"slide-content\">{item.children}</div>\n </div>\n );\n })}\n </div>\n\n {presentation && hasControls && base.navigation ? (\n <button\n type=\"button\"\n aria-label={labels.previous}\n data-part=\"controls\"\n data-carousel-action=\"previous\"\n hidden={!enhanced}\n disabled={enhanced ? presentation.snapshot.atStart : undefined}\n >\n {base.icons?.previous}\n </button>\n ) : null}\n\n {base.pagination && hasControls ? (\n <nav aria-label={labels.navigation} data-part=\"dots\">\n {dotIndices.map((itemIndex) => {\n const item = items[itemIndex];\n if (!item) return null;\n return (\n <a\n key={item.id}\n href={carouselFragment(carouselSlideId(base.id, item.id))}\n aria-label={`${labels.goTo} ${item.label}`}\n aria-current={showActiveDot && itemIndex === activeIndex ? \"true\" : undefined}\n data-part=\"dot\"\n data-carousel-index={itemIndex}\n >\n {itemIndex + 1}\n </a>\n );\n })}\n </nav>\n ) : null}\n\n {presentation && hasControls && base.navigation ? (\n <button\n type=\"button\"\n aria-label={labels.next}\n data-part=\"controls\"\n data-carousel-action=\"next\"\n hidden={!enhanced}\n disabled={enhanced ? presentation.snapshot.atEnd : undefined}\n >\n {base.icons?.next}\n </button>\n ) : null}\n\n {presentation ? (\n <div\n aria-live={presentation.autoplay?.playing ? \"off\" : \"polite\"}\n aria-atomic=\"true\"\n data-part=\"status\"\n >\n {enhanced && activeIndex !== undefined\n ? `${items[activeIndex]?.label ?? \"\"}, ${activeIndex + 1} ${labels.of} ${items.length}`\n : null}\n </div>\n ) : null}\n </section>\n );\n}\nCarouselMarkup.displayName = \"CarouselMarkup\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/carousel/CarouselMarkup.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport { carouselFragment, carouselSlideId, normalizeCarouselProps } from \"./carousel-markup.js\";\nimport type { CarouselMarkupProps } from \"./types.js\";\n\nexport function CarouselMarkup({\n base: rawBase,\n rootRef,\n presentation,\n}: CarouselMarkupProps): ReactElement | null {\n const base = normalizeCarouselProps(rawBase);\n const { items, labels } = base;\n const hasControls = items.length > 1;\n\n if (items.length === 0) return null;\n\n const enhanced = presentation?.snapshot.ready === true;\n // Pagination claims a current slide as soon as the client has mounted, even before\n // the controller reports `ready` — SSR/pre-hydration markup still claims nothing.\n const showActiveDot = enhanced || presentation?.mounted === true;\n const activeIndex = presentation?.snapshot.index;\n const announcedIndex = presentation?.snapshot.settledIndex;\n const fade = enhanced && presentation.mode === \"fade\";\n const presentedIndex = fade ? (presentation.snapshot.requestedIndex ?? activeIndex) : activeIndex;\n const dotIndices =\n enhanced && !presentation.preserveFallbackFocus\n ? presentation.snapshot.pages.map((page) => page.index)\n : items.map((_, index) => index);\n\n return (\n <section\n ref={rootRef}\n id={base.id}\n aria-label={base[\"aria-label\"]}\n aria-roledescription=\"carousel\"\n data-uiify-carousel=\"\"\n data-axis={base.axis}\n {...(presentation ? { \"data-mode\": presentation.mode } : {})}\n {...(enhanced ? { \"data-enhanced\": \"\" } : {})}\n {...(base.dir ? { dir: base.dir } : {})}\n {...(base.className ? { className: base.className } : {})}\n {...(base.style ? { style: base.style } : {})}\n >\n {presentation && hasControls && presentation.autoplay ? (\n <button\n type=\"button\"\n data-part=\"controls\"\n data-carousel-action=\"rotation\"\n hidden={!enhanced}\n >\n {presentation.autoplay.requested ? labels.stop : labels.start}\n </button>\n ) : null}\n\n <div\n id={`${base.id}--viewport`}\n tabIndex={0}\n role=\"group\"\n aria-label={base[\"aria-label\"]}\n data-part=\"viewport\"\n >\n {items.map((item, index) => {\n const slideId = carouselSlideId(base.id, item.id);\n return (\n <div\n key={item.id}\n id={slideId}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${item.label}, ${index + 1} ${labels.of} ${items.length}`}\n className={item.className}\n data-part=\"slide\"\n data-carousel-index={index}\n {...(enhanced\n ? { \"data-state\": index === presentedIndex ? \"active\" : \"inactive\" }\n : {})}\n {...(fade && index !== presentedIndex ? { inert: true, \"aria-hidden\": true } : {})}\n >\n <div data-part=\"slide-content\">{item.children}</div>\n </div>\n );\n })}\n </div>\n\n {presentation && hasControls && base.navigation ? (\n <button\n type=\"button\"\n aria-label={labels.previous}\n data-part=\"controls\"\n data-carousel-action=\"previous\"\n hidden={!enhanced}\n disabled={enhanced ? presentation.snapshot.atStart : undefined}\n >\n {base.icons?.previous}\n </button>\n ) : null}\n\n {base.pagination && hasControls ? (\n <nav aria-label={labels.navigation} data-part=\"dots\">\n {dotIndices.map((itemIndex) => {\n const item = items[itemIndex];\n if (!item) return null;\n return (\n <a\n key={item.id}\n href={carouselFragment(carouselSlideId(base.id, item.id))}\n aria-label={`${labels.goTo} ${item.label}`}\n aria-current={showActiveDot && itemIndex === activeIndex ? \"true\" : undefined}\n data-part=\"dot\"\n data-carousel-index={itemIndex}\n >\n {itemIndex + 1}\n </a>\n );\n })}\n </nav>\n ) : null}\n\n {presentation && hasControls && base.navigation ? (\n <button\n type=\"button\"\n aria-label={labels.next}\n data-part=\"controls\"\n data-carousel-action=\"next\"\n hidden={!enhanced}\n disabled={enhanced ? presentation.snapshot.atEnd : undefined}\n >\n {base.icons?.next}\n </button>\n ) : null}\n\n {presentation ? (\n <div\n aria-live={presentation.autoplay?.playing ? \"off\" : \"polite\"}\n aria-atomic=\"true\"\n data-part=\"status\"\n >\n {enhanced && announcedIndex !== undefined\n ? `${items[announcedIndex]?.label ?? \"\"}, ${announcedIndex + 1} ${labels.of} ${items.length}`\n : null}\n </div>\n ) : null}\n </section>\n );\n}\nCarouselMarkup.displayName = \"CarouselMarkup\";\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"CarouselClientView.d.ts","sourceRoot":"","sources":["../../../../src/components/carousel/client/CarouselClientView.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAEV,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,qBAAqB,EAAE,gBAWnC,CAAC;AAMF,eAAO,MAAM,yBAAyB,wBAA8B,CAAC;AAErE,eAAO,MAAM,kBAAkB,kBAAiB,CAAC;AAEjD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,UAAU,EACV,QAAQ,GACT,EAAE,uBAAuB,GAAG,YAAY,GAAG,IAAI,CAqC/C;yBA3Ce,kBAAkB"}
1
+ {"version":3,"file":"CarouselClientView.d.ts","sourceRoot":"","sources":["../../../../src/components/carousel/client/CarouselClientView.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAEV,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,qBAAqB,EAAE,gBAYnC,CAAC;AAMF,eAAO,MAAM,yBAAyB,wBAA8B,CAAC;AAErE,eAAO,MAAM,kBAAkB,kBAAiB,CAAC;AAEjD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,UAAU,EACV,QAAQ,GACT,EAAE,uBAAuB,GAAG,YAAY,GAAG,IAAI,CAqC/C;yBA3Ce,kBAAkB"}
@@ -9,6 +9,7 @@ const emptyCarouselSnapshot = {
9
9
  index: 0,
10
10
  requestedIndex: null,
11
11
  settledChange: null,
12
+ settledIndex: 0,
12
13
  pages: [],
13
14
  visibleIndices: [],
14
15
  atStart: true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/carousel/client/CarouselClientView.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, useSyncExternalStore } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../../../hooks/use-isomorphic-layout-effect.js\";\nimport { CarouselMarkup } from \"../CarouselMarkup.js\";\nimport type {\n CarouselAutoplaySnapshot,\n CarouselClientViewProps,\n CarouselSnapshot,\n} from \"../types.js\";\nimport { attachCarouselFocus } from \"./carousel-controls.js\";\n\nexport const emptyCarouselSnapshot: CarouselSnapshot = {\n ready: false,\n index: 0,\n requestedIndex: null,\n settledChange: null,\n pages: [],\n visibleIndices: [],\n atStart: true,\n atEnd: true,\n moving: false,\n interacting: false,\n};\nconst emptyAutoplaySnapshot: CarouselAutoplaySnapshot = {\n requested: false,\n playing: false,\n completedAdvances: 0,\n};\nexport const getCarouselServerSnapshot = () => emptyCarouselSnapshot;\nconst getAutoplayServerSnapshot = () => emptyAutoplaySnapshot;\nexport const subscribeToNothing = () => () => {};\n\nexport function CarouselClientView({\n base,\n rootRef,\n mode,\n controller,\n autoplay,\n}: CarouselClientViewProps): ReactElement | null {\n const snapshot = useSyncExternalStore(\n controller?.subscribe ?? subscribeToNothing,\n controller?.getSnapshot ?? getCarouselServerSnapshot,\n getCarouselServerSnapshot,\n );\n const rotation = useSyncExternalStore(\n autoplay?.subscribe ?? subscribeToNothing,\n autoplay?.getSnapshot ?? getAutoplayServerSnapshot,\n getAutoplayServerSnapshot,\n );\n // Start conservatively: the first ready render must not remove pre-hydration focus.\n const [preserveFallbackFocus, setPreserveFallbackFocus] = useState(true);\n useIsomorphicLayoutEffect(() => {\n const root = document.getElementById(base.id);\n if (!root) return;\n return attachCarouselFocus(root, setPreserveFallbackFocus);\n }, [base.id, base.items.length]);\n // Flips true only after the client's first commit — SSR and the first hydrated\n // render must stay identical, so pagination still claims no current slide until then.\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n // Wrappers pass their complete client props as base; the pure renderer still accepts only server props.\n const rewind = \"rewind\" in base && base.rewind === true && snapshot.pages.length > 1;\n return (\n <CarouselMarkup\n base={base}\n rootRef={rootRef}\n presentation={{\n mode,\n snapshot: rewind ? { ...snapshot, atStart: false, atEnd: false } : snapshot,\n preserveFallbackFocus,\n mounted,\n ...(autoplay ? { autoplay: rotation } : {}),\n }}\n />\n );\n}\nCarouselClientView.displayName = \"CarouselClientView\";\n"],"mappings":";AAiEI;AA/DJ,SAAS,WAAW,UAAU,4BAA4B;AAE1D,SAAS,iCAAiC;AAC1C,SAAS,sBAAsB;AAM/B,SAAS,2BAA2B;AAE7B,MAAM,wBAA0C;AAAA,EACrD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,OAAO,CAAC;AAAA,EACR,gBAAgB,CAAC;AAAA,EACjB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AACf;AACA,MAAM,wBAAkD;AAAA,EACtD,WAAW;AAAA,EACX,SAAS;AAAA,EACT,mBAAmB;AACrB;AACO,MAAM,4BAA4B,MAAM;AAC/C,MAAM,4BAA4B,MAAM;AACjC,MAAM,qBAAqB,MAAM,MAAM;AAAC;AAExC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,QAAM,WAAW;AAAA,IACf,YAAY,aAAa;AAAA,IACzB,YAAY,eAAe;AAAA,IAC3B;AAAA,EACF;AACA,QAAM,WAAW;AAAA,IACf,UAAU,aAAa;AAAA,IACvB,UAAU,eAAe;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAAS,IAAI;AACvE,4BAA0B,MAAM;AAC9B,UAAM,OAAO,SAAS,eAAe,KAAK,EAAE;AAC5C,QAAI,CAAC,KAAM;AACX,WAAO,oBAAoB,MAAM,wBAAwB;AAAA,EAC3D,GAAG,CAAC,KAAK,IAAI,KAAK,MAAM,MAAM,CAAC;AAG/B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,YAAU,MAAM,WAAW,IAAI,GAAG,CAAC,CAAC;AAEpC,QAAM,SAAS,YAAY,QAAQ,KAAK,WAAW,QAAQ,SAAS,MAAM,SAAS;AACnF,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,cAAc;AAAA,QACZ;AAAA,QACA,UAAU,SAAS,EAAE,GAAG,UAAU,SAAS,OAAO,OAAO,MAAM,IAAI;AAAA,QACnE;AAAA,QACA;AAAA,QACA,GAAI,WAAW,EAAE,UAAU,SAAS,IAAI,CAAC;AAAA,MAC3C;AAAA;AAAA,EACF;AAEJ;AACA,mBAAmB,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/carousel/client/CarouselClientView.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, useSyncExternalStore } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../../../hooks/use-isomorphic-layout-effect.js\";\nimport { CarouselMarkup } from \"../CarouselMarkup.js\";\nimport type {\n CarouselAutoplaySnapshot,\n CarouselClientViewProps,\n CarouselSnapshot,\n} from \"../types.js\";\nimport { attachCarouselFocus } from \"./carousel-controls.js\";\n\nexport const emptyCarouselSnapshot: CarouselSnapshot = {\n ready: false,\n index: 0,\n requestedIndex: null,\n settledChange: null,\n settledIndex: 0,\n pages: [],\n visibleIndices: [],\n atStart: true,\n atEnd: true,\n moving: false,\n interacting: false,\n};\nconst emptyAutoplaySnapshot: CarouselAutoplaySnapshot = {\n requested: false,\n playing: false,\n completedAdvances: 0,\n};\nexport const getCarouselServerSnapshot = () => emptyCarouselSnapshot;\nconst getAutoplayServerSnapshot = () => emptyAutoplaySnapshot;\nexport const subscribeToNothing = () => () => {};\n\nexport function CarouselClientView({\n base,\n rootRef,\n mode,\n controller,\n autoplay,\n}: CarouselClientViewProps): ReactElement | null {\n const snapshot = useSyncExternalStore(\n controller?.subscribe ?? subscribeToNothing,\n controller?.getSnapshot ?? getCarouselServerSnapshot,\n getCarouselServerSnapshot,\n );\n const rotation = useSyncExternalStore(\n autoplay?.subscribe ?? subscribeToNothing,\n autoplay?.getSnapshot ?? getAutoplayServerSnapshot,\n getAutoplayServerSnapshot,\n );\n // Start conservatively: the first ready render must not remove pre-hydration focus.\n const [preserveFallbackFocus, setPreserveFallbackFocus] = useState(true);\n useIsomorphicLayoutEffect(() => {\n const root = document.getElementById(base.id);\n if (!root) return;\n return attachCarouselFocus(root, setPreserveFallbackFocus);\n }, [base.id, base.items.length]);\n // Flips true only after the client's first commit — SSR and the first hydrated\n // render must stay identical, so pagination still claims no current slide until then.\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n // Wrappers pass their complete client props as base; the pure renderer still accepts only server props.\n const rewind = \"rewind\" in base && base.rewind === true && snapshot.pages.length > 1;\n return (\n <CarouselMarkup\n base={base}\n rootRef={rootRef}\n presentation={{\n mode,\n snapshot: rewind ? { ...snapshot, atStart: false, atEnd: false } : snapshot,\n preserveFallbackFocus,\n mounted,\n ...(autoplay ? { autoplay: rotation } : {}),\n }}\n />\n );\n}\nCarouselClientView.displayName = \"CarouselClientView\";\n"],"mappings":";AAkEI;AAhEJ,SAAS,WAAW,UAAU,4BAA4B;AAE1D,SAAS,iCAAiC;AAC1C,SAAS,sBAAsB;AAM/B,SAAS,2BAA2B;AAE7B,MAAM,wBAA0C;AAAA,EACrD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,OAAO,CAAC;AAAA,EACR,gBAAgB,CAAC;AAAA,EACjB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AACf;AACA,MAAM,wBAAkD;AAAA,EACtD,WAAW;AAAA,EACX,SAAS;AAAA,EACT,mBAAmB;AACrB;AACO,MAAM,4BAA4B,MAAM;AAC/C,MAAM,4BAA4B,MAAM;AACjC,MAAM,qBAAqB,MAAM,MAAM;AAAC;AAExC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,QAAM,WAAW;AAAA,IACf,YAAY,aAAa;AAAA,IACzB,YAAY,eAAe;AAAA,IAC3B;AAAA,EACF;AACA,QAAM,WAAW;AAAA,IACf,UAAU,aAAa;AAAA,IACvB,UAAU,eAAe;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAAS,IAAI;AACvE,4BAA0B,MAAM;AAC9B,UAAM,OAAO,SAAS,eAAe,KAAK,EAAE;AAC5C,QAAI,CAAC,KAAM;AACX,WAAO,oBAAoB,MAAM,wBAAwB;AAAA,EAC3D,GAAG,CAAC,KAAK,IAAI,KAAK,MAAM,MAAM,CAAC;AAG/B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,YAAU,MAAM,WAAW,IAAI,GAAG,CAAC,CAAC;AAEpC,QAAM,SAAS,YAAY,QAAQ,KAAK,WAAW,QAAQ,SAAS,MAAM,SAAS;AACnF,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,cAAc;AAAA,QACZ;AAAA,QACA,UAAU,SAAS,EAAE,GAAG,UAAU,SAAS,OAAO,OAAO,MAAM,IAAI;AAAA,QACnE;AAAA,QACA;AAAA,QACA,GAAI,WAAW,EAAE,UAAU,SAAS,IAAI,CAAC;AAAA,MAC3C;AAAA;AAAA,EACF;AAEJ;AACA,mBAAmB,cAAc;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"carousel-controller.d.ts","sourceRoot":"","sources":["../../../../src/components/carousel/client/carousel-controller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAClB,yBAAyB,EAK1B,MAAM,aAAa,CAAC;AAGrB,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,yBAAyB,GACxC,kBAAkB,CAqOpB"}
1
+ {"version":3,"file":"carousel-controller.d.ts","sourceRoot":"","sources":["../../../../src/components/carousel/client/carousel-controller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAClB,yBAAyB,EAK1B,MAAM,aAAa,CAAC;AAGrB,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,yBAAyB,GACxC,kBAAkB,CA0PpB"}
@@ -8,11 +8,13 @@ function createCarouselController(root, initialOptions) {
8
8
  const listeners = /* @__PURE__ */ new Set();
9
9
  let options = initialOptions;
10
10
  let geometry;
11
+ let settledIndex = 0;
11
12
  let snapshot = {
12
13
  ready: false,
13
14
  index: 0,
14
15
  requestedIndex: null,
15
16
  settledChange: null,
17
+ settledIndex: 0,
16
18
  pages: [],
17
19
  visibleIndices: [],
18
20
  atStart: true,
@@ -40,7 +42,7 @@ function createCarouselController(root, initialOptions) {
40
42
  const pages = createCarouselPages(geometry);
41
43
  const page = findCarouselPage(pages, geometry.currentOffset);
42
44
  if (!page || geometry.viewportSize <= 0) return;
43
- const previousIndex = snapshot.index;
45
+ const previousIndex = settledIndex;
44
46
  const changed = snapshot.ready && previousIndex !== page.index;
45
47
  const detail = changed && settle2 && !silent ? { previousIndex, index: page.index, reason } : null;
46
48
  publish({
@@ -48,12 +50,18 @@ function createCarouselController(root, initialOptions) {
48
50
  ready: true,
49
51
  pages,
50
52
  visibleIndices: value.visibleIndices,
51
- index: settle2 ? page.index : snapshot.index,
53
+ index: page.index,
52
54
  atStart: page.index === pages[0]?.index,
53
55
  atEnd: page.index === pages.at(-1)?.index,
54
- ...settle2 ? { moving: false, requestedIndex: null, settledChange: detail ?? snapshot.settledChange } : {}
56
+ ...settle2 ? {
57
+ moving: false,
58
+ requestedIndex: null,
59
+ settledIndex: page.index,
60
+ settledChange: detail ?? snapshot.settledChange
61
+ } : {}
55
62
  });
56
63
  if (settle2) {
64
+ settledIndex = page.index;
57
65
  activeId = slides()[page.index]?.id;
58
66
  if (detail) {
59
67
  if (reason !== "controlled") options.onSelect?.(page.index, detail);
@@ -97,6 +105,7 @@ function createCarouselController(root, initialOptions) {
97
105
  });
98
106
  }
99
107
  function step(direction, why) {
108
+ if (snapshot.moving) return;
100
109
  const pages = snapshot.pages;
101
110
  const position = pages.findIndex(
102
111
  (page) => page.index === (snapshot.requestedIndex ?? snapshot.index)
@@ -137,6 +146,18 @@ function createCarouselController(root, initialOptions) {
137
146
  else request(target, wasReady ? "items" : "controlled", !wasReady);
138
147
  });
139
148
  }
149
+ observer.watch((index, visibleIndices) => {
150
+ if (!snapshot.ready) return;
151
+ const page = snapshot.pages.filter((candidate) => candidate.index <= index).at(-1);
152
+ if (page)
153
+ publish({
154
+ ...snapshot,
155
+ index: page.index,
156
+ visibleIndices,
157
+ atStart: page === snapshot.pages[0],
158
+ atEnd: page === snapshot.pages.at(-1)
159
+ });
160
+ });
140
161
  const scroll = () => {
141
162
  if (touchActive) touch = true;
142
163
  if (!snapshot.moving) publish({ ...snapshot, moving: true });
@@ -189,7 +210,7 @@ function createCarouselController(root, initialOptions) {
189
210
  },
190
211
  update(next) {
191
212
  options = next;
192
- if (snapshot.ready && next.value !== void 0 && next.value !== snapshot.index)
213
+ if (snapshot.ready && next.value !== void 0 && next.value !== snapshot.settledIndex)
193
214
  request(next.value, "controlled");
194
215
  },
195
216
  refresh,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/carousel/client/carousel-controller.ts"],"sourcesContent":["import { createCarouselPages, findCarouselPage } from \"../carousel-pages.js\";\nimport { attachCarouselCommands } from \"../commands.js\";\nimport type {\n CarouselController,\n CarouselControllerOptions,\n CarouselGeometry,\n CarouselObservation,\n CarouselReason,\n CarouselSnapshot,\n} from \"../types.js\";\nimport { observeCarousel } from \"./carousel-observer.js\";\n\nexport function createCarouselController(\n root: HTMLElement,\n initialOptions: CarouselControllerOptions,\n): CarouselController {\n const viewport = root.querySelector<HTMLElement>(':scope > [data-part=\"viewport\"]');\n if (!viewport) throw new Error(\"Carousel viewport is missing\");\n const observer = observeCarousel(root);\n const listeners = new Set<() => void>();\n let options = initialOptions;\n let geometry: CarouselGeometry | undefined;\n let snapshot: CarouselSnapshot = {\n ready: false,\n index: 0,\n requestedIndex: null,\n settledChange: null,\n pages: [],\n visibleIndices: [],\n atStart: true,\n atEnd: true,\n moving: false,\n interacting: false,\n };\n let destroyed = false;\n let token = 0;\n let reason: CarouselReason = \"scroll\";\n let silent = false;\n let activeId: string | undefined;\n let touch = false;\n let touchActive = false;\n const resizedSlides = new Set<Element>();\n const slides = () =>\n Array.from(viewport.children).filter((node) => node.getAttribute(\"data-part\") === \"slide\");\n function publish(next: CarouselSnapshot) {\n if (JSON.stringify(snapshot) === JSON.stringify(next)) return;\n snapshot = next;\n listeners.forEach((listener) => listener());\n }\n function observe(value: CarouselObservation, settle: boolean) {\n if (value.geometry.viewportSize <= 0) return;\n geometry = value.geometry;\n const pages = createCarouselPages(geometry);\n const page = findCarouselPage(pages, geometry.currentOffset);\n if (!page || geometry.viewportSize <= 0) return;\n const previousIndex = snapshot.index;\n const changed = snapshot.ready && previousIndex !== page.index;\n const detail =\n changed && settle && !silent ? { previousIndex, index: page.index, reason } : null;\n publish({\n ...snapshot,\n ready: true,\n pages,\n visibleIndices: value.visibleIndices,\n index: settle ? page.index : snapshot.index,\n atStart: page.index === pages[0]?.index,\n atEnd: page.index === pages.at(-1)?.index,\n ...(settle\n ? { moving: false, requestedIndex: null, settledChange: detail ?? snapshot.settledChange }\n : {}),\n });\n if (settle) {\n activeId = slides()[page.index]?.id;\n if (detail) {\n if (reason !== \"controlled\") options.onSelect?.(page.index, detail);\n options.afterChange?.(detail);\n if (reason === \"drag\" || touch) options.onSwipe?.(detail);\n }\n touch = false;\n silent = false;\n reason = \"scroll\";\n }\n }\n function measure(receive: (value: CarouselObservation) => void) {\n const request = ++token;\n observer.measure((value) => {\n if (!destroyed && request === token) receive(value);\n });\n }\n function request(index: number, why: CarouselReason, quiet = false) {\n if (destroyed || !Number.isInteger(index) || index < 0) return;\n const previousRequested = snapshot.requestedIndex;\n touch = false;\n touchActive = false;\n reason = why;\n silent = quiet;\n publish({ ...snapshot, requestedIndex: index, moving: true });\n measure((value) => {\n observe(value, false);\n const target =\n snapshot.pages.filter((page) => page.index <= index).at(-1) ?? snapshot.pages[0];\n if (!target) return;\n const delta = target.offset - value.geometry.currentOffset;\n if (Math.abs(delta) <= 1) {\n observe(value, true);\n return;\n }\n publish({ ...snapshot, requestedIndex: target.index });\n if (!quiet && previousRequested !== target.index)\n options.beforeChange?.({ previousIndex: snapshot.index, index: target.index, reason: why });\n viewport!.scrollBy(\n value.geometry.physicalAxis === \"x\"\n ? { left: delta * value.geometry.sign, behavior: \"auto\" }\n : { top: delta * value.geometry.sign, behavior: \"auto\" },\n );\n });\n }\n function step(direction: 1 | -1, why: CarouselReason) {\n const pages = snapshot.pages;\n const position = pages.findIndex(\n (page) => page.index === (snapshot.requestedIndex ?? snapshot.index),\n );\n let next = position + direction;\n if (options.rewind) next = (next + pages.length) % pages.length;\n const target = pages[Math.max(0, Math.min(pages.length - 1, next))];\n if (target) request(target.index, why);\n }\n function refresh() {\n if (destroyed) return;\n const currentSlides = slides();\n for (const slide of resizedSlides) {\n if (!currentSlides.includes(slide)) {\n resize.unobserve(slide);\n resizedSlides.delete(slide);\n }\n }\n for (const slide of currentSlides) {\n if (!resizedSlides.has(slide)) {\n resizedSlides.add(slide);\n resize.observe(slide);\n }\n }\n const wasReady = snapshot.ready;\n const oldId = activeId;\n measure((value) => {\n if (!wasReady) silent = true;\n observe(value, false);\n if (!snapshot.ready) return;\n const retained = oldId ? slides().findIndex((node) => node.id === oldId) : -1;\n const target =\n options.value ??\n (wasReady ? Math.max(0, retained < 0 ? snapshot.index : retained) : options.defaultValue);\n const hasFragment = slides().some(\n (node) =>\n `#${encodeURIComponent(node.id)}` === root.ownerDocument.defaultView?.location.hash,\n );\n if (\n (!wasReady &&\n options.value === undefined &&\n (value.geometry.currentOffset > 1 || hasFragment)) ||\n target === findCarouselPage(snapshot.pages, value.geometry.currentOffset)?.index\n )\n observe(value, true);\n else request(target, wasReady ? \"items\" : \"controlled\", !wasReady);\n });\n }\n const scroll = () => {\n if (touchActive) touch = true;\n if (!snapshot.moving) publish({ ...snapshot, moving: true });\n };\n // Native touch events continue after pointercancel when the browser takes over scrolling.\n const touchStart = (event: TouchEvent) => {\n if (event.target instanceof Element && event.target.closest(\"[data-uiify-carousel]\") === root) {\n touchActive = true;\n touch = false;\n }\n };\n const touchEnd = () => {\n touchActive = false;\n };\n const settle = () => {\n measure((value) => observe(value, true));\n };\n const pointer = (event: PointerEvent) => {\n if (event.target instanceof Element && event.target.closest(\"[data-uiify-carousel]\") !== root)\n return;\n if (snapshot.moving) {\n ++token;\n reason = \"scroll\";\n silent = false;\n publish({ ...snapshot, requestedIndex: null });\n }\n };\n viewport.addEventListener(\"scroll\", scroll);\n viewport.addEventListener(\"scrollend\", settle);\n viewport.addEventListener(\"pointerdown\", pointer);\n viewport.addEventListener(\"touchstart\", touchStart, { passive: true });\n viewport.addEventListener(\"touchend\", touchEnd, { passive: true });\n viewport.addEventListener(\"touchcancel\", touchEnd, { passive: true });\n const resize = new ResizeObserver(refresh);\n resize.observe(viewport);\n const controller: CarouselController = {\n getSnapshot: () => snapshot,\n getGeometry: () => geometry,\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n goTo: request,\n next: (why) => step(1, why),\n previous: (why) => step(-1, why),\n setInteracting(active) {\n if (destroyed) return;\n publish({ ...snapshot, interacting: active });\n },\n update(next) {\n options = next;\n if (snapshot.ready && next.value !== undefined && next.value !== snapshot.index)\n request(next.value, \"controlled\");\n },\n refresh,\n destroy() {\n destroyed = true;\n token++;\n observer.destroy();\n resize.disconnect();\n detach();\n listeners.clear();\n viewport.removeEventListener(\"scroll\", scroll);\n viewport.removeEventListener(\"scrollend\", settle);\n viewport.removeEventListener(\"pointerdown\", pointer);\n viewport.removeEventListener(\"touchstart\", touchStart);\n viewport.removeEventListener(\"touchend\", touchEnd);\n viewport.removeEventListener(\"touchcancel\", touchEnd);\n },\n };\n const detach = attachCarouselCommands(root, {\n next: () => controller.next(\"command\"),\n previous: () => controller.previous(\"command\"),\n });\n refresh();\n return controller;\n}\n"],"mappings":"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","names":["settle","request"]}
1
+ {"version":3,"sources":["../../../../src/components/carousel/client/carousel-controller.ts"],"sourcesContent":["import { createCarouselPages, findCarouselPage } from \"../carousel-pages.js\";\nimport { attachCarouselCommands } from \"../commands.js\";\nimport type {\n CarouselController,\n CarouselControllerOptions,\n CarouselGeometry,\n CarouselObservation,\n CarouselReason,\n CarouselSnapshot,\n} from \"../types.js\";\nimport { observeCarousel } from \"./carousel-observer.js\";\n\nexport function createCarouselController(\n root: HTMLElement,\n initialOptions: CarouselControllerOptions,\n): CarouselController {\n const viewport = root.querySelector<HTMLElement>(':scope > [data-part=\"viewport\"]');\n if (!viewport) throw new Error(\"Carousel viewport is missing\");\n const observer = observeCarousel(root);\n const listeners = new Set<() => void>();\n let options = initialOptions;\n let geometry: CarouselGeometry | undefined;\n let settledIndex = 0;\n let snapshot: CarouselSnapshot = {\n ready: false,\n index: 0,\n requestedIndex: null,\n settledChange: null,\n settledIndex: 0,\n pages: [],\n visibleIndices: [],\n atStart: true,\n atEnd: true,\n moving: false,\n interacting: false,\n };\n let destroyed = false;\n let token = 0;\n let reason: CarouselReason = \"scroll\";\n let silent = false;\n let activeId: string | undefined;\n let touch = false;\n let touchActive = false;\n const resizedSlides = new Set<Element>();\n const slides = () =>\n Array.from(viewport.children).filter((node) => node.getAttribute(\"data-part\") === \"slide\");\n function publish(next: CarouselSnapshot) {\n if (JSON.stringify(snapshot) === JSON.stringify(next)) return;\n snapshot = next;\n listeners.forEach((listener) => listener());\n }\n function observe(value: CarouselObservation, settle: boolean) {\n if (value.geometry.viewportSize <= 0) return;\n geometry = value.geometry;\n const pages = createCarouselPages(geometry);\n const page = findCarouselPage(pages, geometry.currentOffset);\n if (!page || geometry.viewportSize <= 0) return;\n const previousIndex = settledIndex;\n const changed = snapshot.ready && previousIndex !== page.index;\n const detail =\n changed && settle && !silent ? { previousIndex, index: page.index, reason } : null;\n publish({\n ...snapshot,\n ready: true,\n pages,\n visibleIndices: value.visibleIndices,\n index: page.index,\n atStart: page.index === pages[0]?.index,\n atEnd: page.index === pages.at(-1)?.index,\n ...(settle\n ? {\n moving: false,\n requestedIndex: null,\n settledIndex: page.index,\n settledChange: detail ?? snapshot.settledChange,\n }\n : {}),\n });\n if (settle) {\n settledIndex = page.index;\n activeId = slides()[page.index]?.id;\n if (detail) {\n if (reason !== \"controlled\") options.onSelect?.(page.index, detail);\n options.afterChange?.(detail);\n if (reason === \"drag\" || touch) options.onSwipe?.(detail);\n }\n touch = false;\n silent = false;\n reason = \"scroll\";\n }\n }\n function measure(receive: (value: CarouselObservation) => void) {\n const request = ++token;\n observer.measure((value) => {\n if (!destroyed && request === token) receive(value);\n });\n }\n function request(index: number, why: CarouselReason, quiet = false) {\n if (destroyed || !Number.isInteger(index) || index < 0) return;\n const previousRequested = snapshot.requestedIndex;\n touch = false;\n touchActive = false;\n reason = why;\n silent = quiet;\n publish({ ...snapshot, requestedIndex: index, moving: true });\n measure((value) => {\n observe(value, false);\n const target =\n snapshot.pages.filter((page) => page.index <= index).at(-1) ?? snapshot.pages[0];\n if (!target) return;\n const delta = target.offset - value.geometry.currentOffset;\n if (Math.abs(delta) <= 1) {\n observe(value, true);\n return;\n }\n publish({ ...snapshot, requestedIndex: target.index });\n if (!quiet && previousRequested !== target.index)\n options.beforeChange?.({ previousIndex: snapshot.index, index: target.index, reason: why });\n viewport!.scrollBy(\n value.geometry.physicalAxis === \"x\"\n ? { left: delta * value.geometry.sign, behavior: \"auto\" }\n : { top: delta * value.geometry.sign, behavior: \"auto\" },\n );\n });\n }\n function step(direction: 1 | -1, why: CarouselReason) {\n if (snapshot.moving) return;\n const pages = snapshot.pages;\n const position = pages.findIndex(\n (page) => page.index === (snapshot.requestedIndex ?? snapshot.index),\n );\n let next = position + direction;\n if (options.rewind) next = (next + pages.length) % pages.length;\n const target = pages[Math.max(0, Math.min(pages.length - 1, next))];\n if (target) request(target.index, why);\n }\n function refresh() {\n if (destroyed) return;\n const currentSlides = slides();\n for (const slide of resizedSlides) {\n if (!currentSlides.includes(slide)) {\n resize.unobserve(slide);\n resizedSlides.delete(slide);\n }\n }\n for (const slide of currentSlides) {\n if (!resizedSlides.has(slide)) {\n resizedSlides.add(slide);\n resize.observe(slide);\n }\n }\n const wasReady = snapshot.ready;\n const oldId = activeId;\n measure((value) => {\n if (!wasReady) silent = true;\n observe(value, false);\n if (!snapshot.ready) return;\n const retained = oldId ? slides().findIndex((node) => node.id === oldId) : -1;\n const target =\n options.value ??\n (wasReady ? Math.max(0, retained < 0 ? snapshot.index : retained) : options.defaultValue);\n const hasFragment = slides().some(\n (node) =>\n `#${encodeURIComponent(node.id)}` === root.ownerDocument.defaultView?.location.hash,\n );\n if (\n (!wasReady &&\n options.value === undefined &&\n (value.geometry.currentOffset > 1 || hasFragment)) ||\n target === findCarouselPage(snapshot.pages, value.geometry.currentOffset)?.index\n )\n observe(value, true);\n else request(target, wasReady ? \"items\" : \"controlled\", !wasReady);\n });\n }\n observer.watch((index, visibleIndices) => {\n if (!snapshot.ready) return;\n const page = snapshot.pages.filter((candidate) => candidate.index <= index).at(-1);\n if (page)\n publish({\n ...snapshot,\n index: page.index,\n visibleIndices,\n atStart: page === snapshot.pages[0],\n atEnd: page === snapshot.pages.at(-1),\n });\n });\n const scroll = () => {\n if (touchActive) touch = true;\n if (!snapshot.moving) publish({ ...snapshot, moving: true });\n };\n // Native touch events continue after pointercancel when the browser takes over scrolling.\n const touchStart = (event: TouchEvent) => {\n if (event.target instanceof Element && event.target.closest(\"[data-uiify-carousel]\") === root) {\n touchActive = true;\n touch = false;\n }\n };\n const touchEnd = () => {\n touchActive = false;\n };\n const settle = () => {\n measure((value) => observe(value, true));\n };\n const pointer = (event: PointerEvent) => {\n if (event.target instanceof Element && event.target.closest(\"[data-uiify-carousel]\") !== root)\n return;\n if (snapshot.moving) {\n ++token;\n reason = \"scroll\";\n silent = false;\n publish({ ...snapshot, requestedIndex: null });\n }\n };\n viewport.addEventListener(\"scroll\", scroll);\n viewport.addEventListener(\"scrollend\", settle);\n viewport.addEventListener(\"pointerdown\", pointer);\n viewport.addEventListener(\"touchstart\", touchStart, { passive: true });\n viewport.addEventListener(\"touchend\", touchEnd, { passive: true });\n viewport.addEventListener(\"touchcancel\", touchEnd, { passive: true });\n const resize = new ResizeObserver(refresh);\n resize.observe(viewport);\n const controller: CarouselController = {\n getSnapshot: () => snapshot,\n getGeometry: () => geometry,\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n goTo: request,\n next: (why) => step(1, why),\n previous: (why) => step(-1, why),\n setInteracting(active) {\n if (destroyed) return;\n publish({ ...snapshot, interacting: active });\n },\n update(next) {\n options = next;\n if (snapshot.ready && next.value !== undefined && next.value !== snapshot.settledIndex)\n request(next.value, \"controlled\");\n },\n refresh,\n destroy() {\n destroyed = true;\n token++;\n observer.destroy();\n resize.disconnect();\n detach();\n listeners.clear();\n viewport.removeEventListener(\"scroll\", scroll);\n viewport.removeEventListener(\"scrollend\", settle);\n viewport.removeEventListener(\"pointerdown\", pointer);\n viewport.removeEventListener(\"touchstart\", touchStart);\n viewport.removeEventListener(\"touchend\", touchEnd);\n viewport.removeEventListener(\"touchcancel\", touchEnd);\n },\n };\n const detach = attachCarouselCommands(root, {\n next: () => controller.next(\"command\"),\n previous: () => controller.previous(\"command\"),\n });\n refresh();\n return controller;\n}\n"],"mappings":"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","names":["settle","request"]}
@@ -1 +1 @@
1
- {"version":3,"file":"carousel-observer.d.ts","sourceRoot":"","sources":["../../../../src/components/carousel/client/carousel-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB,CAqEnE"}
1
+ {"version":3,"file":"carousel-observer.d.ts","sourceRoot":"","sources":["../../../../src/components/carousel/client/carousel-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB,CA6GnE"}
@@ -1,10 +1,49 @@
1
1
  function observeCarousel(root) {
2
2
  const viewport = root.querySelector(':scope > [data-part="viewport"]');
3
3
  let current;
4
+ let live;
5
+ let receiveLive;
4
6
  let generation = 0;
7
+ let liveGeneration = 0;
5
8
  let destroyed = false;
9
+ function watchLive() {
10
+ live?.disconnect();
11
+ const liveToken = ++liveGeneration;
12
+ if (!viewport || !receiveLive || destroyed) return;
13
+ const slides = Array.from(viewport.children).filter(
14
+ (node) => node.getAttribute("data-part") === "slide"
15
+ );
16
+ const ratios = /* @__PURE__ */ new Map();
17
+ live = new IntersectionObserver(
18
+ (batch) => {
19
+ if (destroyed || liveToken !== liveGeneration) return;
20
+ for (const entry of batch)
21
+ ratios.set(entry.target, entry.isIntersecting ? entry.intersectionRatio : 0);
22
+ const visible = slides.flatMap(
23
+ (slide, index2) => (ratios.get(slide) ?? 0) > 0 ? [index2] : []
24
+ );
25
+ let index = -1;
26
+ let maximum = 0;
27
+ slides.forEach((slide, candidate) => {
28
+ const ratio = ratios.get(slide) ?? 0;
29
+ if (ratio > maximum) {
30
+ maximum = ratio;
31
+ index = candidate;
32
+ }
33
+ });
34
+ if (index >= 0) receiveLive?.(index, visible);
35
+ },
36
+ { root: viewport, threshold: [0, 0.25, 0.5, 0.75, 1] }
37
+ );
38
+ slides.forEach((slide) => live.observe(slide));
39
+ }
6
40
  return {
41
+ watch(receive) {
42
+ receiveLive = receive;
43
+ watchLive();
44
+ },
7
45
  measure(receive) {
46
+ watchLive();
8
47
  current?.disconnect();
9
48
  const token = ++generation;
10
49
  if (destroyed || !viewport) return;
@@ -60,6 +99,7 @@ function observeCarousel(root) {
60
99
  destroyed = true;
61
100
  generation++;
62
101
  current?.disconnect();
102
+ live?.disconnect();
63
103
  }
64
104
  };
65
105
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/carousel/client/carousel-observer.ts"],"sourcesContent":["import type { CarouselObserver } from \"../types.js\";\n\n/** Each measurement owns its observer, so old deliveries cannot mix with fresh geometry. */\nexport function observeCarousel(root: HTMLElement): CarouselObserver {\n const viewport = root.querySelector<HTMLElement>(':scope > [data-part=\"viewport\"]');\n let current: IntersectionObserver | undefined;\n let generation = 0;\n let destroyed = false;\n return {\n measure(receive) {\n current?.disconnect();\n const token = ++generation;\n if (destroyed || !viewport) return;\n const slides = Array.from(viewport.children).filter(\n (node) => node.getAttribute(\"data-part\") === \"slide\",\n );\n if (!slides.length) return;\n const entries = new Map<Element, IntersectionObserverEntry>();\n current = new IntersectionObserver(\n (batch) => {\n if (destroyed || token !== generation) return;\n for (const entry of batch)\n if (slides.includes(entry.target)) entries.set(entry.target, entry);\n if (entries.size !== slides.length) return;\n const ordered = slides.map((slide) => entries.get(slide)!);\n const first = ordered[0]!;\n const bounds = first.rootBounds;\n const a = first.boundingClientRect;\n const b = ordered[1]?.boundingClientRect;\n const physicalAxis = b && Math.abs(b.y - a.y) > Math.abs(b.x - a.x) ? \"y\" : \"x\";\n const vertical = physicalAxis === \"y\";\n const sign = b && (vertical ? b.y - a.y : b.x - a.x) < 0 ? -1 : 1;\n const size = (rect: DOMRectReadOnly) => (vertical ? rect.height : rect.width);\n const edge = (rect: DOMRectReadOnly) =>\n sign === 1 ? (vertical ? rect.top : rect.left) : vertical ? rect.bottom : rect.right;\n if (\n !bounds ||\n size(bounds) <= 0 ||\n ordered.some((entry) => size(entry.boundingClientRect) <= 0)\n )\n return;\n const itemStarts = ordered.map((entry) =>\n Math.max(0, sign * (edge(entry.boundingClientRect) - edge(a))),\n );\n const itemSizes = ordered.map((entry) => size(entry.boundingClientRect));\n const maximum = Math.max(0, itemStarts.at(-1)! + itemSizes.at(-1)! - size(bounds));\n current?.disconnect();\n generation++;\n receive({\n geometry: {\n physicalAxis,\n sign,\n viewportSize: size(bounds),\n currentOffset: Math.min(maximum, Math.max(0, sign * (edge(bounds) - edge(a)))),\n itemStarts,\n itemSizes,\n },\n visibleIndices: ordered.flatMap((entry, index) =>\n entry.isIntersecting && entry.intersectionRatio > 0 ? [index] : [],\n ),\n });\n },\n { root: viewport },\n );\n slides.forEach((slide) => current!.observe(slide));\n },\n destroy() {\n destroyed = true;\n generation++;\n current?.disconnect();\n },\n };\n}\n"],"mappings":"AAGO,SAAS,gBAAgB,MAAqC;AACnE,QAAM,WAAW,KAAK,cAA2B,iCAAiC;AAClF,MAAI;AACJ,MAAI,aAAa;AACjB,MAAI,YAAY;AAChB,SAAO;AAAA,IACL,QAAQ,SAAS;AACf,eAAS,WAAW;AACpB,YAAM,QAAQ,EAAE;AAChB,UAAI,aAAa,CAAC,SAAU;AAC5B,YAAM,SAAS,MAAM,KAAK,SAAS,QAAQ,EAAE;AAAA,QAC3C,CAAC,SAAS,KAAK,aAAa,WAAW,MAAM;AAAA,MAC/C;AACA,UAAI,CAAC,OAAO,OAAQ;AACpB,YAAM,UAAU,oBAAI,IAAwC;AAC5D,gBAAU,IAAI;AAAA,QACZ,CAAC,UAAU;AACT,cAAI,aAAa,UAAU,WAAY;AACvC,qBAAW,SAAS;AAClB,gBAAI,OAAO,SAAS,MAAM,MAAM,EAAG,SAAQ,IAAI,MAAM,QAAQ,KAAK;AACpE,cAAI,QAAQ,SAAS,OAAO,OAAQ;AACpC,gBAAM,UAAU,OAAO,IAAI,CAAC,UAAU,QAAQ,IAAI,KAAK,CAAE;AACzD,gBAAM,QAAQ,QAAQ,CAAC;AACvB,gBAAM,SAAS,MAAM;AACrB,gBAAM,IAAI,MAAM;AAChB,gBAAM,IAAI,QAAQ,CAAC,GAAG;AACtB,gBAAM,eAAe,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM;AAC5E,gBAAM,WAAW,iBAAiB;AAClC,gBAAM,OAAO,MAAM,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK;AAChE,gBAAM,OAAO,CAAC,SAA2B,WAAW,KAAK,SAAS,KAAK;AACvE,gBAAM,OAAO,CAAC,SACZ,SAAS,IAAK,WAAW,KAAK,MAAM,KAAK,OAAQ,WAAW,KAAK,SAAS,KAAK;AACjF,cACE,CAAC,UACD,KAAK,MAAM,KAAK,KAChB,QAAQ,KAAK,CAAC,UAAU,KAAK,MAAM,kBAAkB,KAAK,CAAC;AAE3D;AACF,gBAAM,aAAa,QAAQ;AAAA,YAAI,CAAC,UAC9B,KAAK,IAAI,GAAG,QAAQ,KAAK,MAAM,kBAAkB,IAAI,KAAK,CAAC,EAAE;AAAA,UAC/D;AACA,gBAAM,YAAY,QAAQ,IAAI,CAAC,UAAU,KAAK,MAAM,kBAAkB,CAAC;AACvE,gBAAM,UAAU,KAAK,IAAI,GAAG,WAAW,GAAG,EAAE,IAAK,UAAU,GAAG,EAAE,IAAK,KAAK,MAAM,CAAC;AACjF,mBAAS,WAAW;AACpB;AACA,kBAAQ;AAAA,YACN,UAAU;AAAA,cACR;AAAA,cACA;AAAA,cACA,cAAc,KAAK,MAAM;AAAA,cACzB,eAAe,KAAK,IAAI,SAAS,KAAK,IAAI,GAAG,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;AAAA,cAC7E;AAAA,cACA;AAAA,YACF;AAAA,YACA,gBAAgB,QAAQ;AAAA,cAAQ,CAAC,OAAO,UACtC,MAAM,kBAAkB,MAAM,oBAAoB,IAAI,CAAC,KAAK,IAAI,CAAC;AAAA,YACnE;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,EAAE,MAAM,SAAS;AAAA,MACnB;AACA,aAAO,QAAQ,CAAC,UAAU,QAAS,QAAQ,KAAK,CAAC;AAAA,IACnD;AAAA,IACA,UAAU;AACR,kBAAY;AACZ;AACA,eAAS,WAAW;AAAA,IACtB;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/carousel/client/carousel-observer.ts"],"sourcesContent":["import type { CarouselObserver } from \"../types.js\";\n\n/** Each measurement owns its observer, so old deliveries cannot mix with fresh geometry. */\nexport function observeCarousel(root: HTMLElement): CarouselObserver {\n const viewport = root.querySelector<HTMLElement>(':scope > [data-part=\"viewport\"]');\n let current: IntersectionObserver | undefined;\n let live: IntersectionObserver | undefined;\n let receiveLive: ((index: number, visible: readonly number[]) => void) | undefined;\n let generation = 0;\n let liveGeneration = 0;\n let destroyed = false;\n function watchLive() {\n live?.disconnect();\n const liveToken = ++liveGeneration;\n if (!viewport || !receiveLive || destroyed) return;\n const slides = Array.from(viewport.children).filter(\n (node) => node.getAttribute(\"data-part\") === \"slide\",\n );\n const ratios = new Map<Element, number>();\n live = new IntersectionObserver(\n (batch) => {\n if (destroyed || liveToken !== liveGeneration) return;\n for (const entry of batch)\n ratios.set(entry.target, entry.isIntersecting ? entry.intersectionRatio : 0);\n const visible = slides.flatMap((slide, index) =>\n (ratios.get(slide) ?? 0) > 0 ? [index] : [],\n );\n let index = -1;\n let maximum = 0;\n slides.forEach((slide, candidate) => {\n const ratio = ratios.get(slide) ?? 0;\n if (ratio > maximum) {\n maximum = ratio;\n index = candidate;\n }\n });\n if (index >= 0) receiveLive?.(index, visible);\n },\n { root: viewport, threshold: [0, 0.25, 0.5, 0.75, 1] },\n );\n slides.forEach((slide) => live!.observe(slide));\n }\n return {\n watch(receive) {\n receiveLive = receive;\n watchLive();\n },\n measure(receive) {\n watchLive();\n current?.disconnect();\n const token = ++generation;\n if (destroyed || !viewport) return;\n const slides = Array.from(viewport.children).filter(\n (node) => node.getAttribute(\"data-part\") === \"slide\",\n );\n if (!slides.length) return;\n const entries = new Map<Element, IntersectionObserverEntry>();\n current = new IntersectionObserver(\n (batch) => {\n if (destroyed || token !== generation) return;\n for (const entry of batch)\n if (slides.includes(entry.target)) entries.set(entry.target, entry);\n if (entries.size !== slides.length) return;\n const ordered = slides.map((slide) => entries.get(slide)!);\n const first = ordered[0]!;\n const bounds = first.rootBounds;\n const a = first.boundingClientRect;\n const b = ordered[1]?.boundingClientRect;\n const physicalAxis = b && Math.abs(b.y - a.y) > Math.abs(b.x - a.x) ? \"y\" : \"x\";\n const vertical = physicalAxis === \"y\";\n const sign = b && (vertical ? b.y - a.y : b.x - a.x) < 0 ? -1 : 1;\n const size = (rect: DOMRectReadOnly) => (vertical ? rect.height : rect.width);\n const edge = (rect: DOMRectReadOnly) =>\n sign === 1 ? (vertical ? rect.top : rect.left) : vertical ? rect.bottom : rect.right;\n if (\n !bounds ||\n size(bounds) <= 0 ||\n ordered.some((entry) => size(entry.boundingClientRect) <= 0)\n )\n return;\n const itemStarts = ordered.map((entry) =>\n Math.max(0, sign * (edge(entry.boundingClientRect) - edge(a))),\n );\n const itemSizes = ordered.map((entry) => size(entry.boundingClientRect));\n const maximum = Math.max(0, itemStarts.at(-1)! + itemSizes.at(-1)! - size(bounds));\n current?.disconnect();\n generation++;\n receive({\n geometry: {\n physicalAxis,\n sign,\n viewportSize: size(bounds),\n currentOffset: Math.min(maximum, Math.max(0, sign * (edge(bounds) - edge(a)))),\n itemStarts,\n itemSizes,\n },\n visibleIndices: ordered.flatMap((entry, index) =>\n entry.isIntersecting && entry.intersectionRatio > 0 ? [index] : [],\n ),\n });\n },\n { root: viewport },\n );\n slides.forEach((slide) => current!.observe(slide));\n },\n destroy() {\n destroyed = true;\n generation++;\n current?.disconnect();\n live?.disconnect();\n },\n };\n}\n"],"mappings":"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","names":["index"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fade-controller.d.ts","sourceRoot":"","sources":["../../../../src/components/carousel/fade/fade-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,yBAAyB,EAG1B,MAAM,aAAa,CAAC;AAErB,yEAAyE;AACzE,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,yBAAyB,GACxC,kBAAkB,CAoMpB"}
1
+ {"version":3,"file":"fade-controller.d.ts","sourceRoot":"","sources":["../../../../src/components/carousel/fade/fade-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,yBAAyB,EAG1B,MAAM,aAAa,CAAC;AAErB,yEAAyE;AACzE,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,yBAAyB,GACxC,kBAAkB,CAuMpB"}