diff --git a/src/new/.env b/src/new/.env index 07a5174b1..4de9b9f50 100644 --- a/src/new/.env +++ b/src/new/.env @@ -32,3 +32,4 @@ JWT_PASSPHRASE=f7754c7a99638fe7162a144825ddaea7 LOCK_DSN=flock ###< symfony/lock ### +MAILER_DSN=smtp://smtp4dev:25 diff --git a/src/new/assets/tailwind/css/backend.css b/src/new/assets/tailwind/css/backend.css index f6c04a21b..2d9099e27 100644 --- a/src/new/assets/tailwind/css/backend.css +++ b/src/new/assets/tailwind/css/backend.css @@ -57,10 +57,10 @@ } .badge-yes { - @apply inline-flex rounded-sm bg-lime-500 px-2 py-1 text-sm font-medium text-white hover:bg-opacity-90 justify-center shadow-xl; + @apply inline-flex items-center rounded-full bg-lime-500 px-2 py-1 text-xs font-medium text-white hover:bg-opacity-90 justify-center shadow-xl; } .badge-no { - @apply inline-flex rounded-sm bg-orange-500 px-2 py-1 text-sm font-medium text-white hover:bg-opacity-90 justify-center shadow-xl; + @apply inline-flex items-center rounded-full bg-orange-500 px-2 py-1 text-xs font-medium text-white hover:bg-opacity-90 justify-center shadow-xl; } .table-icon, .button-icon { @@ -68,11 +68,11 @@ } .psc-button-save { - @apply inline-flex items-center justify-center py-1 gap-1 font-medium rounded-sm px-4 text-sm text-white shadow-lg bg-psc-500 hover:bg-psc-600 hover:ring-2 hover:ring-psc-500 hover:ring-offset-2 min-h-[2.25rem]; + @apply inline-flex items-center justify-center py-1 gap-2 font-medium rounded-md px-4 text-sm text-white shadow-lg bg-psc-500 hover:bg-psc-600 hover:ring-2 hover:ring-psc-500 hover:ring-offset-2 min-h-[2.25rem]; } .psc-button-secondary { - @apply inline-flex items-center justify-center py-1 gap-1 font-medium rounded-sm px-4 text-xs text-white shadow-lg bg-psc-500 hover:bg-psc-600 hover:ring-2 hover:ring-psc-500 hover:ring-offset-2 min-h-[1.8rem]; + @apply inline-flex items-center justify-center py-1 gap-2 font-medium rounded-md px-4 text-xs text-white shadow-lg bg-psc-500 hover:bg-psc-600 hover:ring-2 hover:ring-psc-500 hover:ring-offset-2 min-h-[1.8rem]; } .form-label { diff --git a/src/new/docs/design-system.md b/src/new/docs/design-system.md new file mode 100644 index 000000000..5df9eac2a --- /dev/null +++ b/src/new/docs/design-system.md @@ -0,0 +1,2478 @@ +# PrintshopCreator Design System + +**Version:** 1.0 +**Letzte Aktualisierung:** 2025-12-22 +**Status:** Living Document + +--- + +## Inhaltsverzeichnis + +1. [Einleitung](#einleitung) +2. [Architektur](#architektur) +3. [Farbsystem](#farbsystem) +4. [Typografie](#typografie) +5. [Spacing & Layout](#spacing--layout) +6. [Komponenten-Bibliothek](#komponenten-bibliothek) +7. [Layout-Patterns](#layout-patterns) +8. [Code-Standards](#code-standards) +9. [Barrierefreiheit](#barrierefreiheit) +10. [Migration Guide](#migration-guide) + +--- + +## Einleitung + +### Zweck + +Dieses Design System definiert die visuellen und funktionalen Standards für alle Module im PrintshopCreator Backend. Es gewährleistet: + +- **Konsistenz**: Einheitliches Erscheinungsbild über alle 32 Bundles hinweg +- **Effizienz**: Wiederverwendbare Komponenten reduzieren Entwicklungszeit +- **Wartbarkeit**: Zentrale Standards erleichtern Updates und Änderungen +- **User Experience**: Konsistente Interaktionsmuster verbessern die Benutzerfreundlichkeit + +### Zielgruppe + +- Frontend-Entwickler +- Backend-Entwickler (Symfony/Twig) +- UI/UX Designer +- Product Owner + +--- + +## Architektur + +### Tech Stack + +| Technologie | Version | Verwendung | +|------------|---------|------------| +| **Tailwind CSS** | 3.x | Primäres CSS-Framework | +| **Alpine.js** | 3.x | UI State Management | +| **Symfony** | 6.x | Backend Framework | +| **Twig** | 3.x | Template Engine | +| **Font Awesome** | 5.7.2 | Icon Library | + +### Framework-Strategie + +**Primär: Tailwind CSS** +- Alle neuen Komponenten und Module verwenden Tailwind CSS +- Utility-First Ansatz für maximale Flexibilität +- Custom PSC-Farbschema über Tailwind-Konfiguration + +**Legacy: Bootstrap 4/5** +- Wird schrittweise durch Tailwind ersetzt +- Keine neuen Bootstrap-Komponenten mehr erstellen +- Bestehende Bootstrap-Komponenten bei Änderungen zu Tailwind migrieren + +### Dateistruktur + +``` +templates/ +├── backend_tailwind_base.html.twig # Primäres Base-Template (verwenden!) +├── backend_base.html.twig # Legacy Bootstrap (nicht verwenden) +├── form_div_layout_tailwind.html.twig # Form Theme (verwenden!) +└── [bundle]/ + └── backend/ + ├── edit.html.twig + ├── list.html.twig + └── components/ + +assets/ +├── tailwind/ +│ ├── backend.css # Hauptstyles +│ └── login.css +└── backend/dashboard/ # Legacy (nicht verwenden) +``` + +--- + +## Farbsystem + +### Primäre Farbpalette + +#### PSC Brand Color + +```css +/* Primary Brand Color */ +--color-psc-50: #f0f9ff; +--color-psc-100: #e0f2fe; +--color-psc-200: #bae6fd; +--color-psc-300: #7dd3fc; +--color-psc-400: #38bdf8; +--color-psc-500: #0ea5e9; /* Haupt-Markenfarbe */ +--color-psc-600: #0284c7; +--color-psc-700: #0369a1; +--color-psc-800: #075985; +--color-psc-900: #0c4a6e; +``` + +**Tailwind-Klassen:** `bg-psc-500`, `text-psc-600`, `border-psc-400`, etc. + +#### Status-Farben + +```css +/* Success - Grün */ +--color-success: #10b981; /* bg-green-500 */ +--color-success-light: #d1fae5; /* bg-green-100 */ + +/* Warning - Orange/Gelb */ +--color-warning: #f59e0b; /* bg-orange-500 */ +--color-warning-light: #fef3c7; /* bg-orange-100 */ + +/* Error - Rot */ +--color-error: #ef4444; /* bg-red-500 */ +--color-error-light: #fee2e2; /* bg-red-100 */ + +/* Info - Blau */ +--color-info: #3b82f6; /* bg-blue-500 */ +--color-info-light: #dbeafe; /* bg-blue-100 */ +``` + +#### Neutrale Farben + +```css +/* Graustufen */ +--color-gray-50: #f9fafb; +--color-gray-100: #f3f4f6; +--color-gray-200: #e5e7eb; +--color-gray-300: #d1d5db; +--color-gray-500: #6b7280; +--color-gray-700: #374151; +--color-gray-900: #111827; +``` + +### Dark Mode + +```css +/* Dark Mode Variablen */ +dark:bg-boxdark /* #24303f */ +dark:bg-strokedark /* #2e3a47 */ +dark:text-bodydark /* #aeb7c0 */ +``` + +**Verwendung:** +```html +
+

Titel

+
+``` + +### Badge-Farben + +**WICHTIG: Für Ja/Nein-Anzeigen immer `badge-yes` und `badge-no` Klassen verwenden!** + +| Typ | Klasse | Farbe | Verwendung | +|-----|--------|-------|------------| +| **Ja / Aktiv** | `badge-yes` | Grün (`bg-lime-500` + weiß) | true, ja, aktiv, enabled | +| **Nein / Inaktiv** | `badge-no` | Orange (`bg-orange-500` + weiß) | false, nein, inaktiv, disabled | +| Info | - | `bg-blue-500` + `text-white` | Information, Hinweis | +| Draft | - | `bg-yellow-100` + `text-yellow-800` | Entwurf, In Bearbeitung | + +--- + +## Typografie + +### Schriftarten + +```css +/* System Font Stack */ +font-family: system-ui, -apple-system, BlinkMacSystemFont, + "Segoe UI", Roboto, "Helvetica Neue", Arial, + sans-serif; +``` + +**Tailwind-Klasse:** `font-sans` (Standard) + +### Schriftgrößen + +| Größe | Tailwind | Pixel | Verwendung | +|-------|----------|-------|------------| +| XS | `text-xs` | 12px | Labels, Badges, Hinweise | +| SM | `text-sm` | 14px | Body Text, Formulare | +| Base | `text-base` | 16px | Standard Body Text | +| LG | `text-lg` | 18px | Hervorgehobener Text | +| XL | `text-xl` | 20px | Überschriften (H3) | +| 2XL | `text-2xl` | 24px | Überschriften (H2) | +| 3XL | `text-3xl` | 30px | Seitentitel (H1) | + +### Schriftgewichte + +| Gewicht | Tailwind | Wert | Verwendung | +|---------|----------|------|------------| +| Normal | `font-normal` | 400 | Body Text | +| Medium | `font-medium` | 500 | Buttons, Labels | +| Semibold | `font-semibold` | 600 | Wichtige Labels | +| Bold | `font-bold` | 700 | Überschriften | + +### Typografie-Beispiele + +```html + +

+ Seitentitel +

+ + +

+ Abschnittstitel +

+ + + + + +

+ Beschreibungstext +

+``` + +--- + +## Spacing & Layout + +### Spacing-System + +Tailwind verwendet ein 4px-basiertes Spacing-System: + +| Wert | Pixel | Verwendung | +|------|-------|------------| +| `0.5` | 2px | Minimaler Abstand | +| `1` | 4px | Sehr enger Abstand | +| `2` | 8px | Enger Abstand | +| `4` | 16px | Standard Abstand | +| `6` | 24px | Mittlerer Abstand | +| `8` | 32px | Großer Abstand | +| `12` | 48px | Sehr großer Abstand | + +### Layout-Konstanten + +```css +/* Sidebar */ +--sidebar-width: 20rem; /* 320px */ +--collapsed-sidebar-width: 5.4rem; /* 86px */ + +/* Container */ +--max-content-width: 1280px; /* max-w-7xl */ +``` + +### Responsive Breakpoints + +```css +/* Tailwind Breakpoints */ +sm: 640px /* Tablet Portrait */ +md: 768px /* Tablet Landscape */ +lg: 1024px /* Desktop */ +xl: 1280px /* Large Desktop */ +2xl: 1536px /* Extra Large Desktop */ +``` + +### Grid-System + +```html + +
+
+ +
+
+ + +
+
+
+
+``` + +--- + +## Komponenten-Bibliothek + +### 1. Buttons + +**WICHTIG: Einheitliche Rundung - Alle interaktiven Elemente verwenden `rounded-md` (6px)** + +#### Primary Button (Haupt-Aktion) + +```html + +``` + +**Verwendung:** Primäre Aktionen (Speichern, Erstellen, Absenden) + +**CSS-Klasse:** `.psc-button-save` (bereits definiert in `backend.css`) + +#### Secondary Button + +```html + +``` + +**Verwendung:** Sekundäre Aktionen (Abbrechen, Zurück) + +#### Danger Button + +```html + +``` + +**Verwendung:** Destruktive Aktionen (Löschen, Entfernen) + +#### Text Button / Link + +```html + + Bearbeiten + +``` + +**Verwendung:** Tertäre Aktionen, Links + +#### Button-Gruppe + +```html +
+ + + +
+``` + +### 2. Cards + +#### Standard Card + +```html +
+ +
+

+ Card Titel +

+
+ + +
+

+ Card Content +

+
+ + +
+
+ + +
+
+
+``` + +#### Compact Card + +```html +
+

Titel

+

Content

+
+``` + +#### Dashboard Stat Card + +```html +
+
+
+

+ Statistik Name +

+ + 1,234 + +
+
+ +
+
+ + +12% seit letztem Monat + +
+``` + +### 3. Forms + +#### Text Input + +```html +
+ + +

Hilfetext (optional)

+
+``` + +#### Select / Dropdown + +```html +
+ + +
+``` + +#### Checkbox + +```html +
+ + +
+``` + +#### Toggle Switch + +```html + +``` + +#### Form Validation States + +```html + +
+ + +

+ + Dieses Feld ist erforderlich +

+
+ + +
+ + +

+ + Eingabe gültig +

+
+``` + +### 4. Tables + +#### Standard Datentabelle + +**WICHTIG: Neue verbesserte Table-Header Styles** + +**Design-Specs für Table-Header:** +- **Background:** `bg-slate-50` (heller als Body) / `dark:bg-gray-800` +- **Border:** `border-b-2 border-gray-200` (doppelte Stärke für Trennung) +- **Text:** `text-xs font-semibold text-gray-600 uppercase tracking-wider` +- **Padding:** `px-4 py-4` (mehr vertikales Padding als Body) +- **Font-Weight:** `font-semibold` (600) statt `font-medium` + +**Design-Specs für Table-Body:** +- **Border:** `border-t border-gray-100` (subtiler als Header) +- **Padding:** `px-4 py-3` (konsistent mit Header horizontal) +- **Hover:** `hover:bg-gray-50 dark:hover:bg-gray-800/50` +- **Transition:** `transition-colors` für smooth Hover-Effekte +- **Text:** `text-gray-900 dark:text-gray-100` für normale Zellen + +```html +
+ + + + + + + + + + + + + + + + + + +
+ + Name + + + + Status + + Aktionen +
+ Beispiel Name + + Aktiv + + +
+
+``` + +#### Responsive Table (Mobile-Friendly) + +```html +
+ + + + + + + + + + + +
+ Name: + Beispiel + + Status: + Aktiv +
+
+``` + +#### UID/ID Badges in Tabellen + +**Design für technische IDs/UIDs als klickbare Badges** + +```html + + + + + + + 123 + + +``` + +**Nicht-klickbare UID (falls kein Link benötigt):** +```html + + + + + + ABC-123 + + +``` + +**Design-Specs für UID/ID Badges:** +- **Font:** `font-mono` (Monospace für technische Werte) +- **Größe:** `text-xs` (12px) +- **Padding:** `px-2.5 py-1` +- **Rundung:** `rounded-md` (mittlere Rundung) +- **Icon:** Hash (#) Symbol, `w-3.5 h-3.5` +- **Hover:** PSC-Farbe bei Links +- **Border:** Subtiler Border für bessere Abgrenzung + +**In Twig:** +```twig +{# Klickbare UID #} + + + {{ item.id }} + +``` + +#### Tabellen-Aktionen mit Icons + +**WICHTIG: Einheitliche Aktions-Icon-Farben** + +Alle Aktions-Icons in Tabellen müssen folgende Farben verwenden: + +| Aktion | Farbe | Tailwind-Klasse | Verwendung | +|--------|-------|-----------------|------------| +| **Löschen** | Rot | `text-red-600` | Alle Delete/Remove-Aktionen | +| **Bearbeiten** | Grün | `text-green-600` | Alle Edit/Update-Aktionen | +| **Alle anderen** | Blau | `text-blue-600` | View, Download, Info, etc. | + +**Icon-Größe:** Alle Tabellen-Icons sollten die Klasse `table-icon` (entspricht `w-6`) verwenden. + +```html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +``` + +**Weitere Icon-Aktionen (alle BLAU):** +- Info/Hilfe: `text-blue-600` +- Kopieren/Duplizieren: `text-blue-600` +- Export: `text-blue-600` +- Drucken: `text-blue-600` +- Verschieben: `text-blue-600` +- Teilen: `text-blue-600` + +### 5. Badges & Tags + +#### Ja/Nein Status Badges + +**WICHTIG: Einheitliche Ja/Nein-Anzeige** + +Für Ja/Nein-Anzeigen (Boolean-Werte) in Tabellen und Listen müssen **immer** die vordefinierten Klassen verwendet werden: + +| Status | Klasse | Farbe | Verwendung | +|--------|--------|-------|------------| +| **Ja** | `badge-yes` | Grün (`bg-lime-500`) | true, aktiv, ja, enabled | +| **Nein** | `badge-no` | Orange (`bg-orange-500`) | false, inaktiv, nein, disabled | + +```html + +Ja + + + +Nein + +``` + +**In Twig Templates:** +```twig +{# Boolean-Wert anzeigen #} +{% if item.active %} + {{'yes'|trans}} +{% else %} + {{'no'|trans}} +{% endif %} + +{# In Tabellen #} + + {% if product.isPublished %} + Veröffentlicht + {% else %} + Entwurf + {% endif %} + +``` + +**CSS-Definition (bereits in `assets/tailwind/css/backend.css`):** +```css +.badge-yes { + @apply inline-flex items-center rounded-full bg-lime-500 px-2 py-1 + text-xs font-medium text-white hover:bg-opacity-90 + justify-center shadow-xl; +} + +.badge-no { + @apply inline-flex items-center rounded-full bg-orange-500 px-2 py-1 + text-xs font-medium text-white hover:bg-opacity-90 + justify-center shadow-xl; +} +``` + +**Design-Specs:** +- **Rundung:** `rounded-full` (vollständig abgerundet) +- **Schriftgröße:** `text-xs` (12px) +- **Padding:** `px-2 py-1` (horizontal 8px, vertikal 4px) +- **Font-Weight:** `font-medium` (500) + +#### Weitere Status Badges + +```html + + + Information + + + + + Warnung + + + + + Erfolgreich + + + + + Entwurf + + + + + Fehler + +``` + +**WICHTIG:** Alle Status-Badges verwenden: +- `rounded-full` für vollständige Rundung +- `text-xs` für einheitliche Schriftgröße (12px) +- `px-2 py-1` für konsistentes Padding + +#### Count Badge + +```html + +``` + +### 6. Alerts & Flash Messages + +#### Success Alert + +```html + +``` + +#### Error Alert + +```html + +``` + +#### Warning Alert + +```html + +``` + +#### Info Alert + +```html + +``` + +### 7. Modal / Dialog + +```html + + + + + +``` + +#### Alpine.js Modal (empfohlen) + +```html +
+ + + + +
+ + +
+ + +
+ + +
+ + +
+

Modal Titel

+
+ + +
+

+ Modal Content +

+
+ + +
+ + +
+ +
+
+
+
+``` + +### 8. Navigation + +#### Sidebar Navigation + +Siehe `backend_tailwind_base.html.twig` für vollständige Implementierung. + +**Key Features:** +- Collapsible mit Alpine.js +- Icons (Font Awesome) +- Active States +- Responsive (Mobile-Toggle) + +```html + +``` + +#### Breadcrumbs + +```html + +``` + +#### Tabs + +```html +
+ +
+ +
+ + +
+
+ +
+
+ +
+
+
+``` + +### 9. Pagination + +```html + +
+ + +
+ + Zurück + + + Weiter + +
+ + + + +
+``` + +### 10. Loading States + +#### Spinner + +```html + + + + + + + + + +``` + +#### Skeleton Loader + +```html +
+
+
+
+
+``` + +#### Progress Bar + +```html +
+
+
+``` + +### 11. Dropdowns + +```html +
+ + + + +
+ +
+
+``` + +### 12. Empty States + +```html +
+ + + +

+ Keine Einträge vorhanden +

+

+ Erstellen Sie Ihren ersten Eintrag, um loszulegen. +

+
+ +
+
+``` + +--- + +## Layout-Patterns + +### Standard-Seitenlayout + +```twig +{# templates/your-bundle/backend/list.html.twig #} +{% extends 'backend_tailwind_base.html.twig' %} + +{% block title %}Seitentitel{% endblock %} + +{% block body %} +
+ + {# Page Header #} +
+

+ Seitentitel +

+ +
+ + {# Flash Messages #} + {% for label, messages in app.flashes %} + {% for message in messages %} +
+ {{ message }} +
+ {% endfor %} + {% endfor %} + + {# Main Content #} +
+
+ {# Your content here #} +
+
+ +
+{% endblock %} +``` + +### Liste-Seite (CRUD List) + +```twig +{% extends 'backend_tailwind_base.html.twig' %} + +{% block body %} +
+ + {# Header mit Search & Filters #} +
+
+

{{ title }}

+ + Neu erstellen + +
+ + {# Search & Filters #} +
+
+ +
+ +
+
+ + {# Table Card #} +
+
+ + + + + + + + + + {% for item in pagination %} + + + + + + {% else %} + + + + {% endfor %} + +
+ {{ knp_pagination_sortable(pagination, 'Name', 'name') }} + + Status + + Aktionen +
+ {{ item.name }} + + {% if item.active %} + Aktiv + {% else %} + Inaktiv + {% endif %} + + + Bearbeiten + + + Löschen + +
+ Keine Einträge vorhanden +
+
+ + {# Pagination #} + {{ knp_pagination_render(pagination, 'tailwind_pagination.html.twig') }} +
+ +
+{% endblock %} +``` + +### Edit/Create-Seite (CRUD Form) + +**WICHTIG: Verwende immer das vertikale Tab-Layout für Edit/Create-Seiten mit mehreren Sektionen!** + +#### Standard Edit-Seite mit vertikalen Tabs + +```twig +{% extends 'backend_tailwind_base.html.twig' %} +{% form_theme form 'tailwind_formtheme.html.twig' %} + +{% block header %} +
+

+ + Module Name Bearbeiten +

+
+
+ + + + + Zurück + +
+{% endblock %} + +{% block body %} +
+ {{ form_start(form, {attr: {class: ''}}) }} + + {# Vertikales Tab-Layout #} +
+ + {# Tab Navigation - Links (2/12) #} + + + {# Content Area - Rechts (10/12) #} +
+ + {# General Tab #} +
+
Allgemein
+ + {# Felder in 3er-Gruppen (4/12 Breite) #} +
+
+ {{ form_row(form.title) }} +
+
+ {{ form_row(form.position) }} +
+
+ {{ form_row(form.active) }} +
+
+ + {# Felder in 2er-Gruppen (6/12 Breite) #} +
+
+ {{ form_row(form.startDate) }} +
+
+ {{ form_row(form.endDate) }} +
+
+ + {# Einzelnes Feld (volle Breite) #} +
+
+ {{ form_row(form.description) }} +
+
+
+ + {# Settings Tab #} + + +
+
+ + {# Save Button außerhalb der Card #} +
+ {{ form_widget(form.save, { + attr: { + class: 'inline-flex items-center justify-center py-1 gap-1 font-medium rounded-md px-4 text-sm text-white shadow-lg bg-psc-500 hover:bg-psc-600 hover:ring-2 hover:ring-psc-500 hover:ring-offset-2 min-h-[2.25rem]' + } + }) }} +
+ + {{ form_end(form) }} + + {# Changes History (nur bei Edit, nicht bei Create) #} +
+

Änderungen

+
+
+
+

Datum

+
+
+

Benutzer

+
+
+

Änderungen

+
+
+ {% for change in changes %} +
+
{{ change.created|date('H:i:s d.m.Y') }}
+
{{ change.username }}
+
+ {% for key, set in change.changeset %} + {% if set|length > 1 and set[1] is not iterable %} + {{ key }} {{ set[0] }} {% if set[1] is null %}0{% else %}{{ set[1] }}{% endif %}
+ {% endif %} + {% endfor %} +
+
+ {% endfor %} +
+
+
+{% endblock %} +``` + +#### Design-Specs für Edit/Create-Seiten + +**Header:** +- **Titel:** Links mit Icon, Format: `Module Name Aktion` +- **Zurück-Button:** Rechts, **IMMER Grau** (`bg-gray-500`), nie PSC-Farbe +- **Icon:** Entsprechend dem Modul (Payment, CMS, etc.) + +**Vertikale Tab-Navigation:** +- **Breite:** `w-full md:w-2/12` (2 von 12 Spalten auf Desktop) +- **Position:** Links +- **Indikator:** Blaue Linie links (`w-1 bg-psc-500`) +- **Tab-Links:** Mit Icons, `px-4 py-2`, aktiver Tab: `class="active"` +- **Rundung:** `rounded-md` + +**Content-Bereich:** +- **Breite:** Volle Breite minus Tab-Navigation +- **Card:** `rounded-md border bg-white p-5 shadow-lg` +- **Tab-Content:** Erstes Tab `class="block"`, andere `class="hidden"` +- **Überschrift:** `text-sm mt-3 mb-6 font-bold uppercase` + +**Feld-Layout (Flex-Wrap System):** +```html +{# 3 Felder nebeneinander (Desktop) #} +
+
+ {{ form_row(form.field1) }} +
+
+ {{ form_row(form.field2) }} +
+
+ {{ form_row(form.field3) }} +
+
+ +{# 2 Felder nebeneinander (Desktop) #} +
+
+ {{ form_row(form.field1) }} +
+
+ {{ form_row(form.field2) }} +
+
+ +{# 1 Feld (volle Breite) #} +
+
+ {{ form_row(form.description) }} +
+
+``` + +**WICHTIG: Grid vs. Flex-Wrap:** +- ❌ **NICHT verwenden:** `grid grid-cols-1 md:grid-cols-2 gap-6` +- ✅ **Verwenden:** `flex flex-wrap` mit `w-full lg:w-4/12 px-4` + +**Save-Button:** +- **Position:** Außerhalb der Card, rechts (`text-end my-2`) +- **Farbe:** PSC-Orange (`bg-psc-500`) +- **Rundung:** `rounded-md` +- **WICHTIG:** Verwende `{{ form_widget(form.save, {attr: {...}}) }}` statt manuellem ` +``` + +**Schlecht (Custom CSS vermeiden):** +```html + + +``` + +#### 2. Wiederverwendbare Komponenten via @apply + +Nur für häufig genutzte Pattern in `assets/tailwind/backend.css`: + +```css +/* Gut: Wiederverwendbare Button-Klasse */ +.psc-button-save { + @apply inline-flex items-center justify-center gap-2 px-4 py-2 + text-sm font-medium text-white + bg-psc-500 hover:bg-psc-600 + rounded-sm shadow-lg + hover:ring-2 hover:ring-psc-500 hover:ring-offset-1 + transition-all duration-200; +} + +/* Gut: Wiederverwendbare Badge-Klasse */ +.badge-yes { + @apply inline-flex items-center px-2 py-1 rounded-sm + text-xs font-medium bg-lime-500 text-white; +} +``` + +**Verwendung:** +```html + +Aktiv +``` + +#### 3. Responsive Design + +Mobile-First Ansatz verwenden: + +```html + +
+ +
+ + +
+ +
+``` + +#### 4. Dark Mode Konsistenz + +Immer Dark Mode Varianten hinzufügen: + +```html +
+ Content +
+``` + +### Twig Template Richtlinien + +#### 1. Base Template Verwendung + +**Immer verwenden:** +```twig +{% extends 'backend_tailwind_base.html.twig' %} +``` + +**Nie verwenden:** +```twig +{% extends 'backend_base.html.twig' %} {# Legacy Bootstrap #} +``` + +#### 2. Block-Struktur + +```twig +{% extends 'backend_tailwind_base.html.twig' %} + +{% block title %}Seitentitel{% endblock %} + +{% block body %} + {# Hauptinhalt #} +{% endblock %} + +{% block javascripts %} + {{ parent() }} + {# Zusätzliche Scripts #} +{% endblock %} +``` + +#### 3. Form Theme + +```twig +{% form_theme form 'form_div_layout_tailwind.html.twig' %} +``` + +#### 4. Naming Conventions + +**Routen:** +```yaml +# Gut: Konsistentes Naming +psc_product_list: + path: /products + +psc_product_create: + path: /products/create + +psc_product_edit: + path: /products/{id}/edit + +psc_product_delete: + path: /products/{id}/delete +``` + +**Templates:** +``` +templates/ + product/ + backend/ + list.html.twig + edit.html.twig + _form.html.twig # Partial +``` + +### Alpine.js Richtlinien + +#### 1. State Management + +**Globaler Store (in Base Template):** +```javascript +Alpine.store('sideBar', { + isOpen: true, + toggle() { + this.isOpen = !this.isOpen + } +}) +``` + +**Lokaler State:** +```html +
+ +
+``` + +#### 2. Event Handling + +```html + + + + +
Menu
+ + + +``` + +#### 3. Transitions + +Immer Tailwind-kompatible Transitions: + +```html +
+ Content +
+``` + +### Icon-Verwendung + +#### Font Awesome + +**Standard-Größen:** +```html + + + + + + + + +``` + +**Mit Tailwind:** +```html + +``` + +**Häufig verwendete Icons:** +- `fa-plus` - Erstellen/Hinzufügen +- `fa-edit` - Bearbeiten +- `fa-trash` - Löschen +- `fa-save` - Speichern +- `fa-times` - Schließen/Abbrechen +- `fa-check` - Bestätigen/Erfolg +- `fa-exclamation-triangle` - Warnung +- `fa-info-circle` - Information +- `fa-search` - Suchen +- `fa-filter` - Filtern +- `fa-cog` - Einstellungen +- `fa-user` - Benutzer +- `fa-chevron-down` - Dropdown +- `fa-chevron-right` - Pfeil/Navigation + +### CSS Klassen-Organisation + +**Reihenfolge der Utility-Klassen:** +```html +
+ Content +
+``` + +--- + +## Barrierefreiheit + +### ARIA Labels + +```html + + + + + + + + + +``` + +### Keyboard Navigation + +```html + + + + + + Zum Hauptinhalt springen + +``` + +### Focus States + +Immer sichtbare Focus States: + +```html + + + +``` + +### Screen Reader Only + +```html +Nur für Screen Reader +``` + +--- + +## Migration Guide + +### Von Bootstrap zu Tailwind + +#### Button-Migration + +**Vorher (Bootstrap):** +```html + +``` + +**Nachher (Tailwind):** +```html + +``` + +#### Card-Migration + +**Vorher (Bootstrap):** +```html +
+
Titel
+
Content
+
+``` + +**Nachher (Tailwind):** +```html +
+
+

Titel

+
+
+ Content +
+
+``` + +#### Form-Migration + +**Vorher (Bootstrap):** +```html +
+ + +
+``` + +**Nachher (Tailwind):** +```html +
+ + +
+``` + +### Checkliste für neue Module + +- [ ] Verwendet `backend_tailwind_base.html.twig` als Base-Template +- [ ] Form Theme auf `form_div_layout_tailwind.html.twig` gesetzt +- [ ] Alle Komponenten verwenden Tailwind CSS (kein Bootstrap) +- [ ] Dark Mode Support implementiert (`dark:` Varianten) +- [ ] Responsive Design implementiert (Mobile-First) +- [ ] Wiederverwendbare PSC-Button-Klassen verwendet +- [ ] Standard Badge-Klassen für Status verwendet +- [ ] Icons mit konsistenten Größen (w-4, w-5, w-6) +- [ ] Spacing konsistent mit Tailwind-System (px-7.5, py-6, etc.) +- [ ] Alpine.js für interaktive Komponenten verwendet +- [ ] ARIA-Labels für Barrierefreiheit hinzugefügt +- [ ] Focus States sichtbar und konsistent +- [ ] KnpPagination mit Tailwind-Theme + +--- + +## Best Practices + +### Performance + +1. **Lazy Loading für Bilder:** +```html + +``` + +2. **Alpine.js x-cloak:** +```html +
+ +
+``` + +3. **Minimize DOM Queries:** +```javascript +// Gut: State in Alpine.js +
+ +
+ +// Schlecht: jQuery DOM Manipulation +$('#count').text(count); +``` + +### Security + +1. **XSS Prevention in Twig:** +```twig +{# Gut: Auto-escaped #} +{{ user.name }} + +{# Vorsicht: Raw HTML #} +{{ content|raw }} {# Nur für vertrauenswürdigen Content! #} +``` + +2. **CSRF Protection:** +```twig +{{ form_start(form) }} {# CSRF Token automatisch inkludiert #} +``` + +3. **SQL Injection Prevention:** +```php +// Gut: Doctrine QueryBuilder +$qb->where('u.email = :email') + ->setParameter('email', $email); +``` + +### Maintenance + +1. **Kommentare für komplexe Logik:** +```html +{# Complex Alpine.js state management - do not modify without testing #} +
+``` + +2. **TODO-Kommentare:** +```twig +{# TODO: Migrate to Tailwind pagination once KnpPaginator theme is ready #} +{{ knp_pagination_render(pagination) }} +``` + +3. **Deprecation Warnings:** +```twig +{# @deprecated Use backend_tailwind_base.html.twig instead #} +{% extends 'backend_base.html.twig' %} +``` + +--- + +## Ressourcen + +### Dokumentation + +- **Tailwind CSS:** https://tailwindcss.com/docs +- **Alpine.js:** https://alpinejs.dev +- **Symfony Twig:** https://twig.symfony.com +- **Font Awesome:** https://fontawesome.com/v5/search + +### Tools + +- **Tailwind CSS IntelliSense** (VS Code Extension) +- **Alpine.js DevTools** (Browser Extension) +- **Symfony Toolbar** (Development) + +### Weitere Module/Bundles + +- **KnpMenuBundle:** Navigation-Generierung +- **KnpPaginatorBundle:** Pagination +- **LiipImagineBundle:** Image Processing + +--- + +## Changelog + +| Version | Datum | Änderungen | +|---------|-------|------------| +| 1.0 | 2025-12-22 | Initiales Design System basierend auf Codebase-Analyse | + +--- + +## Kontakt & Feedback + +Für Fragen, Vorschläge oder Verbesserungen zum Design System bitte ein Issue im Projekt-Repository erstellen oder das Entwicklungsteam kontaktieren. + +--- + +**Hinweis:** Dieses Dokument ist ein "Living Document" und wird kontinuierlich aktualisiert, wenn neue Komponenten hinzugefügt oder bestehende Patterns verbessert werden. diff --git a/src/new/src/PSC/Shop/OrderBundle/Resources/views/backend/list/index.html.twig b/src/new/src/PSC/Shop/OrderBundle/Resources/views/backend/list/index.html.twig index 2d1586c6e..cc7e3645c 100755 --- a/src/new/src/PSC/Shop/OrderBundle/Resources/views/backend/list/index.html.twig +++ b/src/new/src/PSC/Shop/OrderBundle/Resources/views/backend/list/index.html.twig @@ -85,16 +85,16 @@ {{ orderObj.getTypeAsString() }} {% if orderObj.isDraft() %} - {{'yes'|trans}} + {{'yes'|trans}} {% else %} - {{'no'|trans}} + {{'no'|trans}} {% endif %} {% if order.contact.virtual %} - {{'yes'|trans}} + {{'yes'|trans}} {% else %} - {{'no'|trans}} + {{'no'|trans}} {% endif %} {{ order.alias }} diff --git a/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/create.html.twig b/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/create.html.twig index 2e0ea2d20..a9dd291c0 100755 --- a/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/create.html.twig +++ b/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/create.html.twig @@ -1,204 +1,184 @@ -{% extends 'backend_base.html.twig' %} +{% extends 'backend_tailwind_base.html.twig' %} +{% form_theme form 'tailwind_formtheme.html.twig' %} {% trans_default_domain 'core_payment_edit' %} -{% block body %} -
-
-
-

- - {{'paymentmethod'|trans}} > - {{'create'|trans}} -

+{% block header %} +
+

+ + + + {{'paymentmethod'|trans}} {{'create'|trans}} +

+
+ +{% endblock %} + +{% block body %} +
+ {{ form_start(form, {attr: {class: ''}}) }} + +
+ {# Vertical Tab Navigation #} + + + {# Tab Content Area #} +
+ + {# General Tab #} +
+
{{'General'|trans}}
+ +
+
+ {{ form_row(form.title) }} +
+
+ {{ form_row(form.pos) }} +
+
+ {{ form_row(form.enable) }} +
+
+ +
+
+ {{ form_row(form.private) }} +
+
+ {{ form_row(form.price) }} +
+
+ {{ form_row(form.taxClass) }} +
+
+ +
+
+ {{ form_row(form.percent) }} +
+
+ {{ form_row(form.priceFrom) }} +
+
+ {{ form_row(form.priceTo) }} +
+
+ +
+
+ {{ form_row(form.trustedShopName) }} +
+
+ +
+
+ {{ form_row(form.description) }} +

+ {{ "paymentTermsExample"|trans}} +

+
+
+ +
+
+ {{ form_row(form.paymentTerms) }} +
+
-
- {{'back'|trans}} + + {# Filter Tab #} + + + {# Gateway Tab #} + + + {# Custom Tabs #} + {% for customGroup in customGroups %} + + {% endfor %}
-
- {{ form_start(form, { 'attr': {'class': ''}}) }} -
-
-

{{ payment.title }}

-
-
-
-
- -
-
-
-
-
-
-
- -
- {{ form_widget(form.title) }} -
-
-
-
-
- -
- {{ form_widget(form.pos) }} -
-
-
-
- {{ form_widget(form.enable) }} -
-
- {{ form_widget(form.private) }} -
-
-
-
-
- -
- {{ form_widget(form.price) }} -
-
-
-
-
- -
- {{ form_widget(form.taxClass) }} -
-
-
-
- {{ form_widget(form.percent) }} -
-
-
-
-
- -
- {{ form_widget(form.priceFrom) }} -
-
-
-
-
- -
- {{ form_widget(form.priceTo) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.trustedShopName) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.description) }} -

- {{ "paymentTermsExample"|trans}} -

-
-
-
-
-
-
-
- -
- {{ form_widget(form.paymentTerms) }} -
-
-
-
-
-
-
-
-
- -
- {{ form_widget(form.shippings) }} -
-
-
-
-
- -
- {{ form_widget(form.countrys) }} -
-
-
-
-
-
-
-
-
- -
- {{ form_widget(form.paymentGateway) }} -
-
-
-
-
- {% for customGroup in customGroups %} -
- {% for customField in customFields %} - {% if customField.group == customGroup.id and customField.getTemplate %} - {{ include(customField.getTemplate, { 'form': form }) }} - {% endif %} - {% endfor %} -
- {% endfor %} -
-
-
-
-
- -
-
-
-
- {{ form_widget(form.save, {attr: {class: 'btn btn-primary btn-sm'}}) }} -
-
-
-
- {{ form_end(form) }} + {# Save Button outside Card #} +
+ {{ form_widget(form.save, { + attr: { + class: 'inline-flex items-center justify-center py-1 gap-1 font-medium rounded-md px-4 text-sm text-white shadow-lg bg-psc-500 hover:bg-psc-600 hover:ring-2 hover:ring-psc-500 hover:ring-offset-2 min-h-[2.25rem]' + } + }) }}
+ + {{ form_end(form) }} +
{% endblock %} diff --git a/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/delete.html.twig b/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/delete.html.twig index a5dbb1ec0..61cccfebb 100755 --- a/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/delete.html.twig +++ b/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/delete.html.twig @@ -1,39 +1,91 @@ -{% extends 'backend_base.html.twig' %} +{% extends 'backend_tailwind_base.html.twig' %} +{% form_theme form 'form_div_layout_tailwind.html.twig' %} {% trans_default_domain 'core_payment_delete' %} + +{% block header %} +
+

+ + + + {{'paymentmethods'|trans}} {{'del'|trans}} +

+
+ +{% endblock %} + {% block body %} -
-
-
-

- - {{'paymentmethods'|trans}} > - {{'del'|trans}} +
+ + {# Delete Confirmation Card #} +
+ + {# Card Header #} +
+
+ + + +

+ {{'Delpaymentmethod'|trans}}?

-
-
-
-
-

{{'Delpaymentmethod'|trans}}?

-
-
+ {# Card Body #} +
+
+

+ {{'Are you sure you want to delete this payment method'|trans}}? +

-
{{ payment.title }}
+
+
+ {{ payment.title }} +
+
- {{ form_start(form, { 'attr': {'class': ''}}) }} -
- -
- {{ form_widget(form.yes, {attr: {class: 'btn btn-lg btn-warning btn-sm'}}) }} -
-
- {{ form_widget(form.no, {attr: {class: 'btn btn-lg btn-primary btn-sm'}}) }} +
+
+ + + +

+ {{'This action cannot be undone'|trans}}. +

- {{ form_end(form) }}
+ + {# Card Footer with Actions #} +
+ {{ form_start(form) }} +
+ {{ form_widget(form.no, { + attr: { + class: 'inline-flex items-center justify-center py-2 gap-2 font-medium rounded-md px-4 text-sm text-psc-600 border border-psc-500 bg-white hover:bg-gray-50 hover:ring-2 hover:ring-psc-500 hover:ring-offset-1 shadow-sm' + }, + label: 'no'|trans + }) }} + {{ form_widget(form.yes, { + attr: { + class: 'inline-flex items-center justify-center py-2 gap-2 font-medium rounded-md px-4 text-sm text-white shadow-lg bg-red-500 hover:bg-red-600 hover:ring-2 hover:ring-red-500 hover:ring-offset-1' + }, + label: 'yes'|trans + }) }} +
+ {{ form_end(form) }} +
+
-{% endblock %} \ No newline at end of file + +
+{% endblock %} diff --git a/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/edit.html.twig b/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/edit.html.twig index a75104033..febdecbec 100755 --- a/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/edit.html.twig +++ b/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/edit/edit.html.twig @@ -1,228 +1,215 @@ -{% extends 'backend_base.html.twig' %} +{% extends 'backend_tailwind_base.html.twig' %} +{% form_theme form 'tailwind_formtheme.html.twig' %} {% trans_default_domain 'core_payment_edit' %} + +{% block header %} +
+

+ + + + {{'paymentmethod'|trans}} {{'settings'|trans}} +

+
+ +{% endblock %} + {% block body %} +
+ {{ form_start(form, {attr: {class: ''}}) }} -
-
-
-

- - {{'paymentmethod'|trans}} > - {{'settings'|trans}} -

+
+ {# Vertical Tab Navigation #} + + + {# Tab Content Area #} +
+ + {# General Tab #} +
+
{{'General'|trans}}
+ +
+
+ {{ form_row(form.title) }} +
+
+ {{ form_row(form.pos) }} +
+
+ {{ form_row(form.enable) }} +
+
+ +
+
+ {{ form_row(form.private) }} +
+
+ {{ form_row(form.price) }} +
+
+ {{ form_row(form.taxClass) }} +
+
+ +
+
+ {{ form_row(form.percent) }} +
+
+ {{ form_row(form.priceFrom) }} +
+
+ {{ form_row(form.priceTo) }} +
+
+ +
+
+ {{ form_row(form.trustedShopName) }} +
+
+ +
+
+ {{ form_row(form.description) }} +
+
+ +
+
+ {{ form_row(form.paymentTerms) }} +

+ {{ "paymentTermsExample"|trans}} +

+
+
-
- {{'back'|trans}} + + {# Filter Tab #} + + + {# Gateway Tab #} + + + {# Custom Tabs #} + {% for customGroup in customGroups %} + + {% endfor %}
-
- {{ form_start(form, { 'attr': {'class': ''}}) }} -
-
-

{{ payment.title }}

-
-
-
-
- -
-
-
-
-
-
-
- -
- {{ form_widget(form.title) }} -
-
-
-
-
- -
- {{ form_widget(form.pos) }} -
-
-
-
- {{ form_widget(form.enable) }} -
-
- {{ form_widget(form.private) }} -
-
-
-
-
- -
- {{ form_widget(form.price) }} -
-
-
-
-
- -
- {{ form_widget(form.taxClass) }} -
-
-
-
- {{ form_widget(form.percent) }} -
-
-
-
-
- -
- {{ form_widget(form.priceFrom) }} -
-
-
-
-
- -
- {{ form_widget(form.priceTo) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.trustedShopName) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.description) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.paymentTerms) }} -

- {{ "paymentTermsExample"|trans}} -

-
-
-
-
-
-
-
-
-
- -
- {{ form_widget(form.shippings) }} -
-
-
-
-
- -
- {{ form_widget(form.countrys) }} -
-
-
-
-
-
-
-
-
- -
- {{ form_widget(form.paymentGateway) }} -
-
-
-
-
- {% for customGroup in customGroups %} -
- {% for customField in customFields %} - {% if customField.group == customGroup.id and customField.getTemplate %} - {{ include(customField.getTemplate, { 'form': form }) }} - {% endif %} - {% endfor %} -
- {% endfor %} -
-
-
-
-
+ {# Save Button outside Card #} +
+ {{ form_widget(form.save, { + attr: { + class: 'inline-flex items-center justify-center py-1 gap-1 font-medium rounded-md px-4 text-sm text-white shadow-lg bg-psc-500 hover:bg-psc-600 hover:ring-2 hover:ring-psc-500 hover:ring-offset-2 min-h-[2.25rem]' + } + }) }} +
-
-
-
-
- {{ form_widget(form.save, {attr: {class: 'btn btn-primary btn-sm'}}) }} -
-
+ {{ form_end(form) }} + + {# Changes History Card #} +
+

{{ 'Changes'|trans }}

+
+
+
+

{{ 'Date'|trans }}

+
+
+

{{ 'Username'|trans }}

+
+
+

{{ 'Changes'|trans }}

- {{ form_end(form) }} - -
-
-

{{ 'Changes'|trans }}

-
-
- - - - - - {% for change in changes %} - + {% for change in changes %} +
+
{{ change.created|date('H:i:s d.m.Y') }}
+
{{ change.username }}
+
+ {% for key, set in change.changeset %} + {% if set|length > 1 and set[1] is not iterable %} + {{ key }} {{ set[0] }} {% if set[1] is null %}0{% else %}{{ set[1] }}{% endif %}
+ {% endif %} {% endfor %} -
-
{{ 'Date'|trans }}{{ 'Username'|trans }}{{'Changes'|trans}}
{{ change.created|date('H:i:s d.m.Y') }}{{ change.username }} - {% for key,set in change.changeset %} - {% if set[1] is not iterable %} - {{key}} {{ set[0]}}{% if set[1] is null %}0{% else %}{{ set[1] }}{% endif %}
- {% endif %} - {% endfor %} -
-
+
+
+ {% endfor %}
- {% endblock %} +
+{% endblock %} diff --git a/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/list/index.html.twig b/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/list/index.html.twig index beb9400a3..ea1eef44c 100755 --- a/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/list/index.html.twig +++ b/src/new/src/PSC/Shop/PaymentBundle/Resources/views/backend/list/index.html.twig @@ -12,8 +12,8 @@

- - + + {{'Addpaymentmethod'|trans}} @@ -24,42 +24,64 @@ {% block body %}
-
+
- - - - - - - - + + + + + + + + {% for payment in pagination %} - - - + + - - - - + + +
{{ knp_pagination_sortable(pagination, 'Uid'|trans, 'payment.uid') }}{{ knp_pagination_sortable(pagination, 'active'|trans, 'payment.enable') }}{{ knp_pagination_sortable(pagination, 'Pos'|trans, 'payment.pos') }}{{ knp_pagination_sortable(pagination, 'Name'|trans, 'payment.title') }}{{ knp_pagination_sortable(pagination, 'cost'|trans, 'payment.price') }}Aktionen
+ {{ knp_pagination_sortable(pagination, 'Uid'|trans, 'payment.uid') }} + + {{ knp_pagination_sortable(pagination, 'active'|trans, 'payment.enable') }} + + {{ knp_pagination_sortable(pagination, 'Pos'|trans, 'payment.pos') }} + + {{ knp_pagination_sortable(pagination, 'Name'|trans, 'payment.title') }} + + {{ knp_pagination_sortable(pagination, 'cost'|trans, 'payment.price') }} + + Aktionen +
{{ payment.uid }} +
+ + + + + {{ payment.uid }} + + {% if payment.enable %} -
{{'yes'|trans}}
+ {{'yes'|trans}} {% else %} -
{{'no'|trans}}
+ {{'no'|trans}} {% endif %}
{{ payment.pos }}{{ payment.title }}{{ payment.price|number_format(2, ',', '.') }}€ + {{ payment.pos }}{{ payment.title }}{{ payment.price|number_format(2, ',', '.') }}€
- - + + + - - + + + diff --git a/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/create.html.twig b/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/create.html.twig index 8811365c8..eee0294ba 100755 --- a/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/create.html.twig +++ b/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/create.html.twig @@ -1,211 +1,194 @@ -{% extends 'backend_base.html.twig' %} +{% extends 'backend_tailwind_base.html.twig' %} +{% form_theme form 'tailwind_formtheme.html.twig' %} {% trans_default_domain 'core_shipping_edit' %} -{% block body %} -
-
-
-

- - {{'shippingmethods'|trans}} > - {{'create'|trans}} -

+{% block header %} +
+

+ + + + {{'shippingmethods'|trans}} {{'create'|trans}} +

+
+
+{% endblock %} + +{% block body %} +
+ {{ form_start(form, {attr: {class: ''}}) }} + +
+ {# Vertical Tab Navigation #} + + + {# Tab Content Area #} +
+ + {# General Tab #} +
+
{{'General'|trans}}
+ +
+
+ {{ form_row(form.title) }} +
+
+ {{ form_row(form.pos) }} +
+
+
+
{{ form_row(form.enable) }}
+
{{ form_row(form.private) }}
+
{{ form_row(form.noPayment) }}
+
+
+
+ +
+
+ {{ form_row(form.taxClass) }} +
+
+ {{ form_row(form.price) }} +
+
+ {{ form_row(form.pricePercent) }} +
+
+ +
+
+ {{ form_row(form.weightFrom) }} +
+
+ {{ form_row(form.weightTo) }} +
+
+ {{ form_row(form.mode) }} +
+
+ +
+
+ {{ form_row(form.priceFrom) }} +
+
+ {{ form_row(form.priceTo) }} +
+
+ +
+
+ {{ form_row(form.description) }} +
+
-
- {{'back'|trans}} + + {# Parameter Tab #} + + + {# Matrix Tab #} + + + {# Filter Tab #} + + + {# Custom Tabs #} + {% for customGroup in customGroups %} + + {% endfor %}
-
- {{ form_start(form, { 'attr': {'class': ''}}) }} -
-
-

{{ shipping.title }}

-
-
-
-
- -
-
-
-
-
-
-
- -
- {{ form_widget(form.title) }} -
-
-
-
-
- -
- {{ form_widget(form.pos) }} -
-
-
-
-
-
{{ form_widget(form.enable) }}
-
{{ form_widget(form.private) }}
-
{{ form_widget(form.noPayment) }}
-
-
-
-
-
-
- -
- {{ form_widget(form.taxClass) }} -
-
-
-
-
- -
- {{ form_widget(form.price) }} -
-
-
-
-
- -
- {{ form_widget(form.pricePercent) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.weightFrom) }} -
-
-
-
-
- -
- {{ form_widget(form.weightTo) }} -
-
-
-
-
- -
- {{ form_widget(form.mode) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.priceFrom) }} -
-
-
-
-
- -
- {{ form_widget(form.priceTo) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.description) }} -
-
-
-
-
-
-
-
-
- -
- {{ form_widget(form.parameter1) }} -
-
-
-
-
-
-
-
-
- -
- {{ form_widget(form.countrys) }} -
-
-
-
-
-
- {{ form_widget(form.matrix) }} -
- {% for customGroup in customGroups %} -
- {% for customField in customFields %} - {% if customField.group == customGroup.id and customField.getTemplate %} - {{ include(customField.getTemplate, { 'form': form }) }} - {% endif %} - {% endfor %} -
- {% endfor %} -
-
-
-
-
- -
-
-
-
- {{ form_widget(form.save, {attr: {class: 'btn btn-primary btn-sm'}}) }} -
-
-
-
- {{ form_end(form) }} + {# Save Button outside Card #} +
+ {{ form_widget(form.save, { + attr: { + class: 'inline-flex items-center justify-center py-1 gap-1 font-medium rounded-md px-4 text-sm text-white shadow-lg bg-psc-500 hover:bg-psc-600 hover:ring-2 hover:ring-psc-500 hover:ring-offset-2 min-h-[2.25rem]' + } + }) }}
-{% endblock %} \ No newline at end of file + + {{ form_end(form) }} +
+{% endblock %} diff --git a/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/delete.html.twig b/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/delete.html.twig index 83dddec14..462736001 100755 --- a/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/delete.html.twig +++ b/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/delete.html.twig @@ -1,40 +1,91 @@ -{% extends 'backend_base.html.twig' %} +{% extends 'backend_tailwind_base.html.twig' %} +{% form_theme form 'form_div_layout_tailwind.html.twig' %} {% trans_default_domain 'core_shipping_delete' %} + +{% block header %} +
+

+ + + + {{'shippingmethods'|trans}} {{'del'|trans}} +

+
+ +{% endblock %} + {% block body %} -
-
-
-

- - {{'shippingmethods'|trans}} > - {{'del'|trans}} +
+ + {# Delete Confirmation Card #} +
+ + {# Card Header #} +
+
+ + + +

+ {{'Delshippingmethod'|trans}}?

-
-
-
-
-

{{'Delshippingmethod'|trans}}

-
-
+ {# Card Body #} +
+
+

+ {{'Are you sure you want to delete this shipping method'|trans}}? +

-
{{ shipping.title }}
+
+
+ {{ shipping.title }} +
+
- - {{ form_start(form, { 'attr': {'class': ''}}) }} -
- -
- {{ form_widget(form.yes, {attr: {class: 'btn btn-lg btn-warning btn-sm'}}) }} -
-
- {{ form_widget(form.no, {attr: {class: 'btn btn-lg btn-primary btn-sm'}}) }} +
+
+ + + +

+ {{'This action cannot be undone'|trans}}. +

- {{ form_end(form) }}
+ + {# Card Footer with Actions #} +
+ {{ form_start(form) }} +
+ {{ form_widget(form.no, { + attr: { + class: 'inline-flex items-center justify-center py-2 gap-2 font-medium rounded-md px-4 text-sm text-psc-600 border border-psc-500 bg-white hover:bg-gray-50 hover:ring-2 hover:ring-psc-500 hover:ring-offset-1 shadow-sm' + }, + label: 'no'|trans + }) }} + {{ form_widget(form.yes, { + attr: { + class: 'inline-flex items-center justify-center py-2 gap-2 font-medium rounded-md px-4 text-sm text-white shadow-lg bg-red-500 hover:bg-red-600 hover:ring-2 hover:ring-red-500 hover:ring-offset-1' + }, + label: 'yes'|trans + }) }} +
+ {{ form_end(form) }} +
+
-{% endblock %} \ No newline at end of file + +
+{% endblock %} diff --git a/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/edit.html.twig b/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/edit.html.twig index f9c2e589f..dbea7f588 100755 --- a/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/edit.html.twig +++ b/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/edit/edit.html.twig @@ -1,234 +1,225 @@ -{% extends 'backend_base.html.twig' %} +{% extends 'backend_tailwind_base.html.twig' %} +{% form_theme form 'tailwind_formtheme.html.twig' %} {% trans_default_domain 'core_shipping_edit' %} -{% block body %} -
-
-
-

- - {{'shippingmethods'|trans}} > - {{'toedit'|trans}} -

-
- -
+{% block header %} +
+

+ + + + {{'shippingmethods'|trans}} {{'toedit'|trans}} +

+ +{% endblock %} -
- {{ form_start(form, { 'attr': {'class': ''}}) }} -
-
-

{{ shipping.title }}

-
-
-
-
- +{% block body %} +
+ {{ form_start(form, {attr: {class: ''}}) }} + +
+ {# Vertical Tab Navigation #} + + + {# Tab Content Area #} +
+ + {# General Tab #} +
+
{{'General'|trans}}
+ +
+
+ {{ form_row(form.title) }}
-
-
-
-
-
-
- -
- {{ form_widget(form.title) }} -
-
-
-
-
- -
- {{ form_widget(form.pos) }} -
-
-
-
-
-
{{ form_widget(form.enable) }}
-
{{ form_widget(form.private) }}
-
{{ form_widget(form.noPayment) }}
-
-
-
-
-
-
- -
- {{ form_widget(form.taxClass) }} -
-
-
-
-
- -
- {{ form_widget(form.price) }} -
-
-
-
-
- -
- {{ form_widget(form.pricePercent) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.weightFrom) }} -
-
-
-
-
- -
- {{ form_widget(form.weightTo) }} -
-
-
-
-
- -
- {{ form_widget(form.mode) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.priceFrom) }} -
-
-
-
-
- -
- {{ form_widget(form.priceTo) }} -
-
-
-
-
-
-
- -
- {{ form_widget(form.description) }} -
-
-
-
-
-
-
-
-
- -
- {{ form_widget(form.parameter1) }} -
-
-
-
-
-
-
-
-
- -
- {{ form_widget(form.countrys) }} -
-
-
-
-
-
- {{ form_widget(form.matrix) }} -
- {% for customGroup in customGroups %} -
- {% for customField in customFields %} - {% if customField.group == customGroup.id and customField.getTemplate %} - {{ include(customField.getTemplate, { 'form': form }) }} - {% endif %} - {% endfor %} -
- {% endfor %} +
+ {{ form_row(form.pos) }} +
+
+
+
{{ form_row(form.enable) }}
+
{{ form_row(form.private) }}
+
{{ form_row(form.noPayment) }}
-
-
-
-
-
-
- {{ form_widget(form.save, {attr: {class: 'btn btn-primary btn-sm'}}) }} +
+
+ {{ form_row(form.taxClass) }} +
+
+ {{ form_row(form.price) }} +
+
+ {{ form_row(form.pricePercent) }} +
+
+ +
+
+ {{ form_row(form.weightFrom) }} +
+
+ {{ form_row(form.weightTo) }} +
+
+ {{ form_row(form.mode) }} +
+
+ +
+
+ {{ form_row(form.priceFrom) }} +
+
+ {{ form_row(form.priceTo) }} +
+
+ +
+
+ {{ form_row(form.description) }}
-
- {{ form_end(form) }} -
-
-

{{ 'Changes'|trans }}

+ + {# Parameter Tab #} + -
- - - - - - {% for change in changes %} - - {% endfor %} - -
{{ 'Date'|trans }}{{ 'Username'|trans }}{{'Changes'|trans}}
{{ change.created|date('H:i:s d.m.Y') }}{{ change.username }} - {% for key,set in change.changeset %} - {% if set[1] is not iterable %} - {{key}} {{ set[0]}}{% if set[1] is null %}0{% else %}{{ set[1] }}{% endif %}
- {% endif %} - {% endfor %} -
+ + {# Matrix Tab #} + + + {# Filter Tab #} + + + {# Custom Tabs #} + {% for customGroup in customGroups %} + + {% endfor %}
+ + {# Save Button outside Card #} +
+ {{ form_widget(form.save, { + attr: { + class: 'inline-flex items-center justify-center py-1 gap-1 font-medium rounded-md px-4 text-sm text-white shadow-lg bg-psc-500 hover:bg-psc-600 hover:ring-2 hover:ring-psc-500 hover:ring-offset-2 min-h-[2.25rem]' + } + }) }} +
+ + {{ form_end(form) }} + + {# Changes History Card #} +
+

{{ 'Changes'|trans }}

+
+
+
+

{{ 'Date'|trans }}

+
+
+

{{ 'Username'|trans }}

+
+
+

{{ 'Changes'|trans }}

+
+
+ {% for change in changes %} +
+
{{ change.created|date('H:i:s d.m.Y') }}
+
{{ change.username }}
+
+ {% for key, set in change.changeset %} + {% if set|length > 1 and set[1] is not iterable %} + {{ key }} {{ set[0] }} {% if set[1] is null %}0{% else %}{{ set[1] }}{% endif %}
+ {% endif %} + {% endfor %} +
+
+ {% endfor %} +
+
+
{% endblock %} diff --git a/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/list/index.html.twig b/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/list/index.html.twig index 259915977..992424ecf 100755 --- a/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/list/index.html.twig +++ b/src/new/src/PSC/Shop/ShippingBundle/Resources/views/backend/list/index.html.twig @@ -12,7 +12,7 @@

- + @@ -24,50 +24,74 @@ {% block body %}
-
+
- - - - - - - - - + + + + + + + + + - + {% for shipping in pagination %} - - - + + - - - - + + + -
{{ knp_pagination_sortable(pagination, 'Uid'|trans, 'shipping.uid') }}{{ knp_pagination_sortable(pagination, 'active'|trans, 'shipping.enable') }}{{ knp_pagination_sortable(pagination, 'Pos'|trans, 'shipping.pos') }}{{ knp_pagination_sortable(pagination, 'Name'|trans, 'shipping.title') }}{{ knp_pagination_sortable(pagination, 'price'|trans, 'shipping.price') }}{{'Matrix'|trans}}Aktionen
+ {{ knp_pagination_sortable(pagination, 'Uid'|trans, 'shipping.uid') }} + + {{ knp_pagination_sortable(pagination, 'active'|trans, 'shipping.enable') }} + + {{ knp_pagination_sortable(pagination, 'Pos'|trans, 'shipping.pos') }} + + {{ knp_pagination_sortable(pagination, 'Name'|trans, 'shipping.title') }} + + {{ knp_pagination_sortable(pagination, 'price'|trans, 'shipping.price') }} + + {{'Matrix'|trans}} + + Aktionen +
{{ shipping.uid }} +
+ + + + + {{ shipping.uid }} + + {% if shipping.enable %} -
{{'yes'|trans}}
+ {{'yes'|trans}} {% else %} -
{{'no'|trans}}
+ {{'no'|trans}} {% endif %}
{{ shipping.pos }}{{ shipping.title }}{{ shipping.price|number_format(2, ',', '.') }}€ + {{ shipping.pos }}{{ shipping.title }}{{ shipping.price|number_format(2, ',', '.') }}€ {% if shipping.matrix != "" %} -
{{'yes'|trans}}
+ {{'yes'|trans}} {% else %} -
{{'no'|trans}}
+ {{'no'|trans}} {% endif %}
+
- - + {# Bearbeiten - GRÜN #} + + - - + {# Löschen - ROT #} + + diff --git a/src/new/var/plugins/Custom/PSC/LaufkartenLayouter/Controller/Backend/IndexController.php b/src/new/var/plugins/Custom/PSC/LaufkartenLayouter/Controller/Backend/IndexController.php index 53c65bfea..8bf22d5d4 100644 --- a/src/new/var/plugins/Custom/PSC/LaufkartenLayouter/Controller/Backend/IndexController.php +++ b/src/new/var/plugins/Custom/PSC/LaufkartenLayouter/Controller/Backend/IndexController.php @@ -15,7 +15,7 @@ use Symfony\Component\Security\Http\Attribute\IsGranted; use Symfony\Component\Serializer\SerializerInterface; #[Route('/index')] -#[IsGranted('ROLE_ADMIN')] +#[IsGranted('ROLE_SHOP')] class IndexController extends AbstractController { #[Template('@PluginCustomPSCLaufkartenLayouter/backend/index/index.html.twig')] diff --git a/src/new/var/plugins/Custom/PSC/LaufkartenLayouter/Resources/config/routing.yml b/src/new/var/plugins/Custom/PSC/LaufkartenLayouter/Resources/config/routing.yml index c8671ab66..ae5ef24c9 100644 --- a/src/new/var/plugins/Custom/PSC/LaufkartenLayouter/Resources/config/routing.yml +++ b/src/new/var/plugins/Custom/PSC/LaufkartenLayouter/Resources/config/routing.yml @@ -6,7 +6,7 @@ psc_shop_plugin_custom_laufkartenlayouter_api: psc_shop_plugin_custom_laufkartenlayouter_backend: resource: "@PluginCustomPSCLaufkartenLayouter/Controller/Backend" type: attribute - prefix: /plugin/custom/psc/laufkartenlayouter/backend + prefix: /backend/plugin/custom/psc/laufkartenlayouter psc_shop_plugin_custom_laufkartenlayouter_frontend: resource: "@PluginCustomPSCLaufkartenLayouter/Controller/Frontend" diff --git a/src/new/var/plugins/System/PSC/XmlCalc/Controller/Backend/LiveController.php b/src/new/var/plugins/System/PSC/XmlCalc/Controller/Backend/LiveController.php index ea149fd40..fd0221fe8 100755 --- a/src/new/var/plugins/System/PSC/XmlCalc/Controller/Backend/LiveController.php +++ b/src/new/var/plugins/System/PSC/XmlCalc/Controller/Backend/LiveController.php @@ -1,60 +1,24 @@ '', 'test' => false], name: 'psc_plugin_system_xmlcalc_backend_live_index')] public function indexAction( Request $request, JWTTokenManagerInterface $jwtManager, - $uuid, $test = false + sring $uuid, $test = false ) { return array( diff --git a/src/new/var/tailwind/backend.built.css b/src/new/var/tailwind/backend.built.css index a012c9fca..72a4446ea 100644 --- a/src/new/var/tailwind/backend.built.css +++ b/src/new/var/tailwind/backend.built.css @@ -1032,6 +1032,10 @@ html { margin-right: 0.25rem; } +.mr-1\.5{ + margin-right: 0.375rem; +} + .mr-2{ margin-right: 0.5rem; } @@ -1049,6 +1053,14 @@ html { margin-inline-start: 0.25rem; } +.mt-0{ + margin-top: 0px; +} + +.mt-0\.5{ + margin-top: 0.125rem; +} + .mt-1{ margin-top: 0.25rem; } @@ -1702,6 +1714,10 @@ html { border-bottom-width: 1px; } +.border-b-2{ + border-bottom-width: 2px; +} + .border-l-0{ border-left-width: 0px; } @@ -1748,6 +1764,11 @@ html { border-color: rgb(234 100 27 / var(--tw-border-opacity)); } +.border-red-200{ + --tw-border-opacity: 1; + border-color: rgb(254 202 202 / var(--tw-border-opacity)); +} + .border-red-500{ --tw-border-opacity: 1; border-color: rgb(239 68 68 / var(--tw-border-opacity)); @@ -1758,6 +1779,11 @@ html { border-color: rgb(231 229 228 / var(--tw-border-opacity)); } +.border-yellow-200{ + --tw-border-opacity: 1; + border-color: rgb(254 240 138 / var(--tw-border-opacity)); +} + .border-yellow-400{ --tw-border-opacity: 1; border-color: rgb(250 204 21 / var(--tw-border-opacity)); @@ -1788,6 +1814,11 @@ html { background-color: rgb(249 250 251 / var(--tw-bg-opacity)); } +.bg-gray-500{ + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity)); +} + .bg-gray-800{ --tw-bg-opacity: 1; background-color: rgb(31 41 55 / var(--tw-bg-opacity)); @@ -2182,6 +2213,11 @@ html { color: rgb(234 100 27 / var(--tw-text-opacity)); } +.text-psc-600{ + --tw-text-opacity: 1; + color: rgb(172 48 37 / var(--tw-text-opacity)); +} + .text-red-600{ --tw-text-opacity: 1; color: rgb(220 38 38 / var(--tw-text-opacity)); @@ -2466,16 +2502,17 @@ html { .badge-yes{ display: inline-flex; + align-items: center; justify-content: center; - border-radius: 0.125rem; + border-radius: 9999px; --tw-bg-opacity: 1; background-color: rgb(132 204 22 / var(--tw-bg-opacity)); padding-left: 0.5rem; padding-right: 0.5rem; padding-top: 0.25rem; padding-bottom: 0.25rem; - font-size: 0.875rem; - line-height: 1.25rem; + font-size: 0.75rem; + line-height: 1rem; font-weight: 500; --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); @@ -2490,16 +2527,17 @@ html { .badge-no{ display: inline-flex; + align-items: center; justify-content: center; - border-radius: 0.125rem; + border-radius: 9999px; --tw-bg-opacity: 1; background-color: rgb(249 115 22 / var(--tw-bg-opacity)); padding-left: 0.5rem; padding-right: 0.5rem; padding-top: 0.25rem; padding-bottom: 0.25rem; - font-size: 0.875rem; - line-height: 1.25rem; + font-size: 0.75rem; + line-height: 1rem; font-weight: 500; --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); @@ -2521,8 +2559,8 @@ html { min-height: 2.25rem; align-items: center; justify-content: center; - gap: 0.25rem; - border-radius: 0.125rem; + gap: 0.5rem; + border-radius: 0.375rem; --tw-bg-opacity: 1; background-color: rgb(234 100 27 / var(--tw-bg-opacity)); padding-top: 0.25rem; @@ -2555,8 +2593,8 @@ html { min-height: 1.8rem; align-items: center; justify-content: center; - gap: 0.25rem; - border-radius: 0.125rem; + gap: 0.5rem; + border-radius: 0.375rem; --tw-bg-opacity: 1; background-color: rgb(234 100 27 / var(--tw-bg-opacity)); padding-top: 0.25rem; @@ -2670,6 +2708,11 @@ html { border-color: rgb(209 213 219 / var(--tw-border-opacity)); } +.hover\:border-psc-300:hover{ + --tw-border-opacity: 1; + border-color: rgb(220 102 91 / var(--tw-border-opacity)); +} + .hover\:border-psc-500:hover{ --tw-border-opacity: 1; border-color: rgb(234 100 27 / var(--tw-border-opacity)); @@ -2704,6 +2747,11 @@ html { background-color: rgb(107 114 128 / 0.05); } +.hover\:bg-gray-600:hover{ + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity)); +} + .hover\:bg-indigo-600:hover{ --tw-bg-opacity: 1; background-color: rgb(79 70 229 / var(--tw-bg-opacity)); @@ -2758,6 +2806,11 @@ html { color: rgb(17 24 39 / var(--tw-text-opacity)); } +.hover\:text-green-700:hover{ + --tw-text-opacity: 1; + color: rgb(21 128 61 / var(--tw-text-opacity)); +} + .hover\:text-psc-500:hover{ --tw-text-opacity: 1; color: rgb(234 100 27 / var(--tw-text-opacity)); @@ -2768,6 +2821,11 @@ html { color: rgb(144 40 31 / var(--tw-text-opacity)); } +.hover\:text-red-700:hover{ + --tw-text-opacity: 1; + color: rgb(185 28 28 / var(--tw-text-opacity)); +} + .hover\:text-white:hover{ --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); @@ -2794,6 +2852,11 @@ html { --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); } +.hover\:ring-gray-500:hover{ + --tw-ring-opacity: 1; + --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity)); +} + .hover\:ring-indigo-500:hover{ --tw-ring-opacity: 1; --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity)); @@ -2809,6 +2872,10 @@ html { --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity)); } +.hover\:ring-offset-1:hover{ + --tw-ring-offset-width: 1px; +} + .hover\:ring-offset-2:hover{ --tw-ring-offset-width: 2px; } @@ -3074,6 +3141,10 @@ html { background-color: rgb(254 226 226 / var(--tw-bg-opacity)); } +:is(.dark .dark\:bg-red-900\/20){ + background-color: rgb(127 29 29 / 0.2); +} + :is(.dark .dark\:text-blue-500){ --tw-text-opacity: 1; color: rgb(59 130 246 / var(--tw-text-opacity)); @@ -3099,6 +3170,16 @@ html { color: rgb(107 114 128 / var(--tw-text-opacity)); } +:is(.dark .dark\:text-green-500){ + --tw-text-opacity: 1; + color: rgb(34 197 94 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-red-200){ + --tw-text-opacity: 1; + color: rgb(254 202 202 / var(--tw-text-opacity)); +} + :is(.dark .dark\:text-red-500){ --tw-text-opacity: 1; color: rgb(239 68 68 / var(--tw-text-opacity)); @@ -3157,6 +3238,15 @@ html { background-color: rgb(31 41 55 / var(--tw-bg-opacity)); } +:is(.dark .dark\:hover\:bg-gray-800\/50:hover){ + background-color: rgb(31 41 55 / 0.5); +} + +:is(.dark .dark\:hover\:bg-psc-900:hover){ + --tw-bg-opacity: 1; + background-color: rgb(88 25 19 / var(--tw-bg-opacity)); +} + :is(.dark .dark\:hover\:text-blue-500:hover){ --tw-text-opacity: 1; color: rgb(59 130 246 / var(--tw-text-opacity)); @@ -3167,6 +3257,21 @@ html { color: rgb(209 213 219 / var(--tw-text-opacity)); } +:is(.dark .dark\:hover\:text-green-400:hover){ + --tw-text-opacity: 1; + color: rgb(74 222 128 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:hover\:text-psc-300:hover){ + --tw-text-opacity: 1; + color: rgb(220 102 91 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:hover\:text-red-400:hover){ + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity)); +} + :is(.dark .dark\:hover\:text-white:hover){ --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); diff --git a/src/old/application/articles/Market/Article.php b/src/old/application/articles/Market/Article.php index e8db8b15e..75db8f577 100755 --- a/src/old/application/articles/Market/Article.php +++ b/src/old/application/articles/Market/Article.php @@ -624,7 +624,6 @@ class market_article } if ($layouterPreviewId) { - $layouterPreviewId = strtoupper($layouterPreviewId); $article = Doctrine_Query::create() ->from('Article c') ->where('c.id = ?', [intval($articleId)]) diff --git a/src/old/application/modules/default/controllers/ArticleController.php b/src/old/application/modules/default/controllers/ArticleController.php index d36defe7f..ea0b66501 100755 --- a/src/old/application/modules/default/controllers/ArticleController.php +++ b/src/old/application/modules/default/controllers/ArticleController.php @@ -2713,7 +2713,6 @@ class ArticleController extends TP_Controller_Action } $articleSession = new TP_Layoutersession(); - $basket = new TP_Basket(); /*if($this->getRequest()->getParam('layouter')) { * if($basket->checkIsLayouterIdInUse($this->getRequest()->getParam('layouter')) && !$this->_getParam('load')) { diff --git a/src/old/application/modules/default/controllers/BasketController.php b/src/old/application/modules/default/controllers/BasketController.php index 2ae335b83..3968a0af1 100755 --- a/src/old/application/modules/default/controllers/BasketController.php +++ b/src/old/application/modules/default/controllers/BasketController.php @@ -2777,7 +2777,6 @@ class BasketController extends TP_Controller_Action $this->view->paymenttype = 0; $this->view->shippingtype = 0; $basket->setPreisNetto($netto); - if ($this->shop->shipping_mode == 1) { if ( $this->getRequest()->isPost() && $this->_request->getParam('shippingtype') != '' || diff --git a/src/old/library/TP/Layoutersession.php b/src/old/library/TP/Layoutersession.php index ecb3fb8b4..48421f7b4 100755 --- a/src/old/library/TP/Layoutersession.php +++ b/src/old/library/TP/Layoutersession.php @@ -54,6 +54,10 @@ class TP_Layoutersession } } + public function getDebugSessionData() + { + return $this->_Items->data; + } /** * Gibt das Item aus der Session zurück *