@underverse-ui/underverse 1.0.73 → 1.0.74

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/index.cjs CHANGED
@@ -22644,16 +22644,22 @@ var EmojiList = (0, import_react44.forwardRef)((props, ref) => {
22644
22644
  ] }) }),
22645
22645
  /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "p-3", children: [
22646
22646
  /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("div", { className: "grid grid-cols-8 gap-1", children: props.items.slice(0, 64).map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
22647
- "button",
22647
+ Tooltip,
22648
22648
  {
22649
- type: "button",
22650
- onClick: () => props.command(item),
22651
- className: cn(
22652
- "w-9 h-9 flex items-center justify-center rounded-lg text-xl transition-colors",
22653
- selectedIndex === index ? "bg-primary/10 ring-2 ring-primary/30" : "hover:bg-accent"
22654
- ),
22655
- title: item.name.replace(/_/g, " "),
22656
- children: item.emoji
22649
+ placement: "top",
22650
+ content: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("span", { className: "text-xs font-medium", children: item.name.replace(/_/g, " ") }),
22651
+ children: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
22652
+ "button",
22653
+ {
22654
+ type: "button",
22655
+ onClick: () => props.command(item),
22656
+ className: cn(
22657
+ "w-9 h-9 flex items-center justify-center rounded-lg text-xl transition-colors",
22658
+ selectedIndex === index ? "bg-primary/10 ring-2 ring-primary/30" : "hover:bg-accent"
22659
+ ),
22660
+ children: item.emoji
22661
+ }
22662
+ )
22657
22663
  },
22658
22664
  item.name
22659
22665
  )) }),
@@ -23279,7 +23285,7 @@ var EditorColorPalette = ({
23279
23285
  label
23280
23286
  }) => /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "p-2", children: [
23281
23287
  /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider px-2", children: label }),
23282
- /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("div", { className: "grid grid-cols-4 gap-1.5 mt-2", children: colors.map((c) => /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)(
23288
+ /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("div", { className: "grid grid-cols-4 gap-1.5 mt-2", children: colors.map((c) => /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(Tooltip, { placement: "top", content: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "text-xs font-medium", children: c.name }), children: /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)(
23283
23289
  "button",
23284
23290
  {
23285
23291
  type: "button",
@@ -23290,14 +23296,12 @@ var EditorColorPalette = ({
23290
23296
  currentColor === c.color ? "border-primary ring-2 ring-primary/20" : "border-border/50 hover:border-primary/50"
23291
23297
  ),
23292
23298
  style: { backgroundColor: c.color || "transparent" },
23293
- title: c.name,
23294
23299
  children: [
23295
23300
  c.color === "" && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(import_lucide_react42.X, { className: "w-4 h-4 text-muted-foreground" }),
23296
23301
  c.color === "inherit" && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "text-xs font-medium", children: "A" })
23297
23302
  ]
23298
- },
23299
- c.name
23300
- )) })
23303
+ }
23304
+ ) }, c.name)) })
23301
23305
  ] });
23302
23306
 
23303
23307
  // src/components/UEditor/image-commands.ts
@@ -23492,17 +23496,17 @@ var ImageInput = ({ onSubmit, onCancel }) => {
23492
23496
  };
23493
23497
 
23494
23498
  // src/components/UEditor/emoji-picker.tsx
23495
- var import_react49 = require("react");
23496
23499
  var import_lucide_react44 = require("lucide-react");
23500
+ var import_react49 = require("react");
23497
23501
  var import_jsx_runtime78 = require("react/jsx-runtime");
23498
23502
  var CATEGORY_ICONS2 = {
23499
- "smileys_people": import_lucide_react44.Smile,
23500
- "animals_nature": import_lucide_react44.Leaf,
23501
- "food_drink": import_lucide_react44.Utensils,
23502
- "activity": import_lucide_react44.Dumbbell,
23503
- "objects": import_lucide_react44.Lightbulb,
23504
- "symbols": import_lucide_react44.Hash,
23505
- "flags": import_lucide_react44.Flag
23503
+ smileys_people: import_lucide_react44.Smile,
23504
+ animals_nature: import_lucide_react44.Leaf,
23505
+ food_drink: import_lucide_react44.Utensils,
23506
+ activity: import_lucide_react44.Dumbbell,
23507
+ objects: import_lucide_react44.Lightbulb,
23508
+ symbols: import_lucide_react44.Hash,
23509
+ flags: import_lucide_react44.Flag
23506
23510
  };
23507
23511
  var EmojiPicker2 = ({ onSelect, onClose }) => {
23508
23512
  const t = useSmartTranslations("UEditor");
@@ -23516,9 +23520,7 @@ var EmojiPicker2 = ({ onSelect, onClose }) => {
23516
23520
  const query = search.toLowerCase();
23517
23521
  return EMOJI_LIST.map((category) => ({
23518
23522
  ...category,
23519
- emojis: category.emojis.filter(
23520
- (emoji) => emoji.name.toLowerCase().includes(query) || emoji.emoji.includes(search)
23521
- )
23523
+ emojis: category.emojis.filter((emoji) => emoji.name.toLowerCase().includes(query) || emoji.emoji.includes(search))
23522
23524
  })).filter((category) => category.emojis.length > 0);
23523
23525
  }, [search]);
23524
23526
  const handleEmojiClick = (emoji) => {
@@ -23586,26 +23588,40 @@ var EmojiPicker2 = ({ onSelect, onClose }) => {
23586
23588
  )
23587
23589
  }
23588
23590
  ),
23589
- search && /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
23590
- "button",
23591
- {
23592
- onClick: () => setSearch(""),
23593
- className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",
23594
- children: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(import_lucide_react44.X, { className: "w-4 h-4" })
23595
- }
23596
- )
23591
+ search && /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("button", { onClick: () => setSearch(""), className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground", children: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(import_lucide_react44.X, { className: "w-4 h-4" }) })
23597
23592
  ] }) }),
23598
- /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
23599
- "div",
23600
- {
23601
- ref: scrollContainerRef,
23602
- className: "overflow-y-auto px-3 py-2 shrink",
23603
- style: { height: "20rem" },
23604
- children: search ? (
23605
- // Search Results
23606
- filteredCategories.length > 0 ? filteredCategories.map((category) => /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "mb-4", children: [
23607
- /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2 sticky top-0 bg-card py-1", children: category.name }),
23608
- /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "grid grid-cols-9 gap-1", children: category.emojis.map((emoji) => /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
23593
+ /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { ref: scrollContainerRef, className: "overflow-y-auto px-3 py-2 shrink", style: { height: "20rem" }, children: search ? (
23594
+ // Search Results
23595
+ filteredCategories.length > 0 ? filteredCategories.map((category) => /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "mb-4", children: [
23596
+ /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2 sticky top-0 bg-card py-1", children: category.name }),
23597
+ /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "grid grid-cols-9 gap-1", children: category.emojis.map((emoji) => /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(Tooltip, { placement: "top", content: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "text-xs font-medium", children: emoji.name.replace(/_/g, " ") }), children: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
23598
+ "button",
23599
+ {
23600
+ onClick: () => handleEmojiClick(emoji.emoji),
23601
+ className: cn(
23602
+ "w-9 h-9 flex items-center justify-center rounded-lg",
23603
+ "text-2xl hover:bg-accent transition-colors",
23604
+ "focus:outline-none focus:ring-2 focus:ring-primary/20"
23605
+ ),
23606
+ children: emoji.emoji
23607
+ }
23608
+ ) }, emoji.name)) })
23609
+ ] }, category.id)) : /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "flex flex-col items-center justify-center h-full text-center", children: [
23610
+ /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "text-4xl mb-2", children: "\u{1F50D}" }),
23611
+ /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "text-sm font-medium text-muted-foreground", children: t("emojiPicker.noResults") }),
23612
+ /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "text-xs text-muted-foreground mt-1", children: t("emojiPicker.tryDifferentSearch") })
23613
+ ] })
23614
+ ) : (
23615
+ // All Categories - Messenger Style
23616
+ /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "space-y-4", children: EMOJI_LIST.map((category) => /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)(
23617
+ "div",
23618
+ {
23619
+ ref: (el) => {
23620
+ categoryRefs.current[category.id] = el;
23621
+ },
23622
+ children: [
23623
+ /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2 sticky top-0 bg-card py-1 z-10", children: category.name }),
23624
+ /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "grid grid-cols-9 gap-1", children: category.emojis.map((emoji) => /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(Tooltip, { placement: "top", content: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "text-xs font-medium", children: emoji.name.replace(/_/g, " ") }), children: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
23609
23625
  "button",
23610
23626
  {
23611
23627
  onClick: () => handleEmojiClick(emoji.emoji),
@@ -23614,47 +23630,14 @@ var EmojiPicker2 = ({ onSelect, onClose }) => {
23614
23630
  "text-2xl hover:bg-accent transition-colors",
23615
23631
  "focus:outline-none focus:ring-2 focus:ring-primary/20"
23616
23632
  ),
23617
- title: emoji.name.replace(/_/g, " "),
23618
23633
  children: emoji.emoji
23619
- },
23620
- emoji.name
23621
- )) })
23622
- ] }, category.id)) : /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "flex flex-col items-center justify-center h-full text-center", children: [
23623
- /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "text-4xl mb-2", children: "\u{1F50D}" }),
23624
- /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "text-sm font-medium text-muted-foreground", children: t("emojiPicker.noResults") }),
23625
- /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "text-xs text-muted-foreground mt-1", children: t("emojiPicker.tryDifferentSearch") })
23626
- ] })
23627
- ) : (
23628
- // All Categories - Messenger Style
23629
- /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "space-y-4", children: EMOJI_LIST.map((category) => /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)(
23630
- "div",
23631
- {
23632
- ref: (el) => {
23633
- categoryRefs.current[category.id] = el;
23634
- },
23635
- children: [
23636
- /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2 sticky top-0 bg-card py-1 z-10", children: category.name }),
23637
- /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "grid grid-cols-9 gap-1", children: category.emojis.map((emoji) => /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
23638
- "button",
23639
- {
23640
- onClick: () => handleEmojiClick(emoji.emoji),
23641
- className: cn(
23642
- "w-9 h-9 flex items-center justify-center rounded-lg",
23643
- "text-2xl hover:bg-accent transition-colors",
23644
- "focus:outline-none focus:ring-2 focus:ring-primary/20"
23645
- ),
23646
- title: emoji.name.replace(/_/g, " "),
23647
- children: emoji.emoji
23648
- },
23649
- emoji.name
23650
- )) })
23651
- ]
23652
- },
23653
- category.id
23654
- )) })
23655
- )
23656
- }
23657
- ),
23634
+ }
23635
+ ) }, emoji.name)) })
23636
+ ]
23637
+ },
23638
+ category.id
23639
+ )) })
23640
+ ) }),
23658
23641
  !search && /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "flex items-center justify-around px-2 py-2 border-t bg-muted/30 shrink-0", children: EMOJI_LIST.map((category) => {
23659
23642
  const IconComponent = CATEGORY_ICONS2[category.id] || import_lucide_react44.Smile;
23660
23643
  return /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
@@ -23665,8 +23648,7 @@ var EmojiPicker2 = ({ onSelect, onClose }) => {
23665
23648
  "p-2 rounded-lg transition-colors",
23666
23649
  activeCategory === category.id ? "text-primary bg-primary/10" : "text-muted-foreground hover:text-foreground hover:bg-accent"
23667
23650
  ),
23668
- title: category.name,
23669
- children: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(IconComponent, { className: "w-5 h-5" })
23651
+ children: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(Tooltip, { placement: "top", content: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "text-xs font-medium", children: category.name }), children: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "inline-flex", children: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(IconComponent, { className: "w-5 h-5" }) }) })
23670
23652
  },
23671
23653
  category.id
23672
23654
  );
@@ -29142,12 +29124,23 @@ function buildLayout(editor, surface, cell) {
29142
29124
  }
29143
29125
  const surfaceRect = surface.getBoundingClientRect();
29144
29126
  const tableRect = table.getBoundingClientRect();
29127
+ const wrapperElement = table.closest(".tableWrapper");
29128
+ const wrapper = wrapperElement instanceof HTMLElement ? wrapperElement : null;
29129
+ const wrapperRect = wrapper?.getBoundingClientRect() ?? tableRect;
29145
29130
  const tableLeft = tableRect.left - surfaceRect.left + surface.scrollLeft;
29146
29131
  const tableTop = tableRect.top - surfaceRect.top + surface.scrollTop;
29147
29132
  const avgRowHeight = metricOrFallback(tableRect.height / rows.length, FALLBACK_TABLE_ROW_HEIGHT);
29148
29133
  const avgColumnWidth = metricOrFallback(tableRect.width / referenceCells.length, FALLBACK_TABLE_COLUMN_WIDTH);
29149
29134
  const tableWidth = metricOrFallback(tableRect.width, avgColumnWidth * referenceCells.length);
29150
29135
  const tableHeight = metricOrFallback(tableRect.height, avgRowHeight * rows.length);
29136
+ const wrapperLeft = wrapperRect.left - surfaceRect.left + surface.scrollLeft;
29137
+ const wrapperTop = wrapperRect.top - surfaceRect.top + surface.scrollTop;
29138
+ const wrapperWidth = metricOrFallback(wrapperRect.width, tableWidth);
29139
+ const wrapperHeight = metricOrFallback(wrapperRect.height, tableHeight);
29140
+ const viewportWidth = metricOrFallback(wrapper?.clientWidth ?? wrapperRect.width, tableWidth);
29141
+ const viewportHeight = metricOrFallback(wrapper?.clientHeight ?? wrapperRect.height, tableHeight);
29142
+ const verticalScrollbarWidth = Math.max(0, Math.round(wrapperWidth - viewportWidth));
29143
+ const horizontalScrollbarHeight = Math.max(0, Math.round(wrapperHeight - viewportHeight));
29151
29144
  const rowHandles = rows.map((tableRow, index) => {
29152
29145
  const rowRect = tableRow.getBoundingClientRect();
29153
29146
  const anchorCell = tableRow.cells.item(0) ?? cornerCell;
@@ -29182,6 +29175,14 @@ function buildLayout(editor, surface, cell) {
29182
29175
  tableTop,
29183
29176
  tableWidth,
29184
29177
  tableHeight,
29178
+ wrapperLeft,
29179
+ wrapperTop,
29180
+ wrapperWidth,
29181
+ wrapperHeight,
29182
+ viewportWidth,
29183
+ viewportHeight,
29184
+ horizontalScrollbarHeight,
29185
+ verticalScrollbarWidth,
29185
29186
  avgRowHeight,
29186
29187
  avgColumnWidth,
29187
29188
  rowHandles,
@@ -29274,11 +29275,13 @@ function TableControls({ editor, containerRef }) {
29274
29275
  const directAddRow = targetElement?.closest?.("[data-table-control='add-row']");
29275
29276
  const directRowHandleIndex = directRowHandle instanceof HTMLElement ? Number.parseInt(directRowHandle.dataset.rowHandleIndex ?? "", 10) : Number.NaN;
29276
29277
  const directColumnHandleIndex = directColumnHandle instanceof HTMLElement ? Number.parseInt(directColumnHandle.dataset.columnHandleIndex ?? "", 10) : Number.NaN;
29278
+ const visibleTableWidth2 = Math.min(activeLayout.tableWidth, activeLayout.viewportWidth);
29279
+ const visibleTableHeight2 = Math.min(activeLayout.tableHeight, activeLayout.viewportHeight);
29277
29280
  const rowHandleIndex = Number.isFinite(directRowHandleIndex) ? directRowHandleIndex : activeLayout.rowHandles.find((rowHandle) => relativeX >= activeLayout.tableLeft - ROW_HANDLE_HOVER_WIDTH && relativeX <= activeLayout.tableLeft && Math.abs(relativeY - rowHandle.center) <= HANDLE_HOVER_RADIUS)?.index ?? null;
29278
29281
  const columnHandleIndex = Number.isFinite(directColumnHandleIndex) ? directColumnHandleIndex : activeLayout.columnHandles.find((columnHandle) => relativeY >= activeLayout.tableTop - COLUMN_HANDLE_HOVER_HEIGHT && relativeY <= activeLayout.tableTop && Math.abs(relativeX - columnHandle.center) <= HANDLE_HOVER_RADIUS)?.index ?? null;
29279
29282
  const menuVisible = Boolean(directTableMenu) || relativeX >= activeLayout.tableLeft - MENU_HOVER_PADDING && relativeX <= activeLayout.tableLeft + 42 && relativeY >= activeLayout.tableTop - COLUMN_HANDLE_HOVER_HEIGHT && relativeY <= activeLayout.tableTop + MENU_HOVER_PADDING;
29280
- const addColumnVisible = Boolean(directAddColumn) || relativeX >= activeLayout.tableLeft + activeLayout.tableWidth && relativeX <= activeLayout.tableLeft + activeLayout.tableWidth + ADD_COLUMN_HOVER_WIDTH && relativeY >= activeLayout.tableTop && relativeY <= activeLayout.tableTop + activeLayout.tableHeight;
29281
- const addRowVisible = Boolean(directAddRow) || relativeY >= activeLayout.tableTop + activeLayout.tableHeight && relativeY <= activeLayout.tableTop + activeLayout.tableHeight + ADD_ROW_HOVER_HEIGHT && relativeX >= activeLayout.tableLeft && relativeX <= activeLayout.tableLeft + activeLayout.tableWidth;
29283
+ const addColumnVisible = Boolean(directAddColumn) || relativeX >= activeLayout.wrapperLeft + visibleTableWidth2 && relativeX <= activeLayout.wrapperLeft + visibleTableWidth2 + ADD_COLUMN_HOVER_WIDTH && relativeY >= activeLayout.wrapperTop && relativeY <= activeLayout.wrapperTop + visibleTableHeight2;
29284
+ const addRowVisible = Boolean(directAddRow) || relativeY >= activeLayout.wrapperTop + activeLayout.wrapperHeight && relativeY <= activeLayout.wrapperTop + activeLayout.wrapperHeight + ADD_ROW_HOVER_HEIGHT && relativeX >= activeLayout.wrapperLeft && relativeX <= activeLayout.wrapperLeft + visibleTableWidth2;
29282
29285
  setHoverState((prev) => {
29283
29286
  if (prev.menuVisible === menuVisible && prev.addColumnVisible === addColumnVisible && prev.addRowVisible === addRowVisible && prev.rowHandleIndex === rowHandleIndex && prev.columnHandleIndex === columnHandleIndex) {
29284
29287
  return prev;
@@ -29631,10 +29634,12 @@ function TableControls({ editor, containerRef }) {
29631
29634
  const menuLeft = Math.max(8, layout.tableLeft);
29632
29635
  const rowHandleLeft = Math.max(8, layout.tableLeft - 66);
29633
29636
  const columnHandleTop = Math.max(8, layout.tableTop - 14);
29634
- const columnRailTop = layout.tableTop;
29635
- const columnRailLeft = layout.tableLeft + layout.tableWidth + 8;
29636
- const rowRailTop = layout.tableTop + layout.tableHeight + 8;
29637
- const rowRailLeft = layout.tableLeft;
29637
+ const visibleTableWidth = Math.min(layout.tableWidth, layout.viewportWidth);
29638
+ const visibleTableHeight = Math.min(layout.tableHeight, layout.viewportHeight);
29639
+ const columnRailTop = layout.wrapperTop;
29640
+ const columnRailLeft = layout.wrapperLeft + visibleTableWidth + 8;
29641
+ const rowRailTop = layout.wrapperTop + layout.wrapperHeight + 8;
29642
+ const rowRailLeft = layout.wrapperLeft;
29638
29643
  const expandPreviewWidth = dragPreview?.kind === "add-column" ? layout.tableWidth + dragPreview.previewCols * layout.avgColumnWidth : layout.tableWidth;
29639
29644
  const expandPreviewHeight = dragPreview?.kind === "add-row" ? layout.tableHeight + dragPreview.previewRows * layout.avgRowHeight : layout.tableHeight;
29640
29645
  const dragStatusText = dragPreview?.kind === "row" ? `${t("tableMenu.dragRow")} ${dragPreview.originIndex + 1} -> ${dragPreview.targetIndex + 1}` : dragPreview?.kind === "column" ? `${t("tableMenu.dragColumn")} ${dragPreview.originIndex + 1} -> ${dragPreview.targetIndex + 1}` : dragPreview?.kind === "add-row" ? `+${dragPreview.previewRows}R` : dragPreview?.kind === "add-column" ? `+${dragPreview.previewCols}C` : null;
@@ -29653,47 +29658,53 @@ function TableControls({ editor, containerRef }) {
29653
29658
  left: rowHandleLeft
29654
29659
  },
29655
29660
  children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29656
- DropdownMenu,
29661
+ Tooltip,
29657
29662
  {
29658
29663
  placement: "right",
29659
- isOpen: openMenuKey === menuKey,
29660
- onOpenChange: (open) => {
29661
- setOpenMenuKey((prev) => open ? menuKey : prev === menuKey ? null : prev);
29662
- },
29663
- items: getRowHandleMenuItems(rowHandle),
29664
- trigger: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29665
- "button",
29664
+ content: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-xs font-medium", children: `${t("tableMenu.dragRow")} ${rowHandle.index + 1}` }),
29665
+ children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "inline-flex", children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29666
+ DropdownMenu,
29666
29667
  {
29667
- type: "button",
29668
- "aria-label": `${t("tableMenu.dragRow")} ${rowHandle.index + 1}`,
29669
- title: `${t("tableMenu.dragRow")} ${rowHandle.index + 1}`,
29670
- onMouseDown: (event) => {
29671
- event.preventDefault();
29672
- event.stopPropagation();
29673
- setOpenMenuKey(null);
29674
- dragStateRef.current = {
29675
- kind: "row",
29676
- originIndex: rowHandle.index,
29677
- targetIndex: rowHandle.index,
29678
- anchorPos: rowHandle.cellPos
29679
- };
29680
- setDragPreview({
29681
- kind: "row",
29682
- originIndex: rowHandle.index,
29683
- targetIndex: rowHandle.index,
29684
- targetStart: rowHandle.start,
29685
- targetSize: rowHandle.size
29686
- });
29687
- document.body.style.cursor = "grabbing";
29668
+ placement: "right",
29669
+ isOpen: openMenuKey === menuKey,
29670
+ onOpenChange: (open) => {
29671
+ setOpenMenuKey((prev) => open ? menuKey : prev === menuKey ? null : prev);
29688
29672
  },
29689
- className: cn(
29690
- "inline-flex h-6 w-6 items-center justify-center rounded-full",
29691
- "border border-border/70 bg-background/95 text-muted-foreground shadow-sm backdrop-blur",
29692
- "transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground"
29693
- ),
29694
- children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react47.GripVertical, { className: "h-3.5 w-3.5" })
29673
+ items: getRowHandleMenuItems(rowHandle),
29674
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29675
+ "button",
29676
+ {
29677
+ type: "button",
29678
+ "aria-label": `${t("tableMenu.dragRow")} ${rowHandle.index + 1}`,
29679
+ onMouseDown: (event) => {
29680
+ event.preventDefault();
29681
+ event.stopPropagation();
29682
+ setOpenMenuKey(null);
29683
+ dragStateRef.current = {
29684
+ kind: "row",
29685
+ originIndex: rowHandle.index,
29686
+ targetIndex: rowHandle.index,
29687
+ anchorPos: rowHandle.cellPos
29688
+ };
29689
+ setDragPreview({
29690
+ kind: "row",
29691
+ originIndex: rowHandle.index,
29692
+ targetIndex: rowHandle.index,
29693
+ targetStart: rowHandle.start,
29694
+ targetSize: rowHandle.size
29695
+ });
29696
+ document.body.style.cursor = "grabbing";
29697
+ },
29698
+ className: cn(
29699
+ "inline-flex h-6 w-6 items-center justify-center rounded-full",
29700
+ "border border-border/70 bg-background/95 text-muted-foreground shadow-sm backdrop-blur",
29701
+ "transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground"
29702
+ ),
29703
+ children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react47.GripVertical, { className: "h-3.5 w-3.5" })
29704
+ }
29705
+ )
29695
29706
  }
29696
- )
29707
+ ) })
29697
29708
  }
29698
29709
  )
29699
29710
  },
@@ -29714,47 +29725,53 @@ function TableControls({ editor, containerRef }) {
29714
29725
  left: Math.max(8, columnHandle.center - 12)
29715
29726
  },
29716
29727
  children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29717
- DropdownMenu,
29728
+ Tooltip,
29718
29729
  {
29719
- placement: "bottom-start",
29720
- isOpen: openMenuKey === menuKey,
29721
- onOpenChange: (open) => {
29722
- setOpenMenuKey((prev) => open ? menuKey : prev === menuKey ? null : prev);
29723
- },
29724
- items: getColumnHandleMenuItems(columnHandle),
29725
- trigger: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29726
- "button",
29730
+ placement: "top",
29731
+ content: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-xs font-medium", children: `${t("tableMenu.dragColumn")} ${columnHandle.index + 1}` }),
29732
+ children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "inline-flex", children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29733
+ DropdownMenu,
29727
29734
  {
29728
- type: "button",
29729
- "aria-label": `${t("tableMenu.dragColumn")} ${columnHandle.index + 1}`,
29730
- title: `${t("tableMenu.dragColumn")} ${columnHandle.index + 1}`,
29731
- onMouseDown: (event) => {
29732
- event.preventDefault();
29733
- event.stopPropagation();
29734
- setOpenMenuKey(null);
29735
- dragStateRef.current = {
29736
- kind: "column",
29737
- originIndex: columnHandle.index,
29738
- targetIndex: columnHandle.index,
29739
- anchorPos: columnHandle.cellPos
29740
- };
29741
- setDragPreview({
29742
- kind: "column",
29743
- originIndex: columnHandle.index,
29744
- targetIndex: columnHandle.index,
29745
- targetStart: columnHandle.start,
29746
- targetSize: columnHandle.size
29747
- });
29748
- document.body.style.cursor = "grabbing";
29735
+ placement: "bottom-start",
29736
+ isOpen: openMenuKey === menuKey,
29737
+ onOpenChange: (open) => {
29738
+ setOpenMenuKey((prev) => open ? menuKey : prev === menuKey ? null : prev);
29749
29739
  },
29750
- className: cn(
29751
- "inline-flex h-6 w-6 items-center justify-center rounded-full",
29752
- "border border-border/70 bg-background/95 text-muted-foreground shadow-sm backdrop-blur",
29753
- "transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground"
29754
- ),
29755
- children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react47.GripHorizontal, { className: "h-3.5 w-3.5" })
29740
+ items: getColumnHandleMenuItems(columnHandle),
29741
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29742
+ "button",
29743
+ {
29744
+ type: "button",
29745
+ "aria-label": `${t("tableMenu.dragColumn")} ${columnHandle.index + 1}`,
29746
+ onMouseDown: (event) => {
29747
+ event.preventDefault();
29748
+ event.stopPropagation();
29749
+ setOpenMenuKey(null);
29750
+ dragStateRef.current = {
29751
+ kind: "column",
29752
+ originIndex: columnHandle.index,
29753
+ targetIndex: columnHandle.index,
29754
+ anchorPos: columnHandle.cellPos
29755
+ };
29756
+ setDragPreview({
29757
+ kind: "column",
29758
+ originIndex: columnHandle.index,
29759
+ targetIndex: columnHandle.index,
29760
+ targetStart: columnHandle.start,
29761
+ targetSize: columnHandle.size
29762
+ });
29763
+ document.body.style.cursor = "grabbing";
29764
+ },
29765
+ className: cn(
29766
+ "inline-flex h-6 w-6 items-center justify-center rounded-full",
29767
+ "border border-border/70 bg-background/95 text-muted-foreground shadow-sm backdrop-blur",
29768
+ "transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground"
29769
+ ),
29770
+ children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react47.GripHorizontal, { className: "h-3.5 w-3.5" })
29771
+ }
29772
+ )
29756
29773
  }
29757
- )
29774
+ ) })
29758
29775
  }
29759
29776
  )
29760
29777
  },
@@ -29771,93 +29788,111 @@ function TableControls({ editor, containerRef }) {
29771
29788
  left: menuLeft
29772
29789
  },
29773
29790
  children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29774
- DropdownMenu,
29791
+ Tooltip,
29775
29792
  {
29776
- placement: "bottom-start",
29777
- isOpen: tableMenuOpen,
29778
- onOpenChange: (open) => {
29779
- setOpenMenuKey((prev) => open ? "table" : prev === "table" ? null : prev);
29780
- },
29781
- items: menuItems,
29782
- trigger: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29783
- "button",
29793
+ placement: "top",
29794
+ content: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-xs font-medium", children: t("tableMenu.openControls") }),
29795
+ children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "inline-flex", children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29796
+ DropdownMenu,
29784
29797
  {
29785
- type: "button",
29786
- "aria-label": t("tableMenu.openControls"),
29787
- title: t("tableMenu.openControls"),
29788
- onMouseDown: (event) => event.preventDefault(),
29789
- className: cn(
29790
- "pointer-events-auto inline-flex h-7 w-7 items-center justify-center rounded-full",
29791
- "border border-border/70 bg-background/95 text-muted-foreground shadow-sm backdrop-blur",
29792
- "transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground"
29793
- ),
29794
- children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react47.MoreHorizontal, { className: "h-4 w-4" })
29798
+ placement: "bottom-start",
29799
+ isOpen: tableMenuOpen,
29800
+ onOpenChange: (open) => {
29801
+ setOpenMenuKey((prev) => open ? "table" : prev === "table" ? null : prev);
29802
+ },
29803
+ items: menuItems,
29804
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29805
+ "button",
29806
+ {
29807
+ type: "button",
29808
+ "aria-label": t("tableMenu.openControls"),
29809
+ onMouseDown: (event) => event.preventDefault(),
29810
+ className: cn(
29811
+ "pointer-events-auto inline-flex h-7 w-7 items-center justify-center rounded-full",
29812
+ "border border-border/70 bg-background/95 text-muted-foreground shadow-sm backdrop-blur",
29813
+ "transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground"
29814
+ ),
29815
+ children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react47.MoreHorizontal, { className: "h-4 w-4" })
29816
+ }
29817
+ )
29795
29818
  }
29796
- )
29819
+ ) })
29797
29820
  }
29798
29821
  )
29799
29822
  }
29800
29823
  ),
29801
29824
  (controlsVisible || hoverState.addColumnVisible) && /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29802
- "button",
29825
+ Tooltip,
29803
29826
  {
29804
- type: "button",
29805
- "data-table-control": "add-column",
29806
- "aria-label": t("tableMenu.quickAddColumnAfter"),
29807
- title: t("tableMenu.quickAddColumnAfter"),
29808
- onMouseDown: (event) => {
29809
- event.preventDefault();
29810
- event.stopPropagation();
29811
- setOpenMenuKey(null);
29812
- if (!canExpandTable) return;
29813
- dragStateRef.current = { kind: "add-column", previewCols: 1 };
29814
- setDragPreview({ kind: "add-column", previewCols: 1 });
29815
- document.body.style.cursor = "ew-resize";
29816
- },
29817
- disabled: !canExpandTable,
29818
- className: cn(
29819
- "absolute z-30 inline-flex items-center justify-center rounded-md",
29820
- "border border-border/70 bg-muted/40 text-muted-foreground shadow-sm backdrop-blur",
29821
- "transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed"
29822
- ),
29823
- style: {
29824
- top: columnRailTop,
29825
- left: columnRailLeft,
29826
- width: 18,
29827
- height: layout.tableHeight
29828
- },
29829
- children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-sm font-medium leading-none", children: "+" })
29827
+ placement: "right",
29828
+ content: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-xs font-medium", children: t("tableMenu.quickAddColumnAfter") }),
29829
+ children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29830
+ "button",
29831
+ {
29832
+ type: "button",
29833
+ "data-table-control": "add-column",
29834
+ "aria-label": t("tableMenu.quickAddColumnAfter"),
29835
+ onMouseDown: (event) => {
29836
+ event.preventDefault();
29837
+ event.stopPropagation();
29838
+ setOpenMenuKey(null);
29839
+ if (!canExpandTable) return;
29840
+ dragStateRef.current = { kind: "add-column", previewCols: 1 };
29841
+ setDragPreview({ kind: "add-column", previewCols: 1 });
29842
+ document.body.style.cursor = "ew-resize";
29843
+ },
29844
+ disabled: !canExpandTable,
29845
+ className: cn(
29846
+ "absolute z-30 inline-flex items-center justify-center rounded-md",
29847
+ "border border-border/70 bg-muted/40 text-muted-foreground shadow-sm backdrop-blur",
29848
+ "transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed"
29849
+ ),
29850
+ style: {
29851
+ top: columnRailTop,
29852
+ left: columnRailLeft,
29853
+ width: 18,
29854
+ height: visibleTableHeight
29855
+ },
29856
+ children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-sm font-medium leading-none", children: "+" })
29857
+ }
29858
+ )
29830
29859
  }
29831
29860
  ),
29832
29861
  (controlsVisible || hoverState.addRowVisible) && /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29833
- "button",
29862
+ Tooltip,
29834
29863
  {
29835
- type: "button",
29836
- "data-table-control": "add-row",
29837
- "aria-label": t("tableMenu.quickAddRowAfter"),
29838
- title: t("tableMenu.quickAddRowAfter"),
29839
- onMouseDown: (event) => {
29840
- event.preventDefault();
29841
- event.stopPropagation();
29842
- setOpenMenuKey(null);
29843
- if (!canExpandTable) return;
29844
- dragStateRef.current = { kind: "add-row", previewRows: 1 };
29845
- setDragPreview({ kind: "add-row", previewRows: 1 });
29846
- document.body.style.cursor = "ns-resize";
29847
- },
29848
- disabled: !canExpandTable,
29849
- className: cn(
29850
- "absolute z-30 inline-flex items-center justify-center rounded-md",
29851
- "border border-border/70 bg-muted/40 text-muted-foreground shadow-sm backdrop-blur",
29852
- "transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed"
29853
- ),
29854
- style: {
29855
- top: rowRailTop,
29856
- left: rowRailLeft,
29857
- width: layout.tableWidth,
29858
- height: 16
29859
- },
29860
- children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-sm font-medium leading-none", children: "+" })
29864
+ placement: "bottom",
29865
+ content: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-xs font-medium", children: t("tableMenu.quickAddRowAfter") }),
29866
+ children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
29867
+ "button",
29868
+ {
29869
+ type: "button",
29870
+ "data-table-control": "add-row",
29871
+ "aria-label": t("tableMenu.quickAddRowAfter"),
29872
+ onMouseDown: (event) => {
29873
+ event.preventDefault();
29874
+ event.stopPropagation();
29875
+ setOpenMenuKey(null);
29876
+ if (!canExpandTable) return;
29877
+ dragStateRef.current = { kind: "add-row", previewRows: 1 };
29878
+ setDragPreview({ kind: "add-row", previewRows: 1 });
29879
+ document.body.style.cursor = "ns-resize";
29880
+ },
29881
+ disabled: !canExpandTable,
29882
+ className: cn(
29883
+ "absolute z-30 inline-flex items-center justify-center rounded-md",
29884
+ "border border-border/70 bg-muted/40 text-muted-foreground shadow-sm backdrop-blur",
29885
+ "transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed"
29886
+ ),
29887
+ style: {
29888
+ top: rowRailTop,
29889
+ left: rowRailLeft,
29890
+ width: visibleTableWidth,
29891
+ height: 16
29892
+ },
29893
+ children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-sm font-medium leading-none", children: "+" })
29894
+ }
29895
+ )
29861
29896
  }
29862
29897
  ),
29863
29898
  dragPreview?.kind === "row" && /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)(import_jsx_runtime82.Fragment, { children: [
@@ -30211,7 +30246,20 @@ var UEditor = import_react53.default.forwardRef(({
30211
30246
  "[&_pre]:text-[#d4d4d4]!",
30212
30247
  "[&_pre_code]:bg-transparent!",
30213
30248
  "[&_.tableWrapper]:overflow-x-auto",
30249
+ "[&_.tableWrapper]:pb-1.5",
30214
30250
  "[&_.tableWrapper]:select-text",
30251
+ "[&_.tableWrapper]:[scrollbar-width:thin]",
30252
+ "[&_.tableWrapper]:[scrollbar-color:hsl(var(--border))_transparent]",
30253
+ "[&_.tableWrapper::-webkit-scrollbar]:h-2",
30254
+ "[&_.tableWrapper::-webkit-scrollbar]:w-2",
30255
+ "[&_.tableWrapper::-webkit-scrollbar-track]:rounded-full",
30256
+ "[&_.tableWrapper::-webkit-scrollbar-track]:bg-transparent",
30257
+ "[&_.tableWrapper::-webkit-scrollbar-thumb]:rounded-full",
30258
+ "[&_.tableWrapper::-webkit-scrollbar-thumb]:border",
30259
+ "[&_.tableWrapper::-webkit-scrollbar-thumb]:border-solid",
30260
+ "[&_.tableWrapper::-webkit-scrollbar-thumb]:border-transparent",
30261
+ "[&_.tableWrapper::-webkit-scrollbar-thumb]:bg-border/70",
30262
+ "[&_.tableWrapper::-webkit-scrollbar-thumb:hover]:bg-muted-foreground/45",
30215
30263
  "[&_table]:table-fixed",
30216
30264
  "[&_table]:overflow-hidden",
30217
30265
  "[&_table]:select-text",
@@ -30236,15 +30284,22 @@ var UEditor = import_react53.default.forwardRef(({
30236
30284
  "[&_.column-resize-handle]:bottom-[-1px]",
30237
30285
  "[&_.column-resize-handle]:right-[-5px]",
30238
30286
  "[&_.column-resize-handle]:z-10",
30239
- "[&_.column-resize-handle]:bg-primary/65",
30240
30287
  "[&_.column-resize-handle]:w-2.5",
30241
- "[&_.column-resize-handle]:rounded-full",
30288
+ "[&_.column-resize-handle]:bg-transparent",
30289
+ "[&_.column-resize-handle]:rounded-none",
30242
30290
  "[&_.column-resize-handle]:opacity-0",
30243
- "[&_.column-resize-handle]:shadow-sm",
30244
- "[&_.column-resize-handle]:transition-[opacity,background-color,box-shadow]",
30291
+ "[&_.column-resize-handle]:transition-opacity",
30292
+ "[&_.column-resize-handle]:after:absolute",
30293
+ "[&_.column-resize-handle]:after:top-0",
30294
+ "[&_.column-resize-handle]:after:bottom-0",
30295
+ "[&_.column-resize-handle]:after:left-1/2",
30296
+ "[&_.column-resize-handle]:after:w-0.5",
30297
+ "[&_.column-resize-handle]:after:-translate-x-1/2",
30298
+ "[&_.column-resize-handle]:after:rounded-full",
30299
+ "[&_.column-resize-handle]:after:bg-primary/75",
30300
+ "[&_.column-resize-handle]:after:content-['']",
30245
30301
  "[&.resize-cursor_.column-resize-handle]:opacity-100",
30246
- "[&.resize-cursor_.column-resize-handle]:bg-primary",
30247
- "[&.resize-cursor_.column-resize-handle]:shadow-md",
30302
+ "[&.resize-cursor_.column-resize-handle]:after:bg-primary",
30248
30303
  "[&.resize-cursor]:cursor-col-resize",
30249
30304
  "[&.resize-row-cursor]:cursor-row-resize",
30250
30305
  "[&_img.ProseMirror-selectednode]:ring-2",