Updated: Shoppin cart and checkout workflow
201
README.md
|
|
@ -1,59 +1,184 @@
|
|||
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
|
||||
<a href="https://laravel.com" target="_blank">
|
||||
<img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="300" alt="Laravel Logo">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## About Laravel
|
||||
<h1 align="center">Tani Desa</h1>
|
||||
|
||||
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
|
||||
<p align="center">
|
||||
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
|
||||
</p>
|
||||
|
||||
- [Simple, fast routing engine](https://laravel.com/docs/routing).
|
||||
- [Powerful dependency injection container](https://laravel.com/docs/container).
|
||||
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
|
||||
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
|
||||
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
|
||||
- [Robust background job processing](https://laravel.com/docs/queues).
|
||||
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
|
||||
<p align="center">
|
||||
<strong>Platform digital terintegrasi untuk menghubungkan Petani lokal dengan Konsumen secara langsung (Direct-to-Consumer).</strong>
|
||||
</p>
|
||||
|
||||
Laravel is accessible, powerful, and provides tools required for large, robust applications.
|
||||
<hr>
|
||||
|
||||
## Learning Laravel
|
||||
## 📑 Table of Contents
|
||||
|
||||
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. You can also check out [Laravel Learn](https://laravel.com/learn), where you will be guided through building a modern Laravel application.
|
||||
- [About the Project](#-about-the-project)
|
||||
- [System Architecture](#-system-architecture)
|
||||
- [Key Features](#-key-features)
|
||||
- [Prerequisites](#-prerequisites)
|
||||
- [Installation Guide](#-installation-guide)
|
||||
- [Access Management (Seeders)](#-access-management-seeders)
|
||||
- [Development Roadmap](#-development-roadmap)
|
||||
- [License](#-license)
|
||||
|
||||
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
|
||||
---
|
||||
|
||||
## Laravel Sponsors
|
||||
## 📖 About the Project
|
||||
|
||||
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
|
||||
**Tani Desa** adalah solusi perangkat lunak berbasis web yang dirancang untuk mendigitalisasi proses jual-beli komoditas pertanian desa. Sistem ini bertujuan memotong rantai distribusi yang panjang dengan memfasilitasi transaksi langsung antara produsen (Petani) dan konsumen akhir.
|
||||
|
||||
### Premium Partners
|
||||
Sistem ini dibangun menggunakan arsitektur **Monolithic** dengan framework **Laravel**, serta antarmuka modern yang responsif menggunakan **Bootstrap 5 CSS**.
|
||||
|
||||
- **[Vehikl](https://vehikl.com)**
|
||||
- **[Tighten Co.](https://tighten.co)**
|
||||
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
|
||||
- **[64 Robots](https://64robots.com)**
|
||||
- **[Curotec](https://www.curotec.com/services/technologies/laravel)**
|
||||
- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
|
||||
- **[Redberry](https://redberry.international/laravel-development)**
|
||||
- **[Active Logic](https://activelogic.com)**
|
||||
---
|
||||
|
||||
## Contributing
|
||||
## 🛠 System Architecture
|
||||
|
||||
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
|
||||
Aplikasi ini dikembangkan menggunakan *Tech Stack* modern dengan spesifikasi berikut:
|
||||
|
||||
## Code of Conduct
|
||||
| Komponen | Teknologi | Versi / Detail |
|
||||
| :--- | :--- | :--- |
|
||||
| **Backend Framework** | Laravel | v12.x |
|
||||
| **Language** | PHP | v8.2+ |
|
||||
| **Database** | MySQL / MariaDB | Relational Database |
|
||||
| **Frontend Styling** | Bootstrap 5 CSS | v4.x (Latest) |
|
||||
|
||||
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
|
||||
---
|
||||
|
||||
## Security Vulnerabilities
|
||||
## Key Features
|
||||
|
||||
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
|
||||
Sistem dibagi menjadi tiga modul utama berdasarkan *User Roles*:
|
||||
|
||||
## License
|
||||
### 1. Admin Desa (Administrator)
|
||||
*Bertugas memverifikasi petani dan memantau sistem.*
|
||||
- [x] **Login Admin:** Halaman login khusus admin.
|
||||
- [ ] **Dashboard Admin:** Statistik ringkas jumlah petani dan status verifikasi.
|
||||
- [x] **Verifikasi Petani:** Melihat daftar pendaftar, menyetujui (Approve), atau menolak (Reject) akun petani.
|
||||
- [ ] **Monitoring Transaksi:** Memantau seluruh aktivitas transaksi di platform (View Only).
|
||||
|
||||
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
|
||||
### 2. Petani (Penjual)
|
||||
*Hanya bisa berjualan setelah akun diverifikasi oleh Admin Desa.*
|
||||
- [ ] **Registrasi Petani:** Pendaftaran akun dengan status awal "Menunggu Persetujuan".
|
||||
- [ ] **Dashboard Petani:** Ringkasan aktivitas toko.
|
||||
- [x] **Manajemen Produk (CRUD):** Tambah, Edit, Hapus, dan Lihat daftar produk pertanian.
|
||||
- [ ] **Manajemen Pesanan:** Menerima pesanan masuk dan mengubah status menjadi "Dikirim".
|
||||
- [ ] **Kotak Masuk (Pesan):** Fitur tanya jawab dengan pembeli.
|
||||
|
||||
### 3. Pembeli (Publik)
|
||||
*Pengguna umum yang membeli produk pertanian.*
|
||||
- [ ] **Registrasi & Login:** Membuat akun pembeli.
|
||||
- [x] **Katalog Produk:** Melihat dan mencari produk yang dijual petani.
|
||||
- [x] **Detail Produk:** Melihat rincian produk.
|
||||
- [x] **Keranjang Belanja:** Menambah produk ke cart sebelum checkout.
|
||||
- [ ] **Checkout (Transaksi):** Melakukan pemesanan barang (Metode COD).
|
||||
- [ ] **Riwayat Transaksi:** Melacak status pesanan (Diproses/Dikirim/Selesai).
|
||||
- [ ] **Kirim Pesan:** Menghubungi petani terkait produk.
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Sebelum melakukan instalasi, pastikan lingkungan server lokal Anda memenuhi persyaratan berikut:
|
||||
|
||||
- **PHP** >= 8.1
|
||||
- **Composer** (PHP Dependency Manager)
|
||||
- **MySQL** Database Server
|
||||
- **Git** Version Control
|
||||
|
||||
---
|
||||
|
||||
## Installation Guide
|
||||
|
||||
Ikuti langkah-langkah berikut untuk menjalankan proyek di lingkungan pengembangan lokal (*Local Environment*):
|
||||
|
||||
### Step 1: Clone Repository
|
||||
Unduh kode sumber dari repositori.
|
||||
```bash
|
||||
git clone [https://github.com/sayasilvi/web-pertanian.git)
|
||||
cd web-pertanian
|
||||
```
|
||||
|
||||
### Step 2: Install Backend Dependencies
|
||||
Install library PHP melalui Composer.
|
||||
|
||||
```bash
|
||||
composer install
|
||||
```
|
||||
|
||||
### Step 3: Install Frontend Dependencies
|
||||
Install library JavaScript.
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
### Step 4: Environment Configuration
|
||||
Salin file konfigurasi dan sesuaikan kredensial database.
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
*Edit file `.env` lalu atur parameter `DB_DATABASE`, `DB_USERNAME`, dan `DB_PASSWORD` sesuai konfigurasi lokal Anda.*
|
||||
|
||||
### Step 5: Application Key & Database
|
||||
Generate key aplikasi dan jalankan migrasi database serta seeder data dummy.
|
||||
|
||||
```bash
|
||||
php artisan key:generate
|
||||
php artisan migrate --seed
|
||||
```
|
||||
|
||||
### Step 6: Start Application
|
||||
**Terminal (Laravel Server):**
|
||||
```bash
|
||||
php artisan serve
|
||||
```
|
||||
|
||||
Aplikasi dapat diakses melalui browser di: `http://localhost:8000` atau `http://127.0.0.1:8000`
|
||||
|
||||
---
|
||||
|
||||
## Access Management (Seeders)
|
||||
|
||||
Berikut adalah kredensial default yang dibuat oleh sistem *Seeder* untuk keperluan *User Acceptance Testing (UAT)*:
|
||||
|
||||
### Administrator
|
||||
| Role | Username | Password | Access Level |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| **Super Admin** | `admin` | `password123` | Full Access |
|
||||
|
||||
### Vendors (Petani)
|
||||
| Account Name | Username | Password | Status | Notes |
|
||||
| :--- | :--- | :--- | :--- | :--- |
|
||||
| **Siti Sayur** | `siti_sayur` | `password123` | <span style="color:green">**Active**</span> | Dapat Login & Jualan |
|
||||
| **Budi Tani** | `budi_tani` | `password123` | <span style="color:orange">**Pending**</span> | Menunggu Approval Admin |
|
||||
| **Joko Tani** | `joko_tani` | `password123` | <span style="color:red">**Rejected**</span> | Akses Ditolak |
|
||||
|
||||
### Customers (Pembeli)
|
||||
| Account Name | Username | Password |
|
||||
| :--- | :--- | :--- |
|
||||
| **Andi Pembeli** | `andi_beli` | `password123` |
|
||||
| **Rina Sayur** | `rina_sayur` | `password123` |
|
||||
|
||||
---
|
||||
|
||||
## Development Roadmap
|
||||
|
||||
Status pengembangan fitur saat ini:
|
||||
|
||||
- [x] **Core:** Authentication & Role Management
|
||||
- [x] **Core:** Database Schema & Migration
|
||||
- [x] **Module:** Admin Verification Workflow
|
||||
- [x] **Module:** Shopping Cart & Checkout
|
||||
- [ ] **Module:** Product Management (Vendor)
|
||||
- [ ] **Feature:** Transaction History Tracking
|
||||
- [ ] **Feature:** In-app Messaging System
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -7,17 +7,14 @@
|
|||
|
||||
class AdminController extends Controller
|
||||
{
|
||||
// Tampilkan Dashboard Utama Admin
|
||||
public function dashboard()
|
||||
{
|
||||
return view('admin.dashboard');
|
||||
}
|
||||
|
||||
// Tampilkan Daftar Antrian Verifikasi
|
||||
public function verifikasiIndex()
|
||||
{
|
||||
// Ambil data petani yang statusnya 'menunggu'
|
||||
// Disini ambil semua biar admin bisa pantau histori juga
|
||||
$petanis = Petani::orderBy('created_at', 'desc')->get();
|
||||
|
||||
return view('admin.verifikasi.index', compact('petanis'));
|
||||
|
|
|
|||
|
|
@ -10,13 +10,11 @@
|
|||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
// --- HALAMAN LOGIN ---
|
||||
public function showLoginForm()
|
||||
{
|
||||
return view('auth.login');
|
||||
}
|
||||
|
||||
// --- PROSES LOGIN ---
|
||||
public function loginProcess(Request $request)
|
||||
{
|
||||
// Validasi Input
|
||||
|
|
@ -58,19 +56,16 @@ public function loginProcess(Request $request)
|
|||
return redirect()->intended('petani/dashboard');
|
||||
}
|
||||
|
||||
// Jika semua gagal
|
||||
return back()->withErrors([
|
||||
'username' => 'Username atau password salah.',
|
||||
]);
|
||||
}
|
||||
|
||||
// --- HALAMAN REGISTER ---
|
||||
public function showRegisterForm()
|
||||
{
|
||||
return view('auth.register');
|
||||
}
|
||||
|
||||
// --- PROSES REGISTER ---
|
||||
public function registerProcess(Request $request)
|
||||
{
|
||||
// Validasi
|
||||
|
|
@ -109,7 +104,6 @@ public function registerProcess(Request $request)
|
|||
}
|
||||
}
|
||||
|
||||
// --- LOGOUT ---
|
||||
public function logout(Request $request)
|
||||
{
|
||||
if (Auth::guard('admin')->check()) Auth::guard('admin')->logout();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Produk;
|
||||
|
||||
class CartController extends Controller
|
||||
{
|
||||
// Menampilkan Halaman Keranjang
|
||||
public function index()
|
||||
{
|
||||
$cart = session()->get('cart', []);
|
||||
return view('landing.cart', compact('cart'));
|
||||
}
|
||||
|
||||
// Menambahkan Produk ke Session Keranjang
|
||||
public function addToCart(Request $request)
|
||||
{
|
||||
$id = $request->id;
|
||||
$produk = Produk::findOrFail($id);
|
||||
|
||||
$cart = session()->get('cart', []);
|
||||
|
||||
// Jika produk sudah ada di cart, tambahkan jumlahnya
|
||||
if(isset($cart[$id])) {
|
||||
$cart[$id]['quantity'] += $request->qty;
|
||||
} else {
|
||||
// Jika belum ada, masukkan data baru
|
||||
$cart[$id] = [
|
||||
"name" => $produk->nama_produk,
|
||||
"quantity" => $request->qty,
|
||||
"price" => $produk->harga,
|
||||
"photo" => $produk->foto_produk
|
||||
];
|
||||
}
|
||||
|
||||
session()->put('cart', $cart);
|
||||
return redirect()->back()->with('success', 'Produk berhasil masuk keranjang!');
|
||||
}
|
||||
|
||||
// Menghapus Item dari Keranjang
|
||||
public function remove(Request $request)
|
||||
{
|
||||
if($request->id) {
|
||||
$cart = session()->get('cart');
|
||||
if(isset($cart[$request->id])) {
|
||||
unset($cart[$request->id]);
|
||||
session()->put('cart', $cart);
|
||||
}
|
||||
return redirect()->back()->with('success', 'Produk dihapus dari keranjang');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CheckoutController extends Controller
|
||||
{
|
||||
/**
|
||||
* Menampilkan halaman checkout.
|
||||
* Mengecek apakah user punya item di keranjang sebelum masuk ke sini.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$cart = session()->get('cart');
|
||||
if (!$cart || count($cart) == 0) {
|
||||
return redirect()->route('shop')->with('error', 'Keranjang Anda kosong, silahkan belanja produk terlebih dahulu.');
|
||||
}
|
||||
|
||||
return view('landing.checkout', compact('cart'));
|
||||
}
|
||||
}
|
||||
|
|
@ -7,14 +7,12 @@
|
|||
|
||||
class LandingController extends Controller
|
||||
{
|
||||
// Halaman Utama
|
||||
public function index()
|
||||
{
|
||||
$produks = Produk::latest()->take(8)->get();
|
||||
return view('landing.home', compact('produks'));
|
||||
}
|
||||
|
||||
// Halaman Shop
|
||||
public function shop(Request $request)
|
||||
{
|
||||
$query = Produk::query();
|
||||
|
|
@ -28,7 +26,6 @@ public function shop(Request $request)
|
|||
return view('landing.shop', compact('produks'));
|
||||
}
|
||||
|
||||
// Halaman Detail Produk
|
||||
public function detail($id)
|
||||
{
|
||||
$produk = Produk::with('petani')->findOrFail($id);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,83 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Transaksi;
|
||||
use App\Models\DetailTransaksi;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class TransaksiController extends Controller
|
||||
{
|
||||
/**
|
||||
* PROSES CHECKOUT / MENYIMPAN TRANSAKSI.
|
||||
* Menggunakan DB Transaction agar data header dan detail tersimpan atomik (bersamaan).
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$cart = session()->get('cart');
|
||||
|
||||
// Validasi Keranjang (Backend validation)
|
||||
if (!$cart) {
|
||||
return redirect()->route('shop')->with('error', 'Keranjang kosong!');
|
||||
}
|
||||
|
||||
// Validasi Input User
|
||||
$request->validate([
|
||||
'alamat_pengiriman' => 'required|string|max:500',
|
||||
'no_hp' => 'required|numeric',
|
||||
'nama_lengkap' => 'required|string|max:255',
|
||||
]);
|
||||
|
||||
try {
|
||||
DB::beginTransaction();
|
||||
|
||||
$subtotal = $this->hitungSubtotal($cart);
|
||||
$ongkir = 10000;
|
||||
$total_bayar = $subtotal + $ongkir;
|
||||
|
||||
$transaksi = Transaksi::create([
|
||||
'pembeli_id' => Auth::guard('pembeli')->id(),
|
||||
'tanggal_transaksi' => now(),
|
||||
'alamat_pengiriman' => $request->alamat_pengiriman,
|
||||
'total_harga' => $total_bayar,
|
||||
'status' => 'pending',
|
||||
'kode_invoice' => 'INV/' . date('Ymd') . '/' . mt_rand(1000, 9999),
|
||||
'catatan' => $request->catatan,
|
||||
]);
|
||||
|
||||
foreach ($cart as $id_produk => $details) {
|
||||
DetailTransaksi::create([
|
||||
'transaksi_id' => $transaksi->id,
|
||||
'produk_id' => $id_produk,
|
||||
'jumlah' => $details['quantity'],
|
||||
'harga_satuan' => $details['price'],
|
||||
'subtotal' => $details['price'] * $details['quantity'],
|
||||
]);
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
|
||||
session()->forget('cart');
|
||||
|
||||
return redirect()->route('home')->with('success', 'Pesanan berhasil dibuat! Kode Invoice: ' . $transaksi->kode_invoice);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
return redirect()->back()->with('error', 'Terjadi kesalahan saat memproses transaksi: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper untuk menghitung subtotal belanjaan dari session.
|
||||
*/
|
||||
private function hitungSubtotal($cart)
|
||||
{
|
||||
$total = 0;
|
||||
foreach($cart as $id => $details) {
|
||||
$total += $details['price'] * $details['quantity'];
|
||||
}
|
||||
return $total;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class PembeliSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$data = [
|
||||
[
|
||||
'nama_lengkap' => 'Andi Pembeli',
|
||||
'username' => 'andi_beli',
|
||||
'password' => Hash::make('password123'),
|
||||
'no_hp' => '081298765432',
|
||||
'alamat' => 'Jl. Merdeka No. 45, Kota Sejahtera',
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
],
|
||||
[
|
||||
'nama_lengkap' => 'Rina Suka Sayur',
|
||||
'username' => 'rina_sayur',
|
||||
'password' => Hash::make('password123'),
|
||||
'no_hp' => '085612345678',
|
||||
'alamat' => 'Perumahan Griya Asri Blok B2, Desa Sukamaju',
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
],
|
||||
];
|
||||
|
||||
DB::table('pembelis')->insert($data);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,138 +0,0 @@
|
|||
.nice-select {
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
background-color: #fff;
|
||||
border-radius: 5px;
|
||||
border: solid 1px #e8e8e8;
|
||||
box-sizing: border-box;
|
||||
clear: both;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
float: left;
|
||||
font-family: inherit;
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
height: 42px;
|
||||
line-height: 40px;
|
||||
outline: none;
|
||||
padding-left: 18px;
|
||||
padding-right: 30px;
|
||||
position: relative;
|
||||
text-align: left !important;
|
||||
-webkit-transition: all 0.2s ease-in-out;
|
||||
transition: all 0.2s ease-in-out;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
white-space: nowrap;
|
||||
width: auto; }
|
||||
.nice-select:hover {
|
||||
border-color: #dbdbdb; }
|
||||
.nice-select:active, .nice-select.open, .nice-select:focus {
|
||||
border-color: #999; }
|
||||
.nice-select:after {
|
||||
border-bottom: 2px solid #999;
|
||||
border-right: 2px solid #999;
|
||||
content: '';
|
||||
display: block;
|
||||
height: 5px;
|
||||
margin-top: -4px;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
right: 12px;
|
||||
top: 50%;
|
||||
-webkit-transform-origin: 66% 66%;
|
||||
-ms-transform-origin: 66% 66%;
|
||||
transform-origin: 66% 66%;
|
||||
-webkit-transform: rotate(45deg);
|
||||
-ms-transform: rotate(45deg);
|
||||
transform: rotate(45deg);
|
||||
-webkit-transition: all 0.15s ease-in-out;
|
||||
transition: all 0.15s ease-in-out;
|
||||
width: 5px; }
|
||||
.nice-select.open:after {
|
||||
-webkit-transform: rotate(-135deg);
|
||||
-ms-transform: rotate(-135deg);
|
||||
transform: rotate(-135deg); }
|
||||
.nice-select.open .list {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
-webkit-transform: scale(1) translateY(0);
|
||||
-ms-transform: scale(1) translateY(0);
|
||||
transform: scale(1) translateY(0); }
|
||||
.nice-select.disabled {
|
||||
border-color: #ededed;
|
||||
color: #999;
|
||||
pointer-events: none; }
|
||||
.nice-select.disabled:after {
|
||||
border-color: #cccccc; }
|
||||
.nice-select.wide {
|
||||
width: 100%; }
|
||||
.nice-select.wide .list {
|
||||
left: 0 !important;
|
||||
right: 0 !important; }
|
||||
.nice-select.right {
|
||||
float: right; }
|
||||
.nice-select.right .list {
|
||||
left: auto;
|
||||
right: 0; }
|
||||
.nice-select.small {
|
||||
font-size: 12px;
|
||||
height: 36px;
|
||||
line-height: 34px; }
|
||||
.nice-select.small:after {
|
||||
height: 4px;
|
||||
width: 4px; }
|
||||
.nice-select.small .option {
|
||||
line-height: 34px;
|
||||
min-height: 34px; }
|
||||
.nice-select .list {
|
||||
background-color: #fff;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 0 0 1px rgba(68, 68, 68, 0.11);
|
||||
box-sizing: border-box;
|
||||
margin-top: 4px;
|
||||
opacity: 0;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
-webkit-transform-origin: 50% 0;
|
||||
-ms-transform-origin: 50% 0;
|
||||
transform-origin: 50% 0;
|
||||
-webkit-transform: scale(0.75) translateY(-21px);
|
||||
-ms-transform: scale(0.75) translateY(-21px);
|
||||
transform: scale(0.75) translateY(-21px);
|
||||
-webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
|
||||
transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
|
||||
z-index: 9; }
|
||||
.nice-select .list:hover .option:not(:hover) {
|
||||
background-color: transparent !important; }
|
||||
.nice-select .option {
|
||||
cursor: pointer;
|
||||
font-weight: 400;
|
||||
line-height: 40px;
|
||||
list-style: none;
|
||||
min-height: 40px;
|
||||
outline: none;
|
||||
padding-left: 18px;
|
||||
padding-right: 29px;
|
||||
text-align: left;
|
||||
-webkit-transition: all 0.2s;
|
||||
transition: all 0.2s; }
|
||||
.nice-select .option:hover, .nice-select .option.focus, .nice-select .option.selected.focus {
|
||||
background-color: #f6f6f6; }
|
||||
.nice-select .option.selected {
|
||||
font-weight: bold; }
|
||||
.nice-select .option.disabled {
|
||||
background-color: transparent;
|
||||
color: #999;
|
||||
cursor: default; }
|
||||
|
||||
.no-csspointerevents .nice-select .list {
|
||||
display: none; }
|
||||
|
||||
.no-csspointerevents .nice-select.open .list {
|
||||
display: block; }
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
/**
|
||||
* Owl Carousel v2.3.4
|
||||
* Copyright 2013-2018 David Deutsch
|
||||
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
|
||||
*/
|
||||
.owl-carousel,.owl-carousel .owl-item{-webkit-tap-highlight-color:transparent;position:relative}.owl-carousel{display:none;width:100%;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y;touch-action:manipulation;-moz-backface-visibility:hidden}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item,.owl-carousel .owl-wrapper{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0)}.owl-carousel .owl-item{min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%}.owl-carousel .owl-dots.disabled,.owl-carousel .owl-nav.disabled{display:none}.no-js .owl-carousel,.owl-carousel.owl-loaded{display:block}.owl-carousel .owl-dot,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-nav .owl-prev{cursor:pointer;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel .owl-nav button.owl-next,.owl-carousel .owl-nav button.owl-prev,.owl-carousel button.owl-dot{background:0 0;color:inherit;border:none;padding:0!important;font:inherit}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{visibility:hidden}.owl-carousel.owl-drag .owl-item{-ms-touch-action:pan-y;touch-action:pan-y;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.owl-carousel .animated{animation-duration:1s;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{animation-name:fadeOut}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height .5s ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity .4s ease}.owl-carousel .owl-item .owl-lazy:not([src]),.owl-carousel .owl-item .owl-lazy[src^=""]{max-height:0}.owl-carousel .owl-item img.owl-lazy{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:transform .1s ease}.owl-carousel .owl-video-play-icon:hover{-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity .4s ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
/*!
|
||||
* SlickNav Responsive Mobile Menu v1.0.10
|
||||
* (c) 2016 Josh Cope
|
||||
* licensed under MIT
|
||||
*/.slicknav_btn,.slicknav_nav .slicknav_item{cursor:pointer}.slicknav_menu,.slicknav_menu *{box-sizing:border-box}.slicknav_btn{position:relative;display:block;vertical-align:middle;float:right;padding:.438em .625em;line-height:1.125em}.slicknav_btn .slicknav_icon-bar+.slicknav_icon-bar{margin-top:.188em}.slicknav_menu .slicknav_menutxt{display:block;line-height:1.188em;float:left;color:#fff;font-weight:700;text-shadow:0 1px 3px #000}.slicknav_menu .slicknav_icon{float:left;width:1.125em;height:.875em;margin:.188em 0 0 .438em}.slicknav_menu .slicknav_icon:before{background:0 0;width:1.125em;height:.875em;display:block;content:"";position:absolute}.slicknav_menu .slicknav_no-text{margin:0}.slicknav_menu .slicknav_icon-bar{display:block;width:1.125em;height:.125em;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,.25);box-shadow:0 1px 0 rgba(0,0,0,.25)}.slicknav_menu:after,.slicknav_menu:before{content:" ";display:table}.slicknav_menu:after{clear:both}.slicknav_nav li,.slicknav_nav ul{display:block}.slicknav_nav .slicknav_arrow{font-size:.8em;margin:0 0 0 .4em}.slicknav_nav .slicknav_item a{display:inline}.slicknav_nav .slicknav_row,.slicknav_nav a{display:block}.slicknav_nav .slicknav_parent-link a{display:inline}.slicknav_menu{*zoom:1;font-size:16px;background:#4c4c4c;padding:5px}.slicknav_nav,.slicknav_nav ul{list-style:none;overflow:hidden;padding:0}.slicknav_menu .slicknav_icon-bar{background-color:#fff}.slicknav_btn{margin:5px 5px 6px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,.75);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:#222}.slicknav_nav{clear:both;color:#fff;margin:0;font-size:.875em}.slicknav_nav ul{margin:0 0 0 20px}.slicknav_nav .slicknav_row,.slicknav_nav a{padding:5px 10px;margin:2px 5px}.slicknav_nav .slicknav_row:hover{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;background:#ccc;color:#fff}.slicknav_nav a{text-decoration:none;color:#fff}.slicknav_nav a:hover{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;background:#ccc;color:#222}.slicknav_nav .slicknav_txtnode{margin-left:15px}.slicknav_nav .slicknav_item a,.slicknav_nav .slicknav_parent-link a{padding:0;margin:0}.slicknav_brand{float:left;color:#fff;font-size:18px;line-height:30px;padding:7px 12px;height:44px}
|
||||
|
Before Width: | Height: | Size: 271 KiB |
|
Before Width: | Height: | Size: 434 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 285 KiB |
|
Before Width: | Height: | Size: 313 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 135 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 516 B |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 19 KiB |