Legacy Frontend HTML Patterns (Deprecated)
Note: This guide documents legacy HTML and CSS hooks still used in older ERB and Redmine-style views. For new UI, prefer the Design System and its documented Vue.js and Rails usage in Frontend Design System.
Scope
This page is not a source of new frontend standards. It exists to document legacy patterns that still appear in server-rendered views and older Easy8 screens.
Use these patterns when you are:
- maintaining an existing ERB screen,
- extending a page that already relies on legacy Easy styles,
- fixing markup that depends on existing CSS hooks.
Page Zones
Top Menu
The legacy application shell splits the top area into:
- main menu,
- search area,
- user menu,
- "More" menu.
Service Bar
The service bar holds widgets that must stay quickly accessible. Legacy widgets usually render a body with content and actions:
<div id="easy_servicebar_component_body">
<div>Header comes here ...</div>
<div class="servicebar-content">Content comes here ...</div>
<div class="servicebar-actions">
<a class="icon icon-add button-positive" href="#">Add item</a>
</div>
</div>
Sidebar
Legacy page layouts use three main Rails content slots:
- Primary actions:
- Service box:
- Remaining sidebar content:
Legacy Forms
When you must build a legacy Rails form, prefer existing form builders over hand-written markup where possible.
EasyLabeledFormBuilderis still useful on legacy pages.- For new Design System-backed forms, prefer
easy_form_fororeasy_form_tagas described in Frontend Design System.
User Inputs
Legacy Easy styles apply default styling to <input>, <textarea>, and <select>.
- Inputs usually expand to available width.
sizecan override default width behavior.class="inline"keeps a select compact.class="block"forces full-width block behavior.
Checkboxes and Radios
Place checkbox and radio inputs inside their labels and use the matching legacy classes:
<label class="checkbox">
<input type="checkbox" />
I am a checkbox
</label>
<label class="radio">
<input type="radio" />
I am a radio
</label>
Tabular Layout
Legacy forms often use .tabular, inherited from Redmine. Labels are rendered to the left of the field and each row is typically wrapped in a separate paragraph.
<form class="tabular">
<p>
<label>Label</label>
<input type="text" />
</p>
<p>
<label>Label</label>
<input type="text" />
</p>
</form>
For grouped radios or checkboxes, keep the field label separate from individual option labels:
<form class="tabular">
<p class="cols-2">
<label class="radio">Label</label>
<label class="radio">
<input type="radio" />
Option A
</label>
<label class="radio">
<input type="radio" />
Option B
</label>
</p>
</form>
cols-X can be used to distribute grouped options into columns, where X is usually in the 1..6 range.
Help Block
Legacy field help is typically rendered as:
Form Actions
Visible legacy forms are often wrapped with class="form-box". Action bars usually use form-actions and buttons.
<form class="form-box">
... form content ...
<p class="form-actions buttons">
<a class="button-positive" href="#">Submit</a>
<a class="button" href="#">Cancel</a>
</p>
</form>
Legacy Grid
Legacy layouts frequently use the Redmine-based splitcontent grid.
Basic two-column layout:
<div class="splitcontent">
<div class="splitcontentleft"></div>
<div class="splitcontentright"></div>
</div>
Uneven columns use size-* classes whose total width should not exceed 10:
<div class="splitcontent">
<div class="splitcontentleft size-7"></div>
<div class="splitcontentright size-3"></div>
</div>
Responsive variants such as size-s-*, size-l-*, and size-xl-* also exist, but keep in mind that they are part of the legacy Easy styling layer and do not map to Redmine defaults.
Other Legacy UI Patterns
Tables
Entity lists usually use the legacy list table class:
Wrap wide tables in autoscroll when horizontal scrolling is expected:
Buttons
Legacy button intent is expressed with classes:
button- default action,button-positive- primary positive action,button-important- destructive or high-attention action.
Size modifiers:
button-large,- default button size,
button-mini.
Try to keep a page focused. Usually one main primary action is enough.
Modules
Legacy content boxes often use the module box structure:
<div class="module box">
<div class="module-heading">
<h3>Heading</h3>
<div class="module-heading-links">... some actions ...</div>
</div>
<div class="module-content">... module content ...</div>
</div>
Prefer existing helper APIs when available, for example:
Tabs
Legacy tab markup:
<div class="tabs">
<ul>
<li><a href="/path-1">Tab 1</a></li>
<li><a href="/path-2">Tab 2</a></li>
</ul>
</div>
Tags
Use tags on a parent container holding links:
Alerts / Flashes
Legacy notices build on Redmine flash markup:
<div class="flash notice">Notice ...</div>
<div class="flash warning">Warning ...</div>
<div class="flash error">Error ...</div>
Icons
Legacy icons are usually attached by adding class="icon icon-XXX" to an element.