fix(desk): full icon captions — no ellipsis, no collision

Frappe renders the desktop icon caption as a single nowrap + ellipsis line in a
127px cell, which broke two ways on long (az/ru) module names:

- main desk: .icon-caption is shrink-to-fit, so it grew past its cell and the
  ellipsis never triggered — the label spilled into the neighbouring icon.
- folder modal: our own -webkit-line-clamp:2 + ellipsis cut the label ("…").

Captions now take the full cell width and wrap over as many lines as they need;
the cell grows taller instead of overflowing. Cells widen to 152px above 1060px
(below that the 6-col grid is already at the viewport edge, so the stock width
stays); mobile is untouched. The folder modal card now sizes to its icon grid —
Bootstrap capped the dialog width, so the widened last column hung outside it.

Also carries the in-progress theme rename (modern → silk) in the JS bundle,
CLAUDE.md and az locale.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ali 2026-07-14 10:23:57 +00:00
parent 334f2c5f36
commit dc36d3d46a
12 changed files with 807 additions and 4510 deletions

View File

@ -131,7 +131,7 @@ Idempotent setup run via `after_migrate`.
Bundle entry: `jey_theme/public/js/jey_theme.js`. CSS: `jey_theme/public/css/{shared,theme_chrome,theme_modern}.css`. All four are loaded via `app_include_css` / `app_include_js` in `hooks.py` for both desk and web contexts.
- Theme selector lives in `data-jey-theme` on `<html>`, stored in `localStorage("jey-theme")`. Default: `chrome`. Set before first paint by an IIFE at the top of `jey_theme.js`.
- Themes supported: **chrome** (metallic rings), **modern** (frosted glass). No dark/light variants — each theme is self-contained.
- Themes supported: **chrome** (metallic rings), **silk** (warm ivory & champagne-gold, frosted cards). No dark/light variants — each theme is self-contained.
- Theme-specific CSS MUST be wrapped in `[data-jey-theme="themename"]`. Keyframes MUST be prefixed `jey-<theme>-*` to avoid cross-theme name collisions.
- Shared CSS (checkboxes, icon base sizing, switcher UI, column-resize rules) lives in `shared.css` without theme selectors.

View File

@ -8,293 +8,295 @@ msgstr ""
"Project-Id-Version: Jey Theme VERSION\n"
"Report-Msgid-Bugs-To: info@jeysoft.az\n"
"POT-Creation-Date: 2026-07-02 19:11+0000\n"
"PO-Revision-Date: 2026-07-02 19:18+0000\n"
"PO-Revision-Date: 2026-07-04 16:44+0000\n"
"Last-Translator: <frappe@erpnext-ali>\n"
"Language-Team: Azerbaijani\n"
"Language: az\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Generated-By: Babel 2.16.0\n"
"Language: az\n"
"X-Generator: Poedit 3.4.2\n"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Agricultural Purpose Type"
msgstr ""
msgstr "Kənd Təsərrüfatı Təyinatının Növü"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Amas Employees"
msgstr ""
msgstr "Amas Əməkdaşları"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Asan Login"
msgstr ""
msgstr "Asan Login"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Building construction and simplified tax declaration"
msgstr ""
msgstr "Bina tikintisi və sadələşdirilmiş vergi bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Business Classification"
msgstr ""
msgstr "Biznesin Təsnifatı"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Certificate on non-emergence of tax liability"
msgstr ""
msgstr "Vergi öhdəliyinin yaranmaması haqqında arayış"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Classification code"
msgstr ""
msgstr "Təsnifat kodu"
#: jey_theme/public/js/jey_theme.js:751
msgid "Collapse Sidebar"
msgstr ""
msgstr "Yan Paneli Gizlə"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Declaration of mining tax"
msgstr ""
msgstr "Mədən vergisi bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Declaration of simplified tax"
msgstr ""
msgstr "Sadələşdirilmiş vergi bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Declaration of simplified tax on cash withdrawals"
msgstr ""
msgstr "Nağd pul vəsaitlərinin çıxarılmasına görə sadələşdirilmiş vergi bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Declaration of value added tax"
msgstr ""
msgstr "ƏDV bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Declaration of withholding tax on winnings"
msgstr ""
msgstr "Uduşlardan ödəmə mənbəyində tutulan vergi bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Bank Account"
msgstr ""
msgstr "E-Vergi Bank Hesabı"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Cash Register"
msgstr ""
msgstr "Onlayn Nəzarət-Kassa Aparatı"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Customers"
msgstr ""
msgstr "E-Vergi Müştəriləri"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Item"
msgstr ""
msgstr "E-Vergi Mal/Xidmət növü"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Item Group"
msgstr ""
msgstr "E-Vergi Mal/Xidmət Qrupu"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Object"
msgstr ""
msgstr "E-Vergi Obyekti"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes POS Terminal"
msgstr ""
msgstr "E-Vergi POS Terminalı"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Parties"
msgstr ""
msgstr "E-Vergi Tərəfləri"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Presented Certificate"
msgstr ""
msgstr "Təqdim Edilmiş E-Vergi Sertifikatı"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Purchase"
msgstr ""
msgstr "E-Vergi Satınalması"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Purchase Outbox"
msgstr ""
msgstr "E-Vergi Satınalma Çıxış Qutusu"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Sales"
msgstr ""
msgstr "E-Vergi Satışı"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Sales Outbox"
msgstr ""
msgstr "E-Vergi Satış Çıxış Qutusu"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Settings"
msgstr ""
msgstr "E-Vergi Tənzimləmələri"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Suppliers"
msgstr ""
msgstr "E-Vergi Təchizatçıları"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes Unit"
msgstr ""
msgstr "E-Vergi Vahidi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "E-Taxes VAT Operations"
msgstr ""
msgstr "E-Vergi ƏDV Əməliyyatları"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "EQM Codes"
msgstr ""
msgstr "EQM Kodları"
#. Label of a Desktop Icon
#: jey_theme/desktop_icon/employees.json
msgid "Employees"
msgstr ""
msgstr "Əməkdaşlar"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Excise declaration"
msgstr ""
msgstr "Aksiz bəyannaməsi"
#: jey_theme/public/js/jey_theme.js:751
msgid "Expand Sidebar"
msgstr ""
msgstr "Yan Paneli Genişləndir"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Export declaration"
msgstr ""
msgstr "İxrac bəyannaməsi"
#: jey_theme/public/js/jey_theme.js:691
msgid "Full Width"
msgstr ""
msgstr "Tam En"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Housing construction simplified tax declaration"
msgstr ""
msgstr "Yaşayış Binalarının tikintisi üzrə sadələşdirilmiş vergi bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Income tax return"
msgstr ""
msgstr "Gəlir vergisi bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Income tax return of a private notary"
msgstr ""
msgstr "Xüsusi Notariusun gəlir vergisi bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Land tax declaration"
msgstr ""
msgstr "Torpaq vergisi bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Main type of activity"
msgstr ""
msgstr "Əsas fəaliyyət növü"
#: jey_theme/access_control.py:102
msgid "Not Permitted"
msgstr ""
msgstr "İcazə Verilmir"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Profit tax with special tax regime"
msgstr ""
msgstr "Xüsusi vergi rejimi üzrə mənfəət vergisi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Property tax return"
msgstr ""
msgstr "Əmlak vergisi bəyannaməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Quarterly report on unemployment insurance"
msgstr ""
msgstr "İşsizlikdən sığorta üzrə rüblük hesabat"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "REFERENCE on controlled transactions"
msgstr ""
msgstr "Nəzarət olunan əməliyyatlar barədə arayış"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Real estate simplified tax declaration"
msgstr ""
msgstr "Daşınmaz əmlak üzrə sadələşdirilmiş vergi bəyannaməsi"
#: jey_theme/public/js/jey_theme.js:880 jey_theme/public/js/jey_theme.js:890
msgid "Reload"
msgstr ""
msgstr "Yeniləmək"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Report on collection of state duty"
msgstr ""
msgstr "Dövlət rüsumunun tutulması barədə hesabat"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Road tax 2"
msgstr ""
msgstr "Yol vergisi 2"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Single declaration related to salaried and non-salaried work"
msgstr ""
msgstr "Muzdlu işlə əlaqədar ödənişlər və qeyri-muzdlu fəaliyyətdən gəlirlər üzrə vahid bəyannamə"
#: jey_theme/public/js/jey_theme.js:723 jey_theme/public/js/jey_theme.js:988
msgid "Switch Theme"
msgstr ""
msgstr "Mövzunu Dəyiş"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Tax Article"
msgstr ""
msgstr "Vergi Maddəsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Tax Period Closing Settings"
msgstr ""
msgstr "Vergi Dövrünün Bağlanış Sazlamaları"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Tax Period Closing Wizard"
msgstr ""
msgstr "Vergi Dövrünün Bağlanması Bələdçisi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Tax Year Closing Wizard"
msgstr ""
msgstr "Vergi İlinin Bağlanması Bələdçisi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Tax return withheld at source of payment"
msgstr ""
msgstr "Ödəmə mənbəyində tutulan vergi bəyannaməsi"
#. Label of a Desktop Icon
#. Title of a Workspace Sidebar
@ -302,35 +304,35 @@ msgstr ""
#: jey_theme/desktop_icon/taxes_az.json
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Taxes Az"
msgstr ""
msgstr "Vergilər Az"
#: jey_theme/public/js/jey_theme.js:1036
msgid "Theme: "
msgstr ""
msgstr "Mövzu: "
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "VAT allocation"
msgstr ""
msgstr "ƏDV-nin bölüşdürülməsi"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "VAT calculated on the amount paid to a non-resident"
msgstr ""
msgstr "Qeyri-rezidentə ödənilmiş məbləğdən hesablanan ƏDV"
#: jey_theme/public/js/jey_theme.js:807
msgid "Website"
msgstr ""
msgstr "Veb-sayt"
#. Label of a Workspace Sidebar Item
#: jey_theme/workspace_sidebar/taxes_az.json
msgid "Withholding tax return of foreign subcontractors"
msgstr ""
msgstr "Xarici subpodratçılardan ödəmə mənbəyində tutulan vergi bəyannaməsi"
#: jey_theme/desk_overrides.py:121
msgid "card"
msgstr ""
msgstr "kart"
#: jey_theme/desk_overrides.py:133
msgid "label"
msgstr ""
msgstr "nişan"

View File

@ -1,6 +1,6 @@
/* Bundled theme styles (was 3 raw app_include_css/web_include_css entries).
One hashed bundle -> smaller preload header + auto cache-busting.
Order preserved: shared -> theme_chrome -> theme_modern. */
Order preserved: shared -> theme_chrome -> theme_silk. */
/* ===== shared.css ===== */
/* ==========================================================================
@ -936,7 +936,80 @@ textarea.form-control:focus,
}
/* ==========================================================================
Desktop Modal (module icons picker) caption overflow + clean heading
Desktop Icon captions full label, wrapped, never truncated, never colliding
==========================================================================
Frappe ships the caption as a fixed-height, nowrap + ellipsis line inside a
127px cell, which breaks on long (az/ru) module names two different ways:
main desk .icon-caption is shrink-to-fit, so it grows PAST the cell and
the ellipsis never triggers; the label spills into the neighbouring cell.
folder modal the label wraps but is cut with "…".
Fix: widen the cell, let the caption take the full cell width and wrap over as
many lines as it needs, and let the cell grow taller instead of overflowing.
`:has(> .icon-caption)` keeps the caption-less mini icons inside a folder
thumbnail (rendered with in_folder=true) at their stock size. */
.desktop-icon:has(> .icon-caption) {
display: flex !important;
flex-direction: column !important;
align-items: center !important;
text-align: center !important;
min-width: 0 !important;
height: auto !important;
align-self: start !important;
padding: 13px 6px 12px !important;
}
/* Wider cell = fewer wraps, but only where there is room for it: below ~1060px the
6-column desk grid is already at the edge of the viewport, so keep frappe's width
there and let the caption take an extra line instead. Mobile (< 571px) keeps its
own smaller cell entirely. */
@media (min-width: 571px) {
.desktop-icon:has(> .icon-caption) {
min-height: 126px !important;
}
}
@media (min-width: 1060px) {
.desktop-icon:has(> .icon-caption) {
width: 152px !important;
}
}
.desktop-icon:has(> .icon-caption) > .icon-caption {
width: 100% !important;
max-width: 100% !important;
height: auto !important;
min-height: 35px !important;
justify-content: flex-start !important;
overflow: visible !important;
text-wrap: wrap !important;
white-space: normal !important;
}
.desktop-icon:has(> .icon-caption) .icon-title {
display: block !important;
width: 100% !important;
max-width: 100% !important;
-webkit-line-clamp: none !important;
line-clamp: none !important;
overflow: visible !important;
text-overflow: clip !important;
white-space: normal !important;
text-wrap: balance;
overflow-wrap: break-word !important;
word-break: normal !important;
hyphens: auto;
line-height: 1.25 !important;
}
/* The "remove icon" x is absolutely positioned for the stock 127px cell */
.desktop-icon:has(> .icon-caption) > .hide-button {
left: auto !important;
right: -5px !important;
}
/* ==========================================================================
Desktop Modal (module icons picker) grid room + clean heading
========================================================================== */
/* Give the 4-col icon grid room between cells so captions don't collide */
@ -945,36 +1018,22 @@ textarea.form-control:focus,
padding: 12px 0 !important;
}
/* Each icon: constrain to its grid track and center contents */
#desktop-modal .desktop-icon {
min-width: 0 !important;
display: flex !important;
flex-direction: column !important;
align-items: center !important;
text-align: center !important;
/* Card sizes to its icon grid (Bootstrap caps the dialog at a fixed width, so the
last column used to hang outside the card) and grows with its taller rows */
#desktop-modal {
width: fit-content !important;
max-width: calc(100vw - 40px) !important;
}
/* Caption wraps to 2 lines max, truncates with ellipsis, never overflows column */
#desktop-modal .desktop-icon .icon-caption {
#desktop-modal .modal-content {
width: 100% !important;
max-width: 100% !important;
padding: 0 4px !important;
margin-top: 14px !important;
}
#desktop-modal .desktop-icon .icon-title {
width: 100% !important;
max-width: 100% !important;
display: -webkit-box !important;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden !important;
text-overflow: ellipsis !important;
overflow-wrap: anywhere !important;
word-break: break-word !important;
line-height: 1.25 !important;
white-space: normal !important;
#desktop-modal .modal-body.desktop-modal-body {
width: auto !important;
height: auto !important;
min-width: var(--desktop-modal-width) !important;
min-height: var(--desktop-modal-height) !important;
}
/* Strip the themed gradient/border off the desktop-modal header — title only, no bar */
@ -1129,7 +1188,7 @@ textarea.form-control:focus,
background: linear-gradient(168deg, #f4f4f4 0%, #e0e0e0 45%, #d4d4d4 100%);
}
.jey-theme-preview--modern {
.jey-theme-preview--silk {
border-radius: 16px;
background: rgba(255, 255, 255, 0.4);
backdrop-filter: blur(6px);
@ -1137,7 +1196,7 @@ textarea.form-control:focus,
box-shadow: 0 2px 8px rgba(0,0,0,0.06);
}
.jey-theme-preview--modern .jey-theme-preview-icon {
.jey-theme-preview--silk .jey-theme-preview-icon {
position: absolute;
inset: 22px;
border-radius: 6px;
@ -2424,73 +2483,660 @@ textarea.form-control:focus,
}
}
/* ===== theme_modern.css ===== */
/* ===== theme_silk.css ===== */
/* ==========================================================================
THEME: Modern [data-jey-theme="modern"]
Frosted glass rounded squares with indigo accents.
THEME: Silk [data-jey-theme="silk"]
Warm ivory & champagne-gold. Soft frosted cards, generous rounding,
diffuse shadows. Full-desk skin (see theme_chrome.css for the pattern).
Background: pure CSS silk sheen for now, exposed via --jey-silk-bg so it
can later be swapped for an image with a single edit, e.g.
--jey-silk-bg: url("/assets/jey_theme/images/silk.jpg") center/cover;
========================================================================== */
@keyframes jey-modern-glow {
0%, 100% { opacity: 0.4; }
50% { opacity: 0.7; }
@keyframes jey-silk-glow {
0%, 100% { opacity: 0.35; }
50% { opacity: 0.6; }
}
/* Outer shell — frosted glass rounded square */
[data-jey-theme="modern"] .jey-chrome {
/* ==========================================================================
Palette + CSS Variable Overrides
========================================================================== */
[data-jey-theme="silk"] {
/* --- Silk tokens --- */
--jey-gold: #c39a54;
--jey-gold-deep: #a67f3b;
--jey-gold-soft: #e6d3a8;
--jey-gold-tint: rgba(196, 160, 84, 0.12);
--jey-cream: #f4ecde;
--jey-card: #fbf8f2;
--jey-ink: #453d31;
--jey-ink-soft: #6d6252;
--jey-line: #ebe0cd;
--jey-shadow-card: 0 6px 24px rgba(120, 100, 60, 0.11), 0 1px 4px rgba(120, 100, 60, 0.06);
--jey-shadow-hover: 0 12px 34px rgba(120, 100, 60, 0.16), 0 2px 8px rgba(120, 100, 60, 0.08);
/* Silk background real fabric photo with a soft warm champagne wash on
top so the near-white centre stays tinted and frosted cards separate.
The CSS-gradient fallback below is kept commented for reference. */
--jey-silk-bg:
linear-gradient(135deg, rgba(230, 213, 182, 0.30) 0%, rgba(244, 236, 222, 0.10) 45%, rgba(226, 208, 178, 0.34) 100%),
url("/assets/jey_theme/images/silk-bg.jpg") center center / cover no-repeat;
/* --jey-silk-bg (pure-CSS fallback):
radial-gradient(ellipse 80% 65% at 12% -5%, rgba(255, 255, 255, 0.7) 0%, transparent 55%),
radial-gradient(ellipse 70% 55% at 88% 15%, rgba(246, 236, 216, 0.55) 0%, transparent 50%),
radial-gradient(ellipse 95% 75% at 75% 105%, rgba(230, 213, 182, 0.45) 0%, transparent 55%),
linear-gradient(135deg, #f2e9da 0%, #e9ddc7 45%, #e4d6bc 72%, #eee3d0 100%); */
/* --- Surfaces --- */
--bg-color: #f1e8d8;
--fg-color: #fbf8f2;
--card-bg: #fbf8f2;
--subtle-accent: #f4ecde;
--subtle-fg: #efe6d5;
--fg-hover-color: #f6efe3;
--highlight-color: #f4ecde;
--navbar-bg: transparent;
--modal-bg: #fbf8f2;
--toast-bg: #fbf8f2;
--popover-bg: #fbf8f2;
--control-bg: #fbf8f2;
--control-bg-on-gray: #f1e8d8;
--awesomebar-focus-bg: #ffffff;
--disabled-control-bg: #efe6d5;
--skeleton-bg: #ece1cd;
--surface-menu-bar: #f4ecde;
--surface-white: #fbf8f2;
--surface-gray-1: #f4ecde;
--surface-gray-2: #efe6d5;
--surface-gray-3: #e9dcc6;
--surface-gray-4: #ddceb2;
--surface-modal: #fbf8f2;
--placeholder-color: #b3a58c;
/* --- Sidebar --- */
--sidebar-hover-color: #efe6d5;
--sidebar-active-color: #ffffff;
--sidebar-border-color: transparent;
--divider-color: #e6dcc6;
/* --- Text --- */
--heading-color: #453d31;
--text-color: #5a5040;
--text-neutral: #453d31;
--text-muted: #8a7d68;
--text-light: #a4977f;
--text-dark: #453d31;
--disabled-text-color: #a4977f;
--ink-gray-6: #8a7d68;
--ink-gray-7: #6d6252;
--ink-gray-8: #504733;
--ink-gray-9: #453d31;
/* --- Borders --- */
--border-color: #ebe0cd;
--dark-border-color: #ddceb2;
--table-border-color: #ebe0cd;
--btn-group-border-color: #ddceb2;
--outline-gray-1: #ebe0cd;
--outline-gray-2: #ddceb2;
--outline-gray-modals: #e6dcc6;
/* --- Primary / Buttons --- */
--primary: #c39a54;
--primary-color: #c39a54;
--brand-color: #c39a54;
--btn-primary: #c39a54;
--btn-default-bg: #fbf8f2;
--btn-default-hover-bg: #f1e8d8;
--btn-ghost-hover-bg: #efe6d5;
--border-primary: #c39a54;
/* --- Rounding (silk = soft, generous) --- */
--border-radius: 8px;
--border-radius-sm: 6px;
--border-radius-md: 12px;
--border-radius-lg: 16px;
--border-radius-full: 999px;
/* --- Shadows (soft, diffuse, warm) --- */
--shadow-xs: 0 1px 2px rgba(120, 100, 60, 0.06);
--shadow-sm: 0 2px 6px rgba(120, 100, 60, 0.07);
--shadow-base: 0 3px 10px rgba(120, 100, 60, 0.08);
--shadow-md: 0 4px 16px rgba(120, 100, 60, 0.09);
--shadow-lg: 0 8px 24px rgba(120, 100, 60, 0.11);
--shadow-xl: 0 12px 32px rgba(120, 100, 60, 0.13);
--shadow-2xl: 0 18px 44px rgba(120, 100, 60, 0.16);
--card-shadow: 0 4px 20px rgba(120, 100, 60, 0.08), 0 1px 3px rgba(120, 100, 60, 0.05);
--btn-shadow: 0 1px 2px rgba(120, 100, 60, 0.08);
--modal-shadow: 0 20px 48px rgba(90, 70, 40, 0.22);
--awesomebar-shadow: 0 4px 16px rgba(120, 100, 60, 0.1);
/* --- Focus rings --- */
--focus-default: 0 0 0 3px rgba(196, 160, 84, 0.25);
/* --- Scrollbar --- */
--scrollbar-thumb-color: #d8c8a6;
--scrollbar-track-color: #f1e8d8;
/* --- Checkbox / Switch --- */
--switch-bg: #d8c8a6;
--checkbox-color: #c39a54;
--checkbox-gradient: linear-gradient(180deg, #cfa863 0%, #b98f45 100%);
/* --- Timeline --- */
--timeline-badge-color: #c39a54;
--timeline-badge-bg: #f1e8d8;
/* --- Date picker --- */
--date-active-bg: #c39a54;
--date-active-text: #ffffff;
--date-range-bg: #f1e4cb;
/* --- Progress / Misc --- */
--progress-bar-bg: #c39a54;
}
/* ==========================================================================
Body Silk sheen background
========================================================================== */
[data-jey-theme="silk"] body {
background: var(--jey-silk-bg) !important;
background-attachment: fixed !important;
color: var(--text-color);
}
[data-jey-theme="silk"] .page-container,
[data-jey-theme="silk"] .layout-main-section-wrapper,
[data-jey-theme="silk"] .layout-main-section {
background: transparent !important;
}
/* ==========================================================================
Navbar Light, borderless, blends into silk
========================================================================== */
[data-jey-theme="silk"] .navbar {
background: rgba(251, 248, 242, 0.72) !important;
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid rgba(235, 224, 205, 0.6) !important;
box-shadow: 0 1px 8px rgba(120, 100, 60, 0.05) !important;
}
[data-jey-theme="silk"] .navbar .navbar-nav .nav-link {
color: var(--jey-ink-soft) !important;
}
[data-jey-theme="silk"] .navbar .navbar-nav .nav-link:hover {
color: var(--jey-ink) !important;
background: var(--jey-gold-tint) !important;
border-radius: 10px;
}
/* ==========================================================================
Awesomebar Soft pill slot
========================================================================== */
[data-jey-theme="silk"] .search-bar input,
[data-jey-theme="silk"] .navbar .search-bar .form-control {
background: rgba(255, 255, 255, 0.75) !important;
border: 1px solid var(--jey-line) !important;
box-shadow: inset 0 1px 2px rgba(120, 100, 60, 0.05) !important;
color: var(--jey-ink) !important;
border-radius: 999px !important;
}
[data-jey-theme="silk"] .search-bar input:focus {
background: #ffffff !important;
border-color: var(--jey-gold-soft) !important;
box-shadow: 0 0 0 3px rgba(196, 160, 84, 0.18) !important;
}
[data-jey-theme="silk"] .search-bar .search-icon {
color: var(--jey-gold-deep) !important;
}
/* ==========================================================================
Sidebar Cream panel, rounded white active pill
========================================================================== */
[data-jey-theme="silk"] .body-sidebar-container {
background: rgba(247, 240, 227, 0.6) !important;
border-right: 1px solid rgba(235, 224, 205, 0.7) !important;
box-shadow: none !important;
}
[data-jey-theme="silk"] .body-sidebar-container .body-sidebar,
[data-jey-theme="silk"] .body-sidebar-container .body-sidebar-top,
[data-jey-theme="silk"] .body-sidebar-container .body-sidebar-bottom,
[data-jey-theme="silk"] .body-sidebar-container .body-sidebar-cards {
background: transparent !important;
}
[data-jey-theme="silk"] .body-sidebar .standard-sidebar-item .item-anchor {
border-radius: 12px;
transition: background 0.2s ease, box-shadow 0.2s ease;
}
[data-jey-theme="silk"] .body-sidebar .standard-sidebar-item .item-anchor:hover {
background: rgba(255, 255, 255, 0.55) !important;
}
[data-jey-theme="silk"] .body-sidebar .standard-sidebar-item.active-sidebar .item-anchor,
[data-jey-theme="silk"] .body-sidebar .standard-sidebar-item.selected .item-anchor {
background: #ffffff !important;
box-shadow: 0 2px 10px rgba(120, 100, 60, 0.1) !important;
border-radius: 12px;
}
[data-jey-theme="silk"] .body-sidebar .standard-sidebar-item.active-sidebar .sidebar-item-label,
[data-jey-theme="silk"] .body-sidebar .standard-sidebar-item.selected .sidebar-item-label {
color: var(--jey-ink) !important;
font-weight: 600;
}
[data-jey-theme="silk"] .body-sidebar .sidebar-item-icon,
[data-jey-theme="silk"] .body-sidebar .standard-sidebar-item.active-sidebar .sidebar-item-icon {
color: var(--jey-gold-deep) !important;
}
/* Keep sidebar text neutral gold is reserved for active/icons/accents,
not every anchor (the global `a` gold rule would otherwise bleed here). */
[data-jey-theme="silk"] .body-sidebar-container a,
[data-jey-theme="silk"] .body-sidebar-container .sidebar-item-label,
[data-jey-theme="silk"] .body-sidebar-container .sidebar-item-control {
color: var(--text-color) !important;
}
/* Sidebar header + context menu themed icons */
[data-jey-theme="silk"] .sidebar-header .header-logo .jey-icon,
[data-jey-theme="silk"] .frappe-menu .menu-item-icon .jey-icon {
stroke: var(--jey-gold-deep) !important;
fill: none !important;
stroke-width: 1.7 !important;
stroke-linecap: round !important;
stroke-linejoin: round !important;
}
/* ==========================================================================
Buttons
========================================================================== */
[data-jey-theme="silk"] .btn-primary {
background: linear-gradient(180deg, #cfa863 0%, #bd9146 100%) !important;
color: #fffdf8 !important;
border: 1px solid #b0873f !important;
box-shadow: 0 2px 8px rgba(180, 140, 60, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.25) !important;
text-shadow: 0 -1px 0 rgba(120, 90, 30, 0.2);
border-radius: 10px !important;
transition: box-shadow 0.2s ease, transform 0.1s ease, background 0.2s ease !important;
}
[data-jey-theme="silk"] .btn-primary:hover {
background: linear-gradient(180deg, #d6b170 0%, #c59a4f 100%) !important;
box-shadow: 0 4px 14px rgba(180, 140, 60, 0.32), inset 0 1px 0 rgba(255, 255, 255, 0.3) !important;
}
[data-jey-theme="silk"] .btn-primary:active {
transform: translateY(1px);
box-shadow: 0 1px 4px rgba(180, 140, 60, 0.2), inset 0 2px 4px rgba(120, 90, 30, 0.18) !important;
}
[data-jey-theme="silk"] .btn-default,
[data-jey-theme="silk"] .btn-secondary {
background: rgba(255, 255, 255, 0.85) !important;
border: 1px solid var(--jey-line) !important;
color: var(--jey-ink) !important;
box-shadow: 0 1px 3px rgba(120, 100, 60, 0.06) !important;
border-radius: 10px !important;
transition: background 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease !important;
}
[data-jey-theme="silk"] .btn-default:hover,
[data-jey-theme="silk"] .btn-secondary:hover {
background: #ffffff !important;
border-color: var(--jey-gold-soft) !important;
box-shadow: 0 3px 10px rgba(120, 100, 60, 0.1) !important;
}
[data-jey-theme="silk"] .btn-ghost:hover {
background: var(--jey-gold-tint) !important;
}
/* ==========================================================================
Inputs
========================================================================== */
[data-jey-theme="silk"] input.form-control:not([type="checkbox"]):not([type="radio"]),
[data-jey-theme="silk"] textarea.form-control,
[data-jey-theme="silk"] select.form-control,
[data-jey-theme="silk"] select.input-with-feedback {
background: rgba(255, 255, 255, 0.8) !important;
border: 1px solid var(--jey-line) !important;
color: var(--jey-ink) !important;
box-shadow: inset 0 1px 2px rgba(120, 100, 60, 0.04) !important;
border-radius: 10px !important;
transition: background 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease !important;
}
[data-jey-theme="silk"] input.form-control:not([type="checkbox"]):not([type="radio"]):focus,
[data-jey-theme="silk"] textarea.form-control:focus,
[data-jey-theme="silk"] select.form-control:focus {
background: #ffffff !important;
border-color: var(--jey-gold-soft) !important;
box-shadow: 0 0 0 3px rgba(196, 160, 84, 0.18) !important;
}
[data-jey-theme="silk"] .form-control:disabled,
[data-jey-theme="silk"] .form-control[disabled] {
background: #efe6d5 !important;
color: var(--text-light) !important;
box-shadow: none !important;
}
[data-jey-theme="silk"] .frappe-control .control-label,
[data-jey-theme="silk"] .frappe-control label {
color: var(--jey-ink-soft) !important;
}
/* ==========================================================================
Cards / Widgets Soft frosted panels, generous rounding
========================================================================== */
[data-jey-theme="silk"] .widget,
[data-jey-theme="silk"] .ce-block .links-widget-box,
[data-jey-theme="silk"] .ce-block .number-widget-box,
[data-jey-theme="silk"] .ce-block .chart-widget-box,
[data-jey-theme="silk"] .ce-block .shortcut-widget-box,
[data-jey-theme="silk"] .ce-block .onboarding-widget-box,
[data-jey-theme="silk"] .frappe-card {
/* Frosted glass: the "glassy" read comes from a bright, thin, CONTINUOUS
light rim around the whole perimeter (like light on the edge of a glass
pane) not a top-only highlight. Strong blur + a milky fill keep the
surface even; the silk still whispers through. */
background: linear-gradient(160deg, rgba(255, 255, 255, 0.46) 0%, rgba(255, 252, 245, 0.34) 55%, rgba(252, 246, 236, 0.40) 100%) !important;
backdrop-filter: blur(22px) saturate(1.2);
-webkit-backdrop-filter: blur(22px) saturate(1.2);
border: 1.5px solid rgba(255, 255, 255, 0.9) !important;
box-shadow:
0 14px 34px rgba(74, 57, 35, 0.18),
0 4px 10px rgba(74, 57, 35, 0.10),
inset 0 1px 1px rgba(255, 255, 255, 0.6) !important;
border-radius: 22px !important;
transition: box-shadow 0.25s ease, transform 0.2s ease !important;
}
[data-jey-theme="silk"] .widget.onboarding-widget-box {
background: linear-gradient(160deg, rgba(255, 255, 255, 0.46) 0%, rgba(255, 252, 245, 0.34) 55%, rgba(252, 246, 236, 0.40) 100%) !important;
}
[data-jey-theme="silk"] .ce-block .links-widget-box:hover,
[data-jey-theme="silk"] .ce-block .number-widget-box:hover,
[data-jey-theme="silk"] .ce-block .shortcut-widget-box:hover {
border-color: rgba(255, 255, 255, 1) !important;
box-shadow:
0 22px 48px rgba(74, 57, 35, 0.24),
0 6px 14px rgba(74, 57, 35, 0.13),
inset 0 1px 1px rgba(255, 255, 255, 0.7) !important;
transform: translateY(-3px);
}
/* Widget titles */
[data-jey-theme="silk"] .widget .widget-head .widget-title,
[data-jey-theme="silk"] .widget-group .widget-group-head .widget-group-title {
color: var(--jey-ink) !important;
font-weight: 600;
}
/* Number card — big number in warm ink */
[data-jey-theme="silk"] .number-widget-box .widget-content .number {
color: var(--jey-ink) !important;
}
/* Shortcut icon chips — soft gold */
[data-jey-theme="silk"] .shortcut-widget-box .indicator-pill,
[data-jey-theme="silk"] .widget .shortcut-icon {
color: var(--jey-gold-deep) !important;
}
/* Form page + sections */
[data-jey-theme="silk"] .form-page {
background: rgba(251, 248, 242, 0.9) !important;
border: 1px solid rgba(235, 224, 205, 0.8) !important;
box-shadow: var(--jey-shadow-card) !important;
border-radius: 16px !important;
}
[data-jey-theme="silk"] .form-section .section-head {
color: var(--jey-ink) !important;
border-bottom: 1px solid var(--jey-line) !important;
}
/* ==========================================================================
Charts champagne gold line/area
========================================================================== */
[data-jey-theme="silk"] .chart-container .line-chart-rect,
[data-jey-theme="silk"] .chart-container path.line-graph-path,
[data-jey-theme="silk"] .chart-container path.dataset-path {
stroke: var(--jey-gold) !important;
}
[data-jey-theme="silk"] .chart-container .dataset-circle,
[data-jey-theme="silk"] .chart-container circle.fill {
fill: var(--jey-gold) !important;
stroke: var(--jey-gold) !important;
}
[data-jey-theme="silk"] .chart-container path.region-fill {
fill: rgba(196, 160, 84, 0.12) !important;
stroke: none !important;
}
/* ==========================================================================
Page Head
========================================================================== */
[data-jey-theme="silk"] .page-head {
background: transparent !important;
border-bottom: none !important;
box-shadow: none !important;
}
[data-jey-theme="silk"] .page-head .title-text,
[data-jey-theme="silk"] .page-title .title-text {
color: var(--jey-ink) !important;
}
/* ==========================================================================
List View
========================================================================== */
[data-jey-theme="silk"] .list-row-head {
background: rgba(244, 236, 222, 0.85) !important;
border-bottom: 1px solid var(--jey-line) !important;
box-shadow: none !important;
border-radius: 12px 12px 0 0;
}
[data-jey-theme="silk"] .list-row-container .list-row {
border-bottom: 1px solid rgba(235, 224, 205, 0.7) !important;
}
[data-jey-theme="silk"] .list-row-container:hover {
background: var(--jey-gold-tint) !important;
}
[data-jey-theme="silk"] .layout-side-section {
border-right: 1px solid var(--jey-line) !important;
}
/* ==========================================================================
Modals / Dialogs
========================================================================== */
[data-jey-theme="silk"] .modal-content {
background: #fbf8f2 !important;
border: 1px solid var(--jey-line) !important;
box-shadow: 0 20px 48px rgba(90, 70, 40, 0.22) !important;
border-radius: 18px !important;
}
[data-jey-theme="silk"] .modal-header {
background: transparent !important;
border-bottom: 1px solid var(--jey-line) !important;
}
[data-jey-theme="silk"] .modal-header .modal-title {
color: var(--jey-ink) !important;
}
[data-jey-theme="silk"] .modal-footer {
background: transparent !important;
border-top: 1px solid var(--jey-line) !important;
}
[data-jey-theme="silk"] .modal-backdrop {
background-color: rgba(70, 55, 35, 0.4) !important;
}
/* ==========================================================================
Dropdowns / Popovers
========================================================================== */
[data-jey-theme="silk"] .dropdown-menu,
[data-jey-theme="silk"] .popover {
background: #fbf8f2 !important;
border: 1px solid var(--jey-line) !important;
box-shadow: 0 8px 24px rgba(120, 100, 60, 0.14) !important;
border-radius: 14px !important;
}
[data-jey-theme="silk"] .dropdown-item {
color: var(--jey-ink-soft) !important;
border-radius: 8px;
}
[data-jey-theme="silk"] .dropdown-item:hover,
[data-jey-theme="silk"] .dropdown-item:focus {
background: var(--jey-gold-tint) !important;
color: var(--jey-ink) !important;
}
[data-jey-theme="silk"] .dropdown-divider {
border-top-color: var(--jey-line) !important;
}
/* ==========================================================================
Tabs
========================================================================== */
[data-jey-theme="silk"] .form-tabs .nav-link {
color: var(--jey-ink-soft) !important;
}
[data-jey-theme="silk"] .form-tabs .nav-link:hover {
color: var(--jey-ink) !important;
background: var(--jey-gold-tint) !important;
border-radius: 8px;
}
[data-jey-theme="silk"] .form-tabs .nav-link.active {
color: var(--jey-gold-deep) !important;
}
[data-jey-theme="silk"] .form-tabs .nav-link::after {
background: var(--jey-gold) !important;
}
/* ==========================================================================
Links / Scrollbars
========================================================================== */
[data-jey-theme="silk"] a {
color: var(--jey-gold-deep);
}
[data-jey-theme="silk"] a:hover {
color: #8c6b2c;
}
[data-jey-theme="silk"] ::-webkit-scrollbar {
width: 10px;
height: 10px;
}
[data-jey-theme="silk"] ::-webkit-scrollbar-track {
background: #f1e8d8;
}
[data-jey-theme="silk"] ::-webkit-scrollbar-thumb {
background: #dccba4;
border-radius: 5px;
border: 2px solid #f1e8d8;
}
[data-jey-theme="silk"] ::-webkit-scrollbar-thumb:hover {
background: #cdb885;
}
/* ==========================================================================
Desktop workspace icons frosted glass square, gold icon
========================================================================== */
[data-jey-theme="silk"] .jey-chrome {
width: 72px; height: 72px; border-radius: 22px; position: relative;
background: rgba(255, 255, 255, 0.45);
background: rgba(255, 255, 255, 0.55);
backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.6);
box-shadow: 0 4px 16px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.04), inset 0 1px 0 rgba(255,255,255,0.8);
border: 1px solid rgba(255, 255, 255, 0.7);
box-shadow: 0 4px 16px rgba(120, 100, 60, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.85);
transition: all 0.3s ease;
}
[data-jey-theme="modern"] .desktop-icon:hover .jey-chrome {
box-shadow: 0 8px 24px rgba(0,0,0,0.1), 0 2px 6px rgba(0,0,0,0.06), inset 0 1px 0 rgba(255,255,255,0.9);
[data-jey-theme="silk"] .desktop-icon:hover .jey-chrome {
box-shadow: 0 8px 24px rgba(120, 100, 60, 0.16), inset 0 1px 0 rgba(255, 255, 255, 0.9);
transform: translateY(-2px);
}
/* Hide chrome ring layers */
[data-jey-theme="modern"] .jey-chrome-ring,
[data-jey-theme="modern"] .jey-chrome-gap,
[data-jey-theme="modern"] .jey-chrome-ring-inner {
[data-jey-theme="silk"] .jey-chrome-ring,
[data-jey-theme="silk"] .jey-chrome-gap,
[data-jey-theme="silk"] .jey-chrome-ring-inner {
display: none;
}
/* Face fills rounded square */
[data-jey-theme="modern"] .jey-chrome-face {
[data-jey-theme="silk"] .jey-chrome-face {
position: absolute; inset: 0; border-radius: 22px; overflow: hidden;
background: transparent; box-shadow: none;
display: flex; align-items: center; justify-content: center;
}
/* Bottom glow accent */
[data-jey-theme="modern"] .jey-face-glow {
[data-jey-theme="silk"] .jey-face-glow {
position: absolute; bottom: -4px; left: 16px; right: 16px; height: 20px;
border-radius: 50%;
background: radial-gradient(ellipse, rgba(99, 102, 241, 0.35) 0%, transparent 70%);
animation: jey-modern-glow 4s ease-in-out infinite;
background: radial-gradient(ellipse, rgba(196, 160, 84, 0.4) 0%, transparent 70%);
animation: jey-silk-glow 4s ease-in-out infinite;
pointer-events: none; z-index: 0;
}
/* Top glass highlight */
[data-jey-theme="modern"] .jey-face-reflection {
[data-jey-theme="silk"] .jey-face-reflection {
position: absolute; top: 0; left: 0; right: 0; height: 50%;
border-radius: 22px 22px 0 0;
background: linear-gradient(180deg, rgba(255,255,255,0.5) 0%, transparent 100%);
background: linear-gradient(180deg, rgba(255, 255, 255, 0.55) 0%, transparent 100%);
pointer-events: none; z-index: 1; animation: none;
}
/* Icon — indigo accent */
[data-jey-theme="modern"] .jey-chrome-face .jey-icon {
[data-jey-theme="silk"] .jey-chrome-face .jey-icon {
width: 26px !important; height: 26px !important;
stroke: #4f46e5 !important; fill: none !important;
stroke: #b58f47 !important; fill: none !important;
stroke-width: 1.6 !important; stroke-linecap: round !important; stroke-linejoin: round !important;
filter: drop-shadow(0 1px 2px rgba(79, 70, 229, 0.2)) !important;
filter: drop-shadow(0 1px 2px rgba(180, 140, 60, 0.25)) !important;
position: relative; z-index: 2;
}
/* Rounded square container */
[data-jey-theme="modern"] .icon-container.jey-chrome-done {
[data-jey-theme="silk"] .icon-container.jey-chrome-done {
border-radius: 22px !important;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -6,6 +6,11 @@
(function () {
var DEFAULT_THEME = "chrome";
var saved = localStorage.getItem("jey-theme");
// Back-compat: "modern" was renamed to "silk". Migrate existing users.
if (saved === "modern") {
saved = "silk";
localStorage.setItem("jey-theme", saved);
}
if (!saved) {
saved = DEFAULT_THEME;
localStorage.setItem("jey-theme", saved);
@ -165,9 +170,9 @@
},
/* ============================================================
MODERN minimal geometric icons, visually distinct
SILK minimal geometric icons, visually distinct
============================================================ */
modern: {
silk: {
buying: { paths: '<path d="M6 2L3 6v14a2 2 0 002 2h14a2 2 0 002-2V6l-3-4z"/><line x1="3" y1="6" x2="21" y2="6"/><path d="M16 10a4 4 0 01-8 0"/>' },
selling: { paths: '<line x1="12" y1="20" x2="12" y2="10"/><polyline points="18 14 12 20 6 14"/><line x1="4" y1="4" x2="20" y2="4"/>' },
stock: { paths: '<rect x="2" y="2" width="8" height="8" rx="1"/><rect x="14" y="2" width="8" height="8" rx="1"/><rect x="2" y="14" width="8" height="8" rx="1"/><rect x="14" y="14" width="8" height="8" rx="1"/>' },
@ -214,7 +219,7 @@
var icons = THEME_ICONS[theme] || THEME_ICONS.chrome;
var icon = key && icons[key];
if (icon) return icon;
// fallback to chrome if modern doesn't have the key
// fallback to chrome if silk doesn't have the key
icon = key && THEME_ICONS.chrome[key];
if (icon) return icon;
return icons._fallback || THEME_ICONS.chrome._fallback;
@ -952,9 +957,9 @@
info: "Metallic chrome buttons with animated rings",
},
{
name: "modern",
label: "Modern",
info: "Frosted glass with soft shadows",
name: "silk",
label: "Silk",
info: "Soft silk & champagne gold",
},
];