keepup-admin 0.1.0__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.
- keepup/THIRD-PARTY.md +44 -0
- keepup/__init__.py +41 -0
- keepup/api_versions.py +100 -0
- keepup/audit.py +499 -0
- keepup/auth/__init__.py +7 -0
- keepup/auth/config.py +128 -0
- keepup/auth/dependencies.py +485 -0
- keepup/auth/dto/__init__.py +0 -0
- keepup/auth/dto/token.py +31 -0
- keepup/auth/factory.py +28 -0
- keepup/auth/login_throttle.py +151 -0
- keepup/auth/oidc.py +245 -0
- keepup/auth/oidc_policy.py +111 -0
- keepup/auth/oidc_routes.py +288 -0
- keepup/auth/panel_session.py +220 -0
- keepup/auth/permissions.py +59 -0
- keepup/auth/providers/__init__.py +0 -0
- keepup/auth/providers/base.py +168 -0
- keepup/auth/providers/local.py +180 -0
- keepup/auth/routes.py +660 -0
- keepup/auth/seed_accounts.py +322 -0
- keepup/auth/session_lifetime.py +104 -0
- keepup/auth/signing_key.py +138 -0
- keepup/auth/websocket.py +86 -0
- keepup/cluster.py +634 -0
- keepup/db.py +663 -0
- keepup/events.py +764 -0
- keepup/factory.py +484 -0
- keepup/instance.py +46 -0
- keepup/integrations.py +260 -0
- keepup/locks.py +412 -0
- keepup/logging_setup.py +690 -0
- keepup/metrics.py +818 -0
- keepup/metrics_retention.py +376 -0
- keepup/modules.py +572 -0
- keepup/notification_bus.py +355 -0
- keepup/plugins/__init__.py +9 -0
- keepup/plugins/admin.py +246 -0
- keepup/plugins/base.py +234 -0
- keepup/plugins/enablement.py +184 -0
- keepup/plugins/registry.py +171 -0
- keepup/plugins/route_mask.py +338 -0
- keepup/plugins/routes.py +376 -0
- keepup/roles.py +17 -0
- keepup/scheduler.py +93 -0
- keepup/schema.py +295 -0
- keepup/sections.json +104 -0
- keepup/settings.py +184 -0
- keepup/static/css/aos.css +1 -0
- keepup/static/css/main_nebula.css +232 -0
- keepup/static/css/main_new.css +852 -0
- keepup/static/css/tailwind.css +1 -0
- keepup/static/index_nebula.html +293 -0
- keepup/static/index_new.html +286 -0
- keepup/static/js/aos.js +1 -0
- keepup/static/js/feather-icons.js +13 -0
- keepup/static/js/main_new.js +1861 -0
- keepup/static/js/tailwind.js +83 -0
- keepup/static/modules/css/background_tasks.css +233 -0
- keepup/static/modules/css/cluster.css +16 -0
- keepup/static/modules/css/event_manager.css +386 -0
- keepup/static/modules/css/integration_logs.css +33 -0
- keepup/static/modules/css/metrics.css +115 -0
- keepup/static/modules/css/modules.css +189 -0
- keepup/static/modules/css/themes.css +563 -0
- keepup/static/modules/css/users.css +278 -0
- keepup/static/modules/js/background_tasks.js +657 -0
- keepup/static/modules/js/chart.js +14 -0
- keepup/static/modules/js/chartjs-adapter-date-fns.bundle.min.js +7 -0
- keepup/static/modules/js/cluster.js +363 -0
- keepup/static/modules/js/event_manager.js +979 -0
- keepup/static/modules/js/integration_logs.js +767 -0
- keepup/static/modules/js/metrics.js +908 -0
- keepup/static/modules/js/modules.js +1086 -0
- keepup/static/modules/js/themes.js +653 -0
- keepup/static/modules/js/users.js +784 -0
- keepup/tables.py +302 -0
- keepup/themes.py +496 -0
- keepup/web.py +182 -0
- keepup_admin-0.1.0.dist-info/METADATA +117 -0
- keepup_admin-0.1.0.dist-info/RECORD +86 -0
- keepup_admin-0.1.0.dist-info/WHEEL +5 -0
- keepup_admin-0.1.0.dist-info/licenses/LICENSE +202 -0
- keepup_admin-0.1.0.dist-info/licenses/NOTICE +22 -0
- keepup_admin-0.1.0.dist-info/licenses/THIRD-PARTY.md +44 -0
- keepup_admin-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
Theme: nebula
|
|
3
|
+
|
|
4
|
+
The night palette of the project's public page (static/main.html, served as
|
|
5
|
+
the public site). Values are taken from the application's own stylesheet, where they are
|
|
6
|
+
already declared as variables, rather than matched by eye.
|
|
7
|
+
|
|
8
|
+
This file only redefines tokens and adds the background effects. The chrome
|
|
9
|
+
rules themselves live in main_new.css and are written against var(), so a
|
|
10
|
+
theme is a set of values, not a second copy of the rules. Load order in
|
|
11
|
+
index_nebula.html: tailwind -> main_new.css -> this file.
|
|
12
|
+
========================================================================== */
|
|
13
|
+
:root {
|
|
14
|
+
/* Palette of static/css/style.css */
|
|
15
|
+
--nebula-bg: #030305;
|
|
16
|
+
--nebula-surface: rgba(255, 255, 255, 0.03);
|
|
17
|
+
--nebula-surface-hover: rgba(255, 255, 255, 0.05);
|
|
18
|
+
--nebula-border: rgba(255, 255, 255, 0.08);
|
|
19
|
+
--nebula-border-hover: rgba(255, 255, 255, 0.15);
|
|
20
|
+
--nebula-text: #e2e8f0;
|
|
21
|
+
--nebula-text-dim: #94a3b8;
|
|
22
|
+
/* The ink of the content area. In this theme the area stays light, so its
|
|
23
|
+
text is dark: --nebula-text is meant for the sidebar. */
|
|
24
|
+
--nebula-ink: #0f172a;
|
|
25
|
+
--nebula-cyan: #06b6d4;
|
|
26
|
+
--nebula-violet: #8b5cf6;
|
|
27
|
+
|
|
28
|
+
/* Chrome tokens, mapped onto that palette */
|
|
29
|
+
--sidebar-bg: rgba(3, 3, 5, 0.72);
|
|
30
|
+
--sidebar-fg: var(--nebula-text);
|
|
31
|
+
--sidebar-header-bg: transparent;
|
|
32
|
+
--sidebar-width: 16rem;
|
|
33
|
+
--sidebar-width-collapsed: 72px;
|
|
34
|
+
|
|
35
|
+
--nav-item-padding: 0.7rem 1.25rem;
|
|
36
|
+
--nav-item-padding-collapsed: 0.7rem;
|
|
37
|
+
--nav-item-radius: 12px;
|
|
38
|
+
--nav-item-fg: var(--nebula-text-dim);
|
|
39
|
+
--nav-item-bg: transparent;
|
|
40
|
+
--nav-item-fg-hover: #ffffff;
|
|
41
|
+
/* Hover and the active state are painted in the theme's own cyan. The
|
|
42
|
+
white film of --surface-hover reads on the public page's panels, but on
|
|
43
|
+
a menu row it is barely a difference against the background, and blue
|
|
44
|
+
belongs to another theme. */
|
|
45
|
+
--nav-item-bg-hover: rgba(6, 182, 212, 0.16);
|
|
46
|
+
--nav-item-fg-active: #ffffff;
|
|
47
|
+
--nav-item-bg-active: rgba(6, 182, 212, 0.24);
|
|
48
|
+
--nav-item-icon-gap: 0.75rem;
|
|
49
|
+
|
|
50
|
+
--modules-nav-max-height: calc(100vh - 200px);
|
|
51
|
+
--modules-nav-padding: 8px 10px 16px;
|
|
52
|
+
--sidebar-scrollbar-track: rgba(255, 255, 255, 0.04);
|
|
53
|
+
--sidebar-scrollbar-thumb: var(--nebula-cyan);
|
|
54
|
+
--sidebar-scrollbar-thumb-hover: var(--nebula-violet);
|
|
55
|
+
|
|
56
|
+
--chrome-transition: all 0.3s ease;
|
|
57
|
+
|
|
58
|
+
/* Adaptive layout. Only values -- the drawer rules themselves live in
|
|
59
|
+
main_new.css. The sidebar background is translucent here, which reads
|
|
60
|
+
well against the page but not over content the drawer floats above, so
|
|
61
|
+
the drawer gets a near-opaque variant of the same colour. */
|
|
62
|
+
--drawer-bg: rgba(3, 3, 5, 0.96);
|
|
63
|
+
--backdrop-color: rgba(3, 3, 5, 0.72);
|
|
64
|
+
--sidebar-blur: 16px;
|
|
65
|
+
--nebula-orb-size: 500px;
|
|
66
|
+
--nebula-orb-blur: 100px;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* Narrow layout drops the expensive effects rather than shrinking them: a
|
|
70
|
+
16px backdrop-filter behind an opaque drawer buys nothing, and two blurred
|
|
71
|
+
orbs wider than the viewport cost a phone GPU a repaint per scroll. */
|
|
72
|
+
:root.is-narrow {
|
|
73
|
+
--sidebar-blur: 0px;
|
|
74
|
+
--nebula-orb-size: 280px;
|
|
75
|
+
--nebula-orb-blur: 60px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
body {
|
|
79
|
+
background-color: var(--nebula-bg);
|
|
80
|
+
color: var(--nebula-text);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* --------------------------------------------------------------------------
|
|
84
|
+
Background effects, ported from the public page: two blurred orbs and a
|
|
85
|
+
masked grid. Fixed and non-interactive, so they never intercept clicks.
|
|
86
|
+
-------------------------------------------------------------------------- */
|
|
87
|
+
.nebula-bg {
|
|
88
|
+
position: fixed;
|
|
89
|
+
inset: 0;
|
|
90
|
+
z-index: -1;
|
|
91
|
+
pointer-events: none;
|
|
92
|
+
overflow: hidden;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.nebula-grid {
|
|
96
|
+
position: absolute;
|
|
97
|
+
inset: 0;
|
|
98
|
+
background-size: 60px 60px;
|
|
99
|
+
background-image:
|
|
100
|
+
linear-gradient(to right, rgba(255, 255, 255, 0.03) 1px, transparent 1px),
|
|
101
|
+
linear-gradient(to bottom, rgba(255, 255, 255, 0.03) 1px, transparent 1px);
|
|
102
|
+
mask-image: radial-gradient(circle at 50% 50%, black 20%, transparent 80%);
|
|
103
|
+
-webkit-mask-image: radial-gradient(circle at 50% 50%, black 20%, transparent 80%);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.nebula-orb {
|
|
107
|
+
position: absolute;
|
|
108
|
+
border-radius: 50%;
|
|
109
|
+
filter: blur(var(--nebula-orb-blur, 100px));
|
|
110
|
+
opacity: 0.3;
|
|
111
|
+
animation: nebula-float 12s infinite ease-in-out;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.nebula-orb-1 {
|
|
115
|
+
width: var(--nebula-orb-size, 500px);
|
|
116
|
+
height: var(--nebula-orb-size, 500px);
|
|
117
|
+
background: radial-gradient(circle, var(--nebula-cyan), transparent 70%);
|
|
118
|
+
top: -120px;
|
|
119
|
+
left: -120px;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.nebula-orb-2 {
|
|
123
|
+
width: calc(var(--nebula-orb-size, 500px) * 1.2);
|
|
124
|
+
height: calc(var(--nebula-orb-size, 500px) * 1.2);
|
|
125
|
+
background: radial-gradient(circle, var(--nebula-violet), transparent 70%);
|
|
126
|
+
bottom: -180px;
|
|
127
|
+
right: -180px;
|
|
128
|
+
animation-delay: -6s;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
@keyframes nebula-float {
|
|
132
|
+
0%, 100% { transform: translate(0, 0); }
|
|
133
|
+
50% { transform: translate(40px, -40px); }
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@media (prefers-reduced-motion: reduce) {
|
|
137
|
+
.nebula-orb {
|
|
138
|
+
animation: none;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* --------------------------------------------------------------------------
|
|
143
|
+
Chrome details that the palette alone cannot express.
|
|
144
|
+
-------------------------------------------------------------------------- */
|
|
145
|
+
#sidebar {
|
|
146
|
+
border-right: 1px solid var(--nebula-border);
|
|
147
|
+
backdrop-filter: blur(var(--sidebar-blur, 16px));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* The hairline above the menu, as on the public page's panels. */
|
|
151
|
+
#main-nav {
|
|
152
|
+
position: relative;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
#main-nav::before {
|
|
156
|
+
content: "";
|
|
157
|
+
position: absolute;
|
|
158
|
+
top: 0;
|
|
159
|
+
left: 0;
|
|
160
|
+
right: 0;
|
|
161
|
+
height: 1px;
|
|
162
|
+
background: linear-gradient(90deg, transparent, var(--nebula-cyan), transparent);
|
|
163
|
+
opacity: 0.6;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.nav-item:hover {
|
|
167
|
+
border-color: var(--nebula-border-hover);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.nav-item.active {
|
|
171
|
+
box-shadow: inset 2px 0 0 var(--nebula-cyan);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.toggle-sidebar-btn {
|
|
175
|
+
color: var(--nebula-text-dim);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.toggle-sidebar-btn:hover {
|
|
179
|
+
color: var(--nebula-text);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* Logo: white word with an accented suffix, as in .logo/.logo .accent. */
|
|
183
|
+
.logo-text {
|
|
184
|
+
font-weight: 800;
|
|
185
|
+
letter-spacing: -0.03em;
|
|
186
|
+
color: #ffffff;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.logo-text .accent {
|
|
190
|
+
color: var(--nebula-cyan);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.logo-text .logo-image {
|
|
194
|
+
max-height: 28px;
|
|
195
|
+
width: auto;
|
|
196
|
+
display: block;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* --------------------------------------------------------------------------
|
|
200
|
+
Content area. The admin panel's own widgets come from main_new.css and the
|
|
201
|
+
module stylesheets; here only the surfaces that would otherwise stay light
|
|
202
|
+
on a near-black background.
|
|
203
|
+
-------------------------------------------------------------------------- */
|
|
204
|
+
.main-content {
|
|
205
|
+
color: var(--nebula-ink);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* Sections hang their modals on <body> rather than inside .main-content, so
|
|
209
|
+
the ink of the content area never reached them: a white card kept
|
|
210
|
+
--nebula-text, the colour of the dark sidebar, and could not be read. The
|
|
211
|
+
colour is therefore set on the overlay itself -- descendants that carry a
|
|
212
|
+
colour class of their own (text-gray-500 and the like) keep it, since a
|
|
213
|
+
class always beats inheritance.
|
|
214
|
+
|
|
215
|
+
The sign-in window covers the page the same way, but through its own
|
|
216
|
+
.auth-block class rather than the .fixed utility, so the same rule did not
|
|
217
|
+
reach it: on a white card the login and password fields -- the only things
|
|
218
|
+
in it with no colour class of their own -- inherited the dark panel's
|
|
219
|
+
colour and read as pale grey. */
|
|
220
|
+
body > .fixed,
|
|
221
|
+
.auth-block {
|
|
222
|
+
color: var(--nebula-ink);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.main-content header,
|
|
226
|
+
.content-section {
|
|
227
|
+
background-color: transparent;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.section-title {
|
|
231
|
+
color: var(--nebula-ink);
|
|
232
|
+
}
|