juxscript 1.0.67 → 1.0.69
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/bin/cli.js +66 -307
- package/create/index.jux +79 -90
- package/create/layout.jux +38 -18
- package/lib/componentsv2/element/component.js +23 -0
- package/lib/componentsv2/element/component.js.map +1 -0
- package/lib/componentsv2/element/component.ts +32 -0
- package/lib/componentsv2/element/engine.js +66 -0
- package/lib/componentsv2/element/engine.js.map +1 -0
- package/lib/componentsv2/element/engine.ts +88 -0
- package/lib/componentsv2/element/skin.js +53 -0
- package/lib/componentsv2/element/skin.js.map +1 -0
- package/lib/componentsv2/element/skin.ts +64 -0
- package/lib/componentsv2/element/structure.css +16 -0
- package/lib/componentsv2/index.js +3 -2
- package/lib/componentsv2/index.js.map +1 -1
- package/lib/componentsv2/index.ts +4 -6
- package/lib/componentsv2/tools/Scaffold.js +0 -16
- package/machinery/compiler.js +103 -739
- package/machinery/server.js +16 -112
- package/machinery/watcher.js +16 -106
- package/package.json +1 -1
- package/create/all.jux +0 -343
package/create/layout.jux
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Element, Grid } from 'juxscript';
|
|
2
2
|
|
|
3
3
|
// Import the layout styles - testing link.
|
|
4
4
|
|
|
@@ -9,32 +9,35 @@ import { jux } from 'juxscript';
|
|
|
9
9
|
// Note: #app is automatically created by the Jux compiler
|
|
10
10
|
|
|
11
11
|
export function initializeGrid() {
|
|
12
|
-
// add the base jux styles
|
|
13
|
-
|
|
12
|
+
// add the base jux styles via style tag import
|
|
13
|
+
Element('layout-css', { tag: 'style' })
|
|
14
|
+
.text('@import "style.css";')
|
|
15
|
+
.render(document.head);
|
|
16
|
+
|
|
14
17
|
// Header area
|
|
15
|
-
const appHeader =
|
|
16
|
-
const appHeaderContent =
|
|
17
|
-
const appHeaderLogo =
|
|
18
|
-
const appHeaderNav =
|
|
19
|
-
const appHeaderActions =
|
|
18
|
+
const appHeader = Element('appheader').render('#app');
|
|
19
|
+
const appHeaderContent = Element('appheader-content').render('#appheader');
|
|
20
|
+
const appHeaderLogo = Element('appheader-logo').render('#appheader-content');
|
|
21
|
+
const appHeaderNav = Element('appheader-nav').render('#appheader-content');
|
|
22
|
+
const appHeaderActions = Element('appheader-actions').render('#appheader-content');
|
|
20
23
|
|
|
21
24
|
// Left sidebar
|
|
22
|
-
const appAside =
|
|
25
|
+
const appAside = Element('appaside').render('#app');
|
|
23
26
|
|
|
24
27
|
// Main content area
|
|
25
|
-
const appMain =
|
|
26
|
-
const appMainContent =
|
|
28
|
+
const appMain = Element('appmain').render('#app');
|
|
29
|
+
const appMainContent = Element('appmain-content').render('#appmain');
|
|
27
30
|
|
|
28
31
|
// Right sidebar (optional - starts hidden)
|
|
29
|
-
const appSidebar =
|
|
30
|
-
const appSidebarHeader =
|
|
31
|
-
const appSidebarContent =
|
|
32
|
-
const appSidebarFooter =
|
|
32
|
+
const appSidebar = Element('appsidebar').render('#app');
|
|
33
|
+
const appSidebarHeader = Element('appsidebar-header').render('#appsidebar');
|
|
34
|
+
const appSidebarContent = Element('appsidebar-content').render('#appsidebar');
|
|
35
|
+
const appSidebarFooter = Element('appsidebar-footer').render('#appsidebar');
|
|
33
36
|
|
|
34
37
|
// Footer area
|
|
35
|
-
const appFooter =
|
|
36
|
-
const appFooterContent =
|
|
37
|
-
const appFooterLegal =
|
|
38
|
+
const appFooter = Element('appfooter').render('#app');
|
|
39
|
+
const appFooterContent = Element('appfooter-content').render('#appfooter');
|
|
40
|
+
const appFooterLegal = Element('appfooter-legal').render('#appfooter-content');
|
|
38
41
|
|
|
39
42
|
// Return references to all containers
|
|
40
43
|
return {
|
|
@@ -54,4 +57,21 @@ export function initializeGrid() {
|
|
|
54
57
|
appFooterContent,
|
|
55
58
|
appFooterLegal
|
|
56
59
|
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function LandingLayout() {
|
|
63
|
+
// Defines a classic landing page structure using JUX Grid
|
|
64
|
+
return Grid('landing-layout')
|
|
65
|
+
.rows([
|
|
66
|
+
{ size: '80px', class: 'layout-header' }, // 0: Navbar
|
|
67
|
+
{ size: '500px', class: 'layout-hero' }, // 1: Hero Banner
|
|
68
|
+
{ size: 'auto', class: 'layout-features' }, // 2: Main Content
|
|
69
|
+
{ size: '120px', class: 'layout-footer' } // 3: Footer
|
|
70
|
+
])
|
|
71
|
+
.columns([
|
|
72
|
+
{ size: '1fr', class: 'col-main' } // Single column flow
|
|
73
|
+
])
|
|
74
|
+
.gap('0px')
|
|
75
|
+
.width('100%')
|
|
76
|
+
.render('app');
|
|
57
77
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ElementEngine } from './engine.js';
|
|
2
|
+
import { ElementSkin } from './skin.js';
|
|
3
|
+
export function Element(id, options = {}) {
|
|
4
|
+
const engine = new ElementEngine(id, options);
|
|
5
|
+
if (typeof window !== 'undefined') {
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
window.juxEngines = window.juxEngines || {};
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
window.juxEngines[id] = engine;
|
|
10
|
+
}
|
|
11
|
+
const skin = new ElementSkin(engine);
|
|
12
|
+
// @ts-ignore
|
|
13
|
+
engine.render = (targetId) => {
|
|
14
|
+
const target = typeof targetId === 'string' ? document.getElementById(targetId) : targetId;
|
|
15
|
+
if (target)
|
|
16
|
+
skin.renderSkin(target);
|
|
17
|
+
return engine;
|
|
18
|
+
};
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
engine.injectCSS = (id, css) => skin.injectCSS(id, css);
|
|
21
|
+
return engine;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,MAAM,UAAU,OAAO,CAAC,EAAU,EAAE,UAA0B,EAAE;IAC5D,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAE9C,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAChC,aAAa;QACb,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC5C,aAAa;QACb,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;IACnC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAErC,aAAa;IACb,MAAM,CAAC,MAAM,GAAG,CAAC,QAA8B,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC3F,IAAI,MAAM;YAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,MAA0B,CAAC;IACtC,CAAC,CAAC;IAEF,aAAa;IACb,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAExD,OAAO,MAA0B,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ElementEngine, ElementOptions } from './engine.js';
|
|
2
|
+
import { ElementSkin } from './skin.js';
|
|
3
|
+
|
|
4
|
+
export type ElementComponent = ElementEngine & {
|
|
5
|
+
render: (targetId: string | HTMLElement) => ElementComponent;
|
|
6
|
+
injectCSS: (id: string, cssContent: string) => void;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export function Element(id: string, options: ElementOptions = {}): ElementComponent {
|
|
10
|
+
const engine = new ElementEngine(id, options);
|
|
11
|
+
|
|
12
|
+
if (typeof window !== 'undefined') {
|
|
13
|
+
// @ts-ignore
|
|
14
|
+
window.juxEngines = window.juxEngines || {};
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
window.juxEngines[id] = engine;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const skin = new ElementSkin(engine);
|
|
20
|
+
|
|
21
|
+
// @ts-ignore
|
|
22
|
+
engine.render = (targetId: string | HTMLElement) => {
|
|
23
|
+
const target = typeof targetId === 'string' ? document.getElementById(targetId) : targetId;
|
|
24
|
+
if (target) skin.renderSkin(target);
|
|
25
|
+
return engine as ElementComponent;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// @ts-ignore
|
|
29
|
+
engine.injectCSS = (id, css) => skin.injectCSS(id, css);
|
|
30
|
+
|
|
31
|
+
return engine as ElementComponent;
|
|
32
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { BaseEngine } from '../base/BaseEngine.js';
|
|
2
|
+
export class ElementEngine extends BaseEngine {
|
|
3
|
+
constructor(id, options = {}) {
|
|
4
|
+
super(id, options);
|
|
5
|
+
}
|
|
6
|
+
prepareState(id, options) {
|
|
7
|
+
return {
|
|
8
|
+
id,
|
|
9
|
+
classes: ['jux-element'],
|
|
10
|
+
visible: true,
|
|
11
|
+
disabled: false,
|
|
12
|
+
loading: false,
|
|
13
|
+
attributes: {},
|
|
14
|
+
tagName: options.tag || 'div',
|
|
15
|
+
content: options.html || options.text || '',
|
|
16
|
+
contentType: options.html ? 'html' : 'text',
|
|
17
|
+
inlineStyle: options.style || '' // ✅ Initialize logic
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set the HTML Tag name (e.g. 'div', 'span', 'h1', 'section')
|
|
22
|
+
*/
|
|
23
|
+
tag(tagName) {
|
|
24
|
+
this.updateState({ tagName });
|
|
25
|
+
this.emit('config', { tagName });
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Set plain text content (automatically escaped)
|
|
30
|
+
*/
|
|
31
|
+
text(value) {
|
|
32
|
+
this.updateState({ content: value, contentType: 'text' });
|
|
33
|
+
// No emit needed, state update triggers paint
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Set raw HTML content (innerHTML)
|
|
38
|
+
*/
|
|
39
|
+
html(value) {
|
|
40
|
+
this.updateState({ content: value, contentType: 'html' });
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Append raw HTML to existing content
|
|
45
|
+
*/
|
|
46
|
+
appendHtml(value) {
|
|
47
|
+
const current = this.state.content || '';
|
|
48
|
+
this.updateState({ content: current + value, contentType: 'html' });
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Set inline styles (e.g. "color: red; margin: 10px;")
|
|
53
|
+
*/
|
|
54
|
+
style(cssText) {
|
|
55
|
+
this.updateState({ inlineStyle: cssText });
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Receives RAW DOM events from the Skin and emits them to listeners.
|
|
60
|
+
* This keeps the 'emit' logic encapsulated within the Engine.
|
|
61
|
+
*/
|
|
62
|
+
handleEvent(eventName, content) {
|
|
63
|
+
this.emit(eventName, content);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,uBAAuB,CAAC;AAiB9D,MAAM,OAAO,aAAc,SAAQ,UAAwC;IACvE,YAAY,EAAU,EAAE,UAA0B,EAAE;QAChD,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;IAES,YAAY,CAAC,EAAU,EAAE,OAAuB;QACtD,OAAO;YACH,EAAE;YACF,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK;YAC7B,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE;YAC3C,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YAC3C,WAAW,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,qBAAqB;SACzD,CAAC;IACN,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAe;QACf,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,KAAa;QACd,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,8CAA8C;QAC9C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,KAAa;QACd,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAa;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe;QACjB,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,SAAiB,EAAE,OAAY;QACvC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;CACJ"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { BaseEngine, BaseState } from '../base/BaseEngine.js';
|
|
2
|
+
|
|
3
|
+
export interface ElementState extends BaseState {
|
|
4
|
+
tagName: string;
|
|
5
|
+
content: string | null;
|
|
6
|
+
contentType: 'text' | 'html';
|
|
7
|
+
inlineStyle: string; // ✅ Added inlineStyle to state
|
|
8
|
+
// BaseState provides: classes, attributes, visible, etc.
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface ElementOptions {
|
|
12
|
+
tag?: string;
|
|
13
|
+
text?: string;
|
|
14
|
+
html?: string;
|
|
15
|
+
style?: string; // ✅ Added style option
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class ElementEngine extends BaseEngine<ElementState, ElementOptions> {
|
|
19
|
+
constructor(id: string, options: ElementOptions = {}) {
|
|
20
|
+
super(id, options);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protected prepareState(id: string, options: ElementOptions): ElementState {
|
|
24
|
+
return {
|
|
25
|
+
id,
|
|
26
|
+
classes: ['jux-element'],
|
|
27
|
+
visible: true,
|
|
28
|
+
disabled: false,
|
|
29
|
+
loading: false,
|
|
30
|
+
attributes: {},
|
|
31
|
+
tagName: options.tag || 'div',
|
|
32
|
+
content: options.html || options.text || '',
|
|
33
|
+
contentType: options.html ? 'html' : 'text',
|
|
34
|
+
inlineStyle: options.style || '' // ✅ Initialize logic
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Set the HTML Tag name (e.g. 'div', 'span', 'h1', 'section')
|
|
40
|
+
*/
|
|
41
|
+
tag(tagName: string): this {
|
|
42
|
+
this.updateState({ tagName });
|
|
43
|
+
this.emit('config', { tagName });
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Set plain text content (automatically escaped)
|
|
49
|
+
*/
|
|
50
|
+
text(value: string): this {
|
|
51
|
+
this.updateState({ content: value, contentType: 'text' });
|
|
52
|
+
// No emit needed, state update triggers paint
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Set raw HTML content (innerHTML)
|
|
58
|
+
*/
|
|
59
|
+
html(value: string): this {
|
|
60
|
+
this.updateState({ content: value, contentType: 'html' });
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Append raw HTML to existing content
|
|
66
|
+
*/
|
|
67
|
+
appendHtml(value: string): this {
|
|
68
|
+
const current = this.state.content || '';
|
|
69
|
+
this.updateState({ content: current + value, contentType: 'html' });
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Set inline styles (e.g. "color: red; margin: 10px;")
|
|
75
|
+
*/
|
|
76
|
+
style(cssText: string): this {
|
|
77
|
+
this.updateState({ inlineStyle: cssText });
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Receives RAW DOM events from the Skin and emits them to listeners.
|
|
83
|
+
* This keeps the 'emit' logic encapsulated within the Engine.
|
|
84
|
+
*/
|
|
85
|
+
handleEvent(eventName: string, content: any): void {
|
|
86
|
+
this.emit(eventName, content);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { BaseSkin } from '../base/BaseSkin.js';
|
|
2
|
+
export class ElementSkin extends BaseSkin {
|
|
3
|
+
constructor(engine) {
|
|
4
|
+
super(engine);
|
|
5
|
+
}
|
|
6
|
+
get structureCss() {
|
|
7
|
+
return new URL('./structure.css', import.meta.url).href;
|
|
8
|
+
}
|
|
9
|
+
// ✅ Fix: Use state to determine initial tag, default to div
|
|
10
|
+
createRoot() {
|
|
11
|
+
const tag = this.engine.state.tagName || 'div';
|
|
12
|
+
return document.createElement(tag);
|
|
13
|
+
}
|
|
14
|
+
bindEvents(root) {
|
|
15
|
+
// ✅ Forward common events to the engine via public handler
|
|
16
|
+
// This allows engine.on('click', ...) to work without skin accessing protected 'emit'
|
|
17
|
+
const events = ['click', 'mouseenter', 'mouseleave', 'input', 'change', 'focus', 'blur'];
|
|
18
|
+
events.forEach(eventName => {
|
|
19
|
+
root.addEventListener(eventName, (e) => {
|
|
20
|
+
this.engine.handleEvent(eventName, e);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
updateSkin(state) {
|
|
25
|
+
// 1. Tag Replacement Logic
|
|
26
|
+
if (this.root && this.root.tagName.toLowerCase() !== state.tagName.toLowerCase()) {
|
|
27
|
+
const newRoot = document.createElement(state.tagName);
|
|
28
|
+
// Transfer attributes/classes/listeners logic is complex
|
|
29
|
+
// We rely on re-binding events and re-applying attributes for the new root.
|
|
30
|
+
if (this.root.parentNode) {
|
|
31
|
+
this.root.parentNode.replaceChild(newRoot, this.root);
|
|
32
|
+
}
|
|
33
|
+
this.root = newRoot;
|
|
34
|
+
this.bindEvents(this.root); // Re-bind events to new root
|
|
35
|
+
}
|
|
36
|
+
if (!this.root)
|
|
37
|
+
return;
|
|
38
|
+
// 2. Base Attributes
|
|
39
|
+
this.applySkinAttributes(this.root, state);
|
|
40
|
+
// 3. Content
|
|
41
|
+
if (state.contentType === 'html') {
|
|
42
|
+
this.root.innerHTML = state.content || '';
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this.root.textContent = state.content || '';
|
|
46
|
+
}
|
|
47
|
+
// 4. Inline Styles
|
|
48
|
+
if (state.inlineStyle) {
|
|
49
|
+
this.root.style.cssText = state.inlineStyle;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=skin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skin.js","sourceRoot":"","sources":["skin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,MAAM,OAAO,WAAY,SAAQ,QAAqC;IAClE,YAAY,MAAqB;QAC7B,KAAK,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,IAAc,YAAY;QACtB,OAAO,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IAED,4DAA4D;IAClD,UAAU;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;QAC/C,OAAO,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAES,UAAU,CAAC,IAAiB;QAClC,2DAA2D;QAC3D,sFAAsF;QACtF,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAEzF,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACvB,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;gBACnC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAES,UAAU,CAAC,KAAmB;QACpC,2BAA2B;QAC3B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/E,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtD,yDAAyD;YACzD,4EAA4E;YAE5E,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC;YAED,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B;QAC7D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QAEvB,qBAAqB;QACrB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE3C,aAAa;QACb,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QAC9C,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QAChD,CAAC;QAED,mBAAmB;QACnB,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC;QAChD,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { BaseSkin } from '../base/BaseSkin.js';
|
|
2
|
+
import { ElementEngine, ElementState } from './engine.js';
|
|
3
|
+
|
|
4
|
+
export class ElementSkin extends BaseSkin<ElementState, ElementEngine> {
|
|
5
|
+
constructor(engine: ElementEngine) {
|
|
6
|
+
super(engine);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
protected get structureCss(): string {
|
|
10
|
+
return new URL('./structure.css', import.meta.url).href;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// ✅ Fix: Use state to determine initial tag, default to div
|
|
14
|
+
protected createRoot(): HTMLElement {
|
|
15
|
+
const tag = this.engine.state.tagName || 'div';
|
|
16
|
+
return document.createElement(tag);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
protected bindEvents(root: HTMLElement): void {
|
|
20
|
+
// ✅ Forward common events to the engine via public handler
|
|
21
|
+
// This allows engine.on('click', ...) to work without skin accessing protected 'emit'
|
|
22
|
+
const events = ['click', 'mouseenter', 'mouseleave', 'input', 'change', 'focus', 'blur'];
|
|
23
|
+
|
|
24
|
+
events.forEach(eventName => {
|
|
25
|
+
root.addEventListener(eventName, (e) => {
|
|
26
|
+
this.engine.handleEvent(eventName, e);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected updateSkin(state: ElementState): void {
|
|
32
|
+
// 1. Tag Replacement Logic
|
|
33
|
+
if (this.root && this.root.tagName.toLowerCase() !== state.tagName.toLowerCase()) {
|
|
34
|
+
const newRoot = document.createElement(state.tagName);
|
|
35
|
+
|
|
36
|
+
// Transfer attributes/classes/listeners logic is complex
|
|
37
|
+
// We rely on re-binding events and re-applying attributes for the new root.
|
|
38
|
+
|
|
39
|
+
if (this.root.parentNode) {
|
|
40
|
+
this.root.parentNode.replaceChild(newRoot, this.root);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
this.root = newRoot;
|
|
44
|
+
this.bindEvents(this.root); // Re-bind events to new root
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!this.root) return;
|
|
48
|
+
|
|
49
|
+
// 2. Base Attributes
|
|
50
|
+
this.applySkinAttributes(this.root, state);
|
|
51
|
+
|
|
52
|
+
// 3. Content
|
|
53
|
+
if (state.contentType === 'html') {
|
|
54
|
+
this.root.innerHTML = state.content || '';
|
|
55
|
+
} else {
|
|
56
|
+
this.root.textContent = state.content || '';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// 4. Inline Styles
|
|
60
|
+
if (state.inlineStyle) {
|
|
61
|
+
this.root.style.cssText = state.inlineStyle;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
.jux-element {
|
|
2
|
+
/* Minimal layout defaults to behave like a standard block/inline element */
|
|
3
|
+
box-sizing: border-box;
|
|
4
|
+
/* Allow text properties to inherit naturally */
|
|
5
|
+
color: inherit;
|
|
6
|
+
font-family: inherit;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/* Optional helper for hidden state toggling via engine */
|
|
10
|
+
.jux-element[hidden] {
|
|
11
|
+
display: none !important;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.jux-element:hover {
|
|
15
|
+
background-color: var(--color-surface-hover);
|
|
16
|
+
}
|
|
@@ -5,9 +5,10 @@ import { IndexedDBPlugin } from './plugins/IndexedDBPlugin.js';
|
|
|
5
5
|
import { ClientSQLitePlugin } from './plugins/ClientSQLitePlugin.js';
|
|
6
6
|
import { List } from './list/component.js';
|
|
7
7
|
import { Grid } from './grid/component.js';
|
|
8
|
-
import { Input } from './input/component.js';
|
|
8
|
+
import { Input } from './input/component.js';
|
|
9
|
+
import { Element } from './element/component.js';
|
|
9
10
|
// Export individually
|
|
10
|
-
export { List, Grid, Input };
|
|
11
|
+
export { List, Grid, Input, Element };
|
|
11
12
|
/**
|
|
12
13
|
* Curated documentation for core framework capabilities.
|
|
13
14
|
* These strings are appended to the reflection data in juxDef.tree.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC,CAAC,uBAAuB;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAGrE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,14 +8,12 @@ import { ClientSQLitePlugin } from './plugins/ClientSQLitePlugin.js';
|
|
|
8
8
|
|
|
9
9
|
import { List } from './list/component.js';
|
|
10
10
|
import { Grid } from './grid/component.js';
|
|
11
|
-
import { Input } from './input/component.js';
|
|
11
|
+
import { Input } from './input/component.js';
|
|
12
|
+
|
|
13
|
+
import { Element } from './element/component.js';
|
|
12
14
|
|
|
13
15
|
// Export individually
|
|
14
|
-
export {
|
|
15
|
-
List,
|
|
16
|
-
Grid,
|
|
17
|
-
Input
|
|
18
|
-
};
|
|
16
|
+
export { List, Grid, Input, Element };
|
|
19
17
|
|
|
20
18
|
/**
|
|
21
19
|
* Curated documentation for core framework capabilities.
|
|
@@ -9,7 +9,6 @@ const __dirname = path.dirname(__filename);
|
|
|
9
9
|
const COMPONENTS_DIR = path.resolve(__dirname, '..');
|
|
10
10
|
const STUBS_DIR = path.join(COMPONENTS_DIR, 'stubs');
|
|
11
11
|
const INDEX_FILE = path.join(COMPONENTS_DIR, 'index.ts');
|
|
12
|
-
const EXPERIMENTS_DIR = path.resolve(__dirname, '../../../jux/experiments');
|
|
13
12
|
const RESERVED = ['base', 'bases', 'plugin', 'plugins', 'tool', 'tools', 'stub', 'stubs', 'skin', 'skins', 'structure', 'structures', 'engine', 'engines', 'component', 'components'];
|
|
14
13
|
|
|
15
14
|
const toPascalCase = (str) => str.replace(/(^\w|-\w)/g, (clear) => clear.replace('-', '').toUpperCase());
|
|
@@ -86,17 +85,6 @@ const indexBackup = fs.readFileSync(INDEX_FILE, 'utf-8');
|
|
|
86
85
|
console.log(` File: \x1b[36m${INDEX_FILE}\x1b[0m`);
|
|
87
86
|
console.log(` add: \x1b[32m${ComponentName},\x1b[0m\n`);
|
|
88
87
|
|
|
89
|
-
// 4. Create Experiment
|
|
90
|
-
const experimentFile = path.join(EXPERIMENTS_DIR, `${componentName}-demo.jux`);
|
|
91
|
-
const experimentContent = `import { juxV2, juxDef } from '../../lib/componentsv2/index.js';
|
|
92
|
-
|
|
93
|
-
const demo = juxV2.${ComponentName}('demo-${componentName}', { text: 'Jux Scaffolding Works!' });
|
|
94
|
-
demo.render('app');
|
|
95
|
-
|
|
96
|
-
juxDef.audit('${ComponentName}', juxV2.${ComponentName});
|
|
97
|
-
`;
|
|
98
|
-
fs.writeFileSync(experimentFile, experimentContent);
|
|
99
|
-
log(` + Created Experiment: experiments/${componentName}-demo.jux`);
|
|
100
88
|
|
|
101
89
|
// 5. Verification
|
|
102
90
|
log(`\n🕵️ Verifying Integrity (Targeted TypeScript Check)...`);
|
|
@@ -130,10 +118,6 @@ juxDef.audit('${ComponentName}', juxV2.${ComponentName});
|
|
|
130
118
|
if (fs.existsSync(targetDir)) {
|
|
131
119
|
fs.rmSync(targetDir, { recursive: true, force: true });
|
|
132
120
|
}
|
|
133
|
-
const expFile = path.join(EXPERIMENTS_DIR, `${componentName}-demo.jux`);
|
|
134
|
-
if (fs.existsSync(expFile)) {
|
|
135
|
-
fs.unlinkSync(expFile);
|
|
136
|
-
}
|
|
137
121
|
}
|
|
138
122
|
process.exit(1);
|
|
139
123
|
}
|