juxscript 1.0.102 → 1.0.104
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/machinery/compiler3.js +53 -15
- package/package.json +5 -2
- package/lib/componentsv2/base/BaseEngine.d.ts.map +0 -1
- package/lib/componentsv2/base/BaseEngine.js.map +0 -1
- package/lib/componentsv2/base/BaseEngine.ts +0 -332
- package/lib/componentsv2/base/BaseSkin.d.ts.map +0 -1
- package/lib/componentsv2/base/BaseSkin.js.map +0 -1
- package/lib/componentsv2/base/BaseSkin.ts +0 -124
- package/lib/componentsv2/base/GlobalBus.d.ts.map +0 -1
- package/lib/componentsv2/base/GlobalBus.js.map +0 -1
- package/lib/componentsv2/base/GlobalBus.ts +0 -60
- package/lib/componentsv2/base/OptionsContract.d.ts.map +0 -1
- package/lib/componentsv2/base/OptionsContract.js.map +0 -1
- package/lib/componentsv2/base/OptionsContract.ts +0 -139
- package/lib/componentsv2/base/State.d.ts.map +0 -1
- package/lib/componentsv2/base/State.js.map +0 -1
- package/lib/componentsv2/base/State.ts +0 -62
- package/lib/componentsv2/element/component.d.ts.map +0 -1
- package/lib/componentsv2/element/component.js.map +0 -1
- package/lib/componentsv2/element/component.ts +0 -54
- package/lib/componentsv2/element/engine.d.ts.map +0 -1
- package/lib/componentsv2/element/engine.js.map +0 -1
- package/lib/componentsv2/element/engine.ts +0 -145
- package/lib/componentsv2/element/skin.d.ts.map +0 -1
- package/lib/componentsv2/element/skin.js.map +0 -1
- package/lib/componentsv2/element/skin.ts +0 -64
- package/lib/componentsv2/grid/component.d.ts.map +0 -1
- package/lib/componentsv2/grid/component.js.map +0 -1
- package/lib/componentsv2/grid/component.ts +0 -57
- package/lib/componentsv2/grid/engine.d.ts.map +0 -1
- package/lib/componentsv2/grid/engine.js.map +0 -1
- package/lib/componentsv2/grid/engine.ts +0 -187
- package/lib/componentsv2/grid/skin.d.ts.map +0 -1
- package/lib/componentsv2/grid/skin.js.map +0 -1
- package/lib/componentsv2/grid/skin.ts +0 -106
- package/lib/componentsv2/input/component.d.ts.map +0 -1
- package/lib/componentsv2/input/component.js.map +0 -1
- package/lib/componentsv2/input/component.ts +0 -28
- package/lib/componentsv2/input/engine.d.ts.map +0 -1
- package/lib/componentsv2/input/engine.js.map +0 -1
- package/lib/componentsv2/input/engine.ts +0 -179
- package/lib/componentsv2/input/skin.d.ts.map +0 -1
- package/lib/componentsv2/input/skin.js.map +0 -1
- package/lib/componentsv2/input/skin.ts +0 -89
- package/lib/componentsv2/list/component.d.ts.map +0 -1
- package/lib/componentsv2/list/component.js.map +0 -1
- package/lib/componentsv2/list/component.ts +0 -119
- package/lib/componentsv2/list/engine.d.ts.map +0 -1
- package/lib/componentsv2/list/engine.js.map +0 -1
- package/lib/componentsv2/list/engine.ts +0 -412
- package/lib/componentsv2/list/skin.d.ts.map +0 -1
- package/lib/componentsv2/list/skin.js.map +0 -1
- package/lib/componentsv2/list/skin.ts +0 -369
- package/lib/componentsv2/plugins/ClientSQLitePlugin.d.ts.map +0 -1
- package/lib/componentsv2/plugins/ClientSQLitePlugin.js.map +0 -1
- package/lib/componentsv2/plugins/ClientSQLitePlugin.ts +0 -154
- package/lib/componentsv2/plugins/IndexedDBPlugin.d.ts.map +0 -1
- package/lib/componentsv2/plugins/IndexedDBPlugin.js.map +0 -1
- package/lib/componentsv2/plugins/IndexedDBPlugin.ts +0 -96
- package/lib/componentsv2/plugins/LocalStoragePlugin.d.ts.map +0 -1
- package/lib/componentsv2/plugins/LocalStoragePlugin.js.map +0 -1
- package/lib/componentsv2/plugins/LocalStoragePlugin.ts +0 -86
- package/lib/componentsv2/plugins/ServerSQLitePlugin.d.ts.map +0 -1
- package/lib/componentsv2/plugins/ServerSQLitePlugin.js.map +0 -1
- package/lib/componentsv2/plugins/ServerSQLitePlugin.ts +0 -99
- package/lib/utils/fetch.d.ts.map +0 -1
- package/lib/utils/fetch.js.map +0 -1
- package/lib/utils/fetch.ts +0 -553
package/machinery/compiler3.js
CHANGED
|
@@ -93,11 +93,15 @@ export class JuxCompiler {
|
|
|
93
93
|
return name.replace(/[^a-zA-Z0-9]/g, '_');
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
+
/**
|
|
97
|
+
* Collect and bundle all component CSS into a single file
|
|
98
|
+
*/
|
|
96
99
|
copyJuxscriptCss() {
|
|
97
100
|
const componentsDir = this.getComponentsDir();
|
|
98
|
-
if (!componentsDir) return [];
|
|
101
|
+
if (!componentsDir) return { bundlePath: null, components: [] };
|
|
99
102
|
|
|
100
|
-
const
|
|
103
|
+
const cssContents = [];
|
|
104
|
+
const components = [];
|
|
101
105
|
|
|
102
106
|
const walkDir = (dir, relativePath = '') => {
|
|
103
107
|
if (!fs.existsSync(dir)) return;
|
|
@@ -108,28 +112,61 @@ export class JuxCompiler {
|
|
|
108
112
|
if (entry.isDirectory()) {
|
|
109
113
|
walkDir(fullPath, relPath);
|
|
110
114
|
} else if (entry.name === 'structure.css') {
|
|
111
|
-
|
|
115
|
+
const componentName = relativePath || 'base';
|
|
116
|
+
const content = fs.readFileSync(fullPath, 'utf8');
|
|
117
|
+
|
|
118
|
+
// Add comment header for each component's CSS
|
|
119
|
+
cssContents.push(`/* ═══════════════════════════════════════════════════════════════
|
|
120
|
+
* Component: ${componentName}
|
|
121
|
+
* Source: ${relPath}
|
|
122
|
+
* ═══════════════════════════════════════════════════════════════ */\n`);
|
|
123
|
+
cssContents.push(content);
|
|
124
|
+
cssContents.push('\n');
|
|
125
|
+
|
|
126
|
+
components.push(componentName);
|
|
112
127
|
}
|
|
113
128
|
}
|
|
114
129
|
};
|
|
115
130
|
|
|
116
131
|
walkDir(componentsDir);
|
|
117
132
|
|
|
133
|
+
if (cssContents.length === 0) {
|
|
134
|
+
return { bundlePath: null, components: [] };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Create bundled CSS file
|
|
118
138
|
const cssDistDir = path.join(this.distDir, 'css');
|
|
119
139
|
fs.mkdirSync(cssDistDir, { recursive: true });
|
|
120
140
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
141
|
+
const bundleHeader = `/**
|
|
142
|
+
* JUX Component Styles Bundle
|
|
143
|
+
* Auto-generated - Do not edit directly
|
|
144
|
+
*
|
|
145
|
+
* Components included:
|
|
146
|
+
* ${components.map(c => ` - ${c}`).join('\n * ')}
|
|
147
|
+
*
|
|
148
|
+
* Generated: ${new Date().toISOString()}
|
|
149
|
+
*/\n\n`;
|
|
150
|
+
|
|
151
|
+
const bundledCss = bundleHeader + cssContents.join('\n');
|
|
152
|
+
const bundlePath = path.join(cssDistDir, 'jux-components.css');
|
|
126
153
|
|
|
127
|
-
|
|
128
|
-
|
|
154
|
+
fs.writeFileSync(bundlePath, bundledCss);
|
|
155
|
+
|
|
156
|
+
console.log(`📄 Bundled ${components.length} CSS files → css/jux-components.css`);
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
bundlePath: './css/jux-components.css',
|
|
160
|
+
components
|
|
161
|
+
};
|
|
129
162
|
}
|
|
130
163
|
|
|
131
|
-
|
|
132
|
-
|
|
164
|
+
/**
|
|
165
|
+
* Generate single CSS link for the bundled stylesheet
|
|
166
|
+
*/
|
|
167
|
+
generateCssLinks(cssBundle) {
|
|
168
|
+
if (!cssBundle.bundlePath) return '';
|
|
169
|
+
return ` <link rel="stylesheet" href="${cssBundle.bundlePath}">`;
|
|
133
170
|
}
|
|
134
171
|
|
|
135
172
|
async loadJuxscriptExports() {
|
|
@@ -565,7 +602,8 @@ navigate(location.pathname);
|
|
|
565
602
|
const { views, dataModules, sharedModules } = this.scanFiles();
|
|
566
603
|
console.log(`📁 Found ${views.length} views, ${sharedModules.length} shared, ${dataModules.length} data\n`);
|
|
567
604
|
|
|
568
|
-
|
|
605
|
+
// ✅ Changed: Now returns bundle info instead of array of files
|
|
606
|
+
const cssBundle = this.copyJuxscriptCss();
|
|
569
607
|
|
|
570
608
|
// Copy data/shared modules to dist
|
|
571
609
|
const juxDistDir = path.join(this.distDir, 'jux');
|
|
@@ -612,14 +650,14 @@ navigate(location.pathname);
|
|
|
612
650
|
return { success: false, errors: [{ message: err.message }], warnings: [] };
|
|
613
651
|
}
|
|
614
652
|
|
|
615
|
-
// Generate index.html
|
|
653
|
+
// Generate index.html with single CSS link
|
|
616
654
|
const html = `<!DOCTYPE html>
|
|
617
655
|
<html lang="en">
|
|
618
656
|
<head>
|
|
619
657
|
<meta charset="UTF-8">
|
|
620
658
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
621
659
|
<title>JUX App</title>
|
|
622
|
-
${this.generateCssLinks(
|
|
660
|
+
${this.generateCssLinks(cssBundle)}
|
|
623
661
|
<script type="module" src="./bundle.js"></script>
|
|
624
662
|
</head>
|
|
625
663
|
<body>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "juxscript",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.104",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A JavaScript UX authorship platform",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -22,7 +22,10 @@
|
|
|
22
22
|
"index.js",
|
|
23
23
|
"bin",
|
|
24
24
|
"create",
|
|
25
|
-
"lib",
|
|
25
|
+
"lib/**/*.js",
|
|
26
|
+
"lib/**/*.d.ts",
|
|
27
|
+
"lib/**/*.css",
|
|
28
|
+
"lib/**/stubs/*.stub",
|
|
26
29
|
"machinery",
|
|
27
30
|
"types",
|
|
28
31
|
"juxconfig.example.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BaseEngine.d.ts","sourceRoot":"","sources":["BaseEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BaseEngine.js","sourceRoot":"","sources":["BaseEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,332 +0,0 @@
|
|
|
1
|
-
import { State } from './State.js';
|
|
2
|
-
import { GlobalBus } from './GlobalBus.js';
|
|
3
|
-
import { validateOptions, OptionsContractSchema, ValidationResult } from './OptionsContract.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export interface JuxServiceContract<TEngine = any> {
|
|
7
|
-
name: string;
|
|
8
|
-
version?: string;
|
|
9
|
-
targetEnv?: 'client' | 'server' | 'universal'; // Environment Constraint
|
|
10
|
-
install: (engine: TEngine) => void;
|
|
11
|
-
uninstall?: (engine: TEngine) => void;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface BaseState {
|
|
15
|
-
id: string;
|
|
16
|
-
classes: string[];
|
|
17
|
-
visible: boolean;
|
|
18
|
-
disabled: boolean;
|
|
19
|
-
loading: boolean;
|
|
20
|
-
attributes: Record<string, string>;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
type EventListener<T = any> = (data: T) => void;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* THE ENGINE AGREEMENT
|
|
27
|
-
*
|
|
28
|
-
* 1. Must define State and Options types.
|
|
29
|
-
* 2. Must implement `prepareState` to map Options -> Initial State.
|
|
30
|
-
* 3. Provides reactivity, eventing, and plugin systems out of the box.
|
|
31
|
-
*/
|
|
32
|
-
export abstract class BaseEngine<TState extends BaseState, TOptions = any> {
|
|
33
|
-
#state: State<TState>;
|
|
34
|
-
#listeners = new Map<string, Set<EventListener>>();
|
|
35
|
-
#cleanupListeners: Array<() => void> = [];
|
|
36
|
-
#plugins = new Map<string, JuxServiceContract>();
|
|
37
|
-
#emitHistory: string[] = [];
|
|
38
|
-
#debugMode = false;
|
|
39
|
-
#validationResult: ValidationResult | null = null;
|
|
40
|
-
|
|
41
|
-
constructor(id: string, options: TOptions) {
|
|
42
|
-
// Validate options if schema is defined
|
|
43
|
-
const schema = this.optionsSchema;
|
|
44
|
-
if (schema) {
|
|
45
|
-
this.#validationResult = validateOptions(
|
|
46
|
-
this.constructor.name,
|
|
47
|
-
options as Record<string, any>,
|
|
48
|
-
schema,
|
|
49
|
-
this.#debugMode
|
|
50
|
-
);
|
|
51
|
-
options = this.#validationResult.normalized as TOptions;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Enforce the Contract: Child must define how state is born from options
|
|
55
|
-
const initialState = this.prepareState(id, options);
|
|
56
|
-
this.#state = new State(initialState);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* CONTRACT: Override to define the valid options schema for this engine.
|
|
61
|
-
* Enables option validation with helpful error messages.
|
|
62
|
-
*/
|
|
63
|
-
protected get optionsSchema(): OptionsContractSchema | null {
|
|
64
|
-
return null; // Override in child classes
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Access validation results (warnings, errors, normalized options)
|
|
69
|
-
*/
|
|
70
|
-
get validation(): ValidationResult | null {
|
|
71
|
-
return this.#validationResult;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* CONTRACT: Must transform input options into the initial State.
|
|
76
|
-
* This separates "mapping logic" from "construction/startup logic".
|
|
77
|
-
*/
|
|
78
|
-
protected abstract prepareState(id: string, options: TOptions): TState;
|
|
79
|
-
|
|
80
|
-
get state(): TState {
|
|
81
|
-
return this.#state.value;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
subscribe(callback: (value: TState) => void) {
|
|
85
|
-
return this.#state.subscribe(callback);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Enable/Disable Active Console Logging
|
|
90
|
-
*/
|
|
91
|
-
debug(enabled: boolean = true): this {
|
|
92
|
-
this.#debugMode = enabled;
|
|
93
|
-
if (enabled) {
|
|
94
|
-
console.info(`%c[JUX DEBUG] Mode Enabled for %c${this.state.id}`, 'color: #ff00ff; font-weight: bold;', 'font-weight: bold;');
|
|
95
|
-
}
|
|
96
|
-
return this;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
protected updateState(patch: Partial<TState>): void {
|
|
100
|
-
if (this.#debugMode) {
|
|
101
|
-
console.groupCollapsed(`%c 💾 STATE %c ${this.state.id}`, 'color: #ff9900; font-weight: bold;', 'color: #888');
|
|
102
|
-
console.log('Patch:', patch);
|
|
103
|
-
console.log('Result:', { ...this.#state.value, ...patch });
|
|
104
|
-
console.groupEnd();
|
|
105
|
-
}
|
|
106
|
-
this.#state.set({ ...this.#state.value, ...patch });
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Revert the state to the previous snapshot
|
|
111
|
-
*/
|
|
112
|
-
rollback(): this {
|
|
113
|
-
this.#state.rollback();
|
|
114
|
-
this.emit('rollback', { index: this.#state.history.length }); // ✅ Added Emission
|
|
115
|
-
return this; // ✅ Fluent Return
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Redo the previously rolled-back state
|
|
120
|
-
*/
|
|
121
|
-
rollforward(): this {
|
|
122
|
-
this.#state.rollforward();
|
|
123
|
-
this.emit('rollforward', { index: this.#state.history.length }); // ✅ Added Emission
|
|
124
|
-
return this; // ✅ Fluent Return
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// --- Interaction System ---
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Local Subscription: Subscribe to a specific named event on THIS instance.
|
|
131
|
-
*/
|
|
132
|
-
on<T = any>(event: string, callback: EventListener<T>): this {
|
|
133
|
-
if (!this.#listeners.has(event)) {
|
|
134
|
-
this.#listeners.set(event, new Set());
|
|
135
|
-
}
|
|
136
|
-
this.#listeners.get(event)!.add(callback);
|
|
137
|
-
return this;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Unsubscribe from a local event.
|
|
142
|
-
*/
|
|
143
|
-
off<T = any>(event: string, callback: EventListener<T>): this {
|
|
144
|
-
this.#listeners.get(event)?.delete(callback);
|
|
145
|
-
return this;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* THE LISTENER (Neighborhood Watch)
|
|
150
|
-
* Listen for events broadcasting on the global frequency.
|
|
151
|
-
* @param channel The global channel name (e.g. 'demo-list-v2:move')
|
|
152
|
-
* @param callback Reaction logic
|
|
153
|
-
*/
|
|
154
|
-
listenTo<T = any>(channel: string, callback: EventListener<T>): this {
|
|
155
|
-
GlobalBus.on(channel, callback);
|
|
156
|
-
// Track for cleanup
|
|
157
|
-
this.#cleanupListeners.push(() => GlobalBus.off(channel, callback));
|
|
158
|
-
return this;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Cleanup all global listeners attached by this engine.
|
|
163
|
-
*/
|
|
164
|
-
dispose(): void {
|
|
165
|
-
// 1. Uninstall Plugins
|
|
166
|
-
this.#plugins.forEach(p => {
|
|
167
|
-
try {
|
|
168
|
-
if (p.uninstall) p.uninstall(this);
|
|
169
|
-
} catch (e) {
|
|
170
|
-
console.error(`Jux: Error uninstalling plugin ${p.name}`, e);
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
this.#plugins.clear();
|
|
174
|
-
|
|
175
|
-
// 2. Clear Listeners
|
|
176
|
-
this.#cleanupListeners.forEach(cleanup => cleanup());
|
|
177
|
-
this.#cleanupListeners = [];
|
|
178
|
-
|
|
179
|
-
if (this.#debugMode) console.log(`%c[JUX] Disposed ${this.state.id}`, 'color: #888');
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* BROADCASTER
|
|
184
|
-
* Emits locally AND to the global neighborhood.
|
|
185
|
-
*/
|
|
186
|
-
protected emit(event: string, data: any): void {
|
|
187
|
-
const timestamp = new Date().toISOString();
|
|
188
|
-
|
|
189
|
-
// 0. Record History
|
|
190
|
-
this.#emitHistory.push(JSON.stringify({ timestamp, event, data }));
|
|
191
|
-
|
|
192
|
-
if (this.#debugMode) {
|
|
193
|
-
console.log(`%c 📡 EMIT %c ${this.state.id}:${event}`, 'color: #00ccff; font-weight: bold;', 'color: #333; font-weight: bold;', data);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// 1. Notify Local Listeners
|
|
197
|
-
this.#listeners.get(event)?.forEach(cb => cb(data));
|
|
198
|
-
|
|
199
|
-
// 2. Notify The Neighborhood (Global Bus)
|
|
200
|
-
// Format: "ComponentID:EventName"
|
|
201
|
-
const globalChannel = `${this.state.id}:${event}`;
|
|
202
|
-
|
|
203
|
-
GlobalBus.emit(globalChannel, {
|
|
204
|
-
...data,
|
|
205
|
-
_event: event,
|
|
206
|
-
_source: this.state.id
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* DEBUG: Access the Global Event Bus registry to see active channels and listener identities.
|
|
212
|
-
* Useful for debugging communication topology from the console.
|
|
213
|
-
*/
|
|
214
|
-
get eventRegistry(): Record<string, string[]> {
|
|
215
|
-
return GlobalBus.registry;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* DEBUG: Access the Internal State Ledger (History).
|
|
220
|
-
* Returns an array of JSON strings representing past states.
|
|
221
|
-
*/
|
|
222
|
-
get stateHistory(): string[] {
|
|
223
|
-
return this.#state.history;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* DEBUG: Access the Event Emission Ledger.
|
|
228
|
-
*/
|
|
229
|
-
get emitHistory(): string[] {
|
|
230
|
-
return [...this.#emitHistory];
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
/* ═════════════════════════════════════════════════════════════════
|
|
234
|
-
* EXTENSION SYSTEM (DI / Plugins)
|
|
235
|
-
* ═════════════════════════════════════════════════════════════════ */
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Inject a Service/Plugin into this Engine.
|
|
239
|
-
* @param plugin A contract object { name, install, uninstall? }
|
|
240
|
-
*/
|
|
241
|
-
addPlugin(plugin: JuxServiceContract<this>): this {
|
|
242
|
-
if (this.#plugins.has(plugin.name)) {
|
|
243
|
-
console.warn(`Jux: Plugin "${plugin.name}" already registered on ${this.state.id}.`);
|
|
244
|
-
return this;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
if (this.#debugMode) {
|
|
248
|
-
console.log(`%c 🔌 PLUGIN %c Installed: ${plugin.name} (v${plugin.version || '?'})`, 'color: #cc00ff; font-weight: bold;', 'color: #333');
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
this.#plugins.set(plugin.name, plugin);
|
|
252
|
-
|
|
253
|
-
try {
|
|
254
|
-
plugin.install(this);
|
|
255
|
-
this.emit('plugin:added', { name: plugin.name });
|
|
256
|
-
} catch (err) {
|
|
257
|
-
console.error(`Jux: Failed to install plugin "${plugin.name}"`, err);
|
|
258
|
-
// Rollback registration on failure
|
|
259
|
-
this.#plugins.delete(plugin.name);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
return this;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Remove a plugin and run its teardown logic.
|
|
267
|
-
*/
|
|
268
|
-
removePlugin(name: string): this {
|
|
269
|
-
const plugin = this.#plugins.get(name);
|
|
270
|
-
if (plugin) {
|
|
271
|
-
if (plugin.uninstall) {
|
|
272
|
-
try {
|
|
273
|
-
plugin.uninstall(this);
|
|
274
|
-
} catch (err) {
|
|
275
|
-
console.error(`Jux: Error uninstalling plugin "${name}"`, err);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
this.#plugins.delete(name);
|
|
279
|
-
this.emit('plugin:removed', { name });
|
|
280
|
-
}
|
|
281
|
-
return this;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/* ═════════════════════════════════════════════════════════════════
|
|
285
|
-
* COMMON FLUENT API (Universal Capabilities)
|
|
286
|
-
* ═════════════════════════════════════════════════════════════════ */
|
|
287
|
-
|
|
288
|
-
addClass(className: string): this {
|
|
289
|
-
const current = this.state.classes;
|
|
290
|
-
if (!current.includes(className)) {
|
|
291
|
-
this.updateState({ classes: [...current, className] } as Partial<TState>);
|
|
292
|
-
this.emit('classAdd', { className });
|
|
293
|
-
}
|
|
294
|
-
return this;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
removeClass(className: string): this {
|
|
298
|
-
const current = this.state.classes;
|
|
299
|
-
this.updateState({
|
|
300
|
-
classes: current.filter(c => c !== className)
|
|
301
|
-
} as Partial<TState>);
|
|
302
|
-
this.emit('classRemove', { className });
|
|
303
|
-
return this;
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
visible(isVisible: boolean): this {
|
|
307
|
-
this.updateState({ visible: isVisible } as Partial<TState>);
|
|
308
|
-
this.emit('visible', { visible: isVisible });
|
|
309
|
-
return this;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
disable(isDisabled: boolean = true): this {
|
|
313
|
-
this.updateState({ disabled: isDisabled } as Partial<TState>);
|
|
314
|
-
this.emit('disabled', { disabled: isDisabled });
|
|
315
|
-
return this;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
loading(isLoading: boolean = true): this {
|
|
319
|
-
this.updateState({ loading: isLoading } as Partial<TState>);
|
|
320
|
-
this.emit('loading', { loading: isLoading });
|
|
321
|
-
return this;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
attr(key: string, value: string): this {
|
|
325
|
-
const current = this.state.attributes;
|
|
326
|
-
this.updateState({
|
|
327
|
-
attributes: { ...current, [key]: value }
|
|
328
|
-
} as Partial<TState>);
|
|
329
|
-
this.emit('attribute', { key, value });
|
|
330
|
-
return this;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BaseSkin.d.ts","sourceRoot":"","sources":["BaseSkin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;;;;;;GAQG;AACH,8BAAsB,QAAQ,CAAC,MAAM,SAAS,SAAS,EAAE,OAAO,SAAS,UAAU,CAAC,MAAM,CAAC;IACvF,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAQ;gBAE9B,MAAM,EAAE,OAAO;IAI3B;;;;;;;;MAQE;IACF,SAAS,CAAC,QAAQ,KAAK,YAAY,IAAI,MAAM,CAAC;IAG9C;;;;;OAKG;IACI,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAgBpD;;;OAGG;IACH;;;OAGG;IACI,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAMzC;;;OAGG;IACI,UAAU,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,GAAE,QAAQ,GAAG,SAAoB,GAAG,IAAI;IAqB1F,SAAS,CAAC,UAAU,IAAI,WAAW;IAInC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAEtD,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAElD;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAoB3E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BaseSkin.js","sourceRoot":"","sources":["BaseSkin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { BaseEngine, BaseState } from './BaseEngine.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* THE SKIN AGREEMENT
|
|
5
|
-
*
|
|
6
|
-
* A Skin must:
|
|
7
|
-
* 1. Hold a reference to its Engine.
|
|
8
|
-
* 2. Implement `structureCss` to provide layout styles.
|
|
9
|
-
* 3. Implement hooks for creation (`createRoot`) and event binding (`bindEvents`).
|
|
10
|
-
* 4. Implement `updateSkin(state)` to react to State changes.
|
|
11
|
-
*/
|
|
12
|
-
export abstract class BaseSkin<TState extends BaseState, TEngine extends BaseEngine<TState>> {
|
|
13
|
-
protected engine: TEngine;
|
|
14
|
-
protected root: HTMLElement | null = null;
|
|
15
|
-
|
|
16
|
-
constructor(engine: TEngine) {
|
|
17
|
-
this.engine = engine;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* CONTRACT: Provide the URL/Path to the structural CSS file.
|
|
22
|
-
*
|
|
23
|
-
* 💡 WHY `import.meta.url`?
|
|
24
|
-
* Standard `import` statements load JS modules. To load ASSETS (like CSS) at runtime,
|
|
25
|
-
* we need their full URL. `import.meta.url` tells the browser "Start looking from THIS file".
|
|
26
|
-
*
|
|
27
|
-
* Usage: return new URL('./structure.css', import.meta.url).href;
|
|
28
|
-
*/
|
|
29
|
-
protected abstract get structureCss(): string;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Utility: Inject or Update a CSS Link tag in the document head.
|
|
34
|
-
* Allows for external CSS files ('references') and runtime Theme Swapping.
|
|
35
|
-
* @param id Unique ID for the link tag
|
|
36
|
-
* @param href The URL to the CSS file
|
|
37
|
-
*/
|
|
38
|
-
public injectCSSLink(id: string, href: string): void {
|
|
39
|
-
if (typeof document === 'undefined') return;
|
|
40
|
-
|
|
41
|
-
let link = document.getElementById(id) as HTMLLinkElement;
|
|
42
|
-
if (!link) {
|
|
43
|
-
link = document.createElement('link');
|
|
44
|
-
link.id = id;
|
|
45
|
-
link.rel = 'stylesheet';
|
|
46
|
-
document.head.appendChild(link);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (link.href !== href) {
|
|
50
|
-
link.href = href;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Utility: Inject CSS into the document head if not already present.
|
|
56
|
-
* Useful for Skins to seamlessly load their required aesthetics.
|
|
57
|
-
*/
|
|
58
|
-
/**
|
|
59
|
-
* API: Hot-Swap the Aesthetic Skin.
|
|
60
|
-
* Replaces the component-specific CSS styles at runtime.
|
|
61
|
-
*/
|
|
62
|
-
public setTheme(cssContent: string): void {
|
|
63
|
-
const id = `jux-skin-${this.engine.state.id}-theme`;
|
|
64
|
-
const oldStyle = document.getElementById(id);
|
|
65
|
-
if (oldStyle) oldStyle.remove();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Template Method: Render
|
|
70
|
-
* Orchestrates the standard lifecycle: Create -> Bind -> Mount -> Subscribe.
|
|
71
|
-
*/
|
|
72
|
-
public renderSkin(targetElement: HTMLElement, mode: 'append' | 'prepend' = 'append'): void {
|
|
73
|
-
// 0. Inject Immutable Structure (Layout logic)
|
|
74
|
-
// We use constructor.name to deduplicate style tags across multiple instances of the same component type.
|
|
75
|
-
|
|
76
|
-
// 1. Create Root (Abstract Hook)
|
|
77
|
-
this.root = this.createRoot();
|
|
78
|
-
|
|
79
|
-
// 2. Bind Events (Hook)
|
|
80
|
-
this.bindEvents(this.root);
|
|
81
|
-
|
|
82
|
-
// 3. Mount
|
|
83
|
-
if (mode === 'prepend') {
|
|
84
|
-
targetElement.prepend(this.root);
|
|
85
|
-
} else {
|
|
86
|
-
targetElement.appendChild(this.root);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// 4. Subscribe (Automatic)
|
|
90
|
-
this.engine.subscribe((state) => this.updateSkin(state));
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
protected createRoot(): HTMLElement {
|
|
94
|
-
return document.createElement('div');
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
protected abstract bindEvents(root: HTMLElement): void;
|
|
98
|
-
|
|
99
|
-
protected abstract updateSkin(state: TState): void;
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* HELPER: Applies universal Jux behavior (visibility, ID, disabled)
|
|
103
|
-
*/
|
|
104
|
-
protected applySkinAttributes(element: HTMLElement, state: TState): void {
|
|
105
|
-
element.style.display = state.visible ? '' : 'none';
|
|
106
|
-
element.dataset.id = state.id;
|
|
107
|
-
|
|
108
|
-
if (state.disabled) {
|
|
109
|
-
element.setAttribute('aria-disabled', 'true');
|
|
110
|
-
} else {
|
|
111
|
-
element.removeAttribute('aria-disabled');
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (state.loading) {
|
|
115
|
-
element.setAttribute('aria-busy', 'true');
|
|
116
|
-
} else {
|
|
117
|
-
element.removeAttribute('aria-busy');
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
Object.entries(state.attributes).forEach(([k, v]) => {
|
|
121
|
-
element.setAttribute(k, v);
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalBus.d.ts","sourceRoot":"","sources":["GlobalBus.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;AAE1C;;;;;GAKG;AACH,qBAAa,YAAY;IACrB,OAAO,CAAC,SAAS,CAA0C;IAE3D,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAOnD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAUpD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAetC;;;;OAIG;IACH,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAOvC;CACJ;AAGD,eAAO,MAAM,SAAS,cAAqB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalBus.js","sourceRoot":"","sources":["GlobalBus.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IAAzB;QACY,cAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IA+C/D,CAAC;IA7CG,EAAE,CAAC,OAAe,EAAE,QAAwB;QACxC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,GAAG,CAAC,OAAe,EAAE,QAAwB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,GAAG,EAAE,CAAC;YACN,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrB,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAS;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,GAAG,EAAE,CAAC;YACN,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACnB,IAAI,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,OAAO,CAAC,KAAK,CAAC,wBAAwB,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC1D,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAED,6EAA6E;IACjF,CAAC;IAED;;;;OAIG;IACH,IAAI,QAAQ;QACR,MAAM,QAAQ,GAA6B,EAAE,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YACpC,+DAA+D;YAC/D,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,aAAa,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,YAAY,EAAE,CAAC"}
|