@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.
- package/package.json +1 -1
- package/public/contentbuilder/contentbuilder.css +2 -8
- package/public/contentbuilder/contentbuilder.esm.js +635 -412
- package/public/contentbuilder/contentbuilder.min.js +3 -3
- package/public/contentbuilder/lang/en.js +29 -3
- package/public/contentbuilder/lang/fr.js +29 -3
- package/public/contentbuilder/themes/dark-blue.css +0 -3
- package/public/contentbuilder/themes/dark-blue2.css +0 -3
- package/public/contentbuilder/themes/dark-blue3.css +0 -3
- package/public/contentbuilder/themes/dark-gray.css +0 -3
- package/public/contentbuilder/themes/dark-pink.css +0 -3
- package/public/contentbuilder/themes/dark-purple.css +0 -3
- package/public/contentbuilder/themes/dark-red.css +0 -3
- package/public/contentbuilder/themes/dark.css +3 -6
|
@@ -6569,7 +6569,9 @@ class Util {
|
|
|
6569
6569
|
row = this.rowSelected();
|
|
6570
6570
|
}
|
|
6571
6571
|
if (!row) return;
|
|
6572
|
-
|
|
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
|
|
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
|
|
90557
|
-
# Box Framework
|
|
90603
|
+
const contextContentFramework = `
|
|
90558
90604
|
|
|
90559
|
-
|
|
90605
|
+
# Content.css Framework
|
|
90560
90606
|
|
|
90561
|
-
##
|
|
90607
|
+
## Grid System
|
|
90562
90608
|
|
|
90563
|
-
|
|
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
|
-
|
|
90625
|
+
> **Important:** Never place content directly under a container. Always use row → column structure.
|
|
90573
90626
|
|
|
90574
|
-
|
|
90627
|
+
### Inline Width Style
|
|
90575
90628
|
|
|
90576
|
-
|
|
90629
|
+
Just use: <div class="column" style="width: 52%; flex: 0 0 auto;">
|
|
90577
90630
|
|
|
90578
|
-
<div class="
|
|
90579
|
-
|
|
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
|
-
|
|
90636
|
+
**If columns should be equal width:**
|
|
90583
90637
|
|
|
90584
|
-
|
|
90638
|
+
Just use: <div class="column"> for each column.
|
|
90585
90639
|
|
|
90586
|
-
|
|
90587
|
-
|
|
90588
|
-
|
|
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
|
-
**
|
|
90645
|
+
> **Tip:** On mobile (< 760px), columns automatically stack full-width for better responsiveness.
|
|
90597
90646
|
|
|
90598
|
-
|
|
90599
|
-
<!-- Full screen hero -->
|
|
90600
|
-
</div>
|
|
90647
|
+
### Column Gap
|
|
90601
90648
|
|
|
90602
|
-
|
|
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
|
-
|
|
90653
|
+
- **Use gap ONLY when the design specifically needs extra breathing room.**
|
|
90607
90654
|
|
|
90608
|
-
|
|
90655
|
+
- ***ALWAYS use inline style for gap, NEVER use gap utility classes (gap-4, gap-6, etc.).***
|
|
90609
90656
|
|
|
90610
|
-
|
|
90657
|
+
When gap is needed, use these guidelines based on content type:
|
|
90611
90658
|
|
|
90612
|
-
|
|
90659
|
+
**Image galleries/portfolio grids: gap:20px (maximum)**
|
|
90613
90660
|
|
|
90614
|
-
<div class="
|
|
90615
|
-
<div class="
|
|
90616
|
-
|
|
90617
|
-
|
|
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
|
-
|
|
90667
|
+
**Image + text layouts (2 columns): gap:30px (maximum)**
|
|
90624
90668
|
|
|
90625
|
-
|
|
90626
|
-
|
|
90627
|
-
<
|
|
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="
|
|
90637
|
-
<
|
|
90638
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
90684
|
+
**Gap takes up space**, so column widths + gap must not exceed 100%.
|
|
90660
90685
|
|
|
90661
|
-
|
|
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
|
-
|
|
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
|
-
|
|
90706
|
+
### Font Sizes
|
|
90668
90707
|
|
|
90669
|
-
|
|
90708
|
+
Use 'size-*' classes for precise font sizing.
|
|
90670
90709
|
|
|
90671
|
-
|
|
90672
|
-
|
|
90673
|
-
|
|
90674
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
90727
|
+
### Font Weights
|
|
90684
90728
|
|
|
90685
|
-
|
|
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
|
-
###
|
|
90731
|
+
### Letter Spacing (Tracking)
|
|
90694
90732
|
|
|
90695
|
-
|
|
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
|
-
|
|
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
|
-
|
|
90739
|
+
> **Best Practice:** Use 'leading-17' or 'leading-18' for body text. Use 'leading-12' or 'leading-13' for headings.
|
|
90708
90740
|
|
|
90709
|
-
|
|
90741
|
+
### Text Utilities
|
|
90710
90742
|
|
|
90711
|
-
|
|
90743
|
+
Classes: uppercase, lowercase, capitalize, text-center, text-left, text-right
|
|
90712
90744
|
|
|
90713
|
-
|
|
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
|
-
|
|
90747
|
+
CORRECT (alignment on elements):
|
|
90722
90748
|
|
|
90723
|
-
|
|
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
|
-
|
|
90755
|
+
INCORRECT (wrapper div for alignment):
|
|
90726
90756
|
|
|
90727
|
-
<div class="
|
|
90728
|
-
|
|
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
|
-
|
|
90765
|
+
Keep the content structure in column flat.
|
|
90732
90766
|
|
|
90733
|
-
|
|
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
|
-
|
|
90769
|
+
Classes: p-0, p-2, p-3, p-4, p-6, p-8, p-10, p-12
|
|
90742
90770
|
|
|
90743
|
-
|
|
90771
|
+
> **Available values:** 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 20
|
|
90744
90772
|
|
|
90745
|
-
|
|
90773
|
+
**Example: Card with padding**
|
|
90746
90774
|
|
|
90747
|
-
<!--
|
|
90748
|
-
<div class="
|
|
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
|
-
|
|
90751
|
-
<div class="is-container">
|
|
90781
|
+
### Directional Padding
|
|
90752
90782
|
|
|
90753
|
-
|
|
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
|
-
|
|
90785
|
+
### Spacer (Vertical Spacing)
|
|
90757
90786
|
|
|
90758
|
-
|
|
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
|
-
|
|
90796
|
+
**Example: Adding space between sections**
|
|
90761
90797
|
|
|
90762
|
-
<!--
|
|
90763
|
-
<div class="
|
|
90764
|
-
<div class="
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
90820
|
+
## Buttons
|
|
90785
90821
|
|
|
90786
|
-
|
|
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
|
-
|
|
90824
|
+
### Button Structure
|
|
90793
90825
|
|
|
90794
|
-
|
|
90826
|
+
All buttons must be wrapped in a 'div' (or use 'space-x-2' for button groups):
|
|
90795
90827
|
|
|
90796
|
-
|
|
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
|
-
|
|
90799
|
-
|
|
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
|
-
**
|
|
90937
|
+
**Key classes:** 'underline' + 'border-transparent' (no horizontal padding needed).
|
|
90803
90938
|
|
|
90804
|
-
|
|
90805
|
-
- 'content-pt-*' - Top padding only
|
|
90806
|
-
- 'content-pb-*' - Bottom padding only
|
|
90939
|
+
**For button groups:**
|
|
90807
90940
|
|
|
90808
|
-
|
|
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
|
-
|
|
90948
|
+
### Button Groups
|
|
90813
90949
|
|
|
90814
|
-
|
|
90950
|
+
Use 'space-x-1' or 'space-x-2' class to group buttons with consistent spacing:
|
|
90815
90951
|
|
|
90816
|
-
<div class="
|
|
90817
|
-
<
|
|
90818
|
-
|
|
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
|
-
###
|
|
90835
|
-
|
|
90836
|
-
|
|
90837
|
-
|
|
90838
|
-
|
|
90839
|
-
|
|
90840
|
-
|
|
90841
|
-
|
|
90842
|
-
|
|
90843
|
-
|
|
90844
|
-
|
|
90845
|
-
|
|
90846
|
-
|
|
90847
|
-
|
|
90848
|
-
|
|
90849
|
-
|
|
90850
|
-
|
|
90851
|
-
|
|
90852
|
-
|
|
90853
|
-
|
|
90854
|
-
|
|
90855
|
-
|
|
90856
|
-
|
|
90857
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
90989
|
+
Use grayscale for minimalist design.
|
|
90892
90990
|
|
|
90893
|
-
|
|
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
|
-
|
|
91001
|
+
### Background Colors
|
|
90896
91002
|
|
|
90897
|
-
|
|
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
|
-
|
|
91010
|
+
> **Editorial Style:** Stick to black, white, and grays for a clean, minimalist aesthetic. Use color sparingly for accents.
|
|
90900
91011
|
|
|
90901
|
-
|
|
91012
|
+
---
|
|
91013
|
+
` + `
|
|
91014
|
+
## Common Patterns
|
|
90902
91015
|
|
|
90903
|
-
|
|
91016
|
+
### Section Header
|
|
90904
91017
|
|
|
90905
|
-
|
|
90906
|
-
<div class="
|
|
90907
|
-
|
|
90908
|
-
|
|
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
|
-
|
|
90911
|
-
|
|
90912
|
-
|
|
90913
|
-
|
|
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
|
-
|
|
91031
|
+
### Card with Padding
|
|
90920
91032
|
|
|
90921
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
90929
|
-
<div class="
|
|
90930
|
-
|
|
90931
|
-
|
|
90932
|
-
|
|
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
|
-
|
|
90946
|
-
|
|
90947
|
-
|
|
90948
|
-
|
|
90949
|
-
|
|
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
|
-
|
|
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
|
-
|
|
90968
|
-
|
|
90969
|
-
|
|
90970
|
-
|
|
90971
|
-
|
|
90972
|
-
|
|
90973
|
-
|
|
90974
|
-
|
|
90975
|
-
|
|
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 & 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
|
-
|
|
91093
|
+
## Best Practices
|
|
90980
91094
|
|
|
90981
|
-
|
|
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
|
-
**
|
|
90987
|
-
- **
|
|
90988
|
-
- **
|
|
90989
|
-
- **
|
|
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
|
-
###
|
|
91102
|
+
### 2. Color Usage
|
|
90993
91103
|
|
|
90994
|
-
|
|
90995
|
-
-
|
|
91104
|
+
- Primary text: 'text-black'
|
|
91105
|
+
- Body text: 'text-gray-600'
|
|
91106
|
+
- Muted text: 'text-gray-500' or 'text-gray-400'
|
|
90996
91107
|
|
|
90997
|
-
|
|
91108
|
+
### 3. Structure Rules
|
|
90998
91109
|
|
|
90999
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
91126
|
+
**Do NOT use:**
|
|
91018
91127
|
|
|
91019
|
-
|
|
91020
|
-
|
|
91021
|
-
-
|
|
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
|
-
|
|
91132
|
+
Images have no default margin, so add pb-* to columns for mobile stacking:
|
|
91025
91133
|
|
|
91026
|
-
|
|
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
|
-
|
|
91139
|
+
` + `
|
|
91140
|
+
### 6. Vertical Centering
|
|
91141
|
+
When creating side-by-side layouts with vertical positioning:
|
|
91029
91142
|
|
|
91030
|
-
**
|
|
91031
|
-
|
|
91032
|
-
-
|
|
91033
|
-
-
|
|
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
|
-
|
|
91036
|
-
|
|
91037
|
-
|
|
91038
|
-
|
|
91039
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
91050
|
-
|
|
91051
|
-
|
|
91052
|
-
|
|
91053
|
-
|
|
91054
|
-
|
|
91055
|
-
|
|
91056
|
-
|
|
91057
|
-
|
|
91058
|
-
|
|
91059
|
-
|
|
91060
|
-
|
|
91061
|
-
|
|
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
|
-
|
|
91206
|
+
CORRECT (simple flexbox):
|
|
91068
91207
|
|
|
91069
|
-
<div class="
|
|
91070
|
-
<div class="
|
|
91071
|
-
|
|
91072
|
-
|
|
91073
|
-
|
|
91074
|
-
<
|
|
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
|
-
|
|
91218
|
+
INCORRECT (nested grid):
|
|
91083
91219
|
|
|
91084
|
-
|
|
91085
|
-
|
|
91086
|
-
|
|
91087
|
-
|
|
91088
|
-
|
|
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
|
-
|
|
91091
|
-
|
|
91092
|
-
|
|
91093
|
-
</
|
|
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
|
-
|
|
91096
|
-
|
|
91097
|
-
|
|
91098
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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 = '';
|