Changing CSS framework from Bootstrap to Tailwindcss

demo-mode
Wes Holland 1 year ago
parent 9124e66e28
commit d3364af395

4
.gitignore vendored

@ -1,5 +1,9 @@
/target /target
/resources
/.env /.env
/*.db /*.db
/*.db-shm /*.db-shm
/*.db-wal /*.db-wal
/node_modules
/*.lockb

@ -13,5 +13,8 @@
</option> </option>
<option name="myCustomValuesEnabled" value="true" /> <option name="myCustomValuesEnabled" value="true" />
</inspection_tool> </inspection_tool>
<inspection_tool class="RsUnusedImport" enabled="true" level="WARNING" enabled_by_default="true">
<option name="enableOnlyIfProcMacrosEnabled" value="false" />
</inspection_tool>
</profile> </profile>
</component> </component>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<file url="file://$PROJECT_DIR$" libraries="{alpinejs}" />
</component>
</project>

@ -0,0 +1,3 @@
{
"plugins": ["prettier-plugin-tailwindcss"]
}

@ -0,0 +1,21 @@
# inventory-app
## Prerequisites
1. Rust & Cargo
1. [bun.sh](https://bun.sh/)
## Setup
To install dependencies:
```bash
bun install
```
To run:
```bash
bun run index.ts
```

@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

@ -0,0 +1,42 @@
use std::process::Command;
fn main() {
println!("cargo:rerun-if-changed=templates");
println!("cargo:rerun-if-changed=assets");
println!("cargo:rerun-if-changed=tailwind.config.js");
std::fs::remove_dir_all("resources").unwrap_or_default();
Command::new("bun")
.args([
"run",
"tailwindcss",
"-c",
"tailwind.config.js",
"-i",
"assets/public/css/tailwind.css",
"-o",
"resources/main.css",
"--minify",
])
.status()
.expect("failed to run tailwindcss");
copy_files("assets/static");
}
fn copy_files(dir: &str) {
for entry in std::fs::read_dir(dir).expect("failed to read dir `public`") {
let entry = entry.expect("failed to read entry");
if entry.file_type().unwrap().is_dir() {
copy_files(entry.path().to_str().unwrap());
} else {
let path = entry.path();
let filename = path.file_name().unwrap().to_str().unwrap();
let dest = format!("resources/{}", filename);
std::fs::copy(path, dest).expect("failed to copy file");
}
}
}

@ -0,0 +1,11 @@
{
"name": "inventory-app",
"dependencies": {},
"devDependencies": {
"@types/bun": "latest",
"prettier": "^3.4.2",
"prettier-plugin-tailwindcss": "^0.6.11",
"tailwindcss": "^3.4.17"
},
"type": "module"
}

@ -4,8 +4,7 @@ use crate::app::routes::AppState;
pub fn routes() -> Router<AppState> { pub fn routes() -> Router<AppState> {
Router::new() Router::new()
.nest_service("/css/pico.min.css", ServeFile::new("static/css/pico.min.css")) .nest_service("/css/main.css", ServeFile::new("resources/main.css"))
.nest_service("/css/custom.css", ServeFile::new("static/css/custom.css")) .nest_service("/js/htmx.min.js", ServeFile::new("resources/htmx.min.js"))
.nest_service("/js/htmx.min.js", ServeFile::new("static/js/htmx.min.js"))
.nest_service("/favicon.ico", ServeFile::new("static/favicon.ico")) .nest_service("/favicon.ico", ServeFile::new("static/favicon.ico"))
} }

File diff suppressed because one or more lines are too long

@ -0,0 +1,19 @@
export const content = ["./templates/**/*.html"]
export const theme = {
fontFamily: {
sans: ['Graphik', 'sans-serif'],
serif: ['Merriweather', 'serif'],
},
extend: {
colors: {
'space-cadet':'#1f2041ff',
'english-violet':'#4b3f72ff',
'sunglow':'#ffc857ff',
'dark-cyan':'#119da4ff',
'paynes-gray':'#19647eff',
'cerise': '#da4167ff',
'orchid-pink': '#f0bcd4ff'
}
},
plugins: [],
}

@ -4,19 +4,28 @@
{% block content %} {% block content %}
<div class="container"> <div class="mx-auto px-4 mb-4">
<p class="container d-flex justify-content-center"> <label for="item-filter" class="mb-2 text-sm font-medium text-gray-900 sr-only dark:text-white">Search</label>
<input id="search" class="form-control" <div class="relative content-center mb-4 max-w-56">
<div class="absolute inset-y-0 start-0 flex items-center ps-3 pointer-events-none">
<svg class="w-4 h-4 text-gray-500 dark:text-gray-400" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"
fill="none" viewBox="0 0 20 20">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"/>
</svg>
</div>
<input id="item-filter"
class="block w-full p-4 ps-10 text-sm bg-slate-100 text-neutral-900 dark:bg-neutral-900 dark:text-slate-100 border border-gray-300 rounded-lg focus:ring-paynes-gray focus:border-paynes-gray"
type="search" name="q" type="search" name="q"
placeholder="Filter" placeholder="Filter"
aria-label="Search" aria-label="Filter"
value='{{ query.search.as_deref().unwrap_or("") }}' value='{{ query.search.as_deref().unwrap_or("") }}'
hx-get="/items" hx-get="/items"
hx-trigger="search, keyup delay:500ms changed" hx-trigger="search, keyup delay:500ms changed"
hx-target="#items" hx-target="#items"
hx-push-url="true" hx-push-url="true"
/> />
</p> </div>
<div id="items" class="container"> <div id="items" class="container">
{% include "catalog_item_fragment.html" %} {% include "catalog_item_fragment.html" %}

@ -1,11 +1,14 @@
<div class="card"> <div class="mx-auto ">
<ul class="list-group list-group-flush"> <div class="flex flex-col">
{% for item in items %} {% for item in items %}
<li id="item-{{item.id}}-entry" class="list-group-item"> <div class="mb-4 mx-1 flex flex-row">
<div class="row"> <div class="basis-1/2">
<div class="col-6"><a href="/item/{{item.id}}/" hx-push-url="true">{{ item.name }}</a></div> <a class="font-medium text-paynes-gray dark:text-paynes-gray hover:underline"
href="/item/{{item.id}}/" hx-push-url="true">
{{ item.name }}
</a>
</div>
</div> </div>
</li>
{% endfor %} {% endfor %}
</ul> </div>
</div> </div>

@ -4,10 +4,18 @@
{% block content %} {% block content %}
<div class="container"> <div class="mx-auto px-4 mb-4">
<p class="container d-flex justify-content-center"> <label for="default-search" class="mb-2 text-sm font-medium text-gray-900 sr-only dark:text-white">Search</label>
<input id="search" <div class="relative content-center mb-4 max-w-56">
class="form-control" <div class="absolute inset-y-0 start-0 flex items-center ps-3 pointer-events-none">
<svg class="w-4 h-4 text-gray-500 dark:text-gray-400" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"
fill="none" viewBox="0 0 20 20">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"/>
</svg>
</div>
<input id="default-search"
class="block w-full p-4 ps-10 text-sm bg-slate-100 text-neutral-900 dark:bg-neutral-900 dark:text-slate-100 border border-gray-300 rounded-lg focus:ring-paynes-gray focus:border-paynes-gray"
type="search" name="q" type="search" name="q"
placeholder="Search" placeholder="Search"
aria-label="Search" aria-label="Search"
@ -17,7 +25,7 @@
hx-target="#items" hx-target="#items"
hx-push-url="true" hx-push-url="true"
/> />
</p> </div>
<div id="items" class="container"> <div id="items" class="container">
{% include "home_search_item_fragment.html" %} {% include "home_search_item_fragment.html" %}

@ -1,16 +1,22 @@
{% if items.len() > 0 %} {% if items.len() > 0 %}
<div class="card"> <div class="mx-auto ">
<ul class="list-group list-group-flush"> <div class="flex flex-col">
{% for item in items %} {% for item in items %}
<li id="item-{{item.id}}-entry" class="list-group-item"> <div class="mb-4 mx-1 flex flex-row">
<div class="row"> <div class="basis-1/2">
<div class="col-6"><a href="/item/{{item.id}}/" hx-push-url="true">{{ item.name }}</a></div> <a class="font-medium text-paynes-gray dark:text-paynes-gray hover:underline"
<div class="col">Count: <span id="item-{{item.id}}-count" hx-get="/item/{{item.id}}/count" hx-trigger="load">0</span></div> href="/item/{{item.id}}/" hx-push-url="true">
<div class="col">Reorder Point: {{ item.reorder_point }}</div> {{ item.name }}
</a>
</div>
<div class="basis-1/4">
Count: <span id="item-{{item.id}}-count" hx-get="/item/{{item.id}}/count" hx-trigger="load">0</span>
</div>
<div class="basis-1/4">
Reorder Point: {{ item.reorder_point }}
</div>
</div> </div>
</li>
{% endfor %} {% endfor %}
</ul> </div>
</div> </div>
{% endif %} {% endif %}

@ -1,24 +1,24 @@
<table class="table" hx-get="/item/{{item_id}}/adjustments" hx-trigger="new-adjustment from:body" hx-swap="outerHTML"> <table class="w-full text-sm text-left rtl:text-right" hx-get="/item/{{item_id}}/adjustments" hx-trigger="new-adjustment from:body" hx-swap="outerHTML">
<thead> <thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
<tr> <tr>
<th scope="col">Date</th> <th class="px-6 py-3" scope="col">Date</th>
<th scope="col">Amount</th> <th class="px-6 py-3" scope="col">Amount</th>
<th scope="col">Reason</th> <th class="px-6 py-3" scope="col">Reason</th>
<th scope="col">Unit Value</th> <th class="px-6 py-3" scope="col">Unit Value</th>
<th scope="col">Running Total</th> <th class="px-6 py-3" scope="col">Running Total</th>
<th scope="col">Running Value</th> <th class="px-6 py-3" scope="col">Running Value</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for item in adjustments %} {% for item in adjustments %}
<tr> <tr>
<td>{{ item.date }}</td> <td class="px-6 py-4">{{ item.date }}</td>
<td>{{ item.amount }}</td> <td class="px-6 py-4">{{ item.amount }}</td>
<td>{{ item.reason }}</td> <td class="px-6 py-4">{{ item.reason }}</td>
<td>{{ item.unit_value }}</td> <td class="px-6 py-4">{{ item.unit_value }}</td>
<td>{{ item.tally }}</td> <td class="px-6 py-4">{{ item.tally }}</td>
<td>{{ item.tally_value }}</td> <td class="px-6 py-4">{{ item.tally_value }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

@ -1,16 +1,14 @@
<form hx-post="/item/{{item_id}}/adjustment/negative" <form hx-post="/item/{{item_id}}/adjustment/negative"
hx-target="this" hx-swap="outerHTML" hx-target="this" hx-swap="outerHTML"
x-ref="formNegativeAdjustment" x-ref="formNegativeAdjustment"
x-data="{ reason: 'Sale' }"> x-data="{ reason: 'Sale', reason_dropdown_show: false }">
<input id="reason" name="reason" type="hidden" x-model="reason"/> <div class="mb-5">
<div class="row"> <label for="amount" class="block mb-2 text-sm font-medium">Amount</label>
<div class="col">
<!--<label for="amount" class="form-label">Amount</label>-->
<input type="number" <input type="number"
id="amount" id="amount"
name="amount" name="amount"
step="0.01" step="0.01"
class="form-control" class="border border-neutral-900 text-neutral-900 dark:text-slate-100 text-sm rounded-lg focus:ring-paynes-gray focus:border-paynes-gray block max-w-56 p-2.5"
placeholder="Amount" placeholder="Amount"
aria-label="amount" aria-label="amount"
required required
@ -20,46 +18,65 @@
{% endif -%} {% endif -%}
/> />
{% if !amount_error.is_empty() -%} {% if !amount_error.is_empty() -%}
<small id="invalid-amount" class="invalid-feedback">{{ amount_error }}</small> <small id="invalid-amount" class="mt-2 text-sm text-cerise">
{{ amount_error }}
</small>
{% endif -%} {% endif -%}
</div> </div>
<div class="col"> <div class="mb-5 flex justify-start">
<button class="btn btn-primary" x-text="reason">Sale</button> <button
class="text-slate-100 bg-english-violet hover:bg-dark-cyan focus:ring-4 focus:ring-dark-cyan font-medium rounded-l-lg text-sm px-5 py-2.5 focus:outline-none"
</div> x-text="reason">
<div class="col"> Sale
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown"
aria-expanded="false">
<span class="visually-hidden">Other</span>
</button> </button>
<ul class="dropdown-menu"> <div x-data="{ isOpen: false, openedWithKeyboard: false }"
<li> class="relative w-fit"
<a class="dropdown-item" x-on:keydown.esc.window="isOpen = false; openedWithKeyboard = false">
@click="reason = 'Sale'"> <button type="button" x-on:click="isOpen = ! isOpen"
class="text-slate-100 bg-english-violet hover:bg-dark-cyan focus:ring-4 focus:ring-dark-cyan font-medium rounded-r-lg text-sm px-3.5 py-3.5 focus:outline-none inline-flex items-center whitespace-nowrap rounded-radius border-l-2 border-slate-100 dark:border-neutral-900 tracking-wide transition"
aria-haspopup="true" x-on:keydown.space.prevent="openedWithKeyboard = true"
x-on:keydown.enter.prevent="openedWithKeyboard = true"
x-on:keydown.down.prevent="openedWithKeyboard = true"
x-bind:class="isOpen || openedWithKeyboard ? 'text-on-surface-strong dark:text-on-surface-dark-strong' : 'text-on-surface dark:text-on-surface-dark'"
x-bind:aria-expanded="isOpen || openedWithKeyboard">
<span class="sr-only">Reason Options</span>
<svg aria-hidden="true" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor" class="size-4 rotate-0">
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"/>
</svg>
</button>
<!-- Dropdown Menu -->
<div x-cloak
x-show="isOpen || openedWithKeyboard"
x-transition
x-trap="openedWithKeyboard"
x-on:click.outside="isOpen = false, openedWithKeyboard = false"
x-on:keydown.down.prevent="$focus.wrap().next()"
x-on:keydown.up.prevent="$focus.wrap().previous()"
class="bg-slate-100 dark:bg-neutral-900 absolute top-11 left-0 flex w-fit min-w-48 flex-col overflow-hidden rounded-radius border border-outline border-neutral-900 dark:border-slate-100"
role="menu">
<a class="px-4 py-2 text-sm hover:bg-dark-cyan hover:font-semibold focus-visible:bg-dark-cyan focus-visible:font-semibold focus-visible:outline-hidden"
role="menuitem"
@click="reason = 'Sale'; isOpen = false">
Sale Sale
</a> </a>
</li> <a class="px-4 py-2 text-sm hover:bg-dark-cyan hover:font-semibold focus-visible:bg-dark-cyan focus-visible:font-semibold focus-visible:outline-hidden"
<li> role="menuitem"
<a class="dropdown-item" @click="reason = 'Destruction'; isOpen = false">
@click="reason = 'Destruction'">
Destruction Destruction
</a> </a>
</li> <a class="px-4 py-2 text-sm hover:bg-dark-cyan hover:font-semibold focus-visible:bg-dark-cyan focus-visible:font-semibold focus-visible:outline-hidden"
<li> role="menuitem"
<a class="dropdown-item" @click="reason = 'Expiration'; isOpen = false">
@click="reason = 'Expiration'">
Expiration Expiration
</a> </a>
</li> <a class="px-4 py-2 text-sm hover:bg-dark-cyan hover:font-semibold focus-visible:bg-dark-cyan focus-visible:font-semibold focus-visible:outline-hidden"
<li> role="menuitem"
<a class="dropdown-item" @click="reason = 'Theft'; isOpen = false">
@click="reason = 'Theft'">
Theft Theft
</a> </a>
</li>
</ul>
</div> </div>
</div> </div>
</div> </div>
<input id="reason" name="reason" type="hidden" x-model="reason"/>
</form> </form>

@ -1,12 +1,14 @@
<form hx-post="/item/{{item_id}}/adjustment/positive" hx-target="this" hx-swap="outerHTML" > <form hx-post="/item/{{item_id}}/adjustment/positive"
<div class="row"> hx-target="this" hx-swap="outerHTML">
<div class="col"> <div class="mb-5">
<input type="number" <label for="amount" class="block mb-2 text-sm font-medium">Amount</label>
<input
type="number"
id="amount" id="amount"
name="amount" name="amount"
class="border border-neutral-900 text-neutral-900 dark:text-slate-100 text-sm rounded-lg focus:ring-paynes-gray focus:border-paynes-gray block max-w-56 p-2.5"
step="0.01" step="0.01"
class="form-control"
placeholder="Amount" placeholder="Amount"
aria-label="amount" aria-label="amount"
required required
@ -16,15 +18,18 @@
{% endif -%} {% endif -%}
/> />
{% if !amount_error.is_empty() -%} {% if !amount_error.is_empty() -%}
<small id="invalid-amount" class="invalid-feedback">{{ amount_error }}</small> <small id="invalid-amount" class="mt-2 text-sm text-cerise">
{{ amount_error }}
</small>
{% endif -%} {% endif -%}
</div> </div>
<div class="col"> <div class="mb-5">
<label for="price" class="block mb-2 text-sm font-medium">Price</label>
<input type="text" <input type="text"
id="price" id="price"
name="price" name="price"
class="border border-neutral-900 text-neutral-900 dark:text-slate-100 text-sm rounded-lg focus:ring-paynes-gray focus:border-paynes-gray block max-w-56 p-2.5"
placeholder="Price" placeholder="Price"
class="form-control"
aria-label="price" aria-label="price"
required required
{% if !price_error.is_empty() -%} {% if !price_error.is_empty() -%}
@ -33,11 +38,10 @@
{% endif -%} {% endif -%}
/> />
{% if !price_error.is_empty() -%} {% if !price_error.is_empty() -%}
<small id="invalid-price" class="invalid-feedback">{{ price_error }}</small> <small id="invalid-price" class="mt-2 text-sm text-cerise">{{ price_error }}</small>
{% endif -%} {% endif -%}
</div> </div>
<div class="col"> <div class="mb-5">
<button class="btn btn-primary">Add</button> <button class="text-slate-100 bg-english-violet hover:bg-dark-cyan focus:ring-4 focus:ring-dark-cyan font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 focus:outline-none">Add</button>
</div>
</div> </div>
</form> </form>

@ -4,48 +4,43 @@
{% block content %} {% block content %}
<div class="container mb-5"> <h2 class="flex items-center text-4xl font-extrabold mb-4">
<h2>{{item.name}} {% if !item.active %}<span class="badge text-bg-danger">Inactive</span> {% endif %}</h2> {{item.name}}
</div> {% if !item.active %}
<span class="bg-orchid-pink text-cerise border border-cerise text-2xl font-semibold me-2 px-2.5 py-0.5 rounded ms-2">
Inactive
</span>
{% endif %}
</h2>
<section class="container"> <section hx-get="/item/{{item_id}}/stats" hx-trigger="load" hx-swap="outerHTML"></section>
<div hx-get="/item/{{item_id}}/stats" hx-trigger="load" hx-swap="outerHTML">
</div>
</section>
{% if item.active %} {% if item.active %}
<section class="container-fluid"> <section class="mx-auto mb-5"
x-data="{ negative_form_open: false, positive_form_open: false }">
<div x-data="{ open: false }" class="mb-3"> <div class="flex justify-evenly">
<div class="d-flex justify-content-start"> <button class="text-slate-100 bg-paynes-gray hover:bg-dark-cyan focus:ring-4 focus:ring-dark-cyan font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 focus:outline-none"
<div class="me-3"> @click="negative_form_open = ! negative_form_open">
<button class="btn btn-primary display-6" @click="open = ! open">
Minus Minus
</button> </button>
</div> <button class="text-slate-100 bg-paynes-gray hover:bg-dark-cyan focus:ring-4 focus:ring-dark-cyan font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 focus:outline-none"
<div x-show="open" @click.outside="open = false"> @click="positive_form_open = ! positive_form_open">
<div hx-get="/item/{{item_id}}/adjustment/negative" hx-trigger="load" hx-swap="outerHTML"></div>
</div>
</div>
</div>
<div x-data="{ open: false }" class="mb-3">
<div class="d-flex justify-content-start">
<div class="me-3">
<button class="btn btn-primary" @click="open = ! open">
Plus Plus
</button> </button>
</div> </div>
<div x-show="open" @click.outside="open = false">
<div hx-get="/item/{{item_id}}/adjustment/positive" hx-trigger="load" hx-swap="outerHTML"> <div x-show="negative_form_open" @click.outside="negative_form_open = false">
</div> <div hx-get="/item/{{item_id}}/adjustment/negative" hx-trigger="load" hx-swap="outerHTML"></div>
</div>
</div> </div>
<div x-show="positive_form_open" @click.outside="positive_form_open = false">
<div hx-get="/item/{{item_id}}/adjustment/positive" hx-trigger="load" hx-swap="outerHTML"></div>
</div> </div>
</section> </section>
{% endif %} {% endif %}
<section class="container"> <section class="mx-auto">
<div hx-get="/item/{{item_id}}/adjustments" hx-trigger="load" hx-swap="outerHTML"> <div hx-get="/item/{{item_id}}/adjustments" hx-trigger="load" hx-swap="outerHTML">
</div> </div>
</section> </section>

@ -1,35 +1,17 @@
<section hx-get="/item/{{item_id}}/stats" hx-trigger="new-adjustment from:body" hx-swap="outerHTML" class="mb-4"> <section hx-get="/item/{{item_id}}/stats" hx-trigger="new-adjustment from:body" hx-swap="outerHTML" class="mb-4">
<div class="row"> <div class="flex justify-start">
<div class="col-md-3"> <div class="border border-space-cadet rounded px-4 py-4 me-4">
<div class="card text-center mb-1"> <p class="text-xl uppercase text-center">Stock</p>
<div class="card-header"> <p class="text-xl text-center">{{item.amount}} {{item.display_unit_short}}</p>
<p class="text-bolder text-uppercase">Stock</p> </div>
</div> <div class="border border-space-cadet rounded px-4 py-4 me-4">
<div class="card-body"> <p class="text-xl uppercase text-center">Reorder</p>
<p class="display-6">{{item.amount}} {{item.display_unit_short}}</p> <p class="text-xl text-center">{{item.reorder_point}} {{item.display_unit_short}}</p>
</div> </div>
</div> <div class="border border-space-cadet rounded px-4 py-4 me-4">
</div> <p class="text-xl uppercase text-center">Value</p>
<div class="col-md-3"> <p class="text-xl text-center">{{value}}</p>
<div class="card text-center mb-1">
<div class="card-header">
<p class="text-bolder text-uppercase">Reorder Point</p>
</div>
<div class="card-body">
<p class="display-6">{{item.reorder_point}} {{item.display_unit_short}}</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card text-center mb-1">
<div class="card-header">
<p class="text-bolder text-uppercase">Value</p>
</div>
<div class="card-body">
<p class="display-6">{{value}}</p>
</div>
</div>
</div> </div>
</div> </div>
</section> </section>

@ -1,53 +1,60 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-bs-theme="dark"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="light dark"> <meta name="color-scheme" content="light dark">
<!-- <link rel="stylesheet" href="/css/pico.min.css" > --> <link rel="stylesheet" href="/css/main.css">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<!--TODO Vendor css-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script src="/js/htmx.min.js"></script> <script src="/js/htmx.min.js"></script>
<!--TODO Vendor this script --> <!--TODO Vendor this script -->
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script> <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<title>{% block title %}Title{% endblock %}</title> <title>{% block title %}Title{% endblock %}</title>
</head> </head>
<body> <body class="bg-slate-100 text-neutral-900 dark:bg-neutral-900 dark:text-slate-100 min-h-screen">
<header class="container mb-4"> <header class="bg-space-cadet font-sans mb-4 mx-auto">
<nav class="navbar navbar-expand-lg bg-body-tertiary"> <nav class="mx-auto max-w-7xl px-2 py-4 sm:px-6 lg:px-8 flex justify-between gap-2">
<div class="container-fluid"> <div>
<a class="navbar-brand" href="/home">Inventory App</a> <a href="/home" class="rounded-md bg-english-violet px-3 py-2 text-sm font-medium text-white">
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> Inventory App
<span class="navbar-toggler-icon"></span> </a>
</button>
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
<ul class="navbar-nav ">
<li class="nav-item"><h1></h1></li>
<li class="nav-item"><a class="nav-link" href="/overview">Overview</a></li>
<li class="nav-item"><a class="nav-link" href="/catalog">Catalog</a></li>
<li class="nav-item"><a class="nav-link" href="/upload">Upload</a></li>
<li class="nav-item"><a class="nav-link" href="/reports">Reports</a></li>
<li class="nav-item"><a class="nav-link" href="/history">History</a></li>
</ul>
<div class="d-flex">
<a class="btn btn-primary" href="/auth/logout">Logout</a>
</div>
</div> </div>
<div>
<a href="/overview"
class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-gray-700 hover:text-white">
Overview
</a>
<a href="/catalog"
class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-gray-700 hover:text-white">
Catalog
</a>
<a href="/upload"
class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-gray-700 hover:text-white">
Upload
</a>
<a href="/reports"
class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-gray-700 hover:text-white">
Reports
</a>
<a href="/history"
class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-gray-700 hover:text-white">
History
</a>
</div> </div>
</nav> </nav>
</header> </header>
<main class="container"> <main class="bg-slate-100 text-neutral-900 dark:bg-neutral-900 dark:text-slate-100 mx-auto px-1">
{% block content %}<p>Content Missing</p>{% endblock %} {% block content %}<p>Content Missing</p>{% endblock %}
</main> </main>
<footer class="container-fluid"> <footer>
<!--
<script> <script>
// Needed for nice bootstrap dropdowns // Needed for nice bootstrap dropdowns
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="dropdown"]'); const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="dropdown"]');
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl)) const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
</script> </script>
-->
</footer> </footer>
</body> </body>
</html> </html>
Loading…
Cancel
Save

Powered by TurnKey Linux.