@themodcraft/addon-providers 1.1.0 → 1.1.2
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/auth/index.js +1 -1
- package/dist/index.js +1 -81
- package/dist/keyboard/index.js +1 -1
- package/dist/nexus/index.js +1 -1
- package/dist/runtime/auth-provider.js +1 -171
- package/dist/runtime/config-provider.js +1 -10
- package/dist/runtime/index.js +1 -6
- package/dist/runtime/keyboard-provider.js +1 -105
- package/dist/runtime/nexus-provider.js +1 -10
- package/dist/runtime/theme-provider.js +1 -130
- package/dist/runtime/ui-overlay-provider.js +1 -35
- package/dist/theme/index.js +1 -1
- package/package.json +6 -4
package/dist/auth/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export{createBetterAuthProviderPreset}from"../index.js";
|
package/dist/index.js
CHANGED
|
@@ -1,81 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
export * from "./runtime";
|
|
3
|
-
export const themodcraftV3ThemeProviderPreset = {
|
|
4
|
-
defaultMode: "system",
|
|
5
|
-
defaultThemeId: "themodcraft-v3",
|
|
6
|
-
storageKey: "tmc-nexus-theme",
|
|
7
|
-
themes: [
|
|
8
|
-
{
|
|
9
|
-
colorScheme: "dark light",
|
|
10
|
-
cssVariables: {
|
|
11
|
-
"--neutral-50": "#ffffff",
|
|
12
|
-
"--neutral-100": "#d9d9d9",
|
|
13
|
-
"--neutral-200": "#9e9e9e",
|
|
14
|
-
"--neutral-300": "#828282",
|
|
15
|
-
"--neutral-400": "#696969",
|
|
16
|
-
"--neutral-500": "#4a4a4a",
|
|
17
|
-
"--neutral-600": "#3c3c3c",
|
|
18
|
-
"--neutral-700": "#212121",
|
|
19
|
-
"--neutral-800": "#161616",
|
|
20
|
-
"--neutral-850": "#131313",
|
|
21
|
-
"--neutral-900": "#121212",
|
|
22
|
-
"--neutral-999": "#000000",
|
|
23
|
-
"--accent-green-500": "#30fa00",
|
|
24
|
-
"--accent-blue-500": "#005efe",
|
|
25
|
-
"--accent-cyan-400": "#00f2ff",
|
|
26
|
-
"--accent-cyan-500": "#00d2de",
|
|
27
|
-
"--primary-background": "#212121",
|
|
28
|
-
"--secondary-background": "#161616",
|
|
29
|
-
"--primary-text": "#ffffff",
|
|
30
|
-
"--secondary-text": "#828282",
|
|
31
|
-
"--tertiary-text": "#4a4a4a",
|
|
32
|
-
"--border-color": "#3c3c3c",
|
|
33
|
-
"--cta-color": "#30fa00",
|
|
34
|
-
"--link-color": "#005efe",
|
|
35
|
-
"--hover-overlay": "rgba(0, 0, 0, 0.49)",
|
|
36
|
-
"--border-radius": "15px",
|
|
37
|
-
"--border-radius-sm": "6px",
|
|
38
|
-
"--font-main": "Inter, system-ui, sans-serif",
|
|
39
|
-
"--font-mono": "JetBrains Mono, Fira Code, monospace",
|
|
40
|
-
},
|
|
41
|
-
id: "themodcraft-v3",
|
|
42
|
-
label: "TheModCraft V3",
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
};
|
|
46
|
-
export const defaultKeyboardProviderPreset = {
|
|
47
|
-
focusSelector: [
|
|
48
|
-
"a[href]",
|
|
49
|
-
"button:not([disabled])",
|
|
50
|
-
"input:not([disabled])",
|
|
51
|
-
"select:not([disabled])",
|
|
52
|
-
"textarea:not([disabled])",
|
|
53
|
-
"[tabindex]:not([tabindex='-1'])",
|
|
54
|
-
"[data-keyboard-focusable='true']",
|
|
55
|
-
].join(","),
|
|
56
|
-
shortcuts: [],
|
|
57
|
-
};
|
|
58
|
-
export function createBetterAuthProviderPreset({ loginUrl = "/login", logoutUrl = "/logout", onLogout, session, settingsUrl = "/account/settings", storageKey = "tmc-nexus-auth", } = {}) {
|
|
59
|
-
const user = profileFromBetterAuthSession(session);
|
|
60
|
-
return {
|
|
61
|
-
loginUrl,
|
|
62
|
-
logoutUrl,
|
|
63
|
-
onLogout,
|
|
64
|
-
profileImage: user?.image ?? null,
|
|
65
|
-
settingsUrl,
|
|
66
|
-
status: user ? "authenticated" : "anonymous",
|
|
67
|
-
storageKey,
|
|
68
|
-
user,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
export const themodcraftV3ProviderPreset = {
|
|
72
|
-
auth: createBetterAuthProviderPreset(),
|
|
73
|
-
config: {
|
|
74
|
-
config: {
|
|
75
|
-
appName: "TMC Nexus",
|
|
76
|
-
cdnBaseUrl: "https://cdnui.themodcraft.net/api/files",
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
keyboard: defaultKeyboardProviderPreset,
|
|
80
|
-
theme: themodcraftV3ThemeProviderPreset,
|
|
81
|
-
};
|
|
1
|
+
import{profileFromBetterAuthSession as e}from"@themodcraft/addon-integrations/better-auth";export{AuthProvider,useAuth,useOptionalAuth}from"./runtime/auth-provider.js";export{ConfigProvider,useConfig}from"./runtime/config-provider.js";export{KeyboardProvider,handleKeyboardClick,useKeyboard,useKeyboardShortcut,useOptionalKeyboard}from"./runtime/keyboard-provider.js";export{NexusProvider}from"./runtime/nexus-provider.js";export{ThemeProvider,useOptionalTheme,useTheme}from"./runtime/theme-provider.js";export{UIOverlayProvider,useOptionalUIOverlay,useUIOverlay}from"./runtime/ui-overlay-provider.js";const r={defaultMode:"system",defaultThemeId:"themodcraft-v3",storageKey:"tmc-nexus-theme",themes:[{colorScheme:"dark light",cssVariables:{"--neutral-50":"#ffffff","--neutral-100":"#d9d9d9","--neutral-200":"#9e9e9e","--neutral-300":"#828282","--neutral-400":"#696969","--neutral-500":"#4a4a4a","--neutral-600":"#3c3c3c","--neutral-700":"#212121","--neutral-800":"#161616","--neutral-850":"#131313","--neutral-900":"#121212","--neutral-999":"#000000","--accent-green-500":"#30fa00","--accent-blue-500":"#005efe","--accent-cyan-400":"#00f2ff","--accent-cyan-500":"#00d2de","--primary-background":"#212121","--secondary-background":"#161616","--primary-text":"#ffffff","--secondary-text":"#828282","--tertiary-text":"#4a4a4a","--border-color":"#3c3c3c","--cta-color":"#30fa00","--link-color":"#005efe","--hover-overlay":"rgba(0, 0, 0, 0.49)","--border-radius":"15px","--border-radius-sm":"6px","--font-main":"Inter, system-ui, sans-serif","--font-mono":"JetBrains Mono, Fira Code, monospace"},id:"themodcraft-v3",label:"TheModCraft V3"}]},t={focusSelector:["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","[tabindex]:not([tabindex='-1'])","[data-keyboard-focusable='true']"].join(","),shortcuts:[]};function o({loginUrl:r="/login",logoutUrl:t="/logout",onLogout:o,session:a,settingsUrl:n="/account/settings",storageKey:s="tmc-nexus-auth"}={}){const u=e(a);return{loginUrl:r,logoutUrl:t,onLogout:o,profileImage:u?.image??null,settingsUrl:n,status:u?"authenticated":"anonymous",storageKey:s,user:u}}const a={auth:o(),config:{config:{appName:"TMC Nexus",cdnBaseUrl:"https://cdnui.themodcraft.net/api/files"}},keyboard:t,theme:r};export{o as createBetterAuthProviderPreset,t as defaultKeyboardProviderPreset,a as themodcraftV3ProviderPreset,r as themodcraftV3ThemeProviderPreset};
|
package/dist/keyboard/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export{defaultKeyboardProviderPreset}from"../index.js";
|
package/dist/nexus/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export{themodcraftV3ProviderPreset}from"../index.js";
|
|
@@ -1,172 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from "react";
|
|
4
|
-
const AuthContext = createContext(null);
|
|
5
|
-
const authEventName = "tmc:nexus-auth";
|
|
6
|
-
function statusFromUser(user, fallback) {
|
|
7
|
-
if (fallback) {
|
|
8
|
-
return fallback;
|
|
9
|
-
}
|
|
10
|
-
return user ? "authenticated" : "anonymous";
|
|
11
|
-
}
|
|
12
|
-
function readStoredAuthSnapshot(storageKey) {
|
|
13
|
-
if (!storageKey || typeof window === "undefined") {
|
|
14
|
-
return null;
|
|
15
|
-
}
|
|
16
|
-
try {
|
|
17
|
-
const rawSnapshot = window.localStorage.getItem(storageKey);
|
|
18
|
-
return rawSnapshot ? JSON.parse(rawSnapshot) : null;
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
function writeStoredAuthSnapshot(storageKey, snapshot) {
|
|
25
|
-
if (!storageKey || typeof window === "undefined") {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
if (!snapshot) {
|
|
29
|
-
window.localStorage.removeItem(storageKey);
|
|
30
|
-
window.dispatchEvent(new CustomEvent(authEventName, { detail: null }));
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
window.localStorage.setItem(storageKey, JSON.stringify(snapshot));
|
|
34
|
-
window.dispatchEvent(new CustomEvent(authEventName, { detail: snapshot }));
|
|
35
|
-
}
|
|
36
|
-
export function AuthProvider({ children, loginUrl, logoutUrl, onLogout, profileImage, refreshOnMount = true, resolveProfileImage, resolveUser, settingsUrl, status, storageKey = "tmc-nexus-auth", user: initialUser = null, }) {
|
|
37
|
-
const [user, setUserState] = useState(initialUser);
|
|
38
|
-
const [resolvedProfileImage, setResolvedProfileImage] = useState(profileImage ?? initialUser?.image ?? null);
|
|
39
|
-
const [resolvedStatus, setResolvedStatus] = useState(statusFromUser(initialUser, status));
|
|
40
|
-
useEffect(() => {
|
|
41
|
-
const storedSnapshot = readStoredAuthSnapshot(storageKey);
|
|
42
|
-
if (storedSnapshot) {
|
|
43
|
-
setUserState(storedSnapshot.user);
|
|
44
|
-
setResolvedProfileImage(storedSnapshot.profileImage);
|
|
45
|
-
setResolvedStatus(storedSnapshot.status);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
setUserState(initialUser);
|
|
49
|
-
setResolvedProfileImage(profileImage ?? initialUser?.image ?? null);
|
|
50
|
-
setResolvedStatus(statusFromUser(initialUser, status));
|
|
51
|
-
}, [initialUser, profileImage, status, storageKey]);
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
function handleStorage(event) {
|
|
54
|
-
if (event.key !== storageKey) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const snapshot = readStoredAuthSnapshot(storageKey);
|
|
58
|
-
setUserState(snapshot?.user ?? null);
|
|
59
|
-
setResolvedProfileImage(snapshot?.profileImage ?? null);
|
|
60
|
-
setResolvedStatus(snapshot?.status ?? "anonymous");
|
|
61
|
-
}
|
|
62
|
-
function handleAuthEvent(event) {
|
|
63
|
-
const snapshot = event.detail;
|
|
64
|
-
setUserState(snapshot?.user ?? null);
|
|
65
|
-
setResolvedProfileImage(snapshot?.profileImage ?? null);
|
|
66
|
-
setResolvedStatus(snapshot?.status ?? "anonymous");
|
|
67
|
-
}
|
|
68
|
-
window.addEventListener("storage", handleStorage);
|
|
69
|
-
window.addEventListener(authEventName, handleAuthEvent);
|
|
70
|
-
return () => {
|
|
71
|
-
window.removeEventListener("storage", handleStorage);
|
|
72
|
-
window.removeEventListener(authEventName, handleAuthEvent);
|
|
73
|
-
};
|
|
74
|
-
}, [storageKey]);
|
|
75
|
-
const refreshUser = useCallback(async () => {
|
|
76
|
-
if (!resolveUser) {
|
|
77
|
-
return user;
|
|
78
|
-
}
|
|
79
|
-
setResolvedStatus("loading");
|
|
80
|
-
const nextUser = await resolveUser();
|
|
81
|
-
const nextProfileImage = resolveProfileImage
|
|
82
|
-
? await resolveProfileImage(nextUser)
|
|
83
|
-
: nextUser?.image ?? null;
|
|
84
|
-
setUserState(nextUser);
|
|
85
|
-
setResolvedProfileImage(nextProfileImage);
|
|
86
|
-
setResolvedStatus(nextUser ? "authenticated" : "anonymous");
|
|
87
|
-
writeStoredAuthSnapshot(storageKey, {
|
|
88
|
-
profileImage: nextProfileImage,
|
|
89
|
-
status: nextUser ? "authenticated" : "anonymous",
|
|
90
|
-
user: nextUser,
|
|
91
|
-
});
|
|
92
|
-
return nextUser;
|
|
93
|
-
}, [resolveProfileImage, resolveUser, storageKey, user]);
|
|
94
|
-
useEffect(() => {
|
|
95
|
-
if (!refreshOnMount || !resolveUser) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
let cancelled = false;
|
|
99
|
-
async function refresh() {
|
|
100
|
-
const nextUser = await resolveUser?.();
|
|
101
|
-
if (cancelled) {
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
const nextProfileImage = resolveProfileImage
|
|
105
|
-
? await resolveProfileImage(nextUser ?? null)
|
|
106
|
-
: nextUser?.image ?? null;
|
|
107
|
-
if (!cancelled) {
|
|
108
|
-
setUserState(nextUser ?? null);
|
|
109
|
-
setResolvedProfileImage(nextProfileImage);
|
|
110
|
-
setResolvedStatus(nextUser ? "authenticated" : "anonymous");
|
|
111
|
-
writeStoredAuthSnapshot(storageKey, {
|
|
112
|
-
profileImage: nextProfileImage,
|
|
113
|
-
status: nextUser ? "authenticated" : "anonymous",
|
|
114
|
-
user: nextUser ?? null,
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
refresh();
|
|
119
|
-
return () => {
|
|
120
|
-
cancelled = true;
|
|
121
|
-
};
|
|
122
|
-
}, [refreshOnMount, resolveProfileImage, resolveUser, storageKey]);
|
|
123
|
-
const setUser = useCallback((nextUser) => {
|
|
124
|
-
const nextProfileImage = nextUser?.image ?? null;
|
|
125
|
-
const nextStatus = nextUser ? "authenticated" : "anonymous";
|
|
126
|
-
setUserState(nextUser);
|
|
127
|
-
setResolvedProfileImage(nextProfileImage);
|
|
128
|
-
setResolvedStatus(nextStatus);
|
|
129
|
-
writeStoredAuthSnapshot(storageKey, {
|
|
130
|
-
profileImage: nextProfileImage,
|
|
131
|
-
status: nextStatus,
|
|
132
|
-
user: nextUser,
|
|
133
|
-
});
|
|
134
|
-
}, [storageKey]);
|
|
135
|
-
const logout = useCallback(async () => {
|
|
136
|
-
await onLogout?.();
|
|
137
|
-
setUser(null);
|
|
138
|
-
writeStoredAuthSnapshot(storageKey, null);
|
|
139
|
-
}, [onLogout, setUser, storageKey]);
|
|
140
|
-
const value = useMemo(() => ({
|
|
141
|
-
loginUrl,
|
|
142
|
-
logout,
|
|
143
|
-
logoutUrl,
|
|
144
|
-
profileImage: resolvedProfileImage,
|
|
145
|
-
refreshUser,
|
|
146
|
-
setUser,
|
|
147
|
-
settingsUrl,
|
|
148
|
-
status: resolvedStatus,
|
|
149
|
-
user,
|
|
150
|
-
}), [
|
|
151
|
-
loginUrl,
|
|
152
|
-
logout,
|
|
153
|
-
logoutUrl,
|
|
154
|
-
refreshUser,
|
|
155
|
-
resolvedProfileImage,
|
|
156
|
-
resolvedStatus,
|
|
157
|
-
setUser,
|
|
158
|
-
settingsUrl,
|
|
159
|
-
user,
|
|
160
|
-
]);
|
|
161
|
-
return _jsx(AuthContext.Provider, { value: value, children: children });
|
|
162
|
-
}
|
|
163
|
-
export function useAuth() {
|
|
164
|
-
const context = useContext(AuthContext);
|
|
165
|
-
if (!context) {
|
|
166
|
-
throw new Error("useAuth must be used inside AuthProvider.");
|
|
167
|
-
}
|
|
168
|
-
return context;
|
|
169
|
-
}
|
|
170
|
-
export function useOptionalAuth() {
|
|
171
|
-
return useContext(AuthContext);
|
|
172
|
-
}
|
|
2
|
+
import{c as t}from"react/compiler-runtime";import{useState as e,useEffect as n,useContext as o,createContext as r}from"react";import{jsx as u}from"react/jsx-runtime";const i=r(null),s="tmc:nexus-auth";function l(t,e){return e||(t?"authenticated":"anonymous")}function a(t){if(!t||"undefined"==typeof window)return null;try{const e=window.localStorage.getItem(t);return e?JSON.parse(e):null}catch{return null}}function c(t,e){if(t&&"undefined"!=typeof window){if(!e)return window.localStorage.removeItem(t),void window.dispatchEvent(new CustomEvent(s,{detail:null}));window.localStorage.setItem(t,JSON.stringify(e)),window.dispatchEvent(new CustomEvent(s,{detail:e}))}}function d(o){const r=t(42),{children:d,loginUrl:m,logoutUrl:f,onLogout:g,profileImage:w,refreshOnMount:v,resolveProfileImage:h,resolveUser:p,settingsUrl:y,status:I,storageKey:E,user:U}=o,L=void 0===v||v,S=void 0===E?"tmc-nexus-auth":E,x=void 0===U?null:U,[O,P]=e(x),[A,C]=e(w??x?.image??null);let J;r[0]!==x||r[1]!==I?(J=l(x,I),r[0]=x,r[1]=I,r[2]=J):J=r[2];const[N,b]=e(J);let j,k,K,M,q;r[3]!==x||r[4]!==w||r[5]!==I||r[6]!==S?(j=()=>{const t=a(S);if(t)return P(t.user),C(t.profileImage),void b(t.status);P(x),C(w??x?.image??null),b(l(x,I))},k=[x,w,I,S],r[3]=x,r[4]=w,r[5]=I,r[6]=S,r[7]=j,r[8]=k):(j=r[7],k=r[8]),n(j,k),r[9]!==S?(K=()=>{const t=function(t){if(t.key!==S)return;const e=a(S);P(e?.user??null),C(e?.profileImage??null),b(e?.status??"anonymous")},e=function(t){const e=t.detail;P(e?.user??null),C(e?.profileImage??null),b(e?.status??"anonymous")};return window.addEventListener("storage",t),window.addEventListener(s,e),()=>{window.removeEventListener("storage",t),window.removeEventListener(s,e)}},M=[S],r[9]=S,r[10]=K,r[11]=M):(K=r[10],M=r[11]),n(K,M),r[12]!==h||r[13]!==p||r[14]!==S||r[15]!==O?(q=async()=>{if(!p)return O;b("loading");const t=await p(),e=h?await h(t):t?.image??null;return P(t),C(e),b(t?"authenticated":"anonymous"),c(S,{profileImage:e,status:t?"authenticated":"anonymous",user:t}),t},r[12]=h,r[13]=p,r[14]=S,r[15]=O,r[16]=q):q=r[16];const z=q;let B,D,F;r[17]!==L||r[18]!==h||r[19]!==p||r[20]!==S?(B=()=>{if(!L||!p)return;let t=!1;return async function(){const e=await(p?.());if(t)return;const n=h?await h(e??null):e?.image??null;t||(P(e??null),C(n),b(e?"authenticated":"anonymous"),c(S,{profileImage:n,status:e?"authenticated":"anonymous",user:e??null}))}(),()=>{t=!0}},D=[L,h,p,S],r[17]=L,r[18]=h,r[19]=p,r[20]=S,r[21]=B,r[22]=D):(B=r[21],D=r[22]),n(B,D),r[23]!==S?(F=t=>{const e=t?.image??null,n=t?"authenticated":"anonymous";P(t),C(e),b(n),c(S,{profileImage:e,status:n,user:t})},r[23]=S,r[24]=F):F=r[24];const G=F;let H;r[25]!==g||r[26]!==G||r[27]!==S?(H=async()=>{await(g?.()),G(null),c(S,null)},r[25]=g,r[26]=G,r[27]=S,r[28]=H):H=r[28];const Q=H;let R;r[29]!==m||r[30]!==Q||r[31]!==f||r[32]!==z||r[33]!==A||r[34]!==N||r[35]!==G||r[36]!==y||r[37]!==O?(R={loginUrl:m,logout:Q,logoutUrl:f,profileImage:A,refreshUser:z,setUser:G,settingsUrl:y,status:N,user:O},r[29]=m,r[30]=Q,r[31]=f,r[32]=z,r[33]=A,r[34]=N,r[35]=G,r[36]=y,r[37]=O,r[38]=R):R=r[38];const T=R;let V;return r[39]!==d||r[40]!==T?(V=u(i.Provider,{value:T,children:d}),r[39]=d,r[40]=T,r[41]=V):V=r[41],V}function m(){const t=o(i);if(!t)throw new Error("useAuth must be used inside AuthProvider.");return t}function f(){return o(i)}export{d as AuthProvider,m as useAuth,f as useOptionalAuth};
|
|
@@ -1,11 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as
|
|
3
|
-
import { createContext, useContext, useMemo, } from "react";
|
|
4
|
-
const ConfigContext = createContext({});
|
|
5
|
-
export function ConfigProvider({ children, config = {} }) {
|
|
6
|
-
const value = useMemo(() => config, [config]);
|
|
7
|
-
return _jsx(ConfigContext.Provider, { value: value, children: children });
|
|
8
|
-
}
|
|
9
|
-
export function useConfig() {
|
|
10
|
-
return useContext(ConfigContext);
|
|
11
|
-
}
|
|
2
|
+
import{c as r}from"react/compiler-runtime";import{useContext as t,createContext as o}from"react";import{jsx as e}from"react/jsx-runtime";const n=o({});function i(t){const o=r(5),{children:i,config:c}=t;let m;o[0]!==c?(m=void 0===c?{}:c,o[0]=c,o[1]=m):m=o[1];const u=m;let f;return o[2]!==i||o[3]!==u?(f=e(n.Provider,{value:u,children:i}),o[2]=i,o[3]=u,o[4]=f):f=o[4],f}function c(){return t(n)}export{i as ConfigProvider,c as useConfig};
|
package/dist/runtime/index.js
CHANGED
|
@@ -1,6 +1 @@
|
|
|
1
|
-
export
|
|
2
|
-
export * from "./config-provider";
|
|
3
|
-
export * from "./keyboard-provider";
|
|
4
|
-
export * from "./nexus-provider";
|
|
5
|
-
export * from "./theme-provider";
|
|
6
|
-
export * from "./ui-overlay-provider";
|
|
1
|
+
export{AuthProvider,useAuth,useOptionalAuth}from"./auth-provider.js";export{ConfigProvider,useConfig}from"./config-provider.js";export{KeyboardProvider,handleKeyboardClick,useKeyboard,useKeyboardShortcut,useOptionalKeyboard}from"./keyboard-provider.js";export{NexusProvider}from"./nexus-provider.js";export{ThemeProvider,useOptionalTheme,useTheme}from"./theme-provider.js";export{UIOverlayProvider,useOptionalUIOverlay,useUIOverlay}from"./ui-overlay-provider.js";
|
|
@@ -1,106 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, } from "react";
|
|
4
|
-
const defaultFocusSelector = [
|
|
5
|
-
"a[href]",
|
|
6
|
-
"button:not([disabled])",
|
|
7
|
-
"input:not([disabled])",
|
|
8
|
-
"select:not([disabled])",
|
|
9
|
-
"textarea:not([disabled])",
|
|
10
|
-
"[tabindex]:not([tabindex='-1'])",
|
|
11
|
-
"[data-keyboard-focusable='true']",
|
|
12
|
-
].join(",");
|
|
13
|
-
const KeyboardContext = createContext(null);
|
|
14
|
-
function isEditableTarget(target) {
|
|
15
|
-
if (!(target instanceof HTMLElement)) {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
return (target.isContentEditable ||
|
|
19
|
-
target instanceof HTMLInputElement ||
|
|
20
|
-
target instanceof HTMLSelectElement ||
|
|
21
|
-
target instanceof HTMLTextAreaElement);
|
|
22
|
-
}
|
|
23
|
-
function matchesShortcut(event, shortcut) {
|
|
24
|
-
return (shortcut.enabled !== false &&
|
|
25
|
-
event.key.toLowerCase() === shortcut.key.toLowerCase() &&
|
|
26
|
-
Boolean(event.altKey) === Boolean(shortcut.altKey) &&
|
|
27
|
-
Boolean(event.ctrlKey) === Boolean(shortcut.ctrlKey) &&
|
|
28
|
-
Boolean(event.metaKey) === Boolean(shortcut.metaKey) &&
|
|
29
|
-
Boolean(event.shiftKey) === Boolean(shortcut.shiftKey));
|
|
30
|
-
}
|
|
31
|
-
function getFocusableElements(selector) {
|
|
32
|
-
return Array.from(document.querySelectorAll(selector)).filter((element) => {
|
|
33
|
-
const style = window.getComputedStyle(element);
|
|
34
|
-
return !element.hasAttribute("disabled") && style.display !== "none" && style.visibility !== "hidden";
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
export function KeyboardProvider({ children, focusSelector = defaultFocusSelector, shortcuts = [], }) {
|
|
38
|
-
const shortcutsRef = useRef(new Map());
|
|
39
|
-
useEffect(() => {
|
|
40
|
-
shortcutsRef.current = new Map(shortcuts.map((shortcut) => [shortcut.id, shortcut]));
|
|
41
|
-
}, [shortcuts]);
|
|
42
|
-
useEffect(() => {
|
|
43
|
-
function handleKeyDown(event) {
|
|
44
|
-
for (const shortcut of shortcutsRef.current.values()) {
|
|
45
|
-
if (!matchesShortcut(event, shortcut)) {
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
if (!shortcut.allowInEditable && isEditableTarget(event.target)) {
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
if (shortcut.preventDefault ?? true) {
|
|
52
|
-
event.preventDefault();
|
|
53
|
-
}
|
|
54
|
-
shortcut.handler(event);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
window.addEventListener("keydown", handleKeyDown);
|
|
58
|
-
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
59
|
-
}, []);
|
|
60
|
-
const registerShortcut = useCallback((shortcut) => {
|
|
61
|
-
shortcutsRef.current.set(shortcut.id, shortcut);
|
|
62
|
-
return () => {
|
|
63
|
-
shortcutsRef.current.delete(shortcut.id);
|
|
64
|
-
};
|
|
65
|
-
}, []);
|
|
66
|
-
const focusByOffset = useCallback((offset, selector = focusSelector) => {
|
|
67
|
-
const elements = getFocusableElements(selector);
|
|
68
|
-
if (!elements.length) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const currentIndex = document.activeElement instanceof HTMLElement
|
|
72
|
-
? elements.indexOf(document.activeElement)
|
|
73
|
-
: -1;
|
|
74
|
-
const nextIndex = currentIndex === -1
|
|
75
|
-
? 0
|
|
76
|
-
: (currentIndex + offset + elements.length) % elements.length;
|
|
77
|
-
elements[nextIndex]?.focus();
|
|
78
|
-
}, [focusSelector]);
|
|
79
|
-
const value = useMemo(() => ({
|
|
80
|
-
focusFirst: (selector = focusSelector) => getFocusableElements(selector)[0]?.focus(),
|
|
81
|
-
focusNext: (selector = focusSelector) => focusByOffset(1, selector),
|
|
82
|
-
focusPrevious: (selector = focusSelector) => focusByOffset(-1, selector),
|
|
83
|
-
registerShortcut,
|
|
84
|
-
}), [focusByOffset, focusSelector, registerShortcut]);
|
|
85
|
-
return _jsx(KeyboardContext.Provider, { value: value, children: children });
|
|
86
|
-
}
|
|
87
|
-
export function useKeyboard() {
|
|
88
|
-
const context = useContext(KeyboardContext);
|
|
89
|
-
if (!context) {
|
|
90
|
-
throw new Error("useKeyboard must be used inside KeyboardProvider.");
|
|
91
|
-
}
|
|
92
|
-
return context;
|
|
93
|
-
}
|
|
94
|
-
export function useOptionalKeyboard() {
|
|
95
|
-
return useContext(KeyboardContext);
|
|
96
|
-
}
|
|
97
|
-
export function useKeyboardShortcut(shortcut) {
|
|
98
|
-
const keyboard = useKeyboard();
|
|
99
|
-
useEffect(() => keyboard.registerShortcut(shortcut), [keyboard, shortcut]);
|
|
100
|
-
}
|
|
101
|
-
export function handleKeyboardClick(event, callback) {
|
|
102
|
-
if (event.key === "Enter" || event.key === " ") {
|
|
103
|
-
event.preventDefault();
|
|
104
|
-
callback();
|
|
105
|
-
}
|
|
106
|
-
}
|
|
2
|
+
import{c as e}from"react/compiler-runtime";import{useRef as t,useEffect as n,useContext as o,createContext as r}from"react";import{jsx as i}from"react/jsx-runtime";const c=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","[tabindex]:not([tabindex='-1'])","[data-keyboard-focusable='true']"].join(","),l=r(null);function a(e){return e instanceof HTMLElement&&(e.isContentEditable||e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement)}function s(e,t){return!1!==t.enabled&&e.key.toLowerCase()===t.key.toLowerCase()&&Boolean(e.altKey)===Boolean(t.altKey)&&Boolean(e.ctrlKey)===Boolean(t.ctrlKey)&&Boolean(e.metaKey)===Boolean(t.metaKey)&&Boolean(e.shiftKey)===Boolean(t.shiftKey)}function u(e){return Array.from(document.querySelectorAll(e)).filter(e=>{const t=window.getComputedStyle(e);return!e.hasAttribute("disabled")&&"none"!==t.display&&"hidden"!==t.visibility})}function d(o){const r=e(24),{children:d,focusSelector:m,shortcuts:y}=o,b=void 0===m?c:m;let v;r[0]!==y?(v=void 0===y?[]:y,r[0]=y,r[1]=v):v=r[1];const h=v;let p;r[2]===Symbol.for("react.memo_cache_sentinel")?(p=new Map,r[2]=p):p=r[2];const w=t(p);let E,K,L,S,x;r[3]!==h?(E=()=>{w.current=new Map(h.map(f))},K=[h],r[3]=h,r[4]=E,r[5]=K):(E=r[4],K=r[5]),n(E,K),r[6]===Symbol.for("react.memo_cache_sentinel")?(L=()=>{const e=function(e){for(const t of w.current.values())s(e,t)&&(!t.allowInEditable&&a(e.target)||((t.preventDefault??1)&&e.preventDefault(),t.handler(e)))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},S=[],r[6]=L,r[7]=S):(L=r[6],S=r[7]),n(L,S),r[8]===Symbol.for("react.memo_cache_sentinel")?(x=e=>(w.current.set(e.id,e),()=>{w.current.delete(e.id)}),r[8]=x):x=r[8];const B=x;let g;r[9]!==b?(g=(e,t)=>{const n=u(void 0===t?b:t);if(!n.length)return;const o=document.activeElement instanceof HTMLElement?n.indexOf(document.activeElement):-1,r=-1===o?0:(o+e+n.length)%n.length;n[r]?.focus()},r[9]=b,r[10]=g):g=r[10];const k=g;let M,T,_,H;r[11]!==b?(M=e=>{const t=void 0===e?b:e;return u(t)[0]?.focus()},r[11]=b,r[12]=M):M=r[12],r[13]!==k||r[14]!==b?(T=e=>k(1,void 0===e?b:e),_=e=>k(-1,void 0===e?b:e),r[13]=k,r[14]=b,r[15]=T,r[16]=_):(T=r[15],_=r[16]),r[17]!==M||r[18]!==T||r[19]!==_?(H={focusFirst:M,focusNext:T,focusPrevious:_,registerShortcut:B},r[17]=M,r[18]=T,r[19]=_,r[20]=H):H=r[20];const A=H;let C;return r[21]!==d||r[22]!==A?(C=i(l.Provider,{value:A,children:d}),r[21]=d,r[22]=A,r[23]=C):C=r[23],C}function f(e){return[e.id,e]}function m(){const e=o(l);if(!e)throw new Error("useKeyboard must be used inside KeyboardProvider.");return e}function y(){return o(l)}function b(t){const o=e(4),r=m();let i,c;o[0]!==r||o[1]!==t?(i=()=>r.registerShortcut(t),c=[r,t],o[0]=r,o[1]=t,o[2]=i,o[3]=c):(i=o[2],c=o[3]),n(i,c)}function v(e,t){"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),t())}export{d as KeyboardProvider,v as handleKeyboardClick,m as useKeyboard,b as useKeyboardShortcut,y as useOptionalKeyboard};
|
|
@@ -1,11 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { LicenseGate, TMC_ENTITLEMENTS } from "@themodcraft/license-client";
|
|
4
|
-
import { AuthProvider, } from "./auth-provider";
|
|
5
|
-
import { ConfigProvider, } from "./config-provider";
|
|
6
|
-
import { KeyboardProvider, } from "./keyboard-provider";
|
|
7
|
-
import { ThemeProvider, } from "./theme-provider";
|
|
8
|
-
import { UIOverlayProvider, } from "./ui-overlay-provider";
|
|
9
|
-
export function NexusProvider({ auth, children, config, keyboard, overlay, theme, }) {
|
|
10
|
-
return (_jsx(LicenseGate, { required: TMC_ENTITLEMENTS.addonProviders, children: _jsx(ConfigProvider, { ...config, children: _jsx(ThemeProvider, { ...theme, children: _jsx(AuthProvider, { ...auth, children: _jsx(KeyboardProvider, { ...keyboard, children: _jsx(UIOverlayProvider, { ...overlay, children: children }) }) }) }) }) }));
|
|
11
|
-
}
|
|
2
|
+
import{c as r}from"react/compiler-runtime";import{LicenseGate as e,TMC_ENTITLEMENTS as o}from"@themodcraft/license-client";import{AuthProvider as i}from"./auth-provider.js";import{ConfigProvider as t}from"./config-provider.js";import{KeyboardProvider as m}from"./keyboard-provider.js";import{ThemeProvider as d}from"./theme-provider.js";import{UIOverlayProvider as n}from"./ui-overlay-provider.js";import{jsx as c}from"react/jsx-runtime";function p(p){const l=r(15),{auth:f,children:h,config:a,keyboard:s,overlay:u,theme:v}=p;let j,y,b,g,k;return l[0]!==h||l[1]!==u?(j=c(n,{...u,children:h}),l[0]=h,l[1]=u,l[2]=j):j=l[2],l[3]!==s||l[4]!==j?(y=c(m,{...s,children:j}),l[3]=s,l[4]=j,l[5]=y):y=l[5],l[6]!==f||l[7]!==y?(b=c(i,{...f,children:y}),l[6]=f,l[7]=y,l[8]=b):b=l[8],l[9]!==b||l[10]!==v?(g=c(d,{...v,children:b}),l[9]=b,l[10]=v,l[11]=g):g=l[11],l[12]!==a||l[13]!==g?(k=c(e,{required:o.addonProviders,children:c(t,{...a,children:g})}),l[12]=a,l[13]=g,l[14]=k):k=l[14],k}export{p as NexusProvider};
|
|
@@ -1,131 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from "react";
|
|
4
|
-
const ThemeContext = createContext(null);
|
|
5
|
-
const themeModeEventName = "tmc:nexus-theme-mode";
|
|
6
|
-
const themeIdEventName = "tmc:nexus-theme-id";
|
|
7
|
-
function toCssVariableName(tokenName) {
|
|
8
|
-
if (tokenName.startsWith("--")) {
|
|
9
|
-
return tokenName;
|
|
10
|
-
}
|
|
11
|
-
return `--tmc-${tokenName.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`).replace(/[_\s]+/g, "-")}`;
|
|
12
|
-
}
|
|
13
|
-
function setRootAttribute(name, value) {
|
|
14
|
-
if (!value) {
|
|
15
|
-
document.documentElement.removeAttribute(name);
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
document.documentElement.setAttribute(name, value);
|
|
19
|
-
}
|
|
20
|
-
export function ThemeProvider({ children, defaultMode = "system", defaultThemeId, storageKey, themes = [], }) {
|
|
21
|
-
const initialThemeId = defaultThemeId ?? themes[0]?.id ?? "default";
|
|
22
|
-
const [themeId, setThemeIdState] = useState(initialThemeId);
|
|
23
|
-
const [mode, setModeState] = useState(defaultMode);
|
|
24
|
-
const activeTheme = themes.find((theme) => theme.id === themeId) ?? themes[0];
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
if (!storageKey) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
const storedThemeId = window.localStorage.getItem(`${storageKey}:theme`);
|
|
30
|
-
const storedMode = window.localStorage.getItem(`${storageKey}:mode`);
|
|
31
|
-
if (storedThemeId) {
|
|
32
|
-
setThemeIdState(storedThemeId);
|
|
33
|
-
}
|
|
34
|
-
if (storedMode === "light" || storedMode === "dark" || storedMode === "system") {
|
|
35
|
-
setModeState(storedMode);
|
|
36
|
-
}
|
|
37
|
-
}, [storageKey]);
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
if (!storageKey) {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
function handleStorage(event) {
|
|
43
|
-
if (event.key === `${storageKey}:theme` && event.newValue) {
|
|
44
|
-
setThemeIdState(event.newValue);
|
|
45
|
-
}
|
|
46
|
-
if (event.key === `${storageKey}:mode` &&
|
|
47
|
-
(event.newValue === "light" || event.newValue === "dark" || event.newValue === "system")) {
|
|
48
|
-
setModeState(event.newValue);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
function handleThemeMode(event) {
|
|
52
|
-
const nextMode = event.detail?.mode;
|
|
53
|
-
if (nextMode === "light" || nextMode === "dark" || nextMode === "system") {
|
|
54
|
-
setModeState(nextMode);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
function handleThemeId(event) {
|
|
58
|
-
const nextThemeId = event.detail?.themeId;
|
|
59
|
-
if (nextThemeId) {
|
|
60
|
-
setThemeIdState(nextThemeId);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
window.addEventListener("storage", handleStorage);
|
|
64
|
-
window.addEventListener(themeModeEventName, handleThemeMode);
|
|
65
|
-
window.addEventListener(themeIdEventName, handleThemeId);
|
|
66
|
-
return () => {
|
|
67
|
-
window.removeEventListener("storage", handleStorage);
|
|
68
|
-
window.removeEventListener(themeModeEventName, handleThemeMode);
|
|
69
|
-
window.removeEventListener(themeIdEventName, handleThemeId);
|
|
70
|
-
};
|
|
71
|
-
}, [storageKey]);
|
|
72
|
-
useEffect(() => {
|
|
73
|
-
const root = document.documentElement;
|
|
74
|
-
const appliedVariableNames = [];
|
|
75
|
-
setRootAttribute("data-tmc-theme", activeTheme?.id);
|
|
76
|
-
setRootAttribute("data-tmc-theme-mode", mode);
|
|
77
|
-
if (activeTheme?.className) {
|
|
78
|
-
root.classList.add(activeTheme.className);
|
|
79
|
-
}
|
|
80
|
-
if (activeTheme?.colorScheme) {
|
|
81
|
-
root.style.colorScheme = activeTheme.colorScheme;
|
|
82
|
-
}
|
|
83
|
-
Object.entries(activeTheme?.cssVariables ?? {}).forEach(([name, value]) => {
|
|
84
|
-
const variableName = toCssVariableName(name);
|
|
85
|
-
appliedVariableNames.push(variableName);
|
|
86
|
-
root.style.setProperty(variableName, String(value));
|
|
87
|
-
});
|
|
88
|
-
return () => {
|
|
89
|
-
appliedVariableNames.forEach((name) => root.style.removeProperty(name));
|
|
90
|
-
if (activeTheme?.className) {
|
|
91
|
-
root.classList.remove(activeTheme.className);
|
|
92
|
-
}
|
|
93
|
-
if (activeTheme?.colorScheme) {
|
|
94
|
-
root.style.removeProperty("color-scheme");
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
}, [activeTheme, mode]);
|
|
98
|
-
const setThemeId = useCallback((nextThemeId) => {
|
|
99
|
-
setThemeIdState(nextThemeId);
|
|
100
|
-
if (storageKey) {
|
|
101
|
-
window.localStorage.setItem(`${storageKey}:theme`, nextThemeId);
|
|
102
|
-
window.dispatchEvent(new CustomEvent(themeIdEventName, { detail: { themeId: nextThemeId } }));
|
|
103
|
-
}
|
|
104
|
-
}, [storageKey]);
|
|
105
|
-
const setMode = useCallback((nextMode) => {
|
|
106
|
-
setModeState(nextMode);
|
|
107
|
-
if (storageKey) {
|
|
108
|
-
window.localStorage.setItem(`${storageKey}:mode`, nextMode);
|
|
109
|
-
window.dispatchEvent(new CustomEvent(themeModeEventName, { detail: { mode: nextMode } }));
|
|
110
|
-
}
|
|
111
|
-
}, [storageKey]);
|
|
112
|
-
const value = useMemo(() => ({
|
|
113
|
-
activeTheme,
|
|
114
|
-
mode,
|
|
115
|
-
setMode,
|
|
116
|
-
setThemeId,
|
|
117
|
-
themeId,
|
|
118
|
-
themes,
|
|
119
|
-
}), [activeTheme, mode, setMode, setThemeId, themeId, themes]);
|
|
120
|
-
return _jsx(ThemeContext.Provider, { value: value, children: children });
|
|
121
|
-
}
|
|
122
|
-
export function useTheme() {
|
|
123
|
-
const context = useContext(ThemeContext);
|
|
124
|
-
if (!context) {
|
|
125
|
-
throw new Error("useTheme must be used inside ThemeProvider.");
|
|
126
|
-
}
|
|
127
|
-
return context;
|
|
128
|
-
}
|
|
129
|
-
export function useOptionalTheme() {
|
|
130
|
-
return useContext(ThemeContext);
|
|
131
|
-
}
|
|
2
|
+
import{c as e}from"react/compiler-runtime";import{useState as t,useEffect as o,useContext as n,createContext as r}from"react";import{jsx as s}from"react/jsx-runtime";const m=r(null),d="tmc:nexus-theme-mode",c="tmc:nexus-theme-id";function i(e,t){t?document.documentElement.setAttribute(e,t):document.documentElement.removeAttribute(e)}function a(n){const r=e(29),{children:a,defaultMode:l,defaultThemeId:u,storageKey:w,themes:h}=n,v=void 0===l?"system":l;let f;r[0]!==h?(f=void 0===h?[]:h,r[0]=h,r[1]=f):f=r[1];const E=f,g=u??E[0]?.id??"default",[y,p]=t(g),[I,L]=t(v);let S;r[2]!==y||r[3]!==E?(S=E.find(e=>e.id===y)??E[0],r[2]=y,r[3]=E,r[4]=S):S=r[4];const $=S;let V,b,k,P,T,x,N;r[5]!==w?(V=()=>{if(!w)return;const e=window.localStorage.getItem(`${w}:theme`),t=window.localStorage.getItem(`${w}:mode`);e&&p(e),"light"!==t&&"dark"!==t&&"system"!==t||L(t)},b=[w],r[5]=w,r[6]=V,r[7]=b):(V=r[6],b=r[7]),o(V,b),r[8]!==w?(k=()=>{if(!w)return;const e=function(e){e.key===`${w}:theme`&&e.newValue&&p(e.newValue),e.key!==`${w}:mode`||"light"!==e.newValue&&"dark"!==e.newValue&&"system"!==e.newValue||L(e.newValue)},t=function(e){const t=e.detail?.mode;"light"!==t&&"dark"!==t&&"system"!==t||L(t)},o=function(e){const t=e.detail?.themeId;t&&p(t)};return window.addEventListener("storage",e),window.addEventListener(d,t),window.addEventListener(c,o),()=>{window.removeEventListener("storage",e),window.removeEventListener(d,t),window.removeEventListener(c,o)}},P=[w],r[8]=w,r[9]=k,r[10]=P):(k=r[9],P=r[10]),o(k,P),r[11]!==$||r[12]!==I?(x=()=>{const e=document.documentElement,t=[];return i("data-tmc-theme",$?.id),i("data-tmc-theme-mode",I),$?.className&&e.classList.add($.className),$?.colorScheme&&(e.style.colorScheme=$.colorScheme),Object.entries($?.cssVariables??{}).forEach(o=>{const[n,r]=o,s=(m=n).startsWith("--")?m:`--tmc-${m.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`).replace(/[_\s]+/g,"-")}`;var m;t.push(s),e.style.setProperty(s,String(r))}),()=>{t.forEach(t=>e.style.removeProperty(t)),$?.className&&e.classList.remove($.className),$?.colorScheme&&e.style.removeProperty("color-scheme")}},T=[$,I],r[11]=$,r[12]=I,r[13]=T,r[14]=x):(T=r[13],x=r[14]),o(x,T),r[15]!==w?(N=e=>{p(e),w&&(window.localStorage.setItem(`${w}:theme`,e),window.dispatchEvent(new CustomEvent(c,{detail:{themeId:e}})))},r[15]=w,r[16]=N):N=r[16];const A=N;let C;r[17]!==w?(C=e=>{L(e),w&&(window.localStorage.setItem(`${w}:mode`,e),window.dispatchEvent(new CustomEvent(d,{detail:{mode:e}})))},r[17]=w,r[18]=C):C=r[18];const j=C;let M;r[19]!==$||r[20]!==I||r[21]!==j||r[22]!==A||r[23]!==y||r[24]!==E?(M={activeTheme:$,mode:I,setMode:j,setThemeId:A,themeId:y,themes:E},r[19]=$,r[20]=I,r[21]=j,r[22]=A,r[23]=y,r[24]=E,r[25]=M):M=r[25];const K=M;let O;return r[26]!==a||r[27]!==K?(O=s(m.Provider,{value:K,children:a}),r[26]=a,r[27]=K,r[28]=O):O=r[28],O}function l(){const e=n(m);if(!e)throw new Error("useTheme must be used inside ThemeProvider.");return e}function u(){return n(m)}export{a as ThemeProvider,u as useOptionalTheme,l as useTheme};
|
|
@@ -1,36 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { createContext, useCallback, useContext, useMemo, useState, } from "react";
|
|
4
|
-
const UIOverlayContext = createContext(null);
|
|
5
|
-
export function UIOverlayProvider({ children }) {
|
|
6
|
-
const [openOverlayIds, setOpenOverlayIds] = useState([]);
|
|
7
|
-
const openOverlay = useCallback((id) => {
|
|
8
|
-
setOpenOverlayIds((current) => (current.includes(id) ? current : [...current, id]));
|
|
9
|
-
}, []);
|
|
10
|
-
const closeOverlay = useCallback((id) => {
|
|
11
|
-
setOpenOverlayIds((current) => current.filter((currentId) => currentId !== id));
|
|
12
|
-
}, []);
|
|
13
|
-
const toggleOverlay = useCallback((id) => {
|
|
14
|
-
setOpenOverlayIds((current) => (current.includes(id)
|
|
15
|
-
? current.filter((currentId) => currentId !== id)
|
|
16
|
-
: [...current, id]));
|
|
17
|
-
}, []);
|
|
18
|
-
const value = useMemo(() => ({
|
|
19
|
-
closeOverlay,
|
|
20
|
-
isOverlayOpen: (id) => openOverlayIds.includes(id),
|
|
21
|
-
openOverlay,
|
|
22
|
-
openOverlayIds,
|
|
23
|
-
toggleOverlay,
|
|
24
|
-
}), [closeOverlay, openOverlay, openOverlayIds, toggleOverlay]);
|
|
25
|
-
return _jsx(UIOverlayContext.Provider, { value: value, children: children });
|
|
26
|
-
}
|
|
27
|
-
export function useUIOverlay() {
|
|
28
|
-
const context = useContext(UIOverlayContext);
|
|
29
|
-
if (!context) {
|
|
30
|
-
throw new Error("useUIOverlay must be used inside UIOverlayProvider.");
|
|
31
|
-
}
|
|
32
|
-
return context;
|
|
33
|
-
}
|
|
34
|
-
export function useOptionalUIOverlay() {
|
|
35
|
-
return useContext(UIOverlayContext);
|
|
36
|
-
}
|
|
2
|
+
import{c as e}from"react/compiler-runtime";import{useState as r,useContext as t,createContext as o}from"react";import{jsx as n}from"react/jsx-runtime";const l=o(null);function c(t){const o=e(12),{children:c}=t;let i;o[0]===Symbol.for("react.memo_cache_sentinel")?(i=[],o[0]=i):i=o[0];const[s,m]=r(i);let a;o[1]===Symbol.for("react.memo_cache_sentinel")?(a=e=>{m(r=>r.includes(e)?r:[...r,e])},o[1]=a):a=o[1];const u=a;let f;o[2]===Symbol.for("react.memo_cache_sentinel")?(f=e=>{m(r=>r.filter(r=>r!==e))},o[2]=f):f=o[2];const y=f;let d;o[3]===Symbol.for("react.memo_cache_sentinel")?(d=e=>{m(r=>r.includes(e)?r.filter(r=>r!==e):[...r,e])},o[3]=d):d=o[3];const v=d;let p,O;o[4]!==s?(p=e=>s.includes(e),o[4]=s,o[5]=p):p=o[5],o[6]!==s||o[7]!==p?(O={closeOverlay:y,isOverlayOpen:p,openOverlay:u,openOverlayIds:s,toggleOverlay:v},o[6]=s,o[7]=p,o[8]=O):O=o[8];const _=O;let h;return o[9]!==c||o[10]!==_?(h=n(l.Provider,{value:_,children:c}),o[9]=c,o[10]=_,o[11]=h):h=o[11],h}function i(){const e=t(l);if(!e)throw new Error("useUIOverlay must be used inside UIOverlayProvider.");return e}function s(){return t(l)}export{c as UIOverlayProvider,s as useOptionalUIOverlay,i as useUIOverlay};
|
package/dist/theme/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export{themodcraftV3ThemeProviderPreset}from"../index.js";
|
package/package.json
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@themodcraft/addon-providers",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
7
|
"type": "module",
|
|
8
|
-
"files": [
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
9
11
|
"exports": {
|
|
10
12
|
".": {
|
|
11
13
|
"types": "./dist/index.d.ts",
|
|
@@ -34,8 +36,8 @@
|
|
|
34
36
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
35
37
|
},
|
|
36
38
|
"dependencies": {
|
|
37
|
-
"@themodcraft/addon-integrations": "1.1.
|
|
38
|
-
"@themodcraft/license-client": "1.1.
|
|
39
|
+
"@themodcraft/addon-integrations": "1.1.2",
|
|
40
|
+
"@themodcraft/license-client": "1.1.2"
|
|
39
41
|
},
|
|
40
42
|
"peerDependencies": {
|
|
41
43
|
"react": "^19.0.0",
|