From dc84b0ee96d2858249b8292bc0003daee152e973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Tue, 5 Dec 2023 16:00:32 +0700 Subject: [PATCH 01/16] Delete Cart model and its DAO --- .../io/hardingadonis/miu/dao/CartDAO.java | 17 --- .../miu/dao/impl/mysql/CartDAOMySQLImpl.java | 100 ------------------ .../hardingadonis/miu/services/Singleton.java | 4 - 3 files changed, 121 deletions(-) delete mode 100644 src/main/java/io/hardingadonis/miu/dao/CartDAO.java delete mode 100644 src/main/java/io/hardingadonis/miu/dao/impl/mysql/CartDAOMySQLImpl.java diff --git a/src/main/java/io/hardingadonis/miu/dao/CartDAO.java b/src/main/java/io/hardingadonis/miu/dao/CartDAO.java deleted file mode 100644 index 0ea636d3..00000000 --- a/src/main/java/io/hardingadonis/miu/dao/CartDAO.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.hardingadonis.miu.dao; - -import io.hardingadonis.miu.model.*; -import java.util.*; - -public interface CartDAO { - - public List getAll(int userID); - - public void insert(Cart obj); - - public void update(Cart obj); - - public void delete(int userID, int productID); - - public void deleteAll(int userID); -} diff --git a/src/main/java/io/hardingadonis/miu/dao/impl/mysql/CartDAOMySQLImpl.java b/src/main/java/io/hardingadonis/miu/dao/impl/mysql/CartDAOMySQLImpl.java deleted file mode 100644 index 3bea3069..00000000 --- a/src/main/java/io/hardingadonis/miu/dao/impl/mysql/CartDAOMySQLImpl.java +++ /dev/null @@ -1,100 +0,0 @@ -package io.hardingadonis.miu.dao.impl.mysql; - -import io.hardingadonis.miu.dao.*; -import io.hardingadonis.miu.model.*; -import io.hardingadonis.miu.services.*; -import java.sql.*; -import java.util.*; - -public class CartDAOMySQLImpl implements CartDAO { - - @Override - public List getAll(int userID) { - List list = new ArrayList<>(); - - try { - Connection conn = Singleton.dbContext.getConnection(); - - PreparedStatement smt = conn.prepareStatement("SELECT * FROM cart WHERE user_id = ?"); - smt.setInt(1, userID); - - ResultSet rs = smt.executeQuery(); - - while (rs.next()) { - int productID = rs.getInt("product_id"); - int amount = rs.getInt("amount"); - - list.add(new Cart(userID, productID, amount)); - } - - Singleton.dbContext.closeConnection(conn); - } catch (SQLException ex) { - System.err.println(ex.getMessage()); - } - - return list; - } - - @Override - public void insert(Cart obj) { - try { - Connection conn = Singleton.dbContext.getConnection(); - - PreparedStatement smt = conn.prepareStatement("INSERT INTO cart(user_id, product_id, amount) VALUES (?, ?, ?)"); - smt.setInt(1, obj.getUserID()); - smt.setInt(2, obj.getProductID()); - smt.setInt(3, obj.getAmount()); - - smt.executeUpdate(); - - Singleton.dbContext.closeConnection(conn); - } catch (SQLException ex) { - System.err.println(ex.getMessage()); - } - } - - @Override - public void update(Cart obj) { - try { - Connection conn = Singleton.dbContext.getConnection(); - - PreparedStatement smt = conn.prepareStatement("UPDATE cart SET amount WHERE user_id = ? AND product_id = ?"); - smt.setInt(1, obj.getAmount()); - smt.setInt(2, obj.getUserID()); - smt.setInt(3, obj.getProductID()); - - Singleton.dbContext.closeConnection(conn); - } catch (SQLException ex) { - System.err.println(ex.getMessage()); - } - } - - @Override - public void delete(int userID, int productID) { - try { - Connection conn = Singleton.dbContext.getConnection(); - - PreparedStatement smt = conn.prepareStatement("DELETE FROM cart WHERE user_id = ? AND product_id = ?"); - smt.setInt(1, userID); - smt.setInt(2, productID); - - Singleton.dbContext.closeConnection(conn); - } catch (SQLException ex) { - System.err.println(ex.getMessage()); - } - } - - @Override - public void deleteAll(int userID) { - try { - Connection conn = Singleton.dbContext.getConnection(); - - PreparedStatement smt = conn.prepareStatement("DELETE FROM cart WHERE user_id = ?"); - smt.setInt(1, userID); - - Singleton.dbContext.closeConnection(conn); - } catch (SQLException ex) { - System.err.println(ex.getMessage()); - } - } -} \ No newline at end of file diff --git a/src/main/java/io/hardingadonis/miu/services/Singleton.java b/src/main/java/io/hardingadonis/miu/services/Singleton.java index a3beebcd..e1f65ed8 100644 --- a/src/main/java/io/hardingadonis/miu/services/Singleton.java +++ b/src/main/java/io/hardingadonis/miu/services/Singleton.java @@ -13,8 +13,6 @@ public class Singleton { public static AdminDAO adminDAO; - public static CartDAO cartDAO; - public static CategoryDAO categoryDAO; public static OrderDAO orderDAO; @@ -32,8 +30,6 @@ public class Singleton { adminDAO = new AdminDAOMySQLImpl(); - cartDAO = new CartDAOMySQLImpl(); - categoryDAO = new CategoryDAOMySQLImpl(); orderDAO = new OrderDAOMySQLImpl(); From 247b4ab5005f16ea86dd7973b7109c4edab2333a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Tue, 5 Dec 2023 16:07:12 +0700 Subject: [PATCH 02/16] Add ``VNPayConfig`` config class --- .../miu/services/vnpay/VNPayConfig.java | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java diff --git a/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java b/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java new file mode 100644 index 00000000..76d91181 --- /dev/null +++ b/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java @@ -0,0 +1,116 @@ +package io.hardingadonis.miu.services.vnpay; + +import java.io.*; +import java.nio.charset.*; +import java.security.*; +import java.util.*; +import javax.crypto.*; +import javax.crypto.spec.*; +import javax.servlet.http.*; + +public class VNPayConfig { + + public static String vnp_PayUrl = "https://sandbox.vnpayment.vn/paymentv2/vpcpay.html"; + public static String vnp_ReturnUrl = "http://localhost:8080/vnpay_jsp/vnpay_return.jsp"; + public static String vnp_TmnCode = "AWLQQBYH"; + public static String secretKey = "NKSWPEIWRRCYZXROOQJZINVLZZKCOAOH"; + public static String vnp_ApiUrl = "https://sandbox.vnpayment.vn/merchant_webapi/api/transaction"; + + public static String md5(String message) { + String digest = null; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] hash = md.digest(message.getBytes("UTF-8")); + StringBuilder sb = new StringBuilder(2 * hash.length); + for (byte b : hash) { + sb.append(String.format("%02x", b & 0xff)); + } + digest = sb.toString(); + } catch (UnsupportedEncodingException | NoSuchAlgorithmException ex) { + digest = ""; + } + return digest; + } + + public static String Sha256(String message) { + String digest = null; + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] hash = md.digest(message.getBytes("UTF-8")); + StringBuilder sb = new StringBuilder(2 * hash.length); + for (byte b : hash) { + sb.append(String.format("%02x", b & 0xff)); + } + digest = sb.toString(); + } catch (UnsupportedEncodingException | NoSuchAlgorithmException ex) { + digest = ""; + } + return digest; + } + + public static String hashAllFields(Map fields) { + List fieldNames = new ArrayList(fields.keySet()); + Collections.sort(fieldNames); + StringBuilder sb = new StringBuilder(); + Iterator itr = fieldNames.iterator(); + while (itr.hasNext()) { + String fieldName = (String) itr.next(); + String fieldValue = (String) fields.get(fieldName); + if ((fieldValue != null) && (fieldValue.length() > 0)) { + sb.append(fieldName); + sb.append("="); + sb.append(fieldValue); + } + if (itr.hasNext()) { + sb.append("&"); + } + } + return hmacSHA512(secretKey, sb.toString()); + } + + public static String hmacSHA512(final String key, final String data) { + try { + + if (key == null || data == null) { + throw new NullPointerException(); + } + final Mac hmac512 = Mac.getInstance("HmacSHA512"); + byte[] hmacKeyBytes = key.getBytes(); + final SecretKeySpec secretKey = new SecretKeySpec(hmacKeyBytes, "HmacSHA512"); + hmac512.init(secretKey); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + byte[] result = hmac512.doFinal(dataBytes); + StringBuilder sb = new StringBuilder(2 * result.length); + for (byte b : result) { + sb.append(String.format("%02x", b & 0xff)); + } + return sb.toString(); + + } catch (Exception ex) { + return ""; + } + } + + public static String getIpAddress(HttpServletRequest request) { + String ipAdress; + try { + ipAdress = request.getHeader("X-FORWARDED-FOR"); + if (ipAdress == null) { + ipAdress = request.getRemoteAddr(); + } + } catch (Exception e) { + ipAdress = "Invalid IP:" + e.getMessage(); + } + return ipAdress; + } + + public static String getRandomNumber(int len) { + Random rnd = new Random(); + String chars = "0123456789"; + StringBuilder sb = new StringBuilder(len); + for (int i = 0; i < len; i++) { + sb.append(chars.charAt(rnd.nextInt(chars.length()))); + } + return sb.toString(); + } +} From 5b8fd2f1ec7d854972221e5ba2c673d67232a85e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Tue, 5 Dec 2023 16:11:29 +0700 Subject: [PATCH 03/16] Update ``VNPayConfig`` class --- .../java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java b/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java index 76d91181..66d9e5f9 100644 --- a/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java +++ b/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java @@ -11,7 +11,7 @@ public class VNPayConfig { public static String vnp_PayUrl = "https://sandbox.vnpayment.vn/paymentv2/vpcpay.html"; - public static String vnp_ReturnUrl = "http://localhost:8080/vnpay_jsp/vnpay_return.jsp"; + public static String vnp_ReturnUrl = "/view/web/vnpay_jsp/vnpay_return.jsp"; public static String vnp_TmnCode = "AWLQQBYH"; public static String secretKey = "NKSWPEIWRRCYZXROOQJZINVLZZKCOAOH"; public static String vnp_ApiUrl = "https://sandbox.vnpayment.vn/merchant_webapi/api/transaction"; @@ -86,7 +86,7 @@ public static String hmacSHA512(final String key, final String data) { } return sb.toString(); - } catch (Exception ex) { + } catch (IllegalStateException | NullPointerException | InvalidKeyException | NoSuchAlgorithmException ex) { return ""; } } From fcb87cb9c4f2a72477659ccc3a7e0399e4acb226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Tue, 5 Dec 2023 22:57:32 +0700 Subject: [PATCH 04/16] Update checkout jsp page --- src/main/webapp/view/web/checkout.jsp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/webapp/view/web/checkout.jsp b/src/main/webapp/view/web/checkout.jsp index 648672f4..d4183f83 100644 --- a/src/main/webapp/view/web/checkout.jsp +++ b/src/main/webapp/view/web/checkout.jsp @@ -56,17 +56,17 @@
+ - - <%@include file="common/_footer.jsp" %> + <%@include file="common/_footer.jsp" %> - - - - + + + + \ No newline at end of file From f363b3b6387fbd4d9eb43c4d07086315305b3a69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Tue, 5 Dec 2023 23:01:43 +0700 Subject: [PATCH 05/16] Update checkout jsp page again --- src/main/webapp/view/web/checkout.jsp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/webapp/view/web/checkout.jsp b/src/main/webapp/view/web/checkout.jsp index d4183f83..1e421a88 100644 --- a/src/main/webapp/view/web/checkout.jsp +++ b/src/main/webapp/view/web/checkout.jsp @@ -60,13 +60,14 @@ + - <%@include file="common/_footer.jsp" %> + <%@include file="common/_footer.jsp" %> - - - - + + + + \ No newline at end of file From 943044a56a99a4386563682cf66772897b42ef5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Tue, 5 Dec 2023 23:11:22 +0700 Subject: [PATCH 06/16] Update cart jsp page --- src/main/webapp/view/web/cart.jsp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/webapp/view/web/cart.jsp b/src/main/webapp/view/web/cart.jsp index 73b59c65..3dd728e4 100644 --- a/src/main/webapp/view/web/cart.jsp +++ b/src/main/webapp/view/web/cart.jsp @@ -36,8 +36,9 @@ Không có sản phẩm nào
+
From 661cc68cf46f05d87412c93d66b6d2eae7b88519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Tue, 5 Dec 2023 23:11:38 +0700 Subject: [PATCH 07/16] Update VNPay Config class --- .../io/hardingadonis/miu/services/vnpay/VNPayConfig.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java b/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java index 66d9e5f9..3cf356d5 100644 --- a/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java +++ b/src/main/java/io/hardingadonis/miu/services/vnpay/VNPayConfig.java @@ -11,10 +11,10 @@ public class VNPayConfig { public static String vnp_PayUrl = "https://sandbox.vnpayment.vn/paymentv2/vpcpay.html"; - public static String vnp_ReturnUrl = "/view/web/vnpay_jsp/vnpay_return.jsp"; + public static String vnp_ReturnUrl = "checkout-success"; public static String vnp_TmnCode = "AWLQQBYH"; - public static String secretKey = "NKSWPEIWRRCYZXROOQJZINVLZZKCOAOH"; - public static String vnp_ApiUrl = "https://sandbox.vnpayment.vn/merchant_webapi/api/transaction"; + public static String vnp_HashSecret = "NKSWPEIWRRCYZXROOQJZINVLZZKCOAOH"; + public static String vnp_Url = "https://sandbox.vnpayment.vn/paymentv2/vpcpay.html"; public static String md5(String message) { String digest = null; @@ -65,7 +65,7 @@ public static String hashAllFields(Map fields) { sb.append("&"); } } - return hmacSHA512(secretKey, sb.toString()); + return hmacSHA512(vnp_HashSecret, sb.toString()); } public static String hmacSHA512(final String key, final String data) { From cb1ce5fa0094f70d56aa86bce2321c820677c5aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Tue, 5 Dec 2023 23:24:11 +0700 Subject: [PATCH 08/16] Add Checkout Success Servlet class --- .../web/CheckoutSuccessServlet.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/io/hardingadonis/miu/controller/web/CheckoutSuccessServlet.java diff --git a/src/main/java/io/hardingadonis/miu/controller/web/CheckoutSuccessServlet.java b/src/main/java/io/hardingadonis/miu/controller/web/CheckoutSuccessServlet.java new file mode 100644 index 00000000..aef891fc --- /dev/null +++ b/src/main/java/io/hardingadonis/miu/controller/web/CheckoutSuccessServlet.java @@ -0,0 +1,25 @@ +package io.hardingadonis.miu.controller.web; + +import java.io.*; +import javax.servlet.*; +import javax.servlet.annotation.*; +import javax.servlet.http.*; + +@WebServlet(name = "CheckoutSuccessServlet", urlPatterns = {"/checkout-success"}) +public class CheckoutSuccessServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + + HttpSession session = request.getSession(); + + if ((session.getAttribute("user") == null) || (session.getAttribute("order") == null) || (session.getAttribute("cart_cookie") == null)) { + response.sendRedirect("home"); + } + + request.getRequestDispatcher("/view/web/checkout-success.jsp").forward(request, response); + } +} From fe5bd9b43d74fa3a7c4306ae7fc0035b23396442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Tue, 5 Dec 2023 23:48:47 +0700 Subject: [PATCH 09/16] Add checkout success jsp page --- src/main/webapp/view/web/checkout-success.jsp | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/main/webapp/view/web/checkout-success.jsp diff --git a/src/main/webapp/view/web/checkout-success.jsp b/src/main/webapp/view/web/checkout-success.jsp new file mode 100644 index 00000000..234d1b9c --- /dev/null +++ b/src/main/webapp/view/web/checkout-success.jsp @@ -0,0 +1,84 @@ +<%@ page contentType="text/html" pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + +<%@page import="io.hardingadonis.miu.model.Product"%> +<%@page import="io.hardingadonis.miu.model.Order"%> +<%@page import="io.hardingadonis.miu.model.OrderData"%> +<%@page import="org.json.simple.JSONObject"%> +<%@page import="org.json.simple.parser.JSONParser"%> +<%@page import="org.json.simple.parser.ParseException"%> + + + + + + + + + + + + + + + Miu Shop | Thanh toán thành công + + + + <%@include file="common/_header.jsp" %> + + <% + Order order = (Order) session.getAttribute("order"); + String cartCookie = (String) session.getAttribute("cart_cookie"); + int orderID = Singleton.orderDAO.insert(order); + + try { + JSONObject data = (JSONObject) new JSONParser().parse(cartCookie); + + for (Object keyStr : data.keySet()) { + Object valueStr = data.get(keyStr); + int value = Integer.parseInt(valueStr.toString()); + int key = Integer.parseInt(keyStr.toString()); + + Singleton.orderDataDAO.insert(new OrderData(orderID, key, value)); + + Product product = Singleton.productDAO.get(key); + product.setAmount(product.getAmount() - value); + + Singleton.productDAO.update(product); + } + + Cookie cookie = new Cookie("cart", ""); + cookie.setMaxAge(0); + response.addCookie(cookie); + } catch (ParseException ex) { + System.err.println(ex.getMessage()); + } + + session.setAttribute("order", null); + session.setAttribute("cart_cookie", null); + %> +
+
+
+
+ Thanh toán giỏ hàng thành công +
+
+
+ +
+
+
+ + <%@include file="common/_footer.jsp" %> + + + + + + + + \ No newline at end of file From a709e6558b7ed3f14c045b2c28606bf2081e3ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Tue, 5 Dec 2023 23:49:02 +0700 Subject: [PATCH 10/16] Update Checkout Servlet --- .../miu/controller/web/CheckoutServlet.java | 112 +++++++++++++----- 1 file changed, 82 insertions(+), 30 deletions(-) diff --git a/src/main/java/io/hardingadonis/miu/controller/web/CheckoutServlet.java b/src/main/java/io/hardingadonis/miu/controller/web/CheckoutServlet.java index 2963b63d..4acece5c 100644 --- a/src/main/java/io/hardingadonis/miu/controller/web/CheckoutServlet.java +++ b/src/main/java/io/hardingadonis/miu/controller/web/CheckoutServlet.java @@ -3,7 +3,12 @@ import io.hardingadonis.miu.model.*; import io.hardingadonis.miu.model.detail.*; import io.hardingadonis.miu.services.*; +import io.hardingadonis.miu.services.vnpay.*; import java.io.*; +import java.net.*; +import java.nio.charset.*; +import java.text.*; +import java.util.*; import javax.servlet.*; import javax.servlet.annotation.*; import javax.servlet.http.*; @@ -39,21 +44,24 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); - User user = (User) request.getSession().getAttribute("user"); + HttpSession session = request.getSession(); + + User user = (User) session.getAttribute("user"); String cartCookie = getCartCookie(request); long totalPrice = getTotalPrice(cartCookie); String address = request.getParameter("address"); Payment payment = Payment.create(request.getParameter("payment")); - if (payment == Payment.COD) { - Order order = new Order(user.getID(), address, totalPrice, payment, OrderStatus.PROCESSING); + Order order = new Order(user.getID(), address, totalPrice, payment, OrderStatus.PROCESSING); - int id = Singleton.orderDAO.insert(order); + session.setAttribute("order", order); + session.setAttribute("cart_cookie", cartCookie); - moveCartToOrderData(id, cartCookie, response); - - response.sendRedirect("purchase-history"); + if (payment == Payment.COD) { + response.sendRedirect("checkout-success"); + } else { + handleVNPayCheckout(request, response, (int) totalPrice); } } @@ -81,38 +89,82 @@ private static long getTotalPrice(String cartData) { Product product = Singleton.productDAO.get(key); total += product.getPrice() * value; } - } catch (ParseException ex) { + } catch (org.json.simple.parser.ParseException ex) { System.err.println(ex.getMessage()); } return total; } - private static void moveCartToOrderData(int id, String cartData, HttpServletResponse response) { - try { - JSONObject data = (JSONObject) new JSONParser().parse(cartData); - - for (Object keyStr : data.keySet()) { - Object valueStr = data.get(keyStr); - int value = Integer.parseInt(valueStr.toString()); - int key = Integer.parseInt(keyStr.toString()); - - Singleton.orderDataDAO.insert(new OrderData(id, key, value)); - updateProductAmoutAferCheckout(key, value); + private static void handleVNPayCheckout(HttpServletRequest request, HttpServletResponse response, int totalPrice) + throws UnsupportedEncodingException, IOException { + String vnp_Version = "2.1.0"; + String vnp_Command = "pay"; + String vnp_OrderInfo = "Miu Shop - Thanh toán đơn hàng"; + String orderType = "other"; + String vnp_TxnRef = VNPayConfig.getRandomNumber(8); + String vnp_IpAddr = VNPayConfig.getIpAddress(request); + String vnp_TmnCode = VNPayConfig.vnp_TmnCode; + + Map vnp_Params = new HashMap<>(); + vnp_Params.put("vnp_Version", vnp_Version); + vnp_Params.put("vnp_Command", vnp_Command); + vnp_Params.put("vnp_TmnCode", vnp_TmnCode); + vnp_Params.put("vnp_Amount", String.valueOf(totalPrice * 100)); + vnp_Params.put("vnp_CurrCode", "VND"); + vnp_Params.put("vnp_BankCode", ""); + vnp_Params.put("vnp_TxnRef", vnp_TxnRef); + vnp_Params.put("vnp_OrderInfo", vnp_OrderInfo); + vnp_Params.put("vnp_OrderType", orderType); + vnp_Params.put("vnp_Locale", "vn"); + vnp_Params.put("vnp_ReturnUrl", getDomainWithPortAndContextPath(request) + VNPayConfig.vnp_ReturnUrl); + vnp_Params.put("vnp_IpAddr", vnp_IpAddr); + + Calendar cld = Calendar.getInstance(TimeZone.getTimeZone("Etc/GMT+7")); + SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); + String vnp_CreateDate = formatter.format(cld.getTime()); + + vnp_Params.put("vnp_CreateDate", vnp_CreateDate); + cld.add(Calendar.MINUTE, 15); + String vnp_ExpireDate = formatter.format(cld.getTime()); + vnp_Params.put("vnp_ExpireDate", vnp_ExpireDate); + + List fieldNames = new ArrayList(vnp_Params.keySet()); + Collections.sort(fieldNames); + StringBuilder hashData = new StringBuilder(); + StringBuilder query = new StringBuilder(); + Iterator itr = fieldNames.iterator(); + + while (itr.hasNext()) { + String fieldName = (String) itr.next(); + String fieldValue = (String) vnp_Params.get(fieldName); + + if ((fieldValue != null) && (fieldValue.length() > 0)) { + hashData.append(fieldName); + hashData.append('='); + hashData.append(URLEncoder.encode(fieldValue, StandardCharsets.US_ASCII.toString())); + + query.append(URLEncoder.encode(fieldName, StandardCharsets.US_ASCII.toString())); + query.append('='); + query.append(URLEncoder.encode(fieldValue, StandardCharsets.US_ASCII.toString())); + + if (itr.hasNext()) { + query.append('&'); + hashData.append('&'); + } } - - Cookie cookie = new Cookie("cart", ""); - cookie.setMaxAge(0); - response.addCookie(cookie); - } catch (ParseException ex) { - System.err.println(ex.getMessage()); } - } - private static void updateProductAmoutAferCheckout(int productID, int amount) { - Product product = Singleton.productDAO.get(productID); - product.setAmount(product.getAmount() - amount); + String queryUrl = query.toString(); + String vnp_SecureHash = VNPayConfig.hmacSHA512(VNPayConfig.vnp_HashSecret, hashData.toString()); + queryUrl += "&vnp_SecureHash=" + vnp_SecureHash; + String paymentUrl = VNPayConfig.vnp_PayUrl + "?" + queryUrl; + + response.sendRedirect(paymentUrl); + } - Singleton.productDAO.update(product); + private static String getDomainWithPortAndContextPath(HttpServletRequest request) + throws MalformedURLException { + return "http://" + new URL(request.getRequestURL().toString()).getHost() + ":" + request.getServerPort() + "/miu/"; } } From 7522e99979dbc5cfc5a3d8784b7f6e35609f93ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Wed, 6 Dec 2023 14:33:11 +0700 Subject: [PATCH 11/16] Handle the cart when checkout with vnpay fail --- src/main/webapp/view/web/checkout-success.jsp | 93 ++++++++++++------- 1 file changed, 57 insertions(+), 36 deletions(-) diff --git a/src/main/webapp/view/web/checkout-success.jsp b/src/main/webapp/view/web/checkout-success.jsp index 234d1b9c..4808483b 100644 --- a/src/main/webapp/view/web/checkout-success.jsp +++ b/src/main/webapp/view/web/checkout-success.jsp @@ -27,56 +27,77 @@ <%@include file="common/_header.jsp" %> - <% - Order order = (Order) session.getAttribute("order"); - String cartCookie = (String) session.getAttribute("cart_cookie"); - int orderID = Singleton.orderDAO.insert(order); + + <% + Order order = (Order) session.getAttribute("order"); + String cartCookie = (String) session.getAttribute("cart_cookie"); + int orderID = Singleton.orderDAO.insert(order); - try { - JSONObject data = (JSONObject) new JSONParser().parse(cartCookie); + try { + JSONObject data = (JSONObject) new JSONParser().parse(cartCookie); - for (Object keyStr : data.keySet()) { - Object valueStr = data.get(keyStr); - int value = Integer.parseInt(valueStr.toString()); - int key = Integer.parseInt(keyStr.toString()); + for (Object keyStr : data.keySet()) { + Object valueStr = data.get(keyStr); + int value = Integer.parseInt(valueStr.toString()); + int key = Integer.parseInt(keyStr.toString()); - Singleton.orderDataDAO.insert(new OrderData(orderID, key, value)); + Singleton.orderDataDAO.insert(new OrderData(orderID, key, value)); - Product product = Singleton.productDAO.get(key); - product.setAmount(product.getAmount() - value); + Product product = Singleton.productDAO.get(key); + product.setAmount(product.getAmount() - value); - Singleton.productDAO.update(product); + Singleton.productDAO.update(product); + } + + Cookie cookie = new Cookie("cart", ""); + cookie.setMaxAge(0); + response.addCookie(cookie); + } catch (ParseException ex) { + System.err.println(ex.getMessage()); } - Cookie cookie = new Cookie("cart", ""); - cookie.setMaxAge(0); - response.addCookie(cookie); - } catch (ParseException ex) { - System.err.println(ex.getMessage()); - } - - session.setAttribute("order", null); - session.setAttribute("cart_cookie", null); - %> -
-
-
-
- Thanh toán giỏ hàng thành công -
-
-
-
- Đến lịch sử mua hàng + session.setAttribute("order", null); + session.setAttribute("cart_cookie", null); + %> +
+
+
+
+ Thanh toán giỏ hàng thành công +
+
+
+ +
+
+
+ + + + <% + session.setAttribute("order", null); + %> +
+
+
+
+ Thanh toán giỏ hàng không thành công +
+
+
+
-
+ <%@include file="common/_footer.jsp" %> - From a8157092a87745ee1f29c24f1d52aa677f92ca64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Wed, 6 Dec 2023 14:50:04 +0700 Subject: [PATCH 12/16] Handle the checkout page when user has no deilivery address --- src/main/webapp/view/web/add-address.jsp | 2 +- src/main/webapp/view/web/change-password.jsp | 2 +- src/main/webapp/view/web/checkout.jsp | 14 +++++++++++--- src/main/webapp/view/web/profile.jsp | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/webapp/view/web/add-address.jsp b/src/main/webapp/view/web/add-address.jsp index 08421089..32c307cd 100644 --- a/src/main/webapp/view/web/add-address.jsp +++ b/src/main/webapp/view/web/add-address.jsp @@ -81,7 +81,7 @@
${error_msg}
- +
diff --git a/src/main/webapp/view/web/change-password.jsp b/src/main/webapp/view/web/change-password.jsp index cbc1204c..eb7c68f3 100644 --- a/src/main/webapp/view/web/change-password.jsp +++ b/src/main/webapp/view/web/change-password.jsp @@ -62,7 +62,7 @@
${error_msg}
- +
diff --git a/src/main/webapp/view/web/checkout.jsp b/src/main/webapp/view/web/checkout.jsp index 1e421a88..2e452bcd 100644 --- a/src/main/webapp/view/web/checkout.jsp +++ b/src/main/webapp/view/web/checkout.jsp @@ -53,9 +53,17 @@
-
- -
+ +
+ +
+
+ + + + diff --git a/src/main/webapp/view/web/profile.jsp b/src/main/webapp/view/web/profile.jsp index cf89ba65..a8042e99 100644 --- a/src/main/webapp/view/web/profile.jsp +++ b/src/main/webapp/view/web/profile.jsp @@ -77,7 +77,7 @@
- +
From 6933c2444df5cdea6ade9afb5d5272936e94a07f Mon Sep 17 00:00:00 2001 From: yuhtnguyen Date: Wed, 6 Dec 2023 21:50:15 +0700 Subject: [PATCH 13/16] thuy_loginAdmin --- database/setup.sql | 2 +- .../miu/controller/admin/LoginAdmin.java | 54 +++++++ .../webapp/assets/css/admin/loginAdmin.css | 146 ++++++++++++++++++ ...8f077c928fc477e02ed34eda6f26be1ac5f195.jpg | Bin 0 -> 43907 bytes src/main/webapp/assets/js/admin/loginAdmin.js | 27 ++++ src/main/webapp/view/admin/login-admin.jsp | 53 +++++++ 6 files changed, 281 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/hardingadonis/miu/controller/admin/LoginAdmin.java create mode 100644 src/main/webapp/assets/css/admin/loginAdmin.css create mode 100644 src/main/webapp/assets/images/covers/c6419bc9eefa9633ddf424d5ea8f077c928fc477e02ed34eda6f26be1ac5f195.jpg create mode 100644 src/main/webapp/assets/js/admin/loginAdmin.js create mode 100644 src/main/webapp/view/admin/login-admin.jsp diff --git a/database/setup.sql b/database/setup.sql index f2a2c7c7..4cd074f3 100644 --- a/database/setup.sql +++ b/database/setup.sql @@ -90,7 +90,7 @@ CREATE TABLE `order` ( `payment` enum('cod','vnpay') NOT NULL COMMENT 'Lựa chọn phương thức thanh toán', `status` enum('processing','shipping','done','canceled') NOT NULL COMMENT 'Tình trạng đơn hàng', `create_at` datetime DEFAULT NULL, - `update_at` datetime DEFAULT NULL, + `update_at` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- -------------------------------------------------------- diff --git a/src/main/java/io/hardingadonis/miu/controller/admin/LoginAdmin.java b/src/main/java/io/hardingadonis/miu/controller/admin/LoginAdmin.java new file mode 100644 index 00000000..f64ec583 --- /dev/null +++ b/src/main/java/io/hardingadonis/miu/controller/admin/LoginAdmin.java @@ -0,0 +1,54 @@ +package io.hardingadonis.miu.controller.admin; + +import io.hardingadonis.miu.model.Admin; +import io.hardingadonis.miu.services.Hash; +import io.hardingadonis.miu.services.Singleton; +import java.io.*; +import javax.servlet.*; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +@WebServlet(name = "LoginAdmin", urlPatterns = {"/admin/login"}) +public class LoginAdmin extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + request.getRequestDispatcher("/view/admin/login-admin.jsp").forward(request, response); + + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + + String username = request.getParameter("username"); + String password = request.getParameter("password"); + + Admin ad = Singleton.adminDAO.get(username); + + if (ad != null && ad.getHashedPassword().equals(Hash.SHA256(password))) { + HttpSession session = request.getSession(); + session.setAttribute("admin", ad); + response.sendRedirect(request.getContextPath() + "/admin"); + return; + } + + String errorMsg = "Sai mật khẩu!"; + + if (ad == null) { + errorMsg = "Tài khoản không tồn tại!"; + username = null; + } + + request.setAttribute("username", username); + request.setAttribute("errorMsg", errorMsg); + + this.doGet(request, response); + } + +} diff --git a/src/main/webapp/assets/css/admin/loginAdmin.css b/src/main/webapp/assets/css/admin/loginAdmin.css new file mode 100644 index 00000000..a76c3157 --- /dev/null +++ b/src/main/webapp/assets/css/admin/loginAdmin.css @@ -0,0 +1,146 @@ +* { + font-family: 'Poppins', sans-serif; +} + +.wrapper { + background-color: #ececec; + padding: 0 20px +} + +.main { + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; +} + +.row { + width: 900px; + height: 550px; + border-radius: 5px; + background: #ffffff; + box-shadow: 5px 5px 10px 1px rgba(0, 0, 0, 0.2); +} + +.side-image { + background-image: url('../../images/covers/c6419bc9eefa9633ddf424d5ea8f077c928fc477e02ed34eda6f26be1ac5f195.jpg'); + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + position: relative; + border-radius: 5px 0 0 5px; +} + +.right { + display: flex; + justify-content: center; + align-items: center; + position: relative; +} + +.input-box { + width: 330px; + box-sizing: border-box; +} + +.input-box header { + font-weight: 700; + font-size: 25px; + text-align: center; + margin-bottom: 45px; +} + +.input-field { + display: flex; + flex-direction: column; + position: relative; + padding: 0 10px; +} + +.eye { + flex-direction: row; +} + +.show-password-toggle{ + padding-top: 20px; + height: 45px; + border: none; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); +} + +.input { + height: 45px; + width: 100%; + background: transparent; + border: none; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + outline: none; + margin-bottom: 20px; + color: #40414a; +} + +.input-box .input-field label { + position: absolute; + top: 10px; + left: 10px; + pointer-events: none; + transition: .3s; +} + +.input-field .input:focus ~ label { + top: -10px; + font-size: 13px; +} + +.input-field .input:valid ~ label { + top: -10px; + font-size: 13px; + color: rgb(33, 37, 41); +} + +.input-field .input:focus, .input-field .input:valid { + border-bottom: 1px solid rgb(33, 37, 41); +} + +.submit { + border: none; + outline: none; + height: 45px; + background: #ececec; + border-radius: 5px; + transition: .2s; +} + +.submit:hover { + background: rgba(33, 37, 41, 0.9); + color: #ffffff; +} + +.register { + text-align: center; + font-size: small; + margin-top: 25px; +} + +span a { + text-decoration: none; + font-weight: 700; + color: #000000; + transition: .5s; +} + +span a:hover { + text-decoration: underline; + color: #000000; +} + +@media only screen and (max-width: 768px) { + .side-image { + border-radius: 5px 5px 0 0; + } + + .row { + max-width: 420px; + width: 100%; + } +} \ No newline at end of file diff --git a/src/main/webapp/assets/images/covers/c6419bc9eefa9633ddf424d5ea8f077c928fc477e02ed34eda6f26be1ac5f195.jpg b/src/main/webapp/assets/images/covers/c6419bc9eefa9633ddf424d5ea8f077c928fc477e02ed34eda6f26be1ac5f195.jpg new file mode 100644 index 0000000000000000000000000000000000000000..146423c5d7187016617dafc737a69069351d74fb GIT binary patch literal 43907 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 ZDdT56sLvZ0bCBpJK}Hn_?<4-M{TFw_7lZ%+ literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/js/admin/loginAdmin.js b/src/main/webapp/assets/js/admin/loginAdmin.js new file mode 100644 index 00000000..efcbaeff --- /dev/null +++ b/src/main/webapp/assets/js/admin/loginAdmin.js @@ -0,0 +1,27 @@ +const usernameInput = document.getElementById('username'); +const passwordInput = document.getElementById('password'); + +usernameInput.addEventListener('input', function () { + removeSpaces(usernameInput); +}); + +passwordInput.addEventListener('input', function () { + removeSpaces(passwordInput); +}); + +function removeSpaces(input) { + input.value = input.value.replace(/\s/g, ''); +} + +document.querySelectorAll('.show-password-toggle').forEach(function (eyeIcon) { + eyeIcon.addEventListener('click', function () { + const inputId = this.getAttribute('data-toggle'); + const passwordInput = document.getElementById(inputId); + + passwordInput.type = passwordInput.type === 'password' ? 'text' : 'password'; + + // Toggle between the eye and eye-slash icons + this.classList.toggle('fa-eye', !(passwordInput.type === 'password')); + this.classList.toggle('fa-eye-slash', (passwordInput.type === 'password')); + }); +}); \ No newline at end of file diff --git a/src/main/webapp/view/admin/login-admin.jsp b/src/main/webapp/view/admin/login-admin.jsp new file mode 100644 index 00000000..12507ab0 --- /dev/null +++ b/src/main/webapp/view/admin/login-admin.jsp @@ -0,0 +1,53 @@ +<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + + + + + + + + + Miu Shop | Đăng nhập Admin + + +
+ +
+
+
+
+
+
+
Đăng nhập Admin
+
+
+ + +
+
+ + + +
+ +
+ +
${errorMsg}
+
+
+
+
+
+
+
+ + + + + From cd9300572e009e125100927789a33cdf16171c66 Mon Sep 17 00:00:00 2001 From: yuhtnguyen Date: Thu, 7 Dec 2023 14:29:32 +0700 Subject: [PATCH 14/16] show category list --- .../controller/admin/CategoryManagement.java | 30 + src/main/webapp/assets/css/admin/styles.css | 11553 ++++++++++++++++ .../webapp/assets/js/admin/add-category.js | 115 + .../webapp/assets/js/admin/chart-area-demo.js | 54 + .../webapp/assets/js/admin/chart-bar-demo.js | 46 + .../webapp/assets/js/admin/chart-pie-demo.js | 16 + .../webapp/assets/js/admin/datatables-demo.js | 4 + .../webapp/assets/js/admin/edit-category.js | 56 + .../webapp/view/admin/category-management.jsp | 223 + 9 files changed, 12097 insertions(+) create mode 100644 src/main/java/io/hardingadonis/miu/controller/admin/CategoryManagement.java create mode 100644 src/main/webapp/assets/css/admin/styles.css create mode 100644 src/main/webapp/assets/js/admin/add-category.js create mode 100644 src/main/webapp/assets/js/admin/chart-area-demo.js create mode 100644 src/main/webapp/assets/js/admin/chart-bar-demo.js create mode 100644 src/main/webapp/assets/js/admin/chart-pie-demo.js create mode 100644 src/main/webapp/assets/js/admin/datatables-demo.js create mode 100644 src/main/webapp/assets/js/admin/edit-category.js create mode 100644 src/main/webapp/view/admin/category-management.jsp diff --git a/src/main/java/io/hardingadonis/miu/controller/admin/CategoryManagement.java b/src/main/java/io/hardingadonis/miu/controller/admin/CategoryManagement.java new file mode 100644 index 00000000..255b0689 --- /dev/null +++ b/src/main/java/io/hardingadonis/miu/controller/admin/CategoryManagement.java @@ -0,0 +1,30 @@ +package io.hardingadonis.miu.controller.admin; + +import io.hardingadonis.miu.dao.impl.mysql.CategoryDAOMySQLImpl; +import io.hardingadonis.miu.model.Category; +import io.hardingadonis.miu.services.Singleton; +import java.io.*; +import java.util.*; +import javax.servlet.*; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +@WebServlet(name = "CategoryManagement", urlPatterns = {"/categorymanagement"}) +public class CategoryManagement extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + + request.getRequestDispatcher("/view/admin/category-management.jsp").forward(request, response); + + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + +} diff --git a/src/main/webapp/assets/css/admin/styles.css b/src/main/webapp/assets/css/admin/styles.css new file mode 100644 index 00000000..9757b144 --- /dev/null +++ b/src/main/webapp/assets/css/admin/styles.css @@ -0,0 +1,11553 @@ +@charset "UTF-8"; +/*! +* Start Bootstrap - SB Admin v7.0.7 (https://startbootstrap.com/template/sb-admin) +* Copyright 2013-2023 Start Bootstrap +* Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE) +*/ +/*! + * Bootstrap v5.2.3 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Copyright 2011-2022 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg-rgb: 255, 255, 255; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-bg: #fff; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-2xl: 2rem; + --bs-border-radius-pill: 50rem; + --bs-link-color: #0d6efd; + --bs-link-hover-color: #0a58ca; + --bs-code-color: #d63384; + --bs-highlight-bg: #fff3cd; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} + +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +hr { + margin: 1rem 0; + color: inherit; + border: 0; + border-top: 1px solid; + opacity: 0.25; +} + +h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h1, .h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + h1, .h1 { + font-size: 2.5rem; + } +} + +h2, .h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + h2, .h2 { + font-size: 2rem; + } +} + +h3, .h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + h3, .h3 { + font-size: 1.75rem; + } +} + +h4, .h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + h4, .h4 { + font-size: 1.5rem; + } +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul { + padding-left: 2rem; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small, .small { + font-size: 0.875em; +} + +mark, .mark { + padding: 0.1875em; + background-color: var(--bs-highlight-bg); +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: var(--bs-link-color); + text-decoration: underline; +} +a:hover { + color: var(--bs-link-hover-color); +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +code { + font-size: 0.875em; + color: var(--bs-code-color); + word-wrap: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.1875rem 0.375rem; + font-size: 0.875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: 0.25rem; +} +kbd kbd { + padding: 0; + font-size: 1em; +} + +figure { + margin: 0 0 1rem; +} + +img, +svg { + vertical-align: middle; +} + +table { + caption-side: bottom; + border-collapse: collapse; +} + +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: #6c757d; + text-align: left; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} + +label { + display: inline-block; +} + +button { + border-radius: 0; +} + +button:focus:not(:focus-visible) { + outline: 0; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +select { + text-transform: none; +} + +[role=button] { + cursor: pointer; +} + +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} + +[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { + display: none !important; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} +button:not(:disabled), +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled) { + cursor: pointer; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +textarea { + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} + +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} + +::-webkit-inner-spin-button { + height: auto; +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: textfield; +} + +/* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-color-swatch-wrapper { + padding: 0; +} + +::file-selector-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +iframe { + border: 0; +} + +summary { + display: list-item; + cursor: pointer; +} + +progress { + vertical-align: baseline; +} + +[hidden] { + display: none !important; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} + +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} + +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} + +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} + +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} + +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} + +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid var(--bs-border-color); + border-radius: 0.375rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 0.875em; + color: #6c757d; +} + +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container-sm, .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container-md, .container-sm, .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container-lg, .container-md, .container-sm, .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1320px; + } +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0%; +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.33333333%; +} + +.offset-2 { + margin-left: 16.66666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333333%; +} + +.offset-5 { + margin-left: 41.66666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333333%; +} + +.offset-8 { + margin-left: 66.66666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333333%; +} + +.offset-11 { + margin-left: 91.66666667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333333%; + } + .offset-sm-2 { + margin-left: 16.66666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333333%; + } + .offset-sm-5 { + margin-left: 41.66666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333333%; + } + .offset-sm-8 { + margin-left: 66.66666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333333%; + } + .offset-sm-11 { + margin-left: 91.66666667%; + } + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333333%; + } + .offset-md-2 { + margin-left: 16.66666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333333%; + } + .offset-md-5 { + margin-left: 41.66666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333333%; + } + .offset-md-8 { + margin-left: 66.66666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333333%; + } + .offset-md-11 { + margin-left: 91.66666667%; + } + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333333%; + } + .offset-lg-2 { + margin-left: 16.66666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333333%; + } + .offset-lg-5 { + margin-left: 41.66666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333333%; + } + .offset-lg-8 { + margin-left: 66.66666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333333%; + } + .offset-lg-11 { + margin-left: 91.66666667%; + } + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333333%; + } + .offset-xl-2 { + margin-left: 16.66666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333333%; + } + .offset-xl-5 { + margin-left: 41.66666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333333%; + } + .offset-xl-8 { + margin-left: 66.66666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333333%; + } + .offset-xl-11 { + margin-left: 91.66666667%; + } + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.33333333%; + } + .offset-xxl-2 { + margin-left: 16.66666667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.33333333%; + } + .offset-xxl-5 { + margin-left: 41.66666667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.33333333%; + } + .offset-xxl-8 { + margin-left: 66.66666667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.33333333%; + } + .offset-xxl-11 { + margin-left: 91.66666667%; + } + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table, .datatable-table { + --bs-table-color: var(--bs-body-color); + --bs-table-bg: transparent; + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-body-color); + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: var(--bs-body-color); + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: var(--bs-body-color); + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + color: var(--bs-table-color); + vertical-align: top; + border-color: var(--bs-table-border-color); +} +.table > :not(caption) > * > *, .datatable-table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); +} +.table > tbody, .datatable-table > tbody { + vertical-align: inherit; +} +.table > thead, .datatable-table > thead { + vertical-align: bottom; +} + +.table-group-divider { + border-top: 2px solid currentcolor; +} + +.caption-top { + caption-side: top; +} + +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} + +.table-bordered > :not(caption) > *, .datatable-table > :not(caption) > * { + border-width: 1px 0; +} +.table-bordered > :not(caption) > * > *, .datatable-table > :not(caption) > * > * { + border-width: 0 1px; +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} + +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} + +.table-striped-columns > :not(caption) > tr > :nth-child(even) { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} + +.table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color); +} + +.table-hover > tbody > tr:hover > *, .datatable-table > tbody > tr:hover > * { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color); +} + +.table-primary { + --bs-table-color: #000; + --bs-table-bg: #cfe2ff; + --bs-table-border-color: #bacbe6; + --bs-table-striped-bg: #c5d7f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bacbe6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfd1ec; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: #e2e3e5; + --bs-table-border-color: #cbccce; + --bs-table-striped-bg: #d7d8da; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cbccce; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d1d2d4; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-success { + --bs-table-color: #000; + --bs-table-bg: #d1e7dd; + --bs-table-border-color: #bcd0c7; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-info { + --bs-table-color: #000; + --bs-table-bg: #cff4fc; + --bs-table-border-color: #badce3; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-warning { + --bs-table-color: #000; + --bs-table-bg: #fff3cd; + --bs-table-border-color: #e6dbb9; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-danger { + --bs-table-color: #000; + --bs-table-bg: #f8d7da; + --bs-table-border-color: #dfc2c4; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: #dfe0e1; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #212529; + --bs-table-border-color: #373b3e; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-responsive, .datatable-wrapper .datatable-container { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; +} + +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: #6c757d; +} + +.form-control, .datatable-input { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0.375rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control, .datatable-input { + transition: none; + } +} +.form-control[type=file], [type=file].datatable-input { + overflow: hidden; +} +.form-control[type=file]:not(:disabled):not([readonly]), [type=file].datatable-input:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus, .datatable-input:focus { + color: #212529; + background-color: #fff; + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-control::-webkit-date-and-time-value, .datatable-input::-webkit-date-and-time-value { + height: 1.5em; +} +.form-control::-moz-placeholder, .datatable-input::-moz-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control::placeholder, .datatable-input::placeholder { + color: #6c757d; + opacity: 1; +} +.form-control:disabled, .datatable-input:disabled { + background-color: #e9ecef; + opacity: 1; +} +.form-control::file-selector-button, .datatable-input::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button, .datatable-input::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button, .datatable-input:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #dde0e3; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext:focus { + outline: 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.25rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} + +.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.5rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} + +textarea.form-control, textarea.datatable-input { + min-height: calc(1.5em + 0.75rem + 2px); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); +} + +.form-control-color { + width: 3rem; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: 0.375rem; +} +.form-control-color::-webkit-color-swatch { + border-radius: 0.375rem; +} +.form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); +} +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + 2px); +} + +.form-select, .datatable-selector { + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + -moz-padding-start: calc(0.75rem - 3px); + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: 1px solid #ced4da; + border-radius: 0.375rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-select, .datatable-selector { + transition: none; + } +} +.form-select:focus, .datatable-selector:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-select[multiple], [multiple].datatable-selector, .form-select[size]:not([size="1"]), [size].datatable-selector:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled, .datatable-selector:disabled { + background-color: #e9ecef; +} +.form-select:-moz-focusring, .datatable-selector:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #212529; +} + +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: 0.25rem; +} + +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: 0.5rem; +} + +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} + +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; +} +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; +} + +.form-check-input { + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: 1px solid rgba(0, 0, 0, 0.25); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} +.form-check-input[type=checkbox] { + border-radius: 0.25em; +} +.form-check-input[type=radio] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; +} +.form-check-input:checked[type=checkbox] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type=radio] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type=checkbox]:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + cursor: default; + opacity: 0.5; +} + +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + width: 2em; + margin-left: -2.5em; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; +} +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: #b6d4fe; +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: #b6d4fe; +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} +.form-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.form-floating { + position: relative; +} +.form-floating > .form-control, .form-floating > .datatable-input, +.form-floating > .form-control-plaintext, +.form-floating > .form-select, +.form-floating > .datatable-selector { + height: calc(3.5rem + 2px); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + padding: 1rem 0.75rem; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: 1px solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control, .form-floating > .datatable-input, +.form-floating > .form-control-plaintext { + padding: 1rem 0.75rem; +} +.form-floating > .form-control::-moz-placeholder, .form-floating > .datatable-input::-moz-placeholder, .form-floating > .form-control-plaintext::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control::placeholder, .form-floating > .datatable-input::placeholder, +.form-floating > .form-control-plaintext::placeholder { + color: transparent; +} +.form-floating > .form-control:not(:-moz-placeholder-shown), .form-floating > .datatable-input:not(:-moz-placeholder-shown), .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus, .form-floating > .datatable-input:focus, .form-floating > .form-control:not(:placeholder-shown), .form-floating > .datatable-input:not(:placeholder-shown), +.form-floating > .form-control-plaintext:focus, +.form-floating > .form-control-plaintext:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill, .form-floating > .datatable-input:-webkit-autofill, +.form-floating > .form-control-plaintext:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select, .form-floating > .datatable-selector { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label, .form-floating > .datatable-input:not(:-moz-placeholder-shown) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label, .form-floating > .datatable-input:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .datatable-input:not(:placeholder-shown) ~ label, +.form-floating > .form-control-plaintext ~ label, +.form-floating > .form-select ~ label, +.form-floating > .datatable-selector ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:-webkit-autofill ~ label, .form-floating > .datatable-input:-webkit-autofill ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label { + border-width: 1px 0; +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, .input-group > .datatable-input, +.input-group > .form-select, +.input-group > .datatable-selector, +.input-group > .form-floating { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, .input-group > .datatable-input:focus, +.input-group > .form-select:focus, +.input-group > .datatable-selector:focus, +.input-group > .form-floating:focus-within { + z-index: 5; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 5; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.375rem; +} + +.input-group-lg > .form-control, .input-group-lg > .datatable-input, +.input-group-lg > .form-select, +.input-group-lg > .datatable-selector, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.5rem; +} + +.input-group-sm > .form-control, .input-group-sm > .datatable-input, +.input-group-sm > .form-select, +.input-group-sm > .datatable-selector, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.25rem; +} + +.input-group-lg > .form-select, .input-group-lg > .datatable-selector, +.input-group-sm > .form-select, +.input-group-sm > .datatable-selector { + padding-right: 3rem; +} + +.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .datatable-input, +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select, +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .datatable-selector { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .datatable-input, +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select, +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .datatable-selector { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: -1px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .form-floating:not(:first-child) > .form-control, .input-group > .form-floating:not(:first-child) > .datatable-input, +.input-group > .form-floating:not(:first-child) > .form-select, +.input-group > .form-floating:not(:first-child) > .datatable-selector { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #198754; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(25, 135, 84, 0.9); + border-radius: 0.375rem; +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .was-validated .datatable-input:valid, .form-control.is-valid, .is-valid.datatable-input { + border-color: #198754; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:valid:focus, .was-validated .datatable-input:valid:focus, .form-control.is-valid:focus, .is-valid.datatable-input:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated textarea.form-control:valid, .was-validated textarea.datatable-input:valid, textarea.form-control.is-valid, textarea.is-valid.datatable-input { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:valid, .was-validated .datatable-selector:valid, .form-select.is-valid, .is-valid.datatable-selector { + border-color: #198754; +} +.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .datatable-selector:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .was-validated .datatable-selector:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .is-valid.datatable-selector:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"], .is-valid.datatable-selector:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, .was-validated .datatable-selector:valid:focus, .form-select.is-valid:focus, .is-valid.datatable-selector:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated .form-control-color:valid, .form-control-color.is-valid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} + +.was-validated .form-check-input:valid, .form-check-input.is-valid { + border-color: #198754; +} +.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { + background-color: #198754; +} +.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #198754; +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group > .form-control:not(:focus):valid, .was-validated .input-group > .datatable-input:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, .input-group > .datatable-input:not(:focus).is-valid, +.was-validated .input-group > .form-select:not(:focus):valid, +.was-validated .input-group > .datatable-selector:not(:focus):valid, +.input-group > .form-select:not(:focus).is-valid, +.input-group > .datatable-selector:not(:focus).is-valid, +.was-validated .input-group > .form-floating:not(:focus-within):valid, +.input-group > .form-floating:not(:focus-within).is-valid { + z-index: 3; +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.375rem; +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .was-validated .datatable-input:invalid, .form-control.is-invalid, .is-invalid.datatable-input { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:invalid:focus, .was-validated .datatable-input:invalid:focus, .form-control.is-invalid:focus, .is-invalid.datatable-input:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, .was-validated textarea.datatable-input:invalid, textarea.form-control.is-invalid, textarea.is-invalid.datatable-input { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:invalid, .was-validated .datatable-selector:invalid, .form-select.is-invalid, .is-invalid.datatable-selector { + border-color: #dc3545; +} +.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .datatable-selector:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .was-validated .datatable-selector:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .is-invalid.datatable-selector:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"], .is-invalid.datatable-selector:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, .was-validated .datatable-selector:invalid:focus, .form-select.is-invalid:focus, .is-invalid.datatable-selector:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-control-color:invalid, .form-control-color.is-invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} + +.was-validated .form-check-input:invalid, .form-check-input.is-invalid { + border-color: #dc3545; +} +.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { + background-color: #dc3545; +} +.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group > .form-control:not(:focus):invalid, .was-validated .input-group > .datatable-input:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, .input-group > .datatable-input:not(:focus).is-invalid, +.was-validated .input-group > .form-select:not(:focus):invalid, +.was-validated .input-group > .datatable-selector:not(:focus):invalid, +.input-group > .form-select:not(:focus).is-invalid, +.input-group > .datatable-selector:not(:focus).is-invalid, +.was-validated .input-group > .form-floating:not(:focus-within):invalid, +.input-group > .form-floating:not(:focus-within).is-invalid { + z-index: 4; +} + +.btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 400; + --bs-btn-line-height: 1.5; + --bs-btn-color: #212529; + --bs-btn-bg: transparent; + --bs-btn-border-width: 1px; + --bs-btn-border-color: transparent; + --bs-btn-border-radius: 0.375rem; + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); +} +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); +} +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} +.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn:disabled, .btn.disabled, fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); +} + +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0b5ed7; + --bs-btn-hover-border-color: #0a58ca; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0a58ca; + --bs-btn-active-border-color: #0a53be; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #0d6efd; + --bs-btn-disabled-border-color: #0d6efd; +} + +.btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #5c636a; + --bs-btn-hover-border-color: #565e64; + --bs-btn-focus-shadow-rgb: 130, 138, 145; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #565e64; + --bs-btn-active-border-color: #51585e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #6c757d; + --bs-btn-disabled-border-color: #6c757d; +} + +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #157347; + --bs-btn-hover-border-color: #146c43; + --bs-btn-focus-shadow-rgb: 60, 153, 110; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #146c43; + --bs-btn-active-border-color: #13653f; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #198754; + --bs-btn-disabled-border-color: #198754; +} + +.btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #31d2f2; + --bs-btn-hover-border-color: #25cff2; + --bs-btn-focus-shadow-rgb: 11, 172, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #3dd5f3; + --bs-btn-active-border-color: #25cff2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #0dcaf0; + --bs-btn-disabled-border-color: #0dcaf0; +} + +.btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffca2c; + --bs-btn-hover-border-color: #ffc720; + --bs-btn-focus-shadow-rgb: 217, 164, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffcd39; + --bs-btn-active-border-color: #ffc720; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #ffc107; + --bs-btn-disabled-border-color: #ffc107; +} + +.btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #bb2d3b; + --bs-btn-hover-border-color: #b02a37; + --bs-btn-focus-shadow-rgb: 225, 83, 97; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #b02a37; + --bs-btn-active-border-color: #a52834; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #dc3545; + --bs-btn-disabled-border-color: #dc3545; +} + +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #d3d4d5; + --bs-btn-hover-border-color: #c6c7c8; + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #c6c7c8; + --bs-btn-active-border-color: #babbbc; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa; +} + +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #424649; + --bs-btn-hover-border-color: #373b3e; + --bs-btn-focus-shadow-rgb: 66, 70, 73; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #4d5154; + --bs-btn-active-border-color: #373b3e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #212529; + --bs-btn-disabled-border-color: #212529; +} + +.btn-outline-primary { + --bs-btn-color: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0d6efd; + --bs-btn-hover-border-color: #0d6efd; + --bs-btn-focus-shadow-rgb: 13, 110, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0d6efd; + --bs-btn-active-border-color: #0d6efd; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0d6efd; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0d6efd; + --bs-gradient: none; +} + +.btn-outline-secondary { + --bs-btn-color: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #6c757d; + --bs-btn-hover-border-color: #6c757d; + --bs-btn-focus-shadow-rgb: 108, 117, 125; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #6c757d; + --bs-btn-active-border-color: #6c757d; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #6c757d; + --bs-gradient: none; +} + +.btn-outline-success { + --bs-btn-color: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #198754; + --bs-btn-hover-border-color: #198754; + --bs-btn-focus-shadow-rgb: 25, 135, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #198754; + --bs-btn-active-border-color: #198754; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #198754; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #198754; + --bs-gradient: none; +} + +.btn-outline-info { + --bs-btn-color: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #0dcaf0; + --bs-btn-hover-border-color: #0dcaf0; + --bs-btn-focus-shadow-rgb: 13, 202, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #0dcaf0; + --bs-btn-active-border-color: #0dcaf0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0dcaf0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0dcaf0; + --bs-gradient: none; +} + +.btn-outline-warning { + --bs-btn-color: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffc107; + --bs-btn-hover-border-color: #ffc107; + --bs-btn-focus-shadow-rgb: 255, 193, 7; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffc107; + --bs-btn-active-border-color: #ffc107; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ffc107; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ffc107; + --bs-gradient: none; +} + +.btn-outline-danger { + --bs-btn-color: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #dc3545; + --bs-btn-hover-border-color: #dc3545; + --bs-btn-focus-shadow-rgb: 220, 53, 69; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #dc3545; + --bs-btn-active-border-color: #dc3545; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #dc3545; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #dc3545; + --bs-gradient: none; +} + +.btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none; +} + +.btn-outline-dark { + --bs-btn-color: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #212529; + --bs-btn-hover-border-color: #212529; + --bs-btn-focus-shadow-rgb: 33, 37, 41; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212529; + --bs-btn-active-border-color: #212529; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #212529; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #212529; + --bs-gradient: none; +} + +.btn-link { + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: none; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + text-decoration: underline; +} +.btn-link:focus-visible { + color: var(--bs-btn-color); +} +.btn-link:hover { + color: var(--bs-btn-hover-color); +} + +.btn-lg, .btn-group-lg > .btn { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: 0.5rem; +} + +.btn-sm, .btn-group-sm > .btn { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: 0.25rem; +} + +.fade { + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} + +.dropup, +.dropend, +.dropdown, +.dropstart, +.dropup-center, +.dropdown-center { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: #212529; + --bs-dropdown-bg: #fff; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: 0.375rem; + --bs-dropdown-border-width: 1px; + --bs-dropdown-inner-border-radius: calc(0.375rem - 1px); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-dropdown-link-color: #212529; + --bs-dropdown-link-hover-color: #1e2125; + --bs-dropdown-link-hover-bg: #e9ecef; + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #6c757d; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + position: absolute; + z-index: var(--bs-dropdown-zindex); + display: none; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + margin: 0; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); + text-align: left; + list-style: none; + background-color: var(--bs-dropdown-bg); + background-clip: padding-box; + border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius); +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--bs-dropdown-spacer); +} + +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} + +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--bs-dropdown-spacer); +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--bs-dropdown-spacer); +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} + +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--bs-dropdown-spacer); +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-divider { + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1; +} + +.dropdown-item { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 400; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:hover, .dropdown-item:focus { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); +} +.dropdown-item.active, .dropdown-item:active { + color: var(--bs-dropdown-link-active-color); + text-decoration: none; + background-color: var(--bs-dropdown-link-active-bg); +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); + margin-bottom: 0; + font-size: 0.875rem; + color: var(--bs-dropdown-header-color); + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color); +} + +.dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #343a40; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group { + border-radius: 0.375rem; +} +.btn-group > :not(.btn-check:first-child) + .btn, +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn.dropdown-toggle-split:first-child, +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:nth-child(n+3), +.btn-group > :not(.btn-check) + .btn, +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn ~ .btn, +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: #6c757d; + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:hover, .nav-link:focus { + color: var(--bs-nav-link-hover-color); +} +.nav-link.disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default; +} + +.nav-tabs { + --bs-nav-tabs-border-width: 1px; + --bs-nav-tabs-border-color: #dee2e6; + --bs-nav-tabs-border-radius: 0.375rem; + --bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6; + --bs-nav-tabs-link-active-color: #495057; + --bs-nav-tabs-link-active-bg: #fff; + --bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff; + border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); +} +.nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + background: none; + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color); +} +.nav-tabs .nav-link.disabled, .nav-tabs .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); +} +.nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills { + --bs-nav-pills-border-radius: 0.375rem; + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #0d6efd; +} +.nav-pills .nav-link { + background: none; + border: 0; + border-radius: var(--bs-nav-pills-border-radius); +} +.nav-pills .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + background-color: transparent; + border-color: transparent; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(0, 0, 0, 0.55); + --bs-navbar-hover-color: rgba(0, 0, 0, 0.7); + --bs-navbar-disabled-color: rgba(0, 0, 0, 0.3); + --bs-navbar-active-color: rgba(0, 0, 0, 0.9); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(0, 0, 0, 0.9); + --bs-navbar-brand-hover-color: rgba(0, 0, 0, 0.9); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(0, 0, 0, 0.1); + --bs-navbar-toggler-border-radius: 0.375rem; + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-sm, +.navbar > .container-md, +.navbar > .container-lg, +.navbar > .container-xl, +.navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; +} +.navbar-brand { + padding-top: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); + text-decoration: none; + white-space: nowrap; +} +.navbar-brand:hover, .navbar-brand:focus { + color: var(--bs-navbar-brand-hover-color); +} + +.navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .show > .nav-link, +.navbar-nav .nav-link.active { + color: var(--bs-navbar-active-color); +} +.navbar-nav .dropdown-menu { + position: static; +} + +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-navbar-color); +} +.navbar-text a, +.navbar-text a:hover, +.navbar-text a:focus { + color: var(--bs-navbar-active-color); +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + color: var(--bs-navbar-color); + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + transition: var(--bs-navbar-toggler-transition); +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-md .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; +} +.navbar-expand .offcanvas .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} + +.navbar-dark { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-border-width: 1px; + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: 0.375rem; + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc(0.375rem - 1px); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(0, 0, 0, 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: #fff; + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + height: var(--bs-card-height); + word-wrap: break-word; + background-color: var(--bs-card-bg); + background-clip: border-box; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius); +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color); +} + +.card-title { + margin-bottom: var(--bs-card-title-spacer-y); +} + +.card-subtitle { + margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link + .card-link { + margin-left: var(--bs-card-spacer-x); +} + +.card-header { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + margin-bottom: 0; + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-header:first-child { + border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; +} + +.card-footer { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-footer:last-child { + border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); +} + +.card-header-tabs { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); + border-bottom: 0; +} +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg); +} + +.card-header-pills { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); + border-radius: var(--bs-card-inner-border-radius); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} + +.card-group > .card { + margin-bottom: var(--bs-card-group-margin); +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.accordion { + --bs-accordion-color: #212529; + --bs-accordion-bg: #fff; + --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: 1px; + --bs-accordion-border-radius: 0.375rem; + --bs-accordion-inner-border-radius: calc(0.375rem - 1px); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: #212529; + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-focus-border-color: #86b7fe; + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: #0c63e4; + --bs-accordion-active-bg: #e7f1ff; +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + font-size: 1rem; + color: var(--bs-accordion-btn-color); + text-align: left; + background-color: var(--bs-accordion-btn-bg); + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: var(--bs-accordion-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); +} +.accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform); +} +.accordion-button::after { + flex-shrink: 0; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: var(--bs-accordion-btn-focus-border-color); + outline: 0; + box-shadow: var(--bs-accordion-btn-focus-box-shadow); +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); +} +.accordion-item:first-of-type { + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius); +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: var(--bs-accordion-inner-border-radius); + border-bottom-left-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} + +.accordion-body { + padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); +} + +.accordion-flush .accordion-collapse { + border-width: 0; +} +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush .accordion-item:first-child { + border-top: 0; +} +.accordion-flush .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush .accordion-item .accordion-button, .accordion-flush .accordion-item .accordion-button.collapsed { + border-radius: 0; +} + +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: #6c757d; + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: #6c757d; + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x); +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; +} +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color); +} + +.pagination, .datatable-pagination ul { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: #fff; + --bs-pagination-border-width: 1px; + --bs-pagination-border-color: #dee2e6; + --bs-pagination-border-radius: 0.375rem; + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: #e9ecef; + --bs-pagination-hover-border-color: #dee2e6; + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: #e9ecef; + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #0d6efd; + --bs-pagination-active-border-color: #0d6efd; + --bs-pagination-disabled-color: #6c757d; + --bs-pagination-disabled-bg: #fff; + --bs-pagination-disabled-border-color: #dee2e6; + display: flex; + padding-left: 0; + list-style: none; +} + +.page-link, .datatable-pagination a { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link, .datatable-pagination a { + transition: none; + } +} +.page-link:hover, .datatable-pagination a:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); +} +.page-link:focus, .datatable-pagination a:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow); +} +.page-link.active, .datatable-pagination a.active, .active > .page-link, .datatable-pagination .active > a { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} +.page-link.disabled, .datatable-pagination a.disabled, .disabled > .page-link, .datatable-pagination .disabled > a { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); +} + +.page-item:not(:first-child) .page-link, .page-item:not(:first-child) .datatable-pagination a, .datatable-pagination .page-item:not(:first-child) a, .datatable-pagination li:not(:first-child) .page-link, .datatable-pagination li:not(:first-child) a { + margin-left: -1px; +} +.page-item:first-child .page-link, .page-item:first-child .datatable-pagination a, .datatable-pagination .page-item:first-child a, .datatable-pagination li:first-child .page-link, .datatable-pagination li:first-child a { + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius); +} +.page-item:last-child .page-link, .page-item:last-child .datatable-pagination a, .datatable-pagination .page-item:last-child a, .datatable-pagination li:last-child .page-link, .datatable-pagination li:last-child a { + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius); +} + +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: 0.5rem; +} + +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: 0.25rem; +} + +.badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: 0.375rem; + display: inline-block; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + color: var(--bs-badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--bs-badge-border-radius); +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.btn-tiny { + padding: 3px 8px; + font-size: 10px; +} + +.box-link { + text-decoration: none; +} + +.info-box { + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); + height: 80px; + display: flex; + cursor: default; + background-color: #fff; + position: relative; + overflow: hidden; + margin-bottom: 30px; + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.info-box:hover { + transform: translateY(-5px) scale(1.05); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); +} + +.info-box .icon { + display: inline-block; + text-align: center; + background-color: rgba(0, 0, 0, 0.12); + width: 80px; +} + +.bg-indigo { + background-color: #3F51B5 !important; + color: #fff; +} + +.bg-red { + background-color: #F44336 !important; + color: #fff; +} + +.bg-purple { + background-color: #9C27B0 !important; + color: #fff; +} + +.info-box .icon i { + color: #fff; + font-size: 50px; + line-height: 80px; +} + +.info-box .content { + display: inline-block; + padding: 7px 10px; +} + +.info-box .content .text { + font-size: 13px; + font-weight: 700; + color: #d80b0b; +} + +.info-box .content .number { + font-weight: 600; + font-size: 26px; + margin-top: -4px; + color: #555; +} + +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: 1px solid var(--bs-alert-border-color); + --bs-alert-border-radius: 0.375rem; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} + +.alert-primary { + --bs-alert-color: #084298; + --bs-alert-bg: #cfe2ff; + --bs-alert-border-color: #b6d4fe; +} +.alert-primary .alert-link { + color: #06357a; +} + +.alert-secondary { + --bs-alert-color: #41464b; + --bs-alert-bg: #e2e3e5; + --bs-alert-border-color: #d3d6d8; +} +.alert-secondary .alert-link { + color: #34383c; +} + +.alert-success { + --bs-alert-color: #0f5132; + --bs-alert-bg: #d1e7dd; + --bs-alert-border-color: #badbcc; +} +.alert-success .alert-link { + color: #0c4128; +} + +.alert-info { + --bs-alert-color: #055160; + --bs-alert-bg: #cff4fc; + --bs-alert-border-color: #b6effb; +} +.alert-info .alert-link { + color: #04414d; +} + +.alert-warning { + --bs-alert-color: #664d03; + --bs-alert-bg: #fff3cd; + --bs-alert-border-color: #ffecb5; +} +.alert-warning .alert-link { + color: #523e02; +} + +.alert-danger { + --bs-alert-color: #842029; + --bs-alert-bg: #f8d7da; + --bs-alert-border-color: #f5c2c7; +} +.alert-danger .alert-link { + color: #6a1a21; +} + +.alert-light { + --bs-alert-color: #636464; + --bs-alert-bg: #fefefe; + --bs-alert-border-color: #fdfdfe; +} +.alert-light .alert-link { + color: #4f5050; +} + +.alert-dark { + --bs-alert-color: #141619; + --bs-alert-bg: #d3d3d4; + --bs-alert-border-color: #bcbebf; +} +.alert-dark .alert-link { + color: #101214; +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +.progress { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: #e9ecef; + --bs-progress-border-radius: 0.375rem; + --bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #0d6efd; + --bs-progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--bs-progress-height); + overflow: hidden; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius); +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--bs-progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition); +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: var(--bs-progress-height) var(--bs-progress-height); +} + +.progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; + } +} + +.list-group { + --bs-list-group-color: #212529; + --bs-list-group-bg: #fff; + --bs-list-group-border-color: rgba(0, 0, 0, 0.125); + --bs-list-group-border-width: 1px; + --bs-list-group-border-radius: 0.375rem; + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: #495057; + --bs-list-group-action-hover-color: #495057; + --bs-list-group-action-hover-bg: #f8f9fa; + --bs-list-group-action-active-color: #212529; + --bs-list-group-action-active-bg: #e9ecef; + --bs-list-group-disabled-color: #6c757d; + --bs-list-group-disabled-bg: #fff; + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #0d6efd; + --bs-list-group-active-border-color: #0d6efd; + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: var(--bs-list-group-border-radius); +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > .list-group-item::before { + content: counters(section, ".") ". "; + counter-increment: section; +} + +.list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg); +} +.list-group-item-action:active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg); +} + +.list-group-item { + position: relative; + display: block; + padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); + text-decoration: none; + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, .list-group-item:disabled { + color: var(--bs-list-group-disabled-color); + pointer-events: none; + background-color: var(--bs-list-group-disabled-bg); +} +.list-group-item.active { + z-index: 2; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width); +} + +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width); +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #084298; + background-color: #cfe2ff; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #084298; + background-color: #bacbe6; +} +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #084298; + border-color: #084298; +} + +.list-group-item-secondary { + color: #41464b; + background-color: #e2e3e5; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #41464b; + background-color: #cbccce; +} +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #41464b; + border-color: #41464b; +} + +.list-group-item-success { + color: #0f5132; + background-color: #d1e7dd; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #0f5132; + background-color: #bcd0c7; +} +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #0f5132; + border-color: #0f5132; +} + +.list-group-item-info { + color: #055160; + background-color: #cff4fc; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #055160; + background-color: #badce3; +} +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #055160; + border-color: #055160; +} + +.list-group-item-warning { + color: #664d03; + background-color: #fff3cd; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #664d03; + background-color: #e6dbb9; +} +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #664d03; + border-color: #664d03; +} + +.list-group-item-danger { + color: #842029; + background-color: #f8d7da; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #842029; + background-color: #dfc2c4; +} +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #842029; + border-color: #842029; +} + +.list-group-item-light { + color: #636464; + background-color: #fefefe; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #636464; + background-color: #e5e5e5; +} +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #636464; + border-color: #636464; +} + +.list-group-item-dark { + color: #141619; + background-color: #d3d3d4; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #141619; + background-color: #bebebf; +} +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #141619; + border-color: #141619; +} + +.btn-close { + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: #000; + background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; + border: 0; + border-radius: 0.375rem; + opacity: 0.5; +} +.btn-close:hover { + color: #000; + text-decoration: none; + opacity: 0.75; +} +.btn-close:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + opacity: 1; +} +.btn-close:disabled, .btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: 0.25; +} + +.btn-close-white { + filter: invert(1) grayscale(100%) brightness(200%); +} + +.toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(255, 255, 255, 0.85); + --bs-toast-border-width: 1px; + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: 0.375rem; + --bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-toast-header-color: #6c757d; + --bs-toast-header-bg: rgba(255, 255, 255, 0.85); + --bs-toast-header-border-color: rgba(0, 0, 0, 0.05); + width: var(--bs-toast-max-width); + max-width: 100%; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); + pointer-events: auto; + background-color: var(--bs-toast-bg); + background-clip: padding-box; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); + border-radius: var(--bs-toast-border-radius); +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} + +.toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing); +} + +.toast-header { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); + background-clip: padding-box; + border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); + border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); +} +.toast-header .btn-close { + margin-right: calc(-0.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x); +} + +.toast-body { + padding: var(--bs-toast-padding-x); + word-wrap: break-word; +} + +.modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: ; + --bs-modal-bg: #fff; + --bs-modal-border-color: var(--bs-border-color-translucent); + --bs-modal-border-width: 1px; + --bs-modal-border-radius: 0.5rem; + --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-modal-inner-border-radius: calc(0.5rem - 1px); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: 1px; + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: 1px; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: var(--bs-modal-margin); + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} + +.modal-dialog-scrollable { + height: calc(100% - var(--bs-modal-margin) * 2); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - var(--bs-modal-margin) * 2); +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + color: var(--bs-modal-color); + pointer-events: auto; + background-color: var(--bs-modal-bg); + background-clip: padding-box; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); + outline: 0; + margin-top: 56px; +} + +.modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-backdrop-zindex); + width: 100vw; + height: 100vh; + background-color: var(--bs-backdrop-bg); +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: var(--bs-backdrop-opacity); +} + +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius); + height: 56px; +} +.modal-header .btn-close { + padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5); + margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto; +} + +.modal-title { + margin-bottom: 0; + line-height: var(--bs-modal-title-line-height); +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--bs-modal-padding); +} + +.modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); + background-color: var(--bs-modal-footer-bg); + /* border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); */ + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-bottom-left-radius: var(--bs-modal-inner-border-radius); +} +.modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * 0.5); +} + +@media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + } + .modal-dialog { + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto; + } + .modal-sm { + --bs-modal-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + --bs-modal-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + --bs-modal-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-header, +.modal-fullscreen .modal-footer { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-header, + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-header, + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-header, + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-header, + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-header, + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } +} +.tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: #fff; + --bs-tooltip-bg: #000; + --bs-tooltip-border-radius: 0.375rem; + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); + display: block; + padding: var(--bs-tooltip-arrow-height); + margin: var(--bs-tooltip-margin); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-tooltip-font-size); + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: var(--bs-tooltip-opacity); +} +.tooltip .tooltip-arrow { + display: block; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height); +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { + bottom: 0; +} +.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { + top: -1px; + border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-top-color: var(--bs-tooltip-bg); +} + +/* rtl:begin:ignore */ +.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { + left: 0; + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { + right: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-right-color: var(--bs-tooltip-bg); +} + +/* rtl:end:ignore */ +.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { + top: 0; +} +.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { + bottom: -1px; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg); +} + +/* rtl:begin:ignore */ +.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { + right: 0; + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { + left: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg); +} + +/* rtl:end:ignore */ +.tooltip-inner { + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); + text-align: center; + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius); +} + +.popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: #fff; + --bs-popover-border-width: 1px; + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: 0.5rem; + --bs-popover-inner-border-radius: calc(0.5rem - 1px); + --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: ; + --bs-popover-header-bg: #f0f0f0; + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: #212529; + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); + display: block; + max-width: var(--bs-popover-max-width); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-popover-font-size); + word-wrap: break-word; + background-color: var(--bs-popover-bg); + background-clip: padding-box; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius); +} +.popover .popover-arrow { + display: block; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height); +} +.popover .popover-arrow::before, .popover .popover-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; + border-width: 0; +} + +.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { + bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { + bottom: 0; + border-top-color: var(--bs-popover-arrow-border); +} +.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg); +} + +/* rtl:begin:ignore */ +.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { + left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { + left: 0; + border-right-color: var(--bs-popover-arrow-border); +} +.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg); +} + +/* rtl:end:ignore */ +.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { + top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { + top: 0; + border-bottom-color: var(--bs-popover-arrow-border); +} +.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg); +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: var(--bs-popover-arrow-width); + margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); + content: ""; + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); +} + +/* rtl:begin:ignore */ +.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { + right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { + right: 0; + border-left-color: var(--bs-popover-arrow-border); +} +.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg); +} + +/* rtl:end:ignore */ +.popover-header { + padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); + margin-bottom: 0; + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color); +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-start, + .carousel-fade .active.carousel-item-end { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +/* rtl:options: { + "autoRename": true, + "stringMap":[ { + "name" : "prev-next", + "search" : "prev", + "replace" : "next" + } ] +} */ +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; + list-style: none; +} +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; +} + +.carousel-dark .carousel-control-prev-icon, +.carousel-dark .carousel-control-next-icon { + filter: invert(1) grayscale(100); +} +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} +.carousel-dark .carousel-caption { + color: #000; +} + +.spinner-grow, +.spinner-border { + display: inline-block; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) /* rtl:ignore */; + } +} +.spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; + border-right-color: transparent; +} + +.spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em; +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0; +} + +.spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + --bs-spinner-animation-speed: 1.5s; + } +} +.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: ; + --bs-offcanvas-bg: #fff; + --bs-offcanvas-border-width: 1px; + --bs-offcanvas-border-color: var(--bs-border-color-translucent); + --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); +} + +@media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { + visibility: visible; + } +} +@media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-sm .offcanvas-header { + display: none; + } + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { + visibility: visible; + } +} +@media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-md .offcanvas-header { + display: none; + } + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { + visibility: visible; + } +} +@media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-lg .offcanvas-header { + display: none; + } + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { + visibility: visible; + } +} +@media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xl .offcanvas-header { + display: none; + } + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { + visibility: visible; + } +} +@media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xxl .offcanvas-header { + display: none; + } + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +.offcanvas { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} +.offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); +} +.offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); +} +.offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); +} +.offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); +} +.offcanvas.showing, .offcanvas.show:not(.hiding) { + transform: none; +} +.offcanvas.showing, .offcanvas.hiding, .offcanvas.show { + visibility: visible; +} + +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} + +.offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); +} +.offcanvas-header .btn-close { + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); +} + +.offcanvas-title { + margin-bottom: 0; + line-height: 1.5; +} + +.offcanvas-body { + flex-grow: 1; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + overflow-y: auto; +} + +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} + +.placeholder-xs { + min-height: 0.6em; +} + +.placeholder-sm { + min-height: 0.8em; +} + +.placeholder-lg { + min-height: 1.2em; +} + +.placeholder-glow .placeholder { + animation: placeholder-glow 2s ease-in-out infinite; +} + +@keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} +.placeholder-wave { + -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + animation: placeholder-wave 2s linear infinite; +} + +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.text-bg-primary { + color: #fff !important; + background-color: RGBA(13, 110, 253, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-secondary { + color: #fff !important; + background-color: RGBA(108, 117, 125, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-success { + color: #fff !important; + background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-info { + color: #000 !important; + background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-warning { + color: #000 !important; + background-color: RGBA(255, 193, 7, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-danger { + color: #fff !important; + background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-light { + color: #000 !important; + background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-dark { + color: #fff !important; + background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important; +} + +.link-primary { + color: #0d6efd !important; +} +.link-primary:hover, .link-primary:focus { + color: #0a58ca !important; +} + +.link-secondary { + color: #6c757d !important; +} +.link-secondary:hover, .link-secondary:focus { + color: #565e64 !important; +} + +.link-success { + color: #198754 !important; +} +.link-success:hover, .link-success:focus { + color: #146c43 !important; +} + +.link-info { + color: #0dcaf0 !important; +} +.link-info:hover, .link-info:focus { + color: #3dd5f3 !important; +} + +.link-warning { + color: #ffc107 !important; +} +.link-warning:hover, .link-warning:focus { + color: #ffcd39 !important; +} + +.link-danger { + color: #dc3545 !important; +} +.link-danger:hover, .link-danger:focus { + color: #b02a37 !important; +} + +.link-light { + color: #f8f9fa !important; +} +.link-light:hover, .link-light:focus { + color: #f9fafb !important; +} + +.link-dark { + color: #212529 !important; +} +.link-dark:hover, .link-dark:focus { + color: #1a1e21 !important; +} + +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} + +.ratio-4x3 { + --bs-aspect-ratio: 75%; +} + +.ratio-16x9 { + --bs-aspect-ratio: 56.25%; +} + +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571%; +} + +.fixed-top, .sb-nav-fixed #layoutSidenav #layoutSidenav_nav, .sb-nav-fixed .sb-topnav { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +.sticky-top { + position: sticky; + top: 0; + z-index: 1020; +} + +.sticky-bottom { + position: sticky; + bottom: 0; + z-index: 1020; +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-sm-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-md-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-lg-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xl-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xxl-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; +} + +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; +} + +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.vr { + display: inline-block; + align-self: stretch; + width: 1px; + min-height: 1em; + background-color: currentcolor; + opacity: 0.25; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.float-start { + float: left !important; +} + +.float-end { + float: right !important; +} + +.float-none { + float: none !important; +} + +.opacity-0 { + opacity: 0 !important; +} + +.opacity-25 { + opacity: 0.25 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-75 { + opacity: 0.75 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.top-50 { + top: 50% !important; +} + +.top-100 { + top: 100% !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.bottom-50 { + bottom: 50% !important; +} + +.bottom-100 { + bottom: 100% !important; +} + +.start-0 { + left: 0 !important; +} + +.start-50 { + left: 50% !important; +} + +.start-100 { + left: 100% !important; +} + +.end-0 { + right: 0 !important; +} + +.end-50 { + right: 50% !important; +} + +.end-100 { + right: 100% !important; +} + +.translate-middle { + transform: translate(-50%, -50%) !important; +} + +.translate-middle-x { + transform: translateX(-50%) !important; +} + +.translate-middle-y { + transform: translateY(-50%) !important; +} + +.border { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-end-0 { + border-right: 0 !important; +} + +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-start-0 { + border-left: 0 !important; +} + +.border-primary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; +} + +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; +} + +.border-success { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; +} + +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; +} + +.border-warning { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; +} + +.border-danger { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; +} + +.border-light { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; +} + +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; +} + +.border-white { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; +} + +.border-1 { + --bs-border-width: 1px; +} + +.border-2 { + --bs-border-width: 2px; +} + +.border-3 { + --bs-border-width: 3px; +} + +.border-4 { + --bs-border-width: 4px; +} + +.border-5 { + --bs-border-width: 5px; +} + +.border-opacity-10 { + --bs-border-opacity: 0.1; +} + +.border-opacity-25 { + --bs-border-opacity: 0.25; +} + +.border-opacity-50 { + --bs-border-opacity: 0.5; +} + +.border-opacity-75 { + --bs-border-opacity: 0.75; +} + +.border-opacity-100 { + --bs-border-opacity: 1; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.vw-100 { + width: 100vw !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.vh-100 { + height: 100vh !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.justify-content-evenly { + justify-content: space-evenly !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-last { + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0 { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2 { + margin-right: 0.5rem !important; +} + +.me-3 { + margin-right: 1rem !important; +} + +.me-4 { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0 { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2 { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} + +.gap-0 { + gap: 0 !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.gap-5 { + gap: 3rem !important; +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} + +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} + +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} + +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} + +.fs-5 { + font-size: 1.25rem !important; +} + +.fs-6 { + font-size: 1rem !important; +} + +.fst-italic { + font-style: italic !important; +} + +.fst-normal { + font-style: normal !important; +} + +.fw-light { + font-weight: 300 !important; +} + +.fw-lighter { + font-weight: lighter !important; +} + +.fw-normal { + font-weight: 400 !important; +} + +.fw-bold { + font-weight: 700 !important; +} + +.fw-semibold { + font-weight: 600 !important; +} + +.fw-bolder { + font-weight: bolder !important; +} + +.lh-1 { + line-height: 1 !important; +} + +.lh-sm { + line-height: 1.25 !important; +} + +.lh-base { + line-height: 1.5 !important; +} + +.lh-lg { + line-height: 2 !important; +} + +.text-start { + text-align: left !important; +} + +.text-end { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +/* rtl:begin:remove */ +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + +/* rtl:end:remove */ +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} + +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} + +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} + +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} + +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} + +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} + +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} + +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} + +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} + +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} + +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} + +.text-muted { + --bs-text-opacity: 1; + color: #6c757d !important; +} + +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} + +.text-opacity-25 { + --bs-text-opacity: 0.25; +} + +.text-opacity-50 { + --bs-text-opacity: 0.5; +} + +.text-opacity-75 { + --bs-text-opacity: 0.75; +} + +.text-opacity-100 { + --bs-text-opacity: 1; +} + +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} + +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} + +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} + +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} + +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} + +.bg-opacity-100 { + --bs-bg-opacity: 1; +} + +.bg-gradient { + background-image: var(--bs-gradient) !important; +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important; +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important; +} + +.pe-none { + pointer-events: none !important; +} + +.pe-auto { + pointer-events: auto !important; +} + +.rounded { + border-radius: var(--bs-border-radius) !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-2 { + border-radius: var(--bs-border-radius) !important; +} + +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-5 { + border-radius: var(--bs-border-radius-2xl) !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} + +.rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} + +.rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} + +.rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-grid { + display: grid !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .d-sm-none { + display: none !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-sm-start { + justify-content: flex-start !important; + } + .justify-content-sm-end { + justify-content: flex-end !important; + } + .justify-content-sm-center { + justify-content: center !important; + } + .justify-content-sm-between { + justify-content: space-between !important; + } + .justify-content-sm-around { + justify-content: space-around !important; + } + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + .align-items-sm-start { + align-items: flex-start !important; + } + .align-items-sm-end { + align-items: flex-end !important; + } + .align-items-sm-center { + align-items: center !important; + } + .align-items-sm-baseline { + align-items: baseline !important; + } + .align-items-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-between { + align-content: space-between !important; + } + .align-content-sm-around { + align-content: space-around !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } + .order-sm-first { + order: -1 !important; + } + .order-sm-0 { + order: 0 !important; + } + .order-sm-1 { + order: 1 !important; + } + .order-sm-2 { + order: 2 !important; + } + .order-sm-3 { + order: 3 !important; + } + .order-sm-4 { + order: 4 !important; + } + .order-sm-5 { + order: 5 !important; + } + .order-sm-last { + order: 6 !important; + } + .m-sm-0 { + margin: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 3rem !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .me-sm-0 { + margin-right: 0 !important; + } + .me-sm-1 { + margin-right: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.5rem !important; + } + .me-sm-3 { + margin-right: 1rem !important; + } + .me-sm-4 { + margin-right: 1.5rem !important; + } + .me-sm-5 { + margin-right: 3rem !important; + } + .me-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 3rem !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ms-sm-0 { + margin-left: 0 !important; + } + .ms-sm-1 { + margin-left: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.5rem !important; + } + .ms-sm-3 { + margin-left: 1rem !important; + } + .ms-sm-4 { + margin-left: 1.5rem !important; + } + .ms-sm-5 { + margin-left: 3rem !important; + } + .ms-sm-auto { + margin-left: auto !important; + } + .p-sm-0 { + padding: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 3rem !important; + } + .pe-sm-0 { + padding-right: 0 !important; + } + .pe-sm-1 { + padding-right: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.5rem !important; + } + .pe-sm-3 { + padding-right: 1rem !important; + } + .pe-sm-4 { + padding-right: 1.5rem !important; + } + .pe-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 3rem !important; + } + .ps-sm-0 { + padding-left: 0 !important; + } + .ps-sm-1 { + padding-left: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .text-sm-start { + text-align: left !important; + } + .text-sm-end { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + .float-md-end { + float: right !important; + } + .float-md-none { + float: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-grid { + display: grid !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .d-md-none { + display: none !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-md-start { + justify-content: flex-start !important; + } + .justify-content-md-end { + justify-content: flex-end !important; + } + .justify-content-md-center { + justify-content: center !important; + } + .justify-content-md-between { + justify-content: space-between !important; + } + .justify-content-md-around { + justify-content: space-around !important; + } + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + .align-items-md-start { + align-items: flex-start !important; + } + .align-items-md-end { + align-items: flex-end !important; + } + .align-items-md-center { + align-items: center !important; + } + .align-items-md-baseline { + align-items: baseline !important; + } + .align-items-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-between { + align-content: space-between !important; + } + .align-content-md-around { + align-content: space-around !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } + .order-md-first { + order: -1 !important; + } + .order-md-0 { + order: 0 !important; + } + .order-md-1 { + order: 1 !important; + } + .order-md-2 { + order: 2 !important; + } + .order-md-3 { + order: 3 !important; + } + .order-md-4 { + order: 4 !important; + } + .order-md-5 { + order: 5 !important; + } + .order-md-last { + order: 6 !important; + } + .m-md-0 { + margin: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mt-md-5 { + margin-top: 3rem !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .me-md-0 { + margin-right: 0 !important; + } + .me-md-1 { + margin-right: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.5rem !important; + } + .me-md-3 { + margin-right: 1rem !important; + } + .me-md-4 { + margin-right: 1.5rem !important; + } + .me-md-5 { + margin-right: 3rem !important; + } + .me-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 3rem !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ms-md-0 { + margin-left: 0 !important; + } + .ms-md-1 { + margin-left: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.5rem !important; + } + .ms-md-3 { + margin-left: 1rem !important; + } + .ms-md-4 { + margin-left: 1.5rem !important; + } + .ms-md-5 { + margin-left: 3rem !important; + } + .ms-md-auto { + margin-left: auto !important; + } + .p-md-0 { + padding: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pt-md-5 { + padding-top: 3rem !important; + } + .pe-md-0 { + padding-right: 0 !important; + } + .pe-md-1 { + padding-right: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.5rem !important; + } + .pe-md-3 { + padding-right: 1rem !important; + } + .pe-md-4 { + padding-right: 1.5rem !important; + } + .pe-md-5 { + padding-right: 3rem !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 3rem !important; + } + .ps-md-0 { + padding-left: 0 !important; + } + .ps-md-1 { + padding-left: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .text-md-start { + text-align: left !important; + } + .text-md-end { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + .float-lg-end { + float: right !important; + } + .float-lg-none { + float: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-grid { + display: grid !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .d-lg-none { + display: none !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-lg-start { + justify-content: flex-start !important; + } + .justify-content-lg-end { + justify-content: flex-end !important; + } + .justify-content-lg-center { + justify-content: center !important; + } + .justify-content-lg-between { + justify-content: space-between !important; + } + .justify-content-lg-around { + justify-content: space-around !important; + } + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + .align-items-lg-start { + align-items: flex-start !important; + } + .align-items-lg-end { + align-items: flex-end !important; + } + .align-items-lg-center { + align-items: center !important; + } + .align-items-lg-baseline { + align-items: baseline !important; + } + .align-items-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-between { + align-content: space-between !important; + } + .align-content-lg-around { + align-content: space-around !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } + .order-lg-first { + order: -1 !important; + } + .order-lg-0 { + order: 0 !important; + } + .order-lg-1 { + order: 1 !important; + } + .order-lg-2 { + order: 2 !important; + } + .order-lg-3 { + order: 3 !important; + } + .order-lg-4 { + order: 4 !important; + } + .order-lg-5 { + order: 5 !important; + } + .order-lg-last { + order: 6 !important; + } + .m-lg-0 { + margin: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 3rem !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .me-lg-0 { + margin-right: 0 !important; + } + .me-lg-1 { + margin-right: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.5rem !important; + } + .me-lg-3 { + margin-right: 1rem !important; + } + .me-lg-4 { + margin-right: 1.5rem !important; + } + .me-lg-5 { + margin-right: 3rem !important; + } + .me-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 3rem !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ms-lg-0 { + margin-left: 0 !important; + } + .ms-lg-1 { + margin-left: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.5rem !important; + } + .ms-lg-3 { + margin-left: 1rem !important; + } + .ms-lg-4 { + margin-left: 1.5rem !important; + } + .ms-lg-5 { + margin-left: 3rem !important; + } + .ms-lg-auto { + margin-left: auto !important; + } + .p-lg-0 { + padding: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 3rem !important; + } + .pe-lg-0 { + padding-right: 0 !important; + } + .pe-lg-1 { + padding-right: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.5rem !important; + } + .pe-lg-3 { + padding-right: 1rem !important; + } + .pe-lg-4 { + padding-right: 1.5rem !important; + } + .pe-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 3rem !important; + } + .ps-lg-0 { + padding-left: 0 !important; + } + .ps-lg-1 { + padding-left: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .text-lg-start { + text-align: left !important; + } + .text-lg-end { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + .float-xl-end { + float: right !important; + } + .float-xl-none { + float: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-grid { + display: grid !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .d-xl-none { + display: none !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xl-start { + justify-content: flex-start !important; + } + .justify-content-xl-end { + justify-content: flex-end !important; + } + .justify-content-xl-center { + justify-content: center !important; + } + .justify-content-xl-between { + justify-content: space-between !important; + } + .justify-content-xl-around { + justify-content: space-around !important; + } + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + .align-items-xl-start { + align-items: flex-start !important; + } + .align-items-xl-end { + align-items: flex-end !important; + } + .align-items-xl-center { + align-items: center !important; + } + .align-items-xl-baseline { + align-items: baseline !important; + } + .align-items-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-between { + align-content: space-between !important; + } + .align-content-xl-around { + align-content: space-around !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } + .order-xl-first { + order: -1 !important; + } + .order-xl-0 { + order: 0 !important; + } + .order-xl-1 { + order: 1 !important; + } + .order-xl-2 { + order: 2 !important; + } + .order-xl-3 { + order: 3 !important; + } + .order-xl-4 { + order: 4 !important; + } + .order-xl-5 { + order: 5 !important; + } + .order-xl-last { + order: 6 !important; + } + .m-xl-0 { + margin: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 3rem !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .me-xl-0 { + margin-right: 0 !important; + } + .me-xl-1 { + margin-right: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.5rem !important; + } + .me-xl-3 { + margin-right: 1rem !important; + } + .me-xl-4 { + margin-right: 1.5rem !important; + } + .me-xl-5 { + margin-right: 3rem !important; + } + .me-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 3rem !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ms-xl-0 { + margin-left: 0 !important; + } + .ms-xl-1 { + margin-left: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.5rem !important; + } + .ms-xl-3 { + margin-left: 1rem !important; + } + .ms-xl-4 { + margin-left: 1.5rem !important; + } + .ms-xl-5 { + margin-left: 3rem !important; + } + .ms-xl-auto { + margin-left: auto !important; + } + .p-xl-0 { + padding: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 3rem !important; + } + .pe-xl-0 { + padding-right: 0 !important; + } + .pe-xl-1 { + padding-right: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.5rem !important; + } + .pe-xl-3 { + padding-right: 1rem !important; + } + .pe-xl-4 { + padding-right: 1.5rem !important; + } + .pe-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 3rem !important; + } + .ps-xl-0 { + padding-left: 0 !important; + } + .ps-xl-1 { + padding-left: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .text-xl-start { + text-align: left !important; + } + .text-xl-end { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + .float-xxl-end { + float: right !important; + } + .float-xxl-none { + float: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-grid { + display: grid !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .d-xxl-none { + display: none !important; + } + .flex-xxl-fill { + flex: 1 1 auto !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xxl-start { + justify-content: flex-start !important; + } + .justify-content-xxl-end { + justify-content: flex-end !important; + } + .justify-content-xxl-center { + justify-content: center !important; + } + .justify-content-xxl-between { + justify-content: space-between !important; + } + .justify-content-xxl-around { + justify-content: space-around !important; + } + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + .align-items-xxl-start { + align-items: flex-start !important; + } + .align-items-xxl-end { + align-items: flex-end !important; + } + .align-items-xxl-center { + align-items: center !important; + } + .align-items-xxl-baseline { + align-items: baseline !important; + } + .align-items-xxl-stretch { + align-items: stretch !important; + } + .align-content-xxl-start { + align-content: flex-start !important; + } + .align-content-xxl-end { + align-content: flex-end !important; + } + .align-content-xxl-center { + align-content: center !important; + } + .align-content-xxl-between { + align-content: space-between !important; + } + .align-content-xxl-around { + align-content: space-around !important; + } + .align-content-xxl-stretch { + align-content: stretch !important; + } + .align-self-xxl-auto { + align-self: auto !important; + } + .align-self-xxl-start { + align-self: flex-start !important; + } + .align-self-xxl-end { + align-self: flex-end !important; + } + .align-self-xxl-center { + align-self: center !important; + } + .align-self-xxl-baseline { + align-self: baseline !important; + } + .align-self-xxl-stretch { + align-self: stretch !important; + } + .order-xxl-first { + order: -1 !important; + } + .order-xxl-0 { + order: 0 !important; + } + .order-xxl-1 { + order: 1 !important; + } + .order-xxl-2 { + order: 2 !important; + } + .order-xxl-3 { + order: 3 !important; + } + .order-xxl-4 { + order: 4 !important; + } + .order-xxl-5 { + order: 5 !important; + } + .order-xxl-last { + order: 6 !important; + } + .m-xxl-0 { + margin: 0 !important; + } + .m-xxl-1 { + margin: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.5rem !important; + } + .m-xxl-3 { + margin: 1rem !important; + } + .m-xxl-4 { + margin: 1.5rem !important; + } + .m-xxl-5 { + margin: 3rem !important; + } + .m-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0 !important; + } + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + .mt-xxl-3 { + margin-top: 1rem !important; + } + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + .mt-xxl-5 { + margin-top: 3rem !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .me-xxl-0 { + margin-right: 0 !important; + } + .me-xxl-1 { + margin-right: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.5rem !important; + } + .me-xxl-3 { + margin-right: 1rem !important; + } + .me-xxl-4 { + margin-right: 1.5rem !important; + } + .me-xxl-5 { + margin-right: 3rem !important; + } + .me-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0 !important; + } + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ms-xxl-0 { + margin-left: 0 !important; + } + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + .ms-xxl-3 { + margin-left: 1rem !important; + } + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + .ms-xxl-5 { + margin-left: 3rem !important; + } + .ms-xxl-auto { + margin-left: auto !important; + } + .p-xxl-0 { + padding: 0 !important; + } + .p-xxl-1 { + padding: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.5rem !important; + } + .p-xxl-3 { + padding: 1rem !important; + } + .p-xxl-4 { + padding: 1.5rem !important; + } + .p-xxl-5 { + padding: 3rem !important; + } + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xxl-0 { + padding-top: 0 !important; + } + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + .pt-xxl-3 { + padding-top: 1rem !important; + } + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + .pt-xxl-5 { + padding-top: 3rem !important; + } + .pe-xxl-0 { + padding-right: 0 !important; + } + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + .pe-xxl-3 { + padding-right: 1rem !important; + } + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + .pe-xxl-5 { + padding-right: 3rem !important; + } + .pb-xxl-0 { + padding-bottom: 0 !important; + } + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + .ps-xxl-0 { + padding-left: 0 !important; + } + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .text-xxl-start { + text-align: left !important; + } + .text-xxl-end { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + .fs-2 { + font-size: 2rem !important; + } + .fs-3 { + font-size: 1.75rem !important; + } + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-grid { + display: grid !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } + .d-print-none { + display: none !important; + } +} +html, +body { + height: 100%; +} + +#layoutAuthentication { + display: flex; + flex-direction: column; + min-height: 100vh; +} +#layoutAuthentication #layoutAuthentication_content { + min-width: 0; + flex-grow: 1; +} +#layoutAuthentication #layoutAuthentication_footer { + min-width: 0; +} + +#layoutSidenav { + display: flex; +} +#layoutSidenav #layoutSidenav_nav { + flex-basis: 225px; + flex-shrink: 0; + transition: transform 0.15s ease-in-out; + z-index: 1038; + transform: translateX(-225px); +} +#layoutSidenav #layoutSidenav_content { + position: relative; + display: flex; + flex-direction: column; + justify-content: space-between; + min-width: 0; + flex-grow: 1; + min-height: calc(100vh - 56px); + margin-left: -225px; +} + +.sb-sidenav-toggled #layoutSidenav #layoutSidenav_nav { + transform: translateX(0); +} +.sb-sidenav-toggled #layoutSidenav #layoutSidenav_content:before { + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: #000; + z-index: 1037; + opacity: 0.5; + transition: opacity 0.3s ease-in-out; +} + +@media (min-width: 992px) { + #layoutSidenav #layoutSidenav_nav { + transform: translateX(0); + } + #layoutSidenav #layoutSidenav_content { + margin-left: 0; + transition: margin 0.15s ease-in-out; + } + .sb-sidenav-toggled #layoutSidenav #layoutSidenav_nav { + transform: translateX(-225px); + } + .sb-sidenav-toggled #layoutSidenav #layoutSidenav_content { + margin-left: -225px; + } + .sb-sidenav-toggled #layoutSidenav #layoutSidenav_content:before { + display: none; + } +} +.sb-nav-fixed .sb-topnav { + z-index: 1039; +} +.sb-nav-fixed #layoutSidenav #layoutSidenav_nav { + width: 225px; + height: 100vh; + z-index: 1038; +} +.sb-nav-fixed #layoutSidenav #layoutSidenav_nav .sb-sidenav { + padding-top: 56px; +} +.sb-nav-fixed #layoutSidenav #layoutSidenav_nav .sb-sidenav .sb-sidenav-menu { + overflow-y: auto; +} +.sb-nav-fixed #layoutSidenav #layoutSidenav_content { + padding-left: 225px; + top: 56px; +} + +#layoutError { + display: flex; + flex-direction: column; + min-height: 100vh; +} +#layoutError #layoutError_content { + min-width: 0; + flex-grow: 1; +} +#layoutError #layoutError_footer { + min-width: 0; +} + +.img-error { + max-width: 20rem; +} + +.nav .nav-link .sb-nav-link-icon, +.sb-sidenav-menu .nav-link .sb-nav-link-icon { + margin-right: 0.5rem; +} + +.sb-topnav { + padding-left: 0; + height: 56px; + z-index: 1039; +} +.sb-topnav .navbar-brand { + width: 225px; + margin: 0; +} +.sb-topnav.navbar-dark #sidebarToggle { + color: rgba(255, 255, 255, 0.5); +} +.sb-topnav.navbar-light #sidebarToggle { + color: #212529; +} + +.sb-sidenav { + display: flex; + flex-direction: column; + height: 100%; + flex-wrap: nowrap; +} +.sb-sidenav .sb-sidenav-menu { + flex-grow: 1; +} +.sb-sidenav .sb-sidenav-menu .nav { + flex-direction: column; + flex-wrap: nowrap; +} +.sb-sidenav .sb-sidenav-menu .nav .sb-sidenav-menu-heading { + padding: 1.75rem 1rem 0.75rem; + font-size: 0.75rem; + font-weight: bold; + text-transform: uppercase; +} +.sb-sidenav .sb-sidenav-menu .nav .nav-link { + display: flex; + align-items: center; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + position: relative; +} +.sb-sidenav .sb-sidenav-menu .nav .nav-link .sb-nav-link-icon { + font-size: 0.9rem; +} +.sb-sidenav .sb-sidenav-menu .nav .nav-link .sb-sidenav-collapse-arrow { + display: inline-block; + margin-left: auto; + transition: transform 0.15s ease; +} +.sb-sidenav .sb-sidenav-menu .nav .nav-link.collapsed .sb-sidenav-collapse-arrow { + transform: rotate(-90deg); +} +.sb-sidenav .sb-sidenav-menu .nav .sb-sidenav-menu-nested { + margin-left: 1.5rem; + flex-direction: column; +} +.sb-sidenav .sb-sidenav-footer { + padding: 0.75rem; + flex-shrink: 0; +} + +.sb-sidenav-dark { + background-color: #212529; + color: rgba(255, 255, 255, 0.5); +} +.sb-sidenav-dark .sb-sidenav-menu .sb-sidenav-menu-heading { + color: rgba(255, 255, 255, 0.25); +} +.sb-sidenav-dark .sb-sidenav-menu .nav-link { + color: rgba(255, 255, 255, 0.5); +} +.sb-sidenav-dark .sb-sidenav-menu .nav-link .sb-nav-link-icon { + color: rgba(255, 255, 255, 0.25); +} +.sb-sidenav-dark .sb-sidenav-menu .nav-link .sb-sidenav-collapse-arrow { + color: rgba(255, 255, 255, 0.25); +} +.sb-sidenav-dark .sb-sidenav-menu .nav-link:hover { + color: #fff; +} +.sb-sidenav-dark .sb-sidenav-menu .nav-link.active { + color: #fff; +} +.sb-sidenav-dark .sb-sidenav-menu .nav-link.active .sb-nav-link-icon { + color: #fff; +} +.sb-sidenav-dark .sb-sidenav-footer { + background-color: #343a40; +} + +.sb-sidenav-light { + background-color: #f8f9fa; + color: #212529; +} +.sb-sidenav-light .sb-sidenav-menu .sb-sidenav-menu-heading { + color: #adb5bd; +} +.sb-sidenav-light .sb-sidenav-menu .nav-link { + color: #212529; +} +.sb-sidenav-light .sb-sidenav-menu .nav-link .sb-nav-link-icon { + color: #adb5bd; +} +.sb-sidenav-light .sb-sidenav-menu .nav-link .sb-sidenav-collapse-arrow { + color: #adb5bd; +} +.sb-sidenav-light .sb-sidenav-menu .nav-link:hover { + color: #0d6efd; +} +.sb-sidenav-light .sb-sidenav-menu .nav-link.active { + color: #0d6efd; +} +.sb-sidenav-light .sb-sidenav-menu .nav-link.active .sb-nav-link-icon { + color: #0d6efd; +} +.sb-sidenav-light .sb-sidenav-footer { + background-color: #e9ecef; +} + +.datatable-wrapper .datatable-container { + font-size: 0.875rem; +} + +.datatable-wrapper.no-header .datatable-container { + border-top: none; +} + +.datatable-wrapper.no-footer .datatable-container { + border-bottom: none; +} + +.datatable-top { + padding: 0 0 1rem; +} + +.datatable-bottom { + padding: 0; +} + +.datatable-top > nav:first-child, +.datatable-top > div:first-child, +.datatable-bottom > nav:first-child, +.datatable-bottom > div:first-child { + float: left; +} + +.datatable-top > nav:last-child, +.datatable-top > div:last-child, +.datatable-bottom > nav:last-child, +.datatable-bottom > div:last-child { + float: right; +} + +.datatable-selector { + width: auto; + display: inline-block; + padding-left: 1.125rem; + padding-right: 2.125rem; + margin-right: 0.25rem; +} + +.datatable-info { + margin: 7px 0; +} + +/* PAGER */ +.datatable-pagination a:hover { + background-color: #e9ecef; +} + +.datatable-pagination .active a, +.datatable-pagination .active a:focus, +.datatable-pagination .active a:hover { + background-color: #0d6efd; +} + +.datatable-pagination .ellipsis a, +.datatable-pagination .disabled a, +.datatable-pagination .disabled a:focus, +.datatable-pagination .disabled a:hover { + cursor: not-allowed; +} + +.datatable-pagination .disabled a, +.datatable-pagination .disabled a:focus, +.datatable-pagination .disabled a:hover { + cursor: not-allowed; + opacity: 0.4; +} + +.datatable-pagination .pager a { + font-weight: bold; +} + +/* TABLE */ +.datatable-table { + border-collapse: collapse; +} + +.datatable-table > tbody > tr > td, +.datatable-table > tbody > tr > th, +.datatable-table > tfoot > tr > td, +.datatable-table > tfoot > tr > th, +.datatable-table > thead > tr > td, +.datatable-table > thead > tr > th { + vertical-align: top; + padding: 0.5rem 0.5rem; +} + +.datatable-table > thead > tr > th { + vertical-align: bottom; + text-align: left; + border-bottom: none; +} + +.datatable-table > tfoot > tr > th { + vertical-align: bottom; + text-align: left; +} + +.datatable-table th { + vertical-align: bottom; + text-align: left; +} + +.datatable-table th a { + text-decoration: none; + color: inherit; +} + +.datatable-sorter { + display: inline-block; + height: 100%; + position: relative; + width: 100%; + padding-right: 1rem; +} + +.datatable-sorter::before, +.datatable-sorter::after { + content: ""; + height: 0; + width: 0; + position: absolute; + right: 4px; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + opacity: 0.2; +} + +.datatable-sorter::before { + bottom: 4px; +} + +.datatable-sorter::after { + top: 0px; +} + +.asc .datatable-sorter::after, +.desc .datatable-sorter::before { + opacity: 0.6; +} + +.datatables-empty { + text-align: center; +} + +.datatable-top::after, +.datatable-bottom::after { + clear: both; + content: " "; + display: table; +} + +.datatable-pagination li.datatable-hidden { + visibility: visible; +} + +.btn-datatable { + height: 20px !important; + width: 20px !important; + font-size: 0.75rem; + border-radius: 0.375rem !important; +} + +#editOrderModal .modal-header { + text-align: center; + background-color: #007bff; + color: #fff; +} + +#editOrderModal .modal-header button.close { + background-color: transparent; + border: none; + font-size: 1.5rem; + color: #000; +} + +#editOrderModal .modal-header button.close:hover { + background-color: #f0f0f0; + color: #ff0000; +} + +#editOrderModal .modal-title { + margin: 0 auto; + width: 50%; +} + +#editOrderModal .modal-title, +#editOrderModal .modal-header h5 { + opacity: 1; +} + +.modal-body label { + font-size: 14px; + font-weight: 500; + margin: 8px 0; +} + +.modal-body input { + opacity: 0.7; + padding: 8px; + font-size: 12px; +} + +#addOrderModal .modal-header { + text-align: center; + background-color: #007bff; + color: #fff; +} + +#addOrderModal .modal-header button.close { + background-color: transparent; + border: none; + font-size: 1.5rem; + color: #000; +} + +#addOrderModal .modal-header button.close:hover { + background-color: #f0f0f0; + color: #ff0000; +} + +#addOrderModal .modal-title { + margin: 0 auto; + width: 50%; +} + +#addOrderModal .modal-title, +#addOrderModal .modal-header h5 { + opacity: 1; +} + +#deleteUserModal .modal-header { + text-align: center; + background-color: #007bff; + color: #fff; +} + +#deleteUserModal .modal-header button.close { + background-color: transparent; + border: none; + font-size: 1.5rem; + color: #000; +} + +#deleteUserModal .modal-header button.close:hover { + background-color: #f0f0f0; + color: #ff0000; +} + +#deleteUserModal .modal-title { + margin: 0 auto; + width: 50%; +} + +#deleteUserModal .modal-title, +#deleteUserModal .modal-header h5 { + opacity: 1; +} + +#editCategoryModal .modal-header { + text-align: center; + background-color: #007bff; + color: #fff; +} + +#editCategoryModal .modal-header button.close { + background-color: transparent; + border: none; + font-size: 1.5rem; + color: #000; +} + +#editCategoryModal .modal-header button.close:hover { + background-color: #f0f0f0; + color: #ff0000; +} + +#editCategoryModal .modal-title { + margin: 0 auto; + width: 50%; +} + +#editCategoryModal .modal-title, +#editCategoryModal .modal-header h5 { + opacity: 1; +} + +#addCategoryModal .modal-header { + text-align: center; + background-color: #007bff; + color: #fff; +} + +#addCategoryModal .modal-header button.close { + background-color: transparent; + border: none; + font-size: 1.5rem; + color: #000; +} + +#addCategoryModal .modal-header button.close:hover { + background-color: #f0f0f0; + color: #ff0000; +} + +#addCategoryModal .modal-title { + margin: 0 auto; + width: 50%; +} + +#addCategoryModal .modal-title, +#addCategoryrModal .modal-header h5 { + opacity: 1; +} + +#editProductModal .modal-header { + text-align: center; + background-color: #007bff; + color: #fff; +} + +#editProductModal .modal-header button.close { + background-color: transparent; + border: none; + font-size: 1.5rem; + color: #000; +} + +#editProductModal .modal-header button.close:hover { + background-color: #f0f0f0; + color: #ff0000; +} + +#editProductModal .modal-title { + margin: 0 auto; + width: 50%; +} + +#editProductModal .modal-title, +#editProductModal .modal-header h5 { + opacity: 1; +} + +#addProductModal .modal-header { + text-align: center; + background-color: #007bff; + color: #fff; +} + +#addProductModal .modal-header button.close { + background-color: transparent; + border: none; + font-size: 1.5rem; + color: #000; +} + +#addProductModal .modal-header button.close:hover { + background-color: #f0f0f0; + color: #ff0000; +} + +#addProductModal .modal-title { + margin: 0 auto; + width: 50%; +} + +#addProductModal .modal-title, +#addProductrModal .modal-header h5 { + opacity: 1; +} + +#deleteProductModal .modal-header { + text-align: center; + background-color: #007bff; + color: #fff; +} + +#deleteProductModal .modal-header button.close { + background-color: transparent; + border: none; + font-size: 1.5rem; + color: #000; +} + +#deleteProductModal .modal-header button.close:hover { + background-color: #f0f0f0; + color: #ff0000; +} + +#deleteProductModal .modal-title { + margin: 0 auto; + width: 50%; +} + +#deleteProductModal .modal-title, +#deleteProductModal .modal-header h5 { + opacity: 1; +} \ No newline at end of file diff --git a/src/main/webapp/assets/js/admin/add-category.js b/src/main/webapp/assets/js/admin/add-category.js new file mode 100644 index 00000000..d3e3d0e5 --- /dev/null +++ b/src/main/webapp/assets/js/admin/add-category.js @@ -0,0 +1,115 @@ +var currentId = 6; + +function openEditModal() { + $('#editCategoryModal').modal('show'); + selectedRowIndex = $(this).closest('tr').index(); +} + +function populateEditModalFields(row) { + var categoryName = row.cells[1].textContent.trim(); + + document.getElementById('editCategoryName').value = categoryName; +} + +function saveChanges() { + var editedCategoryName = document.getElementById('editCategoryName').value; + + console.log("Edited User Name:", editedCategoryName); + + var rowToUpdate = $('#datatablesSimple tbody tr').eq(selectedRowIndex); + + if (rowToUpdate.length > 0) { + rowToUpdate.find('td:eq(1)').text(editedCategoryName); + + closeEditModal(); + } else { + console.error("Row to update not found!"); + } +} + +function closeAddModal() { + $('#editCategoryModal').modal('hide'); +} + +function openAddModal() { + $('#addCategoryName').val(''); + + $('#addCategoryModal').modal('show'); +} + +function closeAddModal() { + $('#addCategoryModal').modal('hide'); +} + +function addNewCategory() { + var categoryName = $('#addCategoryName').val(); + var currentDateTime = getCurrentDateTime(); // Lấy giá trị ngày hiện tại + + console.log("Category Name:", categoryName); + console.log("Current Date/Time:", currentDateTime); + + currentId++; + + // Tạo dòng mới bằng cách sử dụng template string + var newRow = ` + + ${currentId} + ${categoryName} + ${currentDateTime} + NULL + NULL + + + + + `; + + // Thêm dòng vào bảng + $('#datatablesSimple tbody').append(newRow); + + closeAddModal(); +} + + +$(document).on('click', '.btn-tiny', function() { + openEditModal(); + populateEditModalFields($(this).closest('tr')[0]); +}); + +$(document).on('click', '#addCategoryBtn', function() { + openAddModal(); +}); + +$(document).on('click', '#cancelAddBtn', function() { + closeAddModal(); +}); + +$(document).on('click', '#saveChangesBtn', function() { + saveChanges(); +}); + +$(document).on('click', '#cancelChangesBtn', function() { + closeEditModal(); +}); + + + +function getCurrentDateTime() { + var currentDate = new Date(); + + var year = currentDate.getFullYear(); + var month = ('0' + (currentDate.getMonth() + 1)).slice(-2); // Thêm '0' và cắt chỉ lấy hai số cuối cùng + var day = ('0' + currentDate.getDate()).slice(-2); + var hours = ('0' + currentDate.getHours()).slice(-2); + var minutes = ('0' + currentDate.getMinutes()).slice(-2); + var seconds = ('0' + currentDate.getSeconds()).slice(-2); + + // Định dạng theo yêu cầu "YYYY-MM-DD HH:mm:ss" + var formattedDateTime = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds; + + return formattedDateTime; +} + +// Sử dụng hàm để cập nhật giá trị ngày hiện tại +var currentDateTime = getCurrentDateTime(); +console.log(currentDateTime); \ No newline at end of file diff --git a/src/main/webapp/assets/js/admin/chart-area-demo.js b/src/main/webapp/assets/js/admin/chart-area-demo.js new file mode 100644 index 00000000..f63ff916 --- /dev/null +++ b/src/main/webapp/assets/js/admin/chart-area-demo.js @@ -0,0 +1,54 @@ +// Set new default font family and font color to mimic Bootstrap's default styling +Chart.defaults.global.defaultFontFamily = '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif'; +Chart.defaults.global.defaultFontColor = '#292b2c'; + +// Area Chart Example +var ctx = document.getElementById("myAreaChart"); +var myLineChart = new Chart(ctx, { + type: 'line', + data: { + labels: ["Mar 1", "Mar 2", "Mar 3", "Mar 4", "Mar 5", "Mar 6", "Mar 7", "Mar 8", "Mar 9", "Mar 10", "Mar 11", "Mar 12", "Mar 13"], + datasets: [{ + label: "Sessions", + lineTension: 0.3, + backgroundColor: "rgba(2,117,216,0.2)", + borderColor: "rgba(2,117,216,1)", + pointRadius: 5, + pointBackgroundColor: "rgba(2,117,216,1)", + pointBorderColor: "rgba(255,255,255,0.8)", + pointHoverRadius: 5, + pointHoverBackgroundColor: "rgba(2,117,216,1)", + pointHitRadius: 50, + pointBorderWidth: 2, + data: [10000, 30162, 26263, 18394, 18287, 28682, 31274, 33259, 25849, 24159, 32651, 31984, 38451], + }], + }, + options: { + scales: { + xAxes: [{ + time: { + unit: 'date' + }, + gridLines: { + display: false + }, + ticks: { + maxTicksLimit: 7 + } + }], + yAxes: [{ + ticks: { + min: 0, + max: 40000, + maxTicksLimit: 5 + }, + gridLines: { + color: "rgba(0, 0, 0, .125)", + } + }], + }, + legend: { + display: false + } + } +}); diff --git a/src/main/webapp/assets/js/admin/chart-bar-demo.js b/src/main/webapp/assets/js/admin/chart-bar-demo.js new file mode 100644 index 00000000..049ad204 --- /dev/null +++ b/src/main/webapp/assets/js/admin/chart-bar-demo.js @@ -0,0 +1,46 @@ +// Set new default font family and font color to mimic Bootstrap's default styling +Chart.defaults.global.defaultFontFamily = '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif'; +Chart.defaults.global.defaultFontColor = '#292b2c'; + +// Bar Chart Example +var ctx = document.getElementById("myBarChart"); +var myLineChart = new Chart(ctx, { + type: 'bar', + data: { + labels: ["January", "February", "March", "April", "May", "June"], + datasets: [{ + label: "Revenue", + backgroundColor: "rgba(2,117,216,1)", + borderColor: "rgba(2,117,216,1)", + data: [4215, 5312, 6251, 7841, 9821, 14984], + }], + }, + options: { + scales: { + xAxes: [{ + time: { + unit: 'month' + }, + gridLines: { + display: false + }, + ticks: { + maxTicksLimit: 6 + } + }], + yAxes: [{ + ticks: { + min: 0, + max: 15000, + maxTicksLimit: 5 + }, + gridLines: { + display: true + } + }], + }, + legend: { + display: false + } + } +}); diff --git a/src/main/webapp/assets/js/admin/chart-pie-demo.js b/src/main/webapp/assets/js/admin/chart-pie-demo.js new file mode 100644 index 00000000..4e16c415 --- /dev/null +++ b/src/main/webapp/assets/js/admin/chart-pie-demo.js @@ -0,0 +1,16 @@ +// Set new default font family and font color to mimic Bootstrap's default styling +Chart.defaults.global.defaultFontFamily = '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif'; +Chart.defaults.global.defaultFontColor = '#292b2c'; + +// Pie Chart Example +var ctx = document.getElementById("myPieChart"); +var myPieChart = new Chart(ctx, { + type: 'pie', + data: { + labels: ["Blue", "Red", "Yellow", "Green"], + datasets: [{ + data: [12.21, 15.58, 11.25, 8.32], + backgroundColor: ['#007bff', '#dc3545', '#ffc107', '#28a745'], + }], + }, +}); diff --git a/src/main/webapp/assets/js/admin/datatables-demo.js b/src/main/webapp/assets/js/admin/datatables-demo.js new file mode 100644 index 00000000..f2eecbfe --- /dev/null +++ b/src/main/webapp/assets/js/admin/datatables-demo.js @@ -0,0 +1,4 @@ +// Call the dataTables jQuery plugin +$(document).ready(function() { + $('#dataTable').DataTable(); +}); diff --git a/src/main/webapp/assets/js/admin/edit-category.js b/src/main/webapp/assets/js/admin/edit-category.js new file mode 100644 index 00000000..403d48a9 --- /dev/null +++ b/src/main/webapp/assets/js/admin/edit-category.js @@ -0,0 +1,56 @@ +var selectedRowIndex; + +function openEditModal() { + $('#editCategoryModal').modal('show'); + // Lưu index của hàng được chọn + selectedRowIndex = $(this).closest('tr').index(); +} + +// Function to populate fields in the edit modal with existing data +function populateEditModalFields(row) { + var categoryName = row.cells[1].textContent.trim(); + + document.getElementById('editCategoryName').value = categoryName; +} + +function saveChanges() { + // Lấy giá trị từ modal + var editedCategoryName = document.getElementById('editCategoryName').value; + + // Kiểm tra giá trị có đọc được không + console.log("Edited Category Name:", editedCategoryName); + + // Cập nhật hàng trong bảng + var rowToUpdate = $('#datatablesSimple tbody tr').eq(selectedRowIndex); + console.log("Row to update:", rowToUpdate); + + // Kiểm tra có lấy được hàng cần update không + if (rowToUpdate.length > 0) { + rowToUpdate.find('td:eq(1)').text(editedCategoryName); + + // Đóng modal + closeEditModal(); + } else { + console.error("Row to update not found!"); + } +} + +// Function to close the edit modal +function closeEditModal() { + $('#editCategoryModal').modal('hide'); +} + +// Event delegation to handle dynamically added elements +$(document).on('click', '.btn-tiny', function () { + openEditModal.call(this); // Phải gọi hàm openEditModal với this là element được click + populateEditModalFields($(this).closest('tr')[0]); +}); + +// Event delegation for dynamically added elements inside the modal +$(document).on('click', '#saveChangesBtn', function () { + saveChanges(); +}); + +$(document).on('click', '#cancelChangesBtn', function () { + closeEditModal(); +}); \ No newline at end of file diff --git a/src/main/webapp/view/admin/category-management.jsp b/src/main/webapp/view/admin/category-management.jsp new file mode 100644 index 00000000..a469ede5 --- /dev/null +++ b/src/main/webapp/view/admin/category-management.jsp @@ -0,0 +1,223 @@ +<%-- + Document : category-management + Created on : Dec 7, 2023, 12:53:12 PM + Author : Admin +--%> +<%@page import="io.hardingadonis.miu.services.Singleton"%> +<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + + + + + Category Management + + + + + + + + +
+ +
+
+
+

List Category

+ +
+ +
+
+
+ + Category Table +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
IDNameCreate_atUpdate_atDelete_atActions
${c.ID}${c.name}${c.createAt}${c.updateAt}${c.deleteAt} + + + + +
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + From 81559b2f6c4ebe413e77f19175193913f953dde9 Mon Sep 17 00:00:00 2001 From: yuhtnguyen Date: Thu, 7 Dec 2023 17:52:44 +0700 Subject: [PATCH 15/16] view detail of product --- .../controller/admin/ProductManagement.java | 26 ++ .../io/hardingadonis/miu/dao/CategoryDAO.java | 3 + .../dao/impl/mysql/CategoryDAOMySQLImpl.java | 20 ++ .../webapp/assets/js/admin/add-product.js | 136 +++++++ .../webapp/assets/js/admin/delete-product.js | 30 ++ .../webapp/assets/js/admin/edit-product.js | 72 ++++ .../assets/js/admin/view-detail-product.js | 101 ++++++ .../webapp/view/admin/product-management.jsp | 339 ++++++++++++++++++ 8 files changed, 727 insertions(+) create mode 100644 src/main/java/io/hardingadonis/miu/controller/admin/ProductManagement.java create mode 100644 src/main/webapp/assets/js/admin/add-product.js create mode 100644 src/main/webapp/assets/js/admin/delete-product.js create mode 100644 src/main/webapp/assets/js/admin/edit-product.js create mode 100644 src/main/webapp/assets/js/admin/view-detail-product.js create mode 100644 src/main/webapp/view/admin/product-management.jsp diff --git a/src/main/java/io/hardingadonis/miu/controller/admin/ProductManagement.java b/src/main/java/io/hardingadonis/miu/controller/admin/ProductManagement.java new file mode 100644 index 00000000..24b51801 --- /dev/null +++ b/src/main/java/io/hardingadonis/miu/controller/admin/ProductManagement.java @@ -0,0 +1,26 @@ +package io.hardingadonis.miu.controller.admin; + +import io.hardingadonis.miu.services.Singleton; +import java.io.*; +import javax.servlet.*; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +@WebServlet(name = "ProductManagement", urlPatterns = {"/productmanagement"}) +public class ProductManagement extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + + request.getRequestDispatcher("/view/admin/product-management.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + +} diff --git a/src/main/java/io/hardingadonis/miu/dao/CategoryDAO.java b/src/main/java/io/hardingadonis/miu/dao/CategoryDAO.java index f5860b7b..563b4568 100644 --- a/src/main/java/io/hardingadonis/miu/dao/CategoryDAO.java +++ b/src/main/java/io/hardingadonis/miu/dao/CategoryDAO.java @@ -16,4 +16,7 @@ public interface CategoryDAO { public void delete(int ID); public int count(); + + public String getNameCategory(int ID); + } diff --git a/src/main/java/io/hardingadonis/miu/dao/impl/mysql/CategoryDAOMySQLImpl.java b/src/main/java/io/hardingadonis/miu/dao/impl/mysql/CategoryDAOMySQLImpl.java index aebf1116..12e296a1 100644 --- a/src/main/java/io/hardingadonis/miu/dao/impl/mysql/CategoryDAOMySQLImpl.java +++ b/src/main/java/io/hardingadonis/miu/dao/impl/mysql/CategoryDAOMySQLImpl.java @@ -66,6 +66,26 @@ public Category get(int ID) { return category; } + public String getNameCategory(int ID) { + try { + Connection conn = Singleton.dbContext.getConnection(); + + PreparedStatement smt = conn.prepareStatement("SELECT name FROM category WHERE id = ? AND delete_at IS NULL"); + smt.setInt(1, ID); + + ResultSet rs = smt.executeQuery(); + + if (rs.next()) { + return rs.getString("name"); + } + + Singleton.dbContext.closeConnection(conn); + } catch (SQLException ex) { + System.err.println(ex.getMessage()); + } + return null; + } + @Override public void insert(Category obj) { try { diff --git a/src/main/webapp/assets/js/admin/add-product.js b/src/main/webapp/assets/js/admin/add-product.js new file mode 100644 index 00000000..43993ddd --- /dev/null +++ b/src/main/webapp/assets/js/admin/add-product.js @@ -0,0 +1,136 @@ + +var currentId = 1; + +function openEditModal() { + $('#editProductModal').modal('show'); + selectedRowIndex = $(this).closest('tr').index(); +} + +function populateEditModalFields(row) { + var productName = row.cells[1].textContent.trim(); + var category = row.cells[2].textContent.trim(); + var price = row.cells[3].textContent.trim(); + var amount = row.cells[4].textContent.trim(); + + document.getElementById('editProductName').value = productName; + document.getElementById('editCategory').value = category; + document.getElementById('editPrice').value = price; + document.getElementById('editAmount').value = amount; +} + +function saveChanges() { + var editedProductName = document.getElementById('editProductName').value; + var editedCategory = document.getElementById('editCategory').value; + var editedPrice = document.getElementById('editPrice').value; + var editedAmount = document.getElementById('editAmount').value; + + console.log("Edited Product Name:", editedProductName); // .... + + var rowToUpdate = $('#datatablesSimple tbody tr').eq(selectedRowIndex); + + if (rowToUpdate.length > 0) { + rowToUpdate.find('td:eq(1)').text(editedProductName); + rowToUpdate.find('td:eq(2)').text(editedCategory); + rowToUpdate.find('td:eq(3)').text(editedPrice); + rowToUpdate.find('td:eq(4)').text(editedAmount); + + closeAddModal(); + } else { + console.error("Row to update not found!"); + } +} + +function closeAddModal() { + $('#editProductModal').modal('hide'); +} + +function openAddModal() { + $('#addProductName').val(''); + + $('#addProductModal').modal('show'); +} + +function closeAddModal() { + $('#addProductModal').modal('hide'); +} + +function addNewProduct() { + var productName = $('#addProductName').val(); + var category = $('#addCategory').val(); + var price = $('#addPrice').val(); + var amount = $('#addAmount').val(); + var currentDateTime = getCurrentDateTime(); // Lấy giá trị ngày hiện tại + + console.log("Product Name:", ProductName); + console.log("Current Date/Time:", currentDateTime); // .... + // Còn cột thumnail là upload ảnh lên, GPT nhé + + currentId++; + + // Tạo dòng mới bằng cách sử dụng template string + var newRow = ` + + ${currentId} + ${productName} + ${category} + ${price} + ${amount} + NULL + ${currentDateTime} + NULL + NULL + + + + + `; + + // Thêm dòng vào bảng + $('#datatablesSimple tbody').append(newRow); + + closeAddModal(); +} + + +$(document).on('click', '.btn-info.btn-tiny', function() { + openEditModal(); + populateEditModalFields($(this).closest('tr')[0]); +}); + +$(document).on('click', '#addProductBtn', function() { + openAddModal(); +}); + +$(document).on('click', '#cancelAddBtn', function() { + closeAddModal(); +}); + +$(document).on('click', '#saveChangesBtn', function() { + saveChanges(); +}); + +$(document).on('click', '#cancelChangesBtn', function() { + closeEditModal(); +}); + + + +function getCurrentDateTime() { + var currentDate = new Date(); + + var year = currentDate.getFullYear(); + var month = ('0' + (currentDate.getMonth() + 1)).slice(-2); // Thêm '0' và cắt chỉ lấy hai số cuối cùng + var day = ('0' + currentDate.getDate()).slice(-2); + var hours = ('0' + currentDate.getHours()).slice(-2); + var minutes = ('0' + currentDate.getMinutes()).slice(-2); + var seconds = ('0' + currentDate.getSeconds()).slice(-2); + + // Định dạng theo yêu cầu "YYYY-MM-DD HH:mm:ss" + var formattedDateTime = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds; + + return formattedDateTime; +} + +// Sử dụng hàm để cập nhật giá trị ngày hiện tại +var currentDateTime = getCurrentDateTime(); +console.log(currentDateTime); diff --git a/src/main/webapp/assets/js/admin/delete-product.js b/src/main/webapp/assets/js/admin/delete-product.js new file mode 100644 index 00000000..c0bd612a --- /dev/null +++ b/src/main/webapp/assets/js/admin/delete-product.js @@ -0,0 +1,30 @@ +var selectedProductRowIndex; + +function openDeleteModal() { + $('#deleteProductModal').modal('show'); + // Lưu index của hàng được chọn + selectedProductRowIndex = $(this).closest('tr').index(); +} + +function closeDeleteModal() { + $('#deleteProductModal').modal('hide'); +} + +function deleteProduct() { + console.log("Deleting product..."); + + // Thực hiện các bước cần thiết để xóa user + // ... + + // Xóa hàng trong bảng + var rowToDelete = $('#datatablesSimple tbody tr').eq(selectedProductRowIndex); + rowToDelete.remove(); + + // Đóng modal + closeDeleteModal(); +} + +// Event delegation to handle dynamically added elements +$(document).on('click', '.btn-danger', function() { + openDeleteModal(); +}); \ No newline at end of file diff --git a/src/main/webapp/assets/js/admin/edit-product.js b/src/main/webapp/assets/js/admin/edit-product.js new file mode 100644 index 00000000..b287ae53 --- /dev/null +++ b/src/main/webapp/assets/js/admin/edit-product.js @@ -0,0 +1,72 @@ +var selectedRowIndex; + +function openEditModal() { + $('#editProductModal').modal('show'); + // Lưu index của hàng được chọn + selectedRowIndex = $(this).closest('tr').index(); +} + +// Function to populate fields in the edit modal with existing data +function populateEditModalFields(row) { + var productName = row.cells[1].textContent.trim(); + var category = row.cells[2].textContent.trim(); + var price = row.cells[3].textContent.trim(); + var amount = row.cells[4].textContent.trim(); + + document.getElementById('editProductName').value = productName; + document.getElementById('editCategory').value = category; + document.getElementById('editPrice').value = price; + document.getElementById('editAmount').value = amount; +} + +function saveChanges() { + // Lấy giá trị từ modal + var editedProductName = document.getElementById('editProductName').value; + var editedCategory = document.getElementById('editCategory').value; + var editedPrice = document.getElementById('editPrice').value; + var editedAmount = document.getElementById('editAmount').value; + + // Kiểm tra giá trị có đọc được không + console.log("Edited Product Name:", editedProductName); + console.log("Edited Category:", editedCategory); + console.log("Edited Price:", editedPrice); + console.log("Edited Amount:", editedAmount); + + // Cập nhật hàng trong bảng + var rowToUpdate = $('#datatablesSimple tbody tr').eq(selectedRowIndex); + console.log("Row to update:", rowToUpdate); + + // Kiểm tra có lấy được hàng cần update không + if (rowToUpdate.length > 0) { + rowToUpdate.find('td:eq(1)').text(editedProductName); + rowToUpdate.find('td:eq(2)').text(editedCategory); + rowToUpdate.find('td:eq(3)').text(editedPrice); + rowToUpdate.find('td:eq(4)').text(editedAmount); + + // Đóng modal + closeEditModal(); + } else { + console.error("Row to update not found!"); + } +} + +// Function to close the edit modal +function closeEditModal() { + $('#editProductModal').modal('hide'); +} + +// Event delegation to handle dynamically added elements +$(document).on('click', '.btn-info.btn-tiny', function () { + openEditModal.call(this); // Phải gọi hàm openEditModal với this là element được click + populateEditModalFields($(this).closest('tr')[0]); +}); + +// Event delegation for dynamically added elements inside the modal +$(document).on('click', '.btn-save-changes', function () { + saveChanges(); +}); + +$(document).on('click', '.btn-cancel-changes', function () { + closeEditModal(); +}); + diff --git a/src/main/webapp/assets/js/admin/view-detail-product.js b/src/main/webapp/assets/js/admin/view-detail-product.js new file mode 100644 index 00000000..52c49adb --- /dev/null +++ b/src/main/webapp/assets/js/admin/view-detail-product.js @@ -0,0 +1,101 @@ +// view-detail-product.js + +$(document).ready(function () { + // Handle click on "View Detail" button + $('.btn-view-detail').on('click', function (e) { + e.preventDefault(); + + // Get the data from the row + var id = $(this).closest('tr').find('td:eq(0)').text(); + var name = $(this).closest('tr').find('td:eq(1)').text(); + var category = $(this).closest('tr').find('td:eq(2)').text(); + var price = $(this).closest('tr').find('td:eq(3)').text(); + var amount = $(this).closest('tr').find('td:eq(4)').text(); + var thumbnail = $(this).closest('tr').find('td:eq(5) img').attr('src'); + + var brand = $('.brand').val(); + var origin = $('.origin').val(); + var expiryDate = $('.expiryDate').val(); + var weight = $('.weight').val(); + var preservation = $('.preservation').val(); + var images = $('.images').val(); + var createAt = $('.createAt').val(); + var updateAt = $('.updateAt').val(); + var deleteAt = $('.deleteAt').val(); + + + // Create HTML for the detail table + var detailTable = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID${id}
Brand${brand}
Name${name}
Category${category}
Origin${origin}
Expiry Date${expiryDate}
Weight${weight}
Preservation${preservation}
Price${price}
Amount${amount}
Thumbnail${name}
Images${name}
Create At${createAt}
Update At${updateAt}
Delete At${deleteAt}
+ `; + + // Display the detail table in a modal + $('#detailModal .modal-body').html(detailTable); + $('#detailModal').modal('show'); + }); +}); + diff --git a/src/main/webapp/view/admin/product-management.jsp b/src/main/webapp/view/admin/product-management.jsp new file mode 100644 index 00000000..f7b7d111 --- /dev/null +++ b/src/main/webapp/view/admin/product-management.jsp @@ -0,0 +1,339 @@ +<%-- + Document : product-management + Created on : Dec 7, 2023, 3:27:52 PM + Author : Admin +--%> +<%@page import="io.hardingadonis.miu.services.Singleton"%> +<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + + + + + Product Management + + + + + + + + +
+ +
+
+
+

List Product

+ +
+ +
+
+
+ + Product Table +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameCategoryPriceAmountThumbnailActions
${p.ID}${p.name} + ${Singleton.categoryDAO.getNameCategory(p.categoryID)} + ${p.price}${p.amount} + + + + + + + + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From cbd36d0c9067ed1f588ce1ad48ce66cc8bc772c6 Mon Sep 17 00:00:00 2001 From: yuhtnguyen Date: Thu, 7 Dec 2023 22:52:29 +0700 Subject: [PATCH 16/16] add new product --- .../controller/admin/CategoryManagement.java | 5 + .../controller/admin/ProductManagement.java | 24 +++ .../webapp/assets/js/admin/add-product.js | 160 ++++-------------- .../webapp/assets/js/admin/delete-product.js | 76 +++++---- .../webapp/view/admin/product-management.jsp | 124 +++----------- 5 files changed, 127 insertions(+), 262 deletions(-) diff --git a/src/main/java/io/hardingadonis/miu/controller/admin/CategoryManagement.java b/src/main/java/io/hardingadonis/miu/controller/admin/CategoryManagement.java index 255b0689..ae963965 100644 --- a/src/main/java/io/hardingadonis/miu/controller/admin/CategoryManagement.java +++ b/src/main/java/io/hardingadonis/miu/controller/admin/CategoryManagement.java @@ -6,10 +6,12 @@ import java.io.*; import java.util.*; import javax.servlet.*; +import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; @WebServlet(name = "CategoryManagement", urlPatterns = {"/categorymanagement"}) +@MultipartConfig public class CategoryManagement extends HttpServlet { @Override @@ -25,6 +27,9 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + } } diff --git a/src/main/java/io/hardingadonis/miu/controller/admin/ProductManagement.java b/src/main/java/io/hardingadonis/miu/controller/admin/ProductManagement.java index 24b51801..011dc0a7 100644 --- a/src/main/java/io/hardingadonis/miu/controller/admin/ProductManagement.java +++ b/src/main/java/io/hardingadonis/miu/controller/admin/ProductManagement.java @@ -5,6 +5,7 @@ import javax.servlet.*; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; +import org.json.simple.JSONObject; @WebServlet(name = "ProductManagement", urlPatterns = {"/productmanagement"}) public class ProductManagement extends HttpServlet { @@ -21,6 +22,29 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // Handle form submission here + } + + @Override + protected void doDelete(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + int ID = Integer.parseInt(request.getParameter("id")); + + Singleton.productDAO.delete(ID); + + JSONObject jsonResponse = new JSONObject(); + jsonResponse.put("status", "success"); + jsonResponse.put("message", "User canceled successfully"); + + response.setContentType("application/json"); + response.getWriter().write(jsonResponse.toString()); + + response.setStatus(HttpServletResponse.SC_OK); + + } catch (NumberFormatException ex) { + System.err.println(ex.getMessage()); + } } } diff --git a/src/main/webapp/assets/js/admin/add-product.js b/src/main/webapp/assets/js/admin/add-product.js index 43993ddd..4202b549 100644 --- a/src/main/webapp/assets/js/admin/add-product.js +++ b/src/main/webapp/assets/js/admin/add-product.js @@ -1,136 +1,36 @@ +// add-product.js -var currentId = 1; - -function openEditModal() { - $('#editProductModal').modal('show'); - selectedRowIndex = $(this).closest('tr').index(); -} - -function populateEditModalFields(row) { - var productName = row.cells[1].textContent.trim(); - var category = row.cells[2].textContent.trim(); - var price = row.cells[3].textContent.trim(); - var amount = row.cells[4].textContent.trim(); - - document.getElementById('editProductName').value = productName; - document.getElementById('editCategory').value = category; - document.getElementById('editPrice').value = price; - document.getElementById('editAmount').value = amount; -} - -function saveChanges() { - var editedProductName = document.getElementById('editProductName').value; - var editedCategory = document.getElementById('editCategory').value; - var editedPrice = document.getElementById('editPrice').value; - var editedAmount = document.getElementById('editAmount').value; - - console.log("Edited Product Name:", editedProductName); // .... - - var rowToUpdate = $('#datatablesSimple tbody tr').eq(selectedRowIndex); - - if (rowToUpdate.length > 0) { - rowToUpdate.find('td:eq(1)').text(editedProductName); - rowToUpdate.find('td:eq(2)').text(editedCategory); - rowToUpdate.find('td:eq(3)').text(editedPrice); - rowToUpdate.find('td:eq(4)').text(editedAmount); - - closeAddModal(); - } else { - console.error("Row to update not found!"); - } -} - -function closeAddModal() { - $('#editProductModal').modal('hide'); -} - +// Function to open the Add Product Modal function openAddModal() { - $('#addProductName').val(''); - $('#addProductModal').modal('show'); } -function closeAddModal() { - $('#addProductModal').modal('hide'); -} - -function addNewProduct() { - var productName = $('#addProductName').val(); - var category = $('#addCategory').val(); - var price = $('#addPrice').val(); - var amount = $('#addAmount').val(); - var currentDateTime = getCurrentDateTime(); // Lấy giá trị ngày hiện tại - - console.log("Product Name:", ProductName); - console.log("Current Date/Time:", currentDateTime); // .... - // Còn cột thumnail là upload ảnh lên, GPT nhé - - currentId++; - - // Tạo dòng mới bằng cách sử dụng template string - var newRow = ` - - ${currentId} - ${productName} - ${category} - ${price} - ${amount} - NULL - ${currentDateTime} - NULL - NULL - - - - - `; - - // Thêm dòng vào bảng - $('#datatablesSimple tbody').append(newRow); - - closeAddModal(); -} - - -$(document).on('click', '.btn-info.btn-tiny', function() { - openEditModal(); - populateEditModalFields($(this).closest('tr')[0]); -}); - -$(document).on('click', '#addProductBtn', function() { - openAddModal(); -}); - -$(document).on('click', '#cancelAddBtn', function() { - closeAddModal(); -}); - -$(document).on('click', '#saveChangesBtn', function() { - saveChanges(); +// Function to handle form submission +$(document).ready(function () { + $('#addProductForm').submit(function (e) { + e.preventDefault(); + + // Serialize form data + var formData = $(this).serialize(); + + // AJAX request to send form data to the server for processing + $.ajax({ + type: 'POST', + url: 'productmanagement', // Update with the actual URL + data: formData, + success: function (response) { + // Handle success response + console.log(response); + + // Close the modal after successful submission + $('#addProductModal').modal('hide'); + + // Optionally, you can update the product list or perform other actions + }, + error: function (error) { + // Handle error response + console.error(error.responseText); + } + }); + }); }); - -$(document).on('click', '#cancelChangesBtn', function() { - closeEditModal(); -}); - - - -function getCurrentDateTime() { - var currentDate = new Date(); - - var year = currentDate.getFullYear(); - var month = ('0' + (currentDate.getMonth() + 1)).slice(-2); // Thêm '0' và cắt chỉ lấy hai số cuối cùng - var day = ('0' + currentDate.getDate()).slice(-2); - var hours = ('0' + currentDate.getHours()).slice(-2); - var minutes = ('0' + currentDate.getMinutes()).slice(-2); - var seconds = ('0' + currentDate.getSeconds()).slice(-2); - - // Định dạng theo yêu cầu "YYYY-MM-DD HH:mm:ss" - var formattedDateTime = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds; - - return formattedDateTime; -} - -// Sử dụng hàm để cập nhật giá trị ngày hiện tại -var currentDateTime = getCurrentDateTime(); -console.log(currentDateTime); diff --git a/src/main/webapp/assets/js/admin/delete-product.js b/src/main/webapp/assets/js/admin/delete-product.js index c0bd612a..9df93402 100644 --- a/src/main/webapp/assets/js/admin/delete-product.js +++ b/src/main/webapp/assets/js/admin/delete-product.js @@ -1,30 +1,48 @@ -var selectedProductRowIndex; +function deleteProduct(id) { + Swal.fire({ + title: "Delete product?", + text: "You really want to delete this product?", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33", + confirmButtonText: "Delete!", + cancelButtonText: "No!" + }).then((result) => { + if (result.isConfirmed) { + const url = "productmanagement?id=" + id; -function openDeleteModal() { - $('#deleteProductModal').modal('show'); - // Lưu index của hàng được chọn - selectedProductRowIndex = $(this).closest('tr').index(); -} - -function closeDeleteModal() { - $('#deleteProductModal').modal('hide'); -} - -function deleteProduct() { - console.log("Deleting product..."); - - // Thực hiện các bước cần thiết để xóa user - // ... - - // Xóa hàng trong bảng - var rowToDelete = $('#datatablesSimple tbody tr').eq(selectedProductRowIndex); - rowToDelete.remove(); - - // Đóng modal - closeDeleteModal(); -} - -// Event delegation to handle dynamically added elements -$(document).on('click', '.btn-danger', function() { - openDeleteModal(); -}); \ No newline at end of file + $.ajax({ + url: url, + type: "DELETE", + dataType: "json", + success: function (data) { + if (data.status === "success") { + Swal.fire({ + title: "Success!", + text: "You delete product success!", + icon: "success" + }).then((result) => { + if (result.isConfirmed) { + window.location.reload(); + } + }); + } else { + Swal.fire({ + title: "Oops...", + text: "Something was wrong!", + icon: "error" + }); + } + }, + error: function () { + Swal.fire({ + title: "Oops...", + text: "Something was wrong when send the request!", + icon: "error" + }); + } + }); + } + }); +} \ No newline at end of file diff --git a/src/main/webapp/view/admin/product-management.jsp b/src/main/webapp/view/admin/product-management.jsp index f7b7d111..148c58bc 100644 --- a/src/main/webapp/view/admin/product-management.jsp +++ b/src/main/webapp/view/admin/product-management.jsp @@ -131,9 +131,9 @@ - + @@ -144,9 +144,6 @@ - - - @@ -212,107 +209,29 @@ - - - - - -