@dust-tt/sparkle 0.2.502 → 0.2.503-rc-2

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 (36) hide show
  1. package/dist/cjs/index.js +1 -1
  2. package/dist/esm/components/Button.d.ts.map +1 -1
  3. package/dist/esm/components/Popover.d.ts +9 -2
  4. package/dist/esm/components/Popover.d.ts.map +1 -1
  5. package/dist/esm/components/Popover.js +53 -2
  6. package/dist/esm/components/Popover.js.map +1 -1
  7. package/dist/esm/components/RadioGroup.js +3 -3
  8. package/dist/esm/components/index.d.ts +1 -2
  9. package/dist/esm/components/index.d.ts.map +1 -1
  10. package/dist/esm/components/index.js +1 -2
  11. package/dist/esm/components/index.js.map +1 -1
  12. package/dist/esm/stories/AnchoredPopover.stories.d.ts +14 -0
  13. package/dist/esm/stories/AnchoredPopover.stories.d.ts.map +1 -0
  14. package/dist/esm/stories/AnchoredPopover.stories.js +69 -0
  15. package/dist/esm/stories/AnchoredPopover.stories.js.map +1 -0
  16. package/dist/esm/stories/Breadcrumbs.stories.d.ts.map +1 -1
  17. package/dist/esm/stories/Breadcrumbs.stories.js +1 -3
  18. package/dist/esm/stories/Breadcrumbs.stories.js.map +1 -1
  19. package/dist/sparkle.css +8 -127
  20. package/package.json +1 -1
  21. package/src/components/Button.tsx +1 -1
  22. package/src/components/Popover.tsx +93 -5
  23. package/src/components/RadioGroup.tsx +3 -3
  24. package/src/components/index.ts +2 -7
  25. package/src/stories/AnchoredPopover.stories.tsx +115 -0
  26. package/src/stories/Breadcrumbs.stories.tsx +1 -3
  27. package/dist/esm/components/TourGuide.d.ts +0 -39
  28. package/dist/esm/components/TourGuide.d.ts.map +0 -1
  29. package/dist/esm/components/TourGuide.js +0 -145
  30. package/dist/esm/components/TourGuide.js.map +0 -1
  31. package/dist/esm/stories/TourGuide.stories.d.ts +0 -4
  32. package/dist/esm/stories/TourGuide.stories.d.ts.map +0 -1
  33. package/dist/esm/stories/TourGuide.stories.js +0 -133
  34. package/dist/esm/stories/TourGuide.stories.js.map +0 -1
  35. package/src/components/TourGuide.tsx +0 -316
  36. package/src/stories/TourGuide.stories.tsx +0 -472
@@ -1 +0,0 @@
1
- {"version":3,"file":"TourGuide.stories.js","sourceRoot":"","sources":["../../../src/stories/TourGuide.stories.tsx"],"names":[],"mappings":"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"}
@@ -1,316 +0,0 @@
1
- import * as PopoverPrimitive from "@radix-ui/react-popover";
2
- import React, { useEffect, useState } from "react";
3
-
4
- import { Button } from "@sparkle/components/Button";
5
- import { cn } from "@sparkle/lib";
6
-
7
- interface TourGuideCardProps {
8
- anchorRef?: React.RefObject<HTMLDivElement>;
9
- title?: string;
10
- content?: React.ReactNode;
11
- visual?: React.ReactNode;
12
- onNext?: () => void;
13
- onDismiss?: () => void;
14
- isLastStep?: boolean;
15
- className?: string;
16
- children?: React.ReactNode;
17
- asPopover?: boolean;
18
- align?: "start" | "center" | "end";
19
- side?: "top" | "right" | "bottom" | "left";
20
- sideOffset?: number;
21
- currentIndex?: number;
22
- totalCards?: number;
23
- }
24
-
25
- export const TourGuideCardTitle = React.forwardRef<
26
- HTMLDivElement,
27
- React.HTMLAttributes<HTMLDivElement>
28
- >(({ className, children, ...props }, ref) => (
29
- <div
30
- ref={ref}
31
- className={cn("s-heading-lg s-px-3 s-pt-4", className)}
32
- {...props}
33
- >
34
- {children}
35
- </div>
36
- ));
37
- TourGuideCardTitle.displayName = "TourGuideCardTitle";
38
-
39
- export const TourGuideCardContent = React.forwardRef<
40
- HTMLDivElement,
41
- React.HTMLAttributes<HTMLDivElement>
42
- >(({ className, children, ...props }, ref) => (
43
- <div
44
- ref={ref}
45
- className={cn(
46
- "s-copy-base s-px-3 s-text-muted-foreground dark:s-text-muted-foreground-night",
47
- className
48
- )}
49
- {...props}
50
- >
51
- {children}
52
- </div>
53
- ));
54
- TourGuideCardContent.displayName = "TourGuideCardContent";
55
-
56
- export const TourGuideCardVisual = React.forwardRef<
57
- HTMLDivElement,
58
- React.HTMLAttributes<HTMLDivElement>
59
- >(({ className, children, ...props }, ref) => (
60
- <div
61
- ref={ref}
62
- className={cn(
63
- "s-aspect-video s-bg-muted-background dark:s-bg-muted-background-night",
64
- className
65
- )}
66
- {...props}
67
- >
68
- {children}
69
- </div>
70
- ));
71
- TourGuideCardVisual.displayName = "TourGuideCardVisual";
72
-
73
- interface TourGuideCardActionsProps
74
- extends React.HTMLAttributes<HTMLDivElement> {
75
- currentIndex: number;
76
- totalCards: number;
77
- onNext?: () => void;
78
- onDismiss?: () => void;
79
- }
80
-
81
- export const TourGuideCardActions = React.forwardRef<
82
- HTMLDivElement,
83
- TourGuideCardActionsProps
84
- >(
85
- (
86
- {
87
- currentIndex,
88
- totalCards,
89
- onNext,
90
- onDismiss,
91
- className,
92
- children,
93
- ...props
94
- },
95
- ref
96
- ) => {
97
- const isFirstCard = currentIndex === 0;
98
- const isLastCard = currentIndex === totalCards - 1;
99
- const isSingleCard = totalCards === 1;
100
- const showDismiss = !isLastCard && !isSingleCard;
101
-
102
- return (
103
- <div
104
- ref={ref}
105
- className={cn(
106
- "s-flex s-justify-end s-space-x-2 s-p-2 s-pt-4",
107
- className
108
- )}
109
- {...props}
110
- >
111
- {children ? (
112
- children
113
- ) : (
114
- <>
115
- {showDismiss && onDismiss && (
116
- <Button variant="outline" label="Dismiss" onClick={onDismiss} />
117
- )}
118
- {onNext && (
119
- <Button
120
- onClick={onNext}
121
- variant="highlight"
122
- label={
123
- isSingleCard
124
- ? "Ok"
125
- : isFirstCard
126
- ? "Start Tour"
127
- : isLastCard
128
- ? "Done"
129
- : "Next"
130
- }
131
- />
132
- )}
133
- </>
134
- )}
135
- </div>
136
- );
137
- }
138
- );
139
- TourGuideCardActions.displayName = "TourGuideCardActions";
140
-
141
- export const TourGuideCard = React.forwardRef<
142
- HTMLDivElement,
143
- TourGuideCardProps
144
- >(
145
- ({
146
- className,
147
- children,
148
- align = "center",
149
- side = "bottom",
150
- sideOffset = 4,
151
- onNext,
152
- onDismiss,
153
- currentIndex = 0,
154
- totalCards = 1,
155
- }) => {
156
- return (
157
- <PopoverPrimitive.Content
158
- align={align}
159
- side={side}
160
- sideOffset={sideOffset}
161
- className={cn(
162
- "s-z-50 s-w-[420px] s-max-w-xs s-space-y-0.5 s-overflow-hidden s-rounded-2xl s-border s-shadow-xl s-transition-all s-duration-300 s-ease-in-out",
163
- "s-border-highlight-400 s-bg-background s-text-foreground s-ring-2 s-ring-highlight-400/30",
164
- "dark:s-border-border-night dark:s-bg-background-night dark:s-text-foreground-night",
165
- className
166
- )}
167
- onOpenAutoFocus={(e) => e.preventDefault()}
168
- >
169
- {children}
170
- <TourGuideCardActions
171
- currentIndex={currentIndex}
172
- totalCards={totalCards}
173
- onNext={onNext}
174
- onDismiss={onDismiss}
175
- />
176
- </PopoverPrimitive.Content>
177
- );
178
- }
179
- );
180
- TourGuideCard.displayName = "TourGuideCard";
181
-
182
- export interface TourGuideProps {
183
- children: React.ReactNode;
184
- autoStart?: boolean;
185
- onStart?: () => void;
186
- onEnd?: () => void;
187
- onDismiss?: () => void;
188
- }
189
-
190
- export function TourGuide({
191
- children,
192
- autoStart = true,
193
- onStart,
194
- onEnd,
195
- onDismiss,
196
- }: TourGuideProps) {
197
- const [currentIndex, setCurrentIndex] = useState(0);
198
- const [isActive, setIsActive] = useState(autoStart);
199
- const [position, setPosition] = useState({
200
- top: "50%",
201
- left: "50%",
202
- width: "0px",
203
- height: "0px",
204
- });
205
-
206
- // Get all TourGuideCard children - memoize to prevent unnecessary re-renders
207
- const cards = React.useMemo(
208
- () =>
209
- React.Children.toArray(children).filter(
210
- (child): child is React.ReactElement<TourGuideCardProps> =>
211
- React.isValidElement(child) && child.type === TourGuideCard
212
- ),
213
- [children]
214
- );
215
-
216
- // Only run on mount and when autoStart changes
217
- useEffect(() => {
218
- if (autoStart) {
219
- setIsActive(true);
220
- setCurrentIndex(0);
221
- onStart?.();
222
- }
223
- }, [autoStart, onStart]);
224
-
225
- // Handle position updates - use requestAnimationFrame to prevent excessive updates
226
- useEffect(() => {
227
- if (!isActive) {
228
- return;
229
- }
230
-
231
- const updatePosition = () => {
232
- const currentCard = cards[currentIndex];
233
- if (!currentCard?.props.anchorRef) {
234
- setPosition({
235
- top: "50%",
236
- left: "50%",
237
- width: "0px",
238
- height: "0px",
239
- });
240
- return;
241
- }
242
-
243
- const element = currentCard.props.anchorRef.current;
244
- if (!element) {
245
- return;
246
- }
247
-
248
- const rect = element.getBoundingClientRect();
249
- setPosition({
250
- top: `${rect.top}px`,
251
- left: `${rect.left}px`,
252
- width: `${rect.width}px`,
253
- height: `${rect.height}px`,
254
- });
255
- };
256
-
257
- // Initial update
258
- updatePosition();
259
-
260
- // Set up resize observer
261
- const resizeObserver = new ResizeObserver(updatePosition);
262
- const currentCard = cards[currentIndex];
263
- if (currentCard?.props.anchorRef?.current) {
264
- resizeObserver.observe(currentCard.props.anchorRef.current);
265
- }
266
-
267
- // Set up scroll listener
268
- window.addEventListener("scroll", updatePosition, true);
269
-
270
- return () => {
271
- resizeObserver.disconnect();
272
- window.removeEventListener("scroll", updatePosition, true);
273
- };
274
- }, [currentIndex, cards, isActive]);
275
-
276
- const handleNext = () => {
277
- if (currentIndex + 1 < cards.length) {
278
- setCurrentIndex(currentIndex + 1);
279
- } else {
280
- setIsActive(false);
281
- onEnd?.();
282
- }
283
- };
284
-
285
- const handleDismiss = () => {
286
- setIsActive(false);
287
- onDismiss?.();
288
- };
289
-
290
- if (!isActive || cards.length === 0) {
291
- return null;
292
- }
293
-
294
- const currentCard = cards[currentIndex];
295
-
296
- return (
297
- <PopoverPrimitive.Root open={isActive} modal={false}>
298
- <PopoverPrimitive.Anchor
299
- className="s-fixed s-transition-all s-duration-300 s-ease-in-out"
300
- style={{
301
- top: position.top,
302
- left: position.left,
303
- width: position.width,
304
- height: position.height,
305
- }}
306
- />
307
- {React.cloneElement(currentCard, {
308
- onNext: handleNext,
309
- onDismiss: handleDismiss,
310
- currentIndex,
311
- totalCards: cards.length,
312
- className: !currentCard.props.anchorRef ? "s-translate-y-[-50%]" : "",
313
- })}
314
- </PopoverPrimitive.Root>
315
- );
316
- }