Strata/strata@edu4rdshl.dev/README.md
Eduard Tolosa 945ad61bf7 feat: light/dark theme support
Add a Theme preference (Automatic / Light / Dark). Automatic follows the
system org.gnome.desktop.interface color-scheme; the dark theme is
unchanged. Light styling lives in light.css, every rule scoped under a
.strata-theme-light class the panel toggles on its root box, loaded into the
St theme context by the extension. St's CSS engine has no custom properties,
so this specificity-based scoped override is how the palette is switched
without generating a stylesheet at runtime; switching is a single class
toggle off the ingest/render hot paths.

Also in this change:
- fix: the keyboard shortcut now hides the panel when it is already open.
  The binding lacked Shell.ActionMode.POPUP, so while the panel's modal grab
  was active the second press was swallowed and toggle() never ran.
- fix: the search placeholder ("Search...") is now legible in the light
  theme; it previously inherited a light-on-dark Shell color.
- pack: bundle light.css via --extra-source (gnome-extensions pack only
  auto-includes stylesheet.css), so packaged installs ship the light theme.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 14:49:08 -05:00

85 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Strata GNOME Shell extension
The GJS front-end for [Strata](../README.md). Renders the panel UI and forwards
clipboard events to [`strata-daemon`](../strata-daemon/README.md) over D-Bus.
> The extension requires `strata-daemon` to be installed and available in
> `$PATH`. See the [main README](../README.md) for install instructions.
> The extension is **pure JavaScript** - no binary is bundled.
>
> **Compatibility:** Only tested on GNOME Shell 50. The `metadata.json`
> declares support for 4550 since the APIs used (`Meta.Selection`,
> `St`, `Gio`, `Adw`) have been stable across that range, but older
> versions are untested. If you try one and it works, open an issue to
> let us know.
## File layout
```
strata@edu4rdshl.dev/
├── extension.js Lifecycle, daemon lookup/supervisor, clipboard ingest
├── prefs.js Preferences window
├── dbus.js Generated D-Bus proxy + interface XML
├── stylesheet.css Panel styles
├── metadata.json GNOME Shell metadata (tested on Shell 50; declares 4550)
├── schemas/ GSettings schema (max history, size caps, shortcut)
└── ui/
├── panel.js Popup panel: pagination, search, scroll-to-load
└── clipboardItem.js Per-item row (text preview or lazy thumbnail)
```
## How it works
1. On enable, `extension.js` checks if the D-Bus name is already owned
(daemon running via systemd). If not, it looks for `strata-daemon` in
`$PATH` and spawns it, auto-respawning on crash with exponential backoff.
2. `Meta.Selection` notifies us of every clipboard change. We read the raw
bytes (allowlisted mimes only, password-manager hint skipped) and ship
them to the daemon via `SubmitItem(s, ay)`.
3. The daemon dedups, stores, indexes, and emits `ItemAdded`.
4. `ui/panel.js` paginates history with `GetHistory`, debounces search with
`SearchHistoryAsync`, and writes back via `St.Clipboard.set_text` or
`Meta.SelectionSourceMemory` (never `spawn`, never `launch_uri`).
## Settings
Open with `gnome-extensions prefs strata@edu4rdshl.dev`:
**History**
- **Max history** (502000 items)
- **Items per page** (20200, rows fetched on open and on each scroll-to-bottom)
- **Maximum text size** (1100 MB, larger items are not stored)
- **Maximum image size** (1100 MB, larger items are not stored)
**Appearance**
- **Theme** (Automatic / Light / Dark; Automatic follows the system light/dark preference)
- **Panel width** (pixels)
- **Panel max height** (pixels, list scrolls past this)
- **Move activated item to top**
- **Panel position** (top-left, top-center, top-right)
**Keyboard**
- **Open Strata** shortcut
**Privacy**
- **App exclusions** (apps whose clipboard is never recorded)
All four history/size limits are pushed to the daemon over D-Bus (`SetConfig`) as soon
as you change them. No restart needed.
## Develop
```sh
# Build daemon + install extension + recompile schemas
make -C .. install-daemon && make -C .. install
# Live-reload logs
journalctl --user -f /usr/bin/gnome-shell | grep -i strata
```
If you only change JS, you can re-`make install` and restart the Shell
(Wayland: log out / in; X11: `Alt+F2`, `r`).
## License
GPL-3.0-or-later.