Degoog Styling
CSS variables and key classes for your themes and plugin outputs.
CSS variables
The application exposes several CSS custom properties on the
:root element. You can use these in your themes and
plugin styles to ensure your colors automatically adapt to light or
dark modes (using data-theme="light" or
data-theme="dark" on the
<html> tag).
| Variable | Use |
|---|---|
--primary |
Primary accent for links and buttons |
--primary-hover |
Hover state for primary elements |
--primary-rgb |
Primary color as an RGB tuple |
--danger |
Danger or error color |
--warning |
Warning color |
--success |
Success color |
--bg |
Page background |
--bg-light |
Lighter background for cards and inputs |
--bg-hover |
Hover background |
--border |
Border color |
--border-light |
Lighter border |
--text-primary |
Main text color |
--text-secondary |
Secondary or muted text |
--text-link |
Link color |
--text-link-visited |
Visited link color |
--text-cite |
Citation or URL text |
--text-snippet |
Snippet or description text |
--search-bar-bg |
Search bar background |
--search-bar-bg-hover |
Search bar hover state |
--btn-bg |
Button background |
--btn-text |
Button text color |
--overlay-bg |
Overlay background for modals |
--white |
Pure white |
Example theme or plugin CSS
.my-panel {
background: var(--bg-light);
color: var(--text-primary);
border: 1px solid var(--border);
}
.my-panel a {
color: var(--text-link);
}
Reusable classes
Try to reuse these built in classes in your plugin or theme HTML and CSS. This makes sure your output matches the main UI and benefits from the exact same layout structure. It is always better to use these instead of inventing new classes when the meaning fits perfectly.
Generic UI classes (degoog-*)
The main UI is moving toward a small set of generic degoog-*
classes. Templates often keep the older specific classes for
backwards compatibility, but the styling should be driven by these
generic classes and their modifiers.
Modifiers follow a BEM-like pattern:
.degoog-thing + .degoog-thing--variant.
| Class | Use |
|---|---|
.degoog-panel |
Card/panel wrapper (background, border, shadow) |
.degoog-panel--accordion |
Accordion wrapper panel (no default padding) |
.degoog-panel--slot |
Slot panel wrapper (grid sizing, no default padding) |
.degoog-panel--slot-title |
Slot panel title block |
.degoog-panel--slot-body |
Slot panel body typography (no padding by default) |
.degoog-panel--slot-body-padded |
Slot body padding when the content needs it |
.degoog-search-bar |
Search bar shell (icon + input) |
.degoog-search-bar--square |
Less-rounded search bar variant |
.degoog-dropdown |
Floating dropdown container |
.degoog-dropdown--menu |
Menu sizing for dropdowns |
.degoog-dropdown--submenu |
Submenu sizing for dropdowns |
.degoog-accordion |
Accordion wrapper - adds .open toggle behaviour and chevron rotation |
.degoog-accordion-body |
Hidden accordion body, shown when parent has .open |
.degoog-accordion-body--flex |
Flex variant of the accordion body (for when display: flex is needed on open) |
.degoog-accordion-toggle |
Accordion trigger button |
.degoog-tab |
Tab button (active state, hover) |
.degoog-menu-item |
Button-like list item (hover/focus) |
.degoog-menu-item--option |
Option rows (active checkmark) |
.degoog-input |
Text input styling |
.degoog-input--tools |
Tools dropdown input variant |
.degoog-badge |
Small badge/pill |
.degoog-icon-btn |
Icon-only button |
.degoog-drag-handle |
Grab handle for drag-to-reorder lists (see helper below) |
.degoog-dragging |
Added by the helper to the item being dragged |
.degoog-drag-active |
Added by the helper to the list while a drag is in progress |
Note: the app still contains older, more specific classnames (for example
.result-*, .glance-*, .btn*) and they may
still have styling while the transition is ongoing. They are not considered
a stable styling API for themes/plugins. Prefer the degoog-* classes
and modifiers above.
Theme template migration (append-only)
Theme templates can keep their legacy classes and append the generic
degoog-* classes (and modifiers) so they pick up the built-in UI
styling without breaking older selectors.
DRY_RUN=1 bash scripts/theme-append-degoog-classes.sh data/themes/MyTheme
bash scripts/theme-append-degoog-classes.sh data/themes/MyTheme
Forms and extension settings
If you are rendering settings forms in your plugin UI, these classes will align them perfectly with the standard Settings modals.
| Class | Use |
|---|---|
.degoog-input |
Text inputs and textareas |
.degoog-select-wrap |
Select wrappers (adds chevron) |
.degoog-toggle-wrap |
Toggle rows |
.degoog-toggle |
Toggle slider (pill) |
.degoog-checkbox-wrap |
Checkbox rows, for dense multi-option lists (see below) |
.degoog-checkbox |
Checkbox square |
.degoog-panel |
Panels/cards used across settings and modals |
Layout and chrome
Use the degoog-* classes above for UI elements you want
to look consistent with the built-in theme.
Grid-System
A lightweight, CSS-Grid-based 12-column layout system used to build for example widgets (translate boxes, knowledge panels, "at a glance" cards, etc.) in the degoog.
1. Core Concept
The container gets degoog-grid; its direct children are placed across the 12
columns
via col-* classes.
<section class="degoog-grid">
<div class="col-8">Search results</div>
<div class="col-4">Knowledge panel</div>
</section>
Rules:
col-*classes work only on direct children of.degoog-grid.- Columns per row should add up to 12; exceeding it wraps to the next row.
- Default gaps:
.75remhorizontal and vertical.
2. Column Widths (col-1–col-12)
Each column spans N of the 12 tracks (grid-column: span N).
<!-- Result list beside a side panel -->
<section class="degoog-grid">
<div class="col-8">Result list</div>
<div class="col-4">Wikipedia summary</div>
</section>
<!-- Full-width widget (e.g. translate box on top) -->
<section class="degoog-grid">
<div class="col-12">Translate widget</div>
</section>
Auto-wrapping when totals exceed 12:
<section class="degoog-grid">
<div class="col-8">Map widget</div>
<div class="col-8">Wraps to next row (8 + 8 > 12)</div>
</section>
3. Responsive Behavior
Mobile-first breakpoints; a larger breakpoint overrides smaller ones.
| Prefix | From | Target |
|---|---|---|
col-* |
0px |
Mobile |
col-sm-* |
≥ 480px |
Large phones |
col-md-* |
≥ 780px |
Tablets |
col-lg-* |
≥ 1024px |
Desktop |
Stack classes to change width per breakpoint:
<!-- Side panel sits below results on mobile, beside them on desktop -->
<section class="degoog-grid">
<main class="col-12 col-lg-8">Search results</main>
<aside class="col-12 col-lg-4">Knowledge panel</aside>
</section>
Widget grid that reflows from 1 → 2 → 4 per row:
<section class="degoog-grid">
<div class="col-12 col-sm-6 col-lg-3">Weather</div>
<div class="col-12 col-sm-6 col-lg-3">Currency</div>
<div class="col-12 col-sm-6 col-lg-3">Time zone</div>
<div class="col-12 col-sm-6 col-lg-3">Calculator</div>
</section>
4. Visibility (hidden / show)
Toggle rendering per breakpoint via display.
| Class | Effect |
|---|---|
col-hidden |
display: none |
col-show |
display: block |
col-md-hidden |
Hidden from ≥ 780px |
col-lg-show |
Shown from ≥ 1024px |
<section class="degoog-grid">
<!-- Knowledge panel: hidden on mobile, shown from desktop -->
<main class="col-12 col-lg-8">Results</main>
<aside class="col-hidden col-lg-show col-lg-4">Knowledge panel</aside>
</section>
col-showresets todisplay: block— use it to re-enable an element hidden at a smaller breakpoint.
5. Horizontal Alignment (left / center / right)
Aligns content inside its cell (justify-self) when it's narrower than the column. Responsive
variants
exist (col-md-right, etc.).
| Class | Alignment |
|---|---|
col-left |
start |
col-center |
center |
col-right |
end |
<!-- Translate widget: "swap languages" button centered, action right -->
<section class="degoog-grid">
<div class="col-6 col-center">↔ Swap languages</div>
<div class="col-6 col-right">Listen 🔊</div>
</section>
6. Container Modifiers
degoog-grid--no-gap — removes all gaps
<!-- Seamless image-result strip -->
<section class="degoog-grid degoog-grid--no-gap">
<div class="col-3"><img src="1.jpg" alt=""></div>
<div class="col-3"><img src="2.jpg" alt=""></div>
<div class="col-3"><img src="3.jpg" alt=""></div>
<div class="col-3"><img src="4.jpg" alt=""></div>
</section>
degoog-grid--vertical-align-center — vertically centers columns
<!-- Knowledge panel: thumbnail centered against its text -->
<section class="degoog-grid degoog-grid--vertical-align-center">
<div class="col-4"><img src="thumb.jpg" alt=""></div>
<div class="col-8">Wikipedia summary text</div>
</section>
7. Complete Example: Search Results Page
<section class="degoog-grid degoog-grid--vertical-align-center">
<!-- Translate widget on top, full width -->
<div class="col-12">Translate: "hola" → "hello"</div>
<!-- Results column + knowledge panel -->
<main class="col-12 col-lg-8">Search result list</main>
<aside class="col-hidden col-lg-show col-lg-4">Knowledge panel</aside>
<!-- "At a glance" mini-widgets: 1 → 2 → 4 per row -->
<div class="col-12 col-sm-6 col-lg-3">Weather</div>
<div class="col-12 col-sm-6 col-lg-3">Currency</div>
<div class="col-12 col-sm-6 col-lg-3">Sports score</div>
<div class="col-12 col-sm-6 col-lg-3">Stock price</div>
</section>
8. Best Practices & Gotchas
- Always set a base
col-*(e.g.col-12) so mobile behavior is explicit. - Keep rows summing to 12 for predictable layouts; intentional overflow wraps.
- Direct children only — nest a new
.degoog-gridfor sub-grids inside a widget. col-showneeds a priorhiddento act as a reveal toggle.- Alignment helpers only matter when content is narrower than its column.
9. Quick Reference
| Category | Base | sm (≥480) | md (≥780) | lg (≥1024) |
|---|---|---|---|---|
| Width | col-1…12 |
col-sm-1…12 |
col-md-1…12 |
col-lg-1…12 |
| Hide | col-hidden |
col-sm-hidden |
col-md-hidden |
col-lg-hidden |
| Show | col-show |
col-sm-show |
col-md-show |
col-lg-show |
| Align left | col-left |
col-sm-left |
col-md-left |
col-lg-left |
| Align center | col-center |
col-sm-center |
col-md-center |
col-lg-center |
| Align right | col-right |
col-sm-right |
col-md-right |
col-lg-right |
Container modifiers: degoog-grid--no-gap,
degoog-grid--vertical-align-center
Drag-to-reorder helper
The app exposes a small, dependency-free drag-to-reorder helper on
window.__degoogDrag. It is the same helper used by the
built-in plugins list and the tab-order dialog, so your lists get the
exact same feel (finger-following on touch, smooth slide animations,
no text selection while dragging). It works on desktop and mobile
because it is built on Pointer Events.
You provide a list element, a selector for the items inside it, a
selector for the grab handle, and an onReorder callback.
The helper reorders the DOM live; when the user drops an item it calls
onReorder with the list and the moved item so you can
persist the new order.
| Option | Use |
|---|---|
itemSelector |
Selector matching each reorderable child of the list |
handleSelector |
Selector for the grab handle inside each item (drag only starts from here) |
onReorder(list, item) |
Called after a drop; DOM order is already final. Read it and persist. |
Give your handle the degoog-drag-handle class so it picks
up the standard grip styling (and the touch-action needed
for reliable mobile dragging). The helper adds
degoog-dragging to the active item and
degoog-drag-active to the list while dragging.
<ul id="my-list">
<li class="my-row" data-id="a">
Item A
<span class="degoog-drag-handle" data-drag-handle>
<i class="fa-solid fa-grip-vertical"></i>
</span>
</li>
<!-- more rows... -->
</ul>
<script>
const list = document.getElementById("my-list");
window.__degoogDrag.init(list, {
itemSelector: ".my-row",
handleSelector: "[data-drag-handle]",
onReorder: (el) => {
const order = Array.from(el.querySelectorAll(".my-row"))
.map((row) => row.dataset.id);
// persist `order` however your plugin stores it
},
});
</script>
Note: window.__degoogDrag is available on the main search
page (where plugin and theme scripts run). Call
init once per list after it is in the DOM.