funuicss 2.7.13 → 2.7.15
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/css/fun.css +115 -3
- package/index.d.ts +1 -0
- package/index.js +3 -1
- package/index.tsx +1 -0
- package/package.json +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/ui/carousel/Carousel.d.ts +1 -0
- package/ui/carousel/Carousel.js +70 -16
- package/ui/carousel/Carousel.tsx +116 -41
- package/ui/richtext/RichText.d.ts +8 -6
- package/ui/richtext/RichText.js +31 -27
- package/ui/richtext/RichText.tsx +66 -55
- package/ui/slider/Slider.d.ts +14 -0
- package/ui/slider/Slider.js +57 -0
- package/ui/slider/Slider.tsx +75 -0
- package/ui/theme/themes.js +1 -1
- package/ui/theme/themes.ts +3 -3
- package/ui/vista/Vista.d.ts +2 -0
- package/ui/vista/Vista.js +17 -4
- package/ui/vista/Vista.tsx +22 -2
package/ui/carousel/Carousel.js
CHANGED
|
@@ -43,8 +43,35 @@ var Circle_1 = __importDefault(require("../specials/Circle"));
|
|
|
43
43
|
var RowFlex_1 = __importDefault(require("../specials/RowFlex"));
|
|
44
44
|
var Functions_1 = require("../../utils/Functions");
|
|
45
45
|
var Carousel = function (_a) {
|
|
46
|
-
var _b = _a.scrollNumber, scrollNumber = _b === void 0 ? 320 : _b, _c = _a.gap, gap = _c === void 0 ? 0.5 : _c, _d = _a.funcss, funcss = _d === void 0 ? '' : _d, children = _a.children;
|
|
46
|
+
var _b = _a.scrollNumber, scrollNumber = _b === void 0 ? 320 : _b, _c = _a.gap, gap = _c === void 0 ? 0.5 : _c, _d = _a.funcss, funcss = _d === void 0 ? '' : _d, _e = _a.showDashes, showDashes = _e === void 0 ? true : _e, children = _a.children;
|
|
47
47
|
var scrollRef = (0, react_1.useRef)(null);
|
|
48
|
+
var _f = (0, react_1.useState)('start'), scrollPosition = _f[0], setScrollPosition = _f[1];
|
|
49
|
+
var _g = (0, react_1.useState)(false), isPhone = _g[0], setIsPhone = _g[1];
|
|
50
|
+
(0, react_1.useEffect)(function () {
|
|
51
|
+
if ((0, Functions_1.isTouchDevice)()) {
|
|
52
|
+
setIsPhone(true);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
setIsPhone(false);
|
|
56
|
+
}
|
|
57
|
+
}, []);
|
|
58
|
+
// Track scroll position
|
|
59
|
+
var handleScroll = function () {
|
|
60
|
+
var container = scrollRef.current;
|
|
61
|
+
if (!container)
|
|
62
|
+
return;
|
|
63
|
+
var scrollLeft = container.scrollLeft, scrollWidth = container.scrollWidth, clientWidth = container.clientWidth;
|
|
64
|
+
var maxScrollLeft = scrollWidth - clientWidth;
|
|
65
|
+
if (scrollLeft === 0) {
|
|
66
|
+
setScrollPosition('start');
|
|
67
|
+
}
|
|
68
|
+
else if (scrollLeft >= maxScrollLeft - 10) {
|
|
69
|
+
setScrollPosition('end');
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
setScrollPosition('middle');
|
|
73
|
+
}
|
|
74
|
+
};
|
|
48
75
|
var scroll = function (direction) {
|
|
49
76
|
var container = scrollRef.current;
|
|
50
77
|
if (!container)
|
|
@@ -54,25 +81,52 @@ var Carousel = function (_a) {
|
|
|
54
81
|
behavior: 'smooth',
|
|
55
82
|
});
|
|
56
83
|
};
|
|
57
|
-
var _e = (0, react_1.useState)(false), isPhone = _e[0], setisPhone = _e[1];
|
|
58
84
|
(0, react_1.useEffect)(function () {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
setisPhone(false);
|
|
85
|
+
var container = scrollRef.current;
|
|
86
|
+
if (container) {
|
|
87
|
+
container.addEventListener('scroll', handleScroll);
|
|
88
|
+
return function () { return container.removeEventListener('scroll', handleScroll); };
|
|
64
89
|
}
|
|
65
90
|
}, []);
|
|
66
|
-
return (react_1.default.createElement(
|
|
67
|
-
|
|
68
|
-
react_1.default.createElement("div", null,
|
|
91
|
+
return (react_1.default.createElement("div", { className: "carousel-wrapper ".concat(funcss) },
|
|
92
|
+
react_1.default.createElement(RowFlex_1.default, { gap: 1, wrap: "nowrap", alignItems: "center" },
|
|
93
|
+
!isPhone && (react_1.default.createElement("div", null,
|
|
69
94
|
react_1.default.createElement(Circle_1.default, { onClick: function () { return scroll('left'); } },
|
|
70
|
-
react_1.default.createElement(pi_1.PiCaretLeft, { size: 24 }))),
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
95
|
+
react_1.default.createElement(pi_1.PiCaretLeft, { size: 24 })))),
|
|
96
|
+
react_1.default.createElement("div", { ref: scrollRef, className: "carousel-container scrollbar-hide w-full", style: {
|
|
97
|
+
width: '100%',
|
|
98
|
+
gap: gap + 'rem',
|
|
99
|
+
overflowX: 'auto',
|
|
100
|
+
display: 'flex',
|
|
101
|
+
scrollSnapType: 'x mandatory',
|
|
102
|
+
scrollBehavior: 'smooth',
|
|
103
|
+
} }, react_1.default.Children.map(children, function (child) { return (react_1.default.createElement("div", { className: "carousel-item", style: { flexShrink: 0 } },
|
|
104
|
+
react_1.default.createElement("div", { className: "carousel-card" }, child))); })),
|
|
105
|
+
!isPhone && (react_1.default.createElement("div", null,
|
|
75
106
|
react_1.default.createElement(Circle_1.default, { onClick: function () { return scroll('right'); } },
|
|
76
|
-
react_1.default.createElement(pi_1.PiCaretRight, { size: 24 })))))
|
|
107
|
+
react_1.default.createElement(pi_1.PiCaretRight, { size: 24 }))))),
|
|
108
|
+
showDashes && (react_1.default.createElement("div", { className: "center padding-top-10" },
|
|
109
|
+
react_1.default.createElement(RowFlex_1.default, { gap: 0.5, justify: "center" }, ['start', 'middle', 'end'].map(function (pos) { return (react_1.default.createElement("div", { className: 'pointer ', key: pos, onClick: function () {
|
|
110
|
+
var _a, _b;
|
|
111
|
+
if (pos === 'start') {
|
|
112
|
+
scroll('left');
|
|
113
|
+
}
|
|
114
|
+
else if (pos === 'middle') {
|
|
115
|
+
(_a = scrollRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo({
|
|
116
|
+
left: ((_b = scrollRef.current) === null || _b === void 0 ? void 0 : _b.scrollWidth) / 2,
|
|
117
|
+
behavior: 'smooth',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
else if (pos === 'end') {
|
|
121
|
+
scroll('right');
|
|
122
|
+
}
|
|
123
|
+
}, style: {
|
|
124
|
+
width: '10px',
|
|
125
|
+
height: '10px',
|
|
126
|
+
background: scrollPosition === pos ? 'var(--primary)' : 'var(--borderColor)',
|
|
127
|
+
borderRadius: '50%',
|
|
128
|
+
transform: scrollPosition === pos ? 'scale(1.3)' : 'scale(0.9)',
|
|
129
|
+
transition: 'transform 0.3s ease, background 0.3s ease',
|
|
130
|
+
} })); }))))));
|
|
77
131
|
};
|
|
78
132
|
exports.default = Carousel;
|
package/ui/carousel/Carousel.tsx
CHANGED
|
@@ -6,15 +6,48 @@ import RowFlex from '../specials/RowFlex';
|
|
|
6
6
|
import { isTouchDevice } from '../../utils/Functions';
|
|
7
7
|
|
|
8
8
|
interface CarouselProps {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
scrollNumber?: number;
|
|
10
|
+
gap?: number;
|
|
11
|
+
funcss?: string;
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
showDashes?: boolean;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
const Carousel: React.FC<CarouselProps> = ({
|
|
16
|
+
const Carousel: React.FC<CarouselProps> = ({
|
|
17
|
+
scrollNumber = 320,
|
|
18
|
+
gap = 0.5,
|
|
19
|
+
funcss = '',
|
|
20
|
+
showDashes = true,
|
|
21
|
+
children,
|
|
22
|
+
}) => {
|
|
17
23
|
const scrollRef = useRef<HTMLDivElement | null>(null);
|
|
24
|
+
const [scrollPosition, setScrollPosition] = useState<'start' | 'middle' | 'end'>('start');
|
|
25
|
+
const [isPhone, setIsPhone] = useState(false);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (isTouchDevice()) {
|
|
29
|
+
setIsPhone(true);
|
|
30
|
+
} else {
|
|
31
|
+
setIsPhone(false);
|
|
32
|
+
}
|
|
33
|
+
}, []);
|
|
34
|
+
|
|
35
|
+
// Track scroll position
|
|
36
|
+
const handleScroll = () => {
|
|
37
|
+
const container = scrollRef.current;
|
|
38
|
+
if (!container) return;
|
|
39
|
+
|
|
40
|
+
const { scrollLeft, scrollWidth, clientWidth } = container;
|
|
41
|
+
const maxScrollLeft = scrollWidth - clientWidth;
|
|
42
|
+
|
|
43
|
+
if (scrollLeft === 0) {
|
|
44
|
+
setScrollPosition('start');
|
|
45
|
+
} else if (scrollLeft >= maxScrollLeft - 10) {
|
|
46
|
+
setScrollPosition('end');
|
|
47
|
+
} else {
|
|
48
|
+
setScrollPosition('middle');
|
|
49
|
+
}
|
|
50
|
+
};
|
|
18
51
|
|
|
19
52
|
const scroll = (direction: 'left' | 'right') => {
|
|
20
53
|
const container = scrollRef.current;
|
|
@@ -25,48 +58,90 @@ const Carousel: React.FC<CarouselProps> = ({ scrollNumber = 320, gap = 0.5, func
|
|
|
25
58
|
behavior: 'smooth',
|
|
26
59
|
});
|
|
27
60
|
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
61
|
+
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
const container = scrollRef.current;
|
|
64
|
+
if (container) {
|
|
65
|
+
container.addEventListener('scroll', handleScroll);
|
|
66
|
+
return () => container.removeEventListener('scroll', handleScroll);
|
|
34
67
|
}
|
|
35
68
|
}, []);
|
|
36
69
|
|
|
37
70
|
return (
|
|
38
|
-
<
|
|
39
|
-
|
|
40
|
-
!isPhone &&
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
71
|
+
<div className={`carousel-wrapper ${funcss}`}>
|
|
72
|
+
<RowFlex gap={1} wrap="nowrap" alignItems="center">
|
|
73
|
+
{!isPhone && (
|
|
74
|
+
<div>
|
|
75
|
+
<Circle onClick={() => scroll('left')}>
|
|
76
|
+
<PiCaretLeft size={24} />
|
|
77
|
+
</Circle>
|
|
78
|
+
</div>
|
|
79
|
+
)}
|
|
47
80
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
81
|
+
<div
|
|
82
|
+
ref={scrollRef}
|
|
83
|
+
className={`carousel-container scrollbar-hide w-full`}
|
|
84
|
+
style={{
|
|
85
|
+
width: '100%',
|
|
86
|
+
gap: gap + 'rem',
|
|
87
|
+
overflowX: 'auto',
|
|
88
|
+
display: 'flex',
|
|
89
|
+
scrollSnapType: 'x mandatory',
|
|
90
|
+
scrollBehavior: 'smooth',
|
|
91
|
+
}}
|
|
92
|
+
>
|
|
93
|
+
{React.Children.map(children, (child) => (
|
|
94
|
+
<div className="carousel-item" style={{ flexShrink: 0 }}>
|
|
95
|
+
<div className="carousel-card">{child}</div>
|
|
96
|
+
</div>
|
|
97
|
+
))}
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
{!isPhone && (
|
|
101
|
+
<div>
|
|
102
|
+
<Circle onClick={() => scroll('right')}>
|
|
103
|
+
<PiCaretRight size={24} />
|
|
104
|
+
</Circle>
|
|
57
105
|
</div>
|
|
58
|
-
)
|
|
59
|
-
</
|
|
106
|
+
)}
|
|
107
|
+
</RowFlex>
|
|
60
108
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
109
|
+
{/* Dashes below the carousel */}
|
|
110
|
+
{
|
|
111
|
+
showDashes && (
|
|
112
|
+
<div className="center padding-top-10">
|
|
113
|
+
<RowFlex gap={0.5} justify="center">
|
|
114
|
+
{['start', 'middle', 'end'].map((pos) => (
|
|
115
|
+
<div
|
|
116
|
+
className={'pointer '}
|
|
117
|
+
key={pos}
|
|
118
|
+
onClick={() => {
|
|
119
|
+
if(pos === 'start') {
|
|
120
|
+
scroll('left')
|
|
121
|
+
} else if(pos === 'middle') {
|
|
122
|
+
scrollRef.current?.scrollTo({
|
|
123
|
+
left: scrollRef.current?.scrollWidth / 2,
|
|
124
|
+
behavior: 'smooth',
|
|
125
|
+
});
|
|
126
|
+
} else if(pos === 'end') {
|
|
127
|
+
scroll('right')
|
|
128
|
+
}
|
|
129
|
+
}}
|
|
130
|
+
style={{
|
|
131
|
+
width: '10px',
|
|
132
|
+
height: '10px',
|
|
133
|
+
background: scrollPosition === pos ? 'var(--primary)' : 'var(--borderColor)',
|
|
134
|
+
borderRadius: '50%',
|
|
135
|
+
transform: scrollPosition === pos ? 'scale(1.3)' : 'scale(0.9)',
|
|
136
|
+
transition: 'transform 0.3s ease, background 0.3s ease',
|
|
137
|
+
}}
|
|
138
|
+
/>
|
|
139
|
+
))}
|
|
140
|
+
</RowFlex>
|
|
141
|
+
</div>
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
</div>
|
|
70
145
|
);
|
|
71
146
|
};
|
|
72
147
|
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import 'quill/dist/quill.bubble.css';
|
|
3
|
+
import 'quill/dist/quill.snow.css';
|
|
3
4
|
interface RichTextProps {
|
|
4
|
-
/** The HTML content of the editor */
|
|
5
5
|
value: string;
|
|
6
|
-
showEmojis: boolean;
|
|
7
|
-
/** Function triggered when the editor content changes */
|
|
8
6
|
onChange: (content: string) => void;
|
|
9
|
-
|
|
7
|
+
showEmojis?: boolean;
|
|
10
8
|
placeholder?: string;
|
|
11
|
-
/** Optional ReactNode to be rendered after the emoji dropdown */
|
|
12
9
|
afterEmoji?: React.ReactNode;
|
|
13
|
-
/** Extra class names for container styling */
|
|
14
10
|
funcss?: string;
|
|
11
|
+
/** Custom Quill modules (e.g., additional toolbar items) */
|
|
12
|
+
modules?: any;
|
|
13
|
+
/** Quill theme (e.g. 'bubble' | 'snow') */
|
|
14
|
+
theme?: 'bubble' | 'snow';
|
|
15
|
+
/** Optional fontFamily override */
|
|
16
|
+
fontFamily?: string;
|
|
15
17
|
}
|
|
16
18
|
declare const RichText: React.FC<RichTextProps>;
|
|
17
19
|
export default RichText;
|
package/ui/richtext/RichText.js
CHANGED
|
@@ -40,6 +40,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
40
40
|
var react_1 = __importStar(require("react"));
|
|
41
41
|
var react_quilljs_1 = require("react-quilljs");
|
|
42
42
|
require("quill/dist/quill.bubble.css");
|
|
43
|
+
require("quill/dist/quill.snow.css"); // Add support for snow theme
|
|
43
44
|
var md_1 = require("react-icons/md");
|
|
44
45
|
var Emojis_1 = require("../../utils/Emojis");
|
|
45
46
|
var Dropdown_1 = __importDefault(require("../drop/Dropdown"));
|
|
@@ -48,15 +49,17 @@ var ToolTip_1 = __importDefault(require("../tooltip/ToolTip"));
|
|
|
48
49
|
var Circle_1 = __importDefault(require("../specials/Circle"));
|
|
49
50
|
var Tip_1 = __importDefault(require("../tooltip/Tip"));
|
|
50
51
|
var RichText = function (_a) {
|
|
51
|
-
var value = _a.value, onChange = _a.onChange, _b = _a.placeholder, placeholder =
|
|
52
|
-
var _d = (0, react_quilljs_1.useQuill)({
|
|
53
|
-
theme: 'bubble',
|
|
54
|
-
placeholder: placeholder,
|
|
55
|
-
modules: {
|
|
56
|
-
toolbar: [['bold', 'italic', 'underline'], [{ list: 'bullet' }]],
|
|
57
|
-
},
|
|
58
|
-
}), quill = _d.quill, quillRef = _d.quillRef;
|
|
52
|
+
var value = _a.value, onChange = _a.onChange, _b = _a.showEmojis, showEmojis = _b === void 0 ? false : _b, _c = _a.placeholder, placeholder = _c === void 0 ? 'Write something...' : _c, afterEmoji = _a.afterEmoji, _d = _a.funcss, funcss = _d === void 0 ? '' : _d, modules = _a.modules, _e = _a.theme, theme = _e === void 0 ? 'bubble' : _e, fontFamily = _a.fontFamily;
|
|
59
53
|
var savedRange = (0, react_1.useRef)(null);
|
|
54
|
+
// Default modules (basic toolbar)
|
|
55
|
+
var defaultModules = {
|
|
56
|
+
toolbar: [['bold', 'italic', 'underline'], [{ list: 'bullet' }]],
|
|
57
|
+
};
|
|
58
|
+
var _f = (0, react_quilljs_1.useQuill)({
|
|
59
|
+
theme: theme,
|
|
60
|
+
placeholder: placeholder,
|
|
61
|
+
modules: modules || defaultModules,
|
|
62
|
+
}), quill = _f.quill, quillRef = _f.quillRef;
|
|
60
63
|
(0, react_1.useEffect)(function () {
|
|
61
64
|
if (!quill)
|
|
62
65
|
return;
|
|
@@ -89,24 +92,25 @@ var RichText = function (_a) {
|
|
|
89
92
|
react_1.default.createElement("div", { className: "mb-2 mt-2 text-sm" }, title),
|
|
90
93
|
react_1.default.createElement(RowFlex_1.default, { gap: 0.3 }, emojis.map(function (emoji, i) { return (react_1.default.createElement("span", { key: i, className: "h6 pointer", onClick: function () { return insertEmoji(emoji); } }, emoji)); })))); };
|
|
91
94
|
return (react_1.default.createElement("div", { className: funcss },
|
|
92
|
-
react_1.default.createElement("div", { id: "
|
|
93
|
-
react_1.default.createElement("div", { ref: quillRef, className: "bubble-editor"
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
react_1.default.createElement(
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
95
|
+
react_1.default.createElement("div", { id: "editor-container", className: "bubble-editor-container p-0" },
|
|
96
|
+
react_1.default.createElement("div", { ref: quillRef, className: theme === 'bubble' ? "bubble-editor " : "snow-editor ", style: {
|
|
97
|
+
fontFamily: fontFamily || 'inherit',
|
|
98
|
+
} })),
|
|
99
|
+
(showEmojis || afterEmoji) && (react_1.default.createElement(RowFlex_1.default, { gap: 0.5, funcss: 'mt-1' },
|
|
100
|
+
showEmojis && (react_1.default.createElement(Dropdown_1.default, { closableOnlyOutside: true, direction: "dropdown", openOnHover: false, button: react_1.default.createElement(ToolTip_1.default, null,
|
|
101
|
+
react_1.default.createElement(Circle_1.default, { funcss: "bg border" },
|
|
102
|
+
react_1.default.createElement(md_1.MdOutlineEmojiEmotions, null)),
|
|
103
|
+
react_1.default.createElement(Tip_1.default, { tip: "top", animation: "ScaleUp", duration: 0.5, content: "Emojis" })), items: [
|
|
104
|
+
{
|
|
105
|
+
label: (react_1.default.createElement("div", { className: "w-200 h-300", style: { overflowY: 'auto' } },
|
|
106
|
+
renderEmojiSection('❤️ Smileys & People', Emojis_1.AllEmojis.Smiley),
|
|
107
|
+
renderEmojiSection('👍 Gestures & Body Parts', Emojis_1.AllEmojis.Gesture),
|
|
108
|
+
renderEmojiSection('🔥 Symbols & Expressions', Emojis_1.AllEmojis.Symbols),
|
|
109
|
+
renderEmojiSection('🚀 Travel, Objects & Activities', Emojis_1.AllEmojis.Travel),
|
|
110
|
+
renderEmojiSection('👨👩👧👦 People & Professions', Emojis_1.AllEmojis.People),
|
|
111
|
+
renderEmojiSection('🐶 Animals & Nature', Emojis_1.AllEmojis.Animals))),
|
|
112
|
+
},
|
|
113
|
+
] })),
|
|
114
|
+
afterEmoji))));
|
|
111
115
|
};
|
|
112
116
|
exports.default = RichText;
|
package/ui/richtext/RichText.tsx
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import React, { useEffect, useRef } from 'react';
|
|
3
3
|
import { useQuill } from 'react-quilljs';
|
|
4
4
|
import 'quill/dist/quill.bubble.css';
|
|
5
|
+
import 'quill/dist/quill.snow.css'; // Add support for snow theme
|
|
5
6
|
import { MdOutlineEmojiEmotions } from 'react-icons/md';
|
|
6
7
|
import { AllEmojis } from '../../utils/Emojis';
|
|
7
8
|
import Dropdown from '../drop/Dropdown';
|
|
@@ -10,47 +11,53 @@ import ToolTip from '../tooltip/ToolTip';
|
|
|
10
11
|
import Circle from '../specials/Circle';
|
|
11
12
|
import Tip from '../tooltip/Tip';
|
|
12
13
|
|
|
13
|
-
// ✅ Define RangeStatic locally since Quill does not export it
|
|
14
14
|
type RangeStatic = {
|
|
15
15
|
index: number;
|
|
16
16
|
length: number;
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
interface RichTextProps {
|
|
20
|
-
/** The HTML content of the editor */
|
|
21
20
|
value: string;
|
|
22
|
-
showEmojis: boolean;
|
|
23
|
-
/** Function triggered when the editor content changes */
|
|
24
21
|
onChange: (content: string) => void;
|
|
25
|
-
|
|
26
|
-
/** Placeholder shown when editor is empty */
|
|
22
|
+
showEmojis?: boolean;
|
|
27
23
|
placeholder?: string;
|
|
28
|
-
|
|
29
|
-
/** Optional ReactNode to be rendered after the emoji dropdown */
|
|
30
24
|
afterEmoji?: React.ReactNode;
|
|
31
|
-
|
|
32
|
-
/** Extra class names for container styling */
|
|
33
25
|
funcss?: string;
|
|
26
|
+
|
|
27
|
+
/** Custom Quill modules (e.g., additional toolbar items) */
|
|
28
|
+
modules?: any;
|
|
29
|
+
|
|
30
|
+
/** Quill theme (e.g. 'bubble' | 'snow') */
|
|
31
|
+
theme?: 'bubble' | 'snow';
|
|
32
|
+
|
|
33
|
+
/** Optional fontFamily override */
|
|
34
|
+
fontFamily?: string;
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
const RichText: React.FC<RichTextProps> = ({
|
|
37
38
|
value,
|
|
38
39
|
onChange,
|
|
40
|
+
showEmojis = false,
|
|
39
41
|
placeholder = 'Write something...',
|
|
40
42
|
afterEmoji,
|
|
41
|
-
showEmojis,
|
|
42
43
|
funcss = '',
|
|
44
|
+
modules,
|
|
45
|
+
theme = 'bubble',
|
|
46
|
+
fontFamily,
|
|
43
47
|
}) => {
|
|
48
|
+
const savedRange = useRef<RangeStatic | null>(null);
|
|
49
|
+
|
|
50
|
+
// Default modules (basic toolbar)
|
|
51
|
+
const defaultModules = {
|
|
52
|
+
toolbar: [['bold', 'italic', 'underline'], [{ list: 'bullet' }]],
|
|
53
|
+
};
|
|
54
|
+
|
|
44
55
|
const { quill, quillRef } = useQuill({
|
|
45
|
-
theme
|
|
56
|
+
theme,
|
|
46
57
|
placeholder,
|
|
47
|
-
modules:
|
|
48
|
-
toolbar: [['bold', 'italic', 'underline'], [{ list: 'bullet' }]],
|
|
49
|
-
},
|
|
58
|
+
modules: modules || defaultModules,
|
|
50
59
|
});
|
|
51
60
|
|
|
52
|
-
const savedRange = useRef<RangeStatic | null>(null);
|
|
53
|
-
|
|
54
61
|
useEffect(() => {
|
|
55
62
|
if (!quill) return;
|
|
56
63
|
|
|
@@ -98,46 +105,50 @@ const RichText: React.FC<RichTextProps> = ({
|
|
|
98
105
|
);
|
|
99
106
|
|
|
100
107
|
return (
|
|
101
|
-
<div
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
108
|
+
<div
|
|
109
|
+
className={funcss}
|
|
110
|
+
>
|
|
111
|
+
<div id="editor-container" className="bubble-editor-container p-0">
|
|
112
|
+
<div ref={quillRef} className={theme === 'bubble' ? "bubble-editor " : "snow-editor "}
|
|
113
|
+
style={{
|
|
114
|
+
fontFamily: fontFamily || 'inherit',
|
|
115
|
+
}}/>
|
|
105
116
|
</div>
|
|
106
117
|
|
|
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
|
-
|
|
118
|
+
{(showEmojis || afterEmoji) && (
|
|
119
|
+
<RowFlex gap={0.5} funcss='mt-1'>
|
|
120
|
+
{showEmojis && (
|
|
121
|
+
<Dropdown
|
|
122
|
+
closableOnlyOutside
|
|
123
|
+
direction="dropdown"
|
|
124
|
+
openOnHover={false}
|
|
125
|
+
button={
|
|
126
|
+
<ToolTip>
|
|
127
|
+
<Circle funcss="bg border">
|
|
128
|
+
<MdOutlineEmojiEmotions />
|
|
129
|
+
</Circle>
|
|
130
|
+
<Tip tip="top" animation="ScaleUp" duration={0.5} content="Emojis" />
|
|
131
|
+
</ToolTip>
|
|
132
|
+
}
|
|
133
|
+
items={[
|
|
134
|
+
{
|
|
135
|
+
label: (
|
|
136
|
+
<div className="w-200 h-300" style={{ overflowY: 'auto' }}>
|
|
137
|
+
{renderEmojiSection('❤️ Smileys & People', AllEmojis.Smiley)}
|
|
138
|
+
{renderEmojiSection('👍 Gestures & Body Parts', AllEmojis.Gesture)}
|
|
139
|
+
{renderEmojiSection('🔥 Symbols & Expressions', AllEmojis.Symbols)}
|
|
140
|
+
{renderEmojiSection('🚀 Travel, Objects & Activities', AllEmojis.Travel)}
|
|
141
|
+
{renderEmojiSection('👨👩👧👦 People & Professions', AllEmojis.People)}
|
|
142
|
+
{renderEmojiSection('🐶 Animals & Nature', AllEmojis.Animals)}
|
|
143
|
+
</div>
|
|
144
|
+
),
|
|
145
|
+
},
|
|
146
|
+
]}
|
|
147
|
+
/>
|
|
148
|
+
)}
|
|
149
|
+
{afterEmoji}
|
|
150
|
+
</RowFlex>
|
|
151
|
+
)}
|
|
141
152
|
</div>
|
|
142
153
|
);
|
|
143
154
|
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
type RangeSliderProps = {
|
|
3
|
+
min?: number;
|
|
4
|
+
max?: number;
|
|
5
|
+
step?: number;
|
|
6
|
+
value: number;
|
|
7
|
+
height?: number;
|
|
8
|
+
onChange: (value: number) => void;
|
|
9
|
+
label?: string;
|
|
10
|
+
showTooltip?: boolean;
|
|
11
|
+
funcss?: string;
|
|
12
|
+
};
|
|
13
|
+
declare const Slider: React.FC<RangeSliderProps>;
|
|
14
|
+
export default Slider;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
var react_1 = __importStar(require("react"));
|
|
38
|
+
var getCssVariable_1 = require("../../utils/getCssVariable");
|
|
39
|
+
var Slider = function (_a) {
|
|
40
|
+
var _b = _a.min, min = _b === void 0 ? 0 : _b, _c = _a.max, max = _c === void 0 ? 100 : _c, _d = _a.step, step = _d === void 0 ? 1 : _d, value = _a.value, onChange = _a.onChange, _e = _a.height, height = _e === void 0 ? 6 : _e, label = _a.label, _f = _a.showTooltip, showTooltip = _f === void 0 ? true : _f, _g = _a.funcss, funcss = _g === void 0 ? '' : _g;
|
|
41
|
+
var _h = (0, react_1.useState)(false), isDragging = _h[0], setIsDragging = _h[1];
|
|
42
|
+
var handleChange = function (e) {
|
|
43
|
+
onChange(Number(e.target.value));
|
|
44
|
+
};
|
|
45
|
+
var percent = ((value - min) / (max - min)) * 100;
|
|
46
|
+
var pColor = (0, getCssVariable_1.getCssVariableValue)("primary");
|
|
47
|
+
return (react_1.default.createElement("div", { className: "range-slider-container ".concat(funcss) },
|
|
48
|
+
react_1.default.createElement("div", { className: "range-wrapper" },
|
|
49
|
+
showTooltip && (react_1.default.createElement("div", { className: "range-tooltip ".concat(isDragging ? 'visible' : ''), style: { left: "calc(".concat(percent, "% - 20px)") } },
|
|
50
|
+
value,
|
|
51
|
+
"%")),
|
|
52
|
+
react_1.default.createElement("input", { type: "range", min: min, max: max, step: step, value: value, onChange: handleChange, onMouseDown: function () { return setIsDragging(true); }, onMouseUp: function () { return setIsDragging(false); }, onTouchStart: function () { return setIsDragging(true); }, onTouchEnd: function () { return setIsDragging(false); }, className: "range-slider", style: {
|
|
53
|
+
background: "linear-gradient(to right, ".concat(pColor, " 0%, ").concat(pColor, " ").concat(percent, "%, var(--lighter) ").concat(percent, "%, var(--lighter) 100%)"),
|
|
54
|
+
height: "".concat(height, "px"),
|
|
55
|
+
} }))));
|
|
56
|
+
};
|
|
57
|
+
exports.default = Slider;
|