tkr/public/css/tkr.css
2025-06-17 09:36:13 -04:00

572 lines
12 KiB
CSS

@charset "UTF-8";
:root {
/* Primary colors */
--color-primary: #4299e1;
--color-primary-dark: #3182ce;
--color-primary-darker: #2563eb;
--color-primary-light: #bae6fd;
--color-primary-lighter: #ebf8ff;
--color-primary-lightest: #f0f9ff;
/* Text colors */
--color-text-primary: #374151;
--color-text-secondary: #1e40af;
--color-text-tertiary: #0369a1;
--color-text-muted: gray;
--color-text-black: black;
--color-text-dark: #333;
/* Background colors */
--color-bg-body: whitesmoke;
--color-bg-white: white;
--color-bg-light: #fefefe;
--color-bg-file: #f8fafc;
/* Border colors */
--color-border-light: #e5e7eb;
--color-border-medium: #d1d5db;
--color-border-file: #cbd5e0;
/* State colors */
--color-required: #dc2626;
--color-hover-light: #dbeafe;
--color-hover-medium: #bfdbfe;
--color-emoji-bg: #ddeeff;
--color-emoji-border: #339;
/* Shadow colors */
--shadow-primary: rgba(66, 153, 225, 0.1);
--shadow-primary-strong: rgba(66, 153, 225, 0.3);
/* Flash colors */
--color-flash-success: #155724;
--color-flash-success-bg: #d4edda;
--color-flash-success-border-left: #28a745;
--color-flash-error: #721c24;
--color-flash-error-bg: #f8d7da;
--color-flash-error-border-left: #dc3545;
--color-flash-warning: #856404;
--color-flash-warning-bg: #fff3cd;
--color-flash-warning-border-left: #ffc107;
--color-flash-info: #0c5460;
--color-flash-info-bg: #d1ecf1;
--color-flash-info-border-left: #17a2b8;
}
body {
max-width: 940px;
margin: 0 auto;
padding: 1em;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background-color: var(--color-bg-body);
color: var(--color-text-black);
}
a {
font-weight: bold;
}
legend {
background-color: var(--color-bg-white);
padding: 6px 12px;
border-radius: 4px;
font-weight: 600;
color: var(--color-text-primary);
border: 1px solid var(--color-border-medium);
}
fieldset {
border: 2px solid var(--color-border-light);
border-radius: 6px;
padding: 16px;
margin-bottom: 16px;
background-color: var(--color-bg-light);
}
/* Grid layout for emoji fieldsets */
fieldset.emoji-group {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(2em, 1fr));
gap: 0.3em;
}
h1.site-description {
font-size: 1.3em;
}
.delete-emoji-fieldset .fieldset-items {
display: block;
grid-template-columns: none;
}
.delete-emoji-fieldset button {
margin-top: 16px;
width: auto;
}
input[type="text"],
input[type="number"],
input[type="password"],
textarea,
select {
width: 100%;
padding: 10px 12px;
border: 1px solid var(--color-border-medium);
border-radius: 6px;
font-family: inherit;
font-size: 1em;
resize: none;
transition: border-color 0.2s ease;
box-sizing: border-box;
}
input[type="text"]:focus,
input[type="number"]:focus,
input[type="password"]:focus,
textarea:focus,
select:focus {
outline: none;
border-color: var(--color-primary);
box-shadow: 0 0 0 2px var(--shadow-primary);
}
input[type="file"] {
width: 100%;
padding: 10px;
border: 2px dashed var(--color-border-file);
border-radius: 6px;
background-color: var(--color-bg-file);
cursor: pointer;
font-size: 14px;
transition: all 0.3s ease;
box-sizing: border-box;
}
input[type="file"]:hover {
border-color: var(--color-primary);
background-color: var(--color-primary-lighter);
}
input[type="file"]:focus {
outline: none;
border-color: var(--color-primary);
box-shadow: 0 0 0 3px var(--shadow-primary);
}
button {
padding: 10px 20px;
border: 1px solid var(--color-primary);
border-radius: 6px;
background-color: var(--color-primary-lightest);
color: var(--color-text-secondary);
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
box-sizing: border-box;
}
button:hover {
background-color: var(--color-hover-light);
border-color: var(--color-primary-dark);
}
button:focus {
outline: none;
border-color: var(--color-primary-darker);
box-shadow: 0 0 0 2px var(--shadow-primary);
}
button:active {
background-color: var(--color-hover-medium);
}
label {
font-weight: 600;
color: var(--color-text-primary);
text-align: left;
padding-top: 0;
margin-bottom: 3px;
line-height: 1.2;
}
label.description {
font-weight: 300;
color: var(--color-text-muted);
text-align: left;
padding-top: 0;
margin-bottom: 3px;
line-height: 1.2;
}
.navbar {
overflow: hidden;
background: var(--color-bg-white);
}
.navbar a {
float: left;
font-size: 16px;
color: var(--color-text-secondary);
text-align: center;
padding: 14px 16px;
text-decoration: none;
}
.navbar a:hover {
background: var(--color-hover-light);
color: var(--color-primary-dark);
}
.navbar a:focus {
outline: none;
background: var(--color-hover-light);
box-shadow: 0 0 0 2px var(--shadow-primary);
}
/*
Dropdown menu styling
https://www.w3schools.com/howto/howto_css_dropdown.asp
*/
.dropdown {
float: left;
overflow: hidden;
}
.dropdown .dropbtn {
font-size: 16px;
border: none;
border-radius: 0px; /* overrides default button corner style */
outline: none;
color: var(--color-text-secondary);
padding: 14px 16px;
background-color: inherit;
font-family: inherit;
margin: 0;
}
/* Add a downward-facing caret after the button label */
.dropdown .dropbtn::after {
content: " ▼";
font-size: 0.8em;
margin-left: 4px;
}
.dropdown:hover .dropbtn {
background: var(--color-hover-light);
color: var(--color-primary-dark)
}
.dropdown-content {
display: none;
position: absolute;
background-color: var(--color-bg-white);
border: 1px solid var(--color-border-light);
border-radius: 6px;
min-width: 160px;
box-shadow: 0px 8px 16px 0px var(--shadow-primary);
z-index: 1;
}
.dropdown-content a {
float: none;
color: var(--color-text-primary);
padding: 12px 16px;
text-decoration: none;
display: block;
text-align: left;
}
.dropdown-content a:hover {
background: var(--color-hover-light);
color: var(--color-primary-dark);
}
.dropdown-content a:focus {
outline: none;
background: var(--color-hover-light);
box-shadow: 0 0 0 2px var(--shadow-primary);
}
.dropdown:hover .dropdown-content {
display: block;
}
/*
The two common display options for responsive layouts are flex and grid.
flex (aka Flexbox) aligns items either horizontally or vertically.
grid can align items in two dimensions.
grid also allows more precise positioning of elements, so I'm using that
even though I only have one dimension.
*/
.home-container {
display: grid;
}
.home-sidebar{
padding-bottom: 1em;
}
.site-description {
font-size: 1.2rem;
color: var(--color-text-dark);
margin-bottom: 0.5rem;
}
.profile-row {
display: flex;
width: 100%;
gap: 0.5em;
}
.tick-form {
display: flex;
flex-direction: column;
width: 100%;
gap: 0.5em;
}
.mood-bar {
display: flex;
width: 100%;
justify-content: space-between;
align-items: center;
gap: 0.5em;
}
.flash-messages {
background: white;
margin-top: 10px;
padding: 15px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.flash-message {
padding: 12px 16px;
margin: 5px 0;
border-radius: 4px;
border-left: 4px solid;
font-weight: 500;
}
.flash-success {
background-color: var(--color-flash-success-bg);
border-left-color: var(--color-flash-success-border-left);
color: var(--color-flash-success);
}
.flash-error {
background-color: var(--color-flash-error-bg);
border-left-color: var(--color-flash-error-border-left);
color: var(--color-flash-error);
}
.flash-warning {
background-color: var(--color-flash-warning-bg);
border-left-color: var(--color-flash-warning-border-left);
color: var(--color-flash-warning);
}
.flash-info {
background-color: var(--color-flash-info-bg);
border-left-color: var(--color-flash-info-border-left);
color: var(--color-flash-info);
}
.fieldset-items {
margin-bottom: 14px;
display: grid;
grid-template-columns: 1fr;
gap: 6px;
align-items: start;
}
.file-input-wrapper {
position: relative;
width: 100%;
}
.file-info {
background-color: var(--color-primary-lightest);
border: 1px solid var(--color-primary-light);
border-radius: 4px;
padding: 8px;
margin-top: 8px;
font-size: 13px;
color: var(--color-text-tertiary);
grid-column: 1;
}
.delete-btn {
background-color: #fef2f2;
color: #dc2626;
border: 1px solid #fca5a5;
padding: 10px 20px;
border-radius: 6px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
box-sizing: border-box;
}
.delete-btn:hover {
background-color: #fee2e2;
border-color: #f87171;
}
.delete-btn:focus {
outline: none;
border-color: #dc2626;
box-shadow: 0 0 0 2px rgba(220, 38, 38, 0.1);
}
.delete-btn:active {
background-color: #fecaca;
}
.required {
color: var(--color-required);
}
.tick {
margin-bottom: 1em;
}
.tick-time {
color: var(--color-text-muted);
font-size: 0.8em;
}
.tick-text {
color: var(--color-text-black);
font-size: 1.0em;
}
.tick-pagination a {
margin: 0 5px;
text-decoration: none;
}
.emoji-option input {
display: none;
}
.emoji-option span {
font-size: 1.4em;
display: inline-block;
padding: 0.2em;
border-radius: 0.3em;
}
.emoji-option input:checked + span {
background-color: var(--color-emoji-bg);
outline: 2px solid var(--color-emoji-border);
}
.emoji-checkbox-item {
display: flex;
align-items: center;
gap: 12px;
padding: 8px 12px;
border: 1px solid var(--color-border-light);
border-radius: 6px;
background-color: var(--color-bg-white);
transition: all 0.2s ease;
margin-bottom: 6px;
}
.emoji-checkbox-item:hover {
background-color: var(--color-hover-light);
border-color: var(--color-primary);
}
.emoji-checkbox-item input[type="checkbox"] {
width: auto;
margin: 0;
cursor: pointer;
}
.emoji-checkbox-item label {
display: flex;
align-items: center;
gap: 10px;
margin: 0;
padding: 0;
font-weight: 400;
cursor: pointer;
flex-grow: 1;
text-align: left;
}
.emoji-display {
font-size: 1.8em;
min-width: 2em;
text-align: center;
}
.emoji-description {
flex-grow: 1;
color: var(--color-text-primary);
font-size: 1em;
}
.emoji-checkbox-item input[type="checkbox"]:focus {
outline: none;
box-shadow: 0 0 0 2px var(--shadow-primary);
}
/*
Responsive layout - adjusts from 1 to 2 columns based on screen width
- min-width makes the mobile (stacked) view the default
- 600px covers most mobile devices in portrait mode
- Once the width exceeds that (e.g. desktops), it will convert to horizontal alignment
*/
@media (min-width: 600px) {
label {
text-align: right;
padding-top: 10px;
margin-bottom: 0;
}
label.description {
padding-top: 10px;
margin-bottom: 0;
}
.home-container {
grid-template-columns: 1fr 2fr;
grid-gap: 2em;
}
.fieldset-items {
margin-bottom: 16px;
display: grid;
grid-template-columns: 200px 1fr;
gap: 16px;
align-items: start;
}
.file-info {
grid-column: 2;
}
.navbar {
flex-wrap: wrap;
}
.dropdown-menu {
position: fixed;
left: 1em;
right: 1em;
width: auto;
min-width: auto;
}
}