jaci-ui 0.7.0 → 0.9.0

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 (217) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +75 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  4. package/dist/components/alert-dialog/alert-dialog.cjs +4 -1
  5. package/dist/components/alert-dialog/alert-dialog.cjs.map +1 -1
  6. package/dist/components/alert-dialog/alert-dialog.d.cts +2 -2
  7. package/dist/components/alert-dialog/alert-dialog.d.ts +2 -2
  8. package/dist/components/alert-dialog/alert-dialog.js +4 -1
  9. package/dist/components/alert-dialog/alert-dialog.js.map +1 -1
  10. package/dist/components/carousel/carousel.cjs +342 -0
  11. package/dist/components/carousel/carousel.cjs.map +1 -0
  12. package/dist/components/carousel/carousel.d.cts +44 -0
  13. package/dist/components/carousel/carousel.d.ts +44 -0
  14. package/dist/components/carousel/carousel.js +330 -0
  15. package/dist/components/carousel/carousel.js.map +1 -0
  16. package/dist/components/carousel/index.d.cts +2 -0
  17. package/dist/components/carousel/index.d.ts +2 -0
  18. package/dist/components/code/code.cjs +32 -5
  19. package/dist/components/code/code.cjs.map +1 -1
  20. package/dist/components/code/code.d.cts +1 -0
  21. package/dist/components/code/code.d.ts +1 -0
  22. package/dist/components/code/code.js +34 -7
  23. package/dist/components/code/code.js.map +1 -1
  24. package/dist/components/color-picker/color-picker.cjs +4 -1
  25. package/dist/components/color-picker/color-picker.cjs.map +1 -1
  26. package/dist/components/color-picker/color-picker.d.cts +2 -2
  27. package/dist/components/color-picker/color-picker.d.ts +2 -2
  28. package/dist/components/color-picker/color-picker.js +4 -1
  29. package/dist/components/color-picker/color-picker.js.map +1 -1
  30. package/dist/components/color-swatch/color-swatch.cjs +33 -0
  31. package/dist/components/color-swatch/color-swatch.cjs.map +1 -0
  32. package/dist/components/color-swatch/color-swatch.d.cts +13 -0
  33. package/dist/components/color-swatch/color-swatch.d.ts +13 -0
  34. package/dist/components/color-swatch/color-swatch.js +33 -0
  35. package/dist/components/color-swatch/color-swatch.js.map +1 -0
  36. package/dist/components/color-swatch/index.d.cts +2 -0
  37. package/dist/components/color-swatch/index.d.ts +2 -0
  38. package/dist/components/combobox/combobox.cjs +4 -1
  39. package/dist/components/combobox/combobox.cjs.map +1 -1
  40. package/dist/components/combobox/combobox.d.cts +2 -2
  41. package/dist/components/combobox/combobox.d.ts +2 -2
  42. package/dist/components/combobox/combobox.js +4 -1
  43. package/dist/components/combobox/combobox.js.map +1 -1
  44. package/dist/components/command/command.cjs +76 -13
  45. package/dist/components/command/command.cjs.map +1 -1
  46. package/dist/components/command/command.d.cts +7 -1
  47. package/dist/components/command/command.d.ts +7 -1
  48. package/dist/components/command/command.js +76 -13
  49. package/dist/components/command/command.js.map +1 -1
  50. package/dist/components/command/index.d.cts +2 -2
  51. package/dist/components/command/index.d.ts +2 -2
  52. package/dist/components/context-menu/context-menu.cjs +4 -1
  53. package/dist/components/context-menu/context-menu.cjs.map +1 -1
  54. package/dist/components/context-menu/context-menu.d.cts +2 -2
  55. package/dist/components/context-menu/context-menu.d.ts +2 -2
  56. package/dist/components/context-menu/context-menu.js +4 -1
  57. package/dist/components/context-menu/context-menu.js.map +1 -1
  58. package/dist/components/date-picker/date-picker.cjs +4 -1
  59. package/dist/components/date-picker/date-picker.cjs.map +1 -1
  60. package/dist/components/date-picker/date-picker.d.cts +2 -2
  61. package/dist/components/date-picker/date-picker.d.ts +2 -2
  62. package/dist/components/date-picker/date-picker.js +4 -1
  63. package/dist/components/date-picker/date-picker.js.map +1 -1
  64. package/dist/components/date-range-picker/date-range-picker.cjs +4 -1
  65. package/dist/components/date-range-picker/date-range-picker.cjs.map +1 -1
  66. package/dist/components/date-range-picker/date-range-picker.d.cts +2 -2
  67. package/dist/components/date-range-picker/date-range-picker.d.ts +2 -2
  68. package/dist/components/date-range-picker/date-range-picker.js +4 -1
  69. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  70. package/dist/components/dialog/dialog.cjs +4 -1
  71. package/dist/components/dialog/dialog.cjs.map +1 -1
  72. package/dist/components/dialog/dialog.d.cts +2 -2
  73. package/dist/components/dialog/dialog.d.ts +2 -2
  74. package/dist/components/dialog/dialog.js +4 -1
  75. package/dist/components/dialog/dialog.js.map +1 -1
  76. package/dist/components/download-trigger/download-trigger.cjs +25 -0
  77. package/dist/components/download-trigger/download-trigger.cjs.map +1 -0
  78. package/dist/components/download-trigger/download-trigger.d.cts +12 -0
  79. package/dist/components/download-trigger/download-trigger.d.ts +12 -0
  80. package/dist/components/download-trigger/download-trigger.js +25 -0
  81. package/dist/components/download-trigger/download-trigger.js.map +1 -0
  82. package/dist/components/download-trigger/index.d.cts +2 -0
  83. package/dist/components/download-trigger/index.d.ts +2 -0
  84. package/dist/components/drawer/drawer.cjs +4 -1
  85. package/dist/components/drawer/drawer.cjs.map +1 -1
  86. package/dist/components/drawer/drawer.d.cts +2 -2
  87. package/dist/components/drawer/drawer.d.ts +2 -2
  88. package/dist/components/drawer/drawer.js +4 -1
  89. package/dist/components/drawer/drawer.js.map +1 -1
  90. package/dist/components/figure/figure.cjs +45 -36
  91. package/dist/components/figure/figure.cjs.map +1 -1
  92. package/dist/components/figure/figure.js +45 -36
  93. package/dist/components/figure/figure.js.map +1 -1
  94. package/dist/components/image/image.cjs +41 -32
  95. package/dist/components/image/image.cjs.map +1 -1
  96. package/dist/components/image/image.js +41 -32
  97. package/dist/components/image/image.js.map +1 -1
  98. package/dist/components/menu/menu.cjs +4 -1
  99. package/dist/components/menu/menu.cjs.map +1 -1
  100. package/dist/components/menu/menu.d.cts +2 -2
  101. package/dist/components/menu/menu.d.ts +2 -2
  102. package/dist/components/menu/menu.js +4 -1
  103. package/dist/components/menu/menu.js.map +1 -1
  104. package/dist/components/menubar/menubar.cjs +4 -1
  105. package/dist/components/menubar/menubar.cjs.map +1 -1
  106. package/dist/components/menubar/menubar.d.cts +2 -2
  107. package/dist/components/menubar/menubar.d.ts +2 -2
  108. package/dist/components/menubar/menubar.js +4 -1
  109. package/dist/components/menubar/menubar.js.map +1 -1
  110. package/dist/components/navigation/navigation.cjs +3 -1
  111. package/dist/components/navigation/navigation.cjs.map +1 -1
  112. package/dist/components/navigation/navigation.js +3 -1
  113. package/dist/components/navigation/navigation.js.map +1 -1
  114. package/dist/components/navigation-menu/navigation-menu.cjs +4 -1
  115. package/dist/components/navigation-menu/navigation-menu.cjs.map +1 -1
  116. package/dist/components/navigation-menu/navigation-menu.d.cts +2 -2
  117. package/dist/components/navigation-menu/navigation-menu.d.ts +2 -2
  118. package/dist/components/navigation-menu/navigation-menu.js +4 -1
  119. package/dist/components/navigation-menu/navigation-menu.js.map +1 -1
  120. package/dist/components/popover/popover.cjs +4 -1
  121. package/dist/components/popover/popover.cjs.map +1 -1
  122. package/dist/components/popover/popover.d.cts +2 -2
  123. package/dist/components/popover/popover.d.ts +2 -2
  124. package/dist/components/popover/popover.js +4 -1
  125. package/dist/components/popover/popover.js.map +1 -1
  126. package/dist/components/qr-code/index.d.cts +2 -0
  127. package/dist/components/qr-code/index.d.ts +2 -0
  128. package/dist/components/qr-code/qr-code.cjs +118 -0
  129. package/dist/components/qr-code/qr-code.cjs.map +1 -0
  130. package/dist/components/qr-code/qr-code.d.cts +17 -0
  131. package/dist/components/qr-code/qr-code.d.ts +17 -0
  132. package/dist/components/qr-code/qr-code.js +116 -0
  133. package/dist/components/qr-code/qr-code.js.map +1 -0
  134. package/dist/components/select/select.cjs +4 -1
  135. package/dist/components/select/select.cjs.map +1 -1
  136. package/dist/components/select/select.d.cts +2 -2
  137. package/dist/components/select/select.d.ts +2 -2
  138. package/dist/components/select/select.js +4 -1
  139. package/dist/components/select/select.js.map +1 -1
  140. package/dist/components/sidebar/sidebar.cjs +24 -17
  141. package/dist/components/sidebar/sidebar.cjs.map +1 -1
  142. package/dist/components/sidebar/sidebar.d.cts +4 -2
  143. package/dist/components/sidebar/sidebar.d.ts +4 -2
  144. package/dist/components/sidebar/sidebar.js +24 -17
  145. package/dist/components/sidebar/sidebar.js.map +1 -1
  146. package/dist/components/spacer/index.d.cts +2 -0
  147. package/dist/components/spacer/index.d.ts +2 -0
  148. package/dist/components/spacer/spacer.cjs +24 -0
  149. package/dist/components/spacer/spacer.cjs.map +1 -0
  150. package/dist/components/spacer/spacer.d.cts +10 -0
  151. package/dist/components/spacer/spacer.d.ts +10 -0
  152. package/dist/components/spacer/spacer.js +24 -0
  153. package/dist/components/spacer/spacer.js.map +1 -0
  154. package/dist/components/toast/toast.cjs +4 -1
  155. package/dist/components/toast/toast.cjs.map +1 -1
  156. package/dist/components/toast/toast.d.cts +1 -1
  157. package/dist/components/toast/toast.d.ts +1 -1
  158. package/dist/components/toast/toast.js +4 -1
  159. package/dist/components/toast/toast.js.map +1 -1
  160. package/dist/components/tooltip/tooltip.cjs +4 -1
  161. package/dist/components/tooltip/tooltip.cjs.map +1 -1
  162. package/dist/components/tooltip/tooltip.d.cts +2 -2
  163. package/dist/components/tooltip/tooltip.d.ts +2 -2
  164. package/dist/components/tooltip/tooltip.js +4 -1
  165. package/dist/components/tooltip/tooltip.js.map +1 -1
  166. package/dist/index.cjs +11 -0
  167. package/dist/index.cjs.map +1 -0
  168. package/dist/index.d.cts +12 -2
  169. package/dist/index.d.ts +12 -2
  170. package/dist/index.js +7 -1
  171. package/dist/index.js.map +1 -0
  172. package/dist/styled-system/recipes/carousel.cjs +48 -0
  173. package/dist/styled-system/recipes/carousel.cjs.map +1 -0
  174. package/dist/styled-system/recipes/carousel.js +48 -0
  175. package/dist/styled-system/recipes/carousel.js.map +1 -0
  176. package/dist/styled-system/recipes/code.cjs +4 -2
  177. package/dist/styled-system/recipes/code.cjs.map +1 -1
  178. package/dist/styled-system/recipes/code.js +4 -2
  179. package/dist/styled-system/recipes/code.js.map +1 -1
  180. package/dist/styled-system/recipes/color-swatch.cjs +37 -0
  181. package/dist/styled-system/recipes/color-swatch.cjs.map +1 -0
  182. package/dist/styled-system/recipes/color-swatch.js +37 -0
  183. package/dist/styled-system/recipes/color-swatch.js.map +1 -0
  184. package/dist/styled-system/recipes/command.cjs +3 -3
  185. package/dist/styled-system/recipes/command.cjs.map +1 -1
  186. package/dist/styled-system/recipes/command.js +3 -3
  187. package/dist/styled-system/recipes/command.js.map +1 -1
  188. package/dist/styled-system/recipes/download-trigger.cjs +39 -0
  189. package/dist/styled-system/recipes/download-trigger.cjs.map +1 -0
  190. package/dist/styled-system/recipes/download-trigger.js +39 -0
  191. package/dist/styled-system/recipes/download-trigger.js.map +1 -0
  192. package/dist/styled-system/recipes/figure.cjs +1 -0
  193. package/dist/styled-system/recipes/figure.cjs.map +1 -1
  194. package/dist/styled-system/recipes/figure.js +1 -0
  195. package/dist/styled-system/recipes/figure.js.map +1 -1
  196. package/dist/styled-system/recipes/image.cjs +1 -0
  197. package/dist/styled-system/recipes/image.cjs.map +1 -1
  198. package/dist/styled-system/recipes/image.js +1 -0
  199. package/dist/styled-system/recipes/image.js.map +1 -1
  200. package/dist/styled-system/recipes/layout-spacer.cjs +88 -0
  201. package/dist/styled-system/recipes/layout-spacer.cjs.map +1 -0
  202. package/dist/styled-system/recipes/layout-spacer.js +88 -0
  203. package/dist/styled-system/recipes/layout-spacer.js.map +1 -0
  204. package/dist/styled-system/recipes/qr-code.cjs +25 -0
  205. package/dist/styled-system/recipes/qr-code.cjs.map +1 -0
  206. package/dist/styled-system/recipes/qr-code.js +25 -0
  207. package/dist/styled-system/recipes/qr-code.js.map +1 -0
  208. package/dist/styles.css +662 -106
  209. package/dist/theme/theme-provider.cjs +46 -8
  210. package/dist/theme/theme-provider.cjs.map +1 -1
  211. package/dist/theme/theme-provider.js +46 -8
  212. package/dist/theme/theme-provider.js.map +1 -1
  213. package/dist/theme/theme-scope.cjs +21 -0
  214. package/dist/theme/theme-scope.cjs.map +1 -0
  215. package/dist/theme/theme-scope.js +19 -0
  216. package/dist/theme/theme-scope.js.map +1 -0
  217. package/package.json +10 -5
@@ -0,0 +1,330 @@
1
+ "use client";
2
+ import { cx } from "../../styled-system/css/cx.js";
3
+ import { carousel } from "../../styled-system/recipes/carousel.js";
4
+ import { createContext, forwardRef, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/components/carousel/carousel.tsx
7
+ const CarouselContext = createContext(null);
8
+ function useCarouselContext() {
9
+ const context = useContext(CarouselContext);
10
+ if (!context) throw new Error("Carousel parts must be rendered inside Carousel.Root.");
11
+ return context;
12
+ }
13
+ const CarouselRoot = forwardRef(function CarouselRoot({ autoplay = false, autoplayInterval = 5e3, children, className, defaultIndex = 0, disabled = false, index, onBlur, onFocus, loop = true, onIndexChange, onKeyDown, onPointerEnter, onPointerLeave, orientation = "horizontal", pauseOnFocus = true, pauseOnHover = true, style, swipeable = true, ...props }, ref) {
14
+ const [uncontrolledIndex, setUncontrolledIndex] = useState(Math.max(0, defaultIndex));
15
+ const [registered, setRegistered] = useState(() => /* @__PURE__ */ new Set());
16
+ const [paused, setPaused] = useState(false);
17
+ const [focusWithin, setFocusWithin] = useState(false);
18
+ const swipeRef = useRef(null);
19
+ const isControlled = index !== void 0;
20
+ const indexCount = registered.size ? Math.max(...registered) + 1 : 0;
21
+ const currentIndex = Math.max(0, Math.min(indexCount ? indexCount - 1 : 0, index ?? uncontrolledIndex));
22
+ const styles = carousel({
23
+ orientation,
24
+ active: true
25
+ });
26
+ const setIndex = useCallback((nextIndex) => {
27
+ if (disabled || !indexCount) return;
28
+ const next = loop ? (nextIndex + indexCount) % indexCount : Math.max(0, Math.min(indexCount - 1, nextIndex));
29
+ if (!isControlled) setUncontrolledIndex(next);
30
+ if (next !== currentIndex) onIndexChange?.(next);
31
+ }, [
32
+ currentIndex,
33
+ disabled,
34
+ indexCount,
35
+ isControlled,
36
+ loop,
37
+ onIndexChange
38
+ ]);
39
+ const getNextIndex = useCallback((direction) => currentIndex + direction, [currentIndex]);
40
+ const registerIndex = useCallback((itemIndex) => {
41
+ setRegistered((previous) => {
42
+ if (previous.has(itemIndex)) return previous;
43
+ const next = new Set(previous);
44
+ next.add(itemIndex);
45
+ return next;
46
+ });
47
+ return () => setRegistered((previous) => {
48
+ if (!previous.has(itemIndex)) return previous;
49
+ const next = new Set(previous);
50
+ next.delete(itemIndex);
51
+ return next;
52
+ });
53
+ }, []);
54
+ const onRootKeyDown = useCallback((event) => {
55
+ if (disabled) return;
56
+ const forward = orientation === "horizontal" ? event.key === "ArrowRight" : event.key === "ArrowDown";
57
+ const backward = orientation === "horizontal" ? event.key === "ArrowLeft" : event.key === "ArrowUp";
58
+ if (forward || backward) {
59
+ event.preventDefault();
60
+ setIndex(getNextIndex(forward ? 1 : -1));
61
+ } else if (event.key === "Home") {
62
+ event.preventDefault();
63
+ setIndex(0);
64
+ } else if (event.key === "End") {
65
+ event.preventDefault();
66
+ setIndex(indexCount - 1);
67
+ }
68
+ onKeyDown?.(event);
69
+ }, [
70
+ disabled,
71
+ getNextIndex,
72
+ indexCount,
73
+ onKeyDown,
74
+ orientation,
75
+ setIndex
76
+ ]);
77
+ const startSwipe = useCallback((event) => {
78
+ if (!swipeable || disabled || event.pointerType === "mouse") return;
79
+ swipeRef.current = {
80
+ pointerId: event.pointerId,
81
+ startX: event.clientX,
82
+ startY: event.clientY
83
+ };
84
+ event.currentTarget.setPointerCapture?.(event.pointerId);
85
+ }, [disabled, swipeable]);
86
+ const moveSwipe = useCallback(() => void 0, []);
87
+ const endSwipe = useCallback((event) => {
88
+ const start = swipeRef.current;
89
+ swipeRef.current = null;
90
+ if (!start || start.pointerId !== event.pointerId) return;
91
+ const delta = orientation === "horizontal" ? event.clientX - start.startX : event.clientY - start.startY;
92
+ if (Math.abs(delta) < 40) return;
93
+ setIndex(getNextIndex(delta < 0 ? 1 : -1));
94
+ }, [
95
+ getNextIndex,
96
+ orientation,
97
+ setIndex
98
+ ]);
99
+ useEffect(() => {
100
+ if (!autoplay || paused || disabled || indexCount < 2) return;
101
+ const interval = Number.isFinite(autoplayInterval) && autoplayInterval > 0 ? autoplayInterval : 5e3;
102
+ const timer = window.setInterval(() => setIndex(getNextIndex(1)), interval);
103
+ return () => window.clearInterval(timer);
104
+ }, [
105
+ autoplay,
106
+ autoplayInterval,
107
+ disabled,
108
+ getNextIndex,
109
+ indexCount,
110
+ paused,
111
+ setIndex
112
+ ]);
113
+ const value = useMemo(() => ({
114
+ currentIndex,
115
+ disabled,
116
+ endSwipe,
117
+ getNextIndex,
118
+ indexCount,
119
+ loop,
120
+ moveSwipe,
121
+ onKeyDown: onRootKeyDown,
122
+ orientation,
123
+ registerIndex,
124
+ setIndex,
125
+ startSwipe,
126
+ styles
127
+ }), [
128
+ currentIndex,
129
+ disabled,
130
+ endSwipe,
131
+ getNextIndex,
132
+ indexCount,
133
+ loop,
134
+ moveSwipe,
135
+ onRootKeyDown,
136
+ orientation,
137
+ registerIndex,
138
+ setIndex,
139
+ startSwipe,
140
+ styles
141
+ ]);
142
+ return /* @__PURE__ */ jsx(CarouselContext.Provider, {
143
+ value,
144
+ children: /* @__PURE__ */ jsx("section", {
145
+ ...props,
146
+ ref,
147
+ "aria-roledescription": "carousel",
148
+ className: cx(styles.root, className),
149
+ "data-jaci-component": "carousel",
150
+ "data-orientation": orientation,
151
+ "data-slot": "carousel",
152
+ "data-state": paused ? "paused" : "running",
153
+ role: "region",
154
+ tabIndex: disabled ? -1 : 0,
155
+ onBlur: (event) => {
156
+ if (!event.currentTarget.contains(event.relatedTarget)) {
157
+ setFocusWithin(false);
158
+ if (pauseOnFocus) setPaused(false);
159
+ }
160
+ onBlur?.(event);
161
+ },
162
+ onFocus: (event) => {
163
+ setFocusWithin(true);
164
+ if (pauseOnFocus) setPaused(true);
165
+ onFocus?.(event);
166
+ },
167
+ onKeyDown: onRootKeyDown,
168
+ onPointerCancel: endSwipe,
169
+ onPointerDown: startSwipe,
170
+ onPointerEnter: (event) => {
171
+ if (pauseOnHover) setPaused(true);
172
+ onPointerEnter?.(event);
173
+ },
174
+ onPointerLeave: (event) => {
175
+ if (pauseOnHover && !(pauseOnFocus && focusWithin)) setPaused(false);
176
+ onPointerLeave?.(event);
177
+ },
178
+ onPointerMove: moveSwipe,
179
+ onPointerUp: endSwipe,
180
+ style: {
181
+ "--jaci-carousel-index": currentIndex,
182
+ ...style
183
+ },
184
+ children
185
+ })
186
+ });
187
+ });
188
+ const CarouselViewport = forwardRef(function CarouselViewport({ className, ...props }, ref) {
189
+ const { styles } = useCarouselContext();
190
+ return /* @__PURE__ */ jsx("div", {
191
+ ...props,
192
+ ref,
193
+ className: cx(styles.viewport, className),
194
+ "data-slot": "carousel-viewport"
195
+ });
196
+ });
197
+ const CarouselTrack = forwardRef(function CarouselTrack({ className, style, ...props }, ref) {
198
+ const { currentIndex, orientation, styles } = useCarouselContext();
199
+ const transform = orientation === "horizontal" ? `translateX(-${currentIndex * 100}%)` : `translateY(-${currentIndex * 100}%)`;
200
+ return /* @__PURE__ */ jsx("div", {
201
+ ...props,
202
+ ref,
203
+ className: cx(styles.track, className),
204
+ "data-slot": "carousel-track",
205
+ style: {
206
+ transform,
207
+ ...style
208
+ }
209
+ });
210
+ });
211
+ const CarouselItem = forwardRef(function CarouselItem({ children, className, index, ...props }, ref) {
212
+ const { currentIndex, registerIndex, styles } = useCarouselContext();
213
+ useEffect(() => registerIndex(index), [index, registerIndex]);
214
+ const active = currentIndex === index;
215
+ return /* @__PURE__ */ jsx("div", {
216
+ ...props,
217
+ ref,
218
+ "aria-hidden": !active,
219
+ "aria-roledescription": "slide",
220
+ className: cx(styles.item, className),
221
+ "data-index": index,
222
+ "data-jaci-component": "carousel-item",
223
+ "data-selected": active || void 0,
224
+ "data-slot": "carousel-item",
225
+ role: "group",
226
+ tabIndex: active ? 0 : -1,
227
+ children
228
+ });
229
+ });
230
+ function createSimpleSlot(slot) {
231
+ return forwardRef(function CarouselSlot({ className, ...props }, ref) {
232
+ const { styles } = useCarouselContext();
233
+ if (slot === "title") return /* @__PURE__ */ jsx("h3", {
234
+ ...props,
235
+ ref,
236
+ className: cx(styles.title, className),
237
+ "data-slot": `carousel-${slot}`
238
+ });
239
+ if (slot === "description") return /* @__PURE__ */ jsx("p", {
240
+ ...props,
241
+ ref,
242
+ className: cx(styles.description, className),
243
+ "data-slot": `carousel-${slot}`
244
+ });
245
+ return /* @__PURE__ */ jsx("div", {
246
+ ...props,
247
+ ref,
248
+ className: cx(styles[slot], className),
249
+ "data-slot": `carousel-${slot}`
250
+ });
251
+ });
252
+ }
253
+ const CarouselMedia = createSimpleSlot("media");
254
+ const CarouselCaption = createSimpleSlot("caption");
255
+ const CarouselTitle = createSimpleSlot("title");
256
+ const CarouselDescription = createSimpleSlot("description");
257
+ const CarouselPrevious = forwardRef(function CarouselPrevious({ "aria-label": ariaLabel = "Previous slide", children, className, disabled, ...props }, ref) {
258
+ const { disabled: contextDisabled, getNextIndex, orientation, setIndex, styles } = useCarouselContext();
259
+ return /* @__PURE__ */ jsx("button", {
260
+ ...props,
261
+ ref,
262
+ "aria-label": ariaLabel,
263
+ className: cx(styles.control, className),
264
+ "data-slot": "carousel-previous",
265
+ disabled: disabled ?? contextDisabled,
266
+ onClick: () => setIndex(getNextIndex(-1)),
267
+ type: "button",
268
+ children: children ?? (orientation === "vertical" ? "↑" : "‹")
269
+ });
270
+ });
271
+ const CarouselNext = forwardRef(function CarouselNext({ "aria-label": ariaLabel = "Next slide", children, className, disabled, ...props }, ref) {
272
+ const { disabled: contextDisabled, getNextIndex, orientation, setIndex, styles } = useCarouselContext();
273
+ return /* @__PURE__ */ jsx("button", {
274
+ ...props,
275
+ ref,
276
+ "aria-label": ariaLabel,
277
+ className: cx(styles.control, className),
278
+ "data-slot": "carousel-next",
279
+ disabled: disabled ?? contextDisabled,
280
+ onClick: () => setIndex(getNextIndex(1)),
281
+ type: "button",
282
+ children: children ?? (orientation === "vertical" ? "↓" : "›")
283
+ });
284
+ });
285
+ const CarouselIndicator = forwardRef(function CarouselIndicator({ "aria-label": ariaLabel, className, index, ...props }, ref) {
286
+ const { currentIndex, disabled, setIndex, styles } = useCarouselContext();
287
+ return /* @__PURE__ */ jsx("button", {
288
+ ...props,
289
+ ref,
290
+ "aria-label": ariaLabel ?? `Go to slide ${index + 1}`,
291
+ "aria-selected": currentIndex === index,
292
+ className: cx(styles.indicator, className),
293
+ "data-selected": currentIndex === index || void 0,
294
+ "data-slot": "carousel-indicator",
295
+ disabled,
296
+ onClick: () => setIndex(index),
297
+ role: "tab",
298
+ type: "button"
299
+ });
300
+ });
301
+ const CarouselIndicators = forwardRef(function CarouselIndicators({ children, className, ...props }, ref) {
302
+ const { indexCount, styles } = useCarouselContext();
303
+ return /* @__PURE__ */ jsx("div", {
304
+ ...props,
305
+ ref,
306
+ "aria-label": "Slides",
307
+ className: cx(styles.indicators, className),
308
+ "data-slot": "carousel-indicators",
309
+ role: "tablist",
310
+ children: children ?? Array.from({ length: indexCount }, (_, index) => /* @__PURE__ */ jsx(CarouselIndicator, { index }, `indicator-${index}`))
311
+ });
312
+ });
313
+ const Carousel = {
314
+ Root: CarouselRoot,
315
+ Viewport: CarouselViewport,
316
+ Track: CarouselTrack,
317
+ Item: CarouselItem,
318
+ Media: CarouselMedia,
319
+ Caption: CarouselCaption,
320
+ Title: CarouselTitle,
321
+ Description: CarouselDescription,
322
+ Previous: CarouselPrevious,
323
+ Next: CarouselNext,
324
+ Indicators: CarouselIndicators,
325
+ Indicator: CarouselIndicator
326
+ };
327
+ //#endregion
328
+ export { Carousel, CarouselCaption, CarouselDescription, CarouselIndicator, CarouselIndicators, CarouselItem, CarouselMedia, CarouselNext, CarouselPrevious, CarouselRoot, CarouselTitle, CarouselTrack, CarouselViewport };
329
+
330
+ //# sourceMappingURL=carousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel.js","names":[],"sources":["../../../src/components/carousel/carousel.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n ComponentPropsWithoutRef,\n CSSProperties,\n FocusEvent,\n KeyboardEvent,\n PointerEvent,\n ReactNode,\n Ref,\n} from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { carousel } from \"../../styled-system/recipes\";\n\nexport type CarouselOrientation = \"horizontal\" | \"vertical\";\n\ninterface CarouselContextValue {\n currentIndex: number;\n disabled: boolean;\n getNextIndex: (direction: -1 | 1) => number;\n indexCount: number;\n loop: boolean;\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n registerIndex: (index: number) => () => void;\n setIndex: (index: number) => void;\n startSwipe: (event: PointerEvent<HTMLElement>) => void;\n moveSwipe: (event: PointerEvent<HTMLElement>) => void;\n endSwipe: (event: PointerEvent<HTMLElement>) => void;\n orientation: CarouselOrientation;\n styles: ReturnType<typeof carousel>;\n}\n\nconst CarouselContext = createContext<CarouselContextValue | null>(null);\n\nfunction useCarouselContext() {\n const context = useContext(CarouselContext);\n if (!context) throw new Error(\"Carousel parts must be rendered inside Carousel.Root.\");\n return context;\n}\n\nexport interface CarouselRootProps extends ComponentPropsWithoutRef<\"section\"> {\n index?: number;\n defaultIndex?: number;\n onIndexChange?: (index: number) => void;\n orientation?: CarouselOrientation;\n loop?: boolean;\n swipeable?: boolean;\n autoplay?: boolean;\n autoplayInterval?: number;\n pauseOnHover?: boolean;\n pauseOnFocus?: boolean;\n disabled?: boolean;\n}\n\nexport const CarouselRoot = forwardRef<HTMLElement, CarouselRootProps>(function CarouselRoot(\n {\n autoplay = false,\n autoplayInterval = 5000,\n children,\n className,\n defaultIndex = 0,\n disabled = false,\n index,\n onBlur,\n onFocus,\n loop = true,\n onIndexChange,\n onKeyDown,\n onPointerEnter,\n onPointerLeave,\n orientation = \"horizontal\",\n pauseOnFocus = true,\n pauseOnHover = true,\n style,\n swipeable = true,\n ...props\n },\n ref,\n) {\n const [uncontrolledIndex, setUncontrolledIndex] = useState(Math.max(0, defaultIndex));\n const [registered, setRegistered] = useState<Set<number>>(() => new Set());\n const [paused, setPaused] = useState(false);\n const [focusWithin, setFocusWithin] = useState(false);\n const swipeRef = useRef<{ pointerId: number; startX: number; startY: number } | null>(null);\n const isControlled = index !== undefined;\n const indexCount = registered.size ? Math.max(...registered) + 1 : 0;\n const currentIndex = Math.max(\n 0,\n Math.min(indexCount ? indexCount - 1 : 0, index ?? uncontrolledIndex),\n );\n const styles = carousel({ orientation, active: true });\n\n const setIndex = useCallback(\n (nextIndex: number) => {\n if (disabled || !indexCount) return;\n const next = loop\n ? (nextIndex + indexCount) % indexCount\n : Math.max(0, Math.min(indexCount - 1, nextIndex));\n if (!isControlled) setUncontrolledIndex(next);\n if (next !== currentIndex) onIndexChange?.(next);\n },\n [currentIndex, disabled, indexCount, isControlled, loop, onIndexChange],\n );\n\n const getNextIndex = useCallback((direction: -1 | 1) => currentIndex + direction, [currentIndex]);\n\n const registerIndex = useCallback((itemIndex: number) => {\n setRegistered((previous) => {\n if (previous.has(itemIndex)) return previous;\n const next = new Set(previous);\n next.add(itemIndex);\n return next;\n });\n return () =>\n setRegistered((previous) => {\n if (!previous.has(itemIndex)) return previous;\n const next = new Set(previous);\n next.delete(itemIndex);\n return next;\n });\n }, []);\n\n const onRootKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n if (disabled) return;\n const forward =\n orientation === \"horizontal\" ? event.key === \"ArrowRight\" : event.key === \"ArrowDown\";\n const backward =\n orientation === \"horizontal\" ? event.key === \"ArrowLeft\" : event.key === \"ArrowUp\";\n if (forward || backward) {\n event.preventDefault();\n setIndex(getNextIndex(forward ? 1 : -1));\n } else if (event.key === \"Home\") {\n event.preventDefault();\n setIndex(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n setIndex(indexCount - 1);\n }\n onKeyDown?.(event);\n },\n [disabled, getNextIndex, indexCount, onKeyDown, orientation, setIndex],\n );\n\n const startSwipe = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n if (!swipeable || disabled || event.pointerType === \"mouse\") return;\n swipeRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n },\n [disabled, swipeable],\n );\n\n const moveSwipe = useCallback(() => undefined, []);\n\n const endSwipe = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const start = swipeRef.current;\n swipeRef.current = null;\n if (!start || start.pointerId !== event.pointerId) return;\n const delta =\n orientation === \"horizontal\" ? event.clientX - start.startX : event.clientY - start.startY;\n if (Math.abs(delta) < 40) return;\n setIndex(getNextIndex(delta < 0 ? 1 : -1));\n },\n [getNextIndex, orientation, setIndex],\n );\n\n useEffect(() => {\n if (!autoplay || paused || disabled || indexCount < 2) return;\n const interval =\n Number.isFinite(autoplayInterval) && autoplayInterval > 0 ? autoplayInterval : 5000;\n const timer = window.setInterval(() => setIndex(getNextIndex(1)), interval);\n return () => window.clearInterval(timer);\n }, [autoplay, autoplayInterval, disabled, getNextIndex, indexCount, paused, setIndex]);\n\n const value = useMemo<CarouselContextValue>(\n () => ({\n currentIndex,\n disabled,\n endSwipe,\n getNextIndex,\n indexCount,\n loop,\n moveSwipe,\n onKeyDown: onRootKeyDown,\n orientation,\n registerIndex,\n setIndex,\n startSwipe,\n styles,\n }),\n [\n currentIndex,\n disabled,\n endSwipe,\n getNextIndex,\n indexCount,\n loop,\n moveSwipe,\n onRootKeyDown,\n orientation,\n registerIndex,\n setIndex,\n startSwipe,\n styles,\n ],\n );\n\n return (\n <CarouselContext.Provider value={value}>\n <section\n {...props}\n ref={ref}\n aria-roledescription=\"carousel\"\n className={cx(styles.root, className)}\n data-jaci-component=\"carousel\"\n data-orientation={orientation}\n data-slot=\"carousel\"\n data-state={paused ? \"paused\" : \"running\"}\n role=\"region\"\n tabIndex={disabled ? -1 : 0}\n onBlur={(event: FocusEvent<HTMLElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setFocusWithin(false);\n if (pauseOnFocus) setPaused(false);\n }\n onBlur?.(event);\n }}\n onFocus={(event: FocusEvent<HTMLElement>) => {\n setFocusWithin(true);\n if (pauseOnFocus) {\n setPaused(true);\n }\n onFocus?.(event);\n }}\n onKeyDown={onRootKeyDown}\n onPointerCancel={endSwipe}\n onPointerDown={startSwipe}\n onPointerEnter={(event) => {\n if (pauseOnHover) setPaused(true);\n onPointerEnter?.(event);\n }}\n onPointerLeave={(event) => {\n if (pauseOnHover && !(pauseOnFocus && focusWithin)) setPaused(false);\n onPointerLeave?.(event);\n }}\n onPointerMove={moveSwipe}\n onPointerUp={endSwipe}\n style={{ \"--jaci-carousel-index\": currentIndex, ...style } as CSSProperties}\n >\n {children}\n </section>\n </CarouselContext.Provider>\n );\n});\n\nexport type CarouselViewportProps = ComponentPropsWithoutRef<\"div\">;\nexport const CarouselViewport = forwardRef<HTMLDivElement, CarouselViewportProps>(\n function CarouselViewport({ className, ...props }, ref) {\n const { styles } = useCarouselContext();\n return (\n <div\n {...props}\n ref={ref}\n className={cx(styles.viewport, className)}\n data-slot=\"carousel-viewport\"\n />\n );\n },\n);\n\nexport type CarouselTrackProps = ComponentPropsWithoutRef<\"div\">;\nexport const CarouselTrack = forwardRef<HTMLDivElement, CarouselTrackProps>(function CarouselTrack(\n { className, style, ...props },\n ref,\n) {\n const { currentIndex, orientation, styles } = useCarouselContext();\n const transform =\n orientation === \"horizontal\"\n ? `translateX(-${currentIndex * 100}%)`\n : `translateY(-${currentIndex * 100}%)`;\n return (\n <div\n {...props}\n ref={ref}\n className={cx(styles.track, className)}\n data-slot=\"carousel-track\"\n style={{ transform, ...style }}\n />\n );\n});\n\nexport interface CarouselItemProps extends ComponentPropsWithoutRef<\"div\"> {\n index: number;\n}\nexport const CarouselItem = forwardRef<HTMLDivElement, CarouselItemProps>(function CarouselItem(\n { children, className, index, ...props },\n ref,\n) {\n const { currentIndex, registerIndex, styles } = useCarouselContext();\n useEffect(() => registerIndex(index), [index, registerIndex]);\n const active = currentIndex === index;\n return (\n // biome-ignore lint/a11y/useSemanticElements: carousel slides use the ARIA group role.\n <div\n {...props}\n ref={ref}\n aria-hidden={!active}\n aria-roledescription=\"slide\"\n className={cx(styles.item, className)}\n data-index={index}\n data-jaci-component=\"carousel-item\"\n data-selected={active || undefined}\n data-slot=\"carousel-item\"\n role=\"group\"\n tabIndex={active ? 0 : -1}\n >\n {children}\n </div>\n );\n});\n\nfunction createSimpleSlot(slot: \"media\" | \"caption\" | \"title\" | \"description\") {\n return forwardRef<HTMLElement, ComponentPropsWithoutRef<\"div\">>(function CarouselSlot(\n { className, ...props },\n ref,\n ) {\n const { styles } = useCarouselContext();\n if (slot === \"title\")\n return (\n <h3\n {...props}\n ref={ref as Ref<HTMLHeadingElement>}\n className={cx(styles.title, className)}\n data-slot={`carousel-${slot}`}\n />\n );\n if (slot === \"description\")\n return (\n <p\n {...props}\n ref={ref as Ref<HTMLParagraphElement>}\n className={cx(styles.description, className)}\n data-slot={`carousel-${slot}`}\n />\n );\n return (\n <div\n {...props}\n ref={ref as Ref<HTMLDivElement>}\n className={cx(styles[slot], className)}\n data-slot={`carousel-${slot}`}\n />\n );\n });\n}\n\nexport const CarouselMedia = createSimpleSlot(\"media\");\nexport const CarouselCaption = createSimpleSlot(\"caption\");\nexport const CarouselTitle = createSimpleSlot(\"title\");\nexport const CarouselDescription = createSimpleSlot(\"description\");\n\nexport interface CarouselControlProps extends ComponentPropsWithoutRef<\"button\"> {\n children?: ReactNode;\n}\nexport const CarouselPrevious = forwardRef<HTMLButtonElement, CarouselControlProps>(\n function CarouselPrevious(\n { \"aria-label\": ariaLabel = \"Previous slide\", children, className, disabled, ...props },\n ref,\n ) {\n const {\n disabled: contextDisabled,\n getNextIndex,\n orientation,\n setIndex,\n styles,\n } = useCarouselContext();\n return (\n <button\n {...props}\n ref={ref}\n aria-label={ariaLabel}\n className={cx(styles.control, className)}\n data-slot=\"carousel-previous\"\n disabled={disabled ?? contextDisabled}\n onClick={() => setIndex(getNextIndex(-1))}\n type=\"button\"\n >\n {children ?? (orientation === \"vertical\" ? \"↑\" : \"‹\")}\n </button>\n );\n },\n);\n\nexport const CarouselNext = forwardRef<HTMLButtonElement, CarouselControlProps>(\n function CarouselNext(\n { \"aria-label\": ariaLabel = \"Next slide\", children, className, disabled, ...props },\n ref,\n ) {\n const {\n disabled: contextDisabled,\n getNextIndex,\n orientation,\n setIndex,\n styles,\n } = useCarouselContext();\n return (\n <button\n {...props}\n ref={ref}\n aria-label={ariaLabel}\n className={cx(styles.control, className)}\n data-slot=\"carousel-next\"\n disabled={disabled ?? contextDisabled}\n onClick={() => setIndex(getNextIndex(1))}\n type=\"button\"\n >\n {children ?? (orientation === \"vertical\" ? \"↓\" : \"›\")}\n </button>\n );\n },\n);\n\nexport interface CarouselIndicatorProps extends ComponentPropsWithoutRef<\"button\"> {\n index: number;\n}\nexport const CarouselIndicator = forwardRef<HTMLButtonElement, CarouselIndicatorProps>(\n function CarouselIndicator({ \"aria-label\": ariaLabel, className, index, ...props }, ref) {\n const { currentIndex, disabled, setIndex, styles } = useCarouselContext();\n return (\n <button\n {...props}\n ref={ref}\n aria-label={ariaLabel ?? `Go to slide ${index + 1}`}\n aria-selected={currentIndex === index}\n className={cx(styles.indicator, className)}\n data-selected={currentIndex === index || undefined}\n data-slot=\"carousel-indicator\"\n disabled={disabled}\n onClick={() => setIndex(index)}\n role=\"tab\"\n type=\"button\"\n />\n );\n },\n);\n\nexport const CarouselIndicators = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<\"div\">>(\n function CarouselIndicators({ children, className, ...props }, ref) {\n const { indexCount, styles } = useCarouselContext();\n return (\n <div\n {...props}\n ref={ref}\n aria-label=\"Slides\"\n className={cx(styles.indicators, className)}\n data-slot=\"carousel-indicators\"\n role=\"tablist\"\n >\n {children ??\n Array.from({ length: indexCount }, (_, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: indicators are stable by slide index.\n <CarouselIndicator index={index} key={`indicator-${index}`} />\n ))}\n </div>\n );\n },\n);\n\nexport const Carousel = {\n Root: CarouselRoot,\n Viewport: CarouselViewport,\n Track: CarouselTrack,\n Item: CarouselItem,\n Media: CarouselMedia,\n Caption: CarouselCaption,\n Title: CarouselTitle,\n Description: CarouselDescription,\n Previous: CarouselPrevious,\n Next: CarouselNext,\n Indicators: CarouselIndicators,\n Indicator: CarouselIndicator,\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Carousel, CarouselControlProps, CarouselIndicatorProps, CarouselItemProps, CarouselOrientation, CarouselRootProps, CarouselTrackProps, CarouselViewportProps } from "./carousel.cjs";
2
+ export { Carousel, type CarouselControlProps, type CarouselIndicatorProps, type CarouselItemProps, type CarouselOrientation, type CarouselRootProps, type CarouselTrackProps, type CarouselViewportProps };
@@ -0,0 +1,2 @@
1
+ import { Carousel, CarouselControlProps, CarouselIndicatorProps, CarouselItemProps, CarouselOrientation, CarouselRootProps, CarouselTrackProps, CarouselViewportProps } from "./carousel.js";
2
+ export { Carousel, type CarouselControlProps, type CarouselIndicatorProps, type CarouselItemProps, type CarouselOrientation, type CarouselRootProps, type CarouselTrackProps, type CarouselViewportProps };
@@ -3,24 +3,51 @@ const require_code = require("../../styled-system/recipes/code.cjs");
3
3
  let react = require("react");
4
4
  let react_jsx_runtime = require("react/jsx-runtime");
5
5
  //#region src/components/code/code.tsx
6
- const Code = (0, react.forwardRef)(function Code({ children, className, language, truncate = false, variant = "inline", wrap = false, ...props }, ref) {
6
+ function getTextLines(children) {
7
+ const nodes = react.Children.toArray(children);
8
+ if (!nodes.every((node) => typeof node === "string" || typeof node === "number")) return null;
9
+ return nodes.map(String).join("").split("\n");
10
+ }
11
+ function getLineKeys(lines) {
12
+ const occurrences = /* @__PURE__ */ new Map();
13
+ return lines.map((line) => {
14
+ const occurrence = occurrences.get(line) ?? 0;
15
+ occurrences.set(line, occurrence + 1);
16
+ return `line-${line}-${occurrence}`;
17
+ });
18
+ }
19
+ const Code = (0, react.forwardRef)(function Code({ children, className, language, lineNumbers = false, truncate = false, variant = "inline", wrap = false, ...props }, ref) {
20
+ const lines = variant === "block" && lineNumbers ? getTextLines(children) : null;
21
+ const lineKeys = lines ? getLineKeys(lines) : null;
7
22
  const classNames = require_cx.cx(require_code.code({
23
+ lineNumbers: Boolean(lines),
8
24
  truncate,
9
25
  variant,
10
26
  wrap
11
27
  }), className);
12
- if (variant === "block") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
28
+ if (variant === "block") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("pre", {
13
29
  ...props,
14
30
  ref,
15
31
  className: classNames,
16
32
  "data-jaci-component": "code",
17
33
  "data-language": language || void 0,
34
+ "data-line-numbers": lines ? "true" : void 0,
18
35
  "data-slot": "code",
19
36
  "data-variant": variant,
20
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
37
+ children: [lines ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38
+ "aria-hidden": "true",
39
+ "data-slot": "code-gutter",
40
+ children: lines.map((_, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
41
+ "data-slot": "code-line-number",
42
+ children: index + 1
43
+ }, lineKeys?.[index]))
44
+ }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
21
45
  "data-slot": "code-content",
22
- children
23
- })
46
+ children: lines ? lines.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47
+ "data-slot": "code-line",
48
+ children: [line, index < lines.length - 1 ? "\n" : null]
49
+ }, lineKeys?.[index])) : children
50
+ })]
24
51
  });
25
52
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
26
53
  ...props,
@@ -1 +1 @@
1
- {"version":3,"file":"code.cjs","names":["cx","code"],"sources":["../../../src/components/code/code.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { code } from \"../../styled-system/recipes\";\n\nexport type CodeVariant = \"inline\" | \"block\";\n\nexport interface CodeProps extends Omit<ComponentPropsWithoutRef<\"code\">, \"children\"> {\n children?: ReactNode;\n variant?: CodeVariant;\n language?: string;\n wrap?: boolean;\n truncate?: boolean;\n}\n\nexport const Code = forwardRef<HTMLElement, CodeProps>(function Code(\n { children, className, language, truncate = false, variant = \"inline\", wrap = false, ...props },\n ref,\n) {\n const classNames = cx(code({ truncate, variant, wrap }), className);\n\n if (variant === \"block\") {\n return (\n <pre\n {...props}\n ref={ref as React.Ref<HTMLPreElement>}\n className={classNames}\n data-jaci-component=\"code\"\n data-language={language || undefined}\n data-slot=\"code\"\n data-variant={variant}\n >\n <code data-slot=\"code-content\">{children}</code>\n </pre>\n );\n }\n\n return (\n <code\n {...props}\n ref={ref as React.Ref<HTMLElement>}\n className={classNames}\n data-jaci-component=\"code\"\n data-language={language || undefined}\n data-slot=\"code\"\n data-variant={variant}\n >\n {children}\n </code>\n );\n});\n"],"mappings":";;;;;AAgBA,MAAa,QAAA,GAAA,MAAA,WAAA,CAA0C,SAAS,KAC9D,EAAE,UAAU,WAAW,UAAU,WAAW,OAAO,UAAU,UAAU,OAAO,OAAO,GAAG,SACxF,KACA;CACA,MAAM,aAAaA,WAAAA,GAAGC,aAAAA,KAAK;EAAE;EAAU;EAAS;CAAK,CAAC,GAAG,SAAS;CAElE,IAAI,YAAY,SACd,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,GAAI;EACC;EACL,WAAW;EACX,uBAAoB;EACpB,iBAAe,YAAY,KAAA;EAC3B,aAAU;EACV,gBAAc;YAEd,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,aAAU;GAAgB;EAAe,CAAA;CAC5C,CAAA;CAIT,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EACE,GAAI;EACC;EACL,WAAW;EACX,uBAAoB;EACpB,iBAAe,YAAY,KAAA;EAC3B,aAAU;EACV,gBAAc;EAEb;CACG,CAAA;AAEV,CAAC"}
1
+ {"version":3,"file":"code.cjs","names":["Children","cx","code"],"sources":["../../../src/components/code/code.tsx"],"sourcesContent":["import { Children, forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { code } from \"../../styled-system/recipes\";\n\nexport type CodeVariant = \"inline\" | \"block\";\n\nexport interface CodeProps extends Omit<ComponentPropsWithoutRef<\"code\">, \"children\"> {\n children?: ReactNode;\n variant?: CodeVariant;\n language?: string;\n wrap?: boolean;\n truncate?: boolean;\n lineNumbers?: boolean;\n}\n\nfunction getTextLines(children: ReactNode) {\n const nodes = Children.toArray(children);\n if (!nodes.every((node) => typeof node === \"string\" || typeof node === \"number\")) return null;\n return nodes.map(String).join(\"\").split(\"\\n\");\n}\n\nfunction getLineKeys(lines: readonly string[]) {\n const occurrences = new Map<string, number>();\n return lines.map((line) => {\n const occurrence = occurrences.get(line) ?? 0;\n occurrences.set(line, occurrence + 1);\n return `line-${line}-${occurrence}`;\n });\n}\n\nexport const Code = forwardRef<HTMLElement, CodeProps>(function Code(\n {\n children,\n className,\n language,\n lineNumbers = false,\n truncate = false,\n variant = \"inline\",\n wrap = false,\n ...props\n },\n ref,\n) {\n const lines = variant === \"block\" && lineNumbers ? getTextLines(children) : null;\n const lineKeys = lines ? getLineKeys(lines) : null;\n const classNames = cx(code({ lineNumbers: Boolean(lines), truncate, variant, wrap }), className);\n\n if (variant === \"block\") {\n return (\n <pre\n {...props}\n ref={ref as React.Ref<HTMLPreElement>}\n className={classNames}\n data-jaci-component=\"code\"\n data-language={language || undefined}\n data-line-numbers={lines ? \"true\" : undefined}\n data-slot=\"code\"\n data-variant={variant}\n >\n {lines ? (\n <span aria-hidden=\"true\" data-slot=\"code-gutter\">\n {lines.map((_, index) => (\n <span data-slot=\"code-line-number\" key={lineKeys?.[index]}>\n {index + 1}\n </span>\n ))}\n </span>\n ) : null}\n <code data-slot=\"code-content\">\n {lines\n ? lines.map((line, index) => (\n <span data-slot=\"code-line\" key={lineKeys?.[index]}>\n {line}\n {index < lines.length - 1 ? \"\\n\" : null}\n </span>\n ))\n : children}\n </code>\n </pre>\n );\n }\n\n return (\n <code\n {...props}\n ref={ref as React.Ref<HTMLElement>}\n className={classNames}\n data-jaci-component=\"code\"\n data-language={language || undefined}\n data-slot=\"code\"\n data-variant={variant}\n >\n {children}\n </code>\n );\n});\n"],"mappings":";;;;;AAiBA,SAAS,aAAa,UAAqB;CACzC,MAAM,QAAQA,MAAAA,SAAS,QAAQ,QAAQ;CACvC,IAAI,CAAC,MAAM,OAAO,SAAS,OAAO,SAAS,YAAY,OAAO,SAAS,QAAQ,GAAG,OAAO;CACzF,OAAO,MAAM,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,IAAI;AAC9C;AAEA,SAAS,YAAY,OAA0B;CAC7C,MAAM,8BAAc,IAAI,IAAoB;CAC5C,OAAO,MAAM,KAAK,SAAS;EACzB,MAAM,aAAa,YAAY,IAAI,IAAI,KAAK;EAC5C,YAAY,IAAI,MAAM,aAAa,CAAC;EACpC,OAAO,QAAQ,KAAK,GAAG;CACzB,CAAC;AACH;AAEA,MAAa,QAAA,GAAA,MAAA,WAAA,CAA0C,SAAS,KAC9D,EACE,UACA,WACA,UACA,cAAc,OACd,WAAW,OACX,UAAU,UACV,OAAO,OACP,GAAG,SAEL,KACA;CACA,MAAM,QAAQ,YAAY,WAAW,cAAc,aAAa,QAAQ,IAAI;CAC5E,MAAM,WAAW,QAAQ,YAAY,KAAK,IAAI;CAC9C,MAAM,aAAaC,WAAAA,GAAGC,aAAAA,KAAK;EAAE,aAAa,QAAQ,KAAK;EAAG;EAAU;EAAS;CAAK,CAAC,GAAG,SAAS;CAE/F,IAAI,YAAY,SACd,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,GAAI;EACC;EACL,WAAW;EACX,uBAAoB;EACpB,iBAAe,YAAY,KAAA;EAC3B,qBAAmB,QAAQ,SAAS,KAAA;EACpC,aAAU;EACV,gBAAc;YARhB,CAUG,QACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,eAAY;GAAO,aAAU;aAChC,MAAM,KAAK,GAAG,UACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,aAAU;cACb,QAAQ;GACL,GAFkC,WAAW,MAE7C,CACP;EACG,CAAA,IACJ,MACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,aAAU;aACb,QACG,MAAM,KAAK,MAAM,UACf,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,aAAU;cAAhB,CACG,MACA,QAAQ,MAAM,SAAS,IAAI,OAAO,IAC/B;MAH2B,WAAW,MAGtC,CACP,IACD;EACA,CAAA,CACH;;CAIT,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EACE,GAAI;EACC;EACL,WAAW;EACX,uBAAoB;EACpB,iBAAe,YAAY,KAAA;EAC3B,aAAU;EACV,gBAAc;EAEb;CACG,CAAA;AAEV,CAAC"}
@@ -7,6 +7,7 @@ interface CodeProps extends Omit<ComponentPropsWithoutRef<"code">, "children"> {
7
7
  language?: string;
8
8
  wrap?: boolean;
9
9
  truncate?: boolean;
10
+ lineNumbers?: boolean;
10
11
  }
11
12
  declare const Code: import("react").ForwardRefExoticComponent<CodeProps & import("react").RefAttributes<HTMLElement>>;
12
13
  //#endregion
@@ -7,6 +7,7 @@ interface CodeProps extends Omit<ComponentPropsWithoutRef<"code">, "children"> {
7
7
  language?: string;
8
8
  wrap?: boolean;
9
9
  truncate?: boolean;
10
+ lineNumbers?: boolean;
10
11
  }
11
12
  declare const Code: import("react").ForwardRefExoticComponent<CodeProps & import("react").RefAttributes<HTMLElement>>;
12
13
  //#endregion
@@ -1,26 +1,53 @@
1
1
  import { cx } from "../../styled-system/css/cx.js";
2
2
  import { code } from "../../styled-system/recipes/code.js";
3
- import { forwardRef } from "react";
4
- import { jsx } from "react/jsx-runtime";
3
+ import { Children, forwardRef } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/code/code.tsx
6
- const Code = forwardRef(function Code({ children, className, language, truncate = false, variant = "inline", wrap = false, ...props }, ref) {
6
+ function getTextLines(children) {
7
+ const nodes = Children.toArray(children);
8
+ if (!nodes.every((node) => typeof node === "string" || typeof node === "number")) return null;
9
+ return nodes.map(String).join("").split("\n");
10
+ }
11
+ function getLineKeys(lines) {
12
+ const occurrences = /* @__PURE__ */ new Map();
13
+ return lines.map((line) => {
14
+ const occurrence = occurrences.get(line) ?? 0;
15
+ occurrences.set(line, occurrence + 1);
16
+ return `line-${line}-${occurrence}`;
17
+ });
18
+ }
19
+ const Code = forwardRef(function Code({ children, className, language, lineNumbers = false, truncate = false, variant = "inline", wrap = false, ...props }, ref) {
20
+ const lines = variant === "block" && lineNumbers ? getTextLines(children) : null;
21
+ const lineKeys = lines ? getLineKeys(lines) : null;
7
22
  const classNames = cx(code({
23
+ lineNumbers: Boolean(lines),
8
24
  truncate,
9
25
  variant,
10
26
  wrap
11
27
  }), className);
12
- if (variant === "block") return /* @__PURE__ */ jsx("pre", {
28
+ if (variant === "block") return /* @__PURE__ */ jsxs("pre", {
13
29
  ...props,
14
30
  ref,
15
31
  className: classNames,
16
32
  "data-jaci-component": "code",
17
33
  "data-language": language || void 0,
34
+ "data-line-numbers": lines ? "true" : void 0,
18
35
  "data-slot": "code",
19
36
  "data-variant": variant,
20
- children: /* @__PURE__ */ jsx("code", {
37
+ children: [lines ? /* @__PURE__ */ jsx("span", {
38
+ "aria-hidden": "true",
39
+ "data-slot": "code-gutter",
40
+ children: lines.map((_, index) => /* @__PURE__ */ jsx("span", {
41
+ "data-slot": "code-line-number",
42
+ children: index + 1
43
+ }, lineKeys?.[index]))
44
+ }) : null, /* @__PURE__ */ jsx("code", {
21
45
  "data-slot": "code-content",
22
- children
23
- })
46
+ children: lines ? lines.map((line, index) => /* @__PURE__ */ jsxs("span", {
47
+ "data-slot": "code-line",
48
+ children: [line, index < lines.length - 1 ? "\n" : null]
49
+ }, lineKeys?.[index])) : children
50
+ })]
24
51
  });
25
52
  return /* @__PURE__ */ jsx("code", {
26
53
  ...props,
@@ -1 +1 @@
1
- {"version":3,"file":"code.js","names":[],"sources":["../../../src/components/code/code.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { code } from \"../../styled-system/recipes\";\n\nexport type CodeVariant = \"inline\" | \"block\";\n\nexport interface CodeProps extends Omit<ComponentPropsWithoutRef<\"code\">, \"children\"> {\n children?: ReactNode;\n variant?: CodeVariant;\n language?: string;\n wrap?: boolean;\n truncate?: boolean;\n}\n\nexport const Code = forwardRef<HTMLElement, CodeProps>(function Code(\n { children, className, language, truncate = false, variant = \"inline\", wrap = false, ...props },\n ref,\n) {\n const classNames = cx(code({ truncate, variant, wrap }), className);\n\n if (variant === \"block\") {\n return (\n <pre\n {...props}\n ref={ref as React.Ref<HTMLPreElement>}\n className={classNames}\n data-jaci-component=\"code\"\n data-language={language || undefined}\n data-slot=\"code\"\n data-variant={variant}\n >\n <code data-slot=\"code-content\">{children}</code>\n </pre>\n );\n }\n\n return (\n <code\n {...props}\n ref={ref as React.Ref<HTMLElement>}\n className={classNames}\n data-jaci-component=\"code\"\n data-language={language || undefined}\n data-slot=\"code\"\n data-variant={variant}\n >\n {children}\n </code>\n );\n});\n"],"mappings":";;;;;AAgBA,MAAa,OAAO,WAAmC,SAAS,KAC9D,EAAE,UAAU,WAAW,UAAU,WAAW,OAAO,UAAU,UAAU,OAAO,OAAO,GAAG,SACxF,KACA;CACA,MAAM,aAAa,GAAG,KAAK;EAAE;EAAU;EAAS;CAAK,CAAC,GAAG,SAAS;CAElE,IAAI,YAAY,SACd,OACE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,WAAW;EACX,uBAAoB;EACpB,iBAAe,YAAY,KAAA;EAC3B,aAAU;EACV,gBAAc;YAEd,oBAAC,QAAD;GAAM,aAAU;GAAgB;EAAe,CAAA;CAC5C,CAAA;CAIT,OACE,oBAAC,QAAD;EACE,GAAI;EACC;EACL,WAAW;EACX,uBAAoB;EACpB,iBAAe,YAAY,KAAA;EAC3B,aAAU;EACV,gBAAc;EAEb;CACG,CAAA;AAEV,CAAC"}
1
+ {"version":3,"file":"code.js","names":[],"sources":["../../../src/components/code/code.tsx"],"sourcesContent":["import { Children, forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { code } from \"../../styled-system/recipes\";\n\nexport type CodeVariant = \"inline\" | \"block\";\n\nexport interface CodeProps extends Omit<ComponentPropsWithoutRef<\"code\">, \"children\"> {\n children?: ReactNode;\n variant?: CodeVariant;\n language?: string;\n wrap?: boolean;\n truncate?: boolean;\n lineNumbers?: boolean;\n}\n\nfunction getTextLines(children: ReactNode) {\n const nodes = Children.toArray(children);\n if (!nodes.every((node) => typeof node === \"string\" || typeof node === \"number\")) return null;\n return nodes.map(String).join(\"\").split(\"\\n\");\n}\n\nfunction getLineKeys(lines: readonly string[]) {\n const occurrences = new Map<string, number>();\n return lines.map((line) => {\n const occurrence = occurrences.get(line) ?? 0;\n occurrences.set(line, occurrence + 1);\n return `line-${line}-${occurrence}`;\n });\n}\n\nexport const Code = forwardRef<HTMLElement, CodeProps>(function Code(\n {\n children,\n className,\n language,\n lineNumbers = false,\n truncate = false,\n variant = \"inline\",\n wrap = false,\n ...props\n },\n ref,\n) {\n const lines = variant === \"block\" && lineNumbers ? getTextLines(children) : null;\n const lineKeys = lines ? getLineKeys(lines) : null;\n const classNames = cx(code({ lineNumbers: Boolean(lines), truncate, variant, wrap }), className);\n\n if (variant === \"block\") {\n return (\n <pre\n {...props}\n ref={ref as React.Ref<HTMLPreElement>}\n className={classNames}\n data-jaci-component=\"code\"\n data-language={language || undefined}\n data-line-numbers={lines ? \"true\" : undefined}\n data-slot=\"code\"\n data-variant={variant}\n >\n {lines ? (\n <span aria-hidden=\"true\" data-slot=\"code-gutter\">\n {lines.map((_, index) => (\n <span data-slot=\"code-line-number\" key={lineKeys?.[index]}>\n {index + 1}\n </span>\n ))}\n </span>\n ) : null}\n <code data-slot=\"code-content\">\n {lines\n ? lines.map((line, index) => (\n <span data-slot=\"code-line\" key={lineKeys?.[index]}>\n {line}\n {index < lines.length - 1 ? \"\\n\" : null}\n </span>\n ))\n : children}\n </code>\n </pre>\n );\n }\n\n return (\n <code\n {...props}\n ref={ref as React.Ref<HTMLElement>}\n className={classNames}\n data-jaci-component=\"code\"\n data-language={language || undefined}\n data-slot=\"code\"\n data-variant={variant}\n >\n {children}\n </code>\n );\n});\n"],"mappings":";;;;;AAiBA,SAAS,aAAa,UAAqB;CACzC,MAAM,QAAQ,SAAS,QAAQ,QAAQ;CACvC,IAAI,CAAC,MAAM,OAAO,SAAS,OAAO,SAAS,YAAY,OAAO,SAAS,QAAQ,GAAG,OAAO;CACzF,OAAO,MAAM,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,IAAI;AAC9C;AAEA,SAAS,YAAY,OAA0B;CAC7C,MAAM,8BAAc,IAAI,IAAoB;CAC5C,OAAO,MAAM,KAAK,SAAS;EACzB,MAAM,aAAa,YAAY,IAAI,IAAI,KAAK;EAC5C,YAAY,IAAI,MAAM,aAAa,CAAC;EACpC,OAAO,QAAQ,KAAK,GAAG;CACzB,CAAC;AACH;AAEA,MAAa,OAAO,WAAmC,SAAS,KAC9D,EACE,UACA,WACA,UACA,cAAc,OACd,WAAW,OACX,UAAU,UACV,OAAO,OACP,GAAG,SAEL,KACA;CACA,MAAM,QAAQ,YAAY,WAAW,cAAc,aAAa,QAAQ,IAAI;CAC5E,MAAM,WAAW,QAAQ,YAAY,KAAK,IAAI;CAC9C,MAAM,aAAa,GAAG,KAAK;EAAE,aAAa,QAAQ,KAAK;EAAG;EAAU;EAAS;CAAK,CAAC,GAAG,SAAS;CAE/F,IAAI,YAAY,SACd,OACE,qBAAC,OAAD;EACE,GAAI;EACC;EACL,WAAW;EACX,uBAAoB;EACpB,iBAAe,YAAY,KAAA;EAC3B,qBAAmB,QAAQ,SAAS,KAAA;EACpC,aAAU;EACV,gBAAc;YARhB,CAUG,QACC,oBAAC,QAAD;GAAM,eAAY;GAAO,aAAU;aAChC,MAAM,KAAK,GAAG,UACb,oBAAC,QAAD;IAAM,aAAU;cACb,QAAQ;GACL,GAFkC,WAAW,MAE7C,CACP;EACG,CAAA,IACJ,MACJ,oBAAC,QAAD;GAAM,aAAU;aACb,QACG,MAAM,KAAK,MAAM,UACf,qBAAC,QAAD;IAAM,aAAU;cAAhB,CACG,MACA,QAAQ,MAAM,SAAS,IAAI,OAAO,IAC/B;MAH2B,WAAW,MAGtC,CACP,IACD;EACA,CAAA,CACH;;CAIT,OACE,oBAAC,QAAD;EACE,GAAI;EACC;EACL,WAAW;EACX,uBAAoB;EACpB,iBAAe,YAAY,KAAA;EAC3B,aAAU;EACV,gBAAc;EAEb;CACG,CAAA;AAEV,CAAC"}
@@ -2,6 +2,7 @@
2
2
  const require_cx = require("../../styled-system/css/cx.cjs");
3
3
  const require_base_ui = require("../base-ui.cjs");
4
4
  const require_color_picker = require("../../styled-system/recipes/color-picker.cjs");
5
+ const require_theme_scope = require("../../theme/theme-scope.cjs");
5
6
  const require_color_utils = require("./color-utils.cjs");
6
7
  let react = require("react");
7
8
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -102,7 +103,9 @@ const ColorPickerValue = (0, react.forwardRef)(function ColorPickerValue({ class
102
103
  children: props.children ?? value
103
104
  });
104
105
  });
105
- const ColorPickerPortal = _base_ui_react_popover.Popover.Portal;
106
+ function ColorPickerPortal(props) {
107
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_popover.Popover.Portal, { ...require_theme_scope.useThemePortalProps(props) });
108
+ }
106
109
  const ColorPickerPositioner = (0, react.forwardRef)(function ColorPickerPositioner({ className, ...props }, ref) {
107
110
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_popover.Popover.Positioner, {
108
111
  ...props,