@underverse-ui/underverse 1.0.202 → 1.0.204

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +8 -2
  2. package/api-reference.json +1 -1
  3. package/dist/EmojiPicker-UN6N7YVB.js +14 -0
  4. package/dist/EmojiPicker-UN6N7YVB.js.map +1 -0
  5. package/dist/chunk-4TYW5K4J.js +769 -0
  6. package/dist/chunk-4TYW5K4J.js.map +1 -0
  7. package/dist/chunk-CC3QO2YM.js +14506 -0
  8. package/dist/chunk-CC3QO2YM.js.map +1 -0
  9. package/dist/chunk-CKKLFVOY.js +206 -0
  10. package/dist/chunk-CKKLFVOY.js.map +1 -0
  11. package/dist/chunk-GSBRTFP2.js +2464 -0
  12. package/dist/chunk-GSBRTFP2.js.map +1 -0
  13. package/dist/chunk-KFTYWTJR.js +4481 -0
  14. package/dist/chunk-KFTYWTJR.js.map +1 -0
  15. package/dist/chunk-NSBPE2FW.js +17 -0
  16. package/dist/chunk-NSBPE2FW.js.map +1 -0
  17. package/dist/chunk-QVQTWZ24.js +199 -0
  18. package/dist/chunk-QVQTWZ24.js.map +1 -0
  19. package/dist/chunk-ZUAIBY2Z.js +74 -0
  20. package/dist/chunk-ZUAIBY2Z.js.map +1 -0
  21. package/dist/emojis-I5AMZ3EE.js +8 -0
  22. package/dist/emojis-I5AMZ3EE.js.map +1 -0
  23. package/dist/index.cjs +36680 -35147
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +19 -134
  26. package/dist/index.d.ts +19 -134
  27. package/dist/index.js +2801 -25223
  28. package/dist/index.js.map +1 -1
  29. package/dist/lowlight-runtime-Y43Y7YTW.js +11 -0
  30. package/dist/lowlight-runtime-Y43Y7YTW.js.map +1 -0
  31. package/dist/menu-bar-6U5S4PS7.js +947 -0
  32. package/dist/menu-bar-6U5S4PS7.js.map +1 -0
  33. package/dist/ueditor.cjs +23503 -0
  34. package/dist/ueditor.cjs.map +1 -0
  35. package/dist/ueditor.d.cts +136 -0
  36. package/dist/ueditor.d.ts +136 -0
  37. package/dist/ueditor.js +20 -0
  38. package/dist/ueditor.js.map +1 -0
  39. package/package.json +54 -46
@@ -0,0 +1,206 @@
1
+ import {
2
+ EmojiGridButton
3
+ } from "./chunk-ZUAIBY2Z.js";
4
+ import {
5
+ EMOJI_LIST
6
+ } from "./chunk-4TYW5K4J.js";
7
+ import {
8
+ Tooltip,
9
+ cn,
10
+ useSmartTranslations
11
+ } from "./chunk-GSBRTFP2.js";
12
+
13
+ // src/components/EmojiPicker.tsx
14
+ import { useEffect, useMemo, useRef, useState } from "react";
15
+ import { Search, X, Smile, Leaf, Utensils, Dumbbell, Lightbulb, Hash, Flag } from "lucide-react";
16
+ import { jsx, jsxs } from "react/jsx-runtime";
17
+ var CATEGORY_ICONS = {
18
+ smileys_people: Smile,
19
+ animals_nature: Leaf,
20
+ food_drink: Utensils,
21
+ activity: Dumbbell,
22
+ objects: Lightbulb,
23
+ symbols: Hash,
24
+ flags: Flag
25
+ };
26
+ var EmojiPicker = ({
27
+ onEmojiSelect,
28
+ className,
29
+ searchPlaceholder,
30
+ emptyText,
31
+ emptyHint,
32
+ showSearch = true,
33
+ showCategoryNav = true,
34
+ columns = 9,
35
+ maxHeight = "20rem",
36
+ chrome = "standalone"
37
+ }) => {
38
+ const t = useSmartTranslations("UEditor");
39
+ const [search, setSearch] = useState("");
40
+ const [activeCategory, setActiveCategory] = useState(EMOJI_LIST[0]?.id || "");
41
+ const scrollContainerRef = useRef(null);
42
+ const categoryRefs = useRef({});
43
+ const isUserScrolling = useRef(false);
44
+ const resolvedSearchPlaceholder = searchPlaceholder ?? t("emojiPicker.searchPlaceholder");
45
+ const resolvedEmptyText = emptyText ?? t("emojiPicker.noResults");
46
+ const resolvedEmptyHint = emptyHint ?? t("emojiPicker.tryDifferentSearch");
47
+ const resolvedColumns = Math.max(1, Math.floor(columns));
48
+ const isEmbedded = chrome === "embedded";
49
+ const gridStyle = {
50
+ gridTemplateColumns: `repeat(${resolvedColumns}, minmax(0, 1fr))`
51
+ };
52
+ const filteredCategories = useMemo(() => {
53
+ if (!search.trim()) return EMOJI_LIST;
54
+ const query = search.toLowerCase();
55
+ return EMOJI_LIST.map((category) => ({
56
+ ...category,
57
+ emojis: category.emojis.filter((emoji) => emoji.name.toLowerCase().includes(query) || emoji.emoji.includes(search))
58
+ })).filter((category) => category.emojis.length > 0);
59
+ }, [search]);
60
+ useEffect(() => {
61
+ if (search) return;
62
+ const container = scrollContainerRef.current;
63
+ if (!container) return;
64
+ const handleScroll = () => {
65
+ if (!isUserScrolling.current) return;
66
+ let maxVisibility = 0;
67
+ let mostVisibleCategory = EMOJI_LIST[0]?.id || "";
68
+ EMOJI_LIST.forEach((category) => {
69
+ const element = categoryRefs.current[category.id];
70
+ if (!element) return;
71
+ const rect = element.getBoundingClientRect();
72
+ const containerRect = container.getBoundingClientRect();
73
+ const visibleTop = Math.max(rect.top, containerRect.top);
74
+ const visibleBottom = Math.min(rect.bottom, containerRect.bottom);
75
+ const visibleHeight = Math.max(0, visibleBottom - visibleTop);
76
+ if (visibleHeight > maxVisibility) {
77
+ maxVisibility = visibleHeight;
78
+ mostVisibleCategory = category.id;
79
+ }
80
+ });
81
+ if (mostVisibleCategory !== activeCategory) {
82
+ setActiveCategory(mostVisibleCategory);
83
+ }
84
+ };
85
+ container.addEventListener("scroll", handleScroll);
86
+ return () => container.removeEventListener("scroll", handleScroll);
87
+ }, [activeCategory, search]);
88
+ useEffect(() => {
89
+ isUserScrolling.current = true;
90
+ }, []);
91
+ const renderEmojiCategory = (category, assignRef = false) => /* @__PURE__ */ jsxs(
92
+ "div",
93
+ {
94
+ ref: assignRef ? (el) => {
95
+ categoryRefs.current[category.id] = el;
96
+ } : void 0,
97
+ className: "scroll-mt-3 mb-2",
98
+ children: [
99
+ /* @__PURE__ */ jsxs("div", { className: "sticky top-0 z-10 bg-card/85 backdrop-blur-md py-1.5 px-2 text-[10px] font-bold uppercase tracking-wider text-muted-foreground/90 border-b border-border/5 mb-2 flex items-center gap-1.5 rounded-lg select-none", children: [
100
+ /* @__PURE__ */ jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-primary/70 animate-pulse" }),
101
+ category.name
102
+ ] }),
103
+ /* @__PURE__ */ jsx("div", { className: "grid gap-1.5 p-1", style: gridStyle, children: category.emojis.map((emoji) => /* @__PURE__ */ jsx(
104
+ EmojiGridButton,
105
+ {
106
+ emoji: emoji.emoji,
107
+ name: emoji.name,
108
+ onClick: () => handleEmojiClick(emoji.emoji),
109
+ className: "text-2xl"
110
+ },
111
+ emoji.name
112
+ )) })
113
+ ]
114
+ },
115
+ category.id
116
+ );
117
+ const searchResultContent = filteredCategories.length > 0 ? filteredCategories.map((category) => /* @__PURE__ */ jsx("div", { className: "mb-4 animate-fade-in", children: renderEmojiCategory(category) }, category.id)) : /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center justify-center text-center py-12 animate-fade-in", children: [
118
+ /* @__PURE__ */ jsx("div", { className: "mb-3 text-4xl animate-bounce", children: "\u{1F50D}" }),
119
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-muted-foreground", children: resolvedEmptyText }),
120
+ /* @__PURE__ */ jsx("div", { className: "mt-1 text-xs text-muted-foreground/80", children: resolvedEmptyHint })
121
+ ] });
122
+ const handleEmojiClick = (emoji) => {
123
+ onEmojiSelect(emoji);
124
+ setSearch("");
125
+ };
126
+ const handleCategoryClick = (categoryId) => {
127
+ const element = categoryRefs.current[categoryId];
128
+ if (!element || !scrollContainerRef.current) return;
129
+ isUserScrolling.current = false;
130
+ setActiveCategory(categoryId);
131
+ element.scrollIntoView({ behavior: "smooth", block: "start" });
132
+ window.setTimeout(() => {
133
+ isUserScrolling.current = true;
134
+ }, 500);
135
+ };
136
+ return /* @__PURE__ */ jsxs(
137
+ "div",
138
+ {
139
+ className: cn(
140
+ "flex max-h-128 w-96 flex-col overflow-hidden transition-all duration-300",
141
+ isEmbedded ? "bg-transparent" : "rounded-3xl border border-border/10 bg-gradient-to-b from-card/98 to-card/95 backdrop-blur-2xl shadow-[0_20px_50px_rgba(0,0,0,0.18)] dark:shadow-[0_20px_50px_rgba(0,0,0,0.45)] shadow-primary/2",
142
+ className
143
+ ),
144
+ children: [
145
+ showSearch && /* @__PURE__ */ jsx("div", { className: "shrink-0 border-b border-border/10 p-3.5 bg-card/10", children: /* @__PURE__ */ jsxs("div", { className: "relative group", children: [
146
+ /* @__PURE__ */ jsx(Search, { className: "absolute left-3.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground/60 transition-colors group-focus-within:text-primary" }),
147
+ /* @__PURE__ */ jsx(
148
+ "input",
149
+ {
150
+ type: "text",
151
+ placeholder: resolvedSearchPlaceholder,
152
+ value: search,
153
+ onChange: (e) => setSearch(e.target.value),
154
+ className: cn(
155
+ "w-full rounded-2xl border border-border/10 bg-muted/20 py-2 pl-9.5 pr-9 text-sm transition-all duration-300",
156
+ "placeholder:text-muted-foreground/60 focus:outline-none focus:ring-2 focus:ring-primary/15 focus:border-primary/20",
157
+ "focus:bg-background/90 focus:shadow-[0_0_12px_rgba(var(--color-primary-rgb),0.04)]"
158
+ )
159
+ }
160
+ ),
161
+ search && /* @__PURE__ */ jsx(
162
+ "button",
163
+ {
164
+ type: "button",
165
+ onClick: () => setSearch(""),
166
+ className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground/60 hover:text-foreground transition-colors",
167
+ children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
168
+ }
169
+ )
170
+ ] }) }),
171
+ /* @__PURE__ */ jsx(
172
+ "div",
173
+ {
174
+ ref: scrollContainerRef,
175
+ className: "shrink overflow-y-auto px-4 py-3 scrollbar-thin scrollbar-thumb-muted-foreground/15 hover:scrollbar-thumb-muted-foreground/25 scrollbar-track-transparent transition-all duration-200",
176
+ style: { height: maxHeight },
177
+ children: search ? searchResultContent : /* @__PURE__ */ jsx("div", { className: "space-y-3", children: EMOJI_LIST.map((category) => renderEmojiCategory(category, true)) })
178
+ }
179
+ ),
180
+ !search && showCategoryNav && /* @__PURE__ */ jsx("div", { className: cn("flex shrink-0 items-center justify-around border-t border-border/10 px-3 py-2 backdrop-blur-md bg-muted/5"), children: EMOJI_LIST.map((category) => {
181
+ const IconComponent = CATEGORY_ICONS[category.id] || Smile;
182
+ return /* @__PURE__ */ jsx(
183
+ "button",
184
+ {
185
+ type: "button",
186
+ onClick: () => handleCategoryClick(category.id),
187
+ className: cn(
188
+ "rounded-2xl p-2.5 transition-all duration-300",
189
+ activeCategory === category.id ? "bg-primary/10 text-primary scale-115 shadow-sm shadow-primary/5" : "text-muted-foreground/60 hover:bg-muted/40 hover:text-foreground hover:scale-105"
190
+ ),
191
+ children: /* @__PURE__ */ jsx(Tooltip, { placement: "top", content: /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold", children: category.name }), children: /* @__PURE__ */ jsx("span", { className: "inline-flex", children: /* @__PURE__ */ jsx(IconComponent, { className: "h-4 w-4" }) }) })
192
+ },
193
+ category.id
194
+ );
195
+ }) })
196
+ ]
197
+ }
198
+ );
199
+ };
200
+ var EmojiPicker_default = EmojiPicker;
201
+
202
+ export {
203
+ EmojiPicker,
204
+ EmojiPicker_default
205
+ };
206
+ //# sourceMappingURL=chunk-CKKLFVOY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/EmojiPicker.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Search, X, Smile, Leaf, Utensils, Dumbbell, Lightbulb, Hash, Flag } from \"lucide-react\";\nimport { useSmartTranslations } from \"../hooks/useSmartTranslations\";\nimport { cn } from \"../utils/cn\";\nimport { EmojiGridButton } from \"./emoji-ui\";\nimport { Tooltip } from \"./Tooltip\";\nimport { EMOJI_LIST } from \"./UEditor/emojis\";\n\n/** Public props for the `EmojiPicker` component. */\nexport interface EmojiPickerProps {\n onEmojiSelect: (emoji: string) => void;\n className?: string;\n searchPlaceholder?: string;\n emptyText?: string;\n emptyHint?: string;\n showSearch?: boolean;\n showCategoryNav?: boolean;\n columns?: number;\n maxHeight?: string;\n chrome?: \"standalone\" | \"embedded\";\n}\n\nconst CATEGORY_ICONS: Record<string, React.ComponentType<{ className?: string }>> = {\n smileys_people: Smile,\n animals_nature: Leaf,\n food_drink: Utensils,\n activity: Dumbbell,\n objects: Lightbulb,\n symbols: Hash,\n flags: Flag,\n};\n\nexport const EmojiPicker: React.FC<EmojiPickerProps> = ({\n onEmojiSelect,\n className,\n searchPlaceholder,\n emptyText,\n emptyHint,\n showSearch = true,\n showCategoryNav = true,\n columns = 9,\n maxHeight = \"20rem\",\n chrome = \"standalone\",\n}) => {\n const t = useSmartTranslations(\"UEditor\");\n const [search, setSearch] = useState(\"\");\n const [activeCategory, setActiveCategory] = useState(EMOJI_LIST[0]?.id || \"\");\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const categoryRefs = useRef<Record<string, HTMLDivElement | null>>({});\n const isUserScrolling = useRef(false);\n \n const resolvedSearchPlaceholder = searchPlaceholder ?? t(\"emojiPicker.searchPlaceholder\");\n const resolvedEmptyText = emptyText ?? t(\"emojiPicker.noResults\");\n const resolvedEmptyHint = emptyHint ?? t(\"emojiPicker.tryDifferentSearch\");\n const resolvedColumns = Math.max(1, Math.floor(columns));\n const isEmbedded = chrome === \"embedded\";\n \n const gridStyle = {\n gridTemplateColumns: `repeat(${resolvedColumns}, minmax(0, 1fr))`,\n } satisfies React.CSSProperties;\n\n const filteredCategories = useMemo(() => {\n if (!search.trim()) return EMOJI_LIST;\n\n const query = search.toLowerCase();\n return EMOJI_LIST.map((category) => ({\n ...category,\n emojis: category.emojis.filter((emoji) => emoji.name.toLowerCase().includes(query) || emoji.emoji.includes(search)),\n })).filter((category) => category.emojis.length > 0);\n }, [search]);\n\n useEffect(() => {\n if (search) return;\n\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n if (!isUserScrolling.current) return;\n\n let maxVisibility = 0;\n let mostVisibleCategory = EMOJI_LIST[0]?.id || \"\";\n\n EMOJI_LIST.forEach((category) => {\n const element = categoryRefs.current[category.id];\n if (!element) return;\n\n const rect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const visibleTop = Math.max(rect.top, containerRect.top);\n const visibleBottom = Math.min(rect.bottom, containerRect.bottom);\n const visibleHeight = Math.max(0, visibleBottom - visibleTop);\n\n if (visibleHeight > maxVisibility) {\n maxVisibility = visibleHeight;\n mostVisibleCategory = category.id;\n }\n });\n\n if (mostVisibleCategory !== activeCategory) {\n setActiveCategory(mostVisibleCategory);\n }\n };\n\n container.addEventListener(\"scroll\", handleScroll);\n return () => container.removeEventListener(\"scroll\", handleScroll);\n }, [activeCategory, search]);\n\n useEffect(() => {\n isUserScrolling.current = true;\n }, []);\n\n const renderEmojiCategory = (category: (typeof EMOJI_LIST)[number], assignRef = false) => (\n <div\n key={category.id}\n ref={\n assignRef\n ? (el) => {\n categoryRefs.current[category.id] = el;\n }\n : undefined\n }\n className=\"scroll-mt-3 mb-2\"\n >\n <div className=\"sticky top-0 z-10 bg-card/85 backdrop-blur-md py-1.5 px-2 text-[10px] font-bold uppercase tracking-wider text-muted-foreground/90 border-b border-border/5 mb-2 flex items-center gap-1.5 rounded-lg select-none\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-primary/70 animate-pulse\" />\n {category.name}\n </div>\n <div className=\"grid gap-1.5 p-1\" style={gridStyle}>\n {category.emojis.map((emoji) => (\n <EmojiGridButton\n key={emoji.name}\n emoji={emoji.emoji}\n name={emoji.name}\n onClick={() => handleEmojiClick(emoji.emoji)}\n className=\"text-2xl\"\n />\n ))}\n </div>\n </div>\n );\n\n const searchResultContent =\n filteredCategories.length > 0 ? (\n filteredCategories.map((category) => (\n <div key={category.id} className=\"mb-4 animate-fade-in\">\n {renderEmojiCategory(category)}\n </div>\n ))\n ) : (\n <div className=\"flex h-full flex-col items-center justify-center text-center py-12 animate-fade-in\">\n <div className=\"mb-3 text-4xl animate-bounce\">🔍</div>\n <div className=\"text-sm font-semibold text-muted-foreground\">{resolvedEmptyText}</div>\n <div className=\"mt-1 text-xs text-muted-foreground/80\">{resolvedEmptyHint}</div>\n </div>\n );\n\n const handleEmojiClick = (emoji: string) => {\n onEmojiSelect(emoji);\n setSearch(\"\");\n };\n\n const handleCategoryClick = (categoryId: string) => {\n const element = categoryRefs.current[categoryId];\n if (!element || !scrollContainerRef.current) return;\n\n isUserScrolling.current = false;\n setActiveCategory(categoryId);\n element.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n\n window.setTimeout(() => {\n isUserScrolling.current = true;\n }, 500);\n };\n\n return (\n <div\n className={cn(\n \"flex max-h-128 w-96 flex-col overflow-hidden transition-all duration-300\",\n isEmbedded\n ? \"bg-transparent\"\n : \"rounded-3xl border border-border/10 bg-gradient-to-b from-card/98 to-card/95 backdrop-blur-2xl shadow-[0_20px_50px_rgba(0,0,0,0.18)] dark:shadow-[0_20px_50px_rgba(0,0,0,0.45)] shadow-primary/2\",\n className,\n )}\n >\n {showSearch && (\n <div className=\"shrink-0 border-b border-border/10 p-3.5 bg-card/10\">\n <div className=\"relative group\">\n <Search className=\"absolute left-3.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground/60 transition-colors group-focus-within:text-primary\" />\n <input\n type=\"text\"\n placeholder={resolvedSearchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className={cn(\n \"w-full rounded-2xl border border-border/10 bg-muted/20 py-2 pl-9.5 pr-9 text-sm transition-all duration-300\",\n \"placeholder:text-muted-foreground/60 focus:outline-none focus:ring-2 focus:ring-primary/15 focus:border-primary/20\",\n \"focus:bg-background/90 focus:shadow-[0_0_12px_rgba(var(--color-primary-rgb),0.04)]\",\n )}\n />\n {search && (\n <button\n type=\"button\"\n onClick={() => setSearch(\"\")}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground/60 hover:text-foreground transition-colors\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Styled custom scrollbar container */}\n <div \n ref={scrollContainerRef} \n className=\"shrink overflow-y-auto px-4 py-3 scrollbar-thin scrollbar-thumb-muted-foreground/15 hover:scrollbar-thumb-muted-foreground/25 scrollbar-track-transparent transition-all duration-200\" \n style={{ height: maxHeight }}\n >\n {search ? searchResultContent : <div className=\"space-y-3\">{EMOJI_LIST.map((category) => renderEmojiCategory(category, true))}</div>}\n </div>\n\n {!search && showCategoryNav && (\n <div className={cn(\"flex shrink-0 items-center justify-around border-t border-border/10 px-3 py-2 backdrop-blur-md bg-muted/5\")}>\n {EMOJI_LIST.map((category) => {\n const IconComponent = CATEGORY_ICONS[category.id] || Smile;\n return (\n <button\n key={category.id}\n type=\"button\"\n onClick={() => handleCategoryClick(category.id)}\n className={cn(\n \"rounded-2xl p-2.5 transition-all duration-300\",\n activeCategory === category.id\n ? \"bg-primary/10 text-primary scale-115 shadow-sm shadow-primary/5\"\n : \"text-muted-foreground/60 hover:bg-muted/40 hover:text-foreground hover:scale-105\",\n )}\n >\n <Tooltip placement=\"top\" content={<span className=\"text-xs font-semibold\">{category.name}</span>}>\n <span className=\"inline-flex\">\n <IconComponent className=\"h-4 w-4\" />\n </span>\n </Tooltip>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport default EmojiPicker;\n"],"mappings":"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","names":[]}