zebra-day 0.0.37__py3-none-any.whl → 1.0.2__py3-none-any.whl

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 (181) hide show
  1. zebra_day/__init__.py +35 -0
  2. zebra_day/bin/__init__.py +0 -0
  3. zebra_day/bin/fetch_zebra_config.py +15 -0
  4. zebra_day/bin/generate_coord_grid_zpl.py +50 -0
  5. zebra_day/bin/print_zpl_from_file.py +21 -0
  6. zebra_day/bin/probe_new_label_dimensions.py +75 -0
  7. zebra_day/bin/scan_for_networed_zebra_printers_arp_scan.sh +1 -0
  8. zebra_day/bin/scan_for_networed_zebra_printers_curl.sh +30 -0
  9. zebra_day/bin/zserve.py +701 -259
  10. zebra_day/cli/__init__.py +240 -0
  11. zebra_day/cli/cognito.py +121 -0
  12. zebra_day/cli/gui.py +255 -0
  13. zebra_day/cli/printer.py +168 -0
  14. zebra_day/cli/template.py +176 -0
  15. zebra_day/cmd_mgr.py +35 -0
  16. zebra_day/etc/Monoid-Regular-HalfTight-Dollar-0-1-l.ttf +0 -0
  17. zebra_day/etc/label_styles/blank.zpl +0 -0
  18. zebra_day/etc/label_styles/cornersStripOf4Squares_1inX1in.zpl +55 -0
  19. zebra_day/etc/label_styles/corners_1inX2in.zpl +28 -0
  20. zebra_day/etc/label_styles/corners_20cmX30cm.zpl +6 -0
  21. zebra_day/etc/label_styles/corners_smallTube.zpl +7 -0
  22. zebra_day/etc/label_styles/corners_unspecifiedDimensions.zpl +15 -0
  23. zebra_day/etc/label_styles/generic_2inX1in.zpl +21 -0
  24. zebra_day/etc/label_styles/plate_1inX0.25in.zpl +9 -0
  25. zebra_day/etc/label_styles/plate_1inX0.25inHD.zpl +9 -0
  26. zebra_day/etc/label_styles/smallTubeWdotHD_prod.zpl +8 -0
  27. zebra_day/etc/label_styles/smallTubeWdot_corners.zpl +7 -0
  28. zebra_day/etc/label_styles/smallTubeWdot_prod.zpl +8 -0
  29. zebra_day/etc/label_styles/smallTubeWdot_prodAlt1.zpl +6 -0
  30. zebra_day/etc/label_styles/smallTubeWdot_prodAlt1b.zpl +3 -0
  31. zebra_day/etc/label_styles/smallTubeWdot_prodV2.zpl +8 -0
  32. zebra_day/etc/label_styles/smallTubeWdot_reagent.zpl +29 -0
  33. zebra_day/etc/label_styles/stripOf4Squares_1inX1in.zpl +32 -0
  34. zebra_day/etc/label_styles/test_800dX800dCoordinateArray.zpl +1 -0
  35. zebra_day/etc/label_styles/tmps/.hold +0 -0
  36. zebra_day/etc/label_styles/tmps/tmp_zpl_templates.here +0 -0
  37. zebra_day/etc/label_styles/tube_20mmX30mmA.zpl +7 -0
  38. zebra_day/etc/label_styles/tube_2inX0.3in.zpl +15 -0
  39. zebra_day/etc/label_styles/tube_2inX0.5in.zpl +15 -0
  40. zebra_day/etc/label_styles/tube_2inX0.5inHD.zpl +15 -0
  41. zebra_day/etc/label_styles/tube_2inX1in.zpl +25 -0
  42. zebra_day/etc/label_styles/tube_2inX1inHD.zpl +22 -0
  43. zebra_day/etc/label_styles/tube_2inX1inHDv3.zpl +21 -0
  44. zebra_day/etc/old_printer_config/.hold +0 -0
  45. zebra_day/etc/old_printer_config/2026-02-01_01:50:25.022846_printer_config.json +1 -0
  46. zebra_day/etc/old_printer_config/2026-02-01_01:50:25.033657_printer_config.json +1 -0
  47. zebra_day/etc/old_printer_config/2026-02-01_01:50:25.039597_printer_config.json +3 -0
  48. zebra_day/etc/old_printer_config/2026-02-01_01:50:25.047295_printer_config.json +1 -0
  49. zebra_day/etc/old_printer_config/2026-02-01_01:50:25.055804_printer_config.json +1 -0
  50. zebra_day/etc/old_printer_config/2026-02-01_01:50:25.061337_printer_config.json +3 -0
  51. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.073326_printer_config.json +1 -0
  52. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.081950_printer_config.json +1 -0
  53. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.088251_printer_config.json +3 -0
  54. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.096501_printer_config.json +1 -0
  55. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.104767_printer_config.json +1 -0
  56. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.110364_printer_config.json +3 -0
  57. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.118239_printer_config.json +1 -0
  58. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.125950_printer_config.json +1 -0
  59. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.349866_printer_config.json +1 -0
  60. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.361085_printer_config.json +3 -0
  61. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.558323_printer_config.json +1 -0
  62. zebra_day/etc/old_printer_config/2026-02-01_01:51:24.565756_printer_config.json +3 -0
  63. zebra_day/etc/old_printer_config/2026-02-01_01:51:29.739070_printer_config.json +16 -0
  64. zebra_day/etc/old_printer_config/2026-02-01_01:51:29.753796_printer_config.json +1 -0
  65. zebra_day/etc/old_printer_config/2026-02-01_01:51:29.760201_printer_config.json +3 -0
  66. zebra_day/etc/old_printer_config/2026-02-01_01:51:29.768747_printer_config.json +1 -0
  67. zebra_day/etc/old_printer_config/2026-02-01_01:51:29.775312_printer_config.json +3 -0
  68. zebra_day/etc/old_printer_config/2026-02-01_01:51:29.782533_printer_config.json +1 -0
  69. zebra_day/etc/old_printer_config/2026-02-01_01:51:29.789287_printer_config.json +1 -0
  70. zebra_day/etc/old_printer_config/2026-02-01_01:51:29.794230_printer_config.json +3 -0
  71. zebra_day/etc/old_printer_config/2026-02-01_01:51:29.800021_printer_config.json +5 -0
  72. zebra_day/etc/printer_config.json +16 -0
  73. zebra_day/etc/printer_config.template.json +16 -0
  74. zebra_day/etc/tmp_printers0.json +5 -0
  75. zebra_day/etc/tmp_printers374.json +5 -0
  76. zebra_day/etc/tmp_printers383.json +5 -0
  77. zebra_day/etc/tmp_printers450.json +5 -0
  78. zebra_day/etc/tmp_printers504.json +5 -0
  79. zebra_day/etc/tmp_printers608.json +5 -0
  80. zebra_day/etc/tmp_printers657.json +5 -0
  81. zebra_day/etc/tmp_printers838.json +5 -0
  82. zebra_day/etc/tmp_printers839.json +5 -0
  83. zebra_day/etc/tmp_printers933.json +5 -0
  84. zebra_day/etc/tmp_printers957.json +5 -0
  85. zebra_day/exceptions.py +88 -0
  86. zebra_day/files/.hold +0 -0
  87. zebra_day/files/hold +0 -0
  88. zebra_day/files/test_png_17696.png +0 -0
  89. zebra_day/files/test_png_23477.png +0 -0
  90. zebra_day/files/test_png_28157.png +0 -0
  91. zebra_day/files/test_png_35832.png +0 -0
  92. zebra_day/files/test_png_36400.png +0 -0
  93. zebra_day/files/test_png_40816.png +0 -0
  94. zebra_day/files/test_png_49564.png +0 -0
  95. zebra_day/files/test_png_53848.png +0 -0
  96. zebra_day/files/test_png_62542.png +0 -0
  97. zebra_day/files/test_png_91597.png +0 -0
  98. zebra_day/files/test_png_93633.png +0 -0
  99. zebra_day/files/tmpbjo3k7q1.png +0 -0
  100. zebra_day/files/tmpigtr4pwy.png +0 -0
  101. zebra_day/files/zpl_label_tube_2inX1in_2026-02-01_01:51:24.370964.png +0 -0
  102. zebra_day/logging_config.py +74 -0
  103. zebra_day/logs/.hold +0 -0
  104. zebra_day/logs/print_requests.log +2 -0
  105. zebra_day/paths.py +143 -0
  106. zebra_day/print_mgr.py +487 -103
  107. zebra_day/static/datschund.css +140 -0
  108. zebra_day/static/datschund.png +0 -0
  109. zebra_day/static/daylily.png +0 -0
  110. zebra_day/static/favicon.svg +20 -0
  111. zebra_day/static/general.css +99 -0
  112. zebra_day/static/js/zebra_modern.js +172 -0
  113. zebra_day/static/lsmc.css +354 -0
  114. zebra_day/static/moon.jpeg +0 -0
  115. zebra_day/static/oakland.css +197 -0
  116. zebra_day/static/petrichor.css +150 -0
  117. zebra_day/static/popday_daylily.css +140 -0
  118. zebra_day/static/style.css +183 -0
  119. zebra_day/static/triangles.css +122 -0
  120. zebra_day/static/tron.css +277 -0
  121. zebra_day/static/zebra_modern.css +771 -0
  122. zebra_day/static/zebras.css +176 -0
  123. zebra_day/templates/base.html +36 -0
  124. zebra_day/templates/bpr.html +72 -0
  125. zebra_day/templates/build_new_config.html +36 -0
  126. zebra_day/templates/build_print_request.html +32 -0
  127. zebra_day/templates/chg_ui_style.html +19 -0
  128. zebra_day/templates/edit_template.html +128 -0
  129. zebra_day/templates/edit_zpl.html +37 -0
  130. zebra_day/templates/index.html +82 -0
  131. zebra_day/templates/legacy/base.html +37 -0
  132. zebra_day/templates/legacy/bpr.html +72 -0
  133. zebra_day/templates/legacy/build_new_config.html +36 -0
  134. zebra_day/templates/legacy/build_print_request.html +32 -0
  135. zebra_day/templates/legacy/chg_ui_style.html +19 -0
  136. zebra_day/templates/legacy/edit_template.html +128 -0
  137. zebra_day/templates/legacy/edit_zpl.html +37 -0
  138. zebra_day/templates/legacy/index.html +82 -0
  139. zebra_day/templates/legacy/list_prior_configs.html +24 -0
  140. zebra_day/templates/legacy/print_result.html +30 -0
  141. zebra_day/templates/legacy/printer_details.html +25 -0
  142. zebra_day/templates/legacy/printer_status.html +70 -0
  143. zebra_day/templates/legacy/save_result.html +17 -0
  144. zebra_day/templates/legacy/send_print_request.html +34 -0
  145. zebra_day/templates/legacy/simple_print.html +94 -0
  146. zebra_day/templates/legacy/view_pstation_json.html +29 -0
  147. zebra_day/templates/list_prior_configs.html +24 -0
  148. zebra_day/templates/modern/base.html +98 -0
  149. zebra_day/templates/modern/config.html +141 -0
  150. zebra_day/templates/modern/dashboard.html +160 -0
  151. zebra_day/templates/modern/print_request.html +141 -0
  152. zebra_day/templates/modern/print_result.html +88 -0
  153. zebra_day/templates/modern/printer_detail.html +117 -0
  154. zebra_day/templates/modern/printers.html +133 -0
  155. zebra_day/templates/modern/save_result.html +46 -0
  156. zebra_day/templates/modern/template_editor.html +172 -0
  157. zebra_day/templates/modern/templates.html +122 -0
  158. zebra_day/templates/print_result.html +30 -0
  159. zebra_day/templates/printer_details.html +25 -0
  160. zebra_day/templates/printer_status.html +70 -0
  161. zebra_day/templates/save_result.html +17 -0
  162. zebra_day/templates/send_print_request.html +34 -0
  163. zebra_day/templates/simple_print.html +94 -0
  164. zebra_day/templates/view_pstation_json.html +29 -0
  165. zebra_day/web/__init__.py +9 -0
  166. zebra_day/web/app.py +171 -0
  167. zebra_day/web/auth.py +172 -0
  168. zebra_day/web/middleware.py +159 -0
  169. zebra_day/web/routers/__init__.py +2 -0
  170. zebra_day/web/routers/api.py +163 -0
  171. zebra_day/web/routers/ui.py +1051 -0
  172. zebra_day/zpl_renderer.py +273 -0
  173. zebra_day-1.0.2.dist-info/METADATA +786 -0
  174. zebra_day-1.0.2.dist-info/RECORD +179 -0
  175. {zebra_day-0.0.37.dist-info → zebra_day-1.0.2.dist-info}/WHEEL +1 -1
  176. zebra_day-1.0.2.dist-info/entry_points.txt +4 -0
  177. zebra_day/bin/te.py +0 -905
  178. zebra_day-0.0.37.dist-info/METADATA +0 -1177
  179. zebra_day-0.0.37.dist-info/RECORD +0 -10
  180. {zebra_day-0.0.37.dist-info → zebra_day-1.0.2.dist-info/licenses}/LICENSE +0 -0
  181. {zebra_day-0.0.37.dist-info → zebra_day-1.0.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,771 @@
1
+ /*
2
+ * Zebra Day Modern Theme
3
+ * Ursa-inspired dark design system with zebra stripe accents
4
+ */
5
+
6
+ /* CSS Variables */
7
+ :root {
8
+ /* Colors - Dark theme */
9
+ --color-primary: #1a1a2e;
10
+ --color-secondary: #16213e;
11
+ --color-accent: #0f3460;
12
+ --color-highlight: #6366f1;
13
+ --color-success: #22c55e;
14
+ --color-warning: #f59e0b;
15
+ --color-error: #ef4444;
16
+ --color-info: #3b82f6;
17
+
18
+ /* Grays */
19
+ --color-gray-900: #0a0a0a;
20
+ --color-gray-800: #141414;
21
+ --color-gray-700: #1f1f1f;
22
+ --color-gray-600: #2d2d2d;
23
+ --color-gray-500: #4a4a4a;
24
+ --color-gray-400: #6b6b6b;
25
+ --color-gray-300: #a3a3a3;
26
+ --color-gray-200: #d4d4d4;
27
+ --color-gray-100: #f5f5f5;
28
+ --color-white: #fafafa;
29
+ --color-dark: #0a0a0a;
30
+
31
+ /* Typography */
32
+ --font-primary: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
33
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
34
+
35
+ /* Spacing */
36
+ --spacing-xs: 0.25rem;
37
+ --spacing-sm: 0.5rem;
38
+ --spacing-md: 1rem;
39
+ --spacing-lg: 1.5rem;
40
+ --spacing-xl: 2rem;
41
+ --spacing-2xl: 3rem;
42
+
43
+ /* Border Radius */
44
+ --radius-sm: 4px;
45
+ --radius-md: 8px;
46
+ --radius-lg: 12px;
47
+ --radius-full: 9999px;
48
+
49
+ /* Shadows */
50
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
51
+ --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.3);
52
+ --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.4);
53
+
54
+ /* Transitions */
55
+ --transition-fast: 0.15s ease;
56
+ --transition-normal: 0.3s ease;
57
+ }
58
+
59
+ /* Reset & Base */
60
+ *, *::before, *::after {
61
+ box-sizing: border-box;
62
+ margin: 0;
63
+ padding: 0;
64
+ }
65
+
66
+ html {
67
+ font-size: 16px;
68
+ scroll-behavior: smooth;
69
+ }
70
+
71
+ body {
72
+ font-family: var(--font-primary);
73
+ background-color: var(--color-gray-900);
74
+ color: var(--color-gray-200);
75
+ line-height: 1.6;
76
+ min-height: 100vh;
77
+ display: flex;
78
+ flex-direction: column;
79
+ }
80
+
81
+ a {
82
+ color: var(--color-highlight);
83
+ text-decoration: none;
84
+ transition: color var(--transition-fast);
85
+ }
86
+
87
+ a:hover {
88
+ color: #818cf8;
89
+ }
90
+
91
+ /* Zebra Stripe Bar */
92
+ .zebra-stripe-bar {
93
+ position: fixed;
94
+ top: 0;
95
+ left: 0;
96
+ right: 0;
97
+ height: 4px;
98
+ background: repeating-linear-gradient(
99
+ 90deg,
100
+ var(--color-white) 0px,
101
+ var(--color-white) 20px,
102
+ var(--color-primary) 20px,
103
+ var(--color-primary) 40px
104
+ );
105
+ z-index: 1001;
106
+ }
107
+
108
+ /* Container */
109
+ .container {
110
+ width: 100%;
111
+ max-width: 1400px;
112
+ margin: 0 auto;
113
+ padding: 0 var(--spacing-lg);
114
+ }
115
+
116
+ /* Header */
117
+ .header {
118
+ background: var(--color-primary);
119
+ padding: var(--spacing-md) 0;
120
+ position: sticky;
121
+ top: 4px;
122
+ z-index: 1000;
123
+ box-shadow: var(--shadow-md);
124
+ }
125
+
126
+ .header-content {
127
+ display: flex;
128
+ align-items: center;
129
+ justify-content: space-between;
130
+ gap: var(--spacing-lg);
131
+ }
132
+
133
+ .logo {
134
+ display: flex;
135
+ align-items: center;
136
+ gap: var(--spacing-sm);
137
+ color: var(--color-white);
138
+ font-weight: 700;
139
+ font-size: 1.25rem;
140
+ }
141
+
142
+ .logo:hover {
143
+ color: var(--color-white);
144
+ }
145
+
146
+ .logo-icon {
147
+ flex-shrink: 0;
148
+ }
149
+
150
+ /* Navigation */
151
+ .nav {
152
+ flex: 1;
153
+ display: flex;
154
+ justify-content: center;
155
+ }
156
+
157
+ .nav-links {
158
+ display: flex;
159
+ list-style: none;
160
+ gap: var(--spacing-xs);
161
+ }
162
+
163
+ .nav-link {
164
+ display: flex;
165
+ align-items: center;
166
+ gap: var(--spacing-sm);
167
+ padding: var(--spacing-sm) var(--spacing-md);
168
+ color: var(--color-gray-300);
169
+ border-radius: var(--radius-md);
170
+ font-weight: 500;
171
+ transition: all var(--transition-fast);
172
+ }
173
+
174
+ .nav-link:hover {
175
+ color: var(--color-white);
176
+ background: var(--color-secondary);
177
+ }
178
+
179
+ .nav-link.active {
180
+ color: var(--color-white);
181
+ background: var(--color-highlight);
182
+ }
183
+
184
+ .nav-actions {
185
+ display: flex;
186
+ align-items: center;
187
+ gap: var(--spacing-sm);
188
+ }
189
+
190
+ .menu-toggle {
191
+ display: none;
192
+ background: none;
193
+ border: none;
194
+ color: var(--color-white);
195
+ font-size: 1.5rem;
196
+ cursor: pointer;
197
+ }
198
+
199
+ /* Main Content */
200
+ .main {
201
+ flex: 1;
202
+ padding: var(--spacing-2xl) 0;
203
+ }
204
+
205
+ /* Footer */
206
+ .footer {
207
+ background: var(--color-primary);
208
+ padding: var(--spacing-lg) 0;
209
+ margin-top: auto;
210
+ }
211
+
212
+ .footer-content {
213
+ display: flex;
214
+ justify-content: space-between;
215
+ align-items: center;
216
+ flex-wrap: wrap;
217
+ gap: var(--spacing-md);
218
+ }
219
+
220
+ .footer-info {
221
+ color: var(--color-gray-400);
222
+ font-size: 0.875rem;
223
+ }
224
+
225
+ .footer-sep {
226
+ margin: 0 var(--spacing-sm);
227
+ }
228
+
229
+ .footer-links {
230
+ display: flex;
231
+ gap: var(--spacing-lg);
232
+ }
233
+
234
+ .footer-links a {
235
+ color: var(--color-gray-400);
236
+ font-size: 0.875rem;
237
+ display: flex;
238
+ align-items: center;
239
+ gap: var(--spacing-xs);
240
+ }
241
+
242
+ .footer-links a:hover {
243
+ color: var(--color-highlight);
244
+ }
245
+
246
+ /* Cards */
247
+ .card {
248
+ background: var(--color-gray-800);
249
+ border-radius: var(--radius-lg);
250
+ box-shadow: var(--shadow-md);
251
+ padding: var(--spacing-xl);
252
+ margin-bottom: var(--spacing-lg);
253
+ }
254
+
255
+ .card-header {
256
+ display: flex;
257
+ align-items: center;
258
+ justify-content: space-between;
259
+ margin-bottom: var(--spacing-lg);
260
+ padding-bottom: var(--spacing-md);
261
+ border-bottom: 1px solid var(--color-gray-700);
262
+ }
263
+
264
+ .card-title {
265
+ font-size: 1.25rem;
266
+ font-weight: 600;
267
+ color: var(--color-white);
268
+ margin: 0;
269
+ }
270
+
271
+ .card-icon {
272
+ width: 48px;
273
+ height: 48px;
274
+ border-radius: var(--radius-md);
275
+ display: flex;
276
+ align-items: center;
277
+ justify-content: center;
278
+ font-size: 1.5rem;
279
+ }
280
+
281
+ .card-icon.primary { background: rgba(99, 102, 241, 0.15); color: var(--color-highlight); }
282
+ .card-icon.success { background: rgba(34, 197, 94, 0.15); color: var(--color-success); }
283
+ .card-icon.warning { background: rgba(245, 158, 11, 0.15); color: var(--color-warning); }
284
+ .card-icon.error { background: rgba(239, 68, 68, 0.15); color: var(--color-error); }
285
+ .card-icon.info { background: rgba(59, 130, 246, 0.15); color: var(--color-info); }
286
+
287
+ /* Stat Cards */
288
+ .stat-card {
289
+ background: var(--color-gray-800);
290
+ border-radius: var(--radius-lg);
291
+ padding: var(--spacing-xl);
292
+ box-shadow: var(--shadow-md);
293
+ display: flex;
294
+ align-items: flex-start;
295
+ gap: var(--spacing-lg);
296
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
297
+ }
298
+
299
+ .stat-card:hover {
300
+ transform: translateY(-2px);
301
+ box-shadow: var(--shadow-lg);
302
+ }
303
+
304
+ .stat-card-clickable {
305
+ cursor: pointer;
306
+ color: inherit;
307
+ }
308
+
309
+ .stat-value {
310
+ font-size: 2.25rem;
311
+ font-weight: 700;
312
+ color: var(--color-white);
313
+ line-height: 1;
314
+ }
315
+
316
+ .stat-label {
317
+ font-size: 0.875rem;
318
+ color: var(--color-gray-400);
319
+ margin-top: var(--spacing-xs);
320
+ }
321
+
322
+ /* Buttons */
323
+ .btn {
324
+ display: inline-flex;
325
+ align-items: center;
326
+ justify-content: center;
327
+ gap: var(--spacing-sm);
328
+ padding: var(--spacing-sm) var(--spacing-lg);
329
+ font-family: inherit;
330
+ font-size: 1rem;
331
+ font-weight: 500;
332
+ line-height: 1.5;
333
+ text-align: center;
334
+ white-space: nowrap;
335
+ cursor: pointer;
336
+ border: 2px solid transparent;
337
+ border-radius: var(--radius-md);
338
+ transition: all var(--transition-fast);
339
+ }
340
+
341
+ .btn:disabled {
342
+ opacity: 0.6;
343
+ cursor: not-allowed;
344
+ }
345
+
346
+ .btn-primary {
347
+ background: var(--color-highlight);
348
+ color: var(--color-white);
349
+ }
350
+
351
+ .btn-primary:hover:not(:disabled) {
352
+ background: #818cf8;
353
+ transform: translateY(-1px);
354
+ }
355
+
356
+ .btn-success {
357
+ background: var(--color-success);
358
+ color: var(--color-dark);
359
+ }
360
+
361
+ .btn-success:hover:not(:disabled) {
362
+ background: #16a34a;
363
+ }
364
+
365
+ .btn-outline {
366
+ background: transparent;
367
+ border-color: var(--color-gray-600);
368
+ color: var(--color-gray-300);
369
+ }
370
+
371
+ .btn-outline:hover:not(:disabled) {
372
+ border-color: var(--color-highlight);
373
+ color: var(--color-highlight);
374
+ }
375
+
376
+ .btn-sm {
377
+ padding: var(--spacing-xs) var(--spacing-md);
378
+ font-size: 0.875rem;
379
+ }
380
+
381
+ .btn-lg {
382
+ padding: var(--spacing-md) var(--spacing-xl);
383
+ font-size: 1.125rem;
384
+ }
385
+
386
+ /* Grid System */
387
+ .grid {
388
+ display: grid;
389
+ gap: var(--spacing-lg);
390
+ }
391
+
392
+ .grid-2 { grid-template-columns: repeat(2, 1fr); }
393
+ .grid-3 { grid-template-columns: repeat(3, 1fr); }
394
+ .grid-4 { grid-template-columns: repeat(4, 1fr); }
395
+ .grid-5 { grid-template-columns: repeat(5, 1fr); }
396
+
397
+ @media (max-width: 1024px) {
398
+ .grid-5 { grid-template-columns: repeat(3, 1fr); }
399
+ .grid-4 { grid-template-columns: repeat(2, 1fr); }
400
+ }
401
+
402
+ @media (max-width: 768px) {
403
+ .grid-5, .grid-4, .grid-3 { grid-template-columns: repeat(2, 1fr); }
404
+ .menu-toggle { display: block; }
405
+ .nav-links {
406
+ display: none;
407
+ position: absolute;
408
+ top: 100%;
409
+ left: 0;
410
+ right: 0;
411
+ background: var(--color-primary);
412
+ flex-direction: column;
413
+ padding: var(--spacing-md);
414
+ }
415
+ .nav-links.active { display: flex; }
416
+ .nav-actions { display: none; }
417
+ }
418
+
419
+ @media (max-width: 480px) {
420
+ .grid-5, .grid-4, .grid-3, .grid-2 { grid-template-columns: 1fr; }
421
+ }
422
+
423
+ /* Forms */
424
+ .form-group {
425
+ margin-bottom: var(--spacing-lg);
426
+ }
427
+
428
+ .form-label {
429
+ display: block;
430
+ font-weight: 500;
431
+ margin-bottom: var(--spacing-sm);
432
+ color: var(--color-gray-300);
433
+ }
434
+
435
+ .form-label.required::after {
436
+ content: " *";
437
+ color: var(--color-error);
438
+ }
439
+
440
+ .form-control {
441
+ display: block;
442
+ width: 100%;
443
+ padding: var(--spacing-sm) var(--spacing-md);
444
+ font-family: var(--font-mono);
445
+ font-size: 1rem;
446
+ line-height: 1.5;
447
+ color: var(--color-white);
448
+ background-color: var(--color-gray-700);
449
+ border: 2px solid var(--color-gray-600);
450
+ border-radius: var(--radius-md);
451
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
452
+ }
453
+
454
+ .form-control:focus {
455
+ outline: none;
456
+ border-color: var(--color-highlight);
457
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2);
458
+ }
459
+
460
+ .form-control::placeholder {
461
+ color: var(--color-gray-500);
462
+ }
463
+
464
+ textarea.form-control {
465
+ min-height: 150px;
466
+ resize: vertical;
467
+ }
468
+
469
+ select.form-control {
470
+ appearance: none;
471
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23888' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
472
+ background-repeat: no-repeat;
473
+ background-position: right var(--spacing-md) center;
474
+ padding-right: var(--spacing-2xl);
475
+ cursor: pointer;
476
+ }
477
+
478
+ /* Tables */
479
+ .table-container {
480
+ overflow-x: auto;
481
+ border-radius: var(--radius-lg);
482
+ background: var(--color-gray-800);
483
+ box-shadow: var(--shadow-md);
484
+ }
485
+
486
+ .table {
487
+ width: 100%;
488
+ border-collapse: collapse;
489
+ }
490
+
491
+ .table th,
492
+ .table td {
493
+ padding: var(--spacing-md) var(--spacing-lg);
494
+ text-align: left;
495
+ border-bottom: 1px solid var(--color-gray-700);
496
+ }
497
+
498
+ .table th {
499
+ font-weight: 600;
500
+ color: var(--color-gray-300);
501
+ background: var(--color-gray-700);
502
+ font-size: 0.875rem;
503
+ text-transform: uppercase;
504
+ letter-spacing: 0.05em;
505
+ }
506
+
507
+ .table tbody tr:hover {
508
+ background: var(--color-gray-700);
509
+ }
510
+
511
+ .table tbody tr:last-child td {
512
+ border-bottom: none;
513
+ }
514
+
515
+ /* Badges */
516
+ .badge {
517
+ display: inline-flex;
518
+ align-items: center;
519
+ padding: var(--spacing-xs) var(--spacing-sm);
520
+ font-size: 0.75rem;
521
+ font-weight: 600;
522
+ line-height: 1;
523
+ border-radius: var(--radius-full);
524
+ text-transform: uppercase;
525
+ }
526
+
527
+ .badge-success {
528
+ background: rgba(34, 197, 94, 0.15);
529
+ color: var(--color-success);
530
+ border: 1px solid rgba(34, 197, 94, 0.3);
531
+ }
532
+
533
+ .badge-warning {
534
+ background: rgba(245, 158, 11, 0.15);
535
+ color: var(--color-warning);
536
+ border: 1px solid rgba(245, 158, 11, 0.3);
537
+ }
538
+
539
+ .badge-error {
540
+ background: rgba(239, 68, 68, 0.15);
541
+ color: var(--color-error);
542
+ border: 1px solid rgba(239, 68, 68, 0.3);
543
+ }
544
+
545
+ .badge-info {
546
+ background: rgba(59, 130, 246, 0.15);
547
+ color: var(--color-info);
548
+ border: 1px solid rgba(59, 130, 246, 0.3);
549
+ }
550
+
551
+ .badge-primary {
552
+ background: rgba(99, 102, 241, 0.15);
553
+ color: var(--color-highlight);
554
+ border: 1px solid rgba(99, 102, 241, 0.3);
555
+ }
556
+
557
+ /* Toast Notifications */
558
+ .toast-container {
559
+ position: fixed;
560
+ top: calc(4px + var(--spacing-lg));
561
+ right: var(--spacing-lg);
562
+ z-index: 2000;
563
+ display: flex;
564
+ flex-direction: column;
565
+ gap: var(--spacing-sm);
566
+ max-width: 400px;
567
+ }
568
+
569
+ .toast {
570
+ display: flex;
571
+ align-items: flex-start;
572
+ gap: var(--spacing-md);
573
+ padding: var(--spacing-md) var(--spacing-lg);
574
+ background: var(--color-gray-800);
575
+ border-radius: var(--radius-md);
576
+ box-shadow: var(--shadow-lg);
577
+ border-left: 4px solid var(--color-gray-600);
578
+ animation: slideIn 0.3s ease;
579
+ }
580
+
581
+ @keyframes slideIn {
582
+ from { transform: translateX(100%); opacity: 0; }
583
+ to { transform: translateX(0); opacity: 1; }
584
+ }
585
+
586
+ .toast-success { border-left-color: var(--color-success); }
587
+ .toast-error { border-left-color: var(--color-error); }
588
+ .toast-warning { border-left-color: var(--color-warning); }
589
+ .toast-info { border-left-color: var(--color-info); }
590
+
591
+ .toast-icon {
592
+ font-size: 1.25rem;
593
+ }
594
+
595
+ .toast-success .toast-icon { color: var(--color-success); }
596
+ .toast-error .toast-icon { color: var(--color-error); }
597
+ .toast-warning .toast-icon { color: var(--color-warning); }
598
+ .toast-info .toast-icon { color: var(--color-info); }
599
+
600
+ .toast-content {
601
+ flex: 1;
602
+ }
603
+
604
+ .toast-title {
605
+ font-weight: 600;
606
+ color: var(--color-white);
607
+ margin-bottom: var(--spacing-xs);
608
+ }
609
+
610
+ .toast-message {
611
+ font-size: 0.875rem;
612
+ color: var(--color-gray-400);
613
+ }
614
+
615
+ .toast-close {
616
+ background: none;
617
+ border: none;
618
+ color: var(--color-gray-500);
619
+ font-size: 1.25rem;
620
+ cursor: pointer;
621
+ padding: 0;
622
+ line-height: 1;
623
+ }
624
+
625
+ .toast-close:hover {
626
+ color: var(--color-white);
627
+ }
628
+
629
+ /* Loading Overlay */
630
+ .loading-overlay {
631
+ position: fixed;
632
+ top: 0;
633
+ left: 0;
634
+ right: 0;
635
+ bottom: 0;
636
+ background: rgba(10, 10, 10, 0.9);
637
+ display: flex;
638
+ align-items: center;
639
+ justify-content: center;
640
+ z-index: 3000;
641
+ }
642
+
643
+ .loading-spinner {
644
+ text-align: center;
645
+ }
646
+
647
+ .spinner {
648
+ width: 48px;
649
+ height: 48px;
650
+ border: 4px solid var(--color-gray-700);
651
+ border-top-color: var(--color-highlight);
652
+ border-radius: 50%;
653
+ animation: spin 1s linear infinite;
654
+ margin: 0 auto var(--spacing-md);
655
+ }
656
+
657
+ @keyframes spin {
658
+ to { transform: rotate(360deg); }
659
+ }
660
+
661
+ /* Page Header */
662
+ .page-header {
663
+ margin-bottom: var(--spacing-xl);
664
+ }
665
+
666
+ .page-title {
667
+ font-size: 2rem;
668
+ font-weight: 700;
669
+ color: var(--color-white);
670
+ margin-bottom: var(--spacing-sm);
671
+ }
672
+
673
+ .page-subtitle {
674
+ color: var(--color-gray-400);
675
+ font-size: 1.125rem;
676
+ }
677
+
678
+ /* Quick Actions */
679
+ .quick-actions {
680
+ display: flex;
681
+ flex-wrap: wrap;
682
+ gap: var(--spacing-md);
683
+ }
684
+
685
+ .action-card {
686
+ display: flex;
687
+ align-items: center;
688
+ gap: var(--spacing-md);
689
+ padding: var(--spacing-lg);
690
+ background: var(--color-gray-700);
691
+ border-radius: var(--radius-md);
692
+ color: var(--color-gray-200);
693
+ transition: all var(--transition-fast);
694
+ flex: 1;
695
+ min-width: 200px;
696
+ }
697
+
698
+ .action-card:hover {
699
+ background: var(--color-gray-600);
700
+ color: var(--color-white);
701
+ transform: translateY(-2px);
702
+ }
703
+
704
+ .action-card i {
705
+ font-size: 1.5rem;
706
+ color: var(--color-highlight);
707
+ }
708
+
709
+ /* Utility Classes */
710
+ .d-none { display: none !important; }
711
+ .d-flex { display: flex !important; }
712
+ .d-block { display: block !important; }
713
+
714
+ .text-center { text-align: center; }
715
+ .text-right { text-align: right; }
716
+
717
+ .text-success { color: var(--color-success); }
718
+ .text-warning { color: var(--color-warning); }
719
+ .text-error { color: var(--color-error); }
720
+ .text-muted { color: var(--color-gray-400); }
721
+
722
+ .mb-0 { margin-bottom: 0 !important; }
723
+ .mb-sm { margin-bottom: var(--spacing-sm) !important; }
724
+ .mb-md { margin-bottom: var(--spacing-md) !important; }
725
+ .mb-lg { margin-bottom: var(--spacing-lg) !important; }
726
+ .mb-xl { margin-bottom: var(--spacing-xl) !important; }
727
+
728
+ .mt-lg { margin-top: var(--spacing-lg) !important; }
729
+ .mt-xl { margin-top: var(--spacing-xl) !important; }
730
+
731
+ .gap-sm { gap: var(--spacing-sm); }
732
+ .gap-md { gap: var(--spacing-md); }
733
+ .gap-lg { gap: var(--spacing-lg); }
734
+
735
+ /* Code blocks */
736
+ code {
737
+ font-family: var(--font-mono);
738
+ background: var(--color-gray-700);
739
+ padding: 2px 6px;
740
+ border-radius: var(--radius-sm);
741
+ font-size: 0.875em;
742
+ color: var(--color-highlight);
743
+ }
744
+
745
+ pre {
746
+ font-family: var(--font-mono);
747
+ background: var(--color-gray-700);
748
+ padding: var(--spacing-lg);
749
+ border-radius: var(--radius-md);
750
+ overflow-x: auto;
751
+ font-size: 0.875rem;
752
+ line-height: 1.6;
753
+ }
754
+
755
+ /* Empty state */
756
+ .empty-state {
757
+ text-align: center;
758
+ padding: var(--spacing-2xl);
759
+ color: var(--color-gray-400);
760
+ }
761
+
762
+ .empty-state i {
763
+ font-size: 3rem;
764
+ margin-bottom: var(--spacing-md);
765
+ opacity: 0.5;
766
+ }
767
+
768
+ .empty-state p {
769
+ margin-bottom: var(--spacing-lg);
770
+ }
771
+