mirror of
https://github.com/RaspAP/raspap-webgui.git
synced 2025-04-21 19:23:25 +00:00
Compare commits
No commits in common. "master" and "3.1.5" have entirely different histories.
1821 changed files with 56314 additions and 55496 deletions
22
.github/ISSUE_TEMPLATE/issue_form.yml
vendored
22
.github/ISSUE_TEMPLATE/issue_form.yml
vendored
|
@ -34,15 +34,15 @@ body:
|
|||
required: true
|
||||
- label: I observed this bug on a clean install of a [supported OS](https://docs.raspap.com/#compatible-operating-systems).
|
||||
required: true
|
||||
- label: I have followed the [project prerequisites](https://docs.raspap.com/quick_start/#quick-install).
|
||||
- label: I have followed the [project prerequisites](https://docs.raspap.com/#quick-start).
|
||||
required: true
|
||||
- label: I have searched this repository for existing issues.
|
||||
required: true
|
||||
- label: I checked the [FAQ](https://docs.raspap.com/faq/) and [official documentation](https://docs.raspap.com/).
|
||||
required: true
|
||||
- label: I am using an [external wireless adapter](https://docs.raspap.com/issues/#external-hardware).
|
||||
required: false
|
||||
- label: I have generated a [RaspAP debug log](https://docs.raspap.com/troubleshooting/#debug-log) and performed a [self-diagnosis](https://docs.raspap.com/troubleshooting/#diagnosing-problems).
|
||||
required: true
|
||||
- label: I have generated a [RaspAP debug log](https://docs.raspap.com/ap-basics/#debug-log) and performed a [self-diagnosis](https://docs.raspap.com/ap-basics/#diagnosing-problems).
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
|
@ -52,19 +52,18 @@ body:
|
|||
options:
|
||||
- Raspberry Pi OS (64-bit) Lite Bookworm
|
||||
- Raspberry Pi OS (32-bit) Lite Bookworm
|
||||
- Raspberry Pi OS (64-bit) Desktop Bookwom
|
||||
- Raspberry Pi OS (64-bit) Lite Bullseye
|
||||
- Raspberry Pi OS (32-bit) Lite Bullseye
|
||||
- Armbian 23.05 (Suni)
|
||||
- Debian Bookworm
|
||||
- Debian Bookworm
|
||||
- Ubuntu Server 23.04 (Lunar)
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: install
|
||||
attributes:
|
||||
label: Installation method
|
||||
label: Quick install or Manual setup?
|
||||
options:
|
||||
- Pre-built image
|
||||
- Quick install
|
||||
- Manual setup
|
||||
validations:
|
||||
|
@ -90,7 +89,6 @@ body:
|
|||
- Raspberry Pi 3 Model B
|
||||
- Raspberry Pi Zero 2 W
|
||||
- Raspberry Pi Zero W
|
||||
- Raspberry Pi Compute Module
|
||||
- Orange Pi family
|
||||
- Other
|
||||
validations:
|
||||
|
@ -100,8 +98,11 @@ body:
|
|||
attributes:
|
||||
label: RaspAP version
|
||||
options:
|
||||
- Latest
|
||||
- Other (specify below)
|
||||
- 3.1.3 (Latest)
|
||||
- 3.1.2
|
||||
- 3.1.1
|
||||
- 3.1.0
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
@ -114,6 +115,7 @@ body:
|
|||
- Not sure
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: contact
|
||||
attributes:
|
||||
|
|
80
.github/workflows/release.yml
vendored
80
.github/workflows/release.yml
vendored
|
@ -1,80 +0,0 @@
|
|||
name: Build and publish RaspAP images
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build-raspap-image:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- arch: "32-bit"
|
||||
pi_gen_version: "master"
|
||||
- arch: "64-bit"
|
||||
pi_gen_version: "arm64"
|
||||
fail-fast: false
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Add RaspAP Stage
|
||||
run: |
|
||||
mkdir -p stage-raspap/package-raspap &&
|
||||
{
|
||||
cat > stage-raspap/package-raspap/00-run-chroot.sh <<-EOF
|
||||
#!/bin/bash
|
||||
apt-get update -y && apt-get install -y curl dhcpcd5 iptables procps
|
||||
curl -sL https://install.raspap.com | bash -s -- --yes --openvpn 1 --restapi 1 --adblock 1 --wireguard 1 --tcp-bbr 1 --check 0
|
||||
|
||||
# Set Wi-Fi country to prevent RF kill
|
||||
raspi-config nonint do_wifi_country "US"
|
||||
|
||||
# Fetch RaspAP version and set MOTD
|
||||
RASPAP_VERSION=\$(curl -sL https://install.raspap.com | bash -s -- --version)
|
||||
echo "\$RASPAP_VERSION" | tee /etc/motd
|
||||
EOF
|
||||
} &&
|
||||
chmod +x stage-raspap/package-raspap/00-run-chroot.sh &&
|
||||
{
|
||||
cat > stage-raspap/prerun.sh <<-EOF
|
||||
#!/bin/bash -e
|
||||
if [ ! -d "\${ROOTFS_DIR}" ]; then
|
||||
copy_previous
|
||||
fi
|
||||
EOF
|
||||
} &&
|
||||
chmod +x stage-raspap/package-raspap/00-run-chroot.sh &&
|
||||
{
|
||||
cat > stage-raspap/prerun.sh <<-EOF
|
||||
#!/bin/bash -e
|
||||
if [ ! -d "\${ROOTFS_DIR}" ]; then
|
||||
copy_previous
|
||||
fi
|
||||
EOF
|
||||
} &&
|
||||
chmod +x stage-raspap/prerun.sh
|
||||
|
||||
- name: Build RaspAP Image
|
||||
id: build
|
||||
uses: usimd/pi-gen-action@v1
|
||||
with:
|
||||
image-name: "raspap-bookworm-${{ matrix.arch == '32-bit' && 'armhf' || 'arm64' }}-lite-${{ github.event.inputs.tag || github.ref_name }}"
|
||||
enable-ssh: 1
|
||||
stage-list: stage0 stage1 stage2 ./stage-raspap
|
||||
verbose-output: true
|
||||
pi-gen-version: ${{ matrix.pi_gen_version }}
|
||||
pi-gen-repository: RaspAP/pi-gen
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
with:
|
||||
asset_name: "raspap-bookworm-${{ matrix.arch == '32-bit' && 'armhf' || 'arm64' }}-lite-${{ github.event.inputs.tag || github.ref_name }}.img.zip"
|
||||
file: ${{ steps.build.outputs.image-path }}
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
tag: ${{ github.event.inputs.tag || github.ref }}
|
||||
overwrite: true
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -6,4 +6,3 @@ includes/config.php
|
|||
rootCA.pem
|
||||
vendor
|
||||
.env
|
||||
locale/**/*.mo
|
||||
|
|
4
.gitmodules
vendored
4
.gitmodules
vendored
|
@ -1,4 +0,0 @@
|
|||
[submodule "plugins"]
|
||||
path = plugins
|
||||
url = https://github.com/RaspAP/plugins
|
||||
branch = master
|
16
BACKERS.md
16
BACKERS.md
|
@ -1,4 +1,4 @@
|
|||
<img width="465" alt="Insiders logo" src="https://i.imgur.com/62TMUy5.png">
|
||||
<img width="465" alt="Insiders logo" src="https://user-images.githubusercontent.com/229399/115766971-e19e1900-a3a8-11eb-8c6f-379deb4313d2.png">
|
||||
|
||||
Development of RaspAP is made possible thanks to a sponsorware release model. This means that new features are first exclusively released to sponsors as part of **Insiders**. Read on to learn how sponsorship works, and how easy it is to get access to Insiders.
|
||||
|
||||
|
@ -15,21 +15,21 @@ You can become a sponsor using your individual or organization's GitHub account.
|
|||
## Exclusive features
|
||||
The following features are currently available exclusively to sponsors. A tangible side benefit of sponsorship is that Insiders are able to help steer future development of RaspAP. This is done through Insiders' access to discussions, feature requests, issues and pull requests in the private GitHub repository.
|
||||
|
||||
✅ [Network device management](https://docs.raspap.com/net-devices/)
|
||||
✅ [Firewall settings](https://docs.raspap.com/firewall/)
|
||||
✅ [Network device management](https://docs.raspap.com/net-devices/)
|
||||
✅ [Firewall settings](https://docs.raspap.com/firewall/)
|
||||
✅ [WPA3-Personal AP security](https://docs.raspap.com/ap-basics/#wpa3-personal)
|
||||
✅ [802.11w Protected Management Frames](https://docs.raspap.com/ap-basics/#80211w)
|
||||
✅ [802.11w Protected Management Frames](https://docs.raspap.com/ap-basics/#80211w)
|
||||
✅ [Printable Wi-Fi signs](https://docs.raspap.com/ap-basics/#printable-signs)
|
||||
✅ [Drag & drop dashboard widgets](https://docs.raspap.com/ap-basics/#drag-drop-widgets)
|
||||
✅ [MAC address cloning](https://docs.raspap.com/net-devices/#changing-the-mac-address)
|
||||
✅ [Network diagnostics](https://docs.raspap.com/net-devices/#diagnostics)
|
||||
✅ [WireGuard VPN kill switch](https://docs.raspap.com/wireguard/#kill-switch)
|
||||
✅ [Dynamic DNS support](https://docs.raspap.com/dynamicdns/)
|
||||
✅ [Dynamic DNS](https://docs.raspap.com/dynamicdns/)
|
||||
✅ [Multiple WireGuard configs](https://docs.raspap.com/wireguard/#multiple-configs)
|
||||
✅ [Wireless LAN routing](https://docs.raspap.com/wlanrouting/)
|
||||
✅ [Custom user avatars](https://docs.raspap.com/authentication/#custom-user-avatars)
|
||||
✅ Custom user avatars
|
||||
✅ [WiFi repeater mode](https://docs.raspap.com/ap-basics/#wifi-repeater-mode)
|
||||
✅ [NTP Service](https://docs.raspap.com/ntp/)
|
||||
✅ [Limited privilege user role](https://docs.raspap.com/authentication/#limited-privilege-user-role)
|
||||
✅ [Time synchronization](https://docs.raspap.com/time/)
|
||||
|
||||
Look for the list above to grow as we add more exclusive features. Be sure to visit this page from time to time to learn about what's new, check the [Insiders docs page](https://docs.raspap.com/insiders/) and follow [@RaspAP on Twitter](https://twitter.com/rasp_ap) to stay updated.
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ This project follows the [PSR-2](http://www.php-fig.org/psr/psr-2/) coding style
|
|||
RaspAP is made possible by a strong [community of developers](https://github.com/RaspAP/raspap-webgui/graphs/contributors). If you have any questions or would like to get involved in RaspAP, dive into any of these channels:
|
||||
|
||||
* [GitHub discussions](https://github.com/RaspAP/raspap-webgui/discussions)
|
||||
* [Discord chat](https://discord.gg/KVAsaAR)
|
||||
* [Discord chat](https://discord.gg/rth5Yzzm)
|
||||
* [Twitter](https://twitter.com/rasp_ap)
|
||||
* [Reddit](https://www.reddit.com/r/RaspAP/)
|
||||
|
||||
|
|
80
README.md
80
README.md
|
@ -1,77 +1,63 @@
|
|||

|
||||
[](https://github.com/raspap/raspap-webgui/releases) [](https://github.com/thibmaek/awesome-raspberry-pi) [](https://github.com/sponsors/RaspAP) [](https://app.travis-ci.com/RaspAP/raspap-webgui) [](https://crowdin.com/project/raspap) [](https://twitter.com/rasp_ap) [](https://reddit.com/r/RaspAP) [](https://discord.gg/KVAsaAR)
|
||||

|
||||
[](https://github.com/raspap/raspap-webgui/releases) [](https://github.com/thibmaek/awesome-raspberry-pi) [](https://github.com/sponsors/RaspAP) [](https://app.travis-ci.com/RaspAP/raspap-webgui) [](https://crowdin.com/project/raspap) [](https://twitter.com/rasp_ap) [](https://reddit.com/r/RaspAP) [](https://discord.gg/KVAsaAR)
|
||||
|
||||
RaspAP is feature-rich wireless router software that _just works_ on many popular [Debian-based devices](#supported-operating-systems), including the Raspberry Pi. Our [custom OS images](#pre-built-image), [Quick installer](#quick-installer) and [Docker container](#docker-support) create a known-good default configuration for all current Raspberry Pis with onboard wireless. A fully responsive, mobile-ready interface gives you control over the relevant services and networking options. Advanced DHCP settings, WireGuard and OpenVPN support, [SSL certificates](https://docs.raspap.com/ssl/), [ad blocking](#ad-blocking), security audits, [captive portal integration](https://docs.raspap.com/captive/), themes and [multilingual options](https://docs.raspap.com/translations/) are included.
|
||||
|
||||
RaspAP has been featured by [PC World](https://www.pcwelt.de/article/1789512/raspberry-pi-als-wlan-router.html), [Adafruit](https://blog.adafruit.com/2016/06/24/raspap-wifi-configuration-portal-piday-raspberrypi-raspberry_pi/), [Raspberry Pi Weekly](https://www.raspberrypi.org/weekly/commander/), and [Awesome Raspberry Pi](https://project-awesome.org/thibmaek/awesome-raspberry-pi) and implemented in [countless projects](https://github.com/RaspAP/raspap-awesome#projects).
|
||||
RaspAP is feature-rich wireless router software that _just works_ on many popular [Debian-based devices](#supported-operating-systems), including the Raspberry Pi. Our popular [Quick installer](#quick-installer) and [Docker container](#docker-support) create a known-good default configuration for all current Raspberry Pis with onboard wireless. A fully responsive, mobile-ready interface gives you control over the relevant services and networking options. Advanced DHCP settings, WireGuard and OpenVPN support, [SSL certificates](https://docs.raspap.com/ssl-quick/), security audits, [captive portal integration](https://docs.raspap.com/captive/), themes and [multilingual options](https://docs.raspap.com/translations/) are included.
|
||||
|
||||
RaspAP has been featured on sites such as [Instructables](http://www.instructables.com/id/Raspberry-Pi-As-Completely-Wireless-Router/), [Adafruit](https://blog.adafruit.com/2016/06/24/raspap-wifi-configuration-portal-piday-raspberrypi-raspberry_pi/), [Raspberry Pi Weekly](https://www.raspberrypi.org/weekly/commander/) and [Awesome Raspberry Pi](https://project-awesome.org/thibmaek/awesome-raspberry-pi) and implemented in countless projects.
|
||||
|
||||
We hope you enjoy using RaspAP as much as we do creating it. Tell us how you use this with [your own projects](https://github.com/raspap/raspap-awesome).
|
||||
|
||||

|
||||
<img width="32.5%" alt="Wifi Client" src="https://github.com/user-attachments/assets/95696ddc-da84-4339-97cc-f2a173054664">
|
||||
<img width="32.5%" alt="Hotspot" src="https://github.com/user-attachments/assets/c1c4de15-3ff2-4d3c-a7af-339c24896749">
|
||||
<img width="32.5%" alt="Adblock" src="https://github.com/user-attachments/assets/ab925687-8407-4bec-a952-9dc6a2675f49">
|
||||
<img width="32.5%" alt="About" src="https://github.com/user-attachments/assets/ba62d8bb-34f0-44ee-9fe8-504763a03726">
|
||||
<img width="32.5%" alt="Wireguard" src="https://github.com/user-attachments/assets/4ba16118-8671-4654-9a36-92ac7bc8507f">
|
||||
<img width="32.5%" alt="System" src="https://github.com/user-attachments/assets/f54e04fc-dc2c-4a21-903b-23641795822b">
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
## Contents
|
||||
|
||||
- [Quick start](#quick-start)
|
||||
- [Prerequisites](#prerequisites)
|
||||
- [Quick installer](#quick-installer)
|
||||
- [Join Insiders](#join-insiders)
|
||||
- [WireGuard support](#wireguard-support)
|
||||
- [OpenVPN support](#openvpn-support)
|
||||
- [VPN Provider support](#vpn-provider-support)
|
||||
- [Ad Blocking](#ad-blocking)
|
||||
- [Bridged AP](#bridged-ap)
|
||||
- [Simultaneous AP and Wifi client](#simultaneous-ap-and-wifi-client)
|
||||
- [Manual installation](#manual-installation)
|
||||
- [802.11ac 5GHz support](#80211ac-5ghz-support)
|
||||
- [Supported operating systems](#supported-operating-systems)
|
||||
- [HTTPS support](#https-support)
|
||||
- [Docker support](#docker-support)
|
||||
- [Custom user plugins](#custom-user-plugins)
|
||||
- [Multilingual support](#multilingual-support)
|
||||
- [How to contribute](#how-to-contribute)
|
||||
- [Reporting issues](#reporting-issues)
|
||||
- [License](#license)
|
||||
|
||||
## Quick start
|
||||
RaspAP gives you two different ways to get up and running quickly. The simplest and recommended approach is to use a custom Raspberry Pi OS image with RaspAP preinstalled. This option eliminates guesswork and gives you a base upon which to build. Alternatively, you may execute the Quick installer on an existing [compatible OS](https://docs.raspap.com/#compatible-operating-systems).
|
||||
|
||||
### Pre-built image
|
||||
Custom Raspberry Pi OS Lite images with the latest RaspAP are available for [direct download](https://github.com/RaspAP/raspap-webgui/releases/latest). This includes both 32- and 64-bit builds for ARM architectures.
|
||||
|
||||
| Operating system | Debian version | Kernel version | RaspAP version | Size |
|
||||
| ---------------------| ---------------|-----------------|----------------|-------|
|
||||
| Raspberry Pi OS (64-bit) Lite | 12 (bookworm) | 6.6 | Latest | 777 MB|
|
||||
| Raspberry Pi OS (32-bit) Lite | 12 (bookworm) | 6.6 | Latest | 805 MB|
|
||||
|
||||
These images are automatically generated with each release of RaspAP. You may choose between an `arm64` or `armhf` (32-bit) based build. Refer to [this resource](https://www.raspberrypi.com/software/operating-systems/) to ensure compatibility with your hardware.
|
||||
|
||||
After downloading your desired image from the [latest release page](https://github.com/RaspAP/raspap-webgui/releases/latest), use a utility such as the Raspberry Pi Imager or [balenaEtcher](https://www.balena.io/etcher) to flash the OS image onto a microSD card. Insert the card into your device and boot it up. The latest RaspAP release version with the most popular optional components will be active and ready for you to configure.
|
||||
|
||||
### Quick installer
|
||||
Alternatively, start with a clean install of a [latest release of Raspberry Pi OS](https://www.raspberrypi.org/software/operating-systems/). Both the 32- and 64-bit release versions are supported, as well as the latest 64-bit Desktop distribution.
|
||||
|
||||
Update RPi OS to its latest version, including the kernel and firmware, followed by a reboot:
|
||||
## Prerequisites
|
||||
Start with a clean install of the [latest release of Raspberry Pi OS Lite](https://www.raspberrypi.com/software/operating-systems/). Both the 32- and 64-bit Lite versions are supported. The Raspberry Pi OS desktop distro is [unsupported](https://docs.raspap.com/faq/#distros).
|
||||
|
||||
1. Update Raspbian, including the kernel and firmware, followed by a reboot:
|
||||
```
|
||||
sudo apt-get update
|
||||
sudo apt-get full-upgrade
|
||||
sudo reboot
|
||||
```
|
||||
Set the WiFi country in raspi-config's **Localisation Options**: `sudo raspi-config`.
|
||||
2. Set the "WLAN country" option in `raspi-config`'s **Localisation Options**: `sudo raspi-config`
|
||||
|
||||
3. If you have a device without an onboard wireless chipset, the [**Edimax Wireless 802.11b/g/n nano USB adapter**](https://www.edimax.com/edimax/merchandise/merchandise_detail/data/edimax/global/wireless_adapters_n150/ew-7811un) is an excellent option – it's small, cheap and has good driver support.
|
||||
|
||||
With the prerequisites done, you can proceed with either the Quick installer or Manual installation steps below.
|
||||
|
||||
## Quick installer
|
||||
Install RaspAP from your device's shell prompt:
|
||||
```sh
|
||||
curl -sL https://install.raspap.com | bash
|
||||
```
|
||||
The [installer](https://docs.raspap.com/quick/) will complete the steps in the manual installation (below) for you.
|
||||
|
||||
The Quick installer will respond to several [command line arguments](https://docs.raspap.com/quick/), or switches, to customize your installation in a variety of ways, or install one of RaspAP's optional helper tools.
|
||||
|
||||
### Initial settings
|
||||
After completing either of these setup options, the wireless AP network will be configured as follows:
|
||||
|
||||
After the reboot at the end of the installation the wireless network will be
|
||||
configured as an access point as follows:
|
||||
* IP address: 10.3.141.1
|
||||
* Username: admin
|
||||
* Password: secret
|
||||
|
@ -79,7 +65,7 @@ After completing either of these setup options, the wireless AP network will be
|
|||
* SSID: `raspi-webgui`
|
||||
* Password: ChangeMe
|
||||
|
||||
It's _strongly recommended_ that your first post-install action is to change the default admin [authentication](https://docs.raspap.com/authentication/) settings. Thereafter, your AP's [basic settings](https://docs.raspap.com/ap-basics/) and many [advanced options](https://docs.raspap.com/ap-basics#advanced-options) are now ready to be modified by RaspAP.
|
||||
**Note:** As the name suggests, the Quick Installer is a great way to quickly setup a new AP. However, it does not automagically detect the unique configuration of your system. Best results are obtained by connecting to ethernet (`eth0`) or as a WiFi client, also known as managed mode, with `wlan0`. For the latter, refer to [this FAQ](https://docs.raspap.com/faq/#headless). Special instructions for the Pi Zero W are [available here](https://docs.raspap.com/ap-sta/).
|
||||
|
||||
Please [read this](https://docs.raspap.com/issues/) before reporting an issue.
|
||||
|
||||
|
@ -128,6 +114,11 @@ By default RaspAP configures a routed AP for your clients to connect to. A bridg
|
|||
|
||||
More information on Bridged AP mode is provided [in our documentation](https://docs.raspap.com/bridged/).
|
||||
|
||||
## Simultaneous AP and Wifi client
|
||||
RaspAP lets you create an AP with a Wifi client configuration, often called [AP-STA mode](https://docs.raspap.com/ap-sta/). With your system configured in managed mode, enable the AP from the **Advanced** tab of **Configure hotspot** by sliding the **Wifi client AP mode** toggle. Save settings and start the hotspot. The managed mode AP is functional without restart.
|
||||
|
||||
**Note:** This option is disabled until you configure your system as a wireless client. For a device operating in [managed mode](https://docs.raspap.com/faq/#headless) without an `eth0` connection, this configuration must be enabled [_before_ a reboot](https://docs.raspap.com/ap-sta/).
|
||||
|
||||
## Manual installation
|
||||
Detailed manual setup instructions are provided [on our documentation site](https://docs.raspap.com/manual/).
|
||||
|
||||
|
@ -141,13 +132,13 @@ RaspAP was originally made for Raspbian, but now also installs on the following
|
|||
|---|:---:|:---:|:---:|
|
||||
| Raspberry Pi OS | (64-bit) Lite Bookworm | ARM | Official |
|
||||
| Raspberry Pi OS | (32-bit) Lite Bookworm | ARM | Official |
|
||||
| Raspberry Pi OS | (64-bit) Desktop Bookworm | ARM | Official |
|
||||
| Raspberry Pi OS | (64-bit) Lite Bullseye | ARM | Official |
|
||||
| Raspberry Pi OS | (32-bit) Lite Bullseye | ARM | Official |
|
||||
| Armbian | 23.11 (Jammy) | [ARM](https://docs.armbian.com/#supported-socs) | Beta |
|
||||
| Armbian | 23.11 (Jammy) | [ARM](https://docs.armbian.com/#supported-socs) | Official |
|
||||
| Debian | Bookworm | ARM / x86_64 | Beta |
|
||||
| Ubuntu | Server 23.04 (Lunar) | ARM / x86_64 | Beta |
|
||||
|
||||
<img src="https://i.imgur.com/XiAJNKb.png" style="width:480px;" />
|
||||
<img src="https://github.com/RaspAP/raspap-webgui/assets/229399/6fe62f2d-631a-46c9-8ceb-83ebf0ade6a9" style="width:640px;" />
|
||||
|
||||
You are also encouraged to use RaspAP's community-led [Docker container](#docker-support). Please note that "supported" is not a guarantee. If you are able to improve support for your preferred distro, we encourage you to [actively contribute](#how-to-contribute) to the project.
|
||||
|
||||
|
@ -171,9 +162,6 @@ As an alternative to the [Quick installer](#quick-installer), RaspAP may be run
|
|||
|
||||
See the [RaspAP-docker repo](https://github.com/RaspAP/raspap-docker/) for more information.
|
||||
|
||||
## Custom user plugins
|
||||
RaspAP's integrated `PluginManager` provides a framework for developers to create custom plugins. To facilitate this, a `SamplePlugin` [repository](https://github.com/RaspAP/SamplePlugin) is available to get developers started on the right track. If you'd like to develop your own plugin for RaspAP, see the [documentation](https://docs.raspap.com/custom-plugins/) or get started right away by forking the [SamplePlugin](https://github.com/RaspAP/SamplePlugin).
|
||||
|
||||
## Multilingual support
|
||||
RaspAP uses [GNU Gettext](https://www.gnu.org/software/gettext/) to manage multilingual messages. In order to use RaspAP with one of our supported translations, you must configure a corresponding language package on your RPi. To list languages currently installed on your system, use `locale -a` at the shell prompt. To generate new locales, run `sudo dpkg-reconfigure locales` and select any other desired locales. Details are provided on our [documentation site](https://docs.raspap.com/translations/).
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
if (isset($_POST['blocklist_id'])) {
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
$interface = filter_input(INPUT_GET, 'inet', FILTER_SANITIZE_SPECIAL_CHARS);
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
if (filter_input(INPUT_GET, 'tu') == 'h') {
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
require_once '../../includes/functions.php';
|
||||
|
||||
|
|
|
@ -1,29 +1,36 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../includes/session.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
require_once '../../includes/session.php';
|
||||
require_once '../../includes/functions.php';
|
||||
|
||||
$return = 0;
|
||||
$path = "../../config";
|
||||
$configs = array(
|
||||
array("src" => $path .'/hostapd.conf', "tmp" => "/tmp/hostapddata", "dest" => RASPI_HOSTAPD_CONFIG),
|
||||
array("src" => $path .'/dhcpcd.conf', "tmp" => "/tmp/dhcpddata", "dest" => RASPI_DHCPCD_CONFIG),
|
||||
array("src" => $path .'/090_wlan0.conf', "tmp" => "/tmp/dnsmasqdata", "dest" => RASPI_DNSMASQ_PREFIX.'wlan0.conf'),
|
||||
array("src" => $path .'/090_raspap.conf', "tmp" => "/tmp/dnsmasqdata", "dest" => RASPI_DNSMASQ_PREFIX.'raspap.conf'),
|
||||
);
|
||||
|
||||
foreach ($configs as $config) {
|
||||
try {
|
||||
$tmp = file_get_contents($config["src"]);
|
||||
file_put_contents($config["tmp"], $tmp);
|
||||
system("sudo cp ".$config["tmp"]. " ".$config["dest"]);
|
||||
} catch (Exception $e) {
|
||||
$return = $e->getCode();
|
||||
if (isset($_POST['csrf_token'])) {
|
||||
if (csrfValidateRequest() && !CSRFValidate()) {
|
||||
handleInvalidCSRFToken();
|
||||
}
|
||||
}
|
||||
$jsonData = ['return'=>$return];
|
||||
echo json_encode($jsonData);
|
||||
$return = 0;
|
||||
$path = "../../config";
|
||||
$configs = array(
|
||||
array("src" => $path .'/hostapd.conf', "tmp" => "/tmp/hostapddata", "dest" => RASPI_HOSTAPD_CONFIG),
|
||||
array("src" => $path .'/dhcpcd.conf', "tmp" => "/tmp/dhcpddata", "dest" => RASPI_DHCPCD_CONFIG),
|
||||
array("src" => $path .'/090_wlan0.conf', "tmp" => "/tmp/dnsmasqdata", "dest" => RASPI_DNSMASQ_PREFIX.'wlan0.conf'),
|
||||
array("src" => $path .'/090_raspap.conf', "tmp" => "/tmp/dnsmasqdata", "dest" => RASPI_DNSMASQ_PREFIX.'raspap.conf'),
|
||||
);
|
||||
|
||||
foreach ($configs as $config) {
|
||||
try {
|
||||
$tmp = file_get_contents($config["src"]);
|
||||
file_put_contents($config["tmp"], $tmp);
|
||||
system("sudo cp ".$config["tmp"]. " ".$config["dest"]);
|
||||
} catch (Exception $e) {
|
||||
$return = $e->getCode();
|
||||
}
|
||||
}
|
||||
$jsonData = ['return'=>$return];
|
||||
echo json_encode($jsonData);
|
||||
|
||||
} else {
|
||||
handleInvalidCSRFToken();
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
exec("ls /sys/class/net | grep -v lo", $interfaces);
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
exec('cat '. RASPI_HOSTAPD_CONFIG, $hostapdconfig);
|
||||
|
@ -17,4 +17,3 @@ foreach ($hostapdconfig as $hostapdconfigline) {
|
|||
};
|
||||
$channel = intval($arrConfig['channel']);
|
||||
echo json_encode($channel);
|
||||
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../src/RaspAP/Parsers/IwParser.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
if (isset($_POST['interface'])) {
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
|
||||
require_once '../../includes/functions.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
if (isset($_POST['interface'])) {
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
require_once '../../includes/functions.php';
|
||||
|
||||
$interface = $_POST['iface'];
|
||||
|
||||
|
@ -19,14 +18,14 @@ if (isset($interface)) {
|
|||
} else {
|
||||
$arrRange = explode(",", $conf['dhcp-range'][0]);
|
||||
}
|
||||
$dhcpdata['RangeStart'] = $arrRange[0] ?? null;
|
||||
$dhcpdata['RangeEnd'] = $arrRange[1] ?? null;
|
||||
$dhcpdata['RangeMask'] = $arrRange[2] ?? null;
|
||||
$dhcpdata['leaseTime'] = $arrRange[3] ?? null;
|
||||
$dhcpHost = $conf["dhcp-host"] ?? null;
|
||||
$dhcpdata['RangeStart'] = $arrRange[0];
|
||||
$dhcpdata['RangeEnd'] = $arrRange[1];
|
||||
$dhcpdata['RangeMask'] = $arrRange[2];
|
||||
$dhcpdata['leaseTime'] = $arrRange[3];
|
||||
$dhcpHost = $conf["dhcp-host"];
|
||||
$dhcpHost = empty($dhcpHost) ? [] : $dhcpHost;
|
||||
$dhcpdata['dhcpHost'] = is_array($dhcpHost) ? $dhcpHost : [ $dhcpHost ];
|
||||
$upstreamServers = is_array($conf['server'] ?? null) ? $conf['server'] : [ $conf['server'] ?? '' ];
|
||||
$upstreamServers = is_array($conf['server']) ? $conf['server'] : [ $conf['server'] ];
|
||||
$dhcpdata['upstreamServersEnabled'] = empty($conf['server']) ? false: true;
|
||||
$dhcpdata['upstreamServers'] = array_filter($upstreamServers);
|
||||
preg_match('/([0-9]*)([a-z])/i', $dhcpdata['leaseTime'], $arrRangeLeaseTime);
|
||||
|
@ -36,10 +35,10 @@ if (isset($interface)) {
|
|||
$arrDns = explode(",", $conf['dhcp-option']);
|
||||
if ($arrDns[0] == '6') {
|
||||
if (count($arrDns) > 1) {
|
||||
$dhcpdata['DNS1'] = $arrDns[1] ?? null;
|
||||
$dhcpdata['DNS1'] = $arrDns[1];
|
||||
}
|
||||
if (count($arrDns) > 2) {
|
||||
$dhcpdata['DNS2'] = $arrDns[2] ?? null;
|
||||
$dhcpdata['DNS2'] = $arrDns[2];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -54,15 +53,13 @@ if (isset($interface)) {
|
|||
preg_match('/fallback\sstatic_'.$interface.'/', $matched[0], $fallback);
|
||||
preg_match('/(?:no)?gateway/', $matched[0], $gateway);
|
||||
preg_match('/nohook\swpa_supplicant/', $matched[0], $nohook_wpa_supplicant);
|
||||
$dhcpdata['Metric'] = $metric[1] ?? null;
|
||||
$dhcpdata['StaticIP'] = isset($static_ip[1]) && strpos($static_ip[1], '/') !== false
|
||||
? substr($static_ip[1], 0, strpos($static_ip[1], '/'))
|
||||
: ($static_ip[1] ?? '');
|
||||
$dhcpdata['SubnetMask'] = cidr2mask($static_ip[1] ?? '');
|
||||
$dhcpdata['StaticRouters'] = $static_routers[1] ?? null;
|
||||
$dhcpdata['StaticDNS'] = $static_dns[1] ?? null;
|
||||
$dhcpdata['Metric'] = $metric[1];
|
||||
$dhcpdata['StaticIP'] = strpos($static_ip[1],'/') ? substr($static_ip[1], 0, strpos($static_ip[1],'/')) : $static_ip[1];
|
||||
$dhcpdata['SubnetMask'] = cidr2mask($static_ip[1]);
|
||||
$dhcpdata['StaticRouters'] = $static_routers[1];
|
||||
$dhcpdata['StaticDNS'] = $static_dns[1];
|
||||
$dhcpdata['FallbackEnabled'] = empty($fallback) ? false: true;
|
||||
$dhcpdata['DefaultRoute'] = $gateway[0] == "gateway";
|
||||
$dhcpdata['NoHookWPASupplicant'] = ($nohook_wpa_supplicant[0] ?? '') == "nohook wpa_supplicant";
|
||||
$dhcpdata['NoHookWPASupplicant'] = $nohook_wpa_supplicant[0] == "nohook wpa_supplicant";
|
||||
echo json_encode($dhcpdata);
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
require_once '../../includes/locale.php';
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
// fetch wg client.conf
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
$entity = escapeshellcmd($_POST['entity']);
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
require_once '../../includes/defaults.php';
|
||||
require_once '../../includes/functions.php';
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
require_once '../../includes/functions.php';
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
require_once '../../includes/functions.php';
|
||||
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
$pluginInstaller = \RaspAP\Plugins\PluginInstaller::getInstance();
|
||||
$plugin_uri = $_POST['plugin_uri'] ?? null;
|
||||
$plugin_version = $_POST['plugin_version'] ?? null;
|
||||
$install_path = $_POST['install_path'] ?? null;
|
||||
|
||||
if (isset($plugin_uri, $plugin_version, $install_path)) {
|
||||
try {
|
||||
$return = $pluginInstaller->installPlugin($plugin_uri, $plugin_version, $install_path);
|
||||
echo json_encode($return);
|
||||
} catch (Exception $e) {
|
||||
http_response_code(422); // unprocessable content
|
||||
echo json_encode(['error' => $e->getMessage()]);
|
||||
}
|
||||
} else {
|
||||
http_response_code(400); // Bad Request
|
||||
echo json_encode(['error' => 'Plugin URI, version, and install path are required']);
|
||||
exit;
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
$lastActivity = $_SESSION['lastActivity'] ?? time();
|
||||
$sessionLifetime = time() - $lastActivity;
|
||||
$status = $sessionLifetime >= RASPI_SESSION_TIMEOUT ? 'session_expired' : 'active';
|
||||
|
||||
if ($status === 'session_expired') {
|
||||
session_unset(); // unset all session variables
|
||||
session_destroy(); // destroy the session
|
||||
}
|
||||
|
||||
// send response
|
||||
header('Content-Type: application/json');
|
||||
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
|
||||
header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
|
||||
header('Pragma: no-cache');
|
||||
|
||||
$response = [
|
||||
'status' => $status,
|
||||
'last_activity' => $lastActivity,
|
||||
'session_lifetime' => $sessionLifetime
|
||||
];
|
||||
|
||||
echo json_encode($response);
|
||||
exit();
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
$action = escapeshellcmd($_POST['a']);
|
||||
|
|
|
@ -1,22 +1,26 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
require_once '../../includes/defaults.php';
|
||||
require_once '../../includes/functions.php';
|
||||
|
||||
$uri = RASPI_API_ENDPOINT;
|
||||
preg_match('/(\d+(\.\d+)+)/', RASPI_VERSION, $matches);
|
||||
$thisRelease = $matches[0];
|
||||
if (isset($_POST['csrf_token'])) {
|
||||
if (csrfValidateRequest() && !CSRFValidate()) {
|
||||
handleInvalidCSRFToken();
|
||||
}
|
||||
$uri = RASPI_API_ENDPOINT;
|
||||
preg_match('/(\d+(\.\d+)+)/', RASPI_VERSION, $matches);
|
||||
$thisRelease = $matches[0];
|
||||
|
||||
$json = shell_exec("wget --timeout=5 --tries=1 $uri -qO -");
|
||||
$data = json_decode($json, true);
|
||||
$tagName = $data['tag_name'];
|
||||
$updateAvailable = checkReleaseVersion($thisRelease, $tagName);
|
||||
$json = shell_exec("wget --timeout=5 --tries=1 $uri -qO -");
|
||||
$data = json_decode($json, true);
|
||||
$tagName = $data['tag_name'];
|
||||
$updateAvailable = checkReleaseVersion($thisRelease, $tagName);
|
||||
|
||||
$response['tag'] = $tagName;
|
||||
$response['update'] = $updateAvailable;
|
||||
echo json_encode($response);
|
||||
$response['tag'] = $tagName;
|
||||
$response['update'] = $updateAvailable;
|
||||
echo json_encode($response);
|
||||
|
||||
} else {
|
||||
handleInvalidCSRFToken();
|
||||
}
|
||||
|
|
|
@ -1,18 +1,24 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
$root = getenv("DOCUMENT_ROOT");
|
||||
exec('sudo '.RASPI_CONFIG.'/system/debuglog.sh -i '.$root, $return);
|
||||
|
||||
$logOutput = implode(PHP_EOL, $return);
|
||||
$tempDir = sys_get_temp_dir();
|
||||
$filePath = $tempDir . DIRECTORY_SEPARATOR . RASPI_DEBUG_LOG;
|
||||
$handle = fopen($filePath, "w");
|
||||
fwrite($handle, $logOutput);
|
||||
fclose($handle);
|
||||
echo json_encode($filePath);
|
||||
if (isset($_POST['csrf_token'])) {
|
||||
if (csrfValidateRequest() && !CSRFValidate()) {
|
||||
handleInvalidCSRFToken();
|
||||
}
|
||||
$root = getenv("DOCUMENT_ROOT");
|
||||
exec('sudo '.RASPI_CONFIG.'/system/debuglog.sh -i '.$root, $return);
|
||||
|
||||
$logOutput = implode(PHP_EOL, $return);
|
||||
$tempDir = sys_get_temp_dir();
|
||||
$filePath = $tempDir . DIRECTORY_SEPARATOR . RASPI_DEBUG_LOG;
|
||||
$handle = fopen($filePath, "w");
|
||||
fwrite($handle, $logOutput);
|
||||
fclose($handle);
|
||||
echo json_encode($filePath);
|
||||
} else {
|
||||
handleInvalidCSRFToken();
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
$tempDir = sys_get_temp_dir();
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/CSRF.php';
|
||||
require_once '../../includes/session.php';
|
||||
|
||||
require '../../includes/csrf.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
if (isset($_POST['csrf_token'])) {
|
||||
|
@ -11,7 +11,7 @@ if (isset($_POST['csrf_token'])) {
|
|||
}
|
||||
// set installer path + options
|
||||
$path = getenv("DOCUMENT_ROOT");
|
||||
$opts = " --update --yes --check 0 --path $path";
|
||||
$opts = " --update --yes --path $path";
|
||||
$installer = "sudo /etc/raspap/system/raspbian.sh";
|
||||
$execUpdate = $installer.$opts;
|
||||
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
<?php
|
||||
|
||||
require_once '../../includes/autoload.php';
|
||||
require_once '../../includes/session.php';
|
||||
require_once '../../includes/config.php';
|
||||
require_once '../../src/RaspAP/Auth/HTTPAuth.php';
|
||||
require_once '../../includes/authenticate.php';
|
||||
|
||||
$logFile = '/tmp/raspap_install.log';
|
||||
|
|
|
@ -32,7 +32,7 @@ def ieee80211n():
|
|||
return subprocess.run("cat /etc/hostapd/hostapd.conf | grep ieee80211n= | cut -d'=' -f2", shell=True, capture_output=True, text=True).stdout.strip()
|
||||
|
||||
def wpa_passphrase():
|
||||
return subprocess.run("sed -En 's/wpa_passphrase=(.*)/\1/p' /etc/hostapd/hostapd.conf", shell=True, capture_output=True, text=True).stdout.strip()
|
||||
return subprocess.run("cat /etc/hostapd/hostapd.conf | grep wpa_passphrase= | cut -d'=' -f2", shell=True, capture_output=True, text=True).stdout.strip()
|
||||
|
||||
def interface():
|
||||
return subprocess.run("cat /etc/hostapd/hostapd.conf | grep interface= | cut -d'=' -f2 | head -1", shell=True, capture_output=True, text=True).stdout.strip()
|
||||
|
|
434
app/css/all.css
434
app/css/all.css
|
@ -6,42 +6,28 @@ Description: Classes shared by all themes
|
|||
License: GNU General Public License v3.0
|
||||
*/
|
||||
|
||||
:root {
|
||||
--raspap-content-main: #495057;
|
||||
--raspap-text-muted: #858796;
|
||||
--raspap-text-light: #999999;
|
||||
--raspap-brand-color: #2b8080;
|
||||
--raspap-offwhite: #faf9f6;
|
||||
/* Small devices (portrait phones, up to 576px) */
|
||||
@media (max-width: 576px) {
|
||||
.container-fluid, .card-body, .col-md-6 { padding-left: 0.5rem; padding-right: 0.5rem; }
|
||||
.card .card-header { padding: .75rem .5rem; font-size: 1.0rem; }
|
||||
.row { margin-left: 0rem; margin-right: 0rem; }
|
||||
.col-lg-12 { padding-right: 0.25rem; padding-left: 0.25rem; }
|
||||
.form-group.col-md-6 { margin-left: -0.5rem; }
|
||||
h4.mt-3 { margin-left: 0.5rem; }
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--raspap-brand-color);
|
||||
text-decoration: none;
|
||||
.sidebar.toggled .nav-item .nav-link {
|
||||
padding: 0.65rem 1rem;
|
||||
}
|
||||
|
||||
.sb-sidenav .sb-sidenav-menu .nav .nav-link {
|
||||
padding-top: 0.6rem;
|
||||
padding-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
.sb-sidenav-light .sb-sidenav-menu .nav-link, .card-title, h4 {
|
||||
color: var(--raspap-content-main);
|
||||
}
|
||||
|
||||
.sb-topnav.navbar-light #sidebarToggle {
|
||||
color: var(--raspap-content-main);
|
||||
}
|
||||
.sidebar-brand-text {
|
||||
text-transform: none;
|
||||
color: #212529;
|
||||
font-size: 2.0rem;
|
||||
font-weight: 500;
|
||||
font-family: Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
th {
|
||||
color: var(--raspap-content-main) !important;
|
||||
}
|
||||
|
||||
.h-underlined {
|
||||
border-bottom: 1px solid #e3e6f0;
|
||||
padding-bottom: 0.3rem;
|
||||
|
@ -60,7 +46,7 @@ th {
|
|||
.info-item {
|
||||
text-transform: uppercase;
|
||||
font-size: 0.7em;
|
||||
color: var(--raspap-text-muted);
|
||||
color: #858796;
|
||||
}
|
||||
|
||||
.info-value {
|
||||
|
@ -137,7 +123,7 @@ th {
|
|||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
color: var(--raspap-text-muted);
|
||||
color: #858796;
|
||||
content: "\f1ce"; /* Unicode for the circle-notch icon */
|
||||
font-family: "Font Awesome 5 Free";
|
||||
font-weight: 900; /* Adjust as needed */
|
||||
|
@ -169,7 +155,12 @@ th {
|
|||
}
|
||||
|
||||
canvas#divDBChartBandwidthhourly {
|
||||
height: 509px!important;
|
||||
height: 350px!important;
|
||||
}
|
||||
|
||||
.chart-container {
|
||||
height: 150px;
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.dbChart {
|
||||
|
@ -186,7 +177,7 @@ canvas#divDBChartBandwidthhourly {
|
|||
}
|
||||
|
||||
.check-progress {
|
||||
color: var(--raspap-text-light);
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.fa-check {
|
||||
|
@ -214,6 +205,7 @@ button.btn.btn-light.js-toggle-password {
|
|||
width: 4px;
|
||||
border-radius: 1px;
|
||||
opacity: 30%;
|
||||
background: <?php echo $color; ?>;
|
||||
}
|
||||
|
||||
.signal-icon .signal-bar:nth-child(1) { height: 40%; }
|
||||
|
@ -260,7 +252,7 @@ button.btn.btn-light.js-toggle-password {
|
|||
}
|
||||
|
||||
figcaption.figure-caption a {
|
||||
color: var(--raspap-text-muted);
|
||||
color: #858796;
|
||||
}
|
||||
|
||||
button > i.fas {
|
||||
|
@ -274,390 +266,20 @@ button > i.fas {
|
|||
|
||||
.was-validated .form-control:valid,
|
||||
.was-validated .form-control:invalid {
|
||||
background-position: center right calc(.375em + .4875rem);
|
||||
background-position: center right calc(.375em + .4875rem);
|
||||
}
|
||||
|
||||
.was-validated .form-control:invalid {
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%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-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%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-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
||||
}
|
||||
|
||||
.was-validated .form-control:valid {
|
||||
background-size: calc(0.6em + 0.375rem) calc(0.6em + 0.375rem);
|
||||
background-size: calc(0.6em + 0.375rem) calc(0.6em + 0.375rem);
|
||||
}
|
||||
|
||||
.input-group>.input-group-append:not(:last-child)>.btn {
|
||||
border-top-right-radius: 0.35rem;
|
||||
border-bottom-right-radius: 0.35rem;
|
||||
}
|
||||
|
||||
.nav-user {
|
||||
position: relative;
|
||||
bottom: 11px;
|
||||
right: 3px;
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
/* Font Awesome 5 brands */
|
||||
.fa-reddit {
|
||||
color: #ff4500;
|
||||
}
|
||||
.fa-twitter {
|
||||
color: #55acee
|
||||
}
|
||||
.fa-discord {
|
||||
color: #7289da
|
||||
}
|
||||
.fa-github {
|
||||
color: #151b23
|
||||
}
|
||||
|
||||
@keyframes heart {
|
||||
0%, 40%, 80%, 100% {
|
||||
transform: scale(1);
|
||||
}
|
||||
20%, 60% {
|
||||
transform: scale(1.15);
|
||||
}
|
||||
}
|
||||
|
||||
.heart {
|
||||
color: #e63946;
|
||||
animation: heart 1000ms infinite;
|
||||
}
|
||||
|
||||
#modal-admin-login .modal-content {
|
||||
background: radial-gradient(circle at 120% -20%, #032626, #052c2c, #073232, #0a3838, #0d3f3f, #114545, #144c4c);
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#modal-admin-login .modal-body {
|
||||
min-width: 330px;
|
||||
}
|
||||
|
||||
.login-brand {
|
||||
color: var(--raspap-theme-color);
|
||||
filter: brightness(150%);
|
||||
}
|
||||
|
||||
.admin-login {
|
||||
color: var(--raspap-offwhite);
|
||||
font-size: 1.2em
|
||||
}
|
||||
|
||||
.btn-admin-login {
|
||||
color: var(--raspap-offwhite);
|
||||
background-color: var(--raspap-theme-color);
|
||||
}
|
||||
|
||||
.btn-admin-login:hover {
|
||||
color: var(--raspap-offwhite);
|
||||
background-color: #236969;
|
||||
}
|
||||
|
||||
.no-right-radius {
|
||||
border-top-right-radius: 0 !important;
|
||||
border-bottom-right-radius: 0 !important;
|
||||
}
|
||||
|
||||
.btn-passwd-append {
|
||||
border: 1px solid #ced4da;
|
||||
}
|
||||
|
||||
#passwd-toggle:active,
|
||||
#passwd-toggle:hover,
|
||||
#passwd-toggle:focus {
|
||||
border: 1px solid #ced4da;
|
||||
}
|
||||
|
||||
textarea.plugin-log {
|
||||
width: 100%;
|
||||
height: 150px;
|
||||
resize: none;
|
||||
border: 1px solid #dee2e6;
|
||||
border-radius: 0.25rem;
|
||||
padding: 0.5rem;
|
||||
background-color: #f8f9fa;
|
||||
font-family: monospace;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.card-wrapper {
|
||||
margin: 1rem;
|
||||
}
|
||||
|
||||
.dashboard-container {
|
||||
display: flex;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
min-height: 400px;
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
.connections-left,
|
||||
.connections-right {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.connection-item {
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
z-index: 5;
|
||||
color: var(--raspap-text-light);
|
||||
}
|
||||
|
||||
.connection-right {
|
||||
align-items: center;
|
||||
margin-left: 10rem;
|
||||
}
|
||||
|
||||
.connections-left i {
|
||||
height: 40px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: left;
|
||||
}
|
||||
|
||||
.connections-left i:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.connections-left i:last-child {
|
||||
margin-bottom: 0;
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
|
||||
.center-device {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.center-device-top {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.client-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: row-reverse;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.client-count {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.clients-status {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: flex-end;
|
||||
padding-right: 1rem;
|
||||
}
|
||||
|
||||
.dashed-lines,
|
||||
.solid-lines {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
padding: 1rem;
|
||||
left: 112px;
|
||||
}
|
||||
|
||||
.dashed-lines-right,
|
||||
.solid-lines-right {
|
||||
left: -80px;
|
||||
}
|
||||
|
||||
.solid-lines, .solid-lines-right {
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.dashed-lines, .dashed-lines-right {
|
||||
z-index 0;
|
||||
}
|
||||
|
||||
.device-status {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 1rem;
|
||||
justify-content: center;
|
||||
margin: 0.8rem 0;
|
||||
}
|
||||
|
||||
.wifi-bands {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.band {
|
||||
padding: 0.25rem 1rem;
|
||||
border: 2px solid var(--raspap-text-light);
|
||||
border-radius: 4px;
|
||||
background: transparent;
|
||||
font-weight: 600;
|
||||
color: var(--raspap-text-light);
|
||||
}
|
||||
|
||||
.band.active {
|
||||
border-color: var(--raspap-theme-color);
|
||||
color: var(--raspap-theme-color);
|
||||
}
|
||||
|
||||
.device-label {
|
||||
font-size: 1.3rem;
|
||||
text-align: center;
|
||||
color: var(--raspap-theme-color);
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.status-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 1.3rem;
|
||||
color: var(--raspap-text-light);
|
||||
}
|
||||
|
||||
.bottom {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 1.3rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.status-item .fa-stack {
|
||||
width: 1.5em!important;
|
||||
}
|
||||
|
||||
.connection-item>i {
|
||||
color: var(--raspap-text-light);
|
||||
}
|
||||
|
||||
.connection-item .fa-stack {
|
||||
min-width: 2.5em;
|
||||
}
|
||||
|
||||
.connections-left>.connection-item>span {
|
||||
color: var(--raspap-text-light);
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
|
||||
.inactive {
|
||||
color: var(--raspap-text-light)!important;
|
||||
}
|
||||
|
||||
a.inactive:hover,
|
||||
a.inactive:focus {
|
||||
color: var(--raspap-text-light) !important;
|
||||
}
|
||||
|
||||
@media (max-width: 1200px) {
|
||||
.connection-item a > span:not(.fa-stack) {
|
||||
display: none!important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 991px) {
|
||||
.connections-right,
|
||||
.connections-left {
|
||||
display: none!important;
|
||||
}
|
||||
.dashboard-container {
|
||||
width: auto;
|
||||
padding: 0;
|
||||
|
||||
}
|
||||
.device-status {
|
||||
gap: 0.5rem;
|
||||
}
|
||||
.clients-mobile {
|
||||
display: flex!important;
|
||||
flex-direction: row!important;
|
||||
}
|
||||
}
|
||||
.connection-item.active > span {
|
||||
color: var(--raspap-theme-color)!important;
|
||||
}
|
||||
.connection-item.active > i {
|
||||
color: var(--raspap-theme-color)!important;
|
||||
}
|
||||
.status-item.active > span {
|
||||
color: var(--raspap-theme-color)!important;
|
||||
}
|
||||
.status-item.active > i {
|
||||
color: var(--raspap-theme-color)!important;
|
||||
}
|
||||
|
||||
.clients-mobile {
|
||||
display: none;
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
.client-type {
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.client-type i {
|
||||
font-size: 1.5rem;
|
||||
color: var(--raspap-theme-color);
|
||||
width: 45px;
|
||||
height: 45px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border: 2px solid var(--raspap-theme-color);
|
||||
}
|
||||
|
||||
.client-type i.badge-icon {
|
||||
font-size: 0.7rem;
|
||||
background: var(--raspap-theme-color);
|
||||
color: var(--raspap-offwhite);
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.client-count {
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
right: -5px;
|
||||
background: var(--raspap-theme-color);
|
||||
color: var(--raspap-offwhite);
|
||||
border-radius: 50%;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.device-illustration {
|
||||
min-width: 220px;
|
||||
max-width: 250px;
|
||||
border-top-right-radius: 0.35rem;
|
||||
border-bottom-right-radius: 0.35rem;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,60 +13,26 @@ License: GNU General Public License v3.0
|
|||
|
||||
@import url('all.css');
|
||||
|
||||
:root {
|
||||
--raspap-theme-color: <?php echo $color; ?>;
|
||||
--raspap-theme-lighter: <?php echo lightenColor($color, 20); ?>;
|
||||
--raspap-theme-darker: <?php echo darkenColor($color, 20); ?>;
|
||||
}
|
||||
|
||||
body {
|
||||
color: #212529;
|
||||
background-color: #f8f9fc;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--raspap-theme-color);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:focus, a:hover {
|
||||
color: var(--raspap-theme-darker);
|
||||
}
|
||||
|
||||
.sb-sidenav-light .sb-sidenav-menu .nav-link:hover {
|
||||
color: var(--raspap-theme-color);
|
||||
}
|
||||
|
||||
.sidebar-brand-text:focus,
|
||||
.sidebar-brand-text:hover {
|
||||
color: var(--raspap-theme-darker);
|
||||
}
|
||||
|
||||
.form-check-input:checked {
|
||||
background-color: var(--raspap-theme-color);
|
||||
border-color: var(--raspap-theme-color);
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
background-color: #f8f9fc;
|
||||
}
|
||||
|
||||
.sb-nav-link-icon.active {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.sidebar .nav-item.active .nav-link {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.sidebar-brand-text {
|
||||
color: var(--raspap-theme-color);
|
||||
color: <?php echo $color; ?>;
|
||||
}
|
||||
|
||||
.card .card-header, .modal-header {
|
||||
border-color: var(--raspap-theme-color);
|
||||
border-color: <?php echo $color; ?>;
|
||||
color: #fff;
|
||||
background-color: var(--raspap-theme-color);
|
||||
background-color: <?php echo $color; ?>;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
|
@ -74,25 +40,25 @@ a:focus, a:hover {
|
|||
}
|
||||
|
||||
.btn-primary {
|
||||
color: var(--raspap-theme-color);
|
||||
border-color: var(--raspap-theme-color);
|
||||
color: <?php echo $color; ?>;
|
||||
border-color: <?php echo $color; ?>;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.btn-primary:disabled {
|
||||
color: var(--raspap-theme-color) !important;
|
||||
border-color: var(--raspap-theme-color) !important;
|
||||
color: <?php echo $color; ?> !important;
|
||||
border-color: <?php echo $color; ?> !important;
|
||||
background-color: #fff !important;
|
||||
}
|
||||
|
||||
.card-body {
|
||||
color: #495057;
|
||||
}
|
||||
|
||||
.card-footer, .modal-footer {
|
||||
background-color: #f2f1f0;
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-link.active,
|
||||
.nav-tabs .nav-link {
|
||||
font-size: 1.0rem;
|
||||
|
@ -110,6 +76,10 @@ a.nav-link.active {
|
|||
padding: 0.6rem 0.6rem 0.6rem 1.0rem;
|
||||
}
|
||||
|
||||
.alert-success {
|
||||
background-color: #d4edda;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background-color: #fff;
|
||||
}
|
||||
|
@ -119,8 +89,8 @@ a.nav-link.active {
|
|||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background-color: var(--raspap-theme-color);
|
||||
border-color: var(--raspap-theme-color);
|
||||
background-color: <?php echo $color; ?>;
|
||||
border-color: <?php echo $color; ?>;
|
||||
}
|
||||
|
||||
i.fa.fa-bars {
|
||||
|
@ -149,6 +119,6 @@ pre.unstyled {
|
|||
}
|
||||
|
||||
.signal-icon .signal-bar {
|
||||
background: var(--raspap-theme-color);
|
||||
background: <?php echo $color; ?>;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,83 +0,0 @@
|
|||
/*
|
||||
Theme Name: Lights Out
|
||||
Author: @billz
|
||||
Author URI: https://github.com/billz
|
||||
Description: A Bootstrap dark mode theme for RaspAP
|
||||
License: GNU General Public License v3.0
|
||||
*/
|
||||
|
||||
@import url('custom.php');
|
||||
|
||||
html[data-bs-theme="dark"] {
|
||||
background-color: var(--bs-dark);
|
||||
color: var(--bs-light);
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] body,
|
||||
html[data-bs-theme="dark"] footer,
|
||||
html[data-bs-theme="dark"] .sb-sidenav,
|
||||
html[data-bs-theme="dark"] .sb-topnav,
|
||||
html[data-bs-theme="dark"] .card,
|
||||
html[data-bs-theme="dark"] .card-footer {
|
||||
background-color: var(--bs-dark);
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] .card-body,
|
||||
html[data-bs-theme="dark"] .card-footer,
|
||||
html[data-bs-theme="dark"] .info-item-xs,
|
||||
html[data-bs-theme="dark"] .table>:not(caption)>*>* {
|
||||
color: var(--bs-secondary);
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] .sb-topnav.navbar {
|
||||
background-color: var(--bs-dark) !important;
|
||||
color: var(--bs-light);
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] .sb-topnav.navbar,
|
||||
html[data-bs-theme="dark"] .sb-topnav.navbar a {
|
||||
color: var(--raspap-theme-color) !important;
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] .sb-topnav.navbar a:hover,
|
||||
html[data-bs-theme="dark"] .sb-topnav.navbar a:focus {
|
||||
color: var(--raspap-theme-darker) !important;
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] .sb-topnav.navbar {
|
||||
--bs-navbar-bg: var(--bs-dark);
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] .sb-topnav.navbar.navbar-light {
|
||||
color: var(--bs-light);
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] .card {
|
||||
border-color: var(--bs-secondary);
|
||||
color: var(--bs-light);
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] .card-footer {
|
||||
border-color: var(--bs-secondary);
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] .nav-tabs {
|
||||
--bs-nav-tabs-link-active-color: var(--bs-light);
|
||||
--bs-nav-tabs-link-active-bg: var(--bs-dark);
|
||||
--bs-nav-tabs-link-active-border-color: var(--bs-secondary) var(--bs-secondary) var(--bs-dark);
|
||||
--bs-nav-tabs-border-color: var(--bs-secondary);
|
||||
--bs-nav-tabs-link-hover-border-color: var(--bs-secondary);
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] .btn {
|
||||
color: var(--bs-gray-800);
|
||||
opacity: 75%;
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] select,
|
||||
html[data-bs-theme="dark"] .form-control {
|
||||
background-color: var(--bs-dark);
|
||||
border-color: var(--bs-secondary);
|
||||
color: var(--bs-light);
|
||||
}
|
||||
|
|
@ -35,12 +35,8 @@ h5.card-title {
|
|||
color: #212529;
|
||||
}
|
||||
|
||||
.sb-sidenav-menu, footer {
|
||||
background-color: var(--bs-body-bg);
|
||||
}
|
||||
|
||||
.card, .modal-dialog {
|
||||
border-radius: 5px;
|
||||
border-radius: 3px;
|
||||
border-color: #ff6600;
|
||||
}
|
||||
|
||||
|
@ -79,20 +75,8 @@ h5.card-title {
|
|||
ul.nav-tabs, .nav-tabs .nav-link {
|
||||
background-color: #f6f6ef;
|
||||
border-bottom: 1px solid #dddfeb;
|
||||
color: #495057;
|
||||
font-size: 1.0rem;
|
||||
}
|
||||
|
||||
.form-switch .form-check-input:checked {
|
||||
background-color: #ff6600;
|
||||
border-color: #828282;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-code-color);
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.sidebar .nav-item .nav-link {
|
||||
padding: 0.6rem;
|
||||
margin-left: 0.6rem;
|
||||
|
@ -102,14 +86,16 @@ code {
|
|||
font-weight: 300;
|
||||
}
|
||||
|
||||
.card-body {
|
||||
background-color: #f6f6ef;
|
||||
border-radius: 5px;
|
||||
#wrapper,#page-wrapper,
|
||||
#wrapper #content-wrapper,
|
||||
.nav>li>a,.nav {
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
th {
|
||||
color: #495057 !important;
|
||||
.card-body {
|
||||
background-color: #f6f6ef;
|
||||
}
|
||||
|
||||
.card-footer {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
|
374
app/css/lightsout.php
Normal file
374
app/css/lightsout.php
Normal file
|
@ -0,0 +1,374 @@
|
|||
<?php header("Content-Type: text/css; charset=utf-8"); ?>
|
||||
<?php
|
||||
require_once '../../includes/functions.php';
|
||||
$color = getColorOpt();
|
||||
?>
|
||||
|
||||
/*
|
||||
Theme Name: Lights Out
|
||||
Author: @billz
|
||||
Author URI: https://github.com/billz
|
||||
Description: A dark mode theme for RaspAP
|
||||
License: GNU General Public License v3.0
|
||||
*/
|
||||
|
||||
<?php
|
||||
// Base color
|
||||
$baseColor = $color;
|
||||
$textColor = lightenColor($baseColor, 95);
|
||||
$secondaryColor = lightenColor($baseColor, 30);
|
||||
?>
|
||||
|
||||
@import url('all.css');
|
||||
|
||||
html * {
|
||||
font-family: Helvetica,Arial,sans-serif;
|
||||
color: #afafaf;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 2rem !important;
|
||||
}
|
||||
|
||||
.page-header {
|
||||
border-left: .01rem solid #d2d2d2;
|
||||
border-bottom: .01rem solid #d2d2d2;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-item.active .nav-link i {
|
||||
color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar .nav-item.active .nav-link {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.sidebar-brand-text {
|
||||
color: <?php echo $color; ?>;
|
||||
}
|
||||
|
||||
#wrapper #content-wrapper #content {
|
||||
background-color: #202020;
|
||||
}
|
||||
|
||||
.topbar {
|
||||
background-color: #202020;
|
||||
}
|
||||
|
||||
.nav-tabs {
|
||||
border-bottom: 1px solid #404040;
|
||||
}
|
||||
.nav-tabs .nav-link.active,
|
||||
.nav-tabs .nav-link {
|
||||
font-size: 1.0rem;
|
||||
}
|
||||
|
||||
.nav-link.active {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-link:hover {
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-brand:hover {
|
||||
color: #d2d2d2;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-toggle {
|
||||
border-color: #d2d2d2;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-toggle .icon-bar {
|
||||
background-color: #d2d2d2;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-toggle:focus,
|
||||
.navbar-default .navbar-toggle:hover {
|
||||
background-color: #202020;
|
||||
}
|
||||
|
||||
#content, .navbar, .sidebar, .footer, .sticky-footer {
|
||||
background-attachment: scroll;
|
||||
background-repeat: repeat;
|
||||
background-size: auto;
|
||||
background-position: 0 0;
|
||||
background-origin: padding-box;
|
||||
background-clip: border-box;
|
||||
}
|
||||
|
||||
.sticky-footer {
|
||||
background-position: 30px 0;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
background-position: 0 20px;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-link.active {
|
||||
color: #d2d2d2;
|
||||
background-color: #141414;
|
||||
border-color: #404040 #404040 #141414;
|
||||
}
|
||||
|
||||
a:focus, a:hover {
|
||||
color: #d2d2d2;
|
||||
}
|
||||
|
||||
.card>.card-header, .modal-content, .modal-header {
|
||||
border-color: #404040;
|
||||
background-color: #202020;
|
||||
color: #afafaf;
|
||||
border-top-right-radius: 0.35rem;
|
||||
border-top-left-radius: 0.35rem;
|
||||
font-size: 1.0rem;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
background-color: #141414;
|
||||
}
|
||||
|
||||
.card>.card-header .fa {
|
||||
color: #202020;
|
||||
}
|
||||
|
||||
.card-header [class^="fa"] {
|
||||
color: #afafaf;
|
||||
font-size: 1.0rem;
|
||||
}
|
||||
|
||||
.col {
|
||||
color: #afafaf;
|
||||
}
|
||||
|
||||
.card, .card-body {
|
||||
border-color: #343434;
|
||||
border-radius: 0.35rem;
|
||||
background-color: #141414;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-top: .01rem solid #d2d2d2;
|
||||
}
|
||||
|
||||
.ra-raspap:before {
|
||||
color: #ac1b3d !important;
|
||||
}
|
||||
|
||||
.sidebar-light #sidebarToggle {
|
||||
background-color: #202020;
|
||||
border: 1px solid #afafaf !important
|
||||
}
|
||||
|
||||
.sidebar-light #sidebarToggle::after {
|
||||
color: #afafaf;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-item .nav-link:hover i {
|
||||
color: #d2d2d2;
|
||||
}
|
||||
|
||||
.sidebar-light #sidebarToggle:hover {
|
||||
background-color: #202020;
|
||||
}
|
||||
|
||||
.sidebar.toggled .nav-item .nav-link span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sidebar.toggled .nav-item .nav-link {
|
||||
text-align: center;
|
||||
padding: .6rem 1rem;
|
||||
width: 6.5rem;
|
||||
}
|
||||
|
||||
.card-footer, .modal-footer {
|
||||
background-color: #202020;
|
||||
border-top: 0px;
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
border-radius: 0.3rem;
|
||||
}
|
||||
|
||||
.card>.card-header::before, .navbar-default::before {
|
||||
content: " ";
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
z-index: 2;
|
||||
background-size: 100% 2px, 3px 100%;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.sidebar-light, .sticky-footer {
|
||||
background-color: #202020;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-item .nav-link i {
|
||||
color: <?php echo $color; ?>
|
||||
}
|
||||
|
||||
.sidebar .nav-item .nav-link {
|
||||
padding: 0.6rem;
|
||||
padding-left: 1.2rem;
|
||||
}
|
||||
|
||||
.sidebar-light hr.sidebar-divider {
|
||||
border-top: 1px solid #404040;
|
||||
padding-top: 0.5rem;
|
||||
}
|
||||
|
||||
.sidebar .nav-item .nav-link span {
|
||||
font-size: 1.0rem;
|
||||
}
|
||||
|
||||
.topbar .topbar-divider {
|
||||
border-right: 1px solid #404040;
|
||||
}
|
||||
|
||||
.label-warning {
|
||||
background-color: #d2d2d2;
|
||||
}
|
||||
|
||||
span.label.label-warning {
|
||||
color: #202020;
|
||||
}
|
||||
|
||||
.table>tbody>tr>td,
|
||||
.table>tbody>tr>th,
|
||||
.table>tfoot>tr>td,
|
||||
.table>tfoot>tr>th,
|
||||
.table>thead>tr>td,
|
||||
.table>thead>tr>th {
|
||||
background-color: #202020;
|
||||
border-top: .01rem solid #202020;
|
||||
}
|
||||
|
||||
.table>thead>tr>th {
|
||||
vertical-align: bottom;
|
||||
border-bottom: .01rem solid #d2d2d2;
|
||||
}
|
||||
|
||||
[class*="btn"], [class*="btn"]:focus, [class*="btn"]:disabled {
|
||||
background-color: #202020;
|
||||
border-color: #404040;
|
||||
border-radius: 0.35rem;
|
||||
color: #d2d2d2;
|
||||
}
|
||||
|
||||
[class*="btn"]:hover {
|
||||
border-radius: 3px;
|
||||
color: #d2d2d2;
|
||||
background-color: #202020;
|
||||
border-color: #afafaf;
|
||||
}
|
||||
|
||||
[class*="btn"]:hover .disabled {
|
||||
background-color:red;
|
||||
}
|
||||
|
||||
[class*="alert"] {
|
||||
border-radius: .35rem;
|
||||
color: #d2d2d2;
|
||||
background-color: #202020;
|
||||
border: 1px solid #404040;
|
||||
}
|
||||
|
||||
.close {
|
||||
font-size: 1.2em;
|
||||
font-weight: 400;
|
||||
text-shadow: none;
|
||||
color: #d2d2d2;
|
||||
}
|
||||
|
||||
.form-control,
|
||||
.form-control:focus,
|
||||
.custom-select {
|
||||
color: #d2d2d2;
|
||||
background-color: #202020;
|
||||
border: 1px solid #404040;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.form-control:disabled,
|
||||
.form-control[readonly] {
|
||||
background-color: #202020;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.form-control::-webkit-input-placeholder { color: #d2d2d2; }
|
||||
.form-control:-moz-placeholder { color: #d2d2d2; }
|
||||
.form-control::-moz-placeholder { color: #d2d2d2; }
|
||||
.form-control:-ms-input-placeholder { color: #d2d2d2; }
|
||||
.form-control::-ms-input-placeholder { color: #d2d2d2; }
|
||||
|
||||
input[type="text"]{
|
||||
color: #d2d2d2 !important
|
||||
}
|
||||
|
||||
.progress {
|
||||
background-color: #202020;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
color: #202020;
|
||||
}
|
||||
|
||||
.progress-bar.progress-bar-info.progress-bar-striped.active {
|
||||
background-color: #d2d2d2;
|
||||
}
|
||||
|
||||
.figure-img {
|
||||
filter: opacity(0.7);
|
||||
}
|
||||
|
||||
.ra-wireguard:hover:before {
|
||||
color: #d1d3e2 !important;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-link span.ra-wireguard:before {
|
||||
color: <?php echo $color; ?>!important;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-item.active .nav-link span.ra-wireguard:before {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.logoutput {
|
||||
background-color: #202020;
|
||||
border-color: #404040;
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.fas.fa-circle {
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: #202020;
|
||||
border: #202020;
|
||||
}
|
||||
|
||||
button.btn.btn-light.js-toggle-password {
|
||||
border: 1px solid #343434;
|
||||
}
|
||||
|
||||
.btn-light {
|
||||
border-color: #343434;
|
||||
border-radius: 0.35rem;
|
||||
background-color: #141414;
|
||||
}
|
||||
|
||||
.signal-icon .signal-bar {
|
||||
background: #2b8080;
|
||||
}
|
||||
|
613
app/css/material-dark.php
Normal file
613
app/css/material-dark.php
Normal file
|
@ -0,0 +1,613 @@
|
|||
<?php header("Content-Type: text/css; charset=utf-8"); ?>
|
||||
<?php
|
||||
require_once '../../includes/functions.php';
|
||||
$color = getColorOpt();
|
||||
?>
|
||||
|
||||
/*
|
||||
Theme Name: Material Dark
|
||||
Author: @marek-guran
|
||||
Author URI: https://github.com/marek-guran
|
||||
Description: Inspired by Google's Material You Design
|
||||
License: GNU General Public License v3.0
|
||||
*/
|
||||
|
||||
<?php
|
||||
// Base color
|
||||
$baseColor = $color;
|
||||
|
||||
$textColor = lightenColor($baseColor, 95);
|
||||
// Create other color variables
|
||||
$cardsColor = darkenColor($baseColor, 60);
|
||||
$secondaryColor = lightenColor($baseColor, 30);
|
||||
$primaryColor = $baseColor;
|
||||
$backgroundColor = darkenColor($baseColor, 90);
|
||||
?>
|
||||
|
||||
@import url('all.css');
|
||||
|
||||
body {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
html * {
|
||||
font-family: Helvetica,Arial,sans-serif;
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.nav-item.active .nav-link {
|
||||
position: relative;
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
|
||||
border-top-right-radius: 18px;
|
||||
border-bottom-right-radius: 18px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 2rem !important;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.3rem;
|
||||
}
|
||||
|
||||
h5.card-title {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.page-header {
|
||||
border-left: .01rem solid <?php echo $secondaryColor; ?>;
|
||||
border-bottom: .01rem solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-item.active .nav-link i {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar .nav-item.active .nav-link {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.sidebar .nav-item .nav-link span:hover {
|
||||
color: <?php echo $textColor; ?>!important;
|
||||
}
|
||||
|
||||
#wrapper #content-wrapper #content {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.topbar {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.col {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.card-header .col i.fa-tachometer-alt,
|
||||
.card-header .col i.fa-dot-circle,
|
||||
.card-header .col i.fa-wifi,
|
||||
.card-header .col i.fa-exchange-alt,
|
||||
.card-header .col i.fa-hand-paper,
|
||||
.card-header .col i.fa-network-wired,
|
||||
.card-header .col i.fa-key,
|
||||
.card-header .ra-wireguard,
|
||||
.card-header .ra-wireguard:before,
|
||||
.card-header .col i.fa-user-lock,
|
||||
.card-header .col i.fa-chart-bar,
|
||||
.card-header .col i.fa-cube,
|
||||
.card-header .col i.fa-info-circle,
|
||||
.card-header .col i.fa-globe,
|
||||
.card-header .col i.fa-shield-alt {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
i.fa-bars {
|
||||
color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.nav-tabs {
|
||||
border-bottom: 1px solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
.nav-tabs .nav-link.active,
|
||||
.nav-tabs .nav-link {
|
||||
font-size: 1.0rem;
|
||||
border-top-left-radius: 18px;
|
||||
border-top-right-radius: 18px;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-link:hover {
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-brand:hover {
|
||||
color: #d2d2d2;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-toggle {
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-toggle .icon-bar {
|
||||
background-color: #d2d2d2;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-toggle:focus,
|
||||
.navbar-default .navbar-toggle:hover {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
#content, .navbar, .sidebar, .footer, .sticky-footer {
|
||||
background-attachment: scroll;
|
||||
background-repeat: repeat;
|
||||
background-size: auto;
|
||||
background-position: 0 0;
|
||||
background-origin: padding-box;
|
||||
background-clip: border-box;
|
||||
}
|
||||
|
||||
.sticky-footer {
|
||||
background-position: 30px 0;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
background-position: 0 20px;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-link.active {
|
||||
color: <?php echo $textColor; ?>;
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
a:focus, a:hover {
|
||||
color: #d2d2d2;
|
||||
}
|
||||
|
||||
.card>.card-header, .modal-content, .modal-header {
|
||||
border-color: transparent;
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
color: <?php echo $textColor; ?>;
|
||||
border-radius: 18px;
|
||||
font-size: 1.0rem;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
min-height: 8rem;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
border-bottom-left-radius: 0px!important;
|
||||
border-bottom-right-radius: 0px!important;
|
||||
position: relative;
|
||||
margin-bottom: -18px;
|
||||
}
|
||||
|
||||
.card>.card-header .fa {
|
||||
color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.card-header [class^="fa"] {
|
||||
color: <?php echo $textColor; ?>;
|
||||
font-size: 1.0rem;
|
||||
}
|
||||
|
||||
.card, .card-body {
|
||||
border-color: transparent;
|
||||
border-radius: 18px;
|
||||
background-color: <?php echo $cardsColor; ?>;
|
||||
}
|
||||
|
||||
.card-body {
|
||||
padding-top: 36px; /* 18px to move down + 18px space at the top */
|
||||
padding-bottom: 36px; /* 18px space at the bottom */
|
||||
}
|
||||
|
||||
.unstyled {
|
||||
background-color: <?php echo $cardsColor; ?>;
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-top: .01rem solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar-brand-text {
|
||||
color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.ra-raspap:before {
|
||||
color: #ac1b3d !important;
|
||||
}
|
||||
|
||||
.sidebar-light #sidebarToggle {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border: 1px solid <?php echo $secondaryColor; ?>; !important
|
||||
}
|
||||
|
||||
.sidebar-light #sidebarToggle::after {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-item .nav-link:hover i {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar-light #sidebarToggle:hover {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar.toggled .nav-item .nav-link span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sidebar.toggled .nav-item .nav-link {
|
||||
text-align: center;
|
||||
padding: .6rem 1rem;
|
||||
width: 6.5rem;
|
||||
}
|
||||
|
||||
.card-footer, .modal-footer {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
color: <?php echo $textColor; ?>;
|
||||
border-top: 0px;
|
||||
border-bottom-right-radius: 18px!important;
|
||||
border-bottom-left-radius: 18px!important;
|
||||
position: relative;
|
||||
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.1),
|
||||
0px 4px 6px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
margin-top: 0px;
|
||||
height: 3.5rem;
|
||||
}
|
||||
|
||||
.card>.card-header::before, .navbar-default::before {
|
||||
content: " ";
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
z-index: 2;
|
||||
background-size: 100% 2px, 3px 100%;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.sidebar-light, .sticky-footer {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-item .nav-link i {
|
||||
color: rgba(230, 230, 230, .3);
|
||||
}
|
||||
|
||||
.sidebar .nav-item .nav-link {
|
||||
padding: 0.6rem;
|
||||
padding-left: 1.2rem;
|
||||
}
|
||||
|
||||
.sidebar-light hr.sidebar-divider {
|
||||
border-top: 1px solid <?php echo $secondaryColor; ?>;
|
||||
padding-top: 0.5rem;
|
||||
}
|
||||
|
||||
.sidebar .nav-item .nav-link span {
|
||||
font-size: 1.0rem;
|
||||
}
|
||||
|
||||
.topbar .topbar-divider {
|
||||
border-right: 1px solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.label-warning {
|
||||
background-color: #d2d2d2;
|
||||
}
|
||||
|
||||
span.label.label-warning {
|
||||
color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.table>tbody>tr>td,
|
||||
.table>tbody>tr>th,
|
||||
.table>tfoot>tr>td,
|
||||
.table>tfoot>tr>th,
|
||||
.table>thead>tr>td,
|
||||
.table>thead>tr>th {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border-top: .01rem solid <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.table{
|
||||
border-radius: 18px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.table>thead>tr>th {
|
||||
vertical-align: bottom;
|
||||
border-bottom: 0 solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
[class*="btn"], [class*="btn"]:focus, [class*="btn"]:disabled {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
border-color: transparent;
|
||||
border-radius: 18px;
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
[class*="btn"]:hover {
|
||||
border-radius: 18px;
|
||||
color: <?php echo $textColor; ?>;
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
[class*="btn"]:hover .disabled {
|
||||
background-color:red;
|
||||
}
|
||||
|
||||
[class*="alert"] {
|
||||
border-radius: 18px;
|
||||
color: <?php echo $textColor; ?>;
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border: 1px solid #404040;
|
||||
}
|
||||
|
||||
.close {
|
||||
font-size: 1.2em;
|
||||
font-weight: 400;
|
||||
text-shadow: none;
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.form-control,
|
||||
.form-control:focus,
|
||||
.custom-select {
|
||||
color: <?php echo $textColor; ?>;
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
border-radius: 18px;
|
||||
}
|
||||
|
||||
.form-control:disabled,
|
||||
.form-control[readonly] {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.form-control::-webkit-input-placeholder { color: #d2d2d2; }
|
||||
.form-control:-moz-placeholder { color: #d2d2d2; }
|
||||
.form-control::-moz-placeholder { color: #d2d2d2; }
|
||||
.form-control:-ms-input-placeholder { color: #d2d2d2; }
|
||||
.form-control::-ms-input-placeholder { color: #d2d2d2; }
|
||||
|
||||
.form-control option {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
input[type="text"]{
|
||||
color: <?php echo $textColor; ?>; !important
|
||||
}
|
||||
|
||||
.progress {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border-radius: 18px;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
#progressBar {
|
||||
background-color: <?php echo $secondaryColor; ?>!important;
|
||||
}
|
||||
|
||||
.progress-bar.bg-success {
|
||||
background-color: <?php echo $primaryColor; ?>!important;
|
||||
color: <?php echo $textColor; ?>!important;
|
||||
}
|
||||
|
||||
.progress .progress-bar {
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.progress-bar.progress-bar-info.progress-bar-striped.active {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.figure-img {
|
||||
filter: opacity(0.7);
|
||||
}
|
||||
|
||||
.ra-wireguard:before {
|
||||
color: #404040 !important;
|
||||
}
|
||||
|
||||
.ra-wireguard:hover:before {
|
||||
color: #d1d3e2 !important;
|
||||
}
|
||||
|
||||
.sidebar .nav-item.active .nav-link span.ra-wireguard:before {
|
||||
color: #d2d2d2 !important;
|
||||
}
|
||||
|
||||
.custom-control-input:checked ~ .custom-control-label::before {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.custom-control-input:checked ~ .custom-control-label::before {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border-color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.wg-keygen {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border: 1px solid yellow <?php echo $secondaryColor; ?>;
|
||||
border-top-right-radius: 18px !important;
|
||||
border-bottom-right-radius: 18px !important;
|
||||
}
|
||||
|
||||
.btn.btn-outline-secondary.js-add-dhcp-upstream-server {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
border-top-right-radius: 18px !important;
|
||||
border-bottom-right-radius: 18px !important;
|
||||
}
|
||||
|
||||
.btn.btn-outline-success.js-add-dhcp-static-lease {
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.btn.btn-outline-success.js-add-dhcp-static-lease:hover {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.fas.fa-circle {
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
button.btn.btn-light.js-toggle-password {
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
border-color: transparent;
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.btn.service-status {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
input.btn.btn-success {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
input.btn.btn-success:hover {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.signal-icon .signal-bar {
|
||||
background: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.figure-img {
|
||||
border-radius: 18px;
|
||||
}
|
||||
|
||||
.logoutput {
|
||||
border-radius: 18px!important;
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border: 1px solid <?php echo $primaryColor; ?>!important;
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.btn-sm {
|
||||
border-top-right-radius: 18px!important;
|
||||
border-bottom-right-radius: 18px!important;
|
||||
}
|
||||
|
||||
.signal-icon .signal-bar {
|
||||
background: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
input.btn.btn-warning {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
input.btn.btn-warning:hover {
|
||||
background-color: <?php echo $backgroundColor; ?>;!important
|
||||
}
|
||||
|
||||
button.btn.btn-danger {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
button.btn.btn-danger:hover {
|
||||
background-color: <?php echo $backgroundColor; ?>;!important
|
||||
}
|
||||
|
||||
.btn-group label.active {
|
||||
background-color: <?php echo $primaryColor; ?>!important;
|
||||
border-color:transparent!important;
|
||||
color: <?php echo $textColor; ?>;!important
|
||||
}
|
||||
|
||||
.btn-group {
|
||||
background-color: <?php echo $cardsColor; ?>;!important
|
||||
}
|
||||
|
||||
.btn-group:hover {
|
||||
background-color: <?php echo $cardsColor; ?>;!important
|
||||
}
|
||||
|
||||
.btn.btn-outline-secondary#gen_wpa_passphrase {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
border-top-right-radius: 18px !important;
|
||||
border-bottom-right-radius: 18px !important;
|
||||
}
|
||||
|
||||
a.scroll-to-top.rounded {
|
||||
display: inline;
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
border-radius: 18px!important;
|
||||
}
|
||||
|
||||
a.scroll-to-top.rounded i.fas.fa-angle-up {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.btn.btn-sm.btn-outline-secondary.rounded-right {
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.info-item.col-xs-3 {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
color: <?php echo $textColor; ?>!important;
|
||||
}
|
||||
|
||||
.grid-stack-item-content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 5px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.was-validated .form-control:valid,
|
||||
.was-validated .form-control:invalid {
|
||||
background-position: center right calc(.375em + .4875rem);
|
||||
}
|
||||
|
||||
.was-validated .form-control:invalid {
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%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-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
||||
}
|
||||
|
||||
.was-validated .form-control:valid {
|
||||
background-size: calc(0.6em + 0.375rem) calc(0.6em + 0.375rem);
|
||||
}
|
||||
|
617
app/css/material-light.php
Normal file
617
app/css/material-light.php
Normal file
|
@ -0,0 +1,617 @@
|
|||
<?php header("Content-Type: text/css; charset=utf-8"); ?>
|
||||
<?php
|
||||
require_once '../../includes/functions.php';
|
||||
$color = getColorOpt();
|
||||
?>
|
||||
|
||||
/*
|
||||
Theme Name: Material Light
|
||||
Author: @marek-guran
|
||||
Author URI: https://github.com/marek-guran
|
||||
Description: Inspired by Google's Material You Design
|
||||
License: GNU General Public License v3.0
|
||||
*/
|
||||
|
||||
<?php
|
||||
// Base color
|
||||
$baseColor = $color;
|
||||
$textColor = lightenColor($baseColor, 95);
|
||||
// Create other color variables
|
||||
$cardsColor = lightenColor($baseColor, 50);
|
||||
$secondaryColor = lightenColor($baseColor, 30);
|
||||
$primaryColor = $baseColor;
|
||||
$backgroundColor = lightenColor($baseColor, 60);
|
||||
?>
|
||||
|
||||
@import url('all.css');
|
||||
|
||||
body {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
html * {
|
||||
font-family: Helvetica,Arial,sans-serif;
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.nav-item.active .nav-link {
|
||||
position: relative;
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
|
||||
border-top-right-radius: 18px;
|
||||
border-bottom-right-radius: 18px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 2rem !important;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.3rem;
|
||||
}
|
||||
|
||||
h5.card-title {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.page-header {
|
||||
border-left: .01rem solid <?php echo $secondaryColor; ?>;
|
||||
border-bottom: .01rem solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-item.active .nav-link i {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar .nav-item.active .nav-link {
|
||||
font-weight: 400;
|
||||
color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
#wrapper #content-wrapper #content {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.topbar {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.col {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.card-header .col i.fa-tachometer-alt,
|
||||
.card-header .col i.fa-dot-circle,
|
||||
.card-header .col i.fa-wifi,
|
||||
.card-header .col i.fa-exchange-alt,
|
||||
.card-header .col i.fa-hand-paper,
|
||||
.card-header .col i.fa-network-wired,
|
||||
.card-header .col i.fa-key,
|
||||
.card-header .ra-wireguard,
|
||||
.card-header .ra-wireguard:before,
|
||||
.card-header .col i.fa-user-lock,
|
||||
.card-header .col i.fa-chart-bar,
|
||||
.card-header .col i.fa-cube,
|
||||
.card-header .col i.fa-info-circle,
|
||||
.card-header .col i.fa-globe,
|
||||
.card-header .col i.fa-shield-alt {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
i.fa-bars {
|
||||
color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.nav-tabs {
|
||||
border-bottom: 1px solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
.nav-tabs .nav-link.active,
|
||||
.nav-tabs .nav-link {
|
||||
font-size: 1.0rem;
|
||||
border-top-left-radius: 18px;
|
||||
border-top-right-radius: 18px;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-link:hover {
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-brand:hover {
|
||||
color: #d2d2d2;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-toggle {
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-toggle .icon-bar {
|
||||
background-color: #d2d2d2;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-toggle:focus,
|
||||
.navbar-default .navbar-toggle:hover {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
#content, .navbar, .sidebar, .footer, .sticky-footer {
|
||||
background-attachment: scroll;
|
||||
background-repeat: repeat;
|
||||
background-size: auto;
|
||||
background-position: 0 0;
|
||||
background-origin: padding-box;
|
||||
background-clip: border-box;
|
||||
}
|
||||
|
||||
.sticky-footer {
|
||||
background-position: 30px 0;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
background-position: 0 20px;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-link.active {
|
||||
color: <?php echo $textColor; ?>;
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
a:focus, a:hover {
|
||||
color: #d2d2d2;
|
||||
}
|
||||
|
||||
.card>.card-header, .modal-content, .modal-header {
|
||||
border-color: transparent;
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
color: <?php echo $textColor; ?>;
|
||||
border-radius: 18px;
|
||||
font-size: 1.0rem;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
min-height: 8rem;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
border-bottom-left-radius: 0px!important;
|
||||
border-bottom-right-radius: 0px!important;
|
||||
position: relative;
|
||||
margin-bottom: -18px;
|
||||
}
|
||||
|
||||
.card>.card-header .fa {
|
||||
color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.card-header [class^="fa"] {
|
||||
color: <?php echo $textColor; ?>;
|
||||
font-size: 1.0rem;
|
||||
}
|
||||
|
||||
.card, .card-body {
|
||||
border-color: transparent;
|
||||
border-radius: 18px;
|
||||
background-color: <?php echo $cardsColor; ?>;
|
||||
}
|
||||
|
||||
.card-body {
|
||||
padding-top: 36px; /* 18px to move down + 18px space at the top */
|
||||
padding-bottom: 36px; /* 18px space at the bottom */
|
||||
}
|
||||
|
||||
.unstyled {
|
||||
background-color: <?php echo $cardsColor; ?>;
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-top: .01rem solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar-brand-text {
|
||||
color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.ra-raspap:before {
|
||||
color: #ac1b3d !important;
|
||||
}
|
||||
|
||||
.sidebar-light #sidebarToggle {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border: 1px solid <?php echo $secondaryColor; ?>; !important
|
||||
}
|
||||
|
||||
.sidebar-light #sidebarToggle::after {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-item .nav-link:hover i {
|
||||
color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar-light #sidebarToggle:hover {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar.toggled .nav-item .nav-link span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sidebar.toggled .nav-item .nav-link {
|
||||
text-align: center;
|
||||
padding: .6rem 1rem;
|
||||
width: 6.5rem;
|
||||
}
|
||||
|
||||
.card-footer, .modal-footer {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
color: <?php echo $textColor; ?>;
|
||||
border-top: 0px;
|
||||
border-bottom-right-radius: 18px!important;
|
||||
border-bottom-left-radius: 18px!important;
|
||||
position: relative;
|
||||
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.1),
|
||||
0px 4px 6px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
margin-top: 0px;
|
||||
height: 3.5rem;
|
||||
}
|
||||
|
||||
.card>.card-header::before, .navbar-default::before {
|
||||
content: " ";
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
z-index: 2;
|
||||
background-size: 100% 2px, 3px 100%;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.sidebar-light, .sticky-footer {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.sidebar-light .nav-item .nav-link i {
|
||||
color: <?php echo $textColor; ?>;;
|
||||
}
|
||||
|
||||
.sidebar .nav-item .nav-link {
|
||||
padding: 0.6rem;
|
||||
padding-left: 1.2rem;
|
||||
}
|
||||
|
||||
.sidebar-light hr.sidebar-divider {
|
||||
border-top: 1px solid <?php echo $secondaryColor; ?>;
|
||||
padding-top: 0.5rem;
|
||||
}
|
||||
|
||||
.sidebar .nav-item .nav-link span {
|
||||
font-size: 1.0rem;
|
||||
}
|
||||
|
||||
.sidebar .nav-item .nav-link span:hover {
|
||||
color: <?php echo $primaryColor; ?>!important;
|
||||
}
|
||||
|
||||
.topbar .topbar-divider {
|
||||
border-right: 1px solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.label-warning {
|
||||
background-color: #d2d2d2;
|
||||
}
|
||||
|
||||
span.label.label-warning {
|
||||
color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.table>tbody>tr>td,
|
||||
.table>tbody>tr>th,
|
||||
.table>tfoot>tr>td,
|
||||
.table>tfoot>tr>th,
|
||||
.table>thead>tr>td,
|
||||
.table>thead>tr>th {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border-top: .01rem solid <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
.table{
|
||||
border-radius: 18px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.table>thead>tr>th {
|
||||
vertical-align: bottom;
|
||||
border-bottom: 0 solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
[class*="btn"], [class*="btn"]:focus, [class*="btn"]:disabled {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
border-color: transparent;
|
||||
border-radius: 18px;
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
[class*="btn"]:hover {
|
||||
border-radius: 18px;
|
||||
color: <?php echo $textColor; ?>;
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
[class*="btn"]:hover .disabled {
|
||||
background-color:red;
|
||||
}
|
||||
|
||||
[class*="alert"] {
|
||||
border-radius: 18px;
|
||||
color: <?php echo $textColor; ?>;
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border: 1px solid #404040;
|
||||
}
|
||||
|
||||
.close {
|
||||
font-size: 1.2em;
|
||||
font-weight: 400;
|
||||
text-shadow: none;
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.form-control,
|
||||
.form-control:focus,
|
||||
.custom-select {
|
||||
color: <?php echo $textColor; ?>;
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
border-radius: 18px;
|
||||
}
|
||||
|
||||
.form-control:disabled,
|
||||
.form-control[readonly] {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.form-control::-webkit-input-placeholder { color: #d2d2d2; }
|
||||
.form-control:-moz-placeholder { color: #d2d2d2; }
|
||||
.form-control::-moz-placeholder { color: #d2d2d2; }
|
||||
.form-control:-ms-input-placeholder { color: #d2d2d2; }
|
||||
.form-control::-ms-input-placeholder { color: #d2d2d2; }
|
||||
|
||||
.form-control option {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.form-control::placeholder {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
input[type="text"]{
|
||||
color: <?php echo $textColor; ?>; !important
|
||||
}
|
||||
|
||||
.progress {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border-radius: 18px;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
color: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
#progressBar {
|
||||
background-color: <?php echo $secondaryColor; ?>!important;
|
||||
}
|
||||
|
||||
.progress-bar.bg-success {
|
||||
background-color: <?php echo $primaryColor; ?>!important;
|
||||
color: <?php echo $textColor; ?>!important;
|
||||
}
|
||||
|
||||
.progress .progress-bar {
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.progress-bar.progress-bar-info.progress-bar-striped.active {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.figure-img {
|
||||
filter: opacity(0.7);
|
||||
}
|
||||
|
||||
.ra-wireguard:before {
|
||||
color: <?php echo $textColor; ?>!important;
|
||||
}
|
||||
|
||||
.ra-wireguard:hover:before {
|
||||
color: <?php echo $primaryColor; ?>!important;
|
||||
}
|
||||
|
||||
.sidebar .nav-item.active .nav-link span.ra-wireguard:before {
|
||||
color: <?php echo $textColor; ?>!important;
|
||||
}
|
||||
|
||||
.custom-control-input:checked ~ .custom-control-label::before {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.custom-control-input:checked ~ .custom-control-label::before {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border-color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.wg-keygen {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border: 1px solid yellow <?php echo $secondaryColor; ?>;
|
||||
border-top-right-radius: 18px !important;
|
||||
border-bottom-right-radius: 18px !important;
|
||||
}
|
||||
|
||||
.btn.btn-outline-secondary.js-add-dhcp-upstream-server {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
border-top-right-radius: 18px !important;
|
||||
border-bottom-right-radius: 18px !important;
|
||||
}
|
||||
|
||||
.btn.btn-outline-success.js-add-dhcp-static-lease {
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.btn.btn-outline-success.js-add-dhcp-static-lease:hover {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.fas.fa-circle {
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border: <?php echo $backgroundColor; ?>;
|
||||
}
|
||||
|
||||
button.btn.btn-light.js-toggle-password {
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
border-color: transparent;
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.btn.service-status {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
input.btn.btn-success {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
input.btn.btn-success:hover {
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.signal-icon .signal-bar {
|
||||
background: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
.figure-img {
|
||||
border-radius: 18px;
|
||||
}
|
||||
|
||||
.logoutput {
|
||||
border-radius: 18px!important;
|
||||
background-color: <?php echo $backgroundColor; ?>;
|
||||
border: 1px solid <?php echo $primaryColor; ?>!important;
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.btn-sm {
|
||||
border-top-right-radius: 18px!important;
|
||||
border-bottom-right-radius: 18px!important;
|
||||
}
|
||||
|
||||
.signal-icon .signal-bar {
|
||||
background: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
input.btn.btn-warning {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
input.btn.btn-warning:hover {
|
||||
background-color: <?php echo $backgroundColor; ?>;!important
|
||||
}
|
||||
|
||||
button.btn.btn-danger {
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
}
|
||||
|
||||
button.btn.btn-danger:hover {
|
||||
background-color: <?php echo $backgroundColor; ?>;!important
|
||||
}
|
||||
|
||||
.btn-group label.active {
|
||||
background-color: <?php echo $primaryColor; ?>!important;
|
||||
border-color:transparent!important;
|
||||
color: <?php echo $textColor; ?>;!important
|
||||
}
|
||||
|
||||
.btn-group {
|
||||
background-color: <?php echo $cardsColor; ?>;!important
|
||||
}
|
||||
|
||||
.btn-group:hover {
|
||||
background-color: <?php echo $cardsColor; ?>;!important
|
||||
}
|
||||
|
||||
.btn.btn-outline-secondary#gen_wpa_passphrase {
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
border-top-right-radius: 18px !important;
|
||||
border-bottom-right-radius: 18px !important;
|
||||
}
|
||||
|
||||
a.scroll-to-top.rounded {
|
||||
display: inline;
|
||||
background-color: <?php echo $secondaryColor; ?>;
|
||||
border-radius: 18px!important;
|
||||
}
|
||||
|
||||
a.scroll-to-top.rounded i.fas.fa-angle-up {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.btn.btn-sm.btn-outline-secondary.rounded-right {
|
||||
border: 1px solid <?php echo $secondaryColor; ?>;
|
||||
background-color: <?php echo $primaryColor; ?>;
|
||||
}
|
||||
|
||||
.info-item.col-xs-3 {
|
||||
color: <?php echo $textColor; ?>;
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
color: <?php echo $textColor; ?>!important;
|
||||
}
|
||||
|
||||
.grid-stack-item-content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 5px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.was-validated .form-control:valid,
|
||||
.was-validated .form-control:invalid {
|
||||
background-position: center right calc(.375em + .4875rem);
|
||||
}
|
||||
|
||||
.was-validated .form-control:invalid {
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%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-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
||||
}
|
||||
|
||||
.was-validated .form-control:valid {
|
||||
background-size: calc(0.6em + 0.375rem) calc(0.6em + 0.375rem);
|
||||
}
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 227 596" style="enable-background:new 0 0 227 596;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:none;stroke:#999999;stroke-width:3;}
|
||||
.st1{fill:none;stroke:#999999;stroke-width:3;stroke-dasharray:6.0204,3.0102;}
|
||||
.st2{fill:none;stroke:#999999;stroke-width:3;stroke-dasharray:5.7963,2.8981;}
|
||||
</style>
|
||||
<g id="dashed">
|
||||
<g id="Line_1">
|
||||
<g>
|
||||
<line class="st0" x1="112.8" y1="0" x2="112.8" y2="3"/>
|
||||
<line class="st1" x1="112.8" y1="6" x2="112.8" y2="591.5"/>
|
||||
<line class="st0" x1="112.8" y1="593" x2="112.8" y2="596"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Line_2">
|
||||
<g>
|
||||
<line class="st0" x1="113.2" y1="0.8" x2="110.2" y2="0.8"/>
|
||||
<line class="st2" x1="107.3" y1="0.8" x2="4.4" y2="0.8"/>
|
||||
<line class="st0" x1="3" y1="0.8" x2="0" y2="0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Line_3">
|
||||
<g>
|
||||
<line class="st0" x1="113.2" y1="198.9" x2="110.2" y2="198.9"/>
|
||||
<line class="st2" x1="107.3" y1="198.9" x2="4.4" y2="198.9"/>
|
||||
<line class="st0" x1="3" y1="198.9" x2="0" y2="198.9"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Line_4">
|
||||
<g>
|
||||
<line class="st0" x1="113.2" y1="397.1" x2="110.2" y2="397.1"/>
|
||||
<line class="st2" x1="107.3" y1="397.1" x2="4.4" y2="397.1"/>
|
||||
<line class="st0" x1="3" y1="397.1" x2="0" y2="397.1"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Line_5">
|
||||
<g>
|
||||
<line class="st0" x1="113.2" y1="595.2" x2="110.2" y2="595.2"/>
|
||||
<line class="st2" x1="107.3" y1="595.2" x2="4.4" y2="595.2"/>
|
||||
<line class="st0" x1="3" y1="595.2" x2="0" y2="595.2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Line_6">
|
||||
<g>
|
||||
<line class="st0" x1="226.2" y1="297.8" x2="223.2" y2="297.8"/>
|
||||
<line class="st2" x1="220.3" y1="297.8" x2="117.4" y2="297.8"/>
|
||||
<line class="st0" x1="116" y1="297.8" x2="113" y2="297.8"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.9 KiB |
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
0
app/img/raspAP-logo.php
Executable file → Normal file
0
app/img/raspAP-logo.php
Executable file → Normal file
|
@ -1,40 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 314 594" style="enable-background:new 0 0 314 594;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:none;stroke:#999999;stroke-width:3;}
|
||||
.st1{fill:none;stroke:#999999;stroke-width:3;stroke-dasharray:6.04,3.02;}
|
||||
.st2{fill:none;stroke:#999999;stroke-width:3;stroke-dasharray:5.7963,2.8981;}
|
||||
</style>
|
||||
<g id="dashed">
|
||||
<g id="horizontal">
|
||||
<g>
|
||||
<line class="st0" x1="113.2" y1="144" x2="113.2" y2="147"/>
|
||||
<line class="st1" x1="113.2" y1="150" x2="113.3" y2="447.5"/>
|
||||
<line class="st0" x1="113.3" y1="449" x2="113.3" y2="452"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="top">
|
||||
<g>
|
||||
<line class="st0" x1="114" y1="144.8" x2="117" y2="144.8"/>
|
||||
<line class="st2" x1="119.9" y1="144.8" x2="222.8" y2="144.8"/>
|
||||
<line class="st0" x1="224.2" y1="144.8" x2="227.2" y2="144.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="out">
|
||||
<g>
|
||||
<line class="st0" x1="0" y1="297.8" x2="3" y2="297.8"/>
|
||||
<line class="st2" x1="5.9" y1="297.8" x2="108.8" y2="297.8"/>
|
||||
<line class="st0" x1="110.2" y1="297.8" x2="113.2" y2="297.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="bottom">
|
||||
<g>
|
||||
<line class="st0" x1="113" y1="450.8" x2="116" y2="450.8"/>
|
||||
<line class="st2" x1="118.9" y1="450.8" x2="221.8" y2="450.8"/>
|
||||
<line class="st0" x1="223.2" y1="450.8" x2="226.2" y2="450.8"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.5 KiB |
|
@ -1,46 +0,0 @@
|
|||
<?php
|
||||
header("Content-Type: image/svg+xml");
|
||||
$showDevice1 = isset($_GET['device-1']);
|
||||
$showOut = isset($_GET['out']);
|
||||
$showDevice2 = isset($_GET['device-2']);
|
||||
?>
|
||||
|
||||
<svg width="313" height="594" viewBox="0 0 313 594" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="Frame 1">
|
||||
<g id="right connection frame">
|
||||
<g id="solid">
|
||||
<?php if ($showDevice2): ?>
|
||||
<line id="joint-device-2" y1="-0.75" x2="154" y2="-0.75"
|
||||
transform="matrix(4.37114e-08 1 1 -4.37114e-08 114 297)"
|
||||
stroke="#008281" stroke-width="4"/>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($showDevice1): ?>
|
||||
<line id="joint-device-1" style="display: inline;"
|
||||
y1="-0.75" x2="154" y2="-0.75"
|
||||
transform="matrix(4.37114e-08 1 1 -4.37114e-08 114 144)"
|
||||
stroke="#008281" stroke-width="4"/>
|
||||
|
||||
<line id="device-1" style="display: inline;"
|
||||
y1="-0.75" x2="113.231" y2="-0.75"
|
||||
transform="matrix(1 8.74228e-08 8.74228e-08 -1 114 144)"
|
||||
stroke="#008281" stroke-width="4"/>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($showOut): ?>
|
||||
<line id="out" style="display: inline;"
|
||||
y1="-0.75" x2="113.231" y2="-0.75"
|
||||
transform="matrix(1 8.74228e-08 8.74228e-08 -1 -0.000305176 297)"
|
||||
stroke="#008281" stroke-width="4"/>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($showDevice2): ?>
|
||||
<line id="device-2" style="display: inline;"
|
||||
y1="-0.75" x2="113.231" y2="-0.75"
|
||||
transform="matrix(1 8.74228e-08 8.74228e-08 -1 113 450)"
|
||||
stroke="#008281" stroke-width="4"/>
|
||||
<?php endif; ?>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
|
@ -1,65 +0,0 @@
|
|||
<?php
|
||||
header("Content-Type: image/svg+xml");
|
||||
|
||||
require_once '../../includes/functions.php';
|
||||
$color = getColorOpt();
|
||||
|
||||
$showJoint = isset($_GET['joint']);
|
||||
$showDevice1 = isset($_GET['device-1']);
|
||||
$showOut = isset($_GET['out']);
|
||||
$showDevice2 = isset($_GET['device-2']);
|
||||
$showDevice3 = isset($_GET['device-3']);
|
||||
$showDevice4 = isset($_GET['device-4']);
|
||||
?>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="227" height="596" viewBox="0 0 227 596" fill="none">
|
||||
<?php
|
||||
// Device positions array (y-coordinates)
|
||||
$devicePositions = [
|
||||
'device-1' => 0.75,
|
||||
'out' => 297.75,
|
||||
'device-2' => 198.75,
|
||||
'device-3' => 397.058,
|
||||
'device-4' => 595.211
|
||||
];
|
||||
|
||||
// Calculate joint line segments
|
||||
if ($showJoint) {
|
||||
$activeDevices = array_filter([$showDevice1, $showDevice2, $showDevice3, $showDevice4]);
|
||||
$activeYs = [];
|
||||
|
||||
foreach ($devicePositions as $device => $y) {
|
||||
if (isset($_GET[$device])) {
|
||||
$activeYs[] = $y;
|
||||
}
|
||||
}
|
||||
|
||||
// Add top/bottom if first/last device is connected
|
||||
if ($showDevice1) array_unshift($activeYs, 0);
|
||||
if ($showDevice4) $activeYs[] = 596;
|
||||
|
||||
// Draw segments between consecutive points
|
||||
for ($i = 1; $i < count($activeYs); $i++) {
|
||||
$y1 = $activeYs[$i-1];
|
||||
$y2 = $activeYs[$i];
|
||||
echo "<line x1='112.75' y1='$y1' x2='112.75' y2='$y2' stroke='$color' stroke-width='4'/>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
<?php if ($showDevice1): ?>
|
||||
<line x1="113.231" y1="0.75" x2="7.69496e-06" y2="0.75001" stroke="<?php echo $color; ?>" stroke-width="6" id="device-1"/>
|
||||
<?php endif; ?>
|
||||
<?php if ($showOut): ?>
|
||||
<line x1="226.231" y1="297.75" x2="113" y2="297.75" stroke="<?php echo $color; ?>" stroke-width="4" id="out"/>
|
||||
<?php endif; ?>
|
||||
<?php if ($showDevice2): ?>
|
||||
<line x1="113.231" y1="198.75" x2="7.69496e-06" y2="198.75" stroke="<?php echo $color; ?>" stroke-width="4" id="device-2"/>
|
||||
<?php endif; ?>
|
||||
<?php if ($showDevice3): ?>
|
||||
<line x1="113.231" y1="397.058" x2="7.69496e-06" y2="397.058" stroke="<?php echo $color; ?>" stroke-width="4" id="device-3"/>
|
||||
<?php endif; ?>
|
||||
<?php if ($showDevice4): ?>
|
||||
<line x1="113.231" y1="595.211" x2="7.69496e-06" y2="595.211" stroke="<?php echo $color; ?>" stroke-width="4" id="device-4"/>
|
||||
<?php endif; ?>
|
||||
</svg>
|
|
@ -1,29 +0,0 @@
|
|||
<?php
|
||||
|
||||
if (!isset($_GET['uri']) || !filter_var($_GET['uri'], FILTER_VALIDATE_URL)) {
|
||||
header("HTTP/1.1 400 Bad Request");
|
||||
exit("Invalid or missing URI parameter");
|
||||
}
|
||||
|
||||
$uri = $_GET['uri'];
|
||||
$command = "qrencode -t svg -m 0 -o - " . escapeshellarg($uri);
|
||||
|
||||
$svg = shell_exec($command);
|
||||
if ($svg === null) {
|
||||
error_log("QR generation failed for URI: $uri");
|
||||
header("HTTP/1.1 500 Internal Server Error");
|
||||
exit("Failed to generate QR code");
|
||||
}
|
||||
|
||||
$etag = hash('sha256', $uri);
|
||||
$content_length = strlen($svg);
|
||||
$last_modified = gmdate("D, d M Y H:i:s") . " GMT";
|
||||
|
||||
header("Content-Type: image/svg+xml");
|
||||
header("Content-Length: $content_length");
|
||||
header("Last-Modified: $last_modified");
|
||||
header("ETag: \"$etag\"");
|
||||
header("X-QR-Code-Content: " . htmlspecialchars($uri, ENT_QUOTES, 'UTF-8'));
|
||||
|
||||
echo $svg;
|
||||
|
3
app/img/wg-qr-code.php
Executable file → Normal file
3
app/img/wg-qr-code.php
Executable file → Normal file
|
@ -13,7 +13,6 @@ if (!isset($_SERVER['HTTP_REFERER'])) {
|
|||
exec("sudo cat " .RASPI_WIREGUARD_PATH.'client.conf', $return);
|
||||
$peer_conf = implode(PHP_EOL,$return);
|
||||
$peer_conf.= PHP_EOL;
|
||||
$peer_conf_sanitized = str_replace(["\r", "\n"], '', $peer_conf);
|
||||
$command = "qrencode -t svg -m 0 -o - " . mb_escapeshellarg($peer_conf);
|
||||
$svg = shell_exec($command);
|
||||
$etag = hash('sha256', $peer_conf);
|
||||
|
@ -24,6 +23,6 @@ header("Content-Type: image/svg+xml");
|
|||
header("Content-Length: $content_length");
|
||||
header("Last-Modified: $last_modified");
|
||||
header("ETag: \"$etag\"");
|
||||
header("X-QR-Code-Content: $peer_conf_sanitized");
|
||||
header("X-QR-Code-Content: $peer_conf");
|
||||
echo shell_exec($command);
|
||||
|
||||
|
|
8
app/img/wifi-qr-code.php
Executable file → Normal file
8
app/img/wifi-qr-code.php
Executable file → Normal file
|
@ -12,12 +12,12 @@ if (!isset($_SERVER['HTTP_REFERER'])) {
|
|||
|
||||
$hostapd = parse_ini_file(RASPI_HOSTAPD_CONFIG, false, INI_SCANNER_RAW);
|
||||
|
||||
// assume WPA encryption and get the passphrase
|
||||
// assume wpa encryption and get the passphrase
|
||||
$type = "WPA";
|
||||
$password = isset($hostapd['wpa_psk']) ? $hostapd['wpa_psk'] : $hostapd['wpa_passphrase'];
|
||||
|
||||
// use WEP if configured
|
||||
$wep_default_key = intval($hostapd['wep_default_key'] ?? 0);
|
||||
// use wep if configured
|
||||
$wep_default_key = intval($hostapd['wep_default_key']);
|
||||
$wep_key = 'wep_key' . $wep_default_key;
|
||||
if (array_key_exists($wep_key, $hostapd)) {
|
||||
$type = "WEP";
|
||||
|
@ -30,7 +30,7 @@ if (empty($password)) {
|
|||
}
|
||||
|
||||
$ssid = $hostapd['ssid'];
|
||||
$hidden = intval($hostapd['ignore_broadcast_ssid'] ?? 0) !== 0 ? "H:true" : "";
|
||||
$hidden = intval($hostapd['ignore_broadcast_ssid']) != 0 ? "H:true" : "";
|
||||
|
||||
$ssid = qr_encode($ssid);
|
||||
$password = qr_encode($password);
|
||||
|
|
362
app/js/custom.js
362
app/js/custom.js
|
@ -3,7 +3,7 @@ function msgShow(retcode,msg) {
|
|||
} else if(retcode == 2 || retcode == 1) {
|
||||
var alertType = 'danger';
|
||||
}
|
||||
var htmlMsg = '<div class="alert alert-'+alertType+' alert-dismissible" role="alert"><button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>'+msg+'</div>';
|
||||
var htmlMsg = '<div class="alert alert-'+alertType+' alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+msg+'</div>';
|
||||
return htmlMsg;
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,7 @@ function loadSummary(strInterface) {
|
|||
if(jsonData['return'] == 0) {
|
||||
$('#'+strInterface+'-summary').html(jsonData['output'].join('<br />'));
|
||||
} else if(jsonData['return'] == 2) {
|
||||
$('#'+strInterface+'-summary').append('<div class="alert alert-danger alert-dismissible" role="alert"><button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>'+jsonData['output'].join('<br />')+'</div>');
|
||||
$('#'+strInterface+'-summary').append('<div class="alert alert-danger alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+jsonData['output'].join('<br />')+'</div>');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ function getAllInterfaces() {
|
|||
}
|
||||
|
||||
function setupTabs() {
|
||||
$('a[data-bs-toggle="tab"]').on('shown.bs.tab',function(e){
|
||||
$('a[data-toggle="tab"]').on('shown.bs.tab',function(e){
|
||||
var target = $(e.target).attr('href');
|
||||
if(!target.match('summary')) {
|
||||
var int = target.replace("#","");
|
||||
|
@ -153,7 +153,7 @@ $(document).on("click", "#js-clearopenvpn-log", function(e) {
|
|||
|
||||
// Enable Bootstrap tooltips
|
||||
$(function () {
|
||||
$('[data-bs-toggle="tooltip"]').tooltip()
|
||||
$('[data-toggle="tooltip"]').tooltip()
|
||||
})
|
||||
|
||||
function genPassword(pwdLen) {
|
||||
|
@ -242,13 +242,16 @@ function loadInterfaceDHCPSelect() {
|
|||
$('#txtmetric').val(jsonData.Metric);
|
||||
|
||||
if (jsonData.StaticIP !== null && jsonData.StaticIP !== '' && !jsonData.FallbackEnabled) {
|
||||
$('#chkstatic').prop('checked', true).closest('.btn').addClass('active');
|
||||
$('#chkdhcp').prop('checked', false).closest('.btn').removeClass('active');
|
||||
$('#chkstatic').closest('.btn').button('toggle');
|
||||
$('#chkstatic').closest('.btn').button('toggle').blur();
|
||||
$('#chkstatic').blur();
|
||||
$('#chkfallback').prop('disabled', true);
|
||||
$('#dhcp-iface').removeAttr('disabled');
|
||||
} else {
|
||||
$('#chkdhcp').closest('.btn').addClass('active');
|
||||
$('#chkdhcp').closest('.btn').button.blur();
|
||||
$('#chkdhcp').closest('.btn').button('toggle');
|
||||
$('#chkdhcp').closest('.btn').button('toggle').blur();
|
||||
$('#chkdhcp').blur();
|
||||
$('#chkfallback').prop('disabled', false);
|
||||
}
|
||||
if (jsonData.FallbackEnabled || $('#chkdhcp').is(':checked')) {
|
||||
$('#dhcp-iface').prop('disabled', true);
|
||||
|
@ -269,14 +272,6 @@ function setDHCPToggles(state) {
|
|||
$('#dhcp-iface').prop('disabled', !state);
|
||||
}
|
||||
|
||||
$('#chkfallback').change(function() {
|
||||
if ($('#chkfallback').is(':checked')) {
|
||||
setStaticFieldsEnabled();
|
||||
} else {
|
||||
setStaticFieldsDisabled();
|
||||
}
|
||||
});
|
||||
|
||||
$('#debugModal').on('shown.bs.modal', function (e) {
|
||||
var csrfToken = $('meta[name=csrf_token]').attr('content');
|
||||
$.post('ajax/system/sys_debug.php',{'csrf_token': csrfToken},function(data){
|
||||
|
@ -296,7 +291,7 @@ $('#chkupdateModal').on('shown.bs.modal', function (e) {
|
|||
var msgLatest = $('#msgLatest').data('message');
|
||||
var msgInstall = $('#msgInstall').data('message');
|
||||
var msgDismiss = $('#js-check-dismiss').data('message');
|
||||
var faCheck = '<i class="fas fa-check ms-2"></i><br />';
|
||||
var faCheck = '<i class="fas fa-check ml-2"></i><br />';
|
||||
$("#updateSync").removeClass("fa-spin");
|
||||
if (update === true) {
|
||||
msg = msgUpdate +' '+tag;
|
||||
|
@ -332,42 +327,47 @@ $('#performupdateModal').on('shown.bs.modal', function (e) {
|
|||
});
|
||||
|
||||
function fetchUpdateResponse() {
|
||||
const xhr = new XMLHttpRequest();
|
||||
const complete = 6;
|
||||
const error = 7;
|
||||
let phpFile = 'ajax/system/sys_read_logfile.php';
|
||||
|
||||
$.ajax({
|
||||
url: phpFile,
|
||||
type: 'GET',
|
||||
success: function(response) {
|
||||
success: function(response) {
|
||||
let endPolling = false;
|
||||
for (let i = 1; i <= 6; i++) {
|
||||
let divId = '#updateStep' + i;
|
||||
if (response.includes(i.toString())) {
|
||||
$(divId).removeClass('invisible');
|
||||
}
|
||||
if (response.includes(complete)) {
|
||||
var successMsg = $('#successMsg').data('message');
|
||||
$('#updateMsg').after('<span class="small">' + successMsg + '</span>');
|
||||
$('#updateMsg').addClass('fa-check');
|
||||
$('#updateMsg').removeClass('invisible');
|
||||
$('#updateStep6').removeClass('invisible');
|
||||
$('#updateSync2').removeClass("fa-spin");
|
||||
$('#updateOk').removeAttr('disabled');
|
||||
endPolling = true;
|
||||
break;
|
||||
} else if (response.includes(error)) {
|
||||
var errorMsg = $('#errorMsg').data('message');
|
||||
$('#updateMsg').after('<span class="small">' + errorMsg + '</span>');
|
||||
$('#updateMsg').addClass('fa-times');
|
||||
$('#updateMsg').removeClass('invisible');
|
||||
$('#updateSync2').removeClass("fa-spin");
|
||||
$('#updateOk').removeAttr('disabled');
|
||||
endPolling = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// check if the update is complete or if there's an error
|
||||
if (response.includes(complete)) {
|
||||
var successMsg = $('#successMsg').data('message');
|
||||
$('#updateMsg').after('<span class="small">' + successMsg + '</span>');
|
||||
$('#updateMsg').addClass('fa-check');
|
||||
$('#updateMsg').removeClass('invisible');
|
||||
$('#updateStep6').removeClass('invisible');
|
||||
$('#updateSync2').removeClass("fa-spin");
|
||||
$('#updateOk').removeAttr('disabled');
|
||||
} else if (response.includes(error)) {
|
||||
var errorMsg = $('#errorMsg').data('message');
|
||||
$('#updateMsg').after('<span class="small">' + errorMsg + '</span>');
|
||||
$('#updateMsg').addClass('fa-times');
|
||||
$('#updateMsg').removeClass('invisible');
|
||||
$('#updateSync2').removeClass("fa-spin");
|
||||
$('#updateOk').removeAttr('disabled');
|
||||
} else {
|
||||
if (!endPolling) {
|
||||
setTimeout(fetchUpdateResponse, 500);
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.error("AJAX Error:", error);
|
||||
console.error(error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -438,7 +438,7 @@ $('#js-system-reset-confirm').on('click', function (e) {
|
|||
var successHtml = $('#system-reset-message').attr('data-message');
|
||||
var closeHtml = $('#js-system-reset-cancel').attr('data-message');
|
||||
var csrfToken = $('meta[name=csrf_token]').attr('content');
|
||||
var progressHtml = $('<div>').text(progressText).html() + '<i class="fas fa-cog fa-spin ms-2"></i>';
|
||||
var progressHtml = $('<div>').text(progressText).html() + '<i class="fas fa-cog fa-spin ml-2"></i>';
|
||||
$('#system-reset-message').html(progressHtml);
|
||||
$.post('ajax/networking/do_sys_reset.php?',{'csrf_token':csrfToken},function(data){
|
||||
setTimeout(function(){
|
||||
|
@ -463,139 +463,6 @@ $('#js-sys-reboot, #js-sys-shutdown').on('click', function (e) {
|
|||
});
|
||||
});
|
||||
|
||||
$('#install-user-plugin').on('shown.bs.modal', function (e) {
|
||||
var button = $(e.relatedTarget);
|
||||
$(this).data('button', button);
|
||||
var manifestData = button.data('plugin-manifest');
|
||||
var installed = button.data('plugin-installed') || false;
|
||||
var repoPublic = button.data('repo-public') || false;
|
||||
var installPath = manifestData.install_path;
|
||||
|
||||
if (!installed && repoPublic && installPath === 'plugins-available') {
|
||||
insidersHTML = 'Available with <i class="fas fa-heart heart me-1"></i><a href="https://docs.raspap.com/insiders" target="_blank" rel="noopener">Insiders</a>';
|
||||
$('#plugin-additional').html(insidersHTML);
|
||||
} else {
|
||||
$('#plugin-additional').empty();
|
||||
}
|
||||
if (manifestData) {
|
||||
$('#plugin-docs').html(manifestData.plugin_docs
|
||||
? `<a href="${manifestData.plugin_docs}" target="_blank">${manifestData.plugin_docs}</a>`
|
||||
: 'Unknown');
|
||||
$('#plugin-icon').attr('class', `${manifestData.icon || 'fas fa-plug'} link-secondary h5 me-2`);
|
||||
$('#plugin-name').text(manifestData.name || 'Unknown');
|
||||
$('#plugin-version').text(manifestData.version || 'Unknown');
|
||||
$('#plugin-description').text(manifestData.description || 'No description provided');
|
||||
$('#plugin-author').html(manifestData.author
|
||||
? manifestData.author + (manifestData.author_uri
|
||||
? ` (<a href="${manifestData.author_uri}" target="_blank">profile</a>)` : '') : 'Unknown');
|
||||
$('#plugin-license').text(manifestData.license || 'Unknown');
|
||||
$('#plugin-locale').text(manifestData.default_locale || 'Unknown');
|
||||
$('#plugin-configuration').html(formatProperty(manifestData.configuration || 'None'));
|
||||
$('#plugin-packages').html(formatProperty(manifestData.keys || 'None'));
|
||||
$('#plugin-dependencies').html(formatProperty(manifestData.dependencies || 'None'));
|
||||
$('#plugin-javascript').html(formatProperty(manifestData.javascript || 'None'));
|
||||
$('#plugin-sudoers').html(formatProperty(manifestData.sudoers || 'None'));
|
||||
$('#plugin-user-name').html((manifestData.user_nonprivileged && manifestData.user_nonprivileged.name) || 'None');
|
||||
}
|
||||
if (installed) {
|
||||
$('#js-install-plugin-confirm').html('OK');
|
||||
} else if (!installed && repoPublic && installPath == 'plugins-available') {
|
||||
$('#js-install-plugin-confirm').html('Get Insiders');
|
||||
} else {
|
||||
$('#js-install-plugin-confirm').html('Install now');
|
||||
}
|
||||
});
|
||||
|
||||
$('#js-install-plugin-confirm').on('click', function (e) {
|
||||
var button = $('#install-user-plugin').data('button');
|
||||
var manifestData = button.data('plugin-manifest');
|
||||
var installPath = manifestData.install_path;
|
||||
var pluginUri = manifestData.plugin_uri;
|
||||
var pluginVersion = manifestData.version;
|
||||
var pluginConfirm = $('#js-install-plugin-confirm').text();
|
||||
var progressText = $('#js-install-plugin-confirm').attr('data-message');
|
||||
var successHtml = $('#plugin-install-message').attr('data-message');
|
||||
var successText = $('<div>').text(successHtml).text();
|
||||
var csrfToken = $('meta[name=csrf_token]').attr('content');
|
||||
|
||||
if (pluginConfirm === 'Install now') {
|
||||
$("#install-user-plugin").modal('hide');
|
||||
$("#install-plugin-progress").modal('show');
|
||||
$.post(
|
||||
'ajax/plugins/do_plugin_install.php',
|
||||
{
|
||||
'plugin_uri': pluginUri,
|
||||
'plugin_version': pluginVersion,
|
||||
'install_path': installPath,
|
||||
'csrf_token': csrfToken
|
||||
},
|
||||
function (data) {
|
||||
setTimeout(function () {
|
||||
response = JSON.parse(data);
|
||||
if (response === true) {
|
||||
$('#plugin-install-message').contents().first().text(successText);
|
||||
$('#plugin-install-message')
|
||||
.find('i')
|
||||
.removeClass('fas fa-cog fa-spin link-secondary')
|
||||
.addClass('fas fa-check');
|
||||
$('#js-install-plugin-ok').removeAttr("disabled");
|
||||
} else {
|
||||
const errorMessage = jsonData.error || 'An unknown error occurred.';
|
||||
var errorLog = '<textarea class="plugin-log text-secondary" readonly>' + errorMessage + '</textarea>';
|
||||
$('#plugin-install-message')
|
||||
.contents()
|
||||
.first()
|
||||
.replaceWith('An error occurred installing the plugin:');
|
||||
$('#plugin-install-message').append(errorLog);
|
||||
$('#plugin-install-message').find('i').removeClass('fas fa-cog fa-spin link-secondary');
|
||||
$('#js-install-plugin-ok').removeAttr("disabled");
|
||||
}
|
||||
}, 200);
|
||||
}
|
||||
).fail(function (xhr) {
|
||||
const jsonData = JSON.parse(xhr.responseText);
|
||||
const errorMessage = jsonData.error || 'An unknown error occurred.';
|
||||
$('#plugin-install-message')
|
||||
.contents()
|
||||
.first()
|
||||
.replaceWith('An error occurred installing the plugin:');
|
||||
var errorLog = '<textarea class="plugin-log text-secondary" readonly>' + errorMessage + '</textarea>';
|
||||
$('#plugin-install-message').append(errorLog);
|
||||
$('#plugin-install-message').find('i').removeClass('fas fa-cog fa-spin link-secondary');
|
||||
$('#js-install-plugin-ok').removeAttr("disabled");
|
||||
});
|
||||
} else if (pluginConfirm === 'Get Insiders') {
|
||||
window.open('https://docs.raspap.com/insiders/', '_blank');
|
||||
return;
|
||||
} else if (pluginConfirm === 'OK') {
|
||||
$("#install-user-plugin").modal('hide');
|
||||
}
|
||||
});
|
||||
|
||||
$('#js-install-plugin-ok').on('click', function (e) {
|
||||
$("#install-plugin-progress").modal('hide');
|
||||
window.location.reload();
|
||||
});
|
||||
|
||||
function formatProperty(prop) {
|
||||
if (Array.isArray(prop)) {
|
||||
if (typeof prop[0] === 'object') {
|
||||
return prop.map(item => {
|
||||
return Object.entries(item)
|
||||
.map(([key, value]) => `${key}: ${value}`)
|
||||
.join('<br/>');
|
||||
}).join('<br/><br/>');
|
||||
}
|
||||
return prop.map(line => `${line}<br/>`).join('');
|
||||
}
|
||||
if (typeof prop === 'object') {
|
||||
return Object.entries(prop)
|
||||
.map(([key, value]) => `${key}: ${value}`)
|
||||
.join('<br/>');
|
||||
}
|
||||
return prop || 'None';
|
||||
}
|
||||
|
||||
$(document).ready(function(){
|
||||
$("#PanelManual").hide();
|
||||
$('.ip_address').mask('0ZZ.0ZZ.0ZZ.0ZZ', {
|
||||
|
@ -616,15 +483,6 @@ $(document).ready(function(){
|
|||
});
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
$('.cidr').mask('099.099.099.099/099', {
|
||||
translation: {
|
||||
'0': { pattern: /[0-9]/ }
|
||||
},
|
||||
placeholder: "___.___.___.___/___"
|
||||
});
|
||||
});
|
||||
|
||||
$('#wg-upload,#wg-manual').on('click', function (e) {
|
||||
if (this.id == 'wg-upload') {
|
||||
$('#PanelManual').hide();
|
||||
|
@ -635,6 +493,7 @@ $('#wg-upload,#wg-manual').on('click', function (e) {
|
|||
}
|
||||
});
|
||||
|
||||
// Add the following code if you want the name of the file appear on select
|
||||
$(".custom-file-input").on("change", function() {
|
||||
var fileName = $(this).val().split("\\").pop();
|
||||
$(this).siblings(".custom-file-label").addClass("selected").html(fileName);
|
||||
|
@ -750,18 +609,18 @@ function clearBlocklistStatus() {
|
|||
$('#cbxblocklist-status').removeClass('check-updated').addClass('check-hidden');
|
||||
}
|
||||
|
||||
// Handler for the WireGuard generate key button
|
||||
// Handler for the wireguard generate key button
|
||||
$('.wg-keygen').click(function(){
|
||||
var parentGroup = $(this).closest('.input-group');
|
||||
var entity_pub = parentGroup.find('input[type="text"]');
|
||||
var entity_pub = $(this).parent('div').prev('input[type="text"]');
|
||||
var entity_priv = $(this).parent('div').next('input[type="hidden"]');
|
||||
var updated = entity_pub.attr('name')+"-pubkey-status";
|
||||
var csrfToken = $('meta[name="csrf_token"]').attr('content');
|
||||
var csrfToken = $('meta[name=csrf_token]').attr('content');
|
||||
$.post('ajax/networking/get_wgkey.php',{'entity':entity_pub.attr('name'), 'csrf_token': csrfToken},function(data){
|
||||
var jsonData = JSON.parse(data);
|
||||
entity_pub.val(jsonData.pubkey);
|
||||
$('#' + updated).removeClass('check-hidden').addClass('check-updated').delay(500).animate({ opacity: 1 }, 700);
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
// Handler for wireguard client.conf download
|
||||
$('.wg-client-dl').click(function(){
|
||||
|
@ -798,44 +657,6 @@ window.addEventListener('load', function() {
|
|||
});
|
||||
}, false);
|
||||
|
||||
let sessionCheckInterval = setInterval(checkSession, 5000);
|
||||
|
||||
function checkSession() {
|
||||
// skip session check if on login page
|
||||
if (window.location.pathname === '/login') {
|
||||
return;
|
||||
}
|
||||
var csrfToken = $('meta[name=csrf_token]').attr('content');
|
||||
$.post('ajax/session/do_check_session.php',{'csrf_token': csrfToken},function (data) {
|
||||
if (data.status === 'session_expired') {
|
||||
clearInterval(sessionCheckInterval);
|
||||
showSessionExpiredModal();
|
||||
}
|
||||
}).fail(function (jqXHR, status, err) {
|
||||
console.error("Error checking session status:", status, err);
|
||||
});
|
||||
}
|
||||
|
||||
function showSessionExpiredModal() {
|
||||
$('#sessionTimeoutModal').modal('show');
|
||||
}
|
||||
|
||||
$(document).on("click", "#js-session-expired-login", function(e) {
|
||||
const loginModal = $('#modal-admin-login');
|
||||
const redirectUrl = window.location.pathname;
|
||||
window.location.href = `/login?action=${encodeURIComponent(redirectUrl)}`;
|
||||
});
|
||||
|
||||
// show modal login on page load
|
||||
$(document).ready(function () {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
const redirectUrl = $('#redirect-url').val() || params.get('action') || '/';
|
||||
$('#modal-admin-login').modal('show');
|
||||
$('#redirect-url').val(redirectUrl);
|
||||
$('#username').focus();
|
||||
$('#username').addClass("focusedInput");
|
||||
});
|
||||
|
||||
// DHCP or Static IP option group
|
||||
$('#chkstatic').on('change', function() {
|
||||
if (this.checked) {
|
||||
|
@ -911,19 +732,20 @@ function setDhcpFieldsDisabled() {
|
|||
Array.range = (start, end) => Array.from({length: (end - start)}, (v, k) => k + start);
|
||||
|
||||
$(document).on("click", ".js-toggle-password", function(e) {
|
||||
var button = $(e.currentTarget);
|
||||
var field = $(button.data("bsTarget"));
|
||||
var button = $(e.target)
|
||||
var field = $(button.data("target"));
|
||||
|
||||
if (field.is(":input")) {
|
||||
e.preventDefault();
|
||||
|
||||
if (!button.data("__toggle-with-initial")) {
|
||||
$("i", button).removeClass("fas fa-eye").addClass(button.attr("data-toggle-with"));
|
||||
$("i", this).removeClass("fas fa-eye").addClass(button.attr("data-toggle-with"));
|
||||
}
|
||||
|
||||
if (field.attr("type") === "password") {
|
||||
field.attr("type", "text");
|
||||
} else {
|
||||
$("i", button).removeClass("fas fa-eye-slash").addClass("fas fa-eye");
|
||||
$("i", this).removeClass("fas fa-eye-slash").addClass("fas fa-eye");
|
||||
field.attr("type", "password");
|
||||
}
|
||||
}
|
||||
|
@ -933,12 +755,15 @@ $(function() {
|
|||
$('#theme-select').change(function() {
|
||||
var theme = themes[$( "#theme-select" ).val() ];
|
||||
|
||||
var hasDarkTheme = theme === 'custom.php';
|
||||
var hasDarkTheme = theme === 'custom.php' ||
|
||||
theme === 'material-light.php';
|
||||
var nightModeChecked = $("#night-mode").prop("checked");
|
||||
|
||||
if (nightModeChecked && hasDarkTheme) {
|
||||
if (theme === "custom.php") {
|
||||
set_theme("dark.css");
|
||||
set_theme("lightsout.php");
|
||||
} else if (theme === "material-light.php") {
|
||||
set_theme("material-dark.php");
|
||||
}
|
||||
} else {
|
||||
set_theme(theme);
|
||||
|
@ -955,7 +780,7 @@ function set_theme(theme) {
|
|||
$(function() {
|
||||
var currentTheme = getCookie('theme');
|
||||
// Check if the current theme is a dark theme
|
||||
var isDarkTheme = currentTheme === 'dark.css';
|
||||
var isDarkTheme = currentTheme === 'lightsout.php' || currentTheme === 'material-dark.php';
|
||||
|
||||
$('#night-mode').prop('checked', isDarkTheme);
|
||||
$('#night-mode').change(function() {
|
||||
|
@ -964,11 +789,15 @@ $(function() {
|
|||
|
||||
if (state == true) {
|
||||
if (currentTheme == 'custom.php') {
|
||||
set_theme('dark.css');
|
||||
set_theme('lightsout.php');
|
||||
} else if (currentTheme == 'material-light.php') {
|
||||
set_theme('material-dark.php');
|
||||
}
|
||||
} else {
|
||||
if (currentTheme == 'dark.css') {
|
||||
if (currentTheme == 'lightsout.php') {
|
||||
set_theme('custom.php');
|
||||
} else if (currentTheme == 'material-dark.php') {
|
||||
set_theme('material-light.php');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -990,47 +819,48 @@ function getCookie(cname) {
|
|||
// Define themes
|
||||
var themes = {
|
||||
"default": "custom.php",
|
||||
"hackernews" : "hackernews.css"
|
||||
"hackernews" : "hackernews.css",
|
||||
"lightsout" : "lightsout.php",
|
||||
"material-light" : "material-light.php",
|
||||
"material-dark" : "material-dark.php",
|
||||
}
|
||||
|
||||
// Adds active class to current nav-item
|
||||
$(window).bind("load", function() {
|
||||
var url = window.location;
|
||||
$('.sb-nav-link-icon a').filter(function() {
|
||||
return this.href == url;
|
||||
}).parent().addClass('active');
|
||||
// Toggles the sidebar navigation.
|
||||
// Overrides the default SB Admin 2 behavior
|
||||
$("#sidebarToggleTopbar").on('click', function(e) {
|
||||
$("body").toggleClass("sidebar-toggled");
|
||||
$(".sidebar").toggleClass("toggled d-none");
|
||||
});
|
||||
|
||||
// Sets focus on a specified tab
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
const targetTab = params.get("tab");
|
||||
if (targetTab) {
|
||||
let tabElement = document.querySelector(`[data-bs-toggle="tab"][href="#${targetTab}"]`);
|
||||
if (tabElement) {
|
||||
let tab = new bootstrap.Tab(tabElement);
|
||||
tab.show();
|
||||
// Overrides SB Admin 2
|
||||
$("#sidebarToggle, #sidebarToggleTop").on('click', function(e) {
|
||||
var toggled = $(".sidebar").hasClass("toggled");
|
||||
// Persist state in cookie
|
||||
setCookie('sidebarToggled',toggled, 90);
|
||||
});
|
||||
|
||||
$(function() {
|
||||
if ($(window).width() < 768) {
|
||||
$('.sidebar').addClass('toggled');
|
||||
setCookie('sidebarToggled',false, 90);
|
||||
}
|
||||
});
|
||||
|
||||
$(window).on("load resize",function(e) {
|
||||
if ($(window).width() > 768) {
|
||||
$('.sidebar').removeClass('d-none d-md-block');
|
||||
if (getCookie('sidebarToggled') == 'false') {
|
||||
$('.sidebar').removeClass('toggled');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function disableValidation(form) {
|
||||
form.removeAttribute("novalidate");
|
||||
form.classList.remove("needs-validation");
|
||||
form.querySelectorAll("[required]").forEach(function (field) {
|
||||
field.removeAttribute("required");
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
const $htmlElement = $('html');
|
||||
const $modeswitch = $('#night-mode');
|
||||
$modeswitch.on('change', function() {
|
||||
const isChecked = $(this).is(':checked');
|
||||
const newTheme = isChecked ? 'dark' : 'light';
|
||||
$htmlElement.attr('data-bs-theme', newTheme);
|
||||
localStorage.setItem('bsTheme', newTheme);
|
||||
});
|
||||
// Adds active class to current nav-item
|
||||
$(window).bind("load", function() {
|
||||
var url = window.location;
|
||||
$('ul.navbar-nav a').filter(function() {
|
||||
return this.href == url;
|
||||
}).parent().addClass('active');
|
||||
});
|
||||
|
||||
$(document)
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
<?php
|
||||
|
||||
define('RASPI_BRAND_TEXT', 'RaspAP');
|
||||
define('RASPI_BRAND_TITLE', RASPI_BRAND_TEXT.' Admin Panel');
|
||||
define('RASPI_CONFIG', '/etc/raspap');
|
||||
define('RASPI_CONFIG_NETWORK', RASPI_CONFIG.'/networking/defaults.json');
|
||||
define('RASPI_CONFIG_PROVIDERS', 'config/vpn-providers.json');
|
||||
|
@ -12,7 +11,6 @@ define('RASPI_CACHE_PATH', sys_get_temp_dir() . '/raspap');
|
|||
define('RASPI_ERROR_LOG', sys_get_temp_dir() . '/raspap_error.log');
|
||||
define('RASPI_DEBUG_LOG', 'raspap_debug.log');
|
||||
define('RASPI_LOG_SIZE_LIMIT', 64);
|
||||
define('RASPI_SESSION_TIMEOUT', 1440);
|
||||
|
||||
// Constants for configuration file paths.
|
||||
// These are typical for default RPi installs. Modify if needed.
|
||||
|
@ -63,7 +61,6 @@ define('RASPI_VNSTAT_ENABLED', true);
|
|||
define('RASPI_SYSTEM_ENABLED', true);
|
||||
define('RASPI_MONITOR_ENABLED', false);
|
||||
define('RASPI_RESTAPI_ENABLED', false);
|
||||
define('RASPI_PLUGINS_ENABLED', true);
|
||||
|
||||
// Locale settings
|
||||
define('LOCALE_ROOT', 'locale');
|
||||
|
|
|
@ -15,5 +15,4 @@ interface wlan0
|
|||
static ip_address=10.3.141.1/24
|
||||
static routers=10.3.141.1
|
||||
static domain_name_server=9.9.9.9 1.1.1.1
|
||||
nogateway
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ ctrl_interface_group=0
|
|||
beacon_int=100
|
||||
auth_algs=1
|
||||
wpa_key_mgmt=WPA-PSK
|
||||
ssid=RaspAP
|
||||
ssid=raspi-webgui
|
||||
channel=1
|
||||
hw_mode=g
|
||||
wpa_passphrase=ChangeMe
|
||||
|
|
|
@ -50,26 +50,6 @@
|
|||
"pattern": "(\\w+)\\s+",
|
||||
"replace": "$1,$1\\n"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "AdGuard VPN",
|
||||
"bin_path": "/usr/local/bin/adguardvpn-cli",
|
||||
"install_page": "https://adguard-vpn.com/kb/adguard-vpn-for-linux/installation/",
|
||||
"account_page": "https://my.adguard-vpn.com/en/account/product/vpn",
|
||||
"cmd_overrides": {
|
||||
"countries": "list-locations",
|
||||
"connect": "connect -y -l",
|
||||
"log": "status",
|
||||
"account": "license",
|
||||
"version": "--version"
|
||||
},
|
||||
"regex": {
|
||||
"status": "\/vpn is disconnected\/",
|
||||
"pattern": "/^([A-Z]{2})\\s+.*?\\s([A-Za-z]+(?:\\s[A-Za-z]+)?)\\s+\\d+$/m",
|
||||
"replace": "$2",
|
||||
"slice": 3
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
16750
dist/bootstrap/css/bootstrap.css
vendored
16750
dist/bootstrap/css/bootstrap.css
vendored
File diff suppressed because it is too large
Load diff
1
dist/bootstrap/css/bootstrap.css.map
vendored
1
dist/bootstrap/css/bootstrap.css.map
vendored
File diff suppressed because one or more lines are too long
6
dist/bootstrap/css/bootstrap.min.css
vendored
6
dist/bootstrap/css/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
8
dist/bootstrap/js/bootstrap.bundle.min.js
vendored
8
dist/bootstrap/js/bootstrap.bundle.min.js
vendored
File diff suppressed because one or more lines are too long
7876
dist/font-awesome/css/all.css
vendored
7876
dist/font-awesome/css/all.css
vendored
File diff suppressed because it is too large
Load diff
9
dist/font-awesome/css/all.min.css
vendored
9
dist/font-awesome/css/all.min.css
vendored
File diff suppressed because one or more lines are too long
1600
dist/font-awesome/css/brands.css
vendored
1600
dist/font-awesome/css/brands.css
vendored
File diff suppressed because it is too large
Load diff
6
dist/font-awesome/css/brands.min.css
vendored
6
dist/font-awesome/css/brands.min.css
vendored
File diff suppressed because one or more lines are too long
6215
dist/font-awesome/css/fontawesome.css
vendored
6215
dist/font-awesome/css/fontawesome.css
vendored
File diff suppressed because it is too large
Load diff
9
dist/font-awesome/css/fontawesome.min.css
vendored
9
dist/font-awesome/css/fontawesome.min.css
vendored
File diff suppressed because one or more lines are too long
19
dist/font-awesome/css/regular.css
vendored
19
dist/font-awesome/css/regular.css
vendored
|
@ -1,19 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:root, :host {
|
||||
--fa-style-family-classic: 'Font Awesome 6 Free';
|
||||
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; }
|
||||
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 6 Free';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
|
||||
|
||||
.far,
|
||||
.fa-regular {
|
||||
font-weight: 400; }
|
6
dist/font-awesome/css/regular.min.css
vendored
6
dist/font-awesome/css/regular.min.css
vendored
|
@ -1,6 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}
|
19
dist/font-awesome/css/solid.css
vendored
19
dist/font-awesome/css/solid.css
vendored
|
@ -1,19 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:root, :host {
|
||||
--fa-style-family-classic: 'Font Awesome 6 Free';
|
||||
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }
|
||||
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 6 Free';
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
|
||||
|
||||
.fas,
|
||||
.fa-solid {
|
||||
font-weight: 900; }
|
6
dist/font-awesome/css/solid.min.css
vendored
6
dist/font-awesome/css/solid.min.css
vendored
|
@ -1,6 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}
|
459
dist/font-awesome/css/svg-with-js.css
vendored
459
dist/font-awesome/css/svg-with-js.css
vendored
|
@ -1,459 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:root, :host {
|
||||
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free';
|
||||
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free';
|
||||
--fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro';
|
||||
--fa-font-thin: normal 100 1em/1 'Font Awesome 6 Pro';
|
||||
--fa-font-duotone: normal 900 1em/1 'Font Awesome 6 Duotone';
|
||||
--fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands';
|
||||
--fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-sharp-regular: normal 400 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-sharp-light: normal 300 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-sharp-thin: normal 100 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-sharp-duotone-solid: normal 900 1em/1 'Font Awesome 6 Sharp Duotone'; }
|
||||
|
||||
svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
|
||||
overflow: visible;
|
||||
box-sizing: content-box; }
|
||||
|
||||
.svg-inline--fa {
|
||||
display: var(--fa-display, inline-block);
|
||||
height: 1em;
|
||||
overflow: visible;
|
||||
vertical-align: -.125em; }
|
||||
.svg-inline--fa.fa-2xs {
|
||||
vertical-align: 0.1em; }
|
||||
.svg-inline--fa.fa-xs {
|
||||
vertical-align: 0em; }
|
||||
.svg-inline--fa.fa-sm {
|
||||
vertical-align: -0.07143em; }
|
||||
.svg-inline--fa.fa-lg {
|
||||
vertical-align: -0.2em; }
|
||||
.svg-inline--fa.fa-xl {
|
||||
vertical-align: -0.25em; }
|
||||
.svg-inline--fa.fa-2xl {
|
||||
vertical-align: -0.3125em; }
|
||||
.svg-inline--fa.fa-pull-left {
|
||||
margin-right: var(--fa-pull-margin, 0.3em);
|
||||
width: auto; }
|
||||
.svg-inline--fa.fa-pull-right {
|
||||
margin-left: var(--fa-pull-margin, 0.3em);
|
||||
width: auto; }
|
||||
.svg-inline--fa.fa-li {
|
||||
width: var(--fa-li-width, 2em);
|
||||
top: 0.25em; }
|
||||
.svg-inline--fa.fa-fw {
|
||||
width: var(--fa-fw-width, 1.25em); }
|
||||
|
||||
.fa-layers svg.svg-inline--fa {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
margin: auto;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0; }
|
||||
|
||||
.fa-layers-text, .fa-layers-counter {
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
text-align: center; }
|
||||
|
||||
.fa-layers {
|
||||
display: inline-block;
|
||||
height: 1em;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
vertical-align: -.125em;
|
||||
width: 1em; }
|
||||
.fa-layers svg.svg-inline--fa {
|
||||
transform-origin: center center; }
|
||||
|
||||
.fa-layers-text {
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
transform-origin: center center; }
|
||||
|
||||
.fa-layers-counter {
|
||||
background-color: var(--fa-counter-background-color, #ff253a);
|
||||
border-radius: var(--fa-counter-border-radius, 1em);
|
||||
box-sizing: border-box;
|
||||
color: var(--fa-inverse, #fff);
|
||||
line-height: var(--fa-counter-line-height, 1);
|
||||
max-width: var(--fa-counter-max-width, 5em);
|
||||
min-width: var(--fa-counter-min-width, 1.5em);
|
||||
overflow: hidden;
|
||||
padding: var(--fa-counter-padding, 0.25em 0.5em);
|
||||
right: var(--fa-right, 0);
|
||||
text-overflow: ellipsis;
|
||||
top: var(--fa-top, 0);
|
||||
transform: scale(var(--fa-counter-scale, 0.25));
|
||||
transform-origin: top right; }
|
||||
|
||||
.fa-layers-bottom-right {
|
||||
bottom: var(--fa-bottom, 0);
|
||||
right: var(--fa-right, 0);
|
||||
top: auto;
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform-origin: bottom right; }
|
||||
|
||||
.fa-layers-bottom-left {
|
||||
bottom: var(--fa-bottom, 0);
|
||||
left: var(--fa-left, 0);
|
||||
right: auto;
|
||||
top: auto;
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform-origin: bottom left; }
|
||||
|
||||
.fa-layers-top-right {
|
||||
top: var(--fa-top, 0);
|
||||
right: var(--fa-right, 0);
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform-origin: top right; }
|
||||
|
||||
.fa-layers-top-left {
|
||||
left: var(--fa-left, 0);
|
||||
right: auto;
|
||||
top: var(--fa-top, 0);
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform-origin: top left; }
|
||||
|
||||
.fa-1x {
|
||||
font-size: 1em; }
|
||||
|
||||
.fa-2x {
|
||||
font-size: 2em; }
|
||||
|
||||
.fa-3x {
|
||||
font-size: 3em; }
|
||||
|
||||
.fa-4x {
|
||||
font-size: 4em; }
|
||||
|
||||
.fa-5x {
|
||||
font-size: 5em; }
|
||||
|
||||
.fa-6x {
|
||||
font-size: 6em; }
|
||||
|
||||
.fa-7x {
|
||||
font-size: 7em; }
|
||||
|
||||
.fa-8x {
|
||||
font-size: 8em; }
|
||||
|
||||
.fa-9x {
|
||||
font-size: 9em; }
|
||||
|
||||
.fa-10x {
|
||||
font-size: 10em; }
|
||||
|
||||
.fa-2xs {
|
||||
font-size: 0.625em;
|
||||
line-height: 0.1em;
|
||||
vertical-align: 0.225em; }
|
||||
|
||||
.fa-xs {
|
||||
font-size: 0.75em;
|
||||
line-height: 0.08333em;
|
||||
vertical-align: 0.125em; }
|
||||
|
||||
.fa-sm {
|
||||
font-size: 0.875em;
|
||||
line-height: 0.07143em;
|
||||
vertical-align: 0.05357em; }
|
||||
|
||||
.fa-lg {
|
||||
font-size: 1.25em;
|
||||
line-height: 0.05em;
|
||||
vertical-align: -0.075em; }
|
||||
|
||||
.fa-xl {
|
||||
font-size: 1.5em;
|
||||
line-height: 0.04167em;
|
||||
vertical-align: -0.125em; }
|
||||
|
||||
.fa-2xl {
|
||||
font-size: 2em;
|
||||
line-height: 0.03125em;
|
||||
vertical-align: -0.1875em; }
|
||||
|
||||
.fa-fw {
|
||||
text-align: center;
|
||||
width: 1.25em; }
|
||||
|
||||
.fa-ul {
|
||||
list-style-type: none;
|
||||
margin-left: var(--fa-li-margin, 2.5em);
|
||||
padding-left: 0; }
|
||||
.fa-ul > li {
|
||||
position: relative; }
|
||||
|
||||
.fa-li {
|
||||
left: calc(-1 * var(--fa-li-width, 2em));
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: var(--fa-li-width, 2em);
|
||||
line-height: inherit; }
|
||||
|
||||
.fa-border {
|
||||
border-color: var(--fa-border-color, #eee);
|
||||
border-radius: var(--fa-border-radius, 0.1em);
|
||||
border-style: var(--fa-border-style, solid);
|
||||
border-width: var(--fa-border-width, 0.08em);
|
||||
padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }
|
||||
|
||||
.fa-pull-left {
|
||||
float: left;
|
||||
margin-right: var(--fa-pull-margin, 0.3em); }
|
||||
|
||||
.fa-pull-right {
|
||||
float: right;
|
||||
margin-left: var(--fa-pull-margin, 0.3em); }
|
||||
|
||||
.fa-beat {
|
||||
animation-name: fa-beat;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
|
||||
.fa-bounce {
|
||||
animation-name: fa-bounce;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
|
||||
|
||||
.fa-fade {
|
||||
animation-name: fa-fade;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
|
||||
.fa-beat-fade {
|
||||
animation-name: fa-beat-fade;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
|
||||
.fa-flip {
|
||||
animation-name: fa-flip;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
|
||||
.fa-shake {
|
||||
animation-name: fa-shake;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
|
||||
.fa-spin {
|
||||
animation-name: fa-spin;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 2s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
|
||||
.fa-spin-reverse {
|
||||
--fa-animation-direction: reverse; }
|
||||
|
||||
.fa-pulse,
|
||||
.fa-spin-pulse {
|
||||
animation-name: fa-spin;
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, steps(8)); }
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.fa-beat,
|
||||
.fa-bounce,
|
||||
.fa-fade,
|
||||
.fa-beat-fade,
|
||||
.fa-flip,
|
||||
.fa-pulse,
|
||||
.fa-shake,
|
||||
.fa-spin,
|
||||
.fa-spin-pulse {
|
||||
animation-delay: -1ms;
|
||||
animation-duration: 1ms;
|
||||
animation-iteration-count: 1;
|
||||
transition-delay: 0s;
|
||||
transition-duration: 0s; } }
|
||||
|
||||
@keyframes fa-beat {
|
||||
0%, 90% {
|
||||
transform: scale(1); }
|
||||
45% {
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
|
||||
@keyframes fa-bounce {
|
||||
0% {
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
10% {
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
30% {
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
50% {
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
57% {
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
64% {
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
100% {
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
|
||||
@keyframes fa-fade {
|
||||
50% {
|
||||
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||
|
||||
@keyframes fa-beat-fade {
|
||||
0%, 100% {
|
||||
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||
transform: scale(1); }
|
||||
50% {
|
||||
opacity: 1;
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@keyframes fa-flip {
|
||||
50% {
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
|
||||
@keyframes fa-shake {
|
||||
0% {
|
||||
transform: rotate(-15deg); }
|
||||
4% {
|
||||
transform: rotate(15deg); }
|
||||
8%, 24% {
|
||||
transform: rotate(-18deg); }
|
||||
12%, 28% {
|
||||
transform: rotate(18deg); }
|
||||
16% {
|
||||
transform: rotate(-22deg); }
|
||||
20% {
|
||||
transform: rotate(22deg); }
|
||||
32% {
|
||||
transform: rotate(-12deg); }
|
||||
36% {
|
||||
transform: rotate(12deg); }
|
||||
40%, 100% {
|
||||
transform: rotate(0deg); } }
|
||||
|
||||
@keyframes fa-spin {
|
||||
0% {
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
transform: rotate(360deg); } }
|
||||
|
||||
.fa-rotate-90 {
|
||||
transform: rotate(90deg); }
|
||||
|
||||
.fa-rotate-180 {
|
||||
transform: rotate(180deg); }
|
||||
|
||||
.fa-rotate-270 {
|
||||
transform: rotate(270deg); }
|
||||
|
||||
.fa-flip-horizontal {
|
||||
transform: scale(-1, 1); }
|
||||
|
||||
.fa-flip-vertical {
|
||||
transform: scale(1, -1); }
|
||||
|
||||
.fa-flip-both,
|
||||
.fa-flip-horizontal.fa-flip-vertical {
|
||||
transform: scale(-1, -1); }
|
||||
|
||||
.fa-rotate-by {
|
||||
transform: rotate(var(--fa-rotate-angle, 0)); }
|
||||
|
||||
.fa-stack {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
height: 2em;
|
||||
position: relative;
|
||||
width: 2.5em; }
|
||||
|
||||
.fa-stack-1x,
|
||||
.fa-stack-2x {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
margin: auto;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
z-index: var(--fa-stack-z-index, auto); }
|
||||
|
||||
.svg-inline--fa.fa-stack-1x {
|
||||
height: 1em;
|
||||
width: 1.25em; }
|
||||
|
||||
.svg-inline--fa.fa-stack-2x {
|
||||
height: 2em;
|
||||
width: 2.5em; }
|
||||
|
||||
.fa-inverse {
|
||||
color: var(--fa-inverse, #fff); }
|
||||
|
||||
.sr-only,
|
||||
.fa-sr-only {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border-width: 0; }
|
||||
|
||||
.sr-only-focusable:not(:focus),
|
||||
.fa-sr-only-focusable:not(:focus) {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border-width: 0; }
|
||||
|
||||
.svg-inline--fa .fa-primary {
|
||||
fill: var(--fa-primary-color, currentColor);
|
||||
opacity: var(--fa-primary-opacity, 1); }
|
||||
|
||||
.svg-inline--fa .fa-secondary {
|
||||
fill: var(--fa-secondary-color, currentColor);
|
||||
opacity: var(--fa-secondary-opacity, 0.4); }
|
||||
|
||||
.svg-inline--fa.fa-swap-opacity .fa-primary {
|
||||
opacity: var(--fa-secondary-opacity, 0.4); }
|
||||
|
||||
.svg-inline--fa.fa-swap-opacity .fa-secondary {
|
||||
opacity: var(--fa-primary-opacity, 1); }
|
||||
|
||||
.svg-inline--fa mask .fa-primary,
|
||||
.svg-inline--fa mask .fa-secondary {
|
||||
fill: black; }
|
||||
|
||||
.fad.fa-inverse,
|
||||
.fa-duotone.fa-inverse {
|
||||
color: var(--fa-inverse, #fff); }
|
6
dist/font-awesome/css/svg-with-js.min.css
vendored
6
dist/font-awesome/css/svg-with-js.min.css
vendored
File diff suppressed because one or more lines are too long
26
dist/font-awesome/css/v4-font-face.css
vendored
26
dist/font-awesome/css/v4-font-face.css
vendored
|
@ -1,26 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
|
||||
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
|
||||
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype");
|
||||
unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; }
|
||||
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
font-display: block;
|
||||
src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype");
|
||||
unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; }
|
6
dist/font-awesome/css/v4-font-face.min.css
vendored
6
dist/font-awesome/css/v4-font-face.min.css
vendored
|
@ -1,6 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
|
6
dist/font-awesome/css/v4-shims.min.css
vendored
6
dist/font-awesome/css/v4-shims.min.css
vendored
File diff suppressed because one or more lines are too long
22
dist/font-awesome/css/v5-font-face.css
vendored
22
dist/font-awesome/css/v5-font-face.css
vendored
|
@ -1,22 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Brands';
|
||||
font-display: block;
|
||||
font-weight: 400;
|
||||
src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
|
||||
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-display: block;
|
||||
font-weight: 900;
|
||||
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
|
||||
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-display: block;
|
||||
font-weight: 400;
|
||||
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
|
6
dist/font-awesome/css/v5-font-face.min.css
vendored
6
dist/font-awesome/css/v5-font-face.min.css
vendored
|
@ -1,6 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}
|
BIN
dist/font-awesome/webfonts/fa-brands-400.ttf
vendored
BIN
dist/font-awesome/webfonts/fa-brands-400.ttf
vendored
Binary file not shown.
BIN
dist/font-awesome/webfonts/fa-brands-400.woff2
vendored
BIN
dist/font-awesome/webfonts/fa-brands-400.woff2
vendored
Binary file not shown.
BIN
dist/font-awesome/webfonts/fa-regular-400.ttf
vendored
BIN
dist/font-awesome/webfonts/fa-regular-400.ttf
vendored
Binary file not shown.
BIN
dist/font-awesome/webfonts/fa-regular-400.woff2
vendored
BIN
dist/font-awesome/webfonts/fa-regular-400.woff2
vendored
Binary file not shown.
BIN
dist/font-awesome/webfonts/fa-solid-900.ttf
vendored
BIN
dist/font-awesome/webfonts/fa-solid-900.ttf
vendored
Binary file not shown.
BIN
dist/font-awesome/webfonts/fa-solid-900.woff2
vendored
BIN
dist/font-awesome/webfonts/fa-solid-900.woff2
vendored
Binary file not shown.
BIN
dist/font-awesome/webfonts/fa-v4compatibility.ttf
vendored
BIN
dist/font-awesome/webfonts/fa-v4compatibility.ttf
vendored
Binary file not shown.
BIN
dist/font-awesome/webfonts/fa-v4compatibility.woff2
vendored
BIN
dist/font-awesome/webfonts/fa-v4compatibility.woff2
vendored
Binary file not shown.
4396
dist/fontawesome-free/css/all.css
vendored
Normal file
4396
dist/fontawesome-free/css/all.css
vendored
Normal file
File diff suppressed because it is too large
Load diff
5
dist/fontawesome-free/css/all.min.css
vendored
Normal file
5
dist/fontawesome-free/css/all.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
14
dist/fontawesome-free/css/brands.css
vendored
Normal file
14
dist/fontawesome-free/css/brands.css
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
/*!
|
||||
* Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Brands';
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-display: auto;
|
||||
src: url("../webfonts/fa-brands-400.eot");
|
||||
src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); }
|
||||
|
||||
.fab {
|
||||
font-family: 'Font Awesome 5 Brands'; }
|
5
dist/fontawesome-free/css/brands.min.css
vendored
Normal file
5
dist/fontawesome-free/css/brands.min.css
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
/*!
|
||||
* Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}
|
4363
dist/fontawesome-free/css/fontawesome.css
vendored
Normal file
4363
dist/fontawesome-free/css/fontawesome.css
vendored
Normal file
File diff suppressed because it is too large
Load diff
5
dist/fontawesome-free/css/fontawesome.min.css
vendored
Normal file
5
dist/fontawesome-free/css/fontawesome.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
15
dist/fontawesome-free/css/regular.css
vendored
Normal file
15
dist/fontawesome-free/css/regular.css
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
/*!
|
||||
* Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: auto;
|
||||
src: url("../webfonts/fa-regular-400.eot");
|
||||
src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); }
|
||||
|
||||
.far {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-weight: 400; }
|
5
dist/fontawesome-free/css/regular.min.css
vendored
Normal file
5
dist/fontawesome-free/css/regular.min.css
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
/*!
|
||||
* Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400}
|
16
dist/fontawesome-free/css/solid.css
vendored
Normal file
16
dist/fontawesome-free/css/solid.css
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
/*!
|
||||
* Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: auto;
|
||||
src: url("../webfonts/fa-solid-900.eot");
|
||||
src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); }
|
||||
|
||||
.fa,
|
||||
.fas {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-weight: 900; }
|
5
dist/fontawesome-free/css/solid.min.css
vendored
Normal file
5
dist/fontawesome-free/css/solid.min.css
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
/*!
|
||||
* Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900}
|
371
dist/fontawesome-free/css/svg-with-js.css
vendored
Normal file
371
dist/fontawesome-free/css/svg-with-js.css
vendored
Normal file
|
@ -0,0 +1,371 @@
|
|||
/*!
|
||||
* Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
svg:not(:root).svg-inline--fa {
|
||||
overflow: visible; }
|
||||
|
||||
.svg-inline--fa {
|
||||
display: inline-block;
|
||||
font-size: inherit;
|
||||
height: 1em;
|
||||
overflow: visible;
|
||||
vertical-align: -.125em; }
|
||||
.svg-inline--fa.fa-lg {
|
||||
vertical-align: -.225em; }
|
||||
.svg-inline--fa.fa-w-1 {
|
||||
width: 0.0625em; }
|
||||
.svg-inline--fa.fa-w-2 {
|
||||
width: 0.125em; }
|
||||
.svg-inline--fa.fa-w-3 {
|
||||
width: 0.1875em; }
|
||||
.svg-inline--fa.fa-w-4 {
|
||||
width: 0.25em; }
|
||||
.svg-inline--fa.fa-w-5 {
|
||||
width: 0.3125em; }
|
||||
.svg-inline--fa.fa-w-6 {
|
||||
width: 0.375em; }
|
||||
.svg-inline--fa.fa-w-7 {
|
||||
width: 0.4375em; }
|
||||
.svg-inline--fa.fa-w-8 {
|
||||
width: 0.5em; }
|
||||
.svg-inline--fa.fa-w-9 {
|
||||
width: 0.5625em; }
|
||||
.svg-inline--fa.fa-w-10 {
|
||||
width: 0.625em; }
|
||||
.svg-inline--fa.fa-w-11 {
|
||||
width: 0.6875em; }
|
||||
.svg-inline--fa.fa-w-12 {
|
||||
width: 0.75em; }
|
||||
.svg-inline--fa.fa-w-13 {
|
||||
width: 0.8125em; }
|
||||
.svg-inline--fa.fa-w-14 {
|
||||
width: 0.875em; }
|
||||
.svg-inline--fa.fa-w-15 {
|
||||
width: 0.9375em; }
|
||||
.svg-inline--fa.fa-w-16 {
|
||||
width: 1em; }
|
||||
.svg-inline--fa.fa-w-17 {
|
||||
width: 1.0625em; }
|
||||
.svg-inline--fa.fa-w-18 {
|
||||
width: 1.125em; }
|
||||
.svg-inline--fa.fa-w-19 {
|
||||
width: 1.1875em; }
|
||||
.svg-inline--fa.fa-w-20 {
|
||||
width: 1.25em; }
|
||||
.svg-inline--fa.fa-pull-left {
|
||||
margin-right: .3em;
|
||||
width: auto; }
|
||||
.svg-inline--fa.fa-pull-right {
|
||||
margin-left: .3em;
|
||||
width: auto; }
|
||||
.svg-inline--fa.fa-border {
|
||||
height: 1.5em; }
|
||||
.svg-inline--fa.fa-li {
|
||||
width: 2em; }
|
||||
.svg-inline--fa.fa-fw {
|
||||
width: 1.25em; }
|
||||
|
||||
.fa-layers svg.svg-inline--fa {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
margin: auto;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0; }
|
||||
|
||||
.fa-layers {
|
||||
display: inline-block;
|
||||
height: 1em;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
vertical-align: -.125em;
|
||||
width: 1em; }
|
||||
.fa-layers svg.svg-inline--fa {
|
||||
-webkit-transform-origin: center center;
|
||||
transform-origin: center center; }
|
||||
|
||||
.fa-layers-text, .fa-layers-counter {
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
text-align: center; }
|
||||
|
||||
.fa-layers-text {
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
transform: translate(-50%, -50%);
|
||||
-webkit-transform-origin: center center;
|
||||
transform-origin: center center; }
|
||||
|
||||
.fa-layers-counter {
|
||||
background-color: #ff253a;
|
||||
border-radius: 1em;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
color: #fff;
|
||||
height: 1.5em;
|
||||
line-height: 1;
|
||||
max-width: 5em;
|
||||
min-width: 1.5em;
|
||||
overflow: hidden;
|
||||
padding: .25em;
|
||||
right: 0;
|
||||
text-overflow: ellipsis;
|
||||
top: 0;
|
||||
-webkit-transform: scale(0.25);
|
||||
transform: scale(0.25);
|
||||
-webkit-transform-origin: top right;
|
||||
transform-origin: top right; }
|
||||
|
||||
.fa-layers-bottom-right {
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
top: auto;
|
||||
-webkit-transform: scale(0.25);
|
||||
transform: scale(0.25);
|
||||
-webkit-transform-origin: bottom right;
|
||||
transform-origin: bottom right; }
|
||||
|
||||
.fa-layers-bottom-left {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: auto;
|
||||
top: auto;
|
||||
-webkit-transform: scale(0.25);
|
||||
transform: scale(0.25);
|
||||
-webkit-transform-origin: bottom left;
|
||||
transform-origin: bottom left; }
|
||||
|
||||
.fa-layers-top-right {
|
||||
right: 0;
|
||||
top: 0;
|
||||
-webkit-transform: scale(0.25);
|
||||
transform: scale(0.25);
|
||||
-webkit-transform-origin: top right;
|
||||
transform-origin: top right; }
|
||||
|
||||
.fa-layers-top-left {
|
||||
left: 0;
|
||||
right: auto;
|
||||
top: 0;
|
||||
-webkit-transform: scale(0.25);
|
||||
transform: scale(0.25);
|
||||
-webkit-transform-origin: top left;
|
||||
transform-origin: top left; }
|
||||
|
||||
.fa-lg {
|
||||
font-size: 1.33333em;
|
||||
line-height: 0.75em;
|
||||
vertical-align: -.0667em; }
|
||||
|
||||
.fa-xs {
|
||||
font-size: .75em; }
|
||||
|
||||
.fa-sm {
|
||||
font-size: .875em; }
|
||||
|
||||
.fa-1x {
|
||||
font-size: 1em; }
|
||||
|
||||
.fa-2x {
|
||||
font-size: 2em; }
|
||||
|
||||
.fa-3x {
|
||||
font-size: 3em; }
|
||||
|
||||
.fa-4x {
|
||||
font-size: 4em; }
|
||||
|
||||
.fa-5x {
|
||||
font-size: 5em; }
|
||||
|
||||
.fa-6x {
|
||||
font-size: 6em; }
|
||||
|
||||
.fa-7x {
|
||||
font-size: 7em; }
|
||||
|
||||
.fa-8x {
|
||||
font-size: 8em; }
|
||||
|
||||
.fa-9x {
|
||||
font-size: 9em; }
|
||||
|
||||
.fa-10x {
|
||||
font-size: 10em; }
|
||||
|
||||
.fa-fw {
|
||||
text-align: center;
|
||||
width: 1.25em; }
|
||||
|
||||
.fa-ul {
|
||||
list-style-type: none;
|
||||
margin-left: 2.5em;
|
||||
padding-left: 0; }
|
||||
.fa-ul > li {
|
||||
position: relative; }
|
||||
|
||||
.fa-li {
|
||||
left: -2em;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: 2em;
|
||||
line-height: inherit; }
|
||||
|
||||
.fa-border {
|
||||
border: solid 0.08em #eee;
|
||||
border-radius: .1em;
|
||||
padding: .2em .25em .15em; }
|
||||
|
||||
.fa-pull-left {
|
||||
float: left; }
|
||||
|
||||
.fa-pull-right {
|
||||
float: right; }
|
||||
|
||||
.fa.fa-pull-left,
|
||||
.fas.fa-pull-left,
|
||||
.far.fa-pull-left,
|
||||
.fal.fa-pull-left,
|
||||
.fab.fa-pull-left {
|
||||
margin-right: .3em; }
|
||||
|
||||
.fa.fa-pull-right,
|
||||
.fas.fa-pull-right,
|
||||
.far.fa-pull-right,
|
||||
.fal.fa-pull-right,
|
||||
.fab.fa-pull-right {
|
||||
margin-left: .3em; }
|
||||
|
||||
.fa-spin {
|
||||
-webkit-animation: fa-spin 2s infinite linear;
|
||||
animation: fa-spin 2s infinite linear; }
|
||||
|
||||
.fa-pulse {
|
||||
-webkit-animation: fa-spin 1s infinite steps(8);
|
||||
animation: fa-spin 1s infinite steps(8); }
|
||||
|
||||
@-webkit-keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); } }
|
||||
|
||||
@keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); } }
|
||||
|
||||
.fa-rotate-90 {
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
|
||||
-webkit-transform: rotate(90deg);
|
||||
transform: rotate(90deg); }
|
||||
|
||||
.fa-rotate-180 {
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
|
||||
-webkit-transform: rotate(180deg);
|
||||
transform: rotate(180deg); }
|
||||
|
||||
.fa-rotate-270 {
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
|
||||
-webkit-transform: rotate(270deg);
|
||||
transform: rotate(270deg); }
|
||||
|
||||
.fa-flip-horizontal {
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
|
||||
-webkit-transform: scale(-1, 1);
|
||||
transform: scale(-1, 1); }
|
||||
|
||||
.fa-flip-vertical {
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
|
||||
-webkit-transform: scale(1, -1);
|
||||
transform: scale(1, -1); }
|
||||
|
||||
.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
|
||||
-webkit-transform: scale(-1, -1);
|
||||
transform: scale(-1, -1); }
|
||||
|
||||
:root .fa-rotate-90,
|
||||
:root .fa-rotate-180,
|
||||
:root .fa-rotate-270,
|
||||
:root .fa-flip-horizontal,
|
||||
:root .fa-flip-vertical,
|
||||
:root .fa-flip-both {
|
||||
-webkit-filter: none;
|
||||
filter: none; }
|
||||
|
||||
.fa-stack {
|
||||
display: inline-block;
|
||||
height: 2em;
|
||||
position: relative;
|
||||
width: 2.5em; }
|
||||
|
||||
.fa-stack-1x,
|
||||
.fa-stack-2x {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
margin: auto;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0; }
|
||||
|
||||
.svg-inline--fa.fa-stack-1x {
|
||||
height: 1em;
|
||||
width: 1.25em; }
|
||||
|
||||
.svg-inline--fa.fa-stack-2x {
|
||||
height: 2em;
|
||||
width: 2.5em; }
|
||||
|
||||
.fa-inverse {
|
||||
color: #fff; }
|
||||
|
||||
.sr-only {
|
||||
border: 0;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: 1px; }
|
||||
|
||||
.sr-only-focusable:active, .sr-only-focusable:focus {
|
||||
clip: auto;
|
||||
height: auto;
|
||||
margin: 0;
|
||||
overflow: visible;
|
||||
position: static;
|
||||
width: auto; }
|
||||
|
||||
.svg-inline--fa .fa-primary {
|
||||
fill: var(--fa-primary-color, currentColor);
|
||||
opacity: 1;
|
||||
opacity: var(--fa-primary-opacity, 1); }
|
||||
|
||||
.svg-inline--fa .fa-secondary {
|
||||
fill: var(--fa-secondary-color, currentColor);
|
||||
opacity: 0.4;
|
||||
opacity: var(--fa-secondary-opacity, 0.4); }
|
||||
|
||||
.svg-inline--fa.fa-swap-opacity .fa-primary {
|
||||
opacity: 0.4;
|
||||
opacity: var(--fa-secondary-opacity, 0.4); }
|
||||
|
||||
.svg-inline--fa.fa-swap-opacity .fa-secondary {
|
||||
opacity: 1;
|
||||
opacity: var(--fa-primary-opacity, 1); }
|
||||
|
||||
.svg-inline--fa mask .fa-primary,
|
||||
.svg-inline--fa mask .fa-secondary {
|
||||
fill: black; }
|
||||
|
||||
.fad.fa-inverse {
|
||||
color: #fff; }
|
5
dist/fontawesome-free/css/svg-with-js.min.css
vendored
Normal file
5
dist/fontawesome-free/css/svg-with-js.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
5
dist/fontawesome-free/css/v4-shims.min.css
vendored
Normal file
5
dist/fontawesome-free/css/v4-shims.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
4362
dist/fontawesome-free/js/all.js
vendored
Normal file
4362
dist/fontawesome-free/js/all.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue