diff --git a/TugasAkhir/Login.php b/TugasAkhir/Login.php new file mode 100644 index 0000000..30cda0a --- /dev/null +++ b/TugasAkhir/Login.php @@ -0,0 +1,92 @@ +connect_error) { + die("Koneksi ke database gagal: " . $conn->connect_error); +} + +// Mengambil data dari halaman login +if ($_SERVER["REQUEST_METHOD"] == "POST") { + $username = $_POST["username"]; + $password = $_POST["password"]; + + // Query untuk memeriksa apakah pengguna ada di database + $sql = "SELECT * FROM user WHERE username='$username' AND password='$password' AND id_role = 1"; + $result = $conn->query($sql); + + if ($result->num_rows == 1) { + // Pengguna berhasil login + session_start(); + $_SESSION["username"] = $username; + header("Location: dashboard.php"); // Redirect ke halaman home setelah login sukses + } else { + // Login gagal, mungkin tampilkan pesan kesalahan + echo "Login gagal. Periksa kembali username dan password Anda atau pastikan Anda memiliki peran 'Admin'."; + } +} + +$conn->close(); +?> + + + + + + + Login + + + + +
+

Login

+ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +

Not a member? Sign up now + +

+ +
+ + + + + + + + + + + + + + + diff --git a/TugasAkhir/ProjectTA.code-workspace b/TugasAkhir/ProjectTA.code-workspace new file mode 100644 index 0000000..95015b4 --- /dev/null +++ b/TugasAkhir/ProjectTA.code-workspace @@ -0,0 +1,9 @@ +{ + "folders": [ + { + "name": "ProjectTA", + "path": "." + } +], + "settings": {} +} diff --git a/TugasAkhir/README.md b/TugasAkhir/README.md new file mode 100644 index 0000000..b7a8882 --- /dev/null +++ b/TugasAkhir/README.md @@ -0,0 +1,2 @@ +# adminhub +Website ini merupakan hasil slicing dari Figma ke responsive website menggunakan HTML, CSS, dan JavaScript diff --git a/TugasAkhir/api/addlatLng.php b/TugasAkhir/api/addlatLng.php new file mode 100644 index 0000000..5ff7647 --- /dev/null +++ b/TugasAkhir/api/addlatLng.php @@ -0,0 +1,20 @@ + true)); + } else { + echo json_encode(array('success' => false, 'error' => 'Failed to insert latLng')); + } + mysqli_close($db); + ?> \ No newline at end of file diff --git a/TugasAkhir/api/checkLatLng.php b/TugasAkhir/api/checkLatLng.php new file mode 100644 index 0000000..e17d7d4 --- /dev/null +++ b/TugasAkhir/api/checkLatLng.php @@ -0,0 +1,26 @@ + 0) { + // Data ditemukan + $row = mysqli_fetch_assoc($result); + $latitude = $row['latitude']; + $longitude = $row['longitude']; + + echo json_encode(array('success' => true, 'latitude' => $latitude, 'longitude' => $longitude)); +} else { + // Data tidak ditemukan + echo json_encode(array('success' => false, 'error' => 'Data not found')); +} + +mysqli_close($db); diff --git a/TugasAkhir/api/get-notifikasi.php b/TugasAkhir/api/get-notifikasi.php new file mode 100644 index 0000000..fa6df28 --- /dev/null +++ b/TugasAkhir/api/get-notifikasi.php @@ -0,0 +1,37 @@ + false, 'error' => 'ID User tidak valid')); + exit; +} + +// Prepared statement untuk mengambil notifikasi berdasarkan id_user +$sql = "SELECT * FROM notifikasi WHERE id_user = ?"; +$stmt = mysqli_prepare($db, $sql); +mysqli_stmt_bind_param($stmt, 'i', $id_user); +mysqli_stmt_execute($stmt); + +$result = mysqli_stmt_get_result($stmt); +$notifications = array(); + +// Loop melalui hasil dan menyimpan notifikasi dalam array +while ($row = mysqli_fetch_assoc($result)) { + $notifications[] = $row; +} + +// Mengembalikan notifikasi dalam format JSON +echo json_encode($notifications); + +// Tutup statement +mysqli_stmt_close($stmt); + +// Tutup koneksi +mysqli_close($db); diff --git a/TugasAkhir/api/getcity.php b/TugasAkhir/api/getcity.php new file mode 100644 index 0000000..65a28f4 --- /dev/null +++ b/TugasAkhir/api/getcity.php @@ -0,0 +1,48 @@ + true, 'kota_asal' => $citiesAsal, 'kota_tujuan' => $citiesTujuan)); +} else { + echo json_encode(array('success' => false, 'message' => 'Failed to retrieve cities')); +} + +// Menutup koneksi database +mysqli_close($db); +?> diff --git a/TugasAkhir/api/getdaftar.php b/TugasAkhir/api/getdaftar.php new file mode 100644 index 0000000..264ef79 --- /dev/null +++ b/TugasAkhir/api/getdaftar.php @@ -0,0 +1,36 @@ + 0) { + // Jika data ditemukan, tambahkan ke response + while ($row = mysqli_fetch_assoc($result)) { + $response[] = $row; + } + echo json_encode($response); +} else { + // Jika tidak ada data, kirim pesan JSON + echo json_encode(array('message' => 'Data tidak ditemukan')); +} + +// Tutup koneksi database +mysqli_close($db); diff --git a/TugasAkhir/api/getperjalanansopir.php b/TugasAkhir/api/getperjalanansopir.php new file mode 100644 index 0000000..298a8e6 --- /dev/null +++ b/TugasAkhir/api/getperjalanansopir.php @@ -0,0 +1,38 @@ + 0) { + $response = array(); + while ($row = mysqli_fetch_assoc($result)) { + $response[] = $row; + } + echo json_encode($response); +} else { + echo json_encode(array('message' => 'Data tidak ditemukan')); +} + +mysqli_close($db); diff --git a/TugasAkhir/api/getperjalanansopiractive.php b/TugasAkhir/api/getperjalanansopiractive.php new file mode 100644 index 0000000..a5b8c4c --- /dev/null +++ b/TugasAkhir/api/getperjalanansopiractive.php @@ -0,0 +1,38 @@ + 0) { + $response = array(); + while ($row = mysqli_fetch_assoc($result)) { + $response[] = $row; + } + echo json_encode(array('data' => $response, 'message' => 'ok')); +} else { + echo json_encode(array('message' => 'Data tidak ditemukan')); +} + +mysqli_close($db); diff --git a/TugasAkhir/api/getsopirbyid.php b/TugasAkhir/api/getsopirbyid.php new file mode 100644 index 0000000..13e4ea4 --- /dev/null +++ b/TugasAkhir/api/getsopirbyid.php @@ -0,0 +1,24 @@ +num_rows == 1) { + $row = $result->fetch_assoc(); + unset($row['password']); + unset($row['token']); + + echo json_encode([ + 'message' => "success", + 'sopir' => $row + ]); +} else { + echo json_encode([ + 'success' => false, + 'message' => "Token tidak valid" + ]); +} diff --git a/TugasAkhir/api/getstoryperjalanan.php b/TugasAkhir/api/getstoryperjalanan.php new file mode 100644 index 0000000..5c3ddcf --- /dev/null +++ b/TugasAkhir/api/getstoryperjalanan.php @@ -0,0 +1,52 @@ + 0) { + // Jika data ditemukan, tambahkan ke response + while ($row = mysqli_fetch_assoc($result)) { + // Masukkan data ke dalam array response + $response[] = array( + "id_perjalanan" => $row["id_perjalanan"], + "kota_asal" => $row["kota_asal"], + "kota_tujuan" => $row["kota_tujuan"], + "tanggal" => $row["tanggal"], + "waktu_keberangkatan" => $row["waktu_keberangkatan"], + "harga" => $row["harga"], + "status" => $row["status"], + "jumlah_penumpang" => $row["jumlah_penumpang"], + "total_penumpang" => $row["total_penumpang"] + ); + } + // Mengirimkan response dalam format JSON + echo json_encode($response); +} else { + // Jika tidak ada data, kirim pesan JSON + echo json_encode(array('message' => 'Data tidak ditemukan')); +} + +// Tutup koneksi database +mysqli_close($db); diff --git a/TugasAkhir/api/getuserbyid.php b/TugasAkhir/api/getuserbyid.php new file mode 100644 index 0000000..d245004 --- /dev/null +++ b/TugasAkhir/api/getuserbyid.php @@ -0,0 +1,24 @@ +num_rows == 1) { + $row = $result->fetch_assoc(); + unset($row['password']); + unset($row['token']); + + echo json_encode([ + 'message' => "success", + 'user' => $row + ]); +} else { + echo json_encode([ + 'success' => false, + 'message' => "Token tidak valid" + ]); +} diff --git a/TugasAkhir/api/login.php b/TugasAkhir/api/login.php new file mode 100644 index 0000000..475a806 --- /dev/null +++ b/TugasAkhir/api/login.php @@ -0,0 +1,47 @@ +num_rows == 1) { + $row = $result->fetch_assoc(); + if (password_verify($password, $row['password'])) { + $token = generateRandomToken(); + + $updateTokenQuery = "UPDATE user SET token = '$token' WHERE email = '$email'"; + mysqli_query($db, $updateTokenQuery); + + echo json_encode([ + 'success' => true, + 'message' => "Berhasil Login", + 'user' => $row, + 'token' => $token + ]); + } else { + echo json_encode([ + 'success' => false, + 'message' => "Password Salah" + ]); + } +} else { + echo json_encode([ + 'success' => false, + 'message' => "Email dan Password Salah" + ]); +} + +function generateRandomToken($length = 50) +{ + $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $charactersLength = strlen($characters); + $randomToken = ''; + for ($i = 0; $i < $length; $i++) { + $randomToken .= $characters[rand(0, $charactersLength - 1)]; + } + return $randomToken; +} diff --git a/TugasAkhir/api/login_sopir.php b/TugasAkhir/api/login_sopir.php new file mode 100644 index 0000000..27db53c --- /dev/null +++ b/TugasAkhir/api/login_sopir.php @@ -0,0 +1,39 @@ +num_rows == 1) { + $row = $result->fetch_assoc(); + + if ($row['status'] == 'non_active') { + echo json_encode([ + 'success' => false, + 'message' => "Akun Anda belum aktif mohon hubungi admin." + ]); + } else { + if (password_verify($password, $row['password'])) { + echo json_encode([ + 'success' => true, + 'message' => "Berhasil Login", + 'user' => $row, + ]); + } else { + echo json_encode([ + 'success' => false, + 'message' => "Password Salah" + ]); + } + } +} else { + echo json_encode([ + 'success' => false, + 'message' => "Email dan Password Salah" + ]); +} +?> diff --git a/TugasAkhir/api/midtrans.php b/TugasAkhir/api/midtrans.php new file mode 100644 index 0000000..fdc5072 --- /dev/null +++ b/TugasAkhir/api/midtrans.php @@ -0,0 +1,64 @@ + $api_url, + CURLOPT_RETURNTRANSFER => 1, + CURLOPT_POST => 1, + CURLOPT_HEADER => 0, + // Add header to the request, including Authorization generated from server key + CURLOPT_HTTPHEADER => array( + 'Content-Type: application/json', + 'Accept: application/json', + 'Authorization: Basic ' . base64_encode($server_key . ':') + ), + CURLOPT_POSTFIELDS => $request_body + ); + curl_setopt_array($ch, $curl_options); + $result = array( + 'body' => curl_exec($ch), + 'http_code' => curl_getinfo($ch, CURLINFO_HTTP_CODE), + ); + return $result; +} diff --git a/TugasAkhir/api/new-password-sopir.php b/TugasAkhir/api/new-password-sopir.php new file mode 100644 index 0000000..1c63770 --- /dev/null +++ b/TugasAkhir/api/new-password-sopir.php @@ -0,0 +1,39 @@ + 0) { + $user = mysqli_fetch_assoc($resultUser); + $currentPasswordHash = $user['password']; + + // Verify the old password + if (password_verify($oldPassword, $currentPasswordHash)) { + // Update password in 'user' table + $updateSql = "UPDATE user SET password = '$hashedPassword', reset_password_otp = NULL WHERE email = '" . mysqli_real_escape_string($db, $email) . "'"; + } else { + return array('success' => false, 'message' => 'Old password is incorrect'); + } + } else { + return array('success' => false, 'message' => 'Email not found'); + } + + if (mysqli_query($db, $updateSql)) { + return array('success' => true, 'message' => 'Password updated successfully'); + } else { + return array('success' => false, 'message' => 'Failed to update password'); + } +} + +// API endpoint to update password +if (!empty($_POST['email']) && !empty($_POST['old_password']) && !empty($_POST['new_password'])) { + $email = $_POST['email']; + $oldPassword = $_POST['old_password']; + $newPassword = $_POST['new_password']; + + // Update password + $passwordUpdated = updatePassword($email, $oldPassword, $newPassword); + + echo json_encode($passwordUpdated); +} else { + echo json_encode(array('success' => false, 'message' => 'Email, old password, and new password are required')); +} + +mysqli_close($db); diff --git a/TugasAkhir/api/notifikasi-store.php b/TugasAkhir/api/notifikasi-store.php new file mode 100644 index 0000000..21d412e --- /dev/null +++ b/TugasAkhir/api/notifikasi-store.php @@ -0,0 +1,29 @@ + true)); +} else { + echo json_encode(array('success' => false, 'error' => mysqli_error($db))); +} + +// Close statement +mysqli_stmt_close($insert); + +// Close connection +mysqli_close($db); diff --git a/TugasAkhir/api/paymentLinkGopay.php b/TugasAkhir/api/paymentLinkGopay.php new file mode 100644 index 0000000..7f26710 --- /dev/null +++ b/TugasAkhir/api/paymentLinkGopay.php @@ -0,0 +1,25 @@ + $requestData["payment_type"], + "transaction_details" => [ + "order_id" => isset($requestData["transaction_details"]["order_id"]) ? $requestData["transaction_details"]["order_id"] : "order_id-" . rand(1000, 9999), + "gross_amount" => isset($requestData["transaction_details"]["gross_amount"]) ? $requestData["transaction_details"]["gross_amount"] : 100000 + ], + "qris" => [ + "acquirer" => $requestData["qris"]["acquirer"] + ] +]; + +// Output the response JSON +echo json_encode($responseData); diff --git a/TugasAkhir/api/pesanan.php b/TugasAkhir/api/pesanan.php new file mode 100644 index 0000000..348459c --- /dev/null +++ b/TugasAkhir/api/pesanan.php @@ -0,0 +1,67 @@ + $jumlah_penumpang_sekarang) { + echo json_encode(array('success' => false, 'error' => 'Jumlah penumpang melebihi yang tersedia')); + exit; +} + +$new_jumlah_penumpang = $jumlah_penumpang_sekarang - $qty; +$sqlUpdateJumlahPenumpang = "UPDATE daftar_perjalanan SET jumlah_penumpang = '$new_jumlah_penumpang' WHERE id_perjalanan = '$id_perjalanan'"; +if (!mysqli_query($db, $sqlUpdateJumlahPenumpang)) { + echo json_encode(array('success' => false, 'error' => 'Gagal mengupdate jumlah penumpang')); + exit; +} + +// Insert lat-long jemput +// $sqlInsertLatLngJemput = "INSERT INTO lokasi (lat, lng) VALUES ('$lat_jemput', '$lng_jemput')"; +// if (!mysqli_query($db, $sqlInsertLatLngJemput)) { +// echo json_encode(array('success' => false, 'error' => 'Gagal menginsert lokasi jemput')); +// exit; +// } +// $id_lokasi_jemput = mysqli_insert_id($db); + +// Insert lat-long tujuan +$sqlInsertLatLngTujuan = "INSERT INTO lokasi (lat, lng) VALUES ('$lat_tujuan', '$lng_tujuan')"; +if (!mysqli_query($db, $sqlInsertLatLngTujuan)) { + echo json_encode(array('success' => false, 'error' => 'Gagal menginsert lokasi tujuan')); + exit; +} +$id_lokasi_tujuan = mysqli_insert_id($db); + +// Insert pemesanan dengan latlong_jemput dan latlong_tujuan +$sqlInsert = "INSERT INTO pemesanan (id_user, id_perjalanan, order_id, qty, alamat_jemput, alamat_tujuan, waktu_jemput, status, tanggal_pesan, tanggal_berangkat, harga, status_penjemputan, latlong_tujuan) + VALUES ('$id_user', '$id_perjalanan', '$order_id', '$qty', '$alamat_jemput', '$alamat_tujuan', '$waktu_jemput', '$status', '$tanggal_pesan', '$tanggal_berangkat', '$harga', '$status_penjemputan', '$id_lokasi_tujuan')"; +if (mysqli_query($db, $sqlInsert)) { + echo json_encode(array('success' => true)); +} else { + echo json_encode(array('success' => false, 'error' => 'Failed to insert pemesanan')); +} + +mysqli_close($db); diff --git a/TugasAkhir/api/register.php b/TugasAkhir/api/register.php new file mode 100644 index 0000000..5b132a9 --- /dev/null +++ b/TugasAkhir/api/register.php @@ -0,0 +1,35 @@ +query($sqlCheckEmail); + +if ($resultCheckEmail && $resultCheckEmail->num_rows > 0) { + echo json_encode(array('success' => false, 'error' => 'Email sudah terdaftar')); +} else { + $sqlRole = "SELECT id_role FROM role WHERE role = 'pelanggan'"; + $resultRole = $db->query($sqlRole); + + if ($resultRole && $resultRole->num_rows > 0) { + $row = $resultRole->fetch_assoc(); + $role_id = $row['id_role']; + + $sqlInsert = "INSERT INTO user SET nama_lengkap = '$nama_lengkap', id_role = '$role_id', password = '$password', email = '$email', alamat = '$alamat', notelp = '$notelp', nik = '$nik'"; + $resultInsert = $db->query($sqlInsert); + + if ($resultInsert) { + echo json_encode(array('success' => true)); + } else { + echo json_encode(array('success' => false, 'error' => 'Failed to insert user')); + } + } else { + echo json_encode(array('success' => false, 'error' => 'Failed to fetch role_id')); + } +} diff --git a/TugasAkhir/api/register_sopir.php b/TugasAkhir/api/register_sopir.php new file mode 100644 index 0000000..77ec41a --- /dev/null +++ b/TugasAkhir/api/register_sopir.php @@ -0,0 +1,26 @@ +query($sqlCheckUsername); + +if ($resultCheckUsername && $resultCheckUsername->num_rows > 0) { + echo json_encode(array('success' => false, 'error' => 'Username sudah terdaftar')); +} else { + $sqlInsert = "INSERT INTO sopir (nama_lengkap, username, password, no_SIM, alamat, notelp, status) VALUES ('$nama_lengkap', '$username', '$password', '$no_SIM', '$alamat', '$notelp', '$status')"; + $resultInsert = $db->query($sqlInsert); + + if ($resultInsert) { + echo json_encode(array('success' => true)); + } else { + echo json_encode(array('success' => false, 'error' => 'Gagal menyimpan data')); + } +} diff --git a/TugasAkhir/api/reset-password-sopir.php b/TugasAkhir/api/reset-password-sopir.php new file mode 100644 index 0000000..2f456be --- /dev/null +++ b/TugasAkhir/api/reset-password-sopir.php @@ -0,0 +1,57 @@ +SMTPDebug = SMTP::DEBUG_SERVER; + $mail->isSMTP(); + $mail->Host = 'smtp.gmail.com'; + $mail->SMTPAuth = true; + $mail->Username = 'karnando1994@gmail.com'; + $mail->Password = 'rktz hnyc ykyr gbzh'; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; + $mail->Port = 465; + + //Recipients + $mail->setFrom('from@example.com', 'PETTA EXPRESS'); + $mail->addAddress($email); + $mail->addAddress('ellen@example.com'); + $mail->addReplyTo('info@example.com', 'Information'); + + //Content + $mail->isHTML(true); + $mail->Subject = 'Reset Password'; + $mail->Body = 'Your Otp to reset Password is [' . $otp . ']'; + $mail->AltBody = 'Reset password to access codes easy application'; + + if ($mail->send()) + echo 'Message has been sent'; + else echo 'Failed to send otp'; + } catch (Exception $e) { + echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; + } + } else echo 'reset password failed'; + } + } else { + echo "db conn failed"; + } +} else { + echo "All fields is required"; +} diff --git a/TugasAkhir/api/reset-password.php b/TugasAkhir/api/reset-password.php new file mode 100644 index 0000000..4cf4ad5 --- /dev/null +++ b/TugasAkhir/api/reset-password.php @@ -0,0 +1,78 @@ + 0) { + $table = 'user'; + } else { + echo json_encode(array('success' => false, 'message' => 'Email not found')); + exit; + } + + try { + $otp = random_int(100000, 999999); + } catch (Exception $e) { + $otp = rand(100000, 999999); + } + + $sql = "UPDATE $table SET reset_password_otp = '" . $otp . "', password_created_at = '" . date('Y-m-d H:i:s') . "' WHERE email = '" . mysqli_real_escape_string($db, $email) . "'"; + + if (mysqli_query($db, $sql)) { + if (mysqli_affected_rows($db)) { + $mail = new PHPMailer(); + try { + $mail->SMTPDebug = SMTP::DEBUG_SERVER; + + $mail->isSMTP(); + $mail->Host = "smtp.example.com"; + $mail->Port = 465; + $mail->SMTPAuth = true; + $mail->Username = 'suketkepuharjo@gmail.com'; + $mail->Password = 'hske pghu dkmy fwpj'; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; + // $mail->Port = 25; + + //Recipients + $mail->setFrom('from@example.com', 'PETTA EXPRESS'); + $mail->addAddress($email); + $mail->addReplyTo('info@example.com', 'Information'); + + //Content + $mail->isHTML(true); + $mail->Subject = 'Reset Password'; + $mail->Body = 'Your OTP to reset Password is [' . $otp . ']'; + $mail->AltBody = 'Reset password to access codes easy application'; + + if ($mail->send()) { + echo json_encode(array('success' => true, 'message' => 'Email sent successfully')); + } else { + echo json_encode(array('success' => false, 'message' => 'Failed to send OTP')); + } + } catch (Exception $e) { + echo json_encode(array('success' => false, 'message' => 'Message could not be sent. Mailer Error: ' . $mail->ErrorInfo)); + } + } else { + echo json_encode(array('success' => false, 'message' => 'Reset password failed')); + } + } +} else { + echo json_encode(array('success' => false, 'message' => 'DB connection failed')); +} +// } else { +// echo json_encode(array('success' => false, 'message' => 'All fields are required')); +// } diff --git a/TugasAkhir/api/schedule.php b/TugasAkhir/api/schedule.php new file mode 100644 index 0000000..b06c8fb --- /dev/null +++ b/TugasAkhir/api/schedule.php @@ -0,0 +1,43 @@ + date('Y-m-d') || + ($row['tanggal'] == date('Y-m-d') && strtotime($row['waktu_keberangkatan']) > strtotime(date('H:i:s'))) + ) { + $perjalanan[] = $row; + } + } + + if (!empty($perjalanan)) { + echo json_encode(array('message' => 'success', 'data' => $perjalanan)); + } else { + echo json_encode(array('success' => false, 'message' => 'Tidak ada jadwal perjalanan')); + } +} + +mysqli_close($db); diff --git a/TugasAkhir/api/showpemesanan.php b/TugasAkhir/api/showpemesanan.php new file mode 100644 index 0000000..c7570a3 --- /dev/null +++ b/TugasAkhir/api/showpemesanan.php @@ -0,0 +1,33 @@ +" . mysqli_error($db)); +} + +$pemesanan_list = array(); + +while ($row = mysqli_fetch_assoc($result)) { + $pemesanan_list[] = $row; +} + +echo json_encode(array('message' => 'success', 'data' => $pemesanan_list)); + +mysqli_close($db); diff --git a/TugasAkhir/api/status-antar-sopir.php b/TugasAkhir/api/status-antar-sopir.php new file mode 100644 index 0000000..90625f6 --- /dev/null +++ b/TugasAkhir/api/status-antar-sopir.php @@ -0,0 +1,29 @@ + 'Status berhasil diupdate')); +} else { + // Jika update gagal, kirimkan response error + echo json_encode(array('message' => 'Gagal mengupdate status')); +} + +// Tutup koneksi database +mysqli_close($db); diff --git a/TugasAkhir/api/update-sopir.php b/TugasAkhir/api/update-sopir.php new file mode 100644 index 0000000..086bf51 --- /dev/null +++ b/TugasAkhir/api/update-sopir.php @@ -0,0 +1,46 @@ +num_rows == 1) { + // id_sopir valid, lakukan pembaruan data + $update_query = "UPDATE sopir SET + nama_lengkap = '" . $nama_lengkap . "', + notelp = '" . $notelp . "', + username = '" . $username . "', + alamat = '" . $alamat . "', + no_SIM = '" . $no_SIM . "' + WHERE id_sopir = '" . $id_sopir . "'"; + $update_result = mysqli_query($db, $update_query); + + if ($update_result) { + echo json_encode([ + 'success' => true, + 'message' => "Data pengguna berhasil diperbarui" + ]); + } else { + echo json_encode([ + 'success' => false, + 'message' => "Gagal memperbarui data pengguna" + ]); + } +} else { + echo json_encode([ + 'success' => false, + 'message' => "Token tidak valid" + ]); +} diff --git a/TugasAkhir/api/update-status-penjemputan.php b/TugasAkhir/api/update-status-penjemputan.php new file mode 100644 index 0000000..7845ba1 --- /dev/null +++ b/TugasAkhir/api/update-status-penjemputan.php @@ -0,0 +1,29 @@ + 'Status berhasil diupdate')); +} else { + // Jika update gagal, kirimkan response error + echo json_encode(array('message' => 'Gagal mengupdate status')); +} + +// Tutup koneksi database +mysqli_close($db); diff --git a/TugasAkhir/api/update-user.php b/TugasAkhir/api/update-user.php new file mode 100644 index 0000000..172fddb --- /dev/null +++ b/TugasAkhir/api/update-user.php @@ -0,0 +1,46 @@ +num_rows == 1) { + // Token valid, lakukan pembaruan data + $update_query = "UPDATE user SET + nama_lengkap = '" . $nama_lengkap . "', + notelp = '" . $notelp . "', + email = '" . $email . "', + nik = '" . $nik . "', + alamat = '" . $alamat . "' + WHERE token = '" . $token . "'"; + $update_result = mysqli_query($db, $update_query); + + if ($update_result) { + echo json_encode([ + 'success' => true, + 'message' => "Data pengguna berhasil diperbarui" + ]); + } else { + echo json_encode([ + 'success' => false, + 'message' => "Gagal memperbarui data pengguna" + ]); + } +} else { + echo json_encode([ + 'success' => false, + 'message' => "Token tidak valid" + ]); +} diff --git a/TugasAkhir/api/updateStatus.php b/TugasAkhir/api/updateStatus.php new file mode 100644 index 0000000..f756992 --- /dev/null +++ b/TugasAkhir/api/updateStatus.php @@ -0,0 +1,42 @@ + false, 'error' => 'Failed to update status')); + exit; +} + +if ($status == 'Gagal') { + $sqlGetPemesanan = "SELECT * FROM pemesanan WHERE order_id = '$order_id'"; + $result = mysqli_query($db, $sqlGetPemesanan); + $row = mysqli_fetch_assoc($result); + + $qty = $row['qty']; + $id_perjalanan = $row['id_perjalanan']; + + $sqlGetJumlahPenumpang = "SELECT jumlah_penumpang FROM daftar_perjalanan WHERE id_perjalanan = '$id_perjalanan'"; + $result = mysqli_query($db, $sqlGetJumlahPenumpang); + $row = mysqli_fetch_assoc($result); + $jumlah_penumpang_sekarang = $row['jumlah_penumpang']; + + + $new_jumlah_penumpang = $jumlah_penumpang_sekarang + $qty; + $sqlUpdateJumlahPenumpang = "UPDATE daftar_perjalanan SET jumlah_penumpang = '$new_jumlah_penumpang' WHERE id_perjalanan = '$id_perjalanan'"; + if (!mysqli_query($db, $sqlUpdateJumlahPenumpang)) { + echo json_encode(array('success' => false, 'error' => 'Gagal mengupdate jumlah penumpang')); + exit; + } +} + +echo json_encode(array('success' => true)); + +mysqli_close($db); diff --git a/TugasAkhir/api/update_status_sopir.php b/TugasAkhir/api/update_status_sopir.php new file mode 100644 index 0000000..ce41fa1 --- /dev/null +++ b/TugasAkhir/api/update_status_sopir.php @@ -0,0 +1,30 @@ + 'Status berhasil diupdate')); +} else { + // Jika update gagal, kirimkan response error + echo json_encode(array('message' => 'Gagal mengupdate status')); +} + +// Tutup koneksi database +mysqli_close($db); diff --git a/TugasAkhir/api/verifikasi-otp-sopir.php b/TugasAkhir/api/verifikasi-otp-sopir.php new file mode 100644 index 0000000..67558b2 --- /dev/null +++ b/TugasAkhir/api/verifikasi-otp-sopir.php @@ -0,0 +1,39 @@ + 0) { + return true; // OTP verified successfully + } else { + return false; // Invalid OTP for the given email + } +} + +// API endpoint to verify OTP and email +if (!empty($_POST['email']) && !empty($_POST['otp'])) { + $email = $_POST['email']; + $otp = $_POST['otp']; + + // Verify OTP and email + $otpVerified = verifyOTP($email, $otp); + + if ($otpVerified) { + echo "OTP verified successfully"; + } else { + echo "Invalid OTP for the given email"; + } +} else { + echo "Email and OTP are required"; +} diff --git a/TugasAkhir/api/verifikasi-otp.php b/TugasAkhir/api/verifikasi-otp.php new file mode 100644 index 0000000..3d28b31 --- /dev/null +++ b/TugasAkhir/api/verifikasi-otp.php @@ -0,0 +1,51 @@ + 0) { + return true; // OTP verified successfully in 'user' table + } + + // Check if the OTP is valid for the given email in 'sopir' table + $sqlSopir = "SELECT * FROM sopir WHERE email = '" . mysqli_real_escape_string($db, $email) . "' AND reset_password_otp = '" . mysqli_real_escape_string($db, $otp) . "'"; + $resultSopir = mysqli_query($db, $sqlSopir); + + if ($resultSopir && mysqli_num_rows($resultSopir) > 0) { + return true; // OTP verified successfully in 'sopir' table + } + + return false; // Invalid OTP for the given email in both tables +} + +// API endpoint to verify OTP and email +if (!empty($_POST['email']) && !empty($_POST['otp'])) { + $email = $_POST['email']; + $otp = $_POST['otp']; + + // Verify OTP and email + $otpVerified = verifyOTP($email, $otp); + + if ($otpVerified) { + // echo "OTP verified successfully"; + echo json_encode(array('success' => true, 'message' => 'OTP verified successfully')); + } else { + // echo "Invalid OTP for the given email"; + echo json_encode(array('success' => false, 'message' => 'Invalid OTP for the given email')); + } +} else { + // echo "Email and OTP are required"; + echo json_encode(array('success' => false, 'message' => 'Email and OTP are required')); +} diff --git a/TugasAkhir/composer.json b/TugasAkhir/composer.json new file mode 100644 index 0000000..5f4aa6b --- /dev/null +++ b/TugasAkhir/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "phpmailer/phpmailer": "^6.9" + } +} diff --git a/TugasAkhir/composer.lock b/TugasAkhir/composer.lock new file mode 100644 index 0000000..44c7bc2 --- /dev/null +++ b/TugasAkhir/composer.lock @@ -0,0 +1,100 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "baf0b1b659e688a64051c5ee9742a77e", + "packages": [ + { + "name": "phpmailer/phpmailer", + "version": "v6.9.1", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "039de174cd9c17a8389754d3b877a2ed22743e18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18", + "reference": "039de174cd9c17a8389754d3b877a2ed22743e18", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.7.2", + "yoast/phpunit-polyfills": "^1.0.4" + }, + "suggest": { + "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "support": { + "issues": "https://github.com/PHPMailer/PHPMailer/issues", + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1" + }, + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "time": "2023-11-25T22:23:28+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/TugasAkhir/css/Login.css b/TugasAkhir/css/Login.css new file mode 100644 index 0000000..1811aa6 --- /dev/null +++ b/TugasAkhir/css/Login.css @@ -0,0 +1,214 @@ + + + /* config.css */ + + :root { + --baseColor: #606468; + } + + /* helpers/align.css */ + + .align { + display: grid; + place-items: center; + } + + .grid { + inline-size: 90%; + margin-inline: auto; + max-inline-size: 20rem; + } + + /* helpers/hidden.css */ + + .hidden { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + } + + /* helpers/icon.css */ + + :root { + --iconFill: var(--baseColor); + } + + .icons { + display: none; + } + + .icon { + block-size: 1em; + display: inline-block; + fill: var(--iconFill); + inline-size: 1em; + vertical-align: middle; + } + + /* layout/base.css */ + + :root { + --htmlFontSize: 100%; + + --bodyBackgroundColor: #2c3338; + --bodyColor: var(--baseColor); + --bodyFontFamily: "Open Sans"; + --bodyFontFamilyFallback: sans-serif; + --bodyFontSize: 0.875rem; + --bodyFontWeight: 400; + --bodyLineHeight: 1.5; + } + + * { + box-sizing: inherit; + } + + html { + box-sizing: border-box; + font-size: var(--htmlFontSize); + } + + body { + background-color: var(--bodyBackgroundColor); + color: var(--bodyColor); + font-family: var(--bodyFontFamily), var(--bodyFontFamilyFallback); + font-size: var(--bodyFontSize); + font-weight: var(--bodyFontWeight); + line-height: var(--bodyLineHeight); + margin: 0; + min-block-size: 100vh; + } + + /* modules/anchor.css */ + + :root { + --anchorColor: #eee; + } + + a { + color: var(--anchorColor); + outline: 0; + text-decoration: none; + } + + a:focus, + a:hover { + text-decoration: underline; + } + + /* modules/form.css */ + + :root { + --formGap: 0.875rem; + } + + input { + background-image: none; + border: 0; + color: inherit; + font: inherit; + margin: 0; + outline: 0; + padding: 0; + transition: background-color 0.3s; + } + + input[type="submit"] { + cursor: pointer; + } + + .form { + display: grid; + gap: var(--formGap); + } + + .form input[type="password"], + .form input[type="text"], + .form input[type="submit"] { + inline-size: 100%; + } + + .form__field { + display: flex; + } + + .form__input { + flex: 1; + } + + /* modules/login.css */ + + :root { + --loginBorderRadus: 0.25rem; + --loginColor: #eee; + + --loginInputBackgroundColor: #3b4148; + --loginInputHoverBackgroundColor: #434a52; + + --loginLabelBackgroundColor: #363b41; + + --loginSubmitBackgroundColor: #ea4c88; + --loginSubmitColor: #eee; + --loginSubmitHoverBackgroundColor: #d44179; + } + + .login { + color: var(--loginColor); + } + + .login label, + .login input[type="text"], + .login input[type="password"], + .login input[type="submit"] { + border-radius: var(--loginBorderRadus); + padding: 1rem; + } + + .login label { + background-color: var(--loginLabelBackgroundColor); + border-bottom-right-radius: 0; + border-top-right-radius: 0; + padding-inline: 1.25rem; + } + + .login input[type="password"], + .login input[type="text"] { + background-color: var(--loginInputBackgroundColor); + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + + .login input[type="password"]:focus, + .login input[type="password"]:hover, + .login input[type="text"]:focus, + .login input[type="text"]:hover { + background-color: var(--loginInputHoverBackgroundColor); + } + + .login input[type="submit"] { + background-color: var(--loginSubmitBackgroundColor); + color: var(--loginSubmitColor); + font-weight: 700; + text-transform: uppercase; + } + + .login input[type="submit"]:focus, + .login input[type="submit"]:hover { + background-color: var(--loginSubmitHoverBackgroundColor); + } + + /* modules/text.css */ + + p { + margin-block: 1.5rem; + } + + .text--center { + text-align: center; + } + \ No newline at end of file diff --git a/TugasAkhir/css/maps/horizontal-layout-dark/style.css.map b/TugasAkhir/css/maps/horizontal-layout-dark/style.css.map new file mode 100644 index 0000000..56a8c49 --- /dev/null +++ b/TugasAkhir/css/maps/horizontal-layout-dark/style.css.map @@ -0,0 +1 @@ +{"version":3,"file":"../../horizontal-layout-dark/style.css","sources":["horizontal-layout-dark/style.scss","common/dark/common.scss","../node_modules/bootstrap/scss/_functions.scss","../node_modules/bootstrap/scss/_variables.scss","common/dark/_variables.scss","../node_modules/compass-mixins/lib/_compass.scss","../node_modules/compass-mixins/lib/compass/_functions.scss","../node_modules/compass-mixins/lib/compass/functions/_lists.scss","../node_modules/compass-mixins/lib/compass/functions/_cross_browser_support.scss","../node_modules/compass-mixins/lib/compass/functions/_gradient_support.scss","../node_modules/compass-mixins/lib/compass/functions/_constants.scss","../node_modules/compass-mixins/lib/compass/functions/_display.scss","../node_modules/compass-mixins/lib/compass/functions/_colors.scss","../node_modules/compass-mixins/lib/compass/_utilities.scss","../node_modules/compass-mixins/lib/compass/utilities/_color.scss","../node_modules/compass-mixins/lib/compass/utilities/color/_contrast.scss","../node_modules/compass-mixins/lib/compass/utilities/_general.scss","../node_modules/compass-mixins/lib/compass/utilities/general/_reset.scss","../node_modules/compass-mixins/lib/compass/reset/_utilities.scss","../node_modules/compass-mixins/lib/compass/utilities/general/_clearfix.scss","../node_modules/compass-mixins/lib/compass/utilities/general/_hacks.scss","../node_modules/compass-mixins/lib/compass/_support.scss","../node_modules/compass-mixins/lib/compass/utilities/general/_float.scss","../node_modules/compass-mixins/lib/compass/utilities/general/_tag-cloud.scss","../node_modules/compass-mixins/lib/compass/utilities/general/_min.scss","../node_modules/compass-mixins/lib/compass/utilities/_sprites.scss","../node_modules/compass-mixins/lib/compass/utilities/sprites/_base.scss","../node_modules/compass-mixins/lib/compass/utilities/sprites/_sprite-img.scss","../node_modules/compass-mixins/lib/compass/utilities/_tables.scss","../node_modules/compass-mixins/lib/compass/utilities/tables/_alternating-rows-and-columns.scss","../node_modules/compass-mixins/lib/compass/utilities/tables/_borders.scss","../node_modules/compass-mixins/lib/compass/utilities/tables/_scaffolding.scss","../node_modules/compass-mixins/lib/compass/typography/_links.scss","../node_modules/compass-mixins/lib/compass/typography/links/_hover-link.scss","../node_modules/compass-mixins/lib/compass/typography/links/_link-colors.scss","../node_modules/compass-mixins/lib/compass/typography/links/_unstyled-link.scss","../node_modules/compass-mixins/lib/compass/typography/_lists.scss","../node_modules/compass-mixins/lib/compass/typography/lists/_horizontal-list.scss","../node_modules/compass-mixins/lib/compass/typography/lists/_bullets.scss","../node_modules/compass-mixins/lib/compass/typography/lists/_inline-list.scss","../node_modules/compass-mixins/lib/compass/typography/lists/_inline-block-list.scss","../node_modules/compass-mixins/lib/compass/css3/_inline-block.scss","../node_modules/compass-mixins/lib/compass/css3/_shared.scss","../node_modules/compass-mixins/lib/compass/typography/_text.scss","../node_modules/compass-mixins/lib/compass/typography/text/_ellipsis.scss","../node_modules/compass-mixins/lib/compass/typography/text/_nowrap.scss","../node_modules/compass-mixins/lib/compass/typography/text/_replacement.scss","../node_modules/compass-mixins/lib/compass/typography/text/_force-wrap.scss","../node_modules/compass-mixins/lib/compass/_typography.scss","../node_modules/compass-mixins/lib/compass/typography/_vertical_rhythm.scss","../node_modules/compass-mixins/lib/compass/layout/_grid-background.scss","../node_modules/compass-mixins/lib/compass/css3/_images.scss","../node_modules/compass-mixins/lib/compass/css3/_background-size.scss","../node_modules/compass-mixins/lib/compass/_css3.scss","../node_modules/compass-mixins/lib/compass/css3/_border-radius.scss","../node_modules/compass-mixins/lib/compass/css3/_opacity.scss","../node_modules/compass-mixins/lib/compass/css3/_box-shadow.scss","../node_modules/compass-mixins/lib/compass/css3/_text-shadow.scss","../node_modules/compass-mixins/lib/compass/css3/_columns.scss","../node_modules/compass-mixins/lib/compass/css3/_box-sizing.scss","../node_modules/compass-mixins/lib/compass/css3/_box.scss","../node_modules/compass-mixins/lib/compass/css3/_background-clip.scss","../node_modules/compass-mixins/lib/compass/css3/_background-origin.scss","../node_modules/compass-mixins/lib/compass/css3/_font-face.scss","../node_modules/compass-mixins/lib/compass/css3/_transform.scss","../node_modules/compass-mixins/lib/compass/css3/_transition.scss","../node_modules/compass-mixins/lib/compass/css3/_appearance.scss","../node_modules/compass-mixins/lib/compass/css3/_regions.scss","../node_modules/compass-mixins/lib/compass/css3/_hyphenation.scss","../node_modules/compass-mixins/lib/compass/css3/_filter.scss","../node_modules/compass-mixins/lib/compass/css3/_pie.scss","../node_modules/compass-mixins/lib/compass/css3/_user-interface.scss","../node_modules/compass-mixins/lib/compass/css3/_flexbox.scss","../node_modules/compass-mixins/lib/_animate.scss","../node_modules/compass-mixins/lib/animation/_core.scss","../node_modules/compass-mixins/lib/animation/_shared.scss","../node_modules/compass-mixins/lib/animation/_animate.scss","../node_modules/compass-mixins/lib/animation/animate/_attention-seekers.scss","../node_modules/compass-mixins/lib/animation/animate/_bouncing.scss","../node_modules/compass-mixins/lib/animation/animate/bouncing/_bouncing-exits.scss","../node_modules/compass-mixins/lib/animation/animate/bouncing/_bouncing-entrances.scss","../node_modules/compass-mixins/lib/animation/animate/_fading.scss","../node_modules/compass-mixins/lib/animation/animate/fading/_fading-exits.scss","../node_modules/compass-mixins/lib/animation/animate/fading/_fading-entrances.scss","../node_modules/compass-mixins/lib/animation/animate/_flippers.scss","../node_modules/compass-mixins/lib/animation/animate/_lightspeed.scss","../node_modules/compass-mixins/lib/animation/animate/_rotating.scss","../node_modules/compass-mixins/lib/animation/animate/rotating/_rotating-exits.scss","../node_modules/compass-mixins/lib/animation/animate/rotating/_rotating-entrances.scss","../node_modules/compass-mixins/lib/animation/animate/_specials.scss","../node_modules/bootstrap/scss/bootstrap.scss","../node_modules/bootstrap/scss/_mixins.scss","../node_modules/bootstrap/scss/vendor/_rfs.scss","../node_modules/bootstrap/scss/mixins/_deprecate.scss","../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../node_modules/bootstrap/scss/mixins/_color-scheme.scss","../node_modules/bootstrap/scss/mixins/_image.scss","../node_modules/bootstrap/scss/mixins/_resize.scss","../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../node_modules/bootstrap/scss/mixins/_reset-text.scss","../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../node_modules/bootstrap/scss/mixins/_utilities.scss","../node_modules/bootstrap/scss/mixins/_alert.scss","../node_modules/bootstrap/scss/mixins/_buttons.scss","../node_modules/bootstrap/scss/mixins/_caret.scss","../node_modules/bootstrap/scss/mixins/_pagination.scss","../node_modules/bootstrap/scss/mixins/_lists.scss","../node_modules/bootstrap/scss/mixins/_list-group.scss","../node_modules/bootstrap/scss/mixins/_forms.scss","../node_modules/bootstrap/scss/mixins/_table-variants.scss","../node_modules/bootstrap/scss/mixins/_border-radius.scss","../node_modules/bootstrap/scss/mixins/_box-shadow.scss","../node_modules/bootstrap/scss/mixins/_gradients.scss","../node_modules/bootstrap/scss/mixins/_transition.scss","../node_modules/bootstrap/scss/mixins/_clearfix.scss","../node_modules/bootstrap/scss/mixins/_container.scss","../node_modules/bootstrap/scss/mixins/_grid.scss","../node_modules/bootstrap/scss/_utilities.scss","../node_modules/bootstrap/scss/_root.scss","../node_modules/bootstrap/scss/_reboot.scss","../node_modules/bootstrap/scss/_type.scss","../node_modules/bootstrap/scss/_images.scss","../node_modules/bootstrap/scss/_containers.scss","../node_modules/bootstrap/scss/_grid.scss","../node_modules/bootstrap/scss/_tables.scss","../node_modules/bootstrap/scss/_forms.scss","../node_modules/bootstrap/scss/forms/_labels.scss","../node_modules/bootstrap/scss/forms/_form-text.scss","../node_modules/bootstrap/scss/forms/_form-control.scss","../node_modules/bootstrap/scss/forms/_form-select.scss","../node_modules/bootstrap/scss/forms/_form-check.scss","../node_modules/bootstrap/scss/forms/_form-range.scss","../node_modules/bootstrap/scss/forms/_floating-labels.scss","../node_modules/bootstrap/scss/forms/_input-group.scss","../node_modules/bootstrap/scss/forms/_validation.scss","../node_modules/bootstrap/scss/_buttons.scss","../node_modules/bootstrap/scss/_transitions.scss","../node_modules/bootstrap/scss/_dropdown.scss","../node_modules/bootstrap/scss/_button-group.scss","../node_modules/bootstrap/scss/_nav.scss","../node_modules/bootstrap/scss/_navbar.scss","../node_modules/bootstrap/scss/_card.scss","../node_modules/bootstrap/scss/_accordion.scss","../node_modules/bootstrap/scss/_breadcrumb.scss","../node_modules/bootstrap/scss/_pagination.scss","../node_modules/bootstrap/scss/_badge.scss","../node_modules/bootstrap/scss/_alert.scss","../node_modules/bootstrap/scss/_progress.scss","../node_modules/bootstrap/scss/_list-group.scss","../node_modules/bootstrap/scss/_close.scss","../node_modules/bootstrap/scss/_toasts.scss","../node_modules/bootstrap/scss/_modal.scss","../node_modules/bootstrap/scss/_tooltip.scss","../node_modules/bootstrap/scss/_popover.scss","../node_modules/bootstrap/scss/_carousel.scss","../node_modules/bootstrap/scss/_spinners.scss","../node_modules/bootstrap/scss/_offcanvas.scss","../node_modules/bootstrap/scss/_helpers.scss","../node_modules/bootstrap/scss/helpers/_clearfix.scss","../node_modules/bootstrap/scss/helpers/_colored-links.scss","../node_modules/bootstrap/scss/helpers/_ratio.scss","../node_modules/bootstrap/scss/helpers/_position.scss","../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../node_modules/bootstrap/scss/helpers/_text-truncation.scss","../node_modules/bootstrap/scss/utilities/_api.scss","common/dark/mixins/_misc.scss","common/dark/mixins/_animation.scss","common/dark/mixins/_badges.scss","common/dark/mixins/_blockqoute.scss","common/dark/mixins/_buttons.scss","common/dark/mixins/_breadcrumbs.scss","common/dark/mixins/_cards.scss","common/dark/mixins/_no-ui-slider.scss","common/dark/mixins/_pagination.scss","common/dark/mixins/_popovers.scss","common/dark/mixins/_tooltips.scss","common/dark/_reset.scss","common/dark/_fonts.scss","common/dark/_functions.scss","common/dark/_background.scss","common/dark/_typography.scss","common/dark/_misc.scss","common/dark/_footer.scss","common/dark/_utilities.scss","common/dark/_demo.scss","common/dark/_dashboard.scss","common/dark/components/_accordions.scss","common/dark/components/_badges.scss","common/dark/components/_bootstrap-alerts.scss","common/dark/components/_bootstrap-progress.scss","common/dark/components/_buttons.scss","common/dark/components/_breadcrumbs.scss","common/dark/components/_cards.scss","common/dark/components/_checkbox-radio.scss","common/dark/components/_dropdown.scss","common/dark/components/_forms.scss","common/dark/components/_google-maps.scss","common/dark/components/_icons.scss","common/dark/components/loaders/_loaders.scss","common/dark/components/loaders/_variables.scss","common/dark/components/loaders/_colored-balls.scss","common/dark/components/loaders/_glowing-ball.scss","common/dark/components/loaders/_pixel-loader.scss","common/dark/components/loaders/_square-box.scss","common/dark/components/loaders/_circle-loader.scss","common/dark/components/loaders/_jumping-dots-loader.scss","common/dark/components/loaders/_bar-loader.scss","common/dark/components/loaders/_square-path-loader.scss","common/dark/components/loaders/_dot-opacity-loader.scss","common/dark/components/loaders/_flip-square-loader.scss","common/dark/components/loaders/_moving-square-loader.scss","common/dark/components/_lists.scss","common/dark/components/_modals.scss","common/dark/components/_pagination.scss","common/dark/components/_popover.scss","common/dark/components/_portfolio.scss","common/dark/components/_preview.scss","common/dark/components/_tables.scss","common/dark/components/_tabs.scss","common/dark/components/_timeline.scss","common/dark/components/_todo-list.scss","common/dark/components/_tooltips.scss","common/dark/components/_user-profile.scss","common/dark/components/_pricing-table.scss","common/dark/components/mail-components/_mail-sidebar.scss","common/dark/components/mail-components/_mail-list-container.scss","common/dark/components/mail-components/_messagecontent.scss","common/dark/components/plugin-overrides/_ace.scss","common/dark/components/plugin-overrides/_avgrund.scss","common/dark/components/plugin-overrides/_chartist.scss","common/dark/components/plugin-overrides/_codemirror.scss","common/dark/components/plugin-overrides/_colcade.scss","common/dark/components/plugin-overrides/_colorpicker.scss","common/dark/components/plugin-overrides/_context-menu.scss","common/dark/components/plugin-overrides/_data-tables.scss","common/dark/components/plugin-overrides/_datepicker.scss","common/dark/components/plugin-overrides/_dropify.scss","common/dark/components/plugin-overrides/_dropzone.scss","common/dark/components/plugin-overrides/_flot-chart.scss","common/dark/components/plugin-overrides/_full-calendar.scss","common/dark/components/plugin-overrides/_google-charts.scss","common/dark/components/plugin-overrides/_icheck.scss","common/dark/components/plugin-overrides/_jquery-file-upload.scss","common/dark/components/plugin-overrides/_js-grid.scss","common/dark/components/plugin-overrides/_jvectormap.scss","common/dark/components/plugin-overrides/_light-gallery.scss","common/dark/components/plugin-overrides/_listify.scss","common/dark/components/plugin-overrides/_mapael.scss","common/dark/components/plugin-overrides/_no-ui-slider.scss","common/dark/components/plugin-overrides/_owl-carousel.scss","common/dark/components/plugin-overrides/_progressbar-js.scss","common/dark/components/plugin-overrides/_pws-tabs.scss","common/dark/components/plugin-overrides/_quill.scss","common/dark/components/plugin-overrides/_rating.scss","common/dark/components/plugin-overrides/_select2.scss","common/dark/components/plugin-overrides/_summernote.scss","common/dark/components/plugin-overrides/_sweet-alert.scss","common/dark/components/plugin-overrides/_switchery.scss","common/dark/components/plugin-overrides/_tags.scss","common/dark/components/plugin-overrides/_tinymce.scss","common/dark/components/plugin-overrides/_toast.scss","common/dark/components/plugin-overrides/_typeahead.scss","common/dark/components/plugin-overrides/_wysieditor.scss","common/dark/components/plugin-overrides/_x-editable.scss","common/dark/components/plugin-overrides/_wizard.scss","common/dark/landing-screens/_auth.scss","horizontal-layout-dark/_variables.scss","horizontal-layout-dark/mixins/_menu.scss","horizontal-layout-dark/_horizontal-wrappers.scss","horizontal-layout-dark/_horizontal-menu.scss"],"sourcesContent":["@import \"../common/dark/common\";\n@import \"variables\";\n@import \"mixins/menu\";\n@import \"horizontal-wrappers\";\n@import \"horizontal-menu\";","/*------------------------------------------------------------------\n [Master Stylesheet]\n\n Project:\tStar Admin2 \n Version:\t1.2.1\n-------------------------------------------------------------------*/\n\n\n\n/*-------------------------------------------------------------------\n ===== Table of Contents =====\n\n * Bootstrap functions\n * Template variables\n * SCSS Compass Functions\n * Boostrap Main SCSS\n * Template mixins\n + Animation Mixins\n + Badge Mixins\n + Button Mixins\n + Miscellaneous Mixins\n + BlockQuote Mixins\n + Cards Mixins\n + Color Functions Mixins\n + Tooltips\n + popovers\n * Core Styles\n + Reset Styles\n + Fonts\n + Functions\n + Backgrounds\n + Sidebar\n + Navbar\n + Typography\n + Miscellaneous\n + Footer\n + Layouts\n + Utilities\n + Demo styles\n * Components\n + Accordions\n + Badges\n + Bootstrap Alerts\n + Boostrap Progress\n + Buttons\n + Breadcrumbs\n + Cards\n + Checkboxes and Radios\n + Dropdowns\n + Forms\n + Google maps\n + Icons\n + Loaders\n + Lists\n + Modals\n + Pagination\n + Popover\n + Portfolio\n + Preview\n + Tables\n + Tabs\n + Timeline\n + Todo List\n + Tooltips\n + User Profile\n + Pricing table\n + Settings Panel\n * Email\n + Mail Sidebar\n + Mail List Container\n + Message Content\n * Plugin Overrides\n + Ace Editor\n + Avgrund Popup\n + Bootstrap Tour\n + Chartist\n + CodeMirror\n + Colcade\n + Colorpicker\n + Context Menu\n + Data Tables\n + Datepicker\n + Dropify\n + Dropzone\n + Flot chart\n + Full Calendar\n + Google Charts\n + Icheck\n + Jquery File Upload\n + Js-grid\n + Jvectormap\n + Light Gallery\n + Listify\n + No-ui-slider\n + Owl-carousel\n + Progressbar-js\n + Pws-tabs\n + Quill Editor\n + Rating\n + Select2\n + Summernote Editor\n + SweetAlert\n + Switchery\n + Tags\n + TinyMCE Editor\n + Toast\n + Typeahead\n + Wysi Editor\n + X-editable\n + Wizard\n * Landing screens\n + Auth\n * Horizontal Menu\n + Horizontal\n-------------------------------------------------------------------*/\n\n\n/*-------------------------------------------------------------------*/\n/* === Import Bootstrap functions and variables === */\n@import \"../../../node_modules/bootstrap/scss/functions\";\n@import \"../../../node_modules/bootstrap/scss/variables\";\n\n/*-------------------------------------------------------------------*/\n/* === Import template variables === */\n@import \"variables\";\n\n/*-------------------------------------------------------------------*/\n/* === SCSS Compass Functions === */\n@import \"../../../node_modules/compass-mixins/lib/compass\";\n@import \"../../../node_modules/compass-mixins/lib/animate\";\n\n/*-------------------------------------------------------------------*/\n/* === Boostrap Main SCSS === */\n@import \"../../../node_modules/bootstrap/scss/bootstrap\";\n\n/*-------------------------------------------------------------------*/\n/* === Template mixins === */\n@import \"mixins/misc\";\n@import \"mixins/animation\";\n@import \"mixins/badges\";\n@import \"mixins/blockqoute\";\n@import \"mixins/buttons\";\n@import \"mixins/breadcrumbs\";\n@import \"mixins/cards\";\n@import \"mixins/no-ui-slider\";\n@import \"mixins/pagination\";\n@import \"mixins/popovers\";\n@import \"mixins/tooltips\";\n\n/*-------------------------------------------------------------------*/\n/* === Core Styles === */\n@import \"reset\";\n@import \"fonts\";\n@import \"functions\";\n@import \"background\";\n@import \"typography\";\n@import \"misc\";\n@import \"footer\";\n@import \"utilities\";\n@import \"demo\";\n@import \"dashboard\";\n\n/*-------------------------------------------------------------------*/\n/* === Components === */\n@import \"components/accordions\";\n@import \"components/badges\";\n@import \"components/bootstrap-alerts\";\n@import \"components/bootstrap-progress\";\n@import \"components/buttons\";\n@import \"components/breadcrumbs\";\n@import \"components/cards\";\n@import \"components/checkbox-radio\";\n@import \"components/dropdown\";\n@import \"components/forms\";\n@import \"components/google-maps\";\n@import \"components/icons\";\n@import \"components/loaders/loaders\";\n@import \"components/lists\";\n@import \"components/modals\";\n@import \"components/pagination\";\n@import \"components/popover\";\n@import \"components/portfolio\";\n@import \"components/preview\";\n@import \"components/tables\";\n@import \"components/tabs\";\n@import \"components/timeline\";\n@import \"components/todo-list\";\n@import \"components/tooltips\";\n@import \"components/user-profile\";\n@import \"components/pricing-table\";\n\n/*-------------------------------------------------------------------*/\n/* === Email === */\n@import \"components/mail-components/mail-sidebar\";\n@import \"components/mail-components/mail-list-container\";\n@import \"components/mail-components/messagecontent\";\n\n/*-------------------------------------------------------------------*/\n/* === Plugin overrides === */\n@import \"components/plugin-overrides/ace\";\n@import \"components/plugin-overrides/avgrund\";\n@import \"components/plugin-overrides/chartist\";\n@import \"components/plugin-overrides/codemirror\";\n@import \"components/plugin-overrides/colcade\";\n@import \"components/plugin-overrides/colorpicker\";\n@import \"components/plugin-overrides/context-menu\";\n@import \"components/plugin-overrides/data-tables\";\n@import \"components/plugin-overrides/datepicker\";\n@import \"components/plugin-overrides/dropify\";\n@import \"components/plugin-overrides/dropzone\";\n@import \"components/plugin-overrides/flot-chart\";\n@import \"components/plugin-overrides/full-calendar\";\n@import \"components/plugin-overrides/google-charts\";\n@import \"components/plugin-overrides/icheck\";\n@import \"components/plugin-overrides/jquery-file-upload\";\n@import \"components/plugin-overrides/js-grid\";\n@import \"components/plugin-overrides/jvectormap\";\n@import \"components/plugin-overrides/light-gallery\";\n@import \"components/plugin-overrides/listify\";\n@import \"components/plugin-overrides/mapael\";\n@import \"components/plugin-overrides/no-ui-slider\";\n@import \"components/plugin-overrides/owl-carousel\";\n@import \"components/plugin-overrides/progressbar-js\";\n@import \"components/plugin-overrides/pws-tabs\";\n@import \"components/plugin-overrides/quill\";\n@import \"components/plugin-overrides/rating\";\n@import \"components/plugin-overrides/select2\";\n@import \"components/plugin-overrides/summernote\";\n@import \"components/plugin-overrides/sweet-alert\";\n@import \"components/plugin-overrides/switchery\";\n@import \"components/plugin-overrides/tags\";\n@import \"components/plugin-overrides/tinymce\";\n@import \"components/plugin-overrides/toast\";\n@import \"components/plugin-overrides/typeahead\";\n@import \"components/plugin-overrides/wysieditor\";\n@import \"components/plugin-overrides/x-editable\";\n@import \"components/plugin-overrides/wizard\";\n\n/*-------------------------------------------------------------------*/\n/* === Landing screens === */\n@import \"landing-screens/auth\";","// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" or unit($prev-num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n @if length($map) > 0 {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n }\n}\n\n// Internal Bootstrap function to turn maps into its negative variant.\n// It prefixes the keys with `n` and makes the value negative.\n@function negativify-map($map) {\n $result: ();\n @each $key, $value in $map {\n @if $key != 0 {\n $result: map-merge($result, (\"n\" + $key: (-$value)));\n }\n }\n @return $result;\n}\n\n// Get multiple keys from a sass map\n@function map-get-multiple($map, $values) {\n $result: ();\n @each $key, $value in $map {\n @if (index($values, $key) != null) {\n $result: map-merge($result, ($key: $value));\n }\n }\n @return $result;\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// See https://codepen.io/kevinweber/pen/dXWoRw\n//\n// Requires the use of quotes around data URIs.\n\n@function escape-svg($string) {\n @if str-index($string, \"data:image/svg+xml\") {\n @each $char, $encoded in $escaped-characters {\n // Do not escape the url brackets\n @if str-index($string, \"url(\") == 1 {\n $string: url(\"#{str-replace(str-slice($string, 6, -3), $char, $encoded)}\");\n } @else {\n $string: str-replace($string, $char, $encoded);\n }\n }\n }\n\n @return $string;\n}\n\n// Color contrast\n// See https://github.com/twbs/bootstrap/pull/30168\n\n// A list of pre-calculated numbers of pow(($value / 255 + .055) / 1.055, 2.4). (from 0 to 255)\n// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern\n$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;\n\n@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {\n $foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;\n $max-ratio: 0;\n $max-ratio-color: null;\n\n @each $color in $foregrounds {\n $contrast-ratio: contrast-ratio($background, $color);\n @if $contrast-ratio > $min-contrast-ratio {\n @return $color;\n } @else if $contrast-ratio > $max-ratio {\n $max-ratio: $contrast-ratio;\n $max-ratio-color: $color;\n }\n }\n\n @warn \"Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...\";\n\n @return $max-ratio-color;\n}\n\n@function contrast-ratio($background, $foreground: $color-contrast-light) {\n $l1: luminance($background);\n $l2: luminance(opaque($background, $foreground));\n\n @return if($l1 > $l2, ($l1 + .05) / ($l2 + .05), ($l2 + .05) / ($l1 + .05));\n}\n\n// Return WCAG2.0 relative luminance\n// See https://www.w3.org/WAI/GL/wiki/Relative_luminance\n// See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n@function luminance($color) {\n $rgb: (\n \"r\": red($color),\n \"g\": green($color),\n \"b\": blue($color)\n );\n\n @each $name, $value in $rgb {\n $value: if($value / 255 < .03928, $value / 255 / 12.92, nth($_luminance-list, $value + 1));\n $rgb: map-merge($rgb, ($name: $value));\n }\n\n @return (map-get($rgb, \"r\") * .2126) + (map-get($rgb, \"g\") * .7152) + (map-get($rgb, \"b\") * .0722);\n}\n\n// Return opaque color\n// opaque(#fff, rgba(0, 0, 0, .5)) => #808080\n@function opaque($background, $foreground) {\n @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100);\n}\n\n// scss-docs-start color-functions\n// Tint a color: mix a color with white\n@function tint-color($color, $weight) {\n @return mix(white, $color, $weight);\n}\n\n// Shade a color: mix a color with black\n@function shade-color($color, $weight) {\n @return mix(black, $color, $weight);\n}\n\n// Shade the color if the weight is positive, else tint it\n@function shift-color($color, $weight) {\n @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));\n}\n// scss-docs-end color-functions\n\n// Return valid calc\n@function add($value1, $value2, $return-calc: true) {\n @if $value1 == null {\n @return $value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 + $value2;\n }\n\n @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(\" + \") + $value2);\n}\n\n@function subtract($value1, $value2, $return-calc: true) {\n @if $value1 == null and $value2 == null {\n @return null;\n }\n\n @if $value1 == null {\n @return -$value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 - $value2;\n }\n\n @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(\" - \") + $value2);\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n// fusv-enable\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer / 4,\n 2: $spacer / 2,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n\n$negative-spacers: if($enable-negative-margins, negativify-map($spacers), null) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n$body-text-align: null !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n$gutters: $spacers !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width / 2 !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n\n$border-color: $gray-300 !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .25rem !default;\n$border-radius-sm: .2rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$variable-prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$variable-prefix}font-monospace) !default;\n\n// $font-size-root effects the value of `rem`, which is used for as well font sizes, paddings and margins\n// $font-size-base effects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n$text-muted: $gray-600 !default;\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n$hr-height: $border-width !default;\n$hr-opacity: .25 !default;\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: $body-color !default;\n$table-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba($black, $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba($black, $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba($black, $table-hover-bg-factor) !default;\n\n$table-border-factor: .1 !default;\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-striped-order: odd !default;\n\n$table-group-separator-color: currentColor !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .25rem !default;\n$input-btn-focus-color-opacity: .25 !default;\n$input-btn-focus-color: rgba($component-active-bg, $input-btn-focus-color-opacity) !default;\n$input-btn-focus-blur: 0 !default;\n$input-btn-focus-box-shadow: 0 0 $input-btn-focus-blur $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: $border-width !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: $link-color !default;\n$btn-link-hover-color: $link-hover-color !default;\n$btn-link-disabled-color: $gray-600 !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: $text-muted !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n$input-disabled-border-color: null !default;\n\n$input-color: $body-color !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: $box-shadow-inset !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-sm: $border-radius-sm !default;\n$input-border-radius-lg: $border-radius-lg !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y / 2) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: 1px solid rgba($black, .25) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba(0, 0, 0, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $gray-200 !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $border-radius !default;\n$form-select-box-shadow: $box-shadow-inset !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: $gray-300 !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: $box-shadow-inset !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: $gray-500 !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: $input-group-addon-bg !default;\n$form-file-button-hover-bg: shade-color($form-file-button-bg, 5%) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-offcanvas: 1050 !default;\n$zindex-modal: 1060 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n// scss-docs-end zindex-stack\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: $link-color !default;\n$nav-link-hover-color: $link-hover-color !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-theme-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .55) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-theme-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer / 2 !default;\n$dropdown-box-shadow: $box-shadow !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: shade-color($gray-900, 10%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: $spacer / 4 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding: $dropdown-padding-y $dropdown-item-padding-x !default;\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-radius: $border-radius !default;\n$pagination-margin-start: -$pagination-border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-color: $link-hover-color !default;\n$pagination-focus-bg: $gray-200 !default;\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n// scss-docs-end pagination-variables\n\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer / 2 !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y / 2 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width / 2 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: $body-color !default;\n$accordion-bg: $body-bg !default;\n$accordion-border-width: $border-width !default;\n$accordion-border-color: rgba($black, .125) !default;\n$accordion-border-radius: $border-radius !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: $accordion-color !default;\n$accordion-button-bg: $accordion-bg !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: tint-color($component-active-bg, 90%) !default;\n$accordion-button-active-color: shade-color($primary, 10%) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $accordion-color !default;\n$accordion-icon-active-color: $accordion-button-active-color !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer / 4 !default;\n$tooltip-padding-x: $spacer / 2 !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-start tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: $box-shadow !default;\n\n$popover-header-bg: shade-color($popover-bg, 6%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n// scss-docs-end popover-variables\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: $border-radius !default;\n$toast-box-shadow: $box-shadow !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: $border-radius !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: $box-shadow-sm !default;\n$modal-content-box-shadow-sm-up: $box-shadow !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n$alert-bg-scale: -80% !default;\n$alert-border-scale: -70% !default;\n$alert-color-scale: 40% !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: $box-shadow-inset !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: $gray-900 !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: $spacer / 2 !default;\n$list-group-item-padding-x: $spacer !default;\n$list-group-item-bg-scale: -80% !default;\n$list-group-item-color-scale: 40% !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: $box-shadow-sm !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: $gray-600 !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $input-btn-focus-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: $modal-content-bg !default;\n$offcanvas-color: $modal-content-color !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: null !default;\n","\n////////// COLOR SYSTEM //////////\n\n$blue: #5E50F9;\n$indigo: #6610f2;\n$purple: #6a008a;\n$pink: #E91E63;\n$red: #f96868;\n$orange: #f2a654;\n$yellow: #f6e84e;\n$green: #46c35f;\n$teal: #58d8a3;\n$cyan: #57c7d4;\n$black: #000;\n$white: #ffffff;\n$white-smoke: #f2f7f8; \n$violet: #41478a; \n$darkslategray : #2e383e;\n$dodger-blue : #3498db;\n\n\n$colors: (\n blue: $blue,\n indigo: $indigo,\n purple: $purple,\n pink: $pink,\n red: $red,\n orange: $orange,\n yellow: $yellow,\n green: $green,\n teal: $teal,\n cyan: $cyan,\n white: $white,\n gray: #434a54,\n gray-light: #aab2bd,\n gray-lighter: #e8eff4,\n gray-lightest: #e6e9ed,\n gray-dark: #0f1531,\n black: #000000\n);\n\n\n$theme-colors: (\n primary: #4B49AC,\n secondary: #a3a4a5,\n success: #57B657,\n info: #248AFD,\n warning: #FFC100,\n danger: #FF4747,\n light: #f8f9fa,\n dark: #282f3a\n);\n\n$primary: #4B49AC;\n$secondary: #a3a4a5;\n$success: #57B657;\n$info: #248AFD;\n$warning: #FFC100;\n$danger: #FF4747;\n$light: #f8f9fa;\n$dark: #282f3a;\n\n$theme-gradient-colors: (\n primary: linear-gradient(230deg, #759bff, #843cf6),\n secondary: linear-gradient(to right, #e7ebf0, #868e96),\n success: linear-gradient(45deg, #7bffce, #30c93e),\n info: linear-gradient(to bottom, #0e4cfd, #6a8eff),\n warning: linear-gradient(135deg, #ffc480, #ff763b),\n danger: linear-gradient(316deg, #fc5286, #fbaaa2),\n light: linear-gradient(to right, #cfd9df 0%, #e2ebf0 100%),\n dark: linear-gradient(to right, #7d7979 0%, #000000 100%)\n);\n\n\n////////// COLOR SYSTEM //////////\n\n////////// COLOR VARIABLES //////////\n$content-bg: #1c1e2f;\n$border-color: rgba(255,255,255,.05);\n$border-radius: 8px;\n\n////////// COLOR VARIABLES //////////\n\n $gray: #434a54;\n $gray-light: #aab2bd;\n $gray-lighter: #e8eff4;\n $gray-lightest: #e6e9ed;\n $gray-dark: #0f1531;\n\n////////// SOCIAL COLORS //////////\n\n$social-colors: (\n twitter: #2caae1,\n facebook: #3b579d,\n google: #dc4a38,\n linkedin: #0177b5,\n pinterest: #cc2127,\n youtube: #e52d27,\n github: #333333,\n behance: #1769ff,\n dribbble: #ea4c89,\n reddit: #ff4500\n);\n\n////////// SOCIAL COLORS //////////\n\n////////// FONTS//\n\n$type1: 'Manrope', sans-serif;\n\n$default-font-size: .875rem; // 14px as base font size\n\n$text-muted: #9c9fa6;\n$body-color: #c0c1ca;\n\n$color-light-blue: #52C4FF;\n\n////////// FONT VARIABLES //////////\n\n///////// FOOTER ////////\n$footer-height: 75px;\n$footer-bg: $content-bg;\n$footer-color: color(dark);\n///////// FOOTER ////////\n\n///////// BUTTONS ////////\n\n$button-fixed-width: 150px;\n$btn-padding-y: .875rem;\n$btn-padding-x: 1.5rem;\n$btn-line-height: 1;\n\n$btn-padding-y-xs: .5rem;\n$btn-padding-x-xs: .75rem;\n\n$btn-padding-y-sm: .50rem;\n$btn-padding-x-sm: .81rem;\n\n$btn-padding-y-lg: 1rem;\n$btn-padding-x-lg: 3rem;\n\n$btn-font-size: .875rem;\n$btn-font-size-xs: .625rem; \n$btn-font-size-sm: .875rem;\n$btn-font-size-lg: .875rem;\n\n$btn-border-radius: .1875rem;\n$btn-border-radius-xs: .1875rem;\n$btn-border-radius-sm: .1875rem;\n$btn-border-radius-lg: .1875rem;\n\n///////// BUTTONS ////////\n\n\n\n////////// TOOLTIP VARIABLES //////////\n\n//default styles\n$tooltip-font-size: .75rem;\n$tooltip-padding-y: .4rem;\n$tooltip-padding-x: .75rem;\n$tooltip-border-radius: .375rem;\n\n////////// TOOLTIP VARIABLES //////////\n\n////////// POPOVER ///////////////\n$popover-bg: #636877;\n$popover-header-bg: $popover-bg;\n$popover-header-color: $black;\n$popover-body-color: $black;\n$popover-arrow-color: $popover-bg;\n////////// POPOVER ///////////////\n\n\n\n///////// FORMS /////////\n\n$input-bg: #2b2e4c;\n$input-focus-bg: $input-bg;\n$input-border-radius: 2px;\n$input-placeholder-color: #aaa7a7;\n$input-color: #e9e6e6;\n$input-focus-color: $input-color;\n$input-font-size: .875rem;\n\n$input-padding-y: .875rem;\n$input-padding-x: 1.375rem;\n$input-line-height: 1;\n\n$input-padding-y-xs: .5rem;\n$input-padding-x-xs: .75rem;\n\n$input-padding-y-sm: .50rem;\n$input-padding-x-sm: .81rem;\n\n$input-padding-y-lg: .94rem;\n$input-padding-x-lg: 1.94rem;\n\n$input-height: 2.875rem;\n$input-height-sm: 2.575rem;\n$input-height-lg: 3.175rem;\n\n///////// FORMS /////////\n\n//////// TABLES ////////\n\n$table-color: $body-color;\n$table-accent-bg: #2A292C;\n$table-hover-bg: $content-bg;\n$table-cell-padding: 1.25rem .9375rem;\n$table-border-color: $border-color;\n\n$table-inverse-bg: #2a2b32;\n$table-inverse-color: color(white);\n$expanded-table-cell-color:#fff;\n$alpha-orange:#FE5C83;\n\n//////// TABLES ////////\n\n\n\n////////// MEASUREMENT AND PROPERTY VARIABLES //////////\n\n$border-property: 1px solid $border-color;\n$card-bg: #222437;\n$card-spacing-y: 1.5rem;\n$card-padding-y: 1.5rem;\n$card-padding-x: 1.5rem;\n$card-border-radius: 20px;\n$card-border-color: #e3e3e3;\n$card-box-shadow: 0 1px 20px 0 rgba(0,0,0,.1);\n$card-description-color: #76838f;\n$grid-gutter-width: 30px;\n$action-transition-duration: 0.25s;\n$action-transition-timing-function: ease;\n$card-tale:#7DA0FA;\n$card-dark-blue:#4747A1;\n$card-light-blue:#7978E9;\n$card-light-danger:#F3797E;\n$card-title-color: #c0c1ca;\n////////// OTHER VARIABLES //////////\n\n//////// DROPDOWNS ///////\n\n$dropdown-bg: $card-bg;\n$dropdown-border-color: $border-color;\n$dropdown-divider-bg: $border-color;\n$dropdown-link-color: $body-color;\n$dropdown-header-color: $body-color;\n$dropdown-link-hover-bg: $dark;\n//////// DROPDOWNS ///////\n\n\n////////// BREAD CRUMBS VARIABLES //////////\n\n// default styles\n$breadcrumb-padding-y: 0.56rem;\n$breadcrumb-padding-x: 1.13rem;\n$breadcrumb-item-padding: .5rem;\n$breadcrumb-margin-bottom: 1rem;\n$breadcrumb-font-size: $default-font-size;\n$breadcrumb-bg: transparent;\n$breadcrumb-border-color: $border-color;\n$breadcrumb-divider-color: $gray-600;\n$breadcrumb-active-color: $gray-700;\n$breadcrumb-divider: \"/\";\n\n// custom styles\n$breadcrumb-custom-padding-y: 0;\n$breadcrumb-custom-padding-x: 0;\n$breadcrumb-custom-item-padding-y: 0.56rem;\n$breadcrumb-custom-item-padding-x: 12px;\n$breadcrumb-custom-item-color: inherit;\n$breadcrumb-item-bg: #555b71;\n\n////////// BREAD CRUMBS VARIABLES //////////\n\n\n\n////////// MODALS VARIABLES //////////\n\n$modal-inner-padding: 0.9375rem;\n$modal-dialog-margin: 10px;\n$modal-dialog-margin-y-sm-up: 30px;\n$modal-title-line-height: $line-height-base;\n$modal-content-bg: #323748;\n$modal-content-box-shadow-xs: 0 3px 9px rgba($black,.5);\n$modal-content-box-shadow-sm-up: 0 5px 15px rgba($black,.5);\n\n$modal-backdrop-bg: $black;\n$modal-backdrop-opacity: .5;\n\n$modal-header-border-color: $border-color;\n$modal-content-border-color: $border-color;\n$modal-footer-border-color: $border-color;\n\n$modal-header-border-width: $border-width;\n$modal-content-border-width: $border-width;\n$modal-footer-border-width: $border-width;\n\n$modal-header-padding-x: 26px;\n$modal-header-padding-y: 25px;\n\n$modal-body-padding-x: 26px;\n$modal-body-padding-y: 35px;\n\n$modal-footer-padding-x: 31px;\n$modal-footer-padding-y: 15px;\n\n$modal-lg: 90%;\n$modal-md: 500px;\n$modal-sm: 300px;\n$modal-transition: transform .4s ease;\n\n////////// MODALS VARIABLES //////////\n\n///////// TABS VARIABLES //////////\n$nav-tabs-border-color: #ebedf2;\n$nav-tabs-link-bg: #292f42;\n$nav-tabs-link-color: $body-color;\n$nav-tabs-border-color: $border-color;\n$nav-tabs-link-hover-border-color: #828494 #828494 #828494;\n$nav-tabs-link-active-color: $body-color;\n$nav-tabs-link-active-bg: $card-bg;\n$nav-tabs-link-active-border-color: $nav-tabs-border-color $nav-tabs-border-color $nav-tabs-link-active-bg;\n$nav-pills-custom-bg: #fcfcfd;\n$nav-tab-active-color:$success;\n//////// TABS VARIABLES /////////\n\n//////// CALENDAR //////////////\n$fullcalendar-color: #a8b2b9;\n//////// CALENDAR //////////////\n\n//////// PAGINATION //////////////\n$pagination-bg: $dark;\n$pagination-disabled-bg: #8b8d91;\n//////// PAGINATION //////////////\n\n//////// PROGRESS BAR ///////////\n$progress-bg: #878c9e;\n//////// PROGRESS BAR ///////////\n\n//////// NOUI SLIDER ////////////\n$noui-base-bg: $dark;\n//////// NOUI SLIDER ////////////\n\n$welcome-grey: #8D8D8D;\n$border-grey: #DFDFDF;\n$btn-outline-border:$border-color;\n$text-light-grey:#8D8D8D;\n$select-table-head:#A3A3A3;\n$select-table-cell-color:#8D8D8D;\n$flag-color:#D1D1D1;\n\n$white-6:rgba(255,255,255,.6);\n$checkbox-bg:#EBEDF2;","@import \"compass/functions\";\n@import \"compass/utilities\";\n@import \"compass/typography\";\n@import \"compass/css3\";\n","@import \"functions/lists\";\n@import \"functions/cross_browser_support\";\n@import \"functions/gradient_support\";\n@import \"functions/constants\";\n@import \"functions/display\";\n@import \"functions/colors\";\n","//\n// A partial implementation of the Ruby list functions from Compass:\n// https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/lists.rb\n//\n\n\n// compact is part of libsass\n\n@function -compass-nth($list, $place) {\n // Yep, Sass-lists are 1-indexed.\n @if $place == \"first\" {\n $place: 1;\n }\n @if $place == \"last\" {\n $place: length($list);\n }\n @return nth($list, $place);\n}\n\n// compass_list can't be implemented in sass script\n\n@function -compass-space-list($item1, $item2:null, $item3:null, $item4:null, $item5:null, $item6:null, $item7:null, $item8:null, $item9:null) {\n $items: ();\n // Support for polymorphism.\n @if type-of($item1) == 'list' {\n // Passing a single array of properties.\n $items: $item1;\n } @else {\n $items: $item1 $item2 $item3 $item4 $item5 $item6 $item7 $item8 $item9;\n }\n\n $full: first-value-of($items);\n\n @for $i from 2 through length($items) {\n $item: nth($items, $i);\n @if $item != null {\n $full: $full $item;\n }\n }\n\n @return $full;\n}\n\n@function -compass-list-size($list) {\n @return length($list);\n}\n\n@function -compass-slice($list, $start, $end: false) {\n @if $end == false {\n $end: length($list);\n }\n $full: nth($list, $start);\n @for $i from $start + 1 through $end {\n $full: $full, nth($list, $i);\n }\n @return $full;\n}\n\n@function reject($list, $reject1, $reject2:null, $reject3:null, $reject4:null, $reject5:null, $reject6:null, $reject7:null, $reject8:null, $reject9:null) {\n $rejects: $reject1, $reject2, $reject3, $reject4, $reject5, $reject6, $reject7, $reject8, $reject9;\n\n $full: false;\n @each $item in $list {\n @if index($rejects, $item) {}\n @else {\n @if $full {\n $full: $full, $item;\n }\n @else {\n $full: $item;\n }\n }\n }\n @return $full;\n}\n\n@function first-value-of($list) {\n @return nth($list, 1);\n}\n\n@function compact($vars...) {\n $separator: list-separator($vars);\n $list: ();\n @each $var in $vars {\n @if $var {\n $list: append($list, $var, $separator);\n }\n }\n @return $list;\n}\n","// \n// A partial implementation of the Ruby cross browser support functions from Compass:\n// https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/cross_browser_support.rb\n// \n\n@function prefixed($prefix, $property1, $property2:null, $property3:null, $property4:null, $property5:null, $property6:null, $property7:null, $property8:null, $property9:null) {\n $properties: $property1, $property2, $property3, $property4, $property5, $property6, $property7, $property8, $property9;\n $prefixed: false;\n @each $item in $properties {\n @if type-of($item) == 'string' {\n $prefixed: $prefixed or str-index($item, 'url') != 1 and str-index($item, 'rgb') != 1 and str-index($item, '#') != 1;\n } @elseif type-of($item) == 'color' {\n } @elseif $item != null {\n $prefixed: true;\n }\n }\n @return $prefixed;\n}\n\n@function prefix($prefix, $property1, $property2:null, $property3:null, $property4:null, $property5:null, $property6:null, $property7:null, $property8:null, $property9:null) {\n $properties: \"\";\n\n // Support for polymorphism.\n @if type-of($property1) == 'list' {\n // Passing a single array of properties.\n $properties: $property1;\n } @else {\n // Passing multiple properties.\n $properties: $property1, $property2, $property3, $property4, $property5, $property6, $property7, $property8, $property9;\n }\n\n $props: false;\n @each $item in $properties {\n @if $item == null {}\n @else {\n @if prefixed($prefix, $item) {\n $item: #{$prefix}-#{$item};\n }\n @if $props {\n $props: $props, $item;\n }\n @else {\n $props: $item;\n }\n }\n }\n @return $props;\n}\n\n@function -svg($property1, $property2:null, $property3:null, $property4:null, $property5:null, $property6:null, $property7:null, $property8:null, $property9:null) {\n @return prefix('-svg', $property1, $property2, $property3, $property4, $property5, $property6, $property7, $property8, $property9);\n}\n\n@function -owg($property1, $property2:null, $property3:null, $property4:null, $property5:null, $property6:null, $property7:null, $property8:null, $property9:null) {\n @return prefix('-owg', $property1, $property2, $property3, $property4, $property5, $property6, $property7, $property8, $property9);\n}\n\n@function -webkit($property1, $property2:null, $property3:null, $property4:null, $property5:null, $property6:null, $property7:null, $property8:null, $property9:null) {\n @return prefix('-webkit', $property1, $property2, $property3, $property4, $property5, $property6, $property7, $property8, $property9);\n}\n\n@function -moz($property1, $property2:null, $property3:null, $property4:null, $property5:null, $property6:null, $property7:null, $property8:null, $property9:null) {\n @return prefix('-moz', $property1, $property2, $property3, $property4, $property5, $property6, $property7, $property8, $property9);\n}\n\n@function -o($property1, $property2:null, $property3:null, $property4:null, $property5:null, $property6:null, $property7:null, $property8:null, $property9:null) {\n @return prefix('-o', $property1, $property2, $property3, $property4, $property5, $property6, $property7, $property8, $property9);\n}\n\n@function -pie($property1, $property2:null, $property3:null, $property4:null, $property5:null, $property6:null, $property7:null, $property8:null, $property9:null) {\n @return prefix('-pie', $property1, $property2, $property3, $property4, $property5, $property6, $property7, $property8, $property9);\n}\n","// \n// A partial implementation of the Ruby gradient support functions from Compass:\n// https://github.com/Compass/compass/blob/v0.12.2/lib/compass/sass_extensions/functions/gradient_support.rb\n// \n\n@function color-stops($item1, $item2:null, $item3:null, $item4:null, $item5:null, $item6:null, $item7:null, $item8:null, $item9:null) {\n $items: $item2, $item3, $item4, $item5, $item6, $item7, $item8, $item9;\n $full: $item1;\n @each $item in $items {\n @if $item != null {\n $full: $full, $item;\n } \n }\n @return $full;\n}","// \n// A partial implementation of the Ruby constants functions from Compass:\n// https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/constants.rb\n// \n\n@function opposite-position($from) {\n @if ($from == top) {\n @return bottom;\n } @else if ($from == bottom) {\n @return top;\n } @else if ($from == left) {\n @return right;\n } @else if ($from == right) {\n @return left;\n } @else if ($from == center) {\n @return center;\n }\n}\n","// \n// A partial implementation of the Ruby display functions from Compass:\n// https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass_extensions/functions/display.rb\n// \n\n@function elements-of-type($type){\n @if ($type == block){\n @return address, article, aside, blockquote, center, dir, div, dd, details, dl, dt, fieldset, figcaption, figure, form, footer, frameset, h1, h2, h3, h4, h5, h6, hr, header, hgroup, isindex, main, menu, nav, noframes, noscript, ol, p, pre, section, summary, ul;\n } @else if ($type == inline){\n @return a, abbr, acronym, audio, b, basefont, bdo, big, br, canvas, cite, code, command, datalist, dfn, em, embed, font, i, img, input, keygen, kbd, label, mark, meter, output, progress, q, rp, rt, ruby, s, samp, select, small, span, strike, strong, sub, sup, textarea, time, tt, u, var, video, wbr;\n } @else if ($type == inline-block){\n @return img;\n } @else if ($type == table){\n @return table;\n } @else if ($type == list-item){\n @return li;\n } @else if ($type == table-row-group){\n @return tbody;\n } @else if ($type == table-header-group){\n @return thead;\n } @else if ($type == table-footer-group){\n @return tfoot;\n } @else if ($type == table-row){\n @return tr;\n } @else if ($type == table-cell){\n @return th, td;\n } @else if ($type == html5-block){\n @return article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary;\n } @else if ($type == html5-inline){\n @return audio, canvas, command, datalist, embed, keygen, mark, meter, output, progress, rp, rt, ruby, time, video, wbr;\n } @else if ($type == html5){\n @return article, aside, audio, canvas, command, datalist, details, embed, figcaption, figure, footer, header, hgroup, keygen, main, mark, menu, meter, nav, output, progress, rp, rt, ruby, section, summary, time, video, wbr;\n } @else if ($type == text-input){\n @return input, textarea;\n }\n}\n","// \n// A partial implementation of the Ruby colors functions from Compass:\n// https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass_extensions/functions/colors.rb\n//\n\n// a genericized version of lighten/darken so that negative values can be used.\n@function adjust-lightness($color, $amount) {\n @return adjust-color($color, $lightness: $amount);\n}\n\n// Scales a color's lightness by some percentage.\n// If the amount is negative, the color is scaled darker, if positive, it is scaled lighter.\n// This will never return a pure light or dark color unless the amount is 100%.\n@function scale-lightness($color, $amount) {\n @return scale-color($color, $lightness: $amount);\n}\n\n// a genericized version of saturate/desaturate so that negative values can be used.\n@function adjust-saturation($color, $amount) {\n @return adjust-color($color, $saturation: $amount);\n}\n\n// Scales a color's saturation by some percentage.\n// If the amount is negative, the color is desaturated, if positive, it is saturated.\n// This will never return a pure saturated or desaturated color unless the amount is 100%.\n@function scale-saturation($color, $amount) {\n @return scale-color($color, $saturation: $amount);\n}\n\n@function shade($color, $percentage) {\n @return mix(#000000, $color, $percentage);\n}\n\n@function tint($color, $percentage) {\n @return mix(#ffffff, $color, $percentage);\n}\n\n","@import \"utilities/color\";\n@import \"utilities/general\";\n@import \"utilities/sprites\";\n@import \"utilities/tables\";\n\n// deprecated\n@import \"typography/links\";\n@import \"typography/lists\";\n@import \"typography/text\";\n","@import \"color/contrast\";","$contrasted-dark-default: #000 !default;\n$contrasted-light-default: #fff !default;\n$contrasted-lightness-threshold: 30% !default;\n\n// Returns the `$light` color when the `$color` is dark\n// and the `$dark` color when the `$color` is light.\n// The `$threshold` is a percent between `0%` and `100%` and it determines\n// when the lightness of `$color` changes from \"dark\" to \"light\".\n@function contrast-color(\n $color,\n $dark: $contrasted-dark-default,\n $light: $contrasted-light-default,\n $threshold: $contrasted-lightness-threshold\n) {\n @return if(lightness($color) < $threshold, $light, $dark)\n}\n\n// Sets the specified background color and calculates a dark or light contrasted text color.\n// The arguments are passed through to the [contrast-color function](#function-contrast-color).\n@mixin contrasted(\n $background-color,\n $dark: $contrasted-dark-default,\n $light: $contrasted-light-default,\n $threshold: $contrasted-lightness-threshold\n) {\n background-color: $background-color;\n color: contrast-color($background-color, $dark, $light, $threshold);\n}","@import \"general/reset\";\n@import \"general/clearfix\";\n@import \"general/float\";\n@import \"general/tag-cloud\";\n@import \"general/hacks\";\n@import \"general/min\";\n","// This module has moved.\n@import \"../../reset/utilities\";\n","// Based on [Eric Meyer's reset 2.0](http://meyerweb.com/eric/tools/css/reset/index.html)\n// Global reset rules.\n// For more specific resets, use the reset mixins provided below\n@mixin global-reset {\n html, body, div, span, applet, object, iframe,\n h1, h2, h3, h4, h5, h6, p, blockquote, pre,\n a, abbr, acronym, address, big, cite, code,\n del, dfn, em, img, ins, kbd, q, s, samp,\n small, strike, strong, sub, sup, tt, var,\n b, u, i, center,\n dl, dt, dd, ol, ul, li,\n fieldset, form, label, legend,\n table, caption, tbody, tfoot, thead, tr, th, td,\n article, aside, canvas, details, embed, \n figure, figcaption, footer, header, hgroup, \n menu, nav, output, ruby, section, summary,\n time, mark, audio, video {\n @include reset-box-model;\n @include reset-font; }\n // Unlike Eric's original reset, we reset the html element to be compatible\n // with the vertical rhythm mixins.\n html {\n @include reset-body; }\n ol, ul {\n @include reset-list-style; }\n table {\n @include reset-table; }\n caption, th, td {\n @include reset-table-cell; }\n q, blockquote {\n @include reset-quotation; }\n a img {\n @include reset-image-anchor-border; }\n @include reset-html5; }\n\n// Reset all elements within some selector scope. To reset the selector itself,\n// mixin the appropriate reset mixin for that element type as well. This could be\n// useful if you want to style a part of your page in a dramatically different way.\n@mixin nested-reset {\n div, span, applet, object, iframe,\n h1, h2, h3, h4, h5, h6, p, blockquote, pre,\n a, abbr, acronym, address, big, cite, code,\n del, dfn, em, img, ins, kbd, q, s, samp,\n small, strike, strong, sub, sup, tt, var,\n b, u, i, center,\n dl, dt, dd, ol, ul, li,\n fieldset, form, label, legend,\n table, caption, tbody, tfoot, thead, tr, th, td,\n article, aside, canvas, details, embed, \n figure, figcaption, footer, header, hgroup, \n menu, nav, output, ruby, section, summary,\n time, mark, audio, video {\n @include reset-box-model;\n @include reset-font; }\n table {\n @include reset-table; }\n caption, th, td {\n @include reset-table-cell; }\n q, blockquote {\n @include reset-quotation; }\n a img {\n @include reset-image-anchor-border; } }\n\n// Reset the box model measurements.\n@mixin reset-box-model {\n margin: 0;\n padding: 0;\n border: 0; }\n\n// Reset the font and vertical alignment.\n@mixin reset-font {\n font: inherit;\n font-size: 100%;\n vertical-align: baseline; }\n\n// Resets the outline when focus.\n// For accessibility you need to apply some styling in its place.\n@mixin reset-focus {\n outline: 0; }\n\n// Reset a body element.\n@mixin reset-body {\n line-height: 1; }\n\n// Reset the list style of an element.\n@mixin reset-list-style {\n list-style: none; }\n\n// Reset a table\n@mixin reset-table {\n border-collapse: collapse;\n border-spacing: 0; }\n\n// Reset a table cell (`th`, `td`)\n@mixin reset-table-cell {\n text-align: left;\n font-weight: normal;\n vertical-align: middle; }\n\n// Reset a quotation (`q`, `blockquote`)\n@mixin reset-quotation {\n quotes: none;\n &:before, &:after {\n content: \"\"; \n content: none; } }\n\n// Resets the border.\n@mixin reset-image-anchor-border {\n border: none; }\n\n// Unrecognized elements are displayed inline.\n// This reset provides a basic reset for block html5 elements\n// so they are rendered correctly in browsers that don't recognize them\n// and reset in browsers that have default styles for them.\n@mixin reset-html5 {\n #{elements-of-type(html5-block)} {\n display: block; } }\n\n// Resets the display of inline and block elements to their default display\n// according to their tag type. Elements that have a default display that varies across\n// versions of html or browser are not handled here, but this covers the 90% use case.\n// Usage Example:\n//\n// // Turn off the display for both of these classes\n// .unregistered-only, .registered-only\n// display: none\n// // Now turn only one of them back on depending on some other context.\n// body.registered\n// +reset-display(\".registered-only\")\n// body.unregistered\n// +reset-display(\".unregistered-only\")\n@mixin reset-display($selector: \"\", $important: false) {\n #{append-selector(elements-of-type(\"inline\"), $selector)} {\n @if $important {\n display: inline !important; }\n @else {\n display: inline; } }\n #{append-selector(elements-of-type(\"block\"), $selector)} {\n @if $important {\n display: block !important; }\n @else {\n display: block; } } }\n","// @doc off\n// Extends the bottom of the element to enclose any floats it contains.\n// @doc on\n\n@import \"hacks\";\n\n// This basic method is preferred for the usual case, when positioned\n// content will not show outside the bounds of the container.\n//\n// Recommendations include using this in conjunction with a width.\n// Credit: [quirksmode.org](http://www.quirksmode.org/blog/archives/2005/03/clearing_floats.html)\n@mixin clearfix {\n overflow: hidden;\n @include has-layout;\n}\n\n// This older method from Position Is Everything called\n// [Easy Clearing](http://www.positioniseverything.net/easyclearing.html)\n// has the advantage of allowing positioned elements to hang\n// outside the bounds of the container at the expense of more tricky CSS.\n@mixin legacy-pie-clearfix {\n &:after {\n content : \"\\0020\";\n display : block;\n height : 0;\n clear : both;\n overflow : hidden;\n visibility : hidden;\n }\n @include has-layout;\n}\n\n// This is an updated version of the PIE clearfix method that reduces the amount of CSS output.\n// If you need to support Firefox before 3.5 you need to use `legacy-pie-clearfix` instead.\n//\n// Adapted from: [A new micro clearfix hack](http://nicolasgallagher.com/micro-clearfix-hack/)\n@mixin pie-clearfix {\n &:after {\n content: \"\";\n display: table;\n clear: both;\n }\n @include has-layout;\n}\n","@import \"../../support\";\n\n// The `zoom` approach generates less CSS but does not validate.\n// Set this to `block` to use the display-property to hack the\n// element to gain layout.\n$default-has-layout-approach: zoom !default;\n\n// This mixin causes an element matching the selector\n// to gain the \"hasLayout\" property in internet explorer.\n// More information on [hasLayout](http://reference.sitepoint.com/css/haslayout).\n@mixin has-layout($approach: $default-has-layout-approach) {\n @if $legacy-support-for-ie {\n @if $approach == zoom {\n @include has-layout-zoom;\n } @else if $approach == block {\n @include has-layout-block;\n } @else {\n @warn \"Unknown has-layout approach: #{$approach}\";\n @include has-layout-zoom;\n }\n }\n}\n\n@mixin has-layout-zoom {\n @if $legacy-support-for-ie6 or $legacy-support-for-ie7 {\n *zoom: 1;\n }\n}\n\n@mixin has-layout-block {\n @if $legacy-support-for-ie {\n // This makes ie6 get layout\n display: inline-block;\n // and this puts it back to block\n & { display: block; }\n }\n}\n\n// A hack to supply IE6 (and below) with a different property value.\n// [Read more](http://www.cssportal.com/css-hacks/#in_css-important).\n@mixin bang-hack($property, $value, $ie6-value) {\n @if $legacy-support-for-ie6 {\n #{$property}: #{$value} !important;\n #{$property}: #{$ie6-value};\n }\n}\n","// Usually compass hacks apply to both ie6 & 7 -- set this to false to disable support for both.\n$legacy-support-for-ie: true !default;\n\n// Setting this to false will result in smaller output, but no support for ie6 hacks\n$legacy-support-for-ie6: $legacy-support-for-ie !default;\n\n// Setting this to false will result in smaller output, but no support for ie7 hacks\n$legacy-support-for-ie7: $legacy-support-for-ie !default;\n\n// Setting this to false will result in smaller output, but no support for legacy ie8 hacks\n$legacy-support-for-ie8: $legacy-support-for-ie !default;\n\n// @private\n// The user can simply set $legacy-support-for-ie and 6, 7, and 8 will be set accordingly,\n// But in case the user set each of those explicitly, we need to sync the value of\n// this combined variable.\n$legacy-support-for-ie: $legacy-support-for-ie6 or $legacy-support-for-ie7 or $legacy-support-for-ie8;\n\n// Whether to output legacy support for mozilla.\n// Usually this means hacks to support Firefox 3.6 or earlier.\n$legacy-support-for-mozilla: true;\n\n// Support for mozilla in experimental css3 properties (-moz).\n$experimental-support-for-mozilla : true !default;\n// Support for webkit in experimental css3 properties (-webkit).\n$experimental-support-for-webkit : true !default;\n// Support for webkit's original (non-standard) gradient syntax.\n$support-for-original-webkit-gradients : true !default;\n// Support for opera in experimental css3 properties (-o).\n$experimental-support-for-opera : true !default;\n// Support for microsoft in experimental css3 properties (-ms).\n$experimental-support-for-microsoft : true !default;\n// Support for khtml in experimental css3 properties (-khtml).\n$experimental-support-for-khtml : false !default;\n// Support for svg in experimental css3 properties.\n// Setting this to true might add significant size to your\n// generated stylesheets.\n$experimental-support-for-svg : false !default;\n// Support for CSS PIE in experimental css3 properties (-pie).\n$experimental-support-for-pie : false !default;\n","// Implementation of float:left with fix for the\n// [double-margin bug in IE5/6](http://www.positioniseverything.net/explorer/doubled-margin.html)\n@mixin float-left {\n @include float(left); }\n\n// Implementation of float:right with fix for the\n// [double-margin bug in IE5/6](http://www.positioniseverything.net/explorer/doubled-margin.html)\n@mixin float-right {\n @include float(right); }\n\n// Direction independent float mixin that fixes the\n// [double-margin bug in IE5/6](http://www.positioniseverything.net/explorer/doubled-margin.html)\n@mixin float($side: left) {\n display: inline;\n float: unquote($side); }\n\n// Resets floated elements back to their default of `float: none` and defaults\n// to `display: block` unless you pass `inline` as an argument\n//\n// Usage Example:\n//\n// body.homepage\n// #footer li\n// +float-left\n// body.signup\n// #footer li\n// +reset-float\n@mixin reset-float($display: block) {\n float: none;\n display: $display; }","// Emits styles for a tag cloud\n@mixin tag-cloud($base-size: 1em) {\n font-size: $base-size;\n line-height: 1.2 * $base-size;\n .xxs, .xs, .s, .l, .xl, .xxl {\n line-height: 1.2 * $base-size; }\n .xxs {\n font-size: $base-size / 2; }\n .xs {\n font-size: 2 * $base-size / 3; }\n .s {\n font-size: 3 * $base-size / 4; }\n .l {\n font-size: 4 * $base-size / 3; }\n .xl {\n font-size: 3 * $base-size / 2; }\n .xxl {\n font-size: 2 * $base-size; } }\n","@import \"hacks\";\n\n//**\n// Cross browser min-height mixin.\n@mixin min-height($value) {\n @include hacked-minimum(height, $value); }\n\n//**\n// Cross browser min-width mixin.\n@mixin min-width($value) {\n @include hacked-minimum(width, $value); }\n\n// @private This mixin is not meant to be used directly.\n@mixin hacked-minimum($property, $value) {\n min-#{$property}: $value;\n @include bang-hack($property, auto, $value); }\n","@import \"sprites/base\";\n@import \"sprites/sprite-img\";\n","// Determines those states for which you want to enable magic sprite selectors\n$sprite-selectors: hover, target, active !default;\n\n// Set the width and height of an element to the original\n// dimensions of an image before it was included in the sprite.\n@mixin sprite-dimensions($map, $sprite) {\n height: image-height(sprite-file($map, $sprite));\n width: image-width(sprite-file($map, $sprite));\n}\n\n// Set the background position of the given sprite `$map` to display the\n// sprite of the given `$sprite` name. You can move the image relative to its\n// natural position by passing `$offset-x` and `$offset-y`.\n@mixin sprite-background-position($map, $sprite, $offset-x: 0, $offset-y: 0) {\n background-position: sprite-position($map, $sprite, $offset-x, $offset-y); \n}\n\n\n// Determines if you want to include magic selectors in your sprites\n$disable-magic-sprite-selectors:false !default;\n\n// Include the position and (optionally) dimensions of this `$sprite`\n// in the given sprite `$map`. The sprite url should come from either a base\n// class or you can specify the `sprite-url` explicitly like this:\n//\n// background: $map no-repeat;\n@mixin sprite($map, $sprite, $dimensions: false, $offset-x: 0, $offset-y: 0) {\n @include sprite-background-position($map, $sprite, $offset-x, $offset-y);\n @if $dimensions {\n @include sprite-dimensions($map, $sprite);\n }\n @if not($disable-magic-sprite-selectors) {\n @include sprite-selectors($map, $sprite, $sprite, $offset-x, $offset-y);\n }\n}\n\n// Include the selectors for the `$sprite` given the `$map` and the \n// `$full-sprite-name`\n// @private\n@mixin sprite-selectors($map, $sprite-name, $full-sprite-name, $offset-x: 0, $offset-y: 0) {\n @each $selector in $sprite-selectors {\n @if sprite_has_selector($map, $sprite-name, $selector) {\n &:#{$selector}, &.#{$full-sprite-name}_#{$selector}, &.#{$full-sprite-name}-#{$selector} {\n @include sprite-background-position($map, \"#{$sprite-name}_#{$selector}\", $offset-x, $offset-y);\n }\n }\n }\n}\n\n// Generates a class for each space separated name in `$sprite-names`.\n// The class will be of the form .-.\n//\n// If a base class is provided, then each class will extend it.\n//\n// If `$dimensions` is `true`, the sprite dimensions will specified.\n@mixin sprites($map, $sprite-names, $base-class: false, $dimensions: false, $prefix: sprite-map-name($map), $offset-x: 0, $offset-y: 0) {\n @each $sprite-name in $sprite-names {\n @if sprite_does_not_have_parent($map, $sprite-name) {\n $full-sprite-name: \"#{$prefix}-#{$sprite-name}\";\n .#{$full-sprite-name} {\n @if $base-class { @extend #{$base-class}; }\n @include sprite($map, $sprite-name, $dimensions, $offset-x, $offset-y);\n }\n }\n }\n}","// @doc off\n// Example 1:\n//\n// a.twitter\n// +sprite-img(\"icons-32.png\", 1)\n// a.facebook\n// +sprite-img(\"icons-32png\", 2)\n//\n// Example 2:\n//\n// a\n// +sprite-background(\"icons-32.png\")\n// a.twitter\n// +sprite-column(1)\n// a.facebook\n// +sprite-row(2)\n// @doc on\n\n$sprite-default-size: 32px !default;\n\n$sprite-default-margin: 0px !default;\n\n$sprite-image-default-width: $sprite-default-size !default;\n\n$sprite-image-default-height: $sprite-default-size !default;\n\n// Sets all the rules for a sprite from a given sprite image to show just one of the sprites.\n// To reduce duplication use a sprite-bg mixin for common properties and a sprite-select mixin for positioning.\n@mixin sprite-img($img, $col, $row: 1, $width: $sprite-image-default-width, $height: $sprite-image-default-height, $margin: $sprite-default-margin) {\n @include sprite-background($img, $width, $height);\n @include sprite-position($col, $row, $width, $height, $margin); \n}\n\n// Sets rules common for all sprites, assumes you want a square, but allows a rectangular region.\n@mixin sprite-background($img, $width: $sprite-default-size, $height: $width) {\n @include sprite-background-rectangle($img, $width, $height); \n}\n\n// Sets rules common for all sprites, assumes a rectangular region.\n@mixin sprite-background-rectangle($img, $width: $sprite-image-default-width, $height: $sprite-image-default-height) {\n background: image-url($img) no-repeat;\n width: $width;\n height: $height;\n overflow: hidden; \n}\n\n// Allows horizontal sprite positioning optimized for a single row of sprites.\n@mixin sprite-column($col, $width: $sprite-image-default-width, $margin: $sprite-default-margin) {\n @include sprite-position($col, 1, $width, 0px, $margin); \n}\n\n// Allows vertical sprite positioning optimized for a single column of sprites.\n@mixin sprite-row($row, $height: $sprite-image-default-height, $margin: $sprite-default-margin) {\n @include sprite-position(1, $row, 0px, $height, $margin); \n}\n\n// Allows vertical and horizontal sprite positioning from a grid of equal dimensioned sprites.\n@mixin sprite-position($col, $row: 1, $width: $sprite-image-default-width, $height: $sprite-image-default-height, $margin: $sprite-default-margin) {\n $x: ($col - 1) * -$width - ($col - 1) * $margin;\n $y: ($row - 1) * -$height - ($row - 1) * $margin;\n background-position: $x $y; \n}\n\n\n\n// Similar to 'sprite-replace-text-with-dimensions' but does not autmaticly set the demensions\n@mixin sprite-replace-text ($map, $sprite, $dimensions: false, $offset-x: 0, $offset-y: 0) { \n @include hide-text;\n @include sprite($map, $sprite, $dimensions, $offset-x, $offset-y);\n background-image: $map;\n background-repeat: no-repeat;\n}\n\n// Similar to 'replace-text-with-dimensions' but with sprites\n// To use, create your sprite and then pass it in the `$map` param\n// The name of the image in the sprite folder should be `$img-name`\n@mixin sprite-replace-text-with-dimensions ($map, $sprite, $offset-x: 0, $offset-y: 0){ \n @include sprite-replace-text ($map, $sprite, true, $offset-x, $offset-y);\n}","@import \"tables/alternating-rows-and-columns\";\n@import \"tables/borders\";\n@import \"tables/scaffolding\";\n","@mixin alternating-rows-and-columns($even-row-color, $odd-row-color, $dark-intersection, $header-color: white, $footer-color: white) {\n th {\n background-color: $header-color;\n &.even, &:nth-child(2n) {\n background-color: $header-color - $dark-intersection; } }\n tr {\n &.odd, &:nth-child(2n+1) {\n td {\n background-color: $odd-row-color;\n &.even, &:nth-child(2n) {\n background-color: $odd-row-color - $dark-intersection; } } }\n }\n tr.even {\n td {\n background-color: $even-row-color;\n &.even, &:nth-child(2n) {\n background-color: $even-row-color - $dark-intersection; } } }\n tfoot {\n th, td {\n background-color: $footer-color;\n &.even, &:nth-child(2n) {\n background-color: $footer-color - $dark-intersection; } } } }\n","@mixin outer-table-borders($width: 2px, $color: black) {\n border: $width solid $color;\n thead {\n th {\n border-bottom: $width solid $color; } }\n tfoot {\n th, td {\n border-top: $width solid $color; } }\n th {\n &:first-child {\n border-right: $width solid $color; } } }\n\n@mixin inner-table-borders($width: 2px, $color: black) {\n th, td {\n border: {\n right: $width solid $color;\n bottom: $width solid $color;\n left-width: 0px;\n top-width: 0px; };\n &:last-child,\n &.last {\n border-right-width: 0px; } }\n\n// IE8 ignores rules that are included on the same line as :last-child\n// see http://www.richardscarrott.co.uk/posts/view/ie8-last-child-bug for details\n\n tbody, tfoot {\n tr:last-child {\n th, td {\n border-bottom-width: 0px; } }\n tr.last {\n th, td {\n border-bottom-width: 0px; } } } }\n","@mixin table-scaffolding {\n th {\n text-align: center;\n font-weight: bold; }\n td,\n th {\n padding: 2px;\n &.numeric {\n text-align: right; } } }\n","@import \"links/hover-link\";\n@import \"links/link-colors\";\n@import \"links/unstyled-link\";\n","// a link that only has an underline when you hover over it\n@mixin hover-link {\n text-decoration: none;\n &:hover {\n text-decoration: underline; } }\n","// Set all the colors for a link with one mixin call.\n// Order of arguments is:\n//\n// 1. normal\n// 2. hover\n// 3. active\n// 4. visited\n// 5. focus\n//\n// Those states not specified will inherit.\n// Mixin to an anchor link like so:\n// a\n// +link-colors(#00c, #0cc, #c0c, #ccc, #cc0)\n\n@mixin link-colors($normal, $hover: false, $active: false, $visited: false, $focus: false) {\n color: $normal;\n @if $visited {\n &:visited {\n color: $visited; } }\n @if $focus {\n &:focus {\n color: $focus; } }\n @if $hover {\n &:hover {\n color: $hover; } }\n @if $active {\n &:active {\n color: $active; } } }\n","// A link that looks and acts like the text it is contained within\n@mixin unstyled-link {\n color: inherit;\n text-decoration: inherit;\n cursor: inherit;\n &:active, &:focus {\n outline: none; } }\n","@import \"lists/horizontal-list\";\n@import \"lists/inline-list\";\n@import \"lists/inline-block-list\";\n@import \"lists/bullets\";\n","// Horizontal list layout module.\n//\n// Easy mode using simple descendant li selectors:\n//\n// ul.nav\n// +horizontal-list\n//\n// Advanced mode:\n// If you need to target the list items using a different selector then use\n// +horizontal-list-container on your ul/ol and +horizontal-list-item on your li.\n// This may help when working on layouts involving nested lists. For example:\n//\n// ul.nav\n// +horizontal-list-container\n// > li\n// +horizontal-list-item\n\n@import \"bullets\";\n@import \"../../utilities/general/clearfix\";\n@import \"../../utilities/general/reset\";\n@import \"../../utilities/general/float\";\n\n// Can be mixed into any selector that target a ul or ol that is meant\n// to have a horizontal layout. Used to implement +horizontal-list.\n@mixin horizontal-list-container {\n @include reset-box-model;\n @include clearfix; }\n\n// Can be mixed into any li selector that is meant to participate in a horizontal layout.\n// Used to implement +horizontal-list.\n//\n// :last-child is not fully supported\n// see http://www.quirksmode.org/css/contents.html#t29 for the support matrix\n//\n// IE8 ignores rules that are included on the same line as :last-child\n// see http://www.richardscarrott.co.uk/posts/view/ie8-last-child-bug for details\n//\n// Setting `$padding` to `false` disables the padding between list elements\n@mixin horizontal-list-item($padding: 4px, $direction: left) {\n @include no-bullet;\n white-space: nowrap;\n @include float($direction);\n @if $padding {\n padding: {\n left: $padding;\n right: $padding;\n }\n &:first-child, &.first { padding-#{$direction}: 0; }\n &:last-child { padding-#{opposite-position($direction)}: 0; }\n &.last { padding-#{opposite-position($direction)}: 0; }\n }\n}\n\n// A list(ol,ul) that is layed out such that the elements are floated left and won't wrap.\n// This is not an inline list.\n//\n// Setting `$padding` to `false` disables the padding between list elements\n@mixin horizontal-list($padding: 4px, $direction: left) {\n @include horizontal-list-container;\n li {\n @include horizontal-list-item($padding, $direction); } }\n","// Turn off the bullet for an element of a list\n@mixin no-bullet {\n list-style-image : none;\n list-style-type : none;\n margin-left : 0;\n}\n\n// turns off the bullets for an entire list\n@mixin no-bullets {\n list-style: none;\n li { @include no-bullet; }\n}\n\n// Make a list(ul/ol) have an image bullet.\n//\n// The mixin should be used like this for an icon that is 5x7:\n//\n// ul.pretty\n// +pretty-bullets(\"my-icon.png\", 5px, 7px)\n//\n// Additionally, if the image dimensions are not provided,\n// The image dimensions will be extracted from the image itself.\n//\n// ul.pretty\n// +pretty-bullets(\"my-icon.png\")\n//\n@mixin pretty-bullets($bullet-icon, $width: image-width($bullet-icon), $height: image-height($bullet-icon), $line-height: 18px, $padding: 14px) {\n margin-left: 0;\n li {\n padding-left: $padding;\n background: image-url($bullet-icon) no-repeat ($padding - $width) / 2 ($line-height - $height) / 2;\n list-style-type: none;\n }\n}\n","// makes a list inline.\n\n@mixin inline-list {\n list-style-type: none;\n &, & li {\n margin: 0px;\n padding: 0px;\n display: inline;\n }\n}\n\n// makes an inline list delimited with the passed string.\n// Defaults to making a comma-separated list.\n//\n// Please make note of the browser support issues before using this mixin:\n//\n// use of `content` and `:after` is not fully supported in all browsers.\n// See quirksmode for the [support matrix](http://www.quirksmode.org/css/contents.html#t15)\n//\n// `:last-child` is not fully supported.\n// see quirksmode for the [support matrix](http://www.quirksmode.org/css/contents.html#t29).\n//\n// IE8 ignores rules that are included on the same line as :last-child\n// see http://www.richardscarrott.co.uk/posts/view/ie8-last-child-bug for details\n\n@mixin delimited-list($separator: \", \") {\n @include inline-list;\n li {\n &:after { content: $separator; }\n &:last-child {\n &:after { content: \"\"; }\n }\n &.last {\n &:after { content: \"\"; }\n }\n }\n}\n\n// See [delimited-list](#mixin-delimited-list)\n// @deprecated\n@mixin comma-delimited-list {\n @warn \"comma-delimited-list is deprecated. Please use delimited-list instead.\";\n @include delimited-list;\n}\n","// Inline-Block list layout module.\n//\n// Easy mode using simple descendant li selectors:\n//\n// ul.nav {\n// @import inline-block-list;\n// }\n//\n// Advanced mode:\n// If you need to target the list items using a different selector then use\n// `@include inline-block-list-container` on your ul/ol and\n// `@include inline-block-list-item` on your li. This may help when working\n// on layouts involving nested lists. For example:\n//\n// ul.nav {\n// @include inline-block-list-container;\n// > li {\n// @include inline-block-list-item;\n// }\n// }\n\n@import \"bullets\";\n@import \"horizontal-list\";\n@import \"../../utilities/general/float\";\n@import \"../../css3/inline-block\";\n\n// Can be mixed into any selector that target a ul or ol that is meant\n// to have an inline-block layout. Used to implement `inline-block-list`.\n@mixin inline-block-list-container {\n @include horizontal-list-container; }\n\n// Can be mixed into any li selector that is meant to participate in a horizontal layout.\n// Used to implement `inline-block-list`.\n@mixin inline-block-list-item($padding: false) {\n @include no-bullet;\n @include inline-block;\n white-space: nowrap;\n @if $padding {\n padding: {\n left: $padding;\n right: $padding;\n };\n }\n}\n\n// A list(ol,ul) that is layed out such that the elements are inline-block and won't wrap.\n@mixin inline-block-list($padding: false) {\n @include inline-block-list-container;\n li {\n @include inline-block-list-item($padding); } }\n","@import \"shared\";\n\n// Set `$inline-block-alignment` to `none` or `false` to disable the output\n// of a vertical-align property in the inline-block mixin.\n// Or set it to a legal value for `vertical-align` to change the default.\n$inline-block-alignment: middle !default;\n\n// Provides a cross-browser method to implement `display: inline-block;`\n@mixin inline-block($alignment: $inline-block-alignment) {\n @if $legacy-support-for-mozilla {\n display: -moz-inline-stack;\n }\n display: inline-block;\n @if $alignment and $alignment != none {\n vertical-align: $alignment;\n }\n @if $legacy-support-for-ie {\n *vertical-align: auto;\n zoom: 1;\n *display: inline;\n }\n}\n","@import \"../support\";\n\n// This mixin provides basic support for CSS3 properties and\n// their corresponding experimental CSS2 properties when\n// the implementations are identical except for the property\n// prefix.\n@mixin experimental($property, $value,\n $moz : $experimental-support-for-mozilla,\n $webkit : $experimental-support-for-webkit,\n $o : $experimental-support-for-opera,\n $ms : $experimental-support-for-microsoft,\n $khtml : $experimental-support-for-khtml,\n $official : true\n) {\n @if $webkit and $experimental-support-for-webkit { -webkit-#{$property} : $value; }\n @if $khtml and $experimental-support-for-khtml { -khtml-#{$property} : $value; }\n @if $moz and $experimental-support-for-mozilla { -moz-#{$property} : $value; }\n @if $ms and $experimental-support-for-microsoft { -ms-#{$property} : $value; }\n @if $o and $experimental-support-for-opera { -o-#{$property} : $value; }\n @if $official { #{$property} : $value; }\n}\n\n// Same as experimental(), but for cases when the property is the same and the value is vendorized\n@mixin experimental-value($property, $value,\n $moz : $experimental-support-for-mozilla,\n $webkit : $experimental-support-for-webkit,\n $o : $experimental-support-for-opera,\n $ms : $experimental-support-for-microsoft,\n $khtml : $experimental-support-for-khtml,\n $official : true\n) {\n @if $webkit and $experimental-support-for-webkit { #{$property} : -webkit-#{$value}; }\n @if $khtml and $experimental-support-for-khtml { #{$property} : -khtml-#{$value}; }\n @if $moz and $experimental-support-for-mozilla { #{$property} : -moz-#{$value}; }\n @if $ms and $experimental-support-for-microsoft { #{$property} : -ms-#{$value}; }\n @if $o and $experimental-support-for-opera { #{$property} : -o-#{$value}; }\n @if $official { #{$property} : #{$value}; }\n}\n","@import \"text/ellipsis\";\n@import \"text/nowrap\";\n@import \"text/replacement\";\n@import \"text/force-wrap\";\n","@import \"../../css3/shared\";\n\n// To get full firefox support, you must install the ellipsis pattern:\n//\n// compass install compass/ellipsis\n$use-mozilla-ellipsis-binding: false !default;\n\n// This technique, by [Justin Maxwell](http://code404.com/), was originally\n// published [here](http://mattsnider.com/css/css-string-truncation-with-ellipsis/).\n// Firefox implementation by [Rikkert Koppes](http://www.rikkertkoppes.com/thoughts/2008/6/).\n@mixin ellipsis($no-wrap: true) {\n @if $no-wrap { white-space: nowrap; }\n overflow: hidden;\n @include experimental(text-overflow, ellipsis,\n not(-moz),\n not(-webkit),\n -o,\n -ms,\n not(-khtml),\n official\n );\n @if $experimental-support-for-mozilla and $use-mozilla-ellipsis-binding {\n -moz-binding: stylesheet-url(unquote(\"xml/ellipsis.xml#ellipsis\"));\n }\n}\n","// When remembering whether or not there's a hyphen in white-space is too hard\n@mixin nowrap { white-space: nowrap; }\n","// Indicates the direction you prefer to move your text\n// when hiding it.\n//\n// `left` is more robust, especially in older browsers.\n// `right` seems have better runtime performance.\n$hide-text-direction: left !default;\n\n// Hides html text and replaces it with an image.\n// If you use this on an inline element, you will need to change the display to block or inline-block.\n// Also, if the size of the image differs significantly from the font size, you'll need to set the width and/or height.\n//\n// Parameters:\n//\n// * `img` -- the relative path from the project image directory to the image, or a url literal.\n// * `x` -- the x position of the background image.\n// * `y` -- the y position of the background image.\n@mixin replace-text($img, $x: 50%, $y: 50%) {\n @include hide-text;\n background: {\n @if is-url($img) {\n image: url($img);\n } @else {\n image: image-url($img);\n }\n repeat: no-repeat;\n position: $x $y;\n };\n}\n\n// Like the `replace-text` mixin, but also sets the width\n// and height of the element according the dimensions of the image.\n//\n// If you set `$inline` to true, then an inline image (data uri) will be used.\n@mixin replace-text-with-dimensions($img, $x: 50%, $y: 50%, $inline: false) {\n @include replace-text(if($inline, inline-image($img), $img), $x, $y);\n width: image-width($img);\n height: image-height($img);\n}\n\n// Hides text in an element so you can see the background.\n//\n// The direction indicates how the text should be moved out of view.\n//\n// See `$hide-text-direction` for more information and to set this globally\n// for your application.\n@mixin hide-text($direction: $hide-text-direction) {\n @if $direction == left {\n $approximate-em-value: 12px;\n $wider-than-any-screen: -9999;\n text-indent: $wider-than-any-screen * $approximate-em-value;\n overflow: hidden;\n text-align: left;\n } @else {\n // slightly wider than the box prevents issues with inline-block elements\n text-indent: 110%;\n white-space: nowrap;\n overflow: hidden;\n }\n}\n\n// Hides text in an element by squishing the text into oblivion.\n// Use this if you need to hide text contained in an inline element\n// but still have it read by a screen reader.\n@mixin squish-text {\n font: 0/0 serif;\n text-shadow: none;\n color: transparent;\n}\n","// Prevent long urls and text from breaking layouts\n// [originally from perishablepress.com](http://perishablepress.com/press/2010/06/01/wrapping-content/)\n@mixin force-wrap {\n white-space: pre; // CSS 2.0\n white-space: pre-wrap; // CSS 2.1\n white-space: pre-line; // CSS 3.0\n white-space: -pre-wrap; // Opera 4-6\n white-space: -o-pre-wrap; // Opera 7\n white-space: -moz-pre-wrap; // Mozilla\n white-space: -hp-pre-wrap; // HP Printers\n word-wrap: break-word; // IE 5+\n}\n","@import \"typography/links\";\n@import \"typography/lists\";\n@import \"typography/text\";\n@import \"typography/vertical_rhythm\";\n","@import \"../layout/grid-background\";\n\n// The base font size.\n$base-font-size: 16px !default;\n\n// The base line height determines the basic unit of vertical rhythm.\n$base-line-height: 24px !default;\n\n// Set the default border style for rhythm borders.\n$default-rhythm-border-style: solid !default;\n\n// The default font size in all browsers.\n$browser-default-font-size: 16px;\n\n// Set to false if you want to use absolute pixels in sizing your typography.\n$relative-font-sizing: true !default;\n\n// Allows the `adjust-font-size-to` mixin and the `lines-for-font-size` function\n// to round the line height to the nearest half line height instead of the\n// nearest integral line height to avoid large spacing between lines.\n$round-to-nearest-half-line: false !default;\n\n// Ensure there is at least this many pixels\n// of vertical padding above and below the text.\n$min-line-padding: 2px !default;\n\n// $base-font-size but in your output unit of choice.\n// Defaults to 1em when `$relative-font-sizing` is true.\n$font-unit: if($relative-font-sizing, 1em, $base-font-size) !default;\n\n// The basic unit of font rhythm.\n$base-rhythm-unit: $base-line-height / $base-font-size * $font-unit;\n\n// The leader is the amount of whitespace in a line.\n// It might be useful in your calculations.\n$base-leader: ($base-line-height - $base-font-size) * $font-unit / $base-font-size;\n\n// The half-leader is the amount of whitespace above and below a line.\n// It might be useful in your calculations.\n$base-half-leader: $base-leader / 2;\n\n// True if a number has a relative unit.\n@function relative-unit($number) {\n @return unit($number) == \"%\" or unit($number) == \"em\" or unit($number) == \"rem\"\n}\n\n// True if a number has an absolute unit.\n@function absolute-unit($number) {\n @return not(relative-unit($number) or unitless($number));\n}\n\n@if $relative-font-sizing and not(relative-unit($font-unit)) {\n @warn \"$relative-font-sizing is true but $font-unit is set to #{$font-unit} which is not a relative unit.\";\n}\n\n// Establishes a font baseline for the given font-size.\n@mixin establish-baseline($font-size: $base-font-size) {\n // IE 6 refuses to resize fonts set in pixels and it weirdly resizes fonts\n // whose root is set in ems. So we set the root font size in percentages of\n // the default font size.\n * html {\n font-size: 100% * ($font-size / $browser-default-font-size);\n }\n html {\n font-size: $font-size;\n @include adjust-leading-to(1, if($relative-font-sizing, $font-size, $base-font-size));\n }\n}\n\n// Resets the line-height to 1 vertical rhythm unit.\n// Does not work on elements whose font-size is different from $base-font-size.\n//\n// @deprecated This mixin will be removed in the next release.\n// Please use the `adjust-leading-to` mixin instead.\n@mixin reset-baseline {\n @include adjust-leading-to(1, if($relative-font-sizing, $base-font-size, $base-font-size));\n}\n\n// Show a background image that can be used to debug your alignments.\n// Include the $img argument if you would rather use your own image than the\n// Compass default gradient image.\n@mixin debug-vertical-alignment($img: false) {\n @if $img {\n background: image-url($img);\n } @else {\n @include baseline-grid-background($base-rhythm-unit);\n }\n}\n\n// Adjust a block to have a different font size and line height to maintain the\n// rhythm. $lines specifies how many multiples of the baseline rhythm each line\n// of this font should use up. It does not have to be an integer, but it\n// defaults to the smallest integer that is large enough to fit the font.\n// Use $from-size to adjust from a font-size other than the base font-size.\n@mixin adjust-font-size-to($to-size, $lines: lines-for-font-size($to-size), $from-size: $base-font-size) {\n @if not($relative-font-sizing) and $from-size != $base-font-size {\n @warn \"$relative-font-sizing is false but a relative font size was passed to adjust-font-size-to\";\n }\n font-size: $font-unit * $to-size / $from-size;\n @include adjust-leading-to($lines, if($relative-font-sizing, $to-size, $base-font-size));\n}\n\n// Adjust a block to have different line height to maintain the rhythm.\n// $lines specifies how many multiples of the baseline rhythm each line of this\n// font should use up. It does not have to be an integer, but it defaults to the\n// smallest integer that is large enough to fit the font.\n@mixin adjust-leading-to($lines, $font-size: $base-font-size) {\n line-height: rhythm($lines, $font-size);\n}\n\n// Calculate rhythm units.\n@function rhythm(\n $lines: 1,\n $font-size: $base-font-size,\n $offset: 0\n) {\n @if not($relative-font-sizing) and $font-size != $base-font-size {\n @warn \"$relative-font-sizing is false but a relative font size was passed to the rhythm function\";\n }\n $rhythm: $font-unit * ($lines * $base-line-height - $offset) / $font-size;\n // Round the pixels down to nearest integer.\n @if unit($rhythm) == px {\n $rhythm: floor($rhythm);\n }\n @return $rhythm;\n}\n\n// Calculate the minimum multiple of rhythm units needed to contain the font-size.\n@function lines-for-font-size($font-size) {\n $lines: if($round-to-nearest-half-line,\n ceil(2 * $font-size / $base-line-height) / 2,\n ceil($font-size / $base-line-height));\n @if $lines * $base-line-height - $font-size < $min-line-padding * 2 {\n $lines: $lines + if($round-to-nearest-half-line, 0.5, 1);\n }\n @return $lines;\n}\n\n// Apply leading whitespace. The $property can be margin or padding.\n@mixin leader($lines: 1, $font-size: $base-font-size, $property: margin) {\n #{$property}-top: rhythm($lines, $font-size);\n}\n\n// Apply leading whitespace as padding.\n@mixin padding-leader($lines: 1, $font-size: $base-font-size) {\n padding-top: rhythm($lines, $font-size);\n}\n\n// Apply leading whitespace as margin.\n@mixin margin-leader($lines: 1, $font-size: $base-font-size) {\n margin-top: rhythm($lines, $font-size);\n}\n\n// Apply trailing whitespace. The $property can be margin or padding.\n@mixin trailer($lines: 1, $font-size: $base-font-size, $property: margin) {\n #{$property}-bottom: rhythm($lines, $font-size);\n}\n\n// Apply trailing whitespace as padding.\n@mixin padding-trailer($lines: 1, $font-size: $base-font-size) {\n padding-bottom: rhythm($lines, $font-size);\n}\n\n// Apply trailing whitespace as margin.\n@mixin margin-trailer($lines: 1, $font-size: $base-font-size) {\n margin-bottom: rhythm($lines, $font-size);\n}\n\n// Shorthand mixin to apply whitespace for top and bottom margins and padding.\n@mixin rhythm($leader: 0, $padding-leader: 0, $padding-trailer: 0, $trailer: 0, $font-size: $base-font-size) {\n @include leader($leader, $font-size);\n @include padding-leader($padding-leader, $font-size);\n @include padding-trailer($padding-trailer, $font-size);\n @include trailer($trailer, $font-size);\n}\n\n// Apply a border and whitespace to any side without destroying the vertical\n// rhythm. The whitespace must be greater than the width of the border.\n@mixin apply-side-rhythm-border($side, $width: 1px, $lines: 1, $font-size: $base-font-size, $border-style: $default-rhythm-border-style) {\n @if not($relative-font-sizing) and $font-size != $base-font-size {\n @warn \"$relative-font-sizing is false but a relative font size was passed to apply-side-rhythm-border\";\n }\n border-#{$side}-style: $border-style;\n border-#{$side}-width: $font-unit * $width / $font-size;\n padding-#{$side}: rhythm($lines, $font-size, $offset: $width);\n}\n\n// Apply borders and whitespace equally to all sides.\n@mixin rhythm-borders($width: 1px, $lines: 1, $font-size: $base-font-size, $border-style: $default-rhythm-border-style) {\n @if not($relative-font-sizing) and $font-size != $base-font-size {\n @warn \"$relative-font-sizing is false but a relative font size was passed to rhythm-borders\";\n }\n border: {\n style: $border-style;\n width: $font-unit * $width / $font-size;\n };\n padding: rhythm($lines, $font-size, $offset: $width);\n}\n\n// Apply a leading border.\n@mixin leading-border($width: 1px, $lines: 1, $font-size: $base-font-size, $border-style: $default-rhythm-border-style) {\n @include apply-side-rhythm-border(top, $width, $lines, $font-size, $border-style);\n}\n\n// Apply a trailing border.\n@mixin trailing-border($width: 1px, $lines: 1, $font-size: $base-font-size, $border-style: $default-rhythm-border-style) {\n @include apply-side-rhythm-border(bottom, $width, $lines, $font-size, $border-style);\n}\n\n// Apply both leading and trailing borders.\n@mixin horizontal-borders($width: 1px, $lines: 1, $font-size: $base-font-size, $border-style: $default-rhythm-border-style) {\n @include leading-border($width, $lines, $font-size, $border-style);\n @include trailing-border($width, $lines, $font-size, $border-style);\n}\n\n// Alias for `horizontal-borders` mixin.\n@mixin h-borders($width: 1px, $lines: 1, $font-size: $base-font-size, $border-style: $default-rhythm-border-style) {\n @include horizontal-borders($width, $lines, $font-size, $border-style);\n}\n","@import \"../css3/images\";\n@import \"../css3/background-size\";\n\n// Set the color of your columns\n$grid-background-column-color : rgba(100, 100, 225, 0.25) !default;\n// Set the color of your gutters\n$grid-background-gutter-color : rgba(0, 0, 0, 0) !default;\n\n// Set the total number of columns in your grid\n$grid-background-total-columns : 24 !default;\n// Set the width of your columns\n$grid-background-column-width : 30px !default;\n// Set the width of your gutters\n$grid-background-gutter-width : 10px !default;\n// Set the offset, if your columns are padded in from the container edge\n$grid-background-offset : 0px !default;\n\n// Set the color of your baseline\n$grid-background-baseline-color : rgba(0, 0, 0, 0.5) !default;\n// Set the height of your baseline grid\n$grid-background-baseline-height : 1.5em !default;\n\n// toggle your columns grids on and off\n$show-column-grid-backgrounds : true !default;\n// toggle your vertical grids on and off\n$show-baseline-grid-backgrounds : true !default;\n// toggle all your grids on and off\n$show-grid-backgrounds : true !default;\n\n// optionally force your grid-image to remain fluid\n// no matter what units you used to declared your grid.\n$grid-background-force-fluid : false !default;\n\n\n// Create the gradient needed for baseline grids\n@function get-baseline-gradient(\n $color : $grid-background-baseline-color\n) {\n $gradient: linear-gradient(bottom, $color 5%, rgba($color,0) 5%);\n @return $gradient;\n}\n\n// Create the color-stops needed for horizontal grids\n@function build-grid-background(\n $total : $grid-background-total-columns,\n $column : $grid-background-column-width,\n $gutter : $grid-background-gutter-width,\n $offset : $grid-background-offset,\n $column-color : $grid-background-column-color,\n $gutter-color : $grid-background-gutter-color\n) {\n $grid: compact();\n $grid: append($grid, $gutter-color $offset, comma);\n @for $i from 0 to $total {\n\n // $a represents the start of this column, initially equal to the offset\n $a: $offset;\n @if $i > 0 { $a: $a + (($column + $gutter) * $i); }\n\n // $g represents the start of this gutter, equal to $a plus one column-width\n $g: $a + $column;\n\n // $z represents the end of a gutter, equal to $g plus one gutter-width\n $z: $g + $gutter;\n\n @if (unit($a) == \"%\") and ($i == ($total - 1)) {\n $z: 100%;\n }\n\n // and we add this column/gutter pair to our grid\n $grid: join($grid, ($column-color $a, $column-color $g, $gutter-color $g, $gutter-color $z));\n }\n\n @return $grid;\n}\n\n// Return the gradient needed for horizontal grids\n@function get-column-gradient(\n $total : $grid-background-total-columns,\n $column : $grid-background-column-width,\n $gutter : $grid-background-gutter-width,\n $offset : $grid-background-offset,\n $column-color : $grid-background-column-color,\n $gutter-color : $grid-background-gutter-color,\n $force-fluid : $grid-background-force-fluid\n) {\n $grid: unquote(\"\");\n\n // don't force fluid grids when they are already fluid.\n @if unit($column) == \"%\" { $force-fluid: false; }\n\n @if $force-fluid {\n $grid: get-column-fluid-grid($total,$column,$gutter,$offset,$column-color,$gutter-color);\n } @else {\n $grid: build-grid-background($total,$column,$gutter,$offset,$column-color,$gutter-color);\n }\n\n // return the horizontal grid as a gradient\n $gradient: linear-gradient(left, $grid);\n @return $gradient;\n}\n\n// Convert a grid from fixed units into percentages.\n@function get-column-fluid-grid(\n $total : $grid-background-total-columns,\n $column : $grid-background-column-width,\n $gutter : $grid-background-gutter-width,\n $offset : $grid-background-offset,\n $column-color : $grid-background-column-color,\n $gutter-color : $grid-background-gutter-color\n) {\n $context: ($column * $total) + ($gutter * ($total - 1) + ($offset * 2));\n $offset: $offset / $context * 100%;\n $column: $column / $context * 100%;\n $gutter: $gutter / $context * 100%;\n\n // return the horizontal grid as a set of color-stops\n $grid: build-grid-background($total,$column,$gutter,$offset,$column-color,$gutter-color);\n @return $grid;\n}\n\n\n// Add just the baseline grid to an element's background\n@mixin baseline-grid-background(\n $baseline : $grid-background-baseline-height,\n $color : $grid-background-baseline-color\n) {\n @if $show-grid-backgrounds and $show-baseline-grid-backgrounds {\n @include background-image(get-baseline-gradient($color));\n @include background-size(100% $baseline);\n background-position: left top;\n }\n}\n\n// Add just the horizontal grid to an element's background\n@mixin column-grid-background(\n $total : $grid-background-total-columns,\n $column : $grid-background-column-width,\n $gutter : $grid-background-gutter-width,\n $offset : $grid-background-offset,\n $column-color : $grid-background-column-color,\n $gutter-color : $grid-background-gutter-color,\n $force-fluid : $grid-background-force-fluid\n) {\n @if $show-grid-backgrounds and $show-column-grid-backgrounds {\n @include background-image(\n get-column-gradient($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid)\n );\n background-position: left top;\n }\n}\n\n// Add both horizontal and baseline grids to an element's background\n@mixin grid-background(\n $total : $grid-background-total-columns,\n $column : $grid-background-column-width,\n $gutter : $grid-background-gutter-width,\n $baseline : $grid-background-baseline-height,\n $offset : $grid-background-offset,\n $column-color : $grid-background-column-color,\n $gutter-color : $grid-background-gutter-color,\n $baseline-color : $grid-background-baseline-color,\n $force-fluid : $grid-background-force-fluid\n) {\n @if $show-grid-backgrounds {\n @if $show-baseline-grid-backgrounds and $show-column-grid-backgrounds {\n @include background-image(\n get-baseline-gradient($baseline-color),\n get-column-gradient($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid)\n );\n @include background-size(100% $baseline, auto);\n background-position: left top;\n } @else {\n @include baseline-grid-background($baseline, $baseline-color);\n @include column-grid-background($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid);\n }\n }\n}\n","@import \"shared\";\n@import \"../utilities/general/hacks\";\n@import \"../functions\";\n\n// Background property support for vendor prefixing within values.\n@mixin background(\n $background-1,\n $background-2: false,\n $background-3: false,\n $background-4: false,\n $background-5: false,\n $background-6: false,\n $background-7: false,\n $background-8: false,\n $background-9: false,\n $background-10: false\n) {\n $backgrounds: compact($background-1, $background-2, $background-3, $background-4, $background-5,\n $background-6, $background-7, $background-8, $background-9, $background-10);\n $mult-bgs: -compass-list-size($backgrounds) > 1;\n $add-pie-bg: prefixed(-pie, $backgrounds) or $mult-bgs;\n @if $experimental-support-for-svg and prefixed(-svg, $backgrounds) { background: -svg($backgrounds); }\n @if $support-for-original-webkit-gradients and prefixed(-owg, $backgrounds) { background: -owg($backgrounds); }\n @if $experimental-support-for-webkit and prefixed(-webkit, $backgrounds) { background: -webkit($backgrounds); }\n @if $experimental-support-for-mozilla and prefixed(-moz, $backgrounds) { background: -moz($backgrounds); }\n @if $experimental-support-for-opera and prefixed(-o, $backgrounds) { background: -o($backgrounds); }\n @if $experimental-support-for-pie and $add-pie-bg { -pie-background: -pie($backgrounds); }\n background: $backgrounds ;\n}\n\n@mixin background-with-css2-fallback(\n $background-1,\n $background-2: false,\n $background-3: false,\n $background-4: false,\n $background-5: false,\n $background-6: false,\n $background-7: false,\n $background-8: false,\n $background-9: false,\n $background-10: false\n) {\n $backgrounds: compact($background-1, $background-2, $background-3, $background-4, $background-5,\n $background-6, $background-7, $background-8, $background-9, $background-10);\n $mult-bgs: -compass-list-size($backgrounds) > 1;\n $simple-background: if($mult-bgs or prefixed(-css2, $backgrounds), -css2(-compass-nth($backgrounds, last)), false);\n @if not(blank($simple-background)) { background: $simple-background; }\n @include background($background-1, $background-2, $background-3, $background-4, $background-5,\n $background-6, $background-7, $background-8, $background-9, $background-10);\n}\n\n\n// Background image property support for vendor prefixing within values.\n@mixin background-image(\n $image-1,\n $image-2: false,\n $image-3: false,\n $image-4: false,\n $image-5: false,\n $image-6: false,\n $image-7: false,\n $image-8: false,\n $image-9: false,\n $image-10: false\n) {\n $images: compact($image-1, $image-2, $image-3, $image-4, $image-5, $image-6, $image-7, $image-8, $image-9, $image-10);\n $add-pie-bg: prefixed(-pie, $images) or -compass-list-size($images) > 1;\n\n @if $experimental-support-for-svg and prefixed(-svg, $images) { background-image: -svg($images); background-size: 100%; }\n @if $support-for-original-webkit-gradients and prefixed(-owg, $images) { background-image: -owg($images); }\n @if $experimental-support-for-webkit and prefixed(-webkit, $images) { background-image: -webkit($images); }\n @if $experimental-support-for-mozilla and prefixed(-moz, $images) { background-image: -moz($images); }\n @if $experimental-support-for-opera and prefixed(-o, $images) { background-image: -o($images); }\n @if $experimental-support-for-pie and $add-pie-bg { @warn \"PIE does not support background-image. Use @include background(#{$images}) instead.\" }\n background-image: $images ;\n}\n\n// Emit a IE-Specific filters that renders a simple linear gradient.\n// For use in IE 6 - 8. Best practice would have you apply this via a\n// conditional IE stylesheet, but if you must, you should place this before\n// any background-image properties that you have specified.\n//\n// For the `$orientation` parameter, you can pass `vertical` or `horizontal`.\n@mixin filter-gradient($start-color, $end-color, $orientation: vertical) {\n @include has-layout;\n $gradient-type: if($orientation == vertical, 0, 1);\n @if $legacy-support-for-ie6 or $legacy-support-for-ie7 or $legacy-support-for-ie8 {\n filter: progid:DXImageTransform.Microsoft.gradient(gradientType=#{$gradient-type}, startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}');\n }\n}\n\n\n// Border image property support for vendor prefixing properties and values.\n@mixin border-image($value) {\n @if $experimental-support-for-mozilla { -moz-border-image: -moz(reject(-compass-list($value), fill)); }\n @if $support-for-original-webkit-gradients { -webkit-border-image: -owg(reject(-compass-list($value), fill)); }\n @if $experimental-support-for-webkit { -webkit-border-image: -webkit(reject(-compass-list($value), fill)); }\n @if $experimental-support-for-opera { -o-border-image: -o(reject(-compass-list($value), fill)); }\n @if $experimental-support-for-svg { border-image: -svg(reject(-compass-list($value), fill)); }\n border-image: $value;\n}\n\n// List style image property support for vendor prefixing within values.\n@mixin list-style-image($image) {\n @if $experimental-support-for-mozilla and prefixed(-moz, $image) { list-style-image: -moz($image); }\n @if $support-for-original-webkit-gradients and prefixed(-owg, $image) { list-style-image: -owg($image); }\n @if $experimental-support-for-webkit and prefixed(-webkit, $image) { list-style-image: -webkit($image); }\n @if $experimental-support-for-opera and prefixed(-o, $image) { list-style-image: -o($image); }\n @if $experimental-support-for-svg and prefixed(-svg, $image) { list-style-image: -svg($image); }\n list-style-image: $image ;\n}\n\n// List style property support for vendor prefixing within values.\n@mixin list-style($value) {\n $value: -compass-list($value);\n @if $experimental-support-for-mozilla and prefixed(-moz, $value) { list-style-image: -moz($value); }\n @if $support-for-original-webkit-gradients and prefixed(-owg, $value) { list-style-image: -owg($value); }\n @if $experimental-support-for-webkit and prefixed(-webkit, $value) { list-style-image: -webkit($value); }\n @if $experimental-support-for-opera and prefixed(-o, $value) { list-style-image: -o($value); }\n @if $experimental-support-for-svg and prefixed(-svg, $value) { list-style-image: -svg($value); }\n list-style-image: $value ;\n}\n\n// content property support for vendor prefixing within values.\n@mixin content($value) {\n $value: -compass-list($value);\n @if $experimental-support-for-mozilla and prefixed(-moz, $value) { content: -moz($value); }\n @if $support-for-original-webkit-gradients and prefixed(-owg, $value) { content: -owg($value); }\n @if $experimental-support-for-webkit and prefixed(-webkit, $value) { content: -webkit($value); }\n @if $experimental-support-for-opera and prefixed(-o, $value) { content: -o($value); }\n @if $experimental-support-for-svg and prefixed(-svg, $value) { content: -svg($value); }\n content: $value ;\n}\n","@import \"shared\";\n\n// override to change the default\n$default-background-size: 100% auto !default;\n\n// Set the size of background images using px, width and height, or percentages.\n// Currently supported in: Opera, Gecko, Webkit.\n//\n// * percentages are relative to the background-origin (default = padding-box)\n// * mixin defaults to: `$default-background-size`\n@mixin background-size(\n $size-1: $default-background-size,\n $size-2: false,\n $size-3: false,\n $size-4: false,\n $size-5: false,\n $size-6: false,\n $size-7: false,\n $size-8: false,\n $size-9: false,\n $size-10: false\n) {\n $size-1: if(type-of($size-1) == string, unquote($size-1), $size-1);\n $sizes: compact($size-1, $size-2, $size-3, $size-4, $size-5, $size-6, $size-7, $size-8, $size-9, $size-10);\n @include experimental(background-size, $sizes, -moz, -webkit, -o, not(-ms), not(-khtml));\n}\n","@import \"css3/border-radius\";\n@import \"css3/inline-block\";\n@import \"css3/opacity\";\n@import \"css3/box-shadow\";\n@import \"css3/text-shadow\";\n@import \"css3/columns\";\n@import \"css3/box-sizing\";\n@import \"css3/box\";\n@import \"css3/images\";\n@import \"css3/background-clip\";\n@import \"css3/background-origin\";\n@import \"css3/background-size\";\n@import \"css3/font-face\";\n@import \"css3/transform\";\n@import \"css3/transition\";\n@import \"css3/appearance\";\n@import \"css3/regions\";\n@import \"css3/hyphenation\";\n@import \"css3/filter\";\n@import \"css3/pie\";\n@import \"css3/user-interface\";\n@import \"css3/flexbox\";","@import \"shared\";\n\n$default-border-radius: 5px !default;\n\n// Round all corners by a specific amount, defaults to value of `$default-border-radius`.\n//\n// When two values are passed, the first is the horizontal radius\n// and the second is the vertical radius.\n//\n// Note: webkit does not support shorthand syntax for several corners at once.\n// So in the case where you pass several values only the first will be passed to webkit.\n//\n// Examples:\n//\n// .simple { @include border-radius(4px, 4px); }\n// .compound { @include border-radius(2px 5px, 3px 6px); }\n// .crazy { @include border-radius(1px 3px 5px 7px, 2px 4px 6px 8px)}\n//\n// Which generates:\n//\n// .simple {\n// -webkit-border-radius: 4px 4px;\n// -moz-border-radius: 4px / 4px;\n// -khtml-border-radius: 4px / 4px;\n// border-radius: 4px / 4px; }\n// \n// .compound {\n// -webkit-border-radius: 2px 3px;\n// -moz-border-radius: 2px 5px / 3px 6px;\n// -khtml-border-radius: 2px 5px / 3px 6px;\n// border-radius: 2px 5px / 3px 6px; }\n// \n// .crazy {\n// -webkit-border-radius: 1px 2px;\n// -moz-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px;\n// -khtml-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px;\n// border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; }\n\n@mixin border-radius($radius: $default-border-radius, $vertical-radius: false) {\n\n @if $vertical-radius {\n // Webkit doesn't understand the official shorthand syntax for specifying\n // a vertical radius unless so in case there's several we only take the first.\n @include experimental(border-radius, first-value-of($radius) first-value-of($vertical-radius),\n not(-moz),\n -webkit,\n not(-o),\n not(-ms),\n not(-khtml),\n not(official)\n );\n @include experimental(\"border-radius\", $radius unquote(\"/\") $vertical-radius,\n -moz,\n not(-webkit),\n not(-o),\n not(-ms),\n -khtml,\n official\n );\n }\n @else {\n @include experimental(border-radius, $radius);\n }\n}\n\n// Round radius at position by amount.\n//\n// * legal values for `$vert`: `top`, `bottom`\n// * legal values for `$horz`: `left`, `right`\n\n@mixin border-corner-radius($vert, $horz, $radius: $default-border-radius) {\n // Support for mozilla's syntax for specifying a corner\n @include experimental(\"border-radius-#{$vert}#{$horz}\", $radius,\n -moz,\n not(-webkit),\n not(-o),\n not(-ms),\n not(-khtml),\n not(official)\n );\n @include experimental(\"border-#{$vert}-#{$horz}-radius\", $radius,\n not(-moz),\n -webkit,\n not(-o),\n not(-ms),\n -khtml,\n official\n );\n \n}\n\n// Round top-left corner only\n\n@mixin border-top-left-radius($radius: $default-border-radius) {\n @include border-corner-radius(top, left, $radius); }\n\n// Round top-right corner only\n\n@mixin border-top-right-radius($radius: $default-border-radius) {\n @include border-corner-radius(top, right, $radius); }\n\n// Round bottom-left corner only\n\n@mixin border-bottom-left-radius($radius: $default-border-radius) {\n @include border-corner-radius(bottom, left, $radius); }\n\n// Round bottom-right corner only\n\n@mixin border-bottom-right-radius($radius: $default-border-radius) {\n @include border-corner-radius(bottom, right, $radius); }\n\n// Round both top corners by amount\n@mixin border-top-radius($radius: $default-border-radius) {\n @include border-top-left-radius($radius);\n @include border-top-right-radius($radius); }\n\n// Round both right corners by amount\n@mixin border-right-radius($radius: $default-border-radius) {\n @include border-top-right-radius($radius);\n @include border-bottom-right-radius($radius); }\n\n// Round both bottom corners by amount\n@mixin border-bottom-radius($radius: $default-border-radius) {\n @include border-bottom-left-radius($radius);\n @include border-bottom-right-radius($radius); }\n\n// Round both left corners by amount\n@mixin border-left-radius($radius: $default-border-radius) {\n @include border-top-left-radius($radius);\n @include border-bottom-left-radius($radius); }\n","@import \"shared\";\n\n// Provides cross-browser CSS opacity. Takes a number between 0 and 1 as the argument, e.g. 0.5 for 50% opacity.\n//\n// @param $opacity\n// A number between 0 and 1, where 0 is transparent and 1 is opaque.\n\n@mixin opacity($opacity) {\n @if $legacy-support-for-ie6 or $legacy-support-for-ie7 or $legacy-support-for-ie8 {\n filter: unquote(\"progid:DXImageTransform.Microsoft.Alpha(Opacity=#{round($opacity * 100)})\");\n }\n opacity: $opacity;\n}\n\n// Make an element completely transparent.\n@mixin transparent { @include opacity(0); }\n\n// Make an element completely opaque.\n@mixin opaque { @include opacity(1); }\n","// @doc off\n// These defaults make the arguments optional for this mixin\n// If you like, set different defaults before importing.\n// @doc on\n\n@import \"shared\";\n\n\n// The default color for box shadows\n$default-box-shadow-color: #333333 !default;\n\n// The default horizontal offset. Positive is to the right.\n$default-box-shadow-h-offset: 0px !default;\n\n// The default vertical offset. Positive is down.\n$default-box-shadow-v-offset: 0px !default;\n\n// The default blur length.\n$default-box-shadow-blur: 5px !default;\n\n// The default spread length.\n$default-box-shadow-spread : false !default;\n\n// The default shadow inset: inset or false (for standard shadow).\n$default-box-shadow-inset : false !default;\n\n// Provides cross-browser for Webkit, Gecko, and CSS3 box shadows when one or more box\n// shadows are needed.\n// Each shadow argument should adhere to the standard css3 syntax for the\n// box-shadow property.\n@mixin box-shadow(\n $shadow-1 : default,\n $shadow-2 : false,\n $shadow-3 : false,\n $shadow-4 : false,\n $shadow-5 : false,\n $shadow-6 : false,\n $shadow-7 : false,\n $shadow-8 : false,\n $shadow-9 : false,\n $shadow-10: false\n) {\n @if $shadow-1 == default {\n $shadow-1 : -compass-space-list(compact(if($default-box-shadow-inset, inset, false), $default-box-shadow-h-offset, $default-box-shadow-v-offset, $default-box-shadow-blur, $default-box-shadow-spread, $default-box-shadow-color));\n }\n $shadow : compact($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10);\n @include experimental(box-shadow, $shadow,\n -moz, -webkit, not(-o), not(-ms), not(-khtml), official\n );\n}\n\n// Provides a single cross-browser CSS box shadow for Webkit, Gecko, and CSS3.\n// Includes default arguments for horizontal offset, vertical offset, blur length, spread length, color and inset.\n@mixin single-box-shadow(\n $hoff : $default-box-shadow-h-offset,\n $voff : $default-box-shadow-v-offset,\n $blur : $default-box-shadow-blur,\n $spread : $default-box-shadow-spread,\n $color : $default-box-shadow-color,\n $inset : $default-box-shadow-inset\n) {\n @if not ($inset == true or $inset == false or $inset == inset) {\n @warn \"$inset expected to be true or the inset keyword. Got #{$inset} instead. Using: inset\";\n }\n\n @if $color == none {\n @include box-shadow(none);\n } @else {\n $full : $hoff $voff;\n @if $blur { $full: $full $blur; }\n @if $spread { $full: $full $spread; }\n @if $color { $full: $full $color; }\n @if $inset { $full: inset $full; }\n @include box-shadow($full);\n }\n}\n","@import \"shared\";\n\n// These defaults make the arguments optional for this mixin\n// If you like, set different defaults in your project\n\n$default-text-shadow-color: #aaa !default;\n$default-text-shadow-h-offset: 0px !default;\n$default-text-shadow-v-offset: 0px !default;\n$default-text-shadow-blur: 1px !default;\n$default-text-shadow-spread: false !default;\n\n// Provides cross-browser text shadows when one or more shadows are needed.\n// Each shadow argument should adhere to the standard css3 syntax for the\n// text-shadow property.\n//\n// Note: if any shadow has a spread parameter, this will cause the mixin\n// to emit the shadow declaration twice, first without the spread,\n// then with the spread included. This allows you to progressively\n// enhance the browsers that do support the spread parameter.\n@mixin text-shadow(\n $shadow-1 : default,\n $shadow-2 : false,\n $shadow-3 : false,\n $shadow-4 : false,\n $shadow-5 : false,\n $shadow-6 : false,\n $shadow-7 : false,\n $shadow-8 : false,\n $shadow-9 : false,\n $shadow-10: false\n) {\n @if $shadow-1 == default {\n $shadow-1: compact($default-text-shadow-h-offset $default-text-shadow-v-offset $default-text-shadow-blur $default-text-shadow-spread $default-text-shadow-color);\n }\n $shadows-without-spread: join((),(),comma);\n $shadows: join((),(),comma);\n $has-spread: false;\n @each $shadow in compact($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5,\n $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10) {\n @if length($shadow) > 4 {\n $has-spread: true;\n $shadows-without-spread: append($shadows-without-spread, nth($shadow,1) nth($shadow,2) nth($shadow,3) nth($shadow,5));\n $shadows: append($shadows, $shadow);\n } else {\n $shadows-without-spread: append($shadows-without-spread, $shadow);\n $shadows: append($shadows, $shadow);\n }\n }\n @if $has-spread {\n text-shadow: $shadows-without-spread;\n }\n text-shadow: $shadows;\n}\n\n// Provides a single cross-browser CSS text shadow.\n//\n// Provides sensible defaults for the color, horizontal offset, vertical offset, blur, and spread\n// according to the configuration defaults above.\n@mixin single-text-shadow(\n $hoff: false,\n $voff: false,\n $blur: false,\n $spread: false,\n $color: false\n) {\n // A lot of people think the color comes first. It doesn't.\n @if type-of($hoff) == color {\n $temp-color: $hoff;\n $hoff: $voff;\n $voff: $blur;\n $blur: $spread;\n $spread: $color;\n $color: $temp-color;\n }\n // Can't rely on default assignment with multiple supported argument orders.\n $hoff: if($hoff, $hoff, $default-text-shadow-h-offset);\n $voff: if($voff, $voff, $default-text-shadow-v-offset);\n $blur: if($blur, $blur, $default-text-shadow-blur );\n $spread: if($spread, $spread, $default-text-shadow-spread );\n $color: if($color, $color, $default-text-shadow-color );\n // We don't need experimental support for this property.\n @if $color == none or $hoff == none {\n @include text-shadow(none);\n } @else {\n @include text-shadow(compact($hoff $voff $blur $spread $color));\n }\n}\n","@import \"shared\";\n\n// Specify the shorthand `columns` property.\n//\n// Example:\n//\n// @include columns(20em 2)\n@mixin columns($width-and-count) {\n @include experimental(columns, $width-and-count,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Specify the number of columns\n@mixin column-count($count) {\n @include experimental(column-count, $count,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Specify the gap between columns e.g. `20px`\n@mixin column-gap($width) {\n @include experimental(column-gap, $width,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Specify the width of columns e.g. `100px`\n@mixin column-width($width) {\n @include experimental(column-width, $width,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Specify the width of the rule between columns e.g. `1px`\n@mixin column-rule-width($width) {\n @include experimental(column-rule-width, $width,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Specify the style of the rule between columns e.g. `dotted`.\n// This works like border-style.\n@mixin column-rule-style($style) {\n @include experimental(column-rule-style, unquote($style),\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Specify the color of the rule between columns e.g. `blue`.\n// This works like border-color.\n@mixin column-rule-color($color) {\n @include experimental(column-rule-color, $color,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Mixin encompassing all column rule properties\n// For example:\n//\n// @include column-rule(1px, solid, #c00)\n//\n// Or the values can be space separated:\n//\n// @include column-rule(1px solid #c00)\n@mixin column-rule($width, $style: false, $color: false) {\n $full : -compass-space-list(compact($width, $style, $color));\n @include experimental(column-rule, $full,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Mixin for setting column-break-before\n//\n// * legal values are auto, always, avoid, left, right, page, column, avoid-page, avoid-column\n//\n// Example: \n// h2.before {@include column-break-before(always);}\n//\n// Which generates: \n//\n// h2.before { \n// -webkit-column-break-before: always;\n// column-break-before: always;}\n@mixin column-break-before($value: auto){\n @include experimental(column-break-before, $value, not(-moz), -webkit, not(-o), not(-ms), not(-khtml), official );\n}\n\n// Mixin for setting column-break-after\n//\n// * legal values are auto, always, avoid, left, right, page, column, avoid-page, avoid-column\n//\n// Example: \n// h2.after {@include column-break-after(always); }\n//\n// Which generates: \n//\n// h2.after {\n// -webkit-column-break-after: always;\n// column-break-after: always; }\n@mixin column-break-after($value: auto){\n @include experimental(column-break-after, $value, not(-moz), -webkit, not(-o), not(-ms), not(-khtml), official );\n}\n\n// Mixin for setting column-break-inside\n//\n// * legal values are auto, avoid, avoid-page, avoid-column\n//\n// Example: \n// h2.inside {@include column-break-inside();}\n// Which generates: \n// \n// h2.inside {\n// -webkit-column-break-inside: auto;\n// column-break-inside: auto;}\n@mixin column-break-inside($value: auto){\n @include experimental(column-break-inside, $value, not(-moz), -webkit, not(-o), not(-ms), not(-khtml), official );\n}\n\n// All-purpose mixin for setting column breaks.\n//\n// * legal values for $type : before, after, inside \n// * legal values for '$value' are dependent on $type\n// * when $type = before, legal values are auto, always, avoid, left, right, page, column, avoid-page, avoid-column\n// * when $type = after, legal values are auto, always, avoid, left, right, page, column, avoid-page, avoid-column\n// * when $type = inside, legal values are auto, avoid, avoid-page, avoid-column\n// \n// Examples: \n// h2.before {@include column-break(before, always);}\n// h2.after {@include column-break(after, always); }\n// h2.inside {@include column-break(inside); }\n//\n// Which generates: \n// h2.before { \n// -webkit-column-break-before: always;\n// column-break-before: always;}\n// \n// h2.after {\n// -webkit-column-break-after: always;\n// column-break-after: always; }\n//\n// h2.inside {\n// -webkit-column-break-inside: auto;\n// column-break-inside: auto;}\n \n@mixin column-break($type: before, $value: auto){\n @include experimental(\"column-break-#{$type}\", $value, not(-moz), -webkit, not(-o), not(-ms), not(-khtml), official );\n}","@import \"shared\";\n\n// Change the box model for Mozilla, Webkit, IE8 and the future\n//\n// @param $bs\n// [ content-box | border-box ]\n\n@mixin box-sizing($bs) {\n $bs: unquote($bs);\n @include experimental(box-sizing, $bs,\n -moz, -webkit, not(-o), not(-ms), not(-khtml), official\n );\n}\n","@import \"shared\";\n\n// display:box; must be used for any of the other flexbox mixins to work properly\n@mixin display-box {\n @include experimental-value(display, box,\n -moz, -webkit, not(-o), -ms, not(-khtml), official\n );\n}\n\n// Default box orientation, assuming that the user wants something less block-like\n$default-box-orient: horizontal !default;\n\n// Box orientation [ horizontal | vertical | inline-axis | block-axis | inherit ]\n@mixin box-orient(\n $orientation: $default-box-orient\n) {\n $orientation : unquote($orientation);\n @include experimental(box-orient, $orientation,\n -moz, -webkit, not(-o), -ms, not(-khtml), official\n );\n}\n\n// Default box-align\n$default-box-align: stretch !default;\n\n// Box align [ start | end | center | baseline | stretch ]\n@mixin box-align(\n $alignment: $default-box-align\n) {\n $alignment : unquote($alignment);\n @include experimental(box-align, $alignment,\n -moz, -webkit, not(-o), -ms, not(-khtml), official\n );\n}\n\n// Default box flex\n$default-box-flex: 0 !default;\n\n// mixin which takes an int argument for box flex. Apply this to the children inside the box.\n//\n// For example: \"div.display-box > div.child-box\" would get the box flex mixin.\n@mixin box-flex(\n $flex: $default-box-flex\n) {\n @include experimental(box-flex, $flex,\n -moz, -webkit, not(-o), -ms, not(-khtml), official\n );\n}\n\n// Default flex group\n$default-box-flex-group: 1 !default;\n\n// mixin which takes an int argument for flexible grouping\n@mixin box-flex-group(\n $group: $default-box-flex-group\n) {\n @include experimental(box-flex-group, $group,\n -moz, -webkit, not(-o), -ms, not(-khtml), official\n );\n}\n\n// default for ordinal group\n$default-box-ordinal-group: 1 !default;\n\n// mixin which takes an int argument for ordinal grouping and rearranging the order\n@mixin box-ordinal-group(\n $group: $default-ordinal-flex-group\n) {\n @include experimental(box-ordinal-group, $group,\n -moz, -webkit, not(-o), -ms, not(-khtml), official\n );\n}\n\n// Box direction default value\n$default-box-direction: normal !default;\n\n// mixin for box-direction [ normal | reverse | inherit ]\n@mixin box-direction(\n $direction: $default-box-direction\n) {\n $direction: unquote($direction);\n @include experimental(box-direction, $direction,\n -moz, -webkit, not(-o), -ms, not(-khtml), official\n );\n}\n\n// default for box lines\n$default-box-lines: single !default;\n\n// mixin for box lines [ single | multiple ]\n@mixin box-lines(\n $lines: $default-box-lines\n) {\n $lines: unquote($lines);\n @include experimental(box-lines, $lines,\n -moz, -webkit, not(-o), -ms, not(-khtml), official\n );\n}\n\n// default for box pack\n$default-box-pack: start !default;\n\n// mixin for box pack [ start | end | center | justify ]\n@mixin box-pack(\n $pack: $default-box-pack\n) {\n $pack: unquote($pack);\n @include experimental(box-pack, $pack,\n -moz, -webkit, not(-o), -ms, not(-khtml), official\n );\n}","@import \"shared\";\n\n// The default value is `padding-box` -- the box model used by modern browsers.\n//\n// If you wish to do so, you can override the default constant with `border-box`\n//\n// To override to the default border-box model, use this code:\n// $default-background-clip: border-box\n\n$default-background-clip: padding-box !default;\n\n// Clip the background (image and color) at the edge of the padding or border.\n//\n// Legal Values:\n//\n// * padding-box\n// * border-box\n// * text\n\n@mixin background-clip($clip: $default-background-clip) {\n // webkit and mozilla use the deprecated short [border | padding]\n $clip: unquote($clip);\n $deprecated: $clip;\n @if $clip == padding-box { $deprecated: padding; }\n @if $clip == border-box { $deprecated: border; }\n // Support for webkit and mozilla's use of the deprecated short form\n @include experimental(background-clip, $deprecated,\n -moz,\n -webkit,\n not(-o),\n not(-ms),\n not(-khtml),\n not official\n );\n @include experimental(background-clip, $clip,\n not(-moz),\n not(-webkit),\n not(-o),\n not(-ms),\n -khtml,\n official\n );\n}\n","// Override `$default-background-origin` to change the default.\n\n@import \"shared\";\n\n$default-background-origin: content-box !default;\n\n// Position the background off the edge of the padding, border or content\n//\n// * Possible values:\n// * `padding-box`\n// * `border-box`\n// * `content-box`\n// * browser defaults to `padding-box`\n// * mixin defaults to `content-box`\n\n\n@mixin background-origin($origin: $default-background-origin) {\n $origin: unquote($origin);\n // webkit and mozilla use the deprecated short [border | padding | content]\n $deprecated: $origin;\n @if $origin == padding-box { $deprecated: padding; }\n @if $origin == border-box { $deprecated: border; }\n @if $origin == content-box { $deprecated: content; }\n\n // Support for webkit and mozilla's use of the deprecated short form\n @include experimental(background-origin, $deprecated,\n -moz,\n -webkit,\n not(-o),\n not(-ms),\n not(-khtml),\n not official\n );\n @include experimental(background-origin, $origin,\n not(-moz),\n not(-webkit),\n -o,\n -ms,\n -khtml,\n official\n );\n}\n","@import \"shared\";\n\n// Cross-browser support for @font-face. Supports IE, Gecko, Webkit, Opera.\n//\n// * $name is required, arbitrary, and what you will use in font stacks.\n// * $font-files is required using font-files('relative/location', 'format').\n// for best results use this order: woff, opentype/truetype, svg\n// * $eot is required by IE, and is a relative location of the eot file.\n// * $weight shows if the font is bold, defaults to normal\n// * $style defaults to normal, might be also italic\n// * For android 2.2 Compatiblity, please ensure that your web page has\n// a meta viewport tag.\n// * To support iOS < 4.2, an SVG file must be provided\n//\n// If you need to generate other formats check out the Font Squirrel\n// [font generator](http://www.fontsquirrel.com/fontface/generator)\n//\n\n// In order to refer to a specific style of the font in your stylesheets as \n// e.g. \"font-style: italic;\", you may add a couple of @font-face includes\n// containing the respective font files for each style and specying\n// respective the $style parameter.\n\n// Order of the includes matters, and it is: normal, bold, italic, bold+italic.\n\n@mixin font-face(\n $name, \n $font-files, \n $eot: false,\n $weight: false,\n $style: false\n) {\n $iefont: unquote(\"#{$eot}?#iefix\");\n @font-face {\n font-family: quote($name);\n @if $eot {\n src: font-url($eot);\n $font-files: font-url($iefont) unquote(\"format('eot')\"), $font-files; \n }\n src: $font-files;\n @if $weight {\n font-weight: $weight;\n }\n @if $style {\n font-style: $style;\n }\n }\n}\n","@import \"shared\";\n\n// @doc off\n// Note ----------------------------------------------------------------------\n// Safari, Chrome, and Firefox all support 3D transforms. However,\n// only in the most recent builds. You should also provide fallback 2d support for\n// Opera and IE. IE10 is slated to have 3d enabled, but is currently unreleased.\n// To make that easy, all 2D transforms include an browser-targeting toggle ($only3d)\n// to switch between the two support lists. The toggle defaults to 'false' (2D),\n// and also accepts 'true' (3D). Currently the lists are as follows:\n// 2D: Mozilla, Webkit, Opera, Official\n// 3D: Webkit, Firefox.\n\n// Available Transforms ------------------------------------------------------\n// - Scale (2d and 3d)\n// - Rotate (2d and 3d)\n// - Translate (2d and 3d)\n// - Skew (2d only)\n\n// Transform Parameters ------------------------------------------------------\n// - Transform Origin (2d and 3d)\n// - Perspective (3d)\n// - Perspective Origin (3d)\n// - Transform Style (3d)\n// - Backface Visibility (3d)\n\n// Mixins --------------------------------------------------------------------\n// transform-origin\n// - shortcuts: transform-origin2d, transform-origin3d\n// - helpers: apply-origin\n// transform\n// - shortcuts: transform2d, transform3d\n// - helpers: simple-transform, create-transform\n// perspective\n// - helpers: perspective-origin\n// transform-style\n// backface-visibility\n// scale\n// - shortcuts: scaleX, scaleY, scaleZ, scale3d\n// rotate\n// - shortcuts: rotateX, rotateY, rotate3d\n// translate\n// - shortcuts: translateX, translateY, translateZ, translate3d\n// skew\n// - shortcuts: skewX, skewY\n\n// Defaults ------------------------------------------------------------------\n// @doc on\n\n// The default x-origin for transforms\n$default-origin-x : 50% !default;\n// The default y-origin for transforms\n$default-origin-y : 50% !default;\n// The default z-origin for transforms\n$default-origin-z : 50% !default;\n\n\n// The default x-multiplier for scaling\n$default-scale-x : 1.25 !default;\n// The default y-multiplier for scaling\n$default-scale-y : $default-scale-x !default;\n// The default z-multiplier for scaling\n$default-scale-z : $default-scale-x !default;\n\n\n// The default angle for rotations\n$default-rotate : 45deg !default;\n\n\n// The default x-vector for the axis of 3d rotations\n$default-vector-x : 1 !default;\n// The default y-vector for the axis of 3d rotations\n$default-vector-y : 1 !default;\n// The default z-vector for the axis of 3d rotations\n$default-vector-z : 1 !default;\n\n\n// The default x-length for translations\n$default-translate-x : 1em !default;\n// The default y-length for translations\n$default-translate-y : $default-translate-x !default;\n// The default z-length for translations\n$default-translate-z : $default-translate-x !default;\n\n\n// The default x-angle for skewing\n$default-skew-x : 5deg !default;\n// The default y-angle for skewing\n$default-skew-y : 5deg !default;\n\n\n// **Transform-origin**\n// Transform-origin sent as a complete string\n//\n// @include apply-origin( origin [, 3D-only ] )\n//\n// where 'origin' is a space separated list containing 1-3 (x/y/z) coordinates\n// in percentages, absolute (px, cm, in, em etc..) or relative\n// (left, top, right, bottom, center) units\n//\n// @param only3d Set this to true to only apply this\n// mixin where browsers have 3D support.\n@mixin apply-origin($origin, $only3d) {\n $only3d: $only3d or -compass-list-size(-compass-list($origin)) > 2;\n @if $only3d {\n @include experimental(transform-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n } @else {\n @include experimental(transform-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n }\n}\n\n// Transform-origin sent as individual arguments:\n//\n// @include transform-origin( [ origin-x, origin-y, origin-z, 3D-only ] )\n//\n// where the 3 'origin-' arguments represent x/y/z coordinates.\n//\n// **NOTE:** setting z coordinates triggers 3D support list, leave false for 2D support\n@mixin transform-origin(\n $origin-x: $default-origin-x,\n $origin-y: $default-origin-y,\n $origin-z: false,\n $only3d: if($origin-z, true, false)\n) {\n $origin: unquote('');\n @if $origin-x or $origin-y or $origin-z {\n @if $origin-x { $origin: $origin-x; } @else { $origin: 50%; }\n @if $origin-y { $origin: $origin $origin-y; } @else { @if $origin-z { $origin: $origin 50%; }}\n @if $origin-z { $origin: $origin $origin-z; }\n @include apply-origin($origin, $only3d);\n }\n}\n\n\n// Transform sent as a complete string:\n//\n// @include transform( transforms [, 3D-only ] )\n//\n// where 'transforms' is a space separated list of all the transforms to be applied.\n@mixin transform(\n $transform,\n $only3d: false\n) {\n @if $only3d {\n @include experimental(transform, $transform,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n } @else {\n @include experimental(transform, $transform,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n }\n}\n\n// Shortcut to target all browsers with 2D transform support\n@mixin transform2d($trans) {\n @include transform($trans, false);\n}\n\n// Shortcut to target only browsers with 3D transform support\n@mixin transform3d($trans) {\n @include transform($trans, true);\n}\n\n// @doc off\n// 3D Parameters -------------------------------------------------------------\n// @doc on\n\n// Set the perspective of 3D transforms on the children of an element:\n//\n// @include perspective( perspective )\n//\n// where 'perspective' is a unitless number representing the depth of the\n// z-axis. The higher the perspective, the more exaggerated the foreshortening.\n// values from 500 to 1000 are more-or-less \"normal\" - a good starting-point.\n@mixin perspective($p) {\n @include experimental(perspective, $p,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Set the origin position for the perspective\n//\n// @include perspective-origin(origin-x [origin-y])\n//\n// where the two arguments represent x/y coordinates\n@mixin perspective-origin($origin: 50%) {\n @include experimental(perspective-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Determine whether a 3D objects children also live in the given 3D space\n//\n// @include transform-style( [ style ] )\n//\n// where `style` can be either `flat` or `preserve-3d`.\n// Browsers default to `flat`, mixin defaults to `preserve-3d`.\n@mixin transform-style($style: preserve-3d) {\n @include experimental(transform-style, $style,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Determine the visibility of an element when it's back is turned\n//\n// @include backface-visibility( [ visibility ] )\n//\n// where `visibility` can be either `visible` or `hidden`.\n// Browsers default to visible, mixin defaults to hidden\n@mixin backface-visibility($visibility: hidden) {\n @include experimental(backface-visibility, $visibility,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// @doc off\n// Transform Partials --------------------------------------------------------\n// These work well on their own, but they don't add to each other, they override.\n// Use along with transform parameter mixins to adjust origin, perspective and style\n// ---------------------------------------------------------------------------\n\n\n// Scale ---------------------------------------------------------------------\n// @doc on\n\n// Scale an object along the x and y axis:\n//\n// @include scale( [ scale-x, scale-y, perspective, 3D-only ] )\n//\n// where the 'scale-' arguments are unitless multipliers of the x and y dimensions\n// and perspective, which works the same as the stand-alone perspective property/mixin\n// but applies to the individual element (multiplied with any parent perspective)\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scale(\n $scale-x: $default-scale-x,\n $scale-y: $scale-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: scale($scale-x, $scale-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the x axis\n// @include scaleX( [ scale-x, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleX(\n $scale: $default-scale-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: scaleX($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the y axis\n// @include scaleY( [ scale-y, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleY(\n $scale: $default-scale-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: scaleY($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the z axis\n// @include scaleZ( [ scale-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleZ(\n $scale: $default-scale-z,\n $perspective: false\n) {\n $trans: scaleZ($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Scale and object along all three axis\n// @include scale3d( [ scale-x, scale-y, scale-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scale3d(\n $scale-x: $default-scale-x,\n $scale-y: $default-scale-y,\n $scale-z: $default-scale-z,\n $perspective: false\n) {\n $trans: scale3d($scale-x, $scale-y, $scale-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Rotate --------------------------------------------------------------------\n// @doc on\n\n// Rotate an object around the z axis (2D)\n// @include rotate( [ rotation, perspective, 3D-only ] )\n// where 'rotation' is an angle set in degrees (deg) or radian (rad) units\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotate(\n $rotate: $default-rotate,\n $perspective: false,\n $only3d: false\n) {\n $trans: rotate($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// A longcut for 'rotate' in case you forget that 'z' is implied\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateZ(\n $rotate: $default-rotate,\n $perspective: false,\n $only3d: false\n) {\n @include rotate($rotate, $perspective, $only3d);\n}\n\n// Rotate an object around the x axis (3D)\n// @include rotateX( [ rotation, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateX(\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotateX($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Rotate an object around the y axis (3D)\n// @include rotate( [ rotation, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateY(\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotateY($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Rotate an object around an arbitrary axis (3D)\n// @include rotate( [ vector-x, vector-y, vector-z, rotation, perspective ] )\n// where the 'vector-' arguments accept unitless numbers.\n// These numbers are not important on their own, but in relation to one another\n// creating an axis from your transform-origin, along the axis of Xx = Yy = Zz.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotate3d(\n $vector-x: $default-vector-x,\n $vector-y: $default-vector-y,\n $vector-z: $default-vector-z,\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotate3d($vector-x, $vector-y, $vector-z, $rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Translate -----------------------------------------------------------------\n// @doc on\n\n// Move an object along the x or y axis (2D)\n// @include translate( [ translate-x, translate-y, perspective, 3D-only ] )\n// where the 'translate-' arguments accept any distance in percentages or absolute (px, cm, in, em etc..) units.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translate(\n $translate-x: $default-translate-x,\n $translate-y: $default-translate-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: translate($translate-x, $translate-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the x axis (2D)\n// @include translate( [ translate-x, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateX(\n $trans-x: $default-translate-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: translateX($trans-x);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the y axis (2D)\n// @include translate( [ translate-y, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateY(\n $trans-y: $default-translate-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: translateY($trans-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the z axis (3D)\n// @include translate( [ translate-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateZ(\n $trans-z: $default-translate-z,\n $perspective: false\n) {\n $trans: translateZ($trans-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Move an object along the x, y and z axis (3D)\n// @include translate( [ translate-x, translate-y, translate-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translate3d(\n $translate-x: $default-translate-x,\n $translate-y: $default-translate-y,\n $translate-z: $default-translate-z,\n $perspective: false\n) {\n $trans: translate3d($translate-x, $translate-y, $translate-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Skew ----------------------------------------------------------------------\n// @doc on\n\n// Skew an element:\n//\n// @include skew( [ skew-x, skew-y, 3D-only ] )\n//\n// where the 'skew-' arguments accept css angles in degrees (deg) or radian (rad) units.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skew(\n $skew-x: $default-skew-x,\n $skew-y: $default-skew-y,\n $only3d: false\n) {\n $trans: skew($skew-x, $skew-y);\n @include transform($trans, $only3d);\n}\n\n// Skew an element along the x axiz\n//\n// @include skew( [ skew-x, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skewX(\n $skew-x: $default-skew-x,\n $only3d: false\n) {\n $trans: skewX($skew-x);\n @include transform($trans, $only3d);\n}\n\n// Skew an element along the y axis\n//\n// @include skew( [ skew-y, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skewY(\n $skew-y: $default-skew-y,\n $only3d: false\n) {\n $trans: skewY($skew-y);\n @include transform($trans, $only3d);\n}\n\n\n// Full transform mixins\n// For settings any combination of transforms as arguments\n// These are complex and not highly recommended for daily use. They are mainly\n// here for backward-compatibility purposes.\n//\n// * they include origin adjustments\n// * scale takes a multiplier (unitless), rotate and skew take degrees (deg)\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin create-transform(\n $perspective: false,\n $scale-x: false,\n $scale-y: false,\n $scale-z: false,\n $rotate-x: false,\n $rotate-y: false,\n $rotate-z: false,\n $rotate3d: false,\n $trans-x: false,\n $trans-y: false,\n $trans-z: false,\n $skew-x: false,\n $skew-y: false,\n $origin-x: false,\n $origin-y: false,\n $origin-z: false,\n $only3d: false\n) {\n $trans: unquote(\"\");\n\n // perspective\n @if $perspective { $trans: perspective($perspective) ; }\n\n // scale\n @if $scale-x and $scale-y {\n @if $scale-z { $trans: $trans scale3d($scale-x, $scale-y, $scale-z); }\n @else { $trans: $trans scale($scale-x, $scale-y); }\n } @else {\n @if $scale-x { $trans: $trans scaleX($scale-x); }\n @if $scale-y { $trans: $trans scaleY($scale-y); }\n @if $scale-z { $trans: $trans scaleZ($scale-z); }\n }\n\n // rotate\n @if $rotate-x { $trans: $trans rotateX($rotate-x); }\n @if $rotate-y { $trans: $trans rotateY($rotate-y); }\n @if $rotate-z { $trans: $trans rotateZ($rotate-z); }\n @if $rotate3d { $trans: $trans rotate3d($rotate3d); }\n\n // translate\n @if $trans-x and $trans-y {\n @if $trans-z { $trans: $trans translate3d($trans-x, $trans-y, $trans-z); }\n @else { $trans: $trans translate($trans-x, $trans-y); }\n } @else {\n @if $trans-x { $trans: $trans translateX($trans-x); }\n @if $trans-y { $trans: $trans translateY($trans-y); }\n @if $trans-z { $trans: $trans translateZ($trans-z); }\n }\n\n // skew\n @if $skew-x and $skew-y { $trans: $trans skew($skew-x, $skew-y); }\n @else {\n @if $skew-x { $trans: $trans skewX($skew-x); }\n @if $skew-y { $trans: $trans skewY($skew-y); }\n }\n\n // apply it!\n @include transform($trans, $only3d);\n @include transform-origin($origin-x, $origin-y, $origin-z, $only3d);\n}\n\n\n// A simplified set of options\n// backwards-compatible with the previous version of the 'transform' mixin\n@mixin simple-transform(\n $scale: false,\n $rotate: false,\n $trans-x: false,\n $trans-y: false,\n $skew-x: false,\n $skew-y: false,\n $origin-x: false,\n $origin-y: false\n) {\n @include create-transform(\n false,\n $scale, $scale, false,\n false, false, $rotate, false,\n $trans-x, $trans-y, false,\n $skew-x, $skew-y,\n $origin-x, $origin-y, false,\n false\n );\n}\n","@import \"shared\";\n\n// CSS Transitions\n// Currently only works in Webkit.\n//\n// * expected in CSS3, FireFox 3.6/7 and Opera Presto 2.3\n// * We'll be prepared.\n//\n// Including this submodule sets following defaults for the mixins:\n//\n// $default-transition-property : all\n// $default-transition-duration : 1s\n// $default-transition-function : false\n// $default-transition-delay : false\n//\n// Override them if you like. Timing-function and delay are set to false for browser defaults (ease, 0s).\n\n$default-transition-property: all !default;\n\n$default-transition-duration: 1s !default;\n\n$default-transition-function: false !default;\n\n$default-transition-delay: false !default;\n\n$transitionable-prefixed-values: transform, transform-origin !default;\n\n// One or more properties to transition\n//\n// * for multiple, use a comma-delimited list\n// * also accepts \"all\" or \"none\"\n\n@mixin transition-property($property-1: $default-transition-property,\n $property-2 : false,\n $property-3 : false,\n $property-4 : false,\n $property-5 : false,\n $property-6 : false,\n $property-7 : false,\n $property-8 : false,\n $property-9 : false,\n $property-10: false\n) {\n @if type-of($property-1) == string { $property-1: unquote($property-1); }\n $properties: compact($property-1, $property-2, $property-3, $property-4, $property-5, $property-6, $property-7, $property-8, $property-9, $property-10);\n @if $experimental-support-for-webkit { -webkit-transition-property : prefixed-for-transition(-webkit, $properties); }\n @if $experimental-support-for-mozilla { -moz-transition-property : prefixed-for-transition(-moz, $properties); }\n @if $experimental-support-for-opera { -o-transition-property : prefixed-for-transition(-o, $properties); }\n transition-property : $properties;\n}\n\n// One or more durations in seconds\n//\n// * for multiple, use a comma-delimited list\n// * these durations will affect the properties in the same list position\n\n@mixin transition-duration($duration-1: $default-transition-duration,\n $duration-2 : false,\n $duration-3 : false,\n $duration-4 : false,\n $duration-5 : false,\n $duration-6 : false,\n $duration-7 : false,\n $duration-8 : false,\n $duration-9 : false,\n $duration-10: false\n) {\n @if type-of($duration-1) == string { $duration-1: unquote($duration-1); }\n $durations: compact($duration-1, $duration-2, $duration-3, $duration-4, $duration-5, $duration-6, $duration-7, $duration-8, $duration-9, $duration-10);\n @include experimental(transition-duration, $durations,\n -moz, -webkit, -o, not(-ms), not(-khtml), official\n );\n}\n\n// One or more timing functions\n//\n// * [ ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(x1, y1, x2, y2)]\n// * For multiple, use a comma-delimited list\n// * These functions will effect the properties in the same list position\n\n@mixin transition-timing-function($function-1: $default-transition-function,\n $function-2 : false,\n $function-3 : false,\n $function-4 : false,\n $function-5 : false,\n $function-6 : false,\n $function-7 : false,\n $function-8 : false,\n $function-9 : false,\n $function-10: false\n) {\n $function-1: unquote($function-1);\n $functions: compact($function-1, $function-2, $function-3, $function-4, $function-5, $function-6, $function-7, $function-8, $function-9, $function-10);\n @include experimental(transition-timing-function, $functions,\n -moz, -webkit, -o, not(-ms), not(-khtml), official\n );\n}\n\n// One or more transition-delays in seconds\n//\n// * for multiple, use a comma-delimited list\n// * these delays will effect the properties in the same list position\n\n@mixin transition-delay($delay-1: $default-transition-delay,\n $delay-2 : false,\n $delay-3 : false,\n $delay-4 : false,\n $delay-5 : false,\n $delay-6 : false,\n $delay-7 : false,\n $delay-8 : false,\n $delay-9 : false,\n $delay-10: false\n) {\n @if type-of($delay-1) == string { $delay-1: unquote($delay-1); }\n $delays: compact($delay-1, $delay-2, $delay-3, $delay-4, $delay-5, $delay-6, $delay-7, $delay-8, $delay-9, $delay-10);\n @include experimental(transition-delay, $delays,\n -moz, -webkit, -o, not(-ms), not(-khtml), official\n );\n}\n\n// Transition all-in-one shorthand\n\n@mixin single-transition(\n $property: $default-transition-property,\n $duration: $default-transition-duration,\n $function: $default-transition-function,\n $delay: $default-transition-delay\n) {\n @include transition(compact($property $duration $function $delay));\n}\n\n@mixin transition(\n $transition-1 : default,\n $transition-2 : false,\n $transition-3 : false,\n $transition-4 : false,\n $transition-5 : false,\n $transition-6 : false,\n $transition-7 : false,\n $transition-8 : false,\n $transition-9 : false,\n $transition-10: false\n) {\n @if $transition-1 == default {\n $transition-1 : compact($default-transition-property $default-transition-duration $default-transition-function $default-transition-delay);\n }\n $transitions: false;\n @if type-of($transition-1) == list and type-of(nth($transition-1,1)) == list {\n $transitions: join($transition-1, compact($transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10), comma);\n } @else {\n $transitions : compact($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10);\n }\n $delays: comma-list();\n $has-delays: false;\n $webkit-value: comma-list();\n $moz-value: comma-list();\n $o-value: comma-list();\n\n // This block can be made considerably simpler at the point in time that\n // we no longer need to deal with the differences in how delays are treated.\n @each $transition in $transitions {\n // Extract the values from the list\n // (this would be cleaner if nth took a 3rd argument to provide a default value).\n $property: nth($transition, 1);\n $duration: false;\n $timing-function: false;\n $delay: false;\n @if length($transition) > 1 { $duration: nth($transition, 2); }\n @if length($transition) > 2 { $timing-function: nth($transition, 3); }\n @if length($transition) > 3 { $delay: nth($transition, 4); $has-delays: true; }\n\n // If a delay is provided without a timing function\n @if is-time($timing-function) and not($delay) { $delay: $timing-function; $timing-function: false; $has-delays: true; }\n\n // Keep a list of delays in case one is specified\n $delays: append($delays, if($delay, $delay, 0s));\n\n $webkit-value: append($webkit-value, compact((prefixed-for-transition(-webkit, $property) $duration $timing-function)...));\n $moz-value: append( $moz-value, compact((prefixed-for-transition( -moz, $property) $duration $timing-function $delay)...));\n $o-value: append( $o-value, compact((prefixed-for-transition( -o, $property) $duration $timing-function $delay)...));\n }\n\n @if $experimental-support-for-webkit { -webkit-transition : $webkit-value;\n // old webkit doesn't support the delay parameter in the shorthand so we progressively enhance it.\n @if $has-delays { -webkit-transition-delay : $delays; } }\n @if $experimental-support-for-mozilla { -moz-transition : $moz-value; }\n @if $experimental-support-for-opera { -o-transition : $o-value; }\n transition : $transitions;\n}\n\n// coerce a list to be comma delimited or make a new, empty comma delimited list.\n@function comma-list($list: ()) {\n @return join((), $list, comma);\n}\n\n// Returns `$property` with the given prefix if it is found in `$transitionable-prefixed-values`.\n@function prefixed-for-transition($prefix, $property) {\n @if type-of($property) == list {\n $new-list: comma-list();\n @each $v in $property {\n $new-list: append($new-list, prefixed-for-transition($prefix, $v));\n }\n @return $new-list;\n } @else {\n @if index($transitionable-prefixed-values, $property) {\n @return #{$prefix}-#{$property};\n } @else {\n @return $property;\n }\n }\n}\n\n// Checks if the value given is a unit of time.\n@function is-time($value) {\n @if type-of($value) == number {\n @return not(not(index(s ms, unit($value))));\n } @else {\n @return false;\n }\n}\n","@import \"shared\";\n\n// Change the appearance for Mozilla, Webkit and possibly the future.\n// The appearance property is currently not present in any newer CSS specification.\n//\n// There is no official list of accepted values, but you might check these source:\n// Mozilla : https://developer.mozilla.org/en/CSS/-moz-appearance\n// Webkit : http://code.google.com/p/webkit-mirror/source/browse/Source/WebCore/css/CSSValueKeywords.in?spec=svnf1aea559dcd025a8946aa7da6e4e8306f5c1b604&r=63c7d1af44430b314233fea342c3ddb2a052e365\n// (search for 'appearance' within the page)\n\n@mixin appearance($ap) {\n $ap: unquote($ap);\n @include experimental(appearance, $ap,\n -moz, -webkit, not(-o), not(-ms), not(-khtml), official\n );\n}\n","@import \"shared\";\n\n// Webkit, IE10 and future support for [CSS Regions](http://dev.w3.org/csswg/css3-regions/)\n//\n// $target is a value you use to link two regions of your css. Give the source of your content the flow-into property, and give your target container the flow-from property.\n//\n// For a visual explanation, see the diagrams at Chris Coyier's\n// [CSS-Tricks](http://css-tricks.com/content-folding/)\n\n@mixin flow-into($target) {\n $target: unquote($target);\n @include experimental(flow-into, $target,\n not(-moz), -webkit, not(-o), -ms, not(-khtml), not official\n );\n}\n\n@mixin flow-from($target) {\n $target: unquote($target);\n @include experimental(flow-from, $target,\n not(-moz), -webkit, not(-o), -ms, not(-khtml), not official\n );\n}","@import \"shared\";\n\n// Mixins to support specific CSS Text Level 3 elements\n//\n//\n//\n// Mixin for word-break properties\n// http://www.w3.org/css3-text/#word-break\n// * legal values for $type : normal, keep-all, break-all\n//\n// Example:\n// p.wordBreak {@include word-break(break-all);}\n//\n// Which generates:\n// p.wordBreak {\n// -ms-word-break: break-all;\n// word-break: break-all;\n// word-break: break-word;}\n//\n@mixin word-break($value: normal){\n @if $value == break-all {\n //Most browsers handle the break-all case the same...\n @include experimental(word-break, $value,\n not(-moz), not(-webkit), not(-o), -ms, not(-khtml), official\n );\n //Webkit handles break-all differently... as break-word\n @include experimental(word-break, break-word,\n not(-moz), not(-webkit), not(-o), not(-ms), not(-khtml), official\n );\n }\n @else {\n @include experimental(word-break, $value,\n not(-moz), not(-webkit), not(-o), -ms, not(-khtml), official\n );\n }\n}\n\n// Mixin for the hyphens property\n//\n// W3C specification: http://www.w3.org/TR/css3-text/#hyphens\n// * legal values for $type : auto, manual, none\n//\n// Example:\n// p {\n// @include hyphens(auto);}\n// Which generates:\n// p {\n// -moz-hyphens: auto;\n// -webkit-hyphens: auto;\n// hyphens: auto;}\n//\n@mixin hyphens($value: auto){\n @include experimental(hyphens, $value,\n -moz, -webkit, not(-o), not(-ms), not(-khtml), official\n );\n}\n\n// Mixin for x-browser hyphenation based on @auchenberg's post:\n// Removes the need for the HTML tag\n// http://blog.kenneth.io/blog/2012/03/04/word-wrapping-hypernation-using-css/\n//\n// Example:\n// div {@include hyphenation;}\n//\n// Which generates:\n// div {\n// -ms-word-break: break-all;\n// word-break: break-all;\n// word-break: break-word;\n// -moz-hyphens: auto;\n// -webkit-hyphens: auto;\n// hyphens: auto;}\n//\n@mixin hyphenation{\n @include word-break(break-all);\n @include hyphens;\n}\n","@import \"shared\";\n\n// Provides cross-browser support for the upcoming (?) css3 filter property.\n//\n// Each filter argument should adhere to the standard css3 syntax for the\n// filter property.\n@mixin filter (\n $filter-1,\n $filter-2 : false,\n $filter-3 : false,\n $filter-4 : false,\n $filter-5 : false,\n $filter-6 : false,\n $filter-7 : false,\n $filter-8 : false,\n $filter-9 : false,\n $filter-10: false\n) {\n $filter : compact($filter-1, $filter-2, $filter-3, $filter-4, $filter-5, $filter-6, $filter-7, $filter-8, $filter-9, $filter-10);\n @include experimental(filter, $filter,\n -moz, -webkit, not(-o), not(-ms), not(-khtml), official\n );\n}\n","$experimental-support-for-pie: true !default;\n\n// It is recommended that you use Sass's @extend directive to apply the behavior\n// to your PIE elements. To assist you, Compass provides this variable.\n// When set, it will cause the `@include pie` mixin to extend this class.\n// The class name you provide should **not** include the `.`.\n$pie-base-class: false !default;\n\n// The default approach to using PIE.\n// Can be one of:\n//\n// * relative (default)\n// * z-index\n// * none\n$pie-default-approach: relative !default;\n\n// The location of your PIE behavior file\n// This should be root-relative to your web server\n// relative assets don't work. It is recommended that\n// you set this yourself.\n$pie-behavior: stylesheet-url(\"PIE.htc\") !default;\n\n// When using the z-index approach, the\n// first ancestor of the PIE element at\n// or before the container's opaque background\n// should have a z-index set as well to ensure\n// propert z-index stacking.\n//\n// The `$position` argument must be some non-static\n// value (absolute, relative, etc.)\n@mixin pie-container($z-index: 0, $position: relative) {\n z-index: $z-index;\n position: $position;\n}\n\n// PIE elements must have this behavior attached to them.\n// IE is broken -- it doesn't think of behavior urls as\n// relative to the stylesheet. It considers them relative\n// to the webpage. As a result, you cannot reliably use\n// compass's relative_assets with PIE.\n//\n// * `$approach` - one of: relative, z-index, or none\n// * `$z-index` - when using the z-index approach, this\n// is the z-index that is applied.\n@mixin pie-element(\n $approach: $pie-default-approach,\n $z-index: 0\n) {\n behavior: $pie-behavior;\n @if $approach == relative {\n position: relative;\n }\n @else if $approach == z-index {\n z-index: $z-index;\n }\n}\n\n// a smart mixin that knows to extend or include pie-element according\n// to your stylesheet's configuration variables.\n@mixin pie($base-class: $pie-base-class) {\n @if $base-class {\n @extend .#{$base-class};\n }\n @else {\n @include pie-element;\n }\n}\n\n// Watch `$n` levels of ancestors for changes to their class attribute\n// So that cascading styles will work correctly on the PIE element.\n@mixin pie-watch-ancestors($n) {\n -pie-watch-ancestors: $n;\n}\n","// User Interface ------------------------------------------------------------\n// This file can be expanded to handle all the user interface properties as\n// they become available in browsers:\n// http://www.w3.org/TR/2000/WD-css3-userint-20000216\n@import \"shared\";\n\n\n// This property controls the selection model and granularity of an element.\n//\n// @param $select\n// [ none | text | toggle | element | elements | all | inherit ]\n@mixin user-select($select) {\n $select: unquote($select);\n @include experimental(user-select, $select,\n -moz, -webkit, not(-o), -ms, -khtml, official\n );\n}\n\n// Style the html5 input placeholder in browsers that support it.\n//\n// The styles for the input placeholder are passed as mixin content\n// and the selector comes from the mixin's context.\n//\n// For example:\n//\n// #{elements-of-type(text-input)} {\n// @include input-placeholder {\n// color: #bfbfbf;\n// font-style: italic;\n// }\n// }\n//\n// if you want to apply the placeholder styles to all elements supporting\n// the `input-placeholder` pseudo class (beware of performance impacts):\n//\n// * {\n// @include input-placeholder {\n// color: #bfbfbf;\n// font-style: italic;\n// }\n// }\n@mixin input-placeholder {\n &:-ms-input-placeholder { @content; }\n &:-moz-placeholder { @content; }\n &::-moz-placeholder { @content; }\n &::-webkit-input-placeholder { @content; }\n}\n","@import \"../support\";\n@import \"shared\";\n\n// This is the underlying implementation for all the other mixins in this module.\n// It is the only way to access prefix support for older versions of the spec.\n// Deviates from canonical Compass implementation by dropping support for\n// older versions of the Flexbox spec.\n//\n// `$properties`: map of property-value pairs that should be prefixed\n@mixin flexbox($properties) {\n @each $prop, $value in $properties {\n @if $prop == display {\n @include experimental-value(display, $value, not(-moz), -webkit,\n not(-o), not(-ms), not(-khtml), official);\n } @else {\n @include experimental($prop, $value, not(-moz), -webkit, not(-o),\n not(-ms), not(-khtml), official);\n }\n }\n}\n\n// Values for $display are: flex (default), inline-flex\n@mixin display-flex($display: flex) {\n @include flexbox((display: $display));\n}\n\n// Values: row | row-reverse | column | column-reverse\n@mixin flex-direction($direction) {\n @include flexbox((flex-direction: $direction));\n}\n\n// Values: nowrap | wrap | wrap-reverse\n@mixin flex-wrap($wrap) {\n @include flexbox((flex-wrap: $wrap));\n}\n\n// Shorthand for flex-direction and flex-wrap.\n@mixin flex-flow($flow) {\n @include flexbox((flex-flow: $flow));\n}\n\n// Accepts an integer\n@mixin order($order) {\n @include flexbox((order: $order));\n}\n\n// Shorthand for flex-grow, flex-shrink and optionally flex-basis.\n// Space separated, in that order.\n@mixin flex($flex) {\n @include flexbox((flex: $flex));\n}\n\n// Accepts a number.\n@mixin flex-grow($flex-grow) {\n @include flexbox((flex-grow: $flex-grow));\n}\n\n// Accepts a number.\n@mixin flex-shrink($flex-shrink) {\n @include flexbox((flex-shrink: $flex-shrink));\n}\n\n// Accepts any legal value for the width property.\n@mixin flex-basis($flex-basis) {\n @include flexbox((flex-basis: $flex-basis));\n}\n\n// Legal values: flex-start | flex-end | center | space-between | space-around\n@mixin justify-content($justify-content) {\n @include flexbox((justify-content: $justify-content));\n}\n\n// Legal values: flex-start | flex-end | center | baseline | stretch\n@mixin align-items($align-items) {\n @include flexbox((align-items: $align-items));\n}\n\n// Legal values: auto | flex-start | flex-end | center | baseline | stretch\n@mixin align-self($align-self) {\n @include flexbox((align-self: $align-self));\n}\n\n// Legal values: flex-start | flex-end | center | space-between | space-around | stretch\n@mixin align-content($align-content) {\n @include flexbox((align-content: $align-content));\n}\n","@import \"compass\";\n@import \"animation/core\";\n@import \"animation/animate\";\n","@import \"shared\";\n\n// CSS Animations.\n\n// Apply an animation property and value with the correct browser support\n@mixin animation-support($property, $value) {\n @include experimental($property, $value, -moz, -webkit, -o, -ms, not -khtml, official); }\n\n// Name of any animation as a string.\n$default-animation-name : false !default;\n\n// Duration of the entire animation in seconds.\n$default-animation-duration : false !default;\n\n// Delay for start of animation in seconds.\n$default-animation-delay : false !default;\n\n// The timing function(s) to be used between keyframes. [ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier($number, $number, $number, $number)]\n$default-animation-timing-function : false !default;\n\n// The number of times an animation cycle is played. [infinite | $number]\n$default-animation-iteration-count : false !default;\n\n// Whether or not the animation should play in reverse on alternate cycles. [normal | alternate]\n$default-animation-direction : false !default;\n\n// What values are applied by the animation outside the time it is executing. [none | forwards | backwards | both]\n$default-animation-fill-mode : false !default;\n\n// Whether the animation is running or paused. [running | paused]\n$default-animation-play-state : false !default;\n\n// Create a named animation sequence that can be applied to elements later.\n//\n// $name - The name of your animation.\n// @content - The keyframes of the animation.\n@mixin keyframes(\n $name,\n $moz: $experimental-support-for-mozilla,\n $webkit: $experimental-support-for-webkit,\n $o: $experimental-support-for-opera,\n $ms: $experimental-support-for-microsoft,\n $khtml: $experimental-support-for-khtml,\n $official: true\n) {\n @if $moz {\n @include with-only-support-for($moz: true) {\n @-moz-keyframes #{$name} { @content; }\n }\n }\n @if $webkit {\n @include with-only-support-for($webkit: true) {\n @-webkit-keyframes #{$name} { @content; }\n }\n }\n @if $o {\n @include with-only-support-for($o: true) {\n @-o-keyframes #{$name} { @content; }\n }\n }\n @if $ms {\n @include with-only-support-for($ms: true) {\n @-ms-keyframes #{$name} { @content; }\n }\n }\n @if $khtml {\n @include with-only-support-for($khtml: true) {\n @-khtml-keyframes #{$name} { @content; }\n }\n }\n @if $official {\n @include with-only-support-for {\n @keyframes #{$name} { @content; }\n }\n }\n}\n\n// Apply 1-10 animation names.\n@mixin animation-name($name-1: $default-animation-name, $name-2: false, $name-3: false, $name-4: false, $name-5: false, $name-6: false, $name-7: false, $name-8: false, $name-9: false, $name-10: false) {\n $name: compact($name-1, $name-2, $name-3, $name-4, $name-5, $name-6, $name-7, $name-8, $name-9, $name-10);\n @include animation-support(animation-name, $name); }\n\n// Apply 1-10 animation durations.\n@mixin animation-duration($duration-1: $default-animation-duration, $duration-2: false, $duration-3: false, $duration-4: false, $duration-5: false, $duration-6: false, $duration-7: false, $duration-8: false, $duration-9: false, $duration-10: false) {\n $duration: compact($duration-1, $duration-2, $duration-3, $duration-4, $duration-5, $duration-6, $duration-7, $duration-8, $duration-9, $duration-10);\n @include animation-support(animation-duration, $duration); }\n\n// Apply 1-10 animation delays.\n@mixin animation-delay($delay-1: $default-animation-delay, $delay-2: false, $delay-3: false, $delay-4: false, $delay-5: false, $delay-6: false, $delay-7: false, $delay-8: false, $delay-9: false, $delay-10: false) {\n $delay: compact($delay-1, $delay-2, $delay-3, $delay-4, $delay-5, $delay-6, $delay-7, $delay-8, $delay-9, $delay-10);\n @include animation-support(animation-delay, $delay); }\n\n// Apply 1-10 animation timing functions.\n@mixin animation-timing-function($function-1: $default-animation-timing-function, $function-2: false, $function-3: false, $function-4: false, $function-5: false, $function-6: false, $function-7: false, $function-8: false, $function-9: false, $function-10: false) {\n $function: compact($function-1, $function-2, $function-3, $function-4, $function-5, $function-6, $function-7, $function-8, $function-9, $function-10);\n @include animation-support(animation-timing-function, $function); }\n\n// Apply 1-10 animation iteration counts.\n@mixin animation-iteration-count($count-1: $default-animation-iteration-count, $count-2: false, $count-3: false, $count-4: false, $count-5: false, $count-6: false, $count-7: false, $count-8: false, $count-9: false, $count-10: false) {\n $count: compact($count-1, $count-2, $count-3, $count-4, $count-5, $count-6, $count-7, $count-8, $count-9, $count-10);\n @include animation-support(animation-iteration-count, $count); }\n\n// Apply 1-10 animation directions.\n@mixin animation-direction($direction-1: $default-animation-direction, $direction-2: false, $direction-3: false, $direction-4: false, $direction-5: false, $direction-6: false, $direction-7: false, $direction-8: false, $direction-9: false, $direction-10: false) {\n $direction: compact($direction-1, $direction-2, $direction-3, $direction-4, $direction-5, $direction-6, $direction-7, $direction-8, $direction-9, $direction-10);\n @include animation-support(animation-direction, $direction); }\n\n// Apply 1-10 animation fill modes.\n@mixin animation-fill-mode($mode-1: $default-animation-fill-mode, $mode-2: false, $mode-3: false, $mode-4: false, $mode-5: false, $mode-6: false, $mode-7: false, $mode-8: false, $mode-9: false, $mode-10: false) {\n $mode: compact($mode-1, $mode-2, $mode-3, $mode-4, $mode-5, $mode-6, $mode-7, $mode-8, $mode-9, $mode-10);\n @include animation-support(animation-fill-mode, $mode); }\n\n// Apply 1-10 animation play states.\n@mixin animation-play-state($state-1: $default-animation-play-state, $state-2: false, $state-3: false, $state-4: false, $state-5: false, $state-6: false, $state-7: false, $state-8: false, $state-9: false, $state-10: false) {\n $state: compact($state-1, $state-2, $state-3, $state-4, $state-5, $state-6, $state-7, $state-8, $state-9, $state-10);\n @include animation-support(animation-play-state, $state); }\n\n// Shortcut to apply a named animation to an element, with all the settings.\n//\n// $animation-1 : Name and settings for the first animation. [ | default]\n// ...\n// $animation-10 : Name and settings for the tenth animation. \n@mixin animation($animation-1: default, $animation-2: false, $animation-3: false, $animation-4: false, $animation-5: false, $animation-6: false, $animation-7: false, $animation-8: false, $animation-9: false, $animation-10: false) {\n @if $animation-1 == default {\n $animation-1: -compass-space-list(compact($default-animation-name, $default-animation-duration, $default-animation-timing-function, $default-animation-delay, $default-animation-iteration-count, $default-animation-direction, $default-animation-fill-mode, $default-animation-play-state)); }\n $animation: compact($animation-1, $animation-2, $animation-3, $animation-4, $animation-5, $animation-6, $animation-7, $animation-8, $animation-9, $animation-10);\n @include animation-support(animation, $animation); }\n","@mixin set-experimental-support($moz: false, $webkit: false, $ms: false, $o: false, $khtml: false) {\n $experimental-support-for-mozilla: $moz;\n $experimental-support-for-webkit: $webkit;\n $experimental-support-for-microsoft: $ms;\n $experimental-support-for-opera: $o;\n $experimental-support-for-khtml: $khtml;\n}\n\n@mixin with-only-support-for($moz: false, $webkit: false, $ms: false, $o: false, $khtml: false) {\n // Capture the current state\n $original-moz: $experimental-support-for-mozilla;\n $original-webkit: $experimental-support-for-webkit;\n $original-o: $experimental-support-for-opera;\n $original-ms: $experimental-support-for-microsoft;\n $original-khtml: $experimental-support-for-khtml;\n\n @include set-experimental-support($moz, $webkit, $ms, $o, $khtml);\n\n @content;\n\n @include set-experimental-support($original-moz, $original-webkit, $original-ms, $original-o, $original-khtml);\n}","// ---------------------------------------------------------------------------\n// Animations from Animate.css\n// Author : Dan Eden\n// URL : http://daneden.me/animate/\n//\n// Attention seekers\n// - flash bounce shake tada swing wobble pulse\n// Fading entrances\n// - fadeIn fadeInUp fadeInDown fadeInLeft fadeInRight fadeInUpBig fadeInDownBig fadeInLeftBig fadeInRightBig\n// Fading exits\n// - fadeOut fadeOutUp fadeOutDown fadeOutLeft fadeOutRight fadeOutUpBig fadeOutDownBig fadeOutLeftBig fadeOutRightBig\n// Bouncing entrances\n// - bounceIn bounceInDown bounceInUp bounceInLeft bounceInRight\n// Bouncing exits\n// - bounceOut bounceOutDown bounceOutUp bounceOutLeft bounceOutRight\n// Rotating entrances\n// - rotateIn rotateInDownLeft rotateInDownRight rotateInUpLeft rotateInUpRight\n// Rotating exits\n// - rotateOut rotateOutDownLeft rotateOutDownRight rotateOutUpLeft rotateOutUpRight\n// Lightspeed\n// - lightSpeedIn lightSpeedOut\n// Specials\n// - hinge rollIn rollOut\n// ---------------------------------------------------------------------------\n@import \"animate/attention-seekers\";\n@import \"animate/bouncing\";\n@import \"animate/fading\";\n@import \"animate/flippers\";\n@import \"animate/lightspeed\";\n@import \"animate/rotating\";\n@import \"animate/specials\";\n","// ---------------------------------------------------------------------------\n@include keyframes(flash) {\n 0% {\n opacity: 1; }\n 25% {\n opacity: 0; }\n 50% {\n opacity: 1; }\n 75% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounce) {\n 0% {\n @include translateY(0); }\n 20% {\n @include translateY(0); }\n 40% {\n @include translateY(-30px); }\n 50% {\n @include translateY(0); }\n 60% {\n @include translateY(-15px); }\n 80% {\n @include translateY(0); }\n 100% {\n @include translateY(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(shake) {\n 0% {\n @include translateX(0); }\n 10% {\n @include translateX(-10px); }\n 20% {\n @include translateX(10px); }\n 30% {\n @include translateX(-10px); }\n 40% {\n @include translateX(10px); }\n 50% {\n @include translateX(-10px); }\n 60% {\n @include translateX(10px); }\n 70% {\n @include translateX(-10px); }\n 80% {\n @include translateX(10px); }\n 90% {\n @include translateX(-10px); }\n 100% {\n @include translateX(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(tada) {\n 0% {\n @include scale(1); }\n 10% {\n @include transform(scale(0.9) rotate(-3deg)); }\n 20% {\n @include transform(scale(0.9) rotate(-3deg)); }\n 30% {\n @include transform(scale(1.1) rotate(3deg)); }\n 40% {\n @include transform(scale(1.1) rotate(-3deg)); }\n 50% {\n @include transform(scale(1.1) rotate(3deg)); }\n 60% {\n @include transform(scale(1.1) rotate(-3deg)); }\n 70% {\n @include transform(scale(1.1) rotate(3deg)); }\n 80% {\n @include transform(scale(1.1) rotate(-3deg)); }\n 90% {\n @include transform(scale(1.1) rotate(3deg)); }\n 100% {\n @include transform(scale(1) rotate(0)); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(swing) {\n 20%, 40%, 60%, 80%, 100% {\n @include transform-origin(top center); }\n 20% {\n @include rotate(15deg); }\n 40% {\n @include rotate(-10deg); }\n 60% {\n @include rotate(5deg); }\n 80% {\n @include rotate(-5deg); }\n 100% {\n @include rotate(0deg); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(wobble) {\n 0% {\n @include translateX(0%); }\n 15% {\n @include transform(translateX(-25%) rotate(-5deg)); }\n 30% {\n @include transform(translateX(20%) rotate(3deg)); }\n 45% {\n @include transform(translateX(-15%) rotate(-3deg)); }\n 60% {\n @include transform(translateX(10%) rotate(2deg)); }\n 75% {\n @include transform(translateX(-5%) rotate(-1deg)); }\n 100% {\n @include transform(translateX(0%)); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(pulse) {\n 0% {\n @include scale(1); }\n 50% {\n @include scale(1.1); }\n 100% {\n @include scale(1); } }\n \n \n// ---------------------------------------------------------------------------\n@include keyframes(wiggle) {\n 0% {\n @include skewX(9deg); }\n 10% {\n @include skewX(-8deg); }\n 20% {\n @include skewX(7deg); }\n 30% {\n @include skewX(-6deg); }\n 40% {\n @include skewX(5deg); }\n 50% {\n @include skewX(-4deg); }\n 60% {\n @include skewX(3deg); }\n 70% {\n @include skewX(-2deg); }\n 80% {\n @include skewX(1deg); }\n 90% {\n @include skewX(0deg); }\n 100% {\n @include skewX(0deg); } }","// ---------------------------------------------------------------------------\n@import \"bouncing/bouncing-exits\";\n@import \"bouncing/bouncing-entrances\";","// ---------------------------------------------------------------------------\n@include keyframes(bounceOut) {\n 0% {\n @include scale(1); }\n 25% {\n @include scale(0.95); }\n 50% {\n opacity: 1;\n @include scale(1.1); }\n 100% {\n opacity: 0;\n @include scale(0.3); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceOutUp) {\n 0% {\n @include translateY(0); }\n 20% {\n opacity: 1;\n @include translateY(20px); }\n 100% {\n opacity: 0;\n @include translateY(-2000px); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceOutDown) {\n 0% {\n @include translateY(0); }\n 20% {\n opacity: 1;\n @include translateY(-20px); }\n 100% {\n opacity: 0;\n @include translateY(2000px); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceOutLeft) {\n 0% {\n @include translateX(0); }\n 20% {\n opacity: 1;\n @include translateX(20px); }\n 100% {\n opacity: 0;\n @include translateX(-2000px); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceOutRight) {\n 0% {\n @include translateX(0); }\n 20% {\n opacity: 1;\n @include translateX(-20px); }\n 100% {\n opacity: 0;\n @include translateX(2000px); } }\n","// ---------------------------------------------------------------------------\n@include keyframes(bounceIn) {\n 0% {\n opacity: 0;\n @include scale(0.3); }\n 50% {\n opacity: 1;\n @include scale(1.05); }\n 70% {\n @include scale(0.9); }\n 100% {\n @include scale(1); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceInDown) {\n 0% {\n opacity: 0;\n @include translateY(-2000px); }\n 60% {\n opacity: 1;\n @include translateY(30px); }\n 80% {\n @include translateY(-10px); }\n 100% {\n @include translateY(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceInUp) {\n 0% {\n opacity: 0;\n @include translateY(2000px); }\n 60% {\n opacity: 1;\n @include translateY(-30px); }\n 80% {\n @include translateY(10px); }\n 100% {\n @include translateY(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceInRight) {\n 0% {\n opacity: 0;\n @include translateX(2000px); }\n 60% {\n opacity: 1;\n @include translateX(-30px); }\n 80% {\n @include translateX(10px); }\n 100% {\n @include translateX(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(bounceInLeft) {\n 0% {\n opacity: 0;\n @include translateX(-2000px); }\n 60% {\n opacity: 1;\n @include translateX(30px); }\n 80% {\n @include translateX(-10px); }\n 100% {\n @include translateX(0); } }\n","// ---------------------------------------------------------------------------\n@import \"fading/fading-exits\";\n@import \"fading/fading-entrances\";","// ---------------------------------------------------------------------------\n@include keyframes(fadeOut) {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutUp) {\n 0% {\n @include translateY(0);\n opacity: 1; }\n 100% {\n @include translateY(-20px);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutDown) {\n 0% {\n @include translateY(0);\n opacity: 1; }\n 100% {\n @include translateY(20px);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutRight) {\n 0% {\n @include translateX(0);\n opacity: 1; }\n 100% {\n @include translateX(20px);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutLeft) {\n 0% {\n @include translateX(0);\n opacity: 1; }\n 100% {\n @include translateX(-20px);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutUpBig) {\n 0% {\n @include translateY(0);\n opacity: 1; }\n 100% {\n @include translateY(-2000px);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutDownBig) {\n 0% {\n opacity: 1;\n @include translateY(0); }\n 100% {\n opacity: 0;\n @include translateY(2000px); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutRightBig) {\n 0% {\n opacity: 1;\n @include translateX(0); }\n 100% {\n opacity: 0;\n @include translateX(2000px); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeOutLeftBig) {\n 0% {\n opacity: 1;\n @include translateX(0); }\n 100% {\n opacity: 0;\n @include translateX(-2000px); } }\n","// ---------------------------------------------------------------------------\n@include keyframes(fadeIn) {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInUp) {\n 0% {\n @include translateY(20px);\n opacity: 0; }\n 100% {\n @include translateY(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInDown) {\n 0% {\n @include translateY(-20px);\n opacity: 0; }\n 100% {\n @include translateY(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInRight) {\n 0% {\n @include translateX(20px);\n opacity: 0; }\n 100% {\n @include translateX(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInLeft) {\n 0% {\n @include translateX(-20px);\n opacity: 0; }\n 100% {\n @include translateX(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInUpBig) {\n 0% {\n @include translateY(2000px);\n opacity: 0; }\n 100% {\n @include translateY(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInDownBig) {\n 0% {\n opacity: 0;\n @include translateY(-2000px); }\n 100% {\n opacity: 1;\n @include translateY(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInRightBig) {\n 0% {\n opacity: 0;\n @include translateX(2000px); }\n 100% {\n opacity: 1;\n @include translateX(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(fadeInLeftBig) {\n 0% {\n opacity: 0;\n @include translateX(-2000px); }\n 100% {\n opacity: 1;\n @include translateX(0); } }\n","// ---------------------------------------------------------------------------\n@include keyframes(flip) {\n 0% {\n @include transform(perspective(400px) rotateY(0));\n @include animation-timing-function(ease-out);\n }\n 40% {\n @include transform(perspective(400px) translateZ(150px) rotateY(170deg));\n @include animation-timing-function(ease-out);\n }\n 50% {\n @include transform(perspective(400px) translateZ(150px) rotateY(190deg) scale(1));\n @include animation-timing-function(ease-in);\n }\n 80% {\n @include transform(perspective(400px) rotateY(360deg) scale(0.95));\n @include animation-timing-function(ease-in);\n }\n 100% {\n @include transform(perspective(400px) scale(1));\n @include animation-timing-function(ease-in);\n }\n}\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(flipInX) {\n 0% {\n @include transform(perspective(400px) rotateX(90deg));\n @include opacity(0);\n }\n 40% {\n @include transform(perspective(400px) rotateX(-10deg));\n }\n 70% {\n @include transform(perspective(400px) rotateX(10deg));\n }\n 100% {\n @include transform(perspective(400px) rotateX(0deg));\n @include opacity(1);\n }\n}\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(flipOutX) {\n 0% {\n @include transform(perspective(400px) rotateX(0deg));\n @include opacity(1);\n }\n 100% {\n @include transform(perspective(400px) rotateX(90deg));\n @include opacity(0);\n }\n}\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(flipInY) {\n 0% {\n @include transform(perspective(400px) rotateY(90deg));\n @include opacity(0);\n }\n 40% {\n @include transform(perspective(400px) rotateY(-10deg));\n }\n 70% {\n @include transform(perspective(400px) rotateY(10deg));\n }\n 100% {\n @include transform(perspective(400px) rotateY(0deg));\n @include opacity(1);\n }\n}\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(flipOutY) {\n 0% {\n @include transform(perspective(400px) rotateY(0deg));\n @include opacity(1);\n }\n 100% {\n @include transform(perspective(400px) rotateY(90deg));\n @include opacity(0);\n }\n}\n","// ---------------------------------------------------------------------------\n@include keyframes(lightSpeedIn) {\n 0% {\n @include transform(translateX(100%) skewX(-30deg));\n @include opacity(0); }\n 60% {\n @include transform(translateX(-20%) skewX(30deg));\n @include opacity(1); }\n 80% {\n @include transform(translateX(0%) skewX(-15deg));\n @include opacity(1); }\n 100% {\n @include transform(translateX(0%) skewX(0deg));\n @include opacity(1); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(lightSpeedOut) {\n 0% {\n @include transform(translateX(0%) skewX(0deg));\n @include opacity(1); }\n 100% {\n @include transform(translateX(100%) skewX(-30deg));\n @include opacity(0); } }","// ---------------------------------------------------------------------------\n@import \"rotating/rotating-exits\";\n@import \"rotating/rotating-entrances\";\n","// ---------------------------------------------------------------------------\n@include keyframes(rotateOut) {\n 0% {\n @include transform-origin(center center);\n @include rotate(0);\n opacity: 1; }\n 100% {\n @include transform-origin(center center);\n @include rotate(200deg);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateOutDownLeft) {\n 0% {\n @include transform-origin(left bottom);\n @include rotate(0);\n opacity: 1; }\n 100% {\n @include transform-origin(left bottom);\n @include rotate(90deg);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateOutUpLeft) {\n 0% {\n @include transform-origin(left bottom);\n @include rotate(0);\n opacity: 1; }\n 100% {\n @include transform-origin(left bottom);\n @include rotate(-90deg);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateOutDownRight) {\n 0% {\n @include transform-origin(right bottom);\n @include rotate(0);\n opacity: 1; }\n 100% {\n @include transform-origin(right bottom);\n @include rotate(-90deg);\n opacity: 0; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateOutUpRight) {\n 0% {\n @include transform-origin(right bottom);\n @include rotate(0);\n opacity: 1; }\n 100% {\n @include transform-origin(right bottom);\n @include rotate(90deg);\n opacity: 0; } }\n","// ---------------------------------------------------------------------------\n@include keyframes(rotateIn) {\n 0% {\n @include transform-origin(center center);\n @include rotate(-200deg);\n opacity: 0; }\n 100% {\n @include transform-origin(center center);\n @include rotate(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateInDownLeft) {\n 0% {\n @include transform-origin(left bottom);\n @include rotate(-90deg);\n opacity: 0; }\n 100% {\n @include transform-origin(left bottom);\n @include rotate(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateInUpLeft) {\n 0% {\n @include transform-origin(left bottom);\n @include rotate(90deg);\n opacity: 0; }\n 100% {\n @include transform-origin(left bottom);\n @include rotate(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateInUpRight) {\n 0% {\n @include transform-origin(right bottom);\n @include rotate(-90deg);\n opacity: 0; }\n 100% {\n @include transform-origin(right bottom);\n @include rotate(0);\n opacity: 1; } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rotateInDownRight) {\n 0% {\n @include transform-origin(right bottom);\n @include rotate(90deg);\n opacity: 0; }\n 100% {\n @include transform-origin(right bottom);\n @include rotate(0);\n opacity: 1; } }\n","// ---------------------------------------------------------------------------\n@include keyframes(hinge) {\n 0% {\n @include rotate(0);\n @include transform-origin(top left);\n @include animation-timing-function(ease-in-out); }\n 20%, 60% {\n @include rotate(80deg);\n @include transform-origin(top left);\n @include animation-timing-function(ease-in-out); }\n 40% {\n @include rotate(60deg);\n @include transform-origin(top left);\n @include animation-timing-function(ease-in-out); }\n 80% {\n @include transform(rotate(60deg) translateY(0));\n @include opacity(1);\n @include transform-origin(top left);\n @include animation-timing-function(ease-in-out); }\n 100% {\n @include translateY(700px);\n @include opacity(0); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rollIn) {\n 0% {\n @include opacity(0);\n @include transform(translateX(-100%) rotate(-120deg)); }\n 100% {\n @include opacity(1);\n @include transform(translateX(0px) rotate(0deg)); } }\n\n\n// ---------------------------------------------------------------------------\n@include keyframes(rollOut) {\n 0% {\n @include opacity(1);\n @include transform(translateX(0px) rotate(0deg)); }\n 100% {\n @include opacity(0);\n @include transform(translateX(-100%) rotate(-120deg)); } }\n","/*!\n * Bootstrap v5.0.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n","// Toggles\n//\n// Used in conjunction with global variables to enable certain theme features.\n\n// Vendor\n@import \"vendor/rfs\";\n\n// Deprecate\n@import \"mixins/deprecate\";\n\n// Helpers\n@import \"mixins/breakpoints\";\n@import \"mixins/color-scheme\";\n@import \"mixins/image\";\n@import \"mixins/resize\";\n@import \"mixins/visually-hidden\";\n@import \"mixins/reset-text\";\n@import \"mixins/text-truncate\";\n\n// Utilities\n@import \"mixins/utilities\";\n\n// Components\n@import \"mixins/alert\";\n@import \"mixins/buttons\";\n@import \"mixins/caret\";\n@import \"mixins/pagination\";\n@import \"mixins/lists\";\n@import \"mixins/list-group\";\n@import \"mixins/forms\";\n@import \"mixins/table-variants\";\n\n// Skins\n@import \"mixins/border-radius\";\n@import \"mixins/box-shadow\";\n@import \"mixins/gradients\";\n@import \"mixins/transition\";\n\n// Layout\n@import \"mixins/clearfix\";\n@import \"mixins/container\";\n@import \"mixins/grid\";\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/master/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: $rfs-base-value / ($rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: $rfs-base-value / ($rfs-base-value * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{$value / ($value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{$value / ($value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: $value / ($value * 0 + if($unit == px, 1, 1 / $rfs-rem-value));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{$value / $rfs-rem-value}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + (abs($value) - $rfs-base-value) / $rfs-factor;\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{$value-min / $rfs-rem-value}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$value-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// Deprecate mixin\n//\n// This mixin can be used to deprecate mixins or functions.\n// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to\n// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)\n@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {\n @if ($enable-deprecation-messages != false and $ignore-warning != true) {\n @warn \"#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.\";\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// scss-docs-start mixin-color-scheme\n@mixin color-scheme($name) {\n @media (prefers-color-scheme: #{$name}) {\n @content;\n }\n}\n// scss-docs-end mixin-color-scheme\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n","// Resize anything\n\n@mixin resizable($direction) {\n overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n resize: $direction; // Options: horizontal, vertical, both\n}\n","// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (eg. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// scss-docs-start alert-variant-mixin\n@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n .alert-link {\n color: shade-color($color, 20%);\n }\n}\n// scss-docs-end alert-variant-mixin\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background,$btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n &:hover {\n color: $hover-color;\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n .btn-check:focus + &,\n &:focus {\n color: $hover-color;\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n @if $enable-shadows {\n @include box-shadow($btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5);\n }\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active,\n .show > &.dropdown-toggle {\n color: $active-color;\n background-color: $active-background;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: $active-border;\n\n &:focus {\n @if $enable-shadows {\n @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5);\n }\n }\n }\n\n &:disabled,\n &.disabled {\n color: $disabled-color;\n background-color: $disabled-background;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: $disabled-border;\n }\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n color: $color;\n border-color: $color;\n\n &:hover {\n color: $color-hover;\n background-color: $active-background;\n border-color: $active-border;\n }\n\n .btn-check:focus + &,\n &:focus {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active,\n &.dropdown-toggle.show {\n color: $active-color;\n background-color: $active-background;\n border-color: $active-border;\n\n &:focus {\n @if $enable-shadows {\n @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n\n &:disabled,\n &.disabled {\n color: $color;\n background-color: transparent;\n }\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n// scss-docs-end btn-size-mixin\n","// scss-docs-start caret-mixins\n@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-end {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-start {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down();\n } @else if $direction == up {\n @include caret-up();\n } @else if $direction == end {\n @include caret-end();\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-start();\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n","// Pagination\n\n// scss-docs-start pagination-mixin\n@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {\n .page-link {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n }\n\n .page-item {\n @if $pagination-margin-start == (-$pagination-border-width) {\n &:first-child {\n .page-link {\n @include border-start-radius($border-radius);\n }\n }\n\n &:last-child {\n .page-link {\n @include border-end-radius($border-radius);\n }\n }\n } @else {\n //Add border-radius to all pageLinks in case they have left margin\n .page-link {\n @include border-radius($border-radius);\n }\n }\n }\n}\n// scss-docs-end pagination-mixin\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// List Groups\n\n// scss-docs-start list-group-mixin\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n &.list-group-item-action {\n &:hover,\n &:focus {\n color: $color;\n background-color: shade-color($background, 10%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n// scss-docs-end list-group-mixin\n","// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n\n// scss-docs-start form-validation-mixins\n@mixin form-validation-state-selector($state) {\n @if ($state == \"valid\" or $state == \"invalid\") {\n .was-validated #{if(&, \"&\", \"\")}:#{$state},\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n } @else {\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n }\n}\n\n@mixin form-validation-state(\n $state,\n $color,\n $icon,\n $tooltip-color: color-contrast($color),\n $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),\n $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity)\n) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-style: $form-feedback-font-style;\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: $tooltip-color;\n background-color: $tooltip-bg-color;\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n @include form-validation-state-selector($state) {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n\n .form-control {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-image: escape-svg($icon);\n background-repeat: no-repeat;\n background-position: right $input-height-inner-quarter center;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .form-select {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n &:not([multiple]):not([size]),\n &:not([multiple])[size=\"1\"] {\n padding-right: $form-select-feedback-icon-padding-end;\n background-image: escape-svg($form-select-indicator), escape-svg($icon);\n background-position: $form-select-bg-position, $form-select-feedback-icon-position;\n background-size: $form-select-bg-size, $form-select-feedback-icon-size;\n }\n }\n\n &:focus {\n border-color: $color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n .form-check-input {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n &:checked {\n background-color: $color;\n }\n\n &:focus {\n box-shadow: $focus-box-shadow;\n }\n\n ~ .form-check-label {\n color: $color;\n }\n }\n }\n .form-check-inline .form-check-input {\n ~ .#{$state}-feedback {\n margin-left: .5em;\n }\n }\n\n .input-group .form-control,\n .input-group .form-select {\n @include form-validation-state-selector($state) {\n z-index: 3;\n }\n }\n}\n// scss-docs-end form-validation-mixins\n","// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n\n --#{$variable-prefix}table-bg: #{$background};\n --#{$variable-prefix}table-striped-bg: #{$striped-bg};\n --#{$variable-prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$variable-prefix}table-active-bg: #{$active-bg};\n --#{$variable-prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$variable-prefix}table-hover-bg: #{$hover-bg};\n --#{$variable-prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: $color;\n border-color: mix($color, $background, percentage($table-border-factor));\n }\n}\n// scss-docs-end table-variant\n","// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n","@mixin box-shadow($shadow...) {\n @if $enable-shadows {\n $result: ();\n\n @each $value in $shadow {\n @if $value != null {\n $result: append($result, $value, \"comma\");\n }\n @if $value == none and length($shadow) > 1 {\n @warn \"The keyword 'none' must be used as a single argument.\";\n }\n }\n\n @if (length($result) > 0) {\n box-shadow: $result;\n }\n }\n}\n","// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$variable-prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n","// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n","// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n width: 100%;\n padding-right: var(--#{$variable-prefix}gutter-x, #{$gutter});\n padding-left: var(--#{$variable-prefix}gutter-x, #{$gutter});\n margin-right: auto;\n margin-left: auto;\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$variable-prefix}gutter-x: #{$gutter};\n --#{$variable-prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(var(--#{$variable-prefix}gutter-y) * -1); // stylelint-disable-line function-disallowed-list\n margin-right: calc(var(--#{$variable-prefix}gutter-x) / -2); // stylelint-disable-line function-disallowed-list\n margin-left: calc(var(--#{$variable-prefix}gutter-x) / -2); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$variable-prefix}gutter-x) / 2); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$variable-prefix}gutter-x) / 2); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$variable-prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage($size / $columns);\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// numberof columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: 100% / $count;\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$variable-prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$variable-prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n","// stylelint-disable indentation\n\n// Utilities\n\n$utilities: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$utilities: map-merge(\n (\n // scss-docs-start utils-vertical-align\n \"align\": (\n property: vertical-align,\n class: align,\n values: baseline top middle bottom text-bottom text-top\n ),\n // scss-docs-end utils-vertical-align\n // scss-docs-start utils-float\n \"float\": (\n responsive: true,\n property: float,\n values: (\n start: left,\n end: right,\n none: none,\n )\n ),\n // scss-docs-end utils-float\n // scss-docs-start utils-overflow\n \"overflow\": (\n property: overflow,\n values: auto hidden visible scroll,\n ),\n // scss-docs-end utils-overflow\n // scss-docs-start utils-display\n \"display\": (\n responsive: true,\n print: true,\n property: display,\n class: d,\n values: inline inline-block block grid table table-row table-cell flex inline-flex none\n ),\n // scss-docs-end utils-display\n // scss-docs-start utils-shadow\n \"shadow\": (\n property: box-shadow,\n class: shadow,\n values: (\n null: $box-shadow,\n sm: $box-shadow-sm,\n lg: $box-shadow-lg,\n none: none,\n )\n ),\n // scss-docs-end utils-shadow\n // scss-docs-start utils-position\n \"position\": (\n property: position,\n values: static relative absolute fixed sticky\n ),\n \"top\": (\n property: top,\n values: $position-values\n ),\n \"bottom\": (\n property: bottom,\n values: $position-values\n ),\n \"start\": (\n property: left,\n class: start,\n values: $position-values\n ),\n \"end\": (\n property: right,\n class: end,\n values: $position-values\n ),\n \"translate-middle\": (\n property: transform,\n class: translate-middle,\n values: (\n null: translate(-50%, -50%),\n x: translateX(-50%),\n y: translateY(-50%),\n )\n ),\n // scss-docs-end utils-position\n // scss-docs-start utils-borders\n \"border\": (\n property: border,\n values: (\n null: $border-width solid $border-color,\n 0: 0,\n )\n ),\n \"border-top\": (\n property: border-top,\n values: (\n null: $border-width solid $border-color,\n 0: 0,\n )\n ),\n \"border-end\": (\n property: border-right,\n class: border-end,\n values: (\n null: $border-width solid $border-color,\n 0: 0,\n )\n ),\n \"border-bottom\": (\n property: border-bottom,\n values: (\n null: $border-width solid $border-color,\n 0: 0,\n )\n ),\n \"border-start\": (\n property: border-left,\n class: border-start,\n values: (\n null: $border-width solid $border-color,\n 0: 0,\n )\n ),\n \"border-color\": (\n property: border-color,\n class: border,\n values: map-merge($theme-colors, (\"white\": $white))\n ),\n \"border-width\": (\n property: border-width,\n class: border,\n values: $border-widths\n ),\n // scss-docs-end utils-borders\n // Sizing utilities\n // scss-docs-start utils-sizing\n \"width\": (\n property: width,\n class: w,\n values: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n )\n ),\n \"max-width\": (\n property: max-width,\n class: mw,\n values: (100: 100%)\n ),\n \"viewport-width\": (\n property: width,\n class: vw,\n values: (100: 100vw)\n ),\n \"min-viewport-width\": (\n property: min-width,\n class: min-vw,\n values: (100: 100vw)\n ),\n \"height\": (\n property: height,\n class: h,\n values: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n )\n ),\n \"max-height\": (\n property: max-height,\n class: mh,\n values: (100: 100%)\n ),\n \"viewport-height\": (\n property: height,\n class: vh,\n values: (100: 100vh)\n ),\n \"min-viewport-height\": (\n property: min-height,\n class: min-vh,\n values: (100: 100vh)\n ),\n // scss-docs-end utils-sizing\n // Flex utilities\n // scss-docs-start utils-flex\n \"flex\": (\n responsive: true,\n property: flex,\n values: (fill: 1 1 auto)\n ),\n \"flex-direction\": (\n responsive: true,\n property: flex-direction,\n class: flex,\n values: row column row-reverse column-reverse\n ),\n \"flex-grow\": (\n responsive: true,\n property: flex-grow,\n class: flex,\n values: (\n grow-0: 0,\n grow-1: 1,\n )\n ),\n \"flex-shrink\": (\n responsive: true,\n property: flex-shrink,\n class: flex,\n values: (\n shrink-0: 0,\n shrink-1: 1,\n )\n ),\n \"flex-wrap\": (\n responsive: true,\n property: flex-wrap,\n class: flex,\n values: wrap nowrap wrap-reverse\n ),\n \"gap\": (\n responsive: true,\n property: gap,\n class: gap,\n values: $spacers\n ),\n \"justify-content\": (\n responsive: true,\n property: justify-content,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n evenly: space-evenly,\n )\n ),\n \"align-items\": (\n responsive: true,\n property: align-items,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n baseline: baseline,\n stretch: stretch,\n )\n ),\n \"align-content\": (\n responsive: true,\n property: align-content,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n stretch: stretch,\n )\n ),\n \"align-self\": (\n responsive: true,\n property: align-self,\n values: (\n auto: auto,\n start: flex-start,\n end: flex-end,\n center: center,\n baseline: baseline,\n stretch: stretch,\n )\n ),\n \"order\": (\n responsive: true,\n property: order,\n values: (\n first: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n 5: 5,\n last: 6,\n ),\n ),\n // scss-docs-end utils-flex\n // Margin utilities\n // scss-docs-start utils-spacing\n \"margin\": (\n responsive: true,\n property: margin,\n class: m,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-x\": (\n responsive: true,\n property: margin-right margin-left,\n class: mx,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-y\": (\n responsive: true,\n property: margin-top margin-bottom,\n class: my,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-top\": (\n responsive: true,\n property: margin-top,\n class: mt,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-end\": (\n responsive: true,\n property: margin-right,\n class: me,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-bottom\": (\n responsive: true,\n property: margin-bottom,\n class: mb,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-start\": (\n responsive: true,\n property: margin-left,\n class: ms,\n values: map-merge($spacers, (auto: auto))\n ),\n // Negative margin utilities\n \"negative-margin\": (\n responsive: true,\n property: margin,\n class: m,\n values: $negative-spacers\n ),\n \"negative-margin-x\": (\n responsive: true,\n property: margin-right margin-left,\n class: mx,\n values: $negative-spacers\n ),\n \"negative-margin-y\": (\n responsive: true,\n property: margin-top margin-bottom,\n class: my,\n values: $negative-spacers\n ),\n \"negative-margin-top\": (\n responsive: true,\n property: margin-top,\n class: mt,\n values: $negative-spacers\n ),\n \"negative-margin-end\": (\n responsive: true,\n property: margin-right,\n class: me,\n values: $negative-spacers\n ),\n \"negative-margin-bottom\": (\n responsive: true,\n property: margin-bottom,\n class: mb,\n values: $negative-spacers\n ),\n \"negative-margin-start\": (\n responsive: true,\n property: margin-left,\n class: ms,\n values: $negative-spacers\n ),\n // Padding utilities\n \"padding\": (\n responsive: true,\n property: padding,\n class: p,\n values: $spacers\n ),\n \"padding-x\": (\n responsive: true,\n property: padding-right padding-left,\n class: px,\n values: $spacers\n ),\n \"padding-y\": (\n responsive: true,\n property: padding-top padding-bottom,\n class: py,\n values: $spacers\n ),\n \"padding-top\": (\n responsive: true,\n property: padding-top,\n class: pt,\n values: $spacers\n ),\n \"padding-end\": (\n responsive: true,\n property: padding-right,\n class: pe,\n values: $spacers\n ),\n \"padding-bottom\": (\n responsive: true,\n property: padding-bottom,\n class: pb,\n values: $spacers\n ),\n \"padding-start\": (\n responsive: true,\n property: padding-left,\n class: ps,\n values: $spacers\n ),\n // scss-docs-end utils-spacing\n // Text\n // scss-docs-start utils-text\n \"font-family\": (\n property: font-family,\n class: font,\n values: (monospace: var(--#{$variable-prefix}font-monospace))\n ),\n \"font-size\": (\n rfs: true,\n property: font-size,\n class: fs,\n values: $font-sizes\n ),\n \"font-style\": (\n property: font-style,\n class: fst,\n values: italic normal\n ),\n \"font-weight\": (\n property: font-weight,\n class: fw,\n values: (\n light: $font-weight-light,\n lighter: $font-weight-lighter,\n normal: $font-weight-normal,\n bold: $font-weight-bold,\n bolder: $font-weight-bolder\n )\n ),\n \"line-height\": (\n property: line-height,\n class: lh,\n values: (\n 1: 1,\n sm: $line-height-sm,\n base: $line-height-base,\n lg: $line-height-lg,\n )\n ),\n \"text-align\": (\n responsive: true,\n property: text-align,\n class: text,\n values: (\n start: left,\n end: right,\n center: center,\n )\n ),\n \"text-decoration\": (\n property: text-decoration,\n values: none underline line-through\n ),\n \"text-transform\": (\n property: text-transform,\n class: text,\n values: lowercase uppercase capitalize\n ),\n \"white-space\": (\n property: white-space,\n class: text,\n values: (\n wrap: normal,\n nowrap: nowrap,\n )\n ),\n \"word-wrap\": (\n property: word-wrap word-break,\n class: text,\n values: (break: break-word),\n rtl: false\n ),\n // scss-docs-end utils-text\n // scss-docs-start utils-color\n \"color\": (\n property: color,\n class: text,\n values: map-merge(\n $theme-colors,\n (\n \"white\": $white,\n \"body\": $body-color,\n \"muted\": $text-muted,\n \"black-50\": rgba($black, .5),\n \"white-50\": rgba($white, .5),\n \"reset\": inherit,\n )\n )\n ),\n // scss-docs-end utils-color\n // scss-docs-start utils-bg-color\n \"background-color\": (\n property: background-color,\n class: bg,\n values: map-merge(\n $theme-colors,\n (\n \"body\": $body-bg,\n \"white\": $white,\n \"transparent\": transparent\n )\n )\n ),\n // scss-docs-end utils-bg-color\n \"gradient\": (\n property: background-image,\n class: bg,\n values: (gradient: var(--#{$variable-prefix}gradient))\n ),\n // scss-docs-start utils-interaction\n \"user-select\": (\n property: user-select,\n values: all auto none\n ),\n \"pointer-events\": (\n property: pointer-events,\n class: pe,\n values: none auto,\n ),\n // scss-docs-end utils-interaction\n // scss-docs-start utils-border-radius\n \"rounded\": (\n property: border-radius,\n class: rounded,\n values: (\n null: $border-radius,\n 0: 0,\n 1: $border-radius-sm,\n 2: $border-radius,\n 3: $border-radius-lg,\n circle: 50%,\n pill: $border-radius-pill\n )\n ),\n \"rounded-top\": (\n property: border-top-left-radius border-top-right-radius,\n class: rounded-top,\n values: (null: $border-radius)\n ),\n \"rounded-end\": (\n property: border-top-right-radius border-bottom-right-radius,\n class: rounded-end,\n values: (null: $border-radius)\n ),\n \"rounded-bottom\": (\n property: border-bottom-right-radius border-bottom-left-radius,\n class: rounded-bottom,\n values: (null: $border-radius)\n ),\n \"rounded-start\": (\n property: border-bottom-left-radius border-top-left-radius,\n class: rounded-start,\n values: (null: $border-radius)\n ),\n // scss-docs-end utils-border-radius\n // scss-docs-start utils-visibility\n \"visibility\": (\n property: visibility,\n class: null,\n values: (\n visible: visible,\n invisible: hidden,\n )\n )\n // scss-docs-end utils-visibility\n ),\n $utilities\n);\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n font-size: $font-size-root;\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: $body-text-align;\n background-color: $body-bg; // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` + +

+ + + + +
+ + + +
+
+
+ query($queryPelanggan); + $totalPelanggan = ($resultPelanggan->num_rows > 0) ? $resultPelanggan->fetch_assoc()['total_pelanggan'] : 0; + + $queryPesanan = "SELECT COUNT(*) AS total_pesanan FROM pemesanan"; + $resultPesanan = $conn->query($queryPesanan); + $totalPesanan = ($resultPesanan->num_rows > 0) ? $resultPesanan->fetch_assoc()['total_pesanan'] : 0; + + $queryPendapatan = "SELECT SUM(harga) AS total_pendapatan FROM pemesanan"; + $resultPendapatan = $conn->query($queryPendapatan); + $totalPendapatan = ($resultPendapatan->num_rows > 0) ? $resultPendapatan->fetch_assoc()['total_pendapatan'] : 0; + + $formattedHarga = number_format($totalPendapatan, 2, ',', '.'); + ?> +
+
+
+

Pelanggan

+

+
+
+

Pemesanan

+

+
+
+

Pendapatan

+

Rp.

+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+

Pemesanan Tahun Ini

+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+

Driver

+
+
+ + + + + + + + + num_rows > 0) { + // Loop untuk menampilkan data + while ($row = $res->fetch_assoc()) { + echo ""; + echo ""; + $status = $row["status"]; + $class = ''; + + if ($status == 'active') { + $class = 'badge-opacity-success'; + } elseif ($status == 'non_active') { + $class = 'badge-opacity-warning'; + } + echo ""; + echo ""; + } + } else { + // Jika tidak ada data + echo ""; + } + ?> + +
NamaStatus
" . $row["nama_lengkap"] . "
$status
Belum Ada Pesanan Hari ini
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+

Pesanan Terbaru

+ +
+
+ + + + + + + + + + + + + num_rows > 0) { + // Loop untuk menampilkan data + while ($row = $result->fetch_assoc()) { + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $status = $row["status"]; + $class = ''; + + if ($status == 'Menunggu') { + $class = 'badge-opacity-warning'; + } elseif ($status == 'Selesai') { + $class = 'badge-opacity-success'; + } elseif ($status == 'Gagal') { + $class = 'badge-opacity-danger'; + } + echo ""; + echo ""; + } + } else { + // Jika tidak ada data + echo ""; + } + ?> + +
NamaKota AsalKota TujuanTanggal KeberangkatanHargaStatus
" . $row["nama_lengkap"] . "" . $row["kota_asal"] . "" . $row["kota_tujuan"] . "" . $row["tanggal_berangkat"] . "" . $row["harga"] . "
$status
Belum Ada Pesanan Hari ini
+
+
+
+
+ +
+
+ + + + +
+
+ Copyright © 2021. All rights reserved. +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TugasAkhir/driver.php b/TugasAkhir/driver.php new file mode 100644 index 0000000..3a7e4c4 --- /dev/null +++ b/TugasAkhir/driver.php @@ -0,0 +1,406 @@ +query($sql) === TRUE) { + $isSuccess = true; + } + } +} + +session_start(); + +// Periksa apakah pengguna telah login +if (!isset($_SESSION["username"])) { + header("Location: login.php"); // Jika tidak ada sesi username, redirect ke halaman login + exit; +} + +// Menampilkan pesan jika ada +if (isset($_SESSION['pesan'])) { + echo "

{$_SESSION['pesan']}

"; + unset($_SESSION['pesan']); // Hapus pesan setelah ditampilkan +} + +// Mengambil username dari sesi +$username = $_SESSION["username"]; + +?> + + + + + + + + + Star Admin2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+
+

Data Sopir

+
+ + + + + + + + + + + + + + query($sql); + if ($result->num_rows > 0) { + while ($row = $result->fetch_assoc()) { + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + // Modal Konfirmasi Hapus + echo ""; + //modal aktiv + + echo ""; + } + } else { + echo ""; + } + ?> + +
Nama LengkapUsernameNo. SIMNo. TelpAlamatStatusAction
" . $row["nama_lengkap"] . "" . $row["username"] . "" . $row["no_SIM"] . "" . $row["notelp"] . "" . $row["alamat"] . "" . $row["status"] . ""; + // echo "" . " "; + echo "" . " "; + // Tombol Konfirmasi Aktifkan + if ( + $row["status"] == "non_active" + ) { + echo ""; + } else { + echo ""; + } + echo "
Tidak ada data sopir.
+ + +
+
+
+
+
+
+ + + + +
+
+ Copyright © 2021. All rights reserved. +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TugasAkhir/edit-mobil.php b/TugasAkhir/edit-mobil.php new file mode 100644 index 0000000..43e2363 --- /dev/null +++ b/TugasAkhir/edit-mobil.php @@ -0,0 +1,340 @@ +query($query); + + // Periksa apakah data ditemukan + if ($result->num_rows > 0) { + $row = $result->fetch_assoc(); + $nama_mobil = $row['nama_mobil']; + $plat = $row['plat']; + } else { + // Redirect jika data tidak ditemukan + header("Location: mobil.php"); + exit; + } +} + +// Proses pengeditan data sopir +if ($_SERVER["REQUEST_METHOD"] == "POST") { + $nama_mobil = $_POST["nama_mobil"]; + $plat = $_POST["plat"]; + $id_mobil = $_POST["id_mobil"]; + // Jika tidak ada password baru, gunakan query UPDATE tanpa memperbarui password + $sql = "UPDATE mobil SET plat='$plat', nama_mobil='$nama_mobil' WHERE id_mobil='$id_mobil'"; + // Eksekusi query + if ($conn->query($sql) === TRUE) { + $isSuccess = true; + } +} + +// Pastikan koneksi terbuka +if ($conn->connect_error) { + die("Connection failed: " . $conn->connect_error); +} + +session_start(); + +// Periksa apakah pengguna telah login +if (!isset($_SESSION["username"])) { + header("Location: login.php"); // Jika tidak ada sesi username, redirect ke halaman login + exit; +} + +// Mengambil username dari sesi +$username = $_SESSION["username"]; + +// Redirect to driver.php when click cancel +if (isset($_POST['cancel'])) { + header('Location: mobil.php'); +} +?> + + + + + + + + + Star Admin2 + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+
+
+

Edit Mobil

+
+ +
+ + +
+
+ + +
+ + + +
+ + +
+
+
+
+
+ + + + +
+
+ Copyright © 2021. All rights reserved. +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TugasAkhir/edit-perjalanan.php b/TugasAkhir/edit-perjalanan.php new file mode 100644 index 0000000..132987e --- /dev/null +++ b/TugasAkhir/edit-perjalanan.php @@ -0,0 +1,472 @@ +query($query); + + // Periksa apakah data ditemukan + if ($result->num_rows > 0) { + $row = $result->fetch_assoc(); + $kotaasal = $row['kota_asal']; + $kotatujuan = $row['kota_tujuan']; + $waktu_keberangkatan = $row['waktu_keberangkatan']; + $harga = $row["harga"]; + $tanggal = $row["tanggal"]; + $status = $row["status"]; + $jumlah_penumpang = $row["jumlah_penumpang"]; + $nama_sopir = $row["nama_sopir"]; + $idSopir = $row["idSopir"]; + } else { + // Redirect jika data tidak ditemukan + header("Location: jurusan.php"); + exit; + } +} + +// Proses pengeditan data sopir +if ($_SERVER["REQUEST_METHOD"] == "POST") { + $id_perjalanan = $_POST["id_perjalanan"]; + $kotaasal = $_POST['kota_asal']; + $kotatujuan = $_POST['kota_tujuan']; + $waktu_keberangkatan = $_POST['waktu_keberangkatan']; + $harga = $_POST["harga"]; + $tanggal = $_POST["tanggal"]; + $status = $_POST["status"]; + $jumlah_penumpang = $_POST["jumlah_penumpang"]; + $id_sopir = $_POST["id_sopir"]; + $mobil_id = $_POST["mobil_id"]; + + $validasiSopir = "SELECT * FROM daftar_perjalanan + WHERE id_sopir = '$id_sopir' AND tanggal = '$tanggal' AND waktu_keberangkatan = '$waktu_keberangkatan' AND id_perjalanan != '$id_perjalanan'"; + + $validasiKendaraan = "SELECT * FROM daftar_perjalanan + WHERE mobil_id = '$mobil_id' AND tanggal = '$tanggal' AND waktu_keberangkatan = '$waktu_keberangkatan' AND id_perjalanan != '$id_perjalanan'"; + + $isSuccess = true; + if ($conn->query($validasiSopir)->num_rows > 0) { + $failedMessage = "Sopir telah ditugaskan pada tanggal $tanggal jam $waktu_keberangkatan"; + $isSuccess = false; + } + + + if ($conn->query($validasiKendaraan)->num_rows > 0) { + $failedMessage = "Mobil telah digunakan pada tanggal $tanggal jam $waktu_keberangkatan"; + $isSuccess = false; + } + + // Query UPDATE + $sql = "UPDATE daftar_perjalanan SET kota_asal='$kotaasal', kota_tujuan='$kotatujuan', waktu_keberangkatan='$waktu_keberangkatan', tanggal = '$tanggal', harga='$harga', status='$status',id_sopir='$id_sopir', mobil_id='$mobil_id', jumlah_penumpang='$jumlah_penumpang' WHERE id_perjalanan='$id_perjalanan'"; + + if ($isSuccess) { + // Eksekusi query + if ($conn->query($sql) === TRUE) { + $isSuccess = true; + } + } +} + +// Pastikan koneksi terbuka +if ($conn->connect_error) { + die("Connection failed: " . $conn->connect_error); +} + +session_start(); + +// Periksa apakah pengguna telah login +if (!isset($_SESSION["username"])) { + header("Location: login.php"); // Jika tidak ada sesi username, redirect ke halaman login + exit; +} + +// Mengambil username dari sesi +$username = $_SESSION["username"]; + +// Redirect to driver.php when click cancel +if (isset($_POST['cancel'])) { + header('Location: driver.php'); +} +?> + + + + + + + + + Star Admin2 + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+
+

Edit Daftar perjalanan

+
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ + +
+ + + +
+ + + + + + + + +
+
+
+
+
+ + + + +
+
+ Copyright © 2021. All rights reserved. +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TugasAkhir/edit-sopir.php b/TugasAkhir/edit-sopir.php new file mode 100644 index 0000000..4056924 --- /dev/null +++ b/TugasAkhir/edit-sopir.php @@ -0,0 +1,372 @@ +query($query); + + // Periksa apakah data ditemukan + if ($result->num_rows > 0) { + $row = $result->fetch_assoc(); + $nama_lengkap = $row['nama_lengkap']; + $username_sopir = $row['username']; + $password = $row['password']; + $no_SIM = $row['no_SIM']; + $notelp = $row['notelp']; + $alamat = $row['alamat']; + } else { + // Redirect jika data tidak ditemukan + header("Location: driver.php"); + exit; + } +} + +// Proses pengeditan data sopir +if ($_SERVER["REQUEST_METHOD"] == "POST") { + $id_sopir = $_POST["id_sopir"]; + $nama_lengkap = $_POST["nama_lengkap"]; + $username_sopir = $_POST["username_sopir"]; + $password = $_POST["password"]; + $no_SIM = $_POST["no_SIM"]; + $notelp = $_POST["notelp"]; + $alamat = $_POST["alamat"]; + + if (!empty($_POST["password"])) { + // Hash password baru sebelum menyimpannya + $password = password_hash($_POST["password"], PASSWORD_DEFAULT); + // Query UPDATE dengan kata sandi baru + $sql = "UPDATE sopir SET nama_lengkap='$nama_lengkap', username='$username_sopir', password='$password', no_SIM='$no_SIM', notelp='$notelp', alamat='$alamat' WHERE id_sopir='$id_sopir'"; + } else { + // Jika tidak ada password baru, gunakan query UPDATE tanpa memperbarui password + $sql = "UPDATE sopir SET nama_lengkap='$nama_lengkap', username='$username_sopir', no_SIM='$no_SIM', notelp='$notelp', alamat='$alamat' WHERE id_sopir='$id_sopir'"; + } + // Eksekusi query + if ($conn->query($sql) === TRUE) { + $isSuccess = true; + } +} + +// Pastikan koneksi terbuka +if ($conn->connect_error) { + die("Connection failed: " . $conn->connect_error); +} + +session_start(); + +// Periksa apakah pengguna telah login +if (!isset($_SESSION["username"])) { + header("Location: login.php"); // Jika tidak ada sesi username, redirect ke halaman login + exit; +} + +// Mengambil username dari sesi +$username = $_SESSION["username"]; + +// Redirect to driver.php when click cancel +if (isset($_POST['cancel'])) { + header('Location: driver.php'); +} +?> + + + + + + + + + Star Admin2 + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+
+

Tambah Sopir

+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+ + +
+ + +
+
+
+
+
+ + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TugasAkhir/fonts/Manrope/Manrope-Bold.eot b/TugasAkhir/fonts/Manrope/Manrope-Bold.eot new file mode 100644 index 0000000..eddfbf7 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Bold.eot differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Bold.ttf b/TugasAkhir/fonts/Manrope/Manrope-Bold.ttf new file mode 100644 index 0000000..8bbf0bd Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Bold.ttf differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Bold.woff b/TugasAkhir/fonts/Manrope/Manrope-Bold.woff new file mode 100644 index 0000000..e857590 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Bold.woff differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Bold.woff2 b/TugasAkhir/fonts/Manrope/Manrope-Bold.woff2 new file mode 100644 index 0000000..9560dc1 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Bold.woff2 differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.eot b/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.eot new file mode 100644 index 0000000..b97dd2a Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.eot differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.ttf b/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.ttf new file mode 100644 index 0000000..3f68dff Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.ttf differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.woff b/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.woff new file mode 100644 index 0000000..7c90bc1 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.woff differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.woff2 b/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.woff2 new file mode 100644 index 0000000..8fa500b Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-ExtraBold.woff2 differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.eot b/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.eot new file mode 100644 index 0000000..e36ae91 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.eot differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.ttf b/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.ttf new file mode 100644 index 0000000..9d21d77 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.ttf differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.woff b/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.woff new file mode 100644 index 0000000..4c86f53 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.woff differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.woff2 b/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.woff2 new file mode 100644 index 0000000..3be17f3 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-ExtraLight.woff2 differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Light.eot b/TugasAkhir/fonts/Manrope/Manrope-Light.eot new file mode 100644 index 0000000..100801d Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Light.eot differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Light.ttf b/TugasAkhir/fonts/Manrope/Manrope-Light.ttf new file mode 100644 index 0000000..f255257 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Light.ttf differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Light.woff b/TugasAkhir/fonts/Manrope/Manrope-Light.woff new file mode 100644 index 0000000..899c4ec Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Light.woff differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Light.woff2 b/TugasAkhir/fonts/Manrope/Manrope-Light.woff2 new file mode 100644 index 0000000..e16488d Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Light.woff2 differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Medium.eot b/TugasAkhir/fonts/Manrope/Manrope-Medium.eot new file mode 100644 index 0000000..5e760c3 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Medium.eot differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Medium.ttf b/TugasAkhir/fonts/Manrope/Manrope-Medium.ttf new file mode 100644 index 0000000..c73d774 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Medium.ttf differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Medium.woff b/TugasAkhir/fonts/Manrope/Manrope-Medium.woff new file mode 100644 index 0000000..ad60685 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Medium.woff differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Medium.woff2 b/TugasAkhir/fonts/Manrope/Manrope-Medium.woff2 new file mode 100644 index 0000000..41d3787 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Medium.woff2 differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Regular.eot b/TugasAkhir/fonts/Manrope/Manrope-Regular.eot new file mode 100644 index 0000000..4428509 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Regular.eot differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Regular.ttf b/TugasAkhir/fonts/Manrope/Manrope-Regular.ttf new file mode 100644 index 0000000..c02b01b Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Regular.ttf differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Regular.woff b/TugasAkhir/fonts/Manrope/Manrope-Regular.woff new file mode 100644 index 0000000..2ba8b51 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Regular.woff differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-Regular.woff2 b/TugasAkhir/fonts/Manrope/Manrope-Regular.woff2 new file mode 100644 index 0000000..7ddc5f9 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-Regular.woff2 differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-SemiBold.eot b/TugasAkhir/fonts/Manrope/Manrope-SemiBold.eot new file mode 100644 index 0000000..c8b7cc1 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-SemiBold.eot differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-SemiBold.ttf b/TugasAkhir/fonts/Manrope/Manrope-SemiBold.ttf new file mode 100644 index 0000000..30ee031 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-SemiBold.ttf differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-SemiBold.woff b/TugasAkhir/fonts/Manrope/Manrope-SemiBold.woff new file mode 100644 index 0000000..622b092 Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-SemiBold.woff differ diff --git a/TugasAkhir/fonts/Manrope/Manrope-SemiBold.woff2 b/TugasAkhir/fonts/Manrope/Manrope-SemiBold.woff2 new file mode 100644 index 0000000..c63ff7a Binary files /dev/null and b/TugasAkhir/fonts/Manrope/Manrope-SemiBold.woff2 differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Black.eot b/TugasAkhir/fonts/Nunito/Nunito-Black.eot new file mode 100644 index 0000000..fab479e Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Black.eot differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Black.ttf b/TugasAkhir/fonts/Nunito/Nunito-Black.ttf new file mode 100644 index 0000000..3822b87 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Black.ttf differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Black.woff b/TugasAkhir/fonts/Nunito/Nunito-Black.woff new file mode 100644 index 0000000..220dbd9 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Black.woff differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Black.woff2 b/TugasAkhir/fonts/Nunito/Nunito-Black.woff2 new file mode 100644 index 0000000..095855c Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Black.woff2 differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Bold.eot b/TugasAkhir/fonts/Nunito/Nunito-Bold.eot new file mode 100644 index 0000000..11eebdd Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Bold.eot differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Bold.ttf b/TugasAkhir/fonts/Nunito/Nunito-Bold.ttf new file mode 100644 index 0000000..fa799b0 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Bold.ttf differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Bold.woff b/TugasAkhir/fonts/Nunito/Nunito-Bold.woff new file mode 100644 index 0000000..88e559a Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Bold.woff differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Bold.woff2 b/TugasAkhir/fonts/Nunito/Nunito-Bold.woff2 new file mode 100644 index 0000000..ad847f4 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Bold.woff2 differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.eot b/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.eot new file mode 100644 index 0000000..736d2cb Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.eot differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.ttf b/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.ttf new file mode 100644 index 0000000..2f6d6a7 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.ttf differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.woff b/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.woff new file mode 100644 index 0000000..3b456a6 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.woff differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.woff2 b/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.woff2 new file mode 100644 index 0000000..05cfcda Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-ExtraBold.woff2 differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.eot b/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.eot new file mode 100644 index 0000000..ead021f Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.eot differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.ttf b/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.ttf new file mode 100644 index 0000000..dfabf94 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.ttf differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.woff b/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.woff new file mode 100644 index 0000000..86b4577 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.woff differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.woff2 b/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.woff2 new file mode 100644 index 0000000..19c6786 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-ExtraLight.woff2 differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Italic.eot b/TugasAkhir/fonts/Nunito/Nunito-Italic.eot new file mode 100644 index 0000000..0ec7895 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Italic.eot differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Italic.ttf b/TugasAkhir/fonts/Nunito/Nunito-Italic.ttf new file mode 100644 index 0000000..0195b31 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Italic.ttf differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Italic.woff b/TugasAkhir/fonts/Nunito/Nunito-Italic.woff new file mode 100644 index 0000000..95ece90 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Italic.woff differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Italic.woff2 b/TugasAkhir/fonts/Nunito/Nunito-Italic.woff2 new file mode 100644 index 0000000..4d5f9ff Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Italic.woff2 differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Light.eot b/TugasAkhir/fonts/Nunito/Nunito-Light.eot new file mode 100644 index 0000000..2af128b Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Light.eot differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Light.ttf b/TugasAkhir/fonts/Nunito/Nunito-Light.ttf new file mode 100644 index 0000000..0ecfb0d Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Light.ttf differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Light.woff b/TugasAkhir/fonts/Nunito/Nunito-Light.woff new file mode 100644 index 0000000..be0c921 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Light.woff differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Light.woff2 b/TugasAkhir/fonts/Nunito/Nunito-Light.woff2 new file mode 100644 index 0000000..2494c8f Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Light.woff2 differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Regular.eot b/TugasAkhir/fonts/Nunito/Nunito-Regular.eot new file mode 100644 index 0000000..97b8514 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Regular.eot differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Regular.ttf b/TugasAkhir/fonts/Nunito/Nunito-Regular.ttf new file mode 100644 index 0000000..307ae01 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Regular.ttf differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Regular.woff b/TugasAkhir/fonts/Nunito/Nunito-Regular.woff new file mode 100644 index 0000000..b49967e Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Regular.woff differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-Regular.woff2 b/TugasAkhir/fonts/Nunito/Nunito-Regular.woff2 new file mode 100644 index 0000000..afcbda2 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-Regular.woff2 differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-SemiBold.eot b/TugasAkhir/fonts/Nunito/Nunito-SemiBold.eot new file mode 100644 index 0000000..a2ea942 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-SemiBold.eot differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-SemiBold.ttf b/TugasAkhir/fonts/Nunito/Nunito-SemiBold.ttf new file mode 100644 index 0000000..dca9105 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-SemiBold.ttf differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-SemiBold.woff b/TugasAkhir/fonts/Nunito/Nunito-SemiBold.woff new file mode 100644 index 0000000..a22ea79 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-SemiBold.woff differ diff --git a/TugasAkhir/fonts/Nunito/Nunito-SemiBold.woff2 b/TugasAkhir/fonts/Nunito/Nunito-SemiBold.woff2 new file mode 100644 index 0000000..0f41dd9 Binary files /dev/null and b/TugasAkhir/fonts/Nunito/Nunito-SemiBold.woff2 differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Black.eot b/TugasAkhir/fonts/Roboto/Roboto-Black.eot new file mode 100644 index 0000000..cd571fd Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Black.eot differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Black.ttf b/TugasAkhir/fonts/Roboto/Roboto-Black.ttf new file mode 100644 index 0000000..144abcd Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Black.ttf differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Black.woff b/TugasAkhir/fonts/Roboto/Roboto-Black.woff new file mode 100644 index 0000000..d77f5a1 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Black.woff differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Black.woff2 b/TugasAkhir/fonts/Roboto/Roboto-Black.woff2 new file mode 100644 index 0000000..8dff3b1 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Black.woff2 differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Bold.eot b/TugasAkhir/fonts/Roboto/Roboto-Bold.eot new file mode 100644 index 0000000..14ad9ae Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Bold.eot differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Bold.ttf b/TugasAkhir/fonts/Roboto/Roboto-Bold.ttf new file mode 100644 index 0000000..0388c50 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Bold.ttf differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Bold.woff b/TugasAkhir/fonts/Roboto/Roboto-Bold.woff new file mode 100644 index 0000000..51f1e89 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Bold.woff differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Bold.woff2 b/TugasAkhir/fonts/Roboto/Roboto-Bold.woff2 new file mode 100644 index 0000000..8d1ec3a Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Bold.woff2 differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Light.eot b/TugasAkhir/fonts/Roboto/Roboto-Light.eot new file mode 100644 index 0000000..3d50d57 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Light.eot differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Light.ttf b/TugasAkhir/fonts/Roboto/Roboto-Light.ttf new file mode 100644 index 0000000..3a9bdc6 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Light.ttf differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Light.woff b/TugasAkhir/fonts/Roboto/Roboto-Light.woff new file mode 100644 index 0000000..eec3617 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Light.woff differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Light.woff2 b/TugasAkhir/fonts/Roboto/Roboto-Light.woff2 new file mode 100644 index 0000000..0e0efd0 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Light.woff2 differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Medium.eot b/TugasAkhir/fonts/Roboto/Roboto-Medium.eot new file mode 100644 index 0000000..0f60b5e Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Medium.eot differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Medium.ttf b/TugasAkhir/fonts/Roboto/Roboto-Medium.ttf new file mode 100644 index 0000000..09f51e2 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Medium.ttf differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Medium.woff b/TugasAkhir/fonts/Roboto/Roboto-Medium.woff new file mode 100644 index 0000000..b4f0629 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Medium.woff differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Medium.woff2 b/TugasAkhir/fonts/Roboto/Roboto-Medium.woff2 new file mode 100644 index 0000000..02bf764 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Medium.woff2 differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Regular.eot b/TugasAkhir/fonts/Roboto/Roboto-Regular.eot new file mode 100644 index 0000000..2f61547 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Regular.eot differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Regular.ttf b/TugasAkhir/fonts/Roboto/Roboto-Regular.ttf new file mode 100644 index 0000000..28e2c02 Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Regular.ttf differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Regular.woff b/TugasAkhir/fonts/Roboto/Roboto-Regular.woff new file mode 100644 index 0000000..b070d8e Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Regular.woff differ diff --git a/TugasAkhir/fonts/Roboto/Roboto-Regular.woff2 b/TugasAkhir/fonts/Roboto/Roboto-Regular.woff2 new file mode 100644 index 0000000..30370cf Binary files /dev/null and b/TugasAkhir/fonts/Roboto/Roboto-Regular.woff2 differ diff --git a/TugasAkhir/get_username.php b/TugasAkhir/get_username.php new file mode 100644 index 0000000..4cc22cc --- /dev/null +++ b/TugasAkhir/get_username.php @@ -0,0 +1,18 @@ + $username]); +} else { + // Jika pengguna belum login, berikan respons kosong atau sesuai kebutuhan + header('Content-Type: application/json'); + echo json_encode(['username' => null]); +} +?> diff --git a/TugasAkhir/img/WhatsApp Image 2023-10-19 at 15.31.48.jpeg b/TugasAkhir/img/WhatsApp Image 2023-10-19 at 15.31.48.jpeg new file mode 100644 index 0000000..c61932d Binary files /dev/null and b/TugasAkhir/img/WhatsApp Image 2023-10-19 at 15.31.48.jpeg differ diff --git a/TugasAkhir/img/auth/lockscreen-bg.jpg b/TugasAkhir/img/auth/lockscreen-bg.jpg new file mode 100644 index 0000000..4f2735f Binary files /dev/null and b/TugasAkhir/img/auth/lockscreen-bg.jpg differ diff --git a/TugasAkhir/img/auth/login-bg.jpg b/TugasAkhir/img/auth/login-bg.jpg new file mode 100644 index 0000000..2dab271 Binary files /dev/null and b/TugasAkhir/img/auth/login-bg.jpg differ diff --git a/TugasAkhir/img/auth/register-bg.jpg b/TugasAkhir/img/auth/register-bg.jpg new file mode 100644 index 0000000..1605e89 Binary files /dev/null and b/TugasAkhir/img/auth/register-bg.jpg differ diff --git a/TugasAkhir/img/dashboard/banner_bg.jpg b/TugasAkhir/img/dashboard/banner_bg.jpg new file mode 100644 index 0000000..d5f59ec Binary files /dev/null and b/TugasAkhir/img/dashboard/banner_bg.jpg differ diff --git a/TugasAkhir/img/dashboard/banner_img.png b/TugasAkhir/img/dashboard/banner_img.png new file mode 100644 index 0000000..3412de2 Binary files /dev/null and b/TugasAkhir/img/dashboard/banner_img.png differ diff --git a/TugasAkhir/img/dashboard/darkBG.png b/TugasAkhir/img/dashboard/darkBG.png new file mode 100644 index 0000000..ff81e81 Binary files /dev/null and b/TugasAkhir/img/dashboard/darkBG.png differ diff --git a/TugasAkhir/img/dashboard/img_1.jpg b/TugasAkhir/img/dashboard/img_1.jpg new file mode 100644 index 0000000..0939562 Binary files /dev/null and b/TugasAkhir/img/dashboard/img_1.jpg differ diff --git a/TugasAkhir/img/dashboard/img_2.jpg b/TugasAkhir/img/dashboard/img_2.jpg new file mode 100644 index 0000000..4adb347 Binary files /dev/null and b/TugasAkhir/img/dashboard/img_2.jpg differ diff --git a/TugasAkhir/img/dashboard/img_3.jpg b/TugasAkhir/img/dashboard/img_3.jpg new file mode 100644 index 0000000..75d5c5a Binary files /dev/null and b/TugasAkhir/img/dashboard/img_3.jpg differ diff --git a/TugasAkhir/img/dashboard/profile-card.jpg b/TugasAkhir/img/dashboard/profile-card.jpg new file mode 100644 index 0000000..842e5bb Binary files /dev/null and b/TugasAkhir/img/dashboard/profile-card.jpg differ diff --git a/TugasAkhir/img/dashboard/progress-card-bg.jpg b/TugasAkhir/img/dashboard/progress-card-bg.jpg new file mode 100644 index 0000000..f92b853 Binary files /dev/null and b/TugasAkhir/img/dashboard/progress-card-bg.jpg differ diff --git a/TugasAkhir/img/dashboard/weather-card.jpg b/TugasAkhir/img/dashboard/weather-card.jpg new file mode 100644 index 0000000..850d715 Binary files /dev/null and b/TugasAkhir/img/dashboard/weather-card.jpg differ diff --git a/TugasAkhir/img/faces/face1.jpg b/TugasAkhir/img/faces/face1.jpg new file mode 100644 index 0000000..2a52b77 Binary files /dev/null and b/TugasAkhir/img/faces/face1.jpg differ diff --git a/TugasAkhir/img/faces/face10.jpg b/TugasAkhir/img/faces/face10.jpg new file mode 100644 index 0000000..3de1f91 Binary files /dev/null and b/TugasAkhir/img/faces/face10.jpg differ diff --git a/TugasAkhir/img/faces/face11.jpg b/TugasAkhir/img/faces/face11.jpg new file mode 100644 index 0000000..097e0e7 Binary files /dev/null and b/TugasAkhir/img/faces/face11.jpg differ diff --git a/TugasAkhir/img/faces/face12.jpg b/TugasAkhir/img/faces/face12.jpg new file mode 100644 index 0000000..a900dfc Binary files /dev/null and b/TugasAkhir/img/faces/face12.jpg differ diff --git a/TugasAkhir/img/faces/face13.jpg b/TugasAkhir/img/faces/face13.jpg new file mode 100644 index 0000000..8a5faa4 Binary files /dev/null and b/TugasAkhir/img/faces/face13.jpg differ diff --git a/TugasAkhir/img/faces/face14.jpg b/TugasAkhir/img/faces/face14.jpg new file mode 100644 index 0000000..a5764fc Binary files /dev/null and b/TugasAkhir/img/faces/face14.jpg differ diff --git a/TugasAkhir/img/faces/face15.jpg b/TugasAkhir/img/faces/face15.jpg new file mode 100644 index 0000000..e895153 Binary files /dev/null and b/TugasAkhir/img/faces/face15.jpg differ diff --git a/TugasAkhir/img/faces/face16.jpg b/TugasAkhir/img/faces/face16.jpg new file mode 100644 index 0000000..ec1a6cb Binary files /dev/null and b/TugasAkhir/img/faces/face16.jpg differ diff --git a/TugasAkhir/img/faces/face17.jpg b/TugasAkhir/img/faces/face17.jpg new file mode 100644 index 0000000..082d165 Binary files /dev/null and b/TugasAkhir/img/faces/face17.jpg differ diff --git a/TugasAkhir/img/faces/face18.jpg b/TugasAkhir/img/faces/face18.jpg new file mode 100644 index 0000000..259a288 Binary files /dev/null and b/TugasAkhir/img/faces/face18.jpg differ diff --git a/TugasAkhir/img/faces/face19.jpg b/TugasAkhir/img/faces/face19.jpg new file mode 100644 index 0000000..7c1486b Binary files /dev/null and b/TugasAkhir/img/faces/face19.jpg differ diff --git a/TugasAkhir/img/faces/face2.jpg b/TugasAkhir/img/faces/face2.jpg new file mode 100644 index 0000000..bde2780 Binary files /dev/null and b/TugasAkhir/img/faces/face2.jpg differ diff --git a/TugasAkhir/img/faces/face20.jpg b/TugasAkhir/img/faces/face20.jpg new file mode 100644 index 0000000..8cb74b3 Binary files /dev/null and b/TugasAkhir/img/faces/face20.jpg differ diff --git a/TugasAkhir/img/faces/face21.jpg b/TugasAkhir/img/faces/face21.jpg new file mode 100644 index 0000000..452d233 Binary files /dev/null and b/TugasAkhir/img/faces/face21.jpg differ diff --git a/TugasAkhir/img/faces/face22.jpg b/TugasAkhir/img/faces/face22.jpg new file mode 100644 index 0000000..929a146 Binary files /dev/null and b/TugasAkhir/img/faces/face22.jpg differ diff --git a/TugasAkhir/img/faces/face23.jpg b/TugasAkhir/img/faces/face23.jpg new file mode 100644 index 0000000..c2b5169 Binary files /dev/null and b/TugasAkhir/img/faces/face23.jpg differ diff --git a/TugasAkhir/img/faces/face24.jpg b/TugasAkhir/img/faces/face24.jpg new file mode 100644 index 0000000..f3dcc1f Binary files /dev/null and b/TugasAkhir/img/faces/face24.jpg differ diff --git a/TugasAkhir/img/faces/face25.jpg b/TugasAkhir/img/faces/face25.jpg new file mode 100644 index 0000000..722d502 Binary files /dev/null and b/TugasAkhir/img/faces/face25.jpg differ diff --git a/TugasAkhir/img/faces/face26.jpg b/TugasAkhir/img/faces/face26.jpg new file mode 100644 index 0000000..69ef971 Binary files /dev/null and b/TugasAkhir/img/faces/face26.jpg differ diff --git a/TugasAkhir/img/faces/face27.jpg b/TugasAkhir/img/faces/face27.jpg new file mode 100644 index 0000000..48faade Binary files /dev/null and b/TugasAkhir/img/faces/face27.jpg differ diff --git a/TugasAkhir/img/faces/face3.jpg b/TugasAkhir/img/faces/face3.jpg new file mode 100644 index 0000000..6a03b88 Binary files /dev/null and b/TugasAkhir/img/faces/face3.jpg differ diff --git a/TugasAkhir/img/faces/face4.jpg b/TugasAkhir/img/faces/face4.jpg new file mode 100644 index 0000000..212bc42 Binary files /dev/null and b/TugasAkhir/img/faces/face4.jpg differ diff --git a/TugasAkhir/img/faces/face5.jpg b/TugasAkhir/img/faces/face5.jpg new file mode 100644 index 0000000..2511bd7 Binary files /dev/null and b/TugasAkhir/img/faces/face5.jpg differ diff --git a/TugasAkhir/img/faces/face6.jpg b/TugasAkhir/img/faces/face6.jpg new file mode 100644 index 0000000..cfe94a9 Binary files /dev/null and b/TugasAkhir/img/faces/face6.jpg differ diff --git a/TugasAkhir/img/faces/face7.jpg b/TugasAkhir/img/faces/face7.jpg new file mode 100644 index 0000000..0ddc2b5 Binary files /dev/null and b/TugasAkhir/img/faces/face7.jpg differ diff --git a/TugasAkhir/img/faces/face8.jpg b/TugasAkhir/img/faces/face8.jpg new file mode 100644 index 0000000..aceb9e9 Binary files /dev/null and b/TugasAkhir/img/faces/face8.jpg differ diff --git a/TugasAkhir/img/faces/face9.jpg b/TugasAkhir/img/faces/face9.jpg new file mode 100644 index 0000000..61173da Binary files /dev/null and b/TugasAkhir/img/faces/face9.jpg differ diff --git a/TugasAkhir/img/faces/profile/profile.jpg b/TugasAkhir/img/faces/profile/profile.jpg new file mode 100644 index 0000000..416b5cb Binary files /dev/null and b/TugasAkhir/img/faces/profile/profile.jpg differ diff --git a/TugasAkhir/img/favicon.png b/TugasAkhir/img/favicon.png new file mode 100644 index 0000000..e3686ee Binary files /dev/null and b/TugasAkhir/img/favicon.png differ diff --git a/TugasAkhir/img/file-icons/128/001-interface-1.png b/TugasAkhir/img/file-icons/128/001-interface-1.png new file mode 100644 index 0000000..fd05b6e Binary files /dev/null and b/TugasAkhir/img/file-icons/128/001-interface-1.png differ diff --git a/TugasAkhir/img/file-icons/128/002-tool.png b/TugasAkhir/img/file-icons/128/002-tool.png new file mode 100644 index 0000000..998f361 Binary files /dev/null and b/TugasAkhir/img/file-icons/128/002-tool.png differ diff --git a/TugasAkhir/img/file-icons/128/003-interface.png b/TugasAkhir/img/file-icons/128/003-interface.png new file mode 100644 index 0000000..f29e769 Binary files /dev/null and b/TugasAkhir/img/file-icons/128/003-interface.png differ diff --git a/TugasAkhir/img/file-icons/128/004-folder-1.png b/TugasAkhir/img/file-icons/128/004-folder-1.png new file mode 100644 index 0000000..8bf92a9 Binary files /dev/null and b/TugasAkhir/img/file-icons/128/004-folder-1.png differ diff --git a/TugasAkhir/img/file-icons/128/005-database.png b/TugasAkhir/img/file-icons/128/005-database.png new file mode 100644 index 0000000..bef497e Binary files /dev/null and b/TugasAkhir/img/file-icons/128/005-database.png differ diff --git a/TugasAkhir/img/file-icons/128/006-record.png b/TugasAkhir/img/file-icons/128/006-record.png new file mode 100644 index 0000000..882763c Binary files /dev/null and b/TugasAkhir/img/file-icons/128/006-record.png differ diff --git a/TugasAkhir/img/file-icons/128/007-folder.png b/TugasAkhir/img/file-icons/128/007-folder.png new file mode 100644 index 0000000..3b0a5b4 Binary files /dev/null and b/TugasAkhir/img/file-icons/128/007-folder.png differ diff --git a/TugasAkhir/img/file-icons/128/008-archive.png b/TugasAkhir/img/file-icons/128/008-archive.png new file mode 100644 index 0000000..cab121f Binary files /dev/null and b/TugasAkhir/img/file-icons/128/008-archive.png differ diff --git a/TugasAkhir/img/file-icons/256/001-interface-1.png b/TugasAkhir/img/file-icons/256/001-interface-1.png new file mode 100644 index 0000000..90c34f5 Binary files /dev/null and b/TugasAkhir/img/file-icons/256/001-interface-1.png differ diff --git a/TugasAkhir/img/file-icons/256/002-tool.png b/TugasAkhir/img/file-icons/256/002-tool.png new file mode 100644 index 0000000..1568d75 Binary files /dev/null and b/TugasAkhir/img/file-icons/256/002-tool.png differ diff --git a/TugasAkhir/img/file-icons/256/003-interface.png b/TugasAkhir/img/file-icons/256/003-interface.png new file mode 100644 index 0000000..e5789f0 Binary files /dev/null and b/TugasAkhir/img/file-icons/256/003-interface.png differ diff --git a/TugasAkhir/img/file-icons/256/004-folder-1.png b/TugasAkhir/img/file-icons/256/004-folder-1.png new file mode 100644 index 0000000..de0b731 Binary files /dev/null and b/TugasAkhir/img/file-icons/256/004-folder-1.png differ diff --git a/TugasAkhir/img/file-icons/256/005-database.png b/TugasAkhir/img/file-icons/256/005-database.png new file mode 100644 index 0000000..2cd7fdb Binary files /dev/null and b/TugasAkhir/img/file-icons/256/005-database.png differ diff --git a/TugasAkhir/img/file-icons/256/006-record.png b/TugasAkhir/img/file-icons/256/006-record.png new file mode 100644 index 0000000..af28d26 Binary files /dev/null and b/TugasAkhir/img/file-icons/256/006-record.png differ diff --git a/TugasAkhir/img/file-icons/256/007-folder.png b/TugasAkhir/img/file-icons/256/007-folder.png new file mode 100644 index 0000000..622fe66 Binary files /dev/null and b/TugasAkhir/img/file-icons/256/007-folder.png differ diff --git a/TugasAkhir/img/file-icons/256/008-archive.png b/TugasAkhir/img/file-icons/256/008-archive.png new file mode 100644 index 0000000..dd9b95d Binary files /dev/null and b/TugasAkhir/img/file-icons/256/008-archive.png differ diff --git a/TugasAkhir/img/file-icons/512/001-interface-1.png b/TugasAkhir/img/file-icons/512/001-interface-1.png new file mode 100644 index 0000000..898cdb0 Binary files /dev/null and b/TugasAkhir/img/file-icons/512/001-interface-1.png differ diff --git a/TugasAkhir/img/file-icons/512/002-tool.png b/TugasAkhir/img/file-icons/512/002-tool.png new file mode 100644 index 0000000..f9f6b70 Binary files /dev/null and b/TugasAkhir/img/file-icons/512/002-tool.png differ diff --git a/TugasAkhir/img/file-icons/512/003-interface.png b/TugasAkhir/img/file-icons/512/003-interface.png new file mode 100644 index 0000000..b819ea0 Binary files /dev/null and b/TugasAkhir/img/file-icons/512/003-interface.png differ diff --git a/TugasAkhir/img/file-icons/512/004-folder-1.png b/TugasAkhir/img/file-icons/512/004-folder-1.png new file mode 100644 index 0000000..672ced0 Binary files /dev/null and b/TugasAkhir/img/file-icons/512/004-folder-1.png differ diff --git a/TugasAkhir/img/file-icons/512/005-database.png b/TugasAkhir/img/file-icons/512/005-database.png new file mode 100644 index 0000000..04ffb49 Binary files /dev/null and b/TugasAkhir/img/file-icons/512/005-database.png differ diff --git a/TugasAkhir/img/file-icons/512/006-record.png b/TugasAkhir/img/file-icons/512/006-record.png new file mode 100644 index 0000000..0f1e47d Binary files /dev/null and b/TugasAkhir/img/file-icons/512/006-record.png differ diff --git a/TugasAkhir/img/file-icons/512/007-folder.png b/TugasAkhir/img/file-icons/512/007-folder.png new file mode 100644 index 0000000..bed8cde Binary files /dev/null and b/TugasAkhir/img/file-icons/512/007-folder.png differ diff --git a/TugasAkhir/img/file-icons/512/008-archive.png b/TugasAkhir/img/file-icons/512/008-archive.png new file mode 100644 index 0000000..614434a Binary files /dev/null and b/TugasAkhir/img/file-icons/512/008-archive.png differ diff --git a/TugasAkhir/img/file-icons/64/001-interface-1.png b/TugasAkhir/img/file-icons/64/001-interface-1.png new file mode 100644 index 0000000..5e55e27 Binary files /dev/null and b/TugasAkhir/img/file-icons/64/001-interface-1.png differ diff --git a/TugasAkhir/img/file-icons/64/002-tool.png b/TugasAkhir/img/file-icons/64/002-tool.png new file mode 100644 index 0000000..1d8aaf7 Binary files /dev/null and b/TugasAkhir/img/file-icons/64/002-tool.png differ diff --git a/TugasAkhir/img/file-icons/64/003-interface.png b/TugasAkhir/img/file-icons/64/003-interface.png new file mode 100644 index 0000000..cc57def Binary files /dev/null and b/TugasAkhir/img/file-icons/64/003-interface.png differ diff --git a/TugasAkhir/img/file-icons/64/004-folder-1.png b/TugasAkhir/img/file-icons/64/004-folder-1.png new file mode 100644 index 0000000..70ea76c Binary files /dev/null and b/TugasAkhir/img/file-icons/64/004-folder-1.png differ diff --git a/TugasAkhir/img/file-icons/64/005-database.png b/TugasAkhir/img/file-icons/64/005-database.png new file mode 100644 index 0000000..19e7cec Binary files /dev/null and b/TugasAkhir/img/file-icons/64/005-database.png differ diff --git a/TugasAkhir/img/file-icons/64/006-record.png b/TugasAkhir/img/file-icons/64/006-record.png new file mode 100644 index 0000000..a965c62 Binary files /dev/null and b/TugasAkhir/img/file-icons/64/006-record.png differ diff --git a/TugasAkhir/img/file-icons/64/007-folder.png b/TugasAkhir/img/file-icons/64/007-folder.png new file mode 100644 index 0000000..b6c99d6 Binary files /dev/null and b/TugasAkhir/img/file-icons/64/007-folder.png differ diff --git a/TugasAkhir/img/file-icons/64/008-archive.png b/TugasAkhir/img/file-icons/64/008-archive.png new file mode 100644 index 0000000..3ac3e91 Binary files /dev/null and b/TugasAkhir/img/file-icons/64/008-archive.png differ diff --git a/TugasAkhir/img/lightbox/play-button.png b/TugasAkhir/img/lightbox/play-button.png new file mode 100644 index 0000000..30fe648 Binary files /dev/null and b/TugasAkhir/img/lightbox/play-button.png differ diff --git a/TugasAkhir/img/lightbox/thumb-v-v-1.jpg b/TugasAkhir/img/lightbox/thumb-v-v-1.jpg new file mode 100644 index 0000000..9cd2ff3 Binary files /dev/null and b/TugasAkhir/img/lightbox/thumb-v-v-1.jpg differ diff --git a/TugasAkhir/img/lightbox/thumb-v-v-2.jpg b/TugasAkhir/img/lightbox/thumb-v-v-2.jpg new file mode 100644 index 0000000..e318fa6 Binary files /dev/null and b/TugasAkhir/img/lightbox/thumb-v-v-2.jpg differ diff --git a/TugasAkhir/img/lightbox/thumb-v-y-1.jpg b/TugasAkhir/img/lightbox/thumb-v-y-1.jpg new file mode 100644 index 0000000..6540cbd Binary files /dev/null and b/TugasAkhir/img/lightbox/thumb-v-y-1.jpg differ diff --git a/TugasAkhir/img/lightbox/thumb-v-y-2.jpg b/TugasAkhir/img/lightbox/thumb-v-y-2.jpg new file mode 100644 index 0000000..45ff03b Binary files /dev/null and b/TugasAkhir/img/lightbox/thumb-v-y-2.jpg differ diff --git a/TugasAkhir/img/logo-light.svg b/TugasAkhir/img/logo-light.svg new file mode 100644 index 0000000..5174869 --- /dev/null +++ b/TugasAkhir/img/logo-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/TugasAkhir/img/logo-mini-reverse.svg b/TugasAkhir/img/logo-mini-reverse.svg new file mode 100644 index 0000000..cbfd3fb --- /dev/null +++ b/TugasAkhir/img/logo-mini-reverse.svg @@ -0,0 +1,4 @@ + + + + diff --git a/TugasAkhir/img/logo-mini.svg b/TugasAkhir/img/logo-mini.svg new file mode 100644 index 0000000..cb690bf --- /dev/null +++ b/TugasAkhir/img/logo-mini.svg @@ -0,0 +1,4 @@ + + + + diff --git a/TugasAkhir/img/logo.png b/TugasAkhir/img/logo.png new file mode 100644 index 0000000..78a1ff9 Binary files /dev/null and b/TugasAkhir/img/logo.png differ diff --git a/TugasAkhir/img/logo.svg b/TugasAkhir/img/logo.svg new file mode 100644 index 0000000..1cf7f38 --- /dev/null +++ b/TugasAkhir/img/logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/TugasAkhir/img/logopetta.png b/TugasAkhir/img/logopetta.png new file mode 100644 index 0000000..3020241 Binary files /dev/null and b/TugasAkhir/img/logopetta.png differ diff --git a/TugasAkhir/img/people.png b/TugasAkhir/img/people.png new file mode 100644 index 0000000..d1ecc7c Binary files /dev/null and b/TugasAkhir/img/people.png differ diff --git a/TugasAkhir/img/petta.png b/TugasAkhir/img/petta.png new file mode 100644 index 0000000..8062ee2 Binary files /dev/null and b/TugasAkhir/img/petta.png differ diff --git a/TugasAkhir/img/sprites/blue.png b/TugasAkhir/img/sprites/blue.png new file mode 100644 index 0000000..d5acf33 Binary files /dev/null and b/TugasAkhir/img/sprites/blue.png differ diff --git a/TugasAkhir/img/sprites/dark.png b/TugasAkhir/img/sprites/dark.png new file mode 100644 index 0000000..0255218 Binary files /dev/null and b/TugasAkhir/img/sprites/dark.png differ diff --git a/TugasAkhir/img/sprites/flag.png b/TugasAkhir/img/sprites/flag.png new file mode 100644 index 0000000..d0798b4 Binary files /dev/null and b/TugasAkhir/img/sprites/flag.png differ diff --git a/TugasAkhir/img/sprites/green.png b/TugasAkhir/img/sprites/green.png new file mode 100644 index 0000000..76a7db2 Binary files /dev/null and b/TugasAkhir/img/sprites/green.png differ diff --git a/TugasAkhir/img/sprites/jsgrid-icons.png b/TugasAkhir/img/sprites/jsgrid-icons.png new file mode 100644 index 0000000..69fbe19 Binary files /dev/null and b/TugasAkhir/img/sprites/jsgrid-icons.png differ diff --git a/TugasAkhir/img/sprites/red.png b/TugasAkhir/img/sprites/red.png new file mode 100644 index 0000000..2828424 Binary files /dev/null and b/TugasAkhir/img/sprites/red.png differ diff --git a/TugasAkhir/img/sprites/yellow.png b/TugasAkhir/img/sprites/yellow.png new file mode 100644 index 0000000..0fc6c5a Binary files /dev/null and b/TugasAkhir/img/sprites/yellow.png differ diff --git a/TugasAkhir/js/Chart.roundedBarCharts.js b/TugasAkhir/js/Chart.roundedBarCharts.js new file mode 100644 index 0000000..efbbeca --- /dev/null +++ b/TugasAkhir/js/Chart.roundedBarCharts.js @@ -0,0 +1,171 @@ +/* +* Rounded Rectangle Extension for Bar Charts and Horizontal Bar Charts +* Tested with Charts.js 2.7.0 +*/ +Chart.elements.Rectangle.prototype.draw = function() { + + var ctx = this._chart.ctx; + var vm = this._view; + var left, right, top, bottom, signX, signY, borderSkipped, radius; + var borderWidth = vm.borderWidth; + + // If radius is less than 0 or is large enough to cause drawing errors a max + // radius is imposed. If cornerRadius is not defined set it to 0. + var cornerRadius = this._chart.config.options.cornerRadius; + if(cornerRadius < 0){ cornerRadius = 0; } + if(typeof cornerRadius == 'undefined'){ cornerRadius = 0; } + + if (!vm.horizontal) { + // bar + left = vm.x - vm.width / 2; + right = vm.x + vm.width / 2; + top = vm.y; + bottom = vm.base; + signX = 1; + signY = bottom > top? 1: -1; + borderSkipped = vm.borderSkipped || 'bottom'; + } else { + // horizontal bar + left = vm.base; + right = vm.x; + top = vm.y - vm.height / 2; + bottom = vm.y + vm.height / 2; + signX = right > left? 1: -1; + signY = 1; + borderSkipped = vm.borderSkipped || 'left'; + } + + // Canvas doesn't allow us to stroke inside the width so we can + // adjust the sizes to fit if we're setting a stroke on the line + if (borderWidth) { + // borderWidth shold be less than bar width and bar height. + var barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom)); + borderWidth = borderWidth > barSize? barSize: borderWidth; + var halfStroke = borderWidth / 2; + // Adjust borderWidth when bar top position is near vm.base(zero). + var borderLeft = left + (borderSkipped !== 'left'? halfStroke * signX: 0); + var borderRight = right + (borderSkipped !== 'right'? -halfStroke * signX: 0); + var borderTop = top + (borderSkipped !== 'top'? halfStroke * signY: 0); + var borderBottom = bottom + (borderSkipped !== 'bottom'? -halfStroke * signY: 0); + // not become a vertical line? + if (borderLeft !== borderRight) { + top = borderTop; + bottom = borderBottom; + } + // not become a horizontal line? + if (borderTop !== borderBottom) { + left = borderLeft; + right = borderRight; + } + } + + ctx.beginPath(); + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = borderWidth; + + // Corner points, from bottom-left to bottom-right clockwise + // | 1 2 | + // | 0 3 | + var corners = [ + [left, bottom], + [left, top], + [right, top], + [right, bottom] + ]; + + // Find first (starting) corner with fallback to 'bottom' + var borders = ['bottom', 'left', 'top', 'right']; + var startCorner = borders.indexOf(borderSkipped, 0); + if (startCorner === -1) { + startCorner = 0; + } + + function cornerAt(index) { + return corners[(startCorner + index) % 4]; + } + + // Draw rectangle from 'startCorner' + var corner = cornerAt(0); + ctx.moveTo(corner[0], corner[1]); + + for (var i = 1; i < 4; i++) { + corner = cornerAt(i); + nextCornerId = i+1; + if(nextCornerId == 4){ + nextCornerId = 0 + } + + nextCorner = cornerAt(nextCornerId); + + width = corners[2][0] - corners[1][0]; + height = corners[0][1] - corners[1][1]; + x = corners[1][0]; + y = corners[1][1]; + + var radius = cornerRadius; + // Fix radius being too large + if(radius > Math.abs(height)/2){ + radius = Math.floor(Math.abs(height)/2); + } + if(radius > Math.abs(width)/2){ + radius = Math.floor(Math.abs(width)/2); + } + + if(height < 0){ + // Negative values in a standard bar chart + x_tl = x; x_tr = x+width; + y_tl = y+height; y_tr = y+height; + + x_bl = x; x_br = x+width; + y_bl = y; y_br = y; + + // Draw + ctx.moveTo(x_bl+radius, y_bl); + ctx.lineTo(x_br-radius, y_br); + ctx.quadraticCurveTo(x_br, y_br, x_br, y_br-radius); + ctx.lineTo(x_tr, y_tr+radius); + ctx.quadraticCurveTo(x_tr, y_tr, x_tr-radius, y_tr); + ctx.lineTo(x_tl+radius, y_tl); + ctx.quadraticCurveTo(x_tl, y_tl, x_tl, y_tl+radius); + ctx.lineTo(x_bl, y_bl-radius); + ctx.quadraticCurveTo(x_bl, y_bl, x_bl+radius, y_bl); + + }else if(width < 0){ + // Negative values in a horizontal bar chart + x_tl = x+width; x_tr = x; + y_tl= y; y_tr = y; + + x_bl = x+width; x_br = x; + y_bl = y+height; y_br = y+height; + + // Draw + ctx.moveTo(x_bl+radius, y_bl); + ctx.lineTo(x_br-radius, y_br); + ctx.quadraticCurveTo(x_br, y_br, x_br, y_br-radius); + ctx.lineTo(x_tr, y_tr+radius); + ctx.quadraticCurveTo(x_tr, y_tr, x_tr-radius, y_tr); + ctx.lineTo(x_tl+radius, y_tl); + ctx.quadraticCurveTo(x_tl, y_tl, x_tl, y_tl+radius); + ctx.lineTo(x_bl, y_bl-radius); + ctx.quadraticCurveTo(x_bl, y_bl, x_bl+radius, y_bl); + + }else{ + //Positive Value + ctx.moveTo(x + radius, y); + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + } + } + + ctx.fill(); + if (borderWidth) { + ctx.stroke(); + } +}; diff --git a/TugasAkhir/js/ace.js b/TugasAkhir/js/ace.js new file mode 100644 index 0000000..0c5f5c6 --- /dev/null +++ b/TugasAkhir/js/ace.js @@ -0,0 +1,7 @@ +(function($) { + 'use strict'; + var editor = ace.edit("aceExample"); + editor.setTheme("ace/theme/chaos"); + editor.getSession().setMode("ace/mode/javascript"); + document.getElementById('aceExample').style.fontSize = '1rem'; +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/alerts.js b/TugasAkhir/js/alerts.js new file mode 100644 index 0000000..d951040 --- /dev/null +++ b/TugasAkhir/js/alerts.js @@ -0,0 +1,102 @@ +(function($) { + showSwal = function(type) { + 'use strict'; + if (type === 'basic') { + swal({ + text: 'Any fool can use a computer', + button: { + text: "OK", + value: true, + visible: true, + className: "btn btn-primary" + } + }) + + } else if (type === 'title-and-text') { + swal({ + title: 'Read the alert!', + text: 'Click OK to close this alert', + button: { + text: "OK", + value: true, + visible: true, + className: "btn btn-primary" + } + }) + + } else if (type === 'success-message') { + swal({ + title: 'Congratulations!', + text: 'You entered the correct answer', + icon: 'success', + button: { + text: "Continue", + value: true, + visible: true, + className: "btn btn-primary" + } + }) + + } else if (type === 'auto-close') { + swal({ + title: 'Auto close alert!', + text: 'I will close in 2 seconds.', + timer: 2000, + button: false + }).then( + function() {}, + // handling the promise rejection + function(dismiss) { + if (dismiss === 'timer') { + console.log('I was closed by the timer') + } + } + ) + } else if (type === 'warning-message-and-cancel') { + swal({ + title: 'Are you sure?', + text: "You won't be able to revert this!", + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3f51b5', + cancelButtonColor: '#ff4081', + confirmButtonText: 'Great ', + buttons: { + cancel: { + text: "Cancel", + value: null, + visible: true, + className: "btn btn-danger", + closeModal: true, + }, + confirm: { + text: "OK", + value: true, + visible: true, + className: "btn btn-primary", + closeModal: true + } + } + }) + + } else if (type === 'custom-html') { + swal({ + content: { + element: "input", + attributes: { + placeholder: "Type your password", + type: "password", + class: 'form-control' + }, + }, + button: { + text: "OK", + value: true, + visible: true, + className: "btn btn-primary" + } + }) + } + } + +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/avgrund.js b/TugasAkhir/js/avgrund.js new file mode 100644 index 0000000..5ee8453 --- /dev/null +++ b/TugasAkhir/js/avgrund.js @@ -0,0 +1,21 @@ +(function($) { + 'use strict'; + $(function() { + $('#show').avgrund({ + height: 500, + holderClass: 'custom', + showClose: true, + showCloseText: 'x', + onBlurContainer: '.container-scroller', + template: '

So implement your design and place content here! If you want to close modal, please hit "Esc", click somewhere on the screen or use special button.

' + + '
' + + '' + + 'Dribbble' + + '
' + + '
' + + 'Great!' + + 'Cancel' + + '
' + }); + }) +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/bootstrap-table.js b/TugasAkhir/js/bootstrap-table.js new file mode 100644 index 0000000..c02e62c --- /dev/null +++ b/TugasAkhir/js/bootstrap-table.js @@ -0,0 +1,66 @@ +(function($) { + 'use strict'; + + function monthSorter(a, b) { + if (a.month < b.month) return -1; + if (a.month > b.month) return 1; + return 0; + } + + function buildTable($el, cells, rows) { + var i, j, row, + columns = [], + data = []; + + for (i = 0; i < cells; i++) { + columns.push({ + field: 'field' + i, + title: 'Cell' + i + }); + } + for (i = 0; i < rows; i++) { + row = {}; + for (j = 0; j < cells; j++) { + row['field' + j] = 'Row-' + i + '-' + j; + } + data.push(row); + } + $el.bootstrapTable('destroy').bootstrapTable({ + columns: columns, + data: data + }); + } + + $(function() { + buildTable($('#table'), 50, 50); + }); + + function actionFormatter(value, row, index) { + return [ + '', + '', + '', + '', + '', + '', + '' + ].join(''); + } + + window.actionEvents = { + 'click .like': function(e, value, row, index) { + alert('You click like icon, row: ' + JSON.stringify(row)); + console.log(value, row, index); + }, + 'click .edit': function(e, value, row, index) { + alert('You click edit icon, row: ' + JSON.stringify(row)); + console.log(value, row, index); + }, + 'click .remove': function(e, value, row, index) { + alert('You click remove icon, row: ' + JSON.stringify(row)); + console.log(value, row, index); + } + }; +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/bt-maxLength.js b/TugasAkhir/js/bt-maxLength.js new file mode 100644 index 0000000..91bfd56 --- /dev/null +++ b/TugasAkhir/js/bt-maxLength.js @@ -0,0 +1,31 @@ +(function($) { + 'use strict'; + $('#defaultconfig').maxlength({ + warningClass: "badge mt-1 badge-success", + limitReachedClass: "badge mt-1 badge-danger" + }); + + $('#defaultconfig-2').maxlength({ + alwaysShow: true, + threshold: 20, + warningClass: "badge mt-1 badge-success", + limitReachedClass: "badge mt-1 badge-danger" + }); + + $('#defaultconfig-3').maxlength({ + alwaysShow: true, + threshold: 10, + warningClass: "badge mt-1 badge-success", + limitReachedClass: "badge mt-1 badge-danger", + separator: ' of ', + preText: 'You have ', + postText: ' chars remaining.', + validate: true + }); + + $('#maxlength-textarea').maxlength({ + alwaysShow: true, + warningClass: "badge mt-1 badge-success", + limitReachedClass: "badge mt-1 badge-danger" + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/c3.js b/TugasAkhir/js/c3.js new file mode 100644 index 0000000..a8e1721 --- /dev/null +++ b/TugasAkhir/js/c3.js @@ -0,0 +1,218 @@ +(function($) { + 'use strict'; + var c3LineChart = c3.generate({ + bindto: '#c3-line-chart', + data: { + columns: [ + ['data1', 30, 200, 100, 400, 150, 250], + ['data2', 50, 20, 10, 40, 15, 25] + ] + }, + color: { + pattern: ['rgba(88,216,163,1)', 'rgba(237,28,36,0.6)', 'rgba(4,189,254,0.6)'] + }, + padding: { + top: 0, + right: 0, + bottom: 30, + left: 0, + } + }); + + setTimeout(function() { + c3LineChart.load({ + columns: [ + ['data1', 230, 190, 300, 500, 300, 400] + ] + }); + }, 1000); + + setTimeout(function() { + c3LineChart.load({ + columns: [ + ['data3', 130, 150, 200, 300, 200, 100] + ] + }); + }, 1500); + + setTimeout(function() { + c3LineChart.unload({ + ids: 'data1' + }); + }, 2000); + + var c3SplineChart = c3.generate({ + bindto: '#c3-spline-chart', + data: { + columns: [ + ['data1', 30, 200, 100, 400, 150, 250], + ['data2', 130, 100, 140, 200, 150, 50] + ], + type: 'spline' + }, + color: { + pattern: ['rgba(88,216,163,1)', 'rgba(237,28,36,0.6)', 'rgba(4,189,254,0.6)'] + }, + padding: { + top: 0, + right: 0, + bottom: 30, + left: 0, + } + }); + var c3BarChart = c3.generate({ + bindto: '#c3-bar-chart', + data: { + columns: [ + ['data1', 30, 200, 100, 400, 150, 250], + ['data2', 130, 100, 140, 200, 150, 50] + ], + type: 'bar' + }, + color: { + pattern: ['rgba(88,216,163,1)', 'rgba(4,189,254,0.6)', 'rgba(237,28,36,0.6)'] + }, + padding: { + top: 0, + right: 0, + bottom: 30, + left: 0, + }, + bar: { + width: { + ratio: 0.7 // this makes bar width 50% of length between ticks + } + } + }); + + setTimeout(function() { + c3BarChart.load({ + columns: [ + ['data3', 130, -150, 200, 300, -200, 100] + ] + }); + }, 1000); + + var c3StepChart = c3.generate({ + bindto: '#c3-step-chart', + data: { + columns: [ + ['data1', 300, 350, 300, 0, 0, 100], + ['data2', 130, 100, 140, 200, 150, 50] + ], + types: { + data1: 'step', + data2: 'area-step' + } + }, + color: { + pattern: ['rgba(88,216,163,1)', 'rgba(4,189,254,0.6)', 'rgba(237,28,36,0.6)'] + }, + padding: { + top: 0, + right: 0, + bottom: 30, + left: 0, + } + }); + var c3PieChart = c3.generate({ + bindto: '#c3-pie-chart', + data: { + // iris data from R + columns: [ + ['data1', 30], + ['data2', 120], + ], + type: 'pie', + onclick: function(d, i) { + console.log("onclick", d, i); + }, + onmouseover: function(d, i) { + console.log("onmouseover", d, i); + }, + onmouseout: function(d, i) { + console.log("onmouseout", d, i); + } + }, + color: { + pattern: ['#6153F9', '#8E97FC', '#A7B3FD'] + }, + padding: { + top: 0, + right: 0, + bottom: 30, + left: 0, + } + }); + + setTimeout(function() { + c3PieChart.load({ + columns: [ + ["Income", 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.3, 0.2, 0.6, 0.4, 0.3, 0.2, 0.2, 0.2, 0.2], + ["Outcome", 1.4, 1.5, 1.5, 1.3, 1.5, 1.3, 1.6, 1.0, 1.3, 1.4, 1.0, 1.5, 1.0, 1.4, 1.3, 1.4, 1.5, 1.0, 1.5, 1.1, 1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7, 1.5, 1.0, 1.1, 1.0, 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, 1.4, 1.2, 1.0, 1.3, 1.2, 1.3, 1.3, 1.1, 1.3], + ["Revenue", 2.5, 1.9, 2.1, 1.8, 2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2.0, 1.9, 2.1, 2.0, 2.4, 2.3, 1.8, 2.2, 2.3, 1.5, 2.3, 2.0, 2.0, 1.8, 2.1, 1.8, 1.8, 1.8, 2.1, 1.6, 1.9, 2.0, 2.2, 1.5, 1.4, 2.3, 2.4, 1.8, 1.8, 2.1, 2.4, 2.3, 1.9, 2.3, 2.5, 2.3, 1.9, 2.0, 2.3, 1.8], + ] + }); + }, 1500); + + setTimeout(function() { + c3PieChart.unload({ + ids: 'data1' + }); + c3PieChart.unload({ + ids: 'data2' + }); + }, 2500); + var c3DonutChart = c3.generate({ + bindto: '#c3-donut-chart', + data: { + columns: [ + ['data1', 30], + ['data2', 120], + ], + type: 'donut', + onclick: function(d, i) { + console.log("onclick", d, i); + }, + onmouseover: function(d, i) { + console.log("onmouseover", d, i); + }, + onmouseout: function(d, i) { + console.log("onmouseout", d, i); + } + }, + color: { + pattern: ['rgba(88,216,163,1)', 'rgba(4,189,254,0.6)', 'rgba(237,28,36,0.6)'] + }, + padding: { + top: 0, + right: 0, + bottom: 30, + left: 0, + }, + donut: { + title: "Iris Petal Width" + } + }); + + setTimeout(function() { + c3DonutChart.load({ + columns: [ + ["setosa", 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.3, 0.2, 0.6, 0.4, 0.3, 0.2, 0.2, 0.2, 0.2], + ["versicolor", 1.4, 1.5, 1.5, 1.3, 1.5, 1.3, 1.6, 1.0, 1.3, 1.4, 1.0, 1.5, 1.0, 1.4, 1.3, 1.4, 1.5, 1.0, 1.5, 1.1, 1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7, 1.5, 1.0, 1.1, 1.0, 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, 1.4, 1.2, 1.0, 1.3, 1.2, 1.3, 1.3, 1.1, 1.3], + ["virginica", 2.5, 1.9, 2.1, 1.8, 2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2.0, 1.9, 2.1, 2.0, 2.4, 2.3, 1.8, 2.2, 2.3, 1.5, 2.3, 2.0, 2.0, 1.8, 2.1, 1.8, 1.8, 1.8, 2.1, 1.6, 1.9, 2.0, 2.2, 1.5, 1.4, 2.3, 2.4, 1.8, 1.8, 2.1, 2.4, 2.3, 1.9, 2.3, 2.5, 2.3, 1.9, 2.0, 2.3, 1.8], + ] + }); + }, 1500); + + setTimeout(function() { + c3DonutChart.unload({ + ids: 'data1' + }); + c3DonutChart.unload({ + ids: 'data2' + }); + }, 2500); + + +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/calendar.js b/TugasAkhir/js/calendar.js new file mode 100644 index 0000000..68a3ea0 --- /dev/null +++ b/TugasAkhir/js/calendar.js @@ -0,0 +1,73 @@ +(function($) { + 'use strict'; + $(function() { + if ($('#calendar').length) { + $('#calendar').fullCalendar({ + header: { + left: 'prev,next today', + center: 'title', + right: 'month,basicWeek,basicDay' + }, + defaultDate: '2017-07-12', + navLinks: true, // can click day/week names to navigate views + editable: true, + eventLimit: true, // allow "more" link when too many events + events: [{ + title: 'All Day Event', + start: '2017-07-08' + }, + { + title: 'Long Event', + start: '2017-07-01', + end: '2017-07-07' + }, + { + id: 999, + title: 'Repeating Event', + start: '2017-07-09T16:00:00' + }, + { + id: 999, + title: 'Repeating Event', + start: '2017-07-16T16:00:00' + }, + { + title: 'Conference', + start: '2017-07-11', + end: '2017-07-13' + }, + { + title: 'Meeting', + start: '2017-07-12T10:30:00', + end: '2017-07-12T12:30:00' + }, + { + title: 'Lunch', + start: '2017-07-12T12:00:00' + }, + { + title: 'Meeting', + start: '2017-07-12T14:30:00' + }, + { + title: 'Happy Hour', + start: '2017-07-12T17:30:00' + }, + { + title: 'Dinner', + start: '2017-07-12T20:00:00' + }, + { + title: 'Birthday Party', + start: '2017-07-13T07:00:00' + }, + { + title: 'Click for Google', + url: 'http://google.com/', + start: '2017-07-28' + } + ] + }) + } + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/chart.js b/TugasAkhir/js/chart.js new file mode 100644 index 0000000..298e78a --- /dev/null +++ b/TugasAkhir/js/chart.js @@ -0,0 +1,352 @@ +$(function() { + /* ChartJS + * ------- + * Data and config for chartjs + */ + 'use strict'; + var data = { + labels: ["2013", "2014", "2014", "2015", "2016", "2017"], + datasets: [{ + label: '# of Votes', + data: [10, 19, 3, 5, 2, 3], + backgroundColor: [ + 'rgba(255, 99, 132, 0.2)', + 'rgba(54, 162, 235, 0.2)', + 'rgba(255, 206, 86, 0.2)', + 'rgba(75, 192, 192, 0.2)', + 'rgba(153, 102, 255, 0.2)', + 'rgba(255, 159, 64, 0.2)' + ], + borderColor: [ + 'rgba(255,99,132,1)', + 'rgba(54, 162, 235, 1)', + 'rgba(255, 206, 86, 1)', + 'rgba(75, 192, 192, 1)', + 'rgba(153, 102, 255, 1)', + 'rgba(255, 159, 64, 1)' + ], + borderWidth: 1, + fill: false + }] + }; + var multiLineData = { + labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], + datasets: [{ + label: 'Dataset 1', + data: [12, 19, 3, 5, 2, 3], + borderColor: [ + '#587ce4' + ], + borderWidth: 2, + fill: false + }, + { + label: 'Dataset 2', + data: [5, 23, 7, 12, 42, 23], + borderColor: [ + '#ede190' + ], + borderWidth: 2, + fill: false + }, + { + label: 'Dataset 3', + data: [15, 10, 21, 32, 12, 33], + borderColor: [ + '#f44252' + ], + borderWidth: 2, + fill: false + } + ] + }; + var options = { + scales: { + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + }, + legend: { + display: false + }, + elements: { + point: { + radius: 0 + } + } + + }; + var doughnutPieData = { + datasets: [{ + data: [30, 40, 30], + backgroundColor: [ + 'rgba(255, 99, 132, 0.5)', + 'rgba(54, 162, 235, 0.5)', + 'rgba(255, 206, 86, 0.5)', + 'rgba(75, 192, 192, 0.5)', + 'rgba(153, 102, 255, 0.5)', + 'rgba(255, 159, 64, 0.5)' + ], + borderColor: [ + 'rgba(255,99,132,1)', + 'rgba(54, 162, 235, 1)', + 'rgba(255, 206, 86, 1)', + 'rgba(75, 192, 192, 1)', + 'rgba(153, 102, 255, 1)', + 'rgba(255, 159, 64, 1)' + ], + }], + + // These labels appear in the legend and in the tooltips when hovering different arcs + labels: [ + 'Pink', + 'Blue', + 'Yellow', + ] + }; + var doughnutPieOptions = { + responsive: true, + animation: { + animateScale: true, + animateRotate: true + } + }; + var areaData = { + labels: ["2013", "2014", "2015", "2016", "2017"], + datasets: [{ + label: '# of Votes', + data: [12, 19, 3, 5, 2, 3], + backgroundColor: [ + 'rgba(255, 99, 132, 0.2)', + 'rgba(54, 162, 235, 0.2)', + 'rgba(255, 206, 86, 0.2)', + 'rgba(75, 192, 192, 0.2)', + 'rgba(153, 102, 255, 0.2)', + 'rgba(255, 159, 64, 0.2)' + ], + borderColor: [ + 'rgba(255,99,132,1)', + 'rgba(54, 162, 235, 1)', + 'rgba(255, 206, 86, 1)', + 'rgba(75, 192, 192, 1)', + 'rgba(153, 102, 255, 1)', + 'rgba(255, 159, 64, 1)' + ], + borderWidth: 1, + fill: true, // 3: no fill + }] + }; + + var areaOptions = { + plugins: { + filler: { + propagate: true + } + } + } + + var multiAreaData = { + labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + datasets: [{ + label: 'Facebook', + data: [8, 11, 13, 15, 12, 13, 16, 15, 13, 19, 11, 14], + borderColor: ['rgba(255, 99, 132, 0.5)'], + backgroundColor: ['rgba(255, 99, 132, 0.5)'], + borderWidth: 1, + fill: true + }, + { + label: 'Twitter', + data: [7, 17, 12, 16, 14, 18, 16, 12, 15, 11, 13, 9], + borderColor: ['rgba(54, 162, 235, 0.5)'], + backgroundColor: ['rgba(54, 162, 235, 0.5)'], + borderWidth: 1, + fill: true + }, + { + label: 'Linkedin', + data: [6, 14, 16, 20, 12, 18, 15, 12, 17, 19, 15, 11], + borderColor: ['rgba(255, 206, 86, 0.5)'], + backgroundColor: ['rgba(255, 206, 86, 0.5)'], + borderWidth: 1, + fill: true + } + ] + }; + + var multiAreaOptions = { + plugins: { + filler: { + propagate: true + } + }, + elements: { + point: { + radius: 0 + } + }, + scales: { + xAxes: [{ + gridLines: { + display: false + } + }], + yAxes: [{ + gridLines: { + display: false + } + }] + } + } + + var scatterChartData = { + datasets: [{ + label: 'First Dataset', + data: [{ + x: -10, + y: 0 + }, + { + x: 0, + y: 3 + }, + { + x: -25, + y: 5 + }, + { + x: 40, + y: 5 + } + ], + backgroundColor: [ + 'rgba(255, 99, 132, 0.2)' + ], + borderColor: [ + 'rgba(255,99,132,1)' + ], + borderWidth: 1 + }, + { + label: 'Second Dataset', + data: [{ + x: 10, + y: 5 + }, + { + x: 20, + y: -30 + }, + { + x: -25, + y: 15 + }, + { + x: -10, + y: 5 + } + ], + backgroundColor: [ + 'rgba(54, 162, 235, 0.2)', + ], + borderColor: [ + 'rgba(54, 162, 235, 1)', + ], + borderWidth: 1 + } + ] + } + + var scatterChartOptions = { + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }] + } + } + // Get context with jQuery - using jQuery's .get() method. + if ($("#barChart").length) { + var barChartCanvas = $("#barChart").get(0).getContext("2d"); + // This will get the first returned node in the jQuery collection. + var barChart = new Chart(barChartCanvas, { + type: 'bar', + data: data, + options: options + }); + } + + if ($("#lineChart").length) { + var lineChartCanvas = $("#lineChart").get(0).getContext("2d"); + var lineChart = new Chart(lineChartCanvas, { + type: 'line', + data: data, + options: options + }); + } + + if ($("#linechart-multi").length) { + var multiLineCanvas = $("#linechart-multi").get(0).getContext("2d"); + var lineChart = new Chart(multiLineCanvas, { + type: 'line', + data: multiLineData, + options: options + }); + } + + if ($("#areachart-multi").length) { + var multiAreaCanvas = $("#areachart-multi").get(0).getContext("2d"); + var multiAreaChart = new Chart(multiAreaCanvas, { + type: 'line', + data: multiAreaData, + options: multiAreaOptions + }); + } + + if ($("#doughnutChart").length) { + var doughnutChartCanvas = $("#doughnutChart").get(0).getContext("2d"); + var doughnutChart = new Chart(doughnutChartCanvas, { + type: 'doughnut', + data: doughnutPieData, + options: doughnutPieOptions + }); + } + + if ($("#pieChart").length) { + var pieChartCanvas = $("#pieChart").get(0).getContext("2d"); + var pieChart = new Chart(pieChartCanvas, { + type: 'pie', + data: doughnutPieData, + options: doughnutPieOptions + }); + } + + if ($("#areaChart").length) { + var areaChartCanvas = $("#areaChart").get(0).getContext("2d"); + var areaChart = new Chart(areaChartCanvas, { + type: 'line', + data: areaData, + options: areaOptions + }); + } + + if ($("#scatterChart").length) { + var scatterChartCanvas = $("#scatterChart").get(0).getContext("2d"); + var scatterChart = new Chart(scatterChartCanvas, { + type: 'scatter', + data: scatterChartData, + options: scatterChartOptions + }); + } + + if ($("#browserTrafficChart").length) { + var doughnutChartCanvas = $("#browserTrafficChart").get(0).getContext("2d"); + var doughnutChart = new Chart(doughnutChartCanvas, { + type: 'doughnut', + data: browserTrafficData, + options: doughnutPieOptions + }); + } +}); \ No newline at end of file diff --git a/TugasAkhir/js/chartist.js b/TugasAkhir/js/chartist.js new file mode 100644 index 0000000..d1aa2d1 --- /dev/null +++ b/TugasAkhir/js/chartist.js @@ -0,0 +1,217 @@ +(function($) { + //simple line + 'use strict'; + if ($('#ct-chart-line').length) { + new Chartist.Line('#ct-chart-line', { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + series: [ + [12, 9, 7, 8, 5], + [2, 1, 3.5, 7, 3], + [1, 3, 4, 5, 6] + ] + }, { + fullWidth: true, + chartPadding: { + right: 40 + } + }); + } + + //Line scatterer + var times = function(n) { + return Array.apply(null, new Array(n)); + }; + + var data = times(52).map(Math.random).reduce(function(data, rnd, index) { + data.labels.push(index + 1); + for (var i = 0; i < data.series.length; i++) { + data.series[i].push(Math.random() * 100) + } + return data; + }, { + labels: [], + series: times(4).map(function() { + return new Array() + }) + }); + + var options = { + showLine: false, + axisX: { + labelInterpolationFnc: function(value, index) { + return index % 13 === 0 ? 'W' + value : null; + } + } + }; + + var responsiveOptions = [ + ['screen and (min-width: 640px)', { + axisX: { + labelInterpolationFnc: function(value, index) { + return index % 4 === 0 ? 'W' + value : null; + } + } + }] + ]; + + if ($('#ct-chart-line-scatterer').length) { + new Chartist.Line('#ct-chart-line-scatterer', data, options, responsiveOptions); + } + + //Stacked bar Chart + if ($('#ct-chart-stacked-bar').length) { + new Chartist.Bar('#ct-chart-stacked-bar', { + labels: ['Q1', 'Q2', 'Q3', 'Q4'], + series: [ + ['800000', '1200000', '1400000', '1300000'], + ['200000', '400000', '500000', '300000'], + ['100000', '200000', '400000', '600000'], + ['400000', '600000', '200000', '0000'] + ] + }, { + stackBars: true, + axisY: { + labelInterpolationFnc: function(value) { + return (value / 1000) + 'k'; + } + } + }).on('draw', function(data) { + if (data.type === 'bar') { + data.element.attr({ + style: 'stroke-width: 30px' + }); + } + }); + } + + + //Horizontal bar chart + if ($('#ct-chart-horizontal-bar').length) { + new Chartist.Bar('#ct-chart-horizontal-bar', { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 4, 3, 7, 5, 10, 3], + [3, 2, 9, 5, 4, 6, 4], + [2, 6, 7, 1, 3, 5, 9], + [2, 6, 7, 1, 3, 5, 19], + ] + }, { + seriesBarDistance: 10, + reverseData: true, + horizontalBars: true, + axisY: { + offset: 20 + }, + axisX: { + labelOffset: { + x: 0, + y: 6 + }, + }, + chartPadding: { + left: 20, + bottom: 20 + } + }); + } + + //Pie + if ($('#ct-chart-pie').length) { + var data = { + series: [5, 3, 4] + }; + + var sum = function(a, b) { + return a + b + }; + + new Chartist.Pie('#ct-chart-pie', data, { + labelInterpolationFnc: function(value) { + return Math.round(value / data.series.reduce(sum) * 100) + '%'; + } + }); + } + + //Donut + var labels = ['safari', 'chrome', 'explorer', 'firefox']; + var data = { + series: [20, 40, 10, 30] + }; + + if ($('#ct-chart-donut').length) { + new Chartist.Pie('#ct-chart-donut', data, { + donut: true, + donutWidth: 60, + donutSolid: true, + startAngle: 270, + showLabel: true, + labelInterpolationFnc: function(value, index) { + var percentage = Math.round(value / data.series.reduce(sum) * 100) + '%'; + return labels[index] + ' ' + percentage; + } + }); + } + + + + //Dashboard Tickets Chart + if ($('#ct-chart-dash-barChart').length) { + new Chartist.Bar('#ct-chart-dash-barChart', { + labels: ['Week 1', 'Week 2', 'Week 3', 'Week 4'], + series: [ + [300, 140, 230, 140], + [323, 529, 644, 230], + [734, 539, 624, 334], + ] + }, { + stackBars: true, + axisY: { + labelInterpolationFnc: function(value) { + return (value / 100) + 'k'; + } + } + }).on('draw', function(data) { + if (data.type === 'bar') { + data.element.attr({ + style: 'stroke-width: 50px' + }); + } + }); + } + + //dashboard staked bar chart + if ($('#ct-chart-vartical-stacked-bar').length) { + new Chartist.Bar('#ct-chart-vartical-stacked-bar', { + labels: ['J', 'F', 'M', 'A', 'M', 'J', 'A'], + series: [{ + "name": "Income", + "data": [8, 4, 6, 3, 7, 3, 8] + }, + { + "name": "Outcome", + "data": [2, 7, 4, 8, 4, 6, 1] + }, + { + "name": "Revenue", + "data": [4, 3, 3, 6, 7, 2, 4] + } + ] + }, { + seriesBarDistance: 10, + reverseData: true, + horizontalBars: false, + height: '280px', + fullWidth: true, + chartPadding: { + top: 30, + left: 0, + right: 0, + bottom: 0 + }, + plugins: [ + Chartist.plugins.legend() + ] + }); + } + +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/circle-progress.js b/TugasAkhir/js/circle-progress.js new file mode 100644 index 0000000..8b0dc3e --- /dev/null +++ b/TugasAkhir/js/circle-progress.js @@ -0,0 +1,8 @@ +(function($) { + 'use strict'; + if ($(".circle-progress-1").length) { + $('.circle-progress-1').circleProgress({}).on('circle-animation-progress', function(event, progress, stepValue) { + $(this).find('.value').html(Math.round(100 * stepValue.toFixed(2).substr(1)) + '%'); + }); + } +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/clipboard.js b/TugasAkhir/js/clipboard.js new file mode 100644 index 0000000..dbc1b20 --- /dev/null +++ b/TugasAkhir/js/clipboard.js @@ -0,0 +1,10 @@ +(function($) { + 'use strict'; + var clipboard = new ClipboardJS('.btn-clipboard'); + clipboard.on('success', function(e) { + console.log(e); + }); + clipboard.on('error', function(e) { + console.log(e); + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/codeEditor.js b/TugasAkhir/js/codeEditor.js new file mode 100644 index 0000000..b34ff58 --- /dev/null +++ b/TugasAkhir/js/codeEditor.js @@ -0,0 +1,121 @@ +(function($) { + 'use strict'; + if ($('textarea[name=code-editable]').length) { + var editableCodeMirror = CodeMirror.fromTextArea(document.getElementById('code-editable'), { + mode: "javascript", + theme: "ambiance", + lineNumbers: true + }); + } + if ($('#code-readonly').length) { + var readOnlyCodeMirror = CodeMirror.fromTextArea(document.getElementById('code-readonly'), { + mode: "javascript", + theme: "ambiance", + lineNumbers: true, + readOnly: "true" + }); + } + if ($('#cm-js-mode').length) { + var cm = CodeMirror(document.getElementById("cm-js-mode"), { + mode: "javascript", + lineNumbers: true + }); + } + + //Use this method of there are multiple codes with same properties + if ($('.multiple-codes').length) { + var code_type = ''; + var editorTextarea = $('.multiple-codes'); + for (var i = 0; i < editorTextarea.length; i++) { + $(editorTextarea[i]).attr('id', 'code-' + i); + CodeMirror.fromTextArea(document.getElementById('code-' + i), { + mode: "javascript", + theme: "ambiance", + lineNumbers: true, + readOnly: "true", + maxHighlightLength: 0, + workDelay: 0 + }); + } + } + + //Use this method of there are multiple codes with same properties in shell mode + if ($('.shell-mode').length) { + var code_type = ''; + var shellEditor = $('.shell-mode'); + for (var i = 0; i < shellEditor.length; i++) { + $(shellEditor[i]).attr('id', 'code-' + i); + CodeMirror.fromTextArea(document.getElementById('code-' + i), { + mode: "shell", + theme: "ambiance", + readOnly: "true", + maxHighlightLength: 0, + workDelay: 0 + }); + } + } + if ($('#ace_html').length) { + $(function() { + var editor = ace.edit("ace_html"); + editor.setTheme("ace/theme/monokai"); + editor.getSession().setMode("ace/mode/html"); + document.getElementById('ace_html'); + }); + } + if ($('#ace_javaScript').length) { + $(function() { + var editor = ace.edit("ace_javaScript"); + editor.setTheme("ace/theme/monokai"); + editor.getSession().setMode("ace/mode/javascript"); + document.getElementById('aceExample'); + }); + } + if ($('#ace_json').length) { + $(function() { + var editor = ace.edit("ace_json"); + editor.setTheme("ace/theme/monokai"); + editor.getSession().setMode("ace/mode/json"); + document.getElementById('ace_json'); + }); + } + if ($('#ace_css').length) { + $(function() { + var editor = ace.edit("ace_css"); + editor.setTheme("ace/theme/monokai"); + editor.getSession().setMode("ace/mode/css"); + document.getElementById('ace_css'); + }); + } + if ($('#ace_scss').length) { + $(function() { + var editor = ace.edit("ace_scss"); + editor.setTheme("ace/theme/monokai"); + editor.getSession().setMode("ace/mode/scss"); + document.getElementById('ace_scss'); + }); + } + if ($('#ace_php').length) { + $(function() { + var editor = ace.edit("ace_php"); + editor.setTheme("ace/theme/monokai"); + editor.getSession().setMode("ace/mode/php"); + document.getElementById('ace_php'); + }); + } + if ($('#ace_ruby').length) { + $(function() { + var editor = ace.edit("ace_ruby"); + editor.setTheme("ace/theme/monokai"); + editor.getSession().setMode("ace/mode/ruby"); + document.getElementById('ace_ruby'); + }); + } + if ($('#ace_coffee').length) { + $(function() { + var editor = ace.edit("ace_coffee"); + editor.setTheme("ace/theme/monokai"); + editor.getSession().setMode("ace/mode/coffee"); + document.getElementById('ace_coffee'); + }); + } +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/codemirror.js b/TugasAkhir/js/codemirror.js new file mode 100644 index 0000000..225bc0c --- /dev/null +++ b/TugasAkhir/js/codemirror.js @@ -0,0 +1,51 @@ +(function($) { + 'use strict'; + if ($('textarea[name=code-editable]').length) { + var editableCodeMirror = CodeMirror.fromTextArea(document.getElementById('code-editable'), { + mode: "javascript", + theme: "ambiance", + lineNumbers: true + }); + } + if ($('#code-readonly').length) { + var readOnlyCodeMirror = CodeMirror.fromTextArea(document.getElementById('code-readonly'), { + mode: "javascript", + theme: "ambiance", + lineNumbers: true, + readOnly: "nocursor" + }); + } + + //Use this method of there are multiple codes with same properties + if ($('.multiple-codes').length) { + var code_type = ''; + var editorTextarea = $('.multiple-codes'); + for (var i = 0; i < editorTextarea.length; i++) { + $(editorTextarea[i]).attr('id', 'code-' + i); + CodeMirror.fromTextArea(document.getElementById('code-' + i), { + mode: "javascript", + theme: "ambiance", + lineNumbers: true, + readOnly: "nocursor", + maxHighlightLength: 0, + workDelay: 0 + }); + } + } + + //Use this method of there are multiple codes with same properties in shell mode + if ($('.shell-mode').length) { + var code_type = ''; + var shellEditor = $('.shell-mode'); + for (var i = 0; i < shellEditor.length; i++) { + $(shellEditor[i]).attr('id', 'code-' + i); + CodeMirror.fromTextArea(document.getElementById('code-' + i), { + mode: "shell", + theme: "ambiance", + readOnly: "nocursor", + maxHighlightLength: 0, + workDelay: 0 + }); + } + } +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/context-menu.js b/TugasAkhir/js/context-menu.js new file mode 100644 index 0000000..bbaa60a --- /dev/null +++ b/TugasAkhir/js/context-menu.js @@ -0,0 +1,240 @@ +(function($) { + 'use strict'; + $.contextMenu({ + selector: '#context-menu-simple', + callback: function(key, options) {}, + items: { + "edit": { + name: "Edit", + icon: "edit" + }, + "cut": { + name: "Cut", + icon: "cut" + }, + copy: { + name: "Copy", + icon: "copy" + }, + "paste": { + name: "Paste", + icon: "paste" + }, + "delete": { + name: "Delete", + icon: "delete" + }, + "sep1": "---------", + "quit": { + name: "Quit", + icon: function() { + return 'context-menu-icon context-menu-icon-quit'; + } + } + } + }); + $.contextMenu({ + selector: '#context-menu-access', + callback: function(key, options) { + var m = "clicked: " + key; + window.console && console.log(m) || alert(m); + }, + items: { + "edit": { + name: "Edit", + icon: "edit", + accesskey: "e" + }, + "cut": { + name: "Cut", + icon: "cut", + accesskey: "c" + }, + // first unused character is taken (here: o) + "copy": { + name: "Copy", + icon: "copy", + accesskey: "c o p y" + }, + // words are truncated to their first letter (here: p) + "paste": { + name: "Paste", + icon: "paste", + accesskey: "cool paste" + }, + "delete": { + name: "Delete", + icon: "delete" + }, + "sep1": "---------", + "quit": { + name: "Quit", + icon: function($element, key, item) { + return 'context-menu-icon context-menu-icon-quit'; + } + } + } + }); + $.contextMenu({ + selector: '#context-menu-open', + callback: function(key, options) { + var m = "clicked: " + key; + window.console && console.log(m) || alert(m); + }, + items: { + "edit": { + name: "Closing on Click", + icon: "edit", + callback: function() { + return true; + } + }, + "cut": { + name: "Open after Click", + icon: "cut", + callback: function() { + return false; + } + } + } + }); + $.contextMenu({ + selector: '#context-menu-multi', + callback: function(key, options) { + var m = "clicked: " + key; + window.console && console.log(m) || alert(m); + }, + items: { + "edit": { + "name": "Edit", + "icon": "edit" + }, + "cut": { + "name": "Cut", + "icon": "cut" + }, + "sep1": "---------", + "quit": { + "name": "Quit", + "icon": "quit" + }, + "sep2": "---------", + "fold1": { + "name": "Sub group", + "items": { + "fold1-key1": { + "name": "Foo bar" + }, + "fold2": { + "name": "Sub group 2", + "items": { + "fold2-key1": { + "name": "alpha" + }, + "fold2-key2": { + "name": "bravo" + }, + "fold2-key3": { + "name": "charlie" + } + } + }, + "fold1-key3": { + "name": "delta" + } + } + }, + "fold1a": { + "name": "Other group", + "items": { + "fold1a-key1": { + "name": "echo" + }, + "fold1a-key2": { + "name": "foxtrot" + }, + "fold1a-key3": { + "name": "golf" + } + } + } + } + }); + $.contextMenu({ + selector: '#context-menu-hover', + trigger: 'hover', + delay: 500, + callback: function(key, options) { + var m = "clicked: " + key; + window.console && console.log(m) || alert(m); + }, + items: { + "edit": { + name: "Edit", + icon: "edit" + }, + "cut": { + name: "Cut", + icon: "cut" + }, + "copy": { + name: "Copy", + icon: "copy" + }, + "paste": { + name: "Paste", + icon: "paste" + }, + "delete": { + name: "Delete", + icon: "delete" + }, + "sep1": "---------", + "quit": { + name: "Quit", + icon: function($element, key, item) { + return 'context-menu-icon context-menu-icon-quit'; + } + } + } + }); + $.contextMenu({ + selector: '#context-menu-hover-autohide', + trigger: 'hover', + delay: 500, + autoHide: true, + callback: function(key, options) { + var m = "clicked: " + key; + window.console && console.log(m) || alert(m); + }, + items: { + "edit": { + name: "Edit", + icon: "edit" + }, + "cut": { + name: "Cut", + icon: "cut" + }, + "copy": { + name: "Copy", + icon: "copy" + }, + "paste": { + name: "Paste", + icon: "paste" + }, + "delete": { + name: "Delete", + icon: "delete" + }, + "sep1": "---------", + "quit": { + name: "Quit", + icon: function($element, key, item) { + return 'context-menu-icon context-menu-icon-quit'; + } + } + } + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/cropper.js b/TugasAkhir/js/cropper.js new file mode 100644 index 0000000..aadeb30 --- /dev/null +++ b/TugasAkhir/js/cropper.js @@ -0,0 +1,6 @@ +(function($) { + 'use strict'; + $('#cropperExample').cropper({ + aspectRatio: 16 / 9 + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/dashboard.js b/TugasAkhir/js/dashboard.js new file mode 100644 index 0000000..4608da2 --- /dev/null +++ b/TugasAkhir/js/dashboard.js @@ -0,0 +1,708 @@ +(function($) { + 'use strict'; + $(function() { + if ($("#performaneLine").length) { + var graphGradient = document.getElementById("performaneLine").getContext('2d'); + var graphGradient2 = document.getElementById("performaneLine").getContext('2d'); + var saleGradientBg = graphGradient.createLinearGradient(5, 0, 5, 100); + saleGradientBg.addColorStop(0, 'rgba(26, 115, 232, 0.18)'); + saleGradientBg.addColorStop(1, 'rgba(26, 115, 232, 0.02)'); + var saleGradientBg2 = graphGradient2.createLinearGradient(100, 0, 50, 150); + saleGradientBg2.addColorStop(0, 'rgba(0, 208, 255, 0.19)'); + saleGradientBg2.addColorStop(1, 'rgba(0, 208, 255, 0.03)'); + var salesTopData = { + labels: ["SUN","sun", "MON", "mon", "TUE","tue", "WED", "wed", "THU", "thu", "FRI", "fri", "SAT"], + datasets: [{ + label: 'This week', + data: [50, 110, 60, 290, 200, 115, 130, 170, 90, 210, 240, 280, 200], + backgroundColor: saleGradientBg, + borderColor: [ + '#1F3BB3', + ], + borderWidth: 1.5, + fill: true, // 3: no fill + pointBorderWidth: 1, + pointRadius: [4, 4, 4, 4, 4,4, 4, 4, 4, 4,4, 4, 4], + pointHoverRadius: [2, 2, 2, 2, 2,2, 2, 2, 2, 2,2, 2, 2], + pointBackgroundColor: ['#1F3BB3)', '#1F3BB3', '#1F3BB3', '#1F3BB3','#1F3BB3)', '#1F3BB3', '#1F3BB3', '#1F3BB3','#1F3BB3)', '#1F3BB3', '#1F3BB3', '#1F3BB3','#1F3BB3)'], + pointBorderColor: ['#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff',], + },{ + label: 'Last week', + data: [30, 150, 190, 250, 120, 150, 130, 20, 30, 15, 40, 95, 180], + backgroundColor: saleGradientBg2, + borderColor: [ + '#52CDFF', + ], + borderWidth: 1.5, + fill: true, // 3: no fill + pointBorderWidth: 1, + pointRadius: [0, 0, 0, 4, 0], + pointHoverRadius: [0, 0, 0, 2, 0], + pointBackgroundColor: ['#52CDFF)', '#52CDFF', '#52CDFF', '#52CDFF','#52CDFF)', '#52CDFF', '#52CDFF', '#52CDFF','#52CDFF)', '#52CDFF', '#52CDFF', '#52CDFF','#52CDFF)'], + pointBorderColor: ['#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff','#fff',], + }] + }; + + var salesTopOptions = { + responsive: true, + maintainAspectRatio: false, + scales: { + yAxes: [{ + gridLines: { + display: true, + drawBorder: false, + color:"#F0F0F0", + zeroLineColor: '#F0F0F0', + }, + ticks: { + beginAtZero: false, + autoSkip: true, + maxTicksLimit: 4, + fontSize: 10, + color:"#6B778C" + } + }], + xAxes: [{ + gridLines: { + display: false, + drawBorder: false, + }, + ticks: { + beginAtZero: false, + autoSkip: true, + maxTicksLimit: 7, + fontSize: 10, + color:"#6B778C" + } + }], + }, + legend:false, + legendCallback: function (chart) { + var text = []; + text.push('
    '); + for (var i = 0; i < chart.data.datasets.length; i++) { + console.log(chart.data.datasets[i]); // see what's inside the obj. + text.push('
  • '); + text.push('' + ''); + text.push(chart.data.datasets[i].label); + text.push('
  • '); + } + text.push('
'); + return text.join(""); + }, + + elements: { + line: { + tension: 0.4, + } + }, + tooltips: { + backgroundColor: 'rgba(31, 59, 179, 1)', + } + } + var salesTop = new Chart(graphGradient, { + type: 'line', + data: salesTopData, + options: salesTopOptions + }); + document.getElementById('performance-line-legend').innerHTML = salesTop.generateLegend(); + } + if ($("#performaneLine-dark").length) { + var graphGradient = document.getElementById("performaneLine-dark").getContext('2d'); + var graphGradient2 = document.getElementById("performaneLine-dark").getContext('2d'); + var saleGradientBg = graphGradient.createLinearGradient(5, 0, 5, 100); + saleGradientBg.addColorStop(0, 'rgba(26, 115, 232, 0.18)'); + saleGradientBg.addColorStop(1, 'rgba(34, 36, 55, 0.5)'); + var saleGradientBg2 = graphGradient2.createLinearGradient(10, 0, 0, 150); + saleGradientBg2.addColorStop(0, 'rgba(0, 208, 255, 0.19)'); + saleGradientBg2.addColorStop(1, 'rgba(34, 36, 55, 0.2)'); + var salesTopDataDark = { + labels: ["SUN","sun", "MON", "mon", "TUE","tue", "WED", "wed", "THU", "thu", "FRI", "fri", "SAT"], + datasets: [{ + label: '# of Votes', + data: [50, 110, 60, 290, 200, 115, 130, 170, 90, 210, 240, 280, 200], + backgroundColor: saleGradientBg, + borderColor: [ + '#1F3BB3', + ], + borderWidth: 1.5, + fill: true, // 3: no fill + pointBorderWidth: 1, + pointRadius: [4, 4, 4, 4, 4,4, 4, 4, 4, 4,4, 4, 4], + pointHoverRadius: [2, 2, 2, 2, 2,2, 2, 2, 2, 2,2, 2, 2], + pointBackgroundColor: ['#1F3BB3)', '#1F3BB3', '#1F3BB3', '#1F3BB3','#1F3BB3)', '#1F3BB3', '#1F3BB3', '#1F3BB3','#1F3BB3)', '#1F3BB3', '#1F3BB3', '#1F3BB3','#1F3BB3)'], + pointBorderColor: ['#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437',], + },{ + label: '# of Votes', + data: [30, 150, 190, 250, 120, 150, 130, 20, 30, 15, 40, 95, 180], + backgroundColor: saleGradientBg2, + borderColor: [ + '#52CDFF', + ], + borderWidth: 1.5, + fill: true, // 3: no fill + pointBorderWidth: 1, + pointRadius: [0, 0, 0, 4, 0], + pointHoverRadius: [0, 0, 0, 2, 0], + pointBackgroundColor: ['#52CDFF)', '#52CDFF', '#52CDFF', '#52CDFF','#52CDFF)', '#52CDFF', '#52CDFF', '#52CDFF','#52CDFF)', '#52CDFF', '#52CDFF', '#52CDFF','#52CDFF)'], + pointBorderColor: ['#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437','#222437',], + }] + }; + + var salesTopOptionsDark = { + responsive: true, + maintainAspectRatio: false, + scales: { + yAxes: [{ + gridLines: { + display: true, + drawBorder: false, + color:"rgba(255,255,255,.05)", + zeroLineColor: "rgba(255,255,255,.05)", + }, + ticks: { + beginAtZero: false, + autoSkip: true, + maxTicksLimit: 4, + fontSize: 10, + color:"#6B778C" + } + }], + xAxes: [{ + gridLines: { + display: false, + drawBorder: false, + }, + ticks: { + beginAtZero: false, + autoSkip: true, + maxTicksLimit: 7, + fontSize: 10, + color:"#6B778C" + } + }], + }, + legend:false, + legendCallback: function (chart) { + var text = []; + text.push('
    '); + for (var i = 0; i < chart.data.datasets.length; i++) { + console.log(chart.data.datasets[i]); // see what's inside the obj. + text.push('
  • '); + text.push('' + ''); + text.push(chart.data.datasets[i].label); + text.push('
  • '); + } + text.push('
'); + return text.join(""); + }, + + elements: { + line: { + tension: 0.4, + } + }, + tooltips: { + backgroundColor: 'rgba(31, 59, 179, 1)', + } + } + var salesTopDark = new Chart(graphGradient, { + type: 'line', + data: salesTopDataDark, + options: salesTopOptionsDark + }); + document.getElementById('performance-line-legend-dark').innerHTML = salesTopDark.generateLegend(); + } + if ($("#datepicker-popup").length) { + $('#datepicker-popup').datepicker({ + enableOnReadonly: true, + todayHighlight: true, + }); + $("#datepicker-popup").datepicker("setDate", "0"); + } + if ($("#status-summary").length) { + var statusSummaryChartCanvas = document.getElementById("status-summary").getContext('2d');; + var statusData = { + labels: ["SUN", "MON", "TUE", "WED", "THU", "FRI"], + datasets: [{ + label: '# of Votes', + data: [50, 68, 70, 10, 12, 80], + backgroundColor: "#ffcc00", + borderColor: [ + '#01B6A0', + ], + borderWidth: 2, + fill: false, // 3: no fill + pointBorderWidth: 0, + pointRadius: [0, 0, 0, 0, 0, 0], + pointHoverRadius: [0, 0, 0, 0, 0, 0], + }] + }; + + var statusOptions = { + responsive: true, + maintainAspectRatio: false, + scales: { + yAxes: [{ + display:false, + gridLines: { + display: false, + drawBorder: false, + color:"#F0F0F0" + }, + ticks: { + beginAtZero: false, + autoSkip: true, + maxTicksLimit: 4, + fontSize: 10, + color:"#6B778C" + } + }], + xAxes: [{ + display:false, + gridLines: { + display: false, + drawBorder: false, + }, + ticks: { + beginAtZero: false, + autoSkip: true, + maxTicksLimit: 7, + fontSize: 10, + color:"#6B778C" + } + }], + }, + legend:false, + + elements: { + line: { + tension: 0.4, + } + }, + tooltips: { + backgroundColor: 'rgba(31, 59, 179, 1)', + } + } + var statusSummaryChart = new Chart(statusSummaryChartCanvas, { + type: 'line', + data: statusData, + options: statusOptions + }); + } + if ($('#totalVisitors').length) { + var bar = new ProgressBar.Circle(totalVisitors, { + color: '#fff', + // This has to be the same size as the maximum width to + // prevent clipping + strokeWidth: 15, + trailWidth: 15, + easing: 'easeInOut', + duration: 1400, + text: { + autoStyleContainer: false + }, + from: { + color: '#52CDFF', + width: 15 + }, + to: { + color: '#677ae4', + width: 15 + }, + // Set default step function for all animate calls + step: function(state, circle) { + circle.path.setAttribute('stroke', state.color); + circle.path.setAttribute('stroke-width', state.width); + + var value = Math.round(circle.value() * 100); + if (value === 0) { + circle.setText(''); + } else { + circle.setText(value); + } + + } + }); + + bar.text.style.fontSize = '0rem'; + bar.animate(.64); // Number from 0.0 to 1.0 + } + if ($('#visitperday').length) { + var bar = new ProgressBar.Circle(visitperday, { + color: '#fff', + // This has to be the same size as the maximum width to + // prevent clipping + strokeWidth: 15, + trailWidth: 15, + easing: 'easeInOut', + duration: 1400, + text: { + autoStyleContainer: false + }, + from: { + color: '#34B1AA', + width: 15 + }, + to: { + color: '#677ae4', + width: 15 + }, + // Set default step function for all animate calls + step: function(state, circle) { + circle.path.setAttribute('stroke', state.color); + circle.path.setAttribute('stroke-width', state.width); + + var value = Math.round(circle.value() * 100); + if (value === 0) { + circle.setText(''); + } else { + circle.setText(value); + } + + } + }); + + bar.text.style.fontSize = '0rem'; + bar.animate(.34); // Number from 0.0 to 1.0 + } + if ($("#marketingOverview").length) { + var marketingOverviewChart = document.getElementById("marketingOverview").getContext('2d'); + var marketingOverviewData = { + labels: ["JAN","FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"], + datasets: [{ + label: 'Last week', + data: [110, 220, 200, 190, 220, 110, 210, 110, 205, 202, 201, 150], + backgroundColor: "#52CDFF", + borderColor: [ + '#52CDFF', + ], + borderWidth: 0, + fill: true, // 3: no fill + + },{ + label: 'This week', + data: [215, 290, 210, 250, 290, 230, 290, 210, 280, 220, 190, 300], + backgroundColor: "#1F3BB3", + borderColor: [ + '#1F3BB3', + ], + borderWidth: 0, + fill: true, // 3: no fill + }] + }; + + var marketingOverviewOptions = { + responsive: true, + maintainAspectRatio: false, + scales: { + yAxes: [{ + gridLines: { + display: true, + drawBorder: false, + color:"#F0F0F0", + zeroLineColor: '#F0F0F0', + }, + ticks: { + beginAtZero: true, + autoSkip: true, + maxTicksLimit: 5, + fontSize: 10, + color:"#6B778C" + } + }], + xAxes: [{ + stacked: true, + barPercentage: 0.35, + gridLines: { + display: false, + drawBorder: false, + }, + ticks: { + beginAtZero: false, + autoSkip: true, + maxTicksLimit: 12, + fontSize: 10, + color:"#6B778C" + } + }], + }, + legend:false, + legendCallback: function (chart) { + var text = []; + text.push('
    '); + for (var i = 0; i < chart.data.datasets.length; i++) { + console.log(chart.data.datasets[i]); // see what's inside the obj. + text.push('
  • '); + text.push('' + ''); + text.push(chart.data.datasets[i].label); + text.push('
  • '); + } + text.push('
'); + return text.join(""); + }, + + elements: { + line: { + tension: 0.4, + } + }, + tooltips: { + backgroundColor: 'rgba(31, 59, 179, 1)', + } + } + var marketingOverview = new Chart(marketingOverviewChart, { + type: 'bar', + data: marketingOverviewData, + options: marketingOverviewOptions + }); + document.getElementById('marketing-overview-legend').innerHTML = marketingOverview.generateLegend(); + } + if ($("#marketingOverview-dark").length) { + var marketingOverviewChartDark = document.getElementById("marketingOverview-dark").getContext('2d'); + var marketingOverviewDataDark = { + labels: ["JAN","FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"], + datasets: [{ + label: 'Last week', + data: [110, 220, 200, 190, 220, 110, 210, 110, 205, 202, 201, 150], + backgroundColor: "#52CDFF", + borderColor: [ + '#52CDFF', + ], + borderWidth: 0, + fill: true, // 3: no fill + + },{ + label: 'This week', + data: [215, 290, 210, 250, 290, 230, 290, 210, 280, 220, 190, 300], + backgroundColor: "#1F3BB3", + borderColor: [ + '#1F3BB3', + ], + borderWidth: 0, + fill: true, // 3: no fill + }] + }; + + var marketingOverviewOptionsDark = { + responsive: true, + maintainAspectRatio: false, + scales: { + yAxes: [{ + gridLines: { + display: true, + drawBorder: false, + color:"rgba(255,255,255,.05)", + zeroLineColor: "rgba(255,255,255,.05)", + }, + ticks: { + beginAtZero: true, + autoSkip: true, + maxTicksLimit: 5, + fontSize: 10, + color:"#6B778C" + } + }], + xAxes: [{ + stacked: true, + barPercentage: 0.35, + gridLines: { + display: false, + drawBorder: false, + }, + ticks: { + beginAtZero: false, + autoSkip: true, + maxTicksLimit: 7, + fontSize: 10, + color:"#6B778C" + } + }], + }, + legend:false, + legendCallback: function (chart) { + var text = []; + text.push('
    '); + for (var i = 0; i < chart.data.datasets.length; i++) { + console.log(chart.data.datasets[i]); // see what's inside the obj. + text.push('
  • '); + text.push('' + ''); + text.push(chart.data.datasets[i].label); + text.push('
  • '); + } + text.push('
'); + return text.join(""); + }, + + elements: { + line: { + tension: 0.4, + } + }, + tooltips: { + backgroundColor: 'rgba(31, 59, 179, 1)', + } + } + var marketingOverviewDark = new Chart(marketingOverviewChartDark, { + type: 'bar', + data: marketingOverviewDataDark, + options: marketingOverviewOptionsDark + }); + document.getElementById('marketing-overview-legend').innerHTML = marketingOverviewDark.generateLegend(); + } + if ($("#doughnutChart").length) { + var doughnutChartCanvas = $("#doughnutChart").get(0).getContext("2d"); + var doughnutPieData = { + datasets: [{ + data: [40, 20, 30, 10], + backgroundColor: [ + "#1F3BB3", + "#FDD0C7", + "#52CDFF", + "#81DADA" + ], + borderColor: [ + "#1F3BB3", + "#FDD0C7", + "#52CDFF", + "#81DADA" + ], + }], + + // These labels appear in the legend and in the tooltips when hovering different arcs + labels: [ + 'Total', + 'Net', + 'Gross', + 'AVG', + ] + }; + var doughnutPieOptions = { + cutoutPercentage: 50, + animationEasing: "easeOutBounce", + animateRotate: true, + animateScale: false, + responsive: true, + maintainAspectRatio: true, + showScale: true, + legend: false, + legendCallback: function (chart) { + var text = []; + text.push('
    '); + for (var i = 0; i < chart.data.datasets[0].data.length; i++) { + text.push('
  • '); + text.push(''); + if (chart.data.labels[i]) { + text.push(chart.data.labels[i]); + } + text.push('
  • '); + } + text.push('
'); + return text.join(""); + }, + + layout: { + padding: { + left: 0, + right: 0, + top: 0, + bottom: 0 + } + }, + tooltips: { + callbacks: { + title: function(tooltipItem, data) { + return data['labels'][tooltipItem[0]['index']]; + }, + label: function(tooltipItem, data) { + return data['datasets'][0]['data'][tooltipItem['index']]; + } + }, + + backgroundColor: '#fff', + titleFontSize: 14, + titleFontColor: '#0B0F32', + bodyFontColor: '#737F8B', + bodyFontSize: 11, + displayColors: false + } + }; + var doughnutChart = new Chart(doughnutChartCanvas, { + type: 'doughnut', + data: doughnutPieData, + options: doughnutPieOptions + }); + document.getElementById('doughnut-chart-legend').innerHTML = doughnutChart.generateLegend(); + } + if ($("#leaveReport-dark").length) { + var leaveReportChartDark = document.getElementById("leaveReport-dark").getContext('2d'); + var leaveReportDataDark = { + labels: ["JAN","FEB", "MAR", "APR", "MAY"], + datasets: [{ + label: 'Last week', + data: [18, 25, 39, 11, 24], + backgroundColor: "#52CDFF", + borderColor: [ + '#52CDFF', + ], + borderWidth: 0, + fill: true, // 3: no fill + + }] + }; + + var leaveReportOptionsDark = { + responsive: true, + maintainAspectRatio: false, + scales: { + yAxes: [{ + gridLines: { + display: true, + drawBorder: false, + color:"#383e5d", + zeroLineColor: '#383e5d', + }, + ticks: { + beginAtZero: true, + autoSkip: true, + maxTicksLimit: 5, + fontSize: 10, + color:"#6B778C" + } + }], + xAxes: [{ + barPercentage: 0.5, + gridLines: { + display: false, + drawBorder: false, + }, + ticks: { + beginAtZero: false, + autoSkip: true, + maxTicksLimit: 7, + fontSize: 10, + color:"#6B778C" + } + }], + }, + legend:false, + + elements: { + line: { + tension: 0.4, + } + }, + tooltips: { + backgroundColor: 'rgba(31, 59, 179, 1)', + } + } + var leaveReportDark = new Chart(leaveReportChartDark, { + type: 'bar', + data: leaveReportDataDark, + options: leaveReportOptionsDark + }); + } + + }); +})(jQuery); + diff --git a/TugasAkhir/js/data-table.js b/TugasAkhir/js/data-table.js new file mode 100644 index 0000000..4709d7e --- /dev/null +++ b/TugasAkhir/js/data-table.js @@ -0,0 +1,25 @@ +(function($) { + 'use strict'; + $(function() { + $('#order-listing').DataTable({ + "aLengthMenu": [ + [5, 10, 15, -1], + [5, 10, 15, "All"] + ], + "iDisplayLength": 10, + "language": { + search: "" + } + }); + $('#order-listing').each(function() { + var datatable = $(this); + // SEARCH - Add the placeholder for Search and Turn this into in-line form control + var search_input = datatable.closest('.dataTables_wrapper').find('div[id$=_filter] input'); + search_input.attr('placeholder', 'Search'); + search_input.removeClass('form-control-sm'); + // LENGTH - Inline-Form control + var length_sel = datatable.closest('.dataTables_wrapper').find('div[id$=_length] select'); + length_sel.removeClass('form-control-sm'); + }); + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/data.txt b/TugasAkhir/js/data.txt new file mode 100644 index 0000000..0134693 --- /dev/null +++ b/TugasAkhir/js/data.txt @@ -0,0 +1,97 @@ +{ + "data": [ + { + "id": "1", + "Quote": "Incs234", + "Product": "Car insurance", + "Business": "Business type 1", + "Policy": "Jesse Thomas", + "Premium": "$1200", + "Status": "In progress", + "Updated": "25/04/2020" + },{ + "id": "2", + "Quote": "Incs235", + "Product": "Car insurance", + "Business": "Business type 2", + "Policy": "Jesse Thomas", + "Premium": "$1200", + "Status": "Active", + "Updated": "25/04/2020" + },{ + "id": "3", + "Quote": "Incs235", + "Product": "Car insurance", + "Business": "Business type 2", + "Policy": "Jesse Thomas", + "Premium": "$1200", + "Status": "Expired", + "Updated": "25/04/2020" + },{ + "id": "4", + "Quote": "Incs235", + "Product": "Car insurance", + "Business": "Business type 2", + "Policy": "Jesse Thomas", + "Premium": "$1200", + "Status": "In progress", + "Updated": "25/04/2020" + },{ + "id": "5", + "Quote": "Incs235", + "Product": "Car insurance", + "Business": "Business type 2", + "Policy": "Jesse Thomas", + "Premium": "$1200", + "Status": "Active", + "Updated": "25/04/2020" + },{ + "id": "6", + "Quote": "Incs235", + "Product": "Car insurance", + "Business": "Business type 2", + "Policy": "Jesse Thomas", + "Premium": "$1200", + "Status": "Active", + "Updated": "25/04/2020" + },{ + "id": "7", + "Quote": "Incs235", + "Product": "Car insurance", + "Business": "Business type 2", + "Policy": "Jesse Thomas", + "Premium": "$1200", + "Status": "Active", + "Updated": "25/04/2020" + },{ + "id": "8", + "Quote": "Incs235", + "Product": "Car insurance", + "Business": "Business type 2", + "Policy": "Jesse Thomas", + "Premium": "$1200", + "Status": "Expired", + "Updated": "25/04/2020" + },{ + "id": "9", + "Quote": "Incs235", + "Product": "Car insurance", + "Business": "Business type 2", + "Policy": "Jesse Thomas", + "Premium": "$1200", + "Status": "Active", + "Updated": "25/04/2020" + },{ + "id": "10", + "Quote": "Incs235", + "Product": "Car insurance", + "Business": "Business type 2", + "Policy": "Jesse Thomas", + "Premium": "$1200", + "Status": "In progress", + "Updated": "25/04/2020" + } + + + ] +} \ No newline at end of file diff --git a/TugasAkhir/js/dataTables.select.min.js b/TugasAkhir/js/dataTables.select.min.js new file mode 100644 index 0000000..3765f6c --- /dev/null +++ b/TugasAkhir/js/dataTables.select.min.js @@ -0,0 +1,38 @@ +/*! + Copyright 2015-2019 SpryMedia Ltd. + + This source file is free software, available under the following license: + MIT license - http://datatables.net/license/mit + + This source file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + + For details please refer to: http://www.datatables.net/extensions/select + Select for DataTables 1.3.1 + 2015-2019 SpryMedia Ltd - datatables.net/license/mit +*/ +(function(f){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(k){return f(k,window,document)}):"object"===typeof exports?module.exports=function(k,p){k||(k=window);p&&p.fn.dataTable||(p=require("datatables.net")(k,p).$);return f(p,k,k.document)}:f(jQuery,window,document)})(function(f,k,p,h){function z(a,b,c){var d=function(c,b){if(c>b){var d=b;b=c;c=d}var e=!1;return a.columns(":visible").indexes().filter(function(a){a===c&&(e=!0);return a===b?(e=!1,!0):e})};var e= +function(c,b){var d=a.rows({search:"applied"}).indexes();if(d.indexOf(c)>d.indexOf(b)){var e=b;b=c;c=e}var f=!1;return d.filter(function(a){a===c&&(f=!0);return a===b?(f=!1,!0):f})};a.cells({selected:!0}).any()||c?(d=d(c.column,b.column),c=e(c.row,b.row)):(d=d(0,b.column),c=e(0,b.row));c=a.cells(c,d).flatten();a.cells(b,{selected:!0}).any()?a.cells(c).deselect():a.cells(c).select()}function v(a){var b=a.settings()[0]._select.selector;f(a.table().container()).off("mousedown.dtSelect",b).off("mouseup.dtSelect", +b).off("click.dtSelect",b);f("body").off("click.dtSelect"+a.table().node().id.replace(/[^a-zA-Z0-9\-_]/g,"-"))}function A(a){var b=f(a.table().container()),c=a.settings()[0],d=c._select.selector,e;b.on("mousedown.dtSelect",d,function(a){if(a.shiftKey||a.metaKey||a.ctrlKey)b.css("-moz-user-select","none").one("selectstart.dtSelect",d,function(){return!1});k.getSelection&&(e=k.getSelection())}).on("mouseup.dtSelect",d,function(){b.css("-moz-user-select","")}).on("click.dtSelect",d,function(c){var b= +a.select.items();if(e){var d=k.getSelection();if((!d.anchorNode||f(d.anchorNode).closest("table")[0]===a.table().node())&&d!==e)return}d=a.settings()[0];var l=f.trim(a.settings()[0].oClasses.sWrapper).replace(/ +/g,".");if(f(c.target).closest("div."+l)[0]==a.table().container()&&(l=a.cell(f(c.target).closest("td, th")),l.any())){var g=f.Event("user-select.dt");m(a,g,[b,l,c]);g.isDefaultPrevented()||(g=l.index(),"row"===b?(b=g.row,w(c,a,d,"row",b)):"column"===b?(b=l.index().column,w(c,a,d,"column", +b)):"cell"===b&&(b=l.index(),w(c,a,d,"cell",b)),d._select_lastCell=g)}});f("body").on("click.dtSelect"+a.table().node().id.replace(/[^a-zA-Z0-9\-_]/g,"-"),function(b){!c._select.blurable||f(b.target).parents().filter(a.table().container()).length||0===f(b.target).parents("html").length||f(b.target).parents("div.DTE").length||r(c,!0)})}function m(a,b,c,d){if(!d||a.flatten().length)"string"===typeof b&&(b+=".dt"),c.unshift(a),f(a.table().node()).trigger(b,c)}function B(a){var b=a.settings()[0];if(b._select.info&& +b.aanFeatures.i&&"api"!==a.select.style()){var c=a.rows({selected:!0}).flatten().length,d=a.columns({selected:!0}).flatten().length,e=a.cells({selected:!0}).flatten().length,l=function(b,c,d){b.append(f('').append(a.i18n("select."+c+"s",{_:"%d "+c+"s selected",0:"",1:"1 "+c+" selected"},d)))};f.each(b.aanFeatures.i,function(b,a){a=f(a);b=f('');l(b,"row",c);l(b,"column",d);l(b,"cell",e);var g=a.children("span.select-info");g.length&&g.remove(); +""!==b.text()&&a.append(b)})}}function D(a){var b=new g.Api(a);a.aoRowCreatedCallback.push({fn:function(b,d,e){d=a.aoData[e];d._select_selected&&f(b).addClass(a._select.className);b=0;for(e=a.aoColumns.length;bg){var u=g;g=d;d=u}e.splice(g+1,e.length);e.splice(0,d)}else e.splice(f.inArray(c,e)+1,e.length);a[b](c,{selected:!0}).any()?(e.splice(f.inArray(c,e),1),a[b+"s"](e).deselect()):a[b+"s"](e).select()}function r(a,b){if(b||"single"===a._select.style)a=new g.Api(a),a.rows({selected:!0}).deselect(),a.columns({selected:!0}).deselect(),a.cells({selected:!0}).deselect()}function w(a,b,c,d,e){var f=b.select.style(),g=b.select.toggleable(),h=b[d](e,{selected:!0}).any();if(!h||g)"os"===f?a.ctrlKey|| +a.metaKey?b[d](e).select(!h):a.shiftKey?"cell"===d?z(b,e,c._select_lastCell||null):C(b,d,e,c._select_lastCell?c._select_lastCell[d]:null):(a=b[d+"s"]({selected:!0}),h&&1===a.flatten().length?b[d](e).deselect():(a.deselect(),b[d](e).select())):"multi+shift"==f?a.shiftKey?"cell"===d?z(b,e,c._select_lastCell||null):C(b,d,e,c._select_lastCell?c._select_lastCell[d]:null):b[d](e).select(!h):b[d](e).select(!h)}function t(a,b){return function(c){return c.i18n("buttons."+a,b)}}function x(a){a=a._eventNamespace; +return"draw.dt.DT"+a+" select.dt.DT"+a+" deselect.dt.DT"+a}function E(a,b){return-1!==f.inArray("rows",b.limitTo)&&a.rows({selected:!0}).any()||-1!==f.inArray("columns",b.limitTo)&&a.columns({selected:!0}).any()||-1!==f.inArray("cells",b.limitTo)&&a.cells({selected:!0}).any()?!0:!1}var g=f.fn.dataTable;g.select={};g.select.version="1.3.1";g.select.init=function(a){var b=a.settings()[0],c=b.oInit.select,d=g.defaults.select;c=c===h?d:c;d="row";var e="api",l=!1,u=!0,k=!0,m="td, th",p="selected",n=!1; +b._select={};!0===c?(e="os",n=!0):"string"===typeof c?(e=c,n=!0):f.isPlainObject(c)&&(c.blurable!==h&&(l=c.blurable),c.toggleable!==h&&(u=c.toggleable),c.info!==h&&(k=c.info),c.items!==h&&(d=c.items),e=c.style!==h?c.style:"os",n=!0,c.selector!==h&&(m=c.selector),c.className!==h&&(p=c.className));a.select.selector(m);a.select.items(d);a.select.style(e);a.select.blurable(l);a.select.toggleable(u);a.select.info(k);b._select.className=p;f.fn.dataTable.ext.order["select-checkbox"]=function(b,a){return this.api().column(a, +{order:"index"}).nodes().map(function(a){return"row"===b._select.items?f(a).parent().hasClass(b._select.className):"cell"===b._select.items?f(a).hasClass(b._select.className):!1})};!n&&f(a.table().node()).hasClass("selectable")&&a.select.style("os")};f.each([{type:"row",prop:"aoData"},{type:"column",prop:"aoColumns"}],function(a,b){g.ext.selector[b.type].push(function(a,d,e){d=d.selected;var c=[];if(!0!==d&&!1!==d)return e;for(var f=0,g=e.length;f -1) && + (filter.Age === undefined || client.Age === filter.Age) && + (!filter.Address || client.Address.indexOf(filter.Address) > -1) && + (!filter.Country || client.Country === filter.Country) && + (filter.Married === undefined || client.Married === filter.Married); + }); + }, + + insertItem: function(insertingClient) { + this.clients.push(insertingClient); + }, + + updateItem: function(updatingClient) {}, + + deleteItem: function(deletingClient) { + var clientIndex = $.inArray(deletingClient, this.clients); + this.clients.splice(clientIndex, 1); + } + + }; + + window.db = db; + + + db.countries = [{ + Name: "", + Id: 0 + }, + { + Name: "United States", + Id: 1 + }, + { + Name: "Canada", + Id: 2 + }, + { + Name: "United Kingdom", + Id: 3 + }, + { + Name: "France", + Id: 4 + }, + { + Name: "Brazil", + Id: 5 + }, + { + Name: "China", + Id: 6 + }, + { + Name: "Russia", + Id: 7 + } + ]; + + db.clients = [{ + "Name": "Otto Clay", + "Age": 61, + "Country": 6, + "Address": "Ap #897-1459 Quam Avenue", + "Married": false + }, + { + "Name": "Connor Johnston", + "Age": 73, + "Country": 7, + "Address": "Ap #370-4647 Dis Av.", + "Married": false + }, + { + "Name": "Lacey Hess", + "Age": 29, + "Country": 7, + "Address": "Ap #365-8835 Integer St.", + "Married": false + }, + { + "Name": "Timothy Henson", + "Age": 78, + "Country": 1, + "Address": "911-5143 Luctus Ave", + "Married": false + }, + { + "Name": "Ramona Benton", + "Age": 43, + "Country": 5, + "Address": "Ap #614-689 Vehicula Street", + "Married": true + }, + { + "Name": "Ezra Tillman", + "Age": 51, + "Country": 1, + "Address": "P.O. Box 738, 7583 Quisque St.", + "Married": true + }, + { + "Name": "Dante Carter", + "Age": 59, + "Country": 1, + "Address": "P.O. Box 976, 6316 Lorem, St.", + "Married": false + }, + { + "Name": "Christopher Mcclure", + "Age": 58, + "Country": 1, + "Address": "847-4303 Dictum Av.", + "Married": true + }, + { + "Name": "Ruby Rocha", + "Age": 62, + "Country": 2, + "Address": "5212 Sagittis Ave", + "Married": false + }, + { + "Name": "Imelda Hardin", + "Age": 39, + "Country": 5, + "Address": "719-7009 Auctor Av.", + "Married": false + }, + { + "Name": "Jonah Johns", + "Age": 28, + "Country": 5, + "Address": "P.O. Box 939, 9310 A Ave", + "Married": false + }, + { + "Name": "Herman Rosa", + "Age": 49, + "Country": 7, + "Address": "718-7162 Molestie Av.", + "Married": true + }, + { + "Name": "Arthur Gay", + "Age": 20, + "Country": 7, + "Address": "5497 Neque Street", + "Married": false + }, + { + "Name": "Xena Wilkerson", + "Age": 63, + "Country": 1, + "Address": "Ap #303-6974 Proin Street", + "Married": true + }, + { + "Name": "Lilah Atkins", + "Age": 33, + "Country": 5, + "Address": "622-8602 Gravida Ave", + "Married": true + }, + { + "Name": "Malik Shepard", + "Age": 59, + "Country": 1, + "Address": "967-5176 Tincidunt Av.", + "Married": false + }, + { + "Name": "Keely Silva", + "Age": 24, + "Country": 1, + "Address": "P.O. Box 153, 8995 Praesent Ave", + "Married": false + }, + { + "Name": "Hunter Pate", + "Age": 73, + "Country": 7, + "Address": "P.O. Box 771, 7599 Ante, Road", + "Married": false + }, + { + "Name": "Mikayla Roach", + "Age": 55, + "Country": 5, + "Address": "Ap #438-9886 Donec Rd.", + "Married": true + }, + { + "Name": "Upton Joseph", + "Age": 48, + "Country": 4, + "Address": "Ap #896-7592 Habitant St.", + "Married": true + }, + { + "Name": "Jeanette Pate", + "Age": 59, + "Country": 2, + "Address": "P.O. Box 177, 7584 Amet, St.", + "Married": false + }, + { + "Name": "Kaden Hernandez", + "Age": 79, + "Country": 3, + "Address": "366 Ut St.", + "Married": true + }, + { + "Name": "Kenyon Stevens", + "Age": 20, + "Country": 3, + "Address": "P.O. Box 704, 4580 Gravida Rd.", + "Married": false + }, + { + "Name": "Jerome Harper", + "Age": 31, + "Country": 5, + "Address": "2464 Porttitor Road", + "Married": false + }, + { + "Name": "Jelani Patel", + "Age": 36, + "Country": 2, + "Address": "P.O. Box 541, 5805 Nec Av.", + "Married": true + }, + { + "Name": "Keaton Oconnor", + "Age": 21, + "Country": 1, + "Address": "Ap #657-1093 Nec, Street", + "Married": false + }, + { + "Name": "Bree Johnston", + "Age": 31, + "Country": 2, + "Address": "372-5942 Vulputate Avenue", + "Married": false + }, + { + "Name": "Maisie Hodges", + "Age": 70, + "Country": 7, + "Address": "P.O. Box 445, 3880 Odio, Rd.", + "Married": false + }, + { + "Name": "Kuame Calhoun", + "Age": 39, + "Country": 2, + "Address": "P.O. Box 609, 4105 Rutrum St.", + "Married": true + }, + { + "Name": "Carlos Cameron", + "Age": 38, + "Country": 5, + "Address": "Ap #215-5386 A, Avenue", + "Married": false + }, + { + "Name": "Fulton Parsons", + "Age": 25, + "Country": 7, + "Address": "P.O. Box 523, 3705 Sed Rd.", + "Married": false + }, + { + "Name": "Wallace Christian", + "Age": 43, + "Country": 3, + "Address": "416-8816 Mauris Avenue", + "Married": true + }, + { + "Name": "Caryn Maldonado", + "Age": 40, + "Country": 1, + "Address": "108-282 Nonummy Ave", + "Married": false + }, + { + "Name": "Whilemina Frank", + "Age": 20, + "Country": 7, + "Address": "P.O. Box 681, 3938 Egestas. Av.", + "Married": true + }, + { + "Name": "Emery Moon", + "Age": 41, + "Country": 4, + "Address": "Ap #717-8556 Non Road", + "Married": true + }, + { + "Name": "Price Watkins", + "Age": 35, + "Country": 4, + "Address": "832-7810 Nunc Rd.", + "Married": false + }, + { + "Name": "Lydia Castillo", + "Age": 59, + "Country": 7, + "Address": "5280 Placerat, Ave", + "Married": true + }, + { + "Name": "Lawrence Conway", + "Age": 53, + "Country": 1, + "Address": "Ap #452-2808 Imperdiet St.", + "Married": false + }, + { + "Name": "Kalia Nicholson", + "Age": 67, + "Country": 5, + "Address": "P.O. Box 871, 3023 Tellus Road", + "Married": true + }, + { + "Name": "Brielle Baxter", + "Age": 45, + "Country": 3, + "Address": "Ap #822-9526 Ut, Road", + "Married": true + }, + { + "Name": "Valentine Brady", + "Age": 72, + "Country": 7, + "Address": "8014 Enim. Road", + "Married": true + }, + { + "Name": "Rebecca Gardner", + "Age": 57, + "Country": 4, + "Address": "8655 Arcu. Road", + "Married": true + }, + { + "Name": "Vladimir Tate", + "Age": 26, + "Country": 1, + "Address": "130-1291 Non, Rd.", + "Married": true + }, + { + "Name": "Vernon Hays", + "Age": 56, + "Country": 4, + "Address": "964-5552 In Rd.", + "Married": true + }, + { + "Name": "Allegra Hull", + "Age": 22, + "Country": 4, + "Address": "245-8891 Donec St.", + "Married": true + }, + { + "Name": "Hu Hendrix", + "Age": 65, + "Country": 7, + "Address": "428-5404 Tempus Ave", + "Married": true + }, + { + "Name": "Kenyon Battle", + "Age": 32, + "Country": 2, + "Address": "921-6804 Lectus St.", + "Married": false + }, + { + "Name": "Gloria Nielsen", + "Age": 24, + "Country": 4, + "Address": "Ap #275-4345 Lorem, Street", + "Married": true + }, + { + "Name": "Illiana Kidd", + "Age": 59, + "Country": 2, + "Address": "7618 Lacus. Av.", + "Married": false + }, + { + "Name": "Adria Todd", + "Age": 68, + "Country": 6, + "Address": "1889 Tincidunt Road", + "Married": false + }, + { + "Name": "Kirsten Mayo", + "Age": 71, + "Country": 1, + "Address": "100-8640 Orci, Avenue", + "Married": false + }, + { + "Name": "Willa Hobbs", + "Age": 60, + "Country": 6, + "Address": "P.O. Box 323, 158 Tristique St.", + "Married": false + }, + { + "Name": "Alexis Clements", + "Age": 69, + "Country": 5, + "Address": "P.O. Box 176, 5107 Proin Rd.", + "Married": false + }, + { + "Name": "Akeem Conrad", + "Age": 60, + "Country": 2, + "Address": "282-495 Sed Ave", + "Married": true + }, + { + "Name": "Montana Silva", + "Age": 79, + "Country": 6, + "Address": "P.O. Box 120, 9766 Consectetuer St.", + "Married": false + }, + { + "Name": "Kaseem Hensley", + "Age": 77, + "Country": 6, + "Address": "Ap #510-8903 Mauris. Av.", + "Married": true + }, + { + "Name": "Christopher Morton", + "Age": 35, + "Country": 5, + "Address": "P.O. Box 234, 3651 Sodales Avenue", + "Married": false + }, + { + "Name": "Wade Fernandez", + "Age": 49, + "Country": 6, + "Address": "740-5059 Dolor. Road", + "Married": true + }, + { + "Name": "Illiana Kirby", + "Age": 31, + "Country": 2, + "Address": "527-3553 Mi Ave", + "Married": false + }, + { + "Name": "Kimberley Hurley", + "Age": 65, + "Country": 5, + "Address": "P.O. Box 637, 9915 Dictum St.", + "Married": false + }, + { + "Name": "Arthur Olsen", + "Age": 74, + "Country": 5, + "Address": "887-5080 Eget St.", + "Married": false + }, + { + "Name": "Brody Potts", + "Age": 59, + "Country": 2, + "Address": "Ap #577-7690 Sem Road", + "Married": false + }, + { + "Name": "Dillon Ford", + "Age": 60, + "Country": 1, + "Address": "Ap #885-9289 A, Av.", + "Married": true + }, + { + "Name": "Hannah Juarez", + "Age": 61, + "Country": 2, + "Address": "4744 Sapien, Rd.", + "Married": true + }, + { + "Name": "Vincent Shaffer", + "Age": 25, + "Country": 2, + "Address": "9203 Nunc St.", + "Married": true + }, + { + "Name": "George Holt", + "Age": 27, + "Country": 6, + "Address": "4162 Cras Rd.", + "Married": false + }, + { + "Name": "Tobias Bartlett", + "Age": 74, + "Country": 4, + "Address": "792-6145 Mauris St.", + "Married": true + }, + { + "Name": "Xavier Hooper", + "Age": 35, + "Country": 1, + "Address": "879-5026 Interdum. Rd.", + "Married": false + }, + { + "Name": "Declan Dorsey", + "Age": 31, + "Country": 2, + "Address": "Ap #926-4171 Aenean Road", + "Married": true + }, + { + "Name": "Clementine Tran", + "Age": 43, + "Country": 4, + "Address": "P.O. Box 176, 9865 Eu Rd.", + "Married": true + }, + { + "Name": "Pamela Moody", + "Age": 55, + "Country": 6, + "Address": "622-6233 Luctus Rd.", + "Married": true + }, + { + "Name": "Julie Leon", + "Age": 43, + "Country": 6, + "Address": "Ap #915-6782 Sem Av.", + "Married": true + }, + { + "Name": "Shana Nolan", + "Age": 79, + "Country": 5, + "Address": "P.O. Box 603, 899 Eu St.", + "Married": false + }, + { + "Name": "Vaughan Moody", + "Age": 37, + "Country": 5, + "Address": "880 Erat Rd.", + "Married": false + }, + { + "Name": "Randall Reeves", + "Age": 44, + "Country": 3, + "Address": "1819 Non Street", + "Married": false + }, + { + "Name": "Dominic Raymond", + "Age": 68, + "Country": 1, + "Address": "Ap #689-4874 Nisi Rd.", + "Married": true + }, + { + "Name": "Lev Pugh", + "Age": 69, + "Country": 5, + "Address": "Ap #433-6844 Auctor Avenue", + "Married": true + }, + { + "Name": "Desiree Hughes", + "Age": 80, + "Country": 4, + "Address": "605-6645 Fermentum Avenue", + "Married": true + }, + { + "Name": "Idona Oneill", + "Age": 23, + "Country": 7, + "Address": "751-8148 Aliquam Avenue", + "Married": true + }, + { + "Name": "Lani Mayo", + "Age": 76, + "Country": 1, + "Address": "635-2704 Tristique St.", + "Married": true + }, + { + "Name": "Cathleen Bonner", + "Age": 40, + "Country": 1, + "Address": "916-2910 Dolor Av.", + "Married": false + }, + { + "Name": "Sydney Murray", + "Age": 44, + "Country": 5, + "Address": "835-2330 Fringilla St.", + "Married": false + }, + { + "Name": "Brenna Rodriguez", + "Age": 77, + "Country": 6, + "Address": "3687 Imperdiet Av.", + "Married": true + }, + { + "Name": "Alfreda Mcdaniel", + "Age": 38, + "Country": 7, + "Address": "745-8221 Aliquet Rd.", + "Married": true + }, + { + "Name": "Zachery Atkins", + "Age": 30, + "Country": 1, + "Address": "549-2208 Auctor. Road", + "Married": true + }, + { + "Name": "Amelia Rich", + "Age": 56, + "Country": 4, + "Address": "P.O. Box 734, 4717 Nunc Rd.", + "Married": false + }, + { + "Name": "Kiayada Witt", + "Age": 62, + "Country": 3, + "Address": "Ap #735-3421 Malesuada Avenue", + "Married": false + }, + { + "Name": "Lysandra Pierce", + "Age": 36, + "Country": 1, + "Address": "Ap #146-2835 Curabitur St.", + "Married": true + }, + { + "Name": "Cara Rios", + "Age": 58, + "Country": 4, + "Address": "Ap #562-7811 Quam. Ave", + "Married": true + }, + { + "Name": "Austin Andrews", + "Age": 55, + "Country": 7, + "Address": "P.O. Box 274, 5505 Sociis Rd.", + "Married": false + }, + { + "Name": "Lillian Peterson", + "Age": 39, + "Country": 2, + "Address": "6212 A Avenue", + "Married": false + }, + { + "Name": "Adria Beach", + "Age": 29, + "Country": 2, + "Address": "P.O. Box 183, 2717 Nunc Avenue", + "Married": true + }, + { + "Name": "Oleg Durham", + "Age": 80, + "Country": 4, + "Address": "931-3208 Nunc Rd.", + "Married": false + }, + { + "Name": "Casey Reese", + "Age": 60, + "Country": 4, + "Address": "383-3675 Ultrices, St.", + "Married": false + }, + { + "Name": "Kane Burnett", + "Age": 80, + "Country": 1, + "Address": "759-8212 Dolor. Ave", + "Married": false + }, + { + "Name": "Stewart Wilson", + "Age": 46, + "Country": 7, + "Address": "718-7845 Sagittis. Av.", + "Married": false + }, + { + "Name": "Charity Holcomb", + "Age": 31, + "Country": 6, + "Address": "641-7892 Enim. Ave", + "Married": false + }, + { + "Name": "Kyra Cummings", + "Age": 43, + "Country": 4, + "Address": "P.O. Box 702, 6621 Mus. Av.", + "Married": false + }, + { + "Name": "Stuart Wallace", + "Age": 25, + "Country": 7, + "Address": "648-4990 Sed Rd.", + "Married": true + }, + { + "Name": "Carter Clarke", + "Age": 59, + "Country": 6, + "Address": "Ap #547-2921 A Street", + "Married": false + } + ]; + + db.users = [{ + "ID": "x", + "Account": "A758A693-0302-03D1-AE53-EEFE22855556", + "Name": "Carson Kelley", + "RegisterDate": "2002-04-20T22:55:52-07:00" + }, + { + "Account": "D89FF524-1233-0CE7-C9E1-56EFF017A321", + "Name": "Prescott Griffin", + "RegisterDate": "2011-02-22T05:59:55-08:00" + }, + { + "Account": "06FAAD9A-5114-08F6-D60C-961B2528B4F0", + "Name": "Amir Saunders", + "RegisterDate": "2014-08-13T09:17:49-07:00" + }, + { + "Account": "EED7653D-7DD9-A722-64A8-36A55ECDBE77", + "Name": "Derek Thornton", + "RegisterDate": "2012-02-27T01:31:07-08:00" + }, + { + "Account": "2A2E6D40-FEBD-C643-A751-9AB4CAF1E2F6", + "Name": "Fletcher Romero", + "RegisterDate": "2010-06-25T15:49:54-07:00" + }, + { + "Account": "3978F8FA-DFF0-DA0E-0A5D-EB9D281A3286", + "Name": "Thaddeus Stein", + "RegisterDate": "2013-11-10T07:29:41-08:00" + }, + { + "Account": "658DBF5A-176E-569A-9273-74FB5F69FA42", + "Name": "Nash Knapp", + "RegisterDate": "2005-06-24T09:11:19-07:00" + }, + { + "Account": "76D2EE4B-7A73-1212-F6F2-957EF8C1F907", + "Name": "Quamar Vega", + "RegisterDate": "2011-04-13T20:06:29-07:00" + }, + { + "Account": "00E46809-A595-CE82-C5B4-D1CAEB7E3E58", + "Name": "Philip Galloway", + "RegisterDate": "2008-08-21T18:59:38-07:00" + }, + { + "Account": "C196781C-DDCC-AF83-DDC2-CA3E851A47A0", + "Name": "Mason French", + "RegisterDate": "2000-11-15T00:38:37-08:00" + }, + { + "Account": "5911F201-818A-B393-5888-13157CE0D63F", + "Name": "Ross Cortez", + "RegisterDate": "2010-05-27T17:35:32-07:00" + }, + { + "Account": "B8BB78F9-E1A1-A956-086F-E12B6FE168B6", + "Name": "Logan King", + "RegisterDate": "2003-07-08T16:58:06-07:00" + }, + { + "Account": "06F636C3-9599-1A2D-5FD5-86B24ADDE626", + "Name": "Cedric Leblanc", + "RegisterDate": "2011-06-30T14:30:10-07:00" + }, + { + "Account": "FE880CDD-F6E7-75CB-743C-64C6DE192412", + "Name": "Simon Sullivan", + "RegisterDate": "2013-06-11T16:35:07-07:00" + }, + { + "Account": "BBEDD673-E2C1-4872-A5D3-C4EBD4BE0A12", + "Name": "Jamal West", + "RegisterDate": "2001-03-16T20:18:29-08:00" + }, + { + "Account": "19BC22FA-C52E-0CC6-9552-10365C755FAC", + "Name": "Hector Morales", + "RegisterDate": "2012-11-01T01:56:34-07:00" + }, + { + "Account": "A8292214-2C13-5989-3419-6B83DD637D6C", + "Name": "Herrod Hart", + "RegisterDate": "2008-03-13T19:21:04-07:00" + }, + { + "Account": "0285564B-F447-0E7F-EAA1-7FB8F9C453C8", + "Name": "Clark Maxwell", + "RegisterDate": "2004-08-05T08:22:24-07:00" + }, + { + "Account": "EA78F076-4F6E-4228-268C-1F51272498AE", + "Name": "Reuben Walter", + "RegisterDate": "2011-01-23T01:55:59-08:00" + }, + { + "Account": "6A88C194-EA21-426F-4FE2-F2AE33F51793", + "Name": "Ira Ingram", + "RegisterDate": "2008-08-15T05:57:46-07:00" + }, + { + "Account": "4275E873-439C-AD26-56B3-8715E336508E", + "Name": "Damian Morrow", + "RegisterDate": "2015-09-13T01:50:55-07:00" + }, + { + "Account": "A0D733C4-9070-B8D6-4387-D44F0BA515BE", + "Name": "Macon Farrell", + "RegisterDate": "2011-03-14T05:41:40-07:00" + }, + { + "Account": "B3683DE8-C2FA-7CA0-A8A6-8FA7E954F90A", + "Name": "Joel Galloway", + "RegisterDate": "2003-02-03T04:19:01-08:00" + }, + { + "Account": "01D95A8E-91BC-2050-F5D0-4437AAFFD11F", + "Name": "Rigel Horton", + "RegisterDate": "2015-06-20T11:53:11-07:00" + }, + { + "Account": "F0D12CC0-31AC-A82E-FD73-EEEFDBD21A36", + "Name": "Sylvester Gaines", + "RegisterDate": "2004-03-12T09:57:13-08:00" + }, + { + "Account": "874FCC49-9A61-71BC-2F4E-2CE88348AD7B", + "Name": "Abbot Mckay", + "RegisterDate": "2008-12-26T20:42:57-08:00" + }, + { + "Account": "B8DA1912-20A0-FB6E-0031-5F88FD63EF90", + "Name": "Solomon Green", + "RegisterDate": "2013-09-04T01:44:47-07:00" + } + ]; + + }()); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/demo.js b/TugasAkhir/js/demo.js new file mode 100644 index 0000000..6dcf1ad --- /dev/null +++ b/TugasAkhir/js/demo.js @@ -0,0 +1,10 @@ +(function($) { + 'use strict'; + $(function() { + $("#features-link").on("click", function() { + $('html, body').animate({ + scrollTop: $("#features").offset().top + }, 1000); + }); + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/desktop-notification.js b/TugasAkhir/js/desktop-notification.js new file mode 100644 index 0000000..073e4b8 --- /dev/null +++ b/TugasAkhir/js/desktop-notification.js @@ -0,0 +1,80 @@ +(function($) { + 'use strict'; + $.fn.easyNotify = function(options) { + + var settings = $.extend({ + title: "Notification", + options: { + body: "", + icon: "", + lang: 'pt-BR', + onClose: "", + onClick: "", + onError: "" + } + }, options); + + this.init = function() { + var notify = this; + if (!("Notification" in window)) { + alert("This browser does not support desktop notification"); + } else if (Notification.permission === "granted") { + + var notification = new Notification(settings.title, settings.options); + + notification.onclose = function() { + if (typeof settings.options.onClose === 'function') { + settings.options.onClose(); + } + }; + + notification.onclick = function() { + if (typeof settings.options.onClick === 'function') { + settings.options.onClick(); + } + }; + + notification.onerror = function() { + if (typeof settings.options.onError === 'function') { + settings.options.onError(); + } + }; + + } else if (Notification.permission !== 'denied') { + Notification.requestPermission(function(permission) { + if (permission === "granted") { + notify.init(); + } + + }); + } + + }; + + this.init(); + return this; + }; + + + //Initialise notification + var myFunction = function() { + alert('Click function'); + }; + var myImg = "https://unsplash.it/600/600?image=777"; + + $("form").submit(function(event) { + event.preventDefault(); + + var options = { + title: $("#title").val(), + options: { + body: $("#message").val(), + icon: myImg, + lang: 'en-US', + onClick: myFunction + } + }; + console.log(options); + $("#easyNotify").easyNotify(options); + }); +}(jQuery)); \ No newline at end of file diff --git a/TugasAkhir/js/dragula.js b/TugasAkhir/js/dragula.js new file mode 100644 index 0000000..758f5bd --- /dev/null +++ b/TugasAkhir/js/dragula.js @@ -0,0 +1,16 @@ +(function($) { + 'use strict'; + var iconTochange; + dragula([document.getElementById("dragula-left"), document.getElementById("dragula-right")]); + dragula([document.getElementById("profile-list-left"), document.getElementById("profile-list-right")]); + dragula([document.getElementById("dragula-event-left"), document.getElementById("dragula-event-right")]) + .on('drop', function(el) { + console.log($(el)); + iconTochange = $(el).find('.ti'); + if (iconTochange.hasClass('ti-pin-alt')) { + iconTochange.removeClass('ti-pin-alt text-primary').addClass('ti-time text-success'); + } else if (iconTochange.hasClass('ti-time')) { + iconTochange.removeClass('ti-time text-success').addClass('ti-pin-alt text-primary'); + } + }) +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/dropify.js b/TugasAkhir/js/dropify.js new file mode 100644 index 0000000..1a74da3 --- /dev/null +++ b/TugasAkhir/js/dropify.js @@ -0,0 +1,4 @@ +(function($) { + 'use strict'; + $('.dropify').dropify(); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/dropzone.js b/TugasAkhir/js/dropzone.js new file mode 100644 index 0000000..991ec71 --- /dev/null +++ b/TugasAkhir/js/dropzone.js @@ -0,0 +1,6 @@ +(function($) { + 'use strict'; + $("my-awesome-dropzone").dropzone({ + url: "bootstrapdash.com/" + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/editorDemo.js b/TugasAkhir/js/editorDemo.js new file mode 100644 index 0000000..613eb76 --- /dev/null +++ b/TugasAkhir/js/editorDemo.js @@ -0,0 +1,219 @@ +(function($) { + 'use strict'; + /*Quill editor*/ + if ($("#quillExample1").length) { + var quill = new Quill('#quillExample1', { + modules: { + toolbar: [ + [{ + header: [1, 2, false] + }], + ['bold', 'italic', 'underline'], + ['image', 'code-block'] + ] + }, + placeholder: 'Compose an epic...', + theme: 'snow' // or 'bubble' + }); + } + + /*simplemde editor*/ + if ($("#simpleMde").length) { + var simplemde = new SimpleMDE({ + element: $("#simpleMde")[0] + }); + } + + /*Tinymce editor*/ + if ($("#tinyMceExample").length) { + tinymce.init({ + selector: '#tinyMceExample', + height: 500, + theme: 'silver', + plugins: [ + 'advlist autolink lists link image charmap print preview hr anchor pagebreak', + 'searchreplace wordcount visualblocks visualchars code fullscreen' + ], + toolbar1: 'undo redo | insert | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image', + toolbar2: 'print preview media | forecolor backcolor emoticons | codesample help', + image_advtab: true, + templates: [{ + title: 'Test template 1', + content: 'Test 1' + }, + { + title: 'Test template 2', + content: 'Test 2' + } + ], + content_css: [] + }); + } + + /*Summernote editor*/ + if ($("#summernoteExample").length) { + $('#summernoteExample').summernote({ + height: 300, + tabsize: 2 + }); + } + + /*X-editable editor*/ + if ($('#editable-form').length) { + $.fn.editable.defaults.mode = 'inline'; + $.fn.editableform.buttons = + '' + + ''; + $('#username').editable({ + type: 'text', + pk: 1, + name: 'username', + title: 'Enter username' + }); + + $('#firstname').editable({ + validate: function(value) { + if ($.trim(value) === '') return 'This field is required'; + } + }); + + $('#sex').editable({ + source: [{ + value: 1, + text: 'Male' + }, + { + value: 2, + text: 'Female' + } + ] + }); + + $('#status').editable(); + + $('#group').editable({ + showbuttons: false + }); + + $('#vacation').editable({ + datepicker: { + todayBtn: 'linked' + } + }); + + $('#dob').editable(); + + $('#event').editable({ + placement: 'right', + combodate: { + firstItem: 'name' + } + }); + + $('#meeting_start').editable({ + format: 'yyyy-mm-dd hh:ii', + viewformat: 'dd/mm/yyyy hh:ii', + validate: function(v) { + if (v && v.getDate() === 10) return 'Day cant be 10!'; + }, + datetimepicker: { + todayBtn: 'linked', + weekStart: 1 + } + }); + + $('#comments').editable({ + showbuttons: 'bottom' + }); + + $('#note').editable(); + $('#pencil').on("click", function(e) { + e.stopPropagation(); + e.preventDefault(); + $('#note').editable('toggle'); + }); + + $('#state').editable({ + source: ["Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Dakota", "North Carolina", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"] + }); + + $('#state2').editable({ + value: 'California', + typeahead: { + name: 'state', + local: ["Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Dakota", "North Carolina", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"] + } + }); + + $('#fruits').editable({ + pk: 1, + limit: 3, + source: [{ + value: 1, + text: 'banana' + }, + { + value: 2, + text: 'peach' + }, + { + value: 3, + text: 'apple' + }, + { + value: 4, + text: 'watermelon' + }, + { + value: 5, + text: 'orange' + } + ] + }); + + $('#tags').editable({ + inputclass: 'input-large', + select2: { + tags: ['html', 'javascript', 'css', 'ajax'], + tokenSeparators: [",", " "] + } + }); + + $('#address').editable({ + url: '/post', + value: { + city: "Moscow", + street: "Lenina", + building: "12" + }, + validate: function(value) { + if (value.city === '') return 'city is required!'; + }, + display: function(value) { + if (!value) { + $(this).empty(); + return; + } + var html = '' + $('
').text(value.city).html() + ', ' + $('
').text(value.street).html() + ' st., bld. ' + $('
').text(value.building).html(); + $(this).html(html); + } + }); + + $('#user .editable').on('hidden', function(e, reason) { + if (reason === 'save' || reason === 'nochange') { + var $next = $(this).closest('tr').next().find('.editable'); + if ($('#autoopen').is(':checked')) { + setTimeout(function() { + $next.editable('show'); + }, 300); + } else { + $next.focus(); + } + } + }); + } +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/file-upload.js b/TugasAkhir/js/file-upload.js new file mode 100644 index 0000000..6991221 --- /dev/null +++ b/TugasAkhir/js/file-upload.js @@ -0,0 +1,12 @@ +(function($) { + 'use strict'; + $(function() { + $('.file-upload-browse').on('click', function() { + var file = $(this).parent().parent().parent().find('.file-upload-default'); + file.trigger('click'); + }); + $('.file-upload-default').on('change', function() { + $(this).parent().find('.form-control').val($(this).val().replace(/C:\\fakepath\\/i, '')); + }); + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/flot-chart.js b/TugasAkhir/js/flot-chart.js new file mode 100644 index 0000000..28b11f4 --- /dev/null +++ b/TugasAkhir/js/flot-chart.js @@ -0,0 +1,563 @@ +(function($) { + 'use strict'; + var data = [{ + data: 18000, + color: '#FABA66', + label: 'Linda' + }, + { + data: 20000, + color: '#F36368', + label: 'John' + }, + { + data: 13000, + color: '#76C1FA', + label: 'Margaret' + }, + { + data: 15000, + color: '#63CF72', + label: 'Richard' + } + ]; + + if ($("#pie-chart").length) { + $.plot("#pie-chart", data, { + series: { + pie: { + show: true, + radius: 1, + label: { + show: true, + radius: 3 / 4, + formatter: labelFormatter, + background: { + opacity: 0.5 + } + } + } + }, + legend: { + show: false + } + }); + } + + function labelFormatter(label, series) { + return "
" + label + "
" + Math.round(series.percent) + "%
"; + } + + + /*--------------------- + ----- LINE CHART ----- + ---------------------*/ + + var d1 = [ + [0, 30], + [1, 35], + [2, 35], + [3, 30], + [4, 30] + ]; + var d2 = [ + [0, 50], + [1, 40], + [2, 45], + [3, 60], + [4, 50] + ]; + var d3 = [ + [0, 40], + [1, 50], + [2, 35], + [3, 25], + [4, 40] + ]; + + var stackedData = [{ + data: d1, + color: "#76C1FA" + }, + { + data: d2, + color: "#63CF72" + }, + { + data: d3, + color: "#F36368" + } + ]; + /*--------------------------------------------------- + Make some random data for Recent Items chart + ---------------------------------------------------*/ + + + var options = { + series: { + shadowSize: 0, + lines: { + show: true, + }, + }, + grid: { + borderWidth: 1, + labelMargin: 10, + mouseActiveRadius: 6, + borderColor: '#eee', + show: true, + hoverable: true, + clickable: true + + }, + xaxis: { + tickColor: '#eee', + tickDecimals: 0, + font: { + lineHeight: 15, + style: "normal", + color: "#000" + }, + shadowSize: 0, + ticks: [ + [0, "Jan"], + [1, "Feb"], + [2, "Mar"], + [3, "Apr"], + [4, "May"], + [5, "Jun"], + [6, "Jul"], + [7, "Aug"], + [8, "Sep"], + [9, "Oct"], + [10, "Nov"], + [11, "Dec"] + ] + }, + + yaxis: { + tickColor: '#eee', + tickDecimals: 0, + font: { + lineHeight: 15, + style: "normal", + color: "#000", + }, + shadowSize: 0 + }, + + legend: { + container: '.flc-line', + backgroundOpacity: 0.5, + noColumns: 0, + backgroundColor: "white", + lineWidth: 0 + }, + colors: ["#F36368", "#63CF72", "#68B3C8"] + }; + + + if ($("#line-chart").length) { + $.plot($("#line-chart"), [{ + data: d1, + lines: { + show: true + }, + label: 'Product A', + stack: true, + color: '#F36368' + }, + { + data: d2, + lines: { + show: true + }, + label: 'Product B', + stack: true, + color: '#FABA66' + }, + { + data: d3, + lines: { + show: true + }, + label: 'Product C', + stack: true, + color: '#68B3C8' + } + ], options); + } + + + + + /*--------------------------------- + Tooltips for Flot Charts + ---------------------------------*/ + if ($(".flot-chart-line").length) { + $(".flot-chart-line").on("bind", "plothover", function(event, pos, item) { + if (item) { + var x = item.datapoint[0].toFixed(2), + y = item.datapoint[1].toFixed(2); + $(".flot-tooltip").html(item.series.label + " Sales " + " : " + y).css({ + top: item.pageY + 5, + left: item.pageX + 5 + }).show(); + } else { + $(".flot-tooltip").hide(); + } + }); + + $("
").appendTo("body"); + } + + + + + /*--------------------- + ----- AREA CHART ----- + ---------------------*/ + + + var d1 = [ + [0, 0], + [1, 35], + [2, 35], + [3, 30], + [4, 30], + [5, 5], + [6, 32], + [7, 37], + [8, 30], + [9, 35], + [10, 30], + [11, 5] + ]; + + + var options = { + series: { + shadowSize: 0, + curvedLines: { //This is a third party plugin to make curved lines + apply: true, + active: true, + monotonicFit: true + }, + lines: { + show: false, + fill: 0.98, + lineWidth: 0, + }, + }, + grid: { + borderWidth: 0, + labelMargin: 10, + hoverable: true, + clickable: true, + mouseActiveRadius: 6, + + }, + xaxis: { + tickDecimals: 0, + tickLength: 0 + }, + + yaxis: { + tickDecimals: 0, + tickLength: 0 + }, + + legend: { + show: false + } + }; + + var curvedLineOptions = { + series: { + shadowSize: 0, + curvedLines: { //This is a third party plugin to make curved lines + apply: true, + active: true, + monotonicFit: true + }, + lines: { + show: false, + lineWidth: 0, + }, + }, + grid: { + borderWidth: 0, + labelMargin: 10, + hoverable: true, + clickable: true, + mouseActiveRadius: 6, + + }, + xaxis: { + tickDecimals: 0, + ticks: false + }, + + yaxis: { + tickDecimals: 0, + ticks: false + }, + + legend: { + noColumns: 4, + container: $("#chartLegend") + } + }; + + if ($("#area-chart").length) { + $.plot($("#area-chart"), [{ + data: d1, + lines: { + show: true, + fill: 0.6 + }, + label: 'Product 1', + stack: true, + color: '#76C1FA' + }], options); + } + + + + + /*--------------------- + ----- COLUMN CHART ----- + ---------------------*/ + + $(function() { + + var data = [ + ["January", 10], + ["February", 8], + ["March", 4], + ["April", 13], + ["May", 17], + ["June", 9] + ]; + + if ($("#column-chart").length) { + $.plot("#column-chart", [data], { + series: { + bars: { + show: true, + barWidth: 0.6, + align: "center" + } + }, + xaxis: { + mode: "categories", + tickLength: 0 + }, + + grid: { + borderWidth: 0, + labelMargin: 10, + hoverable: true, + clickable: true, + mouseActiveRadius: 6, + } + + }); + } + }); + + + + /*-------------------------------- + ----- STACKED CHART ----- + --------------------------------*/ + + $(function() { + + var d1 = []; + for (var i = 0; i <= 10; i += 1) { + d1.push([i, parseInt(Math.random() * 30)]); + } + + var d2 = []; + for (var i = 0; i <= 10; i += 1) { + d2.push([i, parseInt(Math.random() * 30)]); + } + + var d3 = []; + for (var i = 0; i <= 10; i += 1) { + d3.push([i, parseInt(Math.random() * 30)]); + } + + if ($("#stacked-bar-chart").length) { + $.plot("#stacked-bar-chart", stackedData, { + series: { + stack: 0, + lines: { + show: false, + fill: true, + steps: false + }, + bars: { + show: true, + fill: true, + barWidth: 0.6 + }, + }, + grid: { + borderWidth: 0, + labelMargin: 10, + hoverable: true, + clickable: true, + mouseActiveRadius: 6, + } + }); + } + }); + + /*-------------------------------- + ----- REALTIME CHART ----- + --------------------------------*/ + $(function() { + + // We use an inline data source in the example, usually data would + // be fetched from a server + + var data = [], + totalPoints = 300; + + function getRandomData() { + + if (data.length > 0) + data = data.slice(1); + + // Do a random walk + + while (data.length < totalPoints) { + + var prev = data.length > 0 ? data[data.length - 1] : 50, + y = prev + Math.random() * 10 - 5; + + if (y < 0) { + y = 0; + } else if (y > 100) { + y = 100; + } + + data.push(y); + } + + // Zip the generated y values with the x values + + var res = []; + for (var i = 0; i < data.length; ++i) { + res.push([i, data[i]]) + } + + return res; + } + + // Set up the control widget + + var updateInterval = 30; + if ($("#realtime-chart").length) { + var plot = $.plot("#realtime-chart", [getRandomData()], { + series: { + shadowSize: 0 // Drawing is faster without shadows + }, + yaxis: { + min: 0, + max: 100 + }, + xaxis: { + show: false + }, + grid: { + borderWidth: 0, + labelMargin: 10, + hoverable: true, + clickable: true, + mouseActiveRadius: 6, + } + + }); + + function update() { + + plot.setData([getRandomData()]); + + // Since the axes don't change, we don't need to call plot.setupGrid() + + plot.draw(); + setTimeout(update, updateInterval); + } + + update(); + } + + }); + /*-------------------------------- + ----- CURVED LINE CHART ----- + --------------------------------*/ + + $(function() { + + var d1 = [ + [0, 6], + [1, 14], + [2, 10], + [3, 14], + [4, 5] + ]; + var d2 = [ + [0, 6], + [1, 7], + [2, 11], + [3, 8], + [4, 11] + ]; + var d3 = [ + [0, 6], + [1, 5], + [2, 6], + [3, 10], + [4, 5] + ]; + + if ($("#curved-line-chart").length) { + $.plot($("#curved-line-chart"), [{ + data: d1, + lines: { + show: true, + fill: 0.98 + }, + label: 'Plans', + stack: true, + color: '#5E50F9' + }, + { + data: d2, + lines: { + show: true, + fill: 0.98 + }, + label: 'Purchase', + stack: true, + color: '#8C95FC' + }, + { + data: d3, + lines: { + show: true, + fill: 0.98 + }, + label: 'Services', + stack: true, + color: '#A8B4FD' + } + ], curvedLineOptions); + } + + }); + +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/form-addons.js b/TugasAkhir/js/form-addons.js new file mode 100644 index 0000000..d62847c --- /dev/null +++ b/TugasAkhir/js/form-addons.js @@ -0,0 +1,146 @@ +(function($) { + 'use strict'; + + // Jquery Tag Input Starts + $('#tags').tagsInput({ + 'width': '100%', + 'height': '75%', + 'interactive': true, + 'defaultText': 'Add More', + 'removeWithBackspace': true, + 'minChars': 0, + 'maxChars': 20, // if not provided there is no limit + 'placeholderColor': '#666666' + }); + + // Jquery Tag Input Ends + // Jquery Bar Rating Starts + + $(function() { + function ratingEnable() { + $('#example-1to10').barrating('show', { + theme: 'bars-1to10' + }); + + $('#example-movie').barrating('show', { + theme: 'bars-movie' + }); + + $('#example-movie').barrating('set', 'Mediocre'); + + $('#example-square').barrating('show', { + theme: 'bars-square', + showValues: true, + showSelectedRating: false + }); + + $('#example-pill').barrating('show', { + theme: 'bars-pill', + initialRating: 'A', + showValues: true, + showSelectedRating: false, + allowEmpty: true, + emptyValue: '-- no rating selected --', + onSelect: function(value, text) { + alert('Selected rating: ' + value); + } + }); + + $('#example-reversed').barrating('show', { + theme: 'bars-reversed', + showSelectedRating: true, + reverse: true + }); + + $('#example-horizontal').barrating('show', { + theme: 'bars-horizontal', + reverse: true, + hoverState: false + }); + + $('#example-fontawesome').barrating({ + theme: 'fontawesome-stars', + showSelectedRating: false + }); + + $('#example-css').barrating({ + theme: 'css-stars', + showSelectedRating: false + }); + + $('#example-bootstrap').barrating({ + theme: 'bootstrap-stars', + showSelectedRating: false + }); + + var currentRating = $('#example-fontawesome-o').data('current-rating'); + + $('.stars-example-fontawesome-o .current-rating') + .find('span') + .html(currentRating); + + $('.stars-example-fontawesome-o .clear-rating').on('click', function(event) { + event.preventDefault(); + + $('#example-fontawesome-o') + .barrating('clear'); + }); + + $('#example-fontawesome-o').barrating({ + theme: 'fontawesome-stars-o', + showSelectedRating: false, + initialRating: currentRating, + onSelect: function(value, text) { + if (!value) { + $('#example-fontawesome-o') + .barrating('clear'); + } else { + $('.stars-example-fontawesome-o .current-rating') + .addClass('hidden'); + + $('.stars-example-fontawesome-o .your-rating') + .removeClass('hidden') + .find('span') + .html(value); + } + }, + onClear: function(value, text) { + $('.stars-example-fontawesome-o') + .find('.current-rating') + .removeClass('hidden') + .end() + .find('.your-rating') + .addClass('hidden'); + } + }); + } + + function ratingDisable() { + $('select').barrating('destroy'); + } + + $('.rating-enable').on("click", function(event) { + event.preventDefault(); + + ratingEnable(); + + $(this).addClass('deactivated'); + $('.rating-disable').removeClass('deactivated'); + }); + + $('.rating-disable').on("click", function(event) { + event.preventDefault(); + + ratingDisable(); + + $(this).addClass('deactivated'); + $('.rating-enable').removeClass('deactivated'); + }); + + ratingEnable(); + }); + + + // Jquery Bar Rating Ends + +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/form-repeater.js b/TugasAkhir/js/form-repeater.js new file mode 100644 index 0000000..ad80ffc --- /dev/null +++ b/TugasAkhir/js/form-repeater.js @@ -0,0 +1,38 @@ +(function($) { + 'use strict'; + $(function() { + $('.repeater').repeater({ + // (Optional) + // "defaultValues" sets the values of added items. The keys of + // defaultValues refer to the value of the input's name attribute. + // If a default value is not specified for an input, then it will + // have its value cleared. + defaultValues: { + 'text-input': 'foo' + }, + // (Optional) + // "show" is called just after an item is added. The item is hidden + // at this point. If a show callback is not given the item will + // have $(this).show() called on it. + show: function() { + $(this).slideDown(); + }, + // (Optional) + // "hide" is called when a user clicks on a data-repeater-delete + // element. The item is still visible. "hide" is passed a function + // as its first argument which will properly remove the item. + // "hide" allows for a confirmation step, to send a delete request + // to the server, etc. If a hide callback is not given the item + // will be deleted. + hide: function(deleteElement) { + if (confirm('Are you sure you want to delete this element?')) { + $(this).slideUp(deleteElement); + } + }, + // (Optional) + // Removes the delete button from the first list item, + // defaults to false. + isFirstItemUndeletable: true + }) + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/form-validation.js b/TugasAkhir/js/form-validation.js new file mode 100644 index 0000000..33c0c92 --- /dev/null +++ b/TugasAkhir/js/form-validation.js @@ -0,0 +1,97 @@ +(function($) { + 'use strict'; + $.validator.setDefaults({ + submitHandler: function() { + alert("submitted!"); + } + }); + $(function() { + // validate the comment form when it is submitted + $("#commentForm").validate({ + errorPlacement: function(label, element) { + label.addClass('mt-2 text-danger'); + label.insertAfter(element); + }, + highlight: function(element, errorClass) { + $(element).parent().addClass('has-danger') + $(element).addClass('form-control-danger') + } + }); + // validate signup form on keyup and submit + $("#signupForm").validate({ + rules: { + firstname: "required", + lastname: "required", + username: { + required: true, + minlength: 2 + }, + password: { + required: true, + minlength: 5 + }, + confirm_password: { + required: true, + minlength: 5, + equalTo: "#password" + }, + email: { + required: true, + email: true + }, + topic: { + required: "#newsletter:checked", + minlength: 2 + }, + agree: "required" + }, + messages: { + firstname: "Please enter your firstname", + lastname: "Please enter your lastname", + username: { + required: "Please enter a username", + minlength: "Your username must consist of at least 2 characters" + }, + password: { + required: "Please provide a password", + minlength: "Your password must be at least 5 characters long" + }, + confirm_password: { + required: "Please provide a password", + minlength: "Your password must be at least 5 characters long", + equalTo: "Please enter the same password as above" + }, + email: "Please enter a valid email address", + agree: "Please accept our policy", + topic: "Please select at least 2 topics" + }, + errorPlacement: function(label, element) { + label.addClass('mt-2 text-danger'); + label.insertAfter(element); + }, + highlight: function(element, errorClass) { + $(element).parent().addClass('has-danger') + $(element).addClass('form-control-danger') + } + }); + // propose username by combining first- and lastname + $("#username").focus(function() { + var firstname = $("#firstname").val(); + var lastname = $("#lastname").val(); + if (firstname && lastname && !this.value) { + this.value = firstname + "." + lastname; + } + }); + //code to hide topic selection, disable for demo + var newsletter = $("#newsletter"); + // newsletter topics are optional, hide at first + var inital = newsletter.is(":checked"); + var topics = $("#newsletter_topics")[inital ? "removeClass" : "addClass"]("gray"); + var topicInputs = topics.find("input").attr("disabled", !inital); + // show when newsletter is checked + newsletter.on("click", function() { + topics[this.checked ? "removeClass" : "addClass"]("gray"); + topicInputs.attr("disabled", !this.checked); + }); + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/formpickers.js b/TugasAkhir/js/formpickers.js new file mode 100644 index 0000000..ed4118e --- /dev/null +++ b/TugasAkhir/js/formpickers.js @@ -0,0 +1,37 @@ +(function($) { + 'use strict'; + if ($("#timepicker-example").length) { + $('#timepicker-example').datetimepicker({ + format: 'LT' + }); + } + if ($(".color-picker").length) { + $('.color-picker').asColorPicker(); + } + if ($("#datepicker-popup").length) { + $('#datepicker-popup').datepicker({ + enableOnReadonly: true, + todayHighlight: true, + }); + } + if ($("#inline-datepicker").length) { + $('#inline-datepicker').datepicker({ + enableOnReadonly: true, + todayHighlight: true, + }); + } + if ($(".datepicker-autoclose").length) { + $('.datepicker-autoclose').datepicker({ + autoclose: true + }); + } + if ($('input[name="date-range"]').length) { + $('input[name="date-range"]').daterangepicker(); + } + if($('.input-daterange').length) { + $('.input-daterange input').each(function() { + $(this).datepicker('clearDates'); + }); + $('.input-daterange').datepicker({}); + } +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/google-charts.js b/TugasAkhir/js/google-charts.js new file mode 100644 index 0000000..7e96700 --- /dev/null +++ b/TugasAkhir/js/google-charts.js @@ -0,0 +1,242 @@ +// Region Charts Starts + +google.charts.load('current', { + 'packages': ['geochart'], + // Note: you will need to get a mapsApiKey for your project. + // See: https://developers.google.com/chart/interactive/docs/basic_load_libs#load-settings + 'mapsApiKey': 'AIzaSyD-9tSrke72PouQMnMX-a7eZSW0jkFMBWY' +}); +google.charts.setOnLoadCallback(drawRegionsMap); + +function drawRegionsMap() { + var data = google.visualization.arrayToDataTable([ + ['Country', 'Popularity'], + ['Germany', 200], + ['United States', 300], + ['Brazil', 400], + ['Canada', 500], + ['France', 600], + ['RU', 700] + ]); + + var options = { + colorAxis: { + colors: ['#76C1FA', '#63CF72', '#F36368', '#FABA66'] + } + }; + var chart = new google.visualization.GeoChart(document.getElementById('regions-chart')); + + chart.draw(data, options); +} + +// Region Charts Ends + + +// Bar Charts Starts + +google.charts.load('current', { + 'packages': ['bar'] +}); +google.charts.setOnLoadCallback(drawStuff); + +function drawStuff() { + var data = new google.visualization.arrayToDataTable([ + ['Opening Move', 'Percentage'], + ["King's pawn (e4)", 44], + ["Queen's pawn (d4)", 31], + ["Knight to King 3 (Nf3)", 12], + ["Queen's bishop pawn (c4)", 10], + ['Other', 3] + ]); + + var options = { + title: 'Approximating Normal Distribution', + legend: { + position: 'none' + }, + colors: ['#76C1FA'], + + chartArea: { + width: 401 + }, + hAxis: { + ticks: [-1, -0.75, -0.5, -0.25, 0, 0.25, 0.5, 0.75, 1] + }, + bar: { + gap: 0 + }, + + histogram: { + bucketSize: 0.02, + maxNumBuckets: 200, + minValue: -1, + maxValue: 1 + } + }; + + var chart = new google.charts.Bar(document.getElementById('Bar-chart')); + chart.draw(data, options); +}; + + +// Bar Charts Ends + + +// Histogram Charts Starts +(function($) { + + google.charts.load("current", { + packages: ["corechart"] + }); + google.charts.setOnLoadCallback(drawChart); + + function drawChart() { + var data = google.visualization.arrayToDataTable([ + ['Quarks', 'Leptons', 'Gauge Bosons', 'Scalar Bosons'], + [2 / 3, -1, 0, 0], + [2 / 3, -1, 0, null], + [2 / 3, -1, 0, null], + [-1 / 3, 0, 1, null], + [-1 / 3, 0, -1, null], + [-1 / 3, 0, null, null], + [-1 / 3, 0, null, null] + ]); + + var options = { + title: 'Charges of subatomic particles', + legend: { + position: 'top', + maxLines: 2 + }, + colors: ['#76C1FA', '#63CF72', '#F36368', '#FABA66'], + interpolateNulls: false, + chartArea: { + width: 401 + }, + }; + + var chart = new google.visualization.Histogram(document.getElementById('Histogram-chart')); + chart.draw(data, options); + } + +})(jQuery); + +// Histogram Charts Ends + + +// Area Chart Starts +(function($) { + + google.charts.load('current', { + 'packages': ['corechart'] + }); + google.charts.setOnLoadCallback(drawChart); + + function drawChart() { + var data = google.visualization.arrayToDataTable([ + ['Year', 'Sales', 'Expenses'], + ['2013', 1000, 400], + ['2014', 1170, 460], + ['2015', 660, 1120], + ['2016', 1030, 540] + ]); + + var options = { + title: 'Company Performance', + hAxis: { + title: 'Year', + titleTextStyle: { + color: '#333' + } + }, + colors: ['#76C1FA', '#63CF72', '#F36368', '#FABA66'], + chartArea: { + width: 500 + }, + vAxis: { + minValue: 0 + } + }; + + var AreaChart = new google.visualization.AreaChart(document.getElementById('area-chart')); + AreaChart.draw(data, options); + } + +})(jQuery); +// Area Chart Ends + + + +// Donut Chart Starts + +google.charts.load("current", { + packages: ["corechart"] +}); +google.charts.setOnLoadCallback(drawChart); + +function drawChart() { + var data = google.visualization.arrayToDataTable([ + ['Task', 'Hours per Day'], + ['Work', 11], + ['Eat', 2], + ['Commute', 2], + ['Watch TV', 2], + ['Sleep', 7] + ]); + + var options = { + title: 'My Daily Activities', + pieHole: 0.4, + colors: ['#76C1FA', '#63CF72', '#F36368', '#FABA66'], + chartArea: { + width: 500 + }, + }; + + var Donutchart = new google.visualization.PieChart(document.getElementById('Donut-chart')); + Donutchart.draw(data, options); +} + + +// Donut Chart Ends + + +// Curve Chart Starts +(function($) { + + google.charts.load('current', { + 'packages': ['corechart'] + }); + google.charts.setOnLoadCallback(drawChart); + + function drawChart() { + var data = google.visualization.arrayToDataTable([ + ['Year', 'Sales', 'Expenses'], + ['2004', 1000, 400], + ['2005', 1170, 460], + ['2006', 660, 1120], + ['2007', 1030, 540] + ]); + + var options = { + title: 'Company Performance', + curveType: 'function', + legend: { + position: 'bottom' + }, + colors: ['#76C1FA', '#63CF72', '#F36368', '#FABA66'], + chartArea: { + width: 500 + }, + }; + + var chart = new google.visualization.LineChart(document.getElementById('curve_chart')); + + chart.draw(data, options); + } + + + + +})(jQuery); +// Curve Chart Ends \ No newline at end of file diff --git a/TugasAkhir/js/google-maps.js b/TugasAkhir/js/google-maps.js new file mode 100644 index 0000000..0755b44 --- /dev/null +++ b/TugasAkhir/js/google-maps.js @@ -0,0 +1,698 @@ +'use strict'; + +function initMap() { + //Map location + var MapLocation = { + lat: 40.6971494, + lng: -74.2598719 + }; + + // Map Zooming + var MapZoom = 14; + + + // Basic Map + if($("#map-with-marker").length) { + var MapWithMarker = new google.maps.Map(document.getElementById('map-with-marker'), { + zoom: MapZoom, + center: MapLocation + }); + var marker_1 = new google.maps.Marker({ + position: MapLocation, + map: MapWithMarker + }); + } + + // Basic map with cutom marker + if($("#custom-marker").length) { + var CustomMarker = new google.maps.Map(document.getElementById('custom-marker'), { + zoom: MapZoom, + center: MapLocation + }); + var iconBase = '../../images/file-icons/'; + var marker_2 = new google.maps.Marker({ + position: MapLocation, + map: CustomMarker, + icon: iconBase + 'flag.png' + }); + } + + // Map without controls + if($("#map-minimal").length) { + var MinimalMap = new google.maps.Map(document.getElementById('map-minimal'), { + zoom: MapZoom, + center: MapLocation, + disableDefaultUI: true + }); + var marker_3 = new google.maps.Marker({ + position: MapLocation, + map: MinimalMap + }); + } + + // Night Mode + if($("#night-mode-map").length) { + var NightModeMap = new google.maps.Map(document.getElementById('night-mode-map'), { + zoom: MapZoom, + center: MapLocation, + styles: [{ + "featureType": "all", + "elementType": "all", + "stylers": [{ + "saturation": -100 + }, + { + "gamma": 0.5 + } + ] + }] + }); + } + + // Apple Theme + if($("#apple-map-theme").length) { + var AppletThemeMap = new google.maps.Map(document.getElementById('apple-map-theme'), { + zoom: MapZoom, + center: MapLocation, + styles: [{ + "featureType": "landscape.man_made", + "elementType": "geometry", + "stylers": [{ + "color": "#f7f1df" + }] + }, + { + "featureType": "landscape.natural", + "elementType": "geometry", + "stylers": [{ + "color": "#d0e3b4" + }] + }, + { + "featureType": "landscape.natural.terrain", + "elementType": "geometry", + "stylers": [{ + "visibility": "off" + }] + }, + { + "featureType": "poi", + "elementType": "labels", + "stylers": [{ + "visibility": "off" + }] + }, + { + "featureType": "poi.business", + "elementType": "all", + "stylers": [{ + "visibility": "off" + }] + }, + { + "featureType": "poi.medical", + "elementType": "geometry", + "stylers": [{ + "color": "#fbd3da" + }] + }, + { + "featureType": "poi.park", + "elementType": "geometry", + "stylers": [{ + "color": "#bde6ab" + }] + }, + { + "featureType": "road", + "elementType": "geometry.stroke", + "stylers": [{ + "visibility": "off" + }] + }, + { + "featureType": "road", + "elementType": "labels", + "stylers": [{ + "visibility": "off" + }] + }, + { + "featureType": "road.highway", + "elementType": "geometry.fill", + "stylers": [{ + "color": "#ffe15f" + }] + }, + { + "featureType": "road.highway", + "elementType": "geometry.stroke", + "stylers": [{ + "color": "#efd151" + }] + }, + { + "featureType": "road.arterial", + "elementType": "geometry.fill", + "stylers": [{ + "color": "#ffffff" + }] + }, + { + "featureType": "road.local", + "elementType": "geometry.fill", + "stylers": [{ + "color": "black" + }] + }, + { + "featureType": "transit.station.airport", + "elementType": "geometry.fill", + "stylers": [{ + "color": "#cfb2db" + }] + }, + { + "featureType": "water", + "elementType": "geometry", + "stylers": [{ + "color": "#a2daf2" + }] + } + ] + }); + } + + // Nature Theme + if($("#nature-map-theme").length) { + var NatureThemeMap = new google.maps.Map(document.getElementById('nature-map-theme'), { + zoom: MapZoom, + center: MapLocation, + styles: [{ + "featureType": "landscape", + "stylers": [{ + "hue": "#FFA800" + }, + { + "saturation": 0 + }, + { + "lightness": 0 + }, + { + "gamma": 1 + } + ] + }, + { + "featureType": "road.highway", + "stylers": [{ + "hue": "#53FF00" + }, + { + "saturation": -73 + }, + { + "lightness": 40 + }, + { + "gamma": 1 + } + ] + }, + { + "featureType": "road.arterial", + "stylers": [{ + "hue": "#FBFF00" + }, + { + "saturation": 0 + }, + { + "lightness": 0 + }, + { + "gamma": 1 + } + ] + }, + { + "featureType": "road.local", + "stylers": [{ + "hue": "#00FFFD" + }, + { + "saturation": 0 + }, + { + "lightness": 30 + }, + { + "gamma": 1 + } + ] + }, + { + "featureType": "water", + "stylers": [{ + "hue": "#00BFFF" + }, + { + "saturation": 6 + }, + { + "lightness": 8 + }, + { + "gamma": 1 + } + ] + }, + { + "featureType": "poi", + "stylers": [{ + "hue": "#679714" + }, + { + "saturation": 33.4 + }, + { + "lightness": -25.4 + }, + { + "gamma": 1 + } + ] + } + ] + }); + } + + // Captor Theme + if($("#captor-map-theme").length) { + var CaptorThemeMap = new google.maps.Map(document.getElementById('captor-map-theme'), { + zoom: MapZoom, + center: MapLocation, + styles: [{ + "featureType": "water", + "stylers": [{ + "color": "#0e171d" + }] + }, + { + "featureType": "landscape", + "stylers": [{ + "color": "#1e303d" + }] + }, + { + "featureType": "road", + "stylers": [{ + "color": "#1e303d" + }] + }, + { + "featureType": "poi.park", + "stylers": [{ + "color": "#1e303d" + }] + }, + { + "featureType": "transit", + "stylers": [{ + "color": "#182731" + }, + { + "visibility": "simplified" + } + ] + }, + { + "featureType": "poi", + "elementType": "labels.icon", + "stylers": [{ + "color": "#f0c514" + }, + { + "visibility": "off" + } + ] + }, + { + "featureType": "poi", + "elementType": "labels.text.stroke", + "stylers": [{ + "color": "#1e303d" + }, + { + "visibility": "off" + } + ] + }, + { + "featureType": "transit", + "elementType": "labels.text.fill", + "stylers": [{ + "color": "#e77e24" + }, + { + "visibility": "off" + } + ] + }, + { + "featureType": "road", + "elementType": "labels.text.fill", + "stylers": [{ + "color": "#94a5a6" + }] + }, + { + "featureType": "administrative", + "elementType": "labels", + "stylers": [{ + "visibility": "simplified" + }, + { + "color": "#e84c3c" + } + ] + }, + { + "featureType": "poi", + "stylers": [{ + "color": "#e84c3c" + }, + { + "visibility": "off" + } + ] + } + ] + }); + } + + // Avagardo Theme + if($("#avocado-map-theme").length) { + var AvagardoThemeMap = new google.maps.Map(document.getElementById('avocado-map-theme'), { + zoom: MapZoom, + center: MapLocation, + styles: [{ + "featureType": "water", + "elementType": "geometry", + "stylers": [{ + "visibility": "on" + }, + { + "color": "#aee2e0" + } + ] + }, + { + "featureType": "landscape", + "elementType": "geometry.fill", + "stylers": [{ + "color": "#abce83" + }] + }, + { + "featureType": "poi", + "elementType": "geometry.fill", + "stylers": [{ + "color": "#769E72" + }] + }, + { + "featureType": "poi", + "elementType": "labels.text.fill", + "stylers": [{ + "color": "#7B8758" + }] + }, + { + "featureType": "poi", + "elementType": "labels.text.stroke", + "stylers": [{ + "color": "#EBF4A4" + }] + }, + { + "featureType": "poi.park", + "elementType": "geometry", + "stylers": [{ + "visibility": "simplified" + }, + { + "color": "#8dab68" + } + ] + }, + { + "featureType": "road", + "elementType": "geometry.fill", + "stylers": [{ + "visibility": "simplified" + }] + }, + { + "featureType": "road", + "elementType": "labels.text.fill", + "stylers": [{ + "color": "#5B5B3F" + }] + }, + { + "featureType": "road", + "elementType": "labels.text.stroke", + "stylers": [{ + "color": "#ABCE83" + }] + }, + { + "featureType": "road", + "elementType": "labels.icon", + "stylers": [{ + "visibility": "off" + }] + }, + { + "featureType": "road.local", + "elementType": "geometry", + "stylers": [{ + "color": "#A4C67D" + }] + }, + { + "featureType": "road.arterial", + "elementType": "geometry", + "stylers": [{ + "color": "#9BBF72" + }] + }, + { + "featureType": "road.highway", + "elementType": "geometry", + "stylers": [{ + "color": "#EBF4A4" + }] + }, + { + "featureType": "transit", + "stylers": [{ + "visibility": "off" + }] + }, + { + "featureType": "administrative", + "elementType": "geometry.stroke", + "stylers": [{ + "visibility": "on" + }, + { + "color": "#87ae79" + } + ] + }, + { + "featureType": "administrative", + "elementType": "geometry.fill", + "stylers": [{ + "color": "#7f2200" + }, + { + "visibility": "off" + } + ] + }, + { + "featureType": "administrative", + "elementType": "labels.text.stroke", + "stylers": [{ + "color": "#ffffff" + }, + { + "visibility": "on" + }, + { + "weight": 4.1 + } + ] + }, + { + "featureType": "administrative", + "elementType": "labels.text.fill", + "stylers": [{ + "color": "#495421" + }] + }, + { + "featureType": "administrative.neighborhood", + "elementType": "labels", + "stylers": [{ + "visibility": "off" + }] + } + ] + }); + } + + // Propia Theme + if($("#propia-map-theme").length) { + var PropiaThemeMap = new google.maps.Map(document.getElementById('propia-map-theme'), { + zoom: MapZoom, + center: MapLocation, + styles: [{ + "featureType": "landscape", + "stylers": [{ + "visibility": "simplified" + }, + { + "color": "#2b3f57" + }, + { + "weight": 0.1 + } + ] + }, + { + "featureType": "administrative", + "stylers": [{ + "visibility": "on" + }, + { + "hue": "#ff0000" + }, + { + "weight": 0.4 + }, + { + "color": "#ffffff" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "labels.text", + "stylers": [{ + "weight": 1.3 + }, + { + "color": "#FFFFFF" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "geometry", + "stylers": [{ + "color": "#f55f77" + }, + { + "weight": 3 + } + ] + }, + { + "featureType": "road.arterial", + "elementType": "geometry", + "stylers": [{ + "color": "#f55f77" + }, + { + "weight": 1.1 + } + ] + }, + { + "featureType": "road.local", + "elementType": "geometry", + "stylers": [{ + "color": "#f55f77" + }, + { + "weight": 0.4 + } + ] + }, + {}, + { + "featureType": "road.highway", + "elementType": "labels", + "stylers": [{ + "weight": 0.8 + }, + { + "color": "#ffffff" + }, + { + "visibility": "on" + } + ] + }, + { + "featureType": "road.local", + "elementType": "labels", + "stylers": [{ + "visibility": "off" + }] + }, + { + "featureType": "road.arterial", + "elementType": "labels", + "stylers": [{ + "color": "#ffffff" + }, + { + "weight": 0.7 + } + ] + }, + { + "featureType": "poi", + "elementType": "labels", + "stylers": [{ + "visibility": "off" + }] + }, + { + "featureType": "poi", + "stylers": [{ + "color": "#6c5b7b" + }] + }, + { + "featureType": "water", + "stylers": [{ + "color": "#f3b191" + }] + }, + { + "featureType": "transit.line", + "stylers": [{ + "visibility": "on" + }] + } + ] + }); + } +} \ No newline at end of file diff --git a/TugasAkhir/js/hoverable-collapse.js b/TugasAkhir/js/hoverable-collapse.js new file mode 100644 index 0000000..04d51bd --- /dev/null +++ b/TugasAkhir/js/hoverable-collapse.js @@ -0,0 +1,25 @@ +(function($) { + 'use strict'; + //Open submenu on hover in compact sidebar mode and horizontal menu mode + $(document).on('mouseenter mouseleave', '.sidebar .nav-item', function(ev) { + var body = $('body'); + var sidebarIconOnly = body.hasClass("sidebar-icon-only"); + var sidebarFixed = body.hasClass("sidebar-fixed"); + if (!('ontouchstart' in document.documentElement)) { + if (sidebarIconOnly) { + if (sidebarFixed) { + if (ev.type === 'mouseenter') { + body.removeClass('sidebar-icon-only'); + } + } else { + var $menuItem = $(this); + if (ev.type === 'mouseenter') { + $menuItem.addClass('hover-open') + } else { + $menuItem.removeClass('hover-open') + } + } + } + } + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/iCheck.js b/TugasAkhir/js/iCheck.js new file mode 100644 index 0000000..d3e4ec3 --- /dev/null +++ b/TugasAkhir/js/iCheck.js @@ -0,0 +1,43 @@ +(function($) { + 'use strict'; + $(function() { + $('.icheck input').iCheck({ + checkboxClass: 'icheckbox_minimal-blue', + radioClass: 'iradio_minimal', + increaseArea: '20%' + }); + $('.icheck-square input').iCheck({ + checkboxClass: 'icheckbox_square-blue', + radioClass: 'iradio_square', + increaseArea: '20%' + }); + $('.icheck-flat input').iCheck({ + checkboxClass: 'icheckbox_flat-blue', + radioClass: 'iradio_flat', + increaseArea: '20%' + }); + var icheckLineArray = $('.icheck-line input'); + for (var i = 0; i < icheckLineArray.length; i++) { + var self = $(icheckLineArray[i]); + var label = self.next(); + var label_text = label.text(); + + label.remove(); + self.iCheck({ + checkboxClass: 'icheckbox_line-blue', + radioClass: 'iradio_line', + insert: '
' + label_text + }); + } + $('.icheck-polaris input').iCheck({ + checkboxClass: 'icheckbox_polaris', + radioClass: 'iradio_polaris', + increaseArea: '20%' + }); + $('.icheck-futurico input').iCheck({ + checkboxClass: 'icheckbox_futurico', + radioClass: 'iradio_futurico', + increaseArea: '20%' + }); + }); +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/inputmask.js b/TugasAkhir/js/inputmask.js new file mode 100644 index 0000000..3bc7928 --- /dev/null +++ b/TugasAkhir/js/inputmask.js @@ -0,0 +1,7 @@ +(function($) { + 'use strict'; + + // initializing inputmask + $(":input").inputmask(); + +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/ion-range-slider.js b/TugasAkhir/js/ion-range-slider.js new file mode 100644 index 0000000..933cf93 --- /dev/null +++ b/TugasAkhir/js/ion-range-slider.js @@ -0,0 +1,189 @@ +(function($) { + 'use strict'; + + if ($('#range_01').length) { + $("#range_01").ionRangeSlider(); + } + + if ($("#range_02").length) { + $("#range_02").ionRangeSlider({ + min: 100, + max: 1000, + from: 550 + }); + } + + if ($("#range_03").length) { + $("#range_03").ionRangeSlider({ + type: "double", + grid: true, + min: 0, + max: 1000, + from: 200, + to: 800, + prefix: "$" + }); + } + + if ($("#range_04").length) { + $("#range_04").ionRangeSlider({ + type: "double", + min: 100, + max: 200, + from: 145, + to: 155, + prefix: "Weight: ", + postfix: " million pounds", + decorate_both: true + }); + } + + if ($("#range_05").length) { + $("#range_05").ionRangeSlider({ + type: "double", + min: 1000, + max: 2000, + from: 1200, + to: 1800, + hide_min_max: true, + hide_from_to: true, + grid: false + }); + } + + if ($("#range_06").length) { + $("#range_06").ionRangeSlider({ + type: "double", + min: 1000, + max: 2000, + from: 1200, + to: 1800, + hide_min_max: true, + hide_from_to: true, + grid: true + }); + } + + if ($("#range_07").length) { + $("#range_07").ionRangeSlider({ + type: "double", + grid: true, + min: 0, + max: 10000, + from: 1000, + prefix: "$" + }); + } + + if ($("#range_08").length) { + $("#range_08").ionRangeSlider({ + type: "single", + grid: true, + min: -90, + max: 90, + from: 0, + postfix: "°" + }); + } + + if ($("#range_09").length) { + $("#range_09").ionRangeSlider({ + type: "double", + min: 0, + max: 10000, + grid: true + }); + } + + if ($("#range_10").length) { + $("#range_10").ionRangeSlider({ + type: "double", + min: 0, + max: 10000, + grid: true, + grid_num: 10 + }); + } + + if ($("#range_11").length) { + $("#range_11").ionRangeSlider({ + type: "double", + min: 0, + max: 10000, + step: 500, + grid: true, + grid_snap: true + }); + } + + if ($("#range_12").length) { + $("#range_12").ionRangeSlider({ + type: "single", + min: 0, + max: 10, + step: 2.34, + grid: true, + grid_snap: true + }); + } + + if ($("#range_13").length) { + $("#range_13").ionRangeSlider({ + type: "double", + min: 0, + max: 100, + from: 30, + to: 70, + from_fixed: true + }); + } + + if ($("#range_14").length) { + $("#range_14").ionRangeSlider({ + min: 0, + max: 100, + from: 30, + from_min: 10, + from_max: 50 + }); + } + + if ($("#range_15").length) { + $("#range_15").ionRangeSlider({ + min: 0, + max: 100, + from: 30, + from_min: 10, + from_max: 50, + from_shadow: true + }); + } + + if ($("#range_16").length) { + $("#range_16").ionRangeSlider({ + type: "double", + min: 0, + max: 100, + from: 20, + from_min: 10, + from_max: 30, + from_shadow: true, + to: 80, + to_min: 70, + to_max: 90, + to_shadow: true, + grid: true, + grid_num: 10 + }); + } + + if ($("#range_17").length) { + $("#range_17").ionRangeSlider({ + min: 0, + max: 100, + from: 30, + disable: true + }); + } + +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/jq.tablesort.js b/TugasAkhir/js/jq.tablesort.js new file mode 100644 index 0000000..c3fe6c2 --- /dev/null +++ b/TugasAkhir/js/jq.tablesort.js @@ -0,0 +1,123 @@ +/* + * jq.TableSort -- jQuery Table sorter Plug-in. + * + * Version 1.0.0. + * + * Copyright (c) 2017 Dmitry Zavodnikov. + * + * Licensed under the MIT License. + */ +(function($) { + 'use strict'; + var SORT = 'sort'; + var ASC = 'asc'; + var DESC = 'desc'; + var UNSORT = 'unsort'; + + var config = { + defaultColumn: 0, + defaultOrder: 'asc', + styles: { + 'sort': 'sortStyle', + 'asc': 'ascStyle', + 'desc': 'descStyle', + 'unsort': 'unsortStyle' + }, + selector: function(tableBody, column) { + var groups = []; + + var tableRows = $(tableBody).find('tr'); + for (var i = 0; i < tableRows.length; i++) { + var td = $(tableRows[i]).find('td')[column]; + + groups.push({ + 'values': [tableRows[i]], + 'key': $(td).text() + }); + } + return groups; + }, + comparator: function(group1, group2) { + return group1.key.localeCompare(group2.key); + } + }; + + function getTableHeaders(table) { + return $(table).find('thead > tr > th'); + } + + function getSortableTableHeaders(table) { + return getTableHeaders(table).filter(function(index) { + return $(this).hasClass(config.styles[SORT]); + }); + } + + function changeOrder(table, column) { + var sortedHeader = getTableHeaders(table).filter(function(index) { + return $(this).hasClass(config.styles[ASC]) || $(this).hasClass(config.styles[DESC]); + }); + + var sordOrder = config.defaultOrder; + if (sortedHeader.hasClass(config.styles[ASC])) { + sordOrder = ASC; + } + if (sortedHeader.hasClass(config.styles[DESC])) { + sordOrder = DESC; + } + + var th = getTableHeaders(table)[column]; + + if (th === sortedHeader[0]) { + if (sordOrder === ASC) { + sordOrder = DESC; + } else { + sordOrder = ASC; + } + } + + var headers = getSortableTableHeaders(table); + headers.removeClass(config.styles[ASC]); + headers.removeClass(config.styles[DESC]); + headers.addClass(config.styles[UNSORT]); + + $(th).removeClass(config.styles[UNSORT]); + $(th).addClass(config.styles[sordOrder]); + + var tbody = $(table).find('tbody')[0]; + var groups = config.selector(tbody, column); + + // Sorting. + groups.sort(function(a, b) { + var res = config.comparator(a, b); + return sordOrder === ASC ? res : -1 * res; + }); + + for (var i = 0; i < groups.length; i++) { + var trList = groups[i]; + var trListValues = trList.values; + for (var j = 0; j < trListValues.length; j++) { + tbody.append(trListValues[j]); + } + } + } + + $.fn.tablesort = function(userConfig) { + // Create and save table sort configuration. + $.extend(config, userConfig); + + // Process all selected tables. + var selectedTables = this; + for (var i = 0; i < selectedTables.length; i++) { + var table = selectedTables[i]; + var tableHeader = getSortableTableHeaders(table); + for (var j = 0; j < tableHeader.length; j++) { + var th = tableHeader[j]; + $(th).on("click", function(event) { + var clickColumn = $.inArray(event.currentTarget, getTableHeaders(table)); + changeOrder(table, clickColumn); + }); + } + } + return this; + }; +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/jquery-file-upload.js b/TugasAkhir/js/jquery-file-upload.js new file mode 100644 index 0000000..d723a95 --- /dev/null +++ b/TugasAkhir/js/jquery-file-upload.js @@ -0,0 +1,9 @@ +(function($) { + 'use strict'; + if ($("#fileuploader").length) { + $("#fileuploader").uploadFile({ + url: "YOUR_FILE_UPLOAD_URL", + fileName: "myfile" + }); + } +})(jQuery); \ No newline at end of file diff --git a/TugasAkhir/js/jquery.cookie.js b/TugasAkhir/js/jquery.cookie.js new file mode 100644 index 0000000..c7f3a59 --- /dev/null +++ b/TugasAkhir/js/jquery.cookie.js @@ -0,0 +1,117 @@ +/*! + * jQuery Cookie Plugin v1.4.1 + * https://github.com/carhartl/jquery-cookie + * + * Copyright 2013 Klaus Hartl + * Released under the MIT license + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var pluses = /\+/g; + + function encode(s) { + return config.raw ? s : encodeURIComponent(s); + } + + function decode(s) { + return config.raw ? s : decodeURIComponent(s); + } + + function stringifyCookieValue(value) { + return encode(config.json ? JSON.stringify(value) : String(value)); + } + + function parseCookieValue(s) { + if (s.indexOf('"') === 0) { + // This is a quoted cookie as according to RFC2068, unescape... + s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); + } + + try { + // Replace server-side written pluses with spaces. + // If we can't decode the cookie, ignore it, it's unusable. + // If we can't parse the cookie, ignore it, it's unusable. + s = decodeURIComponent(s.replace(pluses, ' ')); + return config.json ? JSON.parse(s) : s; + } catch(e) {} + } + + function read(s, converter) { + var value = config.raw ? s : parseCookieValue(s); + return $.isFunction(converter) ? converter(value) : value; + } + + var config = $.cookie = function (key, value, options) { + + // Write + + if (value !== undefined && !$.isFunction(value)) { + options = $.extend({}, config.defaults, options); + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setTime(+t + days * 864e+5); + } + + return (document.cookie = [ + encode(key), '=', stringifyCookieValue(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // Read + + var result = key ? undefined : {}; + + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. Also prevents odd result when + // calling $.cookie(). + var cookies = document.cookie ? document.cookie.split('; ') : []; + + for (var i = 0, l = cookies.length; i < l; i++) { + var parts = cookies[i].split('='); + var name = decode(parts.shift()); + var cookie = parts.join('='); + + if (key && key === name) { + // If second argument (value) is a function it's a converter... + result = read(cookie, value); + break; + } + + // Prevent storing a cookie that we couldn't decode. + if (!key && (cookie = read(cookie)) !== undefined) { + result[name] = cookie; + } + } + + return result; + }; + + config.defaults = {}; + + $.removeCookie = function (key, options) { + if ($.cookie(key) === undefined) { + return false; + } + + // Must not alter options, thus extending a fresh object... + $.cookie(key, '', $.extend({}, options, { expires: -1 })); + return !$.cookie(key); + }; + +})); diff --git a/TugasAkhir/js/js-grid.js b/TugasAkhir/js/js-grid.js new file mode 100644 index 0000000..2545db7 --- /dev/null +++ b/TugasAkhir/js/js-grid.js @@ -0,0 +1,192 @@ +(function($) { + 'use strict'; + $(function() { + + //basic config + if ($("#js-grid").length) { + $("#js-grid").jsGrid({ + height: "500px", + width: "100%", + filtering: true, + editing: true, + inserting: true, + sorting: true, + paging: true, + autoload: true, + pageSize: 15, + pageButtonCount: 5, + deleteConfirm: "Do you really want to delete the client?", + data: db.clients, + fields: [{ + name: "Name", + type: "text", + width: 150 + }, + { + name: "Age", + type: "number", + width: 50 + }, + { + name: "Address", + type: "text", + width: 200 + }, + { + name: "Country", + type: "select", + items: db.countries, + valueField: "Id", + textField: "Name" + }, + { + name: "Married", + title: "Is Married", + itemTemplate: function(value, item) { + return $("
") + .addClass("form-check mt-0") + .append( + $("
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TugasAkhir/tambah-sopir.php b/TugasAkhir/tambah-sopir.php new file mode 100644 index 0000000..8fc51b2 --- /dev/null +++ b/TugasAkhir/tambah-sopir.php @@ -0,0 +1,337 @@ +query($sql) === TRUE) { + $isSuccess = true; + } +} + +session_start(); + +// Periksa apakah pengguna telah login +if (!isset($_SESSION["username"])) { + header("Location: login.php"); // Jika tidak ada sesi username, redirect ke halaman login + exit; +} + +// Mengambil username dari sesi +$username = $_SESSION["username"]; +?> + + + + + + + + + + + Star Admin2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+

Tambah Sopir

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ + +
+
+
+
+
+ + + + +
+
+ Copyright © 2021. All rights reserved. +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TugasAkhir/tambah_pelanggan.php b/TugasAkhir/tambah_pelanggan.php new file mode 100644 index 0000000..b3660a8 --- /dev/null +++ b/TugasAkhir/tambah_pelanggan.php @@ -0,0 +1,23 @@ +real_escape_string($_POST['nama_lengkap']); + $email = $conn->real_escape_string($_POST['email']); + $notelp = $conn->real_escape_string($_POST['notelp']); + $nik = $conn->real_escape_string($_POST['nik']); + $alamat = $conn->real_escape_string($_POST['alamat']); + $password = $conn->real_escape_string($_POST['password']); + + // Hash password sebelum disimpan ke database + $hashedPassword = password_hash($password, PASSWORD_DEFAULT); + + $query = "INSERT INTO user (nama_lengkap, email, notelp, nik, alamat, password, id_role) VALUES ('$namaLengkap', '$email', '$notelp', '$nik', '$alamat', '$hashedPassword', 3)"; + + if ($conn->query($query) === TRUE) { + header("Location: pelanggan.php?success=1"); + } else { + echo "Error: " . $query . "
" . $conn->error; + } +} +?> diff --git a/TugasAkhir/vendor/autoload.php b/TugasAkhir/vendor/autoload.php new file mode 100644 index 0000000..4a631d6 --- /dev/null +++ b/TugasAkhir/vendor/autoload.php @@ -0,0 +1,25 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var ?string */ + private $vendorDir; + + // PSR-4 + /** + * @var array[] + * @psalm-var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array[] + * @psalm-var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var array[] + * @psalm-var array + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * @var array[] + * @psalm-var array> + */ + private $prefixesPsr0 = array(); + /** + * @var array[] + * @psalm-var array + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var string[] + * @psalm-var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var bool[] + * @psalm-var array + */ + private $missingClasses = array(); + + /** @var ?string */ + private $apcuPrefix; + + /** + * @var self[] + */ + private static $registeredLoaders = array(); + + /** + * @param ?string $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return string[] + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array[] + * @psalm-return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return array[] + * @psalm-return array + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return array[] + * @psalm-return array + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return string[] Array of classname => path + * @psalm-return array + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param string[] $classMap Class to filename map + * @psalm-param array $classMap + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders indexed by their corresponding vendor directories. + * + * @return self[] + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/TugasAkhir/vendor/composer/InstalledVersions.php b/TugasAkhir/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000..51e734a --- /dev/null +++ b/TugasAkhir/vendor/composer/InstalledVersions.php @@ -0,0 +1,359 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/TugasAkhir/vendor/composer/LICENSE b/TugasAkhir/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/TugasAkhir/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/TugasAkhir/vendor/composer/autoload_classmap.php b/TugasAkhir/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..0fb0a2c --- /dev/null +++ b/TugasAkhir/vendor/composer/autoload_classmap.php @@ -0,0 +1,10 @@ + $vendorDir . '/composer/InstalledVersions.php', +); diff --git a/TugasAkhir/vendor/composer/autoload_namespaces.php b/TugasAkhir/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..15a2ff3 --- /dev/null +++ b/TugasAkhir/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/phpmailer/phpmailer/src'), +); diff --git a/TugasAkhir/vendor/composer/autoload_real.php b/TugasAkhir/vendor/composer/autoload_real.php new file mode 100644 index 0000000..aa19f55 --- /dev/null +++ b/TugasAkhir/vendor/composer/autoload_real.php @@ -0,0 +1,38 @@ +register(true); + + return $loader; + } +} diff --git a/TugasAkhir/vendor/composer/autoload_static.php b/TugasAkhir/vendor/composer/autoload_static.php new file mode 100644 index 0000000..afd31f2 --- /dev/null +++ b/TugasAkhir/vendor/composer/autoload_static.php @@ -0,0 +1,36 @@ + + array ( + 'PHPMailer\\PHPMailer\\' => 20, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'PHPMailer\\PHPMailer\\' => + array ( + 0 => __DIR__ . '/..' . '/phpmailer/phpmailer/src', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit9af51e9320b87243fb4831316d32ef74::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit9af51e9320b87243fb4831316d32ef74::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit9af51e9320b87243fb4831316d32ef74::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/TugasAkhir/vendor/composer/installed.json b/TugasAkhir/vendor/composer/installed.json new file mode 100644 index 0000000..2237910 --- /dev/null +++ b/TugasAkhir/vendor/composer/installed.json @@ -0,0 +1,90 @@ +{ + "packages": [ + { + "name": "phpmailer/phpmailer", + "version": "v6.9.1", + "version_normalized": "6.9.1.0", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "039de174cd9c17a8389754d3b877a2ed22743e18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18", + "reference": "039de174cd9c17a8389754d3b877a2ed22743e18", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.7.2", + "yoast/phpunit-polyfills": "^1.0.4" + }, + "suggest": { + "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" + }, + "time": "2023-11-25T22:23:28+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "support": { + "issues": "https://github.com/PHPMailer/PHPMailer/issues", + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1" + }, + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "install-path": "../phpmailer/phpmailer" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/TugasAkhir/vendor/composer/installed.php b/TugasAkhir/vendor/composer/installed.php new file mode 100644 index 0000000..2bc19be --- /dev/null +++ b/TugasAkhir/vendor/composer/installed.php @@ -0,0 +1,32 @@ + array( + 'name' => '__root__', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'reference' => '3da3038407107e603f3335882ac2eb00e3da17a4', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + '__root__' => array( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'reference' => '3da3038407107e603f3335882ac2eb00e3da17a4', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'phpmailer/phpmailer' => array( + 'pretty_version' => 'v6.9.1', + 'version' => '6.9.1.0', + 'reference' => '039de174cd9c17a8389754d3b877a2ed22743e18', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpmailer/phpmailer', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/TugasAkhir/vendor/composer/platform_check.php b/TugasAkhir/vendor/composer/platform_check.php new file mode 100644 index 0000000..454eefd --- /dev/null +++ b/TugasAkhir/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 50500)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 5.5.0". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/.editorconfig b/TugasAkhir/vendor/phpmailer/phpmailer/.editorconfig new file mode 100644 index 0000000..a7c44dd --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/COMMITMENT b/TugasAkhir/vendor/phpmailer/phpmailer/COMMITMENT new file mode 100644 index 0000000..a687e0d --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/COMMITMENT @@ -0,0 +1,46 @@ +GPL Cooperation Commitment +Version 1.0 + +Before filing or continuing to prosecute any legal proceeding or claim +(other than a Defensive Action) arising from termination of a Covered +License, we commit to extend to the person or entity ('you') accused +of violating the Covered License the following provisions regarding +cure and reinstatement, taken from GPL version 3. As used here, the +term 'this License' refers to the specific Covered License being +enforced. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly + and finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you + have received notice of violation of this License (for any work) + from that copyright holder, and you cure the violation prior to 30 + days after your receipt of the notice. + +We intend this Commitment to be irrevocable, and binding and +enforceable against us and assignees of or successors to our +copyrights. + +Definitions + +'Covered License' means the GNU General Public License, version 2 +(GPLv2), the GNU Lesser General Public License, version 2.1 +(LGPLv2.1), or the GNU Library General Public License, version 2 +(LGPLv2), all as published by the Free Software Foundation. + +'Defensive Action' means a legal proceeding or claim that We bring +against you in response to a prior proceeding or claim initiated by +you or your affiliate. + +'We' means each contributor to this repository as of the date of +inclusion of this file, including subsidiaries of a corporate +contributor. + +This work is available under a Creative Commons Attribution-ShareAlike +4.0 International license (https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/LICENSE b/TugasAkhir/vendor/phpmailer/phpmailer/LICENSE new file mode 100644 index 0000000..f166cc5 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/LICENSE @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! \ No newline at end of file diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/README.md b/TugasAkhir/vendor/phpmailer/phpmailer/README.md new file mode 100644 index 0000000..e3e4ecf --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/README.md @@ -0,0 +1,231 @@ +[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://supportukrainenow.org/) + +![PHPMailer](https://raw.github.com/PHPMailer/PHPMailer/master/examples/images/phpmailer.png) + +# PHPMailer – A full-featured email creation and transfer class for PHP + +[![Test status](https://github.com/PHPMailer/PHPMailer/workflows/Tests/badge.svg)](https://github.com/PHPMailer/PHPMailer/actions) +[![codecov.io](https://codecov.io/gh/PHPMailer/PHPMailer/branch/master/graph/badge.svg?token=iORZpwmYmM)](https://codecov.io/gh/PHPMailer/PHPMailer) +[![Latest Stable Version](https://poser.pugx.org/phpmailer/phpmailer/v/stable.svg)](https://packagist.org/packages/phpmailer/phpmailer) +[![Total Downloads](https://poser.pugx.org/phpmailer/phpmailer/downloads)](https://packagist.org/packages/phpmailer/phpmailer) +[![License](https://poser.pugx.org/phpmailer/phpmailer/license.svg)](https://packagist.org/packages/phpmailer/phpmailer) +[![API Docs](https://github.com/phpmailer/phpmailer/workflows/Docs/badge.svg)](https://phpmailer.github.io/PHPMailer/) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/PHPMailer/PHPMailer/badge)](https://api.securityscorecards.dev/projects/github.com/PHPMailer/PHPMailer) + +## Features +- Probably the world's most popular code for sending email from PHP! +- Used by many open-source projects: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more +- Integrated SMTP support – send without a local mail server +- Send emails with multiple To, CC, BCC, and Reply-to addresses +- Multipart/alternative emails for mail clients that do not read HTML email +- Add attachments, including inline +- Support for UTF-8 content and 8bit, base64, binary, and quoted-printable encodings +- SMTP authentication with LOGIN, PLAIN, CRAM-MD5, and XOAUTH2 mechanisms over SMTPS and SMTP+STARTTLS transports +- Validates email addresses automatically +- Protects against header injection attacks +- Error messages in over 50 languages! +- DKIM and S/MIME signing support +- Compatible with PHP 5.5 and later, including PHP 8.2 +- Namespaced to prevent name clashes +- Much more! + +## Why you might need it +Many PHP developers need to send email from their code. The only PHP function that supports this directly is [`mail()`](https://www.php.net/manual/en/function.mail.php). However, it does not provide any assistance for making use of popular features such as encryption, authentication, HTML messages, and attachments. + +Formatting email correctly is surprisingly difficult. There are myriad overlapping (and conflicting) standards, requiring tight adherence to horribly complicated formatting and encoding rules – the vast majority of code that you'll find online that uses the `mail()` function directly is just plain wrong, if not unsafe! + +The PHP `mail()` function usually sends via a local mail server, typically fronted by a `sendmail` binary on Linux, BSD, and macOS platforms, however, Windows usually doesn't include a local mail server; PHPMailer's integrated SMTP client allows email sending on all platforms without needing a local mail server. Be aware though, that the `mail()` function should be avoided when possible; it's both faster and [safer](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html) to use SMTP to localhost. + +*Please* don't be tempted to do it yourself – if you don't use PHPMailer, there are many other excellent libraries that +you should look at before rolling your own. Try [SwiftMailer](https://swiftmailer.symfony.com/) +, [Laminas/Mail](https://docs.laminas.dev/laminas-mail/), [ZetaComponents](https://github.com/zetacomponents/Mail), etc. + +## License +This software is distributed under the [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html) license, along with the [GPL Cooperation Commitment](https://gplcc.github.io/gplcc/). Please read [LICENSE](https://github.com/PHPMailer/PHPMailer/blob/master/LICENSE) for information on the software availability and distribution. + +## Installation & loading +PHPMailer is available on [Packagist](https://packagist.org/packages/phpmailer/phpmailer) (using semantic versioning), and installation via [Composer](https://getcomposer.org) is the recommended way to install PHPMailer. Just add this line to your `composer.json` file: + +```json +"phpmailer/phpmailer": "^6.9.1" +``` + +or run + +```sh +composer require phpmailer/phpmailer +``` + +Note that the `vendor` folder and the `vendor/autoload.php` script are generated by Composer; they are not part of PHPMailer. + +If you want to use XOAUTH2 authentication, you will also need to add a dependency on the `league/oauth2-client` and appropriate service adapters package in your `composer.json`, or take a look at +by @decomplexity's [SendOauth2 wrapper](https://github.com/decomplexity/SendOauth2), especially if you're using Microsoft services. + +Alternatively, if you're not using Composer, you +can [download PHPMailer as a zip file](https://github.com/PHPMailer/PHPMailer/archive/master.zip), (note that docs and examples are not included in the zip file), then copy the contents of the PHPMailer folder into one of the `include_path` directories specified in your PHP configuration and load each class file manually: + +```php +SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output + $mail->isSMTP(); //Send using SMTP + $mail->Host = 'smtp.example.com'; //Set the SMTP server to send through + $mail->SMTPAuth = true; //Enable SMTP authentication + $mail->Username = 'user@example.com'; //SMTP username + $mail->Password = 'secret'; //SMTP password + $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption + $mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS` + + //Recipients + $mail->setFrom('from@example.com', 'Mailer'); + $mail->addAddress('joe@example.net', 'Joe User'); //Add a recipient + $mail->addAddress('ellen@example.com'); //Name is optional + $mail->addReplyTo('info@example.com', 'Information'); + $mail->addCC('cc@example.com'); + $mail->addBCC('bcc@example.com'); + + //Attachments + $mail->addAttachment('/var/tmp/file.tar.gz'); //Add attachments + $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); //Optional name + + //Content + $mail->isHTML(true); //Set email format to HTML + $mail->Subject = 'Here is the subject'; + $mail->Body = 'This is the HTML message body in bold!'; + $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; + + $mail->send(); + echo 'Message has been sent'; +} catch (Exception $e) { + echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; +} +``` + +You'll find plenty to play with in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder, which covers many common scenarios including sending through Gmail, building contact forms, sending to mailing lists, and more. + +If you are re-using the instance (e.g. when sending to a mailing list), you may need to clear the recipient list to avoid sending duplicate messages. See [the mailing list example](https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps) for further guidance. + +That's it. You should now be ready to use PHPMailer! + +## Localization +PHPMailer defaults to English, but in the [language](https://github.com/PHPMailer/PHPMailer/tree/master/language/) folder, you'll find many translations for PHPMailer error messages that you may encounter. Their filenames contain [ISO 639-1](http://en.wikipedia.org/wiki/ISO_639-1) language code for the translations, for example `fr` for French. To specify a language, you need to tell PHPMailer which one to use, like this: + +```php +//To load the French version +$mail->setLanguage('fr', '/optional/path/to/language/directory/'); +``` + +We welcome corrections and new languages – if you're looking for corrections, run the [Language/TranslationCompletenessTest.php](https://github.com/PHPMailer/PHPMailer/blob/master/test/Language/TranslationCompletenessTest.php) script in the tests folder and it will show any missing translations. + +## Documentation +Start reading at the [GitHub wiki](https://github.com/PHPMailer/PHPMailer/wiki). If you're having trouble, head for [the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting) as it's frequently updated. + +Examples of how to use PHPMailer for common scenarios can be found in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder. If you're looking for a good starting point, we recommend you start with [the Gmail example](https://github.com/PHPMailer/PHPMailer/tree/master/examples/gmail.phps). + +To reduce PHPMailer's deployed code footprint, examples are not included if you load PHPMailer via Composer or via [GitHub's zip file download](https://github.com/PHPMailer/PHPMailer/archive/master.zip), so you'll need to either clone the git repository or use the above links to get to the examples directly. + +Complete generated API documentation is [available online](https://phpmailer.github.io/PHPMailer/). + +You can generate complete API-level documentation by running `phpdoc` in the top-level folder, and documentation will appear in the `docs` folder, though you'll need to have [PHPDocumentor](http://www.phpdoc.org) installed. You may find [the unit tests](https://github.com/PHPMailer/PHPMailer/blob/master/test/PHPMailerTest.php) a good reference for how to do various operations such as encryption. + +If the documentation doesn't cover what you need, search the [many questions on Stack Overflow](http://stackoverflow.com/questions/tagged/phpmailer), and before you ask a question about "SMTP Error: Could not connect to SMTP host.", [read the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting). + +## Tests +[PHPMailer tests](https://github.com/PHPMailer/PHPMailer/tree/master/test/) use PHPUnit 9, with [a polyfill](https://github.com/Yoast/PHPUnit-Polyfills) to let 9-style tests run on older PHPUnit and PHP versions. + +[![Test status](https://github.com/PHPMailer/PHPMailer/workflows/Tests/badge.svg)](https://github.com/PHPMailer/PHPMailer/actions) + +If this isn't passing, is there something you can do to help? + +## Security +Please disclose any vulnerabilities found responsibly – report security issues to the maintainers privately. + +See [SECURITY](https://github.com/PHPMailer/PHPMailer/tree/master/SECURITY.md) and [PHPMailer's security advisories on GitHub](https://github.com/PHPMailer/PHPMailer/security). + +## Contributing +Please submit bug reports, suggestions, and pull requests to the [GitHub issue tracker](https://github.com/PHPMailer/PHPMailer/issues). + +We're particularly interested in fixing edge cases, expanding test coverage, and updating translations. + +If you found a mistake in the docs, or want to add something, go ahead and amend the wiki – anyone can edit it. + +If you have git clones from prior to the move to the PHPMailer GitHub organisation, you'll need to update any remote URLs referencing the old GitHub location with a command like this from within your clone: + +```sh +git remote set-url upstream https://github.com/PHPMailer/PHPMailer.git +``` + +Please *don't* use the SourceForge or Google Code projects any more; they are obsolete and no longer maintained. + +## Sponsorship +Development time and resources for PHPMailer are provided by [Smartmessages.net](https://info.smartmessages.net/), the world's only privacy-first email marketing system. + +Smartmessages.net privacy-first email marketing logo + +Donations are very welcome, whether in beer 🍺, T-shirts 👕, or cold, hard cash 💰. Sponsorship through GitHub is a simple and convenient way to say "thank you" to PHPMailer's maintainers and contributors – just click the "Sponsor" button [on the project page](https://github.com/PHPMailer/PHPMailer). If your company uses PHPMailer, consider taking part in Tidelift's enterprise support programme. + +## PHPMailer For Enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of PHPMailer and thousands of other packages are working with Tidelift to deliver commercial +support and maintenance for the open-source packages you use to build your applications. Save time, reduce risk, and +improve code health, while paying the maintainers of the exact packages you +use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-phpmailer-phpmailer?utm_source=packagist-phpmailer-phpmailer&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +## Changelog +See [changelog](changelog.md). + +## History +- PHPMailer was originally written in 2001 by Brent R. Matzelle as a [SourceForge project](http://sourceforge.net/projects/phpmailer/). +- [Marcus Bointon](https://github.com/Synchro) (`coolbru` on SF) and Andy Prevost (`codeworxtech`) took over the project in 2004. +- Became an Apache incubator project on Google Code in 2010, managed by Jim Jagielski. +- Marcus created [his fork on GitHub](https://github.com/Synchro/PHPMailer) in 2008. +- Jim and Marcus decide to join forces and use GitHub as the canonical and official repo for PHPMailer in 2013. +- PHPMailer moves to [the PHPMailer organisation](https://github.com/PHPMailer) on GitHub in 2013. + +### What's changed since moving from SourceForge? +- Official successor to the SourceForge and Google Code projects. +- Test suite. +- Continuous integration with GitHub Actions. +- Composer support. +- Public development. +- Additional languages and language strings. +- CRAM-MD5 authentication support. +- Preserves full repo history of authors, commits, and branches from the original SourceForge project. diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/SECURITY.md b/TugasAkhir/vendor/phpmailer/phpmailer/SECURITY.md new file mode 100644 index 0000000..035a87f --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/SECURITY.md @@ -0,0 +1,37 @@ +# Security notices relating to PHPMailer + +Please disclose any security issues or vulnerabilities found through [Tidelift's coordinated disclosure system](https://tidelift.com/security) or to the maintainers privately. + +PHPMailer 6.4.1 and earlier contain a vulnerability that can result in untrusted code being called (if such code is injected into the host project's scope by other means). If the `$patternselect` parameter to `validateAddress()` is set to `'php'` (the default, defined by `PHPMailer::$validator`), and the global namespace contains a function called `php`, it will be called in preference to the built-in validator of the same name. Mitigated in PHPMailer 6.5.0 by denying the use of simple strings as validator function names. Recorded as [CVE-2021-3603](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-3603). Reported by [Vikrant Singh Chauhan](mailto:vi@hackberry.xyz) via [huntr.dev](https://www.huntr.dev/). + +PHPMailer versions 6.4.1 and earlier contain a possible remote code execution vulnerability through the `$lang_path` parameter of the `setLanguage()` method. If the `$lang_path` parameter is passed unfiltered from user input, it can be set to [a UNC path](https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats#unc-paths), and if an attacker is also able to persuade the server to load a file from that UNC path, a script file under their control may be executed. This vulnerability only applies to systems that resolve UNC paths, typically only Microsoft Windows. +PHPMailer 6.5.0 mitigates this by no longer treating translation files as PHP code, but by parsing their text content directly. This approach avoids the possibility of executing unknown code while retaining backward compatibility. This isn't ideal, so the current translation format is deprecated and will be replaced in the next major release. Recorded as [CVE-2021-34551](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-34551). Reported by [Jilin Diting Information Technology Co., Ltd](https://listensec.com) via Tidelift. + +PHPMailer versions between 6.1.8 and 6.4.0 contain a regression of the earlier CVE-2018-19296 object injection vulnerability as a result of [a fix for Windows UNC paths in 6.1.8](https://github.com/PHPMailer/PHPMailer/commit/e2e07a355ee8ff36aba21d0242c5950c56e4c6f9). Recorded as [CVE-2020-36326](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-36326). Reported by Fariskhi Vidyan via Tidelift. 6.4.1 fixes this issue, and also enforces stricter checks for URL schemes in local path contexts. + +PHPMailer versions 6.1.5 and earlier contain an output escaping bug that occurs in `Content-Type` and `Content-Disposition` when filenames passed into `addAttachment` and other methods that accept attachment names contain double quote characters, in contravention of RFC822 3.4.1. No specific vulnerability has been found relating to this, but it could allow file attachments to bypass attachment filters that are based on matching filename extensions. Recorded as [CVE-2020-13625](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-13625). Reported by Elar Lang of Clarified Security. + +PHPMailer versions prior to 6.0.6 and 5.2.27 are vulnerable to an object injection attack by passing `phar://` paths into `addAttachment()` and other functions that may receive unfiltered local paths, possibly leading to RCE. Recorded as [CVE-2018-19296](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2018-19296). See [this article](https://knasmueller.net/5-answers-about-php-phar-exploitation) for more info on this type of vulnerability. Mitigated by blocking the use of paths containing URL-protocol style prefixes such as `phar://`. Reported by Sehun Oh of cyberone.kr. + +PHPMailer versions prior to 5.2.24 (released July 26th 2017) have an XSS vulnerability in one of the code examples, [CVE-2017-11503](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-11503). The `code_generator.phps` example did not filter user input prior to output. This file is distributed with a `.phps` extension, so it it not normally executable unless it is explicitly renamed, and the file is not included when PHPMailer is loaded through composer, so it is safe by default. There was also an undisclosed potential XSS vulnerability in the default exception handler (unused by default). Patches for both issues kindly provided by Patrick Monnerat of the Fedora Project. + +PHPMailer versions prior to 5.2.22 (released January 9th 2017) have a local file disclosure vulnerability, [CVE-2017-5223](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-5223). If content passed into `msgHTML()` is sourced from unfiltered user input, relative paths can map to absolute local file paths and added as attachments. Also note that `addAttachment` (just like `file_get_contents`, `passthru`, `unlink`, etc) should not be passed user-sourced params either! Reported by Yongxiang Li of Asiasecurity. + +PHPMailer versions prior to 5.2.20 (released December 28th 2016) are vulnerable to [CVE-2016-10045](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10045) a remote code execution vulnerability, responsibly reported by [Dawid Golunski](https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html), and patched by Paul Buonopane (@Zenexer). + +PHPMailer versions prior to 5.2.18 (released December 2016) are vulnerable to [CVE-2016-10033](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10033) a remote code execution vulnerability, responsibly reported by [Dawid Golunski](http://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html). + +PHPMailer versions prior to 5.2.14 (released November 2015) are vulnerable to [CVE-2015-8476](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-8476) an SMTP CRLF injection bug permitting arbitrary message sending. + +PHPMailer versions prior to 5.2.10 (released May 2015) are vulnerable to [CVE-2008-5619](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2008-5619), a remote code execution vulnerability in the bundled html2text library. This file was removed in 5.2.10, so if you are using a version prior to that and make use of the html2text function, it's vitally important that you upgrade and remove this file. + +PHPMailer versions prior to 2.0.7 and 2.2.1 are vulnerable to [CVE-2012-0796](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2012-0796), an email header injection attack. + +Joomla 1.6.0 uses PHPMailer in an unsafe way, allowing it to reveal local file paths, reported in [CVE-2011-3747](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2011-3747). + +PHPMailer didn't sanitise the `$lang_path` parameter in `SetLanguage`. This wasn't a problem in itself, but some apps (PHPClassifieds, ATutor) also failed to sanitise user-provided parameters passed to it, permitting semi-arbitrary local file inclusion, reported in [CVE-2010-4914](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2010-4914), [CVE-2007-2021](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2007-2021) and [CVE-2006-5734](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2006-5734). + +PHPMailer 1.7.2 and earlier contained a possible DDoS vulnerability reported in [CVE-2005-1807](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-1807). + +PHPMailer 1.7 and earlier (June 2003) have a possible vulnerability in the `SendmailSend` method where shell commands may not be sanitised. Reported in [CVE-2007-3215](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2007-3215). + diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/VERSION b/TugasAkhir/vendor/phpmailer/phpmailer/VERSION new file mode 100644 index 0000000..dc3829f --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/VERSION @@ -0,0 +1 @@ +6.9.1 diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/composer.json b/TugasAkhir/vendor/phpmailer/phpmailer/composer.json new file mode 100644 index 0000000..fa170a0 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/composer.json @@ -0,0 +1,79 @@ +{ + "name": "phpmailer/phpmailer", + "type": "library", + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "require": { + "php": ">=5.5.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.7.2", + "yoast/phpunit-polyfills": "^1.0.4" + }, + "suggest": { + "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + }, + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "PHPMailer\\Test\\": "test/" + } + }, + "license": "LGPL-2.1-only", + "scripts": { + "check": "./vendor/bin/phpcs", + "test": "./vendor/bin/phpunit --no-coverage", + "coverage": "./vendor/bin/phpunit", + "lint": [ + "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . --show-deprecated -e php,phps --exclude vendor --exclude .git --exclude build" + ] + } +} diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/get_oauth_token.php b/TugasAkhir/vendor/phpmailer/phpmailer/get_oauth_token.php new file mode 100644 index 0000000..cda0445 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/get_oauth_token.php @@ -0,0 +1,182 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +/** + * Get an OAuth2 token from an OAuth2 provider. + * * Install this script on your server so that it's accessible + * as [https/http]:////get_oauth_token.php + * e.g.: http://localhost/phpmailer/get_oauth_token.php + * * Ensure dependencies are installed with 'composer install' + * * Set up an app in your Google/Yahoo/Microsoft account + * * Set the script address as the app's redirect URL + * If no refresh token is obtained when running this file, + * revoke access to your app and run the script again. + */ + +namespace PHPMailer\PHPMailer; + +/** + * Aliases for League Provider Classes + * Make sure you have added these to your composer.json and run `composer install` + * Plenty to choose from here: + * @see http://oauth2-client.thephpleague.com/providers/thirdparty/ + */ +//@see https://github.com/thephpleague/oauth2-google +use League\OAuth2\Client\Provider\Google; +//@see https://packagist.org/packages/hayageek/oauth2-yahoo +use Hayageek\OAuth2\Client\Provider\Yahoo; +//@see https://github.com/stevenmaguire/oauth2-microsoft +use Stevenmaguire\OAuth2\Client\Provider\Microsoft; +//@see https://github.com/greew/oauth2-azure-provider +use Greew\OAuth2\Client\Provider\Azure; + +if (!isset($_GET['code']) && !isset($_POST['provider'])) { + ?> + + +
+

Select Provider

+ +
+ +
+ +
+ +
+

Enter id and secret

+

These details are obtained by setting up an app in your provider's developer console. +

+

ClientId:

+

ClientSecret:

+

TenantID (only relevant for Azure):

+ +
+ + + $clientId, + 'clientSecret' => $clientSecret, + 'redirectUri' => $redirectUri, + 'accessType' => 'offline' +]; + +$options = []; +$provider = null; + +switch ($providerName) { + case 'Google': + $provider = new Google($params); + $options = [ + 'scope' => [ + 'https://mail.google.com/' + ] + ]; + break; + case 'Yahoo': + $provider = new Yahoo($params); + break; + case 'Microsoft': + $provider = new Microsoft($params); + $options = [ + 'scope' => [ + 'wl.imap', + 'wl.offline_access' + ] + ]; + break; + case 'Azure': + $params['tenantId'] = $tenantId; + + $provider = new Azure($params); + $options = [ + 'scope' => [ + 'https://outlook.office.com/SMTP.Send', + 'offline_access' + ] + ]; + break; +} + +if (null === $provider) { + exit('Provider missing'); +} + +if (!isset($_GET['code'])) { + //If we don't have an authorization code then get one + $authUrl = $provider->getAuthorizationUrl($options); + $_SESSION['oauth2state'] = $provider->getState(); + header('Location: ' . $authUrl); + exit; + //Check given state against previously stored one to mitigate CSRF attack +} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) { + unset($_SESSION['oauth2state']); + unset($_SESSION['provider']); + exit('Invalid state'); +} else { + unset($_SESSION['provider']); + //Try to get an access token (using the authorization code grant) + $token = $provider->getAccessToken( + 'authorization_code', + [ + 'code' => $_GET['code'] + ] + ); + //Use this to interact with an API on the users behalf + //Use this to get a new access token if the old one expires + echo 'Refresh Token: ', $token->getRefreshToken(); +} diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-af.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-af.php new file mode 100644 index 0000000..0b2a72d --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-af.php @@ -0,0 +1,26 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'خطأ SMTP : لا يمكن تأكيد الهوية.'; +$PHPMAILER_LANG['connect_host'] = 'خطأ SMTP: لا يمكن الاتصال بالخادم SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'خطأ SMTP: لم يتم قبول المعلومات .'; +$PHPMAILER_LANG['empty_message'] = 'نص الرسالة فارغ'; +$PHPMAILER_LANG['encoding'] = 'ترميز غير معروف: '; +$PHPMAILER_LANG['execute'] = 'لا يمكن تنفيذ : '; +$PHPMAILER_LANG['file_access'] = 'لا يمكن الوصول للملف: '; +$PHPMAILER_LANG['file_open'] = 'خطأ في الملف: لا يمكن فتحه: '; +$PHPMAILER_LANG['from_failed'] = 'خطأ على مستوى عنوان المرسل : '; +$PHPMAILER_LANG['instantiate'] = 'لا يمكن توفير خدمة البريد.'; +$PHPMAILER_LANG['invalid_address'] = 'الإرسال غير ممكن لأن عنوان البريد الإلكتروني غير صالح: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' برنامج الإرسال غير مدعوم.'; +$PHPMAILER_LANG['provide_address'] = 'يجب توفير عنوان البريد الإلكتروني لمستلم واحد على الأقل.'; +$PHPMAILER_LANG['recipients_failed'] = 'خطأ SMTP: الأخطاء التالية فشل في الارسال لكل من : '; +$PHPMAILER_LANG['signing'] = 'خطأ في التوقيع: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() غير ممكن.'; +$PHPMAILER_LANG['smtp_error'] = 'خطأ على مستوى الخادم SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'لا يمكن تعيين أو إعادة تعيين متغير: '; +$PHPMAILER_LANG['extension_missing'] = 'الإضافة غير موجودة: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-as.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-as.php new file mode 100644 index 0000000..327dfba --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-as.php @@ -0,0 +1,35 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP ত্ৰুটি: প্ৰমাণীকৰণ কৰিব নোৱাৰি'; +$PHPMAILER_LANG['buggy_php'] = 'আপোনাৰ PHP সংস্কৰণ এটা বাগৰ দ্বাৰা প্ৰভাৱিত হয় যাৰ ফলত নষ্ট বাৰ্তা হব পাৰে । ইয়াক সমাধান কৰিবলে, প্ৰেৰণ কৰিবলে SMTP ব্যৱহাৰ কৰক, আপোনাৰ php.ini ত mail.add_x_header বিকল্প নিষ্ক্ৰিয় কৰক, MacOS বা Linux লৈ সলনি কৰক, বা আপোনাৰ PHP সংস্কৰণ 7.0.17+ বা 7.1.3+ লৈ সলনি কৰক ।'; +$PHPMAILER_LANG['connect_host'] = 'SMTP ত্ৰুটি: SMTP চাৰ্ভাৰৰ সৈতে সংযোগ কৰিবলে অক্ষম'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP ত্ৰুটি: তথ্য গ্ৰহণ কৰা হোৱা নাই'; +$PHPMAILER_LANG['empty_message'] = 'বাৰ্তাৰ মূখ্য অংশ খালী।'; +$PHPMAILER_LANG['encoding'] = 'অজ্ঞাত এনকোডিং: '; +$PHPMAILER_LANG['execute'] = 'এক্সিকিউট কৰিব নোৱাৰি: '; +$PHPMAILER_LANG['extension_missing'] = 'সম্প্ৰসাৰণ নোহোৱা হৈছে: '; +$PHPMAILER_LANG['file_access'] = 'ফাইল অভিগম কৰিবলে অক্ষম: '; +$PHPMAILER_LANG['file_open'] = 'ফাইল ত্ৰুটি: ফাইল খোলিবলৈ অক্ষম: '; +$PHPMAILER_LANG['from_failed'] = 'নিম্নলিখিত প্ৰেৰকৰ ঠিকনা(সমূহ) ব্যৰ্থ: '; +$PHPMAILER_LANG['instantiate'] = 'মেইল ফাংচনৰ এটা উদাহৰণ সৃষ্টি কৰিবলে অক্ষম'; +$PHPMAILER_LANG['invalid_address'] = 'প্ৰেৰণ কৰিব নোৱাৰি: অবৈধ ইমেইল ঠিকনা: '; +$PHPMAILER_LANG['invalid_header'] = 'অবৈধ হেডাৰৰ নাম বা মান'; +$PHPMAILER_LANG['invalid_hostentry'] = 'অবৈধ হোষ্টেন্ট্ৰি: '; +$PHPMAILER_LANG['invalid_host'] = 'অবৈধ হস্ট:'; +$PHPMAILER_LANG['mailer_not_supported'] = 'মেইলাৰ সমৰ্থিত নহয়।'; +$PHPMAILER_LANG['provide_address'] = 'আপুনি অন্ততঃ এটা গন্তব্য ইমেইল ঠিকনা দিব লাগিব'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP ত্ৰুটি: নিম্নলিখিত গন্তব্যস্থানসমূহ ব্যৰ্থ: '; +$PHPMAILER_LANG['signing'] = 'স্বাক্ষৰ কৰাত ব্যৰ্থ: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP কড: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'অতিৰিক্ত SMTP তথ্য: '; +$PHPMAILER_LANG['smtp_detail'] = 'বিৱৰণ:'; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP সংযোগ() ব্যৰ্থ'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP চাৰ্ভাৰৰ ত্ৰুটি: '; +$PHPMAILER_LANG['variable_set'] = 'চলক নিৰ্ধাৰণ কৰিব পৰা নগল: '; +$PHPMAILER_LANG['extension_missing'] = 'অনুপস্থিত সম্প্ৰসাৰণ: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-az.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-az.php new file mode 100644 index 0000000..552167e --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-az.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Greška: Neuspjela prijava.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Greška: Nije moguće spojiti se sa SMTP serverom.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Greška: Podatci nisu prihvaćeni.'; +$PHPMAILER_LANG['empty_message'] = 'Sadržaj poruke je prazan.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznata kriptografija: '; +$PHPMAILER_LANG['execute'] = 'Nije moguće izvršiti naredbu: '; +$PHPMAILER_LANG['file_access'] = 'Nije moguće pristupiti datoteci: '; +$PHPMAILER_LANG['file_open'] = 'Nije moguće otvoriti datoteku: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP Greška: Slanje sa navedenih e-mail adresa nije uspjelo: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Greška: Slanje na navedene e-mail adrese nije uspjelo: '; +$PHPMAILER_LANG['instantiate'] = 'Ne mogu pokrenuti mail funkcionalnost.'; +$PHPMAILER_LANG['invalid_address'] = 'E-mail nije poslan. Neispravna e-mail adresa: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nije podržan.'; +$PHPMAILER_LANG['provide_address'] = 'Definišite barem jednu adresu primaoca.'; +$PHPMAILER_LANG['signing'] = 'Greška prilikom prijave: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Spajanje na SMTP server nije uspjelo.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP greška: '; +$PHPMAILER_LANG['variable_set'] = 'Nije moguće postaviti varijablu ili je vratiti nazad: '; +$PHPMAILER_LANG['extension_missing'] = 'Nedostaje ekstenzija: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-be.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-be.php new file mode 100644 index 0000000..9e92dda --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-be.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Памылка SMTP: памылка ідэнтыфікацыі.'; +$PHPMAILER_LANG['connect_host'] = 'Памылка SMTP: нельга ўстанавіць сувязь з SMTP-серверам.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Памылка SMTP: звесткі непрынятыя.'; +$PHPMAILER_LANG['empty_message'] = 'Пустое паведамленне.'; +$PHPMAILER_LANG['encoding'] = 'Невядомая кадыроўка тэксту: '; +$PHPMAILER_LANG['execute'] = 'Нельга выканаць каманду: '; +$PHPMAILER_LANG['file_access'] = 'Няма доступу да файла: '; +$PHPMAILER_LANG['file_open'] = 'Нельга адкрыць файл: '; +$PHPMAILER_LANG['from_failed'] = 'Няправільны адрас адпраўніка: '; +$PHPMAILER_LANG['instantiate'] = 'Нельга прымяніць функцыю mail().'; +$PHPMAILER_LANG['invalid_address'] = 'Нельга даслаць паведамленне, няправільны email атрымальніка: '; +$PHPMAILER_LANG['provide_address'] = 'Запоўніце, калі ласка, правільны email атрымальніка.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' - паштовы сервер не падтрымліваецца.'; +$PHPMAILER_LANG['recipients_failed'] = 'Памылка SMTP: няправільныя атрымальнікі: '; +$PHPMAILER_LANG['signing'] = 'Памылка подпісу паведамлення: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Памылка сувязі з SMTP-серверам.'; +$PHPMAILER_LANG['smtp_error'] = 'Памылка SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Нельга ўстанавіць або перамяніць значэнне пераменнай: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-bg.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-bg.php new file mode 100644 index 0000000..c41f675 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-bg.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP грешка: Не може да се удостовери пред сървъра.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP грешка: Не може да се свърже с SMTP хоста.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP грешка: данните не са приети.'; +$PHPMAILER_LANG['empty_message'] = 'Съдържанието на съобщението е празно'; +$PHPMAILER_LANG['encoding'] = 'Неизвестно кодиране: '; +$PHPMAILER_LANG['execute'] = 'Не може да се изпълни: '; +$PHPMAILER_LANG['file_access'] = 'Няма достъп до файл: '; +$PHPMAILER_LANG['file_open'] = 'Файлова грешка: Не може да се отвори файл: '; +$PHPMAILER_LANG['from_failed'] = 'Следните адреси за подател са невалидни: '; +$PHPMAILER_LANG['instantiate'] = 'Не може да се инстанцира функцията mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Невалиден адрес: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' - пощенски сървър не се поддържа.'; +$PHPMAILER_LANG['provide_address'] = 'Трябва да предоставите поне един email адрес за получател.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP грешка: Следните адреси за Получател са невалидни: '; +$PHPMAILER_LANG['signing'] = 'Грешка при подписване: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP провален connect().'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP сървърна грешка: '; +$PHPMAILER_LANG['variable_set'] = 'Не може да се установи или възстанови променлива: '; +$PHPMAILER_LANG['extension_missing'] = 'Липсва разширение: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-bn.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-bn.php new file mode 100644 index 0000000..4736510 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-bn.php @@ -0,0 +1,35 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP ত্রুটি: প্রমাণীকরণ করতে অক্ষম৷'; +$PHPMAILER_LANG['buggy_php'] = 'আপনার PHP সংস্করণ একটি বাগ দ্বারা প্রভাবিত হয় যার ফলে দূষিত বার্তা হতে পারে। এটি ঠিক করতে, পাঠাতে SMTP ব্যবহার করুন, আপনার php.ini এ mail.add_x_header বিকল্পটি নিষ্ক্রিয় করুন, MacOS বা Linux-এ স্যুইচ করুন, অথবা আপনার PHP সংস্করণকে 7.0.17+ বা 7.1.3+ এ পরিবর্তন করুন।'; +$PHPMAILER_LANG['connect_host'] = 'SMTP ত্রুটি: SMTP সার্ভারের সাথে সংযোগ করতে অক্ষম৷'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP ত্রুটি: ডেটা গ্রহণ করা হয়নি৷'; +$PHPMAILER_LANG['empty_message'] = 'বার্তার অংশটি খালি।'; +$PHPMAILER_LANG['encoding'] = 'অজানা এনকোডিং: '; +$PHPMAILER_LANG['execute'] = 'নির্বাহ করতে অক্ষম: '; +$PHPMAILER_LANG['extension_missing'] = 'এক্সটেনশন অনুপস্থিত:'; +$PHPMAILER_LANG['file_access'] = 'ফাইল অ্যাক্সেস করতে অক্ষম: '; +$PHPMAILER_LANG['file_open'] = 'ফাইল ত্রুটি: ফাইল খুলতে অক্ষম: '; +$PHPMAILER_LANG['from_failed'] = 'নিম্নলিখিত প্রেরকের ঠিকানা(গুলি) ব্যর্থ হয়েছে: '; +$PHPMAILER_LANG['instantiate'] = 'মেল ফাংশনের একটি উদাহরণ তৈরি করতে অক্ষম৷'; +$PHPMAILER_LANG['invalid_address'] = 'পাঠাতে অক্ষম: অবৈধ ইমেল ঠিকানা: '; +$PHPMAILER_LANG['invalid_header'] = 'অবৈধ হেডার নাম বা মান'; +$PHPMAILER_LANG['invalid_hostentry'] = 'অবৈধ হোস্টেন্ট্রি: '; +$PHPMAILER_LANG['invalid_host'] = 'অবৈধ হোস্ট:'; +$PHPMAILER_LANG['mailer_not_supported'] = 'মেইলার সমর্থিত নয়।'; +$PHPMAILER_LANG['provide_address'] = 'আপনাকে অবশ্যই অন্তত একটি গন্তব্য ইমেল ঠিকানা প্রদান করতে হবে৷'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP ত্রুটি: নিম্নলিখিত গন্তব্যগুলি ব্যর্থ হয়েছে: '; +$PHPMAILER_LANG['signing'] = 'স্বাক্ষর করতে ব্যর্থ হয়েছে: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP কোড: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'অতিরিক্ত SMTP তথ্য:'; +$PHPMAILER_LANG['smtp_detail'] = 'বর্ণনা: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP সংযোগ() ব্যর্থ হয়েছে৷'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP সার্ভার ত্রুটি: '; +$PHPMAILER_LANG['variable_set'] = 'পরিবর্তনশীল সেট করা যায়নি: '; +$PHPMAILER_LANG['extension_missing'] = 'অনুপস্থিত এক্সটেনশন: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ca.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ca.php new file mode 100644 index 0000000..3468485 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ca.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Error SMTP: No s’ha pogut autenticar.'; +$PHPMAILER_LANG['connect_host'] = 'Error SMTP: No es pot connectar al servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Dades no acceptades.'; +$PHPMAILER_LANG['empty_message'] = 'El cos del missatge està buit.'; +$PHPMAILER_LANG['encoding'] = 'Codificació desconeguda: '; +$PHPMAILER_LANG['execute'] = 'No es pot executar: '; +$PHPMAILER_LANG['file_access'] = 'No es pot accedir a l’arxiu: '; +$PHPMAILER_LANG['file_open'] = 'Error d’Arxiu: No es pot obrir l’arxiu: '; +$PHPMAILER_LANG['from_failed'] = 'La(s) següent(s) adreces de remitent han fallat: '; +$PHPMAILER_LANG['instantiate'] = 'No s’ha pogut crear una instància de la funció Mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Adreça d’email invalida: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no està suportat'; +$PHPMAILER_LANG['provide_address'] = 'S’ha de proveir almenys una adreça d’email com a destinatari.'; +$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Els següents destinataris han fallat: '; +$PHPMAILER_LANG['signing'] = 'Error al signar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ha fallat el SMTP Connect().'; +$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'No s’ha pogut establir o restablir la variable: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php new file mode 100644 index 0000000..e770a1a --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php @@ -0,0 +1,28 @@ + + * Rewrite and extension of the work by Mikael Stokkebro + * + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP fejl: Login mislykkedes.'; +$PHPMAILER_LANG['buggy_php'] = 'Din version af PHP er berørt af en fejl, som gør at dine beskeder muligvis vises forkert. For at rette dette kan du skifte til SMTP, slå mail.add_x_header headeren i din php.ini fil fra, skifte til MacOS eller Linux eller opgradere din version af PHP til 7.0.17+ eller 7.1.3+.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP fejl: Forbindelse til SMTP serveren kunne ikke oprettes.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fejl: Data blev ikke accepteret.'; +$PHPMAILER_LANG['empty_message'] = 'Meddelelsen er uden indhold'; +$PHPMAILER_LANG['encoding'] = 'Ukendt encode-format: '; +$PHPMAILER_LANG['execute'] = 'Kunne ikke afvikle: '; +$PHPMAILER_LANG['extension_missing'] = 'Udvidelse mangler: '; +$PHPMAILER_LANG['file_access'] = 'Kunne ikke tilgå filen: '; +$PHPMAILER_LANG['file_open'] = 'Fil fejl: Kunne ikke åbne filen: '; +$PHPMAILER_LANG['from_failed'] = 'Følgende afsenderadresse er forkert: '; +$PHPMAILER_LANG['instantiate'] = 'Email funktionen kunne ikke initialiseres.'; +$PHPMAILER_LANG['invalid_address'] = 'Udgyldig adresse: '; +$PHPMAILER_LANG['invalid_header'] = 'Ugyldig header navn eller værdi'; +$PHPMAILER_LANG['invalid_hostentry'] = 'Ugyldig hostentry: '; +$PHPMAILER_LANG['invalid_host'] = 'Ugyldig vært: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer understøttes ikke.'; +$PHPMAILER_LANG['provide_address'] = 'Indtast mindst en modtagers email adresse.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP fejl: Følgende modtagere fejlede: '; +$PHPMAILER_LANG['signing'] = 'Signeringsfejl: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP kode: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Yderligere SMTP info: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fejlede.'; +$PHPMAILER_LANG['smtp_detail'] = 'Detalje: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server fejl: '; +$PHPMAILER_LANG['variable_set'] = 'Kunne ikke definere eller nulstille variablen: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-de.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-de.php new file mode 100644 index 0000000..e7e59d2 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-de.php @@ -0,0 +1,28 @@ + + * @author Crystopher Glodzienski Cardoso + */ + +$PHPMAILER_LANG['authenticate'] = 'Error SMTP: Imposible autentificar.'; +$PHPMAILER_LANG['connect_host'] = 'Error SMTP: Imposible conectar al servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Datos no aceptados.'; +$PHPMAILER_LANG['empty_message'] = 'El cuerpo del mensaje está vacío.'; +$PHPMAILER_LANG['encoding'] = 'Codificación desconocida: '; +$PHPMAILER_LANG['execute'] = 'Imposible ejecutar: '; +$PHPMAILER_LANG['file_access'] = 'Imposible acceder al archivo: '; +$PHPMAILER_LANG['file_open'] = 'Error de Archivo: Imposible abrir el archivo: '; +$PHPMAILER_LANG['from_failed'] = 'La(s) siguiente(s) direcciones de remitente fallaron: '; +$PHPMAILER_LANG['instantiate'] = 'Imposible crear una instancia de la función Mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Imposible enviar: dirección de email inválido: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no está soportado.'; +$PHPMAILER_LANG['provide_address'] = 'Debe proporcionar al menos una dirección de email de destino.'; +$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Los siguientes destinos fallaron: '; +$PHPMAILER_LANG['signing'] = 'Error al firmar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falló.'; +$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'No se pudo configurar la variable: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensión faltante: '; +$PHPMAILER_LANG['smtp_code'] = 'Código del servidor SMTP: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Información adicional del servidor SMTP: '; +$PHPMAILER_LANG['invalid_header'] = 'Nombre o valor de encabezado no válido'; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-et.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-et.php new file mode 100644 index 0000000..93addc9 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-et.php @@ -0,0 +1,28 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Viga: Autoriseerimise viga.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Viga: Ei õnnestunud luua ühendust SMTP serveriga.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Viga: Vigased andmed.'; +$PHPMAILER_LANG['empty_message'] = 'Tühi kirja sisu'; +$PHPMAILER_LANG["encoding"] = 'Tundmatu kodeering: '; +$PHPMAILER_LANG['execute'] = 'Tegevus ebaõnnestus: '; +$PHPMAILER_LANG['file_access'] = 'Pole piisavalt õiguseid järgneva faili avamiseks: '; +$PHPMAILER_LANG['file_open'] = 'Faili Viga: Faili avamine ebaõnnestus: '; +$PHPMAILER_LANG['from_failed'] = 'Järgnev saatja e-posti aadress on vigane: '; +$PHPMAILER_LANG['instantiate'] = 'mail funktiooni käivitamine ebaõnnestus.'; +$PHPMAILER_LANG['invalid_address'] = 'Saatmine peatatud, e-posti address vigane: '; +$PHPMAILER_LANG['provide_address'] = 'Te peate määrama vähemalt ühe saaja e-posti aadressi.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' maileri tugi puudub.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Viga: Järgnevate saajate e-posti aadressid on vigased: '; +$PHPMAILER_LANG["signing"] = 'Viga allkirjastamisel: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() ebaõnnestus.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP serveri viga: '; +$PHPMAILER_LANG['variable_set'] = 'Ei õnnestunud määrata või lähtestada muutujat: '; +$PHPMAILER_LANG['extension_missing'] = 'Nõutud laiendus on puudu: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-fa.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-fa.php new file mode 100644 index 0000000..295a47f --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-fa.php @@ -0,0 +1,28 @@ + + * @author Mohammad Hossein Mojtahedi + */ + +$PHPMAILER_LANG['authenticate'] = 'خطای SMTP: احراز هویت با شکست مواجه شد.'; +$PHPMAILER_LANG['connect_host'] = 'خطای SMTP: اتصال به سرور SMTP برقرار نشد.'; +$PHPMAILER_LANG['data_not_accepted'] = 'خطای SMTP: داده‌ها نا‌درست هستند.'; +$PHPMAILER_LANG['empty_message'] = 'بخش متن پیام خالی است.'; +$PHPMAILER_LANG['encoding'] = 'کد‌گذاری نا‌شناخته: '; +$PHPMAILER_LANG['execute'] = 'امکان اجرا وجود ندارد: '; +$PHPMAILER_LANG['file_access'] = 'امکان دسترسی به فایل وجود ندارد: '; +$PHPMAILER_LANG['file_open'] = 'خطای File: امکان بازکردن فایل وجود ندارد: '; +$PHPMAILER_LANG['from_failed'] = 'آدرس فرستنده اشتباه است: '; +$PHPMAILER_LANG['instantiate'] = 'امکان معرفی تابع ایمیل وجود ندارد.'; +$PHPMAILER_LANG['invalid_address'] = 'آدرس ایمیل معتبر نیست: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer پشتیبانی نمی‌شود.'; +$PHPMAILER_LANG['provide_address'] = 'باید حداقل یک آدرس گیرنده وارد کنید.'; +$PHPMAILER_LANG['recipients_failed'] = 'خطای SMTP: ارسال به آدرس گیرنده با خطا مواجه شد: '; +$PHPMAILER_LANG['signing'] = 'خطا در امضا: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'خطا در اتصال به SMTP.'; +$PHPMAILER_LANG['smtp_error'] = 'خطا در SMTP Server: '; +$PHPMAILER_LANG['variable_set'] = 'امکان ارسال یا ارسال مجدد متغیر‌ها وجود ندارد: '; +$PHPMAILER_LANG['extension_missing'] = 'افزونه موجود نیست: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-fi.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-fi.php new file mode 100644 index 0000000..6d1e637 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-fi.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP feilur: Kundi ikki góðkenna.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP feilur: Kundi ikki knýta samband við SMTP vert.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP feilur: Data ikki góðkent.'; +//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; +$PHPMAILER_LANG['encoding'] = 'Ókend encoding: '; +$PHPMAILER_LANG['execute'] = 'Kundi ikki útføra: '; +$PHPMAILER_LANG['file_access'] = 'Kundi ikki tilganga fílu: '; +$PHPMAILER_LANG['file_open'] = 'Fílu feilur: Kundi ikki opna fílu: '; +$PHPMAILER_LANG['from_failed'] = 'fylgjandi Frá/From adressa miseydnaðist: '; +$PHPMAILER_LANG['instantiate'] = 'Kuni ikki instantiera mail funktión.'; +//$PHPMAILER_LANG['invalid_address'] = 'Invalid address: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' er ikki supporterað.'; +$PHPMAILER_LANG['provide_address'] = 'Tú skal uppgeva minst móttakara-emailadressu(r).'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Feilur: Fylgjandi móttakarar miseydnaðust: '; +//$PHPMAILER_LANG['signing'] = 'Signing Error: '; +//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; +//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php new file mode 100644 index 0000000..0d367fc --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php @@ -0,0 +1,37 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Erro SMTP: Non puido ser autentificado.'; +$PHPMAILER_LANG['connect_host'] = 'Erro SMTP: Non puido conectar co servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Erro SMTP: Datos non aceptados.'; +$PHPMAILER_LANG['empty_message'] = 'Corpo da mensaxe vacía'; +$PHPMAILER_LANG['encoding'] = 'Codificación descoñecida: '; +$PHPMAILER_LANG['execute'] = 'Non puido ser executado: '; +$PHPMAILER_LANG['file_access'] = 'Nob puido acceder ó arquivo: '; +$PHPMAILER_LANG['file_open'] = 'Erro de Arquivo: No puido abrir o arquivo: '; +$PHPMAILER_LANG['from_failed'] = 'A(s) seguinte(s) dirección(s) de remitente(s) deron erro: '; +$PHPMAILER_LANG['instantiate'] = 'Non puido crear unha instancia da función Mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Non puido envia-lo correo: dirección de email inválida: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer non está soportado.'; +$PHPMAILER_LANG['provide_address'] = 'Debe engadir polo menos unha dirección de email coma destino.'; +$PHPMAILER_LANG['recipients_failed'] = 'Erro SMTP: Os seguintes destinos fallaron: '; +$PHPMAILER_LANG['signing'] = 'Erro ó firmar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fallou.'; +$PHPMAILER_LANG['smtp_error'] = 'Erro do servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Non puidemos axustar ou reaxustar a variábel: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-he.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-he.php new file mode 100644 index 0000000..b123aa5 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-he.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'שגיאת SMTP: פעולת האימות נכשלה.'; +$PHPMAILER_LANG['connect_host'] = 'שגיאת SMTP: לא הצלחתי להתחבר לשרת SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'שגיאת SMTP: מידע לא התקבל.'; +$PHPMAILER_LANG['empty_message'] = 'גוף ההודעה ריק'; +$PHPMAILER_LANG['invalid_address'] = 'כתובת שגויה: '; +$PHPMAILER_LANG['encoding'] = 'קידוד לא מוכר: '; +$PHPMAILER_LANG['execute'] = 'לא הצלחתי להפעיל את: '; +$PHPMAILER_LANG['file_access'] = 'לא ניתן לגשת לקובץ: '; +$PHPMAILER_LANG['file_open'] = 'שגיאת קובץ: לא ניתן לגשת לקובץ: '; +$PHPMAILER_LANG['from_failed'] = 'כתובות הנמענים הבאות נכשלו: '; +$PHPMAILER_LANG['instantiate'] = 'לא הצלחתי להפעיל את פונקציית המייל.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' אינה נתמכת.'; +$PHPMAILER_LANG['provide_address'] = 'חובה לספק לפחות כתובת אחת של מקבל המייל.'; +$PHPMAILER_LANG['recipients_failed'] = 'שגיאת SMTP: הנמענים הבאים נכשלו: '; +$PHPMAILER_LANG['signing'] = 'שגיאת חתימה: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; +$PHPMAILER_LANG['smtp_error'] = 'שגיאת שרת SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'לא ניתן לקבוע או לשנות את המשתנה: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php new file mode 100644 index 0000000..d2856e0 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php @@ -0,0 +1,35 @@ + + * Rewrite and extension of the work by Jayanti Suthar + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP त्रुटि: प्रामाणिकता की जांच नहीं हो सका। '; +$PHPMAILER_LANG['buggy_php'] = 'PHP का आपका संस्करण एक बग से प्रभावित है जिसके परिणामस्वरूप संदेश दूषित हो सकते हैं. इसे ठीक करने हेतु, भेजने के लिए SMTP का उपयोग करे, अपने php.ini में mail.add_x_header विकल्प को अक्षम करें, MacOS या Linux पर जाए, या अपने PHP संस्करण को 7.0.17+ या 7.1.3+ बदले.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP त्रुटि: SMTP सर्वर से कनेक्ट नहीं हो सका। '; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP त्रुटि: डेटा स्वीकार नहीं किया जाता है। '; +$PHPMAILER_LANG['empty_message'] = 'संदेश खाली है। '; +$PHPMAILER_LANG['encoding'] = 'अज्ञात एन्कोडिंग प्रकार। '; +$PHPMAILER_LANG['execute'] = 'आदेश को निष्पादित करने में विफल। '; +$PHPMAILER_LANG['extension_missing'] = 'एक्सटेन्षन गायब है: '; +$PHPMAILER_LANG['file_access'] = 'फ़ाइल उपलब्ध नहीं है। '; +$PHPMAILER_LANG['file_open'] = 'फ़ाइल त्रुटि: फाइल को खोला नहीं जा सका। '; +$PHPMAILER_LANG['from_failed'] = 'प्रेषक का पता गलत है। '; +$PHPMAILER_LANG['instantiate'] = 'मेल फ़ंक्शन कॉल नहीं कर सकता है।'; +$PHPMAILER_LANG['invalid_address'] = 'पता गलत है। '; +$PHPMAILER_LANG['invalid_header'] = 'अमान्य हेडर नाम या मान'; +$PHPMAILER_LANG['invalid_hostentry'] = 'अमान्य hostentry: '; +$PHPMAILER_LANG['invalid_host'] = 'अमान्य होस्ट: '; +$PHPMAILER_LANG['mailer_not_supported'] = 'मेल सर्वर के साथ काम नहीं करता है। '; +$PHPMAILER_LANG['provide_address'] = 'आपको कम से कम एक प्राप्तकर्ता का ई-मेल पता प्रदान करना होगा।'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP त्रुटि: निम्न प्राप्तकर्ताओं को पते भेजने में विफल। '; +$PHPMAILER_LANG['signing'] = 'साइनअप त्रुटि: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP कोड: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'अतिरिक्त SMTP जानकारी: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP का connect () फ़ंक्शन विफल हुआ। '; +$PHPMAILER_LANG['smtp_detail'] = 'विवरण: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP सर्वर त्रुटि। '; +$PHPMAILER_LANG['variable_set'] = 'चर को बना या संशोधित नहीं किया जा सकता। '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-hr.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-hr.php new file mode 100644 index 0000000..cacb6c3 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-hr.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Greška: Neuspjela autentikacija.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Greška: Ne mogu se spojiti na SMTP poslužitelj.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Greška: Podatci nisu prihvaćeni.'; +$PHPMAILER_LANG['empty_message'] = 'Sadržaj poruke je prazan.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznati encoding: '; +$PHPMAILER_LANG['execute'] = 'Nije moguće izvršiti naredbu: '; +$PHPMAILER_LANG['file_access'] = 'Nije moguće pristupiti datoteci: '; +$PHPMAILER_LANG['file_open'] = 'Nije moguće otvoriti datoteku: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP Greška: Slanje s navedenih e-mail adresa nije uspjelo: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Greška: Slanje na navedenih e-mail adresa nije uspjelo: '; +$PHPMAILER_LANG['instantiate'] = 'Ne mogu pokrenuti mail funkcionalnost.'; +$PHPMAILER_LANG['invalid_address'] = 'E-mail nije poslan. Neispravna e-mail adresa: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nije podržan.'; +$PHPMAILER_LANG['provide_address'] = 'Definirajte barem jednu adresu primatelja.'; +$PHPMAILER_LANG['signing'] = 'Greška prilikom prijave: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Spajanje na SMTP poslužitelj nije uspjelo.'; +$PHPMAILER_LANG['smtp_error'] = 'Greška SMTP poslužitelja: '; +$PHPMAILER_LANG['variable_set'] = 'Ne mogu postaviti varijablu niti ju vratiti nazad: '; +$PHPMAILER_LANG['extension_missing'] = 'Nedostaje proširenje: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-hu.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-hu.php new file mode 100644 index 0000000..e6b58b0 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-hu.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP -ի սխալ: չհաջողվեց ստուգել իսկությունը.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP -ի սխալ: չհաջողվեց կապ հաստատել SMTP սերվերի հետ.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP -ի սխալ: տվյալները ընդունված չեն.'; +$PHPMAILER_LANG['empty_message'] = 'Հաղորդագրությունը դատարկ է'; +$PHPMAILER_LANG['encoding'] = 'Կոդավորման անհայտ տեսակ: '; +$PHPMAILER_LANG['execute'] = 'Չհաջողվեց իրականացնել հրամանը: '; +$PHPMAILER_LANG['file_access'] = 'Ֆայլը հասանելի չէ: '; +$PHPMAILER_LANG['file_open'] = 'Ֆայլի սխալ: ֆայլը չհաջողվեց բացել: '; +$PHPMAILER_LANG['from_failed'] = 'Ուղարկողի հետևյալ հասցեն սխալ է: '; +$PHPMAILER_LANG['instantiate'] = 'Հնարավոր չէ կանչել mail ֆունկցիան.'; +$PHPMAILER_LANG['invalid_address'] = 'Հասցեն սխալ է: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' փոստային սերվերի հետ չի աշխատում.'; +$PHPMAILER_LANG['provide_address'] = 'Անհրաժեշտ է տրամադրել գոնե մեկ ստացողի e-mail հասցե.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP -ի սխալ: չի հաջողվել ուղարկել հետևյալ ստացողների հասցեներին: '; +$PHPMAILER_LANG['signing'] = 'Ստորագրման սխալ: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP -ի connect() ֆունկցիան չի հաջողվել'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP սերվերի սխալ: '; +$PHPMAILER_LANG['variable_set'] = 'Չի հաջողվում ստեղծել կամ վերափոխել փոփոխականը: '; +$PHPMAILER_LANG['extension_missing'] = 'Հավելվածը բացակայում է: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-id.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-id.php new file mode 100644 index 0000000..212a11f --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-id.php @@ -0,0 +1,31 @@ + + * @author @januridp + * @author Ian Mustafa + */ + +$PHPMAILER_LANG['authenticate'] = 'Kesalahan SMTP: Tidak dapat mengotentikasi.'; +$PHPMAILER_LANG['connect_host'] = 'Kesalahan SMTP: Tidak dapat terhubung ke host SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Kesalahan SMTP: Data tidak diterima.'; +$PHPMAILER_LANG['empty_message'] = 'Isi pesan kosong'; +$PHPMAILER_LANG['encoding'] = 'Pengkodean karakter tidak dikenali: '; +$PHPMAILER_LANG['execute'] = 'Tidak dapat menjalankan proses: '; +$PHPMAILER_LANG['file_access'] = 'Tidak dapat mengakses berkas: '; +$PHPMAILER_LANG['file_open'] = 'Kesalahan Berkas: Berkas tidak dapat dibuka: '; +$PHPMAILER_LANG['from_failed'] = 'Alamat pengirim berikut mengakibatkan kesalahan: '; +$PHPMAILER_LANG['instantiate'] = 'Tidak dapat menginisialisasi fungsi surel.'; +$PHPMAILER_LANG['invalid_address'] = 'Gagal terkirim, alamat surel tidak sesuai: '; +$PHPMAILER_LANG['invalid_hostentry'] = 'Gagal terkirim, entri host tidak sesuai: '; +$PHPMAILER_LANG['invalid_host'] = 'Gagal terkirim, host tidak sesuai: '; +$PHPMAILER_LANG['provide_address'] = 'Harus tersedia minimal satu alamat tujuan'; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer tidak didukung'; +$PHPMAILER_LANG['recipients_failed'] = 'Kesalahan SMTP: Alamat tujuan berikut menyebabkan kesalahan: '; +$PHPMAILER_LANG['signing'] = 'Kesalahan dalam penandatangan SSL: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() gagal.'; +$PHPMAILER_LANG['smtp_error'] = 'Kesalahan pada pelayan SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Tidak dapat mengatur atau mengatur ulang variabel: '; +$PHPMAILER_LANG['extension_missing'] = 'Ekstensi PHP tidak tersedia: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-it.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-it.php new file mode 100644 index 0000000..08a6b73 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-it.php @@ -0,0 +1,28 @@ + + * @author Stefano Sabatini + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Impossibile autenticarsi.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Impossibile connettersi all\'host SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Dati non accettati dal server.'; +$PHPMAILER_LANG['empty_message'] = 'Il corpo del messaggio è vuoto'; +$PHPMAILER_LANG['encoding'] = 'Codifica dei caratteri sconosciuta: '; +$PHPMAILER_LANG['execute'] = 'Impossibile eseguire l\'operazione: '; +$PHPMAILER_LANG['file_access'] = 'Impossibile accedere al file: '; +$PHPMAILER_LANG['file_open'] = 'File Error: Impossibile aprire il file: '; +$PHPMAILER_LANG['from_failed'] = 'I seguenti indirizzi mittenti hanno generato errore: '; +$PHPMAILER_LANG['instantiate'] = 'Impossibile istanziare la funzione mail'; +$PHPMAILER_LANG['invalid_address'] = 'Impossibile inviare, l\'indirizzo email non è valido: '; +$PHPMAILER_LANG['provide_address'] = 'Deve essere fornito almeno un indirizzo ricevente'; +$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer non supportato'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: I seguenti indirizzi destinatari hanno generato un errore: '; +$PHPMAILER_LANG['signing'] = 'Errore nella firma: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fallita.'; +$PHPMAILER_LANG['smtp_error'] = 'Errore del server SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Impossibile impostare o resettare la variabile: '; +$PHPMAILER_LANG['extension_missing'] = 'Estensione mancante: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php new file mode 100644 index 0000000..c76f526 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php @@ -0,0 +1,29 @@ + + * @author Yoshi Sakai + * @author Arisophy + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTPエラー: 認証できませんでした。'; +$PHPMAILER_LANG['connect_host'] = 'SMTPエラー: SMTPホストに接続できませんでした。'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTPエラー: データが受け付けられませんでした。'; +$PHPMAILER_LANG['empty_message'] = 'メール本文が空です。'; +$PHPMAILER_LANG['encoding'] = '不明なエンコーディング: '; +$PHPMAILER_LANG['execute'] = '実行できませんでした: '; +$PHPMAILER_LANG['file_access'] = 'ファイルにアクセスできません: '; +$PHPMAILER_LANG['file_open'] = 'ファイルエラー: ファイルを開けません: '; +$PHPMAILER_LANG['from_failed'] = 'Fromアドレスを登録する際にエラーが発生しました: '; +$PHPMAILER_LANG['instantiate'] = 'メール関数が正常に動作しませんでした。'; +$PHPMAILER_LANG['invalid_address'] = '不正なメールアドレス: '; +$PHPMAILER_LANG['provide_address'] = '少なくとも1つメールアドレスを 指定する必要があります。'; +$PHPMAILER_LANG['mailer_not_supported'] = ' メーラーがサポートされていません。'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTPエラー: 次の受信者アドレスに 間違いがあります: '; +$PHPMAILER_LANG['signing'] = '署名エラー: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP接続に失敗しました。'; +$PHPMAILER_LANG['smtp_error'] = 'SMTPサーバーエラー: '; +$PHPMAILER_LANG['variable_set'] = '変数が存在しません: '; +$PHPMAILER_LANG['extension_missing'] = '拡張機能が見つかりません: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ka.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ka.php new file mode 100644 index 0000000..51fe403 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ka.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP შეცდომა: ავტორიზაცია შეუძლებელია.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP შეცდომა: SMTP სერვერთან დაკავშირება შეუძლებელია.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP შეცდომა: მონაცემები არ იქნა მიღებული.'; +$PHPMAILER_LANG['encoding'] = 'კოდირების უცნობი ტიპი: '; +$PHPMAILER_LANG['execute'] = 'შეუძლებელია შემდეგი ბრძანების შესრულება: '; +$PHPMAILER_LANG['file_access'] = 'შეუძლებელია წვდომა ფაილთან: '; +$PHPMAILER_LANG['file_open'] = 'ფაილური სისტემის შეცდომა: არ იხსნება ფაილი: '; +$PHPMAILER_LANG['from_failed'] = 'გამგზავნის არასწორი მისამართი: '; +$PHPMAILER_LANG['instantiate'] = 'mail ფუნქციის გაშვება ვერ ხერხდება.'; +$PHPMAILER_LANG['provide_address'] = 'გთხოვთ მიუთითოთ ერთი ადრესატის e-mail მისამართი მაინც.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' - საფოსტო სერვერის მხარდაჭერა არ არის.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP შეცდომა: შემდეგ მისამართებზე გაგზავნა ვერ მოხერხდა: '; +$PHPMAILER_LANG['empty_message'] = 'შეტყობინება ცარიელია'; +$PHPMAILER_LANG['invalid_address'] = 'არ გაიგზავნა, e-mail მისამართის არასწორი ფორმატი: '; +$PHPMAILER_LANG['signing'] = 'ხელმოწერის შეცდომა: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'შეცდომა SMTP სერვერთან დაკავშირებისას'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP სერვერის შეცდომა: '; +$PHPMAILER_LANG['variable_set'] = 'შეუძლებელია შემდეგი ცვლადის შექმნა ან შეცვლა: '; +$PHPMAILER_LANG['extension_missing'] = 'ბიბლიოთეკა არ არსებობს: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ko.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ko.php new file mode 100644 index 0000000..8c97dd9 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ko.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP 오류: 인증할 수 없습니다.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP 오류: SMTP 호스트에 접속할 수 없습니다.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 오류: 데이터가 받아들여지지 않았습니다.'; +$PHPMAILER_LANG['empty_message'] = '메세지 내용이 없습니다'; +$PHPMAILER_LANG['encoding'] = '알 수 없는 인코딩: '; +$PHPMAILER_LANG['execute'] = '실행 불가: '; +$PHPMAILER_LANG['file_access'] = '파일 접근 불가: '; +$PHPMAILER_LANG['file_open'] = '파일 오류: 파일을 열 수 없습니다: '; +$PHPMAILER_LANG['from_failed'] = '다음 From 주소에서 오류가 발생했습니다: '; +$PHPMAILER_LANG['instantiate'] = 'mail 함수를 인스턴스화할 수 없습니다'; +$PHPMAILER_LANG['invalid_address'] = '잘못된 주소: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' 메일러는 지원되지 않습니다.'; +$PHPMAILER_LANG['provide_address'] = '적어도 한 개 이상의 수신자 메일 주소를 제공해야 합니다.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP 오류: 다음 수신자에서 오류가 발생했습니다: '; +$PHPMAILER_LANG['signing'] = '서명 오류: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP 연결을 실패하였습니다.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP 서버 오류: '; +$PHPMAILER_LANG['variable_set'] = '변수 설정 및 초기화 불가: '; +$PHPMAILER_LANG['extension_missing'] = '확장자 없음: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-lt.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-lt.php new file mode 100644 index 0000000..4f115b1 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-lt.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP klaida: autentifikacija nepavyko.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP klaida: nepavyksta prisijungti prie SMTP stoties.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP klaida: duomenys nepriimti.'; +$PHPMAILER_LANG['empty_message'] = 'Laiško turinys tuščias'; +$PHPMAILER_LANG['encoding'] = 'Neatpažinta koduotė: '; +$PHPMAILER_LANG['execute'] = 'Nepavyko įvykdyti komandos: '; +$PHPMAILER_LANG['file_access'] = 'Byla nepasiekiama: '; +$PHPMAILER_LANG['file_open'] = 'Bylos klaida: Nepavyksta atidaryti: '; +$PHPMAILER_LANG['from_failed'] = 'Neteisingas siuntėjo adresas: '; +$PHPMAILER_LANG['instantiate'] = 'Nepavyko paleisti mail funkcijos.'; +$PHPMAILER_LANG['invalid_address'] = 'Neteisingas adresas: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' pašto stotis nepalaikoma.'; +$PHPMAILER_LANG['provide_address'] = 'Nurodykite bent vieną gavėjo adresą.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP klaida: nepavyko išsiųsti šiems gavėjams: '; +$PHPMAILER_LANG['signing'] = 'Prisijungimo klaida: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP susijungimo klaida'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP stoties klaida: '; +$PHPMAILER_LANG['variable_set'] = 'Nepavyko priskirti reikšmės kintamajam: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-lv.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-lv.php new file mode 100644 index 0000000..679b18c --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-lv.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP kļūda: Autorizācija neizdevās.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Kļūda: Nevar izveidot savienojumu ar SMTP serveri.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Kļūda: Nepieņem informāciju.'; +$PHPMAILER_LANG['empty_message'] = 'Ziņojuma teksts ir tukšs'; +$PHPMAILER_LANG['encoding'] = 'Neatpazīts kodējums: '; +$PHPMAILER_LANG['execute'] = 'Neizdevās izpildīt komandu: '; +$PHPMAILER_LANG['file_access'] = 'Fails nav pieejams: '; +$PHPMAILER_LANG['file_open'] = 'Faila kļūda: Nevar atvērt failu: '; +$PHPMAILER_LANG['from_failed'] = 'Nepareiza sūtītāja adrese: '; +$PHPMAILER_LANG['instantiate'] = 'Nevar palaist sūtīšanas funkciju.'; +$PHPMAILER_LANG['invalid_address'] = 'Nepareiza adrese: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' sūtītājs netiek atbalstīts.'; +$PHPMAILER_LANG['provide_address'] = 'Lūdzu, norādiet vismaz vienu adresātu.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP kļūda: neizdevās nosūtīt šādiem saņēmējiem: '; +$PHPMAILER_LANG['signing'] = 'Autorizācijas kļūda: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP savienojuma kļūda'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP servera kļūda: '; +$PHPMAILER_LANG['variable_set'] = 'Nevar piešķirt mainīgā vērtību: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-mg.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-mg.php new file mode 100644 index 0000000..8a94f6a --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-mg.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Hadisoana SMTP: Tsy nahomby ny fanamarinana.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Tsy afaka mampifandray amin\'ny mpampiantrano SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP diso: tsy voarakitra ny angona.'; +$PHPMAILER_LANG['empty_message'] = 'Tsy misy ny votoaty mailaka.'; +$PHPMAILER_LANG['encoding'] = 'Tsy fantatra encoding: '; +$PHPMAILER_LANG['execute'] = 'Tsy afaka manatanteraka ity baiko manaraka ity: '; +$PHPMAILER_LANG['file_access'] = 'Tsy nahomby ny fidirana amin\'ity rakitra ity: '; +$PHPMAILER_LANG['file_open'] = 'Hadisoana diso: Tsy afaka nanokatra ity file manaraka ity: '; +$PHPMAILER_LANG['from_failed'] = 'Ny adiresy iraka manaraka dia diso: '; +$PHPMAILER_LANG['instantiate'] = 'Tsy afaka nanomboka ny hetsika mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Tsy mety ny adiresy: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer tsy manohana.'; +$PHPMAILER_LANG['provide_address'] = 'Alefaso azafady iray adiresy iray farafahakeliny.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Tsy mety ireo mpanaraka ireto: '; +$PHPMAILER_LANG['signing'] = 'Error nandritra ny sonia:'; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Tsy nahomby ny fifandraisana tamin\'ny server SMTP.'; +$PHPMAILER_LANG['smtp_error'] = 'Fahadisoana tamin\'ny server SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Tsy azo atao ny mametraka na mamerina ny variable: '; +$PHPMAILER_LANG['extension_missing'] = 'Tsy hita ny ampahany: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-mn.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-mn.php new file mode 100644 index 0000000..04d262c --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-mn.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Ralat SMTP: Tidak dapat pengesahan.'; +$PHPMAILER_LANG['connect_host'] = 'Ralat SMTP: Tidak dapat menghubungi hos pelayan SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Ralat SMTP: Data tidak diterima oleh pelayan.'; +$PHPMAILER_LANG['empty_message'] = 'Tiada isi untuk mesej'; +$PHPMAILER_LANG['encoding'] = 'Pengekodan tidak diketahui: '; +$PHPMAILER_LANG['execute'] = 'Tidak dapat melaksanakan: '; +$PHPMAILER_LANG['file_access'] = 'Tidak dapat mengakses fail: '; +$PHPMAILER_LANG['file_open'] = 'Ralat Fail: Tidak dapat membuka fail: '; +$PHPMAILER_LANG['from_failed'] = 'Berikut merupakan ralat dari alamat e-mel: '; +$PHPMAILER_LANG['instantiate'] = 'Tidak dapat memberi contoh fungsi e-mel.'; +$PHPMAILER_LANG['invalid_address'] = 'Alamat emel tidak sah: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' jenis penghantar emel tidak disokong.'; +$PHPMAILER_LANG['provide_address'] = 'Anda perlu menyediakan sekurang-kurangnya satu alamat e-mel penerima.'; +$PHPMAILER_LANG['recipients_failed'] = 'Ralat SMTP: Penerima e-mel berikut telah gagal: '; +$PHPMAILER_LANG['signing'] = 'Ralat pada tanda tangan: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() telah gagal.'; +$PHPMAILER_LANG['smtp_error'] = 'Ralat pada pelayan SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Tidak boleh menetapkan atau menetapkan semula pembolehubah: '; +$PHPMAILER_LANG['extension_missing'] = 'Sambungan hilang: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-nb.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-nb.php new file mode 100644 index 0000000..c9621a1 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-nb.php @@ -0,0 +1,33 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP-fout: authenticatie mislukt.'; +$PHPMAILER_LANG['buggy_php'] = 'PHP versie gededecteerd die onderhavig is aan een bug die kan resulteren in gecorrumpeerde berichten. Om dit te voorkomen, gebruik SMTP voor het verzenden van berichten, zet de mail.add_x_header optie in uw php.ini file uit, gebruik MacOS of Linux, of pas de gebruikte PHP versie aan naar versie 7.0.17+ or 7.1.3+.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP-fout: kon niet verbinden met SMTP-host.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP-fout: data niet geaccepteerd.'; +$PHPMAILER_LANG['empty_message'] = 'Berichttekst is leeg'; +$PHPMAILER_LANG['encoding'] = 'Onbekende codering: '; +$PHPMAILER_LANG['execute'] = 'Kon niet uitvoeren: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensie afwezig: '; +$PHPMAILER_LANG['file_access'] = 'Kreeg geen toegang tot bestand: '; +$PHPMAILER_LANG['file_open'] = 'Bestandsfout: kon bestand niet openen: '; +$PHPMAILER_LANG['from_failed'] = 'Het volgende afzendersadres is mislukt: '; +$PHPMAILER_LANG['instantiate'] = 'Kon mailfunctie niet initialiseren.'; +$PHPMAILER_LANG['invalid_address'] = 'Ongeldig adres: '; +$PHPMAILER_LANG['invalid_header'] = 'Ongeldige header naam of waarde'; +$PHPMAILER_LANG['invalid_hostentry'] = 'Ongeldige hostentry: '; +$PHPMAILER_LANG['invalid_host'] = 'Ongeldige host: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wordt niet ondersteund.'; +$PHPMAILER_LANG['provide_address'] = 'Er moet minstens één ontvanger worden opgegeven.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP-fout: de volgende ontvangers zijn mislukt: '; +$PHPMAILER_LANG['signing'] = 'Signeerfout: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP code: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Aanvullende SMTP informatie: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Verbinding mislukt.'; +$PHPMAILER_LANG['smtp_detail'] = 'Detail: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP-serverfout: '; +$PHPMAILER_LANG['variable_set'] = 'Kan de volgende variabele niet instellen of resetten: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-pl.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-pl.php new file mode 100644 index 0000000..cb7b2c2 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-pl.php @@ -0,0 +1,33 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Erro do SMTP: Não foi possível realizar a autenticação.'; +$PHPMAILER_LANG['connect_host'] = 'Erro do SMTP: Não foi possível realizar ligação com o servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Erro do SMTP: Os dados foram rejeitados.'; +$PHPMAILER_LANG['empty_message'] = 'A mensagem no e-mail está vazia.'; +$PHPMAILER_LANG['encoding'] = 'Codificação desconhecida: '; +$PHPMAILER_LANG['execute'] = 'Não foi possível executar: '; +$PHPMAILER_LANG['file_access'] = 'Não foi possível aceder o ficheiro: '; +$PHPMAILER_LANG['file_open'] = 'Abertura do ficheiro: Não foi possível abrir o ficheiro: '; +$PHPMAILER_LANG['from_failed'] = 'Ocorreram falhas nos endereços dos seguintes remententes: '; +$PHPMAILER_LANG['instantiate'] = 'Não foi possível iniciar uma instância da função mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Não foi enviado nenhum e-mail para o endereço de e-mail inválido: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.'; +$PHPMAILER_LANG['provide_address'] = 'Tem de fornecer pelo menos um endereço como destinatário do e-mail.'; +$PHPMAILER_LANG['recipients_failed'] = 'Erro do SMTP: O endereço do seguinte destinatário falhou: '; +$PHPMAILER_LANG['signing'] = 'Erro ao assinar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falhou.'; +$PHPMAILER_LANG['smtp_error'] = 'Erro de servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Não foi possível definir ou redefinir a variável: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensão em falta: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php new file mode 100644 index 0000000..5239865 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php @@ -0,0 +1,38 @@ + + * @author Lucas Guimarães + * @author Phelipe Alves + * @author Fabio Beneditto + * @author Geidson Benício Coelho + */ + +$PHPMAILER_LANG['authenticate'] = 'Erro de SMTP: Não foi possível autenticar.'; +$PHPMAILER_LANG['buggy_php'] = 'Sua versão do PHP é afetada por um bug que por resultar em messagens corrompidas. Para corrigir, mude para enviar usando SMTP, desative a opção mail.add_x_header em seu php.ini, mude para MacOS ou Linux, ou atualize seu PHP para versão 7.0.17+ ou 7.1.3+ '; +$PHPMAILER_LANG['connect_host'] = 'Erro de SMTP: Não foi possível conectar ao servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Erro de SMTP: Dados rejeitados.'; +$PHPMAILER_LANG['empty_message'] = 'Mensagem vazia'; +$PHPMAILER_LANG['encoding'] = 'Codificação desconhecida: '; +$PHPMAILER_LANG['execute'] = 'Não foi possível executar: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensão não existe: '; +$PHPMAILER_LANG['file_access'] = 'Não foi possível acessar o arquivo: '; +$PHPMAILER_LANG['file_open'] = 'Erro de Arquivo: Não foi possível abrir o arquivo: '; +$PHPMAILER_LANG['from_failed'] = 'Os seguintes remetentes falharam: '; +$PHPMAILER_LANG['instantiate'] = 'Não foi possível instanciar a função mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Endereço de e-mail inválido: '; +$PHPMAILER_LANG['invalid_header'] = 'Nome ou valor de cabeçalho inválido'; +$PHPMAILER_LANG['invalid_hostentry'] = 'hostentry inválido: '; +$PHPMAILER_LANG['invalid_host'] = 'host inválido: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.'; +$PHPMAILER_LANG['provide_address'] = 'Você deve informar pelo menos um destinatário.'; +$PHPMAILER_LANG['recipients_failed'] = 'Erro de SMTP: Os seguintes destinatários falharam: '; +$PHPMAILER_LANG['signing'] = 'Erro de Assinatura: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falhou.'; +$PHPMAILER_LANG['smtp_code'] = 'Código do servidor SMTP: '; +$PHPMAILER_LANG['smtp_error'] = 'Erro de servidor SMTP: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Informações adicionais do servidor SMTP: '; +$PHPMAILER_LANG['smtp_detail'] = 'Detalhes do servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Não foi possível definir ou redefinir a variável: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php new file mode 100644 index 0000000..45bef91 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php @@ -0,0 +1,33 @@ + + * @author Foster Snowhill + */ + +$PHPMAILER_LANG['authenticate'] = 'Ошибка SMTP: ошибка авторизации.'; +$PHPMAILER_LANG['connect_host'] = 'Ошибка SMTP: не удается подключиться к SMTP-серверу.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Ошибка SMTP: данные не приняты.'; +$PHPMAILER_LANG['encoding'] = 'Неизвестная кодировка: '; +$PHPMAILER_LANG['execute'] = 'Невозможно выполнить команду: '; +$PHPMAILER_LANG['file_access'] = 'Нет доступа к файлу: '; +$PHPMAILER_LANG['file_open'] = 'Файловая ошибка: не удаётся открыть файл: '; +$PHPMAILER_LANG['from_failed'] = 'Неверный адрес отправителя: '; +$PHPMAILER_LANG['instantiate'] = 'Невозможно запустить функцию mail().'; +$PHPMAILER_LANG['provide_address'] = 'Пожалуйста, введите хотя бы один email-адрес получателя.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' — почтовый сервер не поддерживается.'; +$PHPMAILER_LANG['recipients_failed'] = 'Ошибка SMTP: не удалась отправка таким адресатам: '; +$PHPMAILER_LANG['empty_message'] = 'Пустое сообщение'; +$PHPMAILER_LANG['invalid_address'] = 'Не отправлено из-за неправильного формата email-адреса: '; +$PHPMAILER_LANG['signing'] = 'Ошибка подписи: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ошибка соединения с SMTP-сервером'; +$PHPMAILER_LANG['smtp_error'] = 'Ошибка SMTP-сервера: '; +$PHPMAILER_LANG['variable_set'] = 'Невозможно установить или сбросить переменную: '; +$PHPMAILER_LANG['extension_missing'] = 'Расширение отсутствует: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-si.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-si.php new file mode 100644 index 0000000..dce502a --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-si.php @@ -0,0 +1,34 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP දෝෂය: සත්‍යාපනය අසාර්ථක විය.'; +$PHPMAILER_LANG['buggy_php'] = 'ඔබගේ PHP version එකෙහි පවතින දෝෂයක් නිසා email පණිවිඩ දෝෂ සහගත වීමේ හැකියාවක් ඇත. මෙය විසදීම සදහා SMTP භාවිතා කිරීම, mail.add_x_header INI setting එක අක්‍රීය කිරීම, MacOS හෝ Linux වලට මාරු වීම, හෝ ඔබගේ PHP version එක 7.0.17+ හෝ 7.1.3+ වලට අලුත් කිරීම කරගන්න.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP දෝෂය: සම්බන්ධ වීමට නොහැකි විය.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP දෝෂය: දත්ත පිළිගනු නොලැබේ.'; +$PHPMAILER_LANG['empty_message'] = 'පණිවිඩ අන්තර්ගතය හිස්'; +$PHPMAILER_LANG['encoding'] = 'නොදන්නා කේතනය: '; +$PHPMAILER_LANG['execute'] = 'ක්‍රියාත්මක කළ නොහැකි විය: '; +$PHPMAILER_LANG['extension_missing'] = 'Extension එක නොමැත: '; +$PHPMAILER_LANG['file_access'] = 'File එකට ප්‍රවේශ විය නොහැකි විය: '; +$PHPMAILER_LANG['file_open'] = 'File දෝෂය: File එක විවෘත කළ නොහැක: '; +$PHPMAILER_LANG['from_failed'] = 'පහත From ලිපිනයන් අසාර්ථක විය: '; +$PHPMAILER_LANG['instantiate'] = 'mail function එක ක්‍රියාත්මක කළ නොහැක.'; +$PHPMAILER_LANG['invalid_address'] = 'වලංගු නොවන ලිපිනය: '; +$PHPMAILER_LANG['invalid_header'] = 'වලංගු නොවන header නාමයක් හෝ අගයක්'; +$PHPMAILER_LANG['invalid_hostentry'] = 'වලංගු නොවන hostentry එකක්: '; +$PHPMAILER_LANG['invalid_host'] = 'වලංගු නොවන host එකක්: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer සහාය නොදක්වයි.'; +$PHPMAILER_LANG['provide_address'] = 'ඔබ අවම වශයෙන් එක් ලබන්නෙකුගේ ඊමේල් ලිපිනයක් සැපයිය යුතුය.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP දෝෂය: පහත ලබන්නන් අසමත් විය: '; +$PHPMAILER_LANG['signing'] = 'Sign කිරීමේ දෝෂය: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP කේතය: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'අමතර SMTP තොරතුරු: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP සම්බන්ධය අසාර්ථක විය.'; +$PHPMAILER_LANG['smtp_detail'] = 'තොරතුරු: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP දෝෂය: '; +$PHPMAILER_LANG['variable_set'] = 'Variable එක සැකසීමට හෝ නැවත සැකසීමට නොහැක: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php new file mode 100644 index 0000000..028f5bc --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php @@ -0,0 +1,30 @@ + + * @author Peter Orlický + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Chyba autentifikácie.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Nebolo možné nadviazať spojenie so SMTP serverom.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Dáta neboli prijaté'; +$PHPMAILER_LANG['empty_message'] = 'Prázdne telo správy.'; +$PHPMAILER_LANG['encoding'] = 'Neznáme kódovanie: '; +$PHPMAILER_LANG['execute'] = 'Nedá sa vykonať: '; +$PHPMAILER_LANG['file_access'] = 'Súbor nebol nájdený: '; +$PHPMAILER_LANG['file_open'] = 'File Error: Súbor sa otvoriť pre čítanie: '; +$PHPMAILER_LANG['from_failed'] = 'Následujúca adresa From je nesprávna: '; +$PHPMAILER_LANG['instantiate'] = 'Nedá sa vytvoriť inštancia emailovej funkcie.'; +$PHPMAILER_LANG['invalid_address'] = 'Neodoslané, emailová adresa je nesprávna: '; +$PHPMAILER_LANG['invalid_hostentry'] = 'Záznam hostiteľa je nesprávny: '; +$PHPMAILER_LANG['invalid_host'] = 'Hostiteľ je nesprávny: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' emailový klient nieje podporovaný.'; +$PHPMAILER_LANG['provide_address'] = 'Musíte zadať aspoň jednu emailovú adresu príjemcu.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Adresy príjemcov niesu správne '; +$PHPMAILER_LANG['signing'] = 'Chyba prihlasovania: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() zlyhalo.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP chyba serveru: '; +$PHPMAILER_LANG['variable_set'] = 'Nemožno nastaviť alebo resetovať premennú: '; +$PHPMAILER_LANG['extension_missing'] = 'Chýba rozšírenie: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php new file mode 100644 index 0000000..3e00c25 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php @@ -0,0 +1,36 @@ + + * @author Filip Š + * @author Blaž Oražem + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP napaka: Avtentikacija ni uspela.'; +$PHPMAILER_LANG['buggy_php'] = 'Na vašo PHP različico vpliva napaka, ki lahko povzroči poškodovana sporočila. Če želite težavo odpraviti, preklopite na pošiljanje prek SMTP, onemogočite možnost mail.add_x_header v vaši php.ini datoteki, preklopite na MacOS ali Linux, ali nadgradite vašo PHP zaličico na 7.0.17+ ali 7.1.3+.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP napaka: Vzpostavljanje povezave s SMTP gostiteljem ni uspelo.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP napaka: Strežnik zavrača podatke.'; +$PHPMAILER_LANG['empty_message'] = 'E-poštno sporočilo nima vsebine.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznan tip kodiranja: '; +$PHPMAILER_LANG['execute'] = 'Operacija ni uspela: '; +$PHPMAILER_LANG['extension_missing'] = 'Manjkajoča razširitev: '; +$PHPMAILER_LANG['file_access'] = 'Nimam dostopa do datoteke: '; +$PHPMAILER_LANG['file_open'] = 'Ne morem odpreti datoteke: '; +$PHPMAILER_LANG['from_failed'] = 'Neveljaven e-naslov pošiljatelja: '; +$PHPMAILER_LANG['instantiate'] = 'Ne morem inicializirati mail funkcije.'; +$PHPMAILER_LANG['invalid_address'] = 'E-poštno sporočilo ni bilo poslano. E-naslov je neveljaven: '; +$PHPMAILER_LANG['invalid_header'] = 'Neveljavno ime ali vrednost glave'; +$PHPMAILER_LANG['invalid_hostentry'] = 'Neveljaven vnos gostitelja: '; +$PHPMAILER_LANG['invalid_host'] = 'Neveljaven gostitelj: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer ni podprt.'; +$PHPMAILER_LANG['provide_address'] = 'Prosimo, vnesite vsaj enega naslovnika.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP napaka: Sledeči naslovniki so neveljavni: '; +$PHPMAILER_LANG['signing'] = 'Napaka pri podpisovanju: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP koda: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Dodatne informacije o SMTP: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ne morem vzpostaviti povezave s SMTP strežnikom.'; +$PHPMAILER_LANG['smtp_detail'] = 'Podrobnosti: '; +$PHPMAILER_LANG['smtp_error'] = 'Napaka SMTP strežnika: '; +$PHPMAILER_LANG['variable_set'] = 'Ne morem nastaviti oz. ponastaviti spremenljivke: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr.php new file mode 100644 index 0000000..0b5280f --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr.php @@ -0,0 +1,28 @@ + + * @author Miloš Milanović + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP грешка: аутентификација није успела.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP грешка: повезивање са SMTP сервером није успело.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP грешка: подаци нису прихваћени.'; +$PHPMAILER_LANG['empty_message'] = 'Садржај поруке је празан.'; +$PHPMAILER_LANG['encoding'] = 'Непознато кодирање: '; +$PHPMAILER_LANG['execute'] = 'Није могуће извршити наредбу: '; +$PHPMAILER_LANG['file_access'] = 'Није могуће приступити датотеци: '; +$PHPMAILER_LANG['file_open'] = 'Није могуће отворити датотеку: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP грешка: слање са следећих адреса није успело: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP грешка: слање на следеће адресе није успело: '; +$PHPMAILER_LANG['instantiate'] = 'Није могуће покренути mail функцију.'; +$PHPMAILER_LANG['invalid_address'] = 'Порука није послата. Неисправна адреса: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' мејлер није подржан.'; +$PHPMAILER_LANG['provide_address'] = 'Дефинишите бар једну адресу примаоца.'; +$PHPMAILER_LANG['signing'] = 'Грешка приликом пријаве: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Повезивање са SMTP сервером није успело.'; +$PHPMAILER_LANG['smtp_error'] = 'Грешка SMTP сервера: '; +$PHPMAILER_LANG['variable_set'] = 'Није могуће задати нити ресетовати променљиву: '; +$PHPMAILER_LANG['extension_missing'] = 'Недостаје проширење: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr_latn.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr_latn.php new file mode 100644 index 0000000..6213832 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr_latn.php @@ -0,0 +1,28 @@ + + * @author Miloš Milanović + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP greška: autentifikacija nije uspela.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP greška: povezivanje sa SMTP serverom nije uspelo.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP greška: podaci nisu prihvaćeni.'; +$PHPMAILER_LANG['empty_message'] = 'Sadržaj poruke je prazan.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznato kodiranje: '; +$PHPMAILER_LANG['execute'] = 'Nije moguće izvršiti naredbu: '; +$PHPMAILER_LANG['file_access'] = 'Nije moguće pristupiti datoteci: '; +$PHPMAILER_LANG['file_open'] = 'Nije moguće otvoriti datoteku: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP greška: slanje sa sledećih adresa nije uspelo: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP greška: slanje na sledeće adrese nije uspelo: '; +$PHPMAILER_LANG['instantiate'] = 'Nije moguće pokrenuti mail funkciju.'; +$PHPMAILER_LANG['invalid_address'] = 'Poruka nije poslata. Neispravna adresa: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' majler nije podržan.'; +$PHPMAILER_LANG['provide_address'] = 'Definišite bar jednu adresu primaoca.'; +$PHPMAILER_LANG['signing'] = 'Greška prilikom prijave: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Povezivanje sa SMTP serverom nije uspelo.'; +$PHPMAILER_LANG['smtp_error'] = 'Greška SMTP servera: '; +$PHPMAILER_LANG['variable_set'] = 'Nije moguće zadati niti resetovati promenljivu: '; +$PHPMAILER_LANG['extension_missing'] = 'Nedostaje proširenje: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sv.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sv.php new file mode 100644 index 0000000..9872c19 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-sv.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP fel: Kunde inte autentisera.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP fel: Kunde inte ansluta till SMTP-server.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fel: Data accepterades inte.'; +//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; +$PHPMAILER_LANG['encoding'] = 'Okänt encode-format: '; +$PHPMAILER_LANG['execute'] = 'Kunde inte köra: '; +$PHPMAILER_LANG['file_access'] = 'Ingen åtkomst till fil: '; +$PHPMAILER_LANG['file_open'] = 'Fil fel: Kunde inte öppna fil: '; +$PHPMAILER_LANG['from_failed'] = 'Följande avsändaradress är felaktig: '; +$PHPMAILER_LANG['instantiate'] = 'Kunde inte initiera e-postfunktion.'; +$PHPMAILER_LANG['invalid_address'] = 'Felaktig adress: '; +$PHPMAILER_LANG['provide_address'] = 'Du måste ange minst en mottagares e-postadress.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer stöds inte.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP fel: Följande mottagare är felaktig: '; +$PHPMAILER_LANG['signing'] = 'Signeringsfel: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() misslyckades.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP serverfel: '; +$PHPMAILER_LANG['variable_set'] = 'Kunde inte definiera eller återställa variabel: '; +$PHPMAILER_LANG['extension_missing'] = 'Tillägg ej tillgängligt: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-tl.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-tl.php new file mode 100644 index 0000000..d15bed1 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-tl.php @@ -0,0 +1,28 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Hindi mapatotohanan.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Hindi makakonekta sa SMTP host.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Ang datos ay hindi naitanggap.'; +$PHPMAILER_LANG['empty_message'] = 'Walang laman ang mensahe'; +$PHPMAILER_LANG['encoding'] = 'Hindi alam ang encoding: '; +$PHPMAILER_LANG['execute'] = 'Hindi maisasagawa: '; +$PHPMAILER_LANG['file_access'] = 'Hindi ma-access ang file: '; +$PHPMAILER_LANG['file_open'] = 'File Error: Hindi mabuksan ang file: '; +$PHPMAILER_LANG['from_failed'] = 'Ang sumusunod na address ay nabigo: '; +$PHPMAILER_LANG['instantiate'] = 'Hindi maisimulan ang instance ng mail function.'; +$PHPMAILER_LANG['invalid_address'] = 'Hindi wasto ang address na naibigay: '; +$PHPMAILER_LANG['mailer_not_supported'] = 'Ang mailer ay hindi suportado.'; +$PHPMAILER_LANG['provide_address'] = 'Kailangan mong magbigay ng kahit isang email address na tatanggap.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Ang mga sumusunod na tatanggap ay nabigo: '; +$PHPMAILER_LANG['signing'] = 'Hindi ma-sign: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ang SMTP connect() ay nabigo.'; +$PHPMAILER_LANG['smtp_error'] = 'Ang server ng SMTP ay nabigo: '; +$PHPMAILER_LANG['variable_set'] = 'Hindi matatakda o ma-reset ang mga variables: '; +$PHPMAILER_LANG['extension_missing'] = 'Nawawala ang extension: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-tr.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-tr.php new file mode 100644 index 0000000..f938f80 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-tr.php @@ -0,0 +1,31 @@ + + * @fixed by Boris Yurchenko + */ + +$PHPMAILER_LANG['authenticate'] = 'Помилка SMTP: помилка авторизації.'; +$PHPMAILER_LANG['connect_host'] = 'Помилка SMTP: не вдається під\'єднатися до SMTP-серверу.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Помилка SMTP: дані не прийнято.'; +$PHPMAILER_LANG['encoding'] = 'Невідоме кодування: '; +$PHPMAILER_LANG['execute'] = 'Неможливо виконати команду: '; +$PHPMAILER_LANG['file_access'] = 'Немає доступу до файлу: '; +$PHPMAILER_LANG['file_open'] = 'Помилка файлової системи: не вдається відкрити файл: '; +$PHPMAILER_LANG['from_failed'] = 'Невірна адреса відправника: '; +$PHPMAILER_LANG['instantiate'] = 'Неможливо запустити функцію mail().'; +$PHPMAILER_LANG['provide_address'] = 'Будь ласка, введіть хоча б одну email-адресу отримувача.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' - поштовий сервер не підтримується.'; +$PHPMAILER_LANG['recipients_failed'] = 'Помилка SMTP: не вдалося відправлення для таких отримувачів: '; +$PHPMAILER_LANG['empty_message'] = 'Пусте повідомлення'; +$PHPMAILER_LANG['invalid_address'] = 'Не відправлено через неправильний формат email-адреси: '; +$PHPMAILER_LANG['signing'] = 'Помилка підпису: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Помилка з\'єднання з SMTP-сервером'; +$PHPMAILER_LANG['smtp_error'] = 'Помилка SMTP-сервера: '; +$PHPMAILER_LANG['variable_set'] = 'Неможливо встановити або скинути змінну: '; +$PHPMAILER_LANG['extension_missing'] = 'Розширення відсутнє: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-vi.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-vi.php new file mode 100644 index 0000000..d65576e --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-vi.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Lỗi SMTP: Không thể xác thực.'; +$PHPMAILER_LANG['connect_host'] = 'Lỗi SMTP: Không thể kết nối máy chủ SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Lỗi SMTP: Dữ liệu không được chấp nhận.'; +$PHPMAILER_LANG['empty_message'] = 'Không có nội dung'; +$PHPMAILER_LANG['encoding'] = 'Mã hóa không xác định: '; +$PHPMAILER_LANG['execute'] = 'Không thực hiện được: '; +$PHPMAILER_LANG['file_access'] = 'Không thể truy cập tệp tin '; +$PHPMAILER_LANG['file_open'] = 'Lỗi Tập tin: Không thể mở tệp tin: '; +$PHPMAILER_LANG['from_failed'] = 'Lỗi địa chỉ gửi đi: '; +$PHPMAILER_LANG['instantiate'] = 'Không dùng được các hàm gửi thư.'; +$PHPMAILER_LANG['invalid_address'] = 'Đại chỉ emai không đúng: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' trình gửi thư không được hỗ trợ.'; +$PHPMAILER_LANG['provide_address'] = 'Bạn phải cung cấp ít nhất một địa chỉ người nhận.'; +$PHPMAILER_LANG['recipients_failed'] = 'Lỗi SMTP: lỗi địa chỉ người nhận: '; +$PHPMAILER_LANG['signing'] = 'Lỗi đăng nhập: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Lỗi kết nối với SMTP'; +$PHPMAILER_LANG['smtp_error'] = 'Lỗi máy chủ smtp '; +$PHPMAILER_LANG['variable_set'] = 'Không thể thiết lập hoặc thiết lập lại biến: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh.php new file mode 100644 index 0000000..35e4e70 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh.php @@ -0,0 +1,29 @@ + + * @author Peter Dave Hello <@PeterDaveHello/> + * @author Jason Chiang + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP 錯誤:登入失敗。'; +$PHPMAILER_LANG['connect_host'] = 'SMTP 錯誤:無法連線到 SMTP 主機。'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 錯誤:無法接受的資料。'; +$PHPMAILER_LANG['empty_message'] = '郵件內容為空'; +$PHPMAILER_LANG['encoding'] = '未知編碼: '; +$PHPMAILER_LANG['execute'] = '無法執行:'; +$PHPMAILER_LANG['file_access'] = '無法存取檔案:'; +$PHPMAILER_LANG['file_open'] = '檔案錯誤:無法開啟檔案:'; +$PHPMAILER_LANG['from_failed'] = '發送地址錯誤:'; +$PHPMAILER_LANG['instantiate'] = '未知函數呼叫。'; +$PHPMAILER_LANG['invalid_address'] = '因為電子郵件地址無效,無法傳送: '; +$PHPMAILER_LANG['mailer_not_supported'] = '不支援的發信客戶端。'; +$PHPMAILER_LANG['provide_address'] = '必須提供至少一個收件人地址。'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP 錯誤:以下收件人地址錯誤:'; +$PHPMAILER_LANG['signing'] = '電子簽章錯誤: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP 連線失敗'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP 伺服器錯誤: '; +$PHPMAILER_LANG['variable_set'] = '無法設定或重設變數: '; +$PHPMAILER_LANG['extension_missing'] = '遺失模組 Extension: '; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh_cn.php b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh_cn.php new file mode 100644 index 0000000..03d4911 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh_cn.php @@ -0,0 +1,36 @@ + + * @author young + * @author Teddysun + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP 错误:登录失败。'; +$PHPMAILER_LANG['buggy_php'] = '您的 PHP 版本存在漏洞,可能会导致消息损坏。为修复此问题,请切换到使用 SMTP 发送,在您的 php.ini 中禁用 mail.add_x_header 选项。切换到 MacOS 或 Linux,或将您的 PHP 升级到 7.0.17+ 或 7.1.3+ 版本。'; +$PHPMAILER_LANG['connect_host'] = 'SMTP 错误:无法连接到 SMTP 主机。'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 错误:数据不被接受。'; +$PHPMAILER_LANG['empty_message'] = '邮件正文为空。'; +$PHPMAILER_LANG['encoding'] = '未知编码:'; +$PHPMAILER_LANG['execute'] = '无法执行:'; +$PHPMAILER_LANG['extension_missing'] = '缺少扩展名:'; +$PHPMAILER_LANG['file_access'] = '无法访问文件:'; +$PHPMAILER_LANG['file_open'] = '文件错误:无法打开文件:'; +$PHPMAILER_LANG['from_failed'] = '发送地址错误:'; +$PHPMAILER_LANG['instantiate'] = '未知函数调用。'; +$PHPMAILER_LANG['invalid_address'] = '发送失败,电子邮箱地址是无效的:'; +$PHPMAILER_LANG['mailer_not_supported'] = '发信客户端不被支持。'; +$PHPMAILER_LANG['provide_address'] = '必须提供至少一个收件人地址。'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP 错误:收件人地址错误:'; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP服务器连接失败。'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP服务器出错:'; +$PHPMAILER_LANG['variable_set'] = '无法设置或重置变量:'; +$PHPMAILER_LANG['invalid_header'] = '无效的标题名称或值'; +$PHPMAILER_LANG['invalid_hostentry'] = '无效的hostentry: '; +$PHPMAILER_LANG['invalid_host'] = '无效的主机:'; +$PHPMAILER_LANG['signing'] = '签名错误:'; +$PHPMAILER_LANG['smtp_code'] = 'SMTP代码: '; +$PHPMAILER_LANG['smtp_code_ex'] = '附加SMTP信息: '; +$PHPMAILER_LANG['smtp_detail'] = '详情:'; diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/src/DSNConfigurator.php b/TugasAkhir/vendor/phpmailer/phpmailer/src/DSNConfigurator.php new file mode 100644 index 0000000..566c961 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/src/DSNConfigurator.php @@ -0,0 +1,245 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2023 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * Configure PHPMailer with DSN string. + * + * @see https://en.wikipedia.org/wiki/Data_source_name + * + * @author Oleg Voronkovich + */ +class DSNConfigurator +{ + /** + * Create new PHPMailer instance configured by DSN. + * + * @param string $dsn DSN + * @param bool $exceptions Should we throw external exceptions? + * + * @return PHPMailer + */ + public static function mailer($dsn, $exceptions = null) + { + static $configurator = null; + + if (null === $configurator) { + $configurator = new DSNConfigurator(); + } + + return $configurator->configure(new PHPMailer($exceptions), $dsn); + } + + /** + * Configure PHPMailer instance with DSN string. + * + * @param PHPMailer $mailer PHPMailer instance + * @param string $dsn DSN + * + * @return PHPMailer + */ + public function configure(PHPMailer $mailer, $dsn) + { + $config = $this->parseDSN($dsn); + + $this->applyConfig($mailer, $config); + + return $mailer; + } + + /** + * Parse DSN string. + * + * @param string $dsn DSN + * + * @throws Exception If DSN is malformed + * + * @return array Configuration + */ + private function parseDSN($dsn) + { + $config = $this->parseUrl($dsn); + + if (false === $config || !isset($config['scheme']) || !isset($config['host'])) { + throw new Exception('Malformed DSN'); + } + + if (isset($config['query'])) { + parse_str($config['query'], $config['query']); + } + + return $config; + } + + /** + * Apply configuration to mailer. + * + * @param PHPMailer $mailer PHPMailer instance + * @param array $config Configuration + * + * @throws Exception If scheme is invalid + */ + private function applyConfig(PHPMailer $mailer, $config) + { + switch ($config['scheme']) { + case 'mail': + $mailer->isMail(); + break; + case 'sendmail': + $mailer->isSendmail(); + break; + case 'qmail': + $mailer->isQmail(); + break; + case 'smtp': + case 'smtps': + $mailer->isSMTP(); + $this->configureSMTP($mailer, $config); + break; + default: + throw new Exception( + sprintf( + 'Invalid scheme: "%s". Allowed values: "mail", "sendmail", "qmail", "smtp", "smtps".', + $config['scheme'] + ) + ); + } + + if (isset($config['query'])) { + $this->configureOptions($mailer, $config['query']); + } + } + + /** + * Configure SMTP. + * + * @param PHPMailer $mailer PHPMailer instance + * @param array $config Configuration + */ + private function configureSMTP($mailer, $config) + { + $isSMTPS = 'smtps' === $config['scheme']; + + if ($isSMTPS) { + $mailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + } + + $mailer->Host = $config['host']; + + if (isset($config['port'])) { + $mailer->Port = $config['port']; + } elseif ($isSMTPS) { + $mailer->Port = SMTP::DEFAULT_SECURE_PORT; + } + + $mailer->SMTPAuth = isset($config['user']) || isset($config['pass']); + + if (isset($config['user'])) { + $mailer->Username = $config['user']; + } + + if (isset($config['pass'])) { + $mailer->Password = $config['pass']; + } + } + + /** + * Configure options. + * + * @param PHPMailer $mailer PHPMailer instance + * @param array $options Options + * + * @throws Exception If option is unknown + */ + private function configureOptions(PHPMailer $mailer, $options) + { + $allowedOptions = get_object_vars($mailer); + + unset($allowedOptions['Mailer']); + unset($allowedOptions['SMTPAuth']); + unset($allowedOptions['Username']); + unset($allowedOptions['Password']); + unset($allowedOptions['Hostname']); + unset($allowedOptions['Port']); + unset($allowedOptions['ErrorInfo']); + + $allowedOptions = \array_keys($allowedOptions); + + foreach ($options as $key => $value) { + if (!in_array($key, $allowedOptions)) { + throw new Exception( + sprintf( + 'Unknown option: "%s". Allowed values: "%s"', + $key, + implode('", "', $allowedOptions) + ) + ); + } + + switch ($key) { + case 'AllowEmpty': + case 'SMTPAutoTLS': + case 'SMTPKeepAlive': + case 'SingleTo': + case 'UseSendmailOptions': + case 'do_verp': + case 'DKIM_copyHeaderFields': + $mailer->$key = (bool) $value; + break; + case 'Priority': + case 'SMTPDebug': + case 'WordWrap': + $mailer->$key = (int) $value; + break; + default: + $mailer->$key = $value; + break; + } + } + } + + /** + * Parse a URL. + * Wrapper for the built-in parse_url function to work around a bug in PHP 5.5. + * + * @param string $url URL + * + * @return array|false + */ + protected function parseUrl($url) + { + if (\PHP_VERSION_ID >= 50600 || false === strpos($url, '?')) { + return parse_url($url); + } + + $chunks = explode('?', $url); + if (is_array($chunks)) { + $result = parse_url($chunks[0]); + if (is_array($result)) { + $result['query'] = $chunks[1]; + } + return $result; + } + + return false; + } +} diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/src/Exception.php b/TugasAkhir/vendor/phpmailer/phpmailer/src/Exception.php new file mode 100644 index 0000000..52eaf95 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/src/Exception.php @@ -0,0 +1,40 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * PHPMailer exception handler. + * + * @author Marcus Bointon + */ +class Exception extends \Exception +{ + /** + * Prettify error message output. + * + * @return string + */ + public function errorMessage() + { + return '' . htmlspecialchars($this->getMessage(), ENT_COMPAT | ENT_HTML401) . "
\n"; + } +} diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/src/OAuth.php b/TugasAkhir/vendor/phpmailer/phpmailer/src/OAuth.php new file mode 100644 index 0000000..c1d5b77 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/src/OAuth.php @@ -0,0 +1,139 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +use League\OAuth2\Client\Grant\RefreshToken; +use League\OAuth2\Client\Provider\AbstractProvider; +use League\OAuth2\Client\Token\AccessToken; + +/** + * OAuth - OAuth2 authentication wrapper class. + * Uses the oauth2-client package from the League of Extraordinary Packages. + * + * @see http://oauth2-client.thephpleague.com + * + * @author Marcus Bointon (Synchro/coolbru) + */ +class OAuth implements OAuthTokenProvider +{ + /** + * An instance of the League OAuth Client Provider. + * + * @var AbstractProvider + */ + protected $provider; + + /** + * The current OAuth access token. + * + * @var AccessToken + */ + protected $oauthToken; + + /** + * The user's email address, usually used as the login ID + * and also the from address when sending email. + * + * @var string + */ + protected $oauthUserEmail = ''; + + /** + * The client secret, generated in the app definition of the service you're connecting to. + * + * @var string + */ + protected $oauthClientSecret = ''; + + /** + * The client ID, generated in the app definition of the service you're connecting to. + * + * @var string + */ + protected $oauthClientId = ''; + + /** + * The refresh token, used to obtain new AccessTokens. + * + * @var string + */ + protected $oauthRefreshToken = ''; + + /** + * OAuth constructor. + * + * @param array $options Associative array containing + * `provider`, `userName`, `clientSecret`, `clientId` and `refreshToken` elements + */ + public function __construct($options) + { + $this->provider = $options['provider']; + $this->oauthUserEmail = $options['userName']; + $this->oauthClientSecret = $options['clientSecret']; + $this->oauthClientId = $options['clientId']; + $this->oauthRefreshToken = $options['refreshToken']; + } + + /** + * Get a new RefreshToken. + * + * @return RefreshToken + */ + protected function getGrant() + { + return new RefreshToken(); + } + + /** + * Get a new AccessToken. + * + * @return AccessToken + */ + protected function getToken() + { + return $this->provider->getAccessToken( + $this->getGrant(), + ['refresh_token' => $this->oauthRefreshToken] + ); + } + + /** + * Generate a base64-encoded OAuth token. + * + * @return string + */ + public function getOauth64() + { + //Get a new token if it's not available or has expired + if (null === $this->oauthToken || $this->oauthToken->hasExpired()) { + $this->oauthToken = $this->getToken(); + } + + return base64_encode( + 'user=' . + $this->oauthUserEmail . + "\001auth=Bearer " . + $this->oauthToken . + "\001\001" + ); + } +} diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/src/OAuthTokenProvider.php b/TugasAkhir/vendor/phpmailer/phpmailer/src/OAuthTokenProvider.php new file mode 100644 index 0000000..1155507 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/src/OAuthTokenProvider.php @@ -0,0 +1,44 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * OAuthTokenProvider - OAuth2 token provider interface. + * Provides base64 encoded OAuth2 auth strings for SMTP authentication. + * + * @see OAuth + * @see SMTP::authenticate() + * + * @author Peter Scopes (pdscopes) + * @author Marcus Bointon (Synchro/coolbru) + */ +interface OAuthTokenProvider +{ + /** + * Generate a base64-encoded OAuth token ensuring that the access token has not expired. + * The string to be base 64 encoded should be in the form: + * "user=\001auth=Bearer \001\001" + * + * @return string + */ + public function getOauth64(); +} diff --git a/TugasAkhir/vendor/phpmailer/phpmailer/src/PHPMailer.php b/TugasAkhir/vendor/phpmailer/phpmailer/src/PHPMailer.php new file mode 100644 index 0000000..ba4bcd4 --- /dev/null +++ b/TugasAkhir/vendor/phpmailer/phpmailer/src/PHPMailer.php @@ -0,0 +1,5252 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * PHPMailer - PHP email creation and transport class. + * + * @author Marcus Bointon (Synchro/coolbru) + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + */ +class PHPMailer +{ + const CHARSET_ASCII = 'us-ascii'; + const CHARSET_ISO88591 = 'iso-8859-1'; + const CHARSET_UTF8 = 'utf-8'; + + const CONTENT_TYPE_PLAINTEXT = 'text/plain'; + const CONTENT_TYPE_TEXT_CALENDAR = 'text/calendar'; + const CONTENT_TYPE_TEXT_HTML = 'text/html'; + const CONTENT_TYPE_MULTIPART_ALTERNATIVE = 'multipart/alternative'; + const CONTENT_TYPE_MULTIPART_MIXED = 'multipart/mixed'; + const CONTENT_TYPE_MULTIPART_RELATED = 'multipart/related'; + + const ENCODING_7BIT = '7bit'; + const ENCODING_8BIT = '8bit'; + const ENCODING_BASE64 = 'base64'; + const ENCODING_BINARY = 'binary'; + const ENCODING_QUOTED_PRINTABLE = 'quoted-printable'; + + const ENCRYPTION_STARTTLS = 'tls'; + const ENCRYPTION_SMTPS = 'ssl'; + + const ICAL_METHOD_REQUEST = 'REQUEST'; + const ICAL_METHOD_PUBLISH = 'PUBLISH'; + const ICAL_METHOD_REPLY = 'REPLY'; + const ICAL_METHOD_ADD = 'ADD'; + const ICAL_METHOD_CANCEL = 'CANCEL'; + const ICAL_METHOD_REFRESH = 'REFRESH'; + const ICAL_METHOD_COUNTER = 'COUNTER'; + const ICAL_METHOD_DECLINECOUNTER = 'DECLINECOUNTER'; + + /** + * Email priority. + * Options: null (default), 1 = High, 3 = Normal, 5 = low. + * When null, the header is not set at all. + * + * @var int|null + */ + public $Priority; + + /** + * The character set of the message. + * + * @var string + */ + public $CharSet = self::CHARSET_ISO88591; + + /** + * The MIME Content-type of the message. + * + * @var string + */ + public $ContentType = self::CONTENT_TYPE_PLAINTEXT; + + /** + * The message encoding. + * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable". + * + * @var string + */ + public $Encoding = self::ENCODING_8BIT; + + /** + * Holds the most recent mailer error message. + * + * @var string + */ + public $ErrorInfo = ''; + + /** + * The From email address for the message. + * + * @var string + */ + public $From = ''; + + /** + * The From name of the message. + * + * @var string + */ + public $FromName = ''; + + /** + * The envelope sender of the message. + * This will usually be turned into a Return-Path header by the receiver, + * and is the address that bounces will be sent to. + * If not empty, will be passed via `-f` to sendmail or as the 'MAIL FROM' value over SMTP. + * + * @var string + */ + public $Sender = ''; + + /** + * The Subject of the message. + * + * @var string + */ + public $Subject = ''; + + /** + * An HTML or plain text message body. + * If HTML then call isHTML(true). + * + * @var string + */ + public $Body = ''; + + /** + * The plain-text message body. + * This body can be read by mail clients that do not have HTML email + * capability such as mutt & Eudora. + * Clients that can read HTML will view the normal Body. + * + * @var string + */ + public $AltBody = ''; + + /** + * An iCal message part body. + * Only supported in simple alt or alt_inline message types + * To generate iCal event structures, use classes like EasyPeasyICS or iCalcreator. + * + * @see http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/ + * @see http://kigkonsult.se/iCalcreator/ + * + * @var string + */ + public $Ical = ''; + + /** + * Value-array of "method" in Contenttype header "text/calendar" + * + * @var string[] + */ + protected static $IcalMethods = [ + self::ICAL_METHOD_REQUEST, + self::ICAL_METHOD_PUBLISH, + self::ICAL_METHOD_REPLY, + self::ICAL_METHOD_ADD, + self::ICAL_METHOD_CANCEL, + self::ICAL_METHOD_REFRESH, + self::ICAL_METHOD_COUNTER, + self::ICAL_METHOD_DECLINECOUNTER, + ]; + + /** + * The complete compiled MIME message body. + * + * @var string + */ + protected $MIMEBody = ''; + + /** + * The complete compiled MIME message headers. + * + * @var string + */ + protected $MIMEHeader = ''; + + /** + * Extra headers that createHeader() doesn't fold in. + * + * @var string + */ + protected $mailHeader = ''; + + /** + * Word-wrap the message body to this number of chars. + * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance. + * + * @see static::STD_LINE_LENGTH + * + * @var int + */ + public $WordWrap = 0; + + /** + * Which method to use to send mail. + * Options: "mail", "sendmail", or "smtp". + * + * @var string + */ + public $Mailer = 'mail'; + + /** + * The path to the sendmail program. + * + * @var string + */ + public $Sendmail = '/usr/sbin/sendmail'; + + /** + * Whether mail() uses a fully sendmail-compatible MTA. + * One which supports sendmail's "-oi -f" options. + * + * @var bool + */ + public $UseSendmailOptions = true; + + /** + * The email address that a reading confirmation should be sent to, also known as read receipt. + * + * @var string + */ + public $ConfirmReadingTo = ''; + + /** + * The hostname to use in the Message-ID header and as default HELO string. + * If empty, PHPMailer attempts to find one with, in order, + * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value + * 'localhost.localdomain'. + * + * @see PHPMailer::$Helo + * + * @var string + */ + public $Hostname = ''; + + /** + * An ID to be used in the Message-ID header. + * If empty, a unique id will be generated. + * You can set your own, but it must be in the format "", + * as defined in RFC5322 section 3.6.4 or it will be ignored. + * + * @see https://tools.ietf.org/html/rfc5322#section-3.6.4 + * + * @var string + */ + public $MessageID = ''; + + /** + * The message Date to be used in the Date header. + * If empty, the current date will be added. + * + * @var string + */ + public $MessageDate = ''; + + /** + * SMTP hosts. + * Either a single hostname or multiple semicolon-delimited hostnames. + * You can also specify a different port + * for each host by using this format: [hostname:port] + * (e.g. "smtp1.example.com:25;smtp2.example.com"). + * You can also specify encryption type, for example: + * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). + * Hosts will be tried in order. + * + * @var string + */ + public $Host = 'localhost'; + + /** + * The default SMTP server port. + * + * @var int + */ + public $Port = 25; + + /** + * The SMTP HELO/EHLO name used for the SMTP connection. + * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find + * one with the same method described above for $Hostname. + * + * @see PHPMailer::$Hostname + * + * @var string + */ + public $Helo = ''; + + /** + * What kind of encryption to use on the SMTP connection. + * Options: '', static::ENCRYPTION_STARTTLS, or static::ENCRYPTION_SMTPS. + * + * @var string + */ + public $SMTPSecure = ''; + + /** + * Whether to enable TLS encryption automatically if a server supports it, + * even if `SMTPSecure` is not set to 'tls'. + * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. + * + * @var bool + */ + public $SMTPAutoTLS = true; + + /** + * Whether to use SMTP authentication. + * Uses the Username and Password properties. + * + * @see PHPMailer::$Username + * @see PHPMailer::$Password + * + * @var bool + */ + public $SMTPAuth = false; + + /** + * Options array passed to stream_context_create when connecting via SMTP. + * + * @var array + */ + public $SMTPOptions = []; + + /** + * SMTP username. + * + * @var string + */ + public $Username = ''; + + /** + * SMTP password. + * + * @var string + */ + public $Password = ''; + + /** + * SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2. + * If not specified, the first one from that list that the server supports will be selected. + * + * @var string + */ + public $AuthType = ''; + + /** + * SMTP SMTPXClient command attibutes + * + * @var array + */ + protected $SMTPXClient = []; + + /** + * An implementation of the PHPMailer OAuthTokenProvider interface. + * + * @var OAuthTokenProvider + */ + protected $oauth; + + /** + * The SMTP server timeout in seconds. + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2. + * + * @var int + */ + public $Timeout = 300; + + /** + * Comma separated list of DSN notifications + * 'NEVER' under no circumstances a DSN must be returned to the sender. + * If you use NEVER all other notifications will be ignored. + * 'SUCCESS' will notify you when your mail has arrived at its destination. + * 'FAILURE' will arrive if an error occurred during delivery. + * 'DELAY' will notify you if there is an unusual delay in delivery, but the actual + * delivery's outcome (success or failure) is not yet decided. + * + * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY + */ + public $dsn = ''; + + /** + * SMTP class debug output mode. + * Debug output level. + * Options: + * @see SMTP::DEBUG_OFF: No output + * @see SMTP::DEBUG_CLIENT: Client messages + * @see SMTP::DEBUG_SERVER: Client and server messages + * @see SMTP::DEBUG_CONNECTION: As SERVER plus connection status + * @see SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed + * + * @see SMTP::$do_debug + * + * @var int + */ + public $SMTPDebug = 0; + + /** + * How to handle debug output. + * Options: + * * `echo` Output plain-text as-is, appropriate for CLI + * * `html` Output escaped, line breaks converted to `
`, appropriate for browser output + * * `error_log` Output to error log as configured in php.ini + * By default PHPMailer will use `echo` if run from a `cli` or `cli-server` SAPI, `html` otherwise. + * Alternatively, you can provide a callable expecting two params: a message string and the debug level: + * + * ```php + * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; + * ``` + * + * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug` + * level output is used: + * + * ```php + * $mail->Debugoutput = new myPsr3Logger; + * ``` + * + * @see SMTP::$Debugoutput + * + * @var string|callable|\Psr\Log\LoggerInterface + */ + public $Debugoutput = 'echo'; + + /** + * Whether to keep the SMTP connection open after each message. + * If this is set to true then the connection will remain open after a send, + * and closing the connection will require an explicit call to smtpClose(). + * It's a good idea to use this if you are sending multiple messages as it reduces overhead. + * See the mailing list example for how to use it. + * + * @var bool + */ + public $SMTPKeepAlive = false; + + /** + * Whether to split multiple to addresses into multiple messages + * or send them all in one message. + * Only supported in `mail` and `sendmail` transports, not in SMTP. + * + * @var bool + * + * @deprecated 6.0.0 PHPMailer isn't a mailing list manager! + */ + public $SingleTo = false; + + /** + * Storage for addresses when SingleTo is enabled. + * + * @var array + */ + protected $SingleToArray = []; + + /** + * Whether to generate VERP addresses on send. + * Only applicable when sending via SMTP. + * + * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path + * @see http://www.postfix.org/VERP_README.html Postfix VERP info + * + * @var bool + */ + public $do_verp = false; + + /** + * Whether to allow sending messages with an empty body. + * + * @var bool + */ + public $AllowEmpty = false; + + /** + * DKIM selector. + * + * @var string + */ + public $DKIM_selector = ''; + + /** + * DKIM Identity. + * Usually the email address used as the source of the email. + * + * @var string + */ + public $DKIM_identity = ''; + + /** + * DKIM passphrase. + * Used if your key is encrypted. + * + * @var string + */ + public $DKIM_passphrase = ''; + + /** + * DKIM signing domain name. + * + * @example 'example.com' + * + * @var string + */ + public $DKIM_domain = ''; + + /** + * DKIM Copy header field values for diagnostic use. + * + * @var bool + */ + public $DKIM_copyHeaderFields = true; + + /** + * DKIM Extra signing headers. + * + * @example ['List-Unsubscribe', 'List-Help'] + * + * @var array + */ + public $DKIM_extraHeaders = []; + + /** + * DKIM private key file path. + * + * @var string + */ + public $DKIM_private = ''; + + /** + * DKIM private key string. + * + * If set, takes precedence over `$DKIM_private`. + * + * @var string + */ + public $DKIM_private_string = ''; + + /** + * Callback Action function name. + * + * The function that handles the result of the send email action. + * It is called out by send() for each email sent. + * + * Value can be any php callable: http://www.php.net/is_callable + * + * Parameters: + * bool $result result of the send action + * array $to email addresses of the recipients + * array $cc cc email addresses + * array $bcc bcc email addresses + * string $subject the subject + * string $body the email body + * string $from email address of sender + * string $extra extra information of possible use + * "smtp_transaction_id' => last smtp transaction id + * + * @var string + */ + public $action_function = ''; + + /** + * What to put in the X-Mailer header. + * Options: An empty string for PHPMailer default, whitespace/null for none, or a string to use. + * + * @var string|null + */ + public $XMailer = ''; + + /** + * Which validator to use by default when validating email addresses. + * May be a callable to inject your own validator, but there are several built-in validators. + * The default validator uses PHP's FILTER_VALIDATE_EMAIL filter_var option. + * + * @see PHPMailer::validateAddress() + * + * @var string|callable + */ + public static $validator = 'php'; + + /** + * An instance of the SMTP sender class. + * + * @var SMTP + */ + protected $smtp; + + /** + * The array of 'to' names and addresses. + * + * @var array + */ + protected $to = []; + + /** + * The array of 'cc' names and addresses. + * + * @var array + */ + protected $cc = []; + + /** + * The array of 'bcc' names and addresses. + * + * @var array + */ + protected $bcc = []; + + /** + * The array of reply-to names and addresses. + * + * @var array + */ + protected $ReplyTo = []; + + /** + * An array of all kinds of addresses. + * Includes all of $to, $cc, $bcc. + * + * @see PHPMailer::$to + * @see PHPMailer::$cc + * @see PHPMailer::$bcc + * + * @var array + */ + protected $all_recipients = []; + + /** + * An array of names and addresses queued for validation. + * In send(), valid and non duplicate entries are moved to $all_recipients + * and one of $to, $cc, or $bcc. + * This array is used only for addresses with IDN. + * + * @see PHPMailer::$to + * @see PHPMailer::$cc + * @see PHPMailer::$bcc + * @see PHPMailer::$all_recipients + * + * @var array + */ + protected $RecipientsQueue = []; + + /** + * An array of reply-to names and addresses queued for validation. + * In send(), valid and non duplicate entries are moved to $ReplyTo. + * This array is used only for addresses with IDN. + * + * @see PHPMailer::$ReplyTo + * + * @var array + */ + protected $ReplyToQueue = []; + + /** + * The array of attachments. + * + * @var array + */ + protected $attachment = []; + + /** + * The array of custom headers. + * + * @var array + */ + protected $CustomHeader = []; + + /** + * The most recent Message-ID (including angular brackets). + * + * @var string + */ + protected $lastMessageID = ''; + + /** + * The message's MIME type. + * + * @var string + */ + protected $message_type = ''; + + /** + * The array of MIME boundary strings. + * + * @var array + */ + protected $boundary = []; + + /** + * The array of available text strings for the current language. + * + * @var array + */ + protected $language = []; + + /** + * The number of errors encountered. + * + * @var int + */ + protected $error_count = 0; + + /** + * The S/MIME certificate file path. + * + * @var string + */ + protected $sign_cert_file = ''; + + /** + * The S/MIME key file path. + * + * @var string + */ + protected $sign_key_file = ''; + + /** + * The optional S/MIME extra certificates ("CA Chain") file path. + * + * @var string + */ + protected $sign_extracerts_file = ''; + + /** + * The S/MIME password for the key. + * Used only if the key is encrypted. + * + * @var string + */ + protected $sign_key_pass = ''; + + /** + * Whether to throw exceptions for errors. + * + * @var bool + */ + protected $exceptions = false; + + /** + * Unique ID used for message ID and boundaries. + * + * @var string + */ + protected $uniqueid = ''; + + /** + * The PHPMailer Version number. + * + * @var string + */ + const VERSION = '6.9.1'; + + /** + * Error severity: message only, continue processing. + * + * @var int + */ + const STOP_MESSAGE = 0; + + /** + * Error severity: message, likely ok to continue processing. + * + * @var int + */ + const STOP_CONTINUE = 1; + + /** + * Error severity: message, plus full stop, critical error reached. + * + * @var int + */ + const STOP_CRITICAL = 2; + + /** + * The SMTP standard CRLF line break. + * If you want to change line break format, change static::$LE, not this. + */ + const CRLF = "\r\n"; + + /** + * "Folding White Space" a white space string used for line folding. + */ + const FWS = ' '; + + /** + * SMTP RFC standard line ending; Carriage Return, Line Feed. + * + * @var string + */ + protected static $LE = self::CRLF; + + /** + * The maximum line length supported by mail(). + * + * Background: mail() will sometimes corrupt messages + * with headers longer than 65 chars, see #818. + * + * @var int + */ + const MAIL_MAX_LINE_LENGTH = 63; + + /** + * The maximum line length allowed by RFC 2822 section 2.1.1. + * + * @var int + */ + const MAX_LINE_LENGTH = 998; + + /** + * The lower maximum line length allowed by RFC 2822 section 2.1.1. + * This length does NOT include the line break + * 76 means that lines will be 77 or 78 chars depending on whether + * the line break format is LF or CRLF; both are valid. + * + * @var int + */ + const STD_LINE_LENGTH = 76; + + /** + * Constructor. + * + * @param bool $exceptions Should we throw external exceptions? + */ + public function __construct($exceptions = null) + { + if (null !== $exceptions) { + $this->exceptions = (bool) $exceptions; + } + //Pick an appropriate debug output format automatically + $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html'); + } + + /** + * Destructor. + */ + public function __destruct() + { + //Close any open SMTP connection nicely + $this->smtpClose(); + } + + /** + * Call mail() in a safe_mode-aware fashion. + * Also, unless sendmail_path points to sendmail (or something that + * claims to be sendmail), don't pass params (not a perfect fix, + * but it will do). + * + * @param string $to To + * @param string $subject Subject + * @param string $body Message Body + * @param string $header Additional Header(s) + * @param string|null $params Params + * + * @return bool + */ + private function mailPassthru($to, $subject, $body, $header, $params) + { + //Check overloading of mail function to avoid double-encoding + if ((int)ini_get('mbstring.func_overload') & 1) { + $subject = $this->secureHeader($subject); + } else { + $subject = $this->encodeHeader($this->secureHeader($subject)); + } + //Calling mail() with null params breaks + $this->edebug('Sending with mail()'); + $this->edebug('Sendmail path: ' . ini_get('sendmail_path')); + $this->edebug("Envelope sender: {$this->Sender}"); + $this->edebug("To: {$to}"); + $this->edebug("Subject: {$subject}"); + $this->edebug("Headers: {$header}"); + if (!$this->UseSendmailOptions || null === $params) { + $result = @mail($to, $subject, $body, $header); + } else { + $this->edebug("Additional params: {$params}"); + $result = @mail($to, $subject, $body, $header, $params); + } + $this->edebug('Result: ' . ($result ? 'true' : 'false')); + return $result; + } + + /** + * Output debugging info via a user-defined method. + * Only generates output if debug output is enabled. + * + * @see PHPMailer::$Debugoutput + * @see PHPMailer::$SMTPDebug + * + * @param string $str + */ + protected function edebug($str) + { + if ($this->SMTPDebug <= 0) { + return; + } + //Is this a PSR-3 logger? + if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) { + $this->Debugoutput->debug($str); + + return; + } + //Avoid clash with built-in function names + if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) { + call_user_func($this->Debugoutput, $str, $this->SMTPDebug); + + return; + } + switch ($this->Debugoutput) { + case 'error_log': + //Don't output, just log + /** @noinspection ForgottenDebugOutputInspection */ + error_log($str); + break; + case 'html': + //Cleans up output a bit for a better looking, HTML-safe output + echo htmlentities( + preg_replace('/[\r\n]+/', '', $str), + ENT_QUOTES, + 'UTF-8' + ), "
\n"; + break; + case 'echo': + default: + //Normalize line breaks + $str = preg_replace('/\r\n|\r/m', "\n", $str); + echo gmdate('Y-m-d H:i:s'), + "\t", + //Trim trailing space + trim( + //Indent for readability, except for trailing break + str_replace( + "\n", + "\n \t ", + trim($str) + ) + ), + "\n"; + } + } + + /** + * Sets message type to HTML or plain. + * + * @param bool $isHtml True for HTML mode + */ + public function isHTML($isHtml = true) + { + if ($isHtml) { + $this->ContentType = static::CONTENT_TYPE_TEXT_HTML; + } else { + $this->ContentType = static::CONTENT_TYPE_PLAINTEXT; + } + } + + /** + * Send messages using SMTP. + */ + public function isSMTP() + { + $this->Mailer = 'smtp'; + } + + /** + * Send messages using PHP's mail() function. + */ + public function isMail() + { + $this->Mailer = 'mail'; + } + + /** + * Send messages using $Sendmail. + */ + public function isSendmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (false === stripos($ini_sendmail_path, 'sendmail')) { + $this->Sendmail = '/usr/sbin/sendmail'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'sendmail'; + } + + /** + * Send messages using qmail. + */ + public function isQmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (false === stripos($ini_sendmail_path, 'qmail')) { + $this->Sendmail = '/var/qmail/bin/qmail-inject'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'qmail'; + } + + /** + * Add a "To" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addAddress($address, $name = '') + { + return $this->addOrEnqueueAnAddress('to', $address, $name); + } + + /** + * Add a "CC" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addCC($address, $name = '') + { + return $this->addOrEnqueueAnAddress('cc', $address, $name); + } + + /** + * Add a "BCC" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addBCC($address, $name = '') + { + return $this->addOrEnqueueAnAddress('bcc', $address, $name); + } + + /** + * Add a "Reply-To" address. + * + * @param string $address The email address to reply to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addReplyTo($address, $name = '') + { + return $this->addOrEnqueueAnAddress('Reply-To', $address, $name); + } + + /** + * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer + * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still + * be modified after calling this function), addition of such addresses is delayed until send(). + * Addresses that have been added already return false, but do not throw exceptions. + * + * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' + * @param string $address The email address + * @param string $name An optional username associated with the address + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + protected function addOrEnqueueAnAddress($kind, $address, $name) + { + $pos = false; + if ($address !== null) { + $address = trim($address); + $pos = strrpos($address, '@'); + } + if (false === $pos) { + //At-sign is missing. + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $kind, + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + if ($name !== null && is_string($name)) { + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + } else { + $name = ''; + } + $params = [$kind, $address, $name]; + //Enqueue addresses with IDN until we know the PHPMailer::$CharSet. + //Domain is assumed to be whatever is after the last @ symbol in the address + if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) { + if ('Reply-To' !== $kind) { + if (!array_key_exists($address, $this->RecipientsQueue)) { + $this->RecipientsQueue[$address] = $params; + + return true; + } + } elseif (!array_key_exists($address, $this->ReplyToQueue)) { + $this->ReplyToQueue[$address] = $params; + + return true; + } + + return false; + } + + //Immediately add standard addresses without IDN. + return call_user_func_array([$this, 'addAnAddress'], $params); + } + + /** + * Set the boundaries to use for delimiting MIME parts. + * If you override this, ensure you set all 3 boundaries to unique values. + * The default boundaries include a "=_" sequence which cannot occur in quoted-printable bodies, + * as suggested by https://www.rfc-editor.org/rfc/rfc2045#section-6.7 + * + * @return void + */ + public function setBoundaries() + { + $this->uniqueid = $this->generateId(); + $this->boundary[1] = 'b1=_' . $this->uniqueid; + $this->boundary[2] = 'b2=_' . $this->uniqueid; + $this->boundary[3] = 'b3=_' . $this->uniqueid; + } + + /** + * Add an address to one of the recipient arrays or to the ReplyTo array. + * Addresses that have been added already return false, but do not throw exceptions. + * + * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' + * @param string $address The email address to send, resp. to reply to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + protected function addAnAddress($kind, $address, $name = '') + { + if (!in_array($kind, ['to', 'cc', 'bcc', 'Reply-To'])) { + $error_message = sprintf( + '%s: %s', + $this->lang('Invalid recipient kind'), + $kind + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + if (!static::validateAddress($address)) { + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $kind, + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + if ('Reply-To' !== $kind) { + if (!array_key_exists(strtolower($address), $this->all_recipients)) { + $this->{$kind}[] = [$address, $name]; + $this->all_recipients[strtolower($address)] = true; + + return true; + } + } elseif (!array_key_exists(strtolower($address), $this->ReplyTo)) { + $this->ReplyTo[strtolower($address)] = [$address, $name]; + + return true; + } + + return false; + } + + /** + * Parse and validate a string containing one or more RFC822-style comma-separated email addresses + * of the form "display name
" into an array of name/address pairs. + * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. + * Note that quotes in the name part are removed. + * + * @see http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation + * + * @param string $addrstr The address list string + * @param bool $useimap Whether to use the IMAP extension to parse the list + * @param string $charset The charset to use when decoding the address list string. + * + * @return array + */ + public static function parseAddresses($addrstr, $useimap = true, $charset = self::CHARSET_ISO88591) + { + $addresses = []; + if ($useimap && function_exists('imap_rfc822_parse_adrlist')) { + //Use this built-in parser if it's available + $list = imap_rfc822_parse_adrlist($addrstr, ''); + // Clear any potential IMAP errors to get rid of notices being thrown at end of script. + imap_errors(); + foreach ($list as $address) { + if ( + '.SYNTAX-ERROR.' !== $address->host && + static::validateAddress($address->mailbox . '@' . $address->host) + ) { + //Decode the name part if it's present and encoded + if ( + property_exists($address, 'personal') && + //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled + defined('MB_CASE_UPPER') && + preg_match('/^=\?.*\?=$/s', $address->personal) + ) { + $origCharset = mb_internal_encoding(); + mb_internal_encoding($charset); + //Undo any RFC2047-encoded spaces-as-underscores + $address->personal = str_replace('_', '=20', $address->personal); + //Decode the name + $address->personal = mb_decode_mimeheader($address->personal); + mb_internal_encoding($origCharset); + } + + $addresses[] = [ + 'name' => (property_exists($address, 'personal') ? $address->personal : ''), + 'address' => $address->mailbox . '@' . $address->host, + ]; + } + } + } else { + //Use this simpler parser + $list = explode(',', $addrstr); + foreach ($list as $address) { + $address = trim($address); + //Is there a separate name part? + if (strpos($address, '<') === false) { + //No separate name, just use the whole thing + if (static::validateAddress($address)) { + $addresses[] = [ + 'name' => '', + 'address' => $address, + ]; + } + } else { + list($name, $email) = explode('<', $address); + $email = trim(str_replace('>', '', $email)); + $name = trim($name); + if (static::validateAddress($email)) { + //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled + //If this name is encoded, decode it + if (defined('MB_CASE_UPPER') && preg_match('/^=\?.*\?=$/s', $name)) { + $origCharset = mb_internal_encoding(); + mb_internal_encoding($charset); + //Undo any RFC2047-encoded spaces-as-underscores + $name = str_replace('_', '=20', $name); + //Decode the name + $name = mb_decode_mimeheader($name); + mb_internal_encoding($origCharset); + } + $addresses[] = [ + //Remove any surrounding quotes and spaces from the name + 'name' => trim($name, '\'" '), + 'address' => $email, + ]; + } + } + } + } + + return $addresses; + } + + /** + * Set the From and FromName properties. + * + * @param string $address + * @param string $name + * @param bool $auto Whether to also set the Sender address, defaults to true + * + * @throws Exception + * + * @return bool + */ + public function setFrom($address, $name = '', $auto = true) + { + $address = trim((string)$address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + //Don't validate now addresses with IDN. Will be done in send(). + $pos = strrpos($address, '@'); + if ( + (false === $pos) + || ((!$this->has8bitChars(substr($address, ++$pos)) || !static::idnSupported()) + && !static::validateAddress($address)) + ) { + $error_message = sprintf( + '%s (From): %s', + $this->lang('invalid_address'), + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + $this->From = $address; + $this->FromName = $name; + if ($auto && empty($this->Sender)) { + $this->Sender = $address; + } + + return true; + } + + /** + * Return the Message-ID header of the last email. + * Technically this is the value from the last time the headers were created, + * but it's also the message ID of the last sent message except in + * pathological cases. + * + * @return string + */ + public function getLastMessageID() + { + return $this->lastMessageID; + } + + /** + * Check that a string looks like an email address. + * Validation patterns supported: + * * `auto` Pick best pattern automatically; + * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0; + * * `pcre` Use old PCRE implementation; + * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; + * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements. + * * `noregex` Don't use a regex: super fast, really dumb. + * Alternatively you may pass in a callable to inject your own validator, for example: + * + * ```php + * PHPMailer::validateAddress('user@example.com', function($address) { + * return (strpos($address, '@') !== false); + * }); + * ``` + * + * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator. + * + * @param string $address The email address to check + * @param string|callable $patternselect Which pattern to use + * + * @return bool + */ + public static function validateAddress($address, $patternselect = null) + { + if (null === $patternselect) { + $patternselect = static::$validator; + } + //Don't allow strings as callables, see SECURITY.md and CVE-2021-3603 + if (is_callable($patternselect) && !is_string($patternselect)) { + return call_user_func($patternselect, $address); + } + //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321 + if (strpos($address, "\n") !== false || strpos($address, "\r") !== false) { + return false; + } + switch ($patternselect) { + case 'pcre': //Kept for BC + case 'pcre8': + /* + * A more complex and more permissive version of the RFC5322 regex on which FILTER_VALIDATE_EMAIL + * is based. + * In addition to the addresses allowed by filter_var, also permits: + * * dotless domains: `a@b` + * * comments: `1234 @ local(blah) .machine .example` + * * quoted elements: `'"test blah"@example.org'` + * * numeric TLDs: `a@b.123` + * * unbracketed IPv4 literals: `a@192.168.0.1` + * * IPv6 literals: 'first.last@[IPv6:a1::]' + * Not all of these will necessarily work for sending! + * + * @see http://squiloople.com/2009/12/20/email-address-validation/ + * @copyright 2009-2010 Michael Rushton + * Feel free to use and redistribute this code. But please keep this copyright notice. + */ + return (bool) preg_match( + '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . + '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . + '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . + '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . + '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . + '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . + '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . + '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . + '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', + $address + ); + case 'html5': + /* + * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. + * + * @see https://html.spec.whatwg.org/#e-mail-state-(type=email) + */ + return (bool) preg_match( + '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . + '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', + $address + ); + case 'php': + default: + return filter_var($address, FILTER_VALIDATE_EMAIL) !== false; + } + } + + /** + * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the + * `intl` and `mbstring` PHP extensions. + * + * @return bool `true` if required functions for IDN support are present + */ + public static function idnSupported() + { + return function_exists('idn_to_ascii') && function_exists('mb_convert_encoding'); + } + + /** + * Converts IDN in given email address to its ASCII form, also known as punycode, if possible. + * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet. + * This function silently returns unmodified address if: + * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form) + * - Conversion to punycode is impossible (e.g. required PHP functions are not available) + * or fails for any reason (e.g. domain contains characters not allowed in an IDN). + * + * @see PHPMailer::$CharSet + * + * @param string $address The email address to convert + * + * @return string The encoded address in ASCII form + */ + public function punyencodeAddress($address) + { + //Verify we have required functions, CharSet, and at-sign. + $pos = strrpos($address, '@'); + if ( + !empty($this->CharSet) && + false !== $pos && + static::idnSupported() + ) { + $domain = substr($address, ++$pos); + //Verify CharSet string is a valid one, and domain properly encoded in this CharSet. + if ($this->has8bitChars($domain) && @mb_check_encoding($domain, $this->CharSet)) { + //Convert the domain from whatever charset it's in to UTF-8 + $domain = mb_convert_encoding($domain, self::CHARSET_UTF8, $this->CharSet); + //Ignore IDE complaints about this line - method signature changed in PHP 5.4 + $errorcode = 0; + if (defined('INTL_IDNA_VARIANT_UTS46')) { + //Use the current punycode standard (appeared in PHP 7.2) + $punycode = idn_to_ascii( + $domain, + \IDNA_DEFAULT | \IDNA_USE_STD3_RULES | \IDNA_CHECK_BIDI | + \IDNA_CHECK_CONTEXTJ | \IDNA_NONTRANSITIONAL_TO_ASCII, + \INTL_IDNA_VARIANT_UTS46 + ); + } elseif (defined('INTL_IDNA_VARIANT_2003')) { + //Fall back to this old, deprecated/removed encoding + $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_2003); + } else { + //Fall back to a default we don't know about + $punycode = idn_to_ascii($domain, $errorcode); + } + if (false !== $punycode) { + return substr($address, 0, $pos) . $punycode; + } + } + } + + return $address; + } + + /** + * Create a message and send it. + * Uses the sending method specified by $Mailer. + * + * @throws Exception + * + * @return bool false on error - See the ErrorInfo property for details of the error + */ + public function send() + { + try { + if (!$this->preSend()) { + return false; + } + + return $this->postSend(); + } catch (Exception $exc) { + $this->mailHeader = ''; + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + + return false; + } + } + + /** + * Prepare a message for sending. + * + * @throws Exception + * + * @return bool + */ + public function preSend() + { + if ( + 'smtp' === $this->Mailer + || ('mail' === $this->Mailer && (\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0)) + ) { + //SMTP mandates RFC-compliant line endings + //and it's also used with mail() on Windows + static::setLE(self::CRLF); + } else { + //Maintain backward compatibility with legacy Linux command line mailers + static::setLE(PHP_EOL); + } + //Check for buggy PHP versions that add a header with an incorrect line break + if ( + 'mail' === $this->Mailer + && ((\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70017) + || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70103)) + && ini_get('mail.add_x_header') === '1' + && stripos(PHP_OS, 'WIN') === 0 + ) { + trigger_error($this->lang('buggy_php'), E_USER_WARNING); + } + + try { + $this->error_count = 0; //Reset errors + $this->mailHeader = ''; + + //Dequeue recipient and Reply-To addresses with IDN + foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) { + $params[1] = $this->punyencodeAddress($params[1]); + call_user_func_array([$this, 'addAnAddress'], $params); + } + if (count($this->to) + count($this->cc) + count($this->bcc) < 1) { + throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL); + } + + //Validate From, Sender, and ConfirmReadingTo addresses + foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) { + if ($this->{$address_kind} === null) { + $this->{$address_kind} = ''; + continue; + } + $this->{$address_kind} = trim($this->{$address_kind}); + if (empty($this->{$address_kind})) { + continue; + } + $this->{$address_kind} = $this->punyencodeAddress($this->{$address_kind}); + if (!static::validateAddress($this->{$address_kind})) { + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $address_kind, + $this->{$address_kind} + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + } + + //Set whether the message is multipart/alternative + if ($this->alternativeExists()) { + $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE; + } + + $this->setMessageType(); + //Refuse to send an empty message unless we are specifically allowing it + if (!$this->AllowEmpty && empty($this->Body)) { + throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL); + } + + //Trim subject consistently + $this->Subject = trim($this->Subject); + //Create body before headers in case body makes changes to headers (e.g. altering transfer encoding) + $this->MIMEHeader = ''; + $this->MIMEBody = $this->createBody(); + //createBody may have added some headers, so retain them + $tempheaders = $this->MIMEHeader; + $this->MIMEHeader = $this->createHeader(); + $this->MIMEHeader .= $tempheaders; + + //To capture the complete message when using mail(), create + //an extra header list which createHeader() doesn't fold in + if ('mail' === $this->Mailer) { + if (count($this->to) > 0) { + $this->mailHeader .= $this->addrAppend('To', $this->to); + } else { + $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;'); + } + $this->mailHeader .= $this->headerLine( + 'Subject', + $this->encodeHeader($this->secureHeader($this->Subject)) + ); + } + + //Sign with DKIM if enabled + if ( + !empty($this->DKIM_domain) + && !empty($this->DKIM_selector) + && (!empty($this->DKIM_private_string) + || (!empty($this->DKIM_private) + && static::isPermittedPath($this->DKIM_private) + && file_exists($this->DKIM_private) + ) + ) + ) { + $header_dkim = $this->DKIM_Add( + $this->MIMEHeader . $this->mailHeader, + $this->encodeHeader($this->secureHeader($this->Subject)), + $this->MIMEBody + ); + $this->MIMEHeader = static::stripTrailingWSP($this->MIMEHeader) . static::$LE . + static::normalizeBreaks($header_dkim) . static::$LE; + } + + return true; + } catch (Exception $exc) { + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + + return false; + } + } + + /** + * Actually send a message via the selected mechanism. + * + * @throws Exception + * + * @return bool + */ + public function postSend() + { + try { + //Choose the mailer and send through it + switch ($this->Mailer) { + case 'sendmail': + case 'qmail': + return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody); + case 'smtp': + return $this->smtpSend($this->MIMEHeader, $this->MIMEBody); + case 'mail': + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + default: + $sendMethod = $this->Mailer . 'Send'; + if (method_exists($this, $sendMethod)) { + return $this->{$sendMethod}($this->MIMEHeader, $this->MIMEBody); + } + + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + } + } catch (Exception $exc) { + $this->setError($exc->getMessage()); + $this->edebug($exc->getMessage()); + if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true && $this->smtp->connected()) { + $this->smtp->reset(); + } + if ($this->exceptions) { + throw $exc; + } + } + + return false; + } + + /** + * Send mail using the $Sendmail program. + * + * @see PHPMailer::$Sendmail + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function sendmailSend($header, $body) + { + if ($this->Mailer === 'qmail') { + $this->edebug('Sending with qmail'); + } else { + $this->edebug('Sending with sendmail'); + } + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver + //A space after `-f` is optional, but there is a long history of its presence + //causing problems, so we don't use one + //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html + //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html + //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html + //Example problem: https://www.drupal.org/node/1057954 + + //PHP 5.6 workaround + $sendmail_from_value = ini_get('sendmail_from'); + if (empty($this->Sender) && !empty($sendmail_from_value)) { + //PHP config has a sender address we can use + $this->Sender = ini_get('sendmail_from'); + } + //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. + if (!empty($this->Sender) && static::validateAddress($this->Sender) && self::isShellSafe($this->Sender)) { + if ($this->Mailer === 'qmail') { + $sendmailFmt = '%s -f%s'; + } else { + $sendmailFmt = '%s -oi -f%s -t'; + } + } else { + //allow sendmail to choose a default envelope sender. It may + //seem preferable to force it to use the From header as with + //SMTP, but that introduces new problems (see + //), and + //it has historically worked this way. + $sendmailFmt = '%s -oi -t'; + } + + $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender); + $this->edebug('Sendmail path: ' . $this->Sendmail); + $this->edebug('Sendmail command: ' . $sendmail); + $this->edebug('Envelope sender: ' . $this->Sender); + $this->edebug("Headers: {$header}"); + + if ($this->SingleTo) { + foreach ($this->SingleToArray as $toAddr) { + $mail = @popen($sendmail, 'w'); + if (!$mail) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + $this->edebug("To: {$toAddr}"); + fwrite($mail, 'To: ' . $toAddr . "\n"); + fwrite($mail, $header); + fwrite($mail, $body); + $result = pclose($mail); + $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); + $this->doCallback( + ($result === 0), + [[$addrinfo['address'], $addrinfo['name']]], + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); + if (0 !== $result) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + } else { + $mail = @popen($sendmail, 'w'); + if (!$mail) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fwrite($mail, $header); + fwrite($mail, $body); + $result = pclose($mail); + $this->doCallback( + ($result === 0), + $this->to, + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); + if (0 !== $result) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + + return true; + } + + /** + * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters. + * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows. + * + * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report + * + * @param string $string The string to be validated + * + * @return bool + */ + protected static function isShellSafe($string) + { + //It's not possible to use shell commands safely (which includes the mail() function) without escapeshellarg, + //but some hosting providers disable it, creating a security problem that we don't want to have to deal with, + //so we don't. + if (!function_exists('escapeshellarg') || !function_exists('escapeshellcmd')) { + return false; + } + + if ( + escapeshellcmd($string) !== $string + || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""]) + ) { + return false; + } + + $length = strlen($string); + + for ($i = 0; $i < $length; ++$i) { + $c = $string[$i]; + + //All other characters have a special meaning in at least one common shell, including = and +. + //Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here. + //Note that this does permit non-Latin alphanumeric characters based on the current locale. + if (!ctype_alnum($c) && strpos('@_-.', $c) === false) { + return false; + } + } + + return true; + } + + /** + * Check whether a file path is of a permitted type. + * Used to reject URLs and phar files from functions that access local file paths, + * such as addAttachment. + * + * @param string $path A relative or absolute path to a file + * + * @return bool + */ + protected static function isPermittedPath($path) + { + //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1 + return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path); + } + + /** + * Check whether a file path is safe, accessible, and readable. + * + * @param string $path A relative or absolute path to a file + * + * @return bool + */ + protected static function fileIsAccessible($path) + { + if (!static::isPermittedPath($path)) { + return false; + } + $readable = is_file($path); + //If not a UNC path (expected to start with \\), check read permission, see #2069 + if (strpos($path, '\\\\') !== 0) { + $readable = $readable && is_readable($path); + } + return $readable; + } + + /** + * Send mail using the PHP mail() function. + * + * @see http://www.php.net/manual/en/book.mail.php + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function mailSend($header, $body) + { + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + + $toArr = []; + foreach ($this->to as $toaddr) { + $toArr[] = $this->addrFormat($toaddr); + } + $to = trim(implode(', ', $toArr)); + + //If there are no To-addresses (e.g. when sending only to BCC-addresses) + //the following should be added to get a correct DKIM-signature. + //Compare with $this->preSend() + if ($to === '') { + $to = 'undisclosed-recipients:;'; + } + + $params = null; + //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver + //A space after `-f` is optional, but there is a long history of its presence + //causing problems, so we don't use one + //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html + //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html + //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html + //Example problem: https://www.drupal.org/node/1057954 + //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. + + //PHP 5.6 workaround + $sendmail_from_value = ini_get('sendmail_from'); + if (empty($this->Sender) && !empty($sendmail_from_value)) { + //PHP config has a sender address we can use + $this->Sender = ini_get('sendmail_from'); + } + if (!empty($this->Sender) && static::validateAddress($this->Sender)) { + if (self::isShellSafe($this->Sender)) { + $params = sprintf('-f%s', $this->Sender); + } + $old_from = ini_get('sendmail_from'); + ini_set('sendmail_from', $this->Sender); + } + $result = false; + if ($this->SingleTo && count($toArr) > 1) { + foreach ($toArr as $toAddr) { + $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); + $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); + $this->doCallback( + $result, + [[$addrinfo['address'], $addrinfo['name']]], + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + } + } else { + $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params); + $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, []); + } + if (isset($old_from)) { + ini_set('sendmail_from', $old_from); + } + if (!$result) { + throw new Exception($this->lang('instantiate'), self::STOP_CRITICAL); + } + + return true; + } + + /** + * Get an instance to use for SMTP operations. + * Override this function to load your own SMTP implementation, + * or set one with setSMTPInstance. + * + * @return SMTP + */ + public function getSMTPInstance() + { + if (!is_object($this->smtp)) { + $this->smtp = new SMTP(); + } + + return $this->smtp; + } + + /** + * Provide an instance to use for SMTP operations. + * + * @return SMTP + */ + public function setSMTPInstance(SMTP $smtp) + { + $this->smtp = $smtp; + + return $this->smtp; + } + + /** + * Provide SMTP XCLIENT attributes + * + * @param string $name Attribute name + * @param ?string $value Attribute value + * + * @return bool + */ + public function setSMTPXclientAttribute($name, $value) + { + if (!in_array($name, SMTP::$xclient_allowed_attributes)) { + return false; + } + if (isset($this->SMTPXClient[$name]) && $value === null) { + unset($this->SMTPXClient[$name]); + } elseif ($value !== null) { + $this->SMTPXClient[$name] = $value; + } + + return true; + } + + /** + * Get SMTP XCLIENT attributes + * + * @return array + */ + public function getSMTPXclientAttributes() + { + return $this->SMTPXClient; + } + + /** + * Send mail via SMTP. + * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. + * + * @see PHPMailer::setSMTPInstance() to use a different class. + * + * @uses \PHPMailer\PHPMailer\SMTP + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function smtpSend($header, $body) + { + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + $bad_rcpt = []; + if (!$this->smtpConnect($this->SMTPOptions)) { + throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); + } + //Sender already validated in preSend() + if ('' === $this->Sender) { + $smtp_from = $this->From; + } else { + $smtp_from = $this->Sender; + } + if (count($this->SMTPXClient)) { + $this->smtp->xclient($this->SMTPXClient); + } + if (!$this->smtp->mail($smtp_from)) { + $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); + throw new Exception($this->ErrorInfo, self::STOP_CRITICAL); + } + + $callbacks = []; + //Attempt to send to all recipients + foreach ([$this->to, $this->cc, $this->bcc] as $togroup) { + foreach ($togroup as $to) { + if (!$this->smtp->recipient($to[0], $this->dsn)) { + $error = $this->smtp->getError(); + $bad_rcpt[] = ['to' => $to[0], 'error' => $error['detail']]; + $isSent = false; + } else { + $isSent = true; + } + + $callbacks[] = ['issent' => $isSent, 'to' => $to[0], 'name' => $to[1]]; + } + } + + //Only send the DATA command if we have viable recipients + if ((count($this->all_recipients) > count($bad_rcpt)) && !$this->smtp->data($header . $body)) { + throw new Exception($this->lang('data_not_accepted'), self::STOP_CRITICAL); + } + + $smtp_transaction_id = $this->smtp->getLastTransactionID(); + + if ($this->SMTPKeepAlive) { + $this->smtp->reset(); + } else { + $this->smtp->quit(); + $this->smtp->close(); + } + + foreach ($callbacks as $cb) { + $this->doCallback( + $cb['issent'], + [[$cb['to'], $cb['name']]], + [], + [], + $this->Subject, + $body, + $this->From, + ['smtp_transaction_id' => $smtp_transaction_id] + ); + } + + //Create error message for any bad addresses + if (count($bad_rcpt) > 0) { + $errstr = ''; + foreach ($bad_rcpt as $bad) { + $errstr .= $bad['to'] . ': ' . $bad['error']; + } + throw new Exception($this->lang('recipients_failed') . $errstr, self::STOP_CONTINUE); + } + + return true; + } + + /** + * Initiate a connection to an SMTP server. + * Returns false if the operation failed. + * + * @param array $options An array of options compatible with stream_context_create() + * + * @throws Exception + * + * @uses \PHPMailer\PHPMailer\SMTP + * + * @return bool + */ + public function smtpConnect($options = null) + { + if (null === $this->smtp) { + $this->smtp = $this->getSMTPInstance(); + } + + //If no options are provided, use whatever is set in the instance + if (null === $options) { + $options = $this->SMTPOptions; + } + + //Already connected? + if ($this->smtp->connected()) { + return true; + } + + $this->smtp->setTimeout($this->Timeout); + $this->smtp->setDebugLevel($this->SMTPDebug); + $this->smtp->setDebugOutput($this->Debugoutput); + $this->smtp->setVerp($this->do_verp); + if ($this->Host === null) { + $this->Host = 'localhost'; + } + $hosts = explode(';', $this->Host); + $lastexception = null; + + foreach ($hosts as $hostentry) { + $hostinfo = []; + if ( + !preg_match( + '/^(?:(ssl|tls):\/\/)?(.+?)(?::(\d+))?$/', + trim($hostentry), + $hostinfo + ) + ) { + $this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry)); + //Not a valid host entry + continue; + } + //$hostinfo[1]: optional ssl or tls prefix + //$hostinfo[2]: the hostname + //$hostinfo[3]: optional port number + //The host string prefix can temporarily override the current setting for SMTPSecure + //If it's not specified, the default value is used + + //Check the host name is a valid name or IP address before trying to use it + if (!static::isValidHost($hostinfo[2])) { + $this->edebug($this->lang('invalid_host') . ' ' . $hostinfo[2]); + continue; + } + $prefix = ''; + $secure = $this->SMTPSecure; + $tls = (static::ENCRYPTION_STARTTLS === $this->SMTPSecure); + if ('ssl' === $hostinfo[1] || ('' === $hostinfo[1] && static::ENCRYPTION_SMTPS === $this->SMTPSecure)) { + $prefix = 'ssl://'; + $tls = false; //Can't have SSL and TLS at the same time + $secure = static::ENCRYPTION_SMTPS; + } elseif ('tls' === $hostinfo[1]) { + $tls = true; + //TLS doesn't use a prefix + $secure = static::ENCRYPTION_STARTTLS; + } + //Do we need the OpenSSL extension? + $sslext = defined('OPENSSL_ALGO_SHA256'); + if (static::ENCRYPTION_STARTTLS === $secure || static::ENCRYPTION_SMTPS === $secure) { + //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled + if (!$sslext) { + throw new Exception($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL); + } + } + $host = $hostinfo[2]; + $port = $this->Port; + if ( + array_key_exists(3, $hostinfo) && + is_numeric($hostinfo[3]) && + $hostinfo[3] > 0 && + $hostinfo[3] < 65536 + ) { + $port = (int) $hostinfo[3]; + } + if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { + try { + if ($this->Helo) { + $hello = $this->Helo; + } else { + $hello = $this->serverHostname(); + } + $this->smtp->hello($hello); + //Automatically enable TLS encryption if: + //* it's not disabled + //* we are not connecting to localhost + //* we have openssl extension + //* we are not already using SSL + //* the server offers STARTTLS + if ( + $this->SMTPAutoTLS && + $this->Host !== 'localhost' && + $sslext && + $secure !== 'ssl' && + $this->smtp->getServerExt('STARTTLS') + ) { + $tls = true; + } + if ($tls) { + if (!$this->smtp->startTLS()) { + $message = $this->getSmtpErrorMessage('connect_host'); + throw new Exception($message); + } + //We must resend EHLO after TLS negotiation + $this->smtp->hello($hello); + } + if ( + $this->SMTPAuth && !$this->smtp->authenticate( + $this->Username, + $this->Password, + $this->AuthType, + $this->oauth + ) + ) { + throw new Exception($this->lang('authenticate')); + } + + return true; + } catch (Exception $exc) { + $lastexception = $exc; + $this->edebug($exc->getMessage()); + //We must have connected, but then failed TLS or Auth, so close connection nicely + $this->smtp->quit(); + } + } + } + //If we get here, all connection attempts have failed, so close connection hard + $this->smtp->close(); + //As we've caught all exceptions, just report whatever the last one was + if ($this->exceptions && null !== $lastexception) { + throw $lastexception; + } + if ($this->exceptions) { + // no exception was thrown, likely $this->smtp->connect() failed + $message = $this->getSmtpErrorMessage('connect_host'); + throw new Exception($message); + } + + return false; + } + + /** + * Close the active SMTP session if one exists. + */ + public function smtpClose() + { + if ((null !== $this->smtp) && $this->smtp->connected()) { + $this->smtp->quit(); + $this->smtp->close(); + } + } + + /** + * Set the language for error messages. + * The default language is English. + * + * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr") + * Optionally, the language code can be enhanced with a 4-character + * script annotation and/or a 2-character country annotation. + * @param string $lang_path Path to the language file directory, with trailing separator (slash) + * Do not set this from user input! + * + * @return bool Returns true if the requested language was loaded, false otherwise. + */ + public function setLanguage($langcode = 'en', $lang_path = '') + { + //Backwards compatibility for renamed language codes + $renamed_langcodes = [ + 'br' => 'pt_br', + 'cz' => 'cs', + 'dk' => 'da', + 'no' => 'nb', + 'se' => 'sv', + 'rs' => 'sr', + 'tg' => 'tl', + 'am' => 'hy', + ]; + + if (array_key_exists($langcode, $renamed_langcodes)) { + $langcode = $renamed_langcodes[$langcode]; + } + + //Define full set of translatable strings in English + $PHPMAILER_LANG = [ + 'authenticate' => 'SMTP Error: Could not authenticate.', + 'buggy_php' => 'Your version of PHP is affected by a bug that may result in corrupted messages.' . + ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' . + ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.', + 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', + 'data_not_accepted' => 'SMTP Error: data not accepted.', + 'empty_message' => 'Message body empty', + 'encoding' => 'Unknown encoding: ', + 'execute' => 'Could not execute: ', + 'extension_missing' => 'Extension missing: ', + 'file_access' => 'Could not access file: ', + 'file_open' => 'File Error: Could not open file: ', + 'from_failed' => 'The following From address failed: ', + 'instantiate' => 'Could not instantiate mail function.', + 'invalid_address' => 'Invalid address: ', + 'invalid_header' => 'Invalid header name or value', + 'invalid_hostentry' => 'Invalid hostentry: ', + 'invalid_host' => 'Invalid host: ', + 'mailer_not_supported' => ' mailer is not supported.', + 'provide_address' => 'You must provide at least one recipient email address.', + 'recipients_failed' => 'SMTP Error: The following recipients failed: ', + 'signing' => 'Signing Error: ', + 'smtp_code' => 'SMTP code: ', + 'smtp_code_ex' => 'Additional SMTP info: ', + 'smtp_connect_failed' => 'SMTP connect() failed.', + 'smtp_detail' => 'Detail: ', + 'smtp_error' => 'SMTP server error: ', + 'variable_set' => 'Cannot set or reset variable: ', + ]; + if (empty($lang_path)) { + //Calculate an absolute path so it can work if CWD is not here + $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR; + } + + //Validate $langcode + $foundlang = true; + $langcode = strtolower($langcode); + if ( + !preg_match('/^(?P[a-z]{2})(?P'; + }; + var dataToHtml = function (editor, dataIn) { + var data = global$1.extend({}, dataIn); + if (!data.source) { + global$1.extend(data, htmlToData(getScripts(editor), data.embed)); + if (!data.source) { + return ''; + } + } + if (!data.altsource) { + data.altsource = ''; + } + if (!data.poster) { + data.poster = ''; + } + data.source = editor.convertURL(data.source, 'source'); + data.altsource = editor.convertURL(data.altsource, 'source'); + data.sourcemime = guess(data.source); + data.altsourcemime = guess(data.altsource); + data.poster = editor.convertURL(data.poster, 'poster'); + var pattern = matchPattern(data.source); + if (pattern) { + data.source = pattern.url; + data.type = pattern.type; + data.allowFullscreen = pattern.allowFullscreen; + data.width = data.width || String(pattern.w); + data.height = data.height || String(pattern.h); + } + if (data.embed) { + return updateHtml(data.embed, data, true); + } else { + var videoScript = getVideoScriptMatch(getScripts(editor), data.source); + if (videoScript) { + data.type = 'script'; + data.width = String(videoScript.width); + data.height = String(videoScript.height); + } + var audioTemplateCallback = getAudioTemplateCallback(editor); + var videoTemplateCallback = getVideoTemplateCallback(editor); + data.width = data.width || '300'; + data.height = data.height || '150'; + global$1.each(data, function (value, key) { + data[key] = editor.dom.encode('' + value); + }); + if (data.type === 'iframe') { + return getIframeHtml(data); + } else if (data.sourcemime === 'application/x-shockwave-flash') { + return getFlashHtml(data); + } else if (data.sourcemime.indexOf('audio') !== -1) { + return getAudioHtml(data, audioTemplateCallback); + } else if (data.type === 'script') { + return getScriptHtml(data); + } else { + return getVideoHtml(data, videoTemplateCallback); + } + } + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var cache = {}; + var embedPromise = function (data, dataToHtml, handler) { + return new global$6(function (res, rej) { + var wrappedResolve = function (response) { + if (response.html) { + cache[data.source] = response; + } + return res({ + url: data.source, + html: response.html ? response.html : dataToHtml(data) + }); + }; + if (cache[data.source]) { + wrappedResolve(cache[data.source]); + } else { + handler({ url: data.source }, wrappedResolve, rej); + } + }); + }; + var defaultPromise = function (data, dataToHtml) { + return new global$6(function (res) { + res({ + html: dataToHtml(data), + url: data.source + }); + }); + }; + var loadedData = function (editor) { + return function (data) { + return dataToHtml(editor, data); + }; + }; + var getEmbedHtml = function (editor, data) { + var embedHandler = getUrlResolver(editor); + return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); + }; + var isCached = function (url) { + return cache.hasOwnProperty(url); + }; + + var extractMeta = function (sourceInput, data) { + return get(data, sourceInput).bind(function (mainData) { + return get(mainData, 'meta'); + }); + }; + var getValue = function (data, metaData, sourceInput) { + return function (prop) { + var _a; + var getFromData = function () { + return get(data, prop); + }; + var getFromMetaData = function () { + return get(metaData, prop); + }; + var getNonEmptyValue = function (c) { + return get(c, 'value').bind(function (v) { + return v.length > 0 ? Optional.some(v) : Optional.none(); + }); + }; + var getFromValueFirst = function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () { + return Optional.from(child); + }); + }); + }; + var getFromMetaFirst = function () { + return getFromMetaData().orThunk(function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child) : Optional.from(child); + }); + }); + }; + return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a; + }; + }; + var getDimensions = function (data, metaData) { + var dimensions = {}; + get(data, 'dimensions').each(function (dims) { + each([ + 'width', + 'height' + ], function (prop) { + get(metaData, prop).orThunk(function () { + return get(dims, prop); + }).each(function (value) { + return dimensions[prop] = value; + }); + }); + }); + return dimensions; + }; + var unwrap = function (data, sourceInput) { + var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {}; + var get = getValue(data, metaData, sourceInput); + return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData)); + }; + var wrap = function (data) { + var wrapped = __assign(__assign({}, data), { + source: { value: get(data, 'source').getOr('') }, + altsource: { value: get(data, 'altsource').getOr('') }, + poster: { value: get(data, 'poster').getOr('') } + }); + each([ + 'width', + 'height' + ], function (prop) { + get(data, prop).each(function (value) { + var dimensions = wrapped.dimensions || {}; + dimensions[prop] = value; + wrapped.dimensions = dimensions; + }); + }); + return wrapped; + }; + var handleError = function (editor) { + return function (error) { + var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; + editor.notificationManager.open({ + type: 'error', + text: errorMessage + }); + }; + }; + var snippetToData = function (editor, embedSnippet) { + return htmlToData(getScripts(editor), embedSnippet); + }; + var isMediaElement = function (element) { + return element.getAttribute('data-mce-object') || element.getAttribute('data-ephox-embed-iri'); + }; + var getEditorData = function (editor) { + var element = editor.selection.getNode(); + var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : ''; + return __assign({ embed: snippet }, htmlToData(getScripts(editor), snippet)); + }; + var addEmbedHtml = function (api, editor) { + return function (response) { + if (isString(response.url) && response.url.trim().length > 0) { + var html = response.html; + var snippetData = snippetToData(editor, html); + var nuData = __assign(__assign({}, snippetData), { + source: response.url, + embed: html + }); + api.setData(wrap(nuData)); + } + }; + }; + var selectPlaceholder = function (editor, beforeObjects) { + var afterObjects = editor.dom.select('img[data-mce-object]'); + for (var i = 0; i < beforeObjects.length; i++) { + for (var y = afterObjects.length - 1; y >= 0; y--) { + if (beforeObjects[i] === afterObjects[y]) { + afterObjects.splice(y, 1); + } + } + } + editor.selection.select(afterObjects[0]); + }; + var handleInsert = function (editor, html) { + var beforeObjects = editor.dom.select('img[data-mce-object]'); + editor.insertContent(html); + selectPlaceholder(editor, beforeObjects); + editor.nodeChanged(); + }; + var submitForm = function (prevData, newData, editor) { + newData.embed = updateHtml(newData.embed, newData); + if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) { + handleInsert(editor, newData.embed); + } else { + getEmbedHtml(editor, newData).then(function (response) { + handleInsert(editor, response.html); + }).catch(handleError(editor)); + } + }; + var showDialog = function (editor) { + var editorData = getEditorData(editor); + var currentData = Cell(editorData); + var initialData = wrap(editorData); + var handleSource = function (prevData, api) { + var serviceData = unwrap(api.getData(), 'source'); + if (prevData.source !== serviceData.source) { + addEmbedHtml(win, editor)({ + url: serviceData.source, + html: '' + }); + getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor)); + } + }; + var handleEmbed = function (api) { + var data = unwrap(api.getData()); + var dataFromEmbed = snippetToData(editor, data.embed); + api.setData(wrap(dataFromEmbed)); + }; + var handleUpdate = function (api, sourceInput) { + var data = unwrap(api.getData(), sourceInput); + var embed = dataToHtml(editor, data); + api.setData(wrap(__assign(__assign({}, data), { embed: embed }))); + }; + var mediaInput = [{ + name: 'source', + type: 'urlinput', + filetype: 'media', + label: 'Source' + }]; + var sizeInput = !hasDimensions(editor) ? [] : [{ + type: 'sizeinput', + name: 'dimensions', + label: 'Constrain proportions', + constrain: true + }]; + var generalTab = { + title: 'General', + name: 'general', + items: flatten([ + mediaInput, + sizeInput + ]) + }; + var embedTextarea = { + type: 'textarea', + name: 'embed', + label: 'Paste your embed code below:' + }; + var embedTab = { + title: 'Embed', + items: [embedTextarea] + }; + var advancedFormItems = []; + if (hasAltSource(editor)) { + advancedFormItems.push({ + name: 'altsource', + type: 'urlinput', + filetype: 'media', + label: 'Alternative source URL' + }); + } + if (hasPoster(editor)) { + advancedFormItems.push({ + name: 'poster', + type: 'urlinput', + filetype: 'image', + label: 'Media poster (Image URL)' + }); + } + var advancedTab = { + title: 'Advanced', + name: 'advanced', + items: advancedFormItems + }; + var tabs = [ + generalTab, + embedTab + ]; + if (advancedFormItems.length > 0) { + tabs.push(advancedTab); + } + var body = { + type: 'tabpanel', + tabs: tabs + }; + var win = editor.windowManager.open({ + title: 'Insert/Edit Media', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var serviceData = unwrap(api.getData()); + submitForm(currentData.get(), serviceData, editor); + api.close(); + }, + onChange: function (api, detail) { + switch (detail.name) { + case 'source': + handleSource(currentData.get(), api); + break; + case 'embed': + handleEmbed(api); + break; + case 'dimensions': + case 'altsource': + case 'poster': + handleUpdate(api, detail.name); + break; + } + currentData.set(unwrap(api.getData())); + }, + initialData: initialData + }); + }; + + var get$1 = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + return { showDialog: showDialog$1 }; + }; + + var register = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + editor.addCommand('mceMedia', showDialog$1); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$8 = tinymce.util.Tools.resolve('tinymce.Env'); + + var sanitize = function (editor, html) { + if (shouldFilterHtml(editor) === false) { + return html; + } + var writer = global$5(); + var blocked; + global$3({ + validate: false, + allow_conditional_comments: false, + comment: function (text) { + writer.comment(text); + }, + cdata: function (text) { + writer.cdata(text); + }, + text: function (text, raw) { + writer.text(text, raw); + }, + start: function (name, attrs, empty) { + blocked = true; + if (name === 'script' || name === 'noscript' || name === 'svg') { + return; + } + for (var i = attrs.length - 1; i >= 0; i--) { + var attrName = attrs[i].name; + if (attrName.indexOf('on') === 0) { + delete attrs.map[attrName]; + attrs.splice(i, 1); + } + if (attrName === 'style') { + attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); + } + } + writer.start(name, attrs, empty); + blocked = false; + }, + end: function (name) { + if (blocked) { + return; + } + writer.end(name); + } + }, global$4({})).parse(html); + return writer.getContent(); + }; + + var createPlaceholderNode = function (editor, node) { + var name = node.name; + var placeHolder = new global$7('img', 1); + placeHolder.shortEnded = true; + retainAttributesAndInnerHtml(editor, node, placeHolder); + placeHolder.attr({ + 'width': node.attr('width') || '300', + 'height': node.attr('height') || (name === 'audio' ? '30' : '150'), + 'style': node.attr('style'), + 'src': global$8.transparentSrc, + 'data-mce-object': name, + 'class': 'mce-object mce-object-' + name + }); + return placeHolder; + }; + var createPreviewIframeNode = function (editor, node) { + var name = node.name; + var previewWrapper = new global$7('span', 1); + previewWrapper.attr({ + 'contentEditable': 'false', + 'style': node.attr('style'), + 'data-mce-object': name, + 'class': 'mce-preview-object mce-object-' + name + }); + retainAttributesAndInnerHtml(editor, node, previewWrapper); + var previewNode = new global$7(name, 1); + previewNode.attr({ + src: node.attr('src'), + allowfullscreen: node.attr('allowfullscreen'), + style: node.attr('style'), + class: node.attr('class'), + width: node.attr('width'), + height: node.attr('height'), + frameborder: '0' + }); + var shimNode = new global$7('span', 1); + shimNode.attr('class', 'mce-shim'); + previewWrapper.append(previewNode); + previewWrapper.append(shimNode); + return previewWrapper; + }; + var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { + var attrName; + var attrValue; + var ai; + var attribs = sourceNode.attributes; + ai = attribs.length; + while (ai--) { + attrName = attribs[ai].name; + attrValue = attribs[ai].value; + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') { + if (attrName === 'data' || attrName === 'src') { + attrValue = editor.convertURL(attrValue, attrName); + } + targetNode.attr('data-mce-p-' + attrName, attrValue); + } + } + var innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; + if (innerHtml) { + targetNode.attr('data-mce-html', escape(sanitize(editor, innerHtml))); + targetNode.firstChild = null; + } + }; + var isPageEmbedWrapper = function (node) { + var nodeClass = node.attr('class'); + return nodeClass && /\btiny-pageembed\b/.test(nodeClass); + }; + var isWithinEmbedWrapper = function (node) { + while (node = node.parent) { + if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) { + return true; + } + } + return false; + }; + var placeHolderConverter = function (editor) { + return function (nodes) { + var i = nodes.length; + var node; + var videoScript; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + if (node.parent.attr('data-mce-object')) { + continue; + } + if (node.name === 'script') { + videoScript = getVideoScriptMatch(getScripts(editor), node.attr('src')); + if (!videoScript) { + continue; + } + } + if (videoScript) { + if (videoScript.width) { + node.attr('width', videoScript.width.toString()); + } + if (videoScript.height) { + node.attr('height', videoScript.height.toString()); + } + } + if (node.name === 'iframe' && hasLiveEmbeds(editor) && global$8.ceFalse) { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPreviewIframeNode(editor, node)); + } + } else { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPlaceholderNode(editor, node)); + } + } + } + }; + }; + + var setup = function (editor) { + editor.on('preInit', function () { + var specialElements = editor.schema.getSpecialElements(); + global$1.each('video audio iframe object'.split(' '), function (name) { + specialElements[name] = new RegExp(']*>', 'gi'); + }); + var boolAttrs = editor.schema.getBoolAttrs(); + global$1.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { + boolAttrs[name] = {}; + }); + editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', placeHolderConverter(editor)); + editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { + var i = nodes.length; + var node; + var realElm; + var ai; + var attribs; + var innerHtml; + var innerNode; + var realElmName; + var className; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + realElmName = node.attr(name); + realElm = new global$7(realElmName, 1); + if (realElmName !== 'audio' && realElmName !== 'script') { + className = node.attr('class'); + if (className && className.indexOf('mce-preview-object') !== -1) { + realElm.attr({ + width: node.firstChild.attr('width'), + height: node.firstChild.attr('height') + }); + } else { + realElm.attr({ + width: node.attr('width'), + height: node.attr('height') + }); + } + } + realElm.attr({ style: node.attr('style') }); + attribs = node.attributes; + ai = attribs.length; + while (ai--) { + var attrName = attribs[ai].name; + if (attrName.indexOf('data-mce-p-') === 0) { + realElm.attr(attrName.substr(11), attribs[ai].value); + } + } + if (realElmName === 'script') { + realElm.attr('type', 'text/javascript'); + } + innerHtml = node.attr('data-mce-html'); + if (innerHtml) { + innerNode = new global$7('#text', 3); + innerNode.raw = true; + innerNode.value = sanitize(editor, unescape(innerHtml)); + realElm.append(innerNode); + } + node.replace(realElm); + } + }); + }); + editor.on('SetContent', function () { + editor.$('span.mce-preview-object').each(function (index, elm) { + var $elm = editor.$(elm); + if ($elm.find('span.mce-shim').length === 0) { + $elm.append(''); + } + }); + }); + }; + + var setup$1 = function (editor) { + editor.on('ResolveName', function (e) { + var name; + if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) { + e.name = name; + } + }); + }; + + var setup$2 = function (editor) { + editor.on('click keyup touchend', function () { + var selectedNode = editor.selection.getNode(); + if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { + if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { + selectedNode.setAttribute('data-mce-selected', '2'); + } + } + }); + editor.on('ObjectSelected', function (e) { + var objectType = e.target.getAttribute('data-mce-object'); + if (objectType === 'audio' || objectType === 'script') { + e.preventDefault(); + } + }); + editor.on('ObjectResized', function (e) { + var target = e.target; + var html; + if (target.getAttribute('data-mce-object')) { + html = target.getAttribute('data-mce-html'); + if (html) { + html = unescape(html); + target.setAttribute('data-mce-html', escape(updateHtml(html, { + width: String(e.width), + height: String(e.height) + }))); + } + } + }); + }; + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('media', { + tooltip: 'Insert/edit media', + icon: 'embed', + onAction: function () { + editor.execCommand('mceMedia'); + }, + onSetup: stateSelectorAdapter(editor, [ + 'img[data-mce-object]', + 'span[data-mce-object]', + 'div[data-ephox-embed-iri]' + ]) + }); + editor.ui.registry.addMenuItem('media', { + icon: 'embed', + text: 'Media...', + onAction: function () { + editor.execCommand('mceMedia'); + } + }); + }; + + function Plugin () { + global.add('media', function (editor) { + register(editor); + register$1(editor); + setup$1(editor); + setup(editor); + setup$2(editor); + return get$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/TugasAkhir/vendors/tinymce/plugins/media/plugin.min.js b/TugasAkhir/vendors/tinymce/plugins/media/plugin.min.js new file mode 100644 index 0000000..a540a82 --- /dev/null +++ b/TugasAkhir/vendors/tinymce/plugins/media/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,t,r,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),p=function(){return(p=Object.assign||function(e){for(var t,r=1,n=arguments.length;r"):"application/x-shockwave-flash"===n.sourcemime?(l='',s.poster&&(l+=''),l+=""):-1!==n.sourcemime.indexOf("audio")?(c=n,(u=h)?u(c):'"):"script"===n.type?' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + var previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; + return previewHtml; + }; + + var open = function (editor) { + var content = getPreviewHtml(editor); + var dataApi = editor.windowManager.open({ + title: 'Preview', + size: 'large', + body: { + type: 'panel', + items: [{ + name: 'preview', + type: 'iframe', + sandboxed: true + }] + }, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: { preview: content } + }); + dataApi.focus('close'); + }; + + var register = function (editor) { + editor.addCommand('mcePreview', function () { + open(editor); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('preview', { + icon: 'preview', + tooltip: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + editor.ui.registry.addMenuItem('preview', { + icon: 'preview', + text: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + }; + + function Plugin () { + global.add('preview', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/TugasAkhir/vendors/tinymce/plugins/preview/plugin.min.js b/TugasAkhir/vendors/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 0000000..861aacf --- /dev/null +++ b/TugasAkhir/vendors/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.Env"),w=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(e){var t=function(t){var n="",i=t.dom.encode,e=t.getParam("content_style","","string");n+='',e&&(n+='");var o=t.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"";w.each(t.contentCSS,function(e){n+='"});var r,a,c,s,d,m,l,y=-1===(s=(r=t).getParam("body_id","tinymce","string")).indexOf("=")?s:(c=(a=r).getParam("body_id","","hash"))[a.id]||c,u=-1===(l=(d=t).getParam("body_class","","string")).indexOf("=")?l:(m=d).getParam("body_class","","hash")[m.id]||"",v=' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + html = '' + '' + '' + '' + contentCssEntries_1 + preventClicksOnLinksScript + '' + '' + html + '' + ''; + } + return replaceTemplateValues(html, getPreviewReplaceValues(editor)); + }; + var open = function (editor, templateList) { + var createTemplates = function () { + if (!templateList || templateList.length === 0) { + var message = editor.translate('No templates defined.'); + editor.notificationManager.open({ + text: message, + type: 'info' + }); + return Optional.none(); + } + return Optional.from(global$1.map(templateList, function (template, index) { + var isUrlTemplate = function (t) { + return t.url !== undefined; + }; + return { + selected: index === 0, + text: template.title, + value: { + url: isUrlTemplate(template) ? Optional.from(template.url) : Optional.none(), + content: !isUrlTemplate(template) ? Optional.from(template.content) : Optional.none(), + description: template.description + } + }; + })); + }; + var createSelectBoxItems = function (templates) { + return map(templates, function (t) { + return { + text: t.text, + value: t.text + }; + }); + }; + var findTemplate = function (templates, templateTitle) { + return find(templates, function (t) { + return t.text === templateTitle; + }); + }; + var loadFailedAlert = function (api) { + editor.windowManager.alert('Could not load the specified template.', function () { + return api.focus('template'); + }); + }; + var getTemplateContent = function (t) { + return new global$4(function (resolve, reject) { + t.value.url.fold(function () { + return resolve(t.value.content.getOr('')); + }, function (url) { + return global$2.send({ + url: url, + success: function (html) { + resolve(html); + }, + error: function (e) { + reject(e); + } + }); + }); + }); + }; + var onChange = function (templates, updateDialog) { + return function (api, change) { + if (change.name === 'template') { + var newTemplateTitle = api.getData().template; + findTemplate(templates, newTemplateTitle).each(function (t) { + api.block('Loading...'); + getTemplateContent(t).then(function (previewHtml) { + updateDialog(api, t, previewHtml); + }).catch(function () { + updateDialog(api, t, ''); + api.disable('save'); + loadFailedAlert(api); + }); + }); + } + }; + }; + var onSubmit = function (templates) { + return function (api) { + var data = api.getData(); + findTemplate(templates, data.template).each(function (t) { + getTemplateContent(t).then(function (previewHtml) { + insertTemplate(editor, false, previewHtml); + api.close(); + }).catch(function () { + api.disable('save'); + loadFailedAlert(api); + }); + }); + }; + }; + var openDialog = function (templates) { + var selectBoxItems = createSelectBoxItems(templates); + var buildDialogSpec = function (bodyItems, initialData) { + return { + title: 'Insert Template', + size: 'large', + body: { + type: 'panel', + items: bodyItems + }, + initialData: initialData, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: onSubmit(templates), + onChange: onChange(templates, updateDialog) + }; + }; + var updateDialog = function (dialogApi, template, previewHtml) { + var content = getPreviewContent(editor, previewHtml); + var bodyItems = [ + { + type: 'selectbox', + name: 'template', + label: 'Templates', + items: selectBoxItems + }, + { + type: 'htmlpanel', + html: '

' + htmlEscape(template.value.description) + '

' + }, + { + label: 'Preview', + type: 'iframe', + name: 'preview', + sandboxed: false + } + ]; + var initialData = { + template: template.text, + preview: content + }; + dialogApi.unblock(); + dialogApi.redial(buildDialogSpec(bodyItems, initialData)); + dialogApi.focus('template'); + }; + var dialogApi = editor.windowManager.open(buildDialogSpec([], { + template: '', + preview: '' + })); + dialogApi.block('Loading...'); + getTemplateContent(templates[0]).then(function (previewHtml) { + updateDialog(dialogApi, templates[0], previewHtml); + }).catch(function () { + updateDialog(dialogApi, templates[0], ''); + dialogApi.disable('save'); + loadFailedAlert(dialogApi); + }); + }; + var optTemplates = createTemplates(); + optTemplates.each(openDialog); + }; + + var showDialog = function (editor) { + return function (templates) { + open(editor, templates); + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addButton('template', { + icon: 'template', + tooltip: 'Insert template', + onAction: createTemplateList(editor, showDialog(editor)) + }); + editor.ui.registry.addMenuItem('template', { + icon: 'template', + text: 'Insert template...', + onAction: createTemplateList(editor, showDialog(editor)) + }); + }; + + function Plugin () { + global.add('template', function (editor) { + register$1(editor); + register(editor); + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/TugasAkhir/vendors/tinymce/plugins/template/plugin.min.js b/TugasAkhir/vendors/tinymce/plugins/template/plugin.min.js new file mode 100644 index 0000000..d6bda48 --- /dev/null +++ b/TugasAkhir/vendors/tinymce/plugins/template/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(){},o=function(e){return function(){return e}};var n,r,a,c=o(!1),u=o(!0),_=tinymce.util.Tools.resolve("tinymce.util.Tools"),s=tinymce.util.Tools.resolve("tinymce.util.XHR"),i=function(e){return e.getParam("template_mdate_classes","mdate")},l=function(e){return e.getParam("template_replace_values")},f=function(e){return e.getParam("template_mdate_format",e.translate("%Y-%m-%d"))},m=function(e,t){if((e=""+e).length":">","&":"&","'":"'"},N=function(e){return e.replace(/["'<>&]/g,function(e){return(A(t=C,n=e)?O.from(t[n]):O.none()).getOr(e);var t,n})},I=function(M,t){var e=function(e){return function(e,t){for(var n=e.length,r=new Array(n),a=0;a")&&(o="",(c=r.getParam("content_style","","string"))&&(o+='"),u=r.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"",_.each(r.contentCSS,function(e){o+='"}),i=-1===(g=(p=r).getParam("body_class","","string")).indexOf("=")?g:(d=p).getParam("body_class","","hash")[d.id]||"",l=r.dom.encode,s='