@admin-layout/tailwind-ui 12.2.4-alpha.58 → 12.2.4-alpha.59
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/lib/components/AIToolbar/hooks/useActiveCharacter.d.ts +2 -2
- package/lib/components/AIToolbar/hooks/useActiveCharacter.d.ts.map +1 -1
- package/lib/components/AIToolbar/hooks/useActiveCharacter.js +93 -64
- package/lib/components/AIToolbar/hooks/useActiveCharacter.js.map +1 -1
- package/lib/hooks/activeCharacterPreference.d.ts +24 -0
- package/lib/hooks/activeCharacterPreference.d.ts.map +1 -0
- package/lib/hooks/activeCharacterPreference.js +64 -0
- package/lib/hooks/activeCharacterPreference.js.map +1 -0
- package/lib/hooks/index.d.ts +1 -0
- package/lib/hooks/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/package.json +2 -2
|
@@ -21,8 +21,8 @@ export interface CharacterPicker {
|
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Return the active character (name + avatar) or null when none is installed
|
|
24
|
-
* / we're not running under Tauri. Selection
|
|
25
|
-
*
|
|
24
|
+
* / we're not running under Tauri. Selection follows `pickActiveMerged` (file_name
|
|
25
|
+
* pref, then name pref) and stays in sync with `useCharacterPicker` / desktop settings.
|
|
26
26
|
*/
|
|
27
27
|
export declare function useActiveCharacter(): ActiveCharacter | null;
|
|
28
28
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useActiveCharacter.d.ts","sourceRoot":"","sources":["../../../../src/components/AIToolbar/hooks/useActiveCharacter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useActiveCharacter.d.ts","sourceRoot":"","sources":["../../../../src/components/AIToolbar/hooks/useActiveCharacter.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,eAAe;IAC5B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC5B,sDAAsD;IACtD,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,gFAAgF;IAChF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iFAAiF;IACjF,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC5C;AAmMD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,GAAG,IAAI,CAkC3D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAiEpD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import*as React from'react';import {clearCharacterSpriteCache}from'./useCharacterSprite.js';// Active-character lookup for the AIToolbar.
|
|
1
|
+
import*as React from'react';import {ACTIVE_CHARACTER_CHANGE_EVENT,readPreferredActiveCharacterFileName,setPreferredActiveCharacterFileName,ACTIVE_CHARACTER_FILE_NAME_STORAGE_KEY}from'../../../hooks/activeCharacterPreference.js';import {clearCharacterSpriteCache}from'./useCharacterSprite.js';// Active-character lookup for the AIToolbar.
|
|
2
2
|
//
|
|
3
3
|
// Surfaces the currently-selected character (name + avatar data URL) so the
|
|
4
4
|
// completion popover and message history can show "Seraphina" with her avatar
|
|
@@ -12,11 +12,17 @@ import*as React from'react';import {clearCharacterSpriteCache}from'./useCharacte
|
|
|
12
12
|
// - Tauri with an extension but no avatar: returns name-only (avatarSrc = null).
|
|
13
13
|
//
|
|
14
14
|
// Re-fetches on the `yantra:character-refresh` Tauri event + the
|
|
15
|
-
// `yantra:extensions-changed` window event (marketplace install/uninstall)
|
|
15
|
+
// `yantra:extensions-changed` window event (marketplace install/uninstall), and
|
|
16
|
+
// re-resolves when either persisted preference changes:
|
|
17
|
+
// - `yantra:active-character-name` (name-based — CharacterPicker / toolbar), and/or
|
|
18
|
+
// - `yantra:active-character:file-name` + `yantra:active-character-change` (file_name
|
|
19
|
+
// + cross-webview emit — desktop settings / `activeCharacterPreference.ts`).
|
|
16
20
|
//
|
|
17
|
-
// When multiple characters are installed,
|
|
18
|
-
//
|
|
19
|
-
//
|
|
21
|
+
// When multiple characters are installed, resolution order is: **file_name**
|
|
22
|
+
// preference first (so the dashboard bar and main app stay aligned), then
|
|
23
|
+
// **name** preference (`yantra:active-character-name`), then `character_list[0]`.
|
|
24
|
+
// Use `useCharacterPicker` to enumerate and switch by name (it also syncs
|
|
25
|
+
// the file_name preference + Tauri fan-out).
|
|
20
26
|
// constants
|
|
21
27
|
const CHARACTER_REFRESH_EVENT = 'yantra:character-refresh';
|
|
22
28
|
/**
|
|
@@ -91,65 +97,111 @@ async function fetchAvatarSrc(fileName) {
|
|
|
91
97
|
if (!dto || !dto.base64 || dto.base64.length <= 100) return null;
|
|
92
98
|
return `data:${dto.mime_type || 'image/png'};base64,${dto.base64}`;
|
|
93
99
|
}
|
|
94
|
-
|
|
100
|
+
/**
|
|
101
|
+
* Choose the active row: **file_name** preference (desktop settings / cross-webview),
|
|
102
|
+
* else **name** preference (toolbar picker), else first in list.
|
|
103
|
+
*/
|
|
104
|
+
function pickActiveMerged(list) {
|
|
95
105
|
if (list.length === 0) return null;
|
|
106
|
+
const filePref = readPreferredActiveCharacterFileName();
|
|
107
|
+
if (filePref) {
|
|
108
|
+
const byFile = list.find(c => c.file_name === filePref);
|
|
109
|
+
if (byFile) return byFile;
|
|
110
|
+
}
|
|
111
|
+
const desiredName = readStoredActiveName();
|
|
96
112
|
if (desiredName) {
|
|
97
|
-
const
|
|
98
|
-
if (
|
|
113
|
+
const byName = list.find(c => c.name === desiredName);
|
|
114
|
+
if (byName) return byName;
|
|
99
115
|
}
|
|
100
116
|
return list[0];
|
|
101
117
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
*/
|
|
108
|
-
function useActiveCharacter() {
|
|
109
|
-
const [list, setList] = React.useState([]);
|
|
110
|
-
const [activeName, setActiveName] = React.useState(() => readStoredActiveName());
|
|
111
|
-
const [avatarSrc, setAvatarSrc] = React.useState(null);
|
|
112
|
-
const reload = React.useCallback(async () => {
|
|
113
|
-
const next = await safeInvoke('character_list', {
|
|
114
|
-
shallow: false
|
|
115
|
-
});
|
|
116
|
-
setList(next ?? []);
|
|
118
|
+
/** Subscribe to both preference schemes + cross-webview Tauri event; bump resets derived selection. */
|
|
119
|
+
function usePreferenceSyncBump() {
|
|
120
|
+
const [bump, setBump] = React.useState(0);
|
|
121
|
+
const bumpFn = React.useCallback(() => {
|
|
122
|
+
setBump(n => n + 1);
|
|
117
123
|
}, []);
|
|
124
|
+
return [bump, bumpFn];
|
|
125
|
+
}
|
|
126
|
+
function useCharacterPreferenceListeners(reload, bump) {
|
|
118
127
|
React.useEffect(() => {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
React.useEffect(() => {
|
|
122
|
-
let unlisten = null;
|
|
128
|
+
let unlistenChar = null;
|
|
129
|
+
let unlistenFilePref = null;
|
|
123
130
|
let cancelled = false;
|
|
124
131
|
safeListen(CHARACTER_REFRESH_EVENT, () => {
|
|
125
|
-
// Sprites may have changed on disk (new install / uninstall); drop
|
|
126
|
-
// cached data URLs so the next render re-fetches.
|
|
127
132
|
clearCharacterSpriteCache();
|
|
128
133
|
void reload();
|
|
134
|
+
bump();
|
|
129
135
|
}).then(fn => {
|
|
130
|
-
if (cancelled) fn();else
|
|
136
|
+
if (cancelled) fn();else unlistenChar = fn;
|
|
137
|
+
});
|
|
138
|
+
safeListen(ACTIVE_CHARACTER_CHANGE_EVENT, () => {
|
|
139
|
+
clearCharacterSpriteCache();
|
|
140
|
+
bump();
|
|
141
|
+
}).then(fn => {
|
|
142
|
+
if (cancelled) fn();else unlistenFilePref = fn;
|
|
131
143
|
});
|
|
132
144
|
function onExtensionsChanged(e) {
|
|
133
145
|
if (!isCharacterRelevant(e)) return;
|
|
146
|
+
clearCharacterSpriteCache();
|
|
134
147
|
void reload();
|
|
148
|
+
bump();
|
|
135
149
|
}
|
|
136
150
|
function onActiveChanged() {
|
|
137
|
-
|
|
151
|
+
clearCharacterSpriteCache();
|
|
152
|
+
bump();
|
|
153
|
+
}
|
|
154
|
+
function onFilePrefLocal(e) {
|
|
155
|
+
clearCharacterSpriteCache();
|
|
156
|
+
bump();
|
|
157
|
+
}
|
|
158
|
+
function onStorageKey(ev) {
|
|
159
|
+
if (ev.key !== ACTIVE_CHARACTER_STORAGE_KEY && ev.key !== ACTIVE_CHARACTER_FILE_NAME_STORAGE_KEY && ev.key != null) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
clearCharacterSpriteCache();
|
|
163
|
+
bump();
|
|
138
164
|
}
|
|
139
165
|
if (typeof window !== 'undefined') {
|
|
140
166
|
window.addEventListener(EXTENSIONS_CHANGED_EVENT, onExtensionsChanged);
|
|
141
167
|
window.addEventListener(ACTIVE_CHARACTER_CHANGED_EVENT, onActiveChanged);
|
|
168
|
+
window.addEventListener(ACTIVE_CHARACTER_CHANGE_EVENT, onFilePrefLocal);
|
|
169
|
+
window.addEventListener('storage', onStorageKey);
|
|
142
170
|
}
|
|
143
171
|
return () => {
|
|
144
172
|
cancelled = true;
|
|
145
|
-
if (
|
|
173
|
+
if (unlistenChar) unlistenChar();
|
|
174
|
+
if (unlistenFilePref) unlistenFilePref();
|
|
146
175
|
if (typeof window !== 'undefined') {
|
|
147
176
|
window.removeEventListener(EXTENSIONS_CHANGED_EVENT, onExtensionsChanged);
|
|
148
177
|
window.removeEventListener(ACTIVE_CHARACTER_CHANGED_EVENT, onActiveChanged);
|
|
178
|
+
window.removeEventListener(ACTIVE_CHARACTER_CHANGE_EVENT, onFilePrefLocal);
|
|
179
|
+
window.removeEventListener('storage', onStorageKey);
|
|
149
180
|
}
|
|
150
181
|
};
|
|
182
|
+
}, [reload, bump]);
|
|
183
|
+
}
|
|
184
|
+
// main API
|
|
185
|
+
/**
|
|
186
|
+
* Return the active character (name + avatar) or null when none is installed
|
|
187
|
+
* / we're not running under Tauri. Selection follows `pickActiveMerged` (file_name
|
|
188
|
+
* pref, then name pref) and stays in sync with `useCharacterPicker` / desktop settings.
|
|
189
|
+
*/
|
|
190
|
+
function useActiveCharacter() {
|
|
191
|
+
const [list, setList] = React.useState([]);
|
|
192
|
+
const [avatarSrc, setAvatarSrc] = React.useState(null);
|
|
193
|
+
const [bump, bumpFn] = usePreferenceSyncBump();
|
|
194
|
+
const reload = React.useCallback(async () => {
|
|
195
|
+
const next = await safeInvoke('character_list', {
|
|
196
|
+
shallow: false
|
|
197
|
+
});
|
|
198
|
+
setList(next ?? []);
|
|
199
|
+
}, []);
|
|
200
|
+
React.useEffect(() => {
|
|
201
|
+
void reload();
|
|
151
202
|
}, [reload]);
|
|
152
|
-
|
|
203
|
+
useCharacterPreferenceListeners(reload, bumpFn);
|
|
204
|
+
const active = React.useMemo(() => pickActiveMerged(list), [list, bump]);
|
|
153
205
|
React.useEffect(() => {
|
|
154
206
|
if (!active?.file_name) {
|
|
155
207
|
setAvatarSrc(null);
|
|
@@ -177,7 +229,7 @@ function useActiveCharacter() {
|
|
|
177
229
|
function useCharacterPicker() {
|
|
178
230
|
const [list, setList] = React.useState([]);
|
|
179
231
|
const [avatars, setAvatars] = React.useState({});
|
|
180
|
-
const [
|
|
232
|
+
const [bump, bumpFn] = usePreferenceSyncBump();
|
|
181
233
|
const reload = React.useCallback(async () => {
|
|
182
234
|
const next = await safeInvoke('character_list', {
|
|
183
235
|
shallow: false
|
|
@@ -187,34 +239,8 @@ function useCharacterPicker() {
|
|
|
187
239
|
React.useEffect(() => {
|
|
188
240
|
void reload();
|
|
189
241
|
}, [reload]);
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
let cancelled = false;
|
|
193
|
-
safeListen(CHARACTER_REFRESH_EVENT, () => {
|
|
194
|
-
void reload();
|
|
195
|
-
}).then(fn => {
|
|
196
|
-
if (cancelled) fn();else unlisten = fn;
|
|
197
|
-
});
|
|
198
|
-
function onExtensionsChanged(e) {
|
|
199
|
-
if (!isCharacterRelevant(e)) return;
|
|
200
|
-
void reload();
|
|
201
|
-
}
|
|
202
|
-
function onActiveChanged() {
|
|
203
|
-
setActiveNameState(readStoredActiveName());
|
|
204
|
-
}
|
|
205
|
-
if (typeof window !== 'undefined') {
|
|
206
|
-
window.addEventListener(EXTENSIONS_CHANGED_EVENT, onExtensionsChanged);
|
|
207
|
-
window.addEventListener(ACTIVE_CHARACTER_CHANGED_EVENT, onActiveChanged);
|
|
208
|
-
}
|
|
209
|
-
return () => {
|
|
210
|
-
cancelled = true;
|
|
211
|
-
if (unlisten) unlisten();
|
|
212
|
-
if (typeof window !== 'undefined') {
|
|
213
|
-
window.removeEventListener(EXTENSIONS_CHANGED_EVENT, onExtensionsChanged);
|
|
214
|
-
window.removeEventListener(ACTIVE_CHARACTER_CHANGED_EVENT, onActiveChanged);
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
}, [reload]);
|
|
242
|
+
useCharacterPreferenceListeners(reload, bumpFn);
|
|
243
|
+
const activeName = React.useMemo(() => pickActiveMerged(list)?.name ?? null, [list, bump]);
|
|
218
244
|
// Resolve avatars for every character in the list (cached by file_name).
|
|
219
245
|
React.useEffect(() => {
|
|
220
246
|
let alive = true;
|
|
@@ -243,7 +269,10 @@ function useCharacterPicker() {
|
|
|
243
269
|
})), [list, avatars]);
|
|
244
270
|
const setActive = React.useCallback(name => {
|
|
245
271
|
writeStoredActiveName(name);
|
|
246
|
-
|
|
272
|
+
const row = name ? list.find(c => c.name === name) : null;
|
|
273
|
+
void setPreferredActiveCharacterFileName(row?.file_name ?? null);
|
|
274
|
+
clearCharacterSpriteCache();
|
|
275
|
+
bumpFn();
|
|
247
276
|
if (typeof window !== 'undefined') {
|
|
248
277
|
window.dispatchEvent(new CustomEvent(ACTIVE_CHARACTER_CHANGED_EVENT, {
|
|
249
278
|
detail: {
|
|
@@ -251,7 +280,7 @@ function useCharacterPicker() {
|
|
|
251
280
|
}
|
|
252
281
|
}));
|
|
253
282
|
}
|
|
254
|
-
}, []);
|
|
283
|
+
}, [list, bumpFn]);
|
|
255
284
|
return {
|
|
256
285
|
characters,
|
|
257
286
|
activeName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useActiveCharacter.js","sources":["../../../../src/components/AIToolbar/hooks/useActiveCharacter.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useActiveCharacter.js","sources":["../../../../src/components/AIToolbar/hooks/useActiveCharacter.ts"],"sourcesContent":[null],"names":[],"mappings":"oSAqCA;;;;;;AAMI;AACH;AAED;;;AAGI;AACH;AAED;;;;AAII;;;AAGH;AAmMD;;;;;;AA4CG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted preference for which installed character card is **active**
|
|
3
|
+
* across the toolbar + dashboard webviews (`character_list[].file_name` stem —
|
|
4
|
+
* e.g. `"Aria"`, `"Seraphina"`).
|
|
5
|
+
*
|
|
6
|
+
* Mirrors the `useChatBackground` pattern: localStorage + `storage` events +
|
|
7
|
+
* Tauri `emit`/`listen` so the dashboard sees the selection without sharing a
|
|
8
|
+
* `window` reference with the floating bar.
|
|
9
|
+
*/
|
|
10
|
+
/** localStorage key — exported for `storage` listeners in other hooks. */
|
|
11
|
+
export declare const ACTIVE_CHARACTER_FILE_NAME_STORAGE_KEY = "yantra:active-character:file-name";
|
|
12
|
+
/** Event name broadcast when the preferred character changes (payload: `{ fileName: string | null }`). */
|
|
13
|
+
export declare const ACTIVE_CHARACTER_CHANGE_EVENT = "yantra:active-character-change";
|
|
14
|
+
export declare function readPreferredActiveCharacterFileName(): string | null;
|
|
15
|
+
/**
|
|
16
|
+
* Write the user's character choice and fan out so every webview recomputes
|
|
17
|
+
* active character (toolbar + `/chat`).
|
|
18
|
+
*/
|
|
19
|
+
export declare function setPreferredActiveCharacterFileName(fileName: string | null): Promise<void>;
|
|
20
|
+
/** Pick the character row that matches the stored preference; otherwise list[0]. */
|
|
21
|
+
export declare function resolveActiveCharacterFromList<T extends {
|
|
22
|
+
file_name?: string | null;
|
|
23
|
+
}>(list: T[] | null | undefined): T | null;
|
|
24
|
+
//# sourceMappingURL=activeCharacterPreference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activeCharacterPreference.d.ts","sourceRoot":"","sources":["../../src/hooks/activeCharacterPreference.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,0EAA0E;AAC1E,eAAO,MAAM,sCAAsC,sCAAsC,CAAC;AAE1F,0GAA0G;AAC1G,eAAO,MAAM,6BAA6B,mCAAmC,CAAC;AAE9E,wBAAgB,oCAAoC,IAAI,MAAM,GAAG,IAAI,CAOpE;AAYD;;;GAGG;AACH,wBAAsB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhG;AAED,oFAAoF;AACpF,wBAAgB,8BAA8B,CAAC,CAAC,SAAS;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAClF,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,GAC7B,CAAC,GAAG,IAAI,CAQV"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted preference for which installed character card is **active**
|
|
3
|
+
* across the toolbar + dashboard webviews (`character_list[].file_name` stem —
|
|
4
|
+
* e.g. `"Aria"`, `"Seraphina"`).
|
|
5
|
+
*
|
|
6
|
+
* Mirrors the `useChatBackground` pattern: localStorage + `storage` events +
|
|
7
|
+
* Tauri `emit`/`listen` so the dashboard sees the selection without sharing a
|
|
8
|
+
* `window` reference with the floating bar.
|
|
9
|
+
*/
|
|
10
|
+
/** localStorage key — exported for `storage` listeners in other hooks. */
|
|
11
|
+
const ACTIVE_CHARACTER_FILE_NAME_STORAGE_KEY = 'yantra:active-character:file-name';
|
|
12
|
+
/** Event name broadcast when the preferred character changes (payload: `{ fileName: string | null }`). */
|
|
13
|
+
const ACTIVE_CHARACTER_CHANGE_EVENT = 'yantra:active-character-change';
|
|
14
|
+
function readPreferredActiveCharacterFileName() {
|
|
15
|
+
if (typeof window === 'undefined') return null;
|
|
16
|
+
try {
|
|
17
|
+
return window.localStorage.getItem(ACTIVE_CHARACTER_FILE_NAME_STORAGE_KEY);
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function safeEmit(event, payload) {
|
|
23
|
+
try {
|
|
24
|
+
// @ts-ignore optional dynamic import
|
|
25
|
+
const mod = await import('@tauri-apps/api/event');
|
|
26
|
+
await mod.emit(event, payload);
|
|
27
|
+
} catch {
|
|
28
|
+
/* non-Tauri or event module missing */
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Write the user's character choice and fan out so every webview recomputes
|
|
33
|
+
* active character (toolbar + `/chat`).
|
|
34
|
+
*/
|
|
35
|
+
async function setPreferredActiveCharacterFileName(fileName) {
|
|
36
|
+
if (typeof window === 'undefined') return;
|
|
37
|
+
try {
|
|
38
|
+
if (fileName && fileName.trim()) {
|
|
39
|
+
window.localStorage.setItem(ACTIVE_CHARACTER_FILE_NAME_STORAGE_KEY, fileName.trim());
|
|
40
|
+
} else {
|
|
41
|
+
window.localStorage.removeItem(ACTIVE_CHARACTER_FILE_NAME_STORAGE_KEY);
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
// ignore quota
|
|
45
|
+
}
|
|
46
|
+
window.dispatchEvent(new CustomEvent(ACTIVE_CHARACTER_CHANGE_EVENT, {
|
|
47
|
+
detail: {
|
|
48
|
+
fileName: fileName?.trim() || null
|
|
49
|
+
}
|
|
50
|
+
}));
|
|
51
|
+
await safeEmit(ACTIVE_CHARACTER_CHANGE_EVENT, {
|
|
52
|
+
fileName: fileName?.trim() || null
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/** Pick the character row that matches the stored preference; otherwise list[0]. */
|
|
56
|
+
function resolveActiveCharacterFromList(list) {
|
|
57
|
+
if (!list?.length) return null;
|
|
58
|
+
const pref = readPreferredActiveCharacterFileName();
|
|
59
|
+
if (pref) {
|
|
60
|
+
const match = list.find(c => c.file_name === pref);
|
|
61
|
+
if (match) return match;
|
|
62
|
+
}
|
|
63
|
+
return list[0] ?? null;
|
|
64
|
+
}export{ACTIVE_CHARACTER_CHANGE_EVENT,ACTIVE_CHARACTER_FILE_NAME_STORAGE_KEY,readPreferredActiveCharacterFileName,resolveActiveCharacterFromList,setPreferredActiveCharacterFileName};//# sourceMappingURL=activeCharacterPreference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activeCharacterPreference.js","sources":["../../src/hooks/activeCharacterPreference.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;AAQG;AAEH;AACA,MAAA,sCAAa,GAAA;AAEb;AACA,MAAA,6BAAa,GAAA;AAEb,SAAA,oCAAgB,GAAA;AAmBhB,EAAA,IAAA,OAAA,MAAA,KAAA,WAAA,EAAA,OAAA,IAAA;;;AAGG,EAAA,CAAA,CAAA,MAAA;AACH,IAAA,OAAA,IAAA;AAqBA,EAAA;AACA;AAA2D,eAAU,QAAQ,CAAA,KAAO,EAAA,OAAA,EAAA;AAAE,EAAA,IAClF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/lib/hooks/index.d.ts
CHANGED
package/lib/hooks/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{default as PageLoading}from'./components/PageLoading/index.js';export{ApplicationErrorHandler}from'./components/ErrorHandlers/ApplicationErrorHandler.js';export{ErrorBoundary}from'./components/ErrorHandlers/ErrorBoundary.js';export{LayoutErrorBoundary}from'./components/ErrorHandlers/LayoutErrorBoundary.js';export{RemixErrorBoundary}from'./components/ErrorHandlers/RemixErrorBoundary.js';export{SPAErrorBoundary}from'./components/ErrorHandlers/SPAErrorBoundary.js';export{ReactTable}from'./components/ReactTable/Table.js';export{DefaultColumnFilter,SelectColumnFilter}from'./components/ReactTable/TableFilters.js';export{Error404}from'./components/ErrorPages/404.js';export{Error500}from'./components/ErrorPages/500.js';export{Error403}from'./components/ErrorPages/403.js';export{PageContainer}from'./components/PageContainer/PageContainer.js';export{Spin}from'./components/Spin/index.js';export{OTPInput}from'./components/OTP/OTPInput.js';export{SingleInput}from'./components/OTP/SingleInput.js';export{useOTPInput}from'./components/OTP/hooks.js';export{OTPVerification}from'./components/OTP/OTPVerification.js';export{SearchInput}from'./components/Search/SearchInput.js';export{Select,SelectContent,SelectItem,SelectSearch,SelectTrigger,SelectValue}from'./components/Select/Select.js';export{DatePicker}from'./components/DatePicker/DatePicker.js';export{Dialog}from'./components/Dialog/Dialog.js';export{TailwindUiButton}from'./components/Button/Button.js';export{TailwindThemeProvider,ThemeContext,themes}from'./components/ThemeProvider/ThemeProvider.js';export{ThemeToggle}from'./components/ThemeProvider/ThemeToggle.js';export{LanguageMenuDropdown}from'./components/LanguageMenuDropdown/LanguageMenuDropdown.js';export{InputToolBar}from'./components/InputToolBar/InputToolBar.js';export{getDefaultLeftItems,getDefaultRightItems}from'./components/InputToolBar/defaults.js';export{AIToolbar,AIToolbarInputSurface,AIToolbarLeading,AIToolbarMain,AIToolbarStatusDot,AIToolbarTrailing}from'./components/AIToolbar/components/AIToolbarPrimitives.js';export{Completion}from'./components/AIToolbar/components/completion/index.js';export{SystemAudio}from'./components/AIToolbar/components/speech/index.js';export{AudioVisualizer}from'./components/AIToolbar/components/speech/audio-visualizer.js';export{StatusIndicator}from'./components/AIToolbar/components/speech/StatusIndicator.js';export{AIToolBar}from'./components/AIToolbar/components/AIToolBar.js';export{CustomCursor}from'./components/AIToolbar/components/CustomCursor.js';export{MessageHistory}from'./components/AIToolbar/components/completion/MessageHistory.js';export{Screenshot}from'./components/AIToolbar/components/completion/Screenshot.js';export{Header}from'./components/AIToolbar/components/speech/Header.js';export{ModeSwitcher}from'./components/AIToolbar/components/speech/ModeSwitcher.js';export{PermissionFlow}from'./components/AIToolbar/components/speech/PermissionFlow.js';export{YantraIcon}from'./components/YantraIcon.js';export{Markdown as AIToolbarMarkdown}from'./components/AIToolbar/components/Markdown/index.js';export{MarkdownBreadcrumbs}from'./components/Markdown/MarkdownBreadcrumbs.js';export{MarkdownCopyButton}from'./components/Markdown/MarkdownCopyButton.js';export{MarkdownHeader}from'./components/Markdown/MarkdownHeader.js';export{MarkdownNavigation}from'./components/Markdown/MarkdownNavigation.js';export{MarkdownPage}from'./components/Markdown/MarkdownPage.js';export{MarkdownTableOfContents}from'./components/Markdown/MarkdownTableOfContents.js';export{useTheme}from'./hooks/useTheme.js';export{useWindowSize}from'./hooks/useWindowSize.js';export{ToastContainer,useToast,useToastCloseAll}from'./hooks/useToast.js';export{useMediaQuery}from'./hooks/useMediaQuery.js';export{cn}from'./utils/util.js';export{AssistantMessageActions}from'./components/AIToolbar/components/completion/AssistantMessageActions.js';export{DragButton}from'./components/AIToolbar/components/DragButton.js';//# sourceMappingURL=index.js.map
|
|
1
|
+
export{default as PageLoading}from'./components/PageLoading/index.js';export{ApplicationErrorHandler}from'./components/ErrorHandlers/ApplicationErrorHandler.js';export{ErrorBoundary}from'./components/ErrorHandlers/ErrorBoundary.js';export{LayoutErrorBoundary}from'./components/ErrorHandlers/LayoutErrorBoundary.js';export{RemixErrorBoundary}from'./components/ErrorHandlers/RemixErrorBoundary.js';export{SPAErrorBoundary}from'./components/ErrorHandlers/SPAErrorBoundary.js';export{ReactTable}from'./components/ReactTable/Table.js';export{DefaultColumnFilter,SelectColumnFilter}from'./components/ReactTable/TableFilters.js';export{Error404}from'./components/ErrorPages/404.js';export{Error500}from'./components/ErrorPages/500.js';export{Error403}from'./components/ErrorPages/403.js';export{PageContainer}from'./components/PageContainer/PageContainer.js';export{Spin}from'./components/Spin/index.js';export{OTPInput}from'./components/OTP/OTPInput.js';export{SingleInput}from'./components/OTP/SingleInput.js';export{useOTPInput}from'./components/OTP/hooks.js';export{OTPVerification}from'./components/OTP/OTPVerification.js';export{SearchInput}from'./components/Search/SearchInput.js';export{Select,SelectContent,SelectItem,SelectSearch,SelectTrigger,SelectValue}from'./components/Select/Select.js';export{DatePicker}from'./components/DatePicker/DatePicker.js';export{Dialog}from'./components/Dialog/Dialog.js';export{TailwindUiButton}from'./components/Button/Button.js';export{TailwindThemeProvider,ThemeContext,themes}from'./components/ThemeProvider/ThemeProvider.js';export{ThemeToggle}from'./components/ThemeProvider/ThemeToggle.js';export{LanguageMenuDropdown}from'./components/LanguageMenuDropdown/LanguageMenuDropdown.js';export{InputToolBar}from'./components/InputToolBar/InputToolBar.js';export{getDefaultLeftItems,getDefaultRightItems}from'./components/InputToolBar/defaults.js';export{AIToolbar,AIToolbarInputSurface,AIToolbarLeading,AIToolbarMain,AIToolbarStatusDot,AIToolbarTrailing}from'./components/AIToolbar/components/AIToolbarPrimitives.js';export{Completion}from'./components/AIToolbar/components/completion/index.js';export{SystemAudio}from'./components/AIToolbar/components/speech/index.js';export{AudioVisualizer}from'./components/AIToolbar/components/speech/audio-visualizer.js';export{StatusIndicator}from'./components/AIToolbar/components/speech/StatusIndicator.js';export{AIToolBar}from'./components/AIToolbar/components/AIToolBar.js';export{CustomCursor}from'./components/AIToolbar/components/CustomCursor.js';export{MessageHistory}from'./components/AIToolbar/components/completion/MessageHistory.js';export{Screenshot}from'./components/AIToolbar/components/completion/Screenshot.js';export{Header}from'./components/AIToolbar/components/speech/Header.js';export{ModeSwitcher}from'./components/AIToolbar/components/speech/ModeSwitcher.js';export{PermissionFlow}from'./components/AIToolbar/components/speech/PermissionFlow.js';export{YantraIcon}from'./components/YantraIcon.js';export{Markdown as AIToolbarMarkdown}from'./components/AIToolbar/components/Markdown/index.js';export{MarkdownBreadcrumbs}from'./components/Markdown/MarkdownBreadcrumbs.js';export{MarkdownCopyButton}from'./components/Markdown/MarkdownCopyButton.js';export{MarkdownHeader}from'./components/Markdown/MarkdownHeader.js';export{MarkdownNavigation}from'./components/Markdown/MarkdownNavigation.js';export{MarkdownPage}from'./components/Markdown/MarkdownPage.js';export{MarkdownTableOfContents}from'./components/Markdown/MarkdownTableOfContents.js';export{ACTIVE_CHARACTER_CHANGE_EVENT,ACTIVE_CHARACTER_FILE_NAME_STORAGE_KEY,readPreferredActiveCharacterFileName,resolveActiveCharacterFromList,setPreferredActiveCharacterFileName}from'./hooks/activeCharacterPreference.js';export{useTheme}from'./hooks/useTheme.js';export{useWindowSize}from'./hooks/useWindowSize.js';export{ToastContainer,useToast,useToastCloseAll}from'./hooks/useToast.js';export{useMediaQuery}from'./hooks/useMediaQuery.js';export{cn}from'./utils/util.js';export{AssistantMessageActions}from'./components/AIToolbar/components/completion/AssistantMessageActions.js';export{DragButton}from'./components/AIToolbar/components/DragButton.js';//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@admin-layout/tailwind-ui",
|
|
3
|
-
"version": "12.2.4-alpha.
|
|
3
|
+
"version": "12.2.4-alpha.59",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -96,5 +96,5 @@
|
|
|
96
96
|
"typescript": {
|
|
97
97
|
"definition": "lib/index.d.ts"
|
|
98
98
|
},
|
|
99
|
-
"gitHead": "
|
|
99
|
+
"gitHead": "628dab51faaae1c1ab545c071a2252395659fe7e"
|
|
100
100
|
}
|