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/create/layout.jux CHANGED
@@ -1,4 +1,4 @@
1
- import { jux } from 'juxscript';
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
- jux.include('style.css');
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 = jux.container('appheader').render('#app');
16
- const appHeaderContent = jux.container('appheader-content').render('#appheader');
17
- const appHeaderLogo = jux.container('appheader-logo').render('#appheader-content');
18
- const appHeaderNav = jux.container('appheader-nav').render('#appheader-content');
19
- const appHeaderActions = jux.container('appheader-actions').render('#appheader-content');
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 = jux.container('appaside').render('#app');
25
+ const appAside = Element('appaside').render('#app');
23
26
 
24
27
  // Main content area
25
- const appMain = jux.container('appmain').render('#app');
26
- const appMainContent = jux.container('appmain-content').render('#appmain');
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 = jux.container('appsidebar').render('#app');
30
- const appSidebarHeader = jux.container('appsidebar-header').render('#appsidebar');
31
- const appSidebarContent = jux.container('appsidebar-content').render('#appsidebar');
32
- const appSidebarFooter = jux.container('appsidebar-footer').render('#appsidebar');
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 = jux.container('appfooter').render('#app');
36
- const appFooterContent = jux.container('appfooter-content').render('#appfooter');
37
- const appFooterLegal = jux.container('appfooter-legal').render('#appfooter-content');
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'; // ✅ Registered
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":"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"}
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'; // ✅ Registered
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
  }