@enderfall/ui 0.1.16 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../src/components/Dropdown.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../src/components/Dropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG7E,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,GAAG,eAAe,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,sBAAsB,EAAE,CAAC;CACnC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACnE,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,SAAS,CAAC;IAC/D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,aAAa,GACd,kBAAkB,GAClB,gBAAgB,GAChB,oBAAoB,GACpB,oBAAoB,CAAC;AAgFzB,eAAO,MAAM,QAAQ,GAAI,OAAO,aAAa,4CA0Y5C,CAAC"}
@@ -31,7 +31,9 @@ export const Dropdown = (props) => {
31
31
  return (_jsx("div", { className: "ef-menu-bar", children: props.menus.map((menu) => (_jsxs("div", { className: "ef-menu-group", "data-open": props.menuOpen === menu.id ? "true" : "false", onMouseEnter: () => {
32
32
  cancelScheduledClose();
33
33
  props.onOpenMenu(menu.id);
34
- }, onMouseLeave: scheduleClose, children: [_jsx("button", { className: "ef-menu-button", type: "button", "data-open": props.menuOpen === menu.id ? "true" : "false", children: menu.label }), props.menuOpen === menu.id ? (_jsx("div", { className: "ef-menu-popover", "data-open": "true", onMouseEnter: () => {
34
+ }, onMouseLeave: scheduleClose, children: [_jsx(Button, { className: ["ef-menu-button", "ef-tab", props.menuOpen === menu.id ? "is-active" : ""]
35
+ .filter(Boolean)
36
+ .join(" "), type: "button", variant: "tab", subvariant: "default", "data-open": props.menuOpen === menu.id ? "true" : "false", children: menu.label }), props.menuOpen === menu.id ? (_jsx("div", { className: "ef-menu-popover", "data-open": "true", onMouseEnter: () => {
35
37
  cancelScheduledClose();
36
38
  props.onOpenMenu(menu.id);
37
39
  }, onMouseLeave: scheduleClose, children: menu.content })) : null] }, menu.id))) }));
@@ -1,5 +1,5 @@
1
- import type { ReactNode } from "react";
2
- import { type HeaderMenuItem } from "./Dropdown";
1
+ import { type ReactNode } from "react";
2
+ import type { HeaderMenuItem } from "./Dropdown";
3
3
  type MainHeaderProps = {
4
4
  title?: string;
5
5
  subtitle?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"MainHeader.d.ts","sourceRoot":"","sources":["../../src/components/MainHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAG3D,KAAK,eAAe,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,kFASxB,eAAe,4CA0BjB,CAAC"}
1
+ {"version":3,"file":"MainHeader.d.ts","sourceRoot":"","sources":["../../src/components/MainHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,KAAK,eAAe,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,kFASxB,eAAe,4CA2EjB,CAAC"}
@@ -1,6 +1,29 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Dropdown } from "./Dropdown";
2
+ import { useRef } from "react";
3
+ import { Button } from "./Button";
3
4
  import { Panel } from "./Panel";
4
5
  export const MainHeader = ({ title = "Enderfall", subtitle = "Galaxy tools for creators", logoSrc, menus, menuOpen, onOpenMenu, onCloseMenu, actions, }) => {
5
- return (_jsxs(Panel, { variant: "header", borderWidth: 2, className: "ef-main-header", children: [_jsxs("div", { className: "ef-header-left", children: [_jsxs("div", { className: "ef-brand", children: [logoSrc ? (_jsx("img", { src: logoSrc, alt: title, className: "ef-logo" })) : (_jsx("div", { className: "ef-logo-fallback", children: "E" })), _jsxs("div", { children: [_jsx("div", { className: "ef-brand-name", children: title }), subtitle ? _jsx("div", { className: "ef-tagline", children: subtitle }) : null] })] }), _jsx(Dropdown, { variant: "header", menus: menus, menuOpen: menuOpen, onOpenMenu: onOpenMenu, onCloseMenu: onCloseMenu })] }), _jsx("div", { className: "ef-header-actions", children: actions })] }));
6
+ const closeTimerRef = useRef(null);
7
+ const closeDelayMs = 160;
8
+ const cancelScheduledClose = () => {
9
+ if (closeTimerRef.current !== null) {
10
+ window.clearTimeout(closeTimerRef.current);
11
+ closeTimerRef.current = null;
12
+ }
13
+ };
14
+ const scheduleClose = () => {
15
+ cancelScheduledClose();
16
+ closeTimerRef.current = window.setTimeout(() => {
17
+ onCloseMenu();
18
+ }, closeDelayMs);
19
+ };
20
+ return (_jsxs(Panel, { variant: "header", borderWidth: 2, className: "ef-main-header", children: [_jsxs("div", { className: "ef-header-left", children: [_jsxs("div", { className: "ef-brand", children: [logoSrc ? (_jsx("img", { src: logoSrc, alt: title, className: "ef-logo" })) : (_jsx("div", { className: "ef-logo-fallback", children: "E" })), _jsxs("div", { children: [_jsx("div", { className: "ef-brand-name", children: title }), subtitle ? _jsx("div", { className: "ef-tagline", children: subtitle }) : null] })] }), _jsx("div", { className: "ef-menu-bar", children: menus.map((menu) => (_jsxs("div", { className: "ef-menu-group", "data-open": menuOpen === menu.id ? "true" : "false", onMouseEnter: () => {
21
+ cancelScheduledClose();
22
+ onOpenMenu(menu.id);
23
+ }, onMouseLeave: scheduleClose, children: [_jsx(Button, { className: ["ef-menu-button", "ef-tab", menuOpen === menu.id ? "is-active" : ""]
24
+ .filter(Boolean)
25
+ .join(" "), type: "button", variant: "tab", subvariant: "default", "data-open": menuOpen === menu.id ? "true" : "false", children: menu.label }), menuOpen === menu.id ? (_jsx("div", { className: "ef-menu-popover", "data-open": "true", onMouseEnter: () => {
26
+ cancelScheduledClose();
27
+ onOpenMenu(menu.id);
28
+ }, onMouseLeave: scheduleClose, children: menu.content })) : null] }, menu.id))) })] }), _jsx("div", { className: "ef-header-actions", children: actions })] }));
6
29
  };
@@ -5,7 +5,7 @@ export const Tabs = ({ tabs, activeTab, onChange, orientation = "horizontal", sh
5
5
  const active = tabs.find((tab) => tab.id === activeTab);
6
6
  return (_jsxs("div", { className: ["ef-tabs", isVertical ? "ef-tabs--vertical" : "", className].filter(Boolean).join(" "), children: [_jsx("div", { className: ["ef-tabs-list", isVertical ? "ef-tabs-list--vertical" : ""].filter(Boolean).join(" "), children: tabs.map((tab) => {
7
7
  const isActive = tab.id === activeTab;
8
- return (_jsxs(Button, { variant: isActive ? "primary" : "tab", subvariant: isActive ? "glow" : "default", className: ["ef-tab", isVertical ? "ef-tab--vertical" : "", isActive ? "is-active" : ""]
8
+ return (_jsxs(Button, { variant: "tab", subvariant: "default", className: ["ef-tab", isVertical ? "ef-tab--vertical" : "", isActive ? "is-active" : ""]
9
9
  .filter(Boolean)
10
10
  .join(" "), onClick: () => onChange(tab.id), children: [tab.icon ? _jsx("span", { className: "ef-tab-icon", children: tab.icon }) : null, _jsx("span", { className: "ef-tab-text", children: tab.label }), isVertical && isActive ? _jsx("span", { className: "ef-tab-active-indicator" }) : null] }, tab.id));
11
11
  }) }), (active?.content || renderTabContent) && (_jsx("div", { className: [
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@enderfall/ui",
3
3
  "private": false,
4
- "version": "0.1.16",
4
+ "version": "0.2.4",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -218,7 +218,7 @@ export const Dropdown = (props: DropdownProps) => {
218
218
  onMouseLeave={scheduleClose}
219
219
  >
220
220
  <Button
221
- className={["ef-menu-button", props.menuOpen === menu.id ? "is-active" : ""]
221
+ className={["ef-menu-button", "ef-tab", props.menuOpen === menu.id ? "is-active" : ""]
222
222
  .filter(Boolean)
223
223
  .join(" ")}
224
224
  type="button"
@@ -14,10 +14,45 @@
14
14
  }
15
15
 
16
16
  .ef-menu-button {
17
+ color: var(--ef-nav-text);
18
+ text-decoration: none;
17
19
  font-size: 1rem;
20
+ font-weight: 600;
21
+ transition: color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
18
22
  text-transform: uppercase;
19
- letter-spacing: 0.08em;
20
- padding: 8px 18px;
23
+ letter-spacing: var(--ef-nav-letter-spacing, 0.08em);
24
+ padding: var(--ef-nav-padding-y, 8px) var(--ef-nav-padding-x, 18px);
25
+ border-radius: var(--ef-nav-radius, 8px);
26
+ border: 2px solid transparent;
27
+ background: var(--ef-nav-surface);
28
+ box-shadow: var(--ef-nav-shadow);
29
+ cursor: pointer;
30
+ font-family: inherit;
31
+ display: inline-flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ gap: 8px;
35
+ }
36
+
37
+ .ef-menu-button:hover {
38
+ color: var(--ef-nav-text-hover);
39
+ box-shadow: var(--ef-nav-shadow-hover);
40
+ transform: var(--ef-nav-transform-hover, translateY(-1px));
41
+ }
42
+
43
+ .ef-menu-button:focus-visible {
44
+ color: var(--ef-nav-text-hover);
45
+ box-shadow: var(--ef-nav-shadow-focus);
46
+ transform: var(--ef-nav-transform-hover, translateY(-1px));
47
+ }
48
+
49
+ .ef-menu-button.is-active,
50
+ .ef-menu-button[data-open="true"] {
51
+ background:
52
+ linear-gradient(var(--ef-button-surface), var(--ef-button-surface)) padding-box,
53
+ var(--ef-nav-border) border-box;
54
+ color: var(--ef-nav-text-active);
55
+ box-shadow: var(--ef-nav-shadow-active);
21
56
  }
22
57
 
23
58
  .ef-menu-popover {
@@ -1,6 +1,7 @@
1
- import type { ReactNode } from "react";
2
- import { Dropdown, type HeaderMenuItem } from "./Dropdown";
3
- import { Panel } from "./Panel";
1
+ import { useRef, type ReactNode } from "react";
2
+ import type { HeaderMenuItem } from "./Dropdown";
3
+ import { Button } from "./Button";
4
+ import { Panel } from "./Panel";
4
5
 
5
6
  type MainHeaderProps = {
6
7
  title?: string;
@@ -13,19 +14,36 @@ type MainHeaderProps = {
13
14
  actions?: ReactNode;
14
15
  };
15
16
 
16
- export const MainHeader = ({
17
+ export const MainHeader = ({
17
18
  title = "Enderfall",
18
19
  subtitle = "Galaxy tools for creators",
19
20
  logoSrc,
20
21
  menus,
21
22
  menuOpen,
22
23
  onOpenMenu,
23
- onCloseMenu,
24
- actions,
25
- }: MainHeaderProps) => {
26
- return (
24
+ onCloseMenu,
25
+ actions,
26
+ }: MainHeaderProps) => {
27
+ const closeTimerRef = useRef<number | null>(null);
28
+ const closeDelayMs = 160;
29
+
30
+ const cancelScheduledClose = () => {
31
+ if (closeTimerRef.current !== null) {
32
+ window.clearTimeout(closeTimerRef.current);
33
+ closeTimerRef.current = null;
34
+ }
35
+ };
36
+
37
+ const scheduleClose = () => {
38
+ cancelScheduledClose();
39
+ closeTimerRef.current = window.setTimeout(() => {
40
+ onCloseMenu();
41
+ }, closeDelayMs);
42
+ };
43
+
44
+ return (
27
45
  <Panel variant="header" borderWidth={2} className="ef-main-header">
28
- <div className="ef-header-left">
46
+ <div className="ef-header-left">
29
47
  <div className="ef-brand">
30
48
  {logoSrc ? (
31
49
  <img src={logoSrc} alt={title} className="ef-logo" />
@@ -34,18 +52,50 @@ export const MainHeader = ({
34
52
  )}
35
53
  <div>
36
54
  <div className="ef-brand-name">{title}</div>
37
- {subtitle ? <div className="ef-tagline">{subtitle}</div> : null}
38
- </div>
39
- </div>
40
- <Dropdown
41
- variant="header"
42
- menus={menus}
43
- menuOpen={menuOpen}
44
- onOpenMenu={onOpenMenu}
45
- onCloseMenu={onCloseMenu}
46
- />
47
- </div>
48
- <div className="ef-header-actions">{actions}</div>
49
- </Panel>
50
- );
51
- };
55
+ {subtitle ? <div className="ef-tagline">{subtitle}</div> : null}
56
+ </div>
57
+ </div>
58
+ <div className="ef-menu-bar">
59
+ {menus.map((menu) => (
60
+ <div
61
+ key={menu.id}
62
+ className="ef-menu-group"
63
+ data-open={menuOpen === menu.id ? "true" : "false"}
64
+ onMouseEnter={() => {
65
+ cancelScheduledClose();
66
+ onOpenMenu(menu.id);
67
+ }}
68
+ onMouseLeave={scheduleClose}
69
+ >
70
+ <Button
71
+ className={["ef-menu-button", "ef-tab", menuOpen === menu.id ? "is-active" : ""]
72
+ .filter(Boolean)
73
+ .join(" ")}
74
+ type="button"
75
+ variant="tab"
76
+ subvariant="default"
77
+ data-open={menuOpen === menu.id ? "true" : "false"}
78
+ >
79
+ {menu.label}
80
+ </Button>
81
+ {menuOpen === menu.id ? (
82
+ <div
83
+ className="ef-menu-popover"
84
+ data-open="true"
85
+ onMouseEnter={() => {
86
+ cancelScheduledClose();
87
+ onOpenMenu(menu.id);
88
+ }}
89
+ onMouseLeave={scheduleClose}
90
+ >
91
+ {menu.content}
92
+ </div>
93
+ ) : null}
94
+ </div>
95
+ ))}
96
+ </div>
97
+ </div>
98
+ <div className="ef-header-actions">{actions}</div>
99
+ </Panel>
100
+ );
101
+ };
@@ -5,10 +5,13 @@
5
5
  cursor: pointer;
6
6
  color: var(--text-strong);
7
7
  font-weight: 600;
8
+ position: relative;
8
9
  }
9
10
 
10
11
  .ef-toggle-input {
11
12
  position: absolute;
13
+ top: 0;
14
+ left: 0;
12
15
  opacity: 0;
13
16
  width: 1px;
14
17
  height: 1px;
package/src/theme.css CHANGED
@@ -1,443 +1,13 @@
1
- :root {
2
- color-scheme: dark;
3
- --ef-surface: #0b0c1a;
4
- --ef-surface-soft: rgba(10, 13, 22, 0.78);
5
- --ef-control-radius: 12px;
6
- --ef-border-gradient: linear-gradient(135deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
7
- --ef-border-gradient-reverse: linear-gradient(315deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
8
- --ef-border-gradient-soft: linear-gradient(
9
- 135deg,
10
- rgba(0, 229, 255, 0.6),
11
- rgba(124, 77, 255, 0.6),
12
- rgba(255, 77, 210, 0.6),
13
- rgba(255, 183, 77, 0.6)
14
- );
15
- --ef-button-surface: var(--ef-surface);
16
- --ef-button-border: var(--ef-border-gradient);
17
- --ef-button-border-soft: var(--ef-border-gradient-soft);
18
- --ef-button-text: var(--text-strong);
19
- --ef-button-glow-shadow: 0 0 24px rgba(124, 77, 255, 0.45);
20
- --ef-button-locked-bg: rgba(15, 18, 28, 0.7);
21
- --ef-button-locked-border: rgba(255, 255, 255, 0.15);
22
- --ef-button-locked-text: rgba(255, 255, 255, 0.7);
23
- --ef-button-danger-border: linear-gradient(135deg, rgba(255, 92, 92, 0.8), rgba(255, 170, 170, 0.7));
24
- --ef-button-danger-text: #ffd6d6;
25
- --ef-button-warning-border: linear-gradient(135deg, rgba(255, 183, 77, 0.85), rgba(255, 221, 128, 0.7));
26
- --ef-button-warning-text: #2b1a00;
27
- --ef-button-info-border: linear-gradient(135deg, rgba(0, 229, 255, 0.7), rgba(124, 220, 255, 0.7));
28
- --ef-button-info-text: #021823;
29
- --ef-button-success-border: linear-gradient(135deg, rgba(76, 255, 200, 0.7), rgba(140, 255, 220, 0.7));
30
- --ef-button-success-text: #041a10;
31
- --ef-nav-text: rgba(238, 241, 246, 0.75);
32
- --ef-nav-text-hover: #eef1f6;
33
- --ef-nav-text-active: #f6f5ff;
34
- --ef-nav-surface: rgba(15, 18, 28, 0.7);
35
- --ef-nav-border: linear-gradient(135deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
36
- --ef-nav-shadow: none;
37
- --ef-nav-shadow-hover: 0 0 18px rgba(124, 77, 255, 0.35);
38
- --ef-nav-shadow-focus: 0 0 20px rgba(124, 77, 255, 0.45);
39
- --ef-nav-shadow-active: 0 0 24px rgba(124, 77, 255, 0.6);
40
- --ef-nav-radius: 8px;
41
- --ef-nav-padding-y: 8px;
42
- --ef-nav-padding-x: 18px;
43
- --ef-nav-letter-spacing: 0.08em;
44
- --ef-nav-transform-hover: translateY(-1px);
45
- --ef-menu-item-shadow: 0 0 16px rgba(124, 77, 255, 0.25);
46
- --ef-menu-item-shadow-hover: 0 0 18px rgba(124, 77, 255, 0.35);
47
- --ef-tabs-surface: #0b0c1a;
48
- --ef-tabs-border: linear-gradient(135deg, rgba(0, 229, 255, 0.5), rgba(124, 77, 255, 0.5), rgba(255, 77, 210, 0.5));
49
- --ef-tabs-content-surface: #0b0c1a;
50
- --ef-tabs-content-border: linear-gradient(135deg, rgba(0, 229, 255, 0.35), rgba(124, 77, 255, 0.35), rgba(255, 77, 210, 0.35));
51
- --ef-tabs-indicator: linear-gradient(180deg, #00e5ff, #7c4dff, #ff4dd2);
52
- --ef-slider-surface: var(--ef-surface);
53
- --ef-slider-border-color: var(--line-strong);
54
- --ef-slider-track-radius: 6px;
55
- --ef-slider-thumb-radius: 6px;
56
- --ef-slider-thumb-clip: inset(0);
57
- --ef-slider-thumb-mask: none;
58
- --ef-toggle-track-radius: 6px;
59
- --ef-toggle-thumb-radius: 6px;
60
- --ef-toggle-box-radius: 6px;
61
- --ef-toggle-check-radius: 2px;
62
- --ef-toggle-check-bg: var(--ef-slider-border-color);
63
- --ef-field-label: rgba(255, 255, 255, 0.7);
64
- --ef-field-required: rgba(255, 183, 77, 0.95);
65
- --ef-field-helper: rgba(255, 255, 255, 0.6);
66
- --ef-field-error: #ff8a8a;
67
- --ef-input-surface: #0b0c1a;
68
- --ef-input-border: var(--ef-border-gradient);
69
- --ef-input-text: #eef1f6;
70
- --ef-input-placeholder: rgba(246, 245, 255, 0.45);
71
- --ef-input-focus: rgba(124, 77, 255, 0.55);
72
- --ef-input-shadow: 0 0 0 2px rgba(124, 77, 255, 0.2);
73
- --ef-stacked-card-bg: rgba(10, 12, 22, 0.92);
74
- --ef-stacked-card-shadow: 0 14px 35px rgba(10, 12, 24, 0.6);
75
- --ef-stacked-card-shadow-hover: 0 20px 45px rgba(10, 12, 24, 0.7);
76
- --ef-stacked-frame-shadow: 0 18px 40px rgba(10, 12, 24, 0.55);
77
- --ef-stacked-tag-bg: rgba(15, 18, 28, 0.7);
78
- --ef-stacked-tag-text: rgba(238, 241, 246, 0.75);
79
- --ef-stacked-body-muted: rgba(255, 255, 255, 0.7);
80
- --ef-stacked-action-shadow: 0 0 24px rgba(124, 77, 255, 0.45);
81
- --ef-stacked-image-gradient: linear-gradient(
82
- 135deg,
83
- rgba(0, 229, 255, 0.35),
84
- rgba(124, 77, 255, 0.35),
85
- rgba(255, 77, 210, 0.25)
86
- );
87
- --text-strong: #f6f5ff;
88
- --text-soft: rgba(238, 241, 246, 0.75);
89
- --text-muted: rgba(247, 248, 251, 0.6);
90
- --card: rgba(10, 13, 22, 0.78);
91
- --card-border: rgba(124, 77, 255, 0.4);
92
- --accent: #7c4dff;
93
- --accent-bright: #00e5ff;
94
- --accent-warm: #ff4dd2;
95
- --accent-gold: #ffb74d;
96
- --shadow: 0 24px 60px rgba(0, 0, 0, 0.35);
97
- --font-main: "Inter", "Segoe UI", Arial, sans-serif;
98
- --text: var(--text-strong);
99
- --muted: var(--text-muted);
100
- --line: var(--card-border);
101
- --bg: #0b0f15;
102
- --bg-soft: #141b26;
103
- --accent-dark: #5e35ff;
104
- --accent-alt: var(--accent-gold);
105
- --accent-soft: rgba(255, 183, 77, 0.18);
106
- --danger: #e06c6c;
107
- --radius: 18px;
108
- --row-odd: rgba(10, 13, 22, 0.9);
109
- --scrollbar-track: rgba(255, 255, 255, 0.12);
110
- --bg-glow: rgba(124, 77, 255, 0.18);
111
- --panel: var(--card);
112
- --panel-2: rgba(12, 16, 26, 0.9);
113
- --ink: var(--text-strong);
114
- --line-strong: var(--accent);
115
- --accent-2: var(--accent-gold);
116
- --frame-bg: linear-gradient(180deg, #0b0c1a 0%, #0a0d16 100%);
117
- --bio-bg: linear-gradient(180deg, #0e101c, #0b0f15 85%);
118
- --section-bg: linear-gradient(180deg, rgba(15, 18, 28, 0.92), rgba(12, 16, 24, 0.95));
119
- --note-bg: rgba(10, 13, 22, 0.6);
120
- --portrait-bg: #0c1322;
121
- --chip-bg: rgba(12, 16, 26, 0.8);
122
- --placeholder-bg:
123
- linear-gradient(135deg, rgba(28, 38, 64, 0.9), rgba(12, 18, 32, 0.95)),
124
- repeating-linear-gradient(0deg, rgba(255, 255, 255, 0.05) 0px, rgba(255, 255, 255, 0.05) 1px, transparent 1px, transparent 8px);
125
- --placeholder-ink: #dde6f2;
126
- --menu-card: var(--card);
127
- --menu-line: var(--card-border);
128
- --menu-shadow: var(--shadow);
129
- --menu-bg-soft: rgba(124, 77, 255, 0.12);
130
- --menu-radius: 18px;
131
- --menu-muted: var(--text-muted);
132
- }
133
-
134
- :root[data-theme="light"],
135
- :root[data-theme="plain-light"] {
136
- color-scheme: light;
137
- --ef-control-radius: 12px;
138
- --ef-surface: #ffffff;
139
- --ef-surface-soft: rgba(255, 255, 255, 0.92);
140
- --ef-border-gradient: linear-gradient(135deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
141
- --ef-border-gradient-reverse: linear-gradient(315deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
142
- --ef-border-gradient-soft: linear-gradient(
143
- 135deg,
144
- rgba(0, 229, 255, 0.6),
145
- rgba(124, 77, 255, 0.6),
146
- rgba(255, 77, 210, 0.6),
147
- rgba(255, 183, 77, 0.6)
148
- );
149
- --ef-button-text: #1d232a;
150
- --ef-button-glow-shadow: 0 0 20px rgba(124, 77, 255, 0.32);
151
- --ef-button-locked-bg: rgba(255, 255, 255, 0.8);
152
- --ef-button-locked-border: rgba(24, 32, 40, 0.18);
153
- --ef-button-locked-text: rgba(24, 32, 40, 0.6);
154
- --ef-button-danger-border: linear-gradient(135deg, rgba(200, 76, 76, 0.7), rgba(255, 138, 138, 0.65));
155
- --ef-button-danger-text: #5a0f0f;
156
- --ef-button-warning-border: linear-gradient(135deg, rgba(242, 159, 69, 0.75), rgba(255, 210, 128, 0.7));
157
- --ef-button-warning-text: #4a2c00;
158
- --ef-button-info-border: linear-gradient(135deg, rgba(0, 180, 210, 0.6), rgba(124, 180, 255, 0.6));
159
- --ef-button-info-text: #0b2a3a;
160
- --ef-button-success-border: linear-gradient(135deg, rgba(46, 170, 130, 0.65), rgba(130, 220, 180, 0.65));
161
- --ef-button-success-text: #0b2b1d;
162
- --ef-nav-text: rgba(29, 35, 42, 0.8);
163
- --ef-nav-text-hover: #1d232a;
164
- --ef-nav-text-active: #1d232a;
165
- --ef-nav-surface: rgba(255, 255, 255, 0.72);
166
- --ef-nav-border: var(--ef-border-gradient);
167
- --ef-nav-shadow: none;
168
- --ef-nav-shadow-hover: 0 0 16px rgba(31, 122, 140, 0.2);
169
- --ef-nav-shadow-focus: 0 0 20px rgba(31, 122, 140, 0.24);
170
- --ef-nav-shadow-active: 0 0 20px rgba(31, 122, 140, 0.26);
171
- --ef-menu-item-shadow: 0 0 10px rgba(31, 122, 140, 0.12);
172
- --ef-menu-item-shadow-hover: 0 0 14px rgba(31, 122, 140, 0.18);
173
- --ef-tabs-surface: #ffffff;
174
- --ef-tabs-border: linear-gradient(135deg, rgba(0, 229, 255, 0.35), rgba(124, 77, 255, 0.35), rgba(255, 77, 210, 0.35));
175
- --ef-tabs-content-surface: #ffffff;
176
- --ef-tabs-content-border: linear-gradient(135deg, rgba(0, 229, 255, 0.2), rgba(124, 77, 255, 0.2), rgba(255, 77, 210, 0.2));
177
- --ef-tabs-indicator: linear-gradient(180deg, #1f7a8c, #7c4dff, #f29f45);
178
- --ef-slider-surface: var(--ef-surface);
179
- --ef-slider-border-color: var(--line-strong);
180
- --ef-slider-track-radius: 6px;
181
- --ef-slider-thumb-radius: 6px;
182
- --ef-slider-thumb-clip: inset(0);
183
- --ef-slider-thumb-mask: none;
184
- --ef-toggle-track-radius: 6px;
185
- --ef-toggle-thumb-radius: 6px;
186
- --ef-toggle-box-radius: 6px;
187
- --ef-toggle-check-radius: 2px;
188
- --ef-toggle-check-bg: var(--ef-slider-border-color);
189
- --ef-field-label: rgba(29, 35, 42, 0.7);
190
- --ef-field-required: rgba(242, 159, 69, 0.9);
191
- --ef-field-helper: rgba(29, 35, 42, 0.6);
192
- --ef-field-error: #b83a3a;
193
- --ef-input-surface: #ffffff;
194
- --ef-input-border: var(--ef-border-gradient);
195
- --ef-input-text: #1d232a;
196
- --ef-input-placeholder: rgba(29, 35, 42, 0.45);
197
- --ef-input-focus: rgba(31, 122, 140, 0.3);
198
- --ef-input-shadow: 0 0 0 2px rgba(31, 122, 140, 0.14);
199
- --ef-field-label: rgba(29, 35, 42, 0.7);
200
- --ef-field-helper: rgba(29, 35, 42, 0.55);
201
- --ef-field-error: #b34a4a;
202
- --ef-stacked-card-bg: rgba(10, 12, 22, 0.92);
203
- --ef-stacked-card-shadow: 0 14px 35px rgba(10, 12, 24, 0.6);
204
- --ef-stacked-card-shadow-hover: 0 20px 45px rgba(10, 12, 24, 0.7);
205
- --ef-stacked-frame-shadow: 0 18px 40px rgba(10, 12, 24, 0.55);
206
- --ef-stacked-tag-bg: rgba(15, 18, 28, 0.7);
207
- --ef-stacked-tag-text: rgba(238, 241, 246, 0.75);
208
- --ef-stacked-body-muted: rgba(255, 255, 255, 0.7);
209
- --ef-stacked-action-shadow: 0 0 24px rgba(124, 77, 255, 0.45);
210
- --ef-stacked-image-gradient: linear-gradient(
211
- 135deg,
212
- rgba(0, 229, 255, 0.35),
213
- rgba(124, 77, 255, 0.35),
214
- rgba(255, 77, 210, 0.25)
215
- );
216
- --text-strong: #1d232a;
217
- --text-soft: rgba(29, 35, 42, 0.75);
218
- --text-muted: rgba(29, 35, 42, 0.6);
219
- --card: rgba(255, 255, 255, 0.9);
220
- --card-border: rgba(24, 32, 40, 0.12);
221
- --shadow: 0 20px 50px rgba(24, 32, 40, 0.12);
222
- --text: var(--text-strong);
223
- --muted: var(--text-muted);
224
- --line: rgba(24, 32, 40, 0.18);
225
- --bg: #f4f1ea;
226
- --bg-soft: #fbf7f0;
227
- --accent-dark: #1f7a8c;
228
- --accent-alt: #f29f45;
229
- --accent-soft: rgba(242, 159, 69, 0.18);
230
- --danger: #c84c4c;
231
- --row-odd: rgba(255, 255, 255, 0.95);
232
- --scrollbar-track: rgba(24, 32, 40, 0.08);
233
- --bg-glow: rgba(31, 122, 140, 0.16);
234
- --panel: var(--card);
235
- --panel-2: rgba(255, 255, 255, 0.94);
236
- --ink: var(--text-strong);
237
- --line-strong: var(--accent);
238
- --accent-2: var(--accent-alt);
239
- --frame-bg: linear-gradient(180deg, #ffffff 0%, #f6ede1 100%);
240
- --bio-bg: linear-gradient(180deg, #ffffff, #f9f6f0 85%);
241
- --section-bg: linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(249, 246, 240, 0.96));
242
- --note-bg: rgba(255, 255, 255, 0.8);
243
- --portrait-bg: #e7ecf2;
244
- --chip-bg: rgba(255, 255, 255, 0.9);
245
- --placeholder-bg:
246
- linear-gradient(135deg, rgba(210, 225, 245, 0.9), rgba(240, 244, 248, 0.95)),
247
- repeating-linear-gradient(0deg, rgba(0, 0, 0, 0.04) 0px, rgba(0, 0, 0, 0.04) 1px, transparent 1px, transparent 8px);
248
- --placeholder-ink: #2b3440;
249
- --menu-card: rgba(255, 255, 255, 0.88);
250
- --menu-line: rgba(24, 32, 40, 0.12);
251
- --menu-shadow: 0 16px 40px rgba(23, 28, 33, 0.12);
252
- --menu-bg-soft: #f9f6f0;
253
- --menu-radius: 18px;
254
- --menu-muted: var(--text-muted);
255
- }
1
+ /*
2
+ Theme runtime layer.
3
+ All design tokens and theme variables live in `variables.css`.
4
+ Keep this file lightweight for future runtime/theme-state utilities.
5
+ */
256
6
 
257
- :root[data-theme="plain-light"] {
258
- --ef-border-gradient: linear-gradient(135deg, var(--line), var(--line));
259
- --ef-border-gradient-reverse: linear-gradient(315deg, var(--line), var(--line));
260
- --ef-border-gradient-soft: linear-gradient(
261
- 135deg,
262
- rgba(24, 32, 40, 0.18),
263
- rgba(24, 32, 40, 0.18)
264
- );
265
- --ef-button-border: var(--ef-border-gradient);
266
- --ef-button-border-soft: var(--ef-border-gradient-soft);
267
- --ef-input-border: var(--ef-border-gradient);
268
- --ef-stacked-image-gradient: linear-gradient(135deg, rgba(24, 32, 40, 0.08), rgba(24, 32, 40, 0.15));
269
- --ef-nav-border: var(--ef-border-gradient);
270
- --ef-nav-shadow-hover: 0 0 0 1px rgba(24, 32, 40, 0.2);
271
- --ef-nav-shadow-focus: 0 0 0 2px rgba(24, 32, 40, 0.22);
272
- --ef-nav-shadow-active: 0 0 0 1px rgba(24, 32, 40, 0.3);
273
- --ef-menu-item-shadow: none;
274
- --ef-menu-item-shadow-hover: 0 0 0 1px rgba(24, 32, 40, 0.2);
275
- }
7
+ @import "./variables.css";
276
8
 
277
- :root[data-theme="plain-dark"] {
278
- color-scheme: dark;
279
- --card-border: rgba(255, 255, 255, 0.16);
280
- --line: rgba(255, 255, 255, 0.2);
281
- --line-strong: rgba(255, 255, 255, 0.35);
282
- --ef-border-gradient: linear-gradient(135deg, var(--line-strong), var(--line-strong));
283
- --ef-border-gradient-reverse: linear-gradient(315deg, var(--line-strong), var(--line-strong));
284
- --ef-border-gradient-soft: linear-gradient(
285
- 135deg,
286
- rgba(255, 255, 255, 0.18),
287
- rgba(255, 255, 255, 0.18)
288
- );
289
- --ef-button-border: var(--ef-border-gradient);
290
- --ef-button-border-soft: var(--ef-border-gradient-soft);
291
- --ef-input-border: var(--ef-border-gradient);
292
- --menu-line: var(--line);
293
- --menu-bg-soft: rgba(255, 255, 255, 0.06);
294
- --ef-stacked-image-gradient: linear-gradient(135deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.12));
295
- --ef-nav-text: rgba(246, 245, 255, 0.8);
296
- --ef-nav-text-hover: #f6f5ff;
297
- --ef-nav-text-active: #f6f5ff;
298
- --ef-nav-surface: rgba(15, 18, 28, 0.7);
299
- --ef-nav-border: var(--ef-border-gradient);
300
- --ef-nav-shadow-hover: 0 0 0 1px rgba(255, 255, 255, 0.2);
301
- --ef-nav-shadow-focus: 0 0 0 2px rgba(255, 255, 255, 0.24);
302
- --ef-nav-shadow-active: 0 0 0 1px rgba(255, 255, 255, 0.3);
303
- --ef-menu-item-shadow: none;
304
- --ef-menu-item-shadow-hover: 0 0 0 1px rgba(255, 255, 255, 0.2);
9
+ /* Theme opt-in hook for app-level custom styling. */
10
+ [data-theme] {
11
+ color: var(--text-strong);
305
12
  }
306
13
 
307
-
308
-
309
- :root[data-theme="atelier"] {
310
- color-scheme: dark;
311
- --ef-control-radius: 0px;
312
- --ef-surface: #1b0b18;
313
- --ef-surface-soft: rgba(27, 11, 24, 0.92);
314
- --ef-border-gradient: linear-gradient(135deg, #ff86c8, #e255a1, #7dd6f6);
315
- --ef-border-gradient-reverse: linear-gradient(315deg, #ff86c8, #e255a1, #7dd6f6);
316
- --ef-border-gradient-soft: linear-gradient(
317
- 135deg,
318
- rgba(255, 134, 200, 0.5),
319
- rgba(226, 85, 161, 0.5),
320
- rgba(125, 214, 246, 0.5)
321
- );
322
- --ef-slider-surface: var(--ef-surface);
323
- --ef-slider-border-color: var(--line-strong);
324
- --ef-slider-track-radius: 0px;
325
- --ef-slider-thumb-radius: 0px;
326
- --ef-slider-thumb-clip: inset(0);
327
- --ef-slider-thumb-mask: none;
328
- --ef-toggle-track-radius: 0px;
329
- --ef-toggle-thumb-radius: 0px;
330
- --ef-toggle-box-radius: 0px;
331
- --ef-toggle-check-radius: 0px;
332
- --ef-toggle-check-bg: var(--ef-slider-border-color);
333
- --ef-button-surface: var(--ef-surface);
334
- --ef-button-border: var(--ef-border-gradient);
335
- --ef-button-border-soft: var(--ef-border-gradient-soft);
336
- --ef-button-text: #f6eaf2;
337
- --ef-button-glow-shadow: 0 0 24px rgba(226, 85, 161, 0.42);
338
- --ef-nav-text: rgba(246, 234, 242, 0.78);
339
- --ef-nav-text-hover: #f6eaf2;
340
- --ef-nav-text-active: #f6eaf2;
341
- --ef-nav-surface: rgba(27, 11, 24, 0.74);
342
- --ef-nav-border: var(--ef-border-gradient);
343
- --ef-nav-shadow: none;
344
- --ef-nav-shadow-hover: 0 0 16px rgba(226, 85, 161, 0.28);
345
- --ef-nav-shadow-focus: 0 0 20px rgba(226, 85, 161, 0.34);
346
- --ef-nav-shadow-active: 0 0 22px rgba(226, 85, 161, 0.42);
347
- --ef-menu-item-shadow: 0 0 14px rgba(226, 85, 161, 0.2);
348
- --ef-menu-item-shadow-hover: 0 0 18px rgba(226, 85, 161, 0.3);
349
- --ef-tabs-surface: #1b0b18;
350
- --ef-tabs-border: linear-gradient(135deg, rgba(255, 134, 200, 0.45), rgba(226, 85, 161, 0.45), rgba(125, 214, 246, 0.45));
351
- --ef-tabs-content-surface: #1b0b18;
352
- --ef-tabs-content-border: linear-gradient(135deg, rgba(255, 134, 200, 0.3), rgba(226, 85, 161, 0.3), rgba(125, 214, 246, 0.3));
353
- --ef-tabs-indicator: linear-gradient(180deg, #ff86c8, #e255a1, #7dd6f6);
354
- --ef-input-surface: #1b0b18;
355
- --ef-input-border: var(--ef-border-gradient);
356
- --ef-input-text: #f6eaf2;
357
- --ef-input-placeholder: rgba(246, 234, 242, 0.6);
358
- --ef-input-focus: rgba(226, 85, 161, 0.45);
359
- --ef-input-shadow: 0 0 0 2px rgba(226, 85, 161, 0.2);
360
- --text-strong: #f6eaf2;
361
- --text-soft: rgba(246, 234, 242, 0.8);
362
- --text-muted: #dbc7d7;
363
- --card: #1b0b18;
364
- --card-border: rgba(192, 59, 132, 0.6);
365
- --accent: #ff86c8;
366
- --accent-bright: #7dd6f6;
367
- --accent-warm: #e255a1;
368
- --accent-gold: #ff86c8;
369
- --shadow: rgba(0, 0, 0, 0.6);
370
- --text: #f6eaf2;
371
- --muted: #dbc7d7;
372
- --line: #c03b84;
373
- --bg: #130810;
374
- --bg-soft: #241028;
375
- --accent-dark: #c03b84;
376
- --accent-alt: #7dd6f6;
377
- --accent-soft: rgba(255, 134, 200, 0.18);
378
- --danger: #e06c6c;
379
- --radius: 18px;
380
- --row-odd: rgba(27, 11, 24, 0.85);
381
- --scrollbar-track: rgba(255, 255, 255, 0.08);
382
- --bg-glow: #2a0f21;
383
- --panel: #1b0b18;
384
- --panel-2: #241028;
385
- --ink: #f6eaf2;
386
- --line-strong: #e255a1;
387
- --accent-2: #7dd6f6;
388
- --frame-bg: linear-gradient(180deg, #220b1a 0%, #12070f 100%);
389
- --bio-bg: linear-gradient(180deg, #1a0b1b, #12070f 85%);
390
- --section-bg: linear-gradient(180deg, rgba(35, 14, 32, 0.94), rgba(20, 9, 18, 0.95));
391
- --note-bg: rgba(16, 7, 14, 0.6);
392
- --portrait-bg: #131a2c;
393
- --chip-bg: rgba(17, 9, 20, 0.8);
394
- --placeholder-bg:
395
- linear-gradient(135deg, rgba(60, 78, 108, 0.9), rgba(20, 30, 50, 0.95)),
396
- repeating-linear-gradient(
397
- 0deg,
398
- rgba(255, 255, 255, 0.06) 0px,
399
- rgba(255, 255, 255, 0.06) 1px,
400
- transparent 1px,
401
- transparent 8px
402
- );
403
- --placeholder-ink: #dde6f2;
404
- --menu-card: #1b0b18;
405
- --menu-line: rgba(192, 59, 132, 0.5);
406
- --menu-shadow: 0 16px 40px rgba(0, 0, 0, 0.5);
407
- --menu-bg-soft: rgba(255, 134, 200, 0.12);
408
- --menu-radius: 18px;
409
- --menu-muted: #dbc7d7;
410
- }
411
-
412
- :root[data-theme="galaxy"] {
413
- --ef-slider-track-radius: 6px;
414
- --ef-slider-thumb-radius: 6px;
415
- --ef-slider-thumb-clip: inset(0);
416
- --ef-slider-thumb-mask: none;
417
- --ef-toggle-track-radius: 6px;
418
- --ef-toggle-thumb-radius: 6px;
419
- --ef-toggle-box-radius: 6px;
420
- --ef-toggle-check-radius: 2px;
421
- }
422
-
423
- :root[data-theme="system"] {
424
- color-scheme: light dark;
425
- }
426
-
427
- @media (prefers-color-scheme: light) {
428
- :root[data-theme="system"] {
429
- --ef-nav-text: rgba(29, 35, 42, 0.8);
430
- --ef-nav-text-hover: #1d232a;
431
- --ef-nav-text-active: #1d232a;
432
- --ef-nav-surface: rgba(255, 255, 255, 0.72);
433
- --ef-nav-shadow: none;
434
- --ef-nav-shadow-hover: 0 0 16px rgba(31, 122, 140, 0.2);
435
- --ef-nav-shadow-focus: 0 0 20px rgba(31, 122, 140, 0.24);
436
- --ef-nav-shadow-active: 0 0 20px rgba(31, 122, 140, 0.26);
437
- --ef-menu-item-shadow: 0 0 10px rgba(31, 122, 140, 0.12);
438
- --ef-menu-item-shadow-hover: 0 0 14px rgba(31, 122, 140, 0.18);
439
- --ef-tabs-surface: #ffffff;
440
- --ef-tabs-content-surface: #ffffff;
441
- }
442
- }
443
-
@@ -0,0 +1,479 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --ef-surface: #0b0c1a;
4
+ --ef-surface-soft: rgba(10, 13, 22, 0.78);
5
+ --ef-control-radius: 12px;
6
+ --ef-border-gradient: linear-gradient(135deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
7
+ --ef-border-gradient-reverse: linear-gradient(315deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
8
+ --ef-border-gradient-soft: linear-gradient(
9
+ 135deg,
10
+ rgba(0, 229, 255, 0.6),
11
+ rgba(124, 77, 255, 0.6),
12
+ rgba(255, 77, 210, 0.6),
13
+ rgba(255, 183, 77, 0.6)
14
+ );
15
+ --ef-button-surface: var(--ef-surface);
16
+ --ef-button-border: var(--ef-border-gradient);
17
+ --ef-button-border-soft: var(--ef-border-gradient-soft);
18
+ --ef-button-text: var(--text-strong);
19
+ --ef-button-glow-shadow: 0 0 24px rgba(124, 77, 255, 0.45);
20
+ --ef-button-locked-bg: rgba(15, 18, 28, 0.7);
21
+ --ef-button-locked-border: rgba(255, 255, 255, 0.15);
22
+ --ef-button-locked-text: rgba(255, 255, 255, 0.7);
23
+ --ef-button-danger-border: linear-gradient(135deg, rgba(255, 92, 92, 0.8), rgba(255, 170, 170, 0.7));
24
+ --ef-button-danger-text: #ffd6d6;
25
+ --ef-button-warning-border: linear-gradient(135deg, rgba(255, 183, 77, 0.85), rgba(255, 221, 128, 0.7));
26
+ --ef-button-warning-text: #2b1a00;
27
+ --ef-button-info-border: linear-gradient(135deg, rgba(0, 229, 255, 0.7), rgba(124, 220, 255, 0.7));
28
+ --ef-button-info-text: #021823;
29
+ --ef-button-success-border: linear-gradient(135deg, rgba(76, 255, 200, 0.7), rgba(140, 255, 220, 0.7));
30
+ --ef-button-success-text: #041a10;
31
+ --ef-nav-text: rgba(238, 241, 246, 0.75);
32
+ --ef-nav-text-hover: #eef1f6;
33
+ --ef-nav-text-active: #f6f5ff;
34
+ --ef-nav-surface: rgba(15, 18, 28, 0.7);
35
+ --ef-nav-border: linear-gradient(135deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
36
+ --ef-nav-shadow: none;
37
+ --ef-nav-shadow-hover: 0 0 18px rgba(124, 77, 255, 0.35);
38
+ --ef-nav-shadow-focus: 0 0 20px rgba(124, 77, 255, 0.45);
39
+ --ef-nav-shadow-active: 0 0 24px rgba(124, 77, 255, 0.6);
40
+ --ef-nav-radius: 8px;
41
+ --ef-nav-padding-y: 8px;
42
+ --ef-nav-padding-x: 18px;
43
+ --ef-nav-letter-spacing: 0.08em;
44
+ --ef-nav-transform-hover: translateY(-1px);
45
+ --ef-menu-item-shadow: 0 0 16px rgba(124, 77, 255, 0.25);
46
+ --ef-menu-item-shadow-hover: 0 0 18px rgba(124, 77, 255, 0.35);
47
+ --ef-tabs-surface: #0b0c1a;
48
+ --ef-tabs-border: linear-gradient(135deg, rgba(0, 229, 255, 0.5), rgba(124, 77, 255, 0.5), rgba(255, 77, 210, 0.5));
49
+ --ef-tabs-content-surface: #0b0c1a;
50
+ --ef-tabs-content-border: linear-gradient(135deg, rgba(0, 229, 255, 0.35), rgba(124, 77, 255, 0.35), rgba(255, 77, 210, 0.35));
51
+ --ef-tabs-indicator: linear-gradient(180deg, #00e5ff, #7c4dff, #ff4dd2);
52
+ --ef-slider-surface: var(--ef-surface);
53
+ --ef-slider-border-color: var(--line-strong);
54
+ --ef-slider-track-radius: 6px;
55
+ --ef-slider-thumb-radius: 6px;
56
+ --ef-slider-thumb-clip: inset(0);
57
+ --ef-slider-thumb-mask: none;
58
+ --ef-toggle-track-radius: 6px;
59
+ --ef-toggle-thumb-radius: 6px;
60
+ --ef-toggle-box-radius: 6px;
61
+ --ef-toggle-check-radius: 2px;
62
+ --ef-toggle-check-bg: var(--ef-slider-border-color);
63
+ --ef-field-label: rgba(255, 255, 255, 0.7);
64
+ --ef-field-required: rgba(255, 183, 77, 0.95);
65
+ --ef-field-helper: rgba(255, 255, 255, 0.6);
66
+ --ef-field-error: #ff8a8a;
67
+ --ef-input-surface: #0b0c1a;
68
+ --ef-input-border: var(--ef-border-gradient);
69
+ --ef-input-text: #eef1f6;
70
+ --ef-input-placeholder: rgba(246, 245, 255, 0.45);
71
+ --ef-input-focus: rgba(124, 77, 255, 0.55);
72
+ --ef-input-shadow: 0 0 0 2px rgba(124, 77, 255, 0.2);
73
+ --ef-stacked-card-bg: rgba(10, 12, 22, 0.92);
74
+ --ef-stacked-card-shadow: 0 14px 35px rgba(10, 12, 24, 0.6);
75
+ --ef-stacked-card-shadow-hover: 0 20px 45px rgba(10, 12, 24, 0.7);
76
+ --ef-stacked-frame-shadow: 0 18px 40px rgba(10, 12, 24, 0.55);
77
+ --ef-stacked-tag-bg: rgba(15, 18, 28, 0.7);
78
+ --ef-stacked-tag-text: rgba(238, 241, 246, 0.75);
79
+ --ef-stacked-body-muted: rgba(255, 255, 255, 0.7);
80
+ --ef-stacked-action-shadow: 0 0 24px rgba(124, 77, 255, 0.45);
81
+ --ef-stacked-image-gradient: linear-gradient(
82
+ 135deg,
83
+ rgba(0, 229, 255, 0.35),
84
+ rgba(124, 77, 255, 0.35),
85
+ rgba(255, 77, 210, 0.25)
86
+ );
87
+ --text-strong: #f6f5ff;
88
+ --text-soft: rgba(238, 241, 246, 0.75);
89
+ --text-muted: rgba(247, 248, 251, 0.6);
90
+ --card: rgba(10, 13, 22, 0.78);
91
+ --card-border: rgba(124, 77, 255, 0.4);
92
+ --accent: #7c4dff;
93
+ --accent-bright: #00e5ff;
94
+ --accent-warm: #ff4dd2;
95
+ --accent-gold: #ffb74d;
96
+ --shadow: 0 24px 60px rgba(0, 0, 0, 0.35);
97
+ --font-main: "Inter", "Segoe UI", Arial, sans-serif;
98
+ --text: var(--text-strong);
99
+ --muted: var(--text-muted);
100
+ --line: var(--card-border);
101
+ --bg: #0b0f15;
102
+ --bg-soft: #141b26;
103
+ --accent-dark: #5e35ff;
104
+ --accent-alt: var(--accent-gold);
105
+ --accent-soft: rgba(255, 183, 77, 0.18);
106
+ --danger: #e06c6c;
107
+ --radius: 18px;
108
+ --row-odd: rgba(10, 13, 22, 0.9);
109
+ --scrollbar-track: rgba(255, 255, 255, 0.12);
110
+ --bg-glow: rgba(124, 77, 255, 0.18);
111
+ --panel: var(--card);
112
+ --panel-2: rgba(12, 16, 26, 0.9);
113
+ --ink: var(--text-strong);
114
+ --line-strong: var(--accent);
115
+ --accent-2: var(--accent-gold);
116
+ --frame-bg: linear-gradient(180deg, #0b0c1a 0%, #0a0d16 100%);
117
+ --bio-bg: linear-gradient(180deg, #0e101c, #0b0f15 85%);
118
+ --section-bg: linear-gradient(180deg, rgba(15, 18, 28, 0.92), rgba(12, 16, 24, 0.95));
119
+ --note-bg: rgba(10, 13, 22, 0.6);
120
+ --portrait-bg: #0c1322;
121
+ --chip-bg: rgba(12, 16, 26, 0.8);
122
+ --placeholder-bg:
123
+ linear-gradient(135deg, rgba(28, 38, 64, 0.9), rgba(12, 18, 32, 0.95)),
124
+ repeating-linear-gradient(0deg, rgba(255, 255, 255, 0.05) 0px, rgba(255, 255, 255, 0.05) 1px, transparent 1px, transparent 8px);
125
+ --placeholder-ink: #dde6f2;
126
+ --menu-card: var(--card);
127
+ --menu-line: var(--card-border);
128
+ --menu-shadow: var(--shadow);
129
+ --menu-bg-soft: rgba(124, 77, 255, 0.12);
130
+ --menu-radius: 18px;
131
+ --menu-muted: var(--text-muted);
132
+ }
133
+
134
+ :root[data-theme="light"],
135
+ :root[data-theme="plain-light"] {
136
+ color-scheme: light;
137
+ --ef-control-radius: 12px;
138
+ --ef-surface: #ffffff;
139
+ --ef-surface-soft: rgba(255, 255, 255, 0.92);
140
+ --ef-border-gradient: linear-gradient(135deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
141
+ --ef-border-gradient-reverse: linear-gradient(315deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
142
+ --ef-border-gradient-soft: linear-gradient(
143
+ 135deg,
144
+ rgba(0, 229, 255, 0.6),
145
+ rgba(124, 77, 255, 0.6),
146
+ rgba(255, 77, 210, 0.6),
147
+ rgba(255, 183, 77, 0.6)
148
+ );
149
+ --ef-button-text: #1d232a;
150
+ --ef-button-glow-shadow: 0 0 20px rgba(124, 77, 255, 0.32);
151
+ --ef-button-locked-bg: rgba(255, 255, 255, 0.8);
152
+ --ef-button-locked-border: rgba(24, 32, 40, 0.18);
153
+ --ef-button-locked-text: rgba(24, 32, 40, 0.6);
154
+ --ef-button-danger-border: linear-gradient(135deg, rgba(200, 76, 76, 0.7), rgba(255, 138, 138, 0.65));
155
+ --ef-button-danger-text: #5a0f0f;
156
+ --ef-button-warning-border: linear-gradient(135deg, rgba(242, 159, 69, 0.75), rgba(255, 210, 128, 0.7));
157
+ --ef-button-warning-text: #4a2c00;
158
+ --ef-button-info-border: linear-gradient(135deg, rgba(0, 180, 210, 0.6), rgba(124, 180, 255, 0.6));
159
+ --ef-button-info-text: #0b2a3a;
160
+ --ef-button-success-border: linear-gradient(135deg, rgba(46, 170, 130, 0.65), rgba(130, 220, 180, 0.65));
161
+ --ef-button-success-text: #0b2b1d;
162
+ --ef-nav-text: rgba(29, 35, 42, 0.8);
163
+ --ef-nav-text-hover: #1d232a;
164
+ --ef-nav-text-active: #1d232a;
165
+ --ef-nav-surface: rgba(255, 255, 255, 0.72);
166
+ --ef-nav-border: var(--ef-border-gradient);
167
+ --ef-nav-shadow: none;
168
+ --ef-nav-shadow-hover: 0 0 16px rgba(31, 122, 140, 0.2);
169
+ --ef-nav-shadow-focus: 0 0 20px rgba(31, 122, 140, 0.24);
170
+ --ef-nav-shadow-active: 0 0 20px rgba(31, 122, 140, 0.26);
171
+ --ef-menu-item-shadow: 0 0 10px rgba(31, 122, 140, 0.12);
172
+ --ef-menu-item-shadow-hover: 0 0 14px rgba(31, 122, 140, 0.18);
173
+ --ef-tabs-surface: #ffffff;
174
+ --ef-tabs-border: linear-gradient(135deg, rgba(0, 229, 255, 0.35), rgba(124, 77, 255, 0.35), rgba(255, 77, 210, 0.35));
175
+ --ef-tabs-content-surface: #ffffff;
176
+ --ef-tabs-content-border: linear-gradient(135deg, rgba(0, 229, 255, 0.2), rgba(124, 77, 255, 0.2), rgba(255, 77, 210, 0.2));
177
+ --ef-tabs-indicator: linear-gradient(180deg, #1f7a8c, #7c4dff, #f29f45);
178
+ --ef-slider-surface: var(--ef-surface);
179
+ --ef-slider-border-color: var(--line-strong);
180
+ --ef-slider-track-radius: 6px;
181
+ --ef-slider-thumb-radius: 6px;
182
+ --ef-slider-thumb-clip: inset(0);
183
+ --ef-slider-thumb-mask: none;
184
+ --ef-toggle-track-radius: 6px;
185
+ --ef-toggle-thumb-radius: 6px;
186
+ --ef-toggle-box-radius: 6px;
187
+ --ef-toggle-check-radius: 2px;
188
+ --ef-toggle-check-bg: var(--ef-slider-border-color);
189
+ --ef-field-label: rgba(29, 35, 42, 0.7);
190
+ --ef-field-required: rgba(242, 159, 69, 0.9);
191
+ --ef-field-helper: rgba(29, 35, 42, 0.6);
192
+ --ef-field-error: #b83a3a;
193
+ --ef-input-surface: #ffffff;
194
+ --ef-input-border: var(--ef-border-gradient);
195
+ --ef-input-text: #1d232a;
196
+ --ef-input-placeholder: rgba(29, 35, 42, 0.45);
197
+ --ef-input-focus: rgba(31, 122, 140, 0.3);
198
+ --ef-input-shadow: 0 0 0 2px rgba(31, 122, 140, 0.14);
199
+ --ef-field-label: rgba(29, 35, 42, 0.7);
200
+ --ef-field-helper: rgba(29, 35, 42, 0.55);
201
+ --ef-field-error: #b34a4a;
202
+ --ef-stacked-card-bg: rgba(10, 12, 22, 0.92);
203
+ --ef-stacked-card-shadow: 0 14px 35px rgba(10, 12, 24, 0.6);
204
+ --ef-stacked-card-shadow-hover: 0 20px 45px rgba(10, 12, 24, 0.7);
205
+ --ef-stacked-frame-shadow: 0 18px 40px rgba(10, 12, 24, 0.55);
206
+ --ef-stacked-tag-bg: rgba(15, 18, 28, 0.7);
207
+ --ef-stacked-tag-text: rgba(238, 241, 246, 0.75);
208
+ --ef-stacked-body-muted: rgba(255, 255, 255, 0.7);
209
+ --ef-stacked-action-shadow: 0 0 24px rgba(124, 77, 255, 0.45);
210
+ --ef-stacked-image-gradient: linear-gradient(
211
+ 135deg,
212
+ rgba(0, 229, 255, 0.35),
213
+ rgba(124, 77, 255, 0.35),
214
+ rgba(255, 77, 210, 0.25)
215
+ );
216
+ --text-strong: #1d232a;
217
+ --text-soft: rgba(29, 35, 42, 0.75);
218
+ --text-muted: rgba(29, 35, 42, 0.6);
219
+ --card: rgba(255, 255, 255, 0.9);
220
+ --card-border: rgba(24, 32, 40, 0.12);
221
+ --shadow: 0 20px 50px rgba(24, 32, 40, 0.12);
222
+ --text: var(--text-strong);
223
+ --muted: var(--text-muted);
224
+ --line: rgba(24, 32, 40, 0.18);
225
+ --bg: #f4f1ea;
226
+ --bg-soft: #fbf7f0;
227
+ --accent-dark: #1f7a8c;
228
+ --accent-alt: #f29f45;
229
+ --accent-soft: rgba(242, 159, 69, 0.18);
230
+ --danger: #c84c4c;
231
+ --row-odd: rgba(255, 255, 255, 0.95);
232
+ --scrollbar-track: rgba(24, 32, 40, 0.08);
233
+ --bg-glow: rgba(31, 122, 140, 0.16);
234
+ --panel: var(--card);
235
+ --panel-2: rgba(255, 255, 255, 0.94);
236
+ --ink: var(--text-strong);
237
+ --line-strong: var(--accent);
238
+ --accent-2: var(--accent-alt);
239
+ --frame-bg: linear-gradient(180deg, #ffffff 0%, #f6ede1 100%);
240
+ --bio-bg: linear-gradient(180deg, #ffffff, #f9f6f0 85%);
241
+ --section-bg: linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(249, 246, 240, 0.96));
242
+ --note-bg: rgba(255, 255, 255, 0.8);
243
+ --portrait-bg: #e7ecf2;
244
+ --chip-bg: rgba(255, 255, 255, 0.9);
245
+ --placeholder-bg:
246
+ linear-gradient(135deg, rgba(210, 225, 245, 0.9), rgba(240, 244, 248, 0.95)),
247
+ repeating-linear-gradient(0deg, rgba(0, 0, 0, 0.04) 0px, rgba(0, 0, 0, 0.04) 1px, transparent 1px, transparent 8px);
248
+ --placeholder-ink: #2b3440;
249
+ --menu-card: rgba(255, 255, 255, 0.88);
250
+ --menu-line: rgba(24, 32, 40, 0.12);
251
+ --menu-shadow: 0 16px 40px rgba(23, 28, 33, 0.12);
252
+ --menu-bg-soft: #f9f6f0;
253
+ --menu-radius: 18px;
254
+ --menu-muted: var(--text-muted);
255
+ }
256
+
257
+ :root[data-theme="plain-light"] {
258
+ --ef-border-gradient: linear-gradient(135deg, var(--line), var(--line));
259
+ --ef-border-gradient-reverse: linear-gradient(315deg, var(--line), var(--line));
260
+ --ef-border-gradient-soft: linear-gradient(
261
+ 135deg,
262
+ rgba(24, 32, 40, 0.18),
263
+ rgba(24, 32, 40, 0.18)
264
+ );
265
+ --ef-button-border: var(--ef-border-gradient);
266
+ --ef-button-border-soft: var(--ef-border-gradient-soft);
267
+ --ef-input-border: var(--ef-border-gradient);
268
+ --ef-stacked-image-gradient: linear-gradient(135deg, rgba(24, 32, 40, 0.08), rgba(24, 32, 40, 0.15));
269
+ --ef-nav-border: var(--ef-border-gradient);
270
+ --ef-nav-shadow-hover: 0 0 0 1px rgba(24, 32, 40, 0.2);
271
+ --ef-nav-shadow-focus: 0 0 0 2px rgba(24, 32, 40, 0.22);
272
+ --ef-nav-shadow-active: 0 0 0 1px rgba(24, 32, 40, 0.3);
273
+ --ef-menu-item-shadow: none;
274
+ --ef-menu-item-shadow-hover: 0 0 0 1px rgba(24, 32, 40, 0.2);
275
+ --ef-tabs-surface: #ffffff;
276
+ --ef-tabs-border: linear-gradient(135deg, rgba(24, 32, 40, 0.18), rgba(24, 32, 40, 0.18));
277
+ --ef-tabs-content-surface: #ffffff;
278
+ --ef-tabs-content-border: linear-gradient(135deg, rgba(24, 32, 40, 0.14), rgba(24, 32, 40, 0.14));
279
+ --ef-tabs-indicator: linear-gradient(180deg, rgba(24, 32, 40, 0.82), rgba(24, 32, 40, 0.82));
280
+ }
281
+
282
+ :root[data-theme="plain-dark"] {
283
+ color-scheme: dark;
284
+ --card-border: rgba(255, 255, 255, 0.16);
285
+ --line: rgba(255, 255, 255, 0.2);
286
+ --line-strong: rgba(255, 255, 255, 0.35);
287
+ --ef-border-gradient: linear-gradient(135deg, var(--line-strong), var(--line-strong));
288
+ --ef-border-gradient-reverse: linear-gradient(315deg, var(--line-strong), var(--line-strong));
289
+ --ef-border-gradient-soft: linear-gradient(
290
+ 135deg,
291
+ rgba(255, 255, 255, 0.18),
292
+ rgba(255, 255, 255, 0.18)
293
+ );
294
+ --ef-button-border: var(--ef-border-gradient);
295
+ --ef-button-border-soft: var(--ef-border-gradient-soft);
296
+ --ef-input-border: var(--ef-border-gradient);
297
+ --menu-line: var(--line);
298
+ --menu-bg-soft: rgba(255, 255, 255, 0.06);
299
+ --ef-stacked-image-gradient: linear-gradient(135deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.12));
300
+ --ef-nav-text: rgba(246, 245, 255, 0.8);
301
+ --ef-nav-text-hover: #f6f5ff;
302
+ --ef-nav-text-active: #f6f5ff;
303
+ --ef-nav-surface: rgba(15, 18, 28, 0.7);
304
+ --ef-nav-border: var(--ef-border-gradient);
305
+ --ef-nav-shadow-hover: 0 0 0 1px rgba(255, 255, 255, 0.2);
306
+ --ef-nav-shadow-focus: 0 0 0 2px rgba(255, 255, 255, 0.24);
307
+ --ef-nav-shadow-active: 0 0 0 1px rgba(255, 255, 255, 0.3);
308
+ --ef-menu-item-shadow: none;
309
+ --ef-menu-item-shadow-hover: 0 0 0 1px rgba(255, 255, 255, 0.2);
310
+ --ef-tabs-surface: #0b0c1a;
311
+ --ef-tabs-border: linear-gradient(135deg, rgba(255, 255, 255, 0.24), rgba(255, 255, 255, 0.24));
312
+ --ef-tabs-content-surface: #0b0c1a;
313
+ --ef-tabs-content-border: linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));
314
+ --ef-tabs-indicator: linear-gradient(180deg, rgba(255, 255, 255, 0.92), rgba(255, 255, 255, 0.92));
315
+ }
316
+
317
+
318
+
319
+ :root[data-theme="atelier"] {
320
+ color-scheme: dark;
321
+ --ef-control-radius: 0px;
322
+ --ef-surface: #1b0b18;
323
+ --ef-surface-soft: rgba(27, 11, 24, 0.92);
324
+ --ef-border-gradient: linear-gradient(135deg, #ff86c8, #e255a1, #7dd6f6);
325
+ --ef-border-gradient-reverse: linear-gradient(315deg, #ff86c8, #e255a1, #7dd6f6);
326
+ --ef-border-gradient-soft: linear-gradient(
327
+ 135deg,
328
+ rgba(255, 134, 200, 0.5),
329
+ rgba(226, 85, 161, 0.5),
330
+ rgba(125, 214, 246, 0.5)
331
+ );
332
+ --ef-slider-surface: var(--ef-surface);
333
+ --ef-slider-border-color: var(--line-strong);
334
+ --ef-slider-track-radius: 0px;
335
+ --ef-slider-thumb-radius: 0px;
336
+ --ef-slider-thumb-clip: inset(0);
337
+ --ef-slider-thumb-mask: none;
338
+ --ef-toggle-track-radius: 0px;
339
+ --ef-toggle-thumb-radius: 0px;
340
+ --ef-toggle-box-radius: 0px;
341
+ --ef-toggle-check-radius: 0px;
342
+ --ef-toggle-check-bg: var(--ef-slider-border-color);
343
+ --ef-button-surface: var(--ef-surface);
344
+ --ef-button-border: var(--ef-border-gradient);
345
+ --ef-button-border-soft: var(--ef-border-gradient-soft);
346
+ --ef-button-text: #f6eaf2;
347
+ --ef-button-glow-shadow: 0 0 24px rgba(226, 85, 161, 0.42);
348
+ --ef-nav-text: rgba(246, 234, 242, 0.78);
349
+ --ef-nav-text-hover: #f6eaf2;
350
+ --ef-nav-text-active: #f6eaf2;
351
+ --ef-nav-surface: rgba(27, 11, 24, 0.74);
352
+ --ef-nav-border: var(--ef-border-gradient);
353
+ --ef-nav-shadow: none;
354
+ --ef-nav-shadow-hover: 0 0 16px rgba(226, 85, 161, 0.28);
355
+ --ef-nav-shadow-focus: 0 0 20px rgba(226, 85, 161, 0.34);
356
+ --ef-nav-shadow-active: 0 0 22px rgba(226, 85, 161, 0.42);
357
+ --ef-menu-item-shadow: 0 0 14px rgba(226, 85, 161, 0.2);
358
+ --ef-menu-item-shadow-hover: 0 0 18px rgba(226, 85, 161, 0.3);
359
+ --ef-tabs-surface: #1b0b18;
360
+ --ef-tabs-border: linear-gradient(135deg, rgba(255, 134, 200, 0.45), rgba(226, 85, 161, 0.45), rgba(125, 214, 246, 0.45));
361
+ --ef-tabs-content-surface: #1b0b18;
362
+ --ef-tabs-content-border: linear-gradient(135deg, rgba(255, 134, 200, 0.3), rgba(226, 85, 161, 0.3), rgba(125, 214, 246, 0.3));
363
+ --ef-tabs-indicator: linear-gradient(180deg, #ff86c8, #e255a1, #7dd6f6);
364
+ --ef-input-surface: #1b0b18;
365
+ --ef-input-border: var(--ef-border-gradient);
366
+ --ef-input-text: #f6eaf2;
367
+ --ef-input-placeholder: rgba(246, 234, 242, 0.6);
368
+ --ef-input-focus: rgba(226, 85, 161, 0.45);
369
+ --ef-input-shadow: 0 0 0 2px rgba(226, 85, 161, 0.2);
370
+ --text-strong: #f6eaf2;
371
+ --text-soft: rgba(246, 234, 242, 0.8);
372
+ --text-muted: #dbc7d7;
373
+ --card: #1b0b18;
374
+ --card-border: rgba(192, 59, 132, 0.6);
375
+ --accent: #ff86c8;
376
+ --accent-bright: #7dd6f6;
377
+ --accent-warm: #e255a1;
378
+ --accent-gold: #ff86c8;
379
+ --shadow: rgba(0, 0, 0, 0.6);
380
+ --text: #f6eaf2;
381
+ --muted: #dbc7d7;
382
+ --line: #c03b84;
383
+ --bg: #130810;
384
+ --bg-soft: #241028;
385
+ --accent-dark: #c03b84;
386
+ --accent-alt: #7dd6f6;
387
+ --accent-soft: rgba(255, 134, 200, 0.18);
388
+ --danger: #e06c6c;
389
+ --radius: 18px;
390
+ --row-odd: rgba(27, 11, 24, 0.85);
391
+ --scrollbar-track: rgba(255, 255, 255, 0.08);
392
+ --bg-glow: #2a0f21;
393
+ --panel: #1b0b18;
394
+ --panel-2: #241028;
395
+ --ink: #f6eaf2;
396
+ --line-strong: #e255a1;
397
+ --accent-2: #7dd6f6;
398
+ --frame-bg: linear-gradient(180deg, #220b1a 0%, #12070f 100%);
399
+ --bio-bg: linear-gradient(180deg, #1a0b1b, #12070f 85%);
400
+ --section-bg: linear-gradient(180deg, rgba(35, 14, 32, 0.94), rgba(20, 9, 18, 0.95));
401
+ --note-bg: rgba(16, 7, 14, 0.6);
402
+ --portrait-bg: #131a2c;
403
+ --chip-bg: rgba(17, 9, 20, 0.8);
404
+ --placeholder-bg:
405
+ linear-gradient(135deg, rgba(60, 78, 108, 0.9), rgba(20, 30, 50, 0.95)),
406
+ repeating-linear-gradient(
407
+ 0deg,
408
+ rgba(255, 255, 255, 0.06) 0px,
409
+ rgba(255, 255, 255, 0.06) 1px,
410
+ transparent 1px,
411
+ transparent 8px
412
+ );
413
+ --placeholder-ink: #dde6f2;
414
+ --menu-card: #1b0b18;
415
+ --menu-line: rgba(192, 59, 132, 0.5);
416
+ --menu-shadow: 0 16px 40px rgba(0, 0, 0, 0.5);
417
+ --menu-bg-soft: rgba(255, 134, 200, 0.12);
418
+ --menu-radius: 18px;
419
+ --menu-muted: #dbc7d7;
420
+ }
421
+
422
+ :root[data-theme="galaxy"] {
423
+ --ef-slider-track-radius: 6px;
424
+ --ef-slider-thumb-radius: 6px;
425
+ --ef-slider-thumb-clip: inset(0);
426
+ --ef-slider-thumb-mask: none;
427
+ --ef-toggle-track-radius: 6px;
428
+ --ef-toggle-thumb-radius: 6px;
429
+ --ef-toggle-box-radius: 6px;
430
+ --ef-toggle-check-radius: 2px;
431
+ }
432
+
433
+ /*
434
+ Optional "galaxy-light" surface mode (when host app toggles body class).
435
+ Keeps light readability while preserving galaxy accent treatment for nav/tabs.
436
+ */
437
+ body.ef-galaxy-light {
438
+ --ef-nav-text: rgba(29, 35, 42, 0.82);
439
+ --ef-nav-text-hover: #1d232a;
440
+ --ef-nav-text-active: #1d232a;
441
+ --ef-nav-surface: rgba(255, 255, 255, 0.86);
442
+ --ef-nav-border: linear-gradient(135deg, rgba(0, 229, 255, 0.72), rgba(124, 77, 255, 0.72), rgba(255, 77, 210, 0.72), rgba(255, 183, 77, 0.72));
443
+ --ef-nav-shadow: none;
444
+ --ef-nav-shadow-hover: 0 0 16px rgba(124, 77, 255, 0.24);
445
+ --ef-nav-shadow-focus: 0 0 20px rgba(124, 77, 255, 0.28);
446
+ --ef-nav-shadow-active: 0 0 20px rgba(124, 77, 255, 0.3);
447
+ --ef-menu-item-shadow: 0 0 10px rgba(124, 77, 255, 0.15);
448
+ --ef-menu-item-shadow-hover: 0 0 14px rgba(124, 77, 255, 0.2);
449
+ --ef-tabs-surface: rgba(255, 255, 255, 0.92);
450
+ --ef-tabs-border: linear-gradient(135deg, rgba(0, 229, 255, 0.52), rgba(124, 77, 255, 0.52), rgba(255, 77, 210, 0.52));
451
+ --ef-tabs-content-surface: rgba(255, 255, 255, 0.94);
452
+ --ef-tabs-content-border: linear-gradient(135deg, rgba(0, 229, 255, 0.36), rgba(124, 77, 255, 0.36), rgba(255, 77, 210, 0.36));
453
+ --ef-tabs-indicator: linear-gradient(180deg, #00a0bc, #7c4dff, #c24aa2);
454
+ }
455
+
456
+ :root[data-theme="system"] {
457
+ color-scheme: light dark;
458
+ }
459
+
460
+ @media (prefers-color-scheme: light) {
461
+ :root[data-theme="system"] {
462
+ --ef-nav-text: rgba(29, 35, 42, 0.8);
463
+ --ef-nav-text-hover: #1d232a;
464
+ --ef-nav-text-active: #1d232a;
465
+ --ef-nav-surface: rgba(255, 255, 255, 0.72);
466
+ --ef-nav-shadow: none;
467
+ --ef-nav-shadow-hover: 0 0 16px rgba(31, 122, 140, 0.2);
468
+ --ef-nav-shadow-focus: 0 0 20px rgba(31, 122, 140, 0.24);
469
+ --ef-nav-shadow-active: 0 0 20px rgba(31, 122, 140, 0.26);
470
+ --ef-menu-item-shadow: 0 0 10px rgba(31, 122, 140, 0.12);
471
+ --ef-menu-item-shadow-hover: 0 0 14px rgba(31, 122, 140, 0.18);
472
+ --ef-tabs-surface: #ffffff;
473
+ --ef-tabs-border: linear-gradient(135deg, rgba(0, 229, 255, 0.35), rgba(124, 77, 255, 0.35), rgba(255, 77, 210, 0.35));
474
+ --ef-tabs-content-surface: #ffffff;
475
+ --ef-tabs-content-border: linear-gradient(135deg, rgba(0, 229, 255, 0.2), rgba(124, 77, 255, 0.2), rgba(255, 77, 210, 0.2));
476
+ --ef-tabs-indicator: linear-gradient(180deg, #1f7a8c, #7c4dff, #f29f45);
477
+ }
478
+ }
479
+
package/styles.css CHANGED
@@ -1,6 +1,7 @@
1
- @import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap");
2
- @import "./src/base.css";
3
- @import "./src/theme.css";
1
+ @import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap");
2
+ @import "./src/base.css";
3
+ @import "./src/variables.css";
4
+ @import "./src/theme.css";
4
5
  @import "./src/components/BookmarkDropdown.css";
5
6
  @import "./src/components/AccessGate.css";
6
7
  @import "./src/components/Button.css";