This commit is contained in:
2025-11-10 15:46:40 +01:00
parent 1ddb2c609d
commit 1e5a6dbd5f
63 changed files with 6107 additions and 491 deletions
+371
View File
@@ -0,0 +1,371 @@
.billing-dashboard {
padding: 2rem;
max-width: 1400px;
margin: 0 auto;
}
.billing-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2rem;
}
.subscription-badge {
padding: 0.5rem 1rem;
border-radius: 20px;
font-weight: 600;
font-size: 0.9rem;
}
.subscription-badge.active {
background: #10b981;
color: white;
}
.subscription-badge.inactive {
background: #ef4444;
color: white;
}
.billing-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.billing-card {
background: white;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 1.5rem;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.billing-card h3 {
margin: 0 0 1rem 0;
color: #1f2937;
font-size: 1.1rem;
}
.usage-details {
display: flex;
flex-direction: column;
gap: 1rem;
}
.usage-item {
display: flex;
justify-content: space-between;
align-items: center;
}
.usage-label {
color: #6b7280;
font-size: 0.9rem;
}
.usage-value {
font-weight: 600;
font-size: 1.1rem;
color: #1f2937;
}
.usage-progress {
width: 100%;
height: 8px;
background: #e5e7eb;
border-radius: 4px;
overflow: hidden;
}
.usage-progress-bar {
height: 100%;
background: linear-gradient(90deg, #3b82f6, #2563eb);
transition: width 0.3s ease;
}
.usage-info {
font-size: 0.8rem;
color: #6b7280;
}
.estimated-cost {
font-size: 2rem;
font-weight: 700;
color: #1f2937;
margin: 1rem 0;
}
.cost-breakdown {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid #e5e7eb;
}
.cost-item {
display: flex;
justify-content: space-between;
font-size: 0.9rem;
}
.pricing-details {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.pricing-item {
display: flex;
justify-content: space-between;
padding: 0.5rem 0;
border-bottom: 1px solid #f3f4f6;
}
.pricing-item:last-child {
border-bottom: none;
}
.invoices-section {
background: white;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 1.5rem;
margin-bottom: 2rem;
}
.invoices-table {
margin-top: 1rem;
}
.invoices-table table {
width: 100%;
border-collapse: collapse;
}
.invoices-table th,
.invoices-table td {
padding: 0.75rem;
text-align: left;
border-bottom: 1px solid #e5e7eb;
}
.invoices-table th {
background: #f9fafb;
font-weight: 600;
color: #374151;
}
.invoice-status {
padding: 0.25rem 0.75rem;
border-radius: 12px;
font-size: 0.8rem;
font-weight: 600;
text-transform: uppercase;
}
.invoice-status.paid {
background: #d1fae5;
color: #065f46;
}
.invoice-status.open {
background: #fef3c7;
color: #92400e;
}
.invoice-status.draft {
background: #e5e7eb;
color: #374151;
}
.no-invoices {
text-align: center;
padding: 2rem;
color: #6b7280;
}
.payment-methods-section {
background: white;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 1.5rem;
}
.btn-primary {
background: #2563eb;
color: white;
border: none;
padding: 0.75rem 1.5rem;
border-radius: 6px;
font-weight: 600;
cursor: pointer;
transition: background 0.2s;
}
.btn-primary:hover {
background: #1d4ed8;
}
.btn-secondary {
background: #6b7280;
color: white;
border: none;
padding: 0.75rem 1.5rem;
border-radius: 6px;
font-weight: 600;
cursor: pointer;
transition: background 0.2s;
}
.btn-secondary:hover {
background: #4b5563;
}
.btn-link {
background: none;
border: none;
color: #2563eb;
cursor: pointer;
text-decoration: underline;
}
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
.modal-content {
background: white;
padding: 2rem;
border-radius: 8px;
max-width: 800px;
max-height: 90vh;
overflow-y: auto;
}
.invoice-total {
margin-top: 1rem;
padding-top: 1rem;
border-top: 2px solid #1f2937;
display: flex;
flex-direction: column;
gap: 0.5rem;
font-size: 1.1rem;
}
.admin-billing {
padding: 2rem;
max-width: 1400px;
margin: 0 auto;
}
.stats-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.stat-card {
background: white;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 1.5rem;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.stat-card h3 {
margin: 0 0 0.5rem 0;
color: #6b7280;
font-size: 0.9rem;
font-weight: 500;
}
.stat-value {
font-size: 2rem;
font-weight: 700;
color: #1f2937;
}
.pricing-config-section {
background: white;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 1.5rem;
margin-bottom: 2rem;
}
.pricing-table {
width: 100%;
border-collapse: collapse;
margin-top: 1rem;
}
.pricing-table th,
.pricing-table td {
padding: 0.75rem;
text-align: left;
border-bottom: 1px solid #e5e7eb;
}
.pricing-table th {
background: #f9fafb;
font-weight: 600;
color: #374151;
}
.btn-edit {
background: #3b82f6;
color: white;
border: none;
padding: 0.5rem 1rem;
border-radius: 4px;
cursor: pointer;
font-size: 0.875rem;
}
.btn-edit:hover {
background: #2563eb;
}
.invoice-generation-section {
background: white;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 1.5rem;
}
.invoice-gen-form {
display: flex;
gap: 1rem;
align-items: end;
margin-top: 1rem;
}
.invoice-gen-form label {
display: flex;
flex-direction: column;
gap: 0.5rem;
font-weight: 500;
color: #374151;
}
.invoice-gen-form input {
padding: 0.5rem;
border: 1px solid #e5e7eb;
border-radius: 4px;
font-size: 1rem;
}
+80
View File
@@ -0,0 +1,80 @@
.code-editor-view {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
background: white;
z-index: 100;
}
.code-editor-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 24px;
border-bottom: 1px solid #ddd;
background: white;
}
.code-editor-header .header-left {
display: flex;
align-items: center;
gap: 16px;
}
.code-editor-header .header-right {
display: flex;
gap: 8px;
}
.editor-filename {
margin: 0;
font-size: 18px;
font-weight: 600;
color: #333;
}
.code-editor-body {
flex: 1;
overflow: hidden;
position: relative;
background: white;
}
.code-editor-body .CodeMirror {
height: 100%;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 14px;
background: white;
}
.code-editor-body .CodeMirror-gutters {
background: #f9f9f9;
border-right: 1px solid #ddd;
}
.code-editor-body .CodeMirror-linenumber {
color: #999;
padding: 0 8px;
}
.code-editor-body .CodeMirror-cursor {
border-left: 2px solid #333;
}
.code-editor-body .CodeMirror-selected {
background: #d7e8ff;
}
.code-editor-body .CodeMirror-line::selection,
.code-editor-body .CodeMirror-line > span::selection,
.code-editor-body .CodeMirror-line > span > span::selection {
background: #d7e8ff;
}
.code-editor-body textarea {
display: none;
}
+145
View File
@@ -0,0 +1,145 @@
.file-upload-view {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
background: white;
z-index: 100;
}
.file-upload-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 24px;
border-bottom: 1px solid #ddd;
background: white;
}
.file-upload-header .header-left {
display: flex;
align-items: center;
gap: 16px;
}
.file-upload-header h2 {
margin: 0;
font-size: 18px;
font-weight: 600;
color: #333;
}
.file-upload-body {
flex: 1;
overflow: auto;
padding: 24px;
display: flex;
flex-direction: column;
gap: 24px;
}
.drop-zone {
border: 2px dashed #ddd;
border-radius: 8px;
padding: 48px 24px;
text-align: center;
background: #f9f9f9;
transition: all 0.2s;
cursor: pointer;
}
.drop-zone:hover {
border-color: #003399;
background: #f0f4ff;
}
.drop-zone.drag-over {
border-color: #003399;
background: #e6f0ff;
border-style: solid;
}
.drop-zone-icon {
font-size: 64px;
margin-bottom: 16px;
opacity: 0.5;
}
.drop-zone h3 {
margin: 0 0 8px 0;
color: #333;
font-size: 20px;
}
.drop-zone p {
margin: 8px 0;
color: #666;
}
.upload-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.upload-item {
background: white;
border: 1px solid #ddd;
border-radius: 8px;
padding: 16px;
}
.upload-item-info {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.upload-item-name {
font-weight: 500;
color: #333;
}
.upload-item-size {
color: #666;
font-size: 14px;
}
.upload-item-progress {
display: flex;
flex-direction: column;
gap: 4px;
}
.progress-bar {
width: 100%;
height: 8px;
background: #e0e0e0;
border-radius: 4px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: #003399;
transition: width 0.3s ease;
}
.upload-item-status {
font-size: 14px;
color: #666;
}
.upload-item-status.success {
color: #28a745;
font-weight: 500;
}
.upload-item-status.error {
color: #dc3545;
font-weight: 500;
}
+118 -43
View File
@@ -16,6 +16,12 @@
* {
box-sizing: border-box;
user-select: none;
scrollbar-width: none;
-ms-overflow-style: none;
}
*::-webkit-scrollbar {
display: none;
}
input, textarea {
@@ -29,6 +35,7 @@ body {
background-color: var(--background-color);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overflow: hidden;
}
.app-container {
@@ -146,6 +153,7 @@ body {
flex: 1;
overflow-y: auto;
padding: calc(var(--spacing-unit) * 3);
position: relative;
}
.button {
@@ -267,6 +275,41 @@ body {
padding: calc(var(--spacing-unit) * 2);
}
.breadcrumb-nav {
display: flex;
align-items: center;
gap: calc(var(--spacing-unit) * 1);
margin-bottom: calc(var(--spacing-unit) * 2);
font-size: 14px;
color: var(--text-color-light);
}
.breadcrumb-item {
cursor: pointer;
color: var(--primary-color);
transition: color 0.2s;
}
.breadcrumb-item:hover {
color: var(--secondary-color);
text-decoration: underline;
}
.breadcrumb-item.breadcrumb-current {
color: var(--text-color);
cursor: default;
font-weight: 600;
}
.breadcrumb-item.breadcrumb-current:hover {
text-decoration: none;
}
.breadcrumb-separator {
color: var(--text-color-light);
user-select: none;
}
.file-list-header {
display: flex;
justify-content: space-between;
@@ -276,11 +319,36 @@ body {
border-bottom: 1px solid var(--border-color);
}
.file-list-header .header-left {
display: flex;
align-items: center;
gap: calc(var(--spacing-unit) * 3);
}
.file-list-header h2 {
margin: 0;
color: var(--primary-color);
}
.selection-controls {
display: flex;
align-items: center;
gap: var(--spacing-unit);
}
.selection-controls input[type="checkbox"] {
width: 18px;
height: 18px;
cursor: pointer;
}
.selection-controls label {
font-size: 14px;
color: var(--text-color);
cursor: pointer;
user-select: none;
}
.file-actions {
display: flex;
gap: var(--spacing-unit);
@@ -301,6 +369,7 @@ body {
border-radius: 8px;
cursor: pointer;
transition: all 0.2s ease;
position: relative;
}
.file-item:hover {
@@ -308,6 +377,10 @@ body {
border-color: var(--primary-color);
}
.file-item:hover .select-item {
opacity: 1;
}
.file-icon {
font-size: 3rem;
margin-bottom: var(--spacing-unit);
@@ -690,66 +763,54 @@ body.dark-mode {
color: var(--text-color-light);
}
.preview-modal {
position: fixed;
.file-preview-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.9);
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
padding: calc(var(--spacing-unit) * 2);
}
.preview-container {
background: var(--accent-color);
border-radius: 8px;
max-width: 90vw;
max-height: 90vh;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
overflow: hidden;
background: white;
z-index: 100;
}
.preview-header {
.file-preview-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: calc(var(--spacing-unit) * 2);
border-bottom: 1px solid var(--border-color);
padding: 16px 24px;
border-bottom: 1px solid #ddd;
background: white;
}
.preview-info h3 {
margin: 0 0 calc(var(--spacing-unit) * 0.5) 0;
font-size: 1.25rem;
.file-preview-header .header-left {
display: flex;
align-items: center;
gap: 16px;
}
.preview-info p {
.preview-info {
display: flex;
flex-direction: column;
}
.preview-file-name {
margin: 0;
color: var(--text-color-light);
font-size: 0.875rem;
font-size: 18px;
font-weight: 600;
color: #333;
}
.preview-file-info {
margin: 4px 0 0 0;
color: #666;
font-size: 14px;
}
.preview-actions {
display: flex;
gap: calc(var(--spacing-unit) * 1);
}
.btn-icon {
background: none;
border: 1px solid var(--border-color);
padding: calc(var(--spacing-unit) * 1);
border-radius: 4px;
cursor: pointer;
font-size: 1.2rem;
transition: background 0.2s;
}
.btn-icon:hover {
background: var(--background-color);
gap: 8px;
}
.preview-content {
@@ -759,7 +820,7 @@ body.dark-mode {
align-items: center;
justify-content: center;
padding: calc(var(--spacing-unit) * 2);
background: #000;
background: #f9f9f9;
}
.preview-content img,
@@ -894,4 +955,18 @@ body.dark-mode {
top: var(--spacing-unit);
left: var(--spacing-unit);
z-index: 1;
width: 20px;
height: 20px;
cursor: pointer;
opacity: 0.3;
transition: opacity 0.2s ease;
}
.file-item .select-item:checked {
opacity: 1;
}
.file-item.selected {
border-color: var(--primary-color);
background-color: rgba(0, 51, 153, 0.05);
}