|
|
@@ -19,6 +19,10 @@ $tabs = [
|
|
|
'seo' => [
|
|
|
'label' => 'SEO & Meta',
|
|
|
'icon' => 'M12.316 3.051a1 1 0 01.633 1.265l-4 12a1 1 0 11-1.898-.632l4-12a1 1 0 011.265-.633zM5.707 6.293a1 1 0 010 1.414L3.414 10l2.293 2.293a1 1 0 11-1.414 1.414l-3-3a1 1 0 010-1.414l3-3a1 1 0 011.414 0zm8.586 0a1 1 0 011.414 0l3 3a1 1 0 010 1.414l-3 3a1 1 0 11-1.414-1.414L16.586 10l-2.293-2.293a1 1 0 010-1.414z'
|
|
|
+ ],
|
|
|
+ 'jsonld' => [
|
|
|
+ 'label' => 'JSON-LD',
|
|
|
+ 'icon' => 'M8 4a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1zm0 4a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1zm0 4a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z'
|
|
|
]
|
|
|
];
|
|
|
|
|
|
@@ -370,19 +374,6 @@ ob_start();
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <!-- Акцентный цвет -->
|
|
|
- <div>
|
|
|
- <label class="block text-sm font-medium text-gray-700 mb-2">Акцентный цвет (для важных элементов)</label>
|
|
|
- <div class="flex gap-3">
|
|
|
- <input type="color" value="<?= $styles['accent_color'] ?? '#FF6B35' ?>"
|
|
|
- class="w-12 h-10 rounded border border-gray-300 cursor-pointer"
|
|
|
- onchange="this.nextElementSibling.value = this.value">
|
|
|
- <input type="text" name='styles[accent_color]' value="<?= htmlspecialchars($styles['accent_color'] ?? '') ?>"
|
|
|
- placeholder="#FF6B35"
|
|
|
- class="flex-1 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
<!-- Цвет таблицы -->
|
|
|
<div>
|
|
|
<label class="block text-sm font-medium text-gray-700 mb-2">Цвет таблицы (фон)</label>
|
|
|
@@ -421,19 +412,6 @@ ob_start();
|
|
|
class="flex-1 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
</div>
|
|
|
</div>
|
|
|
-
|
|
|
- <!-- Цвет рамки контента -->
|
|
|
- <div>
|
|
|
- <label class="block text-sm font-medium text-gray-700 mb-2">Цвет рамки контента</label>
|
|
|
- <div class="flex gap-3">
|
|
|
- <input type="color" value="<?= $styles['content_border_color'] ?? '#E4E4E4' ?>"
|
|
|
- class="w-12 h-10 rounded border border-gray-300 cursor-pointer"
|
|
|
- onchange="this.nextElementSibling.value = this.value">
|
|
|
- <input type="text" name='styles[content_border_color]' value="<?= htmlspecialchars($styles['content_border_color'] ?? '') ?>"
|
|
|
- placeholder="#E4E4E4"
|
|
|
- class="flex-1 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
@@ -451,13 +429,198 @@ ob_start();
|
|
|
|
|
|
<!-- SEO Tab -->
|
|
|
<div x-show="activeTab === 'seo'" class="bg-white rounded-lg shadow-sm">
|
|
|
- <div class="p-6">
|
|
|
- <div class="text-center py-12">
|
|
|
- <svg class="mx-auto h-12 w-12 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v6m0 0v6m0-6h6m-6 0H6"/>
|
|
|
- </svg>
|
|
|
- <h3 class="mt-2 text-sm font-medium text-gray-900">SEO Coming Soon</h3>
|
|
|
- <p class="mt-1 text-sm text-gray-500">SEO settings will be implemented in the next update.</p>
|
|
|
+ <div class="p-6 space-y-8">
|
|
|
+
|
|
|
+ <!-- Hreflang Settings -->
|
|
|
+ <div x-data="{
|
|
|
+ hreflangs: <?= htmlspecialchars(json_encode(isset($seo['hreflang']) ? json_decode($seo['hreflang'], true) ?: [] : []), ENT_QUOTES, 'UTF-8') ?>,
|
|
|
+ addHreflang() {
|
|
|
+ this.hreflangs.push({hreflang: '', href: ''});
|
|
|
+ },
|
|
|
+ removeHreflang(index) {
|
|
|
+ this.hreflangs.splice(index, 1);
|
|
|
+ }
|
|
|
+ }">
|
|
|
+ <h3 class="text-lg font-medium text-gray-900 mb-6 flex items-center">
|
|
|
+ <svg class="w-5 h-5 mr-2 text-blue-600" fill="currentColor" viewBox="0 0 20 20">
|
|
|
+ <path fill-rule="evenodd" d="M7 2a1 1 0 011 1v1h3a1 1 0 110 2H9.578a18.87 18.87 0 01-1.724 4.78c.29.354.596.696.914 1.026a1 1 0 11-1.44 1.389c-.188-.196-.373-.396-.554-.6a18.9 18.9 0 01-2.62 3.624 1 1 0 11-1.44-1.389A16.9 16.9 0 003.578 8H2a1 1 0 110-2h2.578c.15-.667.34-1.32.578-1.96A1 1 0 015.5 4c.76 0 1.5.11 2.5.342V3a1 1 0 011-1zm1.578 6H7.422c.12.456.264.903.428 1.34.164-.437.308-.884.428-1.34zM17 6a3 3 0 11-6 0 3 3 0 016 0z" clip-rule="evenodd"/>
|
|
|
+ </svg>
|
|
|
+ Hreflang Settings
|
|
|
+ </h3>
|
|
|
+
|
|
|
+ <!-- Hidden input to store JSON data -->
|
|
|
+ <input type="hidden" name="seo[hreflang]" x-bind:value="JSON.stringify(hreflangs)">
|
|
|
+
|
|
|
+ <div class="space-y-4">
|
|
|
+ <template x-for="(item, index) in hreflangs" :key="index">
|
|
|
+ <div class="flex gap-4 items-end">
|
|
|
+ <div class="flex-1">
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Language Code</label>
|
|
|
+ <input type="text" x-model="item.hreflang" placeholder="en, ru, de, x-default"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ <div class="flex-2">
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">URL</label>
|
|
|
+ <input type="url" x-model="item.href" placeholder="https://example.com/en/"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ <button type="button" @click="removeHreflang(index)"
|
|
|
+ class="px-3 py-2 text-red-600 hover:text-red-800 border border-red-300 hover:border-red-500 rounded-md transition-colors">
|
|
|
+ <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
|
|
|
+ <path fill-rule="evenodd" d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z" clip-rule="evenodd"/>
|
|
|
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/>
|
|
|
+ </svg>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <button type="button" @click="addHreflang()"
|
|
|
+ class="inline-flex items-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500">
|
|
|
+ <svg class="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 20 20">
|
|
|
+ <path fill-rule="evenodd" d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z" clip-rule="evenodd"/>
|
|
|
+ </svg>
|
|
|
+ Add Hreflang
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Save Button -->
|
|
|
+ <div class="pt-6 border-t border-gray-200">
|
|
|
+ <button type="submit" class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors">
|
|
|
+ <svg class="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 20 20">
|
|
|
+ <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
|
|
|
+ </svg>
|
|
|
+ Save Settings
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- JSON-LD Tab -->
|
|
|
+ <div x-show="activeTab === 'jsonld'" class="bg-white rounded-lg shadow-sm">
|
|
|
+ <div class="p-6 space-y-8">
|
|
|
+
|
|
|
+ <!-- Organization Settings -->
|
|
|
+ <div>
|
|
|
+ <h3 class="text-lg font-medium text-gray-900 mb-6 flex items-center">
|
|
|
+ <svg class="w-5 h-5 mr-2 text-blue-600" fill="currentColor" viewBox="0 0 20 20">
|
|
|
+ <path fill-rule="evenodd" d="M4 4a2 2 0 012-2h8a2 2 0 012 2v12a1 1 0 110 2h-3a1 1 0 01-1-1v-2a1 1 0 00-1-1H9a1 1 0 00-1 1v2a1 1 0 01-1 1H4a1 1 0 110-2V4z" clip-rule="evenodd"/>
|
|
|
+ </svg>
|
|
|
+ Organization
|
|
|
+ </h3>
|
|
|
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Organization Name</label>
|
|
|
+ <input type="text" name='jsonld[organization_name]' value="<?= htmlspecialchars($jsonld['organization_name'] ?? '') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Organization URL</label>
|
|
|
+ <input type="url" name='jsonld[organization_url]' value="<?= htmlspecialchars($jsonld['organization_url'] ?? '') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Same As URLs (one per line)</label>
|
|
|
+ <textarea name='jsonld[organization_same_as]' rows="4"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"><?= htmlspecialchars($jsonld['organization_same_as'] ?? '') ?></textarea>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">License URL</label>
|
|
|
+ <input type="url" name='jsonld[license_url]' value="<?= htmlspecialchars($jsonld['license_url'] ?? '') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Breadcrumb Settings -->
|
|
|
+ <div>
|
|
|
+ <h3 class="text-lg font-medium text-gray-900 mb-6 flex items-center">
|
|
|
+ <svg class="w-5 h-5 mr-2 text-blue-600" fill="currentColor" viewBox="0 0 20 20">
|
|
|
+ <path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"/>
|
|
|
+ </svg>
|
|
|
+ Breadcrumbs
|
|
|
+ </h3>
|
|
|
+ <div class="grid grid-cols-1 gap-6">
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Breadcrumb Home Name</label>
|
|
|
+ <input type="text" name='jsonld[breadcrumb_home_name]' value="<?= htmlspecialchars($jsonld['breadcrumb_home_name'] ?? '') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Rating & Review Settings -->
|
|
|
+ <div>
|
|
|
+ <h3 class="text-lg font-medium text-gray-900 mb-6 flex items-center">
|
|
|
+ <svg class="w-5 h-5 mr-2 text-blue-600" fill="currentColor" viewBox="0 0 20 20">
|
|
|
+ <path fill-rule="evenodd" d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" clip-rule="evenodd"/>
|
|
|
+ </svg>
|
|
|
+ Reviews & Ratings
|
|
|
+ </h3>
|
|
|
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Rating Value</label>
|
|
|
+ <input type="number" step="0.1" min="1" max="5" name='jsonld[rating_value]' value="<?= htmlspecialchars($jsonld['rating_value'] ?? '') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Best Rating</label>
|
|
|
+ <input type="number" name='jsonld[best_rating]' value="<?= htmlspecialchars($jsonld['best_rating'] ?? '5') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Worst Rating</label>
|
|
|
+ <input type="number" name='jsonld[worst_rating]' value="<?= htmlspecialchars($jsonld['worst_rating'] ?? '1') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Review Count</label>
|
|
|
+ <input type="number" name='jsonld[review_count]' value="<?= htmlspecialchars($jsonld['review_count'] ?? '') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Software Application Settings -->
|
|
|
+ <div>
|
|
|
+ <h3 class="text-lg font-medium text-gray-900 mb-6 flex items-center">
|
|
|
+ <svg class="w-5 h-5 mr-2 text-blue-600" fill="currentColor" viewBox="0 0 20 20">
|
|
|
+ <path fill-rule="evenodd" d="M3 4a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H4a1 1 0 01-1-1v-6zM14 9a1 1 0 00-1 1v6a1 1 0 001 1h2a1 1 0 001-1v-6a1 1 0 00-1-1h-2z" clip-rule="evenodd"/>
|
|
|
+ </svg>
|
|
|
+ Software Application
|
|
|
+ </h3>
|
|
|
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">App Name</label>
|
|
|
+ <input type="text" name='jsonld[app_name]' value="<?= htmlspecialchars($jsonld['app_name'] ?? '') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Operating System</label>
|
|
|
+ <input type="text" name='jsonld[operating_system]' value="<?= htmlspecialchars($jsonld['operating_system'] ?? '') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Application Category</label>
|
|
|
+ <input type="text" name='jsonld[application_category]' value="<?= htmlspecialchars($jsonld['application_category'] ?? '') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 mb-2">Download URL</label>
|
|
|
+ <input type="url" name='jsonld[download_url]' value="<?= htmlspecialchars($jsonld['download_url'] ?? '') ?>"
|
|
|
+ class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Save Button -->
|
|
|
+ <div class="pt-6 border-t border-gray-200">
|
|
|
+ <button type="submit" class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors">
|
|
|
+ <svg class="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 20 20">
|
|
|
+ <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
|
|
|
+ </svg>
|
|
|
+ Save JSON-LD Settings
|
|
|
+ </button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|