7 Commits
Author SHA1 Message Date
Lucas 5b7abc1510 Update README.md 2026-09-16 16:01:40 +02:00
Lucas 58a77e473b 2026.9 2026-09-16 16:01:13 +02:00
Lucas 140d51f248 2026.9 2026-09-16 15:22:36 +02:00
Lucas 80bf0fa42f 2026.9 2026-09-16 14:37:37 +02:00
Lucas 963b960554 Update _config.py 2026-03-16 12:43:11 +01:00
Lucas aec29383c8 remove external img 2026-03-16 12:37:41 +01:00
Takeus bbec5d07db Update setup.py 2026-02-05 19:53:03 +01:00
28 changed files with 132 additions and 37 deletions

No files matched your search

View File
File renamed without changes.
+1
View File
@@ -0,0 +1 @@
Here you will find ideas for potential future updates.
+11
View File
@@ -0,0 +1,11 @@
#!/sbin/openrc-run
name="gunicorn-flask"
description="Gunicorn server for Flask app"
command="/usr/bin/gunicorn"
command_args="--workers 1 --bind 127.0.0.1:8000 'app:create_app()' --preload"
pidfile="/run/${name}.pid"
directory="/opt/fipam"
command_background="yes"
---------------------------------------------> /etc/init.d/flask-ipam
File renamed without changes.
+1 -6
View File
@@ -12,10 +12,5 @@ _(I'm not an experienced developer, just a tinkerer)_
![image](https://github.com/user-attachments/assets/5767a3dc-d99c-4c3e-bb88-c9c92049f58a) ![image](https://github.com/user-attachments/assets/5767a3dc-d99c-4c3e-bb88-c9c92049f58a)
--- ---
- Installation : [here](install.md) *(without docker)* - Installation : [here](install.md)
- Sources : [here](sources.md) - Sources : [here](sources.md)
### Docker Compose
you have to build the docker image first (with Dockerfile).
- example : `docker build -t fipam_docker .`
- You have to generate the database by creating the first user via “setup.py”, create an “instance” folder and put the “database.db” file in it.
+7 -5
View File
@@ -19,6 +19,8 @@ def create_app():
app = Flask(__name__) app = Flask(__name__)
app.config.from_object(Configuration) app.config.from_object(Configuration)
app.jinja_env.globals['app_version'] = app_version
login_manager.init_app(app) login_manager.init_app(app)
db.init_app(app) db.init_app(app)
@@ -60,7 +62,7 @@ def create_app():
"401", "401",
"Unauthorized", "Unauthorized",
"The server could not verify that you are authorized to access the URL requested. You are not authenticated, or your browser doesn't understand how to supply the credentials required...", "The server could not verify that you are authorized to access the URL requested. You are not authenticated, or your browser doesn't understand how to supply the credentials required...",
"https://takeus.ovh/static/img/login.svg" "/static/img/403.png"
] ]
return render_template('srv_error.html',HTTP_ERROR=HTTP_ERROR), 401 return render_template('srv_error.html',HTTP_ERROR=HTTP_ERROR), 401
@@ -70,7 +72,7 @@ def create_app():
"403", "403",
"Forbidden", "Forbidden",
"You don't have the permission to access the requested resource. It is either read-protected or not readable by the server...", "You don't have the permission to access the requested resource. It is either read-protected or not readable by the server...",
"https://takeus.ovh/static/img/login.svg" "/static/img/403.png"
] ]
return render_template('srv_error.html',HTTP_ERROR=HTTP_ERROR), 403 return render_template('srv_error.html',HTTP_ERROR=HTTP_ERROR), 403
@@ -80,7 +82,7 @@ def create_app():
"404", "404",
"Not Found", "Not Found",
"The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again...", "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again...",
"https://takeus.ovh/static/img/404.svg" "/static/img/404.png"
] ]
return render_template('srv_error.html',HTTP_ERROR=HTTP_ERROR), 404 return render_template('srv_error.html',HTTP_ERROR=HTTP_ERROR), 404
@@ -90,7 +92,7 @@ def create_app():
"500", "500",
"Internal Server Error", "Internal Server Error",
"The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.", "The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.",
"https://takeus.ovh/static/img/500.svg" "/static/img/403.png"
] ]
return render_template('srv_error.html',HTTP_ERROR=HTTP_ERROR), 500 return render_template('srv_error.html',HTTP_ERROR=HTTP_ERROR), 500
@@ -100,7 +102,7 @@ def create_app():
"503", "503",
"Service Unavailable", "Service Unavailable",
"The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.", "The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.",
"https://takeus.ovh/static/img/503.svg" "/static/img/403.png"
] ]
return render_template('srv_error.html',HTTP_ERROR=HTTP_ERROR), 503 return render_template('srv_error.html',HTTP_ERROR=HTTP_ERROR), 503
+3 -3
View File
@@ -10,11 +10,11 @@ app_debug = True
app_maintenance = False app_maintenance = False
app_name = 'takeus-ipam' app_name = 'takeus-ipam'
app_version = 'V2026.1' app_version = 'V2026.9'
app_release_date = '01/2026' app_release_date = '09/2026'
app_url = "http://0.0.0.0" app_url = "http://0.0.0.0"
app_theme = ['default', 'lumen', 'simplex', 'zephyr'] app_theme = ['default', 'spacelab', 'lumen', 'simplex', 'zephyr', 'cerulean', 'brite', 'materia', 'litera']
class Configuration: class Configuration:
# replace SECRET_KEY with value from "openssl rand -hex 32" or similar for STATIC sessions # replace SECRET_KEY with value from "openssl rand -hex 32" or similar for STATIC sessions
# With actual configuration, every application restart, user have to re-login... # With actual configuration, every application restart, user have to re-login...
+2 -1
View File
@@ -24,7 +24,8 @@ class ChangePasswordForm(FlaskForm):
is_readonly = SelectField(choices=[(0,'No'),(1,'Yes')],validators=[DataRequired()]) is_readonly = SelectField(choices=[(0,'No'),(1,'Yes')],validators=[DataRequired()])
class ChangeAllocationForm(FlaskForm): class ChangeAllocationForm(FlaskForm):
hostname = StringField(validators=[Length(max=128)]) shortname = StringField(validators=[Length(max=128)])
fqdn = StringField(validators=[Length(max=128)])
description = StringField(validators=[Length(max=128)]) description = StringField(validators=[Length(max=128)])
is_special = SelectField(choices=[(0,'None'),(1,'DHCP'),(2,'Gateway')],validators=[DataRequired()],label='Special USE ?') is_special = SelectField(choices=[(0,'None'),(1,'DHCP'),(2,'Gateway')],validators=[DataRequired()],label='Special USE ?')
+1
View File
@@ -24,6 +24,7 @@ class Allocation(db.Model):
ipv4 = db.Column(db.String(16),primary_key=True,unique=True) ipv4 = db.Column(db.String(16),primary_key=True,unique=True)
net_id = db.Column(db.Integer(),db.ForeignKey('network.id')) net_id = db.Column(db.Integer(),db.ForeignKey('network.id'))
hostname = db.Column(db.String(32)) hostname = db.Column(db.String(32))
hostname_full = db.Column(db.String(64))
description = db.Column(db.String(64)) description = db.Column(db.String(64))
is_used = db.Column(db.Boolean(),default=False) is_used = db.Column(db.Boolean(),default=False)
is_dhcp = db.Column(db.Boolean(),default=False) is_dhcp = db.Column(db.Boolean(),default=False)
+7 -3
View File
@@ -66,7 +66,6 @@ def allocations(net_id):
else: else:
session['hide_dhcp'] = False session['hide_dhcp'] = False
return redirect(url_for('network.allocations',net_id=net_id)) return redirect(url_for('network.allocations',net_id=net_id))
print(session['hide_dhcp'])
# PAGINATION MODE # PAGINATION MODE
if current_user.ui_lmode == False: if current_user.ui_lmode == False:
active_page = request.args.get('page', type=int) active_page = request.args.get('page', type=int)
@@ -136,7 +135,8 @@ def allocation_edit_modal(net_id, ipv4):
form = ChangeAllocationForm() form = ChangeAllocationForm()
if form.validate_on_submit() and request.method == 'POST': if form.validate_on_submit() and request.method == 'POST':
db_alloc.hostname = str(form.hostname.data) db_alloc.hostname = str(form.shortname.data)
db_alloc.hostname_full = str(form.fqdn.data)
db_alloc.description = str(form.description.data) db_alloc.description = str(form.description.data)
db_alloc.is_used = True db_alloc.is_used = True
# Special Allocation # Special Allocation
@@ -145,6 +145,7 @@ def allocation_edit_modal(net_id, ipv4):
db_alloc.is_dhcp = True db_alloc.is_dhcp = True
db_alloc.is_gateway = False db_alloc.is_gateway = False
db_alloc.hostname = None db_alloc.hostname = None
db_alloc.hostname_full = None
db_alloc.description = "DHCP Allocation" db_alloc.description = "DHCP Allocation"
elif int(form.is_special.data) == 2: elif int(form.is_special.data) == 2:
# Gateway # Gateway
@@ -172,7 +173,9 @@ def allocation_edit_modal(net_id, ipv4):
if old_page == 0: if old_page == 0:
old_page = 1 old_page = 1
form.hostname.default = db_alloc.hostname form.shortname.default = db_alloc.hostname
form.fqdn.default = db_alloc.hostname_full
form.description.default = db_alloc.description form.description.default = db_alloc.description
if db_alloc.is_dhcp: if db_alloc.is_dhcp:
form.is_special.default = 1 form.is_special.default = 1
@@ -192,6 +195,7 @@ def allocation_delete(net_id,ipv4):
db_alloc = Allocation.query.filter_by(net_id=net_id,ipv4=ipv4).first() db_alloc = Allocation.query.filter_by(net_id=net_id,ipv4=ipv4).first()
db_alloc.is_used = False db_alloc.is_used = False
db_alloc.hostname = None db_alloc.hostname = None
db_alloc.hostname_full = None
db_alloc.description = None db_alloc.description = None
db_alloc.is_dhcp = False db_alloc.is_dhcp = False
db_alloc.is_gateway = False db_alloc.is_gateway = False
+12
View File
@@ -0,0 +1,12 @@
@charset "UTF-8";/*!
* Bootswatch v5.3.8 (https://bootswatch.com)
* Theme: brite
* Copyright 2012-2025 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*//*!
* Bootstrap v5.3.8 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/:root,[data-bs-theme=light]{--bs-blue:#61bcff;--bs-indigo:#828df9;--bs-purple:#be82fa;--bs-pink:#ea4998;--bs-red:#f56565;--bs-orange:#fa984a;--bs-yellow:#ffc700;--bs-green:#68d391;--bs-teal:#2ed3be;--bs-cyan:#22d2ed;--bs-black:#000;--bs-white:#fff;--bs-gray:#868e96;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#868e96;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#a2e436;--bs-secondary:#fff;--bs-success:#68d391;--bs-info:#22d2ed;--bs-warning:#ffc700;--bs-danger:#f56565;--bs-light:#e9ecef;--bs-dark:#000;--bs-primary-rgb:162,228,54;--bs-secondary-rgb:255,255,255;--bs-success-rgb:104,211,145;--bs-info-rgb:34,210,237;--bs-warning-rgb:255,199,0;--bs-danger-rgb:245,101,101;--bs-light-rgb:233,236,239;--bs-dark-rgb:0,0,0;--bs-primary-text-emphasis:#415b16;--bs-secondary-text-emphasis:#666666;--bs-success-text-emphasis:#2a543a;--bs-info-text-emphasis:#0e545f;--bs-warning-text-emphasis:#665000;--bs-danger-text-emphasis:#622828;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#ecfad7;--bs-secondary-bg-subtle:white;--bs-success-bg-subtle:#e1f6e9;--bs-info-bg-subtle:#d3f6fb;--bs-warning-bg-subtle:#fff4cc;--bs-danger-bg-subtle:#fde0e0;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#daf4af;--bs-secondary-border-subtle:white;--bs-success-border-subtle:#c3edd3;--bs-info-border-subtle:#a7edf8;--bs-warning-border-subtle:#ffe999;--bs-danger-border-subtle:#fbc1c1;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:0.875rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#000;--bs-link-color-rgb:0,0,0;--bs-link-decoration:underline;--bs-link-hover-color:black;--bs-link-hover-color-rgb:0,0,0;--bs-code-color:#ea4998;--bs-highlight-color:#212529;--bs-highlight-bg:#fff4cc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:1px;--bs-focus-ring-opacity:1;--bs-focus-ring-color:#000;--bs-form-valid-color:#68d391;--bs-form-valid-border-color:#68d391;--bs-form-invalid-color:#f56565;--bs-form-invalid-border-color:#f56565}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#c7ef86;--bs-secondary-text-emphasis:white;--bs-success-text-emphasis:#a4e5bd;--bs-info-text-emphasis:#7ae4f4;--bs-warning-text-emphasis:#ffdd66;--bs-danger-text-emphasis:#f9a3a3;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#202e0b;--bs-secondary-bg-subtle:#333333;--bs-success-bg-subtle:#152a1d;--bs-info-bg-subtle:#072a2f;--bs-warning-bg-subtle:#332800;--bs-danger-bg-subtle:#311414;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#618920;--bs-secondary-border-subtle:#999999;--bs-success-border-subtle:#3e7f57;--bs-info-border-subtle:#147e8e;--bs-warning-border-subtle:#997700;--bs-danger-border-subtle:#933d3d;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#c7ef86;--bs-link-hover-colorLine truncated
/*# sourceMappingURL=bootstrap.min.css.map */
+12
View File
@@ -0,0 +1,12 @@
@charset "UTF-8";/*!
* Bootswatch v5.3.8 (https://bootswatch.com)
* Theme: cerulean
* Copyright 2012-2025 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*//*!
* Bootstrap v5.3.8 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/:root,[data-bs-theme=light]{--bs-blue:#033c73;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#c71c22;--bs-orange:#fd7e14;--bs-yellow:#dd5600;--bs-green:#73a839;--bs-teal:#20c997;--bs-cyan:#2fa4e7;--bs-black:#000;--bs-white:#fff;--bs-gray:#868e96;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#868e96;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#2fa4e7;--bs-secondary:#e9ecef;--bs-success:#73a839;--bs-info:#033c73;--bs-warning:#dd5600;--bs-danger:#c71c22;--bs-light:#f8f9fa;--bs-dark:#343a40;--bs-primary-rgb:47,164,231;--bs-secondary-rgb:233,236,239;--bs-success-rgb:115,168,57;--bs-info-rgb:3,60,115;--bs-warning-rgb:221,86,0;--bs-danger-rgb:199,28,34;--bs-light-rgb:248,249,250;--bs-dark-rgb:52,58,64;--bs-primary-text-emphasis:#13425c;--bs-secondary-text-emphasis:#5d5e60;--bs-success-text-emphasis:#2e4317;--bs-info-text-emphasis:#01182e;--bs-warning-text-emphasis:#582200;--bs-danger-text-emphasis:#500b0e;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#d5edfa;--bs-secondary-bg-subtle:#fbfbfc;--bs-success-bg-subtle:#e3eed7;--bs-info-bg-subtle:#cdd8e3;--bs-warning-bg-subtle:#f8ddcc;--bs-danger-bg-subtle:#f4d2d3;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#acdbf5;--bs-secondary-border-subtle:#f6f7f9;--bs-success-border-subtle:#c7dcb0;--bs-info-border-subtle:#9ab1c7;--bs-warning-border-subtle:#f1bb99;--bs-danger-border-subtle:#e9a4a7;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#495057;--bs-body-color-rgb:73,80,87;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(73, 80, 87, 0.75);--bs-secondary-color-rgb:73,80,87;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(73, 80, 87, 0.5);--bs-tertiary-color-rgb:73,80,87;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:#2fa4e7;--bs-link-color:#2fa4e7;--bs-link-color-rgb:47,164,231;--bs-link-decoration:underline;--bs-link-hover-color:#2683b9;--bs-link-hover-color-rgb:38,131,185;--bs-code-color:#e83e8c;--bs-highlight-color:#495057;--bs-highlight-bg:#f8ddcc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(47, 164, 231, 0.25);--bs-form-valid-color:#73a839;--bs-form-valid-border-color:#73a839;--bs-form-invalid-color:#c71c22;--bs-form-invalid-border-color:#c71c22}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#82c8f1;--bs-secondary-text-emphasis:#f2f4f5;--bs-success-text-emphasis:#abcb88;--bs-info-text-emphasis:#688aab;--bs-warning-text-emphasis:#eb9a66;--bs-danger-text-emphasis:#dd777a;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#09212e;--bs-secondary-bg-subtle:#2f2f30;--bs-success-bg-subtle:#17220b;--bs-info-bg-subtle:#010c17;--bs-warning-bg-subtle:#2c1100;--bs-danger-bg-subtle:#280607;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#1c628b;--bs-secondary-border-subtle:#8c8e8f;--bs-success-border-subtle:#456522;--bs-info-border-subtle:#022445;--bs-warning-border-subtle:#853400;--bs-danger-border-subtle:#771114;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inheriLine truncated
/*# sourceMappingURL=bootstrap.min.css.map */
+12
View File
@@ -0,0 +1,12 @@
@charset "UTF-8";/*!
* Bootswatch v5.3.8 (https://bootswatch.com)
* Theme: litera
* Copyright 2012-2025 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*//*!
* Bootstrap v5.3.8 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/:root,[data-bs-theme=light]{--bs-blue:#4582ec;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#d9534f;--bs-orange:#fd7e14;--bs-yellow:#f0ad4e;--bs-green:#02b875;--bs-teal:#20c997;--bs-cyan:#17a2b8;--bs-black:#000;--bs-white:#fff;--bs-gray:#868e96;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#ddd;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#868e96;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#4582ec;--bs-secondary:#adb5bd;--bs-success:#02b875;--bs-info:#17a2b8;--bs-warning:#f0ad4e;--bs-danger:#d9534f;--bs-light:#f8f9fa;--bs-dark:#343a40;--bs-primary-rgb:69,130,236;--bs-secondary-rgb:173,181,189;--bs-success-rgb:2,184,117;--bs-info-rgb:23,162,184;--bs-warning-rgb:240,173,78;--bs-danger-rgb:217,83,79;--bs-light-rgb:248,249,250;--bs-dark-rgb:52,58,64;--bs-primary-text-emphasis:#1c345e;--bs-secondary-text-emphasis:#45484c;--bs-success-text-emphasis:#014a2f;--bs-info-text-emphasis:#09414a;--bs-warning-text-emphasis:#60451f;--bs-danger-text-emphasis:#572120;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#dae6fb;--bs-secondary-bg-subtle:#eff0f2;--bs-success-bg-subtle:#ccf1e3;--bs-info-bg-subtle:#d1ecf1;--bs-warning-bg-subtle:#fcefdc;--bs-danger-bg-subtle:#f7dddc;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#b5cdf7;--bs-secondary-border-subtle:#dee1e5;--bs-success-border-subtle:#9ae3c8;--bs-info-border-subtle:#a2dae3;--bs-warning-border-subtle:#f9deb8;--bs-danger-border-subtle:#f0bab9;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1.1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#343a40;--bs-body-color-rgb:52,58,64;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(52, 58, 64, 0.75);--bs-secondary-color-rgb:52,58,64;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(52, 58, 64, 0.5);--bs-tertiary-color-rgb:52,58,64;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#4582ec;--bs-link-color-rgb:69,130,236;--bs-link-decoration:underline;--bs-link-hover-color:#3768bd;--bs-link-hover-color-rgb:55,104,189;--bs-code-color:#e83e8c;--bs-highlight-color:#343a40;--bs-highlight-bg:#fcefdc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#ddd;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(69, 130, 236, 0.25);--bs-form-valid-color:#02b875;--bs-form-valid-border-color:#02b875;--bs-form-invalid-color:#d9534f;--bs-form-invalid-border-color:#d9534f}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#ddd;--bs-body-color-rgb:221,221,221;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(221, 221, 221, 0.75);--bs-secondary-color-rgb:221,221,221;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(221, 221, 221, 0.5);--bs-tertiary-color-rgb:221,221,221;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#8fb4f4;--bs-secondary-text-emphasis:#ced3d7;--bs-success-text-emphasis:#67d4ac;--bs-info-text-emphasis:#74c7d4;--bs-warning-text-emphasis:#f6ce95;--bs-danger-text-emphasis:#e89895;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#ddd;--bs-primary-bg-subtle:#0e1a2f;--bs-secondary-bg-subtle:#232426;--bs-success-bg-subtle:#002517;--bs-info-bg-subtle:#052025;--bs-warning-bg-subtle:#302310;--bs-danger-bg-subtle:#2b1110;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#294e8e;--bs-secondary-border-subtle:#686d71;--bs-success-border-subtle:#016e46;--bs-info-border-subtle:#0e616e;--bs-warning-border-subtle:#90682f;--bs-danger-border-subtle:#82322f;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-coloLine truncated
/*# sourceMappingURL=bootstrap.min.css.map */
+12
View File
@@ -0,0 +1,12 @@
@charset "UTF-8";/*!
* Bootswatch v5.3.8 (https://bootswatch.com)
* Theme: materia
* Copyright 2012-2025 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*//*!
* Bootstrap v5.3.8 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/@import url(https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap);:root,[data-bs-theme=light]{--bs-blue:#2196f3;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#e51c23;--bs-orange:#fd7e14;--bs-yellow:#ff9800;--bs-green:#4caf50;--bs-teal:#20c997;--bs-cyan:#9c27b0;--bs-black:#000;--bs-white:#fff;--bs-gray:#666;--bs-gray-dark:#222;--bs-gray-100:#f8f9fa;--bs-gray-200:#eee;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#bbb;--bs-gray-600:#666;--bs-gray-700:#444;--bs-gray-800:#222;--bs-gray-900:#212121;--bs-primary:#2196f3;--bs-secondary:#fff;--bs-success:#4caf50;--bs-info:#9c27b0;--bs-warning:#ff9800;--bs-danger:#e51c23;--bs-light:#f8f9fa;--bs-dark:#222;--bs-primary-rgb:33,150,243;--bs-secondary-rgb:255,255,255;--bs-success-rgb:76,175,80;--bs-info-rgb:156,39,176;--bs-warning-rgb:255,152,0;--bs-danger-rgb:229,28,35;--bs-light-rgb:248,249,250;--bs-dark-rgb:34,34,34;--bs-primary-text-emphasis:#0d3c61;--bs-secondary-text-emphasis:#666666;--bs-success-text-emphasis:#1e4620;--bs-info-text-emphasis:#3e1046;--bs-warning-text-emphasis:#663d00;--bs-danger-text-emphasis:#5c0b0e;--bs-light-text-emphasis:#444;--bs-dark-text-emphasis:#444;--bs-primary-bg-subtle:#d3eafd;--bs-secondary-bg-subtle:white;--bs-success-bg-subtle:#dbefdc;--bs-info-bg-subtle:#ebd4ef;--bs-warning-bg-subtle:#ffeacc;--bs-danger-bg-subtle:#fad2d3;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#a6d5fa;--bs-secondary-border-subtle:white;--bs-success-border-subtle:#b7dfb9;--bs-info-border-subtle:#d7a9df;--bs-warning-border-subtle:#ffd699;--bs-danger-border-subtle:#f5a4a7;--bs-light-border-subtle:#eee;--bs-dark-border-subtle:#bbb;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue",Arial,sans-serif;--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#444;--bs-body-color-rgb:68,68,68;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(68, 68, 68, 0.75);--bs-secondary-color-rgb:68,68,68;--bs-secondary-bg:#eee;--bs-secondary-bg-rgb:238,238,238;--bs-tertiary-color:rgba(68, 68, 68, 0.5);--bs-tertiary-color-rgb:68,68,68;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#2196f3;--bs-link-color-rgb:33,150,243;--bs-link-decoration:underline;--bs-link-hover-color:#1a78c2;--bs-link-hover-color-rgb:26,120,194;--bs-code-color:#e83e8c;--bs-highlight-color:#444;--bs-highlight-bg:#ffeacc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(33, 150, 243, 0.25);--bs-form-valid-color:#4caf50;--bs-form-valid-border-color:#4caf50;--bs-form-invalid-color:#e51c23;--bs-form-invalid-border-color:#e51c23}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212121;--bs-body-bg-rgb:33,33,33;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#222;--bs-secondary-bg-rgb:34,34,34;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#222222;--bs-tertiary-bg-rgb:34,34,34;--bs-primary-text-emphasis:#7ac0f8;--bs-secondary-text-emphasis:white;--bs-success-text-emphasis:#94cf96;--bs-info-text-emphasis:#c47dd0;--bs-warning-text-emphasis:#ffc166;--bs-danger-text-emphasis:#ef777b;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#071e31;--bs-secondary-bg-subtle:#333333;--bs-success-bg-subtle:#0f2310;--bs-info-bg-subtle:#1f0823;--bs-warning-bg-subtle:#331e00;--bs-danger-bg-subtle:#2e0607;--bs-light-bg-subtle:#222;--bs-dark-bg-subtle:#111111;--bs-primary-border-subtle:#145a92;--bs-secondary-border-subtle:#999999;--bs-success-border-subtle:#2e6930;--bs-info-border-subtle:#5e176a;--bs-warning-border-subtle:#995b00;--bs-danger-border-subtle:#891115;--bs-light-border-subtle:#444;--bs-dark-border-subtle:#222;--bs-heading-color:inherit;--bs-link-color:#7ac0f8;--bs-link-hover-color:#95cdf9;--bs-linLine truncated
/*# sourceMappingURL=bootstrap.min.css.map */
+12
View File
@@ -0,0 +1,12 @@
@charset "UTF-8";/*!
* Bootswatch v5.3.8 (https://bootswatch.com)
* Theme: spacelab
* Copyright 2012-2025 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*//*!
* Bootstrap v5.3.8 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/@import url(https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap);:root,[data-bs-theme=light]{--bs-blue:#446e9b;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#cd0200;--bs-orange:#fd7e14;--bs-yellow:#d47500;--bs-green:#3cb521;--bs-teal:#20c997;--bs-cyan:#3399f3;--bs-black:#000;--bs-white:#fff;--bs-gray:#777;--bs-gray-dark:#333;--bs-gray-100:#f8f9fa;--bs-gray-200:#eee;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#999;--bs-gray-600:#777;--bs-gray-700:#495057;--bs-gray-800:#333;--bs-gray-900:#2d2d2d;--bs-primary:#446e9b;--bs-secondary:#999;--bs-success:#3cb521;--bs-info:#3399f3;--bs-warning:#d47500;--bs-danger:#cd0200;--bs-light:#eee;--bs-dark:#333;--bs-primary-rgb:68,110,155;--bs-secondary-rgb:153,153,153;--bs-success-rgb:60,181,33;--bs-info-rgb:51,153,243;--bs-warning-rgb:212,117,0;--bs-danger-rgb:205,2,0;--bs-light-rgb:238,238,238;--bs-dark-rgb:51,51,51;--bs-primary-text-emphasis:#1b2c3e;--bs-secondary-text-emphasis:#3d3d3d;--bs-success-text-emphasis:#18480d;--bs-info-text-emphasis:#143d61;--bs-warning-text-emphasis:#552f00;--bs-danger-text-emphasis:#520100;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#dae2eb;--bs-secondary-bg-subtle:#ebebeb;--bs-success-bg-subtle:#d8f0d3;--bs-info-bg-subtle:#d6ebfd;--bs-warning-bg-subtle:#f6e3cc;--bs-danger-bg-subtle:#f5cccc;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#b4c5d7;--bs-secondary-border-subtle:#d6d6d6;--bs-success-border-subtle:#b1e1a6;--bs-info-border-subtle:#add6fa;--bs-warning-border-subtle:#eec899;--bs-danger-border-subtle:#eb9a99;--bs-light-border-subtle:#eee;--bs-dark-border-subtle:#999;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:"Open Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#777;--bs-body-color-rgb:119,119,119;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(119, 119, 119, 0.75);--bs-secondary-color-rgb:119,119,119;--bs-secondary-bg:#eee;--bs-secondary-bg-rgb:238,238,238;--bs-tertiary-color:rgba(119, 119, 119, 0.5);--bs-tertiary-color-rgb:119,119,119;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:#2d2d2d;--bs-link-color:#3399f3;--bs-link-color-rgb:51,153,243;--bs-link-decoration:underline;--bs-link-hover-color:#297ac2;--bs-link-hover-color-rgb:41,122,194;--bs-code-color:#e83e8c;--bs-highlight-color:#777;--bs-highlight-bg:#f6e3cc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(68, 110, 155, 0.25);--bs-form-valid-color:#3cb521;--bs-form-valid-border-color:#3cb521;--bs-form-invalid-color:#cd0200;--bs-form-invalid-border-color:#cd0200}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#2d2d2d;--bs-body-bg-rgb:45,45,45;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#333;--bs-secondary-bg-rgb:51,51,51;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#303030;--bs-tertiary-bg-rgb:48,48,48;--bs-primary-text-emphasis:#8fa8c3;--bs-secondary-text-emphasis:#c2c2c2;--bs-success-text-emphasis:#8ad37a;--bs-info-text-emphasis:#85c2f8;--bs-warning-text-emphasis:#e5ac66;--bs-danger-text-emphasis:#e16766;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#0e161f;--bs-secondary-bg-subtle:#1f1f1f;--bs-success-bg-subtle:#0c2407;--bs-info-bg-subtle:#0a1f31;--bs-warning-bg-subtle:#2a1700;--bs-danger-bg-subtle:#290000;--bs-light-bg-subtle:#333;--bs-dark-bg-subtle:#1a1a1a;--bs-primary-border-subtle:#29425d;--bs-secondary-border-subtle:#5c5c5c;--bs-success-border-subtle:#246d14;--bs-info-border-subtle:#1f5c92;--bs-warning-border-subtle:#7f4600;--bs-danger-border-subtle:#7b0100;--bs-light-border-subtle:#495057;--bs-daLine truncated
/*# sourceMappingURL=bootstrap.min.css.map */
+1 -7
View File
@@ -1,12 +1,6 @@
@charset "UTF-8";/*! @charset "UTF-8";/*!
* Bootswatch v5.3.8 (https://bootswatch.com)
* Theme: cerulean
* Copyright 2012-2025 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*//*!
* Bootstrap v5.3.8 (https://getbootstrap.com/) * Bootstrap v5.3.8 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors * Copyright 2011-2025 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/:root,[data-bs-theme=light]{--bs-blue:#033c73;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#c71c22;--bs-orange:#fd7e14;--bs-yellow:#dd5600;--bs-green:#73a839;--bs-teal:#20c997;--bs-cyan:#2fa4e7;--bs-black:#000;--bs-white:#fff;--bs-gray:#868e96;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#868e96;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#2fa4e7;--bs-secondary:#e9ecef;--bs-success:#73a839;--bs-info:#033c73;--bs-warning:#dd5600;--bs-danger:#c71c22;--bs-light:#f8f9fa;--bs-dark:#343a40;--bs-primary-rgb:47,164,231;--bs-secondary-rgb:233,236,239;--bs-success-rgb:115,168,57;--bs-info-rgb:3,60,115;--bs-warning-rgb:221,86,0;--bs-danger-rgb:199,28,34;--bs-light-rgb:248,249,250;--bs-dark-rgb:52,58,64;--bs-primary-text-emphasis:#13425c;--bs-secondary-text-emphasis:#5d5e60;--bs-success-text-emphasis:#2e4317;--bs-info-text-emphasis:#01182e;--bs-warning-text-emphasis:#582200;--bs-danger-text-emphasis:#500b0e;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#d5edfa;--bs-secondary-bg-subtle:#fbfbfc;--bs-success-bg-subtle:#e3eed7;--bs-info-bg-subtle:#cdd8e3;--bs-warning-bg-subtle:#f8ddcc;--bs-danger-bg-subtle:#f4d2d3;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#acdbf5;--bs-secondary-border-subtle:#f6f7f9;--bs-success-border-subtle:#c7dcb0;--bs-info-border-subtle:#9ab1c7;--bs-warning-border-subtle:#f1bb99;--bs-danger-border-subtle:#e9a4a7;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#495057;--bs-body-color-rgb:73,80,87;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(73, 80, 87, 0.75);--bs-secondary-color-rgb:73,80,87;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(73, 80, 87, 0.5);--bs-tertiary-color-rgb:73,80,87;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:#2fa4e7;--bs-link-color:#2fa4e7;--bs-link-color-rgb:47,164,231;--bs-link-decoration:underline;--bs-link-hover-color:#2683b9;--bs-link-hover-color-rgb:38,131,185;--bs-code-color:#e83e8c;--bs-highlight-color:#495057;--bs-highlight-bg:#f8ddcc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(47, 164, 231, 0.25);--bs-form-valid-color:#73a839;--bs-form-valid-border-color:#73a839;--bs-form-invalid-color:#c71c22;--bs-form-invalid-border-color:#c71c22}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#82c8f1;--bs-secondary-text-emphasis:#f2f4f5;--bs-success-text-emphasis:#abcb88;--bs-info-text-emphasis:#688aab;--bs-warning-text-emphasis:#eb9a66;--bs-danger-text-emphasis:#dd777a;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#09212e;--bs-secondary-bg-subtle:#2f2f30;--bs-success-bg-subtle:#17220b;--bs-info-bg-subtle:#010c17;--bs-warning-bg-subtle:#2c1100;--bs-danger-bg-subtle:#280607;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#1c628b;--bs-secondary-border-subtle:#8c8e8f;--bs-success-border-subtle:#456522;--bs-info-border-subtle:#022445;--bs-warning-border-subtle:#853400;--bs-danger-border-subtle:#771114;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inheriLine truncated */:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherLine truncated
/*# sourceMappingURL=bootstrap.min.css.map */ /*# sourceMappingURL=bootstrap.min.css.map */
+13
View File
@@ -10,4 +10,17 @@ pre {
html { html {
scroll-behavior: auto !important; scroll-behavior: auto !important;
}
html, body {
height: 100%;
}
body {
display: flex;
flex-direction: column;
}
main {
flex: 1 0 auto;
} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

+2 -1
View File
@@ -1 +1,2 @@
var htmx=function(){"use strict";const Q={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){const n=dn(e,t||"post");return n.values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:true,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null,disableInheritance:false,responseHandling:[{code:"204",swap:false},{code:"[23]..",swap:true},{code:"[45]..",swap:false,error:true}],allowNestedOobSwaps:true,historyRestoreAsHxRequest:true,reportValidityOfForms:false},parseInterval:null,location:location,_:null,version:"2.0.8"};Q.onLoad=V;Q.process=Ft;Q.on=xe;Q.off=be;Q.trigger=ae;Q.ajax=Ln;Q.find=f;Q.findAll=x;Q.closest=g;Q.remove=_;Q.addClass=K;Q.removeClass=G;Q.toggleClass=W;Q.takeClass=Z;Q.swap=ze;Q.defineExtension=_n;Q.removeExtension=zn;Q.logAll=j;Q.logNone=$;Q.parseInterval=d;Q._=e;const n={addTriggerHandler:St,bodyContains:se,canAccessLocalStorage:X,findThisElement:Se,filterValues:yn,swap:ze,hasAttribute:s,getAttributeValue:a,getClosestAttributeValue:ne,getClosestMatch:q,getExpressionVars:Rn,getHeaders:mn,getInputValues:dn,getInternalData:oe,getSwapSpecification:bn,getTriggerSpecs:st,getTarget:Ee,makeFragment:D,mergeObjects:le,makeSettleInfo:Sn,oobSwap:Te,querySelectorExt:ue,settleImmediately:Yt,shouldCancel:ht,triggerEvent:ae,triggerErrorEvent:fe,withExtensions:Vt};const de=["get","post","put","delete","patch"];const R=de.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function d(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e instanceof Element&&e.getAttribute(t)}function s(e,t){return!!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function a(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){const t=e.parentElement;if(!t&&e.parentNode instanceof ShadowRoot)return e.parentNode;return t}function te(){return document}function y(e,t){return e.getRootNode?e.getRootNode({composed:t}):te()}function q(e,t){while(e&&!t(e)){e=u(e)}return e||null}function o(e,t,n){const r=a(t,n);const o=a(t,"hx-disinherit");var i=a(t,"hx-inherit");if(e!==t){if(Q.config.disableInheritance){if(i&&(i==="*"||i.split(" ").indexOf(n)>=0)){return r}else{return null}}if(o&&(o==="*"||o.split(" ").indexOf(n)>=0)){return"unset"}}return r}function ne(t,n){let r=null;q(t,function(e){return!!(r=o(t,ce(e),n))});if(r!=="unset"){return r}}function h(e,t){return e instanceof Element&&e.matches(t)}function A(e){const t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;const n=t.exec(e);if(n){return n[1].toLowerCase()}else{return""}}function L(e){if("parseHTMLUnsafe"in Document){return Document.parseHTMLUnsafe(e)}const t=new DOMParser;return t.parseFromString(e,"text/html")}function N(e,t){while(t.childNodes.length>0){e.append(t.childNodes[0])}}function r(e){const t=te().createElement("script");ie(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}return t}function i(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function I(e){Array.from(e.querySelectorAll("script")).forEach(e=>{if(i(e)){const t=r(e);const n=e.parentNode;try{n.insertBefore(t,e)}catch(e){H(e)}finally{e.remove()}}})}function D(e){const t=e.replace(/<head(\s[^>]*)?>[\s\S]*?<\/head>/i,"");const n=A(t);let r;if(n==="html"){r=new DocumentFragment;const i=L(e);N(r,i.body);r.title=i.title}else if(n==="body"){r=new DocumentFragment;const i=L(t);N(r,i.body);r.title=i.title}else{const i=L('<body><template class="internal-htmx-wrapper">'+t+"</template></body>");r=i.querySelector("template").content;r.title=i.title;var o=r.querySelector("title");if(o&&o.parentNode===r){o.remove();r.title=o.innerText}}if(r){if(Q.config.allowScriptTags){I(r)}else{r.querySelectorAll("script").forEach(e=>e.remove())}}return r}function re(e){if(e){e()}}function t(e,t){return Object.protoLine truncated // HTMX v4.0.0
var htmx=(()=>{const e={parse(t){if(!t)return{};if(t.startsWith("{"))return JSON.parse(t);let r=/(?:"([^"]+)"|'([^']+)'|([^\s,:]+))(?:\s*:\s*(?:"([^"]*)"|'([^']*)'|<((?:[^/]|\/(?!>))+)\/>|([^\s,]+)))?(?=\s|,|$)/g,i={};for(let s of t.matchAll(r)){let[,t,r,n,o,a,l,h]=s,c=t??r??n,u=(o??a??l??h??"true").trim();try{u=JSON.parse(u)}catch{}let d=n?.includes("."),f=d?c.split(".").reduceRight((e,t)=>({[t]:e}),u):{[c]:u};e.merge(f,i)}return i},split:e=>e.split(/,(?![^\[]*\])(?![^(]*\))(?![^<]*\/>)(?=(?:[^"']|"[^"]*"|'[^']*')*$)/),merge(t,r){"string"==typeof t&&(t=e.parse(t));for(let[i,s]of Object.entries(t)){if(["__proto__","constructor","prototype"].includes(i))continue;let t=s?.constructor===Object,n=r[i]?.constructor===Object;t&&n?e.merge(s,r[i]):r[i]=s}return r}};class t{#e=null;#t=[];admit(e,t,r){if(!this.#e)return this.#e={strategy:e,abort:r},"run";if("replace"===e||"abort"!==e&&"abort"===this.#e.strategy)return this.#t=[],this.#e.abort?.(),this.#e={strategy:e,abort:r},"run";if("queue all"===e)this.#t.push(t);else if("queue last"===e)this.#t=[t];else{if("abort"===e||"drop"===e||0!==this.#t.length)return"dropped";this.#t.push(t)}return"queued"}continue(){this.#e=null,this.#t.shift()?.()}abort(){this.#e?.abort?.()}}return new class{#r=e;#i=new Map;#s="";#n=new Set;_loc=window.location;#o;#a=Function;#l=Object.getPrototypeOf(async function(){}).constructor;#h={createHTML:e=>e,createScript:e=>e};#c;#u="a,form";#d=["get","post","put","patch","delete","query"];#f;#m;#p;#g;#x;constructor(){this.#b(),this.#y(),this.#c=this.#S("[hx-action],[hx-get],[hx-post],[hx-put],[hx-patch],[hx-delete],[hx-query]"),this.#f=(new XPathEvaluator).createExpression(`.//*[@*[${this.#v("hx-on").map(e=>`starts-with(name(), "${e}")`).join(" or ")}]]`),this.#o={HCON:e,attributeValue:this.#E.bind(this),parseTriggerSpecs:this.#w.bind(this),determineMethodAndAction:this.#A.bind(this),createRequestContext:this.#T.bind(this),collectFormData:this.#C.bind(this),getAttributeObject:this.#q.bind(this),insertContent:this.#N.bind(this),morph:this.#I.bind(this),isSoftMatch:this.#M.bind(this),initSecurity:(e,t,r)=>{e&&(this.#h=e),t&&(this.#a=t),r&&(this.#l=r)},onTrigger:this.#O.bind(this),htmxProp:this.#H.bind(this),triggerHtmxEvent:this.#L.bind(this),executeJavaScript:this.#k.bind(this)};let t=()=>this.initialize();"loading"===document.readyState?document.addEventListener("DOMContentLoaded",t):setTimeout(t)}#b(){this.version="4.0.0",this.config={logAll:!1,prefix:"data-hx-",transitions:!1,history:!0,mode:"same-origin",defaultSwap:"innerHTML",defaultFocusScroll:!1,indicatorClass:"htmx-indicator",requestClass:"htmx-request",includeIndicatorCSS:!0,defaultTimeout:6e4,extensions:"",morphIgnore:["data-htmx-powered"],morphSkip:"[hx-morph-skip]",morphSkipChildren:"[hx-morph-skip-children]",morphScanLimit:10,noSwap:[204,304],implicitInheritance:!1,defaultSettleDelay:1,allowEmptySwapAfterOOB:!1};let t=document.querySelector('meta[name="htmx-config"]');t&&e.merge(t.content,this.config),this.#s=this.config.extensions}#y(){if(!1!==this.config.includeIndicatorCSS){let e=this.config.indicatorClass,t=this.config.requestClass,r=new CSSStyleSheet;r.replaceSync(`.${e}{opacity:0;visibility: hidden} .${t} .${e}, .${t}.${e}{opacity:1;visibility: visible;transition: opacity 200ms ease-in}`),document.adoptedStyleSheets=[...document.adoptedStyleSheets,r]}}registerExtension(e,t){return!(this.#s&&!this.#s.split(/,\s*/).includes(e))&&(!this.#n.has(e)&&(this.#n.add(e),t.init&&t.init(this.#o),void Object.entries(t).forEach(([e,t])=>{this.#i.get(e)?.push(t)||this.#i.set(e,[t])})))}#V(e){let t=this.config.prefix;return!e.closest||null!=e.closest("[hx-ignore]")||t&&null!=e.closest(`[${t}ignore]`)}#P(e,t){let r=this.config.prefix;return e.getAttribute(t)??(r?e.getAttribute(t.replace("hx-",r)):null)}#R(e,t){let r=this.config.prefix&&t.replace("hx-",this.config.prefix);return e.hasAttribute(t)?t:r&&e.hasAttribute(r)?r:null}#S(e){return this.#v(e).join(",")}#v(e){let t=[e];return this.config.prefix&&t.push(e.replaceAll("hx-",this.config.prefix)),t}#j(e,t){let r=[...e.querySelectorAll?.(t)??[]];return e.matches?.(t)&&r.unshift(e),r}#B(e){return"before"===e?"beforebegin":"after"===e?"afterend":"prepend"===e?"afterbegin":"append"===e?"beforeend":e}#F(e,t){let r=[];return this.#E(e,t,void 0,(e,t)=>{e?.split(/\s*[,:]\s*/).includes("this")&&r.push(t)}),r}#E(e,t,r,i){t=this.#z(t);let s=this.#z(":inherited"),n=this.#z(":append"),o=this.#P(e,t)??this.#P(e,t+s);if(null!=o)return i?i(o,e):o;let a=CSS.escape(this.config.implicitInheritance?t:t+s),l=CSS.escape(t+s+n),h=this.#S(`[${a}],[${l}]`),c=this.#R(e,t+n)??this.#R(e,t+s+n);if(c){let r=e.getAttribute(c),s=e.parentNode?.closest?.(h);if(i&&i(r,e),s){let e=this.#E(s,t,void 0,i);return e?(e+","+r).replace(/[{}]/g,""):r}return r}let u=e.parentNode?.closest?.(h);return u?(o=this.#E(u,t,void 0,i),!i&&o&&this.config.implicitInheritance&&this.#_(e,"htmx:after:implicitInheritance",{elt:e,name:t,parent:u}),o):r}#w(t){return e.split(t).flatMap(t=>{let[,r,i]=t.maLine truncated
-1
View File
@@ -112,5 +112,4 @@
<div class="modal-content"></div> <div class="modal-content"></div>
</div> </div>
</div> </div>
{% include 'panel/_footer.html' %}
{% endblock %} {% endblock %}
+11
View File
@@ -13,10 +13,20 @@
<link rel="stylesheet" href="{{ url_for('static',filename='css/custom.css') }}"/> <link rel="stylesheet" href="{{ url_for('static',filename='css/custom.css') }}"/>
{% if current_user.ui_theme == 'zephyr' %} {% if current_user.ui_theme == 'zephyr' %}
<link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/zephyr.css') }}"/> <link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/zephyr.css') }}"/>
{% elif current_user.ui_theme == 'spacelab' %}
<link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/spacelab.css') }}"/>
{% elif current_user.ui_theme == 'lumen' %} {% elif current_user.ui_theme == 'lumen' %}
<link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/lumen.css') }}"/> <link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/lumen.css') }}"/>
{% elif current_user.ui_theme == 'simplex' %} {% elif current_user.ui_theme == 'simplex' %}
<link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/simplex.css') }}"/> <link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/simplex.css') }}"/>
{% elif current_user.ui_theme == 'cerulean' %}
<link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/cerulean.css') }}"/>
{% elif current_user.ui_theme == 'brite' %}
<link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/brite.css') }}"/>
{% elif current_user.ui_theme == 'materia' %}
<link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/materia.css') }}"/>
{% elif current_user.ui_theme == 'litera' %}
<link rel="stylesheet" href="{{ url_for('static',filename='css/Bootstrap/litera.css') }}"/>
{% else %} {% else %}
<link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap.min.css') }}"/> <link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap.min.css') }}"/>
{% endif %} {% endif %}
@@ -24,6 +34,7 @@
</head> </head>
<body> <body>
{% block content %}{% endblock %} {% block content %}{% endblock %}
{% include 'panel/_footer.html' %}
<!-- JAVASCRIPT --> <!-- JAVASCRIPT -->
<script src="{{ url_for('static',filename='js/htmx.min.js') }}"></script> <script src="{{ url_for('static',filename='js/htmx.min.js') }}"></script>
<script src="{{ url_for('static',filename='js/bootstrap.bundle.min.js') }}"></script> <script src="{{ url_for('static',filename='js/bootstrap.bundle.min.js') }}"></script>
+1 -1
View File
@@ -1 +1 @@
<footer class="test-center" style="text-align: center;">Flask IPAM - {{app_version}}</footer> <footer class="footer mt-auto py-3" style="text-align: center;">Flask IPAM - {{app_version}}</footer>
+5
View File
@@ -37,9 +37,14 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='default') }}">default</a></li> <li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='default') }}">default</a></li>
<li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='spacelab') }}">Spacelab</a></li>
<li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='zephyr') }}">Zephyr</a></li> <li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='zephyr') }}">Zephyr</a></li>
<li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='simplex') }}">Simplex</a></li> <li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='simplex') }}">Simplex</a></li>
<li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='lumen') }}">Lumen</a></li> <li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='lumen') }}">Lumen</a></li>
<li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='cerulean') }}">Cerulean</a></li>
<li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='brite') }}">Brite</a></li>
<li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='materia') }}">Materia</a></li>
<li><a class="dropdown-item" href="{{ url_for('base.change_theme',name='litera') }}">Litera</a></li>
</ul> </ul>
</div> </div>
<a class="btn btn-outline-warning btn-sm" type="submit" href="{{ url_for('auth.logout') }}">logout</a> <a class="btn btn-outline-warning btn-sm" type="submit" href="{{ url_for('auth.logout') }}">logout</a>
+2 -3
View File
@@ -4,6 +4,7 @@
<tr> <tr>
<td id="{{allocation.ipv4}}"><b>{{allocation.ipv4}}</b></td> <td id="{{allocation.ipv4}}"><b>{{allocation.ipv4}}</b></td>
<td>{{allocation.hostname}}</td> <td>{{allocation.hostname}}</td>
<td>{{allocation.hostname_full}}</td>
<td>{{allocation.description}}</td> <td>{{allocation.description}}</td>
<td> <td>
{% if Inventory.query.filter_by(id=allocation.device_id).first() %} {% if Inventory.query.filter_by(id=allocation.device_id).first() %}
@@ -21,9 +22,7 @@
N/A N/A
{% endif %} {% endif %}
</td> </td>
<td>{{allocation.is_dhcp}}</td> <td>{% if allocation.is_dhcp %}<span class="badge text-bg-secondary" style="margin-right: 0.5rem;">DHCP</span>{% endif %}{% if allocation.is_gateway %}<span class="badge text-bg-primary" style="margin-right: 0.5rem;">GATEWAY</span>{% endif %}{% if allocation.is_decom %}<span class="badge text-bg-warning" style="margin-right: 0.5rem;">DECOM</span>{% endif %}</td>
<td>{{allocation.is_gateway}}</td>
<td>{{allocation.is_decom}}</td>
{% if current_user.is_reado == False %} {% if current_user.is_reado == False %}
<td> <td>
{% if allocation.is_used %} {% if allocation.is_used %}
+3 -4
View File
@@ -24,12 +24,11 @@
<thead> <thead>
<tr> <tr>
<th scope="col">IPv4</th> <th scope="col">IPv4</th>
<th scope="col">Hostname</th> <th scope="col">Shortname</th>
<th scope="col">FQDN</th>
<th scope="col">Description</th> <th scope="col">Description</th>
<th scope="col">Device</th> <th scope="col">Device</th>
<th scope="col">DHCP</th> <th scope="col">TAG(s)</th>
<th scope="col">GATEWAY</th>
<th scope="col">DECOM</th>
{% if current_user.is_reado == False %}<th scope="col">Actions</th>{% endif %} {% if current_user.is_reado == False %}<th scope="col">Actions</th>{% endif %}
</tr> </tr>
</thead> </thead>
-2
View File
@@ -51,8 +51,6 @@
</div> </div>
<div class="col-2"></div> <div class="col-2"></div>
</div> </div>
<hr>
{% include 'panel/_footer.html' %}
</div> </div>
<script src="{{ url_for('static',filename='js/chart.umd.js') }}"></script> <script src="{{ url_for('static',filename='js/chart.umd.js') }}"></script>
<script> <script>
+1
View File
@@ -15,6 +15,7 @@ class User(db.Model):
is_admin = db.Column(db.Boolean(),default=False) is_admin = db.Column(db.Boolean(),default=False)
is_reado = db.Column(db.Boolean(),default=False) is_reado = db.Column(db.Boolean(),default=False)
ui_theme = db.Column(db.String(16)) ui_theme = db.Column(db.String(16))
ui_lmode = db.Column(db.Boolean(),default=False)
dat_last = db.Column(db.DateTime()) dat_last = db.Column(db.DateTime())
with app.app_context(): with app.app_context():