Merge pull request 'odds-ends-changes' (#3) from odds-ends-changes into main

Reviewed-on: #3
This commit was merged in pull request #3.
This commit is contained in:
2026-02-19 00:47:33 -05:00
51 changed files with 1516 additions and 3622 deletions

19
.recycle/database.bash Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
##
reset
clear
##
set -e
set -x
##
docker compose -f database.yaml down --remove-orphans
docker compose -f database.yaml up -d --build

55
.recycle/database.yaml Normal file
View File

@@ -0,0 +1,55 @@
services:
##########################################
##
## hosting / relational data
##
##########################################
card-players-unite-postgres:
container_name: card-players-unite-postgres
image: postgres:14.1-alpine
restart: unless-stopped
ports:
- 5432:5432
environment:
- POSTGRES_DB=maverickdb
- POSTGRES_USER=maverickdb
- POSTGRES_PASSWORD=maverickdb
volumes:
- /tmp/volumes/postgres:/var/lib/postgresql/data
card-players-unite-pgadmin:
container_name: card-players-unite-pgadmin
image: dpage/pgadmin4
depends_on:
- card-players-unite-postgres
ports:
- "5480:80"
environment:
PGADMIN_DEFAULT_EMAIL: lorem@loremipsum.com
PGADMIN_DEFAULT_PASSWORD: maverickdb
volumes:
- /tmp/volumes/pgadmin4:/var/lib/pgadmin

38
.recycle/django.bash Executable file
View File

@@ -0,0 +1,38 @@
#!/bin/bash
##
set -e
set -x
##
reset
clear
##
#python3 manage.py dumpdata
## This will IRREVERSIBLY DESTROY all data currently in the "maverickdb" database, and return each table to an empty state.
### python3 manage.py flush
### python3 manage.py sqlflush
#python3 manage.py sqlmigrate
##python3 manage.py sqlsequencereset
#python3 manage.py generateschema
python3 manage.py makemigrations
python3 manage.py migrate
#python3 manage.py squashmigrations bikes
#python3 manage.py optimizemigration
python3 manage.py runserver 0.0.0.0:8888

25
.recycle/provision.bash Executable file
View File

@@ -0,0 +1,25 @@
#!/bin/bash
# 1. Setup/Re-setup Virtual Environment
python3 -m venv venv
source venv/bin/activate
# 2. Downgrade pip to bypass the invalid metadata error in django-rest-auth-forked
pip install "pip<24.1"
# 3. Install requirements (now it will ignore the parenthesis error)
if [ -f "requirements.txt" ]; then
pip install -r requirements.txt
else
pip install django
fi
echo "Setup complete. Run 'source venv/bin/activate' to start working."

View File

@@ -1,24 +1,70 @@
services:
# The Django Web Application
web:
container_name: card-players-unite-web
build:
context: .
dockerfile: Dockerfile
##########################################
##
## hosting / networking
##
##########################################
hosting-proxy:
container_name: hosting-proxy
image: softwareshinobi/docker-container-proxy
restart: unless-stopped
ports:
- "8000:8000"
volumes:
- .:/home/app/webapp
- /var/run/docker.sock:/tmp/docker.sock:ro
- /var/docker/nginx/html:/usr/share/nginx/html
- /var/docker/nginx/certs:/etc/nginx/certs
- /var/docker/nginx/vhost:/etc/nginx/vhost.d
ports:
- 33080:80
- 33443:443
logging:
options:
max-size: "10m"
max-file: "3"
hosting-letsencrypt:
container_name: hosting-letsencrypt
image: jrcs/letsencrypt-nginx-proxy-companion
restart: unless-stopped
volumes_from:
- hosting-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/docker/nginx/acme:/etc/acme.sh
environment:
- POSTGRES_DB=maverickdb
- POSTGRES_USER=maverickdb
- POSTGRES_PASSWORD=maverickdb
- POSTGRES_HOST=card-players-unite-postgres
depends_on:
- card-players-unite-postgres
DEFAULT_EMAIL: troy@softwareshinobi.com
##########################################
##
## hosting / relational data
##
##########################################
card-players-unite-postgres:
@@ -40,23 +86,34 @@ services:
- POSTGRES_PASSWORD=maverickdb
## volumes:
##
## - /tmp/volume-data-postgres:/var/lib/postgresql/data
volumes:
- /tmp/volume-data-postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U maverickdb -d maverickdb"]
interval: 5s
timeout: 5s
retries: 5
card-players-unite-pgadmin:
user: root # Or your specific UID:GID
container_name: card-players-unite-pgadmin
image: dpage/pgadmin4
depends_on:
- card-players-unite-postgres
card-players-unite-postgres:
condition: service_healthy # THIS TELLS DOCKER TO WAIT FOR THE HEALTHCHECK
ports:
- "5480:80"
- 5480:80
volumes:
- /tmp/volumes/pgadmin4444:/var/lib/pgadmin
environment:
@@ -64,6 +121,64 @@ services:
PGADMIN_DEFAULT_PASSWORD: maverickdb
## volumes:
##########################################
##
## - /tmp/volume-data-pgadmin4:/var/lib/pgadmin
## hosting / relational data
##
##########################################
apis.cardplayersunited.com:
container_name: apis.cardplayersunited.com
image: apis.cardplayersunited.com
build:
context: .
dockerfile: Dockerfile
restart: unless-stopped
depends_on:
card-players-unite-postgres:
condition: service_healthy # THIS TELLS DOCKER TO WAIT FOR THE HEALTHCHECK
ports:
- 8888:8000
volumes:
- .:/home/app/webapp
environment:
- POSTGRES_DB=maverickdb
- POSTGRES_USER=maverickdb
- POSTGRES_PASSWORD=maverickdb
- POSTGRES_HOST=card-players-unite-postgres
## documentation
docs.cardplayersunited.com:
container_name: docs.cardplayersunited.com
image: docs.cardplayersunited.com
build:
context: docs
dockerfile: Dockerfile
restart: unless-stopped
ports:
- 8000:80

11
docs/.dockerignore Normal file
View File

@@ -0,0 +1,11 @@
.git
.pristine
.trash
.recycle
.backup
.template

7
docs/.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
pdf/
export/
site/
*.dat

16
docs/Dockerfile Normal file
View File

@@ -0,0 +1,16 @@
FROM titom73/mkdocs AS mkdocsBuild
RUN pip install markupsafe==2.0.1
RUN pip install mkdocs-blog-plugin
WORKDIR /docs
COPY . .
RUN mkdocs build
FROM mengzyou/bbhttpd:1.35
COPY --from=mkdocsBuild --chown=www:www /docs/site /home/www/html

56
docs/Jenkinsfile vendored Normal file
View File

@@ -0,0 +1,56 @@
pipeline {
agent none
options {
disableConcurrentBuilds(abortPrevious: true)
buildDiscarder(logRotator(numToKeepStr: '10'))
}
stages {
stage('docker compose build') {
agent {
label "gulfstream"
}
steps {
dir('.') {
sh 'docker compose build'
}
}
}
stage('docker compose push') {
agent {
label "gulfstream"
}
steps {
dir('.') {
sh 'docker compose push'
}
}
}
}
}

19
docs/compose.bash Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
##
set -e
set -x
##
reset
clear
##
docker compose down --remove-orphans
docker compose up --build -d

23
docs/compose.yaml Normal file
View File

@@ -0,0 +1,23 @@
services:
lorem-ipsum-dolor-sit:
container_name: lorem-ipsum-dolor-sit
image: softwareshinobi/consectetur-adipiscing-ebook
build:
context: .
dockerfile: Dockerfile
ports:
- 8000:80
environment:
VIRTUAL_HOST: lorem.ipsum.example
LETSENCRYPT_HOST: lorem.ipsum.example

BIN
docs/cover.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

27
docs/ebook.bash Executable file
View File

@@ -0,0 +1,27 @@
#!/bin/bash
##
set -e
set -v
##
reset
clear
##
ENABLE_PDF_EXPORT=1 mkdocs build -f mkdocs.pdf.yml
rm -rf site/
##
for file in pdf/*.pdf; do firefox "$file" & done
##

43
docs/legacy/readme.md Normal file
View File

@@ -0,0 +1,43 @@
# intro
![Card Players Unite](/docs/imagery/cover.png)
## Developer Documentation
You can run the app at home.
Follow the instructions below on an Ubuntu Linux server.
[Developer Docs](/docs/index.md)
## Tools & Tech
the tools and tech
| website | how the site helped |
|---------|---------------------|
|[Bootswatch](https://bootswatch.com/)|bootstrap compatible prebuild color theming and css|
|[Digital Ocean](https://www.digitalocean.com/community/tutorials)|cloud server hosting and tutorials|
|[Internet Tutorials](/docs/tutorials.md)|various tutorials from the internet with how-to help and information|
|[Stock Imagery](/docs/attribution.md)|free stock imagery from the internet, with attribution.|
|[TOC Generator](https://ecotrust-canada.github.io/markdown-toc/)|github wiki toc generator.|
|[Jigsaw validator](https://jigsaw.w3.org/css-validator/)|Validator CSS and HTML|
|[Browserstack](https://www.browserstack.com/responsive)|Responsiveness|
## Quick Start Guide
You can run the app at home.
Follow the instructions below on an Ubuntu Linux server.
[Quick Start Guide](/docs/quick-start.md)
### Preview Card Players Unite
![Card Players Unite](/docs/imagery/cover.png)
the app is deployed and available for usage.
Click the link below to access Card Players Unite.
[Access Card Players Unite](https://cardplayersunite.online/)

201
docs/license.md Normal file
View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

17
docs/mkdocs.bash Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
##
reset
clear
##
set -e
set -x
##
mkdocs serve

51
docs/mkdocs.pdf.yml Normal file
View File

@@ -0,0 +1,51 @@
site_name: "Lorem Ipsum (Dolor Sit)"
docs_dir: "pages"
site_dir: "pdf"
theme:
name: material
highlightjs: true
hljs_languages:
- bash
- yaml
- java
- python
plugins:
- to-pdf:
author: "Consectetur Adipiscing"
copyright: "All Rights Reserved. Lorem Ipsum 2025."
output_path: "lorem-ipsum-101.pdf"
cover: true
cover_title: "Lorem Ipsum 101"
cover_subtitle: "The definitive guide to filler text"
cover_logo: "cover.png"
toc_title: "Indice Contentorum"
toc_level: 3
ordered_chapter_level: 2
enabled_if_env: ENABLE_PDF_EXPORT
extra_css:
- styling.css

62
docs/mkdocs.yml Normal file
View File

@@ -0,0 +1,62 @@
##
## Project information
##
site_name: "Lorem Ipsum Dolor"
site_favicon: favicon.svg
docs_dir: "pages"
site_author: "Consectetur Adipiscing"
##site_url: https://lorem-ipsum.example.io/
##site_description: >-
## Sed ut perspiciatis unde omnis iste natus error sit voluptatem
## accusantium doloremque laudantium, totam rem aperiam.
# Repository
##repo_name: lorem/ipsum-dolor
##repo_url: https://github.com/lorem/ipsum-dolor
# Copyright
##copyright: Copyright &copy; 2023 - 2025 Lorem Ipsum
theme:
##
## Find More Themes Here:
##
## https://mkdocs.github.io/mkdocs-bootswatch/
##
## List of theme values:
##
## mkdocs, readthedocs, material, cerulean, cosmo,
## cyborg, darkly, flatly, journal, litera, lumen, lux,
## materia, minty, pulse, sandstone, simplex, slate, solar,
## spacelab, superhero, united, yeti
##
name: material
##
## you can alternate colors for the navigation header.
##
## Allowed values: primary (the default), dark, and light:
##
nav_style: primary
highlightjs: true
hljs_languages:
- bash
- yaml
- java
- python
extra_css: [styling.css]

BIN
docs/pages/cover.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

41
docs/pages/index.md Normal file
View File

@@ -0,0 +1,41 @@
# Curabitur Sodales Ligula
![Lorem Ipsum Ebook](cover.png)
## Introduction
**Lorem ipsum dolor sit amet**, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
* **Integer** nec odio.
* **Praesent** libero.
* **Sed cursus** ante dapibus diam.
## Section I: Phasellus Porttitor
Phasellus porttitor, enim ut fermentum dignissim, ante neque aliquam tellus, vitae iaculis lacus elit id tortor.
> "Nulla facilisi. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum."
### Sub-section A
Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt.
1. **Primis in faucibus**: Orci luctus et ultrices posuere cubilia Curae.
2. **Suspendisse sollicitudin**: Velit sed leo.
3. **Ut leo**: Amet, adipiscing vitae, ultricies sit amet, tempor sit amet, ante.
---
## Section II: Analysis of Data
In this section, we observe the relationship between variables as defined by the following expression:
| Category | Value A | Value B |
| --- | --- | --- |
| Alpha | 10.5 | 20.2 |
| Beta | 15.1 | 18.9 |
| Gamma | 12.3 | 21.0 |
## Conclusion
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.

17
docs/pages/styling.css Normal file
View File

@@ -0,0 +1,17 @@
/* PDF Watermark Styling */
@media print {
body::before {
content: "LOREM IPSUM"; /* Change this to your desired text */
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) rotate(-45deg);
font-size: 100pt;
color: rgba(0, 0, 0, 0.07); /* subtle grey opacity */
z-index: -1000;
white-space: nowrap;
pointer-events: none;
font-family: sans-serif;
font-weight: bold;
}
}

23
docs/provision.bash Executable file
View File

@@ -0,0 +1,23 @@
#!/bin/bash
set -e
set -x
##
apt update
##
apt install pip -y
##
pip install mkdocs-material
##
pip install mkdocs-with-pdf --break-system-packages
pip install mkdocs-to-pdf

View File

@@ -1,43 +1,57 @@
# intro
# Lorem Ipsum Ebook Starter
![Card Players Unite](/docs/imagery/cover.png)
This repository is a professional boilerplate for creating searchable, high-quality ebooks and documentation sites using **MkDocs**. It is pre-configured to support local development via Docker and automated PDF generation.
## Developer Documentation
![Lorem Ipsum Ebook](cover.png)
You can run the app at home.
## 🚀 Features
Follow the instructions below on an Ubuntu Linux server.
* **Documentation Site**: Powered by MkDocs with the `readthedocs` theme.
[Developer Docs](/docs/index.md)
* **PDF Export**: Built-in support for generating professional PDF versions of your content.
## Tools & Tech
* **Dockerized**: Simple deployment and local testing using Docker Compose.
the tools and tech
* **Syntax Highlighting**: Pre-configured for YAML and Rust.
| website | how the site helped |
|---------|---------------------|
|[Bootswatch](https://bootswatch.com/)|bootstrap compatible prebuild color theming and css|
|[Digital Ocean](https://www.digitalocean.com/community/tutorials)|cloud server hosting and tutorials|
|[Internet Tutorials](/docs/tutorials.md)|various tutorials from the internet with how-to help and information|
|[Stock Imagery](/docs/attribution.md)|free stock imagery from the internet, with attribution.|
|[TOC Generator](https://ecotrust-canada.github.io/markdown-toc/)|github wiki toc generator.|
|[Jigsaw validator](https://jigsaw.w3.org/css-validator/)|Validator CSS and HTML|
|[Browserstack](https://www.browserstack.com/responsive)|Responsiveness|
* **Custom Styling**: Integrated CSS support for branding and layout adjustments.
## Quick Start Guide
## 📂 Project Structure
You can run the app at home.
* `pages/`: Contains the Markdown source files for your ebook.
Follow the instructions below on an Ubuntu Linux server.
* `pdf/`: The output directory for generated PDF files (ignored by git).
[Quick Start Guide](/docs/quick-start.md)
* `mkdocs.yml`: The main configuration file for project metadata, themes, and plugins.
### Preview Card Players Unite
* `compose.yaml`: Defines the Docker services for serving the site locally.
![Card Players Unite](/docs/imagery/cover.png)
* `compose.bash`: A helper script to quickly rebuild and restart the Docker environment.
the app is deployed and available for usage.
## 🛠️ Getting Started
Click the link below to access Card Players Unite.
### Prerequisites
[Access Card Players Unite](https://cardplayersunite.online/)
* Docker and Docker Compose installed on your machine.
### Local Development
To launch the project locally and view your ebook in a browser:
1. Run the setup script:
```bash
./compose.bash
[cite_start]``` [cite: 31744]
```
2. Access the site at `http://localhost:8000`.
## PDF Generation
The project uses the `to-pdf` plugin to automatically generate a document titled `lorem-ipsum-101.pdf`. Ensure your assets (like `assets/images/cover.jpg`) are in place to include a cover page in the export.
## 📄 License
This project is licensed under the Apache License, Version 2.0.

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,12 @@
# adsfads
# Card Players United
## pg4 admin
http://localhost:5480/browser/
## documentation site
http://localhost:8000
## view all tourney
@@ -6,6 +14,8 @@
## admin home
http://localhost:8888/
## login
## how to create new user

View File

@@ -1,24 +0,0 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <https://unlicense.org>

View File

@@ -1,19 +0,0 @@
# Movies-Website-Redesign
Movies website Redesign with,
1. Responsive View,
2. Sticky Menu,
3. Awesome Menu,
4. Sticky Side Bar,
5. Hover Transition,
6. Pop-Over Animation,
7. Slider,
8. Day & Night View.
Live Preview: https://mhmiyazi.github.io/Movies-Website/
# Preview:
# Dark Theme:
<img src="img/fullView.png" alt="MH Miyazi's Design Full Preview">
<h1>Light Theme:</h1>
<img src="img/FullPreviewLightTheme.png" alt="MH Miyazi's Design Full Preview">

View File

@@ -1 +0,0 @@
theme: jekyll-theme-cayman

View File

@@ -1,136 +0,0 @@
import re
import sys
fileToUpdate = sys.argv[1]
print(fileToUpdate)
nodeOpenName="22222"
nodeCloseName="44444"
def replaceCSSIncludes():
templateSectionBegin="<styling>"
templateSectionEnd="</styling>"
with open('templates/html-includes-styling.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName, substitutionContent, ddd, flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def replaceJavascriptIncludes():
templateSectionBegin="<!-- body / javascript / begin -->"
templateSectionEnd="<!-- body / javascript / end -->"
with open('templates/body-javascript-includes.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def updateSideBarDesktop():
templateSectionBegin="<sidebar.desktop>"
templateSectionEnd="</sidebar.desktop>"
with open('templates/navigation-sidebar-desktop.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def updateSideBarMobile():
templateSectionBegin="<sidebar.mobile>"
templateSectionEnd="</sidebar.mobile>"
with open('templates/navigation-sidebar-mobile.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
###################################################################
##
## driver
##
###################################################################
##replaceCSSIncludes()
replaceJavascriptIncludes()
##updateSideBarDesktop()
##updateSideBarMobile()

View File

@@ -1,13 +0,0 @@
#!/bin/bash
sourceDirectory="../"
appName="cascadr.py"
##
echo "##"
echo "## start cascadr template work"
echo "##"
find $sourceDirectory -iname "*.html" -exec python3 $appName {} \;

View File

@@ -1,194 +0,0 @@
import re
import sys
fileToUpdate = sys.argv[1]
print(fileToUpdate)
nodeOpenName="22222"
nodeCloseName="44444"
def cascadeStylingIncludes():
templateSectionBegin="<!-- head / css / begin -->"
templateSectionEnd="<!-- head / css / end -->"
with open('templates/head.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def cascadeJavascriptIncludes():
templateSectionBegin="<!-- body / javascript / begin -->"
templateSectionEnd="<!-- body / javascript / end -->"
with open('templates/body-javascript-includes.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def cascadeFooterContent():
templateSectionBegin="<!-- body / footer / begin -->"
templateSectionEnd="<!-- body / footer / end -->"
with open('templates/body-footer-content.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def cascadeTopNavigation():
templateSectionBegin="<!-- Navbar -->"
templateSectionEnd=" <!-- /.navbar -->"
with open('templates/navigation-top-menu.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def cascadeSideNavigation():
templateSectionBegin="<!-- navigation / side / begin -->"
templateSectionEnd="<!-- navigation / side / end -->"
with open('templates/navigation-side-menu.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def cascadeFlyoutContent():
templateSectionBegin="<!-- body / flyout / begin -->"
templateSectionEnd="<!-- body / flyout / end -->"
with open('templates/body-flyout-content.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
###################################################################
##
## driver
##
###################################################################
cascadeStylingIncludes()
##cascadeJavascriptIncludes()
##cascadeFooterContent()
##cascadeTopNavigation()
##cascadeSideNavigation()
##cascadeFlyoutContent()
##updateSideBarDesktop()
##updateSideBarMobile()

View File

@@ -1,278 +0,0 @@
<!-- Desktop sidebar -->
<aside
class="z-20 hidden w-64 overflow-y-auto bg-white dark:bg-gray-800 md:block flex-shrink-0"
>
<div class="py-4 text-gray-500 dark:text-gray-400">
<a
class="ml-6 text-lg font-bold text-gray-800 dark:text-gray-200"
href="#"
>
Windmill
</a>
<ul class="mt-6">
<li class="relative px-6 py-3">
<span
class="absolute inset-y-0 left-0 w-1 bg-purple-600 rounded-tr-lg rounded-br-lg"
aria-hidden="true"
></span>
<a
class="inline-flex items-center w-full text-sm font-semibold text-gray-800 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200 dark:text-gray-100"
href="index.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"
></path>
</svg>
<span class="ml-4">Dashboard</span>
</a>
</li>
</ul>
<ul>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="forms.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01"
></path>
</svg>
<span class="ml-4">Forms</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="cards.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"
></path>
</svg>
<span class="ml-4">Cards</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="charts.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M11 3.055A9.001 9.001 0 1020.945 13H11V3.055z"
></path>
<path d="M20.488 9H15V3.512A9.025 9.025 0 0120.488 9z"></path>
</svg>
<span class="ml-4">Charts</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="buttons.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122"
></path>
</svg>
<span class="ml-4">Buttons</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="modals.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
></path>
</svg>
<span class="ml-4">Modals</span>
</a>
</li>
<nav.pages>
<li class="relative px-6 py-3">
<button
class="inline-flex items-center justify-between w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
@click="togglePagesMenu"
aria-haspopup="true"
>
<span class="inline-flex items-center">
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"
></path>
</svg>
<span class="ml-4">Tournaments</span>
</span>
<svg
class="w-4 h-4"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
clip-rule="evenodd"
></path>
</svg>
</button>
<template x-if="isPagesMenuOpen">
<ul
x-transition:enter="transition-all ease-in-out duration-300"
x-transition:enter-start="opacity-25 max-h-0"
x-transition:enter-end="opacity-100 max-h-xl"
x-transition:leave="transition-all ease-in-out duration-300"
x-transition:leave-start="opacity-100 max-h-xl"
x-transition:leave-end="opacity-0 max-h-0"
class="p-2 mt-2 space-y-2 overflow-hidden text-sm font-medium text-gray-500 rounded-md shadow-inner bg-gray-50 dark:text-gray-400 dark:bg-gray-900"
aria-label="submenu"
>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/login.html">Tournament Dashboard</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/create-account.html">
Tournament Manager
</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/forgot-password.html">
Add New Tournament
</a>
</li>
</ul>
</template>
</li>
</nav.pages>
<nav.tables>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="tables.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M4 6h16M4 10h16M4 14h16M4 18h16"></path>
</svg>
<span class="ml-4">Tables</span>
</a>
</li>
</nav.tables>
</ul>
<div class="px-6 my-6">
<button
class="flex items-center justify-between w-full px-4 py-2 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-lg active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple"
>
Create account
<span class="ml-2" aria-hidden="true">+</span>
</button>
</div>
</div>
</aside>

View File

@@ -1,538 +0,0 @@
<!-- Mobile sidebar -->
<!-- Backdrop -->
<div
x-show="isSideMenuOpen"
x-transition:enter="transition ease-in-out duration-150"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in-out duration-150"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
class="fixed inset-0 z-10 flex items-end bg-black bg-opacity-50 sm:items-center sm:justify-center"
></div>
<aside
class="fixed inset-y-0 z-20 flex-shrink-0 w-64 mt-16 overflow-y-auto bg-white dark:bg-gray-800 md:hidden"
x-show="isSideMenuOpen"
x-transition:enter="transition ease-in-out duration-150"
x-transition:enter-start="opacity-0 transform -translate-x-20"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in-out duration-150"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0 transform -translate-x-20"
@click.away="closeSideMenu"
@keydown.escape="closeSideMenu"
>
<div class="py-4 text-gray-500 dark:text-gray-400">
<a
class="ml-6 text-lg font-bold text-gray-800 dark:text-gray-200"
href="#"
>
Windmill
</a>
<ul class="mt-6">
<li class="relative px-6 py-3">
<span
class="absolute inset-y-0 left-0 w-1 bg-purple-600 rounded-tr-lg rounded-br-lg"
aria-hidden="true"
></span>
<a
class="inline-flex items-center w-full text-sm font-semibold text-gray-800 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200 dark:text-gray-100"
href="index.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"
></path>
</svg>
<span class="ml-4">Dashboard</span>
</a>
</li>
</ul>
<ul>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="forms.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01"
></path>
</svg>
<span class="ml-4">Forms</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="cards.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"
></path>
</svg>
<span class="ml-4">Cards</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="charts.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M11 3.055A9.001 9.001 0 1020.945 13H11V3.055z"
></path>
<path d="M20.488 9H15V3.512A9.025 9.025 0 0120.488 9z"></path>
</svg>
<span class="ml-4">Charts</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="buttons.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122"
></path>
</svg>
<span class="ml-4">Buttons</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="modals.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
></path>
</svg>
<span class="ml-4">Modals</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="tables.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M4 6h16M4 10h16M4 14h16M4 18h16"></path>
</svg>
<span class="ml-4">Tables</span>
</a>
</li>
<li class="relative px-6 py-3">
<button
class="inline-flex items-center justify-between w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
@click="togglePagesMenu"
aria-haspopup="true"
>
<span class="inline-flex items-center">
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"
></path>
</svg>
<span class="ml-4">Pages</span>
</span>
<svg
class="w-4 h-4"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
clip-rule="evenodd"
></path>
</svg>
</button>
<template x-if="isPagesMenuOpen">
<ul
x-transition:enter="transition-all ease-in-out duration-300"
x-transition:enter-start="opacity-25 max-h-0"
x-transition:enter-end="opacity-100 max-h-xl"
x-transition:leave="transition-all ease-in-out duration-300"
x-transition:leave-start="opacity-100 max-h-xl"
x-transition:leave-end="opacity-0 max-h-0"
class="p-2 mt-2 space-y-2 overflow-hidden text-sm font-medium text-gray-500 rounded-md shadow-inner bg-gray-50 dark:text-gray-400 dark:bg-gray-900"
aria-label="submenu"
>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/login.html">Login</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/create-account.html">
Create account
</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/forgot-password.html">
Forgot password
</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/404.html">404</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/blank.html">Blank</a>
</li>
</ul>
</template>
</li>
</ul>
<div class="px-6 my-6">
<button
class="flex items-center justify-between px-4 py-2 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-lg active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple"
>
Create account
<span class="ml-2" aria-hidden="true">+</span>
</button>
</div>
</div>
</aside>
<div class="flex flex-col flex-1 w-full">
<header class="z-10 py-4 bg-white shadow-md dark:bg-gray-800">
<div
class="container flex items-center justify-between h-full px-6 mx-auto text-purple-600 dark:text-purple-300"
>
<!-- Mobile hamburger -->
<button
class="p-1 mr-5 -ml-1 rounded-md md:hidden focus:outline-none focus:shadow-outline-purple"
@click="toggleSideMenu"
aria-label="Menu"
>
<svg
class="w-6 h-6"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
clip-rule="evenodd"
></path>
</svg>
</button>
<!-- Search input -->
<div class="flex justify-center flex-1 lg:mr-32">
<div
class="relative w-full max-w-xl mr-6 focus-within:text-purple-500"
>
<div class="absolute inset-y-0 flex items-center pl-2">
<svg
class="w-4 h-4"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
clip-rule="evenodd"
></path>
</svg>
</div>
<input
class="w-full pl-8 pr-2 text-sm text-gray-700 placeholder-gray-600 bg-gray-100 border-0 rounded-md dark:placeholder-gray-500 dark:focus:shadow-outline-gray dark:focus:placeholder-gray-600 dark:bg-gray-700 dark:text-gray-200 focus:placeholder-gray-500 focus:bg-white focus:border-purple-300 focus:outline-none focus:shadow-outline-purple form-input"
type="text"
placeholder="Search for projects"
aria-label="Search"
/>
</div>
</div>
<ul class="flex items-center flex-shrink-0 space-x-6">
<!-- Theme toggler -->
<li class="flex">
<button
class="rounded-md focus:outline-none focus:shadow-outline-purple"
@click="toggleTheme"
aria-label="Toggle color mode"
>
<template x-if="!dark">
<svg
class="w-5 h-5"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"
></path>
</svg>
</template>
<template x-if="dark">
<svg
class="w-5 h-5"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"
clip-rule="evenodd"
></path>
</svg>
</template>
</button>
</li>
<!-- Notifications menu -->
<li class="relative">
<button
class="relative align-middle rounded-md focus:outline-none focus:shadow-outline-purple"
@click="toggleNotificationsMenu"
@keydown.escape="closeNotificationsMenu"
aria-label="Notifications"
aria-haspopup="true"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
d="M10 2a6 6 0 00-6 6v3.586l-.707.707A1 1 0 004 14h12a1 1 0 00.707-1.707L16 11.586V8a6 6 0 00-6-6zM10 18a3 3 0 01-3-3h6a3 3 0 01-3 3z"
></path>
</svg>
<!-- Notification badge -->
<span
aria-hidden="true"
class="absolute top-0 right-0 inline-block w-3 h-3 transform translate-x-1 -translate-y-1 bg-red-600 border-2 border-white rounded-full dark:border-gray-800"
></span>
</button>
<template x-if="isNotificationsMenuOpen">
<ul
x-transition:leave="transition ease-in duration-150"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.away="closeNotificationsMenu"
@keydown.escape="closeNotificationsMenu"
class="absolute right-0 w-56 p-2 mt-2 space-y-2 text-gray-600 bg-white border border-gray-100 rounded-md shadow-md dark:text-gray-300 dark:border-gray-700 dark:bg-gray-700"
>
<li class="flex">
<a
class="inline-flex items-center justify-between w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<span>Messages</span>
<span
class="inline-flex items-center justify-center px-2 py-1 text-xs font-bold leading-none text-red-600 bg-red-100 rounded-full dark:text-red-100 dark:bg-red-600"
>
13
</span>
</a>
</li>
<li class="flex">
<a
class="inline-flex items-center justify-between w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<span>Sales</span>
<span
class="inline-flex items-center justify-center px-2 py-1 text-xs font-bold leading-none text-red-600 bg-red-100 rounded-full dark:text-red-100 dark:bg-red-600"
>
2
</span>
</a>
</li>
<li class="flex">
<a
class="inline-flex items-center justify-between w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<span>Alerts</span>
</a>
</li>
</ul>
</template>
</li>
<!-- Profile menu -->
<li class="relative">
<button
class="align-middle rounded-full focus:shadow-outline-purple focus:outline-none"
@click="toggleProfileMenu"
@keydown.escape="closeProfileMenu"
aria-label="Account"
aria-haspopup="true"
>
<img
class="object-cover w-8 h-8 rounded-full"
src="https://images.unsplash.com/photo-1502378735452-bc7d86632805?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=aa3a807e1bbdfd4364d1f449eaa96d82"
alt=""
aria-hidden="true"
/>
</button>
<template x-if="isProfileMenuOpen">
<ul
x-transition:leave="transition ease-in duration-150"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.away="closeProfileMenu"
@keydown.escape="closeProfileMenu"
class="absolute right-0 w-56 p-2 mt-2 space-y-2 text-gray-600 bg-white border border-gray-100 rounded-md shadow-md dark:border-gray-700 dark:text-gray-300 dark:bg-gray-700"
aria-label="submenu"
>
<li class="flex">
<a
class="inline-flex items-center w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<svg
class="w-4 h-4 mr-3"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
></path>
</svg>
<span>Profile</span>
</a>
</li>
<li class="flex">
<a
class="inline-flex items-center w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<svg
class="w-4 h-4 mr-3"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
></path>
<path d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
</svg>
<span>Settings</span>
</a>
</li>
<li class="flex">
<a
class="inline-flex items-center w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<svg
class="w-4 h-4 mr-3"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h7a3 3 0 013 3v1"
></path>
</svg>
<span>Log out</span>
</a>
</li>
</ul>
</template>
</li>
</ul>
</div>
</header>

View File

@@ -1,16 +0,0 @@
<aside class="control-sidebar control-sidebar-dark">
<h4>Current Project</h4>
<div id="projectBannerArea" class="btn-group-vertical col-12">
<button id="projectBanner" disabled type="button" class="btn btn-lg btn-success">--</button>
</div>
<h4>Select Project</h4>
<div id="projectSwitcherArea" class="btn-group-vertical col-12"></div>
</aside>

View File

@@ -1,15 +0,0 @@
<footer class="main-footer">
<div class="float-right d-none d-sm-block">
</div>
<strong>
Made with ❤ by the
<a href="https://softwareshinobi.digital" target="softwareshinobi">Software Shinobi</a>.
</strong>
</footer>

View File

@@ -1,17 +0,0 @@
<!-- custom stuff -->
<script src="/scripting/config.js"></script>
<script src="/plugins/jquery/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/js-cookie@3.0.5/dist/js.cookie.min.js "></script>
<script src="/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script>
<script src="/dist/js/adminlte.js"></script>
<script src="https://cdn.jsdelivr.net/npm/toastr@2.1.4/toastr.min.js "></script>
<script src="/project/scripting/flyout.js"></script>

View File

@@ -1,6 +0,0 @@
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="./assets/css/tailwind.output.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.css" />

View File

@@ -1,188 +0,0 @@
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-darkrrr-primary elevation-4">
<!-- Brand Logo -->
<a href="/index.html" class="brand-link">
<img src="https://github.com/softwareshinobi/assets.softwareshinobi.digital/blob/production/imagery/valorantdigital/valorant.png?raw=true" alt="" class="brand-image img-circle elevation-3" style="opacity: .8">
<span class="brand-text font-weight-light">
Workspace
</span>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<img src="https://avatars.githubusercontent.com/u/45909594?v=4" class="img-circle elevation-2" alt="Software Shinobi">
</div>
<div class="info">
<a href="#" class="d-block">
software shinobi
</a>
</div>
</div>
<!-- SidebarSearch Form -->
<div styles="visibility:hidden" class="form-inline">
<div class="input-group" data-widget="sidebar-search">
<input class="form-control form-control-sidebar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-sidebar">
<i class="fas fa-search fa-fw"></i>
</button>
</div>
</div>
</div>
<!-- Sidebar Menu -->
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
<!-- Add icons to the links using the .nav-icon class
with font-awesome or any other icon font library -->
<li class="nav-header">Productivity</li>
<!--home links -->
<li class="nav-item">
<a class="nav-link">
<i class="nav-icon fas fa-table"></i>
<p>
home
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="/home/links.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>link portal</p>
</a>
</li>
</ul>
</li>
<!--productivity links -->
<li class="nav-item menu-open">
<a class="nav-link">
<i class="nav-icon fas fa-columns"></i>
<p>
projects
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="/project/list.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>project list</p>
</a>
</li>
<li class="nav-item">
<a href="/project/kanban.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>kanban board</p>
</a>
</li>
<li class="nav-item">
<a href="/project/calendar.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>calendar</p>
</a>
</li>
<li class="nav-item">
<a href="/project/create.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>create project</p>
</a>
</li>
<li class="nav-item">
<a href="/story/create.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>create story</p>
</a>
</li>
</ul>
</li>
<!--dev links -->
<li class="nav-item">
<a class="nav-link">
<i class="nav-icon fas fa-table"></i>
<p>
.development
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="/story/list.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>all stories</p>
</a>
</li>
</ul>
</li>
</ul>
</nav>
<!-- /.sidebar-menu -->
</div>
<!-- /.sidebar -->
</aside>

View File

@@ -1,68 +0,0 @@
<nav class="main-header navbar navbar-expand navbar-fpink navbar-daddrk">
<!-- Left navbar links -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/home/links.html" class="nav-link">Home</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/project/list.html" class="nav-link">Projects</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/project/kanban.html" class="nav-link">Kanban</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/project/calendar.html" class="nav-link">Calendar</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/project/create.html" class="nav-link">Create Project</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/story/create.html" class="nav-link">Create Story</a>
</li>
</ul>
<!-- Right navbar links -->
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" data-widget="fullscreen" href="#" role="button">
<i class="fas fa-expand-arrows-alt"></i>
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-widget="control-sidebar" data-slide="true" href="#" role="button">
<i class="fas fa-th-large"></i>
</a>
</li>
</ul>
</nav>

View File

@@ -1,4 +0,0 @@
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">

View File

@@ -1,40 +0,0 @@
<nav class="navbar navbar-expand-lg bg-primary" data-bs-theme="dark">
<div class="container-fluid">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarColor01" aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarColor01">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link active" href="#">Home
<span class="visually-hidden">(current)</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Features</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Pricing</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">About</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Separated link</a>
</div>
</li>
</ul>
<form class="d-flex">
<input class="form-control me-sm-2" type="search" placeholder="Search">
<button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</div>
</nav>

View File

@@ -1,85 +0,0 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Home / Card Players Unite Admin
</title>
<!-- head / css / begin -->
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
<!-- head / css / end -->
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/tournament/">
<button type="button" class="btn btn-primary">
Manage Tournaments
</button>
</a>
<a href="/player/login/">
<button type="button" class="btn btn-secondary">
Sign In
</button>
</a>
</div>
<h1> Card Players Unite Admin > Home </h1>
<div>
<img src="{% static 'img/bike-shop-concept-with-bicycles.jpg' %}" height=480 width=640>
</div>
<p>
Welcome to Robert's Bike Rental. We have bikes of all sizes and accessories for you and your loved ones. Explore the local neighborhood in style & comfort on our bikes.
</p>
<div>
<a href="/about-roberts-rentals">
<button type="button" class="btn btn-primary">
About
</button>
</a>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
</div>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>
</body>
</html>

View File

@@ -1,177 +0,0 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Manage Tournaments / Card Players Unite Admin
</title>
<!-- head / css / begin -->
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
<!-- head / css / end -->
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/about-roberts-rentals">
<button type="button" class="btn btn-primary">
About
</button>
</a>
<a href="/bike-accessories">
<button type="button" class="btn btn-primary">
Bike Accessories
</button>
</a>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
<a href="/accounts/login/">
<button type="button" class="btn btn-secondary">
Log In
</button>
</a>
</div>
<h1>
Robert's Bike Rentals > Manage Rental Bikes <i>[admin]</i>
</h1>
<div>
<img src="{% static 'img/close-up-bicycle-gears.jpg' %}" height=480 width=640>
</div>
<p>
Use this page to view our fleet of rental bikes. You can use this page to return bikes that have been rented by customers.
</p>
<div>
<table class="center">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Rental Price</th>
<th>Rental User ID</th>
<th>Actions</th>
</tr>
</thead>
<tbody >
{% if status_message %}
<h4>
{{ status_message }}
</h4>
{% endif %}
{% if latest_question_list %}
{% for question in latest_question_list %}
<tr>
<td class=""> {{ question.name }} </td>
<td class=""> {{ question.description }} </td>
<td class=""> &euro; {{ question.rental_price }} </td>
<td class=""> {{ question.rented_user_id }} </td>
{% if question.rented_user_id != 0 %}
<td class="">
<a href="/bike/return/{{question.id}}/{{user.pk}}">
<button type="button" class="btn btn-primary">
Return bike: {{ question.name }}
</button>
</a>
</td>
{% else %}
<td class="">
<button type="button" class="btn btn-dark">
Not currently rented by a customer.
</button>
</td>
{% endif %}
</tr>
{% endfor %}
</ul>
{% else %}
<h2>No bikes are available.</h2>
{% endif %}
</tbody>
</table>
</div>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>
</body>
</html>

View File

@@ -0,0 +1,213 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
(shinobi test) Card Players Unite / card tournaments and events near you
</title>
<link rel="stylesheet" href="{% static '/listing/listing.css' %}">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/listing/listing.css">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&family=Sen:wght@400;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css">
</head>
<body>
<div class="navbar">
<div class="navbar-container">
<div class="logo-container">
<h1 class="logo">
Card Players Unite
</h1>
</div>
<div class="menu-container">
<ul class="menu-list">
<li class="menu-list-item active">Home</li>
<li class="menu-list-item">Tournaments</li>
<li class="menu-list-item">Teams</li>
<li class="menu-list-item">Login</li>
</ul>
</div>
<div class="profile-container">
<div class="toggle">
<i class="fas fa-moon toggle-icon"></i>
<i class="fas fa-sun toggle-icon"></i>
<div class="toggle-ball"></div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<i class="left-menu-icon fas fa-home"></i>
<i class="left-menu-icon fas fa-users"></i>
<i class="left-menu-icon fas fa-bookmark"></i>
<i class="left-menu-icon fas fa-tv"></i>
</div>
<div class="container">
<div class="content-container">
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/18.jpg' %}');">
<p class="featured-desc">
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis minima voluptatibus incidunt. Accusamus, provident.
</p>
<button class="featured-button">
LEARN MORE
</button>
</div>
<div class="movie-list-container">
<h1 class="movie-list-title">Alll Tournaments</h1>
<div class="movie-list-wrapper">
<div class="movie-list">
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/8.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/9.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/10.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/11.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/12.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/1.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/1.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
</div>
<i class="fas fa-chevron-right arrow"></i>
</div>
</div>
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/7.jpg' %}');">
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">111WATCH</button>
</div>
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/6.jpg' %}');">
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">WATCH</button>
</div>
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/8.jpg' %}');">
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">WATCH</button>
</div>
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/9.jpg' %}');">
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">WATCH</button>
</div>
</div>
</div>
<!--
<script src="{% static 'listing/listing.js' %}"></script>
<script src="{% static 'listing/features.js' %}"></script>
-->
</body>
</html>

View File

@@ -1,213 +1,240 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
(shinobi test) Card Players Unite / card tournaments and events near you
</title>
<link rel="stylesheet" href="{% static '/listing/listing.css' %}">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Card Players Unite | The Lounge</title>
<link href="https://fonts.googleapis.com/css2?family=Sen:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<style>
:root {
--aria-gold: #4dbf00; /* Matching your theme brand color [cite: 113] */
--aria-dark: #151515; /* [cite: 121] */
--aria-surface: #1f1f1f;
}
<link rel="stylesheet" href="/listing/listing.css">
body {
font-family: 'Sen', sans-serif;
background-color: var(--aria-dark);
color: white;
margin: 0;
padding: 40px;
}
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&family=Sen:wght@400;700;800&display=swap" rel="stylesheet">
.header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 2px solid var(--aria-gold);
padding-bottom: 20px;
margin-bottom: 40px;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css">
.btn-gold {
background-color: var(--aria-gold);
color: white;
border: none;
padding: 12px 24px;
border-radius: 8px;
font-weight: bold;
cursor: pointer;
transition: transform 0.2s;
}
.btn-gold:hover {
transform: scale(1.05);
background-color: #3e9a00;
}
/* Tournament Table Styling */
.tournament-grid {
width: 100%;
border-collapse: collapse;
background: var(--aria-surface);
border-radius: 12px;
overflow: hidden;
}
th, td {
padding: 18px;
text-align: left;
border-bottom: 1px solid #333;
}
th {
background-color: #2a2a2a;
color: var(--aria-gold);
text-transform: uppercase;
font-size: 0.8rem;
}
/* Modal / Popup Box */
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.8);
justify-content: center;
align-items: center;
}
.modal-content {
background: var(--aria-surface);
padding: 40px;
border-radius: 15px;
width: 400px;
border: 1px solid var(--aria-gold);
}
.form-group { margin-bottom: 20px; }
input, textarea {
width: 100%;
padding: 10px;
background: #111;
border: 1px solid #444;
color: white;
border-radius: 5px;
}
</style>
</head>
<body>
<div class="navbar">
<div class="navbar-container">
<div class="logo-container">
<h1 class="logo">
Card Players Unite
</h1>
</div>
<div class="menu-container">
<ul class="menu-list">
<li class="menu-list-item active">Home</li>
<li class="menu-list-item">Tournaments</li>
<li class="menu-list-item">Teams</li>
<li class="menu-list-item">Login</li>
</ul>
</div>
<div class="profile-container">
<div class="toggle">
<i class="fas fa-moon toggle-icon"></i>
<i class="fas fa-sun toggle-icon"></i>
<div class="toggle-ball"></div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<i class="left-menu-icon fas fa-home"></i>
<i class="left-menu-icon fas fa-users"></i>
<i class="left-menu-icon fas fa-bookmark"></i>
<i class="left-menu-icon fas fa-tv"></i>
</div>
<div class="container">
<div class="content-container">
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/18.jpg' %}');">
<p class="featured-desc">
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis minima voluptatibus incidunt. Accusamus, provident.
</p>
<button class="featured-button">
LEARN MORE
<div class="header">
<h1>Card Players Unite <small style="font-size: 0.5em; color: gray;">Tournament Management</small></h1>
<button class="btn-gold" onclick="toggleModal(true)">
<i class="fas fa-plus"></i> NEW TOURNAMENT
</button>
</div>
<table class="tournament-grid">
<thead>
<tr>
<th>Tournament Name</th>
<th>Description</th>
<th>Buy-in (Price)</th>
<th>Status</th>
</tr>
</thead>
<tbody id="tournament-list">
</tbody>
</table>
<div class="movie-list-container">
<h1 class="movie-list-title">Alll Tournaments</h1>
<div class="movie-list-wrapper">
<div class="movie-list">
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/8.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
<div id="createModal" class="modal">
<div class="modal-content">
<h2 style="color: var(--aria-gold);">Host a New Table</h2>
<form id="tournamentForm">
<div class="form-group">
<label>Name</label>
<input type="text" id="name" required placeholder="High Roller Hold'em">
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/9.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
<div class="form-group">
<label>Description</label>
<textarea id="description" rows="3" placeholder="No-limit stakes..."></textarea>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/10.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
<div class="form-group">
<label>Price</label>
<input type="number" id="rental_price" step="0.01" value="999.99">
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/11.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
<input type="hidden" id="rented_user_id" value="0">
<div style="display: flex; gap: 10px;">
<button type="submit" class="btn-gold">START EVENT</button>
<button type="button" class="btn-gold" style="background:#444;" onclick="toggleModal(false)">CLOSE</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/12.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/1.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/1.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
</div>
<i class="fas fa-chevron-right arrow"></i>
</form>
</div>
</div>
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/7.jpg' %}');">
<script>
// Toggle the popup
function toggleModal(show) {
document.getElementById('createModal').style.display = show ? 'flex' : 'none';
}
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">111WATCH</button>
</div>
// Fetch and List Tournaments
async function fetchTournaments() {
const response = await fetch('/tournament/');
const data = await response.json();
const list = document.getElementById('tournament-list');
list.innerHTML = '';
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/6.jpg' %}');">
data.forEach(t => {
const row = `<tr>
<td><strong>${t.name}</strong></td>
<td>${t.description}</td>
<td>$${t.rental_price}</td>
<td>${t.rented_user_id === 0 ? 'AVAILABLE' : 'BOOKED'}</td>
</tr>`;
list.innerHTML += row;
});
}
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">WATCH</button>
</div>
// Create Tournament [cite: 150, 155]
document.getElementById('tournamentForm').addEventListener('submit', async (e) => {
e.preventDefault();
const payload = {
name: document.getElementById('name').value,
description: document.getElementById('description').value,
rental_price: parseFloat(document.getElementById('rental_price').value),
rented_user_id: parseInt(document.getElementById('rented_user_id').value)
};
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/8.jpg' %}');">
const response = await fetch('/tournament/create/', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-CSRFToken': '{{ csrf_token }}' },
body: JSON.stringify(payload)
});
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">WATCH</button>
</div>
if (response.ok) {
toggleModal(false);
fetchTournaments();
document.getElementById('tournamentForm').reset();
} else {
alert("The house always wins... but this time, your form failed.");
}
});
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/9.jpg' %}');">
// This function captures the form data and sends it to the house (the database)
async function saveTournament() {
// 1. Gather the intel from the form fields
const tournamentData = {
name: document.getElementById('name').value,
description: document.getElementById('description').value,
rental_price: parseFloat(document.getElementById('rental_price').value),
rented_user_id: 0 // Defaulting to 0 for available tables
};
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">WATCH</button>
</div>
</div>
// 2. Place the bet (The POST request)
const response = await fetch('/tournament/create/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
// Ensure you handle CSRF if this is rendered via Django [cite: 95]
},
body: JSON.stringify(tournamentData)
});
</div>
if (response.ok) {
console.log("Record saved to the vault.");
// Refresh the list to show the new table
fetchTournaments();
} else {
console.error("The house declined the transaction.");
}
}
<!--
<script src="{% static 'listing/listing.js' %}"></script>
// This listener waits for the user to hit 'START EVENT'
document.getElementById('tournamentForm').addEventListener('submit', async (e) => {
e.preventDefault(); // Keep the lounge smooth—no page reloads
await saveTournament(); // This is the moment the record hits the database
});
<script src="{% static 'listing/features.js' %}"></script>
-->
// Initialize the floor
fetchTournaments();
</script>
</body>
</html>

112
templates/tournament.html Normal file
View File

@@ -0,0 +1,112 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Manage Rental Bikes | Robert's Bike Rentals</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootswatch@5.3.2/dist/lux/bootstrap.min.css">
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
</head>
<body class="bg-light">
<nav class="navbar navbar-expand-lg navbar-dark bg-primary mb-4">
<div class="container">
<a class="navbar-brand" href="/home">Robert's Rentals</a>
<div class="d-flex border-start ps-3">
<a href="/home" class="btn btn-outline-light btn-sm me-2">Home</a>
<a href="/about-roberts-rentals" class="btn btn-outline-light btn-sm me-2">About</a>
<a href="/bike-accessories" class="btn btn-outline-light btn-sm me-2">Accessories</a>
<a href="/bike/" class="btn btn-outline-light btn-sm me-2">Reserve</a>
<a href="/accounts/login/" class="btn btn-secondary btn-sm">Log In</a>
</div>
</div>
</nav>
<div class="container">
<header class="pb-3 mb-4 border-bottom">
<h1 class="display-5 fw-bold text-dark">Manage Rental Bikes <small class="text-muted fs-6">[admin]</small></h1>
</header>
<div class="row align-items-md-stretch">
<div class="col-md-5">
<div class="card border-0 shadow-sm mb-4">
<img src="{% static 'img/close-up-bicycle-gears.jpg' %}" class="card-img-top img-fluid rounded" alt="Bicycle Gears">
</div>
</div>
<div class="col-md-7">
<div class="h-100 p-5 bg-white border rounded-3 shadow-sm">
<h2>Fleet Overview</h2>
<p>Use this administrative dashboard to monitor the status of our rental fleet. You can process returns for bikes currently checked out by customers.</p>
{% if status_message %}
<div class="alert alert-info">{{ status_message }}</div>
{% endif %}
</div>
</div>
</div>
<div class="card shadow-sm mt-4">
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-dark">
<tr>
<th class="ps-4">Name</th>
<th>Description</th>
<th>Rental Price</th>
<th>Renter ID</th>
<th class="text-center">Actions</th>
</tr>
</thead>
<tbody>
{% if latest_question_list %}
{% for question in latest_question_list %}
<tr class="align-middle">
<td class="fw-bold ps-4">{{ question.name }}</td>
<td>{{ question.description }}</td>
<td><span class="badge bg-success">&euro; {{ question.rental_price }}</span></td>
<td>
{% if question.rented_user_id != 0 %}
<span class="text-primary fw-bold">{{ question.rented_user_id }}</span>
{% else %}
<span class="text-muted small">Available</span>
{% endif %}
</td>
<td class="text-center">
{% if question.rented_user_id != 0 %}
<a href="/bike/return/{{question.id}}/{{user.pk}}" class="btn btn-primary btn-sm px-3">
Return Bike
</a>
{% else %}
<button type="button" class="btn btn-outline-secondary btn-sm disabled" disabled>
In Stock
</button>
{% endif %}
</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="5" class="text-center py-5 text-muted">
<h3>No bikes are available.</h3>
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>
</div>
<footer class="pt-5 my-5 text-muted border-top text-center">
Robert's Bike Rental created by <a href="https://github.com/gomsur" class="text-decoration-none">Robert</a>.
<br>
<small>Image by <a href="https://www.freepik.com" class="text-decoration-none">jcomp</a> on Freepik.</small>
</footer>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.2 on 2026-02-19 03:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tournament', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='tournament',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.28 on 2026-02-18 21:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tournament', '0002_alter_tournament_id'),
]
operations = [
migrations.AlterField(
model_name='tournament',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]