Thank you for your interest in contributing to OutSystems UI, a framework providing UI patterns and screen templates for Reactive Web and Native Mobile applications.
- Node.js v12.0 or higher
- Visual Studio Code (recommended)
- Prettier - Code formatter (
esbenp.prettier-vscode) - ESLint (
dbaeumer.vscode-eslint) - Stylelint (
stylelint.vscode-stylelint) - Document This (
oouo-diogo-perdigao.docthis)
- Fork this repository
- Clone your fork locally
- Install dependencies and start development:
npm run setupThis command installs all dependencies and starts the development server.
src/
├── scripts/ TypeScript source code
│ ├── OSFramework/ Internal framework (not invoked directly)
│ │ ├── Behaviors/ Pattern behavior classes
│ │ ├── Event/ Event management
│ │ ├── Helper/ Utility classes
│ │ ├── Interface/ Generic interfaces
│ │ └── Pattern/ UI patterns (Accordion, Carousel, etc.)
│ ├── OutSystems/ Public APIs
│ │ └── OSUI/ OutSystems UI public APIs
│ └── Providers/ Third-party library integrations
│ ├── Carousel/ Splide provider
│ ├── DatePicker/ Flatpickr provider
│ └── ...
└── scss/ SCSS styles (non-pattern specific)
See src/README.md for detailed structure documentation.
- Base branch:
dev(main development branch) - Create feature branches from
dev - Branch naming: Use JIRA ticket IDs (e.g.,
ROU-12619) - Keep your branch updated with
dev
Start the development server with live reload:
npm run dev -- --target <platform>Where <platform> is optional. If not provided, builds for all platforms. The development server runs at http://localhost:3000.
The project uses Gulp for build orchestration:
- TypeScript files from
src/scripts/compile to JavaScript (AMD modules) - SCSS files from
src/scss/compile to CSS - Output written to the
dist/directory
| Command | Description |
|---|---|
npm run build |
Production build for all platforms, includes linting and formatting |
npm run dev |
Start development server with file watching |
npm run lint |
Run ESLint to check for code style issues |
npm run lintfix |
Automatically fix ESLint issues |
npm run prettier |
Format all code with Prettier |
npm run docs |
Generate TypeDoc documentation |
Before submitting your changes:
- Build succeeds without errors:
npm run build - No linting warnings or errors:
npm run lint - Code is properly documented with JSDoc comments
- All changes are tested locally
OutSystems UI has a separate automated testing repository:
- Repository: outsystems-ui-tests (private)
- Framework: WebDriverIO with Cucumber for BDD-style scenarios
- Visual Testing: Applitools for visual regression (screenshot comparison)
- Functional tests (
tests/functional-tests/) - Non-visual component behavior - Visual tests (
tests/visual-tests/) - Screenshot-based visual regression
Tests verify component behavior across platforms (O11/ODC) and catch unintended UI regressions.
npm run web-tests -- --environment=<dev|qa> --viewport=<Phone|Tablet|Desktop> --browsers=<chrome|firefox|edge|safari>Tests can target specific branches: --branch=ROU1234
For test setup and configuration: UI End2End Testing Documentation
Note: Visual tests require APPLITOOLS_API_KEY environment variable.
Naming:
- Classes:
StrictPascalCase - Interfaces:
IPascalCaseorUPPER_CASEwithIprefix - Exported functions:
StrictPascalCase - Private class properties:
_strictCamelCase(leading underscore required) - Public/protected properties:
strictCamelCase(no underscore) - Private methods:
_strictCamelCase(leading underscore required) - Public/protected methods:
strictCamelCase(no underscore)
Class member ordering:
- Private fields
- Protected fields
- Public fields
- Constructor
- Private methods
- Protected methods
- Public methods
Within each category, members are ordered alphabetically.
Documentation:
- All public APIs must be documented with JSDoc comments
- Use the "Document This" VS Code extension for starter templates (type
/**above a function/class) - Include
@param,@returns, and@descriptiontags
Configuration:
TypeScript settings in tsconfig.json:
- Target: ES2017
- Module: AMD
- Strict mode enabled
- Indent: Tabs (width: 4)
- Line length: 120 characters maximum
- Semicolons: Required
- Quotes: Single quotes
- Trailing commas: ES5 style
- End of line: Auto (LF recommended)
Run npm run prettier to automatically format your code.
- Properties must be in alphabetical order
- Declaration order: variables → at-rules → declarations → rules → custom properties
- Line length: 170 characters maximum
- Stylelint enforces these rules (see
.stylelintrc.json)
PR titles must follow this convention:
<TICKET-ID> <description>
Example: ROU-12619 Fix carousel icon alignment
<TICKET-ID>: JIRA issue identifier (e.g.,ROU-1234)- Branches named
release/*ormerge/*are exempt from this requirement
Every PR must have at least one of these labels:
feature- New featuresbug/bugfix- Bug fixeschore- Maintenance tasksdependencies/dependency- Dependency updates
Do not use: do not merge label (blocks PR from merging)
| Labels | SemVer Impact |
|---|---|
breaking, major |
Major version (X+1.0.0) |
feat, feature, minor |
Minor version (0.X+1.0) |
revert, perf, test, refactor, fix, bugfix, patch, chore |
Patch version (0.0.X+1) |
ci, none, docs, style, skip |
No version change |
When creating a PR, fill out the provided template:
- Sample page: Link to a working demo showing the fix or new feature
- What was happening: Describe the issue or motivation
- What was done: Explain your changes
- Test steps: Provide step-by-step testing instructions
- Screenshots: Include visual evidence (animated GIFs preferred)
- Checklist:
- Tested locally
- Documented the code
- No ESLint warnings/errors
- Indicate if OutSystems module changes are required
- PRs require approval from 2 team members (repository owners)
- All PR checks must pass (title validation, label validation, build)
Releases are managed through GitHub Actions workflows:
pre-release.yaml: Creates release candidates (manual trigger, requires version and release date)release.yaml: Publishes releases (manual trigger)
Version numbers follow semantic versioning based on PR labels (see table above).
- Trusted Committers: UI Components team on support rotation
- Internal Slack:
#rd-uicomponents-contributors(business days 2PM-3PM PT)
- OutSystems UI Website
- OutSystems UI Documentation
- TypeDoc Generated Docs
- Forge component - O11:
- Forge component - ODC:
- NPM Package
This repository belongs to OutSystems and all rights are reserved. See LICENSE for details.