sillytavern-utils-lib 1.0.55 → 1.0.57

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 (55) hide show
  1. package/dist/components/ConnectionProfileSelect.d.ts +43 -0
  2. package/dist/components/ConnectionProfileSelect.d.ts.map +1 -0
  3. package/dist/components/ConnectionProfileSelect.js +126 -0
  4. package/dist/components/ConnectionProfileSelect.js.map +1 -0
  5. package/dist/components/MyFancyButton.d.ts +6 -0
  6. package/dist/components/MyFancyButton.d.ts.map +1 -0
  7. package/dist/components/MyFancyButton.js +22 -0
  8. package/dist/components/MyFancyButton.js.map +1 -0
  9. package/dist/components/Popup.d.ts +12 -0
  10. package/dist/components/Popup.d.ts.map +1 -0
  11. package/dist/components/Popup.js +168 -0
  12. package/dist/components/Popup.js.map +1 -0
  13. package/dist/components/STButton.d.ts +23 -0
  14. package/dist/components/STButton.d.ts.map +1 -0
  15. package/dist/components/STButton.js +20 -0
  16. package/dist/components/STButton.js.map +1 -0
  17. package/dist/components/STFancyDropdown.d.ts +35 -0
  18. package/dist/components/STFancyDropdown.d.ts.map +1 -0
  19. package/dist/components/STFancyDropdown.js +135 -0
  20. package/dist/components/STFancyDropdown.js.map +1 -0
  21. package/dist/components/STInput.d.ts +25 -0
  22. package/dist/components/STInput.d.ts.map +1 -0
  23. package/dist/components/STInput.js +26 -0
  24. package/dist/components/STInput.js.map +1 -0
  25. package/dist/components/STPresetSelect.d.ts +59 -0
  26. package/dist/components/STPresetSelect.d.ts.map +1 -0
  27. package/dist/components/STPresetSelect.js +95 -0
  28. package/dist/components/STPresetSelect.js.map +1 -0
  29. package/dist/components/STSelect.d.ts +18 -0
  30. package/dist/components/STSelect.d.ts.map +1 -0
  31. package/dist/components/STSelect.js +18 -0
  32. package/dist/components/STSelect.js.map +1 -0
  33. package/dist/components/STSortableList.d.ts +44 -0
  34. package/dist/components/STSortableList.d.ts.map +1 -0
  35. package/dist/components/STSortableList.js +90 -0
  36. package/dist/components/STSortableList.js.map +1 -0
  37. package/dist/components/STTextarea.d.ts +18 -0
  38. package/dist/components/STTextarea.d.ts.map +1 -0
  39. package/dist/components/STTextarea.js +18 -0
  40. package/dist/components/STTextarea.js.map +1 -0
  41. package/dist/components/index.d.ts +12 -0
  42. package/dist/components/index.d.ts.map +1 -0
  43. package/dist/components/index.js +11 -0
  44. package/dist/components/index.js.map +1 -0
  45. package/dist/config.d.ts +4 -1
  46. package/dist/config.d.ts.map +1 -1
  47. package/dist/config.js +6 -2
  48. package/dist/config.js.map +1 -1
  49. package/dist/generate.d.ts +2 -14
  50. package/dist/generate.d.ts.map +1 -1
  51. package/dist/generate.js +2 -2
  52. package/dist/generate.js.map +1 -1
  53. package/dist/types/index.d.ts +16 -8
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/package.json +16 -3
@@ -0,0 +1,135 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState, useEffect, useRef, useMemo } from 'react';
3
+ import Fuse from 'fuse.js';
4
+ import { STInput } from './STInput.js';
5
+ /**
6
+ * A controlled component that provides a multi-select dropdown with fuzzy search capabilities.
7
+ * This is the React version of the original `buildFancyDropdown` utility.
8
+ */
9
+ export const STFancyDropdown = ({ items, value: selectedValues, onChange, placeholder = 'Select items...', closeOnSelect = false, multiple = true, disabled = false, onBeforeSelection, enableSearch = false, searchPlaceholder = 'Search...', searchNoResultsText = 'No results found', searchFuseOptions, }) => {
10
+ const [isOpen, setIsOpen] = useState(false);
11
+ const [searchTerm, setSearchTerm] = useState('');
12
+ const containerRef = useRef(null);
13
+ // Close dropdown when clicking outside of it
14
+ useEffect(() => {
15
+ const handleClickOutside = (event) => {
16
+ if (containerRef.current && !containerRef.current.contains(event.target)) {
17
+ setIsOpen(false);
18
+ }
19
+ };
20
+ document.addEventListener('mousedown', handleClickOutside);
21
+ return () => document.removeEventListener('mousedown', handleClickOutside);
22
+ }, []);
23
+ // Reset search term when the dropdown is closed
24
+ useEffect(() => {
25
+ if (!isOpen) {
26
+ setSearchTerm('');
27
+ }
28
+ }, [isOpen]);
29
+ // Memoize Fuse.js instance creation
30
+ const fuse = useMemo(() => {
31
+ if (!enableSearch)
32
+ return null;
33
+ const options = {
34
+ includeScore: false,
35
+ threshold: 0.4,
36
+ keys: ['label', 'value'],
37
+ ...searchFuseOptions,
38
+ };
39
+ return new Fuse(items, options);
40
+ }, [items, enableSearch, searchFuseOptions]);
41
+ // Memoize the filtered list based on the search term
42
+ const filteredItems = useMemo(() => {
43
+ if (!enableSearch || !searchTerm.trim() || !fuse) {
44
+ return items;
45
+ }
46
+ return fuse.search(searchTerm.trim()).map((result) => result.item);
47
+ }, [items, searchTerm, enableSearch, fuse]);
48
+ const handleItemClick = async (clickedValue) => {
49
+ let newValues;
50
+ if (!multiple) {
51
+ newValues = selectedValues.includes(clickedValue) ? [] : [clickedValue];
52
+ }
53
+ else {
54
+ newValues = selectedValues.includes(clickedValue)
55
+ ? selectedValues.filter((v) => v !== clickedValue)
56
+ : [...selectedValues, clickedValue];
57
+ }
58
+ if (onBeforeSelection) {
59
+ const canProceed = await Promise.resolve(onBeforeSelection(selectedValues, newValues));
60
+ if (!canProceed)
61
+ return;
62
+ }
63
+ onChange(newValues);
64
+ if (closeOnSelect) {
65
+ setIsOpen(false);
66
+ }
67
+ };
68
+ const triggerText = useMemo(() => {
69
+ if (selectedValues.length === 0)
70
+ return placeholder;
71
+ if (selectedValues.length === 1) {
72
+ return items.find((item) => item.value === selectedValues[0])?.label ?? selectedValues[0];
73
+ }
74
+ return `${selectedValues.length} items selected`;
75
+ }, [selectedValues, items, placeholder]);
76
+ return (_jsxs("div", { ref: containerRef, className: "fancy-dropdown-container", style: {
77
+ position: 'relative',
78
+ userSelect: 'none',
79
+ opacity: disabled ? 0.6 : 1,
80
+ pointerEvents: disabled ? 'none' : 'auto',
81
+ }, children: [_jsxs("div", { className: "fancy-dropdown-trigger", onClick: () => !disabled && setIsOpen(!isOpen), style: {
82
+ padding: '8px 12px',
83
+ border: '1px solid var(--border-color)',
84
+ backgroundColor: 'var(--bg-color)',
85
+ color: 'var(--text-color)',
86
+ borderRadius: '4px',
87
+ cursor: 'pointer',
88
+ display: 'flex',
89
+ alignItems: 'center',
90
+ justifyContent: 'space-between',
91
+ }, children: [_jsx("span", { className: "fancy-dropdown-trigger-text", children: triggerText }), _jsx("i", { className: `fas ${isOpen ? 'fa-chevron-up' : 'fa-chevron-down'}`, style: { marginLeft: '8px' } })] }), isOpen && (_jsxs("div", { className: "fancy-dropdown-list", style: {
92
+ position: 'absolute',
93
+ top: '100%',
94
+ left: '0',
95
+ right: '0',
96
+ maxHeight: '300px',
97
+ zIndex: 1050,
98
+ border: '1px solid var(--border-color)',
99
+ borderTop: 'none',
100
+ backgroundColor: 'var(--bg-color-popup, var(--bg-color-secondary, var(--greyCAIbg, var(--grey30))))',
101
+ color: 'var(--text-color)',
102
+ borderRadius: '0 0 4px 4px',
103
+ boxShadow: '0 4px 8px var(--black50a)',
104
+ overflowY: 'auto',
105
+ display: 'flex',
106
+ flexDirection: 'column',
107
+ }, children: [enableSearch && (_jsx("div", { style: {
108
+ padding: '8px',
109
+ borderBottom: '1px solid var(--border-color)',
110
+ position: 'sticky',
111
+ top: 0,
112
+ backgroundColor: 'inherit',
113
+ }, children: _jsx(STInput, { type: "text", placeholder: searchPlaceholder, value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), autoFocus: true }) })), _jsx("ul", { style: { listStyle: 'none', margin: 0, padding: 0 }, children: filteredItems.length > 0 ? (filteredItems.map((item) => (_jsx(FancyDropdownItem, { item: item, isSelected: selectedValues.includes(item.value), onClick: handleItemClick }, item.value)))) : (_jsx("div", { style: {
114
+ padding: '8px 12px',
115
+ textAlign: 'center',
116
+ color: 'var(--text-color-secondary, var(--grey50))',
117
+ }, children: searchNoResultsText })) })] }))] }));
118
+ };
119
+ // Memoized item component for performance
120
+ export const FancyDropdownItem = React.memo(({ item, isSelected, onClick }) => {
121
+ const [isHovered, setIsHovered] = useState(false);
122
+ return (_jsxs("li", { onClick: () => onClick(item.value), onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), style: {
123
+ padding: '8px 12px',
124
+ cursor: 'pointer',
125
+ display: 'flex',
126
+ alignItems: 'center',
127
+ justifyContent: 'space-between',
128
+ backgroundColor: isSelected
129
+ ? 'var(--accent-color-bg, var(--link-color))'
130
+ : isHovered
131
+ ? 'var(--hover-color, var(--white20a))'
132
+ : 'transparent',
133
+ }, children: [_jsx("span", { children: item.label }), isSelected && _jsx("i", { className: "checkmark fa-solid fa-check", style: { marginLeft: '8px' } })] }));
134
+ });
135
+ //# sourceMappingURL=STFancyDropdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STFancyDropdown.js","sourceRoot":"","sources":["../../src/components/STFancyDropdown.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import React, { FC, InputHTMLAttributes } from 'react';
2
+ export interface STInputProps extends InputHTMLAttributes<HTMLInputElement> {
3
+ /**
4
+ * For checkboxes, this text will be displayed inside the associated label.
5
+ */
6
+ label?: string | React.ReactNode;
7
+ /**
8
+ * Custom class name(s) to append or replace the default SillyTavern classes.
9
+ */
10
+ className?: string;
11
+ /**
12
+ * If set to true, default SillyTavern classes will not be applied.
13
+ * For text/number inputs, this removes 'text_pole'.
14
+ * For checkboxes, this removes 'checkbox_label' from the wrapping label.
15
+ * @default false
16
+ */
17
+ overrideDefaults?: boolean;
18
+ }
19
+ /**
20
+ * A common input component styled for SillyTavern.
21
+ * - Applies 'text_pole' class to text, number, etc.
22
+ * - Wraps checkboxes in a 'checkbox_label' label.
23
+ */
24
+ export declare const STInput: FC<STInputProps>;
25
+ //# sourceMappingURL=STInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STInput.d.ts","sourceRoot":"","sources":["../../src/components/STInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAW,MAAM,OAAO,CAAC;AAEhE,MAAM,WAAW,YAAa,SAAQ,mBAAmB,CAAC,gBAAgB,CAAC;IACzE;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CA4BpC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ /**
4
+ * A common input component styled for SillyTavern.
5
+ * - Applies 'text_pole' class to text, number, etc.
6
+ * - Wraps checkboxes in a 'checkbox_label' label.
7
+ */
8
+ export const STInput = ({ label, className, overrideDefaults = false, type = 'text', ...props }) => {
9
+ const finalClassName = useMemo(() => {
10
+ const classes = [];
11
+ if (!overrideDefaults) {
12
+ if (type === 'text' || type === 'number' || type === 'password' || type === 'email' || type === 'search') {
13
+ classes.push('text_pole');
14
+ }
15
+ }
16
+ classes.push(className);
17
+ return classes.filter(Boolean).join(' ');
18
+ }, [overrideDefaults, className, type]);
19
+ if (type === 'checkbox') {
20
+ // For checkboxes, className applies to the label wrapper.
21
+ const labelClassName = overrideDefaults ? className : `checkbox_label ${className ?? ''}`.trim();
22
+ return (_jsxs("label", { className: labelClassName, children: [_jsx("input", { type: "checkbox", ...props }), label && _jsx("span", { children: label })] }));
23
+ }
24
+ return _jsx("input", { type: type, className: finalClassName, ...props });
25
+ };
26
+ //# sourceMappingURL=STInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STInput.js","sourceRoot":"","sources":["../../src/components/STInput.tsx"],"names":[],"mappings":";AAAA,OAAc,EAA2B,OAAO,EAAE,MAAM,OAAO,CAAC;AAoBhE;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAqB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,GAAG,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IACnH,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAExB,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAExC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,0DAA0D;QAC1D,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,SAAS,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAEjG,OAAO,CACL,iBAAO,SAAS,EAAE,cAAc,aAC9B,gBAAO,IAAI,EAAC,UAAU,KAAK,KAAK,GAAI,EACnC,KAAK,IAAI,yBAAO,KAAK,GAAQ,IACxB,CACT,CAAC;IACJ,CAAC;IAED,OAAO,gBAAO,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,KAAM,KAAK,GAAI,CAAC;AACrE,CAAC,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { FC } from 'react';
2
+ export interface PresetItem {
3
+ value: string;
4
+ label: string;
5
+ }
6
+ export interface STPresetSelectProps {
7
+ /** The currently selected value. */
8
+ value?: string;
9
+ /** The list of items to display in the dropdown. */
10
+ items: PresetItem[];
11
+ /** A list of values that cannot be renamed or deleted. */
12
+ readOnlyValues?: string[];
13
+ /** A label for the entity being managed (e.g., "Preset", "Profile"). Used in popups. */
14
+ label: string;
15
+ /** A callback fired when the selected item changes. */
16
+ onChange: (newValue?: string, oldValue?: string) => void;
17
+ /** A callback fired when the list of items should be updated (e.g., after creation, renaming, or deletion). */
18
+ onItemsChange: (newItems: PresetItem[]) => void;
19
+ /** Set to true to show the 'Create' button. */
20
+ enableCreate?: boolean;
21
+ /** Set to true to show the 'Rename' button. */
22
+ enableRename?: boolean;
23
+ /** Set to true to show the 'Delete' button. */
24
+ enableDelete?: boolean;
25
+ /**
26
+ * A callback fired when the user clicks 'Create'.
27
+ * Should handle validation and return a confirmation.
28
+ * The returned `value` can be used to transform the user's input.
29
+ */
30
+ onCreate?: (newValue: string) => Promise<{
31
+ confirmed: boolean;
32
+ value?: string;
33
+ }> | {
34
+ confirmed: boolean;
35
+ value?: string;
36
+ };
37
+ /**
38
+ * A callback fired when the user clicks 'Rename'.
39
+ * Should handle validation and return a confirmation.
40
+ */
41
+ onRename?: (oldValue: string, newValue: string) => Promise<{
42
+ confirmed: boolean;
43
+ value?: string;
44
+ }> | {
45
+ confirmed: boolean;
46
+ value?: string;
47
+ };
48
+ /**
49
+ * A callback fired when the user clicks 'Delete'.
50
+ * Should return `true` to confirm deletion.
51
+ */
52
+ onDelete?: (value: string) => Promise<boolean> | boolean;
53
+ }
54
+ /**
55
+ * A controlled component for managing a list of presets with Create, Rename, and Delete functionality.
56
+ * This is the React version of the original `buildPresetSelect` utility.
57
+ */
58
+ export declare const STPresetSelect: FC<STPresetSelectProps>;
59
+ //# sourceMappingURL=STPresetSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STPresetSelect.d.ts","sourceRoot":"","sources":["../../src/components/STPresetSelect.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAwB,MAAM,OAAO,CAAC;AAMxD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,wFAAwF;IACxF,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,+GAA+G;IAC/G,aAAa,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAChD,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CACT,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9F;;;OAGG;IACH,QAAQ,CAAC,EAAE,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9F;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC1D;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CA6JlD,CAAC"}
@@ -0,0 +1,95 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useMemo } from 'react';
3
+ import { STSelect, STButton } from './index.js';
4
+ import { st_echo } from '../config.js';
5
+ const globalContext = SillyTavern.getContext();
6
+ /**
7
+ * A controlled component for managing a list of presets with Create, Rename, and Delete functionality.
8
+ * This is the React version of the original `buildPresetSelect` utility.
9
+ */
10
+ export const STPresetSelect = ({ value, items, readOnlyValues = [], label, onChange, onItemsChange, enableCreate = false, enableRename = false, enableDelete = false, onCreate, onRename, onDelete, }) => {
11
+ const selectedItem = useMemo(() => items.find((item) => item.value === value), [items, value]);
12
+ const isReadOnly = useCallback((val) => (val ? readOnlyValues.includes(val) : false), [readOnlyValues]);
13
+ const handleCreate = async () => {
14
+ const newValue = await globalContext.Popup.show.input(`Create a new ${label}`, `Please enter a name for the new ${label}:`, '');
15
+ if (!newValue || newValue.trim() === '')
16
+ return;
17
+ const trimmedValue = newValue.trim();
18
+ if (items.some((item) => item.value === trimmedValue)) {
19
+ await st_echo('warning', `A ${label} with this name already exists.`);
20
+ return;
21
+ }
22
+ let finalValue = trimmedValue;
23
+ if (onCreate) {
24
+ const result = await Promise.resolve(onCreate(trimmedValue));
25
+ if (!result.confirmed)
26
+ return;
27
+ if (result.value) {
28
+ finalValue = result.value;
29
+ }
30
+ }
31
+ const newItem = { value: finalValue, label: finalValue };
32
+ onItemsChange([...items, newItem]);
33
+ onChange(newItem.value, value);
34
+ };
35
+ const handleRename = async () => {
36
+ if (!selectedItem) {
37
+ await st_echo('warning', `Please select a ${label} to rename.`);
38
+ return;
39
+ }
40
+ if (isReadOnly(selectedItem.value)) {
41
+ await st_echo('warning', `This ${label} cannot be renamed as it is read-only.`);
42
+ return;
43
+ }
44
+ const newValue = await globalContext.Popup.show.input(`Rename ${label}`, `Please enter a new name for "${selectedItem.label}":`, selectedItem.value);
45
+ if (!newValue || newValue.trim() === '' || newValue.trim() === selectedItem.value)
46
+ return;
47
+ const trimmedValue = newValue.trim();
48
+ if (items.some((item) => item.value === trimmedValue)) {
49
+ await st_echo('warning', `A ${label} with this name already exists.`);
50
+ return;
51
+ }
52
+ let finalValue = trimmedValue;
53
+ if (onRename) {
54
+ const result = await Promise.resolve(onRename(selectedItem.value, trimmedValue));
55
+ if (!result.confirmed)
56
+ return;
57
+ if (result.value) {
58
+ finalValue = result.value;
59
+ }
60
+ }
61
+ const newItems = items.map((item) => item.value === selectedItem.value ? { value: finalValue, label: finalValue } : item);
62
+ onItemsChange(newItems);
63
+ onChange(finalValue, value);
64
+ };
65
+ const handleDelete = async () => {
66
+ if (!selectedItem) {
67
+ await st_echo('warning', `Please select a ${label} to delete.`);
68
+ return;
69
+ }
70
+ if (isReadOnly(selectedItem.value)) {
71
+ await st_echo('warning', `This ${label} cannot be deleted as it is read-only.`);
72
+ return;
73
+ }
74
+ const confirmed = await globalContext.Popup.show.confirm(`Delete ${label}`, `Are you sure you want to delete "${selectedItem.label}"?`);
75
+ if (!confirmed)
76
+ return;
77
+ if (onDelete) {
78
+ const shouldDelete = await Promise.resolve(onDelete(selectedItem.value));
79
+ if (!shouldDelete)
80
+ return;
81
+ }
82
+ const itemIndex = items.findIndex((item) => item.value === selectedItem.value);
83
+ const newItems = items.filter((item) => item.value !== selectedItem.value);
84
+ onItemsChange(newItems);
85
+ let nextSelectedValue;
86
+ if (newItems.length > 0) {
87
+ // Select the next item in the list, or the previous one if the deleted item was the last.
88
+ const nextIndex = Math.min(itemIndex, newItems.length - 1);
89
+ nextSelectedValue = newItems[nextIndex]?.value;
90
+ }
91
+ onChange(nextSelectedValue, value);
92
+ };
93
+ return (_jsxs("div", { className: "preset-select-container", style: { display: 'flex', alignItems: 'center' }, children: [_jsx(STSelect, { value: value ?? '', onChange: (e) => onChange(e.target.value, value), children: items.map((item) => (_jsx("option", { value: item.value, children: item.label }, item.value))) }), enableCreate && (_jsx(STButton, { className: "fa-solid fa-file-circle-plus", title: `Create a new ${label}`, onClick: handleCreate, "data-i18n": `[title]Create a new ${label}` })), enableRename && (_jsx(STButton, { className: "fa-solid fa-pencil", title: `Rename selected ${label}`, onClick: handleRename, disabled: !selectedItem, "data-i18n": `[title]Rename selected ${label}` })), enableDelete && (_jsx(STButton, { className: "fa-solid fa-trash-can", title: `Delete selected ${label}`, onClick: handleDelete, disabled: !selectedItem, "data-i18n": `[title]Delete selected ${label}` }))] }));
94
+ };
95
+ //# sourceMappingURL=STPresetSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STPresetSelect.js","sourceRoot":"","sources":["../../src/components/STPresetSelect.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { FC, SelectHTMLAttributes } from 'react';
2
+ export interface STSelectProps extends SelectHTMLAttributes<HTMLSelectElement> {
3
+ /**
4
+ * Custom class name(s) to append or replace the default 'text_pole' class.
5
+ */
6
+ className?: string;
7
+ /**
8
+ * If set to true, the default 'text_pole' class will not be applied.
9
+ * @default false
10
+ */
11
+ overrideDefaults?: boolean;
12
+ }
13
+ /**
14
+ * A common select (dropdown) component styled for SillyTavern.
15
+ * Applies the 'text_pole' class by default.
16
+ */
17
+ export declare const STSelect: FC<STSelectProps>;
18
+ //# sourceMappingURL=STSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STSelect.d.ts","sourceRoot":"","sources":["../../src/components/STSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAW,MAAM,OAAO,CAAC;AAE1D,MAAM,WAAW,aAAc,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IAC5E;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CAkBtC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ /**
4
+ * A common select (dropdown) component styled for SillyTavern.
5
+ * Applies the 'text_pole' class by default.
6
+ */
7
+ export const STSelect = ({ children, className, overrideDefaults = false, ...props }) => {
8
+ const finalClassName = useMemo(() => {
9
+ const classes = [];
10
+ if (!overrideDefaults) {
11
+ classes.push('text_pole');
12
+ }
13
+ classes.push(className);
14
+ return classes.filter(Boolean).join(' ');
15
+ }, [overrideDefaults, className]);
16
+ return (_jsx("select", { className: finalClassName, ...props, children: children }));
17
+ };
18
+ //# sourceMappingURL=STSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STSelect.js","sourceRoot":"","sources":["../../src/components/STSelect.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA4B,OAAO,EAAE,MAAM,OAAO,CAAC;AAc1D;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAsB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IACzG,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAExB,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC;IAElC,OAAO,CACL,iBAAQ,SAAS,EAAE,cAAc,KAAM,KAAK,YACzC,QAAQ,GACF,CACV,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import React, { FC } from 'react';
2
+ import Sortable from 'sortablejs';
3
+ import { DropdownItem } from '../fancy-dropdown.js';
4
+ export interface SortableListItemData {
5
+ id: string;
6
+ label: string | React.ReactNode;
7
+ enabled: boolean;
8
+ canDelete?: boolean;
9
+ canToggle?: boolean;
10
+ showSelect?: boolean;
11
+ canSelect?: boolean;
12
+ selectOptions?: DropdownItem[];
13
+ selectValue?: string;
14
+ }
15
+ export interface STSortableListProps {
16
+ /** The array of items to display and sort. */
17
+ items: SortableListItemData[];
18
+ /** Callback fired when the list items change (e.g., reordered, toggled, deleted, select changed). */
19
+ onItemsChange: (newItems: SortableListItemData[]) => void;
20
+ showToggleButton?: boolean;
21
+ showDeleteButton?: boolean;
22
+ showSelectInput?: boolean;
23
+ /**
24
+ * Options passed directly to the SortableJS instance.
25
+ * See https://github.com/SortableJS/Sortable#options
26
+ */
27
+ sortableJsOptions?: Sortable.Options;
28
+ }
29
+ export interface STSortableListItemProps {
30
+ item: SortableListItemData;
31
+ showToggleButton?: boolean;
32
+ showDeleteButton?: boolean;
33
+ showSelectInput?: boolean;
34
+ onToggle: (id: string) => void;
35
+ onDelete: (id: string) => void;
36
+ onSelectChange: (id: string, newValue: string) => void;
37
+ }
38
+ export declare const STSortableListItem: FC<STSortableListItemProps>;
39
+ /**
40
+ * A controlled component that renders a drag-and-drop sortable list using SortableJS.
41
+ * This is the React version of the original `buildSortableList` utility.
42
+ */
43
+ export declare const STSortableList: FC<STSortableListProps>;
44
+ //# sourceMappingURL=STSortableList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STSortableList.d.ts","sourceRoot":"","sources":["../../src/components/STSortableList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,EAAqB,MAAM,OAAO,CAAC;AACrD,OAAO,QAA2B,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKpD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,qGAAqG;IACrG,aAAa,EAAE,CAAC,QAAQ,EAAE,oBAAoB,EAAE,KAAK,IAAI,CAAC;IAE1D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;CACtC;AAGD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD;AAED,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAuG1D,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CA0ElD,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useEffect, useRef } from 'react';
3
+ import Sortable from 'sortablejs';
4
+ import { STSelect } from './STSelect.js';
5
+ import { STButton } from './STButton.js';
6
+ export const STSortableListItem = React.memo(({ item, showToggleButton, showDeleteButton, showSelectInput, onToggle, onDelete, onSelectChange }) => {
7
+ const { id, label, enabled, canDelete = true, canToggle = true, showSelect = true, canSelect = true, selectOptions = [], selectValue, } = item;
8
+ const listItemStyle = {
9
+ display: 'flex',
10
+ alignItems: 'center',
11
+ padding: '8px 12px',
12
+ border: '1px solid var(--SmartThemeBorderColor, #ccc)',
13
+ color: 'var(--SmartThemeBodyColor, #333)',
14
+ marginBottom: '2px',
15
+ opacity: showToggleButton && !enabled ? 0.6 : 1,
16
+ };
17
+ const iconStyle = { cursor: 'pointer', flexShrink: 0 };
18
+ const placeholderStyle = { display: 'inline-block', flexShrink: 0, marginRight: '10px' };
19
+ return (_jsxs("li", { className: "sortable-list-item", style: listItemStyle, "data-id": id, children: [_jsx("span", { className: "drag-handle fas fa-bars", style: { cursor: 'grab', marginRight: '10px', color: 'var(--SmartThemeBodyColor, #555)', flexShrink: 0 } }), _jsx("span", { className: "item-label", style: {
20
+ flexGrow: 1,
21
+ marginRight: '10px',
22
+ overflow: 'hidden',
23
+ textOverflow: 'ellipsis',
24
+ whiteSpace: 'nowrap',
25
+ }, children: label }), showSelectInput && showSelect && canSelect && (_jsx(STSelect, { value: selectValue, onChange: (e) => onSelectChange(id, e.target.value), disabled: !enabled, style: { marginRight: '10px', flexShrink: 0, width: 'unset' }, children: selectOptions.length === 0 ? (_jsx("option", { disabled: true, children: "--" })) : (selectOptions.map((opt) => (_jsx("option", { value: opt.value, children: opt.label }, opt.value)))) })), showSelectInput && (!showSelect || !canSelect) && _jsx("span", { style: placeholderStyle }), showToggleButton && canToggle && (_jsx(STButton, { overrideDefaults: true, className: `toggle-button fas ${enabled ? 'fa-toggle-on' : 'fa-toggle-off'}`, style: {
26
+ ...iconStyle,
27
+ marginRight: '10px',
28
+ fontSize: '1.2em',
29
+ color: enabled ? 'var(--success-color, #4CAF50)' : 'var(--SmartThemeBodyColor, #555)',
30
+ backgroundColor: 'transparent',
31
+ border: 'none',
32
+ }, onClick: () => onToggle(id) })), showToggleButton && !canToggle && _jsx("span", { style: placeholderStyle }), showDeleteButton && canDelete && (_jsx(STButton, { overrideDefaults: true, className: "delete-button fas fa-trash-can", style: {
33
+ ...iconStyle,
34
+ color: 'var(--error-color, #f44336)',
35
+ backgroundColor: 'transparent',
36
+ border: 'none',
37
+ }, onClick: () => onDelete(id) })), showDeleteButton && !canDelete && _jsx("span", { style: { ...placeholderStyle, marginRight: 0 } })] }));
38
+ });
39
+ // --- Main Component ---
40
+ /**
41
+ * A controlled component that renders a drag-and-drop sortable list using SortableJS.
42
+ * This is the React version of the original `buildSortableList` utility.
43
+ */
44
+ export const STSortableList = ({ items, onItemsChange, showToggleButton = false, showDeleteButton = false, showSelectInput = false, sortableJsOptions = {}, }) => {
45
+ const listRef = useRef(null);
46
+ const sortableInstance = useRef(null);
47
+ useEffect(() => {
48
+ if (listRef.current) {
49
+ sortableInstance.current = Sortable.create(listRef.current, {
50
+ handle: '.drag-handle',
51
+ animation: 150,
52
+ ghostClass: 'sortable-ghost',
53
+ chosenClass: 'sortable-chosen',
54
+ dragClass: 'sortable-drag',
55
+ filter: 'select, button, .toggle-button, .delete-button', // Prevent drag on controls
56
+ preventOnFilter: false,
57
+ ...sortableJsOptions,
58
+ onEnd: (event) => {
59
+ const { oldIndex, newIndex } = event;
60
+ if (oldIndex === undefined || newIndex === undefined || oldIndex === newIndex) {
61
+ return;
62
+ }
63
+ // Create a new array with the updated order and notify the parent
64
+ const newItems = Array.from(items);
65
+ const [movedItem] = newItems.splice(oldIndex, 1);
66
+ newItems.splice(newIndex, 0, movedItem);
67
+ onItemsChange(newItems);
68
+ },
69
+ });
70
+ }
71
+ return () => {
72
+ // Clean up the Sortable instance when the component unmounts
73
+ sortableInstance.current?.destroy();
74
+ sortableInstance.current = null;
75
+ };
76
+ }, [items, onItemsChange, sortableJsOptions]); // Re-create if options or callbacks change
77
+ const handleToggle = (id) => {
78
+ onItemsChange(items.map((item) => (item.id === id ? { ...item, enabled: !item.enabled } : item)));
79
+ };
80
+ const handleDelete = (id) => {
81
+ // Deletion logic (including confirmation) should be handled by the parent.
82
+ // Here we just notify the parent that a deletion was requested.
83
+ onItemsChange(items.filter((item) => item.id !== id));
84
+ };
85
+ const handleSelectChange = (id, newValue) => {
86
+ onItemsChange(items.map((item) => (item.id === id ? { ...item, selectValue: newValue } : item)));
87
+ };
88
+ return (_jsx("ul", { ref: listRef, className: "sortable-list", style: { listStyle: 'none', padding: 0, margin: 0 }, children: items.map((item) => (_jsx(STSortableListItem, { item: item, showToggleButton: showToggleButton, showDeleteButton: showDeleteButton, showSelectInput: showSelectInput, onToggle: handleToggle, onDelete: handleDelete, onSelectChange: handleSelectChange }, item.id))) }));
89
+ };
90
+ //# sourceMappingURL=STSortableList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STSortableList.js","sourceRoot":"","sources":["../../src/components/STSortableList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { FC, TextareaHTMLAttributes } from 'react';
2
+ export interface STTextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
3
+ /**
4
+ * Custom class name(s) to append or replace the default SillyTavern classes.
5
+ */
6
+ className?: string;
7
+ /**
8
+ * If set to true, the default 'text_pole textarea_compact' classes will not be applied.
9
+ * @default false
10
+ */
11
+ overrideDefaults?: boolean;
12
+ }
13
+ /**
14
+ * A common textarea component styled for SillyTavern.
15
+ * Applies 'text_pole textarea_compact' classes by default.
16
+ */
17
+ export declare const STTextarea: FC<STTextareaProps>;
18
+ //# sourceMappingURL=STTextarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STTextarea.d.ts","sourceRoot":"","sources":["../../src/components/STTextarea.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAW,MAAM,OAAO,CAAC;AAE5D,MAAM,WAAW,eAAgB,SAAQ,sBAAsB,CAAC,mBAAmB,CAAC;IAClF;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAkB1C,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ /**
4
+ * A common textarea component styled for SillyTavern.
5
+ * Applies 'text_pole textarea_compact' classes by default.
6
+ */
7
+ export const STTextarea = ({ children, className, overrideDefaults = false, ...props }) => {
8
+ const finalClassName = useMemo(() => {
9
+ const classes = [];
10
+ if (!overrideDefaults) {
11
+ classes.push('text_pole', 'textarea_compact');
12
+ }
13
+ classes.push(className);
14
+ return classes.filter(Boolean).join(' ');
15
+ }, [overrideDefaults, className]);
16
+ return (_jsx("textarea", { className: finalClassName, ...props, children: children }));
17
+ };
18
+ //# sourceMappingURL=STTextarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"STTextarea.js","sourceRoot":"","sources":["../../src/components/STTextarea.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA8B,OAAO,EAAE,MAAM,OAAO,CAAC;AAc5D;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IAC7G,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAExB,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC;IAElC,OAAO,CACL,mBAAU,SAAS,EAAE,cAAc,KAAM,KAAK,YAC3C,QAAQ,GACA,CACZ,CAAC;AACJ,CAAC,CAAC"}