@oddessentials/agent-guild 0.7.1 → 0.9.0

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.
Files changed (149) hide show
  1. package/README.md +6 -2
  2. package/package.json +1 -1
  3. package/web/app.js +69 -17
  4. package/web/index.html +13 -3
  5. package/web/skins/guild/skin.css +502 -0
  6. package/web/skins/orbital/characters/anthropic/idle.avif +0 -0
  7. package/web/skins/orbital/characters/anthropic/idle.webp +0 -0
  8. package/web/skins/orbital/characters/anthropic/locked.avif +0 -0
  9. package/web/skins/orbital/characters/anthropic/locked.webp +0 -0
  10. package/web/skins/orbital/characters/anthropic/working.avif +0 -0
  11. package/web/skins/orbital/characters/anthropic/working.webp +0 -0
  12. package/web/skins/orbital/characters/google/idle.avif +0 -0
  13. package/web/skins/orbital/characters/google/idle.webp +0 -0
  14. package/web/skins/orbital/characters/google/locked.avif +0 -0
  15. package/web/skins/orbital/characters/google/locked.webp +0 -0
  16. package/web/skins/orbital/characters/google/working.avif +0 -0
  17. package/web/skins/orbital/characters/google/working.webp +0 -0
  18. package/web/skins/orbital/characters/openai/idle.avif +0 -0
  19. package/web/skins/orbital/characters/openai/idle.webp +0 -0
  20. package/web/skins/orbital/characters/openai/locked.avif +0 -0
  21. package/web/skins/orbital/characters/openai/locked.webp +0 -0
  22. package/web/skins/orbital/characters/openai/working.avif +0 -0
  23. package/web/skins/orbital/characters/openai/working.webp +0 -0
  24. package/web/skins/orbital/characters/shell/idle.avif +0 -0
  25. package/web/skins/orbital/characters/shell/idle.webp +0 -0
  26. package/web/skins/orbital/characters/shell/locked.avif +0 -0
  27. package/web/skins/orbital/characters/shell/locked.webp +0 -0
  28. package/web/skins/orbital/characters/shell/working.avif +0 -0
  29. package/web/skins/orbital/characters/shell/working.webp +0 -0
  30. package/web/skins/orbital/characters/xai/idle.avif +0 -0
  31. package/web/skins/orbital/characters/xai/idle.webp +0 -0
  32. package/web/skins/orbital/characters/xai/locked.avif +0 -0
  33. package/web/skins/orbital/characters/xai/locked.webp +0 -0
  34. package/web/skins/orbital/characters/xai/working.avif +0 -0
  35. package/web/skins/orbital/characters/xai/working.webp +0 -0
  36. package/web/skins/orbital/familiars/aether.png +0 -0
  37. package/web/skins/orbital/familiars/flame.png +0 -0
  38. package/web/skins/orbital/familiars/leaf.png +0 -0
  39. package/web/skins/orbital/familiars/night.png +0 -0
  40. package/web/skins/orbital/fonts/OFL.txt +93 -0
  41. package/web/skins/orbital/fonts/exo2.woff2 +0 -0
  42. package/web/skins/orbital/icons/anthropic.avif +0 -0
  43. package/web/skins/orbital/icons/anthropic.webp +0 -0
  44. package/web/skins/orbital/icons/google.avif +0 -0
  45. package/web/skins/orbital/icons/google.webp +0 -0
  46. package/web/skins/orbital/icons/openai.avif +0 -0
  47. package/web/skins/orbital/icons/openai.webp +0 -0
  48. package/web/skins/orbital/icons/shell.avif +0 -0
  49. package/web/skins/orbital/icons/shell.webp +0 -0
  50. package/web/skins/orbital/icons/xai.avif +0 -0
  51. package/web/skins/orbital/icons/xai.webp +0 -0
  52. package/web/skins/orbital/page-light.avif +0 -0
  53. package/web/skins/orbital/page-light.webp +0 -0
  54. package/web/skins/orbital/page.avif +0 -0
  55. package/web/skins/orbital/page.webp +0 -0
  56. package/web/skins/orbital/skin.css +393 -0
  57. package/web/skins/orbital/ui/empty-state.avif +0 -0
  58. package/web/skins/orbital/ui/empty-state.webp +0 -0
  59. package/web/skins/orbital/ui/level.svg +1 -0
  60. package/web/skins/orbital/ui/lock.svg +1 -0
  61. package/web/skins/orbital/ui/plasma.svg +1 -0
  62. package/web/skins/orbital/ui/power.svg +1 -0
  63. package/web/skins/professional/banners/anthropic/idle.svg +1 -0
  64. package/web/skins/professional/banners/anthropic/locked.svg +1 -0
  65. package/web/skins/professional/banners/anthropic/working.svg +1 -0
  66. package/web/skins/professional/banners/google/idle.svg +1 -0
  67. package/web/skins/professional/banners/google/locked.svg +1 -0
  68. package/web/skins/professional/banners/google/working.svg +1 -0
  69. package/web/skins/professional/banners/openai/idle.svg +1 -0
  70. package/web/skins/professional/banners/openai/locked.svg +1 -0
  71. package/web/skins/professional/banners/openai/working.svg +1 -0
  72. package/web/skins/professional/banners/shell/idle.svg +1 -0
  73. package/web/skins/professional/banners/shell/locked.svg +1 -0
  74. package/web/skins/professional/banners/shell/working.svg +1 -0
  75. package/web/skins/professional/banners/xai/idle.svg +1 -0
  76. package/web/skins/professional/banners/xai/locked.svg +1 -0
  77. package/web/skins/professional/banners/xai/working.svg +1 -0
  78. package/web/skins/professional/icons/anthropic.svg +1 -0
  79. package/web/skins/professional/icons/google.svg +1 -0
  80. package/web/skins/professional/icons/openai.svg +1 -0
  81. package/web/skins/professional/icons/shell.svg +1 -0
  82. package/web/skins/professional/icons/xai.svg +1 -0
  83. package/web/skins/professional/page-light.svg +1 -0
  84. package/web/skins/professional/page.svg +1 -0
  85. package/web/skins/professional/skin.css +253 -0
  86. package/web/skins/professional/ui/empty-state-light.svg +1 -0
  87. package/web/skins/professional/ui/empty-state.svg +1 -0
  88. package/web/skins/professional/ui/lock.svg +1 -0
  89. package/web/styles.css +43 -44
  90. package/web/theme.js +19 -3
  91. package/web/art/art.css +0 -467
  92. /package/web/{art/ui/guild-crest.png → brand/crest.png} +0 -0
  93. /package/web/{art/ui → brand}/favicon.png +0 -0
  94. /package/web/{art → skins/guild}/characters/anthropic/idle.avif +0 -0
  95. /package/web/{art → skins/guild}/characters/anthropic/idle.webp +0 -0
  96. /package/web/{art → skins/guild}/characters/anthropic/locked.avif +0 -0
  97. /package/web/{art → skins/guild}/characters/anthropic/locked.webp +0 -0
  98. /package/web/{art → skins/guild}/characters/anthropic/working.avif +0 -0
  99. /package/web/{art → skins/guild}/characters/anthropic/working.webp +0 -0
  100. /package/web/{art → skins/guild}/characters/google/idle.avif +0 -0
  101. /package/web/{art → skins/guild}/characters/google/idle.webp +0 -0
  102. /package/web/{art → skins/guild}/characters/google/locked.avif +0 -0
  103. /package/web/{art → skins/guild}/characters/google/locked.webp +0 -0
  104. /package/web/{art → skins/guild}/characters/google/working.avif +0 -0
  105. /package/web/{art → skins/guild}/characters/google/working.webp +0 -0
  106. /package/web/{art → skins/guild}/characters/openai/idle.avif +0 -0
  107. /package/web/{art → skins/guild}/characters/openai/idle.webp +0 -0
  108. /package/web/{art → skins/guild}/characters/openai/locked.avif +0 -0
  109. /package/web/{art → skins/guild}/characters/openai/locked.webp +0 -0
  110. /package/web/{art → skins/guild}/characters/openai/working.avif +0 -0
  111. /package/web/{art → skins/guild}/characters/openai/working.webp +0 -0
  112. /package/web/{art → skins/guild}/characters/shell/idle.avif +0 -0
  113. /package/web/{art → skins/guild}/characters/shell/idle.webp +0 -0
  114. /package/web/{art → skins/guild}/characters/shell/locked.avif +0 -0
  115. /package/web/{art → skins/guild}/characters/shell/locked.webp +0 -0
  116. /package/web/{art → skins/guild}/characters/shell/working.avif +0 -0
  117. /package/web/{art → skins/guild}/characters/shell/working.webp +0 -0
  118. /package/web/{art → skins/guild}/characters/xai/idle.avif +0 -0
  119. /package/web/{art → skins/guild}/characters/xai/idle.webp +0 -0
  120. /package/web/{art → skins/guild}/characters/xai/locked.avif +0 -0
  121. /package/web/{art → skins/guild}/characters/xai/locked.webp +0 -0
  122. /package/web/{art → skins/guild}/characters/xai/working.avif +0 -0
  123. /package/web/{art → skins/guild}/characters/xai/working.webp +0 -0
  124. /package/web/{art → skins/guild}/familiars/aether.png +0 -0
  125. /package/web/{art → skins/guild}/familiars/flame.png +0 -0
  126. /package/web/{art → skins/guild}/familiars/leaf.png +0 -0
  127. /package/web/{art → skins/guild}/familiars/night.png +0 -0
  128. /package/web/{art → skins/guild}/icons/anthropic.avif +0 -0
  129. /package/web/{art → skins/guild}/icons/anthropic.webp +0 -0
  130. /package/web/{art → skins/guild}/icons/google.avif +0 -0
  131. /package/web/{art → skins/guild}/icons/google.webp +0 -0
  132. /package/web/{art → skins/guild}/icons/openai.avif +0 -0
  133. /package/web/{art → skins/guild}/icons/openai.webp +0 -0
  134. /package/web/{art → skins/guild}/icons/shell.avif +0 -0
  135. /package/web/{art → skins/guild}/icons/shell.webp +0 -0
  136. /package/web/{art → skins/guild}/icons/xai.avif +0 -0
  137. /package/web/{art → skins/guild}/icons/xai.webp +0 -0
  138. /package/web/{art → skins/guild}/page-light.avif +0 -0
  139. /package/web/{art → skins/guild}/page-light.webp +0 -0
  140. /package/web/{art → skins/guild}/page.avif +0 -0
  141. /package/web/{art → skins/guild}/page.webp +0 -0
  142. /package/web/{art → skins/guild}/ui/empty-state.avif +0 -0
  143. /package/web/{art → skins/guild}/ui/empty-state.webp +0 -0
  144. /package/web/{art → skins/guild}/ui/frame-ornate.png +0 -0
  145. /package/web/{art → skins/guild}/ui/frame.png +0 -0
  146. /package/web/{art → skins/guild}/ui/gem-mana.png +0 -0
  147. /package/web/{art → skins/guild}/ui/gem-vitality.png +0 -0
  148. /package/web/{art → skins/guild}/ui/level-medallion.png +0 -0
  149. /package/web/{art → skins/guild}/ui/padlock.png +0 -0
@@ -0,0 +1,502 @@
1
+ /* The Guild skin: the default. Fantasy guild-hall art and a parchment-and-gold palette.
2
+ Everything here applies only while <html data-skin="guild">; docs/SKINS.md lists every slot. */
3
+
4
+ :where(:root[data-skin="guild"]) {
5
+ --bg: #f3eee3;
6
+ --surface: #fffcf6;
7
+ --surface-2: #f5eedf;
8
+ --border: #e3d7bd;
9
+ --text: #221b12;
10
+ --muted: #6b5c45;
11
+ --heading: #2c2216;
12
+ --accent: #5a3fc0;
13
+ --accent-fill: #5a3fc0;
14
+ --accent-text: #ffffff;
15
+ --danger: #a8302b;
16
+ --ok: #1d6e40;
17
+ --warn: #8a5300;
18
+ --gold: #b8892f;
19
+ --gold-ink: #7a5715;
20
+ --focus: #5a3fc0;
21
+ --shadow: 0 1px 2px rgba(70, 48, 12, 0.08), 0 4px 14px rgba(70, 48, 12, 0.08);
22
+ --radius: 6px;
23
+ --font-display: var(--font-brand);
24
+ }
25
+
26
+ :where(:root[data-skin="guild"][data-theme="dark"]) {
27
+ --bg: #0f1115;
28
+ --surface: #171a21;
29
+ --surface-2: #1e222b;
30
+ --border: #2a303b;
31
+ --text: #e6e9ef;
32
+ --muted: #9aa4b2;
33
+ --heading: #f1e2c2;
34
+ --accent: #ac9ff7;
35
+ --accent-fill: #5b40d0;
36
+ --danger: #ef6b66;
37
+ --ok: #4cc38a;
38
+ --warn: #e0a84a;
39
+ --gold: #e8c47c;
40
+ --gold-ink: #e8c47c;
41
+ --focus: #e8c47c;
42
+ --shadow: none;
43
+ }
44
+
45
+ :where(:root[data-skin="guild"]) {
46
+ .topbar { border-bottom: 1px solid; border-image: linear-gradient(90deg, transparent, color-mix(in srgb, var(--gold) 55%, transparent) 25%, color-mix(in srgb, var(--gold) 55%, transparent) 75%, transparent) 1; }
47
+ .version { background: transparent; color: var(--gold-ink); border-color: color-mix(in srgb, var(--gold) 45%, transparent); }
48
+ .version:hover { color: var(--gold-ink); border-color: var(--gold); }
49
+ .version.unread::after {
50
+ background: radial-gradient(circle at 35% 30%, #fff 0 14%, var(--accent) 48%, color-mix(in srgb, var(--accent) 55%, #000) 100%);
51
+ box-shadow: 0 0 6px color-mix(in srgb, var(--accent) 70%, transparent);
52
+ }
53
+ .connection .dot {
54
+ width: 9px; height: 9px;
55
+ background: radial-gradient(circle at 35% 30%, #fff 0 14%, var(--dot) 48%, color-mix(in srgb, var(--dot) 55%, #000) 100%);
56
+ box-shadow: 0 0 6px color-mix(in srgb, var(--dot) 70%, transparent);
57
+ }
58
+ .section-head {
59
+ padding-bottom: 9px; border-bottom: 1px solid;
60
+ border-image: linear-gradient(90deg, var(--gold), color-mix(in srgb, var(--gold) 35%, transparent) 45%, transparent 90%) 1;
61
+ }
62
+
63
+ .provider, .session-card {
64
+ --pc: #a67cf6;
65
+ --idle: image-set(url("characters/shell/idle.avif") type("image/avif"), url("characters/shell/idle.webp") type("image/webp"));
66
+ --working: image-set(url("characters/shell/working.avif") type("image/avif"), url("characters/shell/working.webp") type("image/webp"));
67
+ --locked: image-set(url("characters/shell/locked.avif") type("image/avif"), url("characters/shell/locked.webp") type("image/webp"));
68
+ }
69
+ .provider[data-id="anthropic"], .session-card[data-provider="anthropic"] {
70
+ --pc: #d97757;
71
+ --idle: image-set(url("characters/anthropic/idle.avif") type("image/avif"), url("characters/anthropic/idle.webp") type("image/webp"));
72
+ --working: image-set(url("characters/anthropic/working.avif") type("image/avif"), url("characters/anthropic/working.webp") type("image/webp"));
73
+ --locked: image-set(url("characters/anthropic/locked.avif") type("image/avif"), url("characters/anthropic/locked.webp") type("image/webp"));
74
+ }
75
+ .provider[data-id="openai"], .session-card[data-provider="openai"] {
76
+ --pc: #1fd08f;
77
+ --idle: image-set(url("characters/openai/idle.avif") type("image/avif"), url("characters/openai/idle.webp") type("image/webp"));
78
+ --working: image-set(url("characters/openai/working.avif") type("image/avif"), url("characters/openai/working.webp") type("image/webp"));
79
+ --locked: image-set(url("characters/openai/locked.avif") type("image/avif"), url("characters/openai/locked.webp") type("image/webp"));
80
+ }
81
+ .provider[data-id="google"], .session-card[data-provider="google"] {
82
+ --pc: #5b9cff;
83
+ --idle: image-set(url("characters/google/idle.avif") type("image/avif"), url("characters/google/idle.webp") type("image/webp"));
84
+ --working: image-set(url("characters/google/working.avif") type("image/avif"), url("characters/google/working.webp") type("image/webp"));
85
+ --locked: image-set(url("characters/google/locked.avif") type("image/avif"), url("characters/google/locked.webp") type("image/webp"));
86
+ }
87
+ .provider[data-id="xai"], .session-card[data-provider="xai"] {
88
+ --pc: #38d6e8;
89
+ --idle: image-set(url("characters/xai/idle.avif") type("image/avif"), url("characters/xai/idle.webp") type("image/webp"));
90
+ --working: image-set(url("characters/xai/working.avif") type("image/avif"), url("characters/xai/working.webp") type("image/webp"));
91
+ --locked: image-set(url("characters/xai/locked.avif") type("image/avif"), url("characters/xai/locked.webp") type("image/webp"));
92
+ }
93
+
94
+ .provider-icon[data-provider="anthropic"] { --icon: image-set(url("icons/anthropic.avif") type("image/avif"), url("icons/anthropic.webp") type("image/webp")); }
95
+ .provider-icon[data-provider="openai"] { --icon: image-set(url("icons/openai.avif") type("image/avif"), url("icons/openai.webp") type("image/webp")); }
96
+ .provider-icon[data-provider="google"] { --icon: image-set(url("icons/google.avif") type("image/avif"), url("icons/google.webp") type("image/webp")); }
97
+ .provider-icon[data-provider="xai"] { --icon: image-set(url("icons/xai.avif") type("image/avif"), url("icons/xai.webp") type("image/webp")); }
98
+ .provider-icon[data-provider="shell"] { --icon: image-set(url("icons/shell.avif") type("image/avif"), url("icons/shell.webp") type("image/webp")); }
99
+ .provider-icon:not(.has-image)[data-provider="anthropic"],
100
+ .provider-icon:not(.has-image)[data-provider="openai"],
101
+ .provider-icon:not(.has-image)[data-provider="google"],
102
+ .provider-icon:not(.has-image)[data-provider="xai"],
103
+ .provider-icon:not(.has-image)[data-provider="shell"] {
104
+ background: var(--icon) center / cover no-repeat; color: transparent;
105
+ }
106
+
107
+ body::before {
108
+ content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none;
109
+ background: var(--page-art) center bottom / cover no-repeat;
110
+ }
111
+
112
+ .provider, .session-card {
113
+ position: relative; isolation: isolate; overflow: hidden;
114
+ border-radius: 6px; padding: 18px;
115
+ transition: border-color 0.2s, box-shadow 0.2s, transform 0.3s var(--ease);
116
+ }
117
+ .provider:hover { transform: translateY(-3px); }
118
+ .session-card:hover { transform: translateY(-2px); }
119
+ .provider::before {
120
+ content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
121
+ background: linear-gradient(105deg, transparent 38%, var(--glint) 50%, transparent 62%);
122
+ transform: translateX(-110%);
123
+ }
124
+ .provider:hover::before { transform: translateX(110%); transition: transform 1s var(--ease); }
125
+ .provider .card-art::before { transition: transform 0.5s var(--ease); }
126
+ .provider:hover .card-art::before { transform: translate(calc(var(--px, 0) * -7px), calc(var(--py, 0) * -5px)) scale(1.045); }
127
+ .providers.deal > .provider { animation: guild-deal 0.55s var(--ease) both; }
128
+ .providers.deal > .provider:nth-child(2) { animation-delay: 0.06s; }
129
+ .providers.deal > .provider:nth-child(3) { animation-delay: 0.12s; }
130
+ .providers.deal > .provider:nth-child(4) { animation-delay: 0.18s; }
131
+ .providers.deal > .provider:nth-child(5) { animation-delay: 0.24s; }
132
+ .providers.deal > .provider:nth-child(6) { animation-delay: 0.3s; }
133
+ .providers.deal > .provider:nth-child(n + 7) { animation-delay: 0.36s; }
134
+ .session-card.enter { animation: guild-card-enter 0.5s var(--ease) both; }
135
+ .provider::after, .session-card::after {
136
+ content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
137
+ border: 44px solid transparent; border-image: url("ui/frame.png") 168;
138
+ }
139
+ .card-art { position: absolute; z-index: -1; overflow: hidden; pointer-events: none; }
140
+ .card-art::before { content: ""; position: absolute; inset: 0; background: var(--idle) no-repeat; }
141
+ .provider.unavailable .card-art::before { background-image: var(--locked); }
142
+ .provider.unavailable::after {
143
+ background: url("ui/padlock.png") right 16px top 14px / 30px 40px no-repeat border-box;
144
+ }
145
+ .session-card { min-height: 196px; }
146
+ .session-card .card-art::after {
147
+ content: ""; position: absolute; inset: 0; background: var(--working) no-repeat;
148
+ opacity: 0; transition: opacity 0.6s var(--ease);
149
+ }
150
+ .session-card:has(.status-pill.active) .card-art::after { opacity: 1; }
151
+ .card-aura {
152
+ position: absolute; z-index: -1; overflow: hidden; pointer-events: none;
153
+ opacity: 0; transition: opacity 0.6s var(--ease);
154
+ }
155
+ .card-aura::before {
156
+ content: ""; position: absolute; inset: -12%;
157
+ background: radial-gradient(closest-side, transparent 52%, color-mix(in srgb, var(--pc) 55%, transparent) 84%, transparent);
158
+ }
159
+ .card-aura::after {
160
+ content: ""; position: absolute; inset: 0 0 auto; height: calc(100% + 96px);
161
+ background-image:
162
+ radial-gradient(circle, color-mix(in srgb, var(--pc) 80%, #fff) 0 1.4px, transparent 2.2px),
163
+ radial-gradient(circle, color-mix(in srgb, var(--pc) 65%, #fff) 0 1px, transparent 1.8px),
164
+ radial-gradient(circle, #fff3d0 0 0.9px, transparent 1.6px);
165
+ background-size: 44px 96px, 61px 48px, 37px 96px;
166
+ background-position: 6px 10px, 30px 30px, 18px 62px;
167
+ }
168
+ .session-card:has(.status-pill.active) .card-aura { opacity: 1; }
169
+ .session-card:has(.status-pill.active) .card-aura::before { animation: guild-aura 3.6s ease-in-out infinite alternate; }
170
+ .session-card:has(.status-pill.active) .card-aura::after { animation: guild-sparks 3.2s linear infinite; }
171
+ body:has(#terminal-panel:not([hidden])) main :is(.card-aura, .status-pill, .agent)::before,
172
+ body:has(#terminal-panel:not([hidden])) main :is(.card-aura, .agent)::after { animation-play-state: paused; }
173
+ .session-card .card-top > .provider-icon { display: none; }
174
+ .session-card .card-top { flex-wrap: wrap; gap: 6px 8px; }
175
+ .session-card .card-title { flex-basis: 100%; }
176
+
177
+ .level-badge {
178
+ display: grid; place-items: center; position: absolute; left: 12px; bottom: 12px; z-index: 1;
179
+ width: 46px; height: 46px; padding-top: 1px;
180
+ background: url("ui/level-medallion.png") center / contain no-repeat;
181
+ font: 700 1.05rem var(--font-display); color: #f6dea6;
182
+ text-shadow: 0 1px 2px #000, 0 0 6px rgba(0, 0, 0, 0.8);
183
+ }
184
+ .level-badge.level-up { animation: guild-level-up 1.2s var(--ease); }
185
+ .agent.summon { animation: guild-summon 0.6s var(--ease) both; }
186
+
187
+ #empty { padding: 4px 16px 8px; text-align: center; }
188
+ #empty::before {
189
+ content: ""; display: block; width: 190px; height: 206px; margin: 0 auto 12px;
190
+ background: image-set(url("ui/empty-state.avif") type("image/avif"), url("ui/empty-state.webp") type("image/webp")) center / contain no-repeat;
191
+ filter: drop-shadow(0 12px 14px var(--empty-shadow));
192
+ }
193
+
194
+ .agent {
195
+ border-width: 1px; border-color: var(--fc); place-items: end end; padding: 0 3px 1px 0;
196
+ background: #0e1016 center / 118% auto no-repeat;
197
+ color: #fff; font-size: 0.62rem; text-shadow: 0 0 3px #000, 0 1px 2px #000;
198
+ box-shadow: 0 0 10px color-mix(in srgb, var(--fc) 45%, transparent);
199
+ }
200
+ .session-card .agent { width: 34px; height: 34px; }
201
+ .agent.working::after { border-color: var(--fc); }
202
+ .agent[data-familiar="flame"] { --fc: #f08a3c; background-image: url("familiars/flame.png"); }
203
+ .agent[data-familiar="leaf"] { --fc: #5fd068; background-image: url("familiars/leaf.png"); }
204
+ .agent[data-familiar="night"] { --fc: #a66cf0; background-image: url("familiars/night.png"); }
205
+ .agent[data-familiar="aether"] { --fc: #7cc8ff; background-image: url("familiars/aether.png"); }
206
+
207
+ .meter-label { padding-left: 18px; background: url("ui/gem-vitality.png") left center / 14px auto no-repeat; }
208
+ .meter + .meter .meter-label { background-image: url("ui/gem-mana.png"); }
209
+ .meter-bar, .stat-bar { height: 7px; }
210
+ .model-stats-head { color: var(--gold-ink); }
211
+ .stat-tier { border-radius: 3px; font-family: var(--font-display); }
212
+ .tier-s .stat-tier { color: #2b1b06; background: linear-gradient(180deg, #fbe9bd 0%, #e2b867 55%, #a97b35 100%); }
213
+
214
+ .tip {
215
+ background: #14120f; color: #ece4d1; border: 1px solid #4a3d25;
216
+ box-shadow: inset 0 0 0 1px rgba(232, 196, 124, 0.06), 0 10px 28px rgba(0, 0, 0, 0.45);
217
+ }
218
+ .tip strong { color: #f0cf8a; font-family: var(--font-display); }
219
+
220
+ .models::after, .auth::after {
221
+ content: ""; position: absolute; inset: 0; z-index: 2; pointer-events: none;
222
+ border: 54px solid transparent; border-image: url("ui/frame-ornate.png") 232;
223
+ }
224
+ .models-bar { padding: 30px 36px 12px; }
225
+ .models-body { margin: 0 24px; padding: 0 12px 14px; }
226
+ .models-source { padding: 10px 36px 30px; }
227
+ .history-tools { padding: 10px 36px 0; }
228
+ .history-form { padding: 10px 36px 30px; }
229
+ .github-accounts { padding: 10px 36px; }
230
+ .model-group h4, .news-day, .changelog-type { font-family: var(--font-display); letter-spacing: 0.08em; color: var(--gold-ink); }
231
+ .news-bar { padding: 16px 18px 12px; }
232
+ .news-filters, .news-status { padding-left: 18px; padding-right: 18px; }
233
+ .news-body { padding: 0 18px 14px; }
234
+ .news-row { transition: background-color 0.15s; }
235
+ .news-row:hover { background: color-mix(in srgb, var(--gold) 7%, transparent); }
236
+ .news-row:first-child { border-radius: 6px 6px 0 0; }
237
+ .news-row:last-child { border-radius: 0 0 6px 6px; }
238
+
239
+ .terminal-panel { border-radius: 6px; }
240
+ .panel-bar { padding: 10px 14px; border-bottom: 1px solid; border-image: linear-gradient(90deg, transparent, var(--gold) 20%, var(--gold) 80%, transparent) 1; }
241
+
242
+ .auth { position: relative; border-radius: 6px; padding: 40px 44px; }
243
+ .auth pre { color: var(--gold-ink); }
244
+
245
+ @media (max-width: 640px) {
246
+ .models::after, .auth::after { border-width: 40px; }
247
+ .models-bar { padding: 24px 26px 10px; }
248
+ .models-body { margin: 0 16px; padding: 0 10px 12px; }
249
+ .models-source { padding: 10px 26px 24px; }
250
+ .history-tools { padding: 10px 26px 0; }
251
+ .history-form { padding: 10px 26px 24px; }
252
+ .github-accounts { padding: 10px 26px; }
253
+ .auth { padding: 32px 30px; }
254
+ }
255
+
256
+ @media (prefers-reduced-motion: reduce) {
257
+ .provider, .session-card, .card-aura, .session-card .card-art::after, .provider .card-art::before { transition: none; }
258
+ .provider:hover, .session-card:hover, .provider:hover .card-art::before { transform: none; }
259
+ .provider::before { display: none; }
260
+ .providers.deal > .provider, .session-card.enter, .level-badge.level-up, .agent.summon,
261
+ .session-card:has(.status-pill.active) .card-aura::before, .session-card:has(.status-pill.active) .card-aura::after { animation: none; }
262
+ }
263
+ }
264
+
265
+ :where(:root[data-skin="guild"][data-theme="dark"]) {
266
+ --gold-dim: #8a6d3b;
267
+ --card-bg: rgba(18, 20, 26, 0.9);
268
+ --glint: rgba(255, 238, 200, 0.1);
269
+ --empty-shadow: rgba(0, 0, 0, 0.55);
270
+ --page-art: image-set(url("page.avif") type("image/avif"), url("page.webp") type("image/webp"));
271
+
272
+ body { background: #0b0c10; }
273
+ .topbar { background: rgba(12, 13, 17, 0.88); backdrop-filter: blur(6px); }
274
+
275
+ .provider, .session-card {
276
+ background: var(--card-bg);
277
+ border: 1px solid color-mix(in srgb, var(--pc) 35%, #2a303b);
278
+ box-shadow: inset 0 0 0 1px rgba(232, 196, 124, 0.06), 0 8px 24px rgba(0, 0, 0, 0.35);
279
+ }
280
+ .provider:hover, .session-card:hover {
281
+ border-color: color-mix(in srgb, var(--pc) 70%, #2a303b);
282
+ box-shadow: inset 0 0 0 1px rgba(232, 196, 124, 0.1), 0 0 22px color-mix(in srgb, var(--pc) 22%, transparent);
283
+ }
284
+
285
+ .provider { padding-top: 188px; }
286
+ .provider .card-art {
287
+ inset: 0 0 auto 0; height: 250px;
288
+ mask-image: linear-gradient(to bottom, #000 55%, transparent 100%);
289
+ }
290
+ .provider .card-art::before { background-size: cover; background-position: center top; }
291
+ .provider.unavailable { border-color: #2a2d33; }
292
+ .provider .vendor { color: #f3ead8; }
293
+
294
+ .session-card { padding-left: 152px; }
295
+ .session-card .card-art, .session-card .card-aura {
296
+ inset: 0 auto 0 0; width: 168px;
297
+ mask-image: linear-gradient(to right, #000 62%, transparent 100%);
298
+ }
299
+ .session-card .card-aura {
300
+ mask-image: linear-gradient(to right, #000 62%, transparent 100%), linear-gradient(transparent, #000 22%, #000 78%, transparent);
301
+ mask-composite: intersect;
302
+ }
303
+ .session-card .card-art::before, .session-card .card-art::after { background-size: 168px auto; background-position: center top; }
304
+ .session-card:has(.status-pill.active) {
305
+ border-color: color-mix(in srgb, var(--pc) 75%, #2a303b);
306
+ box-shadow: inset 0 0 0 1px rgba(232, 196, 124, 0.1), 0 0 26px color-mix(in srgb, var(--pc) 28%, transparent);
307
+ }
308
+ .session-card.exited .card-art { filter: grayscale(1) brightness(0.7); }
309
+
310
+ .meter-bar, .stat-bar { background: #0c0e12; box-shadow: inset 0 0 0 1px rgba(232, 196, 124, 0.18); }
311
+ .meter-fill { background: linear-gradient(90deg, #1f9d5c, #52e08f); box-shadow: 0 0 8px rgba(82, 224, 143, 0.55); }
312
+ .meter + .meter .meter-fill { background: linear-gradient(90deg, #2a62c9, #5ba6ff); box-shadow: 0 0 8px rgba(91, 166, 255, 0.55); }
313
+ .meter.low .meter-fill { background: var(--warn); box-shadow: 0 0 8px rgba(224, 168, 74, 0.5); }
314
+ .meter.empty .meter-fill { background: var(--danger); box-shadow: 0 0 8px rgba(239, 107, 102, 0.5); }
315
+
316
+ .info { color: #b89a5e; }
317
+ .info:hover, .info:focus-visible { color: var(--gold); }
318
+ .stat-fill {
319
+ background: linear-gradient(90deg, color-mix(in srgb, var(--tier) 55%, #000), var(--tier));
320
+ box-shadow: 0 0 8px color-mix(in srgb, var(--tier) 50%, transparent);
321
+ }
322
+ .stat-tier {
323
+ background: linear-gradient(color-mix(in srgb, var(--tier) 34%, #1a1d26), #0d0f15);
324
+ border-color: color-mix(in srgb, var(--tier) 70%, #000);
325
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08), 0 0 6px color-mix(in srgb, var(--tier) 30%, transparent);
326
+ }
327
+ .tier-s .stat-tier { border-color: #f6dea6; box-shadow: 0 0 10px rgba(232, 196, 124, 0.6); }
328
+
329
+ .models {
330
+ border-radius: 6px; border-color: #4a3d25; background: #12141a;
331
+ box-shadow: inset 0 0 0 1px rgba(232, 196, 124, 0.06), 0 24px 60px rgba(0, 0, 0, 0.6);
332
+ }
333
+ .models::backdrop { background: rgba(5, 6, 9, 0.72); }
334
+ .models-bar, .models-source, .model-columns, .model { border-color: #2a2418; }
335
+ .model-columns { background: #12141a; }
336
+ .model-toggle:hover { background: rgba(232, 196, 124, 0.06); }
337
+ .model-group h4 { color: #c9ab72; }
338
+ .badge { background: rgba(0, 0, 0, 0.45); border-color: #4a3d25; }
339
+ .model-pill:hover { border-color: var(--gold-dim); }
340
+
341
+ .news-latest {
342
+ border-radius: 6px; border-color: #4a3d25; background: var(--card-bg);
343
+ box-shadow: inset 0 0 0 1px rgba(232, 196, 124, 0.06), 0 8px 24px rgba(0, 0, 0, 0.35);
344
+ }
345
+ .news-row + .news-row, .news-bar, .news-filters, .news-item, .news-status, .changelog-release + .changelog-release { border-color: #2a2418; }
346
+ .news-link { color: #f3ead8; }
347
+ a.news-link:visited { color: var(--muted); }
348
+ .news-panel {
349
+ background: #12141a; border-left-color: #4a3d25;
350
+ box-shadow: inset 1px 0 0 rgba(232, 196, 124, 0.08), -24px 0 60px rgba(0, 0, 0, 0.6);
351
+ }
352
+ .news-panel::backdrop { background: rgba(5, 6, 9, 0.72); }
353
+ .news-day { background: #12141a; color: #c9ab72; }
354
+ .changelog-type { color: #c9ab72; }
355
+ .news-filter { border-color: #4a3d25; background: rgba(0, 0, 0, 0.35); }
356
+ .news-filter:hover { border-color: var(--gold-dim); }
357
+ .news-filter[aria-pressed="true"] { border-color: #b8955a; color: #fff; background: #5b40d0 linear-gradient(#7a5fe6, #4f34bf); }
358
+
359
+ .status-pill { background: rgba(0, 0, 0, 0.45); border: 1px solid #4a3d25; }
360
+ .status-pill.active { border-color: color-mix(in srgb, var(--ok) 55%, transparent); box-shadow: 0 0 10px rgba(76, 195, 138, 0.25); }
361
+ .model-pill { border: 1px solid color-mix(in srgb, var(--accent) 45%, transparent); }
362
+ .provider .tier { background: rgba(0, 0, 0, 0.45); border-color: #4a3d25; color: var(--gold); }
363
+
364
+ .btn {
365
+ border-color: #4a3d25;
366
+ background: linear-gradient(#242834, #171a22);
367
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06), 0 1px 2px rgba(0, 0, 0, 0.5);
368
+ }
369
+ .btn:hover { border-color: var(--gold-dim); }
370
+ .btn.primary {
371
+ border-color: #b8955a; color: #fff; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.35);
372
+ background: #5b40d0 linear-gradient(#7a5fe6, #4f34bf);
373
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.22), 0 2px 10px rgba(91, 64, 208, 0.35);
374
+ }
375
+ .btn.primary:hover { border-color: var(--gold); filter: brightness(1.08); }
376
+ .btn.danger { color: #ff9a94; }
377
+ .btn.danger:hover { border-color: #b8524d; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06), 0 0 12px rgba(239, 107, 102, 0.3); }
378
+ .cwd input, .auth input { border-color: #4a3d25; background: rgba(12, 13, 17, 0.8); }
379
+ .auth {
380
+ background: var(--card-bg);
381
+ border: 1px solid #4a3d25; box-shadow: inset 0 0 0 1px rgba(232, 196, 124, 0.06), 0 8px 24px rgba(0, 0, 0, 0.35);
382
+ }
383
+ .auth pre { background: rgba(12, 13, 17, 0.8); border: 1px solid #2a2418; }
384
+ .notice h2 { color: #ff9a94; }
385
+ .notice.stopping h2 { color: var(--gold); }
386
+ .terminal-panel { border-color: #4a3d25; box-shadow: inset 0 0 0 1px rgba(232, 196, 124, 0.06), 0 24px 60px rgba(0, 0, 0, 0.6); }
387
+ .panel-bar { background: linear-gradient(#1a1d25, #121419); }
388
+
389
+ @media (max-width: 640px) {
390
+ .session-card { padding-left: 118px; }
391
+ .session-card .card-art, .session-card .card-aura { width: 132px; }
392
+ .session-card .card-art::before, .session-card .card-art::after { background-size: 132px auto; }
393
+ }
394
+ }
395
+
396
+ :where(:root[data-skin="guild"][data-theme="light"]) {
397
+ --page-art: image-set(url("page-light.avif") type("image/avif"), url("page-light.webp") type("image/webp"));
398
+ --glint: rgba(255, 244, 214, 0.26);
399
+ --empty-shadow: rgba(70, 48, 12, 0.28);
400
+ --card-shadow: inset 0 1px 0 #fff, 0 1px 2px rgba(70, 48, 12, 0.08), 0 10px 26px rgba(70, 48, 12, 0.1);
401
+
402
+ body { background: #eee5d4; }
403
+ .topbar { background: rgba(255, 252, 246, 0.9); backdrop-filter: blur(6px); }
404
+
405
+ .provider, .session-card {
406
+ background: var(--surface);
407
+ border: 1px solid #e4d6b6;
408
+ box-shadow: var(--card-shadow);
409
+ }
410
+ .provider:hover, .session-card:hover {
411
+ border-color: color-mix(in srgb, var(--pc) 40%, #d7c49b);
412
+ box-shadow: inset 0 1px 0 #fff, 0 2px 4px rgba(70, 48, 12, 0.08), 0 14px 34px rgba(70, 48, 12, 0.15);
413
+ }
414
+ .card-art {
415
+ border-radius: 3px;
416
+ background: radial-gradient(85% 70% at 50% 34%, color-mix(in srgb, var(--pc) 46%, #1d1726) 0%, #120f17 74%);
417
+ box-shadow: inset 0 0 0 1px rgba(255, 233, 186, 0.3), 0 0 0 1px #c9a45e, 0 1px 3px rgba(70, 48, 12, 0.3);
418
+ }
419
+ .provider .card-art::after {
420
+ content: ""; position: absolute; inset: 0;
421
+ background: linear-gradient(transparent 58%, rgba(10, 8, 14, 0.45));
422
+ box-shadow: inset 0 0 18px rgba(0, 0, 0, 0.55);
423
+ }
424
+
425
+ .provider { padding-top: 242px; }
426
+ .provider .card-art { inset: 14px 14px auto; height: 214px; }
427
+ .provider .card-art::before { background-size: 112% auto; background-position: 50% 4%; }
428
+ .provider.unavailable .card-art { background: radial-gradient(85% 70% at 50% 34%, #45434a 0%, #17161a 74%); }
429
+ .provider-icon:not(.has-image)[data-provider] { box-shadow: 0 0 0 1px #c9a45e, 0 1px 3px rgba(70, 48, 12, 0.3); }
430
+
431
+ .session-card { padding-left: 160px; }
432
+ .session-card .card-art, .session-card .card-aura { inset: 14px auto 14px 14px; width: 132px; border-radius: 3px; }
433
+ .session-card .card-aura { mask-image: linear-gradient(transparent, #000 22%, #000 78%, transparent); }
434
+ .session-card .card-art::before, .session-card .card-art::after { background-size: 160% auto; background-position: 50% 8%; }
435
+ .session-card:has(.status-pill.active) {
436
+ border-color: color-mix(in srgb, var(--pc) 55%, #d7c49b);
437
+ box-shadow: inset 0 1px 0 #fff, 0 2px 4px rgba(70, 48, 12, 0.08), 0 12px 30px color-mix(in srgb, var(--pc) 22%, rgba(70, 48, 12, 0.12));
438
+ }
439
+ .session-card.exited .card-art { filter: grayscale(1) brightness(0.9); }
440
+
441
+ .meter-bar, .stat-bar { background: #ebe2cd; box-shadow: inset 0 1px 2px rgba(70, 48, 12, 0.2); }
442
+ .meter-fill { background: linear-gradient(90deg, #1b7a45, #31a868); }
443
+ .meter + .meter .meter-fill { background: linear-gradient(90deg, #2a57b0, #4382e2); }
444
+ .meter.low .meter-fill { background: linear-gradient(90deg, #9a5f00, #d08a14); }
445
+ .meter.empty .meter-fill { background: linear-gradient(90deg, #a8302b, #d24a43); }
446
+ .stat-fill { background: linear-gradient(90deg, color-mix(in srgb, var(--tier) 72%, #3a2a10), var(--tier)); }
447
+ .stat-tier {
448
+ background: linear-gradient(color-mix(in srgb, var(--tier) 10%, #fffdf8), color-mix(in srgb, var(--tier) 24%, #fffdf8));
449
+ border-color: color-mix(in srgb, var(--tier) 55%, #fff);
450
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
451
+ }
452
+ .tier-s .stat-tier { color: #3a2604; border-color: #b8892f; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6), 0 1px 3px rgba(150, 100, 20, 0.35); }
453
+
454
+ .models { border-color: #d8c597; box-shadow: 0 24px 60px rgba(40, 28, 8, 0.28); }
455
+ .models::backdrop { background: rgba(40, 30, 14, 0.38); }
456
+ .model-toggle:hover { background: #f6eedd; }
457
+
458
+ .news-latest { border-color: #e4d6b6; box-shadow: 0 1px 2px rgba(70, 48, 12, 0.08), 0 10px 26px rgba(70, 48, 12, 0.08); }
459
+ .news-panel { border-left-color: #e2d3b2; box-shadow: -24px 0 60px rgba(40, 28, 8, 0.22); }
460
+ .news-panel::backdrop { background: rgba(40, 30, 14, 0.3); }
461
+
462
+ .status-pill { background: #f6efe0; border: 1px solid #e2d3b2; }
463
+ .status-pill.active { border-color: color-mix(in srgb, var(--ok) 40%, transparent); background: color-mix(in srgb, var(--ok) 8%, #fffcf6); }
464
+ .status-pill.exited { border-color: color-mix(in srgb, var(--danger) 35%, transparent); background: color-mix(in srgb, var(--danger) 6%, #fffcf6); }
465
+ .model-pill { border: 1px solid color-mix(in srgb, var(--accent) 35%, transparent); background: color-mix(in srgb, var(--accent) 9%, #fffcf6); }
466
+ .provider .tier { color: #5c3f08; border-color: #d4b06a; background: linear-gradient(#fbf0d2, #f1dfb2); }
467
+
468
+ .btn {
469
+ border-color: #d8c597;
470
+ background: linear-gradient(#fffefa, #f2e9d6);
471
+ box-shadow: inset 0 1px 0 #fff, 0 1px 2px rgba(70, 48, 12, 0.12);
472
+ }
473
+ .btn:hover { border-color: #b8892f; }
474
+ .btn.primary {
475
+ border-color: #8f6d2a; color: #fff; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);
476
+ background: #5a3fc0 linear-gradient(#6c51d6, #4a30ad);
477
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 2px 6px rgba(74, 48, 173, 0.28);
478
+ }
479
+ .btn.primary:hover { border-color: #b8892f; filter: brightness(1.08); }
480
+ .btn.danger:hover { border-color: #c4625d; }
481
+ .cwd input, .auth input, .history-tools input[type="search"], .history-form input {
482
+ border-color: #dccba5; background: #fffdf8; box-shadow: inset 0 1px 2px rgba(70, 48, 12, 0.06);
483
+ }
484
+ .auth { border-color: #e4d6b6; box-shadow: var(--card-shadow); }
485
+ .auth pre { background: #f6efe0; border: 1px solid #e4d6b6; }
486
+ .terminal-panel { border-color: #c9b07a; box-shadow: 0 24px 60px rgba(40, 28, 8, 0.35); }
487
+ .panel-bar { background: linear-gradient(#fffdf8, #f3ead7); }
488
+
489
+ @media (max-width: 640px) {
490
+ .session-card { padding-left: 140px; }
491
+ .session-card .card-art, .session-card .card-aura { width: 112px; }
492
+ .session-card .card-art::before, .session-card .card-art::after { background-size: 165% auto; }
493
+ }
494
+ }
495
+
496
+ @keyframes guild-deal { from { opacity: 0; transform: translateY(16px) rotate(-1.2deg) scale(0.97); } }
497
+ @keyframes guild-card-enter { from { opacity: 0; transform: translateY(10px) scale(0.98); } }
498
+ @keyframes guild-aura { from { opacity: 0.5; transform: scale(0.97); } to { opacity: 1; transform: scale(1.03); } }
499
+ @keyframes guild-sparks { to { transform: translateY(-96px); } }
500
+ @keyframes guild-level-up { 30% { transform: scale(1.28); filter: brightness(1.5) drop-shadow(0 0 8px #f6dea6); } }
501
+ @keyframes guild-summon { from { opacity: 0; transform: scale(0.3); } 60% { opacity: 1; transform: scale(1.15); } }
502
+