@monolith-forensics/monolith-ui 1.8.1-dev.4 → 1.8.1

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 (170) hide show
  1. package/dist/Button/Button.js +58 -9
  2. package/dist/Calendar/Calendar.d.ts +2 -7
  3. package/dist/Calendar/Calendar.js +49 -226
  4. package/dist/Calendar/CalendarStyles.d.ts +2 -6
  5. package/dist/Calendar/CalendarStyles.js +33 -153
  6. package/dist/Calendar/calendarHelpers.d.ts +2 -6
  7. package/dist/Calendar/calendarHelpers.js +5 -13
  8. package/dist/Charts/BarChart/BarChart.js +28 -14
  9. package/dist/Charts/BarChart/BarChart.styled.d.ts +7 -2
  10. package/dist/Charts/BarChart/BarChart.styled.js +5 -1
  11. package/dist/Charts/BarChart/BarChart.types.d.ts +13 -5
  12. package/dist/Charts/ChartUtils/chartSizing.d.ts +20 -0
  13. package/dist/Charts/ChartUtils/chartSizing.js +83 -0
  14. package/dist/Charts/ChartUtils/index.d.ts +1 -0
  15. package/dist/Charts/ChartUtils/index.js +1 -0
  16. package/dist/Charts/HeatMap/HeatMap.js +28 -7
  17. package/dist/Charts/HeatMap/HeatMap.styled.d.ts +6 -2
  18. package/dist/Charts/HeatMap/HeatMap.styled.js +3 -0
  19. package/dist/Charts/HeatMap/HeatMap.types.d.ts +7 -1
  20. package/dist/Charts/LineChart/LineChart.js +34 -15
  21. package/dist/Charts/LineChart/LineChart.styled.d.ts +7 -2
  22. package/dist/Charts/LineChart/LineChart.styled.js +5 -1
  23. package/dist/Charts/LineChart/LineChart.types.d.ts +13 -5
  24. package/dist/Charts/PieChart/PieChart.js +48 -33
  25. package/dist/Charts/PieChart/PieChart.styled.d.ts +7 -2
  26. package/dist/Charts/PieChart/PieChart.styled.js +6 -1
  27. package/dist/Charts/PieChart/PieChart.types.d.ts +7 -3
  28. package/dist/CheckBox/CheckBox.js +19 -36
  29. package/dist/DateInput/DateInput.js +143 -198
  30. package/dist/DropDownMenu/DropDownMenu.js +15 -25
  31. package/dist/DropDownMenu/components/MenuComponent.js +2 -8
  32. package/dist/DropDownMenu/components/MenuItem.d.ts +0 -2
  33. package/dist/DropDownMenu/components/MenuItem.js +21 -25
  34. package/dist/DropDownMenu/components/MenuItemList.d.ts +0 -3
  35. package/dist/DropDownMenu/components/MenuItemList.js +86 -192
  36. package/dist/DropDownMenu/components/StyledContent.js +2 -1
  37. package/dist/DropDownMenu/components/StyledFloatContainer.js +1 -1
  38. package/dist/DropDownMenu/types.d.ts +0 -3
  39. package/dist/FieldLabel/FieldLabel.js +12 -4
  40. package/dist/FileInputField/FileInputField.js +23 -4
  41. package/dist/FileViewer/viewers/ImageViewer.js +18 -75
  42. package/dist/FormSection/FormSection.js +25 -5
  43. package/dist/IconButton/IconButton.js +16 -2
  44. package/dist/Input/Input.js +56 -7
  45. package/dist/MonolithUIProvider/MonolithUIProvider.d.ts +4 -1
  46. package/dist/Pill/Pill.js +79 -8
  47. package/dist/Popover/Popover.context.d.ts +1 -2
  48. package/dist/Popover/Popover.js +2 -5
  49. package/dist/Popover/Popover.styles.d.ts +6 -1
  50. package/dist/Popover/Popover.styles.js +28 -11
  51. package/dist/Popover/Popover.transitions.d.ts +2 -4
  52. package/dist/Popover/Popover.transitions.js +49 -23
  53. package/dist/Popover/PopoverDropdown.js +8 -6
  54. package/dist/Popover/PopoverTarget.js +3 -6
  55. package/dist/QueryFilter/DefaultOperators.d.ts +76 -0
  56. package/dist/QueryFilter/DefaultOperators.js +21 -0
  57. package/dist/QueryFilter/QueryFilter.d.ts +1 -1
  58. package/dist/QueryFilter/QueryFilter.js +303 -3
  59. package/dist/QueryFilter/index.d.ts +2 -3
  60. package/dist/QueryFilter/index.js +2 -3
  61. package/dist/QueryFilter/types.d.ts +52 -0
  62. package/dist/QueryFilter/types.js +1 -0
  63. package/dist/QueryFilter/useQueryFilter.d.ts +1 -1
  64. package/dist/QueryFilter/useQueryFilter.js +19 -23
  65. package/dist/RichTextEditor/Components/CodeBlockBaseButton.d.ts +18 -0
  66. package/dist/RichTextEditor/Components/CodeBlockBaseButton.js +6 -0
  67. package/dist/RichTextEditor/Components/CodeBlockCopyButton.d.ts +9 -0
  68. package/dist/RichTextEditor/Components/CodeBlockCopyButton.js +42 -0
  69. package/dist/RichTextEditor/Components/CodeBlockFormatButton.d.ts +10 -0
  70. package/dist/RichTextEditor/Components/CodeBlockFormatButton.js +60 -0
  71. package/dist/RichTextEditor/Components/CodeBlockLanguageSelect.d.ts +9 -0
  72. package/dist/RichTextEditor/Components/CodeBlockLanguageSelect.js +30 -0
  73. package/dist/RichTextEditor/Components/CodeBlockNodeView.d.ts +3 -0
  74. package/dist/RichTextEditor/Components/CodeBlockNodeView.js +28 -0
  75. package/dist/RichTextEditor/Components/CodeBlockWrapButton.d.ts +10 -0
  76. package/dist/RichTextEditor/Components/CodeBlockWrapButton.js +17 -0
  77. package/dist/RichTextEditor/Components/LinkEditor.d.ts +8 -0
  78. package/dist/RichTextEditor/Components/LinkEditor.js +94 -0
  79. package/dist/RichTextEditor/Components/TableTools/TableCornerMenu.d.ts +2 -0
  80. package/dist/RichTextEditor/Components/TableTools/TableCornerMenu.js +19 -0
  81. package/dist/RichTextEditor/Components/TableTools/TableInsertControls.d.ts +2 -0
  82. package/dist/RichTextEditor/Components/TableTools/TableInsertControls.js +24 -0
  83. package/dist/RichTextEditor/Components/TableTools/TableRails.d.ts +2 -0
  84. package/dist/RichTextEditor/Components/TableTools/TableRails.js +180 -0
  85. package/dist/RichTextEditor/Components/TableTools/TableToolMenu.d.ts +5 -0
  86. package/dist/RichTextEditor/Components/TableTools/TableToolMenu.js +6 -0
  87. package/dist/RichTextEditor/Components/TableTools/TableTools.actions.d.ts +5 -0
  88. package/dist/RichTextEditor/Components/TableTools/TableTools.actions.js +183 -0
  89. package/dist/RichTextEditor/Components/TableTools/TableTools.commands.d.ts +16 -0
  90. package/dist/RichTextEditor/Components/TableTools/TableTools.commands.js +217 -0
  91. package/dist/RichTextEditor/Components/TableTools/TableTools.constants.d.ts +8 -0
  92. package/dist/RichTextEditor/Components/TableTools/TableTools.constants.js +11 -0
  93. package/dist/RichTextEditor/Components/TableTools/TableTools.d.ts +3 -0
  94. package/dist/RichTextEditor/Components/TableTools/TableTools.geometry.d.ts +23 -0
  95. package/dist/RichTextEditor/Components/TableTools/TableTools.geometry.js +75 -0
  96. package/dist/RichTextEditor/Components/TableTools/TableTools.js +3 -0
  97. package/dist/RichTextEditor/Components/TableTools/TableTools.selectors.d.ts +16 -0
  98. package/dist/RichTextEditor/Components/TableTools/TableTools.selectors.js +53 -0
  99. package/dist/RichTextEditor/Components/TableTools/TableTools.styled.d.ts +40 -0
  100. package/dist/RichTextEditor/Components/TableTools/TableTools.styled.js +167 -0
  101. package/dist/RichTextEditor/Components/TableTools/TableTools.types.d.ts +76 -0
  102. package/dist/RichTextEditor/Components/TableTools/TableTools.types.js +1 -0
  103. package/dist/RichTextEditor/Components/TableTools/TableTools.utils.d.ts +4 -0
  104. package/dist/RichTextEditor/Components/TableTools/TableTools.utils.js +4 -0
  105. package/dist/RichTextEditor/Components/TableTools/TableToolsPopover.d.ts +2 -0
  106. package/dist/RichTextEditor/Components/TableTools/TableToolsPopover.js +12 -0
  107. package/dist/RichTextEditor/Components/TableTools/index.d.ts +3 -0
  108. package/dist/RichTextEditor/Components/TableTools/index.js +2 -0
  109. package/dist/RichTextEditor/Enums/HighlightColors.d.ts +9 -0
  110. package/dist/RichTextEditor/Enums/HighlightColors.js +10 -0
  111. package/dist/RichTextEditor/Extensions/getTiptapExtensions.js +15 -5
  112. package/dist/RichTextEditor/Plugins/ImageActionsPlugin.js +4 -7
  113. package/dist/RichTextEditor/Plugins/UploadImagesPlugin.d.ts +0 -15
  114. package/dist/RichTextEditor/Plugins/UploadImagesPlugin.js +51 -115
  115. package/dist/RichTextEditor/Plugins/index.d.ts +0 -1
  116. package/dist/RichTextEditor/Plugins/index.js +0 -1
  117. package/dist/RichTextEditor/RichTextEditor.d.ts +2 -3
  118. package/dist/RichTextEditor/RichTextEditor.js +35 -309
  119. package/dist/RichTextEditor/Toolbar/Toolbar.js +2 -14
  120. package/dist/RichTextEditor/Utils/codeBlockUtils.d.ts +20 -0
  121. package/dist/RichTextEditor/Utils/codeBlockUtils.js +137 -0
  122. package/dist/RichTextEditor/Utils/codeUtils.d.ts +3 -0
  123. package/dist/RichTextEditor/Utils/codeUtils.js +12 -0
  124. package/dist/RichTextEditor/Utils/linkUtils.d.ts +19 -0
  125. package/dist/RichTextEditor/Utils/linkUtils.js +57 -0
  126. package/dist/RichTextEditor/Utils/tableUtils.d.ts +1 -0
  127. package/dist/RichTextEditor/Utils/tableUtils.js +1 -0
  128. package/dist/SegmentedControl/SegmentedControl.utils.d.ts +2 -2
  129. package/dist/SegmentedControl/SegmentedControl.utils.js +30 -3
  130. package/dist/SelectBox/SelectBox.js +5 -5
  131. package/dist/SelectBox/select-box.styled-components.d.ts +1 -4
  132. package/dist/SelectBox/select-box.styled-components.js +48 -11
  133. package/dist/SelectBox/types.d.ts +0 -1
  134. package/dist/Switch/Switch.d.ts +2 -2
  135. package/dist/Switch/Switch.js +83 -18
  136. package/dist/Table/ColumnResizer.d.ts +9 -6
  137. package/dist/Table/ColumnResizer.js +10 -30
  138. package/dist/Table/StateStorage.d.ts +0 -4
  139. package/dist/Table/StateStorage.js +0 -13
  140. package/dist/Table/Table.js +12 -160
  141. package/dist/Table/TableComponents.d.ts +0 -10
  142. package/dist/Table/TableComponents.js +10 -71
  143. package/dist/Table/TableDefaults.d.ts +0 -7
  144. package/dist/Table/TableDefaults.js +0 -7
  145. package/dist/Table/TableHeader.js +16 -31
  146. package/dist/Table/TableMenu/TableMenu.js +1 -1
  147. package/dist/Table/TableProvider.js +75 -354
  148. package/dist/Table/TableRow.js +16 -28
  149. package/dist/Table/Utils/index.d.ts +1 -0
  150. package/dist/Table/Utils/index.js +1 -0
  151. package/dist/Table/Utils/resizeHandler.d.ts +3 -0
  152. package/dist/Table/Utils/resizeHandler.js +84 -0
  153. package/dist/Table/types.d.ts +19 -70
  154. package/dist/TagBox/TagBox.d.ts +1 -1
  155. package/dist/TagBox/TagBox.js +80 -22
  156. package/dist/TagBox/types.d.ts +0 -1
  157. package/dist/TextArea/TextArea.js +23 -9
  158. package/dist/TextInput/TextInput.js +6 -12
  159. package/dist/Utilities/parseTimestamp.js +6 -11
  160. package/dist/core/ArrowButton.d.ts +0 -2
  161. package/dist/core/ArrowButton.js +3 -7
  162. package/dist/core/ClearButton.d.ts +0 -2
  163. package/dist/core/ClearButton.js +3 -7
  164. package/dist/core/controlSizes.js +9 -9
  165. package/dist/core/index.d.ts +0 -1
  166. package/dist/core/index.js +0 -1
  167. package/dist/index.d.ts +0 -3
  168. package/dist/index.js +0 -2
  169. package/dist/theme/variants.js +8 -2
  170. package/package.json +18 -26
@@ -1,36 +1,32 @@
1
- import { useState } from "react";
2
- import { DEFAULT_QUERY_FILTER } from "./QueryFilter.constants";
1
+ import { useEffect, useState } from "react";
3
2
  import shortUUID from "short-uuid";
3
+ const defaultFilter = {
4
+ combinator: "and",
5
+ rules: [],
6
+ };
4
7
  export const useQueryFilter = (args) => {
5
- var _a, _b, _c;
6
- const controlledFilter = (_a = args.value) !== null && _a !== void 0 ? _a : args.filter;
7
- const defaultValue = (_c = (_b = args.defaultValue) !== null && _b !== void 0 ? _b : args.defaultFilter) !== null && _c !== void 0 ? _c : DEFAULT_QUERY_FILTER;
8
- const [internalFilter, setInternalFilter] = useState(defaultValue || DEFAULT_QUERY_FILTER);
9
- const isControlled = controlledFilter !== undefined;
10
- const filter = isControlled
11
- ? controlledFilter || DEFAULT_QUERY_FILTER
12
- : internalFilter;
13
- const commitFilter = (updater) => {
14
- var _a;
15
- const nextFilter = updater(filter);
16
- if (!isControlled) {
17
- setInternalFilter(nextFilter);
18
- }
19
- (_a = args.onFilterChange) === null || _a === void 0 ? void 0 : _a.call(args, nextFilter);
20
- };
8
+ const [filter, setFilter] = useState((args === null || args === void 0 ? void 0 : args.defaultFilter) || defaultFilter);
21
9
  const addRule = (rule) => {
22
- const nextRule = Object.assign(Object.assign({}, rule), { id: rule.id || shortUUID.generate() });
23
- commitFilter((currentFilter) => (Object.assign(Object.assign({}, currentFilter), { rules: [...currentFilter.rules, nextRule] })));
10
+ if (!rule.id) {
11
+ rule.id = shortUUID.generate();
12
+ }
13
+ setFilter(Object.assign(Object.assign({}, filter), { rules: [...filter.rules, rule] }));
24
14
  };
25
15
  const removeRule = (id) => {
26
- commitFilter((currentFilter) => (Object.assign(Object.assign({}, currentFilter), { rules: currentFilter.rules.filter((r) => r.id !== id) })));
16
+ const rules = filter.rules.filter((r) => r.id !== id);
17
+ setFilter(Object.assign(Object.assign({}, filter), { rules }));
27
18
  };
28
19
  const updateRule = (rule) => {
29
- commitFilter((currentFilter) => (Object.assign(Object.assign({}, currentFilter), { rules: currentFilter.rules.map((r) => (r.id === rule.id ? rule : r)) })));
20
+ const rules = filter.rules.map((r) => (r.id === rule.id ? rule : r));
21
+ setFilter(Object.assign(Object.assign({}, filter), { rules }));
30
22
  };
31
23
  const updateRootCombinator = (combinator) => {
32
- commitFilter((currentFilter) => (Object.assign(Object.assign({}, currentFilter), { combinator })));
24
+ setFilter(Object.assign(Object.assign({}, filter), { combinator }));
33
25
  };
26
+ useEffect(() => {
27
+ var _a;
28
+ (_a = args === null || args === void 0 ? void 0 : args.onFilterChange) === null || _a === void 0 ? void 0 : _a.call(args, filter);
29
+ }, [filter]);
34
30
  return {
35
31
  filter,
36
32
  filterDefinitions: args.filterDefinitions,
@@ -0,0 +1,18 @@
1
+ export declare const CodeBlockBaseButton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").ButtonHTMLAttributes<HTMLButtonElement> & {
2
+ ref?: import("react").RefObject<HTMLButtonElement>;
3
+ children?: import("react").ReactNode | string;
4
+ className?: string;
5
+ loading?: boolean;
6
+ leftSection?: import("react").ReactNode;
7
+ rightSection?: import("react").ReactNode;
8
+ href?: string | null;
9
+ download?: string | null;
10
+ fullWidth?: boolean;
11
+ size?: import("../../core").Size;
12
+ variant?: import("../../core").Variant;
13
+ color?: import("../../Button").ButtonColor;
14
+ disabled?: boolean;
15
+ selected?: boolean;
16
+ justify?: "start" | "center" | "end";
17
+ onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
18
+ }, never>> & string & Omit<import("react").FC<import("../../Button").ButtonProps>, keyof import("react").Component<any, {}, any>>;
@@ -0,0 +1,6 @@
1
+ import styled from "styled-components";
2
+ import { Button } from "../../Button";
3
+ export const CodeBlockBaseButton = styled(Button) `
4
+ padding: 5px;
5
+ background-color: ${({ theme }) => theme.palette.background.paper};
6
+ `;
@@ -0,0 +1,9 @@
1
+ import { Editor } from "@tiptap/react";
2
+ type CodeBlockCopyButtonProps = {
3
+ className?: string;
4
+ editor?: Editor | null;
5
+ text?: string;
6
+ size?: "xs" | "sm";
7
+ };
8
+ declare const CodeBlockCopyButton: ({ className, editor, text, size, }: CodeBlockCopyButtonProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default CodeBlockCopyButton;
@@ -0,0 +1,42 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ import { useEffect, useState } from "react";
12
+ import { CheckIcon, CopyIcon } from "lucide-react";
13
+ import { copyCodeBlockText, getActiveCodeBlockText, } from "../Utils/codeBlockUtils";
14
+ import { CodeBlockBaseButton } from "./CodeBlockBaseButton";
15
+ const CodeBlockCopyButton = ({ className, editor, text, size = "xs", }) => {
16
+ const [copied, setCopied] = useState(false);
17
+ const [copyFailed, setCopyFailed] = useState(false);
18
+ const code = text !== null && text !== void 0 ? text : getActiveCodeBlockText(editor || null);
19
+ useEffect(() => {
20
+ if (!copied && !copyFailed)
21
+ return;
22
+ const timeout = window.setTimeout(() => {
23
+ setCopied(false);
24
+ setCopyFailed(false);
25
+ }, 1400);
26
+ return () => window.clearTimeout(timeout);
27
+ }, [copied, copyFailed]);
28
+ return (_jsx(CodeBlockBaseButton, { className: className, size: size, variant: "outlined", title: copyFailed ? "Unable to copy" : copied ? "Copied" : "Copy code", "aria-label": copyFailed ? "Unable to copy code" : copied ? "Copied" : "Copy code", disabled: !code, onClick: (event) => __awaiter(void 0, void 0, void 0, function* () {
29
+ event.preventDefault();
30
+ event.stopPropagation();
31
+ try {
32
+ yield copyCodeBlockText(code);
33
+ setCopied(true);
34
+ setCopyFailed(false);
35
+ }
36
+ catch (_a) {
37
+ setCopied(false);
38
+ setCopyFailed(true);
39
+ }
40
+ }), children: copied ? _jsx(CheckIcon, { size: 14 }) : _jsx(CopyIcon, { size: 14 }) }));
41
+ };
42
+ export default CodeBlockCopyButton;
@@ -0,0 +1,10 @@
1
+ import { Editor } from "@tiptap/react";
2
+ type CodeBlockFormatButtonProps = {
3
+ className?: string;
4
+ editor?: Editor | null;
5
+ language?: string;
6
+ onFormat?: () => Promise<void>;
7
+ size?: "xs" | "sm";
8
+ };
9
+ declare const CodeBlockFormatButton: ({ className, editor, language, onFormat, size, }: CodeBlockFormatButtonProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default CodeBlockFormatButton;
@@ -0,0 +1,60 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ import { useEffect, useState } from "react";
12
+ import { CheckIcon, TriangleAlertIcon, WandSparklesIcon } from "lucide-react";
13
+ import { canFormatCodeBlockLanguage, formatActiveCodeBlock, getCodeBlockLanguage, } from "../Utils/codeBlockUtils";
14
+ import { CodeBlockBaseButton } from "./CodeBlockBaseButton";
15
+ const CodeBlockFormatButton = ({ className, editor, language, onFormat, size = "xs", }) => {
16
+ const [formatted, setFormatted] = useState(false);
17
+ const [formatFailed, setFormatFailed] = useState(false);
18
+ const codeLanguage = language !== null && language !== void 0 ? language : getCodeBlockLanguage(editor || null);
19
+ const canFormat = canFormatCodeBlockLanguage(codeLanguage);
20
+ useEffect(() => {
21
+ if (!formatted && !formatFailed)
22
+ return;
23
+ const timeout = window.setTimeout(() => {
24
+ setFormatted(false);
25
+ setFormatFailed(false);
26
+ }, 1400);
27
+ return () => window.clearTimeout(timeout);
28
+ }, [formatted, formatFailed]);
29
+ return (_jsx(CodeBlockBaseButton, { className: className, size: size, variant: "outlined", title: !canFormat
30
+ ? "Formatting is not supported for this language"
31
+ : formatFailed
32
+ ? "Unable to format code"
33
+ : formatted
34
+ ? "Formatted"
35
+ : "Format code", "aria-label": !canFormat
36
+ ? "Formatting is not supported for this language"
37
+ : formatFailed
38
+ ? "Unable to format code"
39
+ : formatted
40
+ ? "Formatted"
41
+ : "Format code", disabled: !canFormat || (!onFormat && !(editor === null || editor === void 0 ? void 0 : editor.isActive("codeBlock"))), onClick: (event) => __awaiter(void 0, void 0, void 0, function* () {
42
+ event.preventDefault();
43
+ event.stopPropagation();
44
+ try {
45
+ if (onFormat) {
46
+ yield onFormat();
47
+ }
48
+ else {
49
+ yield formatActiveCodeBlock(editor || null);
50
+ }
51
+ setFormatted(true);
52
+ setFormatFailed(false);
53
+ }
54
+ catch (_a) {
55
+ setFormatted(false);
56
+ setFormatFailed(true);
57
+ }
58
+ }), children: formatted ? (_jsx(CheckIcon, { size: 14 })) : formatFailed ? (_jsx(TriangleAlertIcon, { size: 14 })) : (_jsx(WandSparklesIcon, { size: 14 })) }));
59
+ };
60
+ export default CodeBlockFormatButton;
@@ -0,0 +1,9 @@
1
+ import { Editor } from "@tiptap/react";
2
+ type CodeBlockLanguageSelectProps = {
3
+ className?: string;
4
+ editor?: Editor | null;
5
+ language?: string;
6
+ onLanguageChange?: (language: string) => void;
7
+ };
8
+ declare const CodeBlockLanguageSelect: ({ className, editor, language, onLanguageChange, }: CodeBlockLanguageSelectProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default CodeBlockLanguageSelect;
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { CodeXmlIcon } from "lucide-react";
3
+ import { DropDownMenu } from "../../DropDownMenu";
4
+ import { CODE_BLOCK_LANGUAGES, getCodeBlockLanguage, getCodeBlockLanguageOption, setCodeBlockLanguage, } from "../Utils/codeBlockUtils";
5
+ import { useTheme } from "styled-components";
6
+ const CodeBlockLanguageSelect = ({ className, editor, language, onLanguageChange, }) => {
7
+ const theme = useTheme();
8
+ const codeLanguage = language !== null && language !== void 0 ? language : getCodeBlockLanguage(editor || null);
9
+ const selectedLanguage = getCodeBlockLanguageOption(codeLanguage);
10
+ return (_jsx(DropDownMenu, { className: className, data: CODE_BLOCK_LANGUAGES, value: [selectedLanguage], enableSelectedOptionStyling: true, size: "xs", variant: "outlined", disabled: !onLanguageChange && !(editor === null || editor === void 0 ? void 0 : editor.isActive("codeBlock")), onItemSelect: (item) => {
11
+ if (onLanguageChange) {
12
+ onLanguageChange(item.value);
13
+ return;
14
+ }
15
+ setCodeBlockLanguage(editor || null, item.value);
16
+ }, buttonProps: {
17
+ title: "Select code language",
18
+ leftSection: _jsx(CodeXmlIcon, { size: 12 }),
19
+ style: {
20
+ padding: "1px 6px",
21
+ backgroundColor: theme.palette.background.paper,
22
+ },
23
+ }, dropDownProps: {
24
+ style: {
25
+ width: 150,
26
+ height: 250,
27
+ },
28
+ }, children: selectedLanguage.label }));
29
+ };
30
+ export default CodeBlockLanguageSelect;
@@ -0,0 +1,3 @@
1
+ import { ReactNodeViewProps } from "@tiptap/react";
2
+ declare const CodeBlockNodeView: ({ editor, getPos, node, updateAttributes, }: ReactNodeViewProps) => import("react/jsx-runtime").JSX.Element;
3
+ export default CodeBlockNodeView;
@@ -0,0 +1,28 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ import { NodeViewContent, NodeViewWrapper, } from "@tiptap/react";
12
+ import CodeBlockCopyButton from "./CodeBlockCopyButton";
13
+ import CodeBlockWrapButton from "./CodeBlockWrapButton";
14
+ import CodeBlockFormatButton from "./CodeBlockFormatButton";
15
+ import CodeBlockLanguageSelect from "./CodeBlockLanguageSelect";
16
+ import { formatCodeBlockText, replaceCodeBlockContent, } from "../Utils/codeBlockUtils";
17
+ const CodeBlockNodeView = ({ editor, getPos, node, updateAttributes, }) => {
18
+ const language = node.attrs.language;
19
+ const wrap = Boolean(node.attrs.wrap);
20
+ return (_jsxs(NodeViewWrapper, { as: "pre", className: "editor-code-block", "data-language": language || "plaintext", "data-wrap": wrap ? "true" : "false", children: [_jsxs("div", { className: "editor-code-block-actions", contentEditable: false, children: [_jsx(CodeBlockLanguageSelect, { language: language, onLanguageChange: (language) => updateAttributes({ language }) }), _jsx(CodeBlockWrapButton, { active: wrap, onToggle: () => updateAttributes({ wrap: !wrap }) }), _jsx(CodeBlockFormatButton, { className: "editor-code-block-action", language: language, onFormat: () => __awaiter(void 0, void 0, void 0, function* () {
21
+ const pos = getPos();
22
+ if (typeof pos !== "number")
23
+ return;
24
+ const formatted = yield formatCodeBlockText(node.textContent, language);
25
+ replaceCodeBlockContent(editor, pos + 1, pos + node.nodeSize - 1, formatted);
26
+ }) }), _jsx(CodeBlockCopyButton, { className: "editor-code-block-action", text: node.textContent })] }), _jsx(NodeViewContent, { as: "code", className: `hljs language-${language || "plaintext"}`, spellCheck: false })] }));
27
+ };
28
+ export default CodeBlockNodeView;
@@ -0,0 +1,10 @@
1
+ import { Editor } from "@tiptap/react";
2
+ type CodeBlockWrapButtonProps = {
3
+ className?: string;
4
+ editor?: Editor | null;
5
+ active?: boolean;
6
+ onToggle?: () => void;
7
+ size?: "xs" | "sm";
8
+ };
9
+ declare const CodeBlockWrapButton: ({ className, editor, active, onToggle, size, }: CodeBlockWrapButtonProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default CodeBlockWrapButton;
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { WrapTextIcon } from "lucide-react";
3
+ import { getCodeBlockWrap, toggleCodeBlockWrap } from "../Utils/codeBlockUtils";
4
+ import { CodeBlockBaseButton } from "./CodeBlockBaseButton";
5
+ const CodeBlockWrapButton = ({ className, editor, active, onToggle, size = "xs", }) => {
6
+ const isWrapped = active !== null && active !== void 0 ? active : getCodeBlockWrap(editor || null);
7
+ return (_jsx(CodeBlockBaseButton, { className: className, size: size, variant: "outlined", title: isWrapped ? "Disable code wrapping" : "Enable code wrapping", "aria-label": isWrapped ? "Disable code wrapping" : "Enable code wrapping", selected: isWrapped, disabled: !onToggle && !(editor === null || editor === void 0 ? void 0 : editor.isActive("codeBlock")), onClick: (event) => {
8
+ event.preventDefault();
9
+ event.stopPropagation();
10
+ if (onToggle) {
11
+ onToggle();
12
+ return;
13
+ }
14
+ toggleCodeBlockWrap(editor || null);
15
+ }, children: _jsx(WrapTextIcon, { size: 14 }) }));
16
+ };
17
+ export default CodeBlockWrapButton;
@@ -0,0 +1,8 @@
1
+ import { Editor } from "@tiptap/react";
2
+ type LinkEditorProps = {
3
+ editor: Editor;
4
+ onClose?: () => void;
5
+ autoFocus?: boolean;
6
+ };
7
+ export declare const LinkEditor: React.FC<LinkEditorProps>;
8
+ export default LinkEditor;
@@ -0,0 +1,94 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useState, } from "react";
3
+ import styled from "styled-components";
4
+ import { ExternalLinkIcon, SaveIcon, UnlinkIcon } from "lucide-react";
5
+ import Input from "../../Input";
6
+ import { Button } from "../../Button";
7
+ import { getLinkAttributes, normalizeLinkUrl, openLink, } from "../Utils/linkUtils";
8
+ const LinkEditorContent = styled.form `
9
+ display: flex;
10
+ align-items: center;
11
+ gap: 6px;
12
+ min-width: 280px;
13
+ `;
14
+ const LinkInput = styled(Input) `
15
+ min-width: 190px;
16
+ `;
17
+ const LinkActions = styled.div `
18
+ display: flex;
19
+ align-items: center;
20
+ gap: 4px;
21
+ `;
22
+ const LinkEditorButton = styled(Button) `
23
+ padding: 0 6px;
24
+ `;
25
+ const getInitialHref = (editor) => editor.getAttributes("link").href || "";
26
+ export const LinkEditor = ({ editor, onClose, autoFocus, }) => {
27
+ const inputRef = useRef(null);
28
+ const [href, setHref] = useState(() => getInitialHref(editor));
29
+ const currentHref = getInitialHref(editor);
30
+ const normalizedLink = useMemo(() => normalizeLinkUrl(href), [href]);
31
+ const hasLink = Boolean(currentHref);
32
+ useEffect(() => {
33
+ setHref(getInitialHref(editor));
34
+ }, [editor, editor.state.selection.from, editor.state.selection.to]);
35
+ useEffect(() => {
36
+ if (!autoFocus)
37
+ return;
38
+ window.requestAnimationFrame(() => {
39
+ var _a, _b;
40
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
41
+ (_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.select();
42
+ });
43
+ }, [autoFocus]);
44
+ const handleSave = () => {
45
+ if (!normalizedLink.isValid)
46
+ return;
47
+ const { from, to, empty } = editor.state.selection;
48
+ const attributes = getLinkAttributes(normalizedLink.href);
49
+ if (empty && hasLink) {
50
+ editor.chain().focus().extendMarkRange("link").setLink(attributes).run();
51
+ }
52
+ else if (empty) {
53
+ editor
54
+ .chain()
55
+ .focus()
56
+ .insertContent({
57
+ type: "text",
58
+ text: normalizedLink.href,
59
+ marks: [
60
+ {
61
+ type: "link",
62
+ attrs: attributes,
63
+ },
64
+ ],
65
+ })
66
+ .run();
67
+ }
68
+ else {
69
+ editor
70
+ .chain()
71
+ .focus()
72
+ .setTextSelection({ from, to })
73
+ .setLink(attributes)
74
+ .run();
75
+ }
76
+ onClose === null || onClose === void 0 ? void 0 : onClose();
77
+ };
78
+ const handleRemove = () => {
79
+ editor.chain().focus().extendMarkRange("link").unsetLink().run();
80
+ onClose === null || onClose === void 0 ? void 0 : onClose();
81
+ };
82
+ const handleSubmit = (event) => {
83
+ event.preventDefault();
84
+ handleSave();
85
+ };
86
+ const handleKeyDown = (event) => {
87
+ if (event.key === "Escape") {
88
+ event.preventDefault();
89
+ onClose === null || onClose === void 0 ? void 0 : onClose();
90
+ }
91
+ };
92
+ return (_jsxs(LinkEditorContent, { onSubmit: handleSubmit, children: [_jsx(LinkInput, { ref: inputRef, "aria-label": "Enter URL", placeholder: "https://example.com/", size: "xs", variant: "outlined", value: href, onChange: (event) => setHref(event.target.value), onKeyDown: handleKeyDown }), _jsxs(LinkActions, { children: [hasLink && (_jsxs(_Fragment, { children: [_jsx(LinkEditorButton, { "aria-label": "Open link", title: "Open link", size: "xs", variant: "subtle", type: "button", onClick: () => openLink(currentHref), children: _jsx(ExternalLinkIcon, { size: 14 }) }), _jsx(LinkEditorButton, { "aria-label": "Remove link", title: "Remove link", size: "xs", variant: "subtle", type: "button", onClick: handleRemove, children: _jsx(UnlinkIcon, { size: 14 }) })] })), _jsx(LinkEditorButton, { "aria-label": "Save link", title: "Save link", size: "xs", variant: "subtle", type: "submit", disabled: !normalizedLink.isValid, children: _jsx(SaveIcon, { size: 14 }) })] })] }));
93
+ };
94
+ export default LinkEditor;
@@ -0,0 +1,2 @@
1
+ import type { TableCornerMenuProps } from "./TableTools.types";
2
+ export declare const TableCornerMenu: ({ editor, target, opened, onOpen, onClose, onAction, onMouseEnter, onMouseLeave, onMouseDown, }: TableCornerMenuProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { TablePropertiesIcon } from "lucide-react";
3
+ import { Button } from "../../../Button";
4
+ import { Popover } from "../../../Popover";
5
+ import { getTableActionGroups } from "./TableTools.actions";
6
+ import { CornerRoot, MenuDropdown } from "./TableTools.styled";
7
+ import { getCornerRect } from "./TableTools.geometry";
8
+ import { TableToolMenu } from "./TableToolMenu";
9
+ export const TableCornerMenu = ({ editor, target, opened, onOpen, onClose, onAction, onMouseEnter, onMouseLeave, onMouseDown, }) => {
10
+ const rect = getCornerRect(target);
11
+ const groups = getTableActionGroups(editor, target);
12
+ return (_jsx(CornerRoot, { "data-monolith-table-rail": true, "$top": rect.top, "$left": rect.left, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, children: _jsxs(Popover, { opened: opened, onChange: (nextOpened) => {
13
+ if (nextOpened) {
14
+ onOpen();
15
+ return;
16
+ }
17
+ onClose();
18
+ }, position: "bottom-start", width: 245, trapFocus: true, children: [_jsx(Popover.Target, { children: _jsx(Button, { type: "button", size: "xs", variant: "outlined", title: "Table options", "aria-label": "Table options", selected: opened, onMouseDown: onMouseDown, children: _jsx(TablePropertiesIcon, { size: 12 }) }) }), _jsx(MenuDropdown, { children: _jsx(TableToolMenu, { groups: groups, onAction: onAction }) })] }) }));
19
+ };
@@ -0,0 +1,2 @@
1
+ import type { TableToolsContentProps } from "./TableTools.types";
2
+ export declare const TableToolsContent: ({ editor, showInsert, onInsert, onAction, }: TableToolsContentProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Button } from "../../../Button";
4
+ import Input from "../../../Input";
5
+ import { Switch } from "../../../Switch";
6
+ import { Field, InsertGrid, SwitchRow, TableToolsPanel, TableToolsSection, TableToolsSectionTitle, } from "./TableTools.styled";
7
+ import { DEFAULT_TABLE_OPTIONS, MAX_TABLE_SIZE, MIN_TABLE_SIZE, } from "./TableTools.constants";
8
+ import { runTableCommand } from "./TableTools.commands";
9
+ import { clampTableSize, hasTableExtension } from "./TableTools.selectors";
10
+ export const TableToolsContent = ({ editor, showInsert = false, onInsert, onAction, }) => {
11
+ const [insertOptions, setInsertOptions] = useState(DEFAULT_TABLE_OPTIONS);
12
+ const tableAvailable = hasTableExtension(editor) && (editor === null || editor === void 0 ? void 0 : editor.isEditable);
13
+ const updateInsertOption = (key, value) => {
14
+ setInsertOptions((current) => (Object.assign(Object.assign({}, current), { [key]: typeof value === "number" ? clampTableSize(value) : value })));
15
+ };
16
+ const insertTable = () => {
17
+ if (!tableAvailable)
18
+ return;
19
+ runTableCommand(editor, "insertTable", [insertOptions]);
20
+ onInsert === null || onInsert === void 0 ? void 0 : onInsert();
21
+ onAction === null || onAction === void 0 ? void 0 : onAction();
22
+ };
23
+ return (_jsx(TableToolsPanel, { children: showInsert && (_jsxs(TableToolsSection, { children: [_jsx(TableToolsSectionTitle, { description: "Create and insert a table at the current editor position.", children: "Insert Table" }), _jsxs(TableToolsSection, { style: { gap: "1rem" }, children: [_jsxs(InsertGrid, { children: [_jsxs(Field, { children: ["Rows", _jsx(Input, { type: "number", min: MIN_TABLE_SIZE, max: MAX_TABLE_SIZE, size: "xs", value: insertOptions.rows, onChange: (event) => updateInsertOption("rows", Number(event.target.value)) })] }), _jsxs(Field, { children: ["Columns", _jsx(Input, { type: "number", min: MIN_TABLE_SIZE, max: MAX_TABLE_SIZE, size: "xs", value: insertOptions.cols, onChange: (event) => updateInsertOption("cols", Number(event.target.value)) })] })] }), _jsx(SwitchRow, { children: _jsx(Switch, { size: "xs", label: "Include Header Row", description: "The first row will be formatted as a header.", value: insertOptions.withHeaderRow, onChange: (checked) => updateInsertOption("withHeaderRow", checked) }) }), _jsx(Button, { size: "xs", variant: "outlined", fullWidth: true, disabled: !tableAvailable, onClick: insertTable, children: "Insert Table" })] })] })) }));
24
+ };
@@ -0,0 +1,2 @@
1
+ import type { TableRailsProps } from "./TableTools.types";
2
+ export declare const TableRails: ({ editor }: TableRailsProps) => import("react/jsx-runtime").JSX.Element | null;