@almadar/ui 1.0.1 → 1.0.10

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.
@@ -1,344 +1,10 @@
1
- import { createContext, useMemo, useContext, useState, useEffect, useCallback, useRef } from 'react';
1
+ export { DesignThemeProvider, useDesignTheme } from '../chunk-4FRUCUO5.js';
2
+ export { BUILT_IN_THEMES, ThemeContext_default as ThemeContext, ThemeProvider, UISlotContext, UISlotProvider, useSlotContent, useSlotHasContent, useTheme, useUISlots } from '../chunk-I5RSZIOE.js';
3
+ import '../chunk-7NEWMNNU.js';
4
+ import '../chunk-S7EYY36U.js';
5
+ import { createContext, useCallback, useMemo, useContext } from 'react';
2
6
  import { jsx } from 'react/jsx-runtime';
3
7
 
4
- // context/UISlotContext.tsx
5
- var DEFAULT_SLOTS = {
6
- main: null,
7
- sidebar: null,
8
- modal: null,
9
- drawer: null,
10
- overlay: null,
11
- center: null,
12
- toast: null,
13
- "hud-top": null,
14
- "hud-bottom": null,
15
- floating: null
16
- };
17
- var idCounter = 0;
18
- function generateId() {
19
- return `slot-content-${++idCounter}-${Date.now()}`;
20
- }
21
- function useUISlotManager() {
22
- const [slots, setSlots] = useState(DEFAULT_SLOTS);
23
- const subscribersRef = useRef(/* @__PURE__ */ new Set());
24
- const timersRef = useRef(/* @__PURE__ */ new Map());
25
- useEffect(() => {
26
- return () => {
27
- timersRef.current.forEach((timer) => clearTimeout(timer));
28
- timersRef.current.clear();
29
- };
30
- }, []);
31
- const notifySubscribers = useCallback((slot, content) => {
32
- subscribersRef.current.forEach((callback) => {
33
- try {
34
- callback(slot, content);
35
- } catch (error) {
36
- console.error("[UISlots] Subscriber error:", error);
37
- }
38
- });
39
- }, []);
40
- const render = useCallback((config) => {
41
- const id = generateId();
42
- const content = {
43
- id,
44
- pattern: config.pattern,
45
- props: config.props ?? {},
46
- priority: config.priority ?? 0,
47
- animation: config.animation ?? "fade",
48
- onDismiss: config.onDismiss,
49
- sourceTrait: config.sourceTrait
50
- };
51
- if (config.autoDismissMs && config.autoDismissMs > 0) {
52
- content.autoDismissAt = Date.now() + config.autoDismissMs;
53
- const timer = setTimeout(() => {
54
- setSlots((prev) => {
55
- if (prev[config.target]?.id === id) {
56
- content.onDismiss?.();
57
- notifySubscribers(config.target, null);
58
- return { ...prev, [config.target]: null };
59
- }
60
- return prev;
61
- });
62
- timersRef.current.delete(id);
63
- }, config.autoDismissMs);
64
- timersRef.current.set(id, timer);
65
- }
66
- setSlots((prev) => {
67
- const existing = prev[config.target];
68
- if (existing && existing.priority > content.priority) {
69
- console.warn(
70
- `[UISlots] Slot "${config.target}" already has higher priority content (${existing.priority} > ${content.priority})`
71
- );
72
- return prev;
73
- }
74
- notifySubscribers(config.target, content);
75
- return { ...prev, [config.target]: content };
76
- });
77
- return id;
78
- }, [notifySubscribers]);
79
- const clear = useCallback((slot) => {
80
- setSlots((prev) => {
81
- const content = prev[slot];
82
- if (content) {
83
- const timer = timersRef.current.get(content.id);
84
- if (timer) {
85
- clearTimeout(timer);
86
- timersRef.current.delete(content.id);
87
- }
88
- content.onDismiss?.();
89
- notifySubscribers(slot, null);
90
- }
91
- return { ...prev, [slot]: null };
92
- });
93
- }, [notifySubscribers]);
94
- const clearById = useCallback((id) => {
95
- setSlots((prev) => {
96
- const entry = Object.entries(prev).find(([, content]) => content?.id === id);
97
- if (entry) {
98
- const [slot, content] = entry;
99
- const timer = timersRef.current.get(id);
100
- if (timer) {
101
- clearTimeout(timer);
102
- timersRef.current.delete(id);
103
- }
104
- content.onDismiss?.();
105
- notifySubscribers(slot, null);
106
- return { ...prev, [slot]: null };
107
- }
108
- return prev;
109
- });
110
- }, [notifySubscribers]);
111
- const clearAll = useCallback(() => {
112
- timersRef.current.forEach((timer) => clearTimeout(timer));
113
- timersRef.current.clear();
114
- setSlots((prev) => {
115
- Object.entries(prev).forEach(([slot, content]) => {
116
- if (content) {
117
- content.onDismiss?.();
118
- notifySubscribers(slot, null);
119
- }
120
- });
121
- return DEFAULT_SLOTS;
122
- });
123
- }, [notifySubscribers]);
124
- const subscribe = useCallback((callback) => {
125
- subscribersRef.current.add(callback);
126
- return () => {
127
- subscribersRef.current.delete(callback);
128
- };
129
- }, []);
130
- const hasContent = useCallback((slot) => {
131
- return slots[slot] !== null;
132
- }, [slots]);
133
- const getContent = useCallback((slot) => {
134
- return slots[slot];
135
- }, [slots]);
136
- return {
137
- slots,
138
- render,
139
- clear,
140
- clearById,
141
- clearAll,
142
- subscribe,
143
- hasContent,
144
- getContent
145
- };
146
- }
147
- var UISlotContext = createContext(null);
148
- function UISlotProvider({ children }) {
149
- const slotManager = useUISlotManager();
150
- const contextValue = useMemo(() => slotManager, [slotManager]);
151
- return /* @__PURE__ */ jsx(UISlotContext.Provider, { value: contextValue, children });
152
- }
153
- function useUISlots() {
154
- const context = useContext(UISlotContext);
155
- if (!context) {
156
- throw new Error(
157
- "useUISlots must be used within a UISlotProvider. Make sure your component tree is wrapped with <UISlotProvider>."
158
- );
159
- }
160
- return context;
161
- }
162
- function useSlotContent(slot) {
163
- const { getContent } = useUISlots();
164
- return getContent(slot);
165
- }
166
- function useSlotHasContent(slot) {
167
- const { hasContent } = useUISlots();
168
- return hasContent(slot);
169
- }
170
- var BUILT_IN_THEMES = [
171
- {
172
- name: "wireframe",
173
- displayName: "Wireframe",
174
- hasLightMode: true,
175
- hasDarkMode: true
176
- },
177
- {
178
- name: "minimalist",
179
- displayName: "Minimalist",
180
- hasLightMode: true,
181
- hasDarkMode: true
182
- },
183
- {
184
- name: "almadar",
185
- displayName: "Almadar",
186
- hasLightMode: true,
187
- hasDarkMode: true
188
- }
189
- ];
190
- var ThemeContext = createContext(void 0);
191
- var THEME_STORAGE_KEY = "theme";
192
- var MODE_STORAGE_KEY = "theme-mode";
193
- function getSystemMode() {
194
- if (typeof window === "undefined") return "light";
195
- return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
196
- }
197
- function resolveMode(mode) {
198
- if (mode === "system") {
199
- return getSystemMode();
200
- }
201
- return mode;
202
- }
203
- var ThemeProvider = ({
204
- children,
205
- themes = [],
206
- defaultTheme = "wireframe",
207
- defaultMode = "system"
208
- }) => {
209
- const availableThemes = useMemo(() => {
210
- const themeMap = /* @__PURE__ */ new Map();
211
- BUILT_IN_THEMES.forEach((t) => themeMap.set(t.name, t));
212
- themes.forEach((t) => themeMap.set(t.name, t));
213
- return Array.from(themeMap.values());
214
- }, [themes]);
215
- const [theme, setThemeState] = useState(() => {
216
- if (typeof window === "undefined") return defaultTheme;
217
- const stored = localStorage.getItem(THEME_STORAGE_KEY);
218
- const validThemes = [
219
- ...BUILT_IN_THEMES.map((t) => t.name),
220
- ...themes.map((t) => t.name)
221
- ];
222
- if (stored && validThemes.includes(stored)) {
223
- return stored;
224
- }
225
- return defaultTheme;
226
- });
227
- const [mode, setModeState] = useState(() => {
228
- if (typeof window === "undefined") return defaultMode;
229
- const stored = localStorage.getItem(MODE_STORAGE_KEY);
230
- if (stored === "light" || stored === "dark" || stored === "system") {
231
- return stored;
232
- }
233
- return defaultMode;
234
- });
235
- const [resolvedMode, setResolvedMode] = useState(
236
- () => resolveMode(mode)
237
- );
238
- const appliedTheme = useMemo(
239
- () => `${theme}-${resolvedMode}`,
240
- [theme, resolvedMode]
241
- );
242
- useEffect(() => {
243
- const updateResolved = () => {
244
- setResolvedMode(resolveMode(mode));
245
- };
246
- updateResolved();
247
- if (mode === "system") {
248
- const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
249
- const handleChange = () => updateResolved();
250
- mediaQuery.addEventListener("change", handleChange);
251
- return () => mediaQuery.removeEventListener("change", handleChange);
252
- }
253
- return void 0;
254
- }, [mode]);
255
- useEffect(() => {
256
- const root = document.documentElement;
257
- root.setAttribute("data-theme", appliedTheme);
258
- root.classList.remove("light", "dark");
259
- root.classList.add(resolvedMode);
260
- }, [appliedTheme, resolvedMode]);
261
- const setTheme = useCallback(
262
- (newTheme) => {
263
- const validTheme = availableThemes.find((t) => t.name === newTheme);
264
- if (validTheme) {
265
- setThemeState(newTheme);
266
- if (typeof window !== "undefined") {
267
- localStorage.setItem(THEME_STORAGE_KEY, newTheme);
268
- }
269
- } else {
270
- console.warn(
271
- `Theme "${newTheme}" not found. Available: ${availableThemes.map((t) => t.name).join(", ")}`
272
- );
273
- }
274
- },
275
- [availableThemes]
276
- );
277
- const setMode = useCallback((newMode) => {
278
- setModeState(newMode);
279
- if (typeof window !== "undefined") {
280
- localStorage.setItem(MODE_STORAGE_KEY, newMode);
281
- }
282
- }, []);
283
- const toggleMode = useCallback(() => {
284
- const newMode = resolvedMode === "dark" ? "light" : "dark";
285
- setMode(newMode);
286
- }, [resolvedMode, setMode]);
287
- const contextValue = useMemo(
288
- () => ({
289
- theme,
290
- mode,
291
- resolvedMode,
292
- setTheme,
293
- setMode,
294
- toggleMode,
295
- availableThemes,
296
- appliedTheme
297
- }),
298
- [
299
- theme,
300
- mode,
301
- resolvedMode,
302
- setTheme,
303
- setMode,
304
- toggleMode,
305
- availableThemes,
306
- appliedTheme
307
- ]
308
- );
309
- return /* @__PURE__ */ jsx(ThemeContext.Provider, { value: contextValue, children });
310
- };
311
- function useTheme() {
312
- const context = useContext(ThemeContext);
313
- if (context === void 0) {
314
- return {
315
- theme: "wireframe",
316
- mode: "light",
317
- resolvedMode: "light",
318
- setTheme: () => {
319
- },
320
- setMode: () => {
321
- },
322
- toggleMode: () => {
323
- },
324
- availableThemes: BUILT_IN_THEMES,
325
- appliedTheme: "wireframe-light"
326
- };
327
- }
328
- return context;
329
- }
330
- var ThemeContext_default = ThemeContext;
331
-
332
- // context/DesignThemeContext.tsx
333
- var DesignThemeProvider = ThemeProvider;
334
- function useDesignTheme() {
335
- const { theme, setTheme, availableThemes } = useTheme();
336
- return {
337
- designTheme: theme,
338
- setDesignTheme: setTheme,
339
- availableThemes: availableThemes.map((t) => t.name)
340
- };
341
- }
342
8
  var ANONYMOUS_USER = {
343
9
  id: "anonymous",
344
10
  role: "anonymous",
@@ -438,6 +104,4 @@ function useUserForEvaluation() {
438
104
  return isLoggedIn && user ? user : void 0;
439
105
  }
440
106
 
441
- export { ANONYMOUS_USER, BUILT_IN_THEMES, DesignThemeProvider, ThemeContext_default as ThemeContext, ThemeProvider, UISlotContext, UISlotProvider, UserContext, UserProvider, useDesignTheme, useHasPermission, useHasRole, useSlotContent, useSlotHasContent, useTheme, useUISlots, useUser, useUserForEvaluation };
442
- //# sourceMappingURL=index.js.map
443
- //# sourceMappingURL=index.js.map
107
+ export { ANONYMOUS_USER, UserContext, UserProvider, useHasPermission, useHasRole, useUser, useUserForEvaluation };
@@ -1008,4 +1008,68 @@ interface AuthContextValue {
1008
1008
  */
1009
1009
  declare function useAuthContext(): AuthContextValue;
1010
1010
 
1011
- export { type AuthContextValue, type AuthUser, type ChangeSummary, type CompileResult, type CompileStage, ENTITY_EVENTS, Entity, type EntityDataRecord, type EntityMutationResult, EventBusContextType, EventListener, type Extension, type ExtensionManifest, type FileSystemFile, type FileSystemStatus, type HistoryTimelineItem, type OpenFile, type OrbitalEventPayload, type OrbitalEventResponse, type QuerySingletonEntity, type QuerySingletonResult, type QuerySingletonState, type QueryState, type RevertResult, type SelectedFile, type UseCompileResult, type UseEntityDetailResult, type UseEntityListOptions, type UseEntityListResult, type UseEntityMutationsOptions, type UseExtensionsOptions, type UseExtensionsResult, type UseFileEditorOptions, type UseFileEditorResult, type UseFileSystemResult, type UseOrbitalHistoryOptions, type UseOrbitalHistoryResult, clearEntities, entityDataKeys, getAllEntities, getByType, getEntity, getSingleton, parseQueryBinding, removeEntity, spawnEntity, updateEntity, updateSingleton, useAgentChat, useAuthContext, useCompile, useCreateEntity, useDeepAgentGeneration, useDeleteEntity, useEmitEvent, useEntities, useEntitiesByType, useEntity$1 as useEntity, useEntity as useEntityById, useEntityDetail, useEntityList, useEntityMutations, useEventBus, useEventListener, useExtensions, useFileEditor, useFileSystem, useInput, useOrbitalHistory, useOrbitalMutations, usePhysics, usePlayer, usePreview, useQuerySingleton, useSelectedEntity, useSendOrbitalEvent, useSingletonEntity, useUIEvents, useUpdateEntity, useValidation };
1011
+ /**
1012
+ * GitHub Integration Hooks
1013
+ *
1014
+ * React hooks for GitHub OAuth and repository management.
1015
+ */
1016
+ /**
1017
+ * GitHub connection status
1018
+ */
1019
+ interface GitHubStatus {
1020
+ connected: boolean;
1021
+ username?: string;
1022
+ avatarUrl?: string;
1023
+ scopes?: string[];
1024
+ connectedAt?: number;
1025
+ lastUsedAt?: number;
1026
+ }
1027
+ /**
1028
+ * GitHub repository
1029
+ */
1030
+ interface GitHubRepo {
1031
+ id: number;
1032
+ name: string;
1033
+ fullName: string;
1034
+ owner: string;
1035
+ isPrivate: boolean;
1036
+ description: string | null;
1037
+ defaultBranch: string;
1038
+ url: string;
1039
+ }
1040
+ /**
1041
+ * Hook to get GitHub connection status
1042
+ */
1043
+ declare function useGitHubStatus(): _tanstack_react_query.UseQueryResult<GitHubStatus, Error>;
1044
+ /**
1045
+ * Hook to connect GitHub (initiate OAuth flow)
1046
+ */
1047
+ declare function useConnectGitHub(): {
1048
+ connectGitHub: () => void;
1049
+ };
1050
+ /**
1051
+ * Hook to disconnect GitHub
1052
+ */
1053
+ declare function useDisconnectGitHub(): _tanstack_react_query.UseMutationResult<unknown, Error, void, unknown>;
1054
+ /**
1055
+ * Hook to list GitHub repositories
1056
+ */
1057
+ declare function useGitHubRepos(page?: number, perPage?: number): _tanstack_react_query.UseQueryResult<{
1058
+ repos: GitHubRepo[];
1059
+ page: number;
1060
+ perPage: number;
1061
+ }, Error>;
1062
+ /**
1063
+ * Hook to get repository details
1064
+ */
1065
+ declare function useGitHubRepo(owner: string, repo: string, enabled?: boolean): _tanstack_react_query.UseQueryResult<{
1066
+ repo: GitHubRepo;
1067
+ }, Error>;
1068
+ /**
1069
+ * Hook to list repository branches
1070
+ */
1071
+ declare function useGitHubBranches(owner: string, repo: string, enabled?: boolean): _tanstack_react_query.UseQueryResult<{
1072
+ branches: string[];
1073
+ }, Error>;
1074
+
1075
+ export { type AuthContextValue, type AuthUser, type ChangeSummary, type CompileResult, type CompileStage, ENTITY_EVENTS, Entity, type EntityDataRecord, type EntityMutationResult, EventBusContextType, EventListener, type Extension, type ExtensionManifest, type FileSystemFile, type FileSystemStatus, type GitHubRepo, type GitHubStatus, type HistoryTimelineItem, type OpenFile, type OrbitalEventPayload, type OrbitalEventResponse, type QuerySingletonEntity, type QuerySingletonResult, type QuerySingletonState, type QueryState, type RevertResult, type SelectedFile, type UseCompileResult, type UseEntityDetailResult, type UseEntityListOptions, type UseEntityListResult, type UseEntityMutationsOptions, type UseExtensionsOptions, type UseExtensionsResult, type UseFileEditorOptions, type UseFileEditorResult, type UseFileSystemResult, type UseOrbitalHistoryOptions, type UseOrbitalHistoryResult, clearEntities, entityDataKeys, getAllEntities, getByType, getEntity, getSingleton, parseQueryBinding, removeEntity, spawnEntity, updateEntity, updateSingleton, useAgentChat, useAuthContext, useCompile, useConnectGitHub, useCreateEntity, useDeepAgentGeneration, useDeleteEntity, useDisconnectGitHub, useEmitEvent, useEntities, useEntitiesByType, useEntity$1 as useEntity, useEntity as useEntityById, useEntityDetail, useEntityList, useEntityMutations, useEventBus, useEventListener, useExtensions, useFileEditor, useFileSystem, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useInput, useOrbitalHistory, useOrbitalMutations, usePhysics, usePlayer, usePreview, useQuerySingleton, useSelectedEntity, useSendOrbitalEvent, useSingletonEntity, useUIEvents, useUpdateEntity, useValidation };