juxscript 1.1.100 → 1.1.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "totalComponents": 63,
3
- "generatedAt": "2026-02-12T21:08:33.192Z",
3
+ "generatedAt": "2026-02-12T21:12:55.361Z",
4
4
  "components": [
5
5
  {
6
6
  "file": "alert.js",
@@ -1 +1 @@
1
- {"version":3,"file":"BaseStack.d.ts","sourceRoot":"","sources":["BaseStack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BaseStack.d.ts","sourceRoot":"","sources":["BaseStack.ts"],"names":[],"mappings":"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"}
@@ -189,9 +189,23 @@ export class BaseStack extends BaseComponent {
189
189
  if (child && typeof child === 'object' && '_container' in child && child._container instanceof HTMLElement) {
190
190
  childElement = child._container;
191
191
  }
192
- // ✅ Priority 2: Check if it's a JUX Component (has container property)
193
- else if (child && typeof child === 'object' && 'container' in child && child.container instanceof HTMLElement) {
194
- childElement = child.container;
192
+ // ✅ Priority 2: Check if it's a JUX Component (has render method and container property)
193
+ else if (child && typeof child === 'object' && typeof child.render === 'function') {
194
+ // Create temporary container to render into
195
+ const tempContainer = document.createElement('div');
196
+ tempContainer.style.display = 'contents'; // Don't add extra wrapper
197
+ // Render the component into temp container
198
+ child.render(tempContainer);
199
+ // Extract the rendered element
200
+ if (child.container && child.container.firstElementChild) {
201
+ childElement = child.container.firstElementChild;
202
+ }
203
+ else if (tempContainer.firstElementChild) {
204
+ childElement = tempContainer.firstElementChild;
205
+ }
206
+ else {
207
+ childElement = tempContainer;
208
+ }
195
209
  }
196
210
  // ✅ Priority 3: Check if it's already a DOM element
197
211
  else if (child instanceof HTMLElement) {
@@ -249,9 +249,23 @@ export abstract class BaseStack extends BaseComponent<StackState> {
249
249
  if (child && typeof child === 'object' && '_container' in child && child._container instanceof HTMLElement) {
250
250
  childElement = child._container;
251
251
  }
252
- // ✅ Priority 2: Check if it's a JUX Component (has container property)
253
- else if (child && typeof child === 'object' && 'container' in child && child.container instanceof HTMLElement) {
254
- childElement = child.container;
252
+ // ✅ Priority 2: Check if it's a JUX Component (has render method and container property)
253
+ else if (child && typeof child === 'object' && typeof child.render === 'function') {
254
+ // Create temporary container to render into
255
+ const tempContainer = document.createElement('div');
256
+ tempContainer.style.display = 'contents'; // Don't add extra wrapper
257
+
258
+ // Render the component into temp container
259
+ child.render(tempContainer);
260
+
261
+ // Extract the rendered element
262
+ if (child.container && child.container.firstElementChild) {
263
+ childElement = child.container.firstElementChild as HTMLElement;
264
+ } else if (tempContainer.firstElementChild) {
265
+ childElement = tempContainer.firstElementChild as HTMLElement;
266
+ } else {
267
+ childElement = tempContainer;
268
+ }
255
269
  }
256
270
  // ✅ Priority 3: Check if it's already a DOM element
257
271
  else if (child instanceof HTMLElement) {
@@ -250,29 +250,15 @@ export class JuxCompiler {
250
250
  const sourceSnapshot = {};
251
251
 
252
252
  const juxImports = new Set();
253
- const layoutImports = new Set();
254
- let needsJuxFacade = false; // ✅ Track if jux facade is needed
253
+ const layoutImports = new Set(); // ✅ Track layout imports separately
255
254
 
255
+ // Scan for imports
256
256
  [...views, ...dataModules, ...sharedModules].forEach(m => {
257
- // ✅ Detect jux.something() usage
258
- if (/jux\s*\.\s*\w+\s*\(/g.test(m.content)) {
259
- needsJuxFacade = true;
260
- }
261
-
262
- // Detect layout usage (both import and direct usage)
263
- const layoutPattern = /(VStack|HStack|ZStack)\s*\.\s*create/g;
264
- const layoutMatches = m.content.match(layoutPattern);
265
- if (layoutMatches) {
266
- layoutMatches.forEach(match => {
267
- const layoutName = match.split('.')[0].trim();
268
- layoutImports.add(layoutName);
269
- });
270
- }
271
-
272
257
  // Regular juxscript imports
273
258
  for (const match of m.content.matchAll(/import\s*\{\s*([^}]+)\s*\}\s*from\s*['"]juxscript['"]/g)) {
274
259
  match[1].split(',').map(s => s.trim()).forEach(imp => {
275
260
  if (imp) {
261
+ // ✅ Separate layout imports
276
262
  if (imp === 'VStack' || imp === 'HStack' || imp === 'ZStack') {
277
263
  layoutImports.add(imp);
278
264
  } else {
@@ -283,7 +269,7 @@ export class JuxCompiler {
283
269
  }
284
270
  });
285
271
 
286
- // ✅ Import layouts
272
+ // ✅ Import layouts separately
287
273
  if (layoutImports.size > 0) {
288
274
  entry += `import { ${[...layoutImports].sort().join(', ')} } from 'juxscript';\n`;
289
275
  }
@@ -293,12 +279,6 @@ export class JuxCompiler {
293
279
  entry += `import { ${[...juxImports].sort().join(', ')} } from 'juxscript';\n\n`;
294
280
  }
295
281
 
296
- // ✅ Import jux facade if needed
297
- if (needsJuxFacade) {
298
- entry += `import { jux } from 'juxscript';\n`;
299
- entry += `window.jux = jux;\n`;
300
- }
301
-
302
282
  // Data and shared modules
303
283
  dataModules.forEach(m => {
304
284
  entry += `import * as ${this.sanitizeName(m.name)}Data from './jux/${m.file}';\n`;
@@ -311,7 +291,7 @@ export class JuxCompiler {
311
291
  dataModules.forEach(m => entry += `Object.assign(window, ${this.sanitizeName(m.name)}Data);\n`);
312
292
  sharedModules.forEach(m => entry += `Object.assign(window, ${this.sanitizeName(m.name)}Shared);\n`);
313
293
 
314
- // ✅ Expose layouts to window (critical for nested usage)
294
+ // ✅ Expose layouts to window
315
295
  if (layoutImports.size > 0) {
316
296
  entry += `\n// Expose layout components\n`;
317
297
  layoutImports.forEach(layout => {
@@ -630,43 +610,52 @@ navigate(location.pathname);
630
610
  target: 'es2020',
631
611
  sourcemap: true,
632
612
  external: [],
633
- // ✅ Tell esbuild how to resolve .jux filesharset="UTF-8">
634
- loader: { <meta name="viewport" content="width=device-width, initial-scale=1.0">
613
+ // ✅ Tell esbuild how to resolve .jux files
614
+ loader: {
635
615
  '.jux': 'js' // Treat .jux files as JavaScript
636
- } <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/juxscript@latest/lib/layouts/default.css">
616
+ }
637
617
  });
638
618
 
639
- // Generate index.html <div id="app"></div>
619
+ // Generate index.html
640
620
  console.log('📄 Generating index.html...');
641
621
  const indexHtml = `<!DOCTYPE html>
642
622
  <html lang="en">
623
+ <head>
624
+ <meta charset="UTF-8">
625
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
626
+ <title>JUX App</title>
627
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/juxscript@latest/lib/layouts/default.css">
628
+ </head>
629
+ <body>
630
+ <div id="app"></div>
631
+ <script type="module" src="/bundle.js"></script>
643
632
  </body>
644
- </html>`;this.distDir, 'index.html'), indexHtml);
633
+ </html>`;
645
634
 
646
635
  fs.writeFileSync(path.join(this.distDir, 'index.html'), indexHtml);
647
- this.copyPublicFolder();
636
+
648
637
  // Copy public folder
649
- this.copyPublicFolder(); // Write source snapshot for error overlay
650
- apshotPath = path.join(this.distDir, '__jux_sources.json');
651
- // Write source snapshot for error overlaynapshotPath, JSON.stringify(this._sourceSnapshot, null, 2));
638
+ this.copyPublicFolder();
639
+
640
+ // Write source snapshot for error overlay
652
641
  const snapshotPath = path.join(this.distDir, '__jux_sources.json');
653
- fs.writeFileSync(snapshotPath, JSON.stringify(this._sourceSnapshot, null, 2)););
654
- nsole.log(`\n✅ Build complete in ${endTime - startTime}ms`);
655
- const endTime = Date.now(); console.log(` Output: ${this.distDir}`);
642
+ fs.writeFileSync(snapshotPath, JSON.stringify(this._sourceSnapshot, null, 2));
643
+
644
+ const endTime = Date.now();
656
645
  console.log(`\n✅ Build complete in ${endTime - startTime}ms`);
657
646
  console.log(` Output: ${this.distDir}`);
658
647
 
659
648
  this.reportValidationIssues();
660
649
 
661
- return {ionIssues || [],
662
- success: true, distDir: this.distDir
663
- errors: this._validationIssues || [], };
650
+ return {
651
+ success: true,
652
+ errors: this._validationIssues || [],
664
653
  distDir: this.distDir
665
- }; } catch (err) {
666
- console.error('❌ Build failed:', err.message);
654
+ };
655
+
667
656
  } catch (err) {
668
- console.error('❌ Build failed:', err.message); return {
669
- console.error(err.stack); false,
657
+ console.error('❌ Build failed:', err.message);
658
+ console.error(err.stack);
670
659
  return {
671
660
  success: false,
672
661
  errors: [err.message]
@@ -675,86 +664,77 @@ nsole.log(`\n✅ Build complete in ${endTime - startTime}ms`);
675
664
  }
676
665
 
677
666
  /**
678
- * Copy public folder contents to dist copyPublicFolder() {
679
- */from paths object
680
- copyPublicFolder() { const publicSrc = this.paths.public
681
- // ✅ Use configured public path or resolve from paths object this.paths.public
667
+ * Copy public folder contents to dist
668
+ */
669
+ copyPublicFolder() {
670
+ // ✅ Use configured public path or resolve from paths object
682
671
  const publicSrc = this.paths.public
683
672
  ? this.paths.public
684
- : path.resolve(process.cwd(), this.publicDir);ync(publicSrc)) {
673
+ : path.resolve(process.cwd(), this.publicDir);
685
674
 
686
675
  if (!fs.existsSync(publicSrc)) {
687
676
  return; // No public folder, skip
688
- } console.log('📦 Copying public assets...');
677
+ }
689
678
 
690
679
  console.log('📦 Copying public assets...');
691
- this._copyDirRecursive(publicSrc, this.distDir, 0);
692
- try {ed');
680
+
681
+ try {
693
682
  this._copyDirRecursive(publicSrc, this.distDir, 0);
694
- console.log('✅ Public assets copied'); console.warn('⚠️ Error copying public folder:', err.message);
683
+ console.log('✅ Public assets copied');
695
684
  } catch (err) {
696
685
  console.warn('⚠️ Error copying public folder:', err.message);
697
686
  }
698
- } /**
687
+ }
699
688
 
700
689
  /**
701
- * Recursively copy directory contents _copyDirRecursive(src, dest, depth = 0) {
702
- */(src, { withFileTypes: true });
690
+ * Recursively copy directory contents
691
+ */
703
692
  _copyDirRecursive(src, dest, depth = 0) {
704
693
  const entries = fs.readdirSync(src, { withFileTypes: true });
705
694
 
706
- entries.forEach(entry => {ntry.name.startsWith('.')) return;
695
+ entries.forEach(entry => {
707
696
  // Skip hidden files and directories
708
- if (entry.name.startsWith('.')) return;cPath = path.join(src, entry.name);
709
- path.join(dest, entry.name);
697
+ if (entry.name.startsWith('.')) return;
698
+
710
699
  const srcPath = path.join(src, entry.name);
711
- const destPath = path.join(dest, entry.name); if (entry.isDirectory()) {
700
+ const destPath = path.join(dest, entry.name);
712
701
 
713
- if (entry.isDirectory()) {(destPath)) {
714
- // Create directory and recurserue });
702
+ if (entry.isDirectory()) {
703
+ // Create directory and recurse
715
704
  if (!fs.existsSync(destPath)) {
716
- fs.mkdirSync(destPath, { recursive: true });pth + 1);
717
- }e {
718
- this._copyDirRecursive(srcPath, destPath, depth + 1); // Copy file
719
- } else { fs.copyFileSync(srcPath, destPath);
705
+ fs.mkdirSync(destPath, { recursive: true });
706
+ }
707
+ this._copyDirRecursive(srcPath, destPath, depth + 1);
708
+ } else {
720
709
  // Copy file
721
- fs.copyFileSync(srcPath, destPath); // Log files at root level only
722
- if (depth === 0) {
723
- // Log files at root level only = path.extname(entry.name);
724
- if (depth === 0) { const icon = this._getFileIcon(ext);
725
- const ext = path.extname(entry.name);sole.log(` ${icon} ${entry.name}`);
710
+ fs.copyFileSync(srcPath, destPath);
711
+
712
+ // Log files at root level only
713
+ if (depth === 0) {
714
+ const ext = path.extname(entry.name);
726
715
  const icon = this._getFileIcon(ext);
727
716
  console.log(` ${icon} ${entry.name}`);
728
717
  }
729
718
  }
730
719
  });
731
720
  }
732
- ype
721
+
733
722
  /**
734
723
  * Get icon for file type
735
724
  */
736
- _getFileIcon(ext) {,
725
+ _getFileIcon(ext) {
737
726
  const icons = {
738
727
  '.html': '📄',
739
- '.css': '🎨',,
740
- '.js': '📜',',
741
- '.json': '📋', '.jpg': '🖼️',
728
+ '.css': '🎨',
729
+ '.js': '📜',
730
+ '.json': '📋',
742
731
  '.png': '🖼️',
743
- '.jpg': '🖼️', '.gif': '🖼️',
744
- '.jpeg': '🖼️', '.svg': '🎨',
745
- '.gif': '🖼️', '.ico': '🔖',
746
-
747
-
748
-
749
-
750
-
751
-
752
-
753
-
754
-
755
-
756
-
757
- } } return icons[ext.toLowerCase()] || '📦'; }; '.eot': '🔤' '.ttf': '🔤', '.woff2': '🔤', '.woff': '🔤', '.ico': '🔖', '.svg': '🎨', '.woff': '🔤',
732
+ '.jpg': '🖼️',
733
+ '.jpeg': '🖼️',
734
+ '.gif': '🖼️',
735
+ '.svg': '🎨',
736
+ '.ico': '🔖',
737
+ '.woff': '🔤',
758
738
  '.woff2': '🔤',
759
739
  '.ttf': '🔤',
760
740
  '.eot': '🔤'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juxscript",
3
- "version": "1.1.100",
3
+ "version": "1.1.102",
4
4
  "type": "module",
5
5
  "description": "A JavaScript UX authorship platform",
6
6
  "main": "index.js",