Refactor: Moved app source code back to 'src/' directory for cleaner Docker build context
@@ -12,7 +12,7 @@ RUN apt-get update && apt-get install -y \
|
||||
RUN a2enmod rewrite
|
||||
|
||||
# Copy application source
|
||||
COPY . /var/www/html/
|
||||
COPY src/ /var/www/html/
|
||||
|
||||
# Set permissions for upload directory
|
||||
RUN mkdir -p /var/www/html/uploads/images && \
|
||||
|
||||
20
add_article.php → src/add_article.php
Executable file → Normal file
@@ -209,6 +209,10 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
$conn->close();
|
||||
?>
|
||||
|
||||
<!-- Tom Select CSS/JS -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/tom-select@2.2.2/dist/css/tom-select.bootstrap5.min.css" rel="stylesheet">
|
||||
<script src="https://cdn.jsdelivr.net/npm/tom-select@2.2.2/dist/js/tom-select.complete.min.js"></script>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h2 class="h4 mb-0"><i class="fas fa-plus-circle me-2"></i>Neuen Artikel erstellen</h2>
|
||||
@@ -348,6 +352,22 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
quantityOwnedInput.disabled = false;
|
||||
}
|
||||
});
|
||||
|
||||
// Initialize Tom Select for searchable dropdowns
|
||||
const tsOptions = {
|
||||
create: false,
|
||||
sortField: { field: "text", direction: "asc" },
|
||||
onChange: function(value) {
|
||||
// Force trigger change event for the "New" option toggle logic
|
||||
const event = new Event('change');
|
||||
this.input.dispatchEvent(event);
|
||||
}
|
||||
};
|
||||
|
||||
if(document.getElementById('manufacturer_id')) new TomSelect('#manufacturer_id', tsOptions);
|
||||
if(document.getElementById('category_id')) new TomSelect('#category_id', tsOptions);
|
||||
if(document.getElementById('parent_article_id')) new TomSelect('#parent_article_id', tsOptions);
|
||||
if(document.getElementById('storage_location_id')) new TomSelect('#storage_location_id', tsOptions);
|
||||
});
|
||||
</script>
|
||||
<?php require_once 'footer.php'; ?>
|
||||
0
add_packing_list.php → src/add_packing_list.php
Executable file → Normal file
0
api_packing_list_handler.php → src/api_packing_list_handler.php
Executable file → Normal file
0
articles.php → src/articles.php
Executable file → Normal file
@@ -460,9 +460,16 @@ body::before {
|
||||
.section-card {
|
||||
border: 1px solid rgba(0,0,0,0.08);
|
||||
border-radius: var(--border-radius-md);
|
||||
overflow: hidden; /* Ensure header radius respects container */
|
||||
overflow: visible; /* Allow dropdowns to overflow */
|
||||
background-color: var(--glass-bg);
|
||||
backdrop-filter: var(--glass-blur);
|
||||
position: relative;
|
||||
transition: z-index 0.1s step-start; /* Instant z-index change */
|
||||
}
|
||||
|
||||
/* Lift card when interacting to ensure dropdowns appear over subsequent cards */
|
||||
.section-card:hover, .section-card:focus-within {
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.section-card .card-header {
|
||||
@@ -470,10 +477,13 @@ body::before {
|
||||
color: var(--color-primary-dark);
|
||||
border-bottom: 1px solid rgba(0,0,0,0.05);
|
||||
font-weight: 700;
|
||||
border-top-left-radius: var(--border-radius-md);
|
||||
border-top-right-radius: var(--border-radius-md);
|
||||
}
|
||||
|
||||
.section-card .card-body {
|
||||
background-color: transparent;
|
||||
overflow: visible; /* Allow dropdowns to overflow */
|
||||
}
|
||||
|
||||
.paste-area {
|
||||
0
backpacks.php → src/backpacks.php
Executable file → Normal file
0
categories.php → src/categories.php
Executable file → Normal file
@@ -9,7 +9,7 @@ $dbname = getenv('DB_NAME');
|
||||
|
||||
// 2. Fallback: config.ini (Lokale Entwicklung)
|
||||
if (!$servername || !$username || !$dbname) {
|
||||
$config_path = __DIR__ . '/config.ini';
|
||||
$config_path = __DIR__ . '/../config.ini';
|
||||
if (file_exists($config_path)) {
|
||||
$config = parse_ini_file($config_path);
|
||||
if ($config) {
|
||||
0
delete_article.php → src/delete_article.php
Executable file → Normal file
0
delete_packing_list.php → src/delete_packing_list.php
Executable file → Normal file
0
duplicate_packing_list.php → src/duplicate_packing_list.php
Executable file → Normal file
19
edit_article.php → src/edit_article.php
Executable file → Normal file
@@ -260,6 +260,10 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && $can_edit) {
|
||||
$conn->close();
|
||||
?>
|
||||
|
||||
<!-- Tom Select CSS/JS -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/tom-select@2.2.2/dist/css/tom-select.bootstrap5.min.css" rel="stylesheet">
|
||||
<script src="https://cdn.jsdelivr.net/npm/tom-select@2.2.2/dist/js/tom-select.complete.min.js"></script>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h2 class="h4 mb-0"><i class="fas fa-edit me-2"></i>Artikel bearbeiten</h2>
|
||||
@@ -422,6 +426,21 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
quantityOwnedInput.disabled = false;
|
||||
}
|
||||
});
|
||||
|
||||
// Initialize Tom Select
|
||||
const tsOptions = {
|
||||
create: false,
|
||||
sortField: { field: "text", direction: "asc" },
|
||||
onChange: function(value) {
|
||||
const event = new Event('change');
|
||||
this.input.dispatchEvent(event);
|
||||
}
|
||||
};
|
||||
|
||||
if(document.getElementById('manufacturer_id')) new TomSelect('#manufacturer_id', tsOptions);
|
||||
if(document.getElementById('category_id')) new TomSelect('#category_id', tsOptions);
|
||||
if(document.getElementById('parent_article_id')) new TomSelect('#parent_article_id', tsOptions);
|
||||
if(document.getElementById('storage_location_id')) new TomSelect('#storage_location_id', tsOptions);
|
||||
});
|
||||
</script>
|
||||
<?php require_once 'footer.php'; ?>
|
||||
84
edit_backpack.php → src/edit_backpack.php
Executable file → Normal file
@@ -90,10 +90,41 @@ if ($backpack_id > 0) {
|
||||
}
|
||||
}
|
||||
|
||||
// Load Manufacturers
|
||||
$stmt_man_load = $conn->prepare("SELECT id, name FROM manufacturers WHERE user_id = ? ORDER BY name ASC");
|
||||
$stmt_man_load->bind_param("i", $user_id);
|
||||
$stmt_man_load->execute();
|
||||
$manufacturers = $stmt_man_load->get_result()->fetch_all(MYSQLI_ASSOC);
|
||||
$stmt_man_load->close();
|
||||
|
||||
// Handle Form Submission BEFORE loading header
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||
$name = trim($_POST['name']);
|
||||
$manufacturer = trim($_POST['manufacturer']);
|
||||
|
||||
// Manufacturer Logic
|
||||
$manufacturer = '';
|
||||
if (isset($_POST['manufacturer_select'])) {
|
||||
if ($_POST['manufacturer_select'] === 'new') {
|
||||
$new_man = trim($_POST['new_manufacturer_name']);
|
||||
if (!empty($new_man)) {
|
||||
// Optional: Save to manufacturers table for future use
|
||||
$stmt_new_man = $conn->prepare("INSERT INTO manufacturers (name, user_id) VALUES (?, ?)");
|
||||
$stmt_new_man->bind_param("si", $new_man, $user_id);
|
||||
$stmt_new_man->execute();
|
||||
$manufacturer = $new_man;
|
||||
}
|
||||
} else {
|
||||
// Look up name from ID
|
||||
$man_id = intval($_POST['manufacturer_select']);
|
||||
foreach ($manufacturers as $m) {
|
||||
if ($m['id'] == $man_id) {
|
||||
$manufacturer = $m['name'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$model = trim($_POST['model']);
|
||||
$weight = intval($_POST['weight_grams']);
|
||||
$volume = intval($_POST['volume_liters']);
|
||||
@@ -212,9 +243,16 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||
exit;
|
||||
}
|
||||
|
||||
// Handle Form Submission BEFORE loading header
|
||||
// ... (existing logic) ...
|
||||
|
||||
require_once 'header.php';
|
||||
?>
|
||||
|
||||
<!-- Tom Select CSS/JS -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/tom-select@2.2.2/dist/css/tom-select.bootstrap5.min.css" rel="stylesheet">
|
||||
<script src="https://cdn.jsdelivr.net/npm/tom-select@2.2.2/dist/js/tom-select.complete.min.js"></script>
|
||||
|
||||
<div class="container mt-4">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
@@ -237,7 +275,20 @@ require_once 'header.php';
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">Hersteller</label>
|
||||
<input type="text" name="manufacturer" class="form-control" value="<?php echo htmlspecialchars($backpack['manufacturer'] ?? ''); ?>">
|
||||
<select class="form-select" id="manufacturer_select" name="manufacturer_select">
|
||||
<option value="">-- Auswählen --</option>
|
||||
<option value="new">-- Neuen anlegen --</option>
|
||||
<?php
|
||||
$current_man = $backpack['manufacturer'] ?? '';
|
||||
foreach ($manufacturers as $man):
|
||||
$selected = ($man['name'] === $current_man) ? 'selected' : '';
|
||||
?>
|
||||
<option value="<?php echo $man['id']; ?>" <?php echo $selected; ?>><?php echo htmlspecialchars($man['name']); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<div id="new_manufacturer_container" class="mt-2" style="display:none;">
|
||||
<input type="text" name="new_manufacturer_name" class="form-control form-control-sm" placeholder="Name des neuen Herstellers">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">Modell</label>
|
||||
@@ -324,6 +375,21 @@ require_once 'header.php';
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.14.0/Sortable.min.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const manSelect = document.getElementById('manufacturer_select');
|
||||
const manContainer = document.getElementById('new_manufacturer_container');
|
||||
|
||||
if (manSelect) {
|
||||
manSelect.addEventListener('change', function() {
|
||||
if (this.value === 'new') {
|
||||
manContainer.style.display = 'block';
|
||||
manContainer.querySelector('input').required = true;
|
||||
} else {
|
||||
manContainer.style.display = 'none';
|
||||
manContainer.querySelector('input').required = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const container = document.getElementById('compartments-container');
|
||||
|
||||
// Sortable for Compartments
|
||||
@@ -367,6 +433,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
}
|
||||
|
||||
if (pasteArea) {
|
||||
// ... existing paste logic ...
|
||||
pasteArea.addEventListener('paste', function(e) {
|
||||
e.preventDefault();
|
||||
const items = (e.clipboardData || window.clipboardData).items;
|
||||
@@ -388,6 +455,19 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
pasteArea.setAttribute('tabindex', '0');
|
||||
pasteArea.addEventListener('click', () => pasteArea.focus());
|
||||
}
|
||||
|
||||
// Tom Select Init
|
||||
const manSelect = document.getElementById('manufacturer_select');
|
||||
if(manSelect) {
|
||||
new TomSelect(manSelect, {
|
||||
create: false,
|
||||
sortField: { field: "text", direction: "asc" },
|
||||
onChange: function(value) {
|
||||
const event = new Event('change');
|
||||
manSelect.dispatchEvent(event);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
3
edit_packing_list_details.php → src/edit_packing_list_details.php
Executable file → Normal file
@@ -365,5 +365,4 @@ function selectBackpack(userId, bpId) {
|
||||
.bp-select-card:hover { transform: translateY(-3px); box-shadow: 0 5px 15px rgba(0,0,0,0.1); border-color: var(--color-primary); }
|
||||
</style>
|
||||
|
||||
<?php require_once 'footer.php'; ?>
|
||||
</replace>
|
||||
<?php require_once 'footer.php'; ?>
|
||||
0
footer.php → src/footer.php
Executable file → Normal file
0
header.php → src/header.php
Executable file → Normal file
0
help.php → src/help.php
Executable file → Normal file
0
household.php → src/household.php
Executable file → Normal file
0
household_actions.php → src/household_actions.php
Executable file → Normal file
0
index.php → src/index.php
Executable file → Normal file
0
keinbild.png → src/keinbild.png
Executable file → Normal file
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
0
login.php → src/login.php
Executable file → Normal file
0
logo.png → src/logo.png
Executable file → Normal file
|
Before Width: | Height: | Size: 3.4 MiB After Width: | Height: | Size: 3.4 MiB |
0
logout.php → src/logout.php
Executable file → Normal file
39
manage_packing_list_items.php → src/manage_packing_list_items.php
Executable file → Normal file
@@ -51,7 +51,7 @@ if ($current_user_household_id) {
|
||||
$placeholders = implode(',', array_fill(0, count($household_member_ids), '?'));
|
||||
$types = str_repeat('i', count($household_member_ids));
|
||||
|
||||
$sql_all_articles = "SELECT a.id, a.name, a.weight_grams, a.quantity_owned, a.product_designation, a.consumable, a.parent_article_id, c.name as category_name, m.name as manufacturer_name
|
||||
$sql_all_articles = "SELECT a.id, a.name, a.weight_grams, a.quantity_owned, a.product_designation, a.consumable, a.parent_article_id, a.image_url, c.name as category_name, m.name as manufacturer_name
|
||||
FROM articles a
|
||||
LEFT JOIN categories c ON a.category_id = c.id
|
||||
LEFT JOIN manufacturers m ON a.manufacturer_id = m.id
|
||||
@@ -150,6 +150,7 @@ $conn->close();
|
||||
</div>
|
||||
|
||||
<div id="save-feedback" class="save-feedback">Änderungen gespeichert!</div>
|
||||
<div id="image-preview-tooltip" class="image-preview-tooltip"></div>
|
||||
|
||||
<style>
|
||||
/* Nested Sortable Specific Styles */
|
||||
@@ -216,6 +217,32 @@ $conn->close();
|
||||
let childrenModal = null;
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
// Tooltip Logic
|
||||
const tooltip = document.getElementById('image-preview-tooltip');
|
||||
if (tooltip) {
|
||||
// Delegation for dynamically added items
|
||||
document.body.addEventListener('mouseover', e => {
|
||||
if (e.target.classList.contains('article-image-trigger')) {
|
||||
const url = e.target.getAttribute('data-preview-url');
|
||||
if (url && !url.endsWith('keinbild.png')) {
|
||||
tooltip.style.backgroundImage = `url('${url}')`;
|
||||
tooltip.style.display = 'block';
|
||||
}
|
||||
}
|
||||
});
|
||||
document.body.addEventListener('mousemove', e => {
|
||||
if (tooltip.style.display === 'block') {
|
||||
tooltip.style.left = e.pageX + 15 + 'px';
|
||||
tooltip.style.top = e.pageY + 15 + 'px';
|
||||
}
|
||||
});
|
||||
document.body.addEventListener('mouseout', e => {
|
||||
if (e.target.classList.contains('article-image-trigger')) {
|
||||
tooltip.style.display = 'none';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
['input', 'change'].forEach(evt => {
|
||||
document.getElementById('filter-text').addEventListener(evt, renderAvailableItems);
|
||||
document.getElementById('filter-category').addEventListener(evt, renderAvailableItems);
|
||||
@@ -246,7 +273,15 @@ $conn->close();
|
||||
const matchesManufacturer = !filterManufacturer || article.manufacturer_name === filterManufacturer;
|
||||
if (matchesText && matchesCategory && matchesManufacturer) {
|
||||
const details = [article.manufacturer_name, article.product_designation].filter(Boolean).join(' - ');
|
||||
html += `<div class="available-item-card" data-article-id="${article.id}">${article.name} <small class="text-muted">(${details || '---'} | ${article.weight_grams}g)</small></div>`;
|
||||
const imgUrl = article.image_url ? article.image_url : 'keinbild.png';
|
||||
html += `
|
||||
<div class="available-item-card d-flex align-items-center" data-article-id="${article.id}">
|
||||
<img src="${imgUrl}" class="article-image-trigger me-2 rounded" style="width: 30px; height: 30px; object-fit: cover; cursor: pointer;" data-preview-url="${imgUrl}">
|
||||
<div class="flex-grow-1">
|
||||
${article.name}
|
||||
<small class="text-muted d-block" style="line-height: 1;">(${details || '---'} | ${article.weight_grams}g)</small>
|
||||
</div>
|
||||
</div>`;
|
||||
}
|
||||
}
|
||||
});
|
||||
0
manufacturers.php → src/manufacturers.php
Executable file → Normal file
0
packing_list_detail.php → src/packing_list_detail.php
Executable file → Normal file
0
packing_lists.php → src/packing_lists.php
Executable file → Normal file
0
public_list.php → src/public_list.php
Executable file → Normal file
0
register.php → src/register.php
Executable file → Normal file
0
rucksack_icon.png → src/rucksack_icon.png
Executable file → Normal file
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
0
share_packing_list.php → src/share_packing_list.php
Executable file → Normal file
0
storage_locations.php → src/storage_locations.php
Executable file → Normal file
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 580 KiB After Width: | Height: | Size: 580 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 902 KiB After Width: | Height: | Size: 902 KiB |
|
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 668 KiB After Width: | Height: | Size: 668 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 862 KiB After Width: | Height: | Size: 862 KiB |
|
Before Width: | Height: | Size: 422 KiB After Width: | Height: | Size: 422 KiB |
|
Before Width: | Height: | Size: 422 KiB After Width: | Height: | Size: 422 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 196 KiB After Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 211 KiB After Width: | Height: | Size: 211 KiB |
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 203 KiB After Width: | Height: | Size: 203 KiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |