@solostylist/ui-kit 1.0.102 → 1.0.104

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.
@@ -0,0 +1,52 @@
1
+ interface UseScrollAnimationOptions {
2
+ threshold?: number;
3
+ rootMargin?: string;
4
+ delay?: number;
5
+ direction?: 'up' | 'down' | 'left' | 'right';
6
+ distance?: number;
7
+ }
8
+ /**
9
+ * A React hook that provides scroll-triggered animation capabilities using Intersection Observer API.
10
+ *
11
+ * This hook monitors when an element enters the viewport and provides animation state and positioning
12
+ * data that can be used with CSS transitions, Framer Motion, or other animation libraries.
13
+ *
14
+ * @param options - Configuration options for the scroll animation
15
+ * @param options.threshold - A number between 0 and 1 indicating the percentage of the target that must be visible within the root element for the callback to be executed. Defaults to 0.1 (10%)
16
+ * @param options.rootMargin - Margin around the root element (similar to CSS margin). Defaults to '0px'
17
+ * @param options.delay - Delay in milliseconds before triggering the animation. Defaults to 0
18
+ * @param options.direction - The direction from which the element should animate in. Defaults to 'up'
19
+ * @param options.distance - The distance in pixels the element should animate from. Defaults to 50
20
+ *
21
+ * @returns An object containing:
22
+ * - ref: React ref to attach to the target element
23
+ * - isInView: Boolean indicating if the element is currently in view
24
+ * - initialPosition: Object with initial x/y coordinates and opacity for animation
25
+ * - finalPosition: Object with final x/y coordinates and opacity for animation
26
+ * - animate: Boolean indicating if animation should be triggered (same as isInView)
27
+ *
28
+ */
29
+ export declare function useScrollAnimation(options?: UseScrollAnimationOptions): {
30
+ ref: import('react').RefObject<HTMLElement | null>;
31
+ isInView: boolean;
32
+ initialPosition: {
33
+ y: number;
34
+ opacity: number;
35
+ x?: undefined;
36
+ } | {
37
+ x: number;
38
+ opacity: number;
39
+ y?: undefined;
40
+ };
41
+ finalPosition: {
42
+ y: number;
43
+ opacity: number;
44
+ x?: undefined;
45
+ } | {
46
+ x: number;
47
+ opacity: number;
48
+ y?: undefined;
49
+ };
50
+ animate: boolean;
51
+ };
52
+ export {};
@@ -0,0 +1,57 @@
1
+ import { useState as m, useRef as f, useEffect as w } from "react";
2
+ function I(p = {}) {
3
+ const { threshold: o = 0.1, rootMargin: s = "0px", delay: i = 0, direction: a = "up", distance: t = 50 } = p, [l, r] = m(!1), c = f(null), e = f(null);
4
+ w(() => {
5
+ if (!c.current) return;
6
+ if (!("IntersectionObserver" in window)) {
7
+ r(!0);
8
+ return;
9
+ }
10
+ const n = new IntersectionObserver(
11
+ ([u]) => {
12
+ u.isIntersecting ? (e.current && (clearTimeout(e.current), e.current = null), i > 0 ? e.current = setTimeout(() => {
13
+ r(!0), n.unobserve(u.target);
14
+ }, i) : (r(!0), n.unobserve(u.target))) : (e.current && (clearTimeout(e.current), e.current = null), r(!1));
15
+ },
16
+ { threshold: o, rootMargin: s }
17
+ );
18
+ return n.observe(c.current), () => {
19
+ e.current && (clearTimeout(e.current), e.current = null), n.disconnect();
20
+ };
21
+ }, [o, s, i]);
22
+ const y = () => {
23
+ switch (a) {
24
+ case "up":
25
+ return { y: t, opacity: 0 };
26
+ case "down":
27
+ return { y: -t, opacity: 0 };
28
+ case "left":
29
+ return { x: t, opacity: 0 };
30
+ case "right":
31
+ return { x: -t, opacity: 0 };
32
+ default:
33
+ return { y: t, opacity: 0 };
34
+ }
35
+ }, d = () => {
36
+ switch (a) {
37
+ case "up":
38
+ case "down":
39
+ return { y: 0, opacity: 1 };
40
+ case "left":
41
+ case "right":
42
+ return { x: 0, opacity: 1 };
43
+ default:
44
+ return { y: 0, opacity: 1 };
45
+ }
46
+ };
47
+ return {
48
+ ref: c,
49
+ isInView: l,
50
+ initialPosition: y(),
51
+ finalPosition: d(),
52
+ animate: l
53
+ };
54
+ }
55
+ export {
56
+ I as useScrollAnimation
57
+ };
package/dist/main.d.ts CHANGED
@@ -82,6 +82,10 @@ export { default as SGlowButton } from './s-glow-button/index';
82
82
  export type { SGlowButtonProps } from './s-glow-button/index';
83
83
  export { default as SMovingBorder } from './s-moving-border/index';
84
84
  export type { SMovingBorderProps } from './s-moving-border/index';
85
+ export { default as SScrollReveal } from './s-scroll-reveal/index';
86
+ export type { SScrollRevealProps } from './s-scroll-reveal/index';
87
+ export { default as SSpotlightCursor } from './s-spotlight-cursor/index';
88
+ export type { SSpotlightCursorProps, SpotlightConfig } from './s-spotlight-cursor/index';
85
89
  export { default as SCopyableText } from './s-copyable-text/index';
86
90
  export type { SCopyableTextProps } from './s-copyable-text/index';
87
91
  export { default as SInteractiveGallery, MediaItem } from './s-interactive-gallery/index';
@@ -103,5 +107,7 @@ export { STabs, STab, STabPanel } from './s-tabs/index';
103
107
  export type { STabsProps, STabItem, STabProps, STabPanelProps } from './s-tabs/index';
104
108
  export { default as STextShimmer } from './s-text-shimmer/index';
105
109
  export type { STextShimmerProps } from './s-text-shimmer/index';
110
+ export { default as STypewriterText } from './s-typewriter-text/index';
111
+ export type { STypewriterTextProps } from './s-typewriter-text/index';
106
112
  export * from './hooks';
107
113
  export * from './utils';
package/dist/main.js CHANGED
@@ -1,20 +1,20 @@
1
- import { default as a } from "./s-accordion/s-accordion.js";
1
+ import { default as t } from "./s-accordion/s-accordion.js";
2
2
  import { default as f } from "./s-autocomplete/s-autocomplete.js";
3
- import { default as m } from "./s-avatar/s-avatar.js";
3
+ import { default as s } from "./s-avatar/s-avatar.js";
4
4
  import { default as p } from "./s-button/s-button.js";
5
- import { default as S } from "./s-button-link/s-button-link.js";
5
+ import { default as d } from "./s-button-link/s-button-link.js";
6
6
  import { default as u } from "./s-carousel/s-carousel.js";
7
7
  import { default as n } from "./s-chat-input/s-chat-input.js";
8
8
  import { default as c } from "./s-chat-message/s-chat-message.js";
9
9
  import { default as C } from "./s-text-editor/s-text-editor.js";
10
10
  import "./s-text-editor/s-text-editor-toolbar.js";
11
- import { default as v } from "./s-checkbox/s-checkbox.js";
11
+ import { default as P } from "./s-checkbox/s-checkbox.js";
12
12
  import { default as b } from "./s-chip/s-chip.js";
13
13
  import { default as I } from "./s-chips/s-chips.js";
14
- import { default as L } from "./s-data-table/s-data-table.js";
15
- import { DialogConfirmProvider as y, default as F, useDialogConfirm as B } from "./s-dialog-confirm/s-dialog-confirm.js";
16
- import { DialogMessageProvider as A, default as E, useDialogMessage as G } from "./s-dialog-message/s-dialog-message.js";
17
- import { default as w } from "./s-error/s-error.js";
14
+ import { default as k } from "./s-data-table/s-data-table.js";
15
+ import { DialogConfirmProvider as L, default as F, useDialogConfirm as B } from "./s-dialog-confirm/s-dialog-confirm.js";
16
+ import { DialogMessageProvider as A, default as E, useDialogMessage as R } from "./s-dialog-message/s-dialog-message.js";
17
+ import { default as G } from "./s-error/s-error.js";
18
18
  import { default as j } from "./s-empty/s-empty.js";
19
19
  import { default as V } from "./s-dialog/s-dialog.js";
20
20
  import { default as H } from "./s-file-dropzone/s-file-dropzone.js";
@@ -24,69 +24,72 @@ import { default as X } from "./s-icon-button/s-icon-button.js";
24
24
  import { default as Z } from "./s-label/s-label.js";
25
25
  import { default as $ } from "./s-multi-select/s-multi-select.js";
26
26
  import { default as oe } from "./s-no-ssr/s-no-ssr.js";
27
- import { default as ae } from "./s-text-field/s-text-field.js";
27
+ import { default as te } from "./s-text-field/s-text-field.js";
28
28
  import { default as fe } from "./s-pagination/s-pagination.js";
29
- import { default as me } from "./s-select/s-select.js";
29
+ import { default as se } from "./s-select/s-select.js";
30
30
  import { default as pe } from "./s-skeleton/s-skeleton.js";
31
- import { default as Se } from "./s-tip/s-tip.js";
31
+ import { default as de } from "./s-tip/s-tip.js";
32
32
  import { default as ue } from "./s-text-truncation/s-text-truncation.js";
33
33
  import { default as ne, SnackbarMessageProvider as ge, useSnackbarMessage as ce } from "./s-snackbar-message/s-snackbar-message.js";
34
34
  import { default as Ce } from "./s-form/s-form.js";
35
- import { SSmartTextField as ve } from "./s-smart-text-field/s-smart-text-field.js";
35
+ import { SSmartTextField as Pe } from "./s-smart-text-field/s-smart-text-field.js";
36
36
  import { SCopilotKitProvider as be } from "./s-copilot-kit-provider/s-copilot-kit-provider.js";
37
- import { SStripeCVC as Ie, SStripeExpiry as ke, SStripeNumber as Le, StripeTextField as he } from "./s-stripe/s-stripe.js";
37
+ import { SStripeCVC as Ie, SStripeExpiry as he, SStripeNumber as ke, StripeTextField as ye } from "./s-stripe/s-stripe.js";
38
38
  import { default as Fe } from "./s-theme-provider/s-theme-provider.js";
39
39
  import { default as ze } from "./s-datetime-picker/s-datetime-picker.js";
40
40
  import { default as Ee } from "./s-date-picker/s-date-picker.js";
41
- import { default as Re } from "./s-localization-provider/s-localization-provider.js";
41
+ import { default as we } from "./s-localization-provider/s-localization-provider.js";
42
42
  import { default as Ne } from "./s-gradient-icon/s-gradient-icon.js";
43
43
  import { default as Ke } from "./s-glow-button/s-glow-button.js";
44
44
  import { default as qe } from "./s-moving-border/s-moving-border.js";
45
- import { default as Je } from "./s-copyable-text/s-copyable-text.js";
46
- import { MediaItem as Qe, default as Ue } from "./s-interactive-gallery/s-interactive-gallery.js";
47
- import { default as Xe } from "./s-image-modal/s-image-modal.js";
48
- import { default as Ze } from "./s-lazy-image/s-lazy-image.js";
49
- import { default as $e } from "./s-image-comparison/s-image-comparison.js";
50
- import { default as oo } from "./s-radial-pulse-animate/s-radial-pulse-animate.js";
51
- import { default as ao } from "./s-rating/s-rating.js";
52
- import { default as fo } from "./s-review/s-review.js";
53
- import { default as mo } from "./s-tabs/s-tabs.js";
54
- import { default as po } from "./s-tabs/s-tab.js";
55
- import { default as xo } from "./s-tabs/s-tab-panel.js";
56
- import { default as io } from "./s-text-shimmer/s-text-shimmer.js";
57
- import { useDialog as go } from "./hooks/use-dialog.js";
58
- import { usePopover as To } from "./hooks/use-popover.js";
59
- import { formatDatePosted as Po } from "./utils/dayjs.js";
60
- import { bytesToSize as Do } from "./utils/bytes-to-size.js";
61
- import { LogLevel as Mo, Logger as Io, createLogger as ko, logger as Lo } from "./utils/logger.js";
62
- import { default as yo } from "dayjs";
45
+ import { default as Je } from "./s-scroll-reveal/s-scroll-reveal.js";
46
+ import { default as Qe } from "./s-spotlight-cursor/s-spotlight-cursor.js";
47
+ import { default as We } from "./s-copyable-text/s-copyable-text.js";
48
+ import { MediaItem as Ye, default as Ze } from "./s-interactive-gallery/s-interactive-gallery.js";
49
+ import { default as $e } from "./s-image-modal/s-image-modal.js";
50
+ import { default as oo } from "./s-lazy-image/s-lazy-image.js";
51
+ import { default as to } from "./s-image-comparison/s-image-comparison.js";
52
+ import { default as fo } from "./s-radial-pulse-animate/s-radial-pulse-animate.js";
53
+ import { default as so } from "./s-rating/s-rating.js";
54
+ import { default as po } from "./s-review/s-review.js";
55
+ import { default as xo } from "./s-tabs/s-tabs.js";
56
+ import { default as io } from "./s-tabs/s-tab.js";
57
+ import { default as go } from "./s-tabs/s-tab-panel.js";
58
+ import { default as To } from "./s-text-shimmer/s-text-shimmer.js";
59
+ import { default as vo } from "./s-typewriter-text/s-typewriter-text.js";
60
+ import { useDialog as Do } from "./hooks/use-dialog.js";
61
+ import { usePopover as Mo } from "./hooks/use-popover.js";
62
+ import { formatDatePosted as ho } from "./utils/dayjs.js";
63
+ import { bytesToSize as yo } from "./utils/bytes-to-size.js";
64
+ import { LogLevel as Fo, Logger as Bo, createLogger as zo, logger as Ao } from "./utils/logger.js";
65
+ import { default as Ro } from "dayjs";
63
66
  export {
64
- y as DialogConfirmProvider,
67
+ L as DialogConfirmProvider,
65
68
  A as DialogMessageProvider,
66
- Mo as LogLevel,
67
- Io as Logger,
68
- Qe as MediaItem,
69
- a as SAccordion,
69
+ Fo as LogLevel,
70
+ Bo as Logger,
71
+ Ye as MediaItem,
72
+ t as SAccordion,
70
73
  f as SAutocomplete,
71
- m as SAvatar,
74
+ s as SAvatar,
72
75
  p as SButton,
73
- S as SButtonLink,
76
+ d as SButtonLink,
74
77
  u as SCarousel,
75
78
  n as SChatInput,
76
79
  c as SChatMessage,
77
- v as SCheckbox,
80
+ P as SCheckbox,
78
81
  b as SChip,
79
82
  I as SChips,
80
83
  be as SCopilotKitProvider,
81
- Je as SCopyableText,
82
- L as SDataTable,
84
+ We as SCopyableText,
85
+ k as SDataTable,
83
86
  Ee as SDatePicker,
84
87
  ze as SDateTimePicker,
85
88
  V as SDialog,
86
89
  F as SDialogConfirm,
87
90
  E as SDialogMessage,
88
91
  j as SEmpty,
89
- w as SError,
92
+ G as SError,
90
93
  H as SFileDropzone,
91
94
  O as SFileIcon,
92
95
  Ce as SForm,
@@ -94,45 +97,48 @@ export {
94
97
  Ne as SGradientIcon,
95
98
  U as SI18nProvider,
96
99
  X as SIconButton,
97
- $e as SImageComparison,
98
- Xe as SImageModal,
99
- Ue as SInteractiveGallery,
100
+ to as SImageComparison,
101
+ $e as SImageModal,
102
+ Ze as SInteractiveGallery,
100
103
  Z as SLabel,
101
- Ze as SLazyImage,
102
- Re as SLocalizationProvider,
104
+ oo as SLazyImage,
105
+ we as SLocalizationProvider,
103
106
  qe as SMovingBorder,
104
107
  $ as SMultiSelect,
105
108
  oe as SNoSsr,
106
109
  fe as SPagination,
107
- oo as SRadialPulseAnimate,
108
- ao as SRating,
109
- fo as SReview,
110
- me as SSelect,
110
+ fo as SRadialPulseAnimate,
111
+ so as SRating,
112
+ po as SReview,
113
+ Je as SScrollReveal,
114
+ se as SSelect,
111
115
  pe as SSkeleton,
112
- ve as SSmartTextField,
116
+ Pe as SSmartTextField,
113
117
  ne as SSnackbarMessage,
118
+ Qe as SSpotlightCursor,
114
119
  Ie as SStripeCVC,
115
- ke as SStripeExpiry,
116
- Le as SStripeNumber,
117
- po as STab,
118
- xo as STabPanel,
119
- mo as STabs,
120
+ he as SStripeExpiry,
121
+ ke as SStripeNumber,
122
+ io as STab,
123
+ go as STabPanel,
124
+ xo as STabs,
120
125
  C as STextEditor,
121
- ae as STextField,
122
- io as STextShimmer,
126
+ te as STextField,
127
+ To as STextShimmer,
123
128
  ue as STextTruncation,
124
129
  Fe as SThemeProvider,
125
- Se as STip,
130
+ de as STip,
131
+ vo as STypewriterText,
126
132
  ge as SnackbarMessageProvider,
127
- he as StripeTextField,
128
- Do as bytesToSize,
129
- ko as createLogger,
130
- yo as dayjs,
131
- Po as formatDatePosted,
132
- Lo as logger,
133
- go as useDialog,
133
+ ye as StripeTextField,
134
+ yo as bytesToSize,
135
+ zo as createLogger,
136
+ Ro as dayjs,
137
+ ho as formatDatePosted,
138
+ Ao as logger,
139
+ Do as useDialog,
134
140
  B as useDialogConfirm,
135
- G as useDialogMessage,
136
- To as usePopover,
141
+ R as useDialogMessage,
142
+ Mo as usePopover,
137
143
  ce as useSnackbarMessage
138
144
  };
@@ -0,0 +1,2 @@
1
+ export { default } from './s-blur-text';
2
+ export type { SBlurTextProps } from './s-blur-text';
@@ -0,0 +1,4 @@
1
+ import { default as o } from "./s-blur-text.js";
2
+ export {
3
+ o as default
4
+ };
@@ -0,0 +1,5 @@
1
+ {
2
+ "main": "./index.js",
3
+ "types": "./index.d.ts",
4
+ "sideEffects": false
5
+ }
@@ -0,0 +1,43 @@
1
+ import { default as React } from 'react';
2
+ import { TypographyProps } from '@mui/material';
3
+ export interface SBlurTextProps extends Omit<TypographyProps, 'children'> {
4
+ /** The text content to animate */
5
+ text: string;
6
+ /** Delay between animating each segment in milliseconds */
7
+ delay?: number;
8
+ /** Animation granularity - animate by words or individual letters */
9
+ animateBy?: 'words' | 'letters';
10
+ /** Direction of the blur animation */
11
+ direction?: 'top' | 'bottom';
12
+ /** Intersection observer threshold for triggering animation */
13
+ threshold?: number;
14
+ /** Intersection observer root margin */
15
+ rootMargin?: string;
16
+ /** Custom starting animation state */
17
+ animationFrom?: Record<string, string | number>;
18
+ /** Custom ending animation states (array for multi-step animations) */
19
+ animationTo?: Array<Record<string, string | number>>;
20
+ /** Custom easing function for animation timing */
21
+ easing?: (t: number) => number;
22
+ /** Callback fired when animation completes */
23
+ onAnimationComplete?: () => void;
24
+ /** Duration of each animation step in seconds */
25
+ stepDuration?: number;
26
+ }
27
+ /**
28
+ * A Typography component that animates text with a blur effect when it comes into view.
29
+ * Supports word-by-word or letter-by-letter animation with customizable timing and effects.
30
+ * Built on MUI Typography with full styling support.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * <SBlurText
35
+ * text="Hello world, this text will blur in"
36
+ * variant="h1"
37
+ * animateBy="words"
38
+ * delay={150}
39
+ * />
40
+ * ```
41
+ */
42
+ declare const SBlurText: React.FC<SBlurTextProps>;
43
+ export default SBlurText;
@@ -0,0 +1,80 @@
1
+ import { j as y } from "../jsx-runtime-DywqP_6a.js";
2
+ import { useState as R, useRef as V, useEffect as D, useMemo as b } from "react";
3
+ import { Typography as F } from "@mui/material";
4
+ import { motion as M } from "framer-motion";
5
+ const _ = (s, a) => {
6
+ const i = /* @__PURE__ */ new Set([...Object.keys(s), ...a.flatMap((t) => Object.keys(t))]), o = {};
7
+ return i.forEach((t) => {
8
+ o[t] = [s[t], ...a.map((l) => l[t])];
9
+ }), o;
10
+ }, H = ({
11
+ text: s,
12
+ delay: a = 100,
13
+ animateBy: i = "words",
14
+ direction: o = "top",
15
+ threshold: t = 0.1,
16
+ rootMargin: l = "0px",
17
+ animationFrom: h,
18
+ animationTo: d,
19
+ easing: w = (n) => n,
20
+ onAnimationComplete: x,
21
+ stepDuration: j = 0.35,
22
+ variant: g = "body1",
23
+ component: v = "p",
24
+ sx: S,
25
+ ...T
26
+ }) => {
27
+ const n = i === "words" ? s.split(" ") : s.split(""), [k, C] = R(!1), c = V(null);
28
+ D(() => {
29
+ if (!c.current) return;
30
+ const r = new IntersectionObserver(
31
+ ([e]) => {
32
+ e.isIntersecting && (C(!0), r.unobserve(c.current));
33
+ },
34
+ { threshold: t, rootMargin: l }
35
+ );
36
+ return r.observe(c.current), () => r.disconnect();
37
+ }, [t, l]);
38
+ const E = b(
39
+ () => o === "top" ? { filter: "blur(10px)", opacity: 0, y: -50 } : { filter: "blur(10px)", opacity: 0, y: 50 },
40
+ [o]
41
+ ), I = b(
42
+ () => [
43
+ {
44
+ filter: "blur(5px)",
45
+ opacity: 0.5,
46
+ y: o === "top" ? 5 : -5
47
+ },
48
+ { filter: "blur(0px)", opacity: 1, y: 0 }
49
+ ],
50
+ [o]
51
+ ), u = h ?? E, f = d ?? I, p = f.length + 1, O = j * (p - 1), A = Array.from({ length: p }, (r, e) => p === 1 ? 0 : e / (p - 1));
52
+ return /* @__PURE__ */ y.jsx(F, { ref: c, variant: g, component: v, sx: S, ...T, children: n.map((r, e) => {
53
+ const K = _(u, f), m = {
54
+ duration: O,
55
+ times: A,
56
+ delay: e * a / 1e3
57
+ };
58
+ return m.ease = w, /* @__PURE__ */ y.jsxs(
59
+ M.span,
60
+ {
61
+ initial: u,
62
+ animate: k ? K : u,
63
+ transition: m,
64
+ onAnimationComplete: e === n.length - 1 ? x : void 0,
65
+ style: {
66
+ display: "inline-block",
67
+ willChange: "transform, filter, opacity"
68
+ },
69
+ children: [
70
+ r === " " ? " " : r,
71
+ i === "words" && e < n.length - 1 && " "
72
+ ]
73
+ },
74
+ e
75
+ );
76
+ }) });
77
+ };
78
+ export {
79
+ H as default
80
+ };
@@ -0,0 +1,2 @@
1
+ export type { SScrollRevealProps } from './s-scroll-reveal';
2
+ export { default } from './s-scroll-reveal';
@@ -0,0 +1,4 @@
1
+ import { default as o } from "./s-scroll-reveal.js";
2
+ export {
3
+ o as default
4
+ };
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "@solostylist/ui-kit/s-scroll-reveal",
3
+ "main": "./index.ts",
4
+ "module": "./index.ts",
5
+ "types": "./index.ts"
6
+ }
@@ -0,0 +1,56 @@
1
+ import { default as React } from 'react';
2
+ import { BoxProps } from '@mui/material';
3
+ import { Easing } from 'framer-motion';
4
+ export interface SScrollRevealProps extends Omit<BoxProps, 'children'> {
5
+ children: React.ReactNode;
6
+ duration?: number;
7
+ ease?: Easing;
8
+ threshold?: number;
9
+ rootMargin?: string;
10
+ delay?: number;
11
+ direction?: 'up' | 'down' | 'left' | 'right';
12
+ distance?: number;
13
+ scale?: boolean;
14
+ rotate?: boolean;
15
+ stagger?: boolean;
16
+ staggerDelay?: number;
17
+ }
18
+ declare const SScrollReveal: React.FC<SScrollRevealProps>;
19
+ /**
20
+ * SScrollReveal - A container component that reveals its children with smooth animations when they enter the viewport
21
+ *
22
+ * This component uses the Intersection Observer API to detect when elements come into view and applies
23
+ * customizable animation effects including directional movement, scaling, rotation, and staggered animations.
24
+ * Built on MUI Box with full styling support and optimized for performance.
25
+ *
26
+ * Key features:
27
+ * - Scroll-triggered animations with customizable timing
28
+ * - Support for multiple animation directions (up, down, left, right)
29
+ * - Optional scaling and rotation effects
30
+ * - Staggered animations for multiple children
31
+ * - Full MUI Box props support for styling
32
+ * - Performance-optimized with Intersection Observer
33
+ * - Responsive and accessible
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * <SScrollReveal direction="up" duration={0.8} stagger={true}>
38
+ * <Typography>This text will slide up</Typography>
39
+ * <Button>This button will follow</Button>
40
+ * </SScrollReveal>
41
+ * ```
42
+ *
43
+ * @example
44
+ * ```tsx
45
+ * <SScrollReveal
46
+ * direction="left"
47
+ * distance={100}
48
+ * scale={false}
49
+ * delay={200}
50
+ * sx={{ padding: 2 }}
51
+ * >
52
+ * <Card>Slides in from the left</Card>
53
+ * </SScrollReveal>
54
+ * ```
55
+ */
56
+ export default SScrollReveal;
@@ -0,0 +1,63 @@
1
+ import { j as o } from "../jsx-runtime-DywqP_6a.js";
2
+ import B from "react";
3
+ import { Box as e } from "@mui/material";
4
+ import { motion as p } from "framer-motion";
5
+ import { useScrollAnimation as E } from "../hooks/use-scroll-animation.js";
6
+ const F = ({
7
+ children: a,
8
+ duration: h = 0.6,
9
+ ease: v = "easeOut",
10
+ threshold: u,
11
+ rootMargin: x,
12
+ delay: t,
13
+ direction: j,
14
+ distance: R,
15
+ scale: s = !0,
16
+ rotate: r = !1,
17
+ stagger: i = !0,
18
+ staggerDelay: S = 0.1,
19
+ sx: b,
20
+ ...y
21
+ }) => {
22
+ const { ref: C, animate: A, initialPosition: l, finalPosition: c } = E({
23
+ threshold: u,
24
+ rootMargin: x,
25
+ delay: t,
26
+ direction: j,
27
+ distance: R
28
+ }), m = s ? { ...l, scale: 0.85 } : l, d = s ? { ...c, scale: 1 } : c, n = r ? { ...m, rotate: -2 } : m, f = r ? { ...d, rotate: 0 } : d, P = {
29
+ hidden: { opacity: 0 },
30
+ visible: {
31
+ opacity: 1,
32
+ transition: {
33
+ staggerChildren: i ? S : 0,
34
+ delayChildren: t ? t / 1e3 : 0
35
+ }
36
+ }
37
+ }, V = {
38
+ hidden: n,
39
+ visible: f
40
+ };
41
+ return /* @__PURE__ */ o.jsx(e, { sx: { overflow: "hidden", ...b }, ...y, children: /* @__PURE__ */ o.jsx(
42
+ e,
43
+ {
44
+ component: p.div,
45
+ ref: C,
46
+ variants: i ? P : void 0,
47
+ initial: i ? "hidden" : n,
48
+ animate: A ? i ? "visible" : f : i ? "hidden" : n,
49
+ transition: {
50
+ duration: h,
51
+ ease: v,
52
+ type: "spring",
53
+ stiffness: 80,
54
+ damping: 20,
55
+ mass: 0.8
56
+ },
57
+ children: i ? B.Children.toArray(a).map((_, w) => /* @__PURE__ */ o.jsx(e, { component: p.div, variants: V, children: _ }, w)) : a
58
+ }
59
+ ) });
60
+ };
61
+ export {
62
+ F as default
63
+ };
@@ -0,0 +1,2 @@
1
+ export { default } from './s-spotlight-cursor';
2
+ export type { SSpotlightCursorProps, SpotlightConfig } from './s-spotlight-cursor';
@@ -0,0 +1,4 @@
1
+ import { default as o } from "./s-spotlight-cursor.js";
2
+ export {
3
+ o as default
4
+ };
@@ -0,0 +1,5 @@
1
+ {
2
+ "main": "./index.js",
3
+ "types": "./index.d.ts",
4
+ "sideEffects": false
5
+ }
@@ -0,0 +1,63 @@
1
+ import { HTMLAttributes } from 'react';
2
+ /**
3
+ * Configuration interface for spotlight effect appearance and behavior
4
+ */
5
+ export interface SpotlightConfig {
6
+ /** Radius of the spotlight effect in pixels (recommended: 50-500) */
7
+ radius: number;
8
+ /** Brightness/opacity of the spotlight effect (range: 0-1, where 0 is invisible and 1 is fully opaque) */
9
+ brightness: number;
10
+ /** Color of the spotlight effect in hexadecimal format (e.g., '#ff0000', '#00ff00') */
11
+ color: string;
12
+ /** Smoothing factor for cursor movement - reserved for future implementation */
13
+ smoothing: number;
14
+ }
15
+ /**
16
+ * Props interface for the SSpotlightCursor component
17
+ */
18
+ export interface SSpotlightCursorProps extends HTMLAttributes<HTMLCanvasElement> {
19
+ /** Configuration object for spotlight appearance and behavior. If not provided, uses default blue spotlight */
20
+ config?: SpotlightConfig;
21
+ }
22
+ /**
23
+ * SSpotlightCursor - Creates an interactive spotlight effect that follows the mouse cursor
24
+ *
25
+ * This component renders a full-screen HTML5 canvas with a radial gradient spotlight that
26
+ * smoothly tracks the user's mouse movement. The spotlight effect is highly customizable
27
+ * and optimized for performance using requestAnimationFrame.
28
+ *
29
+ * Key features:
30
+ * - Mouse-following spotlight with smooth animation
31
+ * - Customizable radius, brightness, color, and smoothing
32
+ * - Performance-optimized with proper cleanup
33
+ * - Responsive design that adapts to window resizing
34
+ * - Non-interfering overlay (pointer-events: none)
35
+ * - Memory-safe event listener management
36
+ *
37
+ * Technical implementation:
38
+ * - Uses HTML5 Canvas with 2D context for rendering
39
+ * - Implements radial gradient for spotlight effect
40
+ * - Leverages requestAnimationFrame for 60fps animations
41
+ * - Automatically handles canvas sizing and viewport changes
42
+ * - Converts hex colors to RGB for gradient creation
43
+ *
44
+ * @param props - SSpotlightCursorProps containing configuration and styling options
45
+ * @returns JSX.Element - Fixed-positioned canvas element rendering the spotlight effect
46
+ *
47
+ * @example
48
+ * // Basic usage with default blue spotlight
49
+ * <SSpotlightCursor />
50
+ *
51
+ * @example
52
+ * // Custom orange spotlight with larger radius
53
+ * <SSpotlightCursor
54
+ * config={{
55
+ * radius: 300,
56
+ * brightness: 0.25,
57
+ * color: '#ff6b35',
58
+ * smoothing: 0.1
59
+ * }}
60
+ * />
61
+ */
62
+ declare const SSpotlightCursor: ({ config, className, ...props }: SSpotlightCursorProps) => import("react/jsx-runtime").JSX.Element;
63
+ export default SSpotlightCursor;
@@ -0,0 +1,59 @@
1
+ import { j as g } from "../jsx-runtime-DywqP_6a.js";
2
+ import { useRef as p, useEffect as x } from "react";
3
+ import { Box as E } from "@mui/material";
4
+ const b = (t) => {
5
+ const a = p(null);
6
+ return x(() => {
7
+ const e = a.current;
8
+ if (!e) return;
9
+ const o = e.getContext("2d");
10
+ if (!o) return;
11
+ let d, r = -1e3, s = -1e3;
12
+ const c = () => {
13
+ e.width = window.innerWidth, e.height = window.innerHeight;
14
+ }, l = (n) => {
15
+ r = n.clientX, s = n.clientY;
16
+ }, m = () => {
17
+ r = -1e3, s = -1e3;
18
+ }, h = (n) => {
19
+ const i = parseInt(n.slice(1), 16), w = i >> 16 & 255, v = i >> 8 & 255, f = i & 255;
20
+ return `${w},${v},${f}`;
21
+ }, u = () => {
22
+ if (o.clearRect(0, 0, e.width, e.height), r !== -1e3 && s !== -1e3) {
23
+ const n = o.createRadialGradient(r, s, 0, r, s, t.radius || 200), i = h(t.color);
24
+ n.addColorStop(0, `rgba(${i}, ${t.brightness})`), n.addColorStop(1, "rgba(0,0,0,0)"), o.fillStyle = n, o.fillRect(0, 0, e.width, e.height);
25
+ }
26
+ d = requestAnimationFrame(u);
27
+ };
28
+ return c(), window.addEventListener("resize", c), window.addEventListener("mousemove", l), window.addEventListener("mouseleave", m), d = requestAnimationFrame(u), () => {
29
+ window.removeEventListener("resize", c), window.removeEventListener("mousemove", l), window.removeEventListener("mouseleave", m), cancelAnimationFrame(d);
30
+ };
31
+ }, [t.radius, t.brightness, t.color]), a;
32
+ }, S = ({
33
+ config: t = { radius: 200, brightness: 0.15, color: "#0000ff", smoothing: 0.1 },
34
+ className: a,
35
+ ...e
36
+ }) => {
37
+ const o = b(t);
38
+ return /* @__PURE__ */ g.jsx(
39
+ E,
40
+ {
41
+ component: "canvas",
42
+ ref: o,
43
+ className: a,
44
+ sx: {
45
+ position: "fixed",
46
+ top: 0,
47
+ left: 0,
48
+ pointerEvents: "none",
49
+ zIndex: 9999,
50
+ width: "100%",
51
+ height: "100%"
52
+ },
53
+ ...e
54
+ }
55
+ );
56
+ };
57
+ export {
58
+ S as default
59
+ };
@@ -0,0 +1,2 @@
1
+ export type { STypewriterTextProps } from './s-typewriter-text';
2
+ export { default } from './s-typewriter-text';
@@ -0,0 +1,4 @@
1
+ import { default as o } from "./s-typewriter-text.js";
2
+ export {
3
+ o as default
4
+ };
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "@solostylist/ui-kit/s-typewriter-text",
3
+ "main": "./index.ts",
4
+ "module": "./index.ts",
5
+ "types": "./index.ts"
6
+ }
@@ -0,0 +1,12 @@
1
+ import { TypographyProps } from '@mui/material';
2
+ export interface STypewriterTextProps extends Omit<TypographyProps, 'children'> {
3
+ text: string | string[];
4
+ speed?: number;
5
+ cursor?: string;
6
+ cursorBlinking?: boolean;
7
+ loop?: boolean;
8
+ deleteSpeed?: number;
9
+ delay?: number;
10
+ }
11
+ declare function STypewriterText({ text, speed, cursor, cursorBlinking, loop, deleteSpeed, delay, ...typographyProps }: STypewriterTextProps): import("react/jsx-runtime").JSX.Element;
12
+ export default STypewriterText;
@@ -0,0 +1,44 @@
1
+ import { j as y } from "../jsx-runtime-DywqP_6a.js";
2
+ import { useState as n, useEffect as j } from "react";
3
+ import { Typography as k, Box as D } from "@mui/material";
4
+ function B({
5
+ text: r,
6
+ speed: c = 100,
7
+ cursor: T = "|",
8
+ cursorBlinking: g = !0,
9
+ loop: l = !1,
10
+ deleteSpeed: f = 50,
11
+ delay: u = 1500,
12
+ ...h
13
+ }) {
14
+ const [s, x] = n(""), [i, m] = n(0), [o, p] = n(!1), [A, I] = n(0), a = Array.isArray(r) ? r : [r], t = a[A] || "";
15
+ return j(() => {
16
+ if (!t) return;
17
+ const d = setTimeout(
18
+ () => {
19
+ o ? s.length > 0 ? x((e) => e.slice(0, -1)) : (p(!1), m(0), I((e) => (e + 1) % a.length)) : i < t.length ? (x((e) => e + t[i]), m((e) => e + 1)) : l && setTimeout(() => p(!0), u);
20
+ },
21
+ o ? f : c
22
+ );
23
+ return () => clearTimeout(d);
24
+ }, [i, o, t, l, c, f, u, s, a.length]), /* @__PURE__ */ y.jsxs(k, { component: "span", ...h, children: [
25
+ s,
26
+ /* @__PURE__ */ y.jsx(
27
+ D,
28
+ {
29
+ component: "span",
30
+ sx: {
31
+ animation: g ? "blink 1s infinite" : "none",
32
+ "@keyframes blink": {
33
+ "0%, 50%": { opacity: 1 },
34
+ "51%, 100%": { opacity: 0 }
35
+ }
36
+ },
37
+ children: T
38
+ }
39
+ )
40
+ ] });
41
+ }
42
+ export {
43
+ B as default
44
+ };
@@ -10,6 +10,10 @@ export declare const MuiAlert: {
10
10
  color: string;
11
11
  '& .MuiAlert-icon': {
12
12
  color: string;
13
+ alignSelf: string;
14
+ };
15
+ '& .MuiAlert-message': {
16
+ alignSelf: string;
13
17
  };
14
18
  backgroundColor: string;
15
19
  border: string;
@@ -22,6 +26,10 @@ export declare const MuiAlert: {
22
26
  color: string;
23
27
  '& .MuiAlert-icon': {
24
28
  color: string;
29
+ alignSelf: string;
30
+ };
31
+ '& .MuiAlert-message': {
32
+ alignSelf: string;
25
33
  };
26
34
  backgroundColor: string;
27
35
  border: string;
@@ -34,6 +42,10 @@ export declare const MuiAlert: {
34
42
  color: string;
35
43
  '& .MuiAlert-icon': {
36
44
  color: string;
45
+ alignSelf: string;
46
+ };
47
+ '& .MuiAlert-message': {
48
+ alignSelf: string;
37
49
  };
38
50
  backgroundColor: string;
39
51
  border: string;
@@ -46,6 +58,10 @@ export declare const MuiAlert: {
46
58
  color: string;
47
59
  '& .MuiAlert-icon': {
48
60
  color: string;
61
+ alignSelf: string;
62
+ };
63
+ '& .MuiAlert-message': {
64
+ alignSelf: string;
49
65
  };
50
66
  backgroundColor: string;
51
67
  border: string;
@@ -1,13 +1,17 @@
1
1
  import { alpha as s } from "@mui/material";
2
- import { green as o, red as i, orange as t, blue as p } from "../theme-primitives.js";
2
+ import { green as o, red as i, orange as t, blue as n } from "../theme-primitives.js";
3
3
  const e = (r) => ({
4
4
  color: r[50],
5
5
  "& .MuiAlert-icon": {
6
- color: r[500]
6
+ color: r[500],
7
+ alignSelf: "center"
7
8
  },
8
- backgroundColor: `${s(r[900], 0.5)}`,
9
- border: `1px solid ${s(r[800], 0.5)}`
10
- }), l = {
9
+ "& .MuiAlert-message": {
10
+ alignSelf: "center"
11
+ },
12
+ backgroundColor: `${s(r[900], 0.9)}`,
13
+ border: `1px solid ${s(r[800], 0.8)}`
14
+ }), y = {
11
15
  styleOverrides: {
12
16
  root: () => ({
13
17
  borderRadius: 10,
@@ -41,7 +45,7 @@ const e = (r) => ({
41
45
  severity: "info"
42
46
  },
43
47
  style: {
44
- ...e(p)
48
+ ...e(n)
45
49
  }
46
50
  }
47
51
  ]
@@ -49,5 +53,5 @@ const e = (r) => ({
49
53
  }
50
54
  };
51
55
  export {
52
- l as MuiAlert
56
+ y as MuiAlert
53
57
  };
@@ -6049,6 +6049,10 @@ export declare const components: {
6049
6049
  color: string;
6050
6050
  '& .MuiAlert-icon': {
6051
6051
  color: string;
6052
+ alignSelf: string;
6053
+ };
6054
+ '& .MuiAlert-message': {
6055
+ alignSelf: string;
6052
6056
  };
6053
6057
  backgroundColor: string;
6054
6058
  border: string;
@@ -6061,6 +6065,10 @@ export declare const components: {
6061
6065
  color: string;
6062
6066
  '& .MuiAlert-icon': {
6063
6067
  color: string;
6068
+ alignSelf: string;
6069
+ };
6070
+ '& .MuiAlert-message': {
6071
+ alignSelf: string;
6064
6072
  };
6065
6073
  backgroundColor: string;
6066
6074
  border: string;
@@ -6073,6 +6081,10 @@ export declare const components: {
6073
6081
  color: string;
6074
6082
  '& .MuiAlert-icon': {
6075
6083
  color: string;
6084
+ alignSelf: string;
6085
+ };
6086
+ '& .MuiAlert-message': {
6087
+ alignSelf: string;
6076
6088
  };
6077
6089
  backgroundColor: string;
6078
6090
  border: string;
@@ -6085,6 +6097,10 @@ export declare const components: {
6085
6097
  color: string;
6086
6098
  '& .MuiAlert-icon': {
6087
6099
  color: string;
6100
+ alignSelf: string;
6101
+ };
6102
+ '& .MuiAlert-message': {
6103
+ alignSelf: string;
6088
6104
  };
6089
6105
  backgroundColor: string;
6090
6106
  border: string;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "registry": "https://registry.npmjs.org"
5
5
  },
6
- "version": "1.0.102",
6
+ "version": "1.0.104",
7
7
  "description": "advanced ui kit for solostylist",
8
8
  "private": false,
9
9
  "type": "module",