juxscript 1.1.197 → 1.1.198

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 +1 @@
1
- {"version":3,"file":"dataframe.d.ts","sourceRoot":"","sources":["dataframe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dataframe.d.ts","sourceRoot":"","sources":["dataframe.ts"],"names":[],"mappings":"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"}
@@ -486,7 +486,21 @@ export class DataFrameComponent extends BaseComponent {
486
486
  if (!this._rawFileData?.file)
487
487
  return;
488
488
  this._cleanupReshapeModal();
489
- const suggestedRow = this._df ? this._detectLikelyHeaderRow(this._df) : 0;
489
+ // Always detect from a fresh raw parse, not from current _df
490
+ let suggestedRow = 0;
491
+ try {
492
+ const rawSheets = await this._driver.streamFileMultiSheet(this._rawFileData.file, {
493
+ headerRow: 0,
494
+ maxSheetSize: 20
495
+ });
496
+ const rawSheet = Object.values(rawSheets)[0];
497
+ if (rawSheet) {
498
+ suggestedRow = this._detectLikelyHeaderRow(rawSheet);
499
+ }
500
+ }
501
+ catch {
502
+ suggestedRow = 0;
503
+ }
490
504
  this._reshapeModal = new Modal(`${this._id}-reshape-modal`, {
491
505
  title: 'Excel Import Settings',
492
506
  size: 'large',
@@ -514,7 +528,7 @@ export class DataFrameComponent extends BaseComponent {
514
528
  <div style="font-weight: 600; margin-bottom: 0.5rem; color: hsl(var(--foreground));">
515
529
  Preview
516
530
  </div>
517
- <div id="${this._id}-preview" style="font-family: monospace; font-size: 12px; background: hsl(var(--muted) / 0.3); border: 1px solid hsl(var(--border)); border-radius: var(--radius); padding: 0; overflow: hidden; max-height: 400px; overflow-y: auto;"></div>
531
+ <div id="${this._id}-preview" style="font-family: ui-monospace, monospace; font-size: 12px; background: hsl(var(--muted) / 0.3); border: 1px solid hsl(var(--border)); border-radius: var(--radius); padding: 0; overflow: hidden; max-height: 400px; overflow-y: auto;"></div>
518
532
  </div>
519
533
  `;
520
534
  this._reshapeModal
@@ -576,10 +590,10 @@ export class DataFrameComponent extends BaseComponent {
576
590
  const headerRow = parseInt(headerRowInput?.value) || 0;
577
591
  updateHint(headerRow);
578
592
  try {
579
- // Get raw data to show all rows
593
+ // ALWAYS parse with headerRow=0 to get raw file structure
580
594
  const rawSheets = await this._driver.streamFileMultiSheet(this._rawFileData.file, {
581
595
  headerRow: 0,
582
- maxSheetSize: headerRow + 12
596
+ maxSheetSize: Math.max(headerRow + 12, 15)
583
597
  });
584
598
  const rawSheet = Object.values(rawSheets)[0];
585
599
  if (!rawSheet) {
@@ -587,63 +601,65 @@ export class DataFrameComponent extends BaseComponent {
587
601
  previewDiv.textContent = 'No data found';
588
602
  return;
589
603
  }
604
+ // rawSheet.columns = row 0 values (when parsed with headerRow=0)
605
+ // rawSheet.toRows() = rows 1+ (data rows when parsed with headerRow=0)
590
606
  const rawCols = rawSheet.columns;
591
607
  const rawRows = rawSheet.toRows();
592
- // Build a simple HTML table for clarity
593
- let html = '<table style="width: 100%; border-collapse: collapse; font-size: 11px;">';
594
- // Render each row
595
- const totalRows = Math.min(headerRow + 8, rawRows.length + 1);
596
- for (let i = 0; i < totalRows; i++) {
597
- const isHeader = (i === headerRow);
598
- const isSkipped = (i < headerRow);
608
+ // Build HTML table showing raw file structure
609
+ let html = '<table style="width: 100%; border-collapse: collapse; font-size: 12px;">';
610
+ // We need to show rows 0 through headerRow+7 (or so)
611
+ // Row 0 = rawCols, Row 1+ = rawRows[i-1]
612
+ const totalRowsToShow = Math.min(headerRow + 8, rawRows.length + 1);
613
+ for (let fileRow = 0; fileRow < totalRowsToShow; fileRow++) {
614
+ const isHeader = (fileRow === headerRow);
615
+ const isSkipped = (fileRow < headerRow);
599
616
  let rowStyle = 'border-bottom: 1px solid hsl(var(--border));';
600
- let cellStyle = 'padding: 6px 8px; text-align: left;';
601
617
  if (isHeader) {
602
- rowStyle += 'background: hsl(var(--primary) / 0.15); font-weight: bold;';
618
+ rowStyle += 'background: hsl(142 71% 45% / 0.15); font-weight: 600;';
603
619
  }
604
620
  else if (isSkipped) {
605
- rowStyle += 'background: hsl(var(--muted) / 0.3); color: hsl(var(--muted-foreground)); font-style: italic;';
621
+ rowStyle += 'background: hsl(var(--muted) / 0.4); color: hsl(var(--muted-foreground)); font-style: italic; opacity: 0.7;';
606
622
  }
607
623
  html += `<tr style="${rowStyle}">`;
608
624
  // Row index cell
609
- html += `<td style="${cellStyle} width: 50px; color: hsl(var(--muted-foreground)); font-weight: 500;">`;
625
+ html += `<td style="padding: 8px 12px; width: 60px; font-weight: 600; color: hsl(var(--muted-foreground)); border-right: 1px solid hsl(var(--border)); text-align: center;">`;
610
626
  if (isHeader) {
611
- html += `<strong>→ ${i}</strong>`;
627
+ html += `<span style="color: hsl(142 71% 45%);">▶ ${fileRow}</span>`;
612
628
  }
613
629
  else {
614
- html += `${i}`;
630
+ html += `${fileRow}`;
615
631
  }
616
632
  html += '</td>';
617
- // Data cells
633
+ // Get values for this file row
618
634
  let values;
619
- if (i === 0) {
635
+ if (fileRow === 0) {
620
636
  values = rawCols;
621
637
  }
622
- else if (i - 1 < rawRows.length) {
623
- values = Object.values(rawRows[i - 1]);
624
- }
625
638
  else {
626
- values = [];
639
+ values = rawRows[fileRow - 1] ? Object.values(rawRows[fileRow - 1]) : [];
627
640
  }
628
641
  // Show first 6 columns
629
642
  const displayCols = values.slice(0, 6);
630
643
  displayCols.forEach(val => {
631
- const displayVal = val != null ? String(val).substring(0, 25) : '';
644
+ const displayVal = val != null ? String(val).substring(0, 20) : '';
645
+ const cellStyle = isHeader
646
+ ? 'padding: 8px 12px; font-weight: 600; color: hsl(var(--foreground));'
647
+ : 'padding: 8px 12px;';
632
648
  html += `<td style="${cellStyle}">${this._escapeHtml(displayVal)}</td>`;
633
649
  });
634
650
  if (values.length > 6) {
635
- html += `<td style="${cellStyle} color: hsl(var(--muted-foreground));">...</td>`;
651
+ html += `<td style="padding: 8px 12px; color: hsl(var(--muted-foreground));">…</td>`;
636
652
  }
637
- // Status cell
638
- html += `<td style="${cellStyle} text-align: right; font-size: 10px;">`;
653
+ // Status badge cell
654
+ html += `<td style="padding: 8px 12px; text-align: right; white-space: nowrap;">`;
639
655
  if (isHeader) {
640
- html += '<span style="background: hsl(var(--primary)); color: white; padding: 2px 6px; border-radius: 4px;">HEADER</span>';
656
+ html += '<span style="background: hsl(142 71% 45%); color: white; padding: 3px 8px; border-radius: 4px; font-size: 10px; font-weight: 600;">HEADER</span>';
641
657
  }
642
658
  else if (isSkipped) {
643
- html += '<span style="color: hsl(var(--muted-foreground));">skipped</span>';
659
+ html += '<span style="color: hsl(var(--muted-foreground)); font-size: 10px;">skipped</span>';
644
660
  }
645
661
  else {
646
- html += '<span style="color: hsl(var(--success));">data</span>';
662
+ html += '<span style="color: hsl(var(--muted-foreground)); font-size: 10px;">data</span>';
647
663
  }
648
664
  html += '</td>';
649
665
  html += '</tr>';
@@ -604,7 +604,20 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
604
604
 
605
605
  this._cleanupReshapeModal();
606
606
 
607
- const suggestedRow = this._df ? this._detectLikelyHeaderRow(this._df) : 0;
607
+ // Always detect from a fresh raw parse, not from current _df
608
+ let suggestedRow = 0;
609
+ try {
610
+ const rawSheets = await this._driver.streamFileMultiSheet(this._rawFileData.file, {
611
+ headerRow: 0,
612
+ maxSheetSize: 20
613
+ });
614
+ const rawSheet = Object.values(rawSheets)[0];
615
+ if (rawSheet) {
616
+ suggestedRow = this._detectLikelyHeaderRow(rawSheet);
617
+ }
618
+ } catch {
619
+ suggestedRow = 0;
620
+ }
608
621
 
609
622
  this._reshapeModal = new Modal(`${this._id}-reshape-modal`, {
610
623
  title: 'Excel Import Settings',
@@ -634,7 +647,7 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
634
647
  <div style="font-weight: 600; margin-bottom: 0.5rem; color: hsl(var(--foreground));">
635
648
  Preview
636
649
  </div>
637
- <div id="${this._id}-preview" style="font-family: monospace; font-size: 12px; background: hsl(var(--muted) / 0.3); border: 1px solid hsl(var(--border)); border-radius: var(--radius); padding: 0; overflow: hidden; max-height: 400px; overflow-y: auto;"></div>
650
+ <div id="${this._id}-preview" style="font-family: ui-monospace, monospace; font-size: 12px; background: hsl(var(--muted) / 0.3); border: 1px solid hsl(var(--border)); border-radius: var(--radius); padding: 0; overflow: hidden; max-height: 400px; overflow-y: auto;"></div>
638
651
  </div>
639
652
  `;
640
653
 
@@ -704,10 +717,10 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
704
717
  updateHint(headerRow);
705
718
 
706
719
  try {
707
- // Get raw data to show all rows
720
+ // ALWAYS parse with headerRow=0 to get raw file structure
708
721
  const rawSheets = await this._driver.streamFileMultiSheet(this._rawFileData!.file, {
709
722
  headerRow: 0,
710
- maxSheetSize: headerRow + 12
723
+ maxSheetSize: Math.max(headerRow + 12, 15)
711
724
  });
712
725
  const rawSheet = Object.values(rawSheets)[0];
713
726
 
@@ -716,68 +729,71 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
716
729
  return;
717
730
  }
718
731
 
732
+ // rawSheet.columns = row 0 values (when parsed with headerRow=0)
733
+ // rawSheet.toRows() = rows 1+ (data rows when parsed with headerRow=0)
719
734
  const rawCols = rawSheet.columns;
720
735
  const rawRows = rawSheet.toRows();
721
736
 
722
- // Build a simple HTML table for clarity
723
- let html = '<table style="width: 100%; border-collapse: collapse; font-size: 11px;">';
737
+ // Build HTML table showing raw file structure
738
+ let html = '<table style="width: 100%; border-collapse: collapse; font-size: 12px;">';
724
739
 
725
- // Render each row
726
- const totalRows = Math.min(headerRow + 8, rawRows.length + 1);
740
+ // We need to show rows 0 through headerRow+7 (or so)
741
+ // Row 0 = rawCols, Row 1+ = rawRows[i-1]
742
+ const totalRowsToShow = Math.min(headerRow + 8, rawRows.length + 1);
727
743
 
728
- for (let i = 0; i < totalRows; i++) {
729
- const isHeader = (i === headerRow);
730
- const isSkipped = (i < headerRow);
744
+ for (let fileRow = 0; fileRow < totalRowsToShow; fileRow++) {
745
+ const isHeader = (fileRow === headerRow);
746
+ const isSkipped = (fileRow < headerRow);
731
747
 
732
748
  let rowStyle = 'border-bottom: 1px solid hsl(var(--border));';
733
- let cellStyle = 'padding: 6px 8px; text-align: left;';
734
749
 
735
750
  if (isHeader) {
736
- rowStyle += 'background: hsl(var(--primary) / 0.15); font-weight: bold;';
751
+ rowStyle += 'background: hsl(142 71% 45% / 0.15); font-weight: 600;';
737
752
  } else if (isSkipped) {
738
- rowStyle += 'background: hsl(var(--muted) / 0.3); color: hsl(var(--muted-foreground)); font-style: italic;';
753
+ rowStyle += 'background: hsl(var(--muted) / 0.4); color: hsl(var(--muted-foreground)); font-style: italic; opacity: 0.7;';
739
754
  }
740
755
 
741
756
  html += `<tr style="${rowStyle}">`;
742
757
 
743
758
  // Row index cell
744
- html += `<td style="${cellStyle} width: 50px; color: hsl(var(--muted-foreground)); font-weight: 500;">`;
759
+ html += `<td style="padding: 8px 12px; width: 60px; font-weight: 600; color: hsl(var(--muted-foreground)); border-right: 1px solid hsl(var(--border)); text-align: center;">`;
745
760
  if (isHeader) {
746
- html += `<strong>→ ${i}</strong>`;
761
+ html += `<span style="color: hsl(142 71% 45%);">▶ ${fileRow}</span>`;
747
762
  } else {
748
- html += `${i}`;
763
+ html += `${fileRow}`;
749
764
  }
750
765
  html += '</td>';
751
766
 
752
- // Data cells
767
+ // Get values for this file row
753
768
  let values: any[];
754
- if (i === 0) {
769
+ if (fileRow === 0) {
755
770
  values = rawCols;
756
- } else if (i - 1 < rawRows.length) {
757
- values = Object.values(rawRows[i - 1]);
758
771
  } else {
759
- values = [];
772
+ values = rawRows[fileRow - 1] ? Object.values(rawRows[fileRow - 1]) : [];
760
773
  }
761
774
 
762
775
  // Show first 6 columns
763
776
  const displayCols = values.slice(0, 6);
764
777
  displayCols.forEach(val => {
765
- const displayVal = val != null ? String(val).substring(0, 25) : '';
778
+ const displayVal = val != null ? String(val).substring(0, 20) : '';
779
+ const cellStyle = isHeader
780
+ ? 'padding: 8px 12px; font-weight: 600; color: hsl(var(--foreground));'
781
+ : 'padding: 8px 12px;';
766
782
  html += `<td style="${cellStyle}">${this._escapeHtml(displayVal)}</td>`;
767
783
  });
768
784
 
769
785
  if (values.length > 6) {
770
- html += `<td style="${cellStyle} color: hsl(var(--muted-foreground));">...</td>`;
786
+ html += `<td style="padding: 8px 12px; color: hsl(var(--muted-foreground));">…</td>`;
771
787
  }
772
788
 
773
- // Status cell
774
- html += `<td style="${cellStyle} text-align: right; font-size: 10px;">`;
789
+ // Status badge cell
790
+ html += `<td style="padding: 8px 12px; text-align: right; white-space: nowrap;">`;
775
791
  if (isHeader) {
776
- html += '<span style="background: hsl(var(--primary)); color: white; padding: 2px 6px; border-radius: 4px;">HEADER</span>';
792
+ html += '<span style="background: hsl(142 71% 45%); color: white; padding: 3px 8px; border-radius: 4px; font-size: 10px; font-weight: 600;">HEADER</span>';
777
793
  } else if (isSkipped) {
778
- html += '<span style="color: hsl(var(--muted-foreground));">skipped</span>';
794
+ html += '<span style="color: hsl(var(--muted-foreground)); font-size: 10px;">skipped</span>';
779
795
  } else {
780
- html += '<span style="color: hsl(var(--success));">data</span>';
796
+ html += '<span style="color: hsl(var(--muted-foreground)); font-size: 10px;">data</span>';
781
797
  }
782
798
  html += '</td>';
783
799
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juxscript",
3
- "version": "1.1.197",
3
+ "version": "1.1.198",
4
4
  "type": "module",
5
5
  "description": "A JavaScript UX authorship platform",
6
6
  "main": "index.js",