diff --git a/README.md b/README.md
index d9db939..2033438 100644
--- a/README.md
+++ b/README.md
@@ -17,58 +17,146 @@
-A library for resizable & repositionable panel layouts, using
-[CSS `grid`](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Grid_layout).
+A library for resizable & repositionable panel layouts.
- Zero depedencies, pure TypeScript, tiny.
- Implemented as a [Web Component](https://developer.mozilla.org/en-US/docs/Web/API/Web_components),
- interoperable with any framework and fully customizable.
+ interoperable with any framework.
+- Zero DOM mutation at runtime, implemented entirely by generating using
+[CSS `grid`](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Grid_layout) rules.
+- Supports arbitrary theming via CSS [variables](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Cascading_variables/Using_custom_properties) and [`::part`](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/::part).
+- Supports async-aware container rendering for smooth animations even when rendering ovvurs over an event loop boundary.
- Covered in bees.
+## Demo
+
+
+
## Installation
```bash
npm install regular-layout
```
-## Usage
+## Quick Start
-Add the `` custom element to your HTML:
+Import the library and add `` to your HTML. Children are
+matched to layout slots by their `name` attribute.
```html
+
+
Main content
Sidebar content
```
-Create and manipulate layouts programmatically:
+For draggable, tabbed panels, use ``:
+
+```html
+
+
+ Main content
+
+
+ Sidebar content
+
+
+```
+
+Panels must be added and remove programmatically (e.g they are not
+auto-registered):
```javascript
-import "regular-layout/dist/index.js";
+const layout = document.querySelector("regular-layout");
-const layout = document.querySelector('regular-layout');
+// This adds the panel definition to the layout (and makes it visible via CSS),
+// but does not mutat the DOM.
+layout.insertPanel("main");
+layout.insertPanel("sidebar");
-// Add panels
-layout.insertPanel('main');
-layout.insertPanel('sidebar');
+// This removes the panel from the layout (and hides it via CSS) but does not
+// mutate the DOM.
+layout.removePanel("sidebar");
+```
-// Save layout state
+## Save/Restore
+
+Layout state serializes to a JSON tree of splits and tabs, which can be
+persisted and restored:
+
+```javascript
const state = layout.save();
+localStorage.setItem("layout", JSON.stringify(state));
+
+// Later...
+layout.restore(JSON.parse(localStorage.getItem("layout")));
+```
-// Remove panels (this does not change the DOM, the element is unslotted).
-layout.removePanel('sidebar');
+`restore()` dispatches a cancelable `regular-layout-before-resize` event before
+applying the new state. Call `preventDefault()` to suspend the update, then
+`layout.resumeResize()` when ready:
-// Restore saved state
-layout.restore(state);
+```javascript
+layout.addEventListener("regular-layout-before-resize", (event) => {
+ event.preventDefault();
+ // ... prepare for resize ...
+ layout.resumeResize();
+});
```
-Create repositionable panels using ``:
+The `restore()` API can also be used as an alternative to
+`insertPanel`/`removePanel` for initializing a ``.
+
+## Theming
+
+Themes are plain CSS files that style the layout and its `::part()` selectors,
+scoped by a class on ``. Apply a theme by adding its stylesheet
+and setting the class:
```html
-
-
- Main content
-
+
+
+
+ ...
-```
\ No newline at end of file
+```
+
+`` exposes these CSS parts:
+
+| Part | Description |
+|------|-------------|
+| `titlebar` | Tab bar container |
+| `tab` | Individual tab |
+| `active-tab` | Currently selected tab |
+| `close` | Close button |
+| `active-close` | Close button on the active tab |
+| `container` | Content area |
+
+```css
+regular-layout.mytheme regular-layout-frame::part(titlebar) {
+ background: #333;
+}
+
+regular-layout.mytheme regular-layout-frame::part(active-tab) {
+ background: #fff;
+ color: #000;
+}
+```
+
+See [the example `themes/`](./themes) directory for examples of how to write a
+complete theme for `` and `regular-layout-frame>`.
+
+## Events
+
+| Event | Detail | Cancelable | Description |
+|-------|--------|------------|-------------|
+| `regular-layout-before-resize` | `{ calculatePresizePaths() }` | Yes | Fired before any layout change. Cancel to suspend until `resumeResize()`. |
+| `regular-layout-update` | `Layout` | No | Fired after layout state is updated. |
+
+```javascript
+layout.addEventListener("regular-layout-update", (event) => {
+ console.log("New layout:", event.detail);
+});
+```
diff --git a/examples/PREVIEW.png b/examples/PREVIEW.png
new file mode 100644
index 0000000..46af340
Binary files /dev/null and b/examples/PREVIEW.png differ
diff --git a/examples/index.html b/examples/index.html
index d4211bc..4152813 100644
--- a/examples/index.html
+++ b/examples/index.html
@@ -11,6 +11,7 @@
+
@@ -25,17 +26,18 @@
Chicago
Fluxbox
Hot Dog
+ Borland
-
-
-
-
-
-
-
-
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra.
+ Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.
+ Maecenas faucibus mollis interdum. Donec sed odio dui. Cras justo odio, dapibus ut facilisis in, egestas eget quam.
+ Vestibulum id ligula porta felis euismod semper. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis.
diff --git a/examples/index.ts b/examples/index.ts
index 768f503..bdef613 100644
--- a/examples/index.ts
+++ b/examples/index.ts
@@ -38,6 +38,12 @@ add.addEventListener("click", () => {
layout.insertPanel(name, []);
});
+const urlTheme = new URLSearchParams(window.location.search).get("theme");
+if (urlTheme) {
+ themes.value = urlTheme;
+ layout.className = urlTheme;
+}
+
themes.addEventListener("change", (_event) => {
layout.className = themes.value;
});
diff --git a/src/core/constants.ts b/src/core/constants.ts
index 92f7634..70777c3 100644
--- a/src/core/constants.ts
+++ b/src/core/constants.ts
@@ -110,8 +110,8 @@ export const DEFAULT_PHYSICS: Physics = Object.freeze({
SHOULD_ROUND: false,
OVERLAY_CLASSNAME: "overlay",
MINIMUM_REDISTRIBUTION_SIZE_THRESHOLD: 0.15,
- SPLIT_EDGE_TOLERANCE: 0.25,
- SPLIT_ROOT_EDGE_TOLERANCE: 0.01,
+ SPLIT_EDGE_TOLERANCE: 0.33,
+ SPLIT_ROOT_EDGE_TOLERANCE: 0.03,
GRID_TRACK_COLLAPSE_TOLERANCE: 0.001,
OVERLAY_DEFAULT: "absolute",
GRID_DIVIDER_SIZE: 6,
diff --git a/src/core/types.ts b/src/core/types.ts
index b053445..2043e6a 100644
--- a/src/core/types.ts
+++ b/src/core/types.ts
@@ -96,7 +96,7 @@ export interface LayoutPath {
}
/**
- * The detail payload of the `regular-layout-resize-before` event.
+ * The detail payload of the `regular-layout-before-resize` event.
*/
export interface PresizeDetail {
calculatePresizePaths(): Record;
diff --git a/src/extensions.ts b/src/extensions.ts
index ba7532b..cdc1729 100644
--- a/src/extensions.ts
+++ b/src/extensions.ts
@@ -60,7 +60,7 @@ declare global {
): void;
addEventListener(
- name: "regular-layout-resize-before",
+ name: "regular-layout-before-resize",
cb: (e: RegularLayoutPresizeEvent) => void,
options?: { signal: AbortSignal },
): void;
@@ -76,7 +76,7 @@ declare global {
): void;
removeEventListener(
- name: "regular-layout-resize-before",
+ name: "regular-layout-before-resize",
cb: (e: RegularLayoutPresizeEvent) => void,
): void;
}
diff --git a/src/regular-layout-frame.ts b/src/regular-layout-frame.ts
index e99a9b6..b3e8f5c 100644
--- a/src/regular-layout-frame.ts
+++ b/src/regular-layout-frame.ts
@@ -26,7 +26,7 @@ const CSS = `
const HTML_TEMPLATE = `
-
+
`;
type DragState = { moved?: boolean; path: LayoutPath };
diff --git a/src/regular-layout.ts b/src/regular-layout.ts
index fe95a87..9edc94b 100644
--- a/src/regular-layout.ts
+++ b/src/regular-layout.ts
@@ -128,7 +128,7 @@ export class RegularLayout extends HTMLElement {
this._stylesheet = new CSSStyleSheet();
this._cursor_stylesheet = new CSSStyleSheet();
this._cursor_override = false;
- const event_name = `${this._physics.CUSTOM_EVENT_NAME_PREFIX}-resize-before`;
+ const event_name = `${this._physics.CUSTOM_EVENT_NAME_PREFIX}-before-resize`;
this._presizeQueue = new PresizeQueue(this, event_name);
this._overlayController = new OverlayController(this.create_overlay_host());
this._shadowRoot.adoptedStyleSheets = [
@@ -288,7 +288,7 @@ export class RegularLayout extends HTMLElement {
/**
* Restores the layout from a saved state synchronously, without
- * dispatching the `regular-layout-resize-before` event.
+ * dispatching the `regular-layout-before-resize` event.
*
* @param layout - The layout tree to restore
*/
@@ -304,7 +304,7 @@ export class RegularLayout extends HTMLElement {
/**
* Restores the layout from a saved state.
*
- * Before applying, dispatches a cancelable `regular-layout-resize-before`
+ * Before applying, dispatches a cancelable `regular-layout-before-resize`
* event. If the event is cancelled via `preventDefault()`, the layout
* update is suspended until {@link resumeResize} is called.
*
@@ -333,7 +333,7 @@ export class RegularLayout extends HTMLElement {
/**
* Resumes a layout update that was suspended by cancelling the
- * `regular-layout-resize-before` event.
+ * `regular-layout-before-resize` event.
*/
resumeResize = () => {
this._presizeQueue.resume();
diff --git a/tests/integration/resize-before.spec.ts b/tests/integration/resize-before.spec.ts
index c0f2f25..e9d5691 100644
--- a/tests/integration/resize-before.spec.ts
+++ b/tests/integration/resize-before.spec.ts
@@ -13,14 +13,14 @@ import { expect, test } from "../helpers/coverage.ts";
import { setupLayout, saveLayout, dragMouse } from "../helpers/integration.ts";
import { LAYOUTS } from "../helpers/fixtures.ts";
-test("should fire regular-layout-resize-before on restore", async ({
+test("should fire regular-layout-before-resize on restore", async ({
page,
}) => {
await setupLayout(page, LAYOUTS.SINGLE_AAA);
const fired = await page.evaluate(async () => {
const layout = document.querySelector("regular-layout");
let eventFired = false;
- layout?.addEventListener("regular-layout-resize-before", () => {
+ layout?.addEventListener("regular-layout-before-resize", () => {
eventFired = true;
});
await layout?.restore({
@@ -42,7 +42,7 @@ test("should provide calculatePresizePaths in event detail", async ({
value: null,
};
- layout?.addEventListener("regular-layout-resize-before", (e) => {
+ layout?.addEventListener("regular-layout-before-resize", (e) => {
presizePaths.value = (
e as CustomEvent
).detail.calculatePresizePaths() as Record;
@@ -80,7 +80,7 @@ test("should suspend resize when preventDefault is called", async ({
await setupLayout(page, LAYOUTS.SINGLE_AAA);
const result = await page.evaluate(async () => {
const layout = document.querySelector("regular-layout");
- layout?.addEventListener("regular-layout-resize-before", (e) => {
+ layout?.addEventListener("regular-layout-before-resize", (e) => {
e.preventDefault();
});
@@ -113,7 +113,7 @@ test("should resume suspended resize when resumeResize is called", async ({
await setupLayout(page, LAYOUTS.SINGLE_AAA);
const result = await page.evaluate(async () => {
const layout = document.querySelector("regular-layout");
- layout?.addEventListener("regular-layout-resize-before", (e) => {
+ layout?.addEventListener("regular-layout-before-resize", (e) => {
e.preventDefault();
});
@@ -144,7 +144,7 @@ test("should proceed immediately when event is not cancelled", async ({
const tabs = await page.evaluate(async () => {
const layout = document.querySelector("regular-layout");
let eventCount = 0;
- layout?.addEventListener("regular-layout-resize-before", () => {
+ layout?.addEventListener("regular-layout-before-resize", () => {
eventCount++;
});
await layout?.restore({
@@ -167,7 +167,7 @@ test("should fire resize-before on drag resize", async ({ page }) => {
await page.evaluate(() => {
const layout = document.querySelector("regular-layout");
(window as unknown as Record).__resizeBeforeCount = 0;
- layout?.addEventListener("regular-layout-resize-before", () => {
+ layout?.addEventListener("regular-layout-before-resize", () => {
(window as unknown as Record).__resizeBeforeCount++;
});
});
@@ -196,7 +196,7 @@ test("should queue concurrent resizes and process sequentially", async ({
let callCount = 0;
let cancelFirst = true;
- layout?.addEventListener("regular-layout-resize-before", (e) => {
+ layout?.addEventListener("regular-layout-before-resize", (e) => {
callCount++;
events.push(`before-${callCount}`);
if (cancelFirst) {
@@ -243,7 +243,7 @@ test("should provide pre-resize panel paths for nested layout", async ({
const paths = await page.evaluate(async () => {
const layout = document.querySelector("regular-layout");
let presizePaths: Record> | null = null;
- layout?.addEventListener("regular-layout-resize-before", (e) => {
+ layout?.addEventListener("regular-layout-before-resize", (e) => {
presizePaths = (e as CustomEvent).detail.calculatePresizePaths();
});
@@ -299,7 +299,7 @@ test("should fire resize-before on double-click equalize", async ({ page }) => {
await page.evaluate(() => {
const layout = document.querySelector("regular-layout");
(window as unknown as Record).__resizeBeforeFired = false;
- layout?.addEventListener("regular-layout-resize-before", () => {
+ layout?.addEventListener("regular-layout-before-resize", () => {
(window as unknown as Record).__resizeBeforeFired = true;
});
});
@@ -326,7 +326,7 @@ test("should not fire resize-before on restoreSync", async ({ page }) => {
const fired = await page.evaluate(() => {
const layout = document.querySelector("regular-layout");
let eventFired = false;
- layout?.addEventListener("regular-layout-resize-before", () => {
+ layout?.addEventListener("regular-layout-before-resize", () => {
eventFired = true;
});
layout?.restoreSync({
diff --git a/tests/unit/calculate_edge.spec.ts b/tests/unit/calculate_edge.spec.ts
index 7ec3564..b7e8223 100644
--- a/tests/unit/calculate_edge.spec.ts
+++ b/tests/unit/calculate_edge.spec.ts
@@ -13,14 +13,14 @@ import { expect, test } from "@playwright/test";
import { LAYOUTS } from "../helpers/fixtures.ts";
import { calculate_edge } from "../../src/layout/calculate_edge.ts";
import { calculate_intersection } from "../../src/layout/calculate_intersect.ts";
-import type { Layout, LayoutPath } from "../../src/layout/types.ts";
+import type { Layout, LayoutPath } from "../../src/core/types.ts";
test("cursor in center of panel - no split", () => {
- const drop_target = calculate_intersection(0.3, 0.5, LAYOUTS.NESTED_BASIC);
+ const drop_target = calculate_intersection(0.3, 0.65, LAYOUTS.NESTED_BASIC);
expect(drop_target).not.toBeNull();
const result = calculate_edge(
0.3,
- 0.5,
+ 0.65,
LAYOUTS.NESTED_BASIC,
"DDD",
// biome-ignore lint/style/noNonNullAssertion: playwright assertion
@@ -68,10 +68,10 @@ test("cursor near right edge of vertical split panel", () => {
});
test("cursor near top edge of horizontal split panel", () => {
- const drop_target = calculate_intersection(0.7, 0.05, LAYOUTS.NESTED_BASIC);
+ const drop_target = calculate_intersection(0.75, 0.12, LAYOUTS.NESTED_BASIC);
const result = calculate_edge(
- 0.7,
- 0.05,
+ 0.75,
+ 0.12,
LAYOUTS.NESTED_BASIC,
"DDD",
// biome-ignore lint/style/noNonNullAssertion: playwright assertion
@@ -85,10 +85,10 @@ test("cursor near top edge of horizontal split panel", () => {
});
test("cursor near bottom edge of horizontal split panel", () => {
- const drop_target = calculate_intersection(0.7, 0.95, LAYOUTS.NESTED_BASIC);
+ const drop_target = calculate_intersection(0.75, 0.88, LAYOUTS.NESTED_BASIC);
const result = calculate_edge(
- 0.7,
- 0.95,
+ 0.75,
+ 0.88,
LAYOUTS.NESTED_BASIC,
"DDD",
// biome-ignore lint/style/noNonNullAssertion: playwright assertion
@@ -313,24 +313,24 @@ test("cursor in bottom-right corner prioritizes row offset", () => {
layout: undefined as unknown as Layout,
path: [],
view_window: { row_start: 0, row_end: 1, col_start: 0, col_end: 1 },
- column: 0.9,
- row: 0.95,
- column_offset: 0.9,
- row_offset: 0.95,
+ column: 0.85,
+ row: 0.89,
+ column_offset: 0.85,
+ row_offset: 0.89,
orientation: "horizontal",
is_edge: false,
};
- const result = calculate_edge(0.9, 0.95, singlePanel, "BBB", drop_target);
+ const result = calculate_edge(0.85, 0.89, singlePanel, "BBB", drop_target);
expect(result).toStrictEqual({
- column: 0.9,
- column_offset: 0.9,
+ column: 0.85,
+ column_offset: 0.85,
is_edge: true,
layout: undefined,
orientation: "vertical",
path: [1],
- row: 0.95,
- row_offset: 0.95,
+ row: 0.89,
+ row_offset: 0.89,
slot: "AAA",
type: "layout-path",
view_window: {
@@ -350,24 +350,24 @@ test("cursor in bottom-right corner prioritizes column offset", () => {
layout: undefined as unknown as Layout,
path: [],
view_window: { row_start: 0, row_end: 1, col_start: 0, col_end: 1 },
- column: 0.95,
- row: 0.9,
- column_offset: 0.95,
- row_offset: 0.9,
+ column: 0.89,
+ row: 0.85,
+ column_offset: 0.89,
+ row_offset: 0.85,
orientation: "horizontal",
is_edge: false,
};
- const result = calculate_edge(0.95, 0.9, singlePanel, "BBB", drop_target);
+ const result = calculate_edge(0.89, 0.85, singlePanel, "BBB", drop_target);
expect(result).toStrictEqual({
- column: 0.95,
- column_offset: 0.95,
+ column: 0.89,
+ column_offset: 0.89,
is_edge: true,
layout: undefined,
orientation: "horizontal",
path: [1],
- row: 0.9,
- row_offset: 0.9,
+ row: 0.85,
+ row_offset: 0.85,
slot: "AAA",
type: "layout-path",
view_window: {
@@ -387,15 +387,15 @@ test("cursor near edge with offset exactly at tolerance threshold", () => {
path: [],
layout: undefined as unknown as Layout,
view_window: { row_start: 0, row_end: 1, col_start: 0, col_end: 1 },
- column: 0.3,
+ column: 0.35,
row: 0.5,
- column_offset: 0.3,
+ column_offset: 0.35,
row_offset: 0.5,
orientation: "horizontal",
is_edge: false,
};
- const result = calculate_edge(0.3, 0.5, singlePanel, "BBB", drop_target);
+ const result = calculate_edge(0.35, 0.65, singlePanel, "BBB", drop_target);
expect(result.is_edge).toBe(false);
expect(result.path).toStrictEqual([0]);
});
@@ -421,9 +421,9 @@ test("cursor near edge with offset just below tolerance threshold", () => {
});
test("nested panel with vertical orientation at left edge", () => {
- const drop_target = calculate_intersection(0.02, 0.5, LAYOUTS.NESTED_BASIC);
+ const drop_target = calculate_intersection(0.12, 0.5, LAYOUTS.NESTED_BASIC);
const result = calculate_edge(
- 0.02,
+ 0.12,
0.5,
LAYOUTS.NESTED_BASIC,
"DDD",
diff --git a/themes/borland.css b/themes/borland.css
new file mode 100644
index 0000000..a122a50
--- /dev/null
+++ b/themes/borland.css
@@ -0,0 +1,103 @@
+/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
+ * ░░░░░░░░▄▀░█▀▄░█▀▀░█▀▀░█░█░█░░░█▀█░█▀▄░░░░░█░░░█▀█░█░█░█▀█░█░█░▀█▀░▀▄░░░░░░░░
+ * ░░░░░░░▀▄░░█▀▄░█▀▀░█░█░█░█░█░░░█▀█░█▀▄░▀▀▀░█░░░█▀█░░█░░█░█░█░█░░█░░░▄▀░░░░░░░
+ * ░░░░░░░░░▀░▀░▀░▀▀▀░▀▀▀░▀▀▀░▀▀▀░▀░▀░▀░▀░░░░░▀▀▀░▀░▀░░▀░░▀▀▀░▀▀▀░░▀░░▀░░░░░░░░░
+ * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
+ * ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+ * ┃ * Copyright (c) 2026, the Regular Layout Authors. This file is part * ┃
+ * ┃ * of the Regular Layout library, distributed under the terms of the * ┃
+ * ┃ * [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). * ┃
+ * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+ */
+
+regular-layout.borland {
+ background-color: #0000aa;
+ font-family:
+ "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas",
+ "Liberation Mono", monospace;
+ padding: 16px;
+}
+
+/* Frame */
+regular-layout.borland regular-layout-frame {
+ position: relative;
+ box-sizing: border-box;
+ margin: 4px;
+ background: #0000aa;
+ border: 1px solid #00aaaa;
+ box-shadow: 1px 1px 0 #000000;
+}
+
+regular-layout.borland regular-layout-frame::part(container) {
+ padding: 4px 6px;
+ color: #ffff55;
+}
+
+regular-layout.borland regular-layout-frame::part(close) {
+ background: #00aa00;
+ height: 16px;
+ align-self: center;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0 3px;
+}
+
+regular-layout.borland regular-layout-frame::part(close):hover {
+ background: #00ff00;
+}
+
+regular-layout.borland regular-layout-frame::part(close):before {
+ content: "[×]";
+ font-size: 10px;
+ font-weight: bold;
+ color: #000000;
+}
+
+regular-layout.borland regular-layout-frame::part(titlebar) {
+ display: flex;
+ align-items: stretch;
+ padding-right: 0;
+ height: 22px;
+ background: #0000aa;
+}
+
+regular-layout.borland regular-layout-frame::part(tab) {
+ display: flex;
+ flex: 1 1 150px;
+ align-items: center;
+ padding: 0 3px 0 8px;
+ cursor: pointer;
+ text-overflow: ellipsis;
+ background: #0000aa;
+ color: #aaaaaa;
+ font-size: 11px;
+ font-weight: bold;
+ border-right: 1px solid #00aaaa;
+}
+
+regular-layout.borland regular-layout-frame::part(active-tab) {
+ background: #00aaaa;
+ color: #000000;
+}
+
+regular-layout.borland:has(.overlay) > * {
+ opacity: 0.6;
+}
+
+regular-layout.borland:has(.overlay) > .overlay {
+ opacity: 1;
+}
+
+/* Frame in Overlay Mode */
+regular-layout.borland regular-layout-frame.overlay {
+ background: rgba(0, 170, 170, 0.9);
+ border: 1px solid #ffff55;
+ box-shadow: none;
+ margin: 0;
+ transition:
+ top 0.05s linear,
+ height 0.05s linear,
+ width 0.05s linear,
+ left 0.05s linear;
+}
diff --git a/themes/chicago.css b/themes/chicago.css
index e3234d5..84a66a2 100644
--- a/themes/chicago.css
+++ b/themes/chicago.css
@@ -11,79 +11,85 @@
*/
regular-layout.chicago {
- background-color: #008080;
- font-family: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", "Liberation Mono", monospace;
- padding: 24px;
+ background-color: #008080;
+ font-family:
+ "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas",
+ "Liberation Mono", monospace;
+ padding: 24px;
}
/* Frame */
regular-layout.chicago regular-layout-frame {
- position: relative;
- box-sizing: border-box;
- margin: 12px;
- background: #C0C0C0;
- border-width: 2px;
- border-color: #FFFFFF #808080 #808080 #FFFFFF;
- border-style: solid;
+ position: relative;
+ box-sizing: border-box;
+ margin: 12px;
+ background: #c0c0c0;
+ border-width: 2px;
+ border-color: #ffffff #808080 #808080 #ffffff;
+ border-style: solid;
+}
+
+regular-layout.chicago regular-layout-frame::part(container) {
+ padding: 6px;
}
regular-layout.chicago regular-layout-frame::part(close) {
- border-width: 1px;
- border-color: #FFFFFF #808080 #808080 #FFFFFF;
- border-style: solid;
- height: 16px;
- background: #C0C0C0;
- align-self: center;
- display: flex;
- align-items: center;
- padding: 0px 4px;
+ border-width: 1px;
+ border-color: #ffffff #808080 #808080 #ffffff;
+ border-style: solid;
+ height: 16px;
+ background: #c0c0c0;
+ align-self: center;
+ display: flex;
+ align-items: center;
+ padding: 0px 4px;
}
regular-layout.chicago regular-layout-frame::part(close):before {
- content: "X";
- font-size: 10px;
- font-weight: bold;
+ content: "X";
+ font-size: 10px;
+ font-weight: bold;
}
regular-layout.chicago regular-layout-frame::part(titlebar) {
- display: flex;
- align-items: stretch;
- padding-right: 0px;
+ display: flex;
+ align-items: stretch;
+ padding-right: 0px;
}
regular-layout.chicago regular-layout-frame::part(tab) {
- display: flex;
- flex: 1 1 150px;
- align-items: center;
- padding: 0 3px 0 8px;
- cursor: pointer;
- text-overflow: ellipsis;
- background: #808080;
- color: #FFF;
- font-family: "Tahoma", "Arial", sans-serif;
- font-weight: bold;
- font-size: 11px;
+ display: flex;
+ flex: 1 1 150px;
+ align-items: center;
+ padding: 0 3px 0 8px;
+ cursor: pointer;
+ text-overflow: ellipsis;
+ background: #808080;
+ color: #fff;
+ font-family: "Tahoma", "Arial", sans-serif;
+ font-weight: bold;
+ font-size: 11px;
}
regular-layout.chicago regular-layout-frame::part(active-tab) {
- background: #000080;
- opacity: 1;
+ background: #000080;
+ opacity: 1;
}
-regular-layout.chicago:has(.overlay)>* {
- opacity: 0.8;
+regular-layout.chicago:has(.overlay) > * {
+ opacity: 0.8;
}
-regular-layout.chicago:has(.overlay)>.overlay {
- opacity: 1;
+regular-layout.chicago:has(.overlay) > .overlay {
+ opacity: 1;
}
/* Frame in Overlay Mode */
regular-layout.chicago regular-layout-frame.overlay {
- margin: 0;
- transition:
- top 0.1s ease-in-out,
- height 0.1s ease-in-out,
- width 0.1s ease-in-out,
- left 0.1s ease-in-out;
-}
\ No newline at end of file
+ margin: 0;
+ transition:
+ top 0.1s ease-in-out,
+ height 0.1s ease-in-out,
+ width 0.1s ease-in-out,
+ left 0.1s ease-in-out;
+}
diff --git a/themes/fluxbox.css b/themes/fluxbox.css
index ab039fc..e82b675 100644
--- a/themes/fluxbox.css
+++ b/themes/fluxbox.css
@@ -11,100 +11,104 @@
*/
regular-layout.fluxbox {
- background-color: #DBDFE6;
- font-family: "ui-sans-serif", "Helvetica", "Arial", sans-serif;
- padding: 16px;
+ background-color: #dbdfe6;
+ font-family: "ui-sans-serif", "Helvetica", "Arial", sans-serif;
+ padding: 16px;
}
/* Frame */
regular-layout.fluxbox regular-layout-frame {
- position: relative;
- box-sizing: border-box;
- margin: 8px;
- background: #FFFFFF;
- border: 1px solid #9DACBE;
- box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15);
+ position: relative;
+ box-sizing: border-box;
+ margin: 8px;
+ background: #ffffff;
+ border: 1px solid #9dacbe;
+ box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15);
+}
+
+regular-layout.fluxbox regular-layout-frame::part(container) {
+ padding: 6px;
}
regular-layout.fluxbox regular-layout-frame::part(close) {
- border: 1px solid #8A96A3;
- height: 14px;
- background: linear-gradient(to bottom, #E8ECEF 0%, #CDD5DD 100%);
- align-self: center;
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 0px;
- width: 14px;
- margin-right: 2px;
+ border: 1px solid #8a96a3;
+ height: 14px;
+ background: linear-gradient(to bottom, #e8ecef 0%, #cdd5dd 100%);
+ align-self: center;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0px;
+ width: 14px;
+ margin-right: 2px;
}
regular-layout.fluxbox regular-layout-frame::part(close):hover {
- background: linear-gradient(to bottom, #F0F3F5 0%, #D8DFE6 100%);
+ background: linear-gradient(to bottom, #f0f3f5 0%, #d8dfe6 100%);
}
regular-layout.fluxbox regular-layout-frame::part(close):active {
- background: linear-gradient(to bottom, #C5CFD9 0%, #B3BEC9 100%);
+ background: linear-gradient(to bottom, #c5cfd9 0%, #b3bec9 100%);
}
regular-layout.fluxbox regular-layout-frame::part(close):before {
- content: "×";
- font-size: 14px;
- font-weight: normal;
- color: #444444;
- line-height: 1;
+ content: "×";
+ font-size: 14px;
+ font-weight: normal;
+ color: #444444;
+ line-height: 1;
}
regular-layout.fluxbox regular-layout-frame::part(titlebar) {
- display: flex;
- align-items: stretch;
- padding-right: 0px;
- height: 22px;
+ display: flex;
+ align-items: stretch;
+ padding-right: 0px;
+ height: 22px;
}
regular-layout.fluxbox regular-layout-frame::part(tab) {
- display: flex;
- flex: 1 1 150px;
- align-items: center;
- padding: 0 8px;
- cursor: pointer;
- text-overflow: ellipsis;
- background: linear-gradient(to bottom, #C7D1DB 0%, #B3BEC9 100%);
- color: #4A4A4A;
- font-size: 11px;
- font-weight: normal;
- border-right: 1px solid #9DACBE;
- opacity: 0.85;
+ display: flex;
+ flex: 1 1 150px;
+ align-items: center;
+ padding: 0 8px;
+ cursor: pointer;
+ text-overflow: ellipsis;
+ background: linear-gradient(to bottom, #c7d1db 0%, #b3bec9 100%);
+ color: #4a4a4a;
+ font-size: 11px;
+ font-weight: normal;
+ border-right: 1px solid #9dacbe;
+ opacity: 0.85;
}
regular-layout.fluxbox regular-layout-frame::part(tab):hover {
- background: linear-gradient(to bottom, #D2DBE4 0%, #BEC9D4 100%);
+ background: linear-gradient(to bottom, #d2dbe4 0%, #bec9d4 100%);
}
regular-layout.fluxbox regular-layout-frame::part(active-tab) {
- background: linear-gradient(to bottom, #E0E7EF 0%, #D1DAE3 100%);
- color: #1A1A1A;
- opacity: 1;
- font-weight: 500;
+ background: linear-gradient(to bottom, #e0e7ef 0%, #d1dae3 100%);
+ color: #1a1a1a;
+ opacity: 1;
+ font-weight: 500;
}
-regular-layout.fluxbox:has(.overlay)>* {
- opacity: 0.7;
+regular-layout.fluxbox:has(.overlay) > * {
+ opacity: 0.7;
}
-regular-layout.fluxbox:has(.overlay)>.overlay {
- opacity: 1;
+regular-layout.fluxbox:has(.overlay) > .overlay {
+ opacity: 1;
}
/* Frame in Overlay Mode */
regular-layout.fluxbox regular-layout-frame.overlay {
- margin: 0;
- background-color: rgba(155, 172, 190, 0.25);
- border: 1px solid #6B7C8F;
- box-shadow: none;
- transition:
- top 0.1s ease-in-out,
- height 0.1s ease-in-out,
- width 0.1s ease-in-out,
- left 0.1s ease-in-out;
+ margin: 0;
+ background-color: rgba(155, 172, 190, 0.25);
+ border: 1px solid #6b7c8f;
+ box-shadow: none;
+ transition:
+ top 0.1s ease-in-out,
+ height 0.1s ease-in-out,
+ width 0.1s ease-in-out,
+ left 0.1s ease-in-out;
}
diff --git a/themes/gibson.css b/themes/gibson.css
index 8e0fc6d..cfaa744 100644
--- a/themes/gibson.css
+++ b/themes/gibson.css
@@ -11,254 +11,264 @@
*/
regular-layout.gibson {
- background: radial-gradient(ellipse at center, #0a0a1a 0%, #000000 100%);
- font-family: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", "Liberation Mono", monospace;
- padding: 8px;
+ background: radial-gradient(ellipse at center, #0a0a1a 0%, #000000 100%);
+ font-family:
+ "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas",
+ "Liberation Mono", monospace;
+ padding: 8px;
}
/* Frame */
regular-layout.gibson regular-layout-frame {
- --titlebar-height: 28px;
- position: relative;
- box-sizing: border-box;
- margin: 8px;
- background: rgba(10, 10, 26, 0.85);
- backdrop-filter: blur(4px);
+ --titlebar-height: 28px;
+ position: relative;
+ box-sizing: border-box;
+ margin: 8px;
+ background: rgba(10, 10, 26, 0.85);
+ backdrop-filter: blur(4px);
+ color: white;
+ text-shadow:
+ 0 0 5px #fff,
+ 0 0 10px #fff,
+ 0 0 20px #fff;
+}
+
+regular-layout.gibson regular-layout-frame::part(container) {
+ padding: 6px;
}
regular-layout.gibson regular-layout-frame::part(active-close) {
- border: 1px solid #ff00ff;
- height: 18px;
- width: 18px;
- background: rgba(255, 0, 255, 0.1);
- align-self: center;
- /* biome-ignore lint/complexity/noImportantStyles: reasons */
- display: flex !important;
- align-items: center;
- justify-content: center;
- margin-right: 1px;
- box-shadow: 0 0 8px rgba(255, 0, 255, 0.4);
- transition: all 0.1s ease;
+ border: 1px solid #ff00ff;
+ height: 18px;
+ width: 18px;
+ background: rgba(255, 0, 255, 0.1);
+ align-self: center;
+ /* biome-ignore lint/complexity/noImportantStyles: reasons */
+ display: flex !important;
+ align-items: center;
+ justify-content: center;
+ margin-right: 1px;
+ box-shadow: 0 0 8px rgba(255, 0, 255, 0.4);
+ transition: all 0.1s ease;
}
regular-layout.gibson regular-layout-frame::part(active-close):hover {
- background: rgba(255, 0, 255, 0.3);
- box-shadow: 0 0 12px rgba(255, 0, 255, 0.8);
+ background: rgba(255, 0, 255, 0.3);
+ box-shadow: 0 0 12px rgba(255, 0, 255, 0.8);
}
regular-layout.gibson regular-layout-frame::part(active-close):before {
- content: "×";
- font-size: 14px;
- font-weight: bold;
- color: #ff00ff;
- text-shadow: 0 0 4px rgba(255, 0, 255, 0.8);
+ content: "×";
+ font-size: 14px;
+ font-weight: bold;
+ color: #ff00ff;
+ text-shadow: 0 0 4px rgba(255, 0, 255, 0.8);
}
regular-layout.gibson regular-layout-frame::part(close) {
- display: none;
+ display: none;
}
-
regular-layout.gibson regular-layout-frame::part(titlebar) {
- display: flex;
- justify-content: flex-end;
- align-items: stretch;
- padding-left: 12px;
- height: 32px;
+ display: flex;
+ justify-content: flex-end;
+ align-items: stretch;
+ padding-left: 12px;
+ height: 32px;
- /* border-bottom: 1px solid rgba(0, 255, 255, 0.3); */
+ /* border-bottom: 1px solid rgba(0, 255, 255, 0.3); */
}
regular-layout.gibson regular-layout-frame::part(tab) {
- display: flex;
- flex: 1 1 150px;
- max-width: 200px;
- align-items: center;
- padding: 0 5px 0 12px;
- cursor: pointer;
- text-overflow: ellipsis;
- background: rgba(255, 0, 255, 0.1);
- color: #00ffff;
- font-size: 11px;
- font-weight: 500;
- letter-spacing: 0.5px;
- text-transform: uppercase;
- /* border-right: 1px solid rgba(0, 255, 255, 0.2); */
- opacity: 0.6;
- transition: all 0.2s ease;
- text-shadow: 0 0 4px rgba(0, 255, 255, 0.5);
+ display: flex;
+ flex: 1 1 150px;
+ max-width: 200px;
+ align-items: center;
+ padding: 0 5px 0 12px;
+ cursor: pointer;
+ text-overflow: ellipsis;
+ background: rgba(255, 0, 255, 0.1);
+ color: #00ffff;
+ font-size: 11px;
+ font-weight: 500;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+ /* border-right: 1px solid rgba(0, 255, 255, 0.2); */
+ opacity: 0.6;
+ transition: all 0.2s ease;
+ text-shadow: 0 0 4px rgba(0, 255, 255, 0.5);
}
regular-layout.gibson regular-layout-frame::part(tab):hover {
- box-shadow: inset 0 0 12px rgba(0, 255, 255, 0.9);
+ box-shadow: inset 0 0 12px rgba(0, 255, 255, 0.9);
}
regular-layout.gibson regular-layout-frame::part(active-tab) {
- background: rgba(0, 255, 255, 0.15);
- opacity: 1;
- border: 2px solid #00ffff;
- border-bottom-width: 1px;
- box-shadow:
- inset 0 0 12px rgba(0, 255, 255, 0.3),
- 0 0 8px rgba(0, 255, 255, 0.4);
+ background: rgba(0, 255, 255, 0.15);
+ opacity: 1;
+ border: 2px solid #00ffff;
+ border-bottom-width: 1px;
+ box-shadow:
+ inset 0 0 12px rgba(0, 255, 255, 0.3),
+ 0 0 8px rgba(0, 255, 255, 0.4);
}
regular-layout.gibson:has(.overlay) > * {
- opacity: 0.5;
+ opacity: 0.5;
}
regular-layout.gibson:has(.overlay) > .overlay {
- opacity: 1;
+ opacity: 1;
}
/* Frame in Overlay Mode */
regular-layout.gibson regular-layout-frame.overlay {
- background: rgba(255, 0, 255, 0.1);
- border: 1px dashed #ff00ff;
- border-radius: 12px;
- box-shadow:
- 0 0 15px rgba(255, 0, 255, 0.6),
- inset 0 0 20px rgba(255, 0, 255, 0.2);
- margin: 0;
- transition:
- top 0.075s ease-out,
- height 0.075s ease-out,
- width 0.075s ease-out,
- left 0.075s ease-out;
+ background: rgba(255, 0, 255, 0.1);
+ border: 1px dashed #ff00ff;
+ border-radius: 12px;
+ box-shadow:
+ 0 0 15px rgba(255, 0, 255, 0.6),
+ inset 0 0 20px rgba(255, 0, 255, 0.2);
+ margin: 0;
+ transition:
+ top 0.075s ease-out,
+ height 0.075s ease-out,
+ width 0.075s ease-out,
+ left 0.075s ease-out;
}
regular-layout.gibson regular-layout-frame::part(container) {
- display: none;
- border: 1px solid #00ffff;
- border-radius: 12px 0 12px 0;
+ display: none;
+ border: 1px solid #00ffff;
+ border-radius: 12px 0 12px 0;
}
regular-layout.gibson regular-layout-frame::part(titlebar) {
- display: none;
+ display: none;
}
regular-layout.gibson regular-layout-frame:not(.overlay)::part(container),
regular-layout.gibson regular-layout-frame:not(.overlay)::part(titlebar) {
- display: flex;
+ display: flex;
}
/* Cyberpunk color variations */
-regular-layout.gibson :nth-child(6n+1)::part(container) {
- border-color: #00ffff;
- box-shadow:
- 0 0 10px rgba(0, 255, 255, 0.75),
- inset 0 0 20px rgba(0, 255, 255, 0.1);
+regular-layout.gibson :nth-child(6n + 1)::part(container) {
+ border-color: #00ffff;
+ box-shadow:
+ 0 0 10px rgba(0, 255, 255, 0.75),
+ inset 0 0 20px rgba(0, 255, 255, 0.1);
}
-regular-layout.gibson :nth-child(6n+1)::part(tab) {
- color: #00ffff;
- text-shadow: 0 0 4px rgba(0, 255, 255, 0.6);
+regular-layout.gibson :nth-child(6n + 1)::part(tab) {
+ color: #00ffff;
+ text-shadow: 0 0 4px rgba(0, 255, 255, 0.6);
}
-regular-layout.gibson :nth-child(6n+1)::part(active-tab) {
- background: #00ffff44;
- border-color: #00ffff;
- box-shadow:
- inset 0 0 12px rgba(0, 255, 255, 0.3),
- 0 0 8px rgba(0, 255, 255, 0.4);
+regular-layout.gibson :nth-child(6n + 1)::part(active-tab) {
+ background: #00ffff44;
+ border-color: #00ffff;
+ box-shadow:
+ inset 0 0 12px rgba(0, 255, 255, 0.3),
+ 0 0 8px rgba(0, 255, 255, 0.4);
}
-regular-layout.gibson :nth-child(6n+2)::part(container) {
- border-color: #ff00ff;
- box-shadow:
- 0 0 10px rgba(255, 0, 255, 0.75),
- inset 0 0 20px rgba(255, 0, 255, 0.1);
+regular-layout.gibson :nth-child(6n + 2)::part(container) {
+ border-color: #ff00ff;
+ box-shadow:
+ 0 0 10px rgba(255, 0, 255, 0.75),
+ inset 0 0 20px rgba(255, 0, 255, 0.1);
}
-regular-layout.gibson :nth-child(6n+2)::part(tab) {
- color: #ff00ff;
- text-shadow: 0 0 4px rgba(255, 0, 255, 0.6);
+regular-layout.gibson :nth-child(6n + 2)::part(tab) {
+ color: #ff00ff;
+ text-shadow: 0 0 4px rgba(255, 0, 255, 0.6);
}
-regular-layout.gibson :nth-child(6n+2)::part(active-tab) {
- background: #ff00ff44;
- border-color: #ff00ff;
- box-shadow:
- inset 0 0 12px rgba(255, 0, 255, 0.3),
- 0 0 8px rgba(255, 0, 255, 0.4);
+regular-layout.gibson :nth-child(6n + 2)::part(active-tab) {
+ background: #ff00ff44;
+ border-color: #ff00ff;
+ box-shadow:
+ inset 0 0 12px rgba(255, 0, 255, 0.3),
+ 0 0 8px rgba(255, 0, 255, 0.4);
}
-regular-layout.gibson :nth-child(6n+3)::part(container) {
- border-color: #00ff00;
- box-shadow:
- 0 0 10px rgba(0, 255, 0, 0.75),
- inset 0 0 20px rgba(0, 255, 0, 0.1);
+regular-layout.gibson :nth-child(6n + 3)::part(container) {
+ border-color: #00ff00;
+ box-shadow:
+ 0 0 10px rgba(0, 255, 0, 0.75),
+ inset 0 0 20px rgba(0, 255, 0, 0.1);
}
-regular-layout.gibson :nth-child(6n+3)::part(tab) {
- color: #00ff00;
- text-shadow: 0 0 4px rgba(0, 255, 0, 0.6);
+regular-layout.gibson :nth-child(6n + 3)::part(tab) {
+ color: #00ff00;
+ text-shadow: 0 0 4px rgba(0, 255, 0, 0.6);
}
-regular-layout.gibson :nth-child(6n+3)::part(active-tab) {
- background: #00ff0044;
- border-color: #00ff00;
- box-shadow:
- inset 0 0 12px rgba(0, 255, 0, 0.3),
- 0 0 8px rgba(0, 255, 0, 0.4);
+regular-layout.gibson :nth-child(6n + 3)::part(active-tab) {
+ background: #00ff0044;
+ border-color: #00ff00;
+ box-shadow:
+ inset 0 0 12px rgba(0, 255, 0, 0.3),
+ 0 0 8px rgba(0, 255, 0, 0.4);
}
-regular-layout.gibson :nth-child(6n+4)::part(container) {
- border-color: #ff0080;
- box-shadow:
- 0 0 10px rgba(255, 0, 128, 0.75),
- inset 0 0 20px rgba(255, 0, 128, 0.1);
+regular-layout.gibson :nth-child(6n + 4)::part(container) {
+ border-color: #ff0080;
+ box-shadow:
+ 0 0 10px rgba(255, 0, 128, 0.75),
+ inset 0 0 20px rgba(255, 0, 128, 0.1);
}
-regular-layout.gibson :nth-child(6n+4)::part(tab) {
- color: #ff0080;
- text-shadow: 0 0 4px rgba(255, 0, 128, 0.6);
+regular-layout.gibson :nth-child(6n + 4)::part(tab) {
+ color: #ff0080;
+ text-shadow: 0 0 4px rgba(255, 0, 128, 0.6);
}
-regular-layout.gibson :nth-child(6n+4)::part(active-tab) {
- background: #ff008044;
- border-color: #ff0080;
- box-shadow:
- inset 0 0 12px rgba(255, 0, 128, 0.3),
- 0 0 8px rgba(255, 0, 128, 0.4);
+regular-layout.gibson :nth-child(6n + 4)::part(active-tab) {
+ background: #ff008044;
+ border-color: #ff0080;
+ box-shadow:
+ inset 0 0 12px rgba(255, 0, 128, 0.3),
+ 0 0 8px rgba(255, 0, 128, 0.4);
}
-regular-layout.gibson :nth-child(6n+5)::part(container) {
- border-color: #8000ff;
- box-shadow:
- 0 0 10px rgba(128, 0, 255, 0.75),
- inset 0 0 20px rgba(128, 0, 255, 0.1);
+regular-layout.gibson :nth-child(6n + 5)::part(container) {
+ border-color: #8000ff;
+ box-shadow:
+ 0 0 10px rgba(128, 0, 255, 0.75),
+ inset 0 0 20px rgba(128, 0, 255, 0.1);
}
-regular-layout.gibson :nth-child(6n+5)::part(tab) {
- color: #8000ff;
- text-shadow: 0 0 4px rgba(128, 0, 255, 0.6);
+regular-layout.gibson :nth-child(6n + 5)::part(tab) {
+ color: #8000ff;
+ text-shadow: 0 0 4px rgba(128, 0, 255, 0.6);
}
-regular-layout.gibson :nth-child(6n+5)::part(active-tab) {
- background: #8000ff44;
- border-color: #8000ff;
- box-shadow:
- inset 0 0 12px rgba(128, 0, 255, 0.3),
- 0 0 8px rgba(128, 0, 255, 0.4);
+regular-layout.gibson :nth-child(6n + 5)::part(active-tab) {
+ background: #8000ff44;
+ border-color: #8000ff;
+ box-shadow:
+ inset 0 0 12px rgba(128, 0, 255, 0.3),
+ 0 0 8px rgba(128, 0, 255, 0.4);
}
-regular-layout.gibson :nth-child(6n+6)::part(container) {
- border-color: #ffff00;
- box-shadow:
- 0 0 10px rgba(255, 255, 0, 0.75),
- inset 0 0 20px rgba(255, 255, 0, 0.1);
+regular-layout.gibson :nth-child(6n + 6)::part(container) {
+ border-color: #ffff00;
+ box-shadow:
+ 0 0 10px rgba(255, 255, 0, 0.75),
+ inset 0 0 20px rgba(255, 255, 0, 0.1);
}
-regular-layout.gibson :nth-child(6n+6)::part(tab) {
- color: #ffff00;
- text-shadow: 0 0 4px rgba(255, 255, 0, 0.6);
+regular-layout.gibson :nth-child(6n + 6)::part(tab) {
+ color: #ffff00;
+ text-shadow: 0 0 4px rgba(255, 255, 0, 0.6);
}
-regular-layout.gibson :nth-child(6n+6)::part(active-tab) {
- background: #ffff0044;
- border-color: #ffff00;
- box-shadow:
- inset 0 0 12px rgba(255, 255, 0, 0.3),
- 0 0 8px rgba(255, 255, 0, 0.4);
+regular-layout.gibson :nth-child(6n + 6)::part(active-tab) {
+ background: #ffff0044;
+ border-color: #ffff00;
+ box-shadow:
+ inset 0 0 12px rgba(255, 255, 0, 0.3),
+ 0 0 8px rgba(255, 255, 0, 0.4);
}
diff --git a/themes/hotdog.css b/themes/hotdog.css
index b4fefd6..596efea 100644
--- a/themes/hotdog.css
+++ b/themes/hotdog.css
@@ -11,78 +11,84 @@
*/
regular-layout.hotdog {
- background-color: #FF0000;
- font-family: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", "Liberation Mono", monospace;
- padding: 24px;
+ background-color: #ff0000;
+ font-family:
+ "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas",
+ "Liberation Mono", monospace;
+ padding: 24px;
}
/* Frame */
regular-layout.hotdog regular-layout-frame {
- margin: 12px;
- background: #FFFF00;
- border-width: 2px;
- border-color: #FF6B6B #8B0000 #8B0000 #FF6B6B;
- border-style: solid;
+ margin: 12px;
+ background: #ffff00;
+ border-width: 2px;
+ border-color: #ff6b6b #8b0000 #8b0000 #ff6b6b;
+ border-style: solid;
+}
+
+regular-layout.hotdog regular-layout-frame::part(container) {
+ padding: 6px;
}
regular-layout.hotdog regular-layout-frame::part(close) {
- border-width: 1px;
- border-color: #FF6B6B #8B0000 #8B0000 #FF6B6B;
- border-style: solid;
- height: 16px;
- background: #FF0000;
- align-self: center;
- display: flex;
- align-items: center;
- padding: 0px 4px;
- color: #FFFF00;
+ border-width: 1px;
+ border-color: #ff6b6b #8b0000 #8b0000 #ff6b6b;
+ border-style: solid;
+ height: 16px;
+ background: #ff0000;
+ align-self: center;
+ display: flex;
+ align-items: center;
+ padding: 0px 4px;
+ color: #ffff00;
}
regular-layout.hotdog regular-layout-frame::part(close):before {
- content: "X";
- font-size: 10px;
- font-weight: bold;
+ content: "X";
+ font-size: 10px;
+ font-weight: bold;
}
regular-layout.hotdog regular-layout-frame::part(titlebar) {
- display: flex;
- align-items: stretch;
- padding-right: 0px;
+ display: flex;
+ align-items: stretch;
+ padding-right: 0px;
}
regular-layout.hotdog regular-layout-frame::part(tab) {
- display: flex;
- flex: 1 1 150px;
- align-items: center;
- padding: 0 3px 0 8px;
- cursor: pointer;
- text-overflow: ellipsis;
- background: #CC0000;
- color: #FFFF00;
- font-family: "Tahoma", "Arial", sans-serif;
- font-weight: bold;
- font-size: 11px;
+ display: flex;
+ flex: 1 1 150px;
+ align-items: center;
+ padding: 0 3px 0 8px;
+ cursor: pointer;
+ text-overflow: ellipsis;
+ background: #cc0000;
+ color: #ffff00;
+ font-family: "Tahoma", "Arial", sans-serif;
+ font-weight: bold;
+ font-size: 11px;
}
regular-layout.hotdog regular-layout-frame::part(active-tab) {
- background: #FF0000;
- opacity: 1;
+ background: #ff0000;
+ opacity: 1;
}
-regular-layout.hotdog:has(.overlay)>* {
- opacity: 0.8;
+regular-layout.hotdog:has(.overlay) > * {
+ opacity: 0.8;
}
-regular-layout.hotdog:has(.overlay)>.overlay {
- opacity: 1;
+regular-layout.hotdog:has(.overlay) > .overlay {
+ opacity: 1;
}
/* Frame in Overlay Mode */
regular-layout.hotdog regular-layout-frame.overlay {
- margin: 0;
- transition:
- top 0.1s ease-in-out,
- height 0.1s ease-in-out,
- width 0.1s ease-in-out,
- left 0.1s ease-in-out;
+ margin: 0;
+ transition:
+ top 0.1s ease-in-out,
+ height 0.1s ease-in-out,
+ width 0.1s ease-in-out,
+ left 0.1s ease-in-out;
}
diff --git a/themes/lorax.css b/themes/lorax.css
index 89017d8..be0318f 100644
--- a/themes/lorax.css
+++ b/themes/lorax.css
@@ -11,122 +11,127 @@
*/
regular-layout.lorax {
- font-family: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", "Liberation Mono", monospace;
+ font-family:
+ "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas",
+ "Liberation Mono", monospace;
}
/* Frame */
regular-layout.lorax regular-layout-frame {
- margin: 3px;
- margin-top: 27px;
- border-radius: 0 6px 6px 6px;
- border: 1px solid #666;
- box-shadow: 0px 6px 6px -4px rgba(150, 150, 180);
+ margin: 3px;
+ margin-top: 27px;
+ border-radius: 0 6px 6px 6px;
+ border: 1px solid #666;
+ box-shadow: 0px 6px 6px -4px rgba(150, 150, 180);
+}
+
+regular-layout.lorax regular-layout-frame::part(container) {
+ padding: 6px;
}
regular-layout.lorax regular-layout-frame::part(titlebar) {
- display: flex;
- align-items: stretch;
- margin-left: -1px;
- margin-right: -1px;
- margin-bottom: 0px;
- margin-top: -24px;
- padding-right: 6px;
+ display: flex;
+ align-items: stretch;
+ margin-left: -1px;
+ margin-right: -1px;
+ margin-bottom: 0px;
+ margin-top: -24px;
+ padding-right: 6px;
}
regular-layout.lorax regular-layout-frame::part(tab) {
- display: flex;
- flex: 1 1 150px;
- align-items: center;
- text-align: center;
- font-size: 10px;
- padding: 0 6px;
- cursor: pointer;
- max-width: 150px;
- text-overflow: ellipsis;
- border: 1px solid #666;
- border-radius: 6px 6px 0 0;
- opacity: 0.5;
+ display: flex;
+ flex: 1 1 150px;
+ align-items: center;
+ text-align: center;
+ font-size: 10px;
+ padding: 0 6px;
+ cursor: pointer;
+ max-width: 150px;
+ text-overflow: ellipsis;
+ border: 1px solid #666;
+ border-radius: 6px 6px 0 0;
+ opacity: 0.5;
}
regular-layout.lorax regular-layout-frame::part(active-tab) {
- opacity: 1;
+ opacity: 1;
}
regular-layout.lorax regular-layout-frame::part(close) {
- border-radius: 7px;
- border: 1px solid #666;
- background: transparent;
- height: 14px;
- align-self: center
+ border-radius: 7px;
+ border: 1px solid #666;
+ background: transparent;
+ height: 14px;
+ align-self: center;
}
-
regular-layout.lorax regular-layout-frame::part(close):hover {
- transition: background-color 0.2s;
- background-color: rgba(255, 0, 0, 0.2);
+ transition: background-color 0.2s;
+ background-color: rgba(255, 0, 0, 0.2);
}
/* Frame in Overlay Mode */
regular-layout.lorax regular-layout-frame.overlay {
- background-color: rgba(0, 0, 0, 0.2);
- border: 1px dashed rgb(0, 0, 0);
- border-radius: 6px;
- margin: 3px;
- box-shadow: none;
- transition:
- top 0.1s ease-in-out,
- height 0.1s ease-in-out,
- width 0.1s ease-in-out,
- left 0.1s ease-in-out;
+ background-color: rgba(0, 0, 0, 0.2);
+ border: 1px dashed rgb(0, 0, 0);
+ border-radius: 6px;
+ margin: 3px;
+ box-shadow: none;
+ transition:
+ top 0.1s ease-in-out,
+ height 0.1s ease-in-out,
+ width 0.1s ease-in-out,
+ left 0.1s ease-in-out;
}
regular-layout.lorax regular-layout-frame::part(container),
regular-layout.lorax regular-layout-frame::part(titlebar) {
- display: none;
+ display: none;
}
regular-layout.lorax regular-layout-frame:not(.overlay)::part(container),
regular-layout.lorax regular-layout-frame:not(.overlay)::part(titlebar) {
- display: flex;
+ display: flex;
}
/* Colors */
-regular-layout.lorax :nth-child(8n+1),
-regular-layout.lorax :nth-child(8n+1)::part(tab) {
- background-color: #ffadadff;
+regular-layout.lorax :nth-child(8n + 1),
+regular-layout.lorax :nth-child(8n + 1)::part(tab) {
+ background-color: #ffadadff;
}
-regular-layout.lorax :nth-child(8n+2),
-regular-layout.lorax :nth-child(8n+2)::part(tab) {
- background-color: #ffd6a5ff;
+regular-layout.lorax :nth-child(8n + 2),
+regular-layout.lorax :nth-child(8n + 2)::part(tab) {
+ background-color: #ffd6a5ff;
}
-regular-layout.lorax :nth-child(8n+3),
-regular-layout.lorax :nth-child(8n+3)::part(tab) {
- background-color: #fdffb6ff;
+regular-layout.lorax :nth-child(8n + 3),
+regular-layout.lorax :nth-child(8n + 3)::part(tab) {
+ background-color: #fdffb6ff;
}
-regular-layout.lorax :nth-child(8n+4),
-regular-layout.lorax :nth-child(8n+4)::part(tab) {
- background-color: #caffbfff;
+regular-layout.lorax :nth-child(8n + 4),
+regular-layout.lorax :nth-child(8n + 4)::part(tab) {
+ background-color: #caffbfff;
}
-regular-layout.lorax :nth-child(8n+5),
-regular-layout.lorax :nth-child(8n+5)::part(tab) {
- background-color: #9bf6ffff;
+regular-layout.lorax :nth-child(8n + 5),
+regular-layout.lorax :nth-child(8n + 5)::part(tab) {
+ background-color: #9bf6ffff;
}
-regular-layout.lorax :nth-child(8n+6),
-regular-layout.lorax :nth-child(8n+6)::part(tab) {
- background-color: #a0c4ffff;
+regular-layout.lorax :nth-child(8n + 6),
+regular-layout.lorax :nth-child(8n + 6)::part(tab) {
+ background-color: #a0c4ffff;
}
-regular-layout.lorax :nth-child(8n+7),
-regular-layout.lorax :nth-child(8n+7)::part(tab) {
- background-color: #bdb2ffff;
+regular-layout.lorax :nth-child(8n + 7),
+regular-layout.lorax :nth-child(8n + 7)::part(tab) {
+ background-color: #bdb2ffff;
}
-regular-layout.lorax :nth-child(8n+8),
-regular-layout.lorax :nth-child(8n+8)::part(tab) {
- background-color: #ffc6ffff;
-}
\ No newline at end of file
+regular-layout.lorax :nth-child(8n + 8),
+regular-layout.lorax :nth-child(8n + 8)::part(tab) {
+ background-color: #ffc6ffff;
+}