@innovastudio/contentbuilder 1.5.185 → 1.5.187

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.
@@ -6569,7 +6569,9 @@ class Util {
6569
6569
  row = this.rowSelected();
6570
6570
  }
6571
6571
  if (!row) return;
6572
- this.colTool = row.querySelector('.is-col-tool');
6572
+
6573
+ // this.colTool = row.querySelector('.is-col-tool');
6574
+ this.colTool = row.querySelector(':scope > .is-col-tool');
6573
6575
  if (!this.colTool) return; // when drag block as a new section
6574
6576
 
6575
6577
  if (!col.parentNode) {
@@ -51420,7 +51422,8 @@ class SettingsUIGenerator {
51420
51422
  this.builder.openColorPicker(input.value, color => {
51421
51423
  input.value = color;
51422
51424
  colorBtn.style.backgroundColor = color;
51423
- input.dispatchEvent(new Event('change', {
51425
+ // input.dispatchEvent(new Event('change', { bubbles: true }));
51426
+ input.dispatchEvent(new Event('input', {
51424
51427
  bubbles: true
51425
51428
  }));
51426
51429
  }, colorBtn);
@@ -54027,7 +54030,9 @@ class RowTool {
54027
54030
  this.builder.backwardCompatible();
54028
54031
  }
54029
54032
  const btnCellAdd = coltool.querySelector('.cell-add');
54030
- if (btnCellAdd) dom.addEventListener(btnCellAdd, 'click', () => {
54033
+ if (btnCellAdd) dom.addEventListener(btnCellAdd, 'click', e => {
54034
+ e.preventDefault();
54035
+ e.stopImmediatePropagation();
54031
54036
  let cell = util.cellSelected();
54032
54037
  if (!cell) return;
54033
54038
  const viewportHeight = window.innerHeight;
@@ -54097,7 +54102,9 @@ class RowTool {
54097
54102
  }
54098
54103
  });
54099
54104
  const btnCellMore = coltool.querySelector('.cell-more');
54100
- if (btnCellMore) dom.addEventListener(btnCellMore, 'click', () => {
54105
+ if (btnCellMore) dom.addEventListener(btnCellMore, 'click', e => {
54106
+ e.preventDefault();
54107
+ e.stopImmediatePropagation();
54101
54108
  let cell = util.cellSelected();
54102
54109
  if (!cell) return;
54103
54110
  const viewportHeight = window.innerHeight;
@@ -54271,7 +54278,9 @@ class RowTool {
54271
54278
  this.showGridEditor();
54272
54279
  });
54273
54280
  const btnMore = rowtool.querySelector('.row-more');
54274
- if (btnMore) dom.addEventListener(btnMore, 'click', () => {
54281
+ if (btnMore) dom.addEventListener(btnMore, 'click', e => {
54282
+ e.preventDefault();
54283
+ e.stopImmediatePropagation();
54275
54284
  let row;
54276
54285
  let cell = util.cellSelected();
54277
54286
  if (cell) {
@@ -55288,7 +55297,9 @@ class RowAddTool {
55288
55297
  });
55289
55298
  }
55290
55299
  let btnRowAdd = rowaddtool.querySelector('button');
55291
- dom.addEventListener(btnRowAdd, 'click', () => {
55300
+ dom.addEventListener(btnRowAdd, 'click', e => {
55301
+ e.preventDefault();
55302
+ e.stopImmediatePropagation();
55292
55303
  const quickadd = renderQuickAdd(this.builder);
55293
55304
  let tabs = quickadd.querySelector('.is-pop-tabs');
55294
55305
  tabs.style.display = 'none';
@@ -57998,7 +58009,8 @@ class ColumnTool {
57998
58009
  }
57999
58010
  }
58000
58011
  click(col) {
58001
- this.columnTool = col.parentNode.querySelector('.is-col-tool');
58012
+ // this.columnTool = col.parentNode.querySelector('.is-col-tool');
58013
+ this.columnTool = col.parentNode.querySelector(':scope > .is-col-tool');
58002
58014
  if (!this.columnTool) return;
58003
58015
  this.columnTool.style.left = col.offsetLeft + 'px';
58004
58016
  this.columnTool.style.top = col.offsetTop + 'px';
@@ -82301,6 +82313,31 @@ class ContentStuff {
82301
82313
  }
82302
82314
 
82303
82315
 
82316
+ /* New nested grid support */
82317
+ .is-builder .row,
82318
+ .is-builder .column {
82319
+ position: relative;
82320
+ }
82321
+ .is-builder .row > .column {
82322
+ outline: none;
82323
+ }
82324
+ .is-builder .row > .column.cell-active:not([data-protected]) {
82325
+ outline: 1px solid #00da89;
82326
+ }
82327
+ .row-active > .is-row-tool {
82328
+ display: flex;
82329
+ }
82330
+ .row-active > div .is-row-tool {
82331
+ display: none;
82332
+ }
82333
+ .row-active > .is-col-tool {
82334
+ display: flex;
82335
+ }
82336
+ .row-active > div .is-col-tool {
82337
+ display: none;
82338
+ }
82339
+
82340
+
82304
82341
  /* Preferences */
82305
82342
 
82306
82343
  .is-tool.is-row-tool .row-grideditor {
@@ -88091,6 +88128,9 @@ class CodeChat {
88091
88128
  this.systemModel = this.builder.systemModel;
88092
88129
  }
88093
88130
  this.codeModels = [{
88131
+ id: 'google/gemini-3-pro-preview',
88132
+ label: 'Google Gemini 3 Pro Preview'
88133
+ }, {
88094
88134
  id: 'google/gemini-2.5-flash',
88095
88135
  label: 'Google Gemini 2.5 Flash'
88096
88136
  }, {
@@ -88153,10 +88193,7 @@ class CodeChat {
88153
88193
  }, {
88154
88194
  id: 'minimax/minimax-m2',
88155
88195
  label: 'MiniMax M2'
88156
- }
88157
- // { id: 'kwaipilot/kat-coder-pro:free', label: 'KAT Coder Pro (Free)' },
88158
- ];
88159
-
88196
+ }];
88160
88197
  if (this.builder.codeModels) {
88161
88198
  this.codeModels = this.builder.codeModels;
88162
88199
  }
@@ -88222,6 +88259,13 @@ class CodeChat {
88222
88259
  this.chatModels = this.builder.chatModels;
88223
88260
  }
88224
88261
  this.imageModels = [{
88262
+ id: 'fal-ai/nano-banana-pro',
88263
+ label: 'Nano Banana Pro',
88264
+ sizes: [],
88265
+ // no size options
88266
+ // sizes: ['21:9', '16:9', '3:2', '4:3', '5:4', '1:1', '4:5', '3:4', '2:3', '9:16'],
88267
+ output_format: 'jpeg'
88268
+ }, {
88225
88269
  id: 'fal-ai/nano-banana',
88226
88270
  label: 'Nano Banana',
88227
88271
  sizes: [],
@@ -89100,7 +89144,7 @@ class CodeChat {
89100
89144
  ${out('Code Generation Model')}
89101
89145
  </label>
89102
89146
  <p class="setting-description">
89103
- ${out('Select the AI model used for generating and modifying HTML/CSS code')}
89147
+ ${out('Select the AI model used for generating and modifying HTML code')}
89104
89148
  </p>
89105
89149
  <select id="codeModelSelect" aria-describedby="codeModelDesc">
89106
89150
  </select>
@@ -90096,6 +90140,9 @@ ${this.builder.html()}
90096
90140
  \`\`\`
90097
90141
 
90098
90142
  TASK: ${task.description}
90143
+
90144
+ IMPORTANT: Follow the Best Practices in Content framework.
90145
+
90099
90146
  ${imageContext}
90100
90147
  ${chatContext}
90101
90148
 
@@ -90332,7 +90379,7 @@ ${this.builder.html()}
90332
90379
  copyButton.classList.remove('copied');
90333
90380
  }, 2000);
90334
90381
  }).catch(err => {
90335
- console.error('Failed to copy:', err);
90382
+ console.error(out('Failed to copy:'), err);
90336
90383
  });
90337
90384
  });
90338
90385
  return rawText;
@@ -90553,551 +90600,691 @@ ${this.builder.html()}
90553
90600
  }
90554
90601
  }
90555
90602
 
90556
- const contextBoxFramework = `
90557
- # Box Framework
90603
+ const contextContentFramework = `
90558
90604
 
90559
- The Box Framework handles page structure and layout. It works with the Content.css Framework to create complete, responsive designs.
90605
+ # Content.css Framework
90560
90606
 
90561
- ## Architecture Overview
90607
+ ## Grid System
90562
90608
 
90563
- .is-section (page section)
90564
- └── .is-box (layout box)
90565
- ├── .is-overlay (background layer)
90566
- │ └── .is-overlay-bg (background image/color)
90567
- └── .is-container (content area)
90568
- └── .row > .column (content from Content.css)
90609
+ All content must be wrapped in rows and columns.
90569
90610
 
90570
- ---
90611
+ <div class="row">
90612
+ <div class="column">
90613
+ <!-- Content here -->
90614
+ </div>
90615
+ </div>
90616
+ <div class="row">
90617
+ <div class="column">
90618
+ <!-- Content here -->
90619
+ </div>
90620
+ <div class="column">
90621
+ <!-- Content here -->
90622
+ </div>
90623
+ </div>
90571
90624
 
90572
- ## Sections
90625
+ > **Important:** Never place content directly under a container. Always use row → column structure.
90573
90626
 
90574
- Sections are full-width page divisions. Each section is a '<div class="is-section">'.
90627
+ ### Inline Width Style
90575
90628
 
90576
- ### Basic Section
90629
+ Just use: <div class="column" style="width: 52%; flex: 0 0 auto;">
90577
90630
 
90578
- <div class="is-section type-system-ui">
90579
- <!-- Content goes here -->
90631
+ <div class="row">
90632
+ <div class="column" style="width: 52%; flex: 0 0 auto;">
90633
+ <div class="column">
90580
90634
  </div>
90581
90635
 
90582
- > **Important:** Always include 'type-system-ui' class on sections for default typography.
90636
+ **If columns should be equal width:**
90583
90637
 
90584
- ### Section Height
90638
+ Just use: <div class="column"> for each column.
90585
90639
 
90586
- Control minimum section height with viewport-based classes:
90587
-
90588
- | Class | Height | Use Case |
90589
- |-------|--------|----------|
90590
- | '.is-section-50' | 50vh | Half screen sections |
90591
- | '.is-section-60' | 60vh | Medium sections |
90592
- | '.is-section-80' | 80vh | Tall sections |
90593
- | '.is-section-100' | 100vh | Full screen hero sections |
90594
- | '.is-section-auto' | Auto | Content-based height |
90640
+ <div class="row">
90641
+ <div class="column">
90642
+ <div class="column">
90643
+ </div
90595
90644
 
90596
- **Example:**
90645
+ > **Tip:** On mobile (< 760px), columns automatically stack full-width for better responsiveness.
90597
90646
 
90598
- <div class="is-section type-system-ui is-section-100">
90599
- <!-- Full screen hero -->
90600
- </div>
90647
+ ### Column Gap
90601
90648
 
90602
- > **Available heights:** 10, 15, 20, 25, 30, 40, 50, 60, 70, 75, 80, 85, 90, 100, auto
90649
+ Rules:
90603
90650
 
90604
- ---
90651
+ - **DO NOT add gap by default.** Columns have default padding (1rem left/right) which handles most cases.
90605
90652
 
90606
- ## Boxes
90653
+ - **Use gap ONLY when the design specifically needs extra breathing room.**
90607
90654
 
90608
- Boxes are layout divisions within sections. A section can contain one or multiple boxes.
90655
+ - ***ALWAYS use inline style for gap, NEVER use gap utility classes (gap-4, gap-6, etc.).***
90609
90656
 
90610
- ### Single Box Section
90657
+ When gap is needed, use these guidelines based on content type:
90611
90658
 
90612
- When a section has only one box (full-width), combine classes:
90659
+ **Image galleries/portfolio grids: gap:20px (maximum)**
90613
90660
 
90614
- <div class="is-section is-box type-system-ui is-section-100">
90615
- <div class="is-overlay">
90616
- <!-- Background -->
90617
- </div>
90618
- <div class="is-container">
90619
- <!-- Content -->
90620
- </div>
90661
+ <div class="row" style="gap:20px">
90662
+ <div class="column pb-6"><img...></div>
90663
+ <div class="column pb-6"><img...></div>
90664
+ <div class="column pb-6"><img...></div>
90621
90665
  </div>
90622
90666
 
90623
- ### Multi-Box Section
90667
+ **Image + text layouts (2 columns): gap:30px (maximum)**
90624
90668
 
90625
- When a section has multiple boxes (split layout):
90626
-
90627
- <div class="is-section type-system-ui is-section-100">
90628
- <div class="is-box is-box-5">
90629
- <div class="is-overlay">
90630
- <!-- Background for left box -->
90631
- </div>
90632
- <div class="is-container">
90633
- <!-- Left content -->
90634
- </div>
90669
+ <div class="row" style="gap:20px">
90670
+ <div class="column" style="width: 55%; flex: 0 0 auto;">
90671
+ <img...>
90635
90672
  </div>
90636
- <div class="is-box is-box-7">
90637
- <div class="is-overlay">
90638
- <!-- Background for right box -->
90639
- </div>
90640
- <div class="is-container">
90641
- <!-- Right content -->
90642
- </div>
90673
+ <div class="column flex flex-col justify-center">
90674
+ <h3>Title</h3>
90675
+ <p>Details...</p>
90643
90676
  </div>
90644
90677
  </div>
90645
90678
 
90646
- ### Box Width Classes
90679
+ **Default rule: No gap unless there's a specific design reason. When in doubt, omit gap.**
90647
90680
 
90648
- Boxes use a 12-column grid system:
90649
90681
 
90650
- | Class | Width | Common Use |
90651
- |-------|-------|------------|
90652
- | '.is-box-4' | 33.33% | Three columns |
90653
- | '.is-box-5' | 41.67% | 40/60 split |
90654
- | '.is-box-6' | 50% | Half/half split |
90655
- | '.is-box-7' | 58.33% | 60/40 split |
90656
- | '.is-box-8' | 66.67% | Two-thirds |
90657
- | '.is-box-12' | 100% | Full width |
90682
+ ### CRITICAL: When using gap with custom column widths:
90658
90683
 
90659
- > **Available widths:** 1-12 (increments of 8.33%)
90684
+ **Gap takes up space**, so column widths + gap must not exceed 100%.
90660
90685
 
90661
- > **Mobile behavior:** On screens < 970px, all boxes stack to 100% width automatically.
90686
+ **Best practice: Use only ONE custom width, let other column(s) flex:**
90662
90687
 
90663
- ---
90688
+ CORRECT (one width + gap):
90689
+ <div class="row" style="gap:20px">
90690
+ <div class="column" style="width: 55%; flex: 0 0 auto;">
90691
+ <img...>
90692
+ </div>
90693
+ <div class="column">
90694
+ <!-- This column flexes to fill remaining space -->
90695
+ <h3>Content...</h3>
90696
+ </div>
90697
+ </div>
90664
90698
 
90665
- ## Overlay (Backgrounds)
90699
+ INCORRECT (widths don't account for gap):
90700
+ <div class="row" style="gap:20px">
90701
+ <div class="column" style="width: 38%; flex: 0 0 auto;">...</div> ❌
90702
+ <div class="column" style="width: 62%; flex: 0 0 auto;">...</div> ❌
90703
+ <!-- 38% + 62% + 20px gap = overflow! -->
90704
+ </div>
90666
90705
 
90667
- The overlay system provides background images and colors behind content.
90706
+ ### Font Sizes
90668
90707
 
90669
- ### Background Color Only
90708
+ Use 'size-*' classes for precise font sizing.
90670
90709
 
90671
- <div class="is-overlay" style="background-color: rgb(245, 245, 245);">
90672
- </div>
90673
- ` + `
90674
- ### Background Image
90710
+ | Class | Size | Common Use |
90711
+ |-------|------|------------|
90712
+ | '.size-12' | 12px | Small labels, captions |
90713
+ | '.size-14' | 14px | Labels, meta info |
90714
+ | '.size-16' | 16px | Body text |
90715
+ | '.size-18' | 18px | Large body text |
90716
+ | '.size-20' | 20px | Small headings |
90717
+ | '.size-24' | 24px | Subheadings |
90718
+ | '.size-32' | 32px | Medium headings |
90719
+ | '.size-42' | 42px | Large headings |
90720
+ | '.size-48' | 48px | Hero headings |
90721
+ | '.size-60' | 60px | Extra large headings |
90722
+ | '.size-72' | 72px | Display text, stats |
90723
+ | '.size-96' | 96px | Extra large display |
90675
90724
 
90676
- <div class="is-overlay">
90677
- <div class="is-overlay-bg"
90678
- style="background-image: url('image.jpg');
90679
- background-position: 50% 60%;">
90680
- </div>
90681
- </div>
90725
+ > **Available sizes:** 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 28, 32, 35, 38, 42, 46, 48, 50, 54, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100... up to 400
90682
90726
 
90683
- ### Background Image with Color Overlay
90727
+ ### Font Weights
90684
90728
 
90685
- <div class="is-overlay" style="background-color: rgb(225, 225, 225);">
90686
- <div class="is-overlay-bg"
90687
- style="background-image: url('image.jpg');
90688
- background-position: 50% 60%;
90689
- opacity: 0.7;">
90690
- </div>
90691
- </div>
90729
+ Classes: font-light, font-normal, font-medium, font-semibold, font-bold
90692
90730
 
90693
- ### Dark Overlay on Image
90731
+ ### Letter Spacing (Tracking)
90694
90732
 
90695
- <div class="is-overlay">
90696
- <div class="is-overlay-bg"
90697
- style="background-image: url('image.jpg');
90698
- background-position: 50% 60%;">
90699
- <div class="is-overlay-color opacity-12"></div>
90700
- </div>
90701
- </div>
90733
+ Classes: tracking-tight, tracking-normal, tracking-wide, tracking-wider, tracking-150 (ideal for uppercase labels)
90702
90734
 
90703
- > **Tip:** Use 'background-position' to control image focal point. Format: 'horizontal% vertical%'
90735
+ ### Line Height (Leading)
90704
90736
 
90705
- ---
90737
+ Classes: leading-none, leading-12, leading-13, leading-14, leading-15, leading-16, leading-17, leading-18
90706
90738
 
90707
- ## Container (Content Area)
90739
+ > **Best Practice:** Use 'leading-17' or 'leading-18' for body text. Use 'leading-12' or 'leading-13' for headings.
90708
90740
 
90709
- Containers hold the actual content and control its width and positioning.
90741
+ ### Text Utilities
90710
90742
 
90711
- ### Basic Container
90743
+ Classes: uppercase, lowercase, capitalize, text-center, text-left, text-right
90712
90744
 
90713
- <div class="is-container">
90714
- <div class="row">
90715
- <div class="column">
90716
- <!-- Your content from Content.css framework -->
90717
- </div>
90718
- </div>
90719
- </div>
90745
+ When creating centered (or left/right aligned) text sections: Apply alignment classes directly to text elements, NOT to wrapper divs.
90720
90746
 
90721
- > **Important:** Always wrap content inside container using the row → column structure from Content.css.
90747
+ CORRECT (alignment on elements):
90722
90748
 
90723
- ### Container Width
90749
+ <div class="column">
90750
+ <p class="size-12 text-gray-400 pb-4 text-center">Label</p>
90751
+ <h2 class="size-48 leading-12 pb-6 text-center">Heading</h2>
90752
+ <p class="size-17 leading-18 text-gray-600 text-center">Description...</p>
90753
+ </div>
90724
90754
 
90725
- Control maximum content width:
90755
+ INCORRECT (wrapper div for alignment):
90726
90756
 
90727
- <div class="is-container is-content-1200">
90728
- <!-- Content max-width: 1200px -->
90757
+ <div class="column">
90758
+ <div class="text-center"> ❌
90759
+ <p class="size-12 text-gray-400 pb-4">Label</p>
90760
+ <h2 class="size-48 leading-12 pb-6">Heading</h2>
90761
+ <p class="size-17 leading-18 text-gray-600">Description...</p>
90762
+ </div>
90729
90763
  </div>
90730
90764
 
90731
- **Common widths:**
90765
+ Keep the content structure in column flat.
90732
90766
 
90733
- | Class | Max Width | Use Case |
90734
- |-------|-----------|----------|
90735
- | '.is-content-760' | 760px | Narrow text content |
90736
- | '.is-content-980' | 980px | Default (if no class) |
90737
- | '.is-content-1200' | 1200px | Standard wide |
90738
- | '.is-content-1400' | 1400px | Extra wide |
90739
- | '.is-content-1740' | 1740px | Ultra wide |
90767
+ ### Padding
90740
90768
 
90741
- > **Available widths:** 560, 580, 600... 1800 (increments of 20px)
90769
+ Classes: p-0, p-2, p-3, p-4, p-6, p-8, p-10, p-12
90742
90770
 
90743
- ### Horizontal Position
90771
+ > **Available values:** 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 20
90744
90772
 
90745
- Position container left, center (default), or right:
90773
+ **Example: Card with padding**
90746
90774
 
90747
- <!-- Left aligned -->
90748
- <div class="is-container is-content-left">
90775
+ <!-- Example: Card with padding -->
90776
+ <div class="p-12 bg-gray-50">
90777
+ <p class="size-18 pb-4">Card content</p>
90778
+ <p class="size-14 text-gray-600">Description</p>
90779
+ </div>
90749
90780
 
90750
- <!-- Centered (default) -->
90751
- <div class="is-container">
90781
+ ### Directional Padding
90752
90782
 
90753
- <!-- Right aligned -->
90754
- <div class="is-container is-content-right">
90783
+ Classes: px-4, py-4, pt-4, pb-4, pl-4, pr-4
90755
90784
 
90756
- > **Mobile behavior:** On screens < 760px, all containers center automatically.
90785
+ ### Spacer (Vertical Spacing)
90757
90786
 
90758
- ### Vertical Position
90787
+ | Class | Description |
90788
+ |-------|-------------|
90789
+ | '.spacer.height-20' | 20px vertical space |
90790
+ | '.spacer.height-40' | 40px vertical space |
90791
+ | '.spacer.height-60' | 60px vertical space |
90792
+ | '.spacer.height-80' | 80px vertical space |
90793
+ | '.spacer.height-100' | 100px vertical space |
90794
+ | '.spacer.height-120' | 120px vertical space |
90759
90795
 
90760
- Position container top, middle (default), or bottom within the box:
90796
+ **Example: Adding space between sections**
90761
90797
 
90762
- <!-- Top aligned -->
90763
- <div class="is-section is-box type-system-ui is-content-top">
90764
- <div class="is-container">
90798
+ <!-- Example: Adding space between sections -->
90799
+ <div class="row">
90800
+ <div class="column">
90801
+ <h2>Section Title</h2>
90802
+ </div>
90803
+ </div>
90804
+ <div class="row">
90805
+ <div class="column">
90806
+ <div class="spacer height-60"></div>
90807
+ </div>
90808
+ </div>
90809
+ <div class="row">
90810
+ <div class="column">
90811
+ <p>Section content...</p>
90812
+ </div>
90813
+ </div>
90765
90814
 
90766
- <!-- Middle aligned (default) -->
90767
- <div class="is-section is-box type-system-ui">
90768
- <div class="is-container">
90815
+ > **Available heights:** 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300
90769
90816
 
90770
- <!-- Bottom aligned -->
90771
- <div class="is-section is-box type-system-ui is-content-bottom">
90772
- <div class="is-container">
90817
+ ---
90773
90818
  ` + `
90774
- ### Fine-Tune Vertical Position
90775
-
90776
- Adjust vertical spacing with edge classes:
90777
-
90778
- <!-- Push content closer to top edge -->
90779
- <div class="is-section is-box type-system-ui is-content-top edge-y-0">
90780
-
90781
- <!-- Push content away from bottom edge -->
90782
- <div class="is-section is-box type-system-ui is-content-bottom edge-y-4">
90783
90819
 
90784
- **Edge values:**
90820
+ ## Buttons
90785
90821
 
90786
- | Class | Effect |
90787
- |-------|--------|
90788
- | 'edge-y--5' to 'edge-y--1' | Pull inward (negative space) |
90789
- | 'edge-y-0' | Flush to edge |
90790
- | 'edge-y-1' to 'edge-y-5' | Push outward |
90822
+ Buttons are portable and must be wrapped in a div inside a column. All styling uses content.css classes with inline styles for colors.
90791
90823
 
90792
- > **Default spacing:** Without edge classes, containers have 6.5vh margin from top/bottom.
90824
+ ### Button Structure
90793
90825
 
90794
- ### Container Vertical Padding
90826
+ All buttons must be wrapped in a 'div' (or use 'space-x-2' for button groups):
90795
90827
 
90796
- Add internal spacing inside containers:
90828
+ <div class="row">
90829
+ <div class="column">
90830
+ <div>
90831
+ <a href="#" role="button" class="...">
90832
+ Button Text
90833
+ </a>
90834
+ </div>
90835
+ </div>
90836
+ </div>
90797
90837
 
90798
- <div class="is-container content-py-60">
90799
- <!-- 60px padding top and bottom -->
90838
+ ### Base Button Classes
90839
+
90840
+ Every button includes these base classes:
90841
+
90842
+ transition-all inline-block whitespace-nowrap cursor-pointer
90843
+ border-2 border-solid mt-2 mb-1 font-normal tracking-normal rounded-full
90844
+
90845
+ ### Button Sizes
90846
+
90847
+ | Size | Classes | Use Case |
90848
+ |------|---------|----------|
90849
+ | **Small** | 'py-1 px-4 size-14 leading-13' | Compact actions, inline buttons |
90850
+ | **Medium** | 'py-2 px-6 size-15 leading-14' | Default size, most common |
90851
+ | **Large** | 'py-2 px-7 size-16 leading-16' | Primary CTAs, hero sections |
90852
+
90853
+ ### Button Variants
90854
+
90855
+ #### 1. Filled Button (Solid Background)
90856
+
90857
+ <!-- Light Background -->
90858
+ <a href="#" role="button"
90859
+ class="transition-all inline-block whitespace-nowrap cursor-pointer
90860
+ no-underline border-2 border-solid mt-2 mb-1 font-normal
90861
+ tracking-normal rounded-full py-2 px-6 size-15 leading-14
90862
+ border-transparent hover:border-transparent"
90863
+ style="color: rgb(24, 24, 27); background-color: rgb(240, 240, 241);"
90864
+ data-bg="rgb(240, 240, 241)"
90865
+ data-hover-bg="rgb(236, 236, 238)"
90866
+ onmouseover="if(this.getAttribute('data-hover-bg'))
90867
+ this.style.backgroundColor=this.getAttribute('data-hover-bg');"
90868
+ onmouseout="if(this.getAttribute('data-bg'))
90869
+ this.style.backgroundColor=this.getAttribute('data-bg');
90870
+ else this.style.backgroundColor='';">
90871
+ Read More
90872
+ </a>
90873
+
90874
+ <!-- Dark Background -->
90875
+ <a href="#" role="button"
90876
+ class="transition-all inline-block whitespace-nowrap cursor-pointer
90877
+ no-underline border-2 border-solid mt-2 mb-1 font-normal
90878
+ tracking-normal rounded-full py-2 px-6 size-15 leading-14
90879
+ border-transparent hover:border-transparent"
90880
+ style="color: rgb(250, 250, 250); background-color: rgb(24, 24, 27);"
90881
+ data-bg="rgb(24, 24, 27)"
90882
+ data-hover-bg="rgb(63, 63, 70)"
90883
+ onmouseover="if(this.getAttribute('data-hover-bg'))
90884
+ this.style.backgroundColor=this.getAttribute('data-hover-bg');"
90885
+ onmouseout="if(this.getAttribute('data-bg'))
90886
+ this.style.backgroundColor=this.getAttribute('data-bg');
90887
+ else this.style.backgroundColor='';">
90888
+ Get Started
90889
+ </a>
90890
+
90891
+ <!-- Dark Background (Square) -->
90892
+ <a href="#" role="button"
90893
+ class="transition-all inline-block whitespace-nowrap cursor-pointer
90894
+ no-underline border-2 border-solid mt-2 mb-1 font-normal
90895
+ tracking-normal py-2 px-6 size-15 leading-14
90896
+ border-transparent hover:border-transparent"
90897
+ style="color: rgb(250, 250, 250); background-color: rgb(24, 24, 27);"
90898
+ data-bg="rgb(24, 24, 27)"
90899
+ data-hover-bg="rgb(63, 63, 70)"
90900
+ onmouseover="if(this.getAttribute('data-hover-bg'))
90901
+ this.style.backgroundColor=this.getAttribute('data-hover-bg');"
90902
+ onmouseout="if(this.getAttribute('data-bg'))
90903
+ this.style.backgroundColor=this.getAttribute('data-bg');
90904
+ else this.style.backgroundColor='';">
90905
+ Get Started
90906
+ </a>
90907
+
90908
+ **Key classes:** 'no-underline' + 'border-transparent' + inline background color
90909
+ ` + `
90910
+ #### 2. Outline Button (Border Only)
90911
+
90912
+ <a href="#" role="button"
90913
+ class="transition-all inline-block whitespace-nowrap cursor-pointer
90914
+ no-underline border-2 border-solid mt-2 mb-1 font-normal
90915
+ tracking-normal rounded-full py-2 px-6 size-15 leading-14
90916
+ border-current hover:border-current">
90917
+ Read More
90918
+ </a>
90919
+
90920
+ **Key classes:** 'no-underline' + 'border-current' (inherits text color)
90921
+
90922
+ #### 3. Text Button (Underline)
90923
+
90924
+ **For single text button:**
90925
+
90926
+ <div>
90927
+ <a href="#" role="button"
90928
+ class="transition-all inline-block whitespace-nowrap cursor-pointer
90929
+ border-2 border-solid mt-2 mb-1 font-normal tracking-normal
90930
+ py-2 size-15 leading-14
90931
+ underline border-transparent"
90932
+ style="color: rgb(24, 24, 27);">
90933
+ Read More
90934
+ </a>
90800
90935
  </div>
90801
90936
 
90802
- **Padding classes:**
90937
+ **Key classes:** 'underline' + 'border-transparent' (no horizontal padding needed).
90803
90938
 
90804
- - 'content-py-*' - Vertical padding (top and bottom)
90805
- - 'content-pt-*' - Top padding only
90806
- - 'content-pb-*' - Bottom padding only
90939
+ **For button groups:**
90807
90940
 
90808
- > **Available values:** 0, 10, 20, 30, 40, 50, 60, 70, 80
90941
+ When grouping multiple buttons together, ALL buttons need consistent horizontal padding (e.g. 'px-6'):
90809
90942
 
90810
- ---
90943
+ <div class="space-x-2">
90944
+ <a ... class="py-2 px-6 rounded-full" style="background-color:...">Get Started</a>
90945
+ <a ... class="py-2 px-6 underline border-transparent">Learn More</a>
90946
+ </div>
90811
90947
 
90812
- ## Complete Examples
90948
+ ### Button Groups
90813
90949
 
90814
- ### Full-Width Hero Section
90950
+ Use 'space-x-1' or 'space-x-2' class to group buttons with consistent spacing:
90815
90951
 
90816
- <div class="is-section is-box type-system-ui is-section-100 is-content-bottom">
90817
- <div class="is-overlay" style="background-color: rgb(225, 225, 225);">
90818
- <div class="is-overlay-bg"
90819
- style="background-image: url('hero.jpg');
90820
- background-position: 50% 60%;
90821
- opacity: 1;">
90822
- </div>
90823
- </div>
90824
- <div class="is-container is-content-1400">
90825
- <div class="row">
90826
- <div class="column">
90827
- <h1 class="size-72 leading-12">Hero Title</h1>
90828
- <p class="size-18 leading-17">Subtitle text</p>
90829
- </div>
90830
- </div>
90831
- </div>
90952
+ <div class="space-x-2">
90953
+ <a href="#" role="button" class="...">Read More</a>
90954
+ <a href="#" role="button" class="...">Get Started</a>
90832
90955
  </div>
90833
90956
 
90834
- ### Split Section (40/60)
90835
-
90836
- <div class="is-section type-system-ui is-section-80">
90837
- <!-- Left box: 40% -->
90838
- <div class="is-box is-box-5">
90839
- <div class="is-overlay" style="background-color: rgb(240, 240, 240);">
90840
- </div>
90841
- <div class="is-container is-content-760">
90842
- <div class="row">
90843
- <div class="column">
90844
- <h2 class="size-42 leading-13">Text Content</h2>
90845
- <p class="size-17 leading-17">Description...</p>
90846
- </div>
90847
- </div>
90848
- </div>
90849
- </div>
90850
-
90851
- <!-- Right box: 60% -->
90852
- <div class="is-box is-box-7">
90853
- <div class="is-overlay">
90854
- <div class="is-overlay-bg"
90855
- style="background-image: url('image.jpg');
90856
- background-position: 67% 60%;">
90857
- </div>
90858
- </div>
90859
- </div>
90957
+ ### Examples by Size
90958
+
90959
+ #### Small Buttons
90960
+
90961
+ <a href="#" role="button"
90962
+ class="transition-all inline-block whitespace-nowrap cursor-pointer no-underline border-2 border-solid mt-2 mb-1 font-normal tracking-normal rounded-full py-1 px-4 size-14 leading-13 border-transparent hover:border-transparent" style="color: rgb(250, 250, 250); background-color: rgb(24, 24, 27);"
90963
+ style="color: rgb(250, 250, 250); background-color: rgb(24, 24, 27);"
90964
+ data-bg="rgb(24, 24, 27)"
90965
+ data-hover-bg="rgb(63, 63, 70)"
90966
+ onmouseover="if(this.getAttribute('data-hover-bg'))this.style.backgroundColor=this.getAttribute('data-hover-bg');"
90967
+ onmouseout="if(this.getAttribute('data-bg'))this.style.backgroundColor=this.getAttribute('data-bg');else this.style.backgroundColor='';"
90968
+ Read More
90969
+ </a>
90970
+
90971
+ #### Large Buttons
90972
+
90973
+ <div>
90974
+ <a href="#" role="button"
90975
+ class="transition-all inline-block whitespace-nowrap cursor-pointer no-underline border-2 border-solid mt-2 mb-1 font-normal tracking-normal rounded-full py-2 px-7 size-16 leading-16 border-transparent hover:border-transparent"
90976
+ style="color: rgb(250, 250, 250); background-color: rgb(24, 24, 27);"
90977
+ data-bg="rgb(24, 24, 27)"
90978
+ data-hover-bg="rgb(63, 63, 70)"
90979
+ onmouseover="if(this.getAttribute('data-hover-bg'))this.style.backgroundColor=this.getAttribute('data-hover-bg');"
90980
+ onmouseout="if(this.getAttribute('data-bg'))this.style.backgroundColor=this.getAttribute('data-bg');else this.style.backgroundColor='';" >Read More</a>
90860
90981
  </div>
90861
90982
 
90862
- ### Centered Content Section
90983
+ > **Important:** Buttons are portable components. Users edit text and colors through the ContentBuilder UI, so all styling must use utility classes plus inline styles for colors.
90863
90984
 
90864
- <div class="is-section is-box type-system-ui is-section-60">
90865
- <div class="is-container is-content-900">
90866
- <div class="row">
90867
- <div class="column">
90868
- <p class="size-14 uppercase tracking-150 text-gray-400 text-center">About</p>
90869
- </div>
90870
- </div>
90871
- <div class="row">
90872
- <div class="column">
90873
- <div class="spacer height-40"></div>
90874
- </div>
90875
- </div>
90876
- <div class="row">
90877
- <div class="column">
90878
- <h2 class="size-48 leading-13 text-center">Our Story</h2>
90879
- <p class="size-17 leading-17 text-gray-600 text-center">
90880
- Company description...
90881
- </p>
90882
- </div>
90883
- </div>
90884
- </div>
90885
- </div>
90985
+ > **Hover Effect:** The 'data-bg' and 'data-hover-bg' attributes with 'onmouseover/onmouseout' handlers enable hover color changes without additional CSS.
90886
90986
 
90887
- ---
90888
- ` + `
90889
- ## Best Practices
90987
+ ### Text Colors
90890
90988
 
90891
- ### 1. Typography Class
90989
+ Use grayscale for minimalist design.
90892
90990
 
90893
- **Always include 'type-system-ui' on every section** for default typography:
90991
+ | Class | Color | Description |
90992
+ |-------|-------|-------------|
90993
+ | '.text-black' | #000 | Primary text, headings |
90994
+ | '.text-gray-700' | #374151 | Secondary text |
90995
+ | '.text-gray-600' | #6b7280 | Body text |
90996
+ | '.text-gray-500' | #9ca3af | Muted text, labels |
90997
+ | '.text-gray-400' | #d1d5db | Subtle text, placeholders |
90998
+ | '.text-gray-300' | #e5e7eb | Very subtle text |
90999
+ | '.text-gray-200' | #f3f4f6 | Ultra light text |
90894
91000
 
90895
- <div class="is-section type-system-ui is-section-100">
91001
+ ### Background Colors
90896
91002
 
90897
- This ensures consistent font rendering across all sections.
91003
+ | Class | Color | Description |
91004
+ |-------|-------|-------------|
91005
+ | '.bg-white' | #ffffff | White background |
91006
+ | '.bg-gray-50' | #fafafa | Light gray - cards, sections |
91007
+ | '.bg-gray-100' | #f3f4f6 | Slightly darker gray |
91008
+ | '.bg-black' | #000000 | Black - buttons, highlights |
90898
91009
 
90899
- ### 2. When to Use is-content-left and is-content-right
91010
+ > **Editorial Style:** Stick to black, white, and grays for a clean, minimalist aesthetic. Use color sparingly for accents.
90900
91011
 
90901
- **Primary Use Case: Full-Width Hero Sections**
91012
+ ---
91013
+ ` + `
91014
+ ## Common Patterns
90902
91015
 
90903
- 'is-content-left' and 'is-content-right' are primarily for **full-width sections** where you want content positioned to the left or right:
91016
+ ### Section Header
90904
91017
 
90905
- <!-- Hero section with left-aligned content -->
90906
- <div class="is-section is-box type-system-ui is-section-100">
90907
- <div class="is-overlay">
90908
- <div class="is-overlay-bg" style="background-image: url('hero.jpg');"></div>
91018
+ <div class="row">
91019
+ <div class="column">
91020
+ <p class="uppercase tracking-150 size-12 text-gray-400">
91021
+ Section Label
91022
+ </p>
90909
91023
  </div>
90910
- <div class="is-container is-content-1200 is-content-left">
90911
- <div class="row">
90912
- <div class="column">
90913
- <h1 class="size-72 leading-12">Hero Title</h1>
90914
- </div>
90915
- </div>
91024
+ </div>
91025
+ <div class="row">
91026
+ <div class="column">
91027
+ <div class="spacer height-40"></div>
90916
91028
  </div>
90917
91029
  </div>
90918
91030
 
90919
- > **Note:** Center alignment is the default - no class needed.
91031
+ ### Card with Padding
90920
91032
 
90921
- **Split Sections: Generally NOT Needed**
91033
+ <div class="p-12 bg-gray-50">
91034
+ <p class="size-18 leading-17 text-black pb-4">
91035
+ Card title or content
91036
+ </p>
91037
+ <p class="size-14 text-gray-600">
91038
+ Secondary text
91039
+ </p>
91040
+ </div>
90922
91041
 
90923
- In split sections, **avoid using is-content-left or is-content-right** because:
91042
+ ### Feature with Number
91043
+
91044
+ <div class="column">
91045
+ <p class="size-14 font-semibold tracking-150 text-gray-300 pb-4">
91046
+ 01
91047
+ </p>
91048
+ <h3 class="size-32 font-normal leading-13 pb-4">
91049
+ Feature Title
91050
+ </h3>
91051
+ <p class="size-16 leading-17 text-gray-600">
91052
+ Feature description text here.
91053
+ </p>
91054
+ </div>
90924
91055
 
90925
- 1. **Small boxes (is-box-5, is-box-4, etc.)** are already narrow - left/right alignment doesn't make sense
90926
- 2. **Even is-box-6 (50% width)** - if content is wide (like is-content-540), it already takes up most of the box width, so left/right positioning has little effect
91056
+ ### Centered Content
90927
91057
 
90928
- <!-- CORRECT: Split section WITHOUT left/right alignment -->
90929
- <div class="is-section type-system-ui is-section-70">
90930
- <div class="is-box is-box-6">
90931
- <div class="is-container is-content-540">
90932
- <!-- ✓ Centered naturally, no positioning needed -->
90933
- <div class="row">
90934
- <div class="column">
90935
- <h2 class="size-42 leading-13">Content</h2>
90936
- </div>
90937
- </div>
90938
- </div>
90939
- </div>
90940
- <div class="is-box is-box-6">
90941
- <!-- Image box -->
91058
+ <div class="row">
91059
+ <div class="column">
91060
+ <h1 class="size-60 font-light leading-12 text-center">
91061
+ Centered Heading
91062
+ </h1>
90942
91063
  </div>
90943
91064
  </div>
90944
91065
 
90945
- <!-- INCORRECT: Unnecessary left alignment in split section -->
90946
- <div class="is-section type-system-ui is-section-70">
90947
- <div class="is-box is-box-6">
90948
- <div class="is-container is-content-540 is-content-left">
90949
- <!-- Doesn't make sense - content is already wide -->
90950
- </div>
91066
+ ### Image Grid
91067
+
91068
+ <div class="row">
91069
+ <div class="column">
91070
+ <p class="uppercase tracking-150 size-12 text-gray-400">Meet The Team</p>
90951
91071
  </div>
90952
91072
  </div>
90953
-
90954
- **Exception: Small Content Like Captions**
90955
-
90956
- Only use 'is-content-left' or 'is-content-right' in split sections for **very small content** (is-content-300 or smaller) where positioning makes a visual difference:
90957
-
90958
- <!-- CORRECT: Small caption aligned left in split section -->
90959
- <div class="is-section type-system-ui is-section-80">
90960
- <div class="is-box is-box-6">
90961
- <div class="is-overlay">
90962
- <div class="is-overlay-bg" style="background-image: url('photo.jpg');
90963
- background-position: 50% 50%;">
90964
- </div>
90965
- </div>
91073
+ <div class="row">
91074
+ <div class="column">
91075
+ <div class="spacer height-60"></div>
90966
91076
  </div>
90967
- <div class="is-box is-box-6 is-content-bottom edge-y-1">
90968
- <div class="is-overlay"></div>
90969
- <div class="is-container is-content-300 is-content-left">
90970
- <div class="row">
90971
- <div class="column">
90972
- <p class="size-14 text-gray-500">Photo caption text</p>
90973
- </div>
90974
- </div>
90975
- </div>
91077
+ </div>
91078
+ <div class="row">
91079
+ <div class="column">
91080
+ <img class="pb-2" src="https://placehold.co/400x400/f5f5f5/999?text=Alex+T" alt="Team Member">
91081
+ <h4 class="size-18 font-medium pb-2 text-center">Alex Thompson</h4>
91082
+ <p class="size-12 uppercase tracking-150 text-gray-500 pb-3 text-center">Founder &amp; CEO</p>
91083
+ <p class="size-15 leading-16 text-gray-600 text-center">Visionary leader with 15 years of experience.</p>
91084
+ </div>
91085
+ <div class="column">
91086
+ <img class="pb-2" src="https://placehold.co/400x400/f5f5f5/999?text=Sophia+M" alt="Team Member">
91087
+ <h4 class="size-18 font-medium pb-2 text-center">Sophia Martinez</h4>
91088
+ <p class="size-12 uppercase tracking-150 text-gray-500 pb-3 text-center">CTO</p>
91089
+ <p class="size-15 leading-16 text-gray-600 text-center">Technical architect building systems.</p>
90976
91090
  </div>
90977
91091
  </div>
90978
91092
 
90979
- **CRITICAL: Width Limits with Left/Right Alignment**
91093
+ ## Best Practices
90980
91094
 
90981
- If you do use 'is-content-left' or 'is-content-right':
90982
- - **Maximum container width: is-content-540** (preferably smaller)
90983
- - Wider containers can overflow box boundaries
90984
- - This is because max-width only works properly when containers are centered
91095
+ ### 1. Typography Hierarchy
90985
91096
 
90986
- **Guidelines:**
90987
- - **Full-width sections** Use is-content-left/right for left or right positioning (center is default)
90988
- - **Split sections** Usually DON'T use left/right alignment (content centers naturally)
90989
- - **Split sections with tiny captions** Can use left/right for small content (≤ is-content-300)
90990
- - **Width limit** → If using left/right alignment, max is-content-540
91097
+ - **Large Headings:** Use 'size-48' to 'size-96' with 'font-light' and 'leading-12'
91098
+ - **Medium Headings:** Use 'size-28' to 'size-42' with 'font-normal' and 'leading-13'
91099
+ - **Body Text:** Use 'size-16' to 'size-18' with 'text-gray-600' and 'leading-17'
91100
+ - **Labels:** Use 'size-12' to 'size-14' with 'uppercase tracking-150' and 'text-gray-400'
90991
91101
 
90992
- ### 3. Section Structure
91102
+ ### 2. Color Usage
90993
91103
 
90994
- **Always use this hierarchy:**
90995
- - Section Box → Overlay + Container → Row → Column
91104
+ - Primary text: 'text-black'
91105
+ - Body text: 'text-gray-600'
91106
+ - Muted text: 'text-gray-500' or 'text-gray-400'
90996
91107
 
90997
- **Never skip layers** or nest sections inside sections.
91108
+ ### 3. Structure Rules
90998
91109
 
90999
- ### 4. Background Images
91110
+ - Always wrap content in '.row' '.column'
91111
+ - Never place text/content directly under container
91112
+ - Wrap all links in '<p>' or '<div>'
91113
+ - Keep layout structure *flat* (no nested rows/columns inside other columns)
91000
91114
 
91001
- - Use 'background-position' to control focal point
91002
- - Common positions: '50% 60%' (centered, slightly below middle), '67% 60%' (right of center)
91003
- - Adjust opacity for overlay effects: '0.7' to '0.9' for subtle tint
91115
+ ### 4. Minimalist Approach
91004
91116
 
91005
- ### 5. Content Width
91117
+ - Use generous white space
91118
+ - Keep color palette minimal (black, white, grays)
91119
+ - Use light font weights for headings
91120
+ - Maintain visual hierarchy through size and spacing, not color
91006
91121
 
91007
- - **Text-heavy content:** Use narrower widths (760-900px) for better readability
91008
- - **Visual layouts:** Use wider widths (1200-1400px)
91009
- - **Full bleed designs:** Use ultra-wide (1600-1740px)
91010
- ` + `
91011
- ### 6. Vertical Positioning
91122
+ ### 5. When creating multi-column layouts:
91012
91123
 
91013
- - **Hero sections:** Use 'is-content-bottom' to anchor text at bottom
91014
- - **Centered messages:** Use default (middle) positioning
91015
- - **Headers/navigation areas:** Use 'is-content-top'
91124
+ Columns have default padding (1rem left/right) which handles most cases.
91016
91125
 
91017
- ### 7. Mobile Responsiveness
91126
+ **Do NOT use:**
91018
91127
 
91019
- The framework handles mobile automatically:
91020
- - Boxes stack to 100% width
91021
- - Containers center horizontally
91022
- - Edge adjustments apply only on desktop
91128
+ - pr-* pl-* px-* for column spacing ❌
91129
+ Use gap when you need **MORE** spacing than the default.
91130
+ - Padding classes on columns (except for image gallery exception)
91023
91131
 
91024
- No mobile-specific code needed for basic layouts.
91132
+ Images have no default margin, so add pb-* to columns for mobile stacking:
91025
91133
 
91026
- ### 8. Combining with Content.css
91134
+ <div class="row" style="gap:20px">
91135
+ <div class="column pb-6"><img...></div>
91136
+ <div class="column pb-6"><img...></div>
91137
+ </div>
91027
91138
 
91028
- The Box Framework provides structure. The Content.css Framework provides content styling.
91139
+ ` + `
91140
+ ### 6. Vertical Centering
91141
+ When creating side-by-side layouts with vertical positioning:
91029
91142
 
91030
- **Box Framework handles:**
91031
- - Page sections and layout
91032
- - Background images/colors
91033
- - Container positioning and width
91143
+ **For functional alignment (content should align based on column height):**
91144
+ Use flexbox, NOT spacers:
91145
+ - Center: flex flex-col justify-center
91146
+ - Bottom: flex flex-col justify-end
91147
+ - Top: (default, no class needed)
91034
91148
 
91035
- **Content.css handles:**
91036
- - Typography and spacing
91037
- - Buttons and components
91038
- - Grid layout (rows/columns)
91039
- - Text colors and styles
91149
+ CORRECT:
91150
+ <div class="row" style="gap:20px">
91151
+ <div class="column">
91152
+ <img src="..." style="width: 100%; object-fit: cover;">
91153
+ </div>
91154
+ <div class="column flex flex-col justify-center">
91155
+ <h3>Title</h3>
91156
+ <p>Content...</p>
91157
+ </div>
91158
+ </div>
91040
91159
 
91041
- Always use both frameworks together for complete designs.
91160
+ INCORRECT:
91161
+ <div class="column">
91162
+ <div class="spacer height-120"></div> ❌ (Fixed spacing breaks responsively)
91163
+ <h3>Title</h3>
91164
+ <p>Content...</p>
91165
+ </div>
91042
91166
 
91043
- ---
91167
+ **For creative/editorial positioning (intentional staggered or asymmetric layouts):**
91168
+ Use spacers for deliberate visual rhythm:
91044
91169
 
91045
- ## Common Patterns
91170
+ <div class="row">
91171
+ <div class="column">
91172
+ <div class="spacer height-160"></div>
91173
+ <img...>
91174
+ </div>
91175
+ <div class="column">
91176
+ <div class="spacer height-80"></div>
91177
+ <img...>
91178
+ </div>
91179
+ <div class="column">
91180
+ <h2>Title</h2>
91181
+ </div>
91182
+ </div>
91046
91183
 
91047
- ### Pattern: Image Left, Text Right
91184
+ **Decision guide:**
91185
+ - Content needs to align based on other column heights? → Use flexbox
91186
+ - Content should be deliberately offset for visual interest? → Use spacers
91048
91187
 
91049
- <div class="is-section type-system-ui is-section-70">
91050
- <div class="is-box is-box-6">
91051
- <div class="is-overlay">
91052
- <div class="is-overlay-bg" style="background-image: url('image.jpg');"></div>
91053
- </div>
91054
- </div>
91055
- <div class="is-box is-box-6">
91056
- <div class="is-container is-content-540 is-content-left">
91057
- <div class="row">
91058
- <div class="column">
91059
- <h3 class="size-32 leading-13">Title</h3>
91060
- <p class="size-17 leading-17 text-gray-600">Text content...</p>
91061
- </div>
91062
- </div>
91188
+ Spacers in editorial designs create intentional asymmetry and visual rhythm, which is different from trying to align content responsively.
91189
+
91190
+
91191
+ ### 7. DO NOT create nested grids (row/column inside column).
91192
+
91193
+ For horizontal layouts within a column, use simple flexbox instead of nested grids.
91194
+
91195
+ INCORRECT (nested grid):
91196
+ <div class="row">
91197
+ <div class="column">
91198
+ <div class="row">
91199
+ <div class="column"><h3>Title</h3></div>
91200
+ <div class="column"><p>Category</p></div>
91201
+ <div class="column"><p>Date</p></div>
91063
91202
  </div>
91064
91203
  </div>
91065
91204
  </div>
91066
91205
 
91067
- ### Pattern: Full-Width with Top-Aligned Narrow Content
91206
+ CORRECT (simple flexbox):
91068
91207
 
91069
- <div class="is-section is-box type-system-ui is-section-100 is-content-top edge-y-2">
91070
- <div class="is-overlay" style="background-color: rgb(250, 250, 250);">
91071
- </div>
91072
- <div class="is-container is-content-760">
91073
- <div class="row">
91074
- <div class="column">
91075
- <h1 class="size-60 leading-12">Headline</h1>
91076
- <p class="size-18 leading-17">Description...</p>
91077
- </div>
91208
+ <div class="row">
91209
+ <div class="column">
91210
+ <div class="flex justify-between items-center">
91211
+ <h3>Title</h3>
91212
+ <p>Category</p>
91213
+ <p>Date</p>
91078
91214
  </div>
91079
91215
  </div>
91080
91216
  </div>
91081
91217
 
91082
- ### Pattern: Three Equal Boxes
91218
+ INCORRECT (nested grid):
91083
91219
 
91084
- <div class="is-section type-system-ui is-section-60">
91085
- <div class="is-box is-box-4">
91086
- <div class="is-container">
91087
- <!-- Content -->
91088
- </div>
91220
+ Common flexbox utilities for simple layouts:
91221
+
91222
+ - flex justify-between = space items apart
91223
+ - flex justify-center = center items
91224
+ - flex items-center = vertically center
91225
+ - flex gap-4 = add spacing between items
91226
+
91227
+ Keep the structure flat.
91228
+ ` + `
91229
+ ### 8. Spacing in Design
91230
+
91231
+ IMPORTANT: Text elements (h1-h6, p) already have default top/bottom margins in the framework.
91232
+ The framework's default margins are designed to create proper text spacing. Only add padding for design purposes (borders, containers, backgrounds), not for basic text spacing.
91233
+
91234
+ Guidelines:
91235
+ - For borders between items: pb-2 pt-2 is sufficient
91236
+ - For visual grouping: pb-3 pt-3 maximum
91237
+ - For design containers (backgrounds, cards, boxes): use generous padding (p-8, p-10, p-12, etc.)
91238
+ - For major section breaks: use spacer elements instead
91239
+ - Trust default margins - don't fight them with excessive padding
91240
+
91241
+ CORRECT (minimal padding with borders):
91242
+ <div class="pb-2" style="border-bottom: 1px solid #f0f0f0;">
91243
+ <div class="flex justify-between items-center">
91244
+ <p class="size-14 uppercase tracking-150 text-gray-500">Material</p>
91245
+ <p class="size-16 text-gray-700">Solid Oak, Italian Leather</p>
91089
91246
  </div>
91090
- <div class="is-box is-box-4">
91091
- <div class="is-container">
91092
- <!-- Content -->
91093
- </div>
91247
+ </div>
91248
+ <div class="pb-2 pt-2" style="border-bottom: 1px solid #f0f0f0;">
91249
+ <div class="flex justify-between items-center">
91250
+ <p class="size-14 uppercase tracking-150 text-gray-500">Dimensions</p>
91251
+ <p class="size-16 text-gray-700">76 × 68 × 82 cm</p>
91094
91252
  </div>
91095
- <div class="is-box is-box-4">
91096
- <div class="is-container">
91097
- <!-- Content -->
91098
- </div>
91253
+ </div>
91254
+
91255
+ INCORRECT (excessive padding):
91256
+ <div class="pb-6" style="border-bottom: 1px solid #f0f0f0;">
91257
+ <div class="flex justify-between items-center pb-4"> ❌
91258
+ <p class="size-14 uppercase tracking-150 text-gray-500">Material</p>
91259
+ <p class="size-16 text-gray-700">Solid Oak, Italian Leather</p>
91260
+ </div>
91261
+ </div>
91262
+ <div class="pb-6 pt-6" style="border-bottom: 1px solid #f0f0f0;"> ❌
91263
+ <div class="flex justify-between items-center pb-4"> ❌
91264
+ <p class="size-14 uppercase tracking-150 text-gray-500">Dimensions</p>
91265
+ <p class="size-16 text-gray-700">76 × 68 × 82 cm</p>
91099
91266
  </div>
91100
91267
  </div>
91268
+
91269
+ CORRECT (intentional design padding):
91270
+ <div class="p-12 bg-gray-50">
91271
+ <p class="size-18 leading-17 text-black pb-8">Quote text...</p>
91272
+ <p class="size-14 font-semibold text-black pb-2">Name</p>
91273
+ <p class="size-13 text-gray-600">Title</p>
91274
+ </div>
91275
+
91276
+ Generous padding is appropriate for visual design elements like cards, testimonials, or highlighted sections.
91277
+
91278
+ ### 9. Icons
91279
+
91280
+ When creating icon-based features, benefits, or service sections: use Bootstrap Icons, NOT emojis. The framework includes Bootstrap Icons support. Wrap icons in a div for proper display:
91281
+
91282
+ <div class="text-center pb-6">
91283
+ <i class="bi bi-lightning size-42"></i>
91284
+ </div>
91285
+ <h4 class="size-18 font-medium text-center pb-3">Lightning Fast</h4>
91286
+ <p class="size-14 leading-16 text-gray-600 text-center">Description...</p>
91287
+
91101
91288
  `;
91102
91289
 
91103
91290
  const contextCodeBlock = `
@@ -92566,7 +92753,7 @@ class ContentBuilder {
92566
92753
  this.ShortcutInfo = new ShortcutInfo(this);
92567
92754
  if (!this.opts.isContentBox) {
92568
92755
  this.codechat = new CodeChat({
92569
- context: contextBoxFramework + contextCodeBlock
92756
+ context: contextContentFramework + contextCodeBlock
92570
92757
  }, this);
92571
92758
  if (this.startAIAssistant) {
92572
92759
  this.openAIAssistant();
@@ -94034,7 +94221,8 @@ class ContentBuilder {
94034
94221
  }
94035
94222
 
94036
94223
  // Apply behavior on each row
94037
- const rows = this.dom.elementChildren(builder);
94224
+ let rows;
94225
+ if (this.useDefaultGrid) rows = builder.querySelectorAll('.row');else rows = this.dom.elementChildren(builder);
94038
94226
  rows.forEach(row => {
94039
94227
  // Skip if not a DIV
94040
94228
  if (row.tagName !== 'DIV') return;
@@ -94055,6 +94243,39 @@ class ContentBuilder {
94055
94243
 
94056
94244
  // On each row, add 2 tools: Row tool (div.is-row-tool) & Row Add tool (div.is-rowadd-tool)
94057
94245
 
94246
+ // Validate gap
94247
+ const style = window.getComputedStyle(row);
94248
+ const gapValue = parseFloat(style.gap) || 0;
94249
+ const columns = row.querySelectorAll('.column');
94250
+ let allHaveWidth = true;
94251
+ let totalWidthPercent = 0;
94252
+ columns.forEach(col => {
94253
+ const colStyle = col.getAttribute('style') || '';
94254
+ const match = colStyle.match(/width:\s*([\d.]+)%/);
94255
+ if (match) {
94256
+ totalWidthPercent += parseFloat(match[1]);
94257
+ } else {
94258
+ allHaveWidth = false;
94259
+ }
94260
+ });
94261
+ if (allHaveWidth) {
94262
+ const colCount = columns.length;
94263
+ const totalGapPercent = gapValue / row.clientWidth * 100 * (colCount - 1);
94264
+ const combined = totalWidthPercent + totalGapPercent;
94265
+ if (combined >= 100) {
94266
+ row.style.gap = '';
94267
+ row.classList.remove('gap-10');
94268
+ row.classList.remove('gap-20');
94269
+ row.classList.remove('gap-30');
94270
+ row.classList.remove('gap-40');
94271
+ row.classList.remove('gap-50');
94272
+ row.classList.remove('gap-60');
94273
+ row.classList.remove('gap-70');
94274
+ row.classList.remove('gap-80');
94275
+ row.classList.remove('gap-90');
94276
+ }
94277
+ }
94278
+
94058
94279
  // Render Row tool
94059
94280
  this._rowTool.render(row);
94060
94281
 
@@ -94063,7 +94284,8 @@ class ContentBuilder {
94063
94284
  rowaddtool.render(row);
94064
94285
 
94065
94286
  // Apply behavior on each column
94066
- const cols = this.dom.elementChildren(row);
94287
+ let cols;
94288
+ if (this.useDefaultGrid) cols = row.querySelectorAll('.column');else cols = this.dom.elementChildren(row);
94067
94289
  cols.forEach(col => {
94068
94290
  if (this.dom.hasClass(col, 'is-row-tool') || this.dom.hasClass(col, 'is-col-tool') || this.dom.hasClass(col, 'is-rowadd-tool')) return; // Return if not a column
94069
94291
 
@@ -97143,6 +97365,7 @@ Please obtain a license at: https://innovastudio.com/contentbox`);
97143
97365
  if (!this.controlPanel) this.rte.click(col);
97144
97366
  }
97145
97367
  handleCellClick(col, e) {
97368
+ if (col !== e.target.closest('.column')) return;
97146
97369
  if (this.cleanEditing) {
97147
97370
  col.parentNode.querySelector('.is-row-tool').style.display = '';
97148
97371
  col.parentNode.querySelector('.is-col-tool').style.display = '';