diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..7f4acbd --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,114 @@ +name: Build (Test Only) + +on: + pull_request: + branches: + - main + +env: + APP_NAME: securebank + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - platform: linux + executable: crow_bank_app + archive_format: tar.gz + - platform: windows + executable: crow_bank_app.exe + archive_format: zip + defaults: + run: + working-directory: crow-bank-app + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: | + /usr/include/boost + /usr/lib/x86_64-linux-gnu/libboost* + key: ubuntu-boost-${{ hashFiles('**/CMakeLists.txt') }} + restore-keys: | + ubuntu-boost- + + - name: Set up dependencies + run: | + sudo apt-get update + sudo apt-get install -y cmake g++ make zip + sudo apt-get install -y mingw-w64 + sudo apt-get install -y libboost-all-dev + sudo apt-get install -y libboost-all-dev:amd64 + wget -q https://github.com/microsoft/vcpkg/archive/refs/heads/master.zip + unzip -q master.zip + cd vcpkg-master + ./bootstrap-vcpkg.sh + ./vcpkg install boost-algorithm:x64-mingw-static boost-system:x64-mingw-static + cd .. + sudo apt-get install -y libboost-dev-mingw-w64 || echo "MinGW Boost not available, using alternative approach" + echo "Checking Boost installation:" + ls -la /usr/include/boost/ | head -5 + echo "Boost algorithm headers:" + ls -la /usr/include/boost/algorithm/ | head -5 + echo "MinGW compiler location:" + which x86_64-w64-mingw32-g++ + echo "MinGW include paths:" + x86_64-w64-mingw32-g++ -v -E -x c++ - < /dev/null 2>&1 | grep -A 20 "search starts here" + + - name: Prepare Boost headers for MinGW (Windows only) + if: matrix.platform == 'windows' + run: | + BOOST_SRC=/usr/include/boost + MINGW_INCLUDE=/usr/x86_64-w64-mingw32/include/boost + if [ ! -d "$MINGW_INCLUDE" ]; then + sudo mkdir -p /usr/x86_64-w64-mingw32/include + sudo cp -r $BOOST_SRC /usr/x86_64-w64-mingw32/include/ + fi + + - name: Configure and Build + run: | + if [ "${{ matrix.platform }}" == "linux" ]; then + echo "🐧 Building for Linux..." + mkdir -p build-linux + cd build-linux + cmake .. -DCMAKE_BUILD_TYPE=Release + make -j$(nproc) + cp crow_bank_app ../crow_bank_app + else + echo "đŸĒŸ Building for Windows (cross-compilation)..." + mkdir -p win-build + cd win-build + cmake .. -DCMAKE_TOOLCHAIN_FILE=../win-toolchain.cmake -DCMAKE_BUILD_TYPE=Release + make -j$(nproc) + cp crow_bank_app.exe ../crow_bank_app.exe + fi + + - name: Verify build output + run: | + ls -la + if [ ! -f "${{ matrix.executable }}" ]; then + echo "Error: Expected executable ${{ matrix.executable }} not found" + exit 1 + fi + + - name: Prepare test artifact + run: | + PACKAGE_DIR="${{ env.APP_NAME }}-${{ matrix.platform }}" + mkdir -p "$PACKAGE_DIR" + cp -r public "$PACKAGE_DIR/public" + cp README.md "$PACKAGE_DIR/README.txt" || echo "No README.md found" + cp ${{ matrix.executable }} "$PACKAGE_DIR/" + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ env.APP_NAME }}-${{ matrix.platform }} + path: crow-bank-app/${{ env.APP_NAME }}-${{ matrix.platform }}/* + retention-days: 7 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..c38810c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,228 @@ +name: Build and Release + +on: + push: + branches: [main] + +env: + APP_NAME: securebank + +jobs: + build: + runs-on: ubuntu-latest # Use Linux for both builds (cross-compile for Windows) + strategy: + fail-fast: false + matrix: + include: + - platform: linux + executable: crow_bank_app + archive_format: tar.gz + - platform: windows + executable: crow_bank_app.exe + archive_format: zip + defaults: + run: + working-directory: crow-bank-app + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: | + /usr/include/boost + /usr/lib/x86_64-linux-gnu/libboost* + key: ubuntu-boost-${{ hashFiles('**/CMakeLists.txt') }} + restore-keys: | + ubuntu-boost- + + - name: Set up dependencies + run: | + sudo apt-get update + # For Linux builds + sudo apt-get install -y cmake g++ make zip + # For Windows cross-compilation + sudo apt-get install -y mingw-w64 + # Install Boost development headers (this makes them available system-wide) + sudo apt-get install -y libboost-all-dev + # Install MinGW Boost libraries for cross-compilation + sudo apt-get install -y libboost-all-dev:amd64 + # Install Windows-specific Boost libraries + wget -q https://github.com/microsoft/vcpkg/archive/refs/heads/master.zip + unzip -q master.zip + cd vcpkg-master + ./bootstrap-vcpkg.sh + ./vcpkg install boost-algorithm:x64-mingw-static boost-system:x64-mingw-static + cd .. + + # Alternative: Install mingw boost packages + sudo apt-get install -y libboost-dev-mingw-w64 || echo "MinGW Boost not available, using alternative approach" + + # Debug: Check if Boost headers are accessible + echo "Checking Boost installation:" + ls -la /usr/include/boost/ | head -5 + echo "Boost algorithm headers:" + ls -la /usr/include/boost/algorithm/ | head -5 + + # Check MinGW environment + echo "MinGW compiler location:" + which x86_64-w64-mingw32-g++ + echo "MinGW include paths:" + x86_64-w64-mingw32-g++ -v -E -x c++ - < /dev/null 2>&1 | grep -A 20 "search starts here" + + - name: Prepare Boost headers for MinGW (Windows only) + if: matrix.platform == 'windows' + run: | + # Copy Boost headers to MinGW sysroot if not already present + BOOST_SRC=/usr/include/boost + MINGW_INCLUDE=/usr/x86_64-w64-mingw32/include/boost + if [ ! -d "$MINGW_INCLUDE" ]; then + sudo mkdir -p /usr/x86_64-w64-mingw32/include + sudo cp -r $BOOST_SRC /usr/x86_64-w64-mingw32/include/ + fi + + - name: Configure and Build + run: | + if [ "${{ matrix.platform }}" == "linux" ]; then + echo "🐧 Building for Linux..." + mkdir -p build-linux + cd build-linux + cmake .. -DCMAKE_BUILD_TYPE=Release + make -j$(nproc) + # Copy executable to expected location + cp crow_bank_app ../crow_bank_app + else + echo "đŸĒŸ Building for Windows (cross-compilation)..." + mkdir -p win-build + cd win-build + cmake .. -DCMAKE_TOOLCHAIN_FILE=../win-toolchain.cmake -DCMAKE_BUILD_TYPE=Release + make -j$(nproc) + # Copy executable to expected location + cp crow_bank_app.exe ../crow_bank_app.exe + fi + + - name: Verify build output + run: | + ls -la + if [ ! -f "${{ matrix.executable }}" ]; then + echo "Error: Expected executable ${{ matrix.executable }} not found" + exit 1 + fi + + - name: Prepare release package + run: | + PACKAGE_DIR="${{ env.APP_NAME }}-${{ matrix.platform }}" + mkdir -p "$PACKAGE_DIR" + cp -r public "$PACKAGE_DIR/public" + cp README.md "$PACKAGE_DIR/README.txt" || echo "No README.md found" + cp ${{ matrix.executable }} "$PACKAGE_DIR/" + + # Create version info + echo "SecureBank C++ Banking Application" > "$PACKAGE_DIR/README.txt" + echo "Version: $(date +%Y.%m.%d-%H%M%S)" >> "$PACKAGE_DIR/README.txt" + echo "Platform: ${{ matrix.platform }}" >> "$PACKAGE_DIR/README.txt" + echo "Built on: $(date)" >> "$PACKAGE_DIR/README.txt" + echo "" >> "$PACKAGE_DIR/README.txt" + echo "Usage:" >> "$PACKAGE_DIR/README.txt" + echo "1. Run the executable: ./${{ matrix.executable }}" >> "$PACKAGE_DIR/README.txt" + echo "2. Open browser to http://localhost:8080" >> "$PACKAGE_DIR/README.txt" + + # Create archive based on platform + if [ "${{ matrix.platform }}" == "windows" ]; then + zip -r "$PACKAGE_DIR.zip" "$PACKAGE_DIR" + else + tar -czf "$PACKAGE_DIR.tar.gz" "$PACKAGE_DIR" + fi + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ env.APP_NAME }}-${{ matrix.platform }} + path: crow-bank-app/${{ env.APP_NAME }}-${{ matrix.platform }}.* + retention-days: 30 + + create-release: + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get latest version and increment + id: version + run: | + # Get the latest tag, or start with v1.0.0 if no tags exist + if git describe --tags --abbrev=0 2>/dev/null; then + LATEST_TAG=$(git describe --tags --abbrev=0 | sed 's/^v//') + else + LATEST_TAG="1.0.0" + fi + + echo "Latest tag: v$LATEST_TAG" + + # Split version into major.minor.patch + IFS='.' read -r MAJOR MINOR PATCH <<< "$LATEST_TAG" + + # Increment patch version for automatic releases + NEW_PATCH=$((PATCH + 1)) + NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH" + + echo "New version: v$NEW_VERSION" + echo "version=v$NEW_VERSION" >> $GITHUB_OUTPUT + echo "version_number=$NEW_VERSION" >> $GITHUB_OUTPUT + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Prepare release assets + run: | + mkdir -p release-assets + find artifacts -name "*.zip" -o -name "*.tar.gz" | while read file; do + cp "$file" release-assets/ + done + ls -la release-assets/ + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.version.outputs.version }} + name: SecureBank ${{ steps.version.outputs.version }} + body: | + # SecureBank C++ Banking Application ${{ steps.version.outputs.version }} + + ## đŸ“Ļ Downloads + - **🐧 Linux:** [securebank-linux.tar.gz](https://github.com/${{ github.repository }}/releases/download/${{ steps.version.outputs.version }}/securebank-linux.tar.gz) — Extract and run `./crow_bank_app` + - **đŸĒŸ Windows:** [securebank-windows.zip](https://github.com/${{ github.repository }}/releases/download/${{ steps.version.outputs.version }}/securebank-windows.zip) — Extract and run `crow_bank_app.exe` + + ## đŸ› ī¸ Quick Start + ```sh + # Linux + tar -xzf securebank-linux.tar.gz && cd securebank-linux/ + ./crow_bank_app + + # Windows - Extract zip file then: + crow_bank_app.exe + ``` + Open your browser to [http://localhost:8080](http://localhost:8080) + + ## 🔧 System Requirements + - **Linux:** Ubuntu 18.04+ or equivalent, 64-bit + - **Windows:** Windows 10+ or Windows Server 2019+, 64-bit + - **Memory:** 512MB RAM minimum + - **Storage:** 50MB free space + + --- + *For major releases and new features, see our [release history](https://github.com/ITx-prash/securebank-cpp/releases).* + files: release-assets/* + draft: false + prerelease: false + generate_release_notes: true + make_latest: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..13fcd82 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 ITx-prash + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 906f0d5..11120f0 100644 --- a/README.md +++ b/README.md @@ -1,87 +1,94 @@ # đŸĻ SecureBank-CPP -Modern C++ banking application with CLI and web interfaces. Demonstrates OOP concepts, REST API design, and cross-platform development. +![Build Status](https://github.com/ITx-prash/securebank-cpp/workflows/Build%20and%20Release/badge.svg) +![Release](https://img.shields.io/github/v/release/ITx-prash/securebank-cpp) +![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20Windows-blue) +![C++](https://img.shields.io/badge/C%2B%2B-17-blue.svg) -## Features +**SecureBank-CPP** is a modern C++ banking application with CLI and web interfaces, designed for educational purposes and to demonstrate practical C++ and web integration. -- **CLI Interface**: Complete banking operations with cross-platform support -- **Web Interface**: REST API with Crow framework + modern frontend -- **Cross-Platform**: Windows/Linux builds via CMake -- **Real-time Updates**: Live transaction stats and history -- **Security**: Session management, input validation, encrypted storage +--- -## Tech Stack +## 🚀 Features -- **Backend**: C++17, Crow micro web framework -- **Frontend**: HTML5/CSS3/Vanilla JS -- **Build**: CMake -- **Storage**: File-based with XOR encryption +- **Web Interface:** Responsive HTML/CSS/JS frontend served by Crow C++ microframework +- **CLI Interface:** Basic banking operations via command line +- **Cross-Platform:** Build and run on Linux and Windows (via MinGW) +- **Automated CI/CD:** GitHub Actions for builds and releases -## Quick Start +--- -### Simple Build +## âš ī¸ Disclaimer -```bash -cd crow-bank-app/ -./build.sh linux # For Linux -./build.sh windows # For Windows cross-compilation -``` +> **This project is for educational and demonstration purposes only.** +> +> It is **not production-ready** and may contain security vulnerabilities. +> **Not recommended for practical application with sensitive data.** -### Manual Build (CMake) +--- -```bash -cd crow-bank-app/ -mkdir build && cd build -cmake .. -make +## đŸ“Ļ Quick Start + +### Pre-built Releases + +Download the latest release from [Releases](https://github.com/ITx-prash/securebank-cpp/releases): + +- **🐧 Linux:** `securebank-linux.tar.gz` +- **đŸĒŸ Windows:** `securebank-windows.zip` + +```sh +# Linux +tar -xzf securebank-linux.tar.gz +cd securebank-linux/ ./crow_bank_app + +# Windows +# Extract securebank-windows.zip +crow_bank_app.exe ``` -### Build Options +Then open your browser to [http://localhost:8080](http://localhost:8080) -```bash -./build.sh --help # See all build options -``` +--- -## Development +## đŸ› ī¸ Build from Source -### Project Structure +**Requirements:** -``` -crow-bank-app/ -├── main.cpp # Entry point + Crow server setup -├── crow_all.h # Crow framework header -├── public/ # Web interface files -│ ├── index.html # Login page -│ ├── register.html # Registration -│ ├── dashboard.html # Main banking interface -│ ├── style.css # Styles -│ └── js/ # JavaScript modules -└── build.sh # Build script +- Linux: GCC 8+, CMake 3.15+, Make +- Windows: MinGW-w64, CMake 3.15+ + +```sh +cd crow-bank-app/ +./build.sh linux # For Linux +./build.sh windows # For Windows cross-compilation ``` -### Testing Environment +--- -- Tested on Linux (native & KVM VMs) -- Windows cross-compilation support -- Lightweight - works well in resource-constrained environments +## 📁 Project Structure -### Web Interface +``` +securebank-cpp/ +├── crow-bank-app/ +│ ├── main.cpp +│ ├── crow_all.h +│ ├── CMakeLists.txt +│ ├── public/ +│ └── build.sh +├── .github/ +│ └── workflows/ +└── README.md +``` -Start server and visit `http://localhost:8080` +--- -### API Endpoints +## 📄 License -- `POST /api/register` - User registration -- `POST /api/login` - Authentication -- `GET /api/user` - User data -- `POST /api/deposit` - Deposit funds -- `POST /api/withdraw` - Withdraw funds -- `POST /api/transfer` - Transfer money -- `GET /api/transactions` - Transaction history +MIT License – see [LICENSE](LICENSE) for details. --- -**Educational project showcasing practical C++ development and modern web integration.** +*Made for learning and experimentation. Not for production use.* -**Made with â¤ī¸ by ITx-prash** \ No newline at end of file +**Made with â¤ī¸ by ITx-prash** diff --git a/crow-bank-app/main.cpp b/crow-bank-app/main.cpp index bcf385a..a393543 100644 --- a/crow-bank-app/main.cpp +++ b/crow-bank-app/main.cpp @@ -341,99 +341,38 @@ string get_file_path(const string &relative_path) string getIcon(const string &iconType) { #ifdef _WIN32 - // Windows - Smart emoji detection - // Check for Windows Terminal or modern terminal capabilities - static bool useEmojis = []() - { - // Check environment variables that indicate modern terminal - const char *wt_session = getenv("WT_SESSION"); // Windows Terminal - const char *term_program = getenv("TERM_PROGRAM"); // VS Code terminal, etc. - const char *colorterm = getenv("COLORTERM"); // Modern terminals - const char *force_emojis = getenv("FORCE_EMOJIS"); // User override - const char *no_emojis = getenv("NO_EMOJIS"); // User disable - - // User explicitly disabled emojis - if (no_emojis) - return false; - - // User explicitly enabled emojis - if (force_emojis) - return true; - - // Detect modern terminal environment - return (wt_session || term_program || colorterm); - }(); - - if (useEmojis) - { - // Unicode emojis for modern Windows terminals - if (iconType == "bank") - return "đŸĻ"; - if (iconType == "register") - return "📝"; - if (iconType == "login") - return "🔐"; - if (iconType == "help") - return "❓"; - if (iconType == "exit") - return "đŸšĒ"; - if (iconType == "deposit") - return "💰"; - if (iconType == "withdraw") - return "💸"; - if (iconType == "balance") - return "đŸ’ŗ"; - if (iconType == "history") - return "📊"; - if (iconType == "transfer") - return "🔄"; - if (iconType == "settings") - return "âš™ī¸"; - if (iconType == "logout") - return "đŸšĒ"; - if (iconType == "success") - return "✅"; - if (iconType == "error") - return "❌"; - if (iconType == "warning") - return "âš ī¸"; - return "â€ĸ"; - } - else - { - // Windows fallback - basic ASCII characters only - if (iconType == "bank") - return ""; - if (iconType == "register") - return ""; - if (iconType == "login") - return ""; - if (iconType == "help") - return ""; - if (iconType == "exit") - return ""; - if (iconType == "deposit") - return ""; - if (iconType == "withdraw") - return ""; - if (iconType == "balance") - return ""; - if (iconType == "history") - return ""; - if (iconType == "transfer") - return ""; - if (iconType == "settings") - return ""; - if (iconType == "logout") - return ""; - if (iconType == "success") - return "[OK]"; - if (iconType == "error") - return "[ERROR]"; - if (iconType == "warning") - return "[WARNING]"; + // Windows - Clean text without icons for better appearance + if (iconType == "bank") return ""; - } + if (iconType == "register") + return ""; + if (iconType == "login") + return ""; + if (iconType == "help") + return ""; + if (iconType == "exit") + return ""; + if (iconType == "deposit") + return ""; + if (iconType == "withdraw") + return ""; + if (iconType == "balance") + return ""; + if (iconType == "history") + return ""; + if (iconType == "transfer") + return ""; + if (iconType == "settings") + return ""; + if (iconType == "logout") + return ""; + if (iconType == "success") + return "[SUCCESS]"; + if (iconType == "error") + return "[ERROR]"; + if (iconType == "warning") + return "[WARNING]"; + return ""; #else // Linux/Unix - Unicode emojis if (iconType == "bank") @@ -929,7 +868,6 @@ string read_file(const string &filename) // Main CLI authentication menu void displayAuthMenu() { - cout << "Made with <3\n\n"; cout << "==============================================\n"; cout << " " << getIcon("bank") << " SECURE BANK CLI SYSTEM \n"; cout << "==============================================\n"; @@ -945,7 +883,6 @@ void displayAuthMenu() // Banking dashboard menu (after login) void displayBankingMenu(const string &userName) { - cout << "Made with <3\n\n"; cout << "==============================================\n"; cout << " " << getIcon("bank") << " WELCOME " << userName << "\n"; cout << "==============================================\n"; @@ -1453,7 +1390,6 @@ void runCLI() void displayWelcomeScreen() { - cout << "Made with <3\n\n"; cout << "========================================\n"; cout << " " << getIcon("bank") << " SECURE BANK SYSTEM \n"; cout << "========================================\n"; @@ -1555,7 +1491,7 @@ int main(int argc, char *argv[]) case 3: { // Exit clearScreen(); - cout << "\nīŋŊ Thank you for exploring SecureBank!\n"; + cout << "\n" << getIcon("exit") << " Thank you for exploring SecureBank!\n"; return 0; } diff --git a/crow-bank-app/public/register.html b/crow-bank-app/public/register.html index c66d0cd..d4a6fd3 100644 --- a/crow-bank-app/public/register.html +++ b/crow-bank-app/public/register.html @@ -2203,7 +2203,7 @@

= 64rem) { + margin-left: auto; + } + } .lg\:grid { @media (width >= 64rem) { display: grid; @@ -1121,6 +1158,26 @@ height: calc(var(--spacing) * 114); } } + .lg\:max-w-lg { + @media (width >= 64rem) { + max-width: var(--container-lg); + } + } + .lg\:max-w-md { + @media (width >= 64rem) { + max-width: var(--container-md); + } + } + .lg\:max-w-sm { + @media (width >= 64rem) { + max-width: var(--container-sm); + } + } + .lg\:max-w-xl { + @media (width >= 64rem) { + max-width: var(--container-xl); + } + } .lg\:grid-cols-2 { @media (width >= 64rem) { grid-template-columns: repeat(2, minmax(0, 1fr)); @@ -1131,6 +1188,11 @@ grid-template-columns: repeat(3, minmax(0, 1fr)); } } + .lg\:grid-cols-\[2fr_1fr\] { + @media (width >= 64rem) { + grid-template-columns: 2fr 1fr; + } + } .lg\:gap-16 { @media (width >= 64rem) { gap: calc(var(--spacing) * 16); @@ -1166,11 +1228,11 @@ svg#bank-illustration:not(.animated) .animable { opacity: 0; } svg#bank-illustration.animated #freepik--background-simple--inject-4 { - animation: 3s Infinite linear wind; + animation: 3s infinite linear wind; animation-delay: 0s; } svg#bank-illustration.animated #freepik--Coins--inject-4 { - animation: 3s Infinite linear floating; + animation: 3s infinite linear floating; animation-delay: 0s; } @keyframes wind { @@ -1427,6 +1489,11 @@ svg#bank-illustration.animated #freepik--Coins--inject-4 { inherits: false; initial-value: 0 0 #0000; } +@property --tw-outline-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} @property --tw-backdrop-blur { syntax: "*"; inherits: false; @@ -1542,6 +1609,7 @@ svg#bank-illustration.animated #freepik--Coins--inject-4 { --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; + --tw-outline-style: solid; --tw-backdrop-blur: initial; --tw-backdrop-brightness: initial; --tw-backdrop-contrast: initial;