@bobfrankston/msger 0.1.74 → 0.1.76

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 (134) hide show
  1. package/KNOWN-BUGS.md +121 -0
  2. package/MSGER-API-SUMMARY.md +162 -0
  3. package/MSGER-API.md +376 -0
  4. package/README.md +93 -0
  5. package/SESSION-2025-11-06.md +191 -0
  6. package/SESSION-NOTES.md +678 -0
  7. package/clihandler.d.ts.map +1 -1
  8. package/clihandler.js +62 -2
  9. package/clihandler.js.map +1 -1
  10. package/clihandler.ts +60 -2
  11. package/icon.png +0 -0
  12. package/icon1.png +0 -0
  13. package/msger-native/Cargo.toml +1 -0
  14. package/msger-native/bin/msgernative.exe +0 -0
  15. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Breadcrumbs +12 -118
  16. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/BrowserMetrics/{BrowserMetrics-690552AF-DCD4.pma → BrowserMetrics-690B9AD3-657C.pma} +0 -0
  17. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/BrowserMetrics/{BrowserMetrics-69055373-F88C.pma → BrowserMetrics-690BA05A-501C.pma} +0 -0
  18. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Crashpad/settings.dat +0 -0
  19. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/BrowsingTopicsState +1 -1
  20. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/data_0 +0 -0
  21. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/data_1 +0 -0
  22. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/{BrowserMetrics/BrowserMetrics-69055587-A65C.pma → Default/Cache/Cache_Data/data_2} +0 -0
  23. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/data_3 +0 -0
  24. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000001 +383 -0
  25. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000002 +1091 -0
  26. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000003 +2153 -0
  27. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000004 +0 -0
  28. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000005 +626 -0
  29. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000006 +393 -0
  30. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/index +0 -0
  31. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/01241693cfdc32b9_0 +0 -0
  32. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/0ba1eea781f3552c_0 +0 -0
  33. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/323aa210eebefe2c_0 +0 -0
  34. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/4608446ac118e77a_0 +0 -0
  35. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/6938205dc2f77841_0 +0 -0
  36. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/6de12299dc89e5f3_0 +0 -0
  37. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/8f403c112eaa455b_0 +0 -0
  38. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/9a3aceb491137f07_0 +0 -0
  39. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/aedb266cbaf9c28f_0 +0 -0
  40. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/ca526fdda86d0b9d_0 +0 -0
  41. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/f5d11d783c9fdf69_0 +0 -0
  42. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/index-dir/the-real-index +0 -0
  43. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Collections/collectionsSQLite +0 -0
  44. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Collections/collectionsSQLite-journal +0 -0
  45. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DIPS +0 -0
  46. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnGraphiteCache/data_1 +0 -0
  47. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnGraphiteCache/index +0 -0
  48. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnWebGPUCache/data_1 +0 -0
  49. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnWebGPUCache/index +0 -0
  50. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Extension State/LOG +3 -3
  51. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Extension State/LOG.old +3 -3
  52. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Favicons +0 -0
  53. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/data_0 +0 -0
  54. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/data_1 +0 -0
  55. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/data_2 +0 -0
  56. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/index +0 -0
  57. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/History +0 -0
  58. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Local Storage/leveldb/000003.log +0 -0
  59. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Local Storage/leveldb/LOG +3 -3
  60. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Local Storage/leveldb/LOG.old +3 -3
  61. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/MediaDeviceSalts +0 -0
  62. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/MediaDeviceSalts-journal +0 -0
  63. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Network/Network Persistent State +1 -1
  64. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Network/TransportSecurity +1 -0
  65. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Preferences +1 -1
  66. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/CacheStorage/14e849fa8522d406112ea607cf7fd6342b71b987/249ee9af-c3df-4a86-89a8-2c51f3370ee0/index +0 -0
  67. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/CacheStorage/14e849fa8522d406112ea607cf7fd6342b71b987/249ee9af-c3df-4a86-89a8-2c51f3370ee0/index-dir/the-real-index +0 -0
  68. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/CacheStorage/14e849fa8522d406112ea607cf7fd6342b71b987/index.txt +0 -0
  69. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/000003.log +0 -0
  70. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/CURRENT +1 -0
  71. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/LOCK +0 -0
  72. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/LOG +3 -0
  73. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/LOG.old +3 -0
  74. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/MANIFEST-000001 +0 -0
  75. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_0 +0 -0
  76. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_1 +0 -0
  77. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/ScriptCache/index +0 -0
  78. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/ScriptCache/index-dir/the-real-index +0 -0
  79. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/000003.log +0 -0
  80. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/LOG +3 -3
  81. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/LOG.old +3 -3
  82. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Site Characteristics Database/000003.log +0 -0
  83. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Site Characteristics Database/LOG +3 -3
  84. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Site Characteristics Database/LOG.old +3 -3
  85. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/LOG +3 -3
  86. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/LOG.old +3 -3
  87. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/WebStorage/QuotaManager +0 -0
  88. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/WebStorage/QuotaManager-journal +0 -0
  89. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/favorites_diagnostic.log +27 -0
  90. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/000003.log +0 -0
  91. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/LOG +3 -3
  92. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/LOG.old +3 -3
  93. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/000003.log +0 -0
  94. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/LOG +3 -3
  95. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/LOG.old +3 -3
  96. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_0 +0 -0
  97. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_1 +0 -0
  98. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_3 +0 -0
  99. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/f_000003 +0 -0
  100. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/f_000004 +0 -0
  101. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/index +0 -0
  102. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GraphiteDawnCache/data_1 +0 -0
  103. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GraphiteDawnCache/index +0 -0
  104. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Local State +1 -1
  105. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/RevisitationBloomfilter +0 -0
  106. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/ShaderCache/data_1 +0 -0
  107. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/ShaderCache/index +0 -0
  108. package/msger-native/src/main.rs +343 -37
  109. package/msger-native/src/template.html +103 -28
  110. package/msger-storage-demo.html +290 -0
  111. package/msger.code-workspace +3 -0
  112. package/msgerdefs/README.md +122 -0
  113. package/msgerdefs/msgerdefs.d.ts +322 -0
  114. package/msgerdefs/msgerdefs.d.ts.map +1 -0
  115. package/msgerdefs/msgerdefs.js +110 -0
  116. package/msgerdefs/msgerdefs.js.map +1 -0
  117. package/msgerdefs/msgerdefs.ts +427 -0
  118. package/msgerdefs/package.json +38 -0
  119. package/msgerdefs/samples.html +431 -0
  120. package/msgerdefs/test1.cmd +1 -0
  121. package/msgerdefs/tsconfig.json +17 -0
  122. package/msgernative-linux-x64 +0 -0
  123. package/package.json +5 -1
  124. package/shower.d.ts +2 -0
  125. package/shower.d.ts.map +1 -1
  126. package/shower.js +17 -0
  127. package/shower.js.map +1 -1
  128. package/shower.ts +24 -0
  129. package/test-data-persistence.html +315 -0
  130. package/test-htmlfrom.html +29 -0
  131. package/test-ipc-reach.html +113 -0
  132. package/test-msger-api.html +120 -0
  133. package/test-msger-functions.html +325 -0
  134. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/BrowserMetrics/BrowserMetrics-69055419-C8A0.pma +0 -0
@@ -0,0 +1,1091 @@
1
+ :root {
2
+ /* Clock colors */
3
+ --clock-bg: white;
4
+ --clock-numbers: black;
5
+ --clock-hands: black;
6
+ --second-hand-color: red;
7
+
8
+ /* Timer colors */
9
+ --timer-minutes-color: red;
10
+ --timer-seconds-color: yellow;
11
+ --timer-final-minute-color: #ffa500;
12
+ /* Orange/yellow for final minute */
13
+ --timer-dots-color: yellow;
14
+ --timer-bg-subtle: color-mix(in srgb, var(--timer-minutes-color), var(--clock-bg) 90%);
15
+
16
+ /* Digital time */
17
+ --digital-time-color: blue;
18
+
19
+ /* Typography */
20
+ --clock-font: 'Arial Black', 'Impact', sans-serif;
21
+
22
+ /* Battery indicator */
23
+ --battery-size: 10vmin;
24
+ --battery-position: 25%;
25
+ --battery-threshold: 50;
26
+
27
+ /* Banner states */
28
+ --banner-bg-unavailable: #ff6b6b;
29
+ --banner-bg-denied: #ff6b6b;
30
+ --banner-bg-disabled: #f39c12;
31
+ --banner-bg-waiting: #4a90e2;
32
+ --banner-bg-listening: #27ae60;
33
+ --banner-bg-speech-blocked: #f39c12;
34
+ --banner-text-unavailable: #fff;
35
+ --banner-text-denied: #fff;
36
+ --banner-text-disabled: #fff;
37
+ --banner-text-waiting: #fff;
38
+ --banner-text-listening: #fff;
39
+ --banner-text-speech-blocked: #fff;
40
+
41
+ /* Settings panel */
42
+ --settings-bg: rgba(255, 255, 255, 0.95);
43
+ --settings-text: black;
44
+ --settings-border: #ddd;
45
+
46
+ /* Buttons */
47
+ --button-bg: #007bff;
48
+ --button-text: white;
49
+ --button-hover: #0056b3;
50
+ --button-disabled: #ccc;
51
+ --button-danger: #dc3545;
52
+ --button-danger-hover: #c82333;
53
+
54
+ /* Version box */
55
+ --version-bg: #0371e6;
56
+ --version-text: white;
57
+
58
+ /* Computed colors */
59
+ --clock-hands-alpha: color-mix(in srgb, var(--clock-numbers), transparent 10%);
60
+ --shadow-color: color-mix(in srgb, var(--clock-numbers), transparent 80%);
61
+ --border-color: color-mix(in srgb, var(--clock-numbers), var(--clock-bg) 80%);
62
+ }
63
+
64
+ /* Dark theme overrides */
65
+ [data-theme="dark"] {
66
+ --clock-bg: #1a1a1a;
67
+ --clock-numbers: #ffffff;
68
+ --clock-hands: #ffffff;
69
+ --second-hand-color: #ff4444;
70
+
71
+ --timer-minutes-color: #ff4444;
72
+ --timer-seconds-color: #ffff44;
73
+ --timer-final-minute-color: #ffaa00;
74
+ /* Brighter orange/yellow for dark theme */
75
+ --timer-dots-color: #ffff44;
76
+
77
+ --digital-time-color: #4da6ff;
78
+
79
+ --settings-bg: rgba(42, 42, 42, 0.95);
80
+ --settings-text: #ffffff;
81
+ --settings-border: #555;
82
+
83
+ --button-bg: #0056b3;
84
+ --button-text: white;
85
+ --button-hover: #004085;
86
+ }
87
+
88
+ /* System theme (auto dark/light based on user preference) */
89
+ @media (prefers-color-scheme: dark) {
90
+ :root:not([data-theme="light"]) {
91
+ --clock-bg: #1a1a1a;
92
+ --clock-numbers: #ffffff;
93
+ --clock-hands: #ffffff;
94
+ --second-hand-color: #ff4444;
95
+
96
+ --timer-minutes-color: #ff4444;
97
+ --timer-seconds-color: #ffff44;
98
+ --timer-final-minute-color: #ffaa00;
99
+ /* Brighter orange/yellow for dark system theme */
100
+ --timer-dots-color: #ffff44;
101
+
102
+ --digital-time-color: #4da6ff;
103
+
104
+ --settings-bg: rgba(42, 42, 42, 0.95);
105
+ --settings-text: #ffffff;
106
+ --settings-border: #555;
107
+
108
+ --button-bg: #0056b3;
109
+ --button-text: white;
110
+ --button-hover: #004085;
111
+ }
112
+ }
113
+
114
+ /* ==================== Base Styles ==================== */
115
+ html,
116
+ body {
117
+ height: 100vh;
118
+ width: 100vw;
119
+ margin: 0;
120
+ padding: 0;
121
+ box-sizing: border-box;
122
+ overflow: hidden;
123
+ /* Prevent scrolling - fixed window app */
124
+ background: var(--clock-bg);
125
+ font-family: var(--clock-font);
126
+ }
127
+
128
+ body {
129
+ display: flex;
130
+ flex-direction: column;
131
+ }
132
+
133
+ /* ==================== Clock Animation ==================== */
134
+ @keyframes rotate-360 {
135
+ from {
136
+ transform: rotate(0deg);
137
+ }
138
+
139
+ to {
140
+ transform: rotate(360deg);
141
+ }
142
+ }
143
+
144
+ /* ==================== Main Layout ==================== */
145
+ #main-content {
146
+ flex: 1;
147
+ min-height: 0;
148
+ /* Important for flex child */
149
+ position: relative;
150
+ /* Remove margin-top - we'll use flex layout instead */
151
+ }
152
+
153
+ /* ==================== Clock Container ==================== */
154
+ #clock-container {
155
+ position: absolute;
156
+ top: 50%;
157
+ left: 50%;
158
+ /* Maximized sizing - 95% of smaller viewport dimension */
159
+ width: min(95vw, 95vh);
160
+ height: min(95vw, 95vh);
161
+ aspect-ratio: 1 / 1;
162
+ transform: translate(-50%, -50%);
163
+ display: flex;
164
+ justify-content: center;
165
+ align-items: center;
166
+
167
+ /* Analog clock styles */
168
+ & #analog-clock {
169
+ width: 100%;
170
+ height: 100%;
171
+ /* Prevent text selection */
172
+ -webkit-user-select: none;
173
+ -moz-user-select: none;
174
+ -ms-user-select: none;
175
+ user-select: none;
176
+
177
+ /* Clock SVG elements */
178
+ & .hour-hand {
179
+ stroke: var(--clock-numbers);
180
+ transform-origin: 200px 200px;
181
+ animation: rotate-360 43200s linear infinite;
182
+ animation-delay: var(--hours-offset, 0s);
183
+ }
184
+
185
+ & .minute-hand {
186
+ stroke: var(--clock-numbers);
187
+ transform-origin: 200px 200px;
188
+ animation: rotate-360 3600s linear infinite;
189
+ animation-delay: var(--minutes-offset, 0s);
190
+ }
191
+
192
+ & .second-hand {
193
+ stroke: var(--second-hand-color);
194
+ transform-origin: 200px 200px;
195
+ animation: rotate-360 60s linear infinite;
196
+ animation-delay: var(--seconds-offset, 0s);
197
+ }
198
+
199
+ & .hour-markers,
200
+ & .minute-markers {
201
+ stroke: var(--clock-numbers);
202
+ }
203
+
204
+ /* Prevent text selection on all SVG text elements */
205
+ & text {
206
+ -webkit-user-select: none;
207
+ -moz-user-select: none;
208
+ -ms-user-select: none;
209
+ user-select: none;
210
+ cursor: default;
211
+ }
212
+
213
+ & .hour-numbers {
214
+ fill: var(--clock-numbers);
215
+ }
216
+
217
+ & .countdown-dot {
218
+ transition: opacity 0.3s ease, fill 0.3s ease;
219
+ stroke: black;
220
+ stroke-width: 1;
221
+ opacity: var(--dot-opacity, 0.1);
222
+ /* Use CSS custom property for visibility */
223
+ fill: var(--dot-color, var(--timer-seconds-color));
224
+ /* Use CSS custom property for color */
225
+ }
226
+ }
227
+ }
228
+
229
+ /* ==================== Digital Time Display ==================== */
230
+ /* Digital time inside the SVG */
231
+ #analog-clock #digital-time {
232
+ display: none;
233
+
234
+ &.visible {
235
+ display: block;
236
+ }
237
+ }
238
+
239
+ /* External digital time overlay */
240
+ #digital-time-overlay {
241
+ display: none;
242
+ position: absolute;
243
+ top: 50%;
244
+ left: 50%;
245
+ transform: translate(-50%, -50%);
246
+ font-size: calc(15vmin);
247
+ color: var(--digital-time-color);
248
+ background: transparent;
249
+ padding: 0;
250
+ border-radius: 0;
251
+ font-weight: bold;
252
+ text-align: center;
253
+ -webkit-user-select: none;
254
+ -moz-user-select: none;
255
+ -ms-user-select: none;
256
+ user-select: none;
257
+ line-height: 1;
258
+ z-index: 50;
259
+ pointer-events: none;
260
+
261
+ &.visible {
262
+ display: flex;
263
+ align-items: center;
264
+ justify-content: center;
265
+ }
266
+ }
267
+
268
+ /* AM/PM indicator in lower left */
269
+ #ampm-indicator {
270
+ position: fixed;
271
+ /* Changed from absolute to fixed for better viewport positioning */
272
+ bottom: 20px;
273
+ left: 20px;
274
+ font-size: 3vmin;
275
+ font-weight: bold;
276
+ padding: 8px 12px;
277
+ border-radius: 8px;
278
+ z-index: 60;
279
+ min-width: 50px;
280
+ text-align: center;
281
+ line-height: 1;
282
+ transition: all 0.3s ease;
283
+
284
+ /* AM styling - black text on white background */
285
+ &.am {
286
+ color: #000000;
287
+ background: #ffffff;
288
+ border: 2px solid #000000;
289
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
290
+ }
291
+
292
+ /* PM styling - white text on black background */
293
+ &.pm {
294
+ color: #ffffff;
295
+ background: #000000;
296
+ border: 2px solid #ffffff;
297
+ box-shadow: 0 2px 6px rgba(255, 255, 255, 0.3);
298
+ }
299
+ }
300
+
301
+ /* ==================== Timer Elements ==================== */
302
+ #timer-countdown {
303
+ display: none;
304
+ font-size: 6vmin;
305
+ font-weight: bold;
306
+ color: var(--timer-minutes-color);
307
+ text-align: center;
308
+ padding: 15px 20px;
309
+ background: var(--timer-bg-subtle);
310
+ border: 1px solid var(--border-color);
311
+ border-radius: 10px;
312
+ box-shadow: 0 2px 10px var(--shadow-color);
313
+ min-width: 120px;
314
+
315
+ &.visible {
316
+ display: block;
317
+ }
318
+ }
319
+
320
+ #timer-cancel-floating {
321
+ display: none;
322
+ position: absolute;
323
+ bottom: 10px;
324
+ left: 50%;
325
+ transform: translateX(-50%);
326
+ background: var(--button-danger);
327
+ color: white;
328
+ border: none;
329
+ border-radius: 6px;
330
+ padding: 6px 12px;
331
+ font-size: 13px;
332
+ font-weight: bold;
333
+ cursor: pointer;
334
+ box-shadow: 0 2px 6px rgba(220, 53, 69, 0.15);
335
+ z-index: 101;
336
+
337
+ &.active {
338
+ display: block;
339
+ }
340
+ }
341
+
342
+ /* ==================== Inactivity Fading ==================== */
343
+ /* Fader class for UI elements that hide on inactivity */
344
+ .fader {
345
+ transition: opacity 500ms ease-in-out;
346
+ }
347
+
348
+ .fader.hidden {
349
+ opacity: 0;
350
+ pointer-events: none;
351
+ /* Prevent interaction when hidden */
352
+ }
353
+
354
+ /* Hide cursor when inactive */
355
+ body.hide-cursor {
356
+ cursor: none;
357
+ }
358
+
359
+ body.hide-cursor * {
360
+ cursor: none !important;
361
+ }
362
+
363
+ /* Green listening indicator removed - wake word showing UI provides sufficient feedback */
364
+
365
+ /* ==================== Wake Word Banner ==================== */
366
+ #banner-container {
367
+ position: relative;
368
+ /* Create positioning context for progress bar */
369
+ flex-shrink: 0;
370
+ /* Don't shrink this element */
371
+ width: 100vw;
372
+ z-index: 3000;
373
+ min-height: 38px;
374
+ /* Stable height regardless of progress bar */
375
+ }
376
+
377
+ #banner-content {
378
+ position: relative;
379
+ width: 100%;
380
+ min-height: 38px;
381
+ }
382
+
383
+ /* All banners share common layout, each has its own colors */
384
+ #banner-unavailable,
385
+ #banner-disabled,
386
+ #banner-waiting,
387
+ #banner-listening,
388
+ #banner-speech-blocked,
389
+ #banner-network-error {
390
+ width: 100%;
391
+ min-height: 38px;
392
+ font-family: Arial, sans-serif;
393
+ font-size: 16px;
394
+ font-weight: normal;
395
+ text-align: center;
396
+ line-height: 38px;
397
+ display: none;
398
+ /* Hidden by default - only show when .active class is added */
399
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
400
+ letter-spacing: 0.02em;
401
+ transition: background 0.3s, color 0.3s;
402
+ }
403
+
404
+ #banner-unavailable.active,
405
+ #banner-disabled.active,
406
+ #banner-waiting.active,
407
+ #banner-listening.active,
408
+ #banner-speech-blocked.active,
409
+ #banner-network-error.active {
410
+ display: block;
411
+ }
412
+
413
+ #banner-unavailable {
414
+ background: var(--banner-bg-unavailable);
415
+ color: var(--banner-text-unavailable);
416
+ }
417
+
418
+ #banner-disabled {
419
+ background: var(--banner-bg-disabled);
420
+ color: var(--banner-text-disabled);
421
+ }
422
+
423
+ #banner-waiting {
424
+ background: var(--banner-bg-waiting);
425
+ color: var(--banner-text-waiting);
426
+ }
427
+
428
+ #banner-listening {
429
+ background: var(--banner-bg-listening);
430
+ color: var(--banner-text-listening);
431
+ }
432
+
433
+ #banner-speech-blocked {
434
+ background: var(--banner-bg-speech-blocked);
435
+ color: var(--banner-text-speech-blocked);
436
+ }
437
+
438
+ #banner-network-error {
439
+ background: #dc3545;
440
+ color: white;
441
+ }
442
+
443
+ /* Dimming support for inactive banners */
444
+ #banner-unavailable.dimmed,
445
+ #banner-disabled.dimmed,
446
+ #banner-waiting.dimmed,
447
+ #banner-listening.dimmed,
448
+ #banner-speech-blocked.dimmed,
449
+ #banner-network-error.dimmed {
450
+ opacity: 0.3;
451
+ }
452
+
453
+ /* Active banners should be fully opaque even when dimmed, but respect parent hidden state */
454
+ .fader:not(.hidden) #banner-unavailable.active,
455
+ .fader:not(.hidden) #banner-disabled.active,
456
+ .fader:not(.hidden) #banner-waiting.active,
457
+ .fader:not(.hidden) #banner-listening.active,
458
+ .fader:not(.hidden) #banner-speech-blocked.active,
459
+ .fader:not(.hidden) #banner-network-error.active {
460
+ opacity: 1 !important;
461
+ }
462
+
463
+ /* Progress bar overlay relative to banner content */
464
+ #progress-container {
465
+ position: absolute;
466
+ bottom: 0;
467
+ left: 0;
468
+ width: 100%;
469
+ height: 6px;
470
+ background: rgba(0, 0, 0, 0.2);
471
+ overflow: hidden;
472
+ }
473
+
474
+ #progress-container.hidden {
475
+ display: none;
476
+ }
477
+
478
+ .timeout-progress-bar {
479
+ height: 100%;
480
+ background: var(--timer-seconds-color, red);
481
+ width: 100%;
482
+ transition: width 0.1s linear;
483
+ }
484
+
485
+ /* ==================== Debug Log ==================== */
486
+ #debug-log {
487
+ position: fixed;
488
+ top: 50%;
489
+ left: 50%;
490
+ transform: translate(-50%, -50%);
491
+ width: 90vw;
492
+ max-width: 1200px;
493
+ max-height: 70vh;
494
+ background: rgba(0, 0, 0, 0.75);
495
+ color: white;
496
+ border: 2px solid #333;
497
+ border-radius: 12px;
498
+ padding: 20px;
499
+ font-family: monospace;
500
+ font-size: 14px;
501
+ z-index: 3000;
502
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
503
+
504
+ &.hidden {
505
+ display: none;
506
+ }
507
+ }
508
+
509
+ #debug-log-content {
510
+ max-height: calc(70vh - 100px);
511
+ overflow-y: auto;
512
+ white-space: pre-wrap;
513
+ word-break: break-word;
514
+ background: rgba(255, 255, 255, 0.05);
515
+ padding: 15px;
516
+ border-radius: 8px;
517
+ margin-bottom: 15px;
518
+ }
519
+
520
+ #debug-log-controls {
521
+ display: flex;
522
+ justify-content: space-between;
523
+ align-items: center;
524
+ margin-top: 15px;
525
+ }
526
+
527
+ #debug-log-legend {
528
+ color: #bbb;
529
+ font-size: 13px;
530
+ font-family: monospace;
531
+ padding: 5px;
532
+ background: rgba(255, 255, 255, 0.05);
533
+ border-radius: 4px;
534
+ }
535
+
536
+ #clear-log {
537
+ padding: 8px 16px;
538
+ background: #444;
539
+ color: white;
540
+ border: 1px solid #666;
541
+ border-radius: 6px;
542
+ cursor: pointer;
543
+ font-family: monospace;
544
+
545
+ &:hover {
546
+ background: #666;
547
+ }
548
+ }
549
+
550
+ /* ==================== Battery Indicator ==================== */
551
+ #battery-indicator {
552
+ position: fixed;
553
+ bottom: var(--battery-position);
554
+ right: var(--battery-position);
555
+ width: var(--battery-size);
556
+ height: var(--battery-size);
557
+ background: rgba(255, 0, 0, 0.8);
558
+ color: white;
559
+ display: flex;
560
+ justify-content: center;
561
+ align-items: center;
562
+ font-size: calc(var(--battery-size) * 0.3);
563
+ font-weight: bold;
564
+ border-radius: 8px;
565
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
566
+
567
+ &.hidden {
568
+ display: none;
569
+ }
570
+ }
571
+
572
+ /* ==================== Settings & Controls ==================== */
573
+ #fixed-controls {
574
+ position: fixed;
575
+ right: 12px;
576
+ bottom: 12px;
577
+ display: flex;
578
+ flex-direction: column;
579
+ align-items: stretch;
580
+ z-index: 2100;
581
+
582
+ & #settings-toggle {
583
+ width: 100%;
584
+ min-width: 90px;
585
+ height: 40px;
586
+ background: var(--settings-bg);
587
+ color: var(--settings-text);
588
+ border: 2px solid var(--settings-border);
589
+ border-radius: 6px 6px 0 0;
590
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.10);
591
+ display: flex;
592
+ align-items: center;
593
+ justify-content: center;
594
+ font-size: 24px;
595
+ cursor: pointer;
596
+ transition: background 0.2s;
597
+
598
+ &:hover {
599
+ background: var(--button-hover);
600
+ }
601
+ }
602
+
603
+ & #install-button {
604
+ width: 100%;
605
+ min-width: 90px;
606
+ height: 40px;
607
+ background: var(--settings-bg);
608
+ color: var(--settings-text);
609
+ border: 2px solid var(--settings-border);
610
+ border-radius: 0;
611
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.10);
612
+ display: flex;
613
+ align-items: center;
614
+ justify-content: center;
615
+ font-size: 14px;
616
+ font-weight: bold;
617
+ cursor: pointer;
618
+ transition: all 0.2s ease;
619
+
620
+ &:hover {
621
+ background: var(--button-hover);
622
+ color: var(--button-text);
623
+ transform: translateY(-1px);
624
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
625
+ }
626
+
627
+ &.hidden {
628
+ display: none !important;
629
+ }
630
+
631
+ &.inactivity-countdown {
632
+ color: var(--settings-text);
633
+ font-size: 12px;
634
+ text-align: center;
635
+ padding: 4px;
636
+ }
637
+ }
638
+
639
+ & #version-box {
640
+ width: auto;
641
+ min-width: 60px;
642
+ max-width: 160px;
643
+ padding: 6px 12px;
644
+ box-sizing: border-box;
645
+ background: var(--version-bg);
646
+ color: var(--version-text);
647
+ border-radius: 0;
648
+ font-size: 15px;
649
+ font-weight: bold;
650
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
651
+ opacity: 0.92;
652
+ pointer-events: auto;
653
+ text-align: center;
654
+ }
655
+
656
+ & #inactivity-countdown {
657
+ padding: 4px 12px;
658
+ background: var(--settings-bg);
659
+ color: var(--settings-text);
660
+ border-radius: 0;
661
+ font-size: 11px;
662
+ text-align: center;
663
+ }
664
+
665
+ & #memory-display {
666
+ padding: 4px 12px;
667
+ background: var(--settings-bg);
668
+ color: var(--settings-text);
669
+ border-radius: 0 0 6px 6px;
670
+ font-size: 11px;
671
+ text-align: center;
672
+ }
673
+ }
674
+
675
+ #settings-panel {
676
+ position: fixed;
677
+ bottom: 24px;
678
+ right: 24px;
679
+ background: var(--settings-bg);
680
+ color: var(--settings-text);
681
+ border: 2px solid var(--settings-border);
682
+ border-radius: 8px;
683
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
684
+ z-index: 1000;
685
+ width: 220px;
686
+ max-width: 90vw;
687
+ padding: 12px;
688
+ font-size: 14px;
689
+ display: flex;
690
+ flex-direction: column;
691
+ gap: 8px;
692
+
693
+ &.collapsed {
694
+ display: none;
695
+ }
696
+
697
+ & .settings-actions {
698
+ margin-top: 20px;
699
+ padding-top: 15px;
700
+ border-top: 1px solid var(--settings-border);
701
+ text-align: center;
702
+ }
703
+
704
+ & .danger-button {
705
+ background: var(--button-danger);
706
+ color: white;
707
+ border: none;
708
+ padding: 8px 16px;
709
+ border-radius: 4px;
710
+ cursor: pointer;
711
+ font-size: 14px;
712
+
713
+ &:hover {
714
+ background: var(--button-danger-hover);
715
+ }
716
+ }
717
+ }
718
+
719
+ /* Weather Temperature Display */
720
+ .weather-temperature {
721
+ position: fixed;
722
+ top: 30px;
723
+ right: 30px;
724
+ font-family: var(--clock-font);
725
+ font-size: 112px;
726
+ /* 4x clock numbers (28px) */
727
+ color: var(--clock-numbers);
728
+ font-weight: bold;
729
+ z-index: 100;
730
+ user-select: none;
731
+ pointer-events: none;
732
+ display: flex;
733
+ flex-direction: column;
734
+ align-items: flex-end;
735
+ }
736
+
737
+ .weather-temperature .weather-main {
738
+ line-height: 1;
739
+ }
740
+
741
+ .weather-temperature .weather-feels-like {
742
+ font-size: 0.75em;
743
+ /* 75% of main temperature size */
744
+ opacity: 0.85;
745
+ margin-top: -0.15em;
746
+ /* Pull up slightly closer to main temp */
747
+ padding-right: 0.05em;
748
+ /* Slight offset to the right */
749
+ }
750
+
751
+ .weather-temperature .weather-humidity {
752
+ font-size: 0.55em;
753
+ /* 55% of main temperature size, smaller than feels like */
754
+ opacity: 0.75;
755
+ margin-top: -0.1em;
756
+ padding-right: 0.05em;
757
+ }
758
+
759
+ .weather-temperature .weather-condition {
760
+ font-size: 0.6em;
761
+ /* 60% of main temperature size */
762
+ opacity: 0.9;
763
+ margin-top: 0.05em;
764
+ padding-right: 0;
765
+ font-style: italic;
766
+ }
767
+
768
+ .weather-temperature.weather-error {
769
+ color: #999;
770
+ opacity: 0.7;
771
+ }
772
+
773
+ /* Responsive adjustments for weather display */
774
+ @media (max-width: 768px) {
775
+ .weather-temperature {
776
+ top: 20px;
777
+ right: 20px;
778
+ font-size: 84px;
779
+ /* Slightly smaller on mobile */
780
+ }
781
+ }
782
+
783
+ @media (max-height: 600px) {
784
+ .weather-temperature {
785
+ top: 15px;
786
+ right: 15px;
787
+ font-size: 76px;
788
+ /* Even smaller on very short screens */
789
+ }
790
+ }
791
+
792
+ /* Settings Theme Display Classes */
793
+ #settings-panel.theme-light {
794
+ background: var(--light-bg, #ffffff);
795
+ color: var(--light-text, #333333);
796
+ border-color: var(--light-border, #cccccc);
797
+ }
798
+
799
+ #settings-panel.theme-dark {
800
+ background: var(--dark-bg, #2d2d2d);
801
+ color: var(--dark-text, #ffffff);
802
+ border-color: var(--dark-border, #555555);
803
+ }
804
+
805
+ #settings-panel.theme-system {
806
+ /* Use default CSS variables that respond to system theme */
807
+ background: var(--settings-bg);
808
+ color: var(--settings-text);
809
+ border-color: var(--settings-border);
810
+ }
811
+
812
+ /* AI Configuration Section */
813
+ #ai-config {
814
+ background: rgba(0, 123, 255, 0.1);
815
+ border: 1px solid #007bff;
816
+ border-radius: 4px;
817
+ padding: 8px;
818
+ margin-top: 8px;
819
+
820
+ & label {
821
+ margin-bottom: 4px;
822
+ font-weight: bold;
823
+ }
824
+
825
+ & select,
826
+ & input {
827
+ width: 100%;
828
+ padding: 4px;
829
+ margin-bottom: 8px;
830
+ border: 1px solid var(--settings-border);
831
+ border-radius: 3px;
832
+ font-size: 12px;
833
+ }
834
+
835
+ & input[type="password"] {
836
+ font-family: monospace;
837
+ }
838
+ }
839
+
840
+ /* ==================== Log Overlay ==================== */
841
+ #log-overlay {
842
+ position: fixed;
843
+ top: 0;
844
+ left: 0;
845
+ width: 100vw;
846
+ height: 100vh;
847
+ background: rgba(0, 0, 0, 0.8);
848
+ z-index: 2000;
849
+ display: flex;
850
+ justify-content: center;
851
+ align-items: center;
852
+
853
+ &.collapsed {
854
+ display: none;
855
+ }
856
+
857
+ & #log-content {
858
+ background: var(--settings-bg);
859
+ color: var(--settings-text);
860
+ border: 2px solid var(--settings-border);
861
+ border-radius: 8px;
862
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2);
863
+ width: min(90vw, 600px);
864
+ max-height: 80vh;
865
+ padding: 20px;
866
+ display: flex;
867
+ flex-direction: column;
868
+
869
+ & h3 {
870
+ margin: 0 0 15px 0;
871
+ color: var(--settings-text);
872
+ }
873
+
874
+ & #log-messages {
875
+ flex: 1;
876
+ overflow-y: auto;
877
+ max-height: 60vh;
878
+ border: 1px solid var(--settings-border);
879
+ border-radius: 4px;
880
+ padding: 10px;
881
+ background: var(--clock-bg);
882
+ font-family: monospace;
883
+ font-size: 12px;
884
+ line-height: 1.4;
885
+
886
+ & .log-entry {
887
+ margin-bottom: 2px;
888
+ word-wrap: break-word;
889
+ color: var(--clock-numbers);
890
+ }
891
+ }
892
+
893
+ & small {
894
+ margin-top: 10px;
895
+ text-align: center;
896
+ opacity: 0.7;
897
+ }
898
+ }
899
+ }
900
+
901
+ #log-toggle {
902
+ width: 100%;
903
+ min-width: 90px;
904
+ height: 40px;
905
+ background: var(--settings-bg);
906
+ color: var(--settings-text);
907
+ border: 2px solid var(--settings-border);
908
+ border-radius: 0;
909
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.10);
910
+ display: flex;
911
+ flex-direction: column;
912
+ align-items: center;
913
+ justify-content: center;
914
+ font-size: 20px;
915
+ cursor: pointer;
916
+ position: relative;
917
+
918
+ transition: background 0.2s;
919
+
920
+
921
+ &:hover {
922
+ background: var(--button-hover);
923
+ }
924
+ }
925
+
926
+ /* ==================== Responsive Design ==================== */
927
+ @media (orientation: portrait) {
928
+ /* Clock size now handled by main CSS */
929
+
930
+ #ampm-indicator {
931
+ bottom: 20px;
932
+ left: 20px;
933
+ font-size: 3vmin;
934
+ }
935
+ }
936
+
937
+ @media (orientation: landscape) {
938
+ /* Clock size now handled by main CSS */
939
+
940
+ #ampm-indicator {
941
+ bottom: 20px;
942
+ left: 20px;
943
+ font-size: 2.5vmin;
944
+ /* Slightly smaller in landscape */
945
+ /* Ensure it stays visible in landscape */
946
+ max-width: calc(15vw);
947
+ }
948
+ }
949
+
950
+ /* Specific adjustments for landscape tablets */
951
+ @media (orientation: landscape) and (min-width: 768px) {
952
+ /* Clock size now handled by main CSS */
953
+
954
+ #ampm-indicator {
955
+ font-size: 2vmin;
956
+ padding: 6px 10px;
957
+ }
958
+ }
959
+
960
+ /* Wide landscape displays (tablets in landscape) */
961
+ @media (orientation: landscape) and (min-width: 1024px) {
962
+ /* Clock size now handled by main CSS */
963
+
964
+ #ampm-indicator {
965
+ font-size: 1.8vmin;
966
+ bottom: 30px;
967
+ left: 30px;
968
+ }
969
+ }
970
+
971
+ @media (max-width: 600px) {
972
+ .wake-word-banner {
973
+ font-size: 11px;
974
+ padding: 8px 12px;
975
+ }
976
+
977
+ #settings-panel {
978
+ bottom: 20px;
979
+ right: 20px;
980
+ }
981
+
982
+ #ampm-indicator {
983
+ font-size: 4vmin;
984
+ bottom: 15px;
985
+ left: 15px;
986
+ padding: 6px 8px;
987
+ min-width: 40px;
988
+ }
989
+ }
990
+
991
+ /* Very small screens */
992
+ @media (max-width: 400px) {
993
+ /* Clock size now handled by main CSS */
994
+
995
+ #ampm-indicator {
996
+ font-size: 5vmin;
997
+ bottom: 10px;
998
+ left: 10px;
999
+ }
1000
+ }
1001
+
1002
+ /* ==================== Help Dialog ==================== */
1003
+ #help-dialog {
1004
+ position: fixed;
1005
+ top: 0;
1006
+ left: 0;
1007
+ right: 0;
1008
+ bottom: 0;
1009
+ background: rgba(0, 0, 0, 0.5);
1010
+ display: flex;
1011
+ align-items: center;
1012
+ justify-content: center;
1013
+ z-index: 10000;
1014
+
1015
+ &.hidden {
1016
+ display: none;
1017
+ }
1018
+ }
1019
+
1020
+ #help-dialog-content {
1021
+ background: var(--settings-bg);
1022
+ color: var(--settings-text);
1023
+ border-radius: 10px;
1024
+ padding: 30px;
1025
+ max-width: 600px;
1026
+ max-height: 80vh;
1027
+ overflow-y: auto;
1028
+ position: relative;
1029
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
1030
+ opacity: 0.8;
1031
+
1032
+ & h2 {
1033
+ margin-top: 0;
1034
+ margin-bottom: 20px;
1035
+ font-size: 24px;
1036
+ text-align: center;
1037
+ }
1038
+
1039
+ & h3 {
1040
+ margin-top: 20px;
1041
+ margin-bottom: 10px;
1042
+ font-size: 18px;
1043
+ color: var(--button-bg);
1044
+ }
1045
+
1046
+ & ul {
1047
+ margin: 0;
1048
+ padding-left: 20px;
1049
+ list-style-type: disc;
1050
+ }
1051
+
1052
+ & li {
1053
+ margin-bottom: 8px;
1054
+ line-height: 1.5;
1055
+ }
1056
+
1057
+ & .help-section {
1058
+ margin-bottom: 20px;
1059
+ }
1060
+ }
1061
+
1062
+ #help-close {
1063
+ position: absolute;
1064
+ top: 10px;
1065
+ right: 10px;
1066
+ background: none;
1067
+ border: none;
1068
+ font-size: 24px;
1069
+ cursor: pointer;
1070
+ color: var(--settings-text);
1071
+ padding: 5px 10px;
1072
+
1073
+ &:hover {
1074
+ background: rgba(0, 0, 0, 0.1);
1075
+ border-radius: 5px;
1076
+ }
1077
+ }
1078
+
1079
+ /* ==================== Fullscreen Mode ==================== */
1080
+ :fullscreen {
1081
+
1082
+ /* Keep banners visible in fullscreen for voice feedback */
1083
+ & .wake-word-banner {
1084
+ opacity: 0.9;
1085
+ /* Slightly transparent in fullscreen */
1086
+ }
1087
+
1088
+ & #settings-panel {
1089
+ opacity: 0.8;
1090
+ }
1091
+ }