@gravity-ui/markdown-editor 15.26.1 → 15.27.0
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/build/cjs/bundle/MarkdownEditorView.js +1 -1
- package/build/cjs/bundle/MarkdownEditorView.js.map +1 -1
- package/build/cjs/bundle/types.d.ts +5 -0
- package/build/cjs/bundle/types.js.map +1 -1
- package/build/cjs/bundle/useMarkdownEditor.js +1 -0
- package/build/cjs/bundle/useMarkdownEditor.js.map +1 -1
- package/build/cjs/bundle/wysiwyg-preset.d.ts +1 -0
- package/build/cjs/bundle/wysiwyg-preset.js +1 -0
- package/build/cjs/bundle/wysiwyg-preset.js.map +1 -1
- package/build/cjs/extensions/behavior/Search/Search.d.ts +4 -0
- package/build/cjs/extensions/behavior/Search/Search.js +10 -0
- package/build/cjs/extensions/behavior/Search/Search.js.map +1 -0
- package/build/cjs/extensions/behavior/Search/SearchViewPlugin.d.ts +7 -0
- package/build/cjs/extensions/behavior/Search/SearchViewPlugin.js +157 -0
- package/build/cjs/extensions/behavior/Search/SearchViewPlugin.js.map +1 -0
- package/build/cjs/extensions/behavior/Search/commands.d.ts +7 -0
- package/build/cjs/extensions/behavior/Search/commands.js +42 -0
- package/build/cjs/extensions/behavior/Search/commands.js.map +1 -0
- package/build/cjs/extensions/behavior/Search/const.d.ts +7 -0
- package/build/cjs/extensions/behavior/Search/const.js +10 -0
- package/build/cjs/extensions/behavior/Search/const.js.map +1 -0
- package/build/cjs/extensions/behavior/Search/index.d.ts +1 -0
- package/build/cjs/extensions/behavior/Search/index.js +5 -0
- package/build/cjs/extensions/behavior/Search/index.js.map +1 -0
- package/build/cjs/extensions/behavior/Search/key-handler.d.ts +1 -0
- package/build/cjs/extensions/behavior/Search/key-handler.js +14 -0
- package/build/cjs/extensions/behavior/Search/key-handler.js.map +1 -0
- package/build/cjs/extensions/behavior/Search/search-plugin.css +7 -0
- package/build/cjs/extensions/behavior/Search/types.d.ts +3 -0
- package/build/cjs/extensions/behavior/Search/types.js +3 -0
- package/build/cjs/extensions/behavior/Search/types.js.map +1 -0
- package/build/cjs/extensions/behavior/Search/utils/connect-tracker.d.ts +7 -0
- package/build/cjs/extensions/behavior/Search/utils/connect-tracker.js +24 -0
- package/build/cjs/extensions/behavior/Search/utils/connect-tracker.js.map +1 -0
- package/build/cjs/extensions/behavior/Search/utils/focus-manager.d.ts +6 -0
- package/build/cjs/extensions/behavior/Search/utils/focus-manager.js +18 -0
- package/build/cjs/extensions/behavior/Search/utils/focus-manager.js.map +1 -0
- package/build/cjs/extensions/behavior/Search/utils/search-counter.d.ts +3 -0
- package/build/cjs/extensions/behavior/Search/utils/search-counter.js +18 -0
- package/build/cjs/extensions/behavior/Search/utils/search-counter.js.map +1 -0
- package/build/cjs/extensions/behavior/Search/utils/wrap-command.d.ts +4 -0
- package/build/cjs/extensions/behavior/Search/utils/wrap-command.js +16 -0
- package/build/cjs/extensions/behavior/Search/utils/wrap-command.js.map +1 -0
- package/build/cjs/extensions/behavior/SelectionContext/index.d.ts +2 -0
- package/build/cjs/extensions/behavior/SelectionContext/index.js +20 -2
- package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
- package/build/cjs/extensions/behavior/index.d.ts +2 -0
- package/build/cjs/extensions/behavior/index.js +3 -0
- package/build/cjs/extensions/behavior/index.js.map +1 -1
- package/build/cjs/i18n/search/en.json +9 -2
- package/build/cjs/i18n/search/index.d.ts +9 -2
- package/build/cjs/i18n/search/ru.json +10 -3
- package/build/cjs/markup/codemirror/create.js +1 -1
- package/build/cjs/markup/codemirror/create.js.map +1 -1
- package/build/cjs/markup/codemirror/search-plugin/plugin.d.ts +7 -9
- package/build/cjs/markup/codemirror/search-plugin/plugin.js +44 -55
- package/build/cjs/markup/codemirror/search-plugin/plugin.js.map +1 -1
- package/build/cjs/markup/codemirror/search-plugin/theme.d.ts +1 -0
- package/build/cjs/markup/codemirror/search-plugin/theme.js +15 -0
- package/build/cjs/markup/codemirror/search-plugin/theme.js.map +1 -0
- package/build/cjs/modules/search/components/SearchCardView.css +7 -0
- package/build/cjs/modules/search/components/SearchCardView.d.ts +17 -0
- package/build/cjs/modules/search/components/SearchCardView.js +22 -0
- package/build/cjs/modules/search/components/SearchCardView.js.map +1 -0
- package/build/cjs/modules/search/components/SearchCompactView.css +5 -0
- package/build/cjs/modules/search/components/SearchCompactView.d.ts +13 -0
- package/build/cjs/modules/search/components/SearchCompactView.js +26 -0
- package/build/cjs/modules/search/components/SearchCompactView.js.map +1 -0
- package/build/cjs/modules/search/components/SearchCounter.d.ts +6 -0
- package/build/cjs/modules/search/components/SearchCounter.js +15 -0
- package/build/cjs/modules/search/components/SearchCounter.js.map +1 -0
- package/build/cjs/modules/search/components/SearchPopup.css +9 -0
- package/build/cjs/modules/search/components/SearchPopup.d.ts +15 -0
- package/build/cjs/modules/search/components/SearchPopup.js +29 -0
- package/build/cjs/modules/search/components/SearchPopup.js.map +1 -0
- package/build/cjs/modules/search/components/SearchTextInput.d.ts +10 -0
- package/build/cjs/modules/search/components/SearchTextInput.js +24 -0
- package/build/cjs/modules/search/components/SearchTextInput.js.map +1 -0
- package/build/cjs/modules/search/hooks/use-search.d.ts +24 -0
- package/build/cjs/modules/search/hooks/use-search.js +47 -0
- package/build/cjs/modules/search/hooks/use-search.js.map +1 -0
- package/build/cjs/modules/search/index.d.ts +3 -0
- package/build/cjs/modules/search/index.js +9 -0
- package/build/cjs/modules/search/index.js.map +1 -0
- package/build/cjs/modules/search/qa.d.ts +14 -0
- package/build/cjs/modules/search/qa.js +18 -0
- package/build/cjs/modules/search/qa.js.map +1 -0
- package/build/cjs/modules/search/types.d.ts +10 -0
- package/build/cjs/modules/search/types.js +3 -0
- package/build/cjs/modules/search/types.js.map +1 -0
- package/build/cjs/react-utils/useAutoFocus.d.ts +1 -1
- package/build/cjs/react-utils/useAutoFocus.js +8 -10
- package/build/cjs/react-utils/useAutoFocus.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/bundle/MarkdownEditorView.js +1 -1
- package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
- package/build/esm/bundle/types.d.ts +5 -0
- package/build/esm/bundle/types.js.map +1 -1
- package/build/esm/bundle/useMarkdownEditor.js +1 -0
- package/build/esm/bundle/useMarkdownEditor.js.map +1 -1
- package/build/esm/bundle/wysiwyg-preset.d.ts +1 -0
- package/build/esm/bundle/wysiwyg-preset.js +1 -0
- package/build/esm/bundle/wysiwyg-preset.js.map +1 -1
- package/build/esm/extensions/behavior/Search/Search.d.ts +4 -0
- package/build/esm/extensions/behavior/Search/Search.js +6 -0
- package/build/esm/extensions/behavior/Search/Search.js.map +1 -0
- package/build/esm/extensions/behavior/Search/SearchViewPlugin.d.ts +7 -0
- package/build/esm/extensions/behavior/Search/SearchViewPlugin.js +153 -0
- package/build/esm/extensions/behavior/Search/SearchViewPlugin.js.map +1 -0
- package/build/esm/extensions/behavior/Search/commands.d.ts +7 -0
- package/build/esm/extensions/behavior/Search/commands.js +37 -0
- package/build/esm/extensions/behavior/Search/commands.js.map +1 -0
- package/build/esm/extensions/behavior/Search/const.d.ts +7 -0
- package/build/esm/extensions/behavior/Search/const.js +7 -0
- package/build/esm/extensions/behavior/Search/const.js.map +1 -0
- package/build/esm/extensions/behavior/Search/index.d.ts +1 -0
- package/build/esm/extensions/behavior/Search/index.js +2 -0
- package/build/esm/extensions/behavior/Search/index.js.map +1 -0
- package/build/esm/extensions/behavior/Search/key-handler.d.ts +1 -0
- package/build/esm/extensions/behavior/Search/key-handler.js +11 -0
- package/build/esm/extensions/behavior/Search/key-handler.js.map +1 -0
- package/build/esm/extensions/behavior/Search/search-plugin.css +7 -0
- package/build/esm/extensions/behavior/Search/types.d.ts +3 -0
- package/build/esm/extensions/behavior/Search/types.js +2 -0
- package/build/esm/extensions/behavior/Search/types.js.map +1 -0
- package/build/esm/extensions/behavior/Search/utils/connect-tracker.d.ts +7 -0
- package/build/esm/extensions/behavior/Search/utils/connect-tracker.js +21 -0
- package/build/esm/extensions/behavior/Search/utils/connect-tracker.js.map +1 -0
- package/build/esm/extensions/behavior/Search/utils/focus-manager.d.ts +6 -0
- package/build/esm/extensions/behavior/Search/utils/focus-manager.js +14 -0
- package/build/esm/extensions/behavior/Search/utils/focus-manager.js.map +1 -0
- package/build/esm/extensions/behavior/Search/utils/search-counter.d.ts +3 -0
- package/build/esm/extensions/behavior/Search/utils/search-counter.js +15 -0
- package/build/esm/extensions/behavior/Search/utils/search-counter.js.map +1 -0
- package/build/esm/extensions/behavior/Search/utils/wrap-command.d.ts +4 -0
- package/build/esm/extensions/behavior/Search/utils/wrap-command.js +13 -0
- package/build/esm/extensions/behavior/Search/utils/wrap-command.js.map +1 -0
- package/build/esm/extensions/behavior/SelectionContext/index.d.ts +2 -0
- package/build/esm/extensions/behavior/SelectionContext/index.js +19 -2
- package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
- package/build/esm/extensions/behavior/index.d.ts +2 -0
- package/build/esm/extensions/behavior/index.js +3 -0
- package/build/esm/extensions/behavior/index.js.map +1 -1
- package/build/esm/i18n/search/en.json +9 -2
- package/build/esm/i18n/search/index.d.ts +9 -2
- package/build/esm/i18n/search/ru.json +10 -3
- package/build/esm/markup/codemirror/create.js +1 -1
- package/build/esm/markup/codemirror/create.js.map +1 -1
- package/build/esm/markup/codemirror/search-plugin/plugin.d.ts +7 -9
- package/build/esm/markup/codemirror/search-plugin/plugin.js +44 -55
- package/build/esm/markup/codemirror/search-plugin/plugin.js.map +1 -1
- package/build/esm/markup/codemirror/search-plugin/theme.d.ts +1 -0
- package/build/esm/markup/codemirror/search-plugin/theme.js +12 -0
- package/build/esm/markup/codemirror/search-plugin/theme.js.map +1 -0
- package/build/esm/modules/search/components/SearchCardView.css +7 -0
- package/build/esm/modules/search/components/SearchCardView.d.ts +17 -0
- package/build/esm/modules/search/components/SearchCardView.js +18 -0
- package/build/esm/modules/search/components/SearchCardView.js.map +1 -0
- package/build/esm/modules/search/components/SearchCompactView.css +5 -0
- package/build/esm/modules/search/components/SearchCompactView.d.ts +13 -0
- package/build/esm/modules/search/components/SearchCompactView.js +22 -0
- package/build/esm/modules/search/components/SearchCompactView.js.map +1 -0
- package/build/esm/modules/search/components/SearchCounter.d.ts +6 -0
- package/build/esm/modules/search/components/SearchCounter.js +11 -0
- package/build/esm/modules/search/components/SearchCounter.js.map +1 -0
- package/build/esm/modules/search/components/SearchPopup.css +9 -0
- package/build/esm/modules/search/components/SearchPopup.d.ts +15 -0
- package/build/esm/modules/search/components/SearchPopup.js +24 -0
- package/build/esm/modules/search/components/SearchPopup.js.map +1 -0
- package/build/esm/modules/search/components/SearchTextInput.d.ts +10 -0
- package/build/esm/modules/search/components/SearchTextInput.js +20 -0
- package/build/esm/modules/search/components/SearchTextInput.js.map +1 -0
- package/build/esm/modules/search/hooks/use-search.d.ts +24 -0
- package/build/esm/modules/search/hooks/use-search.js +44 -0
- package/build/esm/modules/search/hooks/use-search.js.map +1 -0
- package/build/esm/modules/search/index.d.ts +3 -0
- package/build/esm/modules/search/index.js +4 -0
- package/build/esm/modules/search/index.js.map +1 -0
- package/build/esm/modules/search/qa.d.ts +14 -0
- package/build/esm/modules/search/qa.js +15 -0
- package/build/esm/modules/search/qa.js.map +1 -0
- package/build/esm/modules/search/types.d.ts +10 -0
- package/build/esm/modules/search/types.js +2 -0
- package/build/esm/modules/search/types.js.map +1 -0
- package/build/esm/react-utils/useAutoFocus.d.ts +1 -1
- package/build/esm/react-utils/useAutoFocus.js +7 -8
- package/build/esm/react-utils/useAutoFocus.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/styles.css +28 -10
- package/package.json +2 -1
- package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +0 -3
- package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js +0 -9
- package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +0 -1
- package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.css +0 -10
- package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.d.ts +0 -27
- package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js +0 -83
- package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js.map +0 -1
- package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +0 -3
- package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js +0 -4
- package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +0 -1
- package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.css +0 -10
- package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.d.ts +0 -27
- package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js +0 -77
- package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js.map +0 -1
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { SearchQuery } from '@codemirror/search';
|
|
2
|
-
import "./SearchPopup.css";
|
|
3
|
-
type SearchInitial = Pick<SearchQuery, 'search' | 'caseSensitive' | 'wholeWord'>;
|
|
4
|
-
type SearchConfig = Pick<SearchInitial, 'caseSensitive' | 'wholeWord'>;
|
|
5
|
-
interface SearchCardProps {
|
|
6
|
-
initial: SearchInitial;
|
|
7
|
-
onSearchKeyDown?: (query: string) => void;
|
|
8
|
-
onChange?: (query: string) => void;
|
|
9
|
-
onClose?: (query: string) => void;
|
|
10
|
-
onSearchPrev?: (query: string) => void;
|
|
11
|
-
onSearchNext?: (query: string) => void;
|
|
12
|
-
onReplaceNext?: (query: string, replacement: string) => void;
|
|
13
|
-
onReplaceAll?: (query: string, replacement: string) => void;
|
|
14
|
-
onConfigChange?: (config: SearchConfig) => void;
|
|
15
|
-
}
|
|
16
|
-
export declare const SearchCard: React.FC<SearchCardProps>;
|
|
17
|
-
export interface SearchPopupProps extends SearchCardProps {
|
|
18
|
-
open: boolean;
|
|
19
|
-
anchor: HTMLElement;
|
|
20
|
-
onClose: () => void;
|
|
21
|
-
}
|
|
22
|
-
export declare const SearchPopup: React.FC<SearchPopupProps>;
|
|
23
|
-
interface SearchPopupWithRefProps extends Omit<SearchPopupProps, 'anchor'> {
|
|
24
|
-
anchor: HTMLElement | null;
|
|
25
|
-
}
|
|
26
|
-
export declare function renderSearchPopup({ anchor, ...props }: SearchPopupWithRefProps): JSX.Element;
|
|
27
|
-
export {};
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SearchPopup = exports.SearchCard = void 0;
|
|
4
|
-
exports.renderSearchPopup = renderSearchPopup;
|
|
5
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
-
const react_1 = require("react");
|
|
7
|
-
const icons_1 = require("@gravity-ui/icons");
|
|
8
|
-
const uikit_1 = require("@gravity-ui/uikit");
|
|
9
|
-
const classname_1 = require("../../../../classname.js");
|
|
10
|
-
const search_1 = require("../../../../i18n/search/index.js");
|
|
11
|
-
const handlers_1 = require("../../../../utils/handlers.js");
|
|
12
|
-
const ReplaceIcons_1 = require("./ReplaceIcons.js");
|
|
13
|
-
require("./SearchPopup.css");
|
|
14
|
-
const b = (0, classname_1.cn)('search-card');
|
|
15
|
-
const noop = () => { };
|
|
16
|
-
const inverse = (val) => !val;
|
|
17
|
-
const SearchCard = ({ initial, onChange = noop, onClose = noop, onSearchPrev = noop, onSearchNext = noop, onReplaceNext = noop, onReplaceAll = noop, onConfigChange = noop, }) => {
|
|
18
|
-
const [query, setQuery] = (0, react_1.useState)(initial.search);
|
|
19
|
-
const [isCaseSensitive, setIsCaseSensitive] = (0, react_1.useState)(initial.caseSensitive);
|
|
20
|
-
const [isWholeWord, setIsWholeWord] = (0, react_1.useState)(initial.wholeWord);
|
|
21
|
-
const [replacement, setReplacement] = (0, react_1.useState)('');
|
|
22
|
-
const textInputRef = (0, react_1.useRef)(null);
|
|
23
|
-
const setInputFocus = () => {
|
|
24
|
-
textInputRef.current?.focus();
|
|
25
|
-
};
|
|
26
|
-
const handleInputChange = (value) => {
|
|
27
|
-
setQuery(value);
|
|
28
|
-
onChange(value);
|
|
29
|
-
};
|
|
30
|
-
const handleClose = () => {
|
|
31
|
-
setQuery('');
|
|
32
|
-
onClose(query);
|
|
33
|
-
setInputFocus();
|
|
34
|
-
};
|
|
35
|
-
const handlePrev = () => {
|
|
36
|
-
onSearchPrev(query);
|
|
37
|
-
setInputFocus();
|
|
38
|
-
};
|
|
39
|
-
const handleNext = () => {
|
|
40
|
-
onSearchNext(query);
|
|
41
|
-
setInputFocus();
|
|
42
|
-
};
|
|
43
|
-
const handleReplace = () => {
|
|
44
|
-
onReplaceNext(query, replacement);
|
|
45
|
-
setInputFocus();
|
|
46
|
-
};
|
|
47
|
-
const handleReplaceAll = () => {
|
|
48
|
-
onReplaceAll(query, replacement);
|
|
49
|
-
setInputFocus();
|
|
50
|
-
};
|
|
51
|
-
const handleIsCaseSensitive = () => {
|
|
52
|
-
onConfigChange({
|
|
53
|
-
caseSensitive: !isCaseSensitive,
|
|
54
|
-
wholeWord: isWholeWord,
|
|
55
|
-
});
|
|
56
|
-
setIsCaseSensitive(inverse);
|
|
57
|
-
setInputFocus();
|
|
58
|
-
};
|
|
59
|
-
const handleIsWholeWord = () => {
|
|
60
|
-
onConfigChange({
|
|
61
|
-
caseSensitive: isCaseSensitive,
|
|
62
|
-
wholeWord: !isWholeWord,
|
|
63
|
-
});
|
|
64
|
-
setIsWholeWord(inverse);
|
|
65
|
-
setInputFocus();
|
|
66
|
-
};
|
|
67
|
-
const handleSearchKeyPress = (0, handlers_1.enterKeyHandler)(handleNext);
|
|
68
|
-
return ((0, jsx_runtime_1.jsxs)(uikit_1.Card, { className: b(), children: [(0, jsx_runtime_1.jsxs)("div", { className: b('header'), children: [(0, jsx_runtime_1.jsxs)("span", { className: b('title'), children: [" ", (0, search_1.i18n)('title')] }), (0, jsx_runtime_1.jsx)(uikit_1.Button, { onClick: handleClose, size: "s", view: "flat", children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Xmark, size: 14 }) })] }), (0, jsx_runtime_1.jsx)(uikit_1.TextInput, { controlRef: textInputRef, className: (0, uikit_1.sp)({ mb: 2 }), size: "s", autoFocus: true, onKeyPress: handleSearchKeyPress, onUpdate: handleInputChange, value: query, endContent: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(uikit_1.Button, { onClick: handlePrev, pin: "round-brick", children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.ChevronUp, size: 12 }) }), (0, jsx_runtime_1.jsx)(uikit_1.Button, { onClick: handleNext, pin: "brick-round", children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.ChevronDown, size: 12 }) })] }) }), (0, jsx_runtime_1.jsx)(uikit_1.TextInput, { placeholder: (0, search_1.i18n)('replace_placeholder'), className: (0, uikit_1.sp)({ mb: 2 }), size: "s", onUpdate: setReplacement, value: replacement, endContent: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(uikit_1.Button, { size: "s", onClick: handleReplace, pin: "round-brick", disabled: !query, title: (0, search_1.i18n)('action_replace'), children: (0, jsx_runtime_1.jsx)(ReplaceIcons_1.ReplaceIcon, { width: 12, height: 12 }) }), (0, jsx_runtime_1.jsx)(uikit_1.Button, { size: "s", onClick: handleReplaceAll, pin: "brick-round", disabled: !query, title: (0, search_1.i18n)('action_replace_all'), children: (0, jsx_runtime_1.jsx)(ReplaceIcons_1.ReplaceAllIcon, { width: 12, height: 12 }) })] }) }), (0, jsx_runtime_1.jsx)(uikit_1.Checkbox, { size: "m", onUpdate: handleIsCaseSensitive, checked: isCaseSensitive, className: (0, uikit_1.sp)({ mr: 4 }), children: (0, search_1.i18n)('label_case-sensitive') }), (0, jsx_runtime_1.jsx)(uikit_1.Checkbox, { size: "m", onUpdate: handleIsWholeWord, checked: isWholeWord, children: (0, search_1.i18n)('label_whole-word') })] }));
|
|
69
|
-
};
|
|
70
|
-
exports.SearchCard = SearchCard;
|
|
71
|
-
const SearchPopup = ({ open, anchor, ...props }) => {
|
|
72
|
-
return ((0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: open, anchorElement: anchor, placement: "bottom-end", onOpenChange: (_open, _event, reason) => {
|
|
73
|
-
if (reason === 'escape-key') {
|
|
74
|
-
props.onClose();
|
|
75
|
-
}
|
|
76
|
-
}, children: (0, jsx_runtime_1.jsx)(exports.SearchCard, { ...props }) }));
|
|
77
|
-
};
|
|
78
|
-
exports.SearchPopup = SearchPopup;
|
|
79
|
-
exports.SearchPopup.displayName = 'SearchPopup';
|
|
80
|
-
function renderSearchPopup({ anchor, ...props }) {
|
|
81
|
-
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: anchor && (0, jsx_runtime_1.jsx)(exports.SearchPopup, { anchor: anchor, ...props }) });
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=SearchPopup.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchPopup.js","sourceRoot":"../../../../../../src","sources":["markup/codemirror/search-plugin/view/SearchPopup.tsx"],"names":[],"mappings":";;;AAsNA,8CAEC;;AAxND,iCAAuC;AAGvC,6CAAgE;AAChE,6CAS2B;AAE3B,wDAAyC;AACzC,6DAA6C;AAC7C,4DAA2D;AAE3D,oDAA2D;AAE3D,6BAA4B;AAiB5B,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AACtB,MAAM,OAAO,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC;AAEhC,MAAM,UAAU,GAA8B,CAAC,EAClD,OAAO,EACP,QAAQ,GAAG,IAAI,EACf,OAAO,GAAG,IAAI,EACd,YAAY,GAAG,IAAI,EACnB,YAAY,GAAG,IAAI,EACnB,aAAa,GAAG,IAAI,EACpB,YAAY,GAAG,IAAI,EACnB,cAAc,GAAG,IAAI,GACxB,EAAE,EAAE;IACD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAS,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,IAAA,gBAAQ,EAAU,OAAO,CAAC,aAAa,CAAC,CAAC;IACvF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAU,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAS,EAAE,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,IAAA,cAAM,EAAmB,IAAI,CAAC,CAAC;IAEpD,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,EAAE;QACxC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACrB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACpB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACpB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAClC,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC1B,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACjC,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,GAAG,EAAE;QAC/B,cAAc,CAAC;YACX,aAAa,EAAE,CAAC,eAAe;YAC/B,SAAS,EAAE,WAAW;SACzB,CAAC,CAAC;QACH,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5B,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC3B,cAAc,CAAC;YACX,aAAa,EAAE,eAAe;YAC9B,SAAS,EAAE,CAAC,WAAW;SAC1B,CAAC,CAAC;QACH,cAAc,CAAC,OAAO,CAAC,CAAC;QACxB,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAiC,IAAA,0BAAe,EAAC,UAAU,CAAC,CAAC;IAEvF,OAAO,CACH,wBAAC,YAAI,IAAC,SAAS,EAAE,CAAC,EAAE,aAChB,iCAAK,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,aACvB,kCAAM,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAI,IAAA,aAAI,EAAC,OAAO,CAAC,IAAQ,EACpD,uBAAC,cAAM,IAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,MAAM,YAC9C,uBAAC,YAAI,IAAC,IAAI,EAAE,aAAK,EAAE,IAAI,EAAE,EAAE,GAAI,GAC1B,IACP,EACN,uBAAC,iBAAS,IACN,UAAU,EAAE,YAAY,EACxB,SAAS,EAAE,IAAA,UAAE,EAAC,EAAC,EAAE,EAAE,CAAC,EAAC,CAAC,EACtB,IAAI,EAAC,GAAG,EACR,SAAS,QACT,UAAU,EAAE,oBAAoB,EAChC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,KAAK,EACZ,UAAU,EACN,6DACI,uBAAC,cAAM,IAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAC,aAAa,YAC1C,uBAAC,YAAI,IAAC,IAAI,EAAE,iBAAS,EAAE,IAAI,EAAE,EAAE,GAAI,GAC9B,EACT,uBAAC,cAAM,IAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAC,aAAa,YAC1C,uBAAC,YAAI,IAAC,IAAI,EAAE,mBAAW,EAAE,IAAI,EAAE,EAAE,GAAI,GAChC,IACV,GAET,EACF,uBAAC,iBAAS,IACN,WAAW,EAAE,IAAA,aAAI,EAAC,qBAAqB,CAAC,EACxC,SAAS,EAAE,IAAA,UAAE,EAAC,EAAC,EAAE,EAAE,CAAC,EAAC,CAAC,EACtB,IAAI,EAAC,GAAG,EACR,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,WAAW,EAClB,UAAU,EACN,6DACI,uBAAC,cAAM,IACH,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,aAAa,EACtB,GAAG,EAAC,aAAa,EACjB,QAAQ,EAAE,CAAC,KAAK,EAChB,KAAK,EAAE,IAAA,aAAI,EAAC,gBAAgB,CAAC,YAE7B,uBAAC,0BAAW,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,GACjC,EACT,uBAAC,cAAM,IACH,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAC,aAAa,EACjB,QAAQ,EAAE,CAAC,KAAK,EAChB,KAAK,EAAE,IAAA,aAAI,EAAC,oBAAoB,CAAC,YAEjC,uBAAC,6BAAc,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,GACpC,IACV,GAET,EACF,uBAAC,gBAAQ,IACL,IAAI,EAAC,GAAG,EACR,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,IAAA,UAAE,EAAC,EAAC,EAAE,EAAE,CAAC,EAAC,CAAC,YAErB,IAAA,aAAI,EAAC,sBAAsB,CAAC,GACtB,EACX,uBAAC,gBAAQ,IAAC,IAAI,EAAC,GAAG,EAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,YAC/D,IAAA,aAAI,EAAC,kBAAkB,CAAC,GAClB,IACR,CACV,CAAC;AACN,CAAC,CAAC;AA5IW,QAAA,UAAU,cA4IrB;AAQK,MAAM,WAAW,GAA+B,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,EAAC,EAAE,EAAE;IAChF,OAAO,CACH,uBAAC,aAAK,IACF,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,SAAS,EAAC,YAAY,EACtB,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACpC,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;gBAC1B,KAAK,CAAC,OAAO,EAAE,CAAC;YACpB,CAAC;QACL,CAAC,YAED,uBAAC,kBAAU,OAAK,KAAK,GAAI,GACrB,CACX,CAAC;AACN,CAAC,CAAC;AAfW,QAAA,WAAW,eAetB;AAEF,mBAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAMxC,SAAgB,iBAAiB,CAAC,EAAC,MAAM,EAAE,GAAG,KAAK,EAA0B;IACzE,OAAO,2DAAG,MAAM,IAAI,uBAAC,mBAAW,IAAC,MAAM,EAAE,MAAM,KAAM,KAAK,GAAI,GAAI,CAAC;AACvE,CAAC","sourcesContent":["import {useRef, useState} from 'react';\n\nimport type {SearchQuery} from '@codemirror/search';\nimport {ChevronDown, ChevronUp, Xmark} from '@gravity-ui/icons';\nimport {\n Button,\n Card,\n Checkbox,\n Icon,\n Popup,\n TextInput,\n type TextInputProps,\n sp,\n} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../classname';\nimport {i18n} from '../../../../i18n/search';\nimport {enterKeyHandler} from '../../../../utils/handlers';\n\nimport {ReplaceAllIcon, ReplaceIcon} from './ReplaceIcons';\n\nimport './SearchPopup.scss';\n\ntype SearchInitial = Pick<SearchQuery, 'search' | 'caseSensitive' | 'wholeWord'>;\ntype SearchConfig = Pick<SearchInitial, 'caseSensitive' | 'wholeWord'>;\n\ninterface SearchCardProps {\n initial: SearchInitial;\n onSearchKeyDown?: (query: string) => void;\n onChange?: (query: string) => void;\n onClose?: (query: string) => void;\n onSearchPrev?: (query: string) => void;\n onSearchNext?: (query: string) => void;\n onReplaceNext?: (query: string, replacement: string) => void;\n onReplaceAll?: (query: string, replacement: string) => void;\n onConfigChange?: (config: SearchConfig) => void;\n}\n\nconst b = cn('search-card');\n\nconst noop = () => {};\nconst inverse = (val: boolean) => !val;\n\nexport const SearchCard: React.FC<SearchCardProps> = ({\n initial,\n onChange = noop,\n onClose = noop,\n onSearchPrev = noop,\n onSearchNext = noop,\n onReplaceNext = noop,\n onReplaceAll = noop,\n onConfigChange = noop,\n}) => {\n const [query, setQuery] = useState<string>(initial.search);\n const [isCaseSensitive, setIsCaseSensitive] = useState<boolean>(initial.caseSensitive);\n const [isWholeWord, setIsWholeWord] = useState<boolean>(initial.wholeWord);\n const [replacement, setReplacement] = useState<string>('');\n const textInputRef = useRef<HTMLInputElement>(null);\n\n const setInputFocus = () => {\n textInputRef.current?.focus();\n };\n\n const handleInputChange = (value: string) => {\n setQuery(value);\n onChange(value);\n };\n\n const handleClose = () => {\n setQuery('');\n onClose(query);\n setInputFocus();\n };\n\n const handlePrev = () => {\n onSearchPrev(query);\n setInputFocus();\n };\n\n const handleNext = () => {\n onSearchNext(query);\n setInputFocus();\n };\n\n const handleReplace = () => {\n onReplaceNext(query, replacement);\n setInputFocus();\n };\n\n const handleReplaceAll = () => {\n onReplaceAll(query, replacement);\n setInputFocus();\n };\n\n const handleIsCaseSensitive = () => {\n onConfigChange({\n caseSensitive: !isCaseSensitive,\n wholeWord: isWholeWord,\n });\n setIsCaseSensitive(inverse);\n setInputFocus();\n };\n\n const handleIsWholeWord = () => {\n onConfigChange({\n caseSensitive: isCaseSensitive,\n wholeWord: !isWholeWord,\n });\n setIsWholeWord(inverse);\n setInputFocus();\n };\n\n const handleSearchKeyPress: TextInputProps['onKeyPress'] = enterKeyHandler(handleNext);\n\n return (\n <Card className={b()}>\n <div className={b('header')}>\n <span className={b('title')}> {i18n('title')}</span>\n <Button onClick={handleClose} size=\"s\" view=\"flat\">\n <Icon data={Xmark} size={14} />\n </Button>\n </div>\n <TextInput\n controlRef={textInputRef}\n className={sp({mb: 2})}\n size=\"s\"\n autoFocus\n onKeyPress={handleSearchKeyPress}\n onUpdate={handleInputChange}\n value={query}\n endContent={\n <>\n <Button onClick={handlePrev} pin=\"round-brick\">\n <Icon data={ChevronUp} size={12} />\n </Button>\n <Button onClick={handleNext} pin=\"brick-round\">\n <Icon data={ChevronDown} size={12} />\n </Button>\n </>\n }\n />\n <TextInput\n placeholder={i18n('replace_placeholder')}\n className={sp({mb: 2})}\n size=\"s\"\n onUpdate={setReplacement}\n value={replacement}\n endContent={\n <>\n <Button\n size=\"s\"\n onClick={handleReplace}\n pin=\"round-brick\"\n disabled={!query}\n title={i18n('action_replace')}\n >\n <ReplaceIcon width={12} height={12} />\n </Button>\n <Button\n size=\"s\"\n onClick={handleReplaceAll}\n pin=\"brick-round\"\n disabled={!query}\n title={i18n('action_replace_all')}\n >\n <ReplaceAllIcon width={12} height={12} />\n </Button>\n </>\n }\n />\n <Checkbox\n size=\"m\"\n onUpdate={handleIsCaseSensitive}\n checked={isCaseSensitive}\n className={sp({mr: 4})}\n >\n {i18n('label_case-sensitive')}\n </Checkbox>\n <Checkbox size=\"m\" onUpdate={handleIsWholeWord} checked={isWholeWord}>\n {i18n('label_whole-word')}\n </Checkbox>\n </Card>\n );\n};\n\nexport interface SearchPopupProps extends SearchCardProps {\n open: boolean;\n anchor: HTMLElement;\n onClose: () => void;\n}\n\nexport const SearchPopup: React.FC<SearchPopupProps> = ({open, anchor, ...props}) => {\n return (\n <Popup\n open={open}\n anchorElement={anchor}\n placement=\"bottom-end\"\n onOpenChange={(_open, _event, reason) => {\n if (reason === 'escape-key') {\n props.onClose();\n }\n }}\n >\n <SearchCard {...props} />\n </Popup>\n );\n};\n\nSearchPopup.displayName = 'SearchPopup';\n\ninterface SearchPopupWithRefProps extends Omit<SearchPopupProps, 'anchor'> {\n anchor: HTMLElement | null;\n}\n\nexport function renderSearchPopup({anchor, ...props}: SearchPopupWithRefProps) {\n return <>{anchor && <SearchPopup anchor={anchor} {...props} />}</>;\n}\n"]}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
export const ReplaceIcon = (props) => (_jsx("svg", { viewBox: "0 0 16 16", xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", width: 14, height: 14, ...props, children: _jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M3.221 3.739l2.261 2.269L7.7 3.784l-.7-.7-1.012 1.007-.008-1.6a.523.523 0 0 1 .5-.526H8V1H6.48A1.482 1.482 0 0 0 5 2.489V4.1L3.927 3.033l-.706.706zm6.67 1.794h.01c.183.311.451.467.806.467.393 0 .706-.168.94-.503.236-.335.353-.78.353-1.333 0-.511-.1-.913-.301-1.207-.201-.295-.488-.442-.86-.442-.405 0-.718.194-.938.581h-.01V1H9v4.919h.89v-.386zm-.015-1.061v-.34c0-.248.058-.448.175-.601a.54.54 0 0 1 .445-.23.49.49 0 0 1 .436.233c.104.154.155.368.155.643 0 .33-.056.587-.169.768a.524.524 0 0 1-.47.27.495.495 0 0 1-.411-.211.853.853 0 0 1-.16-.532zM9 12.769c-.256.154-.625.231-1.108.231-.563 0-1.02-.178-1.369-.533-.349-.355-.523-.813-.523-1.374 0-.648.186-1.158.56-1.53.374-.376.875-.563 1.5-.563.433 0 .746.06.94.179v.998a1.26 1.26 0 0 0-.792-.276c-.325 0-.583.1-.774.298-.19.196-.283.468-.283.816 0 .338.09.603.272.797.182.191.431.287.749.287.282 0 .558-.092.828-.276v.946zM4 7L3 8v6l1 1h7l1-1V8l-1-1H4zm0 1h7v6H4V8z" }) }));
|
|
3
|
-
export const ReplaceAllIcon = (props) => (_jsx("svg", { viewBox: "0 0 16 16", xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", width: 14, height: 14, ...props, children: _jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M11.6 2.677c.147-.31.356-.465.626-.465.248 0 .44.118.573.353.134.236.201.557.201.966 0 .443-.078.798-.235 1.067-.156.268-.365.402-.627.402-.237 0-.416-.125-.537-.374h-.008v.31H11V1h.593v1.677h.008zm-.016 1.1a.78.78 0 0 0 .107.426c.071.113.163.169.274.169.136 0 .24-.072.314-.216.075-.145.113-.35.113-.615 0-.22-.035-.39-.104-.514-.067-.124-.164-.187-.29-.187-.12 0-.219.062-.297.185a.886.886 0 0 0-.117.48v.272zM4.12 7.695L2 5.568l.662-.662 1.006 1v-1.51A1.39 1.39 0 0 1 5.055 3H7.4v.905H5.055a.49.49 0 0 0-.468.493l.007 1.5.949-.944.656.656-2.08 2.085zM9.356 4.93H10V3.22C10 2.408 9.685 2 9.056 2c-.135 0-.285.024-.45.073a1.444 1.444 0 0 0-.388.167v.665c.237-.203.487-.304.75-.304.261 0 .392.156.392.469l-.6.103c-.506.086-.76.406-.76.961 0 .263.061.473.183.631A.61.61 0 0 0 8.69 5c.29 0 .509-.16.657-.48h.009v.41zm.004-1.355v.193a.75.75 0 0 1-.12.436.368.368 0 0 1-.313.17.276.276 0 0 1-.22-.095.38.38 0 0 1-.08-.248c0-.222.11-.351.332-.389l.4-.067zM7 12.93h-.644v-.41h-.009c-.148.32-.367.48-.657.48a.61.61 0 0 1-.507-.235c-.122-.158-.183-.368-.183-.63 0-.556.254-.876.76-.962l.6-.103c0-.313-.13-.47-.392-.47-.263 0-.513.102-.75.305v-.665c.095-.063.224-.119.388-.167.165-.049.315-.073.45-.073.63 0 .944.407.944 1.22v1.71zm-.64-1.162v-.193l-.4.068c-.222.037-.333.166-.333.388 0 .1.027.183.08.248a.276.276 0 0 0 .22.095.368.368 0 0 0 .312-.17c.08-.116.12-.26.12-.436zM9.262 13c.321 0 .568-.058.738-.173v-.71a.9.9 0 0 1-.552.207.619.619 0 0 1-.5-.215c-.12-.145-.181-.345-.181-.598 0-.26.063-.464.189-.612a.644.644 0 0 1 .516-.223c.194 0 .37.069.528.207v-.749c-.129-.09-.338-.134-.626-.134-.417 0-.751.14-1.001.422-.249.28-.373.662-.373 1.148 0 .42.116.764.349 1.03.232.267.537.4.913.4zM2 9l1-1h9l1 1v5l-1 1H3l-1-1V9zm1 0v5h9V9H3zm3-2l1-1h7l1 1v5l-1 1V7H6z" }) }));
|
|
4
|
-
//# sourceMappingURL=ReplaceIcons.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReplaceIcons.js","sourceRoot":"../../../../../../src","sources":["markup/codemirror/search-plugin/view/ReplaceIcons.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,MAAM,WAAW,GAA4C,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3E,cACI,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,4BAA4B,EAClC,IAAI,EAAC,cAAc,EACnB,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,KACN,KAAK,YAET,eACI,QAAQ,EAAC,SAAS,EAClB,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,y5BAAy5B,GAC75B,GACA,CACT,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAA4C,CAAC,KAAK,EAAE,EAAE,CAAC,CAC9E,cACI,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,4BAA4B,EAClC,IAAI,EAAC,cAAc,EACnB,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,KACN,KAAK,YAET,eACI,QAAQ,EAAC,SAAS,EAClB,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,2tDAA2tD,GAC/tD,GACA,CACT,CAAC","sourcesContent":["import type React from 'react';\n\nexport const ReplaceIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n width={14}\n height={14}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.221 3.739l2.261 2.269L7.7 3.784l-.7-.7-1.012 1.007-.008-1.6a.523.523 0 0 1 .5-.526H8V1H6.48A1.482 1.482 0 0 0 5 2.489V4.1L3.927 3.033l-.706.706zm6.67 1.794h.01c.183.311.451.467.806.467.393 0 .706-.168.94-.503.236-.335.353-.78.353-1.333 0-.511-.1-.913-.301-1.207-.201-.295-.488-.442-.86-.442-.405 0-.718.194-.938.581h-.01V1H9v4.919h.89v-.386zm-.015-1.061v-.34c0-.248.058-.448.175-.601a.54.54 0 0 1 .445-.23.49.49 0 0 1 .436.233c.104.154.155.368.155.643 0 .33-.056.587-.169.768a.524.524 0 0 1-.47.27.495.495 0 0 1-.411-.211.853.853 0 0 1-.16-.532zM9 12.769c-.256.154-.625.231-1.108.231-.563 0-1.02-.178-1.369-.533-.349-.355-.523-.813-.523-1.374 0-.648.186-1.158.56-1.53.374-.376.875-.563 1.5-.563.433 0 .746.06.94.179v.998a1.26 1.26 0 0 0-.792-.276c-.325 0-.583.1-.774.298-.19.196-.283.468-.283.816 0 .338.09.603.272.797.182.191.431.287.749.287.282 0 .558-.092.828-.276v.946zM4 7L3 8v6l1 1h7l1-1V8l-1-1H4zm0 1h7v6H4V8z\"\n />\n </svg>\n);\n\nexport const ReplaceAllIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n width={14}\n height={14}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M11.6 2.677c.147-.31.356-.465.626-.465.248 0 .44.118.573.353.134.236.201.557.201.966 0 .443-.078.798-.235 1.067-.156.268-.365.402-.627.402-.237 0-.416-.125-.537-.374h-.008v.31H11V1h.593v1.677h.008zm-.016 1.1a.78.78 0 0 0 .107.426c.071.113.163.169.274.169.136 0 .24-.072.314-.216.075-.145.113-.35.113-.615 0-.22-.035-.39-.104-.514-.067-.124-.164-.187-.29-.187-.12 0-.219.062-.297.185a.886.886 0 0 0-.117.48v.272zM4.12 7.695L2 5.568l.662-.662 1.006 1v-1.51A1.39 1.39 0 0 1 5.055 3H7.4v.905H5.055a.49.49 0 0 0-.468.493l.007 1.5.949-.944.656.656-2.08 2.085zM9.356 4.93H10V3.22C10 2.408 9.685 2 9.056 2c-.135 0-.285.024-.45.073a1.444 1.444 0 0 0-.388.167v.665c.237-.203.487-.304.75-.304.261 0 .392.156.392.469l-.6.103c-.506.086-.76.406-.76.961 0 .263.061.473.183.631A.61.61 0 0 0 8.69 5c.29 0 .509-.16.657-.48h.009v.41zm.004-1.355v.193a.75.75 0 0 1-.12.436.368.368 0 0 1-.313.17.276.276 0 0 1-.22-.095.38.38 0 0 1-.08-.248c0-.222.11-.351.332-.389l.4-.067zM7 12.93h-.644v-.41h-.009c-.148.32-.367.48-.657.48a.61.61 0 0 1-.507-.235c-.122-.158-.183-.368-.183-.63 0-.556.254-.876.76-.962l.6-.103c0-.313-.13-.47-.392-.47-.263 0-.513.102-.75.305v-.665c.095-.063.224-.119.388-.167.165-.049.315-.073.45-.073.63 0 .944.407.944 1.22v1.71zm-.64-1.162v-.193l-.4.068c-.222.037-.333.166-.333.388 0 .1.027.183.08.248a.276.276 0 0 0 .22.095.368.368 0 0 0 .312-.17c.08-.116.12-.26.12-.436zM9.262 13c.321 0 .568-.058.738-.173v-.71a.9.9 0 0 1-.552.207.619.619 0 0 1-.5-.215c-.12-.145-.181-.345-.181-.598 0-.26.063-.464.189-.612a.644.644 0 0 1 .516-.223c.194 0 .37.069.528.207v-.749c-.129-.09-.338-.134-.626-.134-.417 0-.751.14-1.001.422-.249.28-.373.662-.373 1.148 0 .42.116.764.349 1.03.232.267.537.4.913.4zM2 9l1-1h9l1 1v5l-1 1H3l-1-1V9zm1 0v5h9V9H3zm3-2l1-1h7l1 1v5l-1 1V7H6z\"\n />\n </svg>\n);\n"]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
.g-md-search-card {
|
|
2
|
-
width: 450px;
|
|
3
|
-
padding: var(--g-spacing-2) var(--g-spacing-2) var(--g-spacing-3) var(--g-spacing-4);
|
|
4
|
-
}
|
|
5
|
-
.g-md-search-card__header {
|
|
6
|
-
display: flex;
|
|
7
|
-
justify-content: space-between;
|
|
8
|
-
align-items: center;
|
|
9
|
-
margin-bottom: var(--g-spacing-1);
|
|
10
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { SearchQuery } from '@codemirror/search';
|
|
2
|
-
import "./SearchPopup.css";
|
|
3
|
-
type SearchInitial = Pick<SearchQuery, 'search' | 'caseSensitive' | 'wholeWord'>;
|
|
4
|
-
type SearchConfig = Pick<SearchInitial, 'caseSensitive' | 'wholeWord'>;
|
|
5
|
-
interface SearchCardProps {
|
|
6
|
-
initial: SearchInitial;
|
|
7
|
-
onSearchKeyDown?: (query: string) => void;
|
|
8
|
-
onChange?: (query: string) => void;
|
|
9
|
-
onClose?: (query: string) => void;
|
|
10
|
-
onSearchPrev?: (query: string) => void;
|
|
11
|
-
onSearchNext?: (query: string) => void;
|
|
12
|
-
onReplaceNext?: (query: string, replacement: string) => void;
|
|
13
|
-
onReplaceAll?: (query: string, replacement: string) => void;
|
|
14
|
-
onConfigChange?: (config: SearchConfig) => void;
|
|
15
|
-
}
|
|
16
|
-
export declare const SearchCard: React.FC<SearchCardProps>;
|
|
17
|
-
export interface SearchPopupProps extends SearchCardProps {
|
|
18
|
-
open: boolean;
|
|
19
|
-
anchor: HTMLElement;
|
|
20
|
-
onClose: () => void;
|
|
21
|
-
}
|
|
22
|
-
export declare const SearchPopup: React.FC<SearchPopupProps>;
|
|
23
|
-
interface SearchPopupWithRefProps extends Omit<SearchPopupProps, 'anchor'> {
|
|
24
|
-
anchor: HTMLElement | null;
|
|
25
|
-
}
|
|
26
|
-
export declare function renderSearchPopup({ anchor, ...props }: SearchPopupWithRefProps): JSX.Element;
|
|
27
|
-
export {};
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useRef, useState } from 'react';
|
|
3
|
-
import { ChevronDown, ChevronUp, Xmark } from '@gravity-ui/icons';
|
|
4
|
-
import { Button, Card, Checkbox, Icon, Popup, TextInput, sp, } from '@gravity-ui/uikit';
|
|
5
|
-
import { cn } from "../../../../classname.js";
|
|
6
|
-
import { i18n } from "../../../../i18n/search/index.js";
|
|
7
|
-
import { enterKeyHandler } from "../../../../utils/handlers.js";
|
|
8
|
-
import { ReplaceAllIcon, ReplaceIcon } from "./ReplaceIcons.js";
|
|
9
|
-
import "./SearchPopup.css";
|
|
10
|
-
const b = cn('search-card');
|
|
11
|
-
const noop = () => { };
|
|
12
|
-
const inverse = (val) => !val;
|
|
13
|
-
export const SearchCard = ({ initial, onChange = noop, onClose = noop, onSearchPrev = noop, onSearchNext = noop, onReplaceNext = noop, onReplaceAll = noop, onConfigChange = noop, }) => {
|
|
14
|
-
const [query, setQuery] = useState(initial.search);
|
|
15
|
-
const [isCaseSensitive, setIsCaseSensitive] = useState(initial.caseSensitive);
|
|
16
|
-
const [isWholeWord, setIsWholeWord] = useState(initial.wholeWord);
|
|
17
|
-
const [replacement, setReplacement] = useState('');
|
|
18
|
-
const textInputRef = useRef(null);
|
|
19
|
-
const setInputFocus = () => {
|
|
20
|
-
textInputRef.current?.focus();
|
|
21
|
-
};
|
|
22
|
-
const handleInputChange = (value) => {
|
|
23
|
-
setQuery(value);
|
|
24
|
-
onChange(value);
|
|
25
|
-
};
|
|
26
|
-
const handleClose = () => {
|
|
27
|
-
setQuery('');
|
|
28
|
-
onClose(query);
|
|
29
|
-
setInputFocus();
|
|
30
|
-
};
|
|
31
|
-
const handlePrev = () => {
|
|
32
|
-
onSearchPrev(query);
|
|
33
|
-
setInputFocus();
|
|
34
|
-
};
|
|
35
|
-
const handleNext = () => {
|
|
36
|
-
onSearchNext(query);
|
|
37
|
-
setInputFocus();
|
|
38
|
-
};
|
|
39
|
-
const handleReplace = () => {
|
|
40
|
-
onReplaceNext(query, replacement);
|
|
41
|
-
setInputFocus();
|
|
42
|
-
};
|
|
43
|
-
const handleReplaceAll = () => {
|
|
44
|
-
onReplaceAll(query, replacement);
|
|
45
|
-
setInputFocus();
|
|
46
|
-
};
|
|
47
|
-
const handleIsCaseSensitive = () => {
|
|
48
|
-
onConfigChange({
|
|
49
|
-
caseSensitive: !isCaseSensitive,
|
|
50
|
-
wholeWord: isWholeWord,
|
|
51
|
-
});
|
|
52
|
-
setIsCaseSensitive(inverse);
|
|
53
|
-
setInputFocus();
|
|
54
|
-
};
|
|
55
|
-
const handleIsWholeWord = () => {
|
|
56
|
-
onConfigChange({
|
|
57
|
-
caseSensitive: isCaseSensitive,
|
|
58
|
-
wholeWord: !isWholeWord,
|
|
59
|
-
});
|
|
60
|
-
setIsWholeWord(inverse);
|
|
61
|
-
setInputFocus();
|
|
62
|
-
};
|
|
63
|
-
const handleSearchKeyPress = enterKeyHandler(handleNext);
|
|
64
|
-
return (_jsxs(Card, { className: b(), children: [_jsxs("div", { className: b('header'), children: [_jsxs("span", { className: b('title'), children: [" ", i18n('title')] }), _jsx(Button, { onClick: handleClose, size: "s", view: "flat", children: _jsx(Icon, { data: Xmark, size: 14 }) })] }), _jsx(TextInput, { controlRef: textInputRef, className: sp({ mb: 2 }), size: "s", autoFocus: true, onKeyPress: handleSearchKeyPress, onUpdate: handleInputChange, value: query, endContent: _jsxs(_Fragment, { children: [_jsx(Button, { onClick: handlePrev, pin: "round-brick", children: _jsx(Icon, { data: ChevronUp, size: 12 }) }), _jsx(Button, { onClick: handleNext, pin: "brick-round", children: _jsx(Icon, { data: ChevronDown, size: 12 }) })] }) }), _jsx(TextInput, { placeholder: i18n('replace_placeholder'), className: sp({ mb: 2 }), size: "s", onUpdate: setReplacement, value: replacement, endContent: _jsxs(_Fragment, { children: [_jsx(Button, { size: "s", onClick: handleReplace, pin: "round-brick", disabled: !query, title: i18n('action_replace'), children: _jsx(ReplaceIcon, { width: 12, height: 12 }) }), _jsx(Button, { size: "s", onClick: handleReplaceAll, pin: "brick-round", disabled: !query, title: i18n('action_replace_all'), children: _jsx(ReplaceAllIcon, { width: 12, height: 12 }) })] }) }), _jsx(Checkbox, { size: "m", onUpdate: handleIsCaseSensitive, checked: isCaseSensitive, className: sp({ mr: 4 }), children: i18n('label_case-sensitive') }), _jsx(Checkbox, { size: "m", onUpdate: handleIsWholeWord, checked: isWholeWord, children: i18n('label_whole-word') })] }));
|
|
65
|
-
};
|
|
66
|
-
export const SearchPopup = ({ open, anchor, ...props }) => {
|
|
67
|
-
return (_jsx(Popup, { open: open, anchorElement: anchor, placement: "bottom-end", onOpenChange: (_open, _event, reason) => {
|
|
68
|
-
if (reason === 'escape-key') {
|
|
69
|
-
props.onClose();
|
|
70
|
-
}
|
|
71
|
-
}, children: _jsx(SearchCard, { ...props }) }));
|
|
72
|
-
};
|
|
73
|
-
SearchPopup.displayName = 'SearchPopup';
|
|
74
|
-
export function renderSearchPopup({ anchor, ...props }) {
|
|
75
|
-
return _jsx(_Fragment, { children: anchor && _jsx(SearchPopup, { anchor: anchor, ...props }) });
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=SearchPopup.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchPopup.js","sourceRoot":"../../../../../../src","sources":["markup/codemirror/search-plugin/view/SearchPopup.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useRef, useState} from 'react';\n\nimport type {SearchQuery} from '@codemirror/search';\nimport {ChevronDown, ChevronUp, Xmark} from '@gravity-ui/icons';\nimport {\n Button,\n Card,\n Checkbox,\n Icon,\n Popup,\n TextInput,\n type TextInputProps,\n sp,\n} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../classname';\nimport {i18n} from '../../../../i18n/search';\nimport {enterKeyHandler} from '../../../../utils/handlers';\n\nimport {ReplaceAllIcon, ReplaceIcon} from './ReplaceIcons';\n\nimport './SearchPopup.scss';\n\ntype SearchInitial = Pick<SearchQuery, 'search' | 'caseSensitive' | 'wholeWord'>;\ntype SearchConfig = Pick<SearchInitial, 'caseSensitive' | 'wholeWord'>;\n\ninterface SearchCardProps {\n initial: SearchInitial;\n onSearchKeyDown?: (query: string) => void;\n onChange?: (query: string) => void;\n onClose?: (query: string) => void;\n onSearchPrev?: (query: string) => void;\n onSearchNext?: (query: string) => void;\n onReplaceNext?: (query: string, replacement: string) => void;\n onReplaceAll?: (query: string, replacement: string) => void;\n onConfigChange?: (config: SearchConfig) => void;\n}\n\nconst b = cn('search-card');\n\nconst noop = () => {};\nconst inverse = (val: boolean) => !val;\n\nexport const SearchCard: React.FC<SearchCardProps> = ({\n initial,\n onChange = noop,\n onClose = noop,\n onSearchPrev = noop,\n onSearchNext = noop,\n onReplaceNext = noop,\n onReplaceAll = noop,\n onConfigChange = noop,\n}) => {\n const [query, setQuery] = useState<string>(initial.search);\n const [isCaseSensitive, setIsCaseSensitive] = useState<boolean>(initial.caseSensitive);\n const [isWholeWord, setIsWholeWord] = useState<boolean>(initial.wholeWord);\n const [replacement, setReplacement] = useState<string>('');\n const textInputRef = useRef<HTMLInputElement>(null);\n\n const setInputFocus = () => {\n textInputRef.current?.focus();\n };\n\n const handleInputChange = (value: string) => {\n setQuery(value);\n onChange(value);\n };\n\n const handleClose = () => {\n setQuery('');\n onClose(query);\n setInputFocus();\n };\n\n const handlePrev = () => {\n onSearchPrev(query);\n setInputFocus();\n };\n\n const handleNext = () => {\n onSearchNext(query);\n setInputFocus();\n };\n\n const handleReplace = () => {\n onReplaceNext(query, replacement);\n setInputFocus();\n };\n\n const handleReplaceAll = () => {\n onReplaceAll(query, replacement);\n setInputFocus();\n };\n\n const handleIsCaseSensitive = () => {\n onConfigChange({\n caseSensitive: !isCaseSensitive,\n wholeWord: isWholeWord,\n });\n setIsCaseSensitive(inverse);\n setInputFocus();\n };\n\n const handleIsWholeWord = () => {\n onConfigChange({\n caseSensitive: isCaseSensitive,\n wholeWord: !isWholeWord,\n });\n setIsWholeWord(inverse);\n setInputFocus();\n };\n\n const handleSearchKeyPress: TextInputProps['onKeyPress'] = enterKeyHandler(handleNext);\n\n return (\n <Card className={b()}>\n <div className={b('header')}>\n <span className={b('title')}> {i18n('title')}</span>\n <Button onClick={handleClose} size=\"s\" view=\"flat\">\n <Icon data={Xmark} size={14} />\n </Button>\n </div>\n <TextInput\n controlRef={textInputRef}\n className={sp({mb: 2})}\n size=\"s\"\n autoFocus\n onKeyPress={handleSearchKeyPress}\n onUpdate={handleInputChange}\n value={query}\n endContent={\n <>\n <Button onClick={handlePrev} pin=\"round-brick\">\n <Icon data={ChevronUp} size={12} />\n </Button>\n <Button onClick={handleNext} pin=\"brick-round\">\n <Icon data={ChevronDown} size={12} />\n </Button>\n </>\n }\n />\n <TextInput\n placeholder={i18n('replace_placeholder')}\n className={sp({mb: 2})}\n size=\"s\"\n onUpdate={setReplacement}\n value={replacement}\n endContent={\n <>\n <Button\n size=\"s\"\n onClick={handleReplace}\n pin=\"round-brick\"\n disabled={!query}\n title={i18n('action_replace')}\n >\n <ReplaceIcon width={12} height={12} />\n </Button>\n <Button\n size=\"s\"\n onClick={handleReplaceAll}\n pin=\"brick-round\"\n disabled={!query}\n title={i18n('action_replace_all')}\n >\n <ReplaceAllIcon width={12} height={12} />\n </Button>\n </>\n }\n />\n <Checkbox\n size=\"m\"\n onUpdate={handleIsCaseSensitive}\n checked={isCaseSensitive}\n className={sp({mr: 4})}\n >\n {i18n('label_case-sensitive')}\n </Checkbox>\n <Checkbox size=\"m\" onUpdate={handleIsWholeWord} checked={isWholeWord}>\n {i18n('label_whole-word')}\n </Checkbox>\n </Card>\n );\n};\n\nexport interface SearchPopupProps extends SearchCardProps {\n open: boolean;\n anchor: HTMLElement;\n onClose: () => void;\n}\n\nexport const SearchPopup: React.FC<SearchPopupProps> = ({open, anchor, ...props}) => {\n return (\n <Popup\n open={open}\n anchorElement={anchor}\n placement=\"bottom-end\"\n onOpenChange={(_open, _event, reason) => {\n if (reason === 'escape-key') {\n props.onClose();\n }\n }}\n >\n <SearchCard {...props} />\n </Popup>\n );\n};\n\nSearchPopup.displayName = 'SearchPopup';\n\ninterface SearchPopupWithRefProps extends Omit<SearchPopupProps, 'anchor'> {\n anchor: HTMLElement | null;\n}\n\nexport function renderSearchPopup({anchor, ...props}: SearchPopupWithRefProps) {\n return <>{anchor && <SearchPopup anchor={anchor} {...props} />}</>;\n}\n"]}
|