ssovee-os-web-ui 0.1.21 → 0.1.23

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/sdk.cjs ADDED
@@ -0,0 +1,265 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var uaParserJs = require('ua-parser-js');
5
+
6
+ // src/hooks/useDeviceSupport.tsx
7
+ var useDeviceSupport = () => {
8
+ const [isSupported, setIsSupported] = react.useState(true);
9
+ react.useEffect(() => {
10
+ function checkSupport() {
11
+ const ua = typeof window !== "undefined" ? window.navigator.userAgent : "";
12
+ const width = typeof window !== "undefined" ? window.innerWidth : 1920;
13
+ const height = typeof window !== "undefined" ? window.innerHeight : 1080;
14
+ const isTouch = typeof window !== "undefined" ? "ontouchstart" in window : false;
15
+ const isMobile = /Mobi|Android|iPhone|iPod/.test(ua) && width <= 767;
16
+ const isTablet = /iPad|Tablet|Android/.test(ua) && !/Mobile/.test(ua) || isTouch && width >= 600 && width <= 1024;
17
+ const isTabletPortrait = isTablet && width < height;
18
+ const isTabletLandscape = isTablet && width > height && width >= 1024 && width <= 1366;
19
+ const isLaptop = width >= 1024 && !isMobile && (!isTablet || isTabletLandscape);
20
+ if (isMobile) {
21
+ setIsSupported(false);
22
+ } else if (isTabletPortrait) {
23
+ setIsSupported(false);
24
+ } else if (isTabletLandscape) {
25
+ setIsSupported(true);
26
+ } else if (isLaptop) {
27
+ setIsSupported(true);
28
+ } else {
29
+ setIsSupported(true);
30
+ }
31
+ }
32
+ checkSupport();
33
+ window.addEventListener("resize", checkSupport);
34
+ return () => window.removeEventListener("resize", checkSupport);
35
+ }, []);
36
+ return isSupported;
37
+ };
38
+ var soundMap = {
39
+ click: "/sounds/click-tone.wav",
40
+ alert: "/sounds/error-tone.wav",
41
+ notification: "/sounds/notification-tone.wav",
42
+ error: "/sounds/error-tone.wav",
43
+ success: "/sounds/success-tone.wav",
44
+ swipe: "/sounds/swipe-tone.wav"
45
+ };
46
+ var useSound = () => {
47
+ const playSound = react.useCallback((type) => {
48
+ if (typeof window === "undefined" || typeof window.Audio === "undefined") {
49
+ return;
50
+ }
51
+ const soundSrc = soundMap[type];
52
+ const audio = new window.Audio(soundSrc);
53
+ audio.play().catch((err) => {
54
+ console.error("Sound playback failed:", err);
55
+ });
56
+ }, []);
57
+ return { playSound };
58
+ };
59
+ var useGridClasses = (windowSize, gridRules) => {
60
+ const deviceType = react.useMemo(() => {
61
+ if (windowSize.width <= 640) return "mobile";
62
+ if (windowSize.width <= 1024) return "tablet";
63
+ return "desktop";
64
+ }, [windowSize]);
65
+ const gridClasses = react.useMemo(() => {
66
+ const classes = {};
67
+ for (const element in gridRules) {
68
+ const classRules = gridRules[element];
69
+ const colSpan = classRules["col-span"][deviceType];
70
+ classes[element] = `col-span-${deviceType}-${colSpan}`;
71
+ }
72
+ return classes;
73
+ }, [deviceType, gridRules]);
74
+ return { gridClasses, deviceType };
75
+ };
76
+ var useGridClasses_default = useGridClasses;
77
+
78
+ // src/utils/constants.ts
79
+ var globalKeyboardShortcuts = [
80
+ {
81
+ command: "toggle_theme",
82
+ shortcut: ["Ctrl", "Shift", "M"],
83
+ usage: "Toggle between light and dark theme"
84
+ },
85
+ {
86
+ command: "app_switcher",
87
+ shortcut: ["Ctrl", "Shift", "S"],
88
+ usage: "Switch between open apps"
89
+ },
90
+ {
91
+ command: "exit_app",
92
+ shortcut: ["Ctrl", "E"],
93
+ usage: "Exit or quit the application"
94
+ },
95
+ {
96
+ command: "maximize_app",
97
+ shortcut: ["Ctrl", "ArrowUp"],
98
+ usage: "Maximize the application window"
99
+ },
100
+ {
101
+ command: "minimize_app",
102
+ shortcut: ["Ctrl", "ArrowDown"],
103
+ usage: "Minimize the application window"
104
+ },
105
+ {
106
+ command: "global_search",
107
+ shortcut: ["Ctrl", "Shift", "K"],
108
+ usage: "Open global search"
109
+ },
110
+ {
111
+ command: "toggle_search_mode",
112
+ shortcut: ["Ctrl", "Shift", "L"],
113
+ usage: "Enable AI and Voice command (start/stop voice input in search)"
114
+ },
115
+ {
116
+ command: "toggle_control_center",
117
+ shortcut: ["Ctrl", "Shift", "O"],
118
+ usage: "Toggle control center panel or drawer"
119
+ },
120
+ {
121
+ command: "arrow_up",
122
+ shortcut: ["ArrowUp"],
123
+ usage: "Navigate up in lists, menus and options"
124
+ },
125
+ {
126
+ command: "arrow_down",
127
+ shortcut: ["ArrowDown"],
128
+ usage: "Navigate down in lists, menus and options"
129
+ },
130
+ {
131
+ command: "escape_button_action",
132
+ shortcut: ["Escape"],
133
+ usage: "Close or go back from any open alert, popup, search, or control center"
134
+ },
135
+ {
136
+ command: "enter_button_action",
137
+ shortcut: ["Enter"],
138
+ usage: "Select or confirm the currently focused item"
139
+ },
140
+ {
141
+ command: "toggle_filters",
142
+ shortcut: ["Ctrl", "Shift", "U"],
143
+ usage: "To open or close filters of any current active app"
144
+ },
145
+ {
146
+ command: "focus_search",
147
+ shortcut: ["Ctrl", "k"],
148
+ usage: "Focus on current app search"
149
+ },
150
+ {
151
+ command: "toggle_all_apps",
152
+ shortcut: ["Ctrl", "Shift", "A"],
153
+ usage: "Toggle showing all available apps and plugins"
154
+ }
155
+ ];
156
+ var keyMap = {
157
+ mac: {
158
+ ctrl: "\u2318",
159
+ alt: "\u2325",
160
+ shift: "\u21E7",
161
+ enter: "\u23CE",
162
+ backspace: "\u232B",
163
+ arrowup: "\u2191",
164
+ arrowdown: "\u2193"
165
+ },
166
+ windows: {
167
+ ctrl: "Ctrl",
168
+ alt: "Alt",
169
+ shift: "Shift",
170
+ enter: "Enter",
171
+ backspace: "Backspace",
172
+ arrowup: "\u2191",
173
+ arrowdown: "\u2193"
174
+ },
175
+ linux: {
176
+ ctrl: "Ctrl",
177
+ alt: "Alt",
178
+ shift: "Shift",
179
+ enter: "Enter",
180
+ backspace: "Backspace",
181
+ arrowup: "\u2191",
182
+ arrowdown: "\u2193"
183
+ }
184
+ };
185
+ var detectOS = () => {
186
+ const parser = new uaParserJs.UAParser();
187
+ const osName = parser.getOS().name?.toLowerCase() || "";
188
+ if (osName.includes("mac")) return "mac";
189
+ if (osName.includes("windows")) return "windows";
190
+ if (osName.includes("linux")) return "linux";
191
+ return "windows";
192
+ };
193
+ var normalizeKey = (key) => key.toLowerCase();
194
+ var matchShortcut = (event, shortcut, os) => {
195
+ const keySet = new Set(shortcut.map(normalizeKey));
196
+ const pressed = [];
197
+ if (os === "mac") {
198
+ if (event.metaKey) pressed.push("ctrl");
199
+ } else {
200
+ if (event.ctrlKey) pressed.push("ctrl");
201
+ }
202
+ if (event.altKey) pressed.push("alt");
203
+ if (event.shiftKey) pressed.push("shift");
204
+ if (event.key && !["Control", "Meta", "Alt", "Shift"].includes(event.key)) {
205
+ pressed.push(normalizeKey(event.key));
206
+ }
207
+ if (pressed.length !== shortcut.length) return false;
208
+ return pressed.every((k) => keySet.has(k));
209
+ };
210
+ var useShortcutFormatter = () => {
211
+ const [os, setOS] = react.useState("windows");
212
+ const listenersRef = react.useRef(/* @__PURE__ */ new Map());
213
+ react.useEffect(() => {
214
+ setOS(detectOS());
215
+ }, []);
216
+ react.useEffect(() => {
217
+ const handleKeyDown = (event) => {
218
+ for (const shortcut of globalKeyboardShortcuts) {
219
+ if (matchShortcut(event, shortcut.shortcut, os)) {
220
+ const listeners = listenersRef.current.get(shortcut.command);
221
+ if (listeners) {
222
+ event.preventDefault();
223
+ listeners.forEach((cb) => cb(event));
224
+ }
225
+ }
226
+ }
227
+ };
228
+ window.addEventListener("keydown", handleKeyDown);
229
+ return () => {
230
+ window.removeEventListener("keydown", handleKeyDown);
231
+ };
232
+ }, [os]);
233
+ const formatKeys = (keys = []) => {
234
+ return keys.map((key) => keyMap[os][key.toLowerCase()] || key.toUpperCase()).join(" + ");
235
+ };
236
+ const getShortcutByCommand = (command) => {
237
+ const found = globalKeyboardShortcuts.find((s) => s.command === command);
238
+ return found ? found.shortcut : [""];
239
+ };
240
+ const addShortcutListener = (command, listener) => {
241
+ if (!listenersRef.current.has(command)) {
242
+ listenersRef.current.set(command, /* @__PURE__ */ new Set());
243
+ }
244
+ listenersRef.current.get(command).add(listener);
245
+ };
246
+ const removeShortcutListener = (command, listener) => {
247
+ if (listenersRef.current.has(command)) {
248
+ listenersRef.current.get(command).delete(listener);
249
+ }
250
+ };
251
+ return {
252
+ formatKeys,
253
+ getShortcutByCommand,
254
+ addShortcutListener,
255
+ removeShortcutListener
256
+ };
257
+ };
258
+ var useShortcutFormatter_default = useShortcutFormatter;
259
+
260
+ exports.useDeviceSupport = useDeviceSupport;
261
+ exports.useGridClasses = useGridClasses_default;
262
+ exports.useShortcutFormatter = useShortcutFormatter_default;
263
+ exports.useSound = useSound;
264
+ //# sourceMappingURL=sdk.cjs.map
265
+ //# sourceMappingURL=sdk.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useDeviceSupport.tsx","../src/hooks/useSound.tsx","../src/hooks/useGridClasses.tsx","../src/utils/constants.ts","../src/hooks/useShortcutFormatter.tsx"],"names":["useState","useEffect","useCallback","useMemo","UAParser","useRef"],"mappings":"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","file":"sdk.cjs","sourcesContent":["import { useEffect, useState } from \"react\";\n\n// Helper function to detect device type and orientation\nexport const useDeviceSupport = () => {\n const [isSupported, setIsSupported] = useState(true);\n\n useEffect(() => {\n function checkSupport() {\n // Get user agent and screen info\n const ua =\n typeof window !== \"undefined\" ? window.navigator.userAgent : \"\";\n const width = typeof window !== \"undefined\" ? window.innerWidth : 1920;\n const height = typeof window !== \"undefined\" ? window.innerHeight : 1080;\n const isTouch =\n typeof window !== \"undefined\" ? \"ontouchstart\" in window : false;\n\n // Mobile detection (iOS/Android phones)\n const isMobile = /Mobi|Android|iPhone|iPod/.test(ua) && width <= 767;\n\n // Tablet detection (portrait/landscape)\n const isTablet =\n (/iPad|Tablet|Android/.test(ua) && !/Mobile/.test(ua)) ||\n (isTouch && width >= 600 && width <= 1024);\n // Tablet portrait: width < height, width <= 1024, height > width\n const isTabletPortrait = isTablet && width < height;\n // Tablet landscape: width > height, width <= 1366, width >= 1024\n const isTabletLandscape =\n isTablet && width > height && width >= 1024 && width <= 1366;\n\n // Laptop: width >= 1024 (landscape), not touch or not tablet\n const isLaptop =\n width >= 1024 && !isMobile && (!isTablet || isTabletLandscape);\n\n // Support logic:\n // - Mobile: Not supported\n // - Tablet portrait: Not supported\n // - Tablet landscape: Supported\n // - Laptop: Supported\n\n if (isMobile) {\n setIsSupported(false);\n } else if (isTabletPortrait) {\n setIsSupported(false);\n } else if (isTabletLandscape) {\n setIsSupported(true);\n } else if (isLaptop) {\n setIsSupported(true);\n } else {\n // Default: allow desktop\n setIsSupported(true);\n }\n }\n\n checkSupport();\n window.addEventListener(\"resize\", checkSupport);\n return () => window.removeEventListener(\"resize\", checkSupport);\n }, []);\n\n return isSupported;\n};\n","import { useCallback } from \"react\";\n\ntype SoundType =\n | \"click\"\n | \"error\"\n | \"success\"\n | \"alert\"\n | \"notification\"\n | \"swipe\";\n\nconst soundMap: Record<SoundType, string> = {\n click: \"/sounds/click-tone.wav\",\n alert: \"/sounds/error-tone.wav\",\n notification: \"/sounds/notification-tone.wav\",\n error: \"/sounds/error-tone.wav\",\n success: \"/sounds/success-tone.wav\",\n swipe: \"/sounds/swipe-tone.wav\",\n};\n\nexport const useSound = () => {\n const playSound = useCallback((type: SoundType) => {\n if (typeof window === \"undefined\" || typeof window.Audio === \"undefined\") {\n return;\n }\n\n const soundSrc = soundMap[type];\n const audio = new window.Audio(soundSrc);\n audio.play().catch((err) => {\n console.error(\"Sound playback failed:\", err);\n });\n }, []);\n\n return { playSound };\n};\n","import { useMemo } from \"react\";\n\nconst useGridClasses = (\n windowSize: { width: number; height: number },\n gridRules: Record<string, Record<string, Record<string, string>>>\n) => {\n const deviceType: \"mobile\" | \"tablet\" | \"desktop\" = useMemo(() => {\n if (windowSize.width <= 640) return \"mobile\"; // For mobile (width <= 640px)\n if (windowSize.width <= 1024) return \"tablet\"; // For tablet (width <= 1024px)\n return \"desktop\"; // For desktop (width > 1024px)\n }, [windowSize]);\n\n const gridClasses: Record<string, string> = useMemo(() => {\n const classes: Record<string, string> = {};\n for (const element in gridRules) {\n const classRules = gridRules[element];\n // Check for device-specific class (col-span-{deviceType}-{col-span})\n const colSpan = classRules[\"col-span\"][deviceType];\n classes[element] = `col-span-${deviceType}-${colSpan}`;\n }\n return classes;\n }, [deviceType, gridRules]);\n\n return { gridClasses, deviceType };\n};\n\nexport default useGridClasses;\n","export type Shortcut = {\n command: string;\n shortcut: string[];\n usage: string;\n};\n\nexport const globalKeyboardShortcuts: Shortcut[] = [\n {\n command: \"toggle_theme\",\n shortcut: [\"Ctrl\", \"Shift\", \"M\"],\n usage: \"Toggle between light and dark theme\",\n },\n {\n command: \"app_switcher\",\n shortcut: [\"Ctrl\", \"Shift\", \"S\"],\n usage: \"Switch between open apps\",\n },\n {\n command: \"exit_app\",\n shortcut: [\"Ctrl\", \"E\"],\n usage: \"Exit or quit the application\",\n },\n {\n command: \"maximize_app\",\n shortcut: [\"Ctrl\", \"ArrowUp\"],\n usage: \"Maximize the application window\",\n },\n {\n command: \"minimize_app\",\n shortcut: [\"Ctrl\", \"ArrowDown\"],\n usage: \"Minimize the application window\",\n },\n {\n command: \"global_search\",\n shortcut: [\"Ctrl\", \"Shift\", \"K\"],\n usage: \"Open global search\",\n },\n {\n command: \"toggle_search_mode\",\n shortcut: [\"Ctrl\", \"Shift\", \"L\"],\n usage: \"Enable AI and Voice command (start/stop voice input in search)\",\n },\n {\n command: \"toggle_control_center\",\n shortcut: [\"Ctrl\", \"Shift\", \"O\"],\n usage: \"Toggle control center panel or drawer\",\n },\n {\n command: \"arrow_up\",\n shortcut: [\"ArrowUp\"],\n usage: \"Navigate up in lists, menus and options\",\n },\n {\n command: \"arrow_down\",\n shortcut: [\"ArrowDown\"],\n usage: \"Navigate down in lists, menus and options\",\n },\n {\n command: \"escape_button_action\",\n shortcut: [\"Escape\"],\n usage: \"Close or go back from any open alert, popup, search, or control center\",\n },\n {\n command: \"enter_button_action\",\n shortcut: [\"Enter\"],\n usage: \"Select or confirm the currently focused item\",\n },\n {\n command: \"toggle_filters\",\n shortcut: [\"Ctrl\", \"Shift\", \"U\"],\n usage: \"To open or close filters of any current active app\",\n },\n {\n command: \"focus_search\",\n shortcut: [\"Ctrl\", \"k\"],\n usage: \"Focus on current app search\",\n },\n {\n command: \"toggle_all_apps\",\n shortcut: [\"Ctrl\", \"Shift\", \"A\"],\n usage: \"Toggle showing all available apps and plugins\",\n },\n];","import { globalKeyboardShortcuts } from \"../utils/constants\";\nimport { useState, useEffect, useRef } from \"react\";\nimport { UAParser } from \"ua-parser-js\";\n\ntype OS = \"mac\" | \"windows\" | \"linux\";\n\ntype KeyMap = {\n [key in OS]: {\n [key: string]: string;\n };\n};\n\nconst keyMap: KeyMap = {\n mac: {\n ctrl: \"⌘\",\n alt: \"⌥\",\n shift: \"⇧\",\n enter: \"⏎\",\n backspace: \"⌫\",\n arrowup: \"↑\",\n arrowdown: \"↓\",\n },\n windows: {\n ctrl: \"Ctrl\",\n alt: \"Alt\",\n shift: \"Shift\",\n enter: \"Enter\",\n backspace: \"Backspace\",\n arrowup: \"↑\",\n arrowdown: \"↓\",\n },\n linux: {\n ctrl: \"Ctrl\",\n alt: \"Alt\",\n shift: \"Shift\",\n enter: \"Enter\",\n backspace: \"Backspace\",\n arrowup: \"↑\",\n arrowdown: \"↓\",\n },\n};\n\nconst detectOS = (): OS => {\n const parser = new UAParser();\n const osName = parser.getOS().name?.toLowerCase() || \"\";\n\n if (osName.includes(\"mac\")) return \"mac\";\n if (osName.includes(\"windows\")) return \"windows\";\n if (osName.includes(\"linux\")) return \"linux\";\n return \"windows\"; // fallback\n};\n\ntype UseShortcutFormatterReturn = {\n formatKeys: (keys: string[]) => string;\n getShortcutByCommand: (command: string) => string[];\n addShortcutListener: (\n command: string,\n listener: (e: KeyboardEvent) => void\n ) => void;\n removeShortcutListener: (\n command: string,\n listener: (e: KeyboardEvent) => void\n ) => void;\n};\n\nconst normalizeKey = (key: string) => key.toLowerCase();\n\nconst matchShortcut = (event: KeyboardEvent, shortcut: string[], os: OS) => {\n // Normalize keys for comparison\n const keySet = new Set(shortcut.map(normalizeKey));\n // Map event to normalized keys\n const pressed: string[] = [];\n if (os === \"mac\") {\n if (event.metaKey) pressed.push(\"ctrl\");\n } else {\n if (event.ctrlKey) pressed.push(\"ctrl\");\n }\n if (event.altKey) pressed.push(\"alt\");\n if (event.shiftKey) pressed.push(\"shift\");\n // The main key\n if (event.key && ![\"Control\", \"Meta\", \"Alt\", \"Shift\"].includes(event.key)) {\n pressed.push(normalizeKey(event.key));\n }\n // Compare sets\n if (pressed.length !== shortcut.length) return false;\n return pressed.every((k) => keySet.has(k));\n};\n\nconst useShortcutFormatter = (): UseShortcutFormatterReturn => {\n const [os, setOS] = useState<OS>(\"windows\");\n const listenersRef = useRef<Map<string, Set<(e: KeyboardEvent) => void>>>(new Map());\n\n useEffect(() => {\n setOS(detectOS());\n }, []);\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n for (const shortcut of globalKeyboardShortcuts) {\n if (matchShortcut(event, shortcut.shortcut, os)) {\n const listeners = listenersRef.current.get(shortcut.command);\n if (listeners) {\n event.preventDefault(); // Prevent browser defaults for matched shortcuts\n listeners.forEach((cb) => cb(event));\n }\n }\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [os]);\n\n const formatKeys = (keys: string[] = []): string => {\n return keys\n .map((key) => keyMap[os][key.toLowerCase()] || key.toUpperCase())\n .join(\" + \");\n };\n\n const getShortcutByCommand = (command: string): string[] => {\n const found = globalKeyboardShortcuts.find((s) => s.command === command);\n return found ? found.shortcut : [\"\"];\n };\n\n const addShortcutListener = (command: string, listener: (e: KeyboardEvent) => void) => {\n if (!listenersRef.current.has(command)) {\n listenersRef.current.set(command, new Set());\n }\n listenersRef.current.get(command)!.add(listener);\n };\n\n const removeShortcutListener = (command: string, listener: (e: KeyboardEvent) => void) => {\n if (listenersRef.current.has(command)) {\n listenersRef.current.get(command)!.delete(listener);\n }\n };\n\n return {\n formatKeys,\n getShortcutByCommand,\n addShortcutListener,\n removeShortcutListener,\n };\n};\n\nexport default useShortcutFormatter;\n"]}
package/dist/sdk.d.cts ADDED
@@ -0,0 +1,24 @@
1
+ declare const useGridClasses: (windowSize: {
2
+ width: number;
3
+ height: number;
4
+ }, gridRules: Record<string, Record<string, Record<string, string>>>) => {
5
+ gridClasses: Record<string, string>;
6
+ deviceType: "mobile" | "tablet" | "desktop";
7
+ };
8
+
9
+ type UseShortcutFormatterReturn = {
10
+ formatKeys: (keys: string[]) => string;
11
+ getShortcutByCommand: (command: string) => string[];
12
+ addShortcutListener: (command: string, listener: (e: KeyboardEvent) => void) => void;
13
+ removeShortcutListener: (command: string, listener: (e: KeyboardEvent) => void) => void;
14
+ };
15
+ declare const useShortcutFormatter: () => UseShortcutFormatterReturn;
16
+
17
+ declare const useDeviceSupport: () => boolean;
18
+
19
+ type SoundType = "click" | "error" | "success" | "alert" | "notification" | "swipe";
20
+ declare const useSound: () => {
21
+ playSound: (type: SoundType) => void;
22
+ };
23
+
24
+ export { useDeviceSupport, useGridClasses, useShortcutFormatter, useSound };
package/dist/sdk.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ declare const useGridClasses: (windowSize: {
2
+ width: number;
3
+ height: number;
4
+ }, gridRules: Record<string, Record<string, Record<string, string>>>) => {
5
+ gridClasses: Record<string, string>;
6
+ deviceType: "mobile" | "tablet" | "desktop";
7
+ };
8
+
9
+ type UseShortcutFormatterReturn = {
10
+ formatKeys: (keys: string[]) => string;
11
+ getShortcutByCommand: (command: string) => string[];
12
+ addShortcutListener: (command: string, listener: (e: KeyboardEvent) => void) => void;
13
+ removeShortcutListener: (command: string, listener: (e: KeyboardEvent) => void) => void;
14
+ };
15
+ declare const useShortcutFormatter: () => UseShortcutFormatterReturn;
16
+
17
+ declare const useDeviceSupport: () => boolean;
18
+
19
+ type SoundType = "click" | "error" | "success" | "alert" | "notification" | "swipe";
20
+ declare const useSound: () => {
21
+ playSound: (type: SoundType) => void;
22
+ };
23
+
24
+ export { useDeviceSupport, useGridClasses, useShortcutFormatter, useSound };
package/dist/sdk.js ADDED
@@ -0,0 +1,260 @@
1
+ import { useState, useEffect, useCallback, useMemo, useRef } from 'react';
2
+ import { UAParser } from 'ua-parser-js';
3
+
4
+ // src/hooks/useDeviceSupport.tsx
5
+ var useDeviceSupport = () => {
6
+ const [isSupported, setIsSupported] = useState(true);
7
+ useEffect(() => {
8
+ function checkSupport() {
9
+ const ua = typeof window !== "undefined" ? window.navigator.userAgent : "";
10
+ const width = typeof window !== "undefined" ? window.innerWidth : 1920;
11
+ const height = typeof window !== "undefined" ? window.innerHeight : 1080;
12
+ const isTouch = typeof window !== "undefined" ? "ontouchstart" in window : false;
13
+ const isMobile = /Mobi|Android|iPhone|iPod/.test(ua) && width <= 767;
14
+ const isTablet = /iPad|Tablet|Android/.test(ua) && !/Mobile/.test(ua) || isTouch && width >= 600 && width <= 1024;
15
+ const isTabletPortrait = isTablet && width < height;
16
+ const isTabletLandscape = isTablet && width > height && width >= 1024 && width <= 1366;
17
+ const isLaptop = width >= 1024 && !isMobile && (!isTablet || isTabletLandscape);
18
+ if (isMobile) {
19
+ setIsSupported(false);
20
+ } else if (isTabletPortrait) {
21
+ setIsSupported(false);
22
+ } else if (isTabletLandscape) {
23
+ setIsSupported(true);
24
+ } else if (isLaptop) {
25
+ setIsSupported(true);
26
+ } else {
27
+ setIsSupported(true);
28
+ }
29
+ }
30
+ checkSupport();
31
+ window.addEventListener("resize", checkSupport);
32
+ return () => window.removeEventListener("resize", checkSupport);
33
+ }, []);
34
+ return isSupported;
35
+ };
36
+ var soundMap = {
37
+ click: "/sounds/click-tone.wav",
38
+ alert: "/sounds/error-tone.wav",
39
+ notification: "/sounds/notification-tone.wav",
40
+ error: "/sounds/error-tone.wav",
41
+ success: "/sounds/success-tone.wav",
42
+ swipe: "/sounds/swipe-tone.wav"
43
+ };
44
+ var useSound = () => {
45
+ const playSound = useCallback((type) => {
46
+ if (typeof window === "undefined" || typeof window.Audio === "undefined") {
47
+ return;
48
+ }
49
+ const soundSrc = soundMap[type];
50
+ const audio = new window.Audio(soundSrc);
51
+ audio.play().catch((err) => {
52
+ console.error("Sound playback failed:", err);
53
+ });
54
+ }, []);
55
+ return { playSound };
56
+ };
57
+ var useGridClasses = (windowSize, gridRules) => {
58
+ const deviceType = useMemo(() => {
59
+ if (windowSize.width <= 640) return "mobile";
60
+ if (windowSize.width <= 1024) return "tablet";
61
+ return "desktop";
62
+ }, [windowSize]);
63
+ const gridClasses = useMemo(() => {
64
+ const classes = {};
65
+ for (const element in gridRules) {
66
+ const classRules = gridRules[element];
67
+ const colSpan = classRules["col-span"][deviceType];
68
+ classes[element] = `col-span-${deviceType}-${colSpan}`;
69
+ }
70
+ return classes;
71
+ }, [deviceType, gridRules]);
72
+ return { gridClasses, deviceType };
73
+ };
74
+ var useGridClasses_default = useGridClasses;
75
+
76
+ // src/utils/constants.ts
77
+ var globalKeyboardShortcuts = [
78
+ {
79
+ command: "toggle_theme",
80
+ shortcut: ["Ctrl", "Shift", "M"],
81
+ usage: "Toggle between light and dark theme"
82
+ },
83
+ {
84
+ command: "app_switcher",
85
+ shortcut: ["Ctrl", "Shift", "S"],
86
+ usage: "Switch between open apps"
87
+ },
88
+ {
89
+ command: "exit_app",
90
+ shortcut: ["Ctrl", "E"],
91
+ usage: "Exit or quit the application"
92
+ },
93
+ {
94
+ command: "maximize_app",
95
+ shortcut: ["Ctrl", "ArrowUp"],
96
+ usage: "Maximize the application window"
97
+ },
98
+ {
99
+ command: "minimize_app",
100
+ shortcut: ["Ctrl", "ArrowDown"],
101
+ usage: "Minimize the application window"
102
+ },
103
+ {
104
+ command: "global_search",
105
+ shortcut: ["Ctrl", "Shift", "K"],
106
+ usage: "Open global search"
107
+ },
108
+ {
109
+ command: "toggle_search_mode",
110
+ shortcut: ["Ctrl", "Shift", "L"],
111
+ usage: "Enable AI and Voice command (start/stop voice input in search)"
112
+ },
113
+ {
114
+ command: "toggle_control_center",
115
+ shortcut: ["Ctrl", "Shift", "O"],
116
+ usage: "Toggle control center panel or drawer"
117
+ },
118
+ {
119
+ command: "arrow_up",
120
+ shortcut: ["ArrowUp"],
121
+ usage: "Navigate up in lists, menus and options"
122
+ },
123
+ {
124
+ command: "arrow_down",
125
+ shortcut: ["ArrowDown"],
126
+ usage: "Navigate down in lists, menus and options"
127
+ },
128
+ {
129
+ command: "escape_button_action",
130
+ shortcut: ["Escape"],
131
+ usage: "Close or go back from any open alert, popup, search, or control center"
132
+ },
133
+ {
134
+ command: "enter_button_action",
135
+ shortcut: ["Enter"],
136
+ usage: "Select or confirm the currently focused item"
137
+ },
138
+ {
139
+ command: "toggle_filters",
140
+ shortcut: ["Ctrl", "Shift", "U"],
141
+ usage: "To open or close filters of any current active app"
142
+ },
143
+ {
144
+ command: "focus_search",
145
+ shortcut: ["Ctrl", "k"],
146
+ usage: "Focus on current app search"
147
+ },
148
+ {
149
+ command: "toggle_all_apps",
150
+ shortcut: ["Ctrl", "Shift", "A"],
151
+ usage: "Toggle showing all available apps and plugins"
152
+ }
153
+ ];
154
+ var keyMap = {
155
+ mac: {
156
+ ctrl: "\u2318",
157
+ alt: "\u2325",
158
+ shift: "\u21E7",
159
+ enter: "\u23CE",
160
+ backspace: "\u232B",
161
+ arrowup: "\u2191",
162
+ arrowdown: "\u2193"
163
+ },
164
+ windows: {
165
+ ctrl: "Ctrl",
166
+ alt: "Alt",
167
+ shift: "Shift",
168
+ enter: "Enter",
169
+ backspace: "Backspace",
170
+ arrowup: "\u2191",
171
+ arrowdown: "\u2193"
172
+ },
173
+ linux: {
174
+ ctrl: "Ctrl",
175
+ alt: "Alt",
176
+ shift: "Shift",
177
+ enter: "Enter",
178
+ backspace: "Backspace",
179
+ arrowup: "\u2191",
180
+ arrowdown: "\u2193"
181
+ }
182
+ };
183
+ var detectOS = () => {
184
+ const parser = new UAParser();
185
+ const osName = parser.getOS().name?.toLowerCase() || "";
186
+ if (osName.includes("mac")) return "mac";
187
+ if (osName.includes("windows")) return "windows";
188
+ if (osName.includes("linux")) return "linux";
189
+ return "windows";
190
+ };
191
+ var normalizeKey = (key) => key.toLowerCase();
192
+ var matchShortcut = (event, shortcut, os) => {
193
+ const keySet = new Set(shortcut.map(normalizeKey));
194
+ const pressed = [];
195
+ if (os === "mac") {
196
+ if (event.metaKey) pressed.push("ctrl");
197
+ } else {
198
+ if (event.ctrlKey) pressed.push("ctrl");
199
+ }
200
+ if (event.altKey) pressed.push("alt");
201
+ if (event.shiftKey) pressed.push("shift");
202
+ if (event.key && !["Control", "Meta", "Alt", "Shift"].includes(event.key)) {
203
+ pressed.push(normalizeKey(event.key));
204
+ }
205
+ if (pressed.length !== shortcut.length) return false;
206
+ return pressed.every((k) => keySet.has(k));
207
+ };
208
+ var useShortcutFormatter = () => {
209
+ const [os, setOS] = useState("windows");
210
+ const listenersRef = useRef(/* @__PURE__ */ new Map());
211
+ useEffect(() => {
212
+ setOS(detectOS());
213
+ }, []);
214
+ useEffect(() => {
215
+ const handleKeyDown = (event) => {
216
+ for (const shortcut of globalKeyboardShortcuts) {
217
+ if (matchShortcut(event, shortcut.shortcut, os)) {
218
+ const listeners = listenersRef.current.get(shortcut.command);
219
+ if (listeners) {
220
+ event.preventDefault();
221
+ listeners.forEach((cb) => cb(event));
222
+ }
223
+ }
224
+ }
225
+ };
226
+ window.addEventListener("keydown", handleKeyDown);
227
+ return () => {
228
+ window.removeEventListener("keydown", handleKeyDown);
229
+ };
230
+ }, [os]);
231
+ const formatKeys = (keys = []) => {
232
+ return keys.map((key) => keyMap[os][key.toLowerCase()] || key.toUpperCase()).join(" + ");
233
+ };
234
+ const getShortcutByCommand = (command) => {
235
+ const found = globalKeyboardShortcuts.find((s) => s.command === command);
236
+ return found ? found.shortcut : [""];
237
+ };
238
+ const addShortcutListener = (command, listener) => {
239
+ if (!listenersRef.current.has(command)) {
240
+ listenersRef.current.set(command, /* @__PURE__ */ new Set());
241
+ }
242
+ listenersRef.current.get(command).add(listener);
243
+ };
244
+ const removeShortcutListener = (command, listener) => {
245
+ if (listenersRef.current.has(command)) {
246
+ listenersRef.current.get(command).delete(listener);
247
+ }
248
+ };
249
+ return {
250
+ formatKeys,
251
+ getShortcutByCommand,
252
+ addShortcutListener,
253
+ removeShortcutListener
254
+ };
255
+ };
256
+ var useShortcutFormatter_default = useShortcutFormatter;
257
+
258
+ export { useDeviceSupport, useGridClasses_default as useGridClasses, useShortcutFormatter_default as useShortcutFormatter, useSound };
259
+ //# sourceMappingURL=sdk.js.map
260
+ //# sourceMappingURL=sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useDeviceSupport.tsx","../src/hooks/useSound.tsx","../src/hooks/useGridClasses.tsx","../src/utils/constants.ts","../src/hooks/useShortcutFormatter.tsx"],"names":["useState","useEffect"],"mappings":"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","file":"sdk.js","sourcesContent":["import { useEffect, useState } from \"react\";\n\n// Helper function to detect device type and orientation\nexport const useDeviceSupport = () => {\n const [isSupported, setIsSupported] = useState(true);\n\n useEffect(() => {\n function checkSupport() {\n // Get user agent and screen info\n const ua =\n typeof window !== \"undefined\" ? window.navigator.userAgent : \"\";\n const width = typeof window !== \"undefined\" ? window.innerWidth : 1920;\n const height = typeof window !== \"undefined\" ? window.innerHeight : 1080;\n const isTouch =\n typeof window !== \"undefined\" ? \"ontouchstart\" in window : false;\n\n // Mobile detection (iOS/Android phones)\n const isMobile = /Mobi|Android|iPhone|iPod/.test(ua) && width <= 767;\n\n // Tablet detection (portrait/landscape)\n const isTablet =\n (/iPad|Tablet|Android/.test(ua) && !/Mobile/.test(ua)) ||\n (isTouch && width >= 600 && width <= 1024);\n // Tablet portrait: width < height, width <= 1024, height > width\n const isTabletPortrait = isTablet && width < height;\n // Tablet landscape: width > height, width <= 1366, width >= 1024\n const isTabletLandscape =\n isTablet && width > height && width >= 1024 && width <= 1366;\n\n // Laptop: width >= 1024 (landscape), not touch or not tablet\n const isLaptop =\n width >= 1024 && !isMobile && (!isTablet || isTabletLandscape);\n\n // Support logic:\n // - Mobile: Not supported\n // - Tablet portrait: Not supported\n // - Tablet landscape: Supported\n // - Laptop: Supported\n\n if (isMobile) {\n setIsSupported(false);\n } else if (isTabletPortrait) {\n setIsSupported(false);\n } else if (isTabletLandscape) {\n setIsSupported(true);\n } else if (isLaptop) {\n setIsSupported(true);\n } else {\n // Default: allow desktop\n setIsSupported(true);\n }\n }\n\n checkSupport();\n window.addEventListener(\"resize\", checkSupport);\n return () => window.removeEventListener(\"resize\", checkSupport);\n }, []);\n\n return isSupported;\n};\n","import { useCallback } from \"react\";\n\ntype SoundType =\n | \"click\"\n | \"error\"\n | \"success\"\n | \"alert\"\n | \"notification\"\n | \"swipe\";\n\nconst soundMap: Record<SoundType, string> = {\n click: \"/sounds/click-tone.wav\",\n alert: \"/sounds/error-tone.wav\",\n notification: \"/sounds/notification-tone.wav\",\n error: \"/sounds/error-tone.wav\",\n success: \"/sounds/success-tone.wav\",\n swipe: \"/sounds/swipe-tone.wav\",\n};\n\nexport const useSound = () => {\n const playSound = useCallback((type: SoundType) => {\n if (typeof window === \"undefined\" || typeof window.Audio === \"undefined\") {\n return;\n }\n\n const soundSrc = soundMap[type];\n const audio = new window.Audio(soundSrc);\n audio.play().catch((err) => {\n console.error(\"Sound playback failed:\", err);\n });\n }, []);\n\n return { playSound };\n};\n","import { useMemo } from \"react\";\n\nconst useGridClasses = (\n windowSize: { width: number; height: number },\n gridRules: Record<string, Record<string, Record<string, string>>>\n) => {\n const deviceType: \"mobile\" | \"tablet\" | \"desktop\" = useMemo(() => {\n if (windowSize.width <= 640) return \"mobile\"; // For mobile (width <= 640px)\n if (windowSize.width <= 1024) return \"tablet\"; // For tablet (width <= 1024px)\n return \"desktop\"; // For desktop (width > 1024px)\n }, [windowSize]);\n\n const gridClasses: Record<string, string> = useMemo(() => {\n const classes: Record<string, string> = {};\n for (const element in gridRules) {\n const classRules = gridRules[element];\n // Check for device-specific class (col-span-{deviceType}-{col-span})\n const colSpan = classRules[\"col-span\"][deviceType];\n classes[element] = `col-span-${deviceType}-${colSpan}`;\n }\n return classes;\n }, [deviceType, gridRules]);\n\n return { gridClasses, deviceType };\n};\n\nexport default useGridClasses;\n","export type Shortcut = {\n command: string;\n shortcut: string[];\n usage: string;\n};\n\nexport const globalKeyboardShortcuts: Shortcut[] = [\n {\n command: \"toggle_theme\",\n shortcut: [\"Ctrl\", \"Shift\", \"M\"],\n usage: \"Toggle between light and dark theme\",\n },\n {\n command: \"app_switcher\",\n shortcut: [\"Ctrl\", \"Shift\", \"S\"],\n usage: \"Switch between open apps\",\n },\n {\n command: \"exit_app\",\n shortcut: [\"Ctrl\", \"E\"],\n usage: \"Exit or quit the application\",\n },\n {\n command: \"maximize_app\",\n shortcut: [\"Ctrl\", \"ArrowUp\"],\n usage: \"Maximize the application window\",\n },\n {\n command: \"minimize_app\",\n shortcut: [\"Ctrl\", \"ArrowDown\"],\n usage: \"Minimize the application window\",\n },\n {\n command: \"global_search\",\n shortcut: [\"Ctrl\", \"Shift\", \"K\"],\n usage: \"Open global search\",\n },\n {\n command: \"toggle_search_mode\",\n shortcut: [\"Ctrl\", \"Shift\", \"L\"],\n usage: \"Enable AI and Voice command (start/stop voice input in search)\",\n },\n {\n command: \"toggle_control_center\",\n shortcut: [\"Ctrl\", \"Shift\", \"O\"],\n usage: \"Toggle control center panel or drawer\",\n },\n {\n command: \"arrow_up\",\n shortcut: [\"ArrowUp\"],\n usage: \"Navigate up in lists, menus and options\",\n },\n {\n command: \"arrow_down\",\n shortcut: [\"ArrowDown\"],\n usage: \"Navigate down in lists, menus and options\",\n },\n {\n command: \"escape_button_action\",\n shortcut: [\"Escape\"],\n usage: \"Close or go back from any open alert, popup, search, or control center\",\n },\n {\n command: \"enter_button_action\",\n shortcut: [\"Enter\"],\n usage: \"Select or confirm the currently focused item\",\n },\n {\n command: \"toggle_filters\",\n shortcut: [\"Ctrl\", \"Shift\", \"U\"],\n usage: \"To open or close filters of any current active app\",\n },\n {\n command: \"focus_search\",\n shortcut: [\"Ctrl\", \"k\"],\n usage: \"Focus on current app search\",\n },\n {\n command: \"toggle_all_apps\",\n shortcut: [\"Ctrl\", \"Shift\", \"A\"],\n usage: \"Toggle showing all available apps and plugins\",\n },\n];","import { globalKeyboardShortcuts } from \"../utils/constants\";\nimport { useState, useEffect, useRef } from \"react\";\nimport { UAParser } from \"ua-parser-js\";\n\ntype OS = \"mac\" | \"windows\" | \"linux\";\n\ntype KeyMap = {\n [key in OS]: {\n [key: string]: string;\n };\n};\n\nconst keyMap: KeyMap = {\n mac: {\n ctrl: \"⌘\",\n alt: \"⌥\",\n shift: \"⇧\",\n enter: \"⏎\",\n backspace: \"⌫\",\n arrowup: \"↑\",\n arrowdown: \"↓\",\n },\n windows: {\n ctrl: \"Ctrl\",\n alt: \"Alt\",\n shift: \"Shift\",\n enter: \"Enter\",\n backspace: \"Backspace\",\n arrowup: \"↑\",\n arrowdown: \"↓\",\n },\n linux: {\n ctrl: \"Ctrl\",\n alt: \"Alt\",\n shift: \"Shift\",\n enter: \"Enter\",\n backspace: \"Backspace\",\n arrowup: \"↑\",\n arrowdown: \"↓\",\n },\n};\n\nconst detectOS = (): OS => {\n const parser = new UAParser();\n const osName = parser.getOS().name?.toLowerCase() || \"\";\n\n if (osName.includes(\"mac\")) return \"mac\";\n if (osName.includes(\"windows\")) return \"windows\";\n if (osName.includes(\"linux\")) return \"linux\";\n return \"windows\"; // fallback\n};\n\ntype UseShortcutFormatterReturn = {\n formatKeys: (keys: string[]) => string;\n getShortcutByCommand: (command: string) => string[];\n addShortcutListener: (\n command: string,\n listener: (e: KeyboardEvent) => void\n ) => void;\n removeShortcutListener: (\n command: string,\n listener: (e: KeyboardEvent) => void\n ) => void;\n};\n\nconst normalizeKey = (key: string) => key.toLowerCase();\n\nconst matchShortcut = (event: KeyboardEvent, shortcut: string[], os: OS) => {\n // Normalize keys for comparison\n const keySet = new Set(shortcut.map(normalizeKey));\n // Map event to normalized keys\n const pressed: string[] = [];\n if (os === \"mac\") {\n if (event.metaKey) pressed.push(\"ctrl\");\n } else {\n if (event.ctrlKey) pressed.push(\"ctrl\");\n }\n if (event.altKey) pressed.push(\"alt\");\n if (event.shiftKey) pressed.push(\"shift\");\n // The main key\n if (event.key && ![\"Control\", \"Meta\", \"Alt\", \"Shift\"].includes(event.key)) {\n pressed.push(normalizeKey(event.key));\n }\n // Compare sets\n if (pressed.length !== shortcut.length) return false;\n return pressed.every((k) => keySet.has(k));\n};\n\nconst useShortcutFormatter = (): UseShortcutFormatterReturn => {\n const [os, setOS] = useState<OS>(\"windows\");\n const listenersRef = useRef<Map<string, Set<(e: KeyboardEvent) => void>>>(new Map());\n\n useEffect(() => {\n setOS(detectOS());\n }, []);\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n for (const shortcut of globalKeyboardShortcuts) {\n if (matchShortcut(event, shortcut.shortcut, os)) {\n const listeners = listenersRef.current.get(shortcut.command);\n if (listeners) {\n event.preventDefault(); // Prevent browser defaults for matched shortcuts\n listeners.forEach((cb) => cb(event));\n }\n }\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [os]);\n\n const formatKeys = (keys: string[] = []): string => {\n return keys\n .map((key) => keyMap[os][key.toLowerCase()] || key.toUpperCase())\n .join(\" + \");\n };\n\n const getShortcutByCommand = (command: string): string[] => {\n const found = globalKeyboardShortcuts.find((s) => s.command === command);\n return found ? found.shortcut : [\"\"];\n };\n\n const addShortcutListener = (command: string, listener: (e: KeyboardEvent) => void) => {\n if (!listenersRef.current.has(command)) {\n listenersRef.current.set(command, new Set());\n }\n listenersRef.current.get(command)!.add(listener);\n };\n\n const removeShortcutListener = (command: string, listener: (e: KeyboardEvent) => void) => {\n if (listenersRef.current.has(command)) {\n listenersRef.current.get(command)!.delete(listener);\n }\n };\n\n return {\n formatKeys,\n getShortcutByCommand,\n addShortcutListener,\n removeShortcutListener,\n };\n};\n\nexport default useShortcutFormatter;\n"]}