@solostylist/ui-kit 1.0.111 → 1.0.113
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.
- package/dist/assets/s-overlay-scrollbar.css +9 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.js +7 -4
- package/dist/hooks/use-count-down.d.ts +71 -0
- package/dist/hooks/use-count-down.js +77 -0
- package/dist/main.d.ts +4 -0
- package/dist/main.js +143 -136
- package/dist/s-category-card/index.d.ts +2 -0
- package/dist/s-category-card/index.js +4 -0
- package/dist/s-category-card/package.json +5 -0
- package/dist/s-category-card/s-category-card.d.ts +32 -0
- package/dist/s-category-card/s-category-card.js +103 -0
- package/dist/s-countdown/index.d.ts +3 -0
- package/dist/s-countdown/index.js +5 -0
- package/dist/s-countdown/package.json +5 -0
- package/dist/s-countdown/s-count-down.d.ts +118 -0
- package/dist/s-countdown/s-count-down.js +248 -0
- package/dist/s-overlay-scrollbar/index.d.ts +2 -0
- package/dist/s-overlay-scrollbar/index.js +4 -0
- package/dist/s-overlay-scrollbar/package.json +5 -0
- package/dist/s-overlay-scrollbar/s-overlay-scrollbar.d.ts +8 -0
- package/dist/s-overlay-scrollbar/s-overlay-scrollbar.js +25 -0
- package/package.json +3 -2
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* OverlayScrollbars
|
|
3
|
+
* Version: 2.12.0
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) Rene Haas | KingSora.
|
|
6
|
+
* https://github.com/KingSora
|
|
7
|
+
*
|
|
8
|
+
* Released under the MIT license.
|
|
9
|
+
*/.os-size-observer,.os-size-observer-listener{scroll-behavior:auto!important;direction:inherit;pointer-events:none;overflow:hidden;visibility:hidden;box-sizing:border-box}.os-size-observer,.os-size-observer-listener,.os-size-observer-listener-item,.os-size-observer-listener-item-final{writing-mode:horizontal-tb;position:absolute;left:0;top:0}.os-size-observer{z-index:-1;contain:strict;display:flex;flex-direction:row;flex-wrap:nowrap;padding:inherit;border:inherit;box-sizing:inherit;margin:-133px;top:0;right:0;bottom:0;left:0;transform:scale(.1)}.os-size-observer:before{content:"";flex:none;box-sizing:inherit;padding:10px;width:10px;height:10px}.os-size-observer-appear{animation:os-size-observer-appear-animation 1ms forwards}.os-size-observer-listener{box-sizing:border-box;position:relative;flex:auto;padding:inherit;border:inherit;margin:-133px;transform:scale(10)}.os-size-observer-listener.ltr{margin-right:-266px;margin-left:0}.os-size-observer-listener.rtl{margin-left:-266px;margin-right:0}.os-size-observer-listener:empty:before{content:"";width:100%;height:100%}.os-size-observer-listener:empty:before,.os-size-observer-listener>.os-size-observer-listener-item{display:block;position:relative;padding:inherit;border:inherit;box-sizing:content-box;flex:auto}.os-size-observer-listener-scroll{box-sizing:border-box;display:flex}.os-size-observer-listener-item{right:0;bottom:0;overflow:hidden;direction:ltr;flex:none}.os-size-observer-listener-item-final{transition:none}@keyframes os-size-observer-appear-animation{0%{cursor:auto}to{cursor:none}}.os-trinsic-observer{flex:none;box-sizing:border-box;position:relative;max-width:0px;max-height:1px;padding:0;margin:0;border:none;overflow:hidden;z-index:-1;height:0;top:calc(100% + 1px);contain:strict}.os-trinsic-observer:not(:empty){height:calc(100% + 1px);top:-1px}.os-trinsic-observer:not(:empty)>.os-size-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport]),[data-overlayscrollbars-viewport~=scrollbarHidden],html[data-overlayscrollbars-viewport~=scrollbarHidden]>body{scrollbar-width:none!important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar,[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar-corner,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar-corner,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar-corner{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;display:none!important;width:0!important;height:0!important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars]):not(html):not(body){overflow:auto}html[data-overlayscrollbars-body]{overflow:hidden}html[data-overlayscrollbars-body],html[data-overlayscrollbars-body]>body{width:100%;height:100%;margin:0}html[data-overlayscrollbars-body]>body{overflow:visible;margin:0}[data-overlayscrollbars]{position:relative}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{display:flex;align-items:stretch!important;flex-direction:row!important;flex-wrap:nowrap!important;scroll-behavior:auto!important}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){box-sizing:inherit;position:relative;flex:auto;height:auto;width:100%;min-width:0;padding:0;margin:0;border:none;z-index:0}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){--os-vaw: 0;--os-vah: 0;outline:none}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]):focus{outline:none}[data-overlayscrollbars-viewport][data-overlayscrollbars-viewport~=arrange]:before{content:"";position:absolute;pointer-events:none;z-index:-1;min-width:1px;min-height:1px;width:var(--os-vaw);height:var(--os-vah)}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{overflow:hidden!important}[data-overlayscrollbars~=host][data-overlayscrollbars~=noClipping],[data-overlayscrollbars-padding~=noClipping]{overflow:visible!important}[data-overlayscrollbars-viewport]{--os-viewport-overflow-x: hidden;--os-viewport-overflow-y: hidden;overflow-x:var(--os-viewport-overflow-x);overflow-y:var(--os-viewport-overflow-y)}[data-overlayscrollbars-viewport~=overflowXVisible]{--os-viewport-overflow-x: visible}[data-overlayscrollbars-viewport~=overflowXHidden]{--os-viewport-overflow-x: hidden}[data-overlayscrollbars-viewport~=overflowXScroll]{--os-viewport-overflow-x: scroll}[data-overlayscrollbars-viewport~=overflowYVisible]{--os-viewport-overflow-y: visible}[data-overlayscrollbars-viewport~=overflowYHidden]{--os-viewport-overflow-y: hidden}[data-overlayscrollbars-viewport~=overflowYScroll]{--os-viewport-overflow-y: scroll}[data-overlayscrollbars-viewport~=overflowImportant]{overflow-x:var(--os-viewport-overflow-x)!important;overflow-y:var(--os-viewport-overflow-y)!important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId){font-size:0!important;line-height:0!important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId):before,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId):after,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId)>*{display:none!important;position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border-width:0!important}[data-overlayscrollbars-viewport~=measuring],[data-overlayscrollbars-viewport~=scrolling]{scroll-behavior:auto!important;scroll-snap-type:none!important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowXVisible]{overflow-x:hidden!important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowYVisible]{overflow-y:hidden!important}[data-overlayscrollbars-content]{box-sizing:inherit}[data-overlayscrollbars-contents]:not(#osFakeId):not([data-overlayscrollbars-padding]):not([data-overlayscrollbars-viewport]):not([data-overlayscrollbars-content]){display:contents}[data-overlayscrollbars-grid],[data-overlayscrollbars-grid] [data-overlayscrollbars-padding]{display:grid;grid-template:1fr/1fr}[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding],[data-overlayscrollbars-grid]>[data-overlayscrollbars-viewport],[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding]>[data-overlayscrollbars-viewport]{height:auto!important;width:auto!important}@property --os-scroll-percent{syntax: "<number>"; inherits: true; initial-value: 0;}@property --os-viewport-percent{syntax: "<number>"; inherits: true; initial-value: 0;}.os-scrollbar{--os-viewport-percent: 0;--os-scroll-percent: 0;--os-scroll-direction: 0;--os-scroll-percent-directional: calc( var(--os-scroll-percent) - (var(--os-scroll-percent) + (1 - var(--os-scroll-percent)) * -1) * var(--os-scroll-direction) )}.os-scrollbar{contain:size layout;contain:size layout style;transition:opacity .15s,visibility .15s,top .15s,right .15s,bottom .15s,left .15s;pointer-events:none;position:absolute;opacity:0;visibility:hidden}body>.os-scrollbar{position:fixed;z-index:99999}.os-scrollbar-transitionless{transition:none!important}.os-scrollbar-track{position:relative;padding:0!important;border:none!important}.os-scrollbar-handle{position:absolute}.os-scrollbar-track,.os-scrollbar-handle{pointer-events:none;width:100%;height:100%}.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle{pointer-events:auto;touch-action:none}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-scrollbar-rtl.os-scrollbar-horizontal{right:0}.os-scrollbar-rtl.os-scrollbar-vertical{right:auto;left:0}.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-auto-hide.os-scrollbar-auto-hide-hidden{opacity:0;visibility:hidden}.os-scrollbar-interaction.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-unusable,.os-scrollbar-unusable *,.os-scrollbar-wheel,.os-scrollbar-wheel *{pointer-events:none!important}.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important;transition:none!important}.os-scrollbar-horizontal .os-scrollbar-handle{bottom:0;left:calc(var(--os-scroll-percent-directional) * 100%);transform:translate(calc(var(--os-scroll-percent-directional) * -100%));width:calc(var(--os-viewport-percent) * 100%)}.os-scrollbar-vertical .os-scrollbar-handle{right:0;top:calc(var(--os-scroll-percent-directional) * 100%);transform:translateY(calc(var(--os-scroll-percent-directional) * -100%));height:calc(var(--os-viewport-percent) * 100%)}@supports (container-type: size){.os-scrollbar-track{container-type:size}.os-scrollbar-horizontal .os-scrollbar-handle{left:auto;transform:translate(calc(var(--os-scroll-percent-directional) * 100cqw + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-vertical .os-scrollbar-handle{top:auto;transform:translateY(calc(var(--os-scroll-percent-directional) * 100cqh + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-rtl.os-scrollbar-horizontal .os-scrollbar-handle{right:auto;left:0}}.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle{right:auto;left:0}.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless.os-scrollbar-rtl{left:0;right:0}.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless.os-scrollbar-rtl{top:0;bottom:0}@media print{.os-scrollbar{display:none}}.os-scrollbar{--os-size: 0;--os-padding-perpendicular: 0;--os-padding-axis: 0;--os-track-border-radius: 0;--os-track-bg: none;--os-track-bg-hover: none;--os-track-bg-active: none;--os-track-border: none;--os-track-border-hover: none;--os-track-border-active: none;--os-handle-border-radius: 0;--os-handle-bg: none;--os-handle-bg-hover: none;--os-handle-bg-active: none;--os-handle-border: none;--os-handle-border-hover: none;--os-handle-border-active: none;--os-handle-min-size: 33px;--os-handle-max-size: none;--os-handle-perpendicular-size: 100%;--os-handle-perpendicular-size-hover: 100%;--os-handle-perpendicular-size-active: 100%;--os-handle-interactive-area-offset: 0}.os-scrollbar-track{border:var(--os-track-border);border-radius:var(--os-track-border-radius);background:var(--os-track-bg);transition:opacity .15s,background-color .15s,border-color .15s}.os-scrollbar-track:hover{border:var(--os-track-border-hover);background:var(--os-track-bg-hover)}.os-scrollbar-track:active{border:var(--os-track-border-active);background:var(--os-track-bg-active)}.os-scrollbar-handle{border:var(--os-handle-border);border-radius:var(--os-handle-border-radius);background:var(--os-handle-bg)}.os-scrollbar-handle:hover{border:var(--os-handle-border-hover);background:var(--os-handle-bg-hover)}.os-scrollbar-handle:active{border:var(--os-handle-border-active);background:var(--os-handle-bg-active)}.os-scrollbar-track:before,.os-scrollbar-handle:before{content:"";position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-scrollbar-horizontal{padding:var(--os-padding-perpendicular) var(--os-padding-axis);right:var(--os-size);height:var(--os-size)}.os-scrollbar-horizontal.os-scrollbar-rtl{left:var(--os-size);right:0}.os-scrollbar-horizontal .os-scrollbar-track:before{top:calc(var(--os-padding-perpendicular) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal .os-scrollbar-handle{min-width:var(--os-handle-min-size);max-width:var(--os-handle-max-size);height:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,height .15s}.os-scrollbar-horizontal .os-scrollbar-handle:before{top:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal:hover .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-horizontal:active .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-active)}.os-scrollbar-vertical{padding:var(--os-padding-axis) var(--os-padding-perpendicular);bottom:var(--os-size);width:var(--os-size)}.os-scrollbar-vertical .os-scrollbar-track:before{left:calc(var(--os-padding-perpendicular) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical .os-scrollbar-handle{min-height:var(--os-handle-min-size);max-height:var(--os-handle-max-size);width:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,width .15s}.os-scrollbar-vertical .os-scrollbar-handle:before{left:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);left:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical:hover .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-vertical:active .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-active)}[data-overlayscrollbars-viewport~=measuring]>.os-scrollbar,.os-theme-none.os-scrollbar{display:none!important}.os-theme-dark,.os-theme-light{box-sizing:border-box;--os-size: 10px;--os-padding-perpendicular: 2px;--os-padding-axis: 2px;--os-track-border-radius: 10px;--os-handle-interactive-area-offset: 4px;--os-handle-border-radius: 10px}.os-theme-dark{--os-handle-bg: rgba(0, 0, 0, .44);--os-handle-bg-hover: rgba(0, 0, 0, .55);--os-handle-bg-active: rgba(0, 0, 0, .66)}.os-theme-light{--os-handle-bg: rgba(255, 255, 255, .44);--os-handle-bg-hover: rgba(255, 255, 255, .55);--os-handle-bg-active: rgba(255, 255, 255, .66)}
|
package/dist/hooks/index.d.ts
CHANGED
package/dist/hooks/index.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { useDialog as
|
|
2
|
-
import { usePopover as
|
|
1
|
+
import { useDialog as m } from "./use-dialog.js";
|
|
2
|
+
import { usePopover as t } from "./use-popover.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { useScrollAnimation as f } from "./use-scroll-animation.js";
|
|
3
5
|
export {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
+
m as useDialog,
|
|
7
|
+
t as usePopover,
|
|
8
|
+
f as useScrollAnimation
|
|
6
9
|
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time left object structure
|
|
3
|
+
*/
|
|
4
|
+
export interface TimeLeft {
|
|
5
|
+
days: number;
|
|
6
|
+
hours: number;
|
|
7
|
+
minutes: number;
|
|
8
|
+
seconds: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Props for useCountDown hook
|
|
12
|
+
*/
|
|
13
|
+
export interface UseCountDownProps {
|
|
14
|
+
/** Target date timestamp in milliseconds */
|
|
15
|
+
expireDate: number;
|
|
16
|
+
/** Callback fired when countdown reaches zero */
|
|
17
|
+
onComplete?: () => void;
|
|
18
|
+
/** Callback fired on each tick (every second) */
|
|
19
|
+
onTick?: (timeLeft: TimeLeft) => void;
|
|
20
|
+
/** Callback fired when countdown starts */
|
|
21
|
+
onStart?: () => void;
|
|
22
|
+
/** Whether the countdown is paused */
|
|
23
|
+
paused?: boolean;
|
|
24
|
+
/** Custom interval in milliseconds (default: 1000) */
|
|
25
|
+
interval?: number;
|
|
26
|
+
/** Whether to automatically start the countdown */
|
|
27
|
+
autoStart?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Return type for useCountDown hook
|
|
31
|
+
*/
|
|
32
|
+
export interface UseCountDownReturn {
|
|
33
|
+
/** Current time left */
|
|
34
|
+
timeLeft: TimeLeft;
|
|
35
|
+
/** Whether the countdown has expired */
|
|
36
|
+
isExpired: boolean;
|
|
37
|
+
/** Whether the countdown is currently running */
|
|
38
|
+
isRunning: boolean;
|
|
39
|
+
/** Whether the countdown is paused */
|
|
40
|
+
isPaused: boolean;
|
|
41
|
+
/** Start the countdown */
|
|
42
|
+
start: () => void;
|
|
43
|
+
/** Pause the countdown */
|
|
44
|
+
pause: () => void;
|
|
45
|
+
/** Resume the countdown */
|
|
46
|
+
resume: () => void;
|
|
47
|
+
/** Reset the countdown to initial state */
|
|
48
|
+
reset: () => void;
|
|
49
|
+
/** Get the total duration in milliseconds */
|
|
50
|
+
totalDuration: number;
|
|
51
|
+
/** Get the elapsed time in milliseconds */
|
|
52
|
+
elapsedTime: number;
|
|
53
|
+
/** Get the progress as a percentage (0-100) */
|
|
54
|
+
progress: number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Enhanced countdown hook with comprehensive features
|
|
58
|
+
*
|
|
59
|
+
* Features:
|
|
60
|
+
* - Pause/resume functionality
|
|
61
|
+
* - Event callbacks (onComplete, onTick, onStart)
|
|
62
|
+
* - Custom intervals
|
|
63
|
+
* - Progress tracking
|
|
64
|
+
* - Manual start/stop controls
|
|
65
|
+
* - Expiration detection
|
|
66
|
+
*
|
|
67
|
+
* @param props - UseCountDownProps
|
|
68
|
+
* @returns UseCountDownReturn - Hook return value with time data and controls
|
|
69
|
+
*/
|
|
70
|
+
declare const useCountDown: ({ expireDate, onComplete, onTick, onStart, paused, interval, autoStart, }: UseCountDownProps) => UseCountDownReturn;
|
|
71
|
+
export default useCountDown;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { useState as o, useRef as c, useEffect as u, useCallback as f, useMemo as p } from "react";
|
|
2
|
+
const z = {
|
|
3
|
+
days: 0,
|
|
4
|
+
hours: 0,
|
|
5
|
+
minutes: 0,
|
|
6
|
+
seconds: 0
|
|
7
|
+
}, J = ({
|
|
8
|
+
expireDate: a,
|
|
9
|
+
onComplete: T,
|
|
10
|
+
onTick: L,
|
|
11
|
+
onStart: M,
|
|
12
|
+
paused: e = !1,
|
|
13
|
+
interval: S = 1e3,
|
|
14
|
+
autoStart: R = !0
|
|
15
|
+
}) => {
|
|
16
|
+
const [A, j] = o(z), [w, k] = o(!1), [g, i] = o(R && !e), [x, l] = o(e), [t, q] = o(null), s = c(null), I = c(T), E = c(L), v = c(M), y = c(!1), C = c(!1);
|
|
17
|
+
u(() => {
|
|
18
|
+
I.current = T;
|
|
19
|
+
}, [T]), u(() => {
|
|
20
|
+
E.current = L;
|
|
21
|
+
}, [L]), u(() => {
|
|
22
|
+
v.current = M;
|
|
23
|
+
}, [M]);
|
|
24
|
+
const m = f(() => {
|
|
25
|
+
const r = (/* @__PURE__ */ new Date()).getTime(), n = a - r;
|
|
26
|
+
return n < 0 ? { timeLeft: z, expired: !0 } : {
|
|
27
|
+
timeLeft: {
|
|
28
|
+
days: Math.floor(n / (1e3 * 60 * 60 * 24)),
|
|
29
|
+
hours: Math.floor(n % (1e3 * 60 * 60 * 24) / (1e3 * 60 * 60)),
|
|
30
|
+
minutes: Math.floor(n % (1e3 * 60 * 60) / (1e3 * 60)),
|
|
31
|
+
seconds: Math.floor(n % (1e3 * 60) / 1e3)
|
|
32
|
+
},
|
|
33
|
+
expired: !1
|
|
34
|
+
};
|
|
35
|
+
}, [a]), h = f(() => {
|
|
36
|
+
const { timeLeft: r, expired: n } = m();
|
|
37
|
+
j(r), k(n), E.current && E.current(r), n && !C.current && (C.current = !0, i(!1), I.current && I.current());
|
|
38
|
+
}, [m]), B = f(() => {
|
|
39
|
+
!y.current && v.current && (v.current(), y.current = !0), i(!0), l(!1), t || q((/* @__PURE__ */ new Date()).getTime());
|
|
40
|
+
}, [t]), D = f(() => {
|
|
41
|
+
i(!1), l(!0);
|
|
42
|
+
}, []), P = f(() => {
|
|
43
|
+
i(!0), l(!1);
|
|
44
|
+
}, []), F = f(() => {
|
|
45
|
+
i(R && !e), l(e), k(!1), q(null), y.current = !1, C.current = !1;
|
|
46
|
+
const { timeLeft: r } = m();
|
|
47
|
+
j(r);
|
|
48
|
+
}, [R, e, m]);
|
|
49
|
+
u(() => {
|
|
50
|
+
e ? D() : x && !e && P();
|
|
51
|
+
}, [e, x, D, P]), u(() => (g && !w ? s.current = setInterval(h, S) : s.current && (clearInterval(s.current), s.current = null), () => {
|
|
52
|
+
s.current && (clearInterval(s.current), s.current = null);
|
|
53
|
+
}), [g, w, S, h]), u(() => {
|
|
54
|
+
h();
|
|
55
|
+
}, [h]);
|
|
56
|
+
const d = p(() => t ? Math.max(0, a - t) : 0, [a, t]), b = p(() => {
|
|
57
|
+
if (!t) return 0;
|
|
58
|
+
const r = (/* @__PURE__ */ new Date()).getTime();
|
|
59
|
+
return Math.max(0, r - t);
|
|
60
|
+
}, [t]), G = p(() => d === 0 ? 0 : Math.min(100, Math.max(0, b / d * 100)), [b, d]);
|
|
61
|
+
return {
|
|
62
|
+
timeLeft: A,
|
|
63
|
+
isExpired: w,
|
|
64
|
+
isRunning: g,
|
|
65
|
+
isPaused: x,
|
|
66
|
+
start: B,
|
|
67
|
+
pause: D,
|
|
68
|
+
resume: P,
|
|
69
|
+
reset: F,
|
|
70
|
+
totalDuration: d,
|
|
71
|
+
elapsedTime: b,
|
|
72
|
+
progress: G
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
export {
|
|
76
|
+
J as default
|
|
77
|
+
};
|
package/dist/main.d.ts
CHANGED
|
@@ -51,6 +51,8 @@ export { default as SMultiSelect } from './s-multi-select/index';
|
|
|
51
51
|
export type { SMultiSelectProps } from './s-multi-select/index';
|
|
52
52
|
export { default as SNoSsr } from './s-no-ssr/index';
|
|
53
53
|
export type { SNoSsrProps } from './s-no-ssr/index';
|
|
54
|
+
export { default as SOverlayScrollbar } from './s-overlay-scrollbar/index';
|
|
55
|
+
export type { SOverlayScrollbarProps } from './s-overlay-scrollbar/index';
|
|
54
56
|
export { default as STextField } from './s-text-field/index';
|
|
55
57
|
export type { STextFieldProps } from './s-text-field/index';
|
|
56
58
|
export { default as SPagination } from './s-pagination/index';
|
|
@@ -101,6 +103,8 @@ export { default as SLazyImage } from './s-lazy-image/index';
|
|
|
101
103
|
export type { SLazyImageProps } from './s-lazy-image/index';
|
|
102
104
|
export { default as SImageComparison } from './s-image-comparison/index';
|
|
103
105
|
export type { SImageComparisonProps } from './s-image-comparison/index';
|
|
106
|
+
export { default as SCategoryCard } from './s-category-card/index';
|
|
107
|
+
export type { SCategoryCardProps } from './s-category-card/index';
|
|
104
108
|
export { default as SRadialPulseAnimate } from './s-radial-pulse-animate/index';
|
|
105
109
|
export type { SRadialPulseAnimateProps } from './s-radial-pulse-animate/index';
|
|
106
110
|
export { default as SRating } from './s-rating/index';
|
package/dist/main.js
CHANGED
|
@@ -1,148 +1,155 @@
|
|
|
1
|
-
import { default as
|
|
2
|
-
import { default as
|
|
1
|
+
import { default as a } from "./s-accordion/s-accordion.js";
|
|
2
|
+
import { default as l } from "./s-action-overlay/s-action-overlay.js";
|
|
3
3
|
import { default as s } from "./s-autocomplete/s-autocomplete.js";
|
|
4
|
-
import { default as
|
|
5
|
-
import { default as
|
|
6
|
-
import { default as
|
|
7
|
-
import { default as
|
|
8
|
-
import { default as
|
|
4
|
+
import { default as S } from "./s-avatar/s-avatar.js";
|
|
5
|
+
import { default as d } from "./s-button/s-button.js";
|
|
6
|
+
import { default as i } from "./s-button-link/s-button-link.js";
|
|
7
|
+
import { default as g } from "./s-carousel/s-carousel.js";
|
|
8
|
+
import { default as T } from "./s-chat-input/s-chat-input.js";
|
|
9
9
|
import { default as v } from "./s-chat-message/s-chat-message.js";
|
|
10
|
-
import { default as
|
|
10
|
+
import { default as b } from "./s-text-editor/s-text-editor.js";
|
|
11
11
|
import "./s-text-editor/s-text-editor-toolbar.js";
|
|
12
|
-
import { default as
|
|
12
|
+
import { default as y } from "./s-checkbox/s-checkbox.js";
|
|
13
13
|
import { default as I } from "./s-chip/s-chip.js";
|
|
14
|
-
import { default as
|
|
15
|
-
import { default as
|
|
16
|
-
import { DialogConfirmProvider as B, default as
|
|
17
|
-
import { DialogMessageProvider as
|
|
14
|
+
import { default as k } from "./s-chips/s-chips.js";
|
|
15
|
+
import { default as F } from "./s-data-table/s-data-table.js";
|
|
16
|
+
import { DialogConfirmProvider as B, default as z, useDialogConfirm as E } from "./s-dialog-confirm/s-dialog-confirm.js";
|
|
17
|
+
import { DialogMessageProvider as w, default as G, useDialogMessage as N } from "./s-dialog-message/s-dialog-message.js";
|
|
18
18
|
import { default as j } from "./s-error/s-error.js";
|
|
19
|
-
import { default as
|
|
20
|
-
import { default as
|
|
21
|
-
import { default as
|
|
22
|
-
import { default as
|
|
23
|
-
import { default as
|
|
24
|
-
import { default as
|
|
25
|
-
import { default as
|
|
26
|
-
import { default as
|
|
27
|
-
import { default as
|
|
28
|
-
import { default as
|
|
29
|
-
import { default as se } from "./s-
|
|
30
|
-
import { default as
|
|
31
|
-
import { default as
|
|
32
|
-
import { default as
|
|
33
|
-
import { default as
|
|
34
|
-
import { default as
|
|
35
|
-
import { default as ve
|
|
36
|
-
import { default as be } from "./s-
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import { default as
|
|
42
|
-
import { default as
|
|
43
|
-
import { default as Ke } from "./s-
|
|
44
|
-
import { default as
|
|
45
|
-
import { default as
|
|
46
|
-
import { default as
|
|
47
|
-
import { default as
|
|
48
|
-
import { default as
|
|
49
|
-
import { default as
|
|
50
|
-
import {
|
|
51
|
-
import {
|
|
52
|
-
import { default as
|
|
53
|
-
import { default as so } from "./s-image
|
|
54
|
-
import { default as
|
|
55
|
-
import { default as
|
|
56
|
-
import { default as
|
|
57
|
-
import { default as
|
|
58
|
-
import { default as
|
|
59
|
-
import { default as
|
|
60
|
-
import { default as Do } from "./s-
|
|
61
|
-
import { default as Mo } from "./s-
|
|
62
|
-
import {
|
|
63
|
-
import {
|
|
64
|
-
import {
|
|
65
|
-
import {
|
|
66
|
-
import
|
|
67
|
-
import {
|
|
19
|
+
import { default as V } from "./s-empty/s-empty.js";
|
|
20
|
+
import { default as H } from "./s-flex-box/s-flex-box.js";
|
|
21
|
+
import { default as Q } from "./s-dialog/s-dialog.js";
|
|
22
|
+
import { default as W } from "./s-file-dropzone/s-file-dropzone.js";
|
|
23
|
+
import { default as Y } from "./s-file-icon/s-file-icon.js";
|
|
24
|
+
import { default as _ } from "./s-i18n-provider/s-i18n-provider.js";
|
|
25
|
+
import { default as ee } from "./s-icon-button/s-icon-button.js";
|
|
26
|
+
import { default as re } from "./s-label/s-label.js";
|
|
27
|
+
import { default as ae } from "./s-multi-select/s-multi-select.js";
|
|
28
|
+
import { default as le } from "./s-no-ssr/s-no-ssr.js";
|
|
29
|
+
import { default as se } from "./s-overlay-scrollbar/s-overlay-scrollbar.js";
|
|
30
|
+
import { default as Se } from "./s-text-field/s-text-field.js";
|
|
31
|
+
import { default as de } from "./s-pagination/s-pagination.js";
|
|
32
|
+
import { default as ie } from "./s-select/s-select.js";
|
|
33
|
+
import { default as ge } from "./s-skeleton/s-skeleton.js";
|
|
34
|
+
import { default as Te } from "./s-tip/s-tip.js";
|
|
35
|
+
import { default as ve } from "./s-text-truncation/s-text-truncation.js";
|
|
36
|
+
import { default as be, SnackbarMessageProvider as De, useSnackbarMessage as ye } from "./s-snackbar-message/s-snackbar-message.js";
|
|
37
|
+
import { default as Ie } from "./s-form/s-form.js";
|
|
38
|
+
import { SSmartTextField as ke } from "./s-smart-text-field/s-smart-text-field.js";
|
|
39
|
+
import { SCopilotKitProvider as Fe } from "./s-copilot-kit-provider/s-copilot-kit-provider.js";
|
|
40
|
+
import { SStripeCVC as Be, SStripeExpiry as ze, SStripeNumber as Ee, StripeTextField as Re } from "./s-stripe/s-stripe.js";
|
|
41
|
+
import { default as Ge } from "./s-theme-provider/s-theme-provider.js";
|
|
42
|
+
import { default as Oe } from "./s-datetime-picker/s-datetime-picker.js";
|
|
43
|
+
import { default as Ke } from "./s-date-picker/s-date-picker.js";
|
|
44
|
+
import { default as qe } from "./s-localization-provider/s-localization-provider.js";
|
|
45
|
+
import { default as Je } from "./s-gradient-icon/s-gradient-icon.js";
|
|
46
|
+
import { default as Ue } from "./s-glow-button/s-glow-button.js";
|
|
47
|
+
import { default as Xe } from "./s-moving-border/s-moving-border.js";
|
|
48
|
+
import { default as Ze } from "./s-scroll-reveal/s-scroll-reveal.js";
|
|
49
|
+
import { default as $e } from "./s-spotlight-cursor/s-spotlight-cursor.js";
|
|
50
|
+
import { default as oo } from "./s-copyable-text/s-copyable-text.js";
|
|
51
|
+
import { MediaItem as to, default as ao } from "./s-interactive-gallery/s-interactive-gallery.js";
|
|
52
|
+
import { default as lo } from "./s-image-modal/s-image-modal.js";
|
|
53
|
+
import { default as so } from "./s-lazy-image/s-lazy-image.js";
|
|
54
|
+
import { default as So } from "./s-image-comparison/s-image-comparison.js";
|
|
55
|
+
import { default as uo } from "./s-category-card/s-category-card.js";
|
|
56
|
+
import { default as no } from "./s-radial-pulse-animate/s-radial-pulse-animate.js";
|
|
57
|
+
import { default as co } from "./s-rating/s-rating.js";
|
|
58
|
+
import { default as Co } from "./s-review/s-review.js";
|
|
59
|
+
import { default as Po } from "./s-tabs/s-tabs.js";
|
|
60
|
+
import { default as Do } from "./s-tabs/s-tab.js";
|
|
61
|
+
import { default as Mo } from "./s-tabs/s-tab-panel.js";
|
|
62
|
+
import { default as ho } from "./s-text-shimmer/s-text-shimmer.js";
|
|
63
|
+
import { default as Lo } from "./s-typewriter-text/s-typewriter-text.js";
|
|
64
|
+
import { useDialog as Ao } from "./hooks/use-dialog.js";
|
|
65
|
+
import { usePopover as zo } from "./hooks/use-popover.js";
|
|
66
|
+
import "react";
|
|
67
|
+
import { useScrollAnimation as Ro } from "./hooks/use-scroll-animation.js";
|
|
68
|
+
import { formatDatePosted as Go } from "./utils/dayjs.js";
|
|
69
|
+
import { bytesToSize as Oo } from "./utils/bytes-to-size.js";
|
|
70
|
+
import { LogLevel as Ko, Logger as Vo, createLogger as qo, logger as Ho } from "./utils/logger.js";
|
|
71
|
+
import { default as Qo } from "dayjs";
|
|
68
72
|
export {
|
|
69
73
|
B as DialogConfirmProvider,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
w as DialogMessageProvider,
|
|
75
|
+
Ko as LogLevel,
|
|
76
|
+
Vo as Logger,
|
|
77
|
+
to as MediaItem,
|
|
78
|
+
a as SAccordion,
|
|
79
|
+
l as SActionOverlay,
|
|
76
80
|
s as SAutocomplete,
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
S as SAvatar,
|
|
82
|
+
d as SButton,
|
|
83
|
+
i as SButtonLink,
|
|
84
|
+
g as SCarousel,
|
|
85
|
+
uo as SCategoryCard,
|
|
86
|
+
T as SChatInput,
|
|
82
87
|
v as SChatMessage,
|
|
83
|
-
|
|
88
|
+
y as SCheckbox,
|
|
84
89
|
I as SChip,
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
90
|
+
k as SChips,
|
|
91
|
+
Fe as SCopilotKitProvider,
|
|
92
|
+
oo as SCopyableText,
|
|
93
|
+
F as SDataTable,
|
|
94
|
+
Ke as SDatePicker,
|
|
95
|
+
Oe as SDateTimePicker,
|
|
96
|
+
Q as SDialog,
|
|
97
|
+
z as SDialogConfirm,
|
|
98
|
+
G as SDialogMessage,
|
|
99
|
+
V as SEmpty,
|
|
95
100
|
j as SError,
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
Go as
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
101
|
+
W as SFileDropzone,
|
|
102
|
+
Y as SFileIcon,
|
|
103
|
+
H as SFlexBox,
|
|
104
|
+
Ie as SForm,
|
|
105
|
+
Ue as SGlowButton,
|
|
106
|
+
Je as SGradientIcon,
|
|
107
|
+
_ as SI18nProvider,
|
|
108
|
+
ee as SIconButton,
|
|
109
|
+
So as SImageComparison,
|
|
110
|
+
lo as SImageModal,
|
|
111
|
+
ao as SInteractiveGallery,
|
|
112
|
+
re as SLabel,
|
|
113
|
+
so as SLazyImage,
|
|
114
|
+
qe as SLocalizationProvider,
|
|
115
|
+
Xe as SMovingBorder,
|
|
116
|
+
ae as SMultiSelect,
|
|
117
|
+
le as SNoSsr,
|
|
118
|
+
se as SOverlayScrollbar,
|
|
119
|
+
de as SPagination,
|
|
120
|
+
no as SRadialPulseAnimate,
|
|
121
|
+
co as SRating,
|
|
122
|
+
Co as SReview,
|
|
123
|
+
Ze as SScrollReveal,
|
|
124
|
+
ie as SSelect,
|
|
125
|
+
ge as SSkeleton,
|
|
126
|
+
ke as SSmartTextField,
|
|
127
|
+
be as SSnackbarMessage,
|
|
128
|
+
$e as SSpotlightCursor,
|
|
129
|
+
Be as SStripeCVC,
|
|
130
|
+
ze as SStripeExpiry,
|
|
131
|
+
Ee as SStripeNumber,
|
|
132
|
+
Do as STab,
|
|
133
|
+
Mo as STabPanel,
|
|
134
|
+
Po as STabs,
|
|
135
|
+
b as STextEditor,
|
|
136
|
+
Se as STextField,
|
|
137
|
+
ho as STextShimmer,
|
|
138
|
+
ve as STextTruncation,
|
|
139
|
+
Ge as SThemeProvider,
|
|
140
|
+
Te as STip,
|
|
141
|
+
Lo as STypewriterText,
|
|
142
|
+
De as SnackbarMessageProvider,
|
|
143
|
+
Re as StripeTextField,
|
|
144
|
+
Oo as bytesToSize,
|
|
145
|
+
qo as createLogger,
|
|
146
|
+
Qo as dayjs,
|
|
147
|
+
Go as formatDatePosted,
|
|
148
|
+
Ho as logger,
|
|
149
|
+
Ao as useDialog,
|
|
150
|
+
E as useDialogConfirm,
|
|
151
|
+
N as useDialogMessage,
|
|
152
|
+
zo as usePopover,
|
|
153
|
+
Ro as useScrollAnimation,
|
|
154
|
+
ye as useSnackbarMessage
|
|
148
155
|
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material';
|
|
3
|
+
export declare const Wrapper: import('@emotion/styled').StyledComponent<import('@mui/system').BoxOwnProps<Theme> & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('@mui/system').BoxOwnProps<Theme>> & import('@mui/system').MUIStyledCommonProps<Theme> & {
|
|
4
|
+
disableHoverEffect?: boolean;
|
|
5
|
+
hoverScale?: number;
|
|
6
|
+
}, {}, {}>;
|
|
7
|
+
export declare const CategoryTitle: import('@emotion/styled').StyledComponent<import('@mui/system').BoxOwnProps<Theme> & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('@mui/system').BoxOwnProps<Theme>> & import('@mui/system').MUIStyledCommonProps<Theme> & {
|
|
8
|
+
titlePosition?: "bottom" | "top" | "center";
|
|
9
|
+
titleAlignment?: "left" | "center" | "right";
|
|
10
|
+
}, {}, {}>;
|
|
11
|
+
export interface SCategoryCardProps {
|
|
12
|
+
image: string;
|
|
13
|
+
title: string;
|
|
14
|
+
width?: number | string;
|
|
15
|
+
height?: number | string;
|
|
16
|
+
alt?: string;
|
|
17
|
+
titlePosition?: 'bottom' | 'top' | 'center';
|
|
18
|
+
titleAlignment?: 'left' | 'center' | 'right';
|
|
19
|
+
titleVariant?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'subtitle1' | 'subtitle2' | 'body1' | 'body2' | 'caption' | 'button' | 'overline';
|
|
20
|
+
titleColor?: string;
|
|
21
|
+
titleBackgroundColor?: string;
|
|
22
|
+
titleOpacity?: number;
|
|
23
|
+
borderRadius?: number | string;
|
|
24
|
+
disableHoverEffect?: boolean;
|
|
25
|
+
hoverScale?: number;
|
|
26
|
+
onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
|
|
27
|
+
sx?: SxProps<Theme>;
|
|
28
|
+
titleSx?: SxProps<Theme>;
|
|
29
|
+
imageSx?: SxProps<Theme>;
|
|
30
|
+
}
|
|
31
|
+
declare const SCategoryCard: ({ image, title, width, height, alt, titlePosition, titleAlignment, titleVariant, titleColor, titleBackgroundColor, titleOpacity, borderRadius, disableHoverEffect, hoverScale, onClick, sx, titleSx, imageSx, }: SCategoryCardProps) => import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
export default SCategoryCard;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { j as r } from "../jsx-runtime-DywqP_6a.js";
|
|
2
|
+
import { styled as c, Box as i, Typography as v } from "@mui/material";
|
|
3
|
+
import C from "../s-lazy-image/s-lazy-image.js";
|
|
4
|
+
const F = c(i)(
|
|
5
|
+
({ disableHoverEffect: t = !1, hoverScale: o = 1.1 }) => ({
|
|
6
|
+
height: "100%",
|
|
7
|
+
cursor: "pointer",
|
|
8
|
+
overflow: "hidden",
|
|
9
|
+
borderRadius: 1,
|
|
10
|
+
position: "relative",
|
|
11
|
+
img: {
|
|
12
|
+
height: "100%",
|
|
13
|
+
objectFit: "cover",
|
|
14
|
+
transition: "all 0.3s",
|
|
15
|
+
objectPosition: "center center"
|
|
16
|
+
},
|
|
17
|
+
...!t && {
|
|
18
|
+
":hover": {
|
|
19
|
+
img: { transform: `scale(${o})` }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
), S = c(i)(({ titlePosition: t = "bottom", titleAlignment: o = "center" }) => ({
|
|
24
|
+
left: 10,
|
|
25
|
+
right: 10,
|
|
26
|
+
padding: 8,
|
|
27
|
+
textAlign: o,
|
|
28
|
+
position: "absolute",
|
|
29
|
+
transition: "all 0.3s",
|
|
30
|
+
...t === "bottom" && { bottom: 10 },
|
|
31
|
+
...t === "top" && { top: 10 },
|
|
32
|
+
...t === "center" && {
|
|
33
|
+
top: "50%",
|
|
34
|
+
transform: "translateY(-50%)"
|
|
35
|
+
}
|
|
36
|
+
})), B = ({
|
|
37
|
+
image: t,
|
|
38
|
+
title: o,
|
|
39
|
+
width: e = 250,
|
|
40
|
+
height: a = 250,
|
|
41
|
+
alt: l = "category",
|
|
42
|
+
titlePosition: p = "bottom",
|
|
43
|
+
titleAlignment: m = "center",
|
|
44
|
+
titleVariant: g = "body1",
|
|
45
|
+
titleColor: d,
|
|
46
|
+
titleBackgroundColor: b = "background.paper",
|
|
47
|
+
titleOpacity: f = 1,
|
|
48
|
+
borderRadius: s = 2,
|
|
49
|
+
disableHoverEffect: x = !1,
|
|
50
|
+
hoverScale: y = 1.1,
|
|
51
|
+
onClick: n,
|
|
52
|
+
sx: j,
|
|
53
|
+
titleSx: h,
|
|
54
|
+
imageSx: u
|
|
55
|
+
}) => /* @__PURE__ */ r.jsxs(
|
|
56
|
+
F,
|
|
57
|
+
{
|
|
58
|
+
disableHoverEffect: x,
|
|
59
|
+
hoverScale: y,
|
|
60
|
+
onClick: n,
|
|
61
|
+
sx: {
|
|
62
|
+
borderRadius: s,
|
|
63
|
+
cursor: n ? "pointer" : "default",
|
|
64
|
+
width: e,
|
|
65
|
+
height: a,
|
|
66
|
+
...j
|
|
67
|
+
},
|
|
68
|
+
children: [
|
|
69
|
+
/* @__PURE__ */ r.jsx(
|
|
70
|
+
C,
|
|
71
|
+
{
|
|
72
|
+
src: t,
|
|
73
|
+
width: e,
|
|
74
|
+
height: a,
|
|
75
|
+
alt: l,
|
|
76
|
+
style: {
|
|
77
|
+
objectFit: "cover",
|
|
78
|
+
...u
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
/* @__PURE__ */ r.jsx(
|
|
83
|
+
S,
|
|
84
|
+
{
|
|
85
|
+
titlePosition: p,
|
|
86
|
+
titleAlignment: m,
|
|
87
|
+
sx: {
|
|
88
|
+
borderRadius: s,
|
|
89
|
+
bgcolor: b,
|
|
90
|
+
opacity: f,
|
|
91
|
+
...h
|
|
92
|
+
},
|
|
93
|
+
children: /* @__PURE__ */ r.jsx(v, { variant: g, color: d, children: o })
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
export {
|
|
100
|
+
S as CategoryTitle,
|
|
101
|
+
F as Wrapper,
|
|
102
|
+
B as default
|
|
103
|
+
};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material';
|
|
3
|
+
/**
|
|
4
|
+
* Props for individual count box component
|
|
5
|
+
*/
|
|
6
|
+
export interface SCountBoxProps {
|
|
7
|
+
/** The numeric value to display */
|
|
8
|
+
digit: number;
|
|
9
|
+
/** The label/title for this time unit */
|
|
10
|
+
title: string;
|
|
11
|
+
/** Size variant for the count box */
|
|
12
|
+
size?: 'small' | 'medium' | 'large';
|
|
13
|
+
/** Color variant for the count box */
|
|
14
|
+
color?: 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'inherit';
|
|
15
|
+
/** Animation type for value changes */
|
|
16
|
+
animation?: 'none' | 'fade' | 'slide';
|
|
17
|
+
/** Custom styling */
|
|
18
|
+
sx?: SxProps<Theme>;
|
|
19
|
+
/** Custom digit styling */
|
|
20
|
+
digitSx?: SxProps<Theme>;
|
|
21
|
+
/** Custom title styling */
|
|
22
|
+
titleSx?: SxProps<Theme>;
|
|
23
|
+
/** Show separator after this box */
|
|
24
|
+
showSeparator?: boolean;
|
|
25
|
+
/** Custom separator element */
|
|
26
|
+
separator?: React.ReactNode;
|
|
27
|
+
/** Format for displaying the digit (e.g., '00' for zero-padding) */
|
|
28
|
+
digitFormat?: 'default' | 'padded';
|
|
29
|
+
/** Whether this count box is hidden */
|
|
30
|
+
hidden?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Individual count box component that displays a single time unit
|
|
34
|
+
*/
|
|
35
|
+
export declare const SCountBox: ({ digit, title, size, color, animation, sx, digitSx, titleSx, showSeparator, separator, digitFormat, hidden, }: SCountBoxProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
36
|
+
/**
|
|
37
|
+
* Props for the main countdown component
|
|
38
|
+
*/
|
|
39
|
+
export interface SCountDownProps {
|
|
40
|
+
/** Target date timestamp in milliseconds (from Date.getTime()) */
|
|
41
|
+
expireDate: number;
|
|
42
|
+
/** Size variant for all count boxes */
|
|
43
|
+
size?: 'small' | 'medium' | 'large';
|
|
44
|
+
/** Color theme for the countdown */
|
|
45
|
+
color?: 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'inherit';
|
|
46
|
+
/** Layout orientation */
|
|
47
|
+
layout?: 'horizontal' | 'vertical' | 'grid';
|
|
48
|
+
/** Animation type for value changes */
|
|
49
|
+
animation?: 'none' | 'fade' | 'slide';
|
|
50
|
+
/** Whether to show separators between units */
|
|
51
|
+
showSeparators?: boolean;
|
|
52
|
+
/** Custom separator element */
|
|
53
|
+
separator?: React.ReactNode;
|
|
54
|
+
/** Which time units to display */
|
|
55
|
+
units?: {
|
|
56
|
+
days?: boolean;
|
|
57
|
+
hours?: boolean;
|
|
58
|
+
minutes?: boolean;
|
|
59
|
+
seconds?: boolean;
|
|
60
|
+
};
|
|
61
|
+
/** Custom labels for time units */
|
|
62
|
+
labels?: {
|
|
63
|
+
days?: string;
|
|
64
|
+
hours?: string;
|
|
65
|
+
minutes?: string;
|
|
66
|
+
seconds?: string;
|
|
67
|
+
};
|
|
68
|
+
/** Format for displaying digits */
|
|
69
|
+
digitFormat?: 'default' | 'padded';
|
|
70
|
+
/** Callback fired when countdown reaches zero */
|
|
71
|
+
onComplete?: () => void;
|
|
72
|
+
/** Callback fired on each tick (every second) */
|
|
73
|
+
onTick?: (timeLeft: {
|
|
74
|
+
days: number;
|
|
75
|
+
hours: number;
|
|
76
|
+
minutes: number;
|
|
77
|
+
seconds: number;
|
|
78
|
+
}) => void;
|
|
79
|
+
/** Callback fired when countdown starts */
|
|
80
|
+
onStart?: () => void;
|
|
81
|
+
/** What to display when countdown is complete */
|
|
82
|
+
completedText?: React.ReactNode;
|
|
83
|
+
/** Whether to auto-hide completed units (e.g., hide days when 0) */
|
|
84
|
+
autoHideZeroUnits?: boolean;
|
|
85
|
+
/** Custom styling for the container */
|
|
86
|
+
sx?: SxProps<Theme>;
|
|
87
|
+
/** ARIA label for accessibility */
|
|
88
|
+
'aria-label'?: string;
|
|
89
|
+
/** Whether the countdown is paused */
|
|
90
|
+
paused?: boolean;
|
|
91
|
+
/** Responsive breakpoints for size changes */
|
|
92
|
+
responsive?: {
|
|
93
|
+
xs?: 'small' | 'medium' | 'large';
|
|
94
|
+
sm?: 'small' | 'medium' | 'large';
|
|
95
|
+
md?: 'small' | 'medium' | 'large';
|
|
96
|
+
lg?: 'small' | 'medium' | 'large';
|
|
97
|
+
xl?: 'small' | 'medium' | 'large';
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* SCountdown - A comprehensive countdown timer component with extensive customization options
|
|
102
|
+
*
|
|
103
|
+
* Features:
|
|
104
|
+
* - Multiple size variants and color themes
|
|
105
|
+
* - Flexible layout options (horizontal, vertical, grid)
|
|
106
|
+
* - Animation support for value changes
|
|
107
|
+
* - Customizable time units and labels
|
|
108
|
+
* - Auto-hide zero units option
|
|
109
|
+
* - Accessibility support with ARIA labels
|
|
110
|
+
* - Responsive design capabilities
|
|
111
|
+
* - Event callbacks for interaction
|
|
112
|
+
* - Pause/resume functionality
|
|
113
|
+
*
|
|
114
|
+
* @param props - SCountDownProps
|
|
115
|
+
* @returns JSX.Element - Countdown timer component
|
|
116
|
+
*/
|
|
117
|
+
declare const SCountdown: ({ expireDate, size, color, layout, animation, showSeparators, separator, units, labels, digitFormat, onComplete, onTick, onStart, completedText, autoHideZeroUnits, sx, "aria-label": ariaLabel, paused, responsive, }: SCountDownProps) => import("react/jsx-runtime").JSX.Element;
|
|
118
|
+
export default SCountdown;
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { j as e } from "../jsx-runtime-DywqP_6a.js";
|
|
2
|
+
import { Typography as x, Fade as A, Slide as B } from "@mui/material";
|
|
3
|
+
import M from "../hooks/use-count-down.js";
|
|
4
|
+
import p from "../s-flex-box/s-flex-box.js";
|
|
5
|
+
const T = ({
|
|
6
|
+
digit: y = 0,
|
|
7
|
+
title: i = "",
|
|
8
|
+
size: m = "medium",
|
|
9
|
+
color: u = "inherit",
|
|
10
|
+
animation: h = "none",
|
|
11
|
+
sx: g,
|
|
12
|
+
digitSx: S,
|
|
13
|
+
titleSx: f,
|
|
14
|
+
showSeparator: r = !1,
|
|
15
|
+
separator: j = ":",
|
|
16
|
+
digitFormat: w = "default",
|
|
17
|
+
hidden: k = !1
|
|
18
|
+
}) => {
|
|
19
|
+
if (k) return null;
|
|
20
|
+
const v = (t) => w === "padded" ? t.toString().padStart(2, "0") : t.toString(), s = (() => {
|
|
21
|
+
switch (m) {
|
|
22
|
+
case "small":
|
|
23
|
+
return {
|
|
24
|
+
digit: { fontSize: "1.5rem", lineHeight: 1.2 },
|
|
25
|
+
title: { fontSize: "0.75rem", letterSpacing: "0.05em" }
|
|
26
|
+
};
|
|
27
|
+
case "large":
|
|
28
|
+
return {
|
|
29
|
+
digit: { fontSize: "3.5rem", lineHeight: 1.1 },
|
|
30
|
+
title: { fontSize: "1rem", letterSpacing: "0.1em" }
|
|
31
|
+
};
|
|
32
|
+
default:
|
|
33
|
+
return {
|
|
34
|
+
digit: { fontSize: "2.5rem", lineHeight: 1.15 },
|
|
35
|
+
title: { fontSize: "0.875rem", letterSpacing: "0.08em" }
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
})(), l = v(y), o = /* @__PURE__ */ e.jsx(
|
|
39
|
+
x,
|
|
40
|
+
{
|
|
41
|
+
variant: "h3",
|
|
42
|
+
component: "span",
|
|
43
|
+
sx: {
|
|
44
|
+
fontWeight: 700,
|
|
45
|
+
color: u === "inherit" ? "text.primary" : `${u}.main`,
|
|
46
|
+
width: "70px",
|
|
47
|
+
...s.digit,
|
|
48
|
+
...S
|
|
49
|
+
},
|
|
50
|
+
children: l
|
|
51
|
+
}
|
|
52
|
+
), $ = /* @__PURE__ */ e.jsx(
|
|
53
|
+
x,
|
|
54
|
+
{
|
|
55
|
+
component: "span",
|
|
56
|
+
sx: {
|
|
57
|
+
color: "text.secondary",
|
|
58
|
+
fontWeight: 600,
|
|
59
|
+
textTransform: "uppercase",
|
|
60
|
+
display: "block",
|
|
61
|
+
mt: 0.5,
|
|
62
|
+
...s.title,
|
|
63
|
+
...f
|
|
64
|
+
},
|
|
65
|
+
children: i
|
|
66
|
+
}
|
|
67
|
+
), n = /* @__PURE__ */ e.jsxs(
|
|
68
|
+
p,
|
|
69
|
+
{
|
|
70
|
+
flexDirection: "column",
|
|
71
|
+
alignItems: "center",
|
|
72
|
+
sx: {
|
|
73
|
+
textAlign: "center",
|
|
74
|
+
minWidth: "fit-content",
|
|
75
|
+
...g
|
|
76
|
+
},
|
|
77
|
+
children: [
|
|
78
|
+
h === "fade" ? /* @__PURE__ */ e.jsx(A, { in: !0, timeout: 300, children: /* @__PURE__ */ e.jsx("div", { children: o }) }, l) : h === "slide" ? /* @__PURE__ */ e.jsx(B, { in: !0, direction: "up", timeout: 300, children: /* @__PURE__ */ e.jsx("div", { children: o }) }, l) : o,
|
|
79
|
+
$
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
return r ? /* @__PURE__ */ e.jsxs(p, { alignItems: "center", children: [
|
|
84
|
+
n,
|
|
85
|
+
/* @__PURE__ */ e.jsx(
|
|
86
|
+
x,
|
|
87
|
+
{
|
|
88
|
+
variant: "h3",
|
|
89
|
+
sx: {
|
|
90
|
+
color: "text.secondary",
|
|
91
|
+
...s.digit,
|
|
92
|
+
lineHeight: 1,
|
|
93
|
+
alignSelf: "flex-start",
|
|
94
|
+
mt: 0.5
|
|
95
|
+
},
|
|
96
|
+
children: j
|
|
97
|
+
}
|
|
98
|
+
)
|
|
99
|
+
] }) : n;
|
|
100
|
+
}, V = ({
|
|
101
|
+
expireDate: y,
|
|
102
|
+
size: i = "medium",
|
|
103
|
+
color: m = "inherit",
|
|
104
|
+
layout: u = "horizontal",
|
|
105
|
+
animation: h = "none",
|
|
106
|
+
showSeparators: g = !1,
|
|
107
|
+
separator: S = ":",
|
|
108
|
+
units: f = {
|
|
109
|
+
days: !0,
|
|
110
|
+
hours: !0,
|
|
111
|
+
minutes: !0,
|
|
112
|
+
seconds: !0
|
|
113
|
+
},
|
|
114
|
+
labels: r = {
|
|
115
|
+
days: "DAYS",
|
|
116
|
+
hours: "HOURS",
|
|
117
|
+
minutes: "MINS",
|
|
118
|
+
seconds: "SECS"
|
|
119
|
+
},
|
|
120
|
+
digitFormat: j = "default",
|
|
121
|
+
onComplete: w,
|
|
122
|
+
onTick: k,
|
|
123
|
+
onStart: v,
|
|
124
|
+
completedText: c = "Time is up!",
|
|
125
|
+
autoHideZeroUnits: s = !1,
|
|
126
|
+
sx: l,
|
|
127
|
+
"aria-label": o = "Countdown timer",
|
|
128
|
+
paused: $ = !1,
|
|
129
|
+
responsive: n
|
|
130
|
+
}) => {
|
|
131
|
+
const { timeLeft: t, isExpired: E } = M({
|
|
132
|
+
expireDate: y,
|
|
133
|
+
onComplete: w,
|
|
134
|
+
onTick: k,
|
|
135
|
+
onStart: v,
|
|
136
|
+
paused: $
|
|
137
|
+
});
|
|
138
|
+
if (E && c)
|
|
139
|
+
return /* @__PURE__ */ e.jsx(
|
|
140
|
+
p,
|
|
141
|
+
{
|
|
142
|
+
justifyContent: "center",
|
|
143
|
+
alignItems: "center",
|
|
144
|
+
sx: { textAlign: "center", ...l },
|
|
145
|
+
role: "timer",
|
|
146
|
+
"aria-label": `${o} - completed`,
|
|
147
|
+
children: typeof c == "string" ? /* @__PURE__ */ e.jsx(
|
|
148
|
+
x,
|
|
149
|
+
{
|
|
150
|
+
variant: i === "large" ? "h4" : i === "small" ? "h6" : "h5",
|
|
151
|
+
color: m === "inherit" ? "text.primary" : `${m}.main`,
|
|
152
|
+
sx: { fontWeight: 600 },
|
|
153
|
+
children: c
|
|
154
|
+
}
|
|
155
|
+
) : c
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
const C = [], I = [
|
|
159
|
+
{ key: "days", value: t.days, label: r.days },
|
|
160
|
+
{ key: "hours", value: t.hours, label: r.hours },
|
|
161
|
+
{ key: "minutes", value: t.minutes, label: r.minutes },
|
|
162
|
+
{ key: "seconds", value: t.seconds, label: r.seconds }
|
|
163
|
+
];
|
|
164
|
+
I.forEach((a, D) => {
|
|
165
|
+
if (f[a.key] && (!s || a.value > 0 || a.key === "seconds")) {
|
|
166
|
+
const W = D === I.length - 1, H = g && !W && I.slice(D + 1).some(
|
|
167
|
+
(z) => f[z.key] && (!s || z.value > 0 || z.key === "seconds")
|
|
168
|
+
);
|
|
169
|
+
C.push(
|
|
170
|
+
/* @__PURE__ */ e.jsx(
|
|
171
|
+
T,
|
|
172
|
+
{
|
|
173
|
+
digit: a.value,
|
|
174
|
+
title: a.label || "",
|
|
175
|
+
size: i,
|
|
176
|
+
color: m,
|
|
177
|
+
animation: h,
|
|
178
|
+
digitFormat: j,
|
|
179
|
+
showSeparator: H,
|
|
180
|
+
separator: S
|
|
181
|
+
},
|
|
182
|
+
a.key
|
|
183
|
+
)
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
const b = () => {
|
|
188
|
+
switch (u) {
|
|
189
|
+
case "vertical":
|
|
190
|
+
return {
|
|
191
|
+
flexDirection: "column",
|
|
192
|
+
gap: 2,
|
|
193
|
+
alignItems: "center"
|
|
194
|
+
};
|
|
195
|
+
case "grid":
|
|
196
|
+
return {
|
|
197
|
+
display: "grid",
|
|
198
|
+
gridTemplateColumns: `repeat(${C.length}, 1fr)`,
|
|
199
|
+
gap: 2,
|
|
200
|
+
justifyItems: "center"
|
|
201
|
+
};
|
|
202
|
+
default:
|
|
203
|
+
return {
|
|
204
|
+
flexDirection: "row",
|
|
205
|
+
gap: g ? 0 : 2,
|
|
206
|
+
alignItems: "center",
|
|
207
|
+
justifyContent: "center",
|
|
208
|
+
flexWrap: "wrap"
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}, d = n ? {
|
|
212
|
+
xs: n.xs || i,
|
|
213
|
+
sm: n.sm || i,
|
|
214
|
+
md: n.md || i,
|
|
215
|
+
lg: n.lg || i,
|
|
216
|
+
xl: n.xl || i
|
|
217
|
+
} : void 0;
|
|
218
|
+
return /* @__PURE__ */ e.jsx(
|
|
219
|
+
p,
|
|
220
|
+
{
|
|
221
|
+
sx: {
|
|
222
|
+
width: "fit-content",
|
|
223
|
+
...b(),
|
|
224
|
+
...l,
|
|
225
|
+
...d && {
|
|
226
|
+
// Apply responsive sizing if provided
|
|
227
|
+
"@media (max-width: 600px)": {
|
|
228
|
+
"& .MuiTypography-h3": {
|
|
229
|
+
fontSize: d.xs === "small" ? "1.5rem" : d.xs === "large" ? "3.5rem" : "2.5rem"
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
"@media (min-width: 600px) and (max-width: 960px)": {
|
|
233
|
+
"& .MuiTypography-h3": {
|
|
234
|
+
fontSize: d.sm === "small" ? "1.5rem" : d.sm === "large" ? "3.5rem" : "2.5rem"
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
role: "timer",
|
|
240
|
+
"aria-label": `${o} - ${t.days} days, ${t.hours} hours, ${t.minutes} minutes, ${t.seconds} seconds remaining`,
|
|
241
|
+
children: C
|
|
242
|
+
}
|
|
243
|
+
);
|
|
244
|
+
};
|
|
245
|
+
export {
|
|
246
|
+
T as SCountBox,
|
|
247
|
+
V as default
|
|
248
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PropsWithChildren } from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material/styles';
|
|
3
|
+
export interface SOverlayScrollbarProps extends PropsWithChildren {
|
|
4
|
+
className?: string;
|
|
5
|
+
sx?: SxProps<Theme>;
|
|
6
|
+
}
|
|
7
|
+
declare const SOverlayScrollbar: ({ sx, children, className }: SOverlayScrollbarProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default SOverlayScrollbar;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { j as t } from "../jsx-runtime-DywqP_6a.js";
|
|
2
|
+
import { OverlayScrollbarsComponent as l } from "overlayscrollbars-react";
|
|
3
|
+
import { s } from "../styled-DOEEZAON.js";
|
|
4
|
+
import { a as r } from "../colorManipulator-ep5lERxB.js";
|
|
5
|
+
import '../assets/s-overlay-scrollbar.css';const p = s(l)(({ theme: e }) => ({
|
|
6
|
+
maxHeight: "100%",
|
|
7
|
+
".os-theme-dark": {
|
|
8
|
+
"--os-size": "9px",
|
|
9
|
+
"--os-handle-bg": r(e.palette.grey[400], 0.5),
|
|
10
|
+
"--os-handle-bg-hover": r(e.palette.grey[400], 0.6),
|
|
11
|
+
"--os-handle-bg-active": r(e.palette.grey[400], 0.6)
|
|
12
|
+
}
|
|
13
|
+
})), y = ({ sx: e, children: o, className: a }) => /* @__PURE__ */ t.jsx(
|
|
14
|
+
p,
|
|
15
|
+
{
|
|
16
|
+
defer: !0,
|
|
17
|
+
sx: e,
|
|
18
|
+
className: a,
|
|
19
|
+
options: { scrollbars: { autoHide: "leave", autoHideDelay: 100 } },
|
|
20
|
+
children: o
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
export {
|
|
24
|
+
y as default
|
|
25
|
+
};
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"registry": "https://registry.npmjs.org"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.0.
|
|
6
|
+
"version": "1.0.113",
|
|
7
7
|
"description": "advanced ui kit for solostylist",
|
|
8
8
|
"private": false,
|
|
9
9
|
"type": "module",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"@tiptap/react": "^2.11.9",
|
|
46
46
|
"@tiptap/starter-kit": "^2.11.9",
|
|
47
47
|
"dayjs": "^1.11.13",
|
|
48
|
+
"emoji-picker-react": "^4.13.3",
|
|
48
49
|
"framer-motion": "^12.23.3",
|
|
49
50
|
"i18next": "^25.0.2",
|
|
50
51
|
"i18next-http-backend": "^3.0.2",
|
|
@@ -56,7 +57,7 @@
|
|
|
56
57
|
"react-slick": "^0.31.0",
|
|
57
58
|
"slick-carousel": "^1.8.1",
|
|
58
59
|
"uuid": "^11.1.0",
|
|
59
|
-
"
|
|
60
|
+
"overlayscrollbars-react": "^0.5.6"
|
|
60
61
|
},
|
|
61
62
|
"devDependencies": {
|
|
62
63
|
"@ianvs/prettier-plugin-sort-imports": "^4.4.2",
|