Rebrand as Playlink with a new sunset theme

- Name: Playlink in the UI, page title, footer, messages and README
  (file names like playlink.db and .playlink-trash are unchanged).
- Theme: plum-black surfaces with a coral-to-pink accent, a soft glow
  behind the page, gradient primary buttons, toggles and progress bars,
  accent focus rings and slim scrollbars.
- New logo (beamed notes on the brand gradient) and a Play/link wordmark.
- Inter variable font, bundled so it works under the strict CSP.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
cdnutterandClaude Opus 5.5 committed 2026-09-30 15:49:21 -07:00
1 parent 30fab3a208
commit c98eb2f41d
23 files changed
+164 -77

No files matched your search

+5 -5
View File
@@ -41,7 +41,7 @@ const (
var nameRe = regexp.MustCompile(`^playlink_backup_(manual|scheduled|action)_\d{4}\.\d{2}\.\d{2}_\d{2}\.\d{2}\.\d{2}(_\d+)?\.zip$`)
var ErrBadName = errors.New("not a playlink backup file name")
var ErrBadName = errors.New("not a Playlink backup file name")
// Settings stored in the settings table.
const (
@@ -341,7 +341,7 @@ func (m *Manager) Stage(ctx context.Context, zipPath string, maxSchema int) erro
}
}
if dbf == nil {
return errors.New("the zip does not contain a playlink database")
return errors.New("the zip does not contain a Playlink database")
}
tmp := filepath.Join(m.dataDir, stagedName+".tmp")
_ = os.Remove(tmp)
@@ -395,14 +395,14 @@ func validate(ctx context.Context, path string, maxSchema int) error {
}
var schema int
if err := db.QueryRowContext(ctx, `SELECT COALESCE(MAX(v), 0) FROM schema_version`).Scan(&schema); err != nil {
return errors.New("the backup is not a playlink database")
return errors.New("the backup is not a Playlink database")
}
if schema < 1 || schema > maxSchema {
return fmt.Errorf("the backup is from a newer version of playlink (schema %d, this version supports up to %d)", schema, maxSchema)
return fmt.Errorf("the backup is from a newer version of Playlink (schema %d, this version supports up to %d)", schema, maxSchema)
}
var n int
if err := db.QueryRowContext(ctx, `SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name IN ('pairs', 'users', 'operations')`).Scan(&n); err != nil || n != 3 {
return errors.New("the backup is not a playlink database")
return errors.New("the backup is not a Playlink database")
}
return nil
}
+1 -1
View File
@@ -626,7 +626,7 @@ func (e *Engine) Undo(ctx context.Context, opID int64) error {
default:
// History can hold operations of features that were removed (tag
// edits, file moves); undoing them as a link would be wrong.
return fmt.Errorf("%q operations can no longer be undone from playlink; their originals stay in the quarantine folder", o.Action)
return fmt.Errorf("%q operations can no longer be undone from Playlink; their originals stay in the quarantine folder", o.Action)
}
l, err := e.loadPair(ctx, o.PairID)
if err != nil {
+1 -1
View File
@@ -345,7 +345,7 @@ func (e *Engine) scan(ctx context.Context, j *Job, pairID int64, trigger string)
}
if ms.symlinks+ss.symlinks > 0 {
warns = append(warns, store.Warning{Title: fmt.Sprintf("Ignored %d symlinks", ms.symlinks+ss.symlinks),
Detail: "playlink never follows or replaces symlinks."})
Detail: "Playlink never follows or replaces symlinks."})
}
if e.prober.Bin == "" {
warns = append(warns, store.Warning{Title: "ffprobe was not found",