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.
- package/dist/components/ConnectionProfileSelect.d.ts +43 -0
- package/dist/components/ConnectionProfileSelect.d.ts.map +1 -0
- package/dist/components/ConnectionProfileSelect.js +126 -0
- package/dist/components/ConnectionProfileSelect.js.map +1 -0
- package/dist/components/MyFancyButton.d.ts +6 -0
- package/dist/components/MyFancyButton.d.ts.map +1 -0
- package/dist/components/MyFancyButton.js +22 -0
- package/dist/components/MyFancyButton.js.map +1 -0
- package/dist/components/Popup.d.ts +12 -0
- package/dist/components/Popup.d.ts.map +1 -0
- package/dist/components/Popup.js +168 -0
- package/dist/components/Popup.js.map +1 -0
- package/dist/components/STButton.d.ts +23 -0
- package/dist/components/STButton.d.ts.map +1 -0
- package/dist/components/STButton.js +20 -0
- package/dist/components/STButton.js.map +1 -0
- package/dist/components/STFancyDropdown.d.ts +35 -0
- package/dist/components/STFancyDropdown.d.ts.map +1 -0
- package/dist/components/STFancyDropdown.js +135 -0
- package/dist/components/STFancyDropdown.js.map +1 -0
- package/dist/components/STInput.d.ts +25 -0
- package/dist/components/STInput.d.ts.map +1 -0
- package/dist/components/STInput.js +26 -0
- package/dist/components/STInput.js.map +1 -0
- package/dist/components/STPresetSelect.d.ts +59 -0
- package/dist/components/STPresetSelect.d.ts.map +1 -0
- package/dist/components/STPresetSelect.js +95 -0
- package/dist/components/STPresetSelect.js.map +1 -0
- package/dist/components/STSelect.d.ts +18 -0
- package/dist/components/STSelect.d.ts.map +1 -0
- package/dist/components/STSelect.js +18 -0
- package/dist/components/STSelect.js.map +1 -0
- package/dist/components/STSortableList.d.ts +44 -0
- package/dist/components/STSortableList.d.ts.map +1 -0
- package/dist/components/STSortableList.js +90 -0
- package/dist/components/STSortableList.js.map +1 -0
- package/dist/components/STTextarea.d.ts +18 -0
- package/dist/components/STTextarea.d.ts.map +1 -0
- package/dist/components/STTextarea.js +18 -0
- package/dist/components/STTextarea.js.map +1 -0
- package/dist/components/index.d.ts +12 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +11 -0
- package/dist/components/index.js.map +1 -0
- package/dist/config.d.ts +4 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -2
- package/dist/config.js.map +1 -1
- package/dist/generate.d.ts +2 -14
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +2 -2
- package/dist/generate.js.map +1 -1
- package/dist/types/index.d.ts +16 -8
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +16 -3
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { ConnectAPIMap } from '../types/index.js';
|
|
3
|
+
import { ConnectionProfile } from '../types/profiles.js';
|
|
4
|
+
export declare const isProfileSupported: (profile: ConnectionProfile | undefined, allowedTypes: Record<string, string>, connectApiMap: ConnectAPIMap) => boolean;
|
|
5
|
+
export interface STConnectionProfileSelectProps {
|
|
6
|
+
/**
|
|
7
|
+
* The initially selected profile ID. The component will manage its state internally afterwards.
|
|
8
|
+
*/
|
|
9
|
+
initialSelectedProfileId?: string;
|
|
10
|
+
/**
|
|
11
|
+
* The allowed API types to display in the dropdown, mapping the internal type to a display label.
|
|
12
|
+
* @default { openai: 'Chat Completion', textgenerationwebui: 'Text Completion' }
|
|
13
|
+
*/
|
|
14
|
+
allowedTypes?: Record<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Placeholder text for when no profile is selected.
|
|
17
|
+
* @default 'Select a Connection Profile'
|
|
18
|
+
*/
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Callback fired when the user selects a different profile from the dropdown.
|
|
22
|
+
* Also fires with `undefined` if the currently selected profile is deleted or becomes unsupported.
|
|
23
|
+
*/
|
|
24
|
+
onChange?: (profile?: ConnectionProfile) => void;
|
|
25
|
+
/**
|
|
26
|
+
* Callback fired when a new, supported profile is created in SillyTavern.
|
|
27
|
+
*/
|
|
28
|
+
onCreate?: (profile: ConnectionProfile) => void;
|
|
29
|
+
/**
|
|
30
|
+
* Callback fired when a profile is updated in SillyTavern.
|
|
31
|
+
*/
|
|
32
|
+
onUpdate?: (oldProfile: ConnectionProfile, newProfile: ConnectionProfile) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Callback fired when a supported profile is deleted in SillyTavern.
|
|
35
|
+
*/
|
|
36
|
+
onDelete?: (profile: ConnectionProfile) => void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A React component that renders a dropdown of supported SillyTavern connection profiles.
|
|
40
|
+
* It automatically updates when profiles are created, updated, or deleted.
|
|
41
|
+
*/
|
|
42
|
+
export declare const STConnectionProfileSelect: FC<STConnectionProfileSelectProps>;
|
|
43
|
+
//# sourceMappingURL=ConnectionProfileSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionProfileSelect.d.ts","sourceRoot":"","sources":["../../src/components/ConnectionProfileSelect.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAA6C,MAAM,OAAO,CAAC;AAE7E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,eAAO,MAAM,kBAAkB,GAC7B,SAAS,iBAAiB,GAAG,SAAS,EACtC,cAAc,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,eAAe,aAAa,KAC3B,OAmBF,CAAC;AAEF,MAAM,WAAW,8BAA8B;IAC7C;;OAEG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAEjD;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAEhD;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAElF;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACjD;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,8BAA8B,CA4IxE,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useMemo, useCallback } from 'react';
|
|
3
|
+
import { STSelect } from './STSelect.js';
|
|
4
|
+
const globalContext = SillyTavern.getContext();
|
|
5
|
+
// Helper function to replicate the filtering logic from the original source
|
|
6
|
+
export const isProfileSupported = (profile, allowedTypes, connectApiMap) => {
|
|
7
|
+
if (!profile || !profile.api) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
const apiMap = connectApiMap[profile.api];
|
|
11
|
+
if (!apiMap || !Object.hasOwn(allowedTypes, apiMap.selected)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
// The original logic checks for a valid source/type depending on the API
|
|
15
|
+
switch (apiMap.selected) {
|
|
16
|
+
case 'openai':
|
|
17
|
+
return !!apiMap.source;
|
|
18
|
+
case 'textgenerationwebui':
|
|
19
|
+
return !!apiMap.type;
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* A React component that renders a dropdown of supported SillyTavern connection profiles.
|
|
25
|
+
* It automatically updates when profiles are created, updated, or deleted.
|
|
26
|
+
*/
|
|
27
|
+
export const STConnectionProfileSelect = ({ initialSelectedProfileId, allowedTypes = { openai: 'Chat Completion', textgenerationwebui: 'Text Completion' }, placeholder = 'Select a Connection Profile', onChange, onCreate, onUpdate, onDelete, }) => {
|
|
28
|
+
const [selectedId, setSelectedId] = useState(initialSelectedProfileId ?? '');
|
|
29
|
+
const [lastUpdated, setLastUpdated] = useState(Date.now()); // State to force re-render on global changes
|
|
30
|
+
const { isEnabled, profiles, connectApiMap } = useMemo(() => {
|
|
31
|
+
const isConnectionManagerDisabled = globalContext.extensionSettings.disabledExtensions?.includes('connection-manager');
|
|
32
|
+
if (isConnectionManagerDisabled) {
|
|
33
|
+
console.error('Connection Manager extension is disabled.');
|
|
34
|
+
return { isEnabled: false, profiles: [], connectApiMap: {} };
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
isEnabled: true,
|
|
38
|
+
profiles: globalContext.extensionSettings.connectionManager?.profiles ?? [],
|
|
39
|
+
connectApiMap: globalContext.CONNECT_API_MAP,
|
|
40
|
+
};
|
|
41
|
+
}, [lastUpdated]); // Reruns when we detect a change from events
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (!isEnabled)
|
|
44
|
+
return;
|
|
45
|
+
// Handler for creation
|
|
46
|
+
const handleCreate = (profile) => {
|
|
47
|
+
if (isProfileSupported(profile, allowedTypes, connectApiMap)) {
|
|
48
|
+
setLastUpdated(Date.now());
|
|
49
|
+
onCreate?.(profile);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
// Handler for updates
|
|
53
|
+
const handleUpdate = (oldProfile, newProfile) => {
|
|
54
|
+
const wasSupported = isProfileSupported(oldProfile, allowedTypes, connectApiMap);
|
|
55
|
+
const isNowSupported = isProfileSupported(newProfile, allowedTypes, connectApiMap);
|
|
56
|
+
// If the profile was or is now supported, we need to update the list
|
|
57
|
+
if (wasSupported || isNowSupported) {
|
|
58
|
+
setLastUpdated(Date.now());
|
|
59
|
+
}
|
|
60
|
+
onUpdate?.(oldProfile, newProfile);
|
|
61
|
+
// If the currently selected profile is the one being updated and it's no longer supported, deselect it.
|
|
62
|
+
if (selectedId === oldProfile.id && !isNowSupported) {
|
|
63
|
+
setSelectedId('');
|
|
64
|
+
onChange?.(undefined);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
// Handler for deletions
|
|
68
|
+
const handleDelete = (profile) => {
|
|
69
|
+
if (isProfileSupported(profile, allowedTypes, connectApiMap)) {
|
|
70
|
+
setLastUpdated(Date.now());
|
|
71
|
+
onDelete?.(profile);
|
|
72
|
+
// If the deleted profile was the one selected, deselect it.
|
|
73
|
+
if (selectedId === profile.id) {
|
|
74
|
+
setSelectedId('');
|
|
75
|
+
onChange?.(undefined);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
// @ts-ignore - ST event types are not formally defined
|
|
80
|
+
globalContext.eventSource.on('CONNECTION_PROFILE_CREATED', handleCreate);
|
|
81
|
+
// @ts-ignore
|
|
82
|
+
globalContext.eventSource.on('CONNECTION_PROFILE_UPDATED', handleUpdate);
|
|
83
|
+
// @ts-ignore
|
|
84
|
+
globalContext.eventSource.on('CONNECTION_PROFILE_DELETED', handleDelete);
|
|
85
|
+
return () => {
|
|
86
|
+
// @ts-ignore
|
|
87
|
+
globalContext.eventSource.removeListener('CONNECTION_PROFILE_CREATED', handleCreate);
|
|
88
|
+
// @ts-ignore
|
|
89
|
+
globalContext.eventSource.removeListener('CONNECTION_PROFILE_UPDATED', handleUpdate);
|
|
90
|
+
// @ts-ignore
|
|
91
|
+
globalContext.eventSource.removeListener('CONNECTION_PROFILE_DELETED', handleDelete);
|
|
92
|
+
};
|
|
93
|
+
}, [isEnabled, selectedId, allowedTypes, connectApiMap, onChange, onCreate, onUpdate, onDelete]);
|
|
94
|
+
// Memoize the expensive filtering and sorting logic
|
|
95
|
+
const groupedAndSortedProfiles = useMemo(() => {
|
|
96
|
+
if (!isEnabled)
|
|
97
|
+
return [];
|
|
98
|
+
const supported = profiles.filter((p) => isProfileSupported(p, allowedTypes, connectApiMap));
|
|
99
|
+
const groups = {};
|
|
100
|
+
for (const [apiType, groupLabel] of Object.entries(allowedTypes)) {
|
|
101
|
+
groups[apiType] = { label: groupLabel, profiles: [] };
|
|
102
|
+
}
|
|
103
|
+
for (const profile of supported) {
|
|
104
|
+
const apiMap = connectApiMap[profile.api];
|
|
105
|
+
if (groups[apiMap.selected]) {
|
|
106
|
+
groups[apiMap.selected].profiles.push(profile);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Sort profiles within each group alphabetically by name
|
|
110
|
+
for (const group of Object.values(groups)) {
|
|
111
|
+
group.profiles.sort((a, b) => (a.name ?? '').localeCompare(b.name ?? ''));
|
|
112
|
+
}
|
|
113
|
+
return Object.values(groups).filter((g) => g.profiles.length > 0);
|
|
114
|
+
}, [isEnabled, profiles, allowedTypes, connectApiMap]);
|
|
115
|
+
const handleSelectChange = useCallback((event) => {
|
|
116
|
+
const newId = event.target.value;
|
|
117
|
+
setSelectedId(newId);
|
|
118
|
+
const profile = profiles.find((p) => p.id === newId);
|
|
119
|
+
onChange?.(profile);
|
|
120
|
+
}, [profiles, onChange]);
|
|
121
|
+
if (!isEnabled) {
|
|
122
|
+
return _jsx(STSelect, { disabled: true, value: "", children: _jsx("option", { children: "Connection Manager disabled" }) });
|
|
123
|
+
}
|
|
124
|
+
return (_jsxs(STSelect, { value: selectedId, onChange: handleSelectChange, children: [_jsx("option", { value: "", children: placeholder }), groupedAndSortedProfiles.map((group) => (_jsx("optgroup", { label: group.label, children: group.profiles.map((profile) => (_jsx("option", { value: profile.id, children: profile.name }, profile.id))) }, group.label)))] }));
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=ConnectionProfileSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionProfileSelect.js","sourceRoot":"","sources":["../../src/components/ConnectionProfileSelect.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FC, ButtonHTMLAttributes } from 'react';
|
|
2
|
+
export interface MyFancyButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
3
|
+
variant?: 'primary' | 'secondary';
|
|
4
|
+
}
|
|
5
|
+
export declare const MyFancyButton: FC<MyFancyButtonProps>;
|
|
6
|
+
//# sourceMappingURL=MyFancyButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MyFancyButton.d.ts","sourceRoot":"","sources":["../../src/components/MyFancyButton.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IACjF,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;CACnC;AAED,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAyBhD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export const MyFancyButton = ({ children, variant = 'primary', ...props }) => {
|
|
3
|
+
const baseStyle = {
|
|
4
|
+
padding: '10px 15px',
|
|
5
|
+
border: 'none',
|
|
6
|
+
borderRadius: '5px',
|
|
7
|
+
cursor: 'pointer',
|
|
8
|
+
fontWeight: 'bold',
|
|
9
|
+
};
|
|
10
|
+
const variantStyle = {
|
|
11
|
+
primary: {
|
|
12
|
+
backgroundColor: '#007bff',
|
|
13
|
+
color: 'white',
|
|
14
|
+
},
|
|
15
|
+
secondary: {
|
|
16
|
+
backgroundColor: '#6c757d',
|
|
17
|
+
color: 'white',
|
|
18
|
+
},
|
|
19
|
+
}[variant];
|
|
20
|
+
return (_jsx("button", { style: { ...baseStyle, ...variantStyle }, ...props, children: children }));
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=MyFancyButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MyFancyButton.js","sourceRoot":"","sources":["../../src/components/MyFancyButton.tsx"],"names":[],"mappings":";AAMA,MAAM,CAAC,MAAM,aAAa,GAA2B,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IACnG,MAAM,SAAS,GAAwB;QACrC,OAAO,EAAE,WAAW;QACpB,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,MAAM;KACnB,CAAC;IAEF,MAAM,YAAY,GAAwB;QACxC,OAAO,EAAE;YACP,eAAe,EAAE,SAAS;YAC1B,KAAK,EAAE,OAAO;SACf;QACD,SAAS,EAAE;YACT,eAAe,EAAE,SAAS;YAC1B,KAAK,EAAE,OAAO;SACf;KACF,CAAC,OAAO,CAAC,CAAC;IAEX,OAAO,CACL,iBAAQ,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,YAAY,EAAE,KAAM,KAAK,YACxD,QAAQ,GACF,CACV,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { POPUP_TYPE, PopupOptions } from '../types/popup.js';
|
|
3
|
+
interface PopupProps {
|
|
4
|
+
content: React.ReactNode;
|
|
5
|
+
type: POPUP_TYPE;
|
|
6
|
+
inputValue?: string;
|
|
7
|
+
options?: PopupOptions;
|
|
8
|
+
onComplete: (value: any) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare const Popup: React.FC<PopupProps>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=Popup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popup.d.ts","sourceRoot":"","sources":["../../src/components/Popup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAgB,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG3E,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CAClC;AAID,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CA0QtC,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
import { POPUP_RESULT, POPUP_TYPE } from '../types/popup.js';
|
|
5
|
+
import { dialogPolyfill, fixToastrForDialogs, removeFromArray, runAfterAnimation, STPopup } from '../config.js';
|
|
6
|
+
const globalContext = SillyTavern.getContext();
|
|
7
|
+
export const Popup = ({ content, type, inputValue = '', options = {}, onComplete }) => {
|
|
8
|
+
const dialogRef = useRef(null);
|
|
9
|
+
const mainInputRef = useRef(null);
|
|
10
|
+
const [isClosingPrevented, setIsClosingPrevented] = useState(false);
|
|
11
|
+
const [lastFocus, setLastFocus] = useState(null);
|
|
12
|
+
const id = useRef(globalContext.uuidv4());
|
|
13
|
+
// Create a reference object that mimics the original Popup instance
|
|
14
|
+
const popupRef = useRef({
|
|
15
|
+
id: id.current,
|
|
16
|
+
type,
|
|
17
|
+
dlg: null,
|
|
18
|
+
mainInput: null,
|
|
19
|
+
lastFocus: null,
|
|
20
|
+
value: undefined,
|
|
21
|
+
result: undefined,
|
|
22
|
+
inputResults: undefined,
|
|
23
|
+
});
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const dialog = dialogRef.current;
|
|
26
|
+
if (!dialog)
|
|
27
|
+
return;
|
|
28
|
+
// Update the popup reference
|
|
29
|
+
popupRef.current.dlg = dialog;
|
|
30
|
+
popupRef.current.mainInput = mainInputRef.current;
|
|
31
|
+
// Add to STPopup utility's popup array
|
|
32
|
+
STPopup.util.popups.push(popupRef.current);
|
|
33
|
+
if (!dialog.showModal) {
|
|
34
|
+
dialog.classList.add('poly_dialog');
|
|
35
|
+
dialogPolyfill.registerDialog(dialog);
|
|
36
|
+
const resizeObserver = new ResizeObserver((entries) => {
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
dialogPolyfill.reposition(entry.target);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
resizeObserver.observe(dialog);
|
|
42
|
+
}
|
|
43
|
+
dialog.showModal();
|
|
44
|
+
fixToastrForDialogs();
|
|
45
|
+
return () => {
|
|
46
|
+
// Remove from STPopup utility's popup array
|
|
47
|
+
removeFromArray(STPopup.util.popups, popupRef.current);
|
|
48
|
+
// Don't call dialog.close() here since it's handled in handleComplete
|
|
49
|
+
fixToastrForDialogs();
|
|
50
|
+
};
|
|
51
|
+
}, []);
|
|
52
|
+
const handleComplete = async (result) => {
|
|
53
|
+
let value = result;
|
|
54
|
+
if (type === POPUP_TYPE.INPUT) {
|
|
55
|
+
if (result >= POPUP_RESULT.AFFIRMATIVE)
|
|
56
|
+
value = mainInputRef.current?.value;
|
|
57
|
+
else if (result === POPUP_RESULT.NEGATIVE)
|
|
58
|
+
value = false;
|
|
59
|
+
else if (result === POPUP_RESULT.CANCELLED)
|
|
60
|
+
value = null;
|
|
61
|
+
else
|
|
62
|
+
value = false;
|
|
63
|
+
}
|
|
64
|
+
if (options.customInputs?.length) {
|
|
65
|
+
const inputResults = new Map(options.customInputs.map((input) => {
|
|
66
|
+
const inputControl = dialogRef.current?.querySelector(`#${input.id}`);
|
|
67
|
+
return [inputControl.id, inputControl.checked];
|
|
68
|
+
}));
|
|
69
|
+
popupRef.current.inputResults = inputResults;
|
|
70
|
+
}
|
|
71
|
+
// Update the popup reference with result and value
|
|
72
|
+
popupRef.current.result = result;
|
|
73
|
+
popupRef.current.value = value;
|
|
74
|
+
if (options.onClosing) {
|
|
75
|
+
const shouldClose = await options.onClosing(popupRef.current);
|
|
76
|
+
if (!shouldClose) {
|
|
77
|
+
setIsClosingPrevented(true);
|
|
78
|
+
// Set values back if we cancel out of closing the popup
|
|
79
|
+
popupRef.current.value = undefined;
|
|
80
|
+
popupRef.current.result = undefined;
|
|
81
|
+
popupRef.current.inputResults = undefined;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
setIsClosingPrevented(false);
|
|
86
|
+
// Update STPopup's lastResult
|
|
87
|
+
STPopup.util.lastResult = {
|
|
88
|
+
value,
|
|
89
|
+
result,
|
|
90
|
+
inputResults: popupRef.current.inputResults,
|
|
91
|
+
};
|
|
92
|
+
// Start hiding process
|
|
93
|
+
const dialog = dialogRef.current;
|
|
94
|
+
if (!dialog)
|
|
95
|
+
return;
|
|
96
|
+
// We close the dialog, first running the animation
|
|
97
|
+
dialog.setAttribute('closing', '');
|
|
98
|
+
// Once the hiding starts, we need to fix the toastr to the layer below
|
|
99
|
+
fixToastrForDialogs();
|
|
100
|
+
// After the dialog is actually completely closed, remove it from the DOM
|
|
101
|
+
runAfterAnimation(dialog, async () => {
|
|
102
|
+
// Call the close on the dialog
|
|
103
|
+
dialog.close();
|
|
104
|
+
// Run a possible custom handler right before DOM removal
|
|
105
|
+
if (options.onClose) {
|
|
106
|
+
await options.onClose(popupRef.current);
|
|
107
|
+
}
|
|
108
|
+
// Remove it from the popup references
|
|
109
|
+
removeFromArray(STPopup.util.popups, popupRef.current);
|
|
110
|
+
// If there is any popup below this one, see if we can set the focus
|
|
111
|
+
if (STPopup.util.popups.length > 0) {
|
|
112
|
+
const activeDialog = document.activeElement?.closest('.popup');
|
|
113
|
+
const id = activeDialog?.getAttribute('data-id');
|
|
114
|
+
// @ts-ignore
|
|
115
|
+
const popup = STPopup.util.popups.find((x) => x.id === id);
|
|
116
|
+
if (popup) {
|
|
117
|
+
if (popup.lastFocus)
|
|
118
|
+
popup.lastFocus.focus();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Don't manually remove the dialog - let React handle it
|
|
122
|
+
onComplete(value);
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
const handleFocusIn = (evt) => {
|
|
126
|
+
if (evt.target instanceof HTMLElement && evt.target !== dialogRef.current) {
|
|
127
|
+
setLastFocus(evt.target);
|
|
128
|
+
popupRef.current.lastFocus = evt.target;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const handleKeyDown = async (evt) => {
|
|
132
|
+
// if (evt.key === 'Enter' && !evt.altKey && !evt.shiftKey) {
|
|
133
|
+
// const textarea = evt.target as HTMLTextAreaElement;
|
|
134
|
+
// if (textarea.tagName === 'TEXTAREA' && !shouldSendOnEnter()) return;
|
|
135
|
+
// const input = evt.target as HTMLInputElement;
|
|
136
|
+
// if (input.tagName === 'INPUT' && input.type === 'text' && !shouldSendOnEnter()) return;
|
|
137
|
+
// evt.preventDefault();
|
|
138
|
+
// evt.stopPropagation();
|
|
139
|
+
// await handleComplete(options.defaultResult ?? POPUP_RESULT.AFFIRMATIVE);
|
|
140
|
+
// }
|
|
141
|
+
};
|
|
142
|
+
const getClassNames = () => {
|
|
143
|
+
const classes = ['popup'];
|
|
144
|
+
if (options.wide)
|
|
145
|
+
classes.push('wide_dialogue_popup');
|
|
146
|
+
if (options.wider)
|
|
147
|
+
classes.push('wider_dialogue_popup');
|
|
148
|
+
if (options.large)
|
|
149
|
+
classes.push('large_dialogue_popup');
|
|
150
|
+
if (options.transparent)
|
|
151
|
+
classes.push('transparent_dialogue_popup');
|
|
152
|
+
if (options.allowHorizontalScrolling)
|
|
153
|
+
classes.push('horizontal_scrolling_dialogue_popup');
|
|
154
|
+
if (options.allowVerticalScrolling)
|
|
155
|
+
classes.push('vertical_scrolling_dialogue_popup');
|
|
156
|
+
if (options.animation)
|
|
157
|
+
classes.push(`popup--animation-${options.animation}`);
|
|
158
|
+
return classes.join(' ');
|
|
159
|
+
};
|
|
160
|
+
return createPortal(_jsx("dialog", { ref: dialogRef, className: getClassNames(), "data-id": id.current, onKeyDown: handleKeyDown, onFocus: handleFocusIn, children: _jsxs("div", { className: "popup-body", children: [_jsx("div", { className: "popup-content", children: content }), type === POPUP_TYPE.INPUT && (_jsx("textarea", { ref: mainInputRef, className: "popup-input text_pole result-control auto-select", rows: options.rows ?? 1, defaultValue: inputValue, "data-result": "1", "data-result-event": "submit" })), options.customInputs && (_jsx("div", { className: "popup-inputs", children: options.customInputs.map((input) => (_jsxs("label", { className: "checkbox_label justifyCenter", htmlFor: input.id, children: [_jsx("input", { type: "checkbox", id: input.id, defaultChecked: input.defaultState }), _jsx("span", { "data-i18n": input.label, children: input.label }), input.tooltip && (_jsx("div", { className: "fa-solid fa-circle-info opacity50p", title: input.tooltip, "data-i18n": `[title]${input.tooltip}` }))] }, input.id))) })), type !== POPUP_TYPE.DISPLAY && (_jsxs("div", { className: "popup-controls", children: [options.customButtons?.map((button, index) => {
|
|
161
|
+
const buttonConfig = typeof button === 'string' ? { text: button, result: index + 2 } : button;
|
|
162
|
+
return (_jsx("div", { className: `menu_button popup-button-custom result-control ${buttonConfig.classes ?? ''}`, "data-result": buttonConfig.result, onClick: () => {
|
|
163
|
+
buttonConfig.action?.();
|
|
164
|
+
handleComplete(buttonConfig.result ?? index + 2);
|
|
165
|
+
}, "data-i18n": buttonConfig.text, children: buttonConfig.text }, index));
|
|
166
|
+
}), type !== POPUP_TYPE.DISPLAY && options.okButton !== false && (_jsx("div", { className: "popup-button-ok menu_button result-control", onClick: () => handleComplete(POPUP_RESULT.AFFIRMATIVE), "data-result": "1", children: typeof options.okButton === 'string' ? options.okButton : 'OK' })), type !== POPUP_TYPE.DISPLAY && options.cancelButton !== false && (_jsx("div", { className: "popup-button-cancel menu_button result-control", onClick: () => handleComplete(POPUP_RESULT.NEGATIVE), "data-result": "0", children: typeof options.cancelButton === 'string' ? options.cancelButton : 'Cancel' }))] })), type === POPUP_TYPE.DISPLAY && (_jsx("div", { className: "popup-button-close right_menu_button fa-solid fa-circle-xmark", onClick: () => handleComplete(POPUP_RESULT.CANCELLED), "data-result": "0", title: "Close popup", "data-i18n": "[title]Close popup" }))] }) }), document.body);
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=Popup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popup.js","sourceRoot":"","sources":["../../src/components/Popup.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { FC, ButtonHTMLAttributes } from 'react';
|
|
2
|
+
export interface STButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
3
|
+
/**
|
|
4
|
+
* Custom class name(s) to append to the default SillyTavern classes.
|
|
5
|
+
* This can include utility classes or icon classes (e.g., 'fa-solid fa-plus').
|
|
6
|
+
* If `overrideDefaults` is true, this class name will replace the default classes.
|
|
7
|
+
*/
|
|
8
|
+
className?: string;
|
|
9
|
+
/**
|
|
10
|
+
* If set to true, the default SillyTavern classes ('menu_button', 'interactable') will NOT be applied.
|
|
11
|
+
* This allows for complete control over the button's classes via the `className` prop.
|
|
12
|
+
* @default false
|
|
13
|
+
*/
|
|
14
|
+
overrideDefaults?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A common button component styled for SillyTavern.
|
|
18
|
+
* It applies 'menu_button interactable' classes by default.
|
|
19
|
+
* The original MyFancyButton component has been replaced with this.
|
|
20
|
+
* For clarity, you may want to rename the file from `MyFancyButton.tsx` to `STButton.tsx`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const STButton: FC<STButtonProps>;
|
|
23
|
+
//# sourceMappingURL=STButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"STButton.d.ts","sourceRoot":"","sources":["../../src/components/STButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAW,MAAM,OAAO,CAAC;AAE1D,MAAM,WAAW,aAAc,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IAC5E;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CAkBtC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* A common button component styled for SillyTavern.
|
|
5
|
+
* It applies 'menu_button interactable' classes by default.
|
|
6
|
+
* The original MyFancyButton component has been replaced with this.
|
|
7
|
+
* For clarity, you may want to rename the file from `MyFancyButton.tsx` to `STButton.tsx`.
|
|
8
|
+
*/
|
|
9
|
+
export const STButton = ({ children, className, overrideDefaults = false, ...props }) => {
|
|
10
|
+
const finalClassName = useMemo(() => {
|
|
11
|
+
const classes = [];
|
|
12
|
+
if (!overrideDefaults) {
|
|
13
|
+
classes.push('menu_button', 'interactable');
|
|
14
|
+
}
|
|
15
|
+
classes.push(className);
|
|
16
|
+
return classes.filter(Boolean).join(' ');
|
|
17
|
+
}, [overrideDefaults, className]);
|
|
18
|
+
return (_jsx("button", { className: finalClassName, ...props, children: children }));
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=STButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"STButton.js","sourceRoot":"","sources":["../../src/components/STButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA4B,OAAO,EAAE,MAAM,OAAO,CAAC;AAkB1D;;;;;GAKG;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,aAAa,EAAE,cAAc,CAAC,CAAC;QAC9C,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,35 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { IFuseOptions } from 'fuse.js';
|
|
3
|
+
export interface DropdownItem {
|
|
4
|
+
value: string;
|
|
5
|
+
label: string;
|
|
6
|
+
}
|
|
7
|
+
export interface STFancyDropdownProps {
|
|
8
|
+
/** The list of available items for the dropdown. */
|
|
9
|
+
items: DropdownItem[];
|
|
10
|
+
/** The currently selected value or values. */
|
|
11
|
+
value: string[];
|
|
12
|
+
/** Callback fired when the selection changes. */
|
|
13
|
+
onChange: (newValues: string[]) => void;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
closeOnSelect?: boolean;
|
|
16
|
+
multiple?: boolean;
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
/** Optional callback to control selection changes. Return false to prevent selection. */
|
|
19
|
+
onBeforeSelection?: (currentValues: string[], proposedValues: string[]) => Promise<boolean> | boolean;
|
|
20
|
+
enableSearch?: boolean;
|
|
21
|
+
searchPlaceholder?: string;
|
|
22
|
+
searchNoResultsText?: string;
|
|
23
|
+
searchFuseOptions?: IFuseOptions<DropdownItem>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A controlled component that provides a multi-select dropdown with fuzzy search capabilities.
|
|
27
|
+
* This is the React version of the original `buildFancyDropdown` utility.
|
|
28
|
+
*/
|
|
29
|
+
export declare const STFancyDropdown: FC<STFancyDropdownProps>;
|
|
30
|
+
export declare const FancyDropdownItem: FC<{
|
|
31
|
+
item: DropdownItem;
|
|
32
|
+
isSelected: boolean;
|
|
33
|
+
onClick: (value: string) => void;
|
|
34
|
+
}>;
|
|
35
|
+
//# sourceMappingURL=STFancyDropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"STFancyDropdown.d.ts","sourceRoot":"","sources":["../../src/components/STFancyDropdown.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAwC,MAAM,OAAO,CAAC;AACxE,OAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG7C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iDAAiD;IACjD,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAExC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAGtG,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;CAChD;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAyLpD,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,CAyB5G,CAAC"}
|