feat: Initialize License Tracker Pro v1.2 project

Adds initial project structure, dependencies, and basic configuration for the License Tracker Pro v1.2 application. This includes setting up Vite for the build process, defining core types, and incorporating essential UI components like icons and a timeline. The project is now ready for development.
This commit is contained in:
Philip
2026-01-26 18:55:43 -08:00
parent d4895c6d81
commit e045354892
56 changed files with 3410 additions and 8 deletions
+330
View File
@@ -0,0 +1,330 @@
/* General Body & Theme */
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
background-color: #0f172a; /* slate-900 */
color: #e5e7eb; /* gray-200 */
margin: 0;
line-height: 1.6;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 2rem;
}
/* Header */
header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2rem;
padding-bottom: 1rem;
border-bottom: 1px solid #334155; /* slate-700 */
}
header h1 {
font-size: 2.5rem;
color: #22d3ee; /* cyan-400 */
margin: 0;
}
header span {
margin-right: 1rem;
color: #9ca3af; /* gray-400 */
}
/* Buttons */
.button {
display: inline-block;
padding: 0.5rem 1rem;
border-radius: 6px;
text-decoration: none;
font-weight: 600;
transition: background-color 0.2s ease;
border: none;
cursor: pointer;
background-color: #334155; /* slate-700 */
color: #e5e7eb; /* gray-200 */
}
.button:hover {
background-color: #475569; /* slate-600 */
}
.primary-button {
background-color: #06b6d4; /* cyan-500 */
color: #0f172a; /* slate-900 */
}
.primary-button:hover {
background-color: #22d3ee; /* cyan-400 */
}
.delete-button {
background-color: #ef4444;
color: white;
}
.delete-button:hover {
background-color: #f87171;
}
/* Cards */
.card {
background-color: #1e293b; /* slate-800 */
border-radius: 8px;
padding: 1.5rem;
margin-bottom: 1.5rem;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1rem;
}
.card-header h2 {
margin: 0;
font-size: 1.25rem;
}
.nav-button {
display: inline-block;
padding: 0.25rem 0.5rem;
text-decoration: none;
color: #9ca3af;
background-color: #334155;
border-radius: 4px;
margin-left: 0.5rem;
}
/* Timeline */
.timeline-container {
padding: 1rem 0;
}
.timeline-bar {
position: relative;
height: 8px;
background-color: #334155;
border-radius: 4px;
}
.timeline-dot-wrapper {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
.timeline-dot {
width: 16px;
height: 16px;
border-radius: 50%;
border: 2px solid #1e293b;
transform: translateX(-50%);
cursor: pointer;
}
.timeline-tooltip {
visibility: hidden;
width: max-content;
background-color: #0f172a;
color: #fff;
text-align: center;
border-radius: 6px;
padding: 5px 10px;
position: absolute;
z-index: 1;
bottom: 150%;
left: 50%;
transform: translateX(-50%);
opacity: 0;
transition: opacity 0.3s;
}
.timeline-dot-wrapper:hover .timeline-tooltip {
visibility: visible;
opacity: 1;
}
.timeline-legend {
display: flex;
flex-wrap: wrap;
gap: 1rem;
margin-top: 1rem;
font-size: 0.875rem;
}
.legend-item {
display: flex;
align-items: center;
gap: 0.5rem;
}
.legend-color-box {
width: 14px;
height: 14px;
border-radius: 3px;
}
/* License List */
.actions {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1rem;
}
.license-item .license-main {
display: grid;
grid-template-columns: 150px 1fr 300px;
gap: 1.5rem;
align-items: start;
}
.license-image img {
width: 100px;
height: 100px;
border-radius: 50%;
object-fit: cover;
border: 3px solid #334155;
}
.license-details h3 {
font-size: 1.75rem;
color: #22d3ee;
margin-top: 0;
margin-bottom: 0.5rem;
}
.license-details p {
margin: 0.25rem 0;
color: #9ca3af;
}
.license-details p strong {
color: #e5e7eb;
}
.comment-box {
background-color: #334155;
padding: 0.5rem;
border-radius: 4px;
margin-top: 1rem;
font-size: 0.9rem;
}
.license-chart {
height: 150px;
}
.license-actions {
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid #334155;
text-align: right;
}
.license-actions .button {
margin-left: 0.5rem;
}
/* Forms */
.form-container h3 {
margin-top: 2rem;
margin-bottom: 1rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid #334155;
color: #22d3ee;
}
.form-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1.5rem;
}
.form-group {
display: flex;
flex-direction: column;
}
.form-group.form-group-full {
grid-column: 1 / -1;
}
.form-group label {
margin-bottom: 0.5rem;
font-weight: 500;
color: #9ca3af;
}
input[type="text"], input[type="email"], input[type="tel"], input[type="date"], input[type="number"], textarea {
background: #0f172a;
border: 1px solid #334155;
color: #e5e7eb;
border-radius: 6px;
padding: 0.75rem;
width: 100%;
box-sizing: border-box;
}
input:focus, textarea:focus {
outline: none;
border-color: #22d3ee;
box-shadow: 0 0 0 2px rgba(34, 211, 238, 0.5);
}
textarea {
resize: vertical;
}
.form-image-preview {
max-width: 100px;
margin-top: 1rem;
border-radius: 6px;
}
.form-actions {
text-align: right;
margin-top: 2rem;
border-top: 1px solid #334155;
padding-top: 1.5rem;
}
.form-actions .button {
margin-left: 1rem;
}
#renewals-container {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin-bottom: 1rem;
}
.renewal-row {
display: grid;
grid-template-columns: 1fr 1fr 1fr auto;
gap: 1rem;
align-items: center;
}
/* Login Page */
.login-body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
.login-container {
width: 100%;
max-width: 400px;
padding: 2.5rem;
background-color: #1e293b;
border-radius: 8px;
box-shadow: 0 10px 15px rgba(0,0,0,0.2);
}
.login-title {
text-align: center;
font-size: 2rem;
color: #22d3ee;
margin-bottom: 2rem;
}
.login-form div {
margin-bottom: 1rem;
}
.login-form label {
display: block;
margin-bottom: 0.5rem;
}
.login-form input {
width: 100%;
padding: 0.75rem;
}
.login-form button {
width: 100%;
padding: 0.75rem;
margin-top: 1rem;
font-size: 1rem;
}
.login-footer {
text-align: center;
margin-top: 1rem;
font-size: 0.9rem;
color: #9ca3af;
}
.error-message {
background-color: rgba(239, 68, 68, 0.2);
color: #f87171;
padding: 1rem;
border-radius: 6px;
margin-bottom: 1rem;
border: 1px solid #ef4444;
}