create-flowmo 1.0.0 → 1.1.1

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-flowmo",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Scaffold an OutSystems-Lite project with screens, data, logic, and built-in agent skills",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -5,7 +5,7 @@ description: >
5
5
  CSS classes. Use when creating .visual.html prototypes, styling components, using
6
6
  layout patterns (Cards, Columns, Forms, Tables, Tabs), applying spacing, colors,
7
7
  typography, or scaffolding screens — even if the user doesn't mention "OutSystems"
8
- explicitly. Covers all 87 UI patterns across 7 categories, 16 core widgets, and
8
+ explicitly. Covers all 86 UI patterns across 8 categories, 16 core widgets, and
9
9
  the complete design token system (spacing, colors, borders, shadows, typography).
10
10
  compatibility: Requires outsystems-ui.css linked in the HTML file. Designed for VS Code agents.
11
11
  metadata:
@@ -22,16 +22,136 @@ Build pixel-perfect OutSystems-compatible `.visual.html` prototypes using only t
22
22
  1. **Utility-first styling** — use OSUI utility classes (`.padding-m`, `.text-bold`, `.background-primary`). Never use raw CSS properties or inline `style=""` attributes.
23
23
  2. **12-column grid** — use `.columns2` through `.columns6` for responsive layouts. These auto-stack on mobile — do not add custom media queries.
24
24
  3. **No external JavaScript** — all interaction patterns are CSS/class-driven.
25
- 4. **Layout Wrapper required** — every screen must be wrapped in:
26
- ```html
27
- <div class="layout active-screen">
28
- <!-- header, content, footer -->
29
- </div>
30
- ```
31
- The `.active-screen` class is REQUIRED or utility classes and CSS variables will not resolve.
32
- 5. **Strip platform IDs** — never include `os-internal-id` or similar platform-generated attributes.
33
- 6. **Widget slots** use `{{content}}` placeholders in templates where nested widgets would go.
34
- 7. **Base template** — see [assets/layout-template.html](assets/layout-template.html) for the starting scaffold.
25
+ 4. **Layout is CRITICAL** — every screen MUST use one of the three OutSystems layouts. Pick the right one and use the exact HTML structure from the layout template files. The `.active-screen` wrapper is REQUIRED or utility classes will not resolve. See the **Layouts** section below.
26
+ 5. **Scroll model** — OSUI sets `html { overflow: hidden }`. The `.active-screen` div is the actual scroll container. Your theme.css MUST include `.active-screen { overflow: hidden auto; height: 100vh; }` or the page will not scroll.
27
+ 6. **Strip platform IDs** — never include `os-internal-id` or similar platform-generated attributes.
28
+ 7. **Widget slots** — use `{{content}}` placeholders in templates where nested widgets would go.
29
+ 8. **theme.css is mandatory** — every project has a `theme.css` that loads after `outsystems-ui.css`. Use it for brand colors, custom component styles, and OSUI overrides. See the **Theme Customization** section below.
30
+
31
+ ## Layouts
32
+
33
+ OutSystems has four top-level page layouts. **Every screen must use one.** The layout controls the header, navigation, sidebar, and content structure. Do NOT invent your own layout wrapper — use the correct template.
34
+
35
+ ### Choosing a Layout
36
+
37
+ | Layout | Class | Best for | Template |
38
+ |--------|-------|----------|----------|
39
+ | **LayoutTopMenu** | `.layout.layout-top` | Web apps with 3–6 top-level pages. Horizontal nav in header. | [assets/layout-top.html](assets/layout-top.html) |
40
+ | **LayoutSideMenu** | `.layout.layout-side` | Backoffice/admin apps with many pages or deep navigation. Vertical sidebar. | [assets/layout-side.html](assets/layout-side.html) |
41
+ | **LayoutBase** | `.layout.layout-blank` | Landing pages, marketing pages, public screens. Full-width sections. Same header/nav as LayoutTopMenu. | [assets/layout-base.html](assets/layout-base.html) |
42
+ | **LayoutBlank** | `.layout.blank` | Login, error pages, splash screens. No header, no footer, no navigation. | [assets/layout-blank.html](assets/layout-blank.html) |
43
+
44
+ **Mixing layouts** within one app is normal. Use LayoutBase for the landing page and LayoutTopMenu for inner pages. Or LayoutBlank for login and LayoutSideMenu for the main app.
45
+
46
+ ### Layout Structure
47
+
48
+ #### LayoutTopMenu & LayoutBase (shared pattern)
49
+
50
+ ```
51
+ .active-screen
52
+ └── .layout.layout-top.fixed-header (or .layout.layout-blank.fixed-header)
53
+ └── .main
54
+ ├── header.header [role=banner]
55
+ │ └── .header-top.ThemeGrid_Container
56
+ │ └── .header-content.display-flex
57
+ │ ├── .menu-icon [role=button] ← hidden on desktop, visible on mobile
58
+ │ └── .header-navigation (flex:1)
59
+ │ └── nav.app-menu-content.display-flex [role=navigation]
60
+ │ ├── .header-logo ← padding-right for gap
61
+ │ │ └── .application-name ← logo + app title
62
+ │ ├── .app-menu-links [role=menubar] (flex:1)
63
+ │ │ └── <a role="menuitem"> ← .active on current page
64
+ │ ├── .app-login-info > .user-info
65
+ │ └── .app-menu-overlay [role=button]
66
+ ├── .content
67
+ │ ├── .main-content.ThemeGrid_Container [role=main] ← LayoutTopMenu
68
+ │ │ ├── .content-breadcrumbs
69
+ │ │ ├── .content-top.display-flex.align-items-center
70
+ │ │ │ ├── .content-top-title.heading1
71
+ │ │ │ └── .content-top-actions
72
+ │ │ └── .content-middle
73
+ │ │
74
+ │ │ OR for LayoutBase:
75
+ │ ├── .main-content [role=main] ← NO ThemeGrid_Container
76
+ │ │ └── .content-middle
77
+ │ │ └── LayoutBaseSection (.full-width-section)
78
+ │ │ └── .ThemeGrid_Container (inside EACH section)
79
+ │ │
80
+ │ └── footer.content-bottom [role=contentinfo]
81
+ │ └── .footer.ThemeGrid_Container
82
+ ```
83
+
84
+ #### LayoutSideMenu (different structure)
85
+
86
+ The sidebar `<aside>` sits OUTSIDE `.main`, as a sibling:
87
+
88
+ ```
89
+ .active-screen
90
+ └── .layout.layout-side.fixed-header
91
+ ├── aside.aside-navigation [role=complementary] ← OUTSIDE .main
92
+ │ └── Common.Menu block (same nav as header)
93
+ │ ├── .app-menu-content
94
+ │ │ ├── .header-logo > .application-name
95
+ │ │ ├── .app-menu-links [role=menubar]
96
+ │ │ └── .app-login-info > .user-info
97
+ │ └── .app-menu-overlay [role=button]
98
+ └── .main
99
+ ├── header.header [role=banner]
100
+ │ └── .header-top.ThemeGrid_Container
101
+ │ └── .header-content.display-flex
102
+ │ ├── .menu-icon [role=button]
103
+ │ ├── .application-name
104
+ │ └── .header-navigation
105
+ │ └── Common.Menu block (duplicate for desktop)
106
+ └── .content
107
+ ├── .main-content.ThemeGrid_Container [role=main]
108
+ │ ├── .content-breadcrumbs
109
+ │ ├── .content-top > .content-top-title + .content-top-actions
110
+ │ └── .content-middle
111
+ └── footer.content-bottom [role=contentinfo]
112
+ └── .footer.ThemeGrid_Container
113
+ ```
114
+
115
+ #### LayoutBlank (minimal)
116
+
117
+ ```
118
+ .active-screen
119
+ └── .layout.blank
120
+ └── .content [role=main]
121
+ └── .main-content
122
+ ```
123
+
124
+ No header, no footer, no navigation. For login pages, error pages, etc.
125
+
126
+ ### Common.Menu Block (standard navigation)
127
+
128
+ All layouts that have navigation use the **same `Common.Menu` block**. It provides:
129
+ - **App title/logo** in `.header-logo` > `.application-name`
130
+ - **Menu links** in `.app-menu-links` with `role="menubar"`
131
+ - Simple links: `<a role="menuitem" href="#">Page</a>`
132
+ - Subsequent links use `.ThemeGrid_MarginGutter` for spacing
133
+ - Active page: add `.active` class to the link
134
+ - Dropdown submenus: use `Navigation.Submenu` pattern (`.osui-submenu`)
135
+ - Subsequent links add `.ThemeGrid_MarginGutter` for spacing
136
+ - **User info** in `.app-login-info` > `.user-info`
137
+ - **Overlay** `.app-menu-overlay` for mobile menu backdrop
138
+
139
+ ### Mobile Responsive Behavior
140
+
141
+ The layouts are **automatically responsive** via the OSUI CSS — no custom media queries needed:
142
+
143
+ | Viewport | body class | Menu behavior |
144
+ |----------|-----------|---------------|
145
+ | Desktop | `desktop landscape` | Menu links visible in header (top) or sidebar (side) |
146
+ | Tablet | `tablet` | Burger icon appears, menu slides in from left |
147
+ | Phone | `phone portrait` | Burger icon appears, menu slides in from left |
148
+
149
+ How it works:
150
+ 1. `.menu-icon` (burger) is `display: none` on desktop, `display: flex` on tablet/phone
151
+ 2. Clicking burger adds `.menu-visible` to the layout wrapper
152
+ 3. `.app-menu-content` slides in: `position: fixed; left: -300px` → `translateX(300px)`
153
+ 4. `.app-menu-overlay` goes from `opacity: 0` to `opacity: 1` with `pointer-events: auto`
154
+ 5. Menu links switch from `flex-direction: row` (desktop) to `flex-direction: column` (mobile)
35
155
 
36
156
  ## Buttons
37
157
 
@@ -77,6 +197,30 @@ Add `.btn-loading` to the button and include a spinner element inside. This is C
77
197
  </button>
78
198
  ```
79
199
 
200
+ ### Button Specificity Warning
201
+
202
+ The `.btn` class sets its own `color` and `background-color` with high specificity. **DO NOT** try to override button colors with OSUI color utilities like `.background-neutral-0` or `.text-primary` — they will be overridden by `.btn` rules and the text will become invisible.
203
+
204
+ **Wrong** (text invisible — white on white):
205
+ ```html
206
+ <button class="btn btn-primary background-neutral-0 text-primary">Open Account</button>
207
+ ```
208
+
209
+ **Right** — use a named class in `theme.css`:
210
+ ```html
211
+ <button class="btn hero-btn-primary">Open Account</button>
212
+ ```
213
+ ```css
214
+ /* theme.css */
215
+ .hero-btn-primary {
216
+ background: var(--bank-gold) !important;
217
+ color: var(--bank-navy) !important;
218
+ border: 2px solid var(--bank-gold) !important;
219
+ }
220
+ ```
221
+
222
+ If you need a button style that doesn't match `.btn-primary`, `.btn-cancel`, `.btn-success`, or `.btn-error`, create a custom class in `theme.css` rather than stacking conflicting utility classes.
223
+
80
224
  ## Borders
81
225
 
82
226
  ### Border Radius
@@ -188,17 +332,18 @@ Most-used palette entries. Load [references/colors.md](references/colors.md) for
188
332
 
189
333
  ## UI Pattern Categories
190
334
 
191
- OutSystems UI includes 87 patterns across 7 categories plus 16 core widgets. Load the appropriate reference file when working with patterns in that category.
335
+ OutSystems UI includes 86 patterns across 8 categories plus 16 core widgets. All verified HTML structures are in **[references/ui-patterns.md](references/ui-patterns.md)** load it when building any UI pattern.
192
336
 
193
- | Category | Count | When to load |
194
- |----------|-------|--------------|
195
- | Adaptive | 12 | Load [references/patterns-adaptive.md](references/patterns-adaptive.md) if the user mentions columns, gallery, grid, responsive, Master-Detail, or multi-column layout |
196
- | Content | 16 | Load [references/patterns-content.md](references/patterns-content.md) if the user mentions Card, Accordion, Alert, Tag, Tooltip, Section, Blank Slate, or content display |
197
- | Interaction | 18 | Load [references/patterns-interaction.md](references/patterns-interaction.md) if the user mentions Carousel, DatePicker, Sidebar, Search, Notification, drag, modal, or interactive elements |
198
- | Navigation | 9 | Load [references/patterns-navigation.md](references/patterns-navigation.md) if the user mentions Breadcrumb, Tabs, Pagination, Wizard, Timeline, or navigation |
199
- | Numbers | 6 | Load [references/patterns-numbers.md](references/patterns-numbers.md) if the user mentions Badge, Counter, Progress Bar, Progress Circle, Rating, or numeric display |
200
- | Utilities | 9 | Load [references/patterns-utilities.md](references/patterns-utilities.md) if the user mentions centering, separator, swipe, touch, Inline SVG, or alignment helpers |
201
- | Widgets | 16 | Load [references/widgets.md](references/widgets.md) if the user mentions form, table, checkbox, dropdown, switch, upload, popup, radio, or input widget |
337
+ | Category | Count | Key patterns |
338
+ |----------|-------|-------------|
339
+ | Adaptive | 12 | Columns 2–6, Columns Medium/Small Left/Right, Gallery, Master Detail, Display On Device |
340
+ | Content | 16 | Card, Card Background, Card Item, Card Sectioned, Accordion, Alert, Tag, Section, Tooltip, User Avatar, Chat Message, Flip Content, Floating Content, List Item Content, Blank Slate, Section Group |
341
+ | Interaction | 18 | Animated Label, Carousel, Date Picker, Dropdown Search, Dropdown Tags, Floating Actions, Input With Icon, Lightbox Image, Notification, Range Slider, Search, Sidebar, Stacked Cards, Video, Action Sheet, Animate, Scrollable Area, Range Slider Interval |
342
+ | Navigation | 9 | Breadcrumbs, Tabs, Pagination, Wizard, Timeline Item, Bottom Bar Item, Section Index, Submenu, Overflow Menu |
343
+ | Numbers | 6 | Badge, Counter, Icon Badge, Progress Bar, Progress Circle, Rating |
344
+ | Utilities | 9 | Align Center, Button Loading, Center Content, Inline SVG, Margin Container, Separator, Mouse Events, Swipe Events, Touch Events |
345
+ | Widgets | 16 | Button, Button Group, Checkbox, Dropdown, Feedback Message, Form, Input, Link, List, Popover, Popup, Radio Group, Switch, Table, TextArea, Upload |
346
+ | Advanced | 1 | DropdownServerSide |
202
347
 
203
348
  For complete screen scaffolds (Dashboard, List/Detail, Form, Login, etc.), load [references/screen-templates.md](references/screen-templates.md).
204
349
 
@@ -215,23 +360,113 @@ Some patterns expose CSS custom properties for fine-tuning. Set these on the pat
215
360
  | Rating | `--rating-size: 16px` |
216
361
  | Scrollable Area | `--scrollable-area-width`, `--scrollable-area-height` |
217
362
 
363
+ ## Theme Customization
364
+
365
+ Every project ships two CSS files: `outsystems-ui.css` (base framework) and `theme.css` (project overrides). The theme file loads second and extends OSUI.
366
+
367
+ ### What theme.css MUST contain
368
+
369
+ 1. **Scroll model fix** — OSUI expects `.active-screen` to be the scroll container:
370
+ ```css
371
+ .active-screen {
372
+ overflow: hidden auto;
373
+ height: 100vh;
374
+ }
375
+ ```
376
+
377
+ 2. **Brand tokens** — override `:root` CSS variables:
378
+ ```css
379
+ :root {
380
+ --color-primary: #1a56db;
381
+ --color-secondary: #0a1628;
382
+ --font-family-base: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
383
+ }
384
+ ```
385
+
386
+ 3. **Custom component classes** — for styles that can't be achieved with OSUI utilities alone (e.g. hero buttons, gradient backgrounds, themed footers). Use **BEM naming** (`block__element--modifier`):
387
+ ```css
388
+ .hero__btn--primary { ... }
389
+ .hero__btn--outline { ... }
390
+ .footer__link--active { ... }
391
+ .stats__number { ... }
392
+ .card__icon--large { ... }
393
+ ```
394
+ BEM keeps custom classes predictable and avoids collisions with OSUI's own class names.
395
+
396
+ ### What theme.css should NOT do
397
+
398
+ - Don't redefine OSUI layout structure (`.layout`, `.main`, `.content`, `.header-content`)
399
+ - Don't add `@media` queries — OSUI handles responsiveness
400
+ - Don't override `.btn` base styles — create new named classes instead
401
+
402
+ ### Common OSUI specificity traps
403
+
404
+ These OSUI classes set background/color with high specificity that utility classes can't override:
405
+
406
+ | Class | Sets | Don't override with |
407
+ |-------|------|--------------------|
408
+ | `.btn` | `color`, `background-color` | `.text-*`, `.background-*` |
409
+ | `.list-item` | `background-color: white` | Needs `background: transparent !important` in dark contexts |
410
+ | `.card` | `background-color: white` | Needs explicit override for dark backgrounds |
411
+ | `.badge` | `background-color`, `color` | Use `!important` or a custom class |
412
+
413
+ ### Icons
414
+
415
+ OSUI does not bundle an icon font. If your screen uses Font Awesome icons (`<i class="fa fa-*">`), you MUST add the CDN link in `<head>`:
416
+
417
+ ```html
418
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
419
+ ```
420
+
421
+ Alternatively, use inline SVGs with the `.icon` class if you want to avoid external dependencies.
422
+
423
+ ### Dark section styling
424
+
425
+ When placing content on a dark background (`.background-primary`, `.background-secondary`, or custom dark sections), remember:
426
+ - Use `.text-neutral-0` for white text (headings, paragraphs)
427
+ - Footer `.list-item` elements have `background: white` by default — override with `background: transparent !important`
428
+ - Links default to the primary color — use custom classes for white/light link colors
429
+ - Border colors may be invisible — use `border-color: rgba(255,255,255,0.1)` overrides
430
+
218
431
  ## Validation
219
432
 
220
433
  After generating a `.visual.html` file, verify:
221
- 1. The root `<div>` has class `layout active-screen`
434
+ 1. The root `<div>` has class `active-screen` wrapping a `.layout` div
222
435
  2. No inline `style=""` attributes exist anywhere in the file
223
- 3. All classes used are from the OSUI cheat sheet — no custom CSS class names
224
- 4. The OSUI stylesheet `<link>` is present in `<head>`
225
- 5. No `@media` queries or custom breakpoints were added
436
+ 3. All classes are either OSUI utilities OR custom classes defined in `theme.css` — no undefined classes
437
+ 4. Both `outsystems-ui.css` and `theme.css` stylesheet `<link>` tags are present in `<head>`
438
+ 5. If Font Awesome icons are used, the FA CDN `<link>` is in `<head>`
439
+ 6. No `@media` queries or custom breakpoints were added
440
+ 7. `.active-screen` scroll model is handled in `theme.css`
226
441
 
227
442
  If any check fails, fix the issue before presenting the output.
228
443
 
444
+ ### Visual testing with the dev server
445
+
446
+ The project includes a Vite dev server. If `npm install` has already been run, start it with:
447
+
448
+ ```
449
+ npm run dev
450
+ ```
451
+
452
+ This serves all `.visual.html` files with hot-reload at `http://localhost:5173/`. Use it to:
453
+ - **Open the page in a browser** and take a screenshot to verify the layout renders correctly
454
+ - **Check for invisible text** — buttons or links with white-on-white or same-color text/background
455
+ - **Confirm scrolling works** — the page should scroll within `.active-screen`
456
+ - **Verify icons render** — Font Awesome icons should not be 0×0 invisible boxes
457
+ - **Inspect computed styles** — confirm utility classes resolve as expected against OSUI
458
+
459
+ Do NOT run `npm install` yourself — only use `npm run dev` if `node_modules` already exists.
460
+
229
461
  ## Gotchas
230
462
 
231
- - `.active-screen` class is **REQUIRED** on the layout wrapper `<div>`. Without it, utility classes and CSS variables will NOT resolve correctly.
463
+ - `.active-screen` is **REQUIRED** as the outermost wrapper. Without it, utility classes and CSS variables will NOT resolve. It also serves as the **scroll container** — OSUI sets `html { overflow: hidden }` so `.active-screen` must have `overflow: hidden auto; height: 100vh` (set this in `theme.css`).
464
+ - **Button + color utilities don't mix** — `.btn` overrides `color` and `background-color` at high specificity. Stacking `.btn .background-neutral-0 .text-primary` will produce invisible text (white on white). Create custom button classes in `theme.css` instead.
465
+ - **`.list-item` has white background** — In dark-background sections (footer, sidebar), list items will show as white rectangles. Override with `background: transparent !important` in `theme.css`.
466
+ - **Font Awesome is not bundled** — If using `<i class="fa fa-exchange">` style icons, add the FA 4.7 CDN link to `<head>` or the icons will be invisible (0×0 size).
232
467
  - OutSystems pattern previews render inside iframes — CSS resolves against the OSUI framework, not browser defaults. Your `.visual.html` must link the OSUI stylesheet.
233
- - **Never mix** inline `style=""` attributes with utility classes. Pick one approach — always prefer utility classes.
468
+ - **Never mix** inline `style=""` attributes with utility classes. Always prefer utility classes.
234
469
  - `.columns*` patterns auto-stack on mobile breakpoints. Do NOT add custom `@media` queries to override this behavior.
235
470
  - Button loading state is purely CSS (`.btn-loading` + spinner element), not a JavaScript toggle.
236
471
  - Use `{{content}}` placeholders in component templates to indicate where nested child widgets go.
237
- - Always test your prototype with the OSUI CSS linked plain browser rendering will look wrong.
472
+ - Always generate BOTH the `.visual.html` AND corresponding `theme.css` styles together. A screen without proper theme styles will look broken.
@@ -0,0 +1,108 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{{screen-name}}</title>
7
+ <link rel="stylesheet" href="../theme/outsystems-ui.css" />
8
+ <link rel="stylesheet" href="../theme/theme.css" />
9
+ </head>
10
+ <body class="desktop">
11
+ <!--
12
+ LayoutBase — Full-width sections, content-first.
13
+ Best for: landing pages, marketing pages, public-facing screens.
14
+ Uses the same header/nav as LayoutTopMenu, but the content area has
15
+ NO ThemeGrid_Container — each section is full-bleed with its own container.
16
+
17
+ Can be mixed with LayoutTopMenu in the same app (e.g. LayoutBase for
18
+ the landing page, LayoutTopMenu for inner pages).
19
+ -->
20
+ <div class="active-screen">
21
+ <div data-block="Layouts.LayoutBase" class="layout layout-blank fixed-header">
22
+ <div class="main">
23
+
24
+ <!-- ═══════════ HEADER (same nav as LayoutTopMenu) ═══════════ -->
25
+ <header role="banner" class="header">
26
+ <div class="header-top ThemeGrid_Container">
27
+ <div class="header-content display-flex">
28
+
29
+ <!-- Burger menu (hidden on desktop, visible on tablet/phone) -->
30
+ <div class="menu-icon" role="button" aria-label="Toggle the Menu" aria-haspopup="true">
31
+ <div class="menu-icon-line" aria-hidden="true"></div>
32
+ <div class="menu-icon-line" aria-hidden="true"></div>
33
+ <div class="menu-icon-line" aria-hidden="true"></div>
34
+ </div>
35
+
36
+ <!-- Top Navigation -->
37
+ <div class="header-navigation">
38
+ <nav class="app-menu-content display-flex" role="navigation">
39
+
40
+ <!-- App Logo & Name (inside nav for proper spacing) -->
41
+ <div class="header-logo">
42
+ <div class="application-name display-flex align-items-center full-height">
43
+ <!-- <img class="app-logo" src="logo.png" alt="" style="height: 32px;" /> -->
44
+ <span class="heading6 text-neutral-8">{{app-name}}</span>
45
+ </div>
46
+ </div>
47
+
48
+ <div class="app-menu-links" role="menubar">
49
+ <a class="active" role="menuitem" href="#">Home</a>
50
+ <a class="ThemeGrid_MarginGutter" role="menuitem" href="#">{{nav-link-2}}</a>
51
+ <a class="ThemeGrid_MarginGutter" role="menuitem" href="#">{{nav-link-3}}</a>
52
+ </div>
53
+ </nav>
54
+ <div class="app-menu-overlay" role="button" aria-label="Close Menu"></div>
55
+ </div>
56
+
57
+ </div>
58
+ </div>
59
+ </header>
60
+
61
+ <!-- ═══════════ CONTENT ═══════════ -->
62
+ <div class="content">
63
+ <div class="main-content" role="main">
64
+ <div class="content-middle">
65
+
66
+ <!--
67
+ LayoutBaseSection — Full-width section block.
68
+ Each section spans the full viewport width.
69
+ Put ThemeGrid_Container INSIDE each section for centered content.
70
+ Use background-* classes on the section for colored bands.
71
+ -->
72
+
73
+ <!-- Hero Section -->
74
+ <div data-block="Layouts.LayoutBaseSection" class="full-width-section padding-y-xxl">
75
+ <div class="ThemeGrid_Container">
76
+ <h1 class="heading1">{{hero-title}}</h1>
77
+ <p class="font-size-base text-neutral-7">{{hero-subtitle}}</p>
78
+ </div>
79
+ </div>
80
+
81
+ <!-- Feature Cards Section -->
82
+ <div data-block="Layouts.LayoutBaseSection" class="full-width-section padding-y-xxl background-neutral-0">
83
+ <div class="ThemeGrid_Container">
84
+ <div class="columns3">
85
+ <div class="column">{{feature-1}}</div>
86
+ <div class="column">{{feature-2}}</div>
87
+ <div class="column">{{feature-3}}</div>
88
+ </div>
89
+ </div>
90
+ </div>
91
+
92
+ <!-- CTA Section -->
93
+ <div data-block="Layouts.LayoutBaseSection" class="full-width-section padding-y-xxl">
94
+ <div class="ThemeGrid_Container">
95
+ <h3>{{cta-title}}</h3>
96
+ <p class="margin-top-base">{{cta-text}}</p>
97
+ </div>
98
+ </div>
99
+
100
+ </div>
101
+ </div>
102
+ </div>
103
+
104
+ </div>
105
+ </div>
106
+ </div>
107
+ </body>
108
+ </html>
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{{screen-name}}</title>
7
+ <link rel="stylesheet" href="../theme/outsystems-ui.css" />
8
+ <link rel="stylesheet" href="../theme/theme.css" />
9
+ </head>
10
+ <body class="desktop">
11
+ <!--
12
+ LayoutBlank — No header, no footer, no navigation.
13
+ Best for: login pages, error pages, splash screens, or any screen
14
+ that needs full control with zero chrome.
15
+
16
+ This is the most minimal OutSystems layout.
17
+ -->
18
+ <div class="active-screen">
19
+ <div data-block="Layouts.LayoutBlank" class="layout blank">
20
+
21
+ <div class="content" role="main">
22
+ <div class="main-content">
23
+ {{content}}
24
+ </div>
25
+ </div>
26
+
27
+ </div>
28
+ </div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,117 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{{screen-name}}</title>
7
+ <link rel="stylesheet" href="../theme/outsystems-ui.css" />
8
+ <link rel="stylesheet" href="../theme/theme.css" />
9
+ </head>
10
+ <body class="desktop">
11
+ <!--
12
+ LayoutSideMenu — Vertical navigation in a left sidebar.
13
+ Best for: backoffice/admin apps with many pages or deep navigation.
14
+
15
+ Structure differs from LayoutTopMenu:
16
+ - <aside> with the menu sits OUTSIDE .main (sibling, before .main)
17
+ - Header inside .main has the burger icon + app title + header-navigation
18
+ - On mobile: body changes to "phone portrait", burger becomes visible,
19
+ sidebar slides in from left via translateX, overlay appears
20
+ -->
21
+ <div class="active-screen">
22
+ <div data-block="Layouts.LayoutSideMenu" class="layout layout-side fixed-header">
23
+
24
+ <!-- ═══════════ SIDEBAR (outside .main) ═══════════ -->
25
+ <aside class="aside-navigation" role="complementary">
26
+ <nav class="app-menu-content display-flex" role="navigation">
27
+ <div class="header-logo">
28
+ <div class="application-name display-flex align-items-center full-height">
29
+ <!-- <img class="app-logo" src="logo.png" alt="" style="height: 32px;" /> -->
30
+ <span class="heading6 text-neutral-8">{{app-name}}</span>
31
+ </div>
32
+ </div>
33
+ <div class="app-menu-links" role="menubar">
34
+ <a class="active" href="#" role="menuitem">Home</a>
35
+ <a class="ThemeGrid_MarginGutter" href="#" role="menuitem">{{nav-link-2}}</a>
36
+ <a class="ThemeGrid_MarginGutter" href="#" role="menuitem">{{nav-link-3}}</a>
37
+ <a class="ThemeGrid_MarginGutter" href="#" role="menuitem">{{nav-link-4}}</a>
38
+ </div>
39
+ <div class="app-login-info">
40
+ <div class="user-info">
41
+ <span>{{user-name}}</span>
42
+ </div>
43
+ </div>
44
+ </nav>
45
+ <div class="app-menu-overlay" role="button"></div>
46
+ </aside>
47
+
48
+ <div class="main">
49
+
50
+ <!-- ═══════════ HEADER ═══════════ -->
51
+ <header role="banner" class="header">
52
+ <div class="header-top ThemeGrid_Container">
53
+ <div class="header-content display-flex">
54
+
55
+ <!-- Menu Toggle (hamburger) — visible on mobile, hidden on desktop -->
56
+ <div class="menu-icon" aria-label="Toggle the Menu" role="button" tabindex="0">
57
+ <div class="menu-icon-line"></div>
58
+ <div class="menu-icon-line"></div>
59
+ <div class="menu-icon-line"></div>
60
+ </div>
61
+
62
+ <!-- App Logo & Name -->
63
+ <div class="application-name display-flex align-items-center full-height">
64
+ <span class="heading6 text-neutral-8">{{app-name}}</span>
65
+ </div>
66
+
67
+ <!-- Header navigation (duplicate menu for desktop top bar + user info) -->
68
+ <div class="header-navigation">
69
+ <nav class="app-menu-content display-flex" role="navigation">
70
+ <div class="app-menu-links" role="menubar">
71
+ <!-- Same links as sidebar — shown in header on desktop -->
72
+ </div>
73
+ <div class="app-login-info">
74
+ <div class="user-info">
75
+ <div class="padding-y-base display-flex align-items-center">
76
+ <span>{{user-name}}</span>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </nav>
81
+ </div>
82
+
83
+ </div>
84
+ </div>
85
+ </header>
86
+
87
+ <!-- ═══════════ CONTENT ═══════════ -->
88
+ <div class="content">
89
+ <div class="main-content ThemeGrid_Container" role="main">
90
+
91
+ <div class="content-breadcrumbs"></div>
92
+
93
+ <div class="content-top display-flex align-items-center">
94
+ <div class="content-top-title heading1">{{page-title}}</div>
95
+ <div class="content-top-actions">
96
+ <!-- Action buttons go here -->
97
+ </div>
98
+ </div>
99
+
100
+ <div class="content-middle">
101
+ {{content}}
102
+ </div>
103
+
104
+ </div>
105
+
106
+ <footer role="contentinfo" class="content-bottom">
107
+ <div class="footer ThemeGrid_Container">
108
+ {{footer}}
109
+ </div>
110
+ </footer>
111
+ </div>
112
+
113
+ </div>
114
+ </div>
115
+ </div>
116
+ </body>
117
+ </html>