@rufous/ui 0.2.62 → 0.2.63

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/main.cjs CHANGED
@@ -8323,7 +8323,7 @@ PhoneField.displayName = "PhoneField";
8323
8323
 
8324
8324
  // lib/RufousTextEditor/RufousTextEditor.tsx
8325
8325
  var import_react58 = __toESM(require("react"), 1);
8326
- var import_react_dom11 = require("react-dom");
8326
+ var import_react_dom12 = require("react-dom");
8327
8327
  var import_react59 = require("@tiptap/react");
8328
8328
  var import_starter_kit = __toESM(require("@tiptap/starter-kit"), 1);
8329
8329
  var import_extension_placeholder = __toESM(require("@tiptap/extension-placeholder"), 1);
@@ -8445,6 +8445,7 @@ function createMentionSuggestion(users) {
8445
8445
 
8446
8446
  // lib/RufousTextEditor/Toolbar.tsx
8447
8447
  var import_react55 = __toESM(require("react"), 1);
8448
+ var import_react_dom9 = require("react-dom");
8448
8449
 
8449
8450
  // lib/RufousTextEditor/TextToSpeech.tsx
8450
8451
  var import_react51 = __toESM(require("react"), 1);
@@ -10017,7 +10018,9 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
10017
10018
  (0, import_react55.useEffect)(() => {
10018
10019
  const handleClick = (e) => {
10019
10020
  const target = e.target;
10020
- if (ref.current && !ref.current.contains(target) && menuRef.current && !menuRef.current.contains(target)) {
10021
+ const inTrigger = ref.current?.contains(target);
10022
+ const inMenu = menuRef.current?.contains(target) || menuRef.current?.parentElement && menuRef.current.parentElement.contains(target);
10023
+ if (!inTrigger && !inMenu) {
10021
10024
  setOpen(false);
10022
10025
  }
10023
10026
  };
@@ -10062,7 +10065,10 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
10062
10065
  },
10063
10066
  trigger.label,
10064
10067
  /* @__PURE__ */ import_react55.default.createElement("span", { className: "dropdown-arrow" }, "\u25BE")
10065
- ), open && /* @__PURE__ */ import_react55.default.createElement("div", { ref: menuRef, className: "dropdown-menu dropdown-menu-fixed", onClick: keepOpen ? void 0 : () => setOpen(false) }, typeof children === "function" ? children(() => setOpen(false)) : children));
10068
+ ), open && (0, import_react_dom9.createPortal)(
10069
+ /* @__PURE__ */ import_react55.default.createElement("div", { className: "rf-rte-wrapper rf-rte-dropdown-portal" }, /* @__PURE__ */ import_react55.default.createElement("div", { ref: menuRef, className: "dropdown-menu dropdown-menu-fixed", onClick: keepOpen ? void 0 : () => setOpen(false) }, typeof children === "function" ? children(() => setOpen(false)) : children)),
10070
+ document.body
10071
+ ));
10066
10072
  };
10067
10073
  var InsertPanel = ({ editor, onClose, mode = "video" }) => {
10068
10074
  const [activeTab, setActiveTab] = (0, import_react55.useState)("link");
@@ -10961,7 +10967,7 @@ var Toolbar_default = Toolbar;
10961
10967
 
10962
10968
  // lib/RufousTextEditor/ImageToolbar.tsx
10963
10969
  var import_react56 = __toESM(require("react"), 1);
10964
- var import_react_dom9 = require("react-dom");
10970
+ var import_react_dom10 = require("react-dom");
10965
10971
  var ALIGNMENTS = [
10966
10972
  { value: "left", label: "Left", icon: "\u2630" },
10967
10973
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11133,7 +11139,7 @@ var ImageToolbar = ({ editor }) => {
11133
11139
  }, [editor]);
11134
11140
  const node = editor?.state.selection.node;
11135
11141
  const isImage = node && node.type.name === "image";
11136
- if (!editor || !isImage || !pos) return showModal ? (0, import_react_dom9.createPortal)(
11142
+ if (!editor || !isImage || !pos) return showModal ? (0, import_react_dom10.createPortal)(
11137
11143
  /* @__PURE__ */ import_react56.default.createElement(ImagePropertiesModal, { editor, node, onClose: () => setShowModal(false) }),
11138
11144
  document.body
11139
11145
  ) : null;
@@ -11210,7 +11216,7 @@ var ImageToolbar = ({ editor }) => {
11210
11216
  );
11211
11217
  setShowVAlign(false);
11212
11218
  };
11213
- return (0, import_react_dom9.createPortal)(
11219
+ return (0, import_react_dom10.createPortal)(
11214
11220
  /* @__PURE__ */ import_react56.default.createElement(import_react56.default.Fragment, null, /* @__PURE__ */ import_react56.default.createElement(
11215
11221
  "div",
11216
11222
  {
@@ -11241,7 +11247,7 @@ var ImageToolbar_default = ImageToolbar;
11241
11247
 
11242
11248
  // lib/RufousTextEditor/VideoToolbar.tsx
11243
11249
  var import_react57 = __toESM(require("react"), 1);
11244
- var import_react_dom10 = require("react-dom");
11250
+ var import_react_dom11 = require("react-dom");
11245
11251
  var ALIGNMENTS2 = [
11246
11252
  { value: "left", label: "Left", icon: "\u2630" },
11247
11253
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11387,7 +11393,7 @@ var VideoToolbar = ({ editor }) => {
11387
11393
  const node = editor?.state.selection.node;
11388
11394
  const isVideo = node && VIDEO_TYPES.includes(node.type.name);
11389
11395
  const nodeType = node?.type.name;
11390
- if (!editor || !isVideo || !pos) return showModal ? (0, import_react_dom10.createPortal)(
11396
+ if (!editor || !isVideo || !pos) return showModal ? (0, import_react_dom11.createPortal)(
11391
11397
  /* @__PURE__ */ import_react57.default.createElement(VideoPropertiesModal, { editor, node, nodeType, onClose: () => setShowModal(false) }),
11392
11398
  document.body
11393
11399
  ) : null;
@@ -11434,7 +11440,7 @@ var VideoToolbar = ({ editor }) => {
11434
11440
  })
11435
11441
  );
11436
11442
  };
11437
- return (0, import_react_dom10.createPortal)(
11443
+ return (0, import_react_dom11.createPortal)(
11438
11444
  /* @__PURE__ */ import_react57.default.createElement(import_react57.default.Fragment, null, /* @__PURE__ */ import_react57.default.createElement(
11439
11445
  "div",
11440
11446
  {
@@ -12053,7 +12059,7 @@ var RufousTextEditor = ({
12053
12059
  },
12054
12060
  "\u201C Quote"
12055
12061
  )
12056
- ), /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ import_react58.default.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ import_react58.default.createElement(import_react58.default.Fragment, null, /* @__PURE__ */ import_react58.default.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ import_react58.default.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && (0, import_react_dom11.createPortal)(
12062
+ ), /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ import_react58.default.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ import_react58.default.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ import_react58.default.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ import_react58.default.createElement(import_react58.default.Fragment, null, /* @__PURE__ */ import_react58.default.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ import_react58.default.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && (0, import_react_dom12.createPortal)(
12057
12063
  /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-overlay", onClick: handleLinkCancel }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-body" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "link-modal-field" }, /* @__PURE__ */ import_react58.default.createElement("label", { className: "link-modal-label" }, "URL"), /* @__PURE__ */ import_react58.default.createElement(
12058
12064
  "input",
12059
12065
  {
package/dist/main.css CHANGED
@@ -6757,6 +6757,14 @@ pre {
6757
6757
  margin-left: 2px;
6758
6758
  opacity: 0.5;
6759
6759
  }
6760
+ .rf-rte-dropdown-portal {
6761
+ position: static;
6762
+ border: none;
6763
+ box-shadow: none;
6764
+ background: transparent;
6765
+ overflow: visible;
6766
+ z-index: auto;
6767
+ }
6760
6768
  .rf-rte-wrapper .dropdown-menu.dropdown-menu-fixed {
6761
6769
  position: fixed;
6762
6770
  top: auto;
package/dist/main.js CHANGED
@@ -8257,7 +8257,7 @@ PhoneField.displayName = "PhoneField";
8257
8257
 
8258
8258
  // lib/RufousTextEditor/RufousTextEditor.tsx
8259
8259
  import React115, { useMemo as useMemo4, useCallback as useCallback13, useState as useState33, useRef as useRef29, useEffect as useEffect26 } from "react";
8260
- import { createPortal as createPortal5 } from "react-dom";
8260
+ import { createPortal as createPortal6 } from "react-dom";
8261
8261
  import { useEditor, EditorContent, EditorContext, FloatingMenu, BubbleMenu } from "@tiptap/react";
8262
8262
  import StarterKit from "@tiptap/starter-kit";
8263
8263
  import Placeholder from "@tiptap/extension-placeholder";
@@ -8379,6 +8379,7 @@ function createMentionSuggestion(users) {
8379
8379
 
8380
8380
  // lib/RufousTextEditor/Toolbar.tsx
8381
8381
  import React112, { useState as useState30, useRef as useRef26, useEffect as useEffect23, useCallback as useCallback12 } from "react";
8382
+ import { createPortal as createPortal3 } from "react-dom";
8382
8383
 
8383
8384
  // lib/RufousTextEditor/TextToSpeech.tsx
8384
8385
  import React107, { useState as useState26, useEffect as useEffect20, useRef as useRef23, useCallback as useCallback9 } from "react";
@@ -9951,7 +9952,9 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
9951
9952
  useEffect23(() => {
9952
9953
  const handleClick = (e) => {
9953
9954
  const target = e.target;
9954
- if (ref.current && !ref.current.contains(target) && menuRef.current && !menuRef.current.contains(target)) {
9955
+ const inTrigger = ref.current?.contains(target);
9956
+ const inMenu = menuRef.current?.contains(target) || menuRef.current?.parentElement && menuRef.current.parentElement.contains(target);
9957
+ if (!inTrigger && !inMenu) {
9955
9958
  setOpen(false);
9956
9959
  }
9957
9960
  };
@@ -9996,7 +9999,10 @@ var Dropdown = ({ trigger, children, className = "", keepOpen = false }) => {
9996
9999
  },
9997
10000
  trigger.label,
9998
10001
  /* @__PURE__ */ React112.createElement("span", { className: "dropdown-arrow" }, "\u25BE")
9999
- ), open && /* @__PURE__ */ React112.createElement("div", { ref: menuRef, className: "dropdown-menu dropdown-menu-fixed", onClick: keepOpen ? void 0 : () => setOpen(false) }, typeof children === "function" ? children(() => setOpen(false)) : children));
10002
+ ), open && createPortal3(
10003
+ /* @__PURE__ */ React112.createElement("div", { className: "rf-rte-wrapper rf-rte-dropdown-portal" }, /* @__PURE__ */ React112.createElement("div", { ref: menuRef, className: "dropdown-menu dropdown-menu-fixed", onClick: keepOpen ? void 0 : () => setOpen(false) }, typeof children === "function" ? children(() => setOpen(false)) : children)),
10004
+ document.body
10005
+ ));
10000
10006
  };
10001
10007
  var InsertPanel = ({ editor, onClose, mode = "video" }) => {
10002
10008
  const [activeTab, setActiveTab] = useState30("link");
@@ -10895,7 +10901,7 @@ var Toolbar_default = Toolbar;
10895
10901
 
10896
10902
  // lib/RufousTextEditor/ImageToolbar.tsx
10897
10903
  import React113, { useState as useState31, useEffect as useEffect24, useRef as useRef27 } from "react";
10898
- import { createPortal as createPortal3 } from "react-dom";
10904
+ import { createPortal as createPortal4 } from "react-dom";
10899
10905
  var ALIGNMENTS = [
10900
10906
  { value: "left", label: "Left", icon: "\u2630" },
10901
10907
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11067,7 +11073,7 @@ var ImageToolbar = ({ editor }) => {
11067
11073
  }, [editor]);
11068
11074
  const node = editor?.state.selection.node;
11069
11075
  const isImage = node && node.type.name === "image";
11070
- if (!editor || !isImage || !pos) return showModal ? createPortal3(
11076
+ if (!editor || !isImage || !pos) return showModal ? createPortal4(
11071
11077
  /* @__PURE__ */ React113.createElement(ImagePropertiesModal, { editor, node, onClose: () => setShowModal(false) }),
11072
11078
  document.body
11073
11079
  ) : null;
@@ -11144,7 +11150,7 @@ var ImageToolbar = ({ editor }) => {
11144
11150
  );
11145
11151
  setShowVAlign(false);
11146
11152
  };
11147
- return createPortal3(
11153
+ return createPortal4(
11148
11154
  /* @__PURE__ */ React113.createElement(React113.Fragment, null, /* @__PURE__ */ React113.createElement(
11149
11155
  "div",
11150
11156
  {
@@ -11175,7 +11181,7 @@ var ImageToolbar_default = ImageToolbar;
11175
11181
 
11176
11182
  // lib/RufousTextEditor/VideoToolbar.tsx
11177
11183
  import React114, { useState as useState32, useEffect as useEffect25, useRef as useRef28 } from "react";
11178
- import { createPortal as createPortal4 } from "react-dom";
11184
+ import { createPortal as createPortal5 } from "react-dom";
11179
11185
  var ALIGNMENTS2 = [
11180
11186
  { value: "left", label: "Left", icon: "\u2630" },
11181
11187
  { value: "center", label: "Center", icon: "\u2261" },
@@ -11321,7 +11327,7 @@ var VideoToolbar = ({ editor }) => {
11321
11327
  const node = editor?.state.selection.node;
11322
11328
  const isVideo = node && VIDEO_TYPES.includes(node.type.name);
11323
11329
  const nodeType = node?.type.name;
11324
- if (!editor || !isVideo || !pos) return showModal ? createPortal4(
11330
+ if (!editor || !isVideo || !pos) return showModal ? createPortal5(
11325
11331
  /* @__PURE__ */ React114.createElement(VideoPropertiesModal, { editor, node, nodeType, onClose: () => setShowModal(false) }),
11326
11332
  document.body
11327
11333
  ) : null;
@@ -11368,7 +11374,7 @@ var VideoToolbar = ({ editor }) => {
11368
11374
  })
11369
11375
  );
11370
11376
  };
11371
- return createPortal4(
11377
+ return createPortal5(
11372
11378
  /* @__PURE__ */ React114.createElement(React114.Fragment, null, /* @__PURE__ */ React114.createElement(
11373
11379
  "div",
11374
11380
  {
@@ -11987,7 +11993,7 @@ var RufousTextEditor = ({
11987
11993
  },
11988
11994
  "\u201C Quote"
11989
11995
  )
11990
- ), /* @__PURE__ */ React115.createElement("div", { className: "status-bar" }, /* @__PURE__ */ React115.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ React115.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ React115.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ React115.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ React115.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ React115.createElement(React115.Fragment, null, /* @__PURE__ */ React115.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ React115.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && createPortal5(
11996
+ ), /* @__PURE__ */ React115.createElement("div", { className: "status-bar" }, /* @__PURE__ */ React115.createElement("div", { className: "status-bar-left" }, onSaveProp && /* @__PURE__ */ React115.createElement("button", { onClick: handleSave, className: "status-btn save-btn" }, "Save"), onExportProp && /* @__PURE__ */ React115.createElement("button", { onClick: handleExport, className: "status-btn export-btn" }, "Export")), /* @__PURE__ */ React115.createElement("div", { className: "status-bar-right" }, saveStatus && /* @__PURE__ */ React115.createElement("span", { className: "save-status" }, saveStatus), editor && /* @__PURE__ */ React115.createElement(React115.Fragment, null, /* @__PURE__ */ React115.createElement("span", { className: "word-count" }, "CHARS: ", editor.storage.characterCount?.characters?.() ?? editor.getText().length), /* @__PURE__ */ React115.createElement("span", { className: "word-count" }, "WORDS: ", editor.storage.characterCount?.words?.() ?? editor.getText().split(/\s+/).filter(Boolean).length)))), linkModalOpen && createPortal6(
11991
11997
  /* @__PURE__ */ React115.createElement("div", { className: "link-modal-overlay", onClick: handleLinkCancel }, /* @__PURE__ */ React115.createElement("div", { className: "link-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ React115.createElement("div", { className: "link-modal-body" }, /* @__PURE__ */ React115.createElement("div", { className: "link-modal-field" }, /* @__PURE__ */ React115.createElement("label", { className: "link-modal-label" }, "URL"), /* @__PURE__ */ React115.createElement(
11992
11998
  "input",
11993
11999
  {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rufous/ui",
3
3
  "private": false,
4
- "version": "0.2.62",
4
+ "version": "0.2.63",
5
5
  "type": "module",
6
6
  "description": "Experimental: A lightweight React UI component library (Beta)",
7
7
  "style": "./dist/main.css",