diff --git "a/2021/07/11/\343\200\220\350\241\245\346\241\243\343\200\221\346\240\221\350\216\223\346\264\276\346\212\230\350\205\276\350\256\260\345\275\225/index.html" "b/2021/07/11/\343\200\220\350\241\245\346\241\243\343\200\221\346\240\221\350\216\223\346\264\276\346\212\230\350\205\276\350\256\260\345\275\225/index.html" new file mode 100644 index 0000000..7444f4d --- /dev/null +++ "b/2021/07/11/\343\200\220\350\241\245\346\241\243\343\200\221\346\240\221\350\216\223\346\264\276\346\212\230\350\205\276\350\256\260\345\275\225/index.html" @@ -0,0 +1,306 @@ + +【补档】树莓派折腾记录 - Centaurus99 的杂物堆

【补档】树莓派折腾记录

2021 年初的时候入手了树莓派 4b,然后暑假的时候好好折腾了一下,留下了一些零散的记录,在这里整理起来,之后哪天重建的时候还能来参考一下。

+

由于距离记录已经有一段时间了,可能有些内容会有偏差。

+ + +

初步尝试

参考:http://blog.dngz.net/RaspberryPiKodbox.htm

+

系统安装

尝试装了适配树莓派的 Ubuntu,后来还是为了更好的硬件兼容性换成官方系统了。

+

当时本着尝鲜的想法,选择了仍在 beta 测试中的官方 64-bit 系统 2021-05-07-raspios-buster-arm64-lite,由于计划作为服务器运行,不需要图形桌面,所以就选择了 lite。

+

注:现在官方 64-bit 系统已经正式发布了(https://www.raspberrypi.com/news/raspberry-pi-os-64-bit/)。

+

官网也给出了烧写 SD 卡的工具 Raspberry Pi Imager,GUI 好看,烧录系统非常方便。

+

初始配置

系统烧录完成后会有一个 boot 分区,做一些初始化的配置再进行第一次开机。

+

开启 ssh 服务

boot 分区下新建一个空文件,名为 ssh

+

开机自动连接 WIFI

boot 分区下新建 wpa_supplicant.conf 文件,内容如下:

+
1
2
3
4
5
6
7
8
9
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="wifi链接名"
psk="wifi密码"
key_mgmt=WPA-PSK
}
+ +

初次启动

插电开机~

+

ssh 可以连接,初始用户名 pi ,密码 raspberry

+

记得修改密码。

+

解锁root

sudo passwd root 修改 root 密码。

+

sudo passwd --unlock root 解锁 root 用户。

+

由于安全原因,默认情况下 root 是不能用 ssh 登录的,如果一定需要的话,编辑 /etc/ssh/sshd_config,将配置项 #PermitRootLogin prohibit-password 修改为 PermitRootLogin yes,然后 sudo systemctl restart sshd 重启 ssh 服务即可。

+

校正时区

sudo dpkg-reconfigure tzdata

+

选择 Asia/Shanghai 即可。

+

树莓派配置工具 raspi-config

sudo raspi-config

+

换源

参考:https://blog.csdn.net/baidu_26678247/article/details/108930421

+

如果遇到 The repository 'http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian buster InRelease' is not signed 错误,可以按如下操作添加公钥(参见:https://www.jianshu.com/p/c64deffb1308

+
1
2
gpg --keyserver  keyserver.ubuntu.com --recv-keys 9165938D90FDDD2E
gpg --export --armor 9165938D90FDDD2E | sudo apt-key add -
+ +

一些杂项

GPIO

使用 raspi-config 打开 GPIO

+

sudo apt-get install wiringpi

+

按照 http://wiringpi.com/wiringpi-updated-to-2-52-for-the-raspberry-pi-4b/ 更新 wiringpi 版本

+

gpio readall 即可查看 GPIO 概况

+

进一步配置 WIFI

参考:https://www.cnblogs.com/zhangyuejia/p/8945354.html

+

然后 sudo ifconfig wlan0 down 关闭 wifi,sudo ifconfig wlan0 up 启动 wifi。

+

超频

参考:https://cyfeng.science/2020/06/26/Unboxing-Raspberry-Pi-4B-8GB-and-Overclocking/

+

注意默认情况下 over_voltage 最大为 6

+

查看CPU频率:sudo watch -n 1 cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq

+

查看CPU温度:sudo watch -n 1 cat /sys/class/thermal/thermal_zone0/temp

+

CPU 电源计划

echo "powersave" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 可以将CPU设为省电模式,固定600MHz

+

echo "ondemand" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 设置回默认模式

+

风扇控制

风扇一直开着噪声大,也影响风扇寿命,设置一下温控。

+

为了美观,网购了一个插在 GPIO 座上的风扇插座,勉强塞进了外壳。

+

使用 raspi-config 自带的风扇控制需要注意,若使用 i2c 端口作为控制口,需要将 i2c 关闭。

+

使用 sudo -E rpi-eeprom-config --edit 设置 WAKE_ON_GPIO=0POWER_OFF_ON_HALT=1 可以在 shutdown 之后使风扇也关闭(否则关机后风扇会开始一直转)。

+

通过蓝牙 ssh 连接

即通过蓝牙连接创建局域网。

+

参考:

+ +

连接操作:更改适配器选项 -> 蓝牙网络连接 -> 查看蓝牙网络设备 -> 选中,连接时使用 -> 接入点

+

后来不知道装了啥蓝牙连不上了,排查之后发现似乎是 /usr/bin/bt-agent -c NoInputNoOutput 失效了,并不会自动配对,需要手动配对。(仍未解决,但也不怎么用蓝牙连接了)

+

OLED 显示屏

低价搞到一个小的 OLED 显示屏,装上。

+

由于风扇座占掉了 i2c1,只能通过奇技淫巧使用 i2c0 ,参考 https://blog.csdn.net/weixin_46145842/article/details/106128144 设置

+

驱动和使用参考:https://shumeipai.nxez.com/2019/04/29/use-the-ssd1306-oled-display-on-the-raspberry-pi.html

+

持续连接校园网

在 Github 上找了各种连校园网的轮子,试到最后只有这个能够稳定使用:

+

使用 https://github.com/z4yx/GoAuthing 对应程序和 service。

+

无线 AP 与路由

使用 RaspAP 创建无线 AP(已弃用)

RaspAP

+

手动安装教程:https://docs.raspap.com/manual/

+

开启 802.11ac

参考 https://docs.raspap.com/faq/#80211ac

+

信道选择 36 ,实测 48 无法开启,40 速率较慢。

+

流量监控问题

参考 https://github.com/RaspAP/raspap-webgui/issues/689 末尾。

+

sudo apt-get purge vnstat 卸载原来的 vnstat。

+

curl -O https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/pool/universe/v/vnstat/vnstat_1.18-1_arm64.deb 下载旧版 vnstat。

+

sudo dpkg -i vnstat_1.18-1_arm64.deb 安装。

+

echo "vnstat hold" | sudo dpkg --set-selections 禁用更新。

+

使用 OpenWrt-Docker(也已弃用)

安装 docker:参考 https://openwrt.club/93.html

+

增加用户权限:https://www.cnblogs.com/codeaaa/p/9041533.html

+

hostapd + dnsmasq + OpenWrt-Dockerhttps://zhuanlan.zhihu.com/p/163827788

+

使用的 OpenWrt-Docker

+

注意: 设置 dnsmasq 配置文件的时候一定要反注释bind-interfaces,不然会出现地址占用错误。

+

Openwrt 配合 AdGurad Home 屏蔽广告和 ShadownSocksR Plus 用于翻墙,参考:https://blog.zfdang.com/2020/07/adguard-home-work-with-ssr-plus-in-openwrt/

+

板载 WLAN 优化

sudo iw wlan0 set power_save off 关闭节能可以提高速度与稳定性。

+

使用 USB 网卡

板载网卡性能和稳定性还是不足的,于是入手了一个 USB 无线网卡。

+

由于预算有限,又想要 867Mbps 的 5G 频段支持,于是入手的网卡是 RTL8812BU 芯片,在驱动方面问题多多,悲。

+

驱动安装

支持 RaspberryOS(64bit) 的驱动地址:https://github.com/morrownr/88x2bu

+

关于 iw phy 输出参数的具体说明:https://c4pr1c3.github.io/cuc-mis/chap0x02/rt3572l_explained.html

+

优化WiFi睡眠:https://github.com/fastoe/RTL8812BU_for_Raspbian

+

关于 /etc/modprobe.d/88x2bu.conf 的一点额外说明:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
There's four parms listed in the document you cite.
Code: Select all

rtw_power_mgnt=0|1|2
0 == disable power saving
1 == power saving on, minPS
2 == power saving on, maxPS
Code: Select all

rtw_enusbss=0|1
0 == disable auto suspend
1 == enable auto suspend
Code: Select all

rtw_hwpwrp_detect=0|1
0 == disable HW power pin detection
1 == enable HW power pin detection
Code: Select all

rtw_ips_mode=0|1
0 == low power, IPS_NORMAL
1 == higher power, IPS_LEVEL2
The conventional wisdom, because we're running our RPis as server systems not clients, is to set rtw_power_mgnt=0 and rtw_enusbss=0 to prevent the dongle going into power saving and to ignore the other two parms because they don't make any difference. If the server goes into power saving we'd need a process to wake it up. That's different from a client system where interaction from a keyboard user will trigger a request to wake up and associate the dongle.
+ +

最终配置文件为:

+
1
options 88x2bu rtw_drv_log_level=2 rtw_led_ctrl=1 rtw_vht_enable=2 rtw_power_mgnt=0 rtw_switch_usb_mode=1 rtw_ips_mode=1 rtw_enusbss=0 rtw_beamform_cap=11
+ +

由于购买的网卡为 USB2.0 接口,不支持 USB3.0,需要 rtw_switch_usb_mode=0/2 才能正常使用。

+

一些关于 RTL8812BU 驱动 / hostapd 的问题

hostapd 完整配置文件注释:https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf

+

配置文件中最好去除注释,可能会有奇怪的问题

+

这张网卡无法在初始启动时应用 ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40] 设置 40/80MHz 带宽,似乎是网卡直接 UNINITIALIZED->HT_SCAN 有问题,会进行 neighbor scanning ,然后出现 hostapd[10529]: Failed to request a scan of neighboring BSSes ret=-16 (Device or resource busy) 错误。必须先以普通 20MHz 模式启动,然后转为(restart) 40/80MHz

+

启动时配置文件:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface=wlx1cbfce82adb3

bridge=brlan

hw_mode=a
channel=149
ieee80211n=1
wmm_enabled=1

ssid=RASPNET_402

auth_algs=1

wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

wpa_passphrase=密码
+ +

修改为如下配置后 restart :

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
interface=wlx1cbfce82adb3

bridge=brlan

hw_mode=a
channel=149
ieee80211n=1
ieee80211ac=1
wmm_enabled=1
ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40]
vht_capab=[VHT80][SHORT-GI-80]

ssid=RASPNET_402

auth_algs=1

wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

wpa_passphrase=密码
+ +

Updated 似乎是因为放在5G路由器旁边的原因…

+

一些没什么效果的尝试

> 换驱动

https://github.com/cilynx/rtl88x2bu,在 arm64 系统上编译所需的额外操作:https://github.com/PieGuy314/RTL88x2BU-RPi4-arm64-Driver-Patch

+
> 修改 hostapd 源码重新编译

hostapd 编译方式:https://leux.cn/doc/hostapd.html

+

在源码中找到 neighboring BSSes 的对应部分,修改返回值。

+
1
2
install -D hostapd /usr/local/bin//hostapd
install -D hostapd_cli /usr/local/bin//hostapd_cli
+ +

2.9 版本似乎有点问题,目前在用 2.8 版本。

+

新网卡

原来的网卡是 USB2.0 的网卡,退货换了一个 3.0 的。

+

然而最终发现,新的网卡在运行在使用 rtw_switch_usb_mode=1 运行在 USB3.0 模式时会发生各种错误,且不稳定;而使用 rtw_switch_usb_mode=1 运行在 USB2.0 模式(插在哪个物理口都行)时会保持稳定。

+

Update 2022.02.15:相关问题也已经在驱动存储库的说明中提及了,见 88x2bu-20210702

+

只能跑在 2.0 模式了,速度大概在 200Mbps 左右。

+

最终配置文件:

+
/etc/modprobe.d/88x2bu.conf
1
options 88x2bu rtw_drv_log_level=3 rtw_led_ctrl=1 rtw_vht_enable=2 rtw_power_mgnt=1 rtw_switch_usb_mode=0 rtw_ips_mode=1 rtw_enusbss=0 rtw_beamform_cap=11
+ +
/etc/hostapd/hostapd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
interface=wlx1cbfceb110dc
driver=nl80211

country_code=CN
hw_mode=a
channel=149
ieee80211n=1
ieee80211ac=1
wmm_enabled=1
ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40]
vht_capab=[HTC-VHT][MAX-MPDU-11454][SHORT-GI-80]

ssid=RASPNET_402

wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

wpa_passphrase=密码
+ +

使用的 hostapd 版本: hostapd v2.8

+

Clash 代理 + AdGuardHome 广告屏蔽

配置 Clash

Clash 部署:https://cherysunzhang.com/2020/05/deploy-clash-as-transparent-proxy-on-raspberry-pi/

+

关于代理与 DNS 解析的原理说明:https://blog.skk.moe/post/what-happend-to-dns-in-proxy/

+

DNS 配置可参考:http://blog.joylau.cn/2020/05/01/Clash-Config/

+

Clash 可以配置 proxy-providers 订阅代理,使用 https://github.com/Loyalsoldier/clash-rules 配置 rules

+

可以使用 subconverter 筛选处理订阅节点:https://www.10101.io/2020/02/12/use-clash-proxy-provider-with-subconverter

+

subconverter 中文文档:https://github.com/tindy2013/subconverter/blob/master/README-cn.md

+

后续:发现机场提供了 subconverter ,不需要本地部署啦~

+

开启终端代理

方法一

设置 clash 配置文件 mixed-port: 7890 ,在终端中运行(或添加到 ~/.bashrc):

+
1
2
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
+ +

方法二

使用 Proxychains

+

安装后设置配置文件 /etc/proxychains.conf ,在最后一行设置本地代理服务器和端口 http 127.0.0.1 7890 ,在 /usr/lib/proxychains3/proxyresolv 中将原有的 DNS 4.2.2.2 改为本机的 DNS 服务器

+

然后使用 proxychains + 指令 进行代理,或者直接 proxychains bash 开启全代理的终端

+

使用 sudo 时会报错:ERROR: ld.so: object 'libproxychains.so.3' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.

+

解决方法:使用 find /usr/ -name libproxychains.so.3 -print 找到库的位置,然后参考:https://parrotsec-cn.org/t/proxychains/3012 修改文件

+

配置 AdGuardHome

最终决定将 Clash 作为 AdGuardHome 的上游服务器

+

/etc/dnsmasq.conf 中设置 port=0 关闭 dnsmasq 的 DNS 服务

+

安装 AdGuardHomehttps://github.com/AdguardTeam/AdGuardHome#installation

+

配置 AdGuardHome DNS 服务端口为 53,上游 DNS 服务器为 Clash 的 DNS 服务(Clash 需开启 DNS 服务)

+

透明代理:假设 Clash 的 redir-port7891iptable 进行以下设置:

+

Update 2022.04.23: 由于校园网分配的是公网IP,所以需要设置防火墙,限制 Clash 服务只能被内网访问,防止端口被扫到被攻击(会导致大量连接和高 CPU 占用)。iptables 也做了更新,增加了简单的防护。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 防止外网使用内网 IP 欺骗
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
# 允许已建立的连接通过
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许本机和内网 IP 的所有访问
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT
# 允许来自无线 AP 的 DHCP 请求, wlx1cbfceb110dc 为网卡名
iptables -A INPUT -i wlx1cbfceb110dc -p udp --dport 67 -j ACCEPT
# 开放外网 SSH, HTTP, HTTPS 连接
iptables -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT
# 若不是允许内网 IP 的所有访问, 则需添加该规则允许内网对 Clash 的访问
# iptables -A INPUT -s 192.168.0.0/16 -p tcp -m tcp --dport 7891 -j ACCEPT
# 丢弃其他所有请求
iptables -P INPUT DROP

# 将转发后的包源地址修改为本机地址
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -t nat -N clash
# 内网 TCP 请求转发给 clash 链
iptables -t nat -A PREROUTING -s 192.168.0.0/16 -p tcp -j clash

# 访问内网不经过 clash
iptables -t nat -A clash -d 10.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 127.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 169.254.0.0/16 -j RETURN
iptables -t nat -A clash -d 172.16.0.0/12 -j RETURN
iptables -t nat -A clash -d 192.168.0.0/16 -j RETURN
iptables -t nat -A clash -d 224.0.0.0/4 -j RETURN
iptables -t nat -A clash -d 240.0.0.0/4 -j RETURN

# 其余请求重定向至 clash 端口
iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7891
+ +

/etc/dnsmasq.conf 中将默认网关和默认 DNS 服务器设为本机,例如:

+
1
2
3
4
interface=wlx1cbfceb110dc
dhcp-range=192.168.22.100,192.168.22.200,255.255.255.0,24h
dhcp-option=3,192.168.22.1
dhcp-option=6,192.168.22.1
+ +

如上,连入树莓派网络即可走代理访问。

+

回环问题

Clash 做透明代理时访问对应端口会产生回环,有时候这个问题会莫名其妙地出现。

+

解决尝试一

解决方案:https://github.com/Dreamacro/clash/issues/425#issuecomment-566982655

+
1
2
3
4
iptables -A INPUT -p tcp -m tcp --dport 7891 -m connmark ! --mark 500 -j REJECT
...
iptables -A CLASH -p tcp -j CONNMARK --set-mark 500
iptables -A CLASH -p tcp -j REDIRECT --to-ports 7891
+ +

解决尝试二

似乎去除 udp 相关 iptables 可以解决,已将上面的配置文件更新,有待观察。UPD:未解决

+

解决尝试三

似乎改端口可能解决,有待观察。

+

Update 2022.02.15:暂时还没有遇到问题。

+

文件存储服务器

USB 移动硬盘

硬盘处理:使用 DiskGenius 软件将硬盘分区为 ext4。

+

插入硬盘,sudo fdisk -l 查看硬盘设备号,如 /dev/sda1

+

sudo mount /dev/sda1 /data 进行挂载,挂载完后可通过 df -hT 查看空间使用情况。

+

永久挂载:在 /etc/fstab 中加入:

+
1
/dev/sda1       /data           ext4    defaults          0      0
+ +

sudo mount -a 检查是否有问题。

+

重要:为了防止关机时直接对硬盘断电损伤硬盘,参考如下设置(似乎只对 shutdown 后手动重启有用,reboot 没用):https://iovxw.net/p/park-external-hdd/

+

SMB 服务器

(已弃用)使用 Openwrt 的 SMB 服务,在 网络存储->网络共享 里设置共享目录,在 网络存储->挂载 SMB 网络共享 里开启 SMB 服务。

+

直接在树莓派原系统内开设 Samba 服务器:https://zhuanlan.zhihu.com/p/266495858

+

testparm –v 检查 smb.conf 配置是否正确。

+

rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384) 的解决方法:https://ixnfo.com/en/samba-warning-solution-rlimit_max-increasing-rlimit_max-1024-to-minimum-windows-limit-16384.html

+

Aria2 下载机

新建用户:sudo adduser aria2 并进行相关用户组设定。

+

https://li-aaron.github.io/2019/01/aira2-on-raspberry/ ,将命令和配置文件中的 ~ 都换为绝对路径。

+

配置文件参考:http://ivo-wang.github.io/2019/04/18/%E5%85%B3%E4%BA%8Earia2%E6%9C%80%E5%AE%8C%E6%95%B4%E7%9A%84%E4%B8%80%E7%AF%87/

+

Update 2021.09.27:现在使用的是 Aria2 Pro

+

MC 服务器配置

MC1.16 及以前 && Ubuntu

依照 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports/ 换源,sudo apt update (或sudo apt-get full-upgrade)进行更新。

+

sudo apt install openjdk-8-jre-headless 安装 java8

+

于是直接按照正常 Ubuntu 情况配置 MC 服务器即可。

+

MC1.17 && Raspberry OS 64it

截至 2021.08.06openjdk-16debian 下只有 unstable(sid) 版,所以需要一些额外的配置来安装。

+

参考:https://packages.debian.org/sid/arm64/openjdk-16-jdk/download

+

/etc/apt/sources.list 中添加 deb http://ftp.de.debian.org/debian sid main (用完后记得注释掉)。

+

执行 sudo apt install openjdk-16-jre-headless 安装 java16

+

MC服务器的剩余步骤照常,可参考:https://blog.csdn.net/qq_36290650/article/details/106978441

+

同步照片

Lomorage (已弃用)

使用 Lomorage,使用 apt 安装。

+

文档:https://docs.lomorage.com/zh/docs/Installation/lomorage-service/installation-raspbian/

+

apt 安装后来出现了一些依赖问题,且 APP 实在有些丑,于是弃用。

+

Syncthing

syncthing

+

安卓客户端:https://github.com/syncthing/syncthing-android

+

安卓客户端增强版:https://github.com/catfriend1/syncthing-android

+

sudo apt install syncthing 安装,sudo systemctl enable syncthing@pi.service 启动服务。

+

apt 安装的版本过于老旧,需要从 github 上下载最新版本,扔到 /usr/bin/ 里替换掉。

+

可以在云服务器上搭建发现服务器和中继服务器。

+

功能杂项

同步百度云

使用 bypy

+

给装在树莓派上的 TF 卡续命

参考:https://raspberrypi.stackexchange.com/questions/169/how-can-i-extend-the-life-of-my-sd-card

+

省电

USB供电控制

USB 硬盘使用 udisksctl 安全移除,USB 端口使用 uhubctl 断电。

+

udisksctl: sudo apt install udisks2

+

uhubctl: https://github.com/mvp/uhubctl

+
usb-down.sh
1
2
3
4
5
6
7
8
9
10
#!/bin/sh

udisksctl unmount -b /dev/sda1 # 将硬盘卸载
udisksctl power-off -b /dev/sda # 将硬盘数据断电,表现为硬盘停转
systemctl stop hostapd.service # 将网卡的 AP 服务停止

sleep 2 # 延迟一会儿防止服务未关闭

uhubctl -l 2 -a off # 关闭USB电源
# 由于只有当四个USB端口都关闭时才会断电,索性直接全部断了
+ +
usb-up.sh
1
2
3
4
5
6
7
8
#!/bin/sh

uhubctl -l 2 -a on # 打开USB电源

sleep 5 # 延迟一会儿等待USB设备识别

mount -a # 恢复硬盘挂载
systemctl start hostapd.service # 开启 AP 服务
+ +

其它

https://www.raspberrypi.org/forums/viewtopic.php?t=257144

+

https://learn.pi-supply.com/make/how-to-save-power-on-your-raspberry-pi/

+

可以参考上面关闭 HDMI,LED 等。

+

相机

参考:https://www.raspberrypi.org/forums/viewtopic.php?t=285868

+

vcgencmd get_camera 检查相机是否开启。

+

sudo modprobe bcm2835-v4l2

+

vcgencmd

参考:

+ +

DDNS

使用 Cloudflare 的 DNS 托管。

+

参考:https://blog.wardchan.com/posts/use-ddclient-to-automatically-update-cloudflare-dns-record.html

+

备份

额外购置了一张与原来同款的 32G TF 卡,本来打算升级/重装系统和网卡驱动,但是驱动上遇到了稳定性问题,就懒得重装系统了,于是当作备份卡吧。

+

创建镜像备份法

使用 win32diskimager,把 TF 卡插到电脑上,可以生成整个卡的镜像文件。

+

接着使用 PiShrink 裁剪镜像。需要使用 Linux, WSL 实测没问题。

+

在线拷卡备份法

使用 rpi-clone,可以进行增量备份,适合使用另一张卡定期备份。

+
1
2
3
git clone https://github.com/billw2/rpi-clone.git
cd rpi-clone
sudo cp rpi-clone /usr/local/bin/
+ +

安装完成后,sudo fdisk -l 找到 USB 口上的备份卡,如 /dev/sdc 然后 sudo rpi-clone /dev/sdc 即可进行增量备份。

+

UART 与蓝牙

树莓派与 UPS 间的通讯使用 UART 串口通信。

+

参考:https://zhuanlan.zhihu.com/p/106904186

+
+

本文介绍在Raspberry Pi 3、3+,4和Raspberry Pi Zero W上配置串行端口。
上述的几种树莓派包含两个可用于串行通信的UART控制器,也就是常说的串口:mini UART和PL011 UART。默认情况下,mini UART映射到40引脚GPIO连接器的TXD(GPIO 14)和RXD(GPIO 15)上,PL011 UART用于蓝牙模块​​,但是任何一个模块都可以映射到GPIO端口。

+
+

额外参考:

+ +

问题杂项

systemctl status 不显示内存占用

https://dmesg.app/systemd-accounting.html (似乎还是不行)

+

VsCode 远程连接

出现 command: '_workbench.downloadResource' failed 错误。

+

解决方法:本地的梯子(远程端不需要梯子)开成全局代理。

+

在使用充电宝/UPS单独供电时,通过AP满负荷读写移动硬盘可能导致USB接口掉电

换用电源供电暂未发现问题。

+

Update 2021.09.11: 换用电源供电也会出现问题,于是加了一个带独立供电的 USB 拓展坞,由于手头只有一个 USB2.0 的拓展坞,所以只将无线网卡接到拓展坞上,实测减轻了约 0.3A 的树莓派 USB 负载,是否可以有效防止掉盘还待检验。

+

硬盘维护

fsck -f /dev/sda1 检查文件系统。

+

fsck -c /dev/sda1 扫描。

+

sudo smartctl -a /dev/sda 查看 S.M.A.R.T. 信息。

+

使用 smartctl 进行硬盘测试。

+

修复:https://www.smartmontools.org/wiki/BadBlockHowto

+
作者

Centaurus99

发布于

2021-07-11

更新于

2022-09-06


评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/2021/07/11/\343\200\220\350\241\245\346\241\243\343\200\221\346\240\221\350\216\223\346\264\276\346\212\230\350\205\276\350\256\260\345\275\225/raspberry-pi-foundation-vector-logo.svg" "b/2021/07/11/\343\200\220\350\241\245\346\241\243\343\200\221\346\240\221\350\216\223\346\264\276\346\212\230\350\205\276\350\256\260\345\275\225/raspberry-pi-foundation-vector-logo.svg" new file mode 100644 index 0000000..4cd1543 --- /dev/null +++ "b/2021/07/11/\343\200\220\350\241\245\346\241\243\343\200\221\346\240\221\350\216\223\346\264\276\346\212\230\350\205\276\350\256\260\345\275\225/raspberry-pi-foundation-vector-logo.svg" @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2022/01/14/Hexo\345\215\232\345\256\242\346\236\266\350\256\276\346\227\245\350\256\260/2022-01-14-21-07-56.png" "b/2022/01/14/Hexo\345\215\232\345\256\242\346\236\266\350\256\276\346\227\245\350\256\260/2022-01-14-21-07-56.png" new file mode 100644 index 0000000..2ba0baa Binary files /dev/null and "b/2022/01/14/Hexo\345\215\232\345\256\242\346\236\266\350\256\276\346\227\245\350\256\260/2022-01-14-21-07-56.png" differ diff --git "a/2022/01/14/Hexo\345\215\232\345\256\242\346\236\266\350\256\276\346\227\245\350\256\260/hexo-logo.svg" "b/2022/01/14/Hexo\345\215\232\345\256\242\346\236\266\350\256\276\346\227\245\350\256\260/hexo-logo.svg" new file mode 100644 index 0000000..1e23466 --- /dev/null +++ "b/2022/01/14/Hexo\345\215\232\345\256\242\346\236\266\350\256\276\346\227\245\350\256\260/hexo-logo.svg" @@ -0,0 +1,8 @@ + + + + + + diff --git "a/2022/01/14/Hexo\345\215\232\345\256\242\346\236\266\350\256\276\346\227\245\350\256\260/index.html" "b/2022/01/14/Hexo\345\215\232\345\256\242\346\236\266\350\256\276\346\227\245\350\256\260/index.html" new file mode 100644 index 0000000..d62ac52 --- /dev/null +++ "b/2022/01/14/Hexo\345\215\232\345\256\242\346\236\266\350\256\276\346\227\245\350\256\260/index.html" @@ -0,0 +1,130 @@ + +Hexo博客架设日记 - Centaurus99 的杂物堆

Hexo博客架设日记

好久之前就想把博客搭起来的来着,结果一直咕到了现在,终于有空来搭啦 ✿✿ヽ(°▽°)ノ✿

+

博客使用 Hexo 搭建,博客源码位于 https://github.com/Centaurus99/centaurus99.github.iomaster 分支,静态页面同步部署于 gh-pages 分支和个人 VPS 上。

+ + +

下面是搭建(踩坑)记录~ 其实是搭完后的回忆

+

Hexo 安装

对着官方文档搞,没啥好说 QWQ。

+

先装 nodejs,我这儿装的版本是 v16.13.2

+

然后 npm install -g hexo-cli

+

最后到博客文件夹下 hexo init,然后 npm install,完成!

+

GitHub Pages 的自动部署

关于如何使用 Hexo 写博客之类的官方文档里都有介绍,这儿就记录一点自动化部署的设置吧。

+

为了方便管理,我这儿将博客源码和部署后的静态页面放在了同一个库中,下面的配置以我的配置为例。

+

为了使用 用户名.github.io 访问,需要创建名为 用户名.github.io 的存储库。

+

配置 Hexo

首先配置运行 hexo deploy 时的部署方式。

+

先安装 Git 部署插件:

+
1
npm install hexo-deployer-git --save
+ +

然后在 _config.yml 中修改配置:

+
1
2
3
4
deploy:
type: git
repository: git@github.com:Centaurus99/centaurus99.github.io.git
branch: gh-pages
+ +

这样然后运行:

+
1
2
hexo generate
hexo deploy
+ +

应该就能在仓库的对应分支看到部署好的静态页面啦~

+

在仓库的 Settings > Pages 中将 Source 设为 gh-pages 分支,然后就可以通过 用户名.github.io 访问到博客了。

+

如果以后还要拓展部署方式,还可以继续往配置里面添加,如果用到了再来更新~

+

配置 Github Actions

Github Actions 是个好东西,搞自动工作流非常方便,白嫖真香!

+ + +

这个部分基本是参照大佬的博客完成的,参见:https://tommy.net.cn/2020/08/06/deploy-hexo-with-github-actions/

+

仅对配置文件做了一点更新和修改,最终如下:

+

2022-01-15 更新:由于将主题以子模块的形式加入版本控制,添加了 submodules: 'recursive' 表示递归检出子模块

+

2022-09-02 更新:添加环境变量 TZ: Asia/Shanghai 设定时区,确保本地和远端生成的日期路径相同

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
name: Hexo Deploy

on:
push:
branches:
- master

env:
TZ: Asia/Shanghai

jobs:
build:
runs-on: ubuntu-latest
if: github.event.repository.owner.id == github.event.sender.id

steps:
- name: Checkout source
uses: actions/checkout@v2
with:
ref: master
submodules: 'recursive'

- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: '16'

- name: Setup Hexo
env:
ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.email "1102569568@qq.com"
git config --global user.name "Centaurus99"
npm install hexo-cli -g
npm install

- name: Hexo deploy
run: |
hexo clean
hexo deploy
+ +

这样,当我更新博客源码时,Github 就会帮我自动部署好静态页面啦。

+

配置 Webhooks

手头还有一台 VPS,还是打算把它作为博客的服务器。

+

Github 上有个功能叫 Webhooks,可以在你的库发生一些动作(比如有人 push 东西上来)的时候对着一个网址发个请求。利用这个就可以在更新时通知我的 VPS 去 pull 最新的静态分支,从而实现自动部署了。

+

关于 Web 服务器的搭建,Nginx 的使用这里就不记录了。 摆烂咯!

+

Webhooks 的使用也是学习大佬的博客,参见:https://maphical.cn/2020/03/build-blog-using-hexo/

+

在部署这个的过程中遇到了一堆奇奇怪怪的问题,由于时间久远了记不太清了,这里就不做记录了。 摆烂咯!×2

+

依稀记得一点点,比如脚本跑不起来考虑是 php 用户权限问题,最终通过给予它运行 git 命令的 sudo 权限解决;git pull 每次在更新的时候都需要处理冲突问题,原因是上面那个 git 部署工具每次会将这个分支完全覆盖,包括历史 commit 都会被删除,所以在一开始选择 pull 方式的时候要选择 rebase。

+

由于我把博客源码和静态页面放在了同一个存储库内,这会导致 Webhooks 每次更新会被激活两遍(两个分支的更新各激活一遍),不过问题不大。

+

总结

关于博客的配置文件 _config.yml 可以在我的 Github 对于仓库找到。

+

这样就完成了博客的自动化部署的配置,下一篇博客将记录配置主题的吐血过程。

+

参考

+
作者

Centaurus99

发布于

2022-01-14

更新于

2022-09-02


评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/2022-02-07-21-53-27.png" "b/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/2022-02-07-21-53-27.png" new file mode 100644 index 0000000..844da05 Binary files /dev/null and "b/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/2022-02-07-21-53-27.png" differ diff --git "a/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/2022-02-07-22-44-49.png" "b/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/2022-02-07-22-44-49.png" new file mode 100644 index 0000000..6aec87f Binary files /dev/null and "b/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/2022-02-07-22-44-49.png" differ diff --git "a/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/2022-02-07-22-44-54.png" "b/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/2022-02-07-22-44-54.png" new file mode 100644 index 0000000..175389b Binary files /dev/null and "b/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/2022-02-07-22-44-54.png" differ diff --git "a/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/icarus-logo.svg" "b/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/icarus-logo.svg" new file mode 100644 index 0000000..cb6a8e9 --- /dev/null +++ "b/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/icarus-logo.svg" @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git "a/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/index.html" "b/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/index.html" new file mode 100644 index 0000000..df9cdc2 --- /dev/null +++ "b/2022/01/15/Icarus\344\270\273\351\242\230\351\205\215\347\275\256\346\227\245\350\256\260/index.html" @@ -0,0 +1,194 @@ + +Icarus主题配置日记 - Centaurus99 的杂物堆

Icarus主题配置日记

不知怎么发现了 Icarus 这个主题,看起来不错,尝试改一改换上。

+

为了方便自定义,采用源码安装的形式。其实踩了遍直接 npm 安装的坑

+

本篇博客将和我自定义后的主题 Icarus个人修改版 保持同步更新~

+ + +

Icarus 安装

配置 Hexo

截至 2022-01-15,Icarus 还没有官方支持 Hexo 6.0.0,所以如果在这个时间点使用默认方式安装 Hexo 并装上了 6.0.0 版本的话,大概需要手动降级。

+

Updated 2022-01-16:Icarus 已有支持 Hexo 6.0.0 的预发布版本。

+

我是将 package.json 中将 Hexo 的版本从 6.0.0 改为了 5.4.0,然后 npm update

+

然后在 _config.yml 中将主题改为 Icarus

+
1
theme: icarus
+ +

可以选择将不用的默认主题 hexo-theme-landscape 卸载掉

+

安装 Icarus

为了方便对主题单独进行管理,我先将主题 Fork 一份到自己的 Github 上,即 Icarus个人修改版,然后通过 git 子模块进入到博客中来。

+

在博客根目录下使用如下命令:

+
1
git submodule add https://github.com/Centaurus99/hexo-theme-icarus.git themes/icarus
+ +

这样,即使到一台新设备上,也只需要在 clone 之后在项目目录下多一步 git submodule update --init,就能获取到主题了。

+

此时直接开始运行会发现缺少依赖,手动安装一下即可(直接 npm 安装也可能会遇到这个问题,参考 Issue#855)。

+
1
npm install --save bulma-stylus@0.8.0 hexo-renderer-inferno@^0.1.3
+ +

配置 Icarus 主题

themes/icarus/ 下没有配置文件的前提下(如果有就删了),可以先运行一下 hexo server ,会在博客根目录下自动生成 _config.icarus.yml 配置文件,在这里配置而不是主题目录下配置即可保持主题源码不含个人配置文件。

+

接着就可以对着 官方文档 配置自己的主题啦。

+

一些个性化的东西这里就不做记录了,记录一些功能的配置过程。

+

关于显示更新时间问题

这实际是不是主题配置相关内容,只是记录一下,如果使用 Git 管理博客源码,记得把 _config.yml 中的 updated_option 改为 'date',这样显示的更新时间是由博客 Front-matter 标记中的 updated 决定的,而不是由文件修改时间决定。

+

使用二次开发后的主题

这里发现有个大佬对主题做了很多不错的修改 大佬博客,可以提个 PR 到自己这儿来使用。源码

+

这个代码直接使用可能会因为编码规范问题不通过 Code Linting 检查,npm run lint 可以查看问题,可以临时在 package.json 中的 scripts > lint 对应的命令里添加 –fix 尝试自动修复,剩下的问题就要手动修复了。

+

评论插件

由于 Gitalk 请求的账户权限太高,又不想使用依托于其他第三方服务的评论插件,同时 Valine 又有着安全问题,Isso 又感觉较为简陋,所以最终选择了 Waline 评论插件。正好手头上有个 VPS,可以自建评论服务器。

+

twikoo 也是一个很不错的评论插件,不过由于不支持独立部署(imaegoo/twikoo#163)以及外观上更喜欢 Waline 的缘故,最终还是选择了 Waline

+

客户端配置

参考 Icarus评论插件文档,只需要在 _config.icarus.yml 中修改评论插件配置就可以啦。

+
1
2
3
comment:
type: waline
server_url: 服务端地址
+ +

服务端配置

目前本博客的评论服务器为自建服务器,参考 官方文档 搭建,以下为搭建过程记录(方便重建的时候过来直接 copy)。

+
> 创建对应用户

以下过程可能需要 sudo 权限,并非必须步骤。

+

新建一个无法直接登录的用户用于运行 waline 服务:

+
1
sudo adduser waline --disabled-login --disabled-password
+ +

切换到该用户:

+
1
sudo su - waline
+ +

使用 npm 安装 waline

+
1
npm install @waline/vercel
+ +
> 配置 MySQL 数据库

参考 大佬博客

+
1
2
3
4
5
6
7
8
9
10
11
--创建新的数据库,并设置数据库编码
$ CREATE DATABASE 你的数据库名 DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

--创建新的用户
$ CREATE USER '你的用户名'@'你的服务器IP' IDENTIFIED BY '你的密码';

--把数据库的管理权限给予刚刚创建的MySQL用户
$ GRANT ALL PRIVILEGES ON *.* TO '你的用户名'@'%';

--刷新权限,使用设置生效
$ FLUSH PRIVILEGES;
+ +

执行数据库初始化脚本 waline.sql,可以先登录到对应 MySQL 账户下,然后:

+
1
2
USE 你的数据库名;
SOURCE 脚本文件位置;
+ +
> 配置评论通知

参考 https://waline.js.org/guide/server/notification.html ,这里我只配置了邮件通知,见下面的配置文件。

+
> 配置为服务运行

可以先试一下能否直接运行,先配置环境变量:

+
1
2
3
export MYSQL_DB=你的数据库名
export MYSQL_USER=你的用户名
export MYSQL_PASSWORD=你的密码
+ +

然后尝试运行:

+
1
node node_modules/@waline/vercel/vanilla.js
+ +

如果没啥问题,就可以配置成服务了。

+

编辑文件 /etc/systemd/system/waline.service,如下配置:

+
/etc/systemd/system/waline.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Unit]
Description=Waline Comment Server

[Service]
Type=simple
User=waline
WorkingDirectory=/home/waline
ExecStart=/usr/bin/node /home/waline/node_modules/@waline/vercel/vanilla.js
Environment=MYSQL_DB=你的数据库名
Environment=MYSQL_USER=你的用户名
Environment=MYSQL_PASSWORD=你的密码
Environment=SMTP_SERVICE=SMTP 邮件发送服务提供商
Environment=SMTP_USER=SMTP 邮件发送服务的用户名
Environment=SMTP_PASS=SMTP 邮件发送服务的密码
Environment=SITE_NAME=网站名称
Environment=SITE_URL=网站地址(要去除末尾的'/'
Environment=AUTHOR_EMAIL=博主邮箱
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
+ +

然后使用 sudo systemctl enable --now waline.service 启动并设为开机自启动。

+

之后配置 Web 服务器转发到本地 8360 端口即可。Nginx 里可以这样配置:

+
1
2
3
4
5
6
7
8
9
10
11
12
location / {
proxy_pass http://127.0.0.1:8360/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
# cache
add_header Cache-Control no-cache;
expires 12h;
}
+ +

然后就可以去博客里测试一下了,第一个注册的用户将成为管理员。

+

使用 patch-package 修改第三方模块

主题中使用到的一些模块可能需要修改源码进行个性化,比如 hexo-component-inferno 中没有使用最新的 waline 前端模块,想要手动配置。可以使用 patch-package 来进行易于管理的修改。

+
    +
  • 首先 npm install patch-package 安装

    +
  • +
  • 然后在 node_modules/ 中修改源码

    +
  • +
  • 运行 npx patch-package package-name 生成补丁文件

    +
  • +
  • package.json 中加入执行脚本:

    +
    1
    2
    3
      "scripts": {
    + "postinstall": "npx patch-package"
    },
  • +
+

这样之后就可以在 npm install 时自动打上个性化补丁了。

+

暗黑主题

参考:https://github.com/ppoffice/hexo-theme-icarus/issues/564

+

Waline 评论插件中代码高亮样式问题

如图:

+
+ +

研究一番后发现, Waline 使用 Prism 进行代码高亮,它会直接对代码的不同高亮的部分赋上不同的类,这个类名不会使用 namespace 进行保护(加个前缀啥的),这样的类名有 tag , number 等等。

+

比如上图代码中的 html 标签 <head> 会格式化为:

+
1
2
3
4
5
6
7
<span class="token tag">
<span class="token tag">
<span class="token punctuation">&lt;</span>
head
</span>
<span class="token punctuation">&gt;</span>
</span>
+ +

恰巧的是,Icarus 中使用了 CSS 框架 bulma,对 tag , number 之类的样式进行了设定,这就导致了评论区代码高亮出现问题。

+

PrismIssue#1324 中也提到了该问题并给出了解决方法,但由于评论区的代码高亮是在评论服务端完成的,懒得去改服务端代码了,于是就自定义 CSS 进行覆盖,顺便也解决一下默认情况下评论区中黑色代码块和主题格格不入的问题,适配一下明暗两种主题。commit#974b1c9

+

效果:

+
+
+
+
+ +

参考

+

附录:个性化修改记录

主要记录一下我的主题源码有什么额外的改动。

+
    +
  • a05b870 为解决关于 Code Linting 的问题,对代码格式进行了一些修正。
  • +
  • 248a768 删除了 merge 过来的代码中的个人配置文件。
  • +
  • 229543d 个人信息页面上将 关注我 修改为 关注
  • +
  • e38ae7c 删除了 merge 过来代码中的个人 logo。
  • +
  • 658686a 将黑幕添加到 css 中便于直接使用。
  • +
  • 74416d2 添加暗黑主题,并在后面几个 commit 中进行适配。
  • +
  • 1544bb3 修改了代码块中字体大小。
  • +
  • 974b1c9 适配 Waline 评论插件中代码块的主题风格(包括黑白两种主题)。
  • +
  • 6b5da24 例行同步上游更新。
  • +
  • dcb178c 修复上游更新中引起的纯文字 logo 边角被上层容器覆盖的问题。
  • +
  • 3a3c5e6 修复上游更新中 Waline 评论插件升级至 v2 后 CSS 类开头从 v 改为 wl- 引起的问题。
  • +
+
作者

Centaurus99

发布于

2022-01-15

更新于

2022-08-30


评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/2022/06/21/\344\275\277\347\224\250acme-sh\350\207\252\345\212\250\351\205\215\347\275\256\346\263\233\345\237\237\345\220\215\350\257\201\344\271\246/index.html" "b/2022/06/21/\344\275\277\347\224\250acme-sh\350\207\252\345\212\250\351\205\215\347\275\256\346\263\233\345\237\237\345\220\215\350\257\201\344\271\246/index.html" new file mode 100644 index 0000000..a54d0eb --- /dev/null +++ "b/2022/06/21/\344\275\277\347\224\250acme-sh\350\207\252\345\212\250\351\205\215\347\275\256\346\263\233\345\237\237\345\220\215\350\257\201\344\271\246/index.html" @@ -0,0 +1,99 @@ + +使用acme.sh自动配置泛域名证书 - Centaurus99 的杂物堆

使用acme.sh自动配置泛域名证书

一年前用学生邮箱白嫖的域名要到期了,于是换了个便宜的 .top 域名,正好之前忘了记录自动签证书的过程了,这里记录一下以后再换域名的时候直接来抄。

+

由于同时有很多子域名在用,于是决定申请泛域名证书,共用同一个。

+

主要参考 官方文档 ,记录了仅适用于我个人的配置过程。

+ + +

安装 acme.sh

1
curl  https://get.acme.sh | sh -s email=my@example.com
+ +

配置 DNS API

参考 官方文档

+

泛域名证书似乎需要用 DNS 验证,我的 DNS 解析是托管在 Cloudflare 上的,先登录获取 API 密钥,这里我图省事直接用了 Global API Key,然后:

+
1
2
export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Email="xxxx@sss.com"
+ +

生成/安装证书

生成证书:

+
1
acme.sh --issue --dns dns_cf -d centaurus99.top -d *.centaurus99.top
+ +

安装证书:

+
1
acme.sh --install-cert -d centaurus99.top --key-file /etc/v2ray/v2ray.key --fullchain-file /etc/v2ray/v2ray.crt --reloadcmd "sudo nginx -s reload"
+ +

据文档所说,DNS API 使用的变量,生成/安装参数都会被保存用于自动更新,60 天以后证书会自动更新并自动执行安装。下面再去 nginx 里配置证书位置即可。大功告成!

+

附录

1
2
3
root@cc:~/.acme.sh# acme.sh -v
https://github.com/acmesh-official/acme.sh
v3.0.5
+
作者

Centaurus99

发布于

2022-06-21

更新于

2022-06-21


评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/2022/09/02/\344\275\277\347\224\250-Clash-AdGuard-Home-\345\234\250\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\344\270\212\346\220\255\345\273\272\345\271\277\345\221\212\345\261\217\350\224\275\344\270\216\351\200\217\346\230\216\344\273\243\347\220\206\346\234\215\345\212\241\345\231\250/index.html" "b/2022/09/02/\344\275\277\347\224\250-Clash-AdGuard-Home-\345\234\250\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\344\270\212\346\220\255\345\273\272\345\271\277\345\221\212\345\261\217\350\224\275\344\270\216\351\200\217\346\230\216\344\273\243\347\220\206\346\234\215\345\212\241\345\231\250/index.html" new file mode 100644 index 0000000..29280f7 --- /dev/null +++ "b/2022/09/02/\344\275\277\347\224\250-Clash-AdGuard-Home-\345\234\250\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\344\270\212\346\220\255\345\273\272\345\271\277\345\221\212\345\261\217\350\224\275\344\270\216\351\200\217\346\230\216\344\273\243\347\220\206\346\234\215\345\212\241\345\231\250/index.html" @@ -0,0 +1,95 @@ + +使用 Clash + AdGuard Home 在树莓派软路由上搭建广告屏蔽与透明代理服务器 - Centaurus99 的杂物堆

使用 Clash + AdGuard Home 在树莓派软路由上搭建广告屏蔽与透明代理服务器

之前 【补档】树莓派折腾记录 中也记录过了相关内容,但是一年过来有些地方有些变动与改进,故单开一篇重新记录并长期更新。

+ + +

配置 Clash 进行透明代理

TODO

+

配置 AdGuard Home 进行广告屏蔽

TODO

+

防火墙

作为一个挂在公网下 7×24h 运行的网关服务器,进行一定的防火墙配置是必不可少的。这里主要通过 iptables 和 ip6tables 实现。

+

由于使用了 iptables-persistent 进行 iptables 规则可持久化,方便起见下面就直接把保存的规则文件贴上来了。

+

IPv4

/etc/iptables/rules.v4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
*filter
# INPUT 和 FORWARD 链上默认 DROP 掉
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# 防止外网使用内网 IP 欺骗
-A INPUT -i eth0 -s 192.168.0.0/16 -j DROP

# 允许本机、内网以及已建立的连接通过和转发
-A INPUT -i lo -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -i wlx1cbfceb110dc -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i docker0 -j ACCEPT
-A FORWARD -i wlx1cbfceb110dc -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# 开放外网 SSH, HTTP, HTTPS 连接
-A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT

COMMIT


*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 新建 clash 链
:clash - [0:0]

# 内网 TCP 请求转发给 clash 链
-A PREROUTING -s 192.168.0.0/16 -p tcp -j clash

# 将转发后的包源地址修改为本机地址
-A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE

# 访问本机和内网不经过 clash
-A clash -d 10.0.0.0/8 -j RETURN
-A clash -d 127.0.0.0/8 -j RETURN
-A clash -d 169.254.0.0/16 -j RETURN
-A clash -d 172.16.0.0/12 -j RETURN
-A clash -d 192.168.0.0/16 -j RETURN
-A clash -d 224.0.0.0/4 -j RETURN
-A clash -d 240.0.0.0/4 -j RETURN

# 访问校园网不经过 clash
-A clash -d 59.66.0.0/16 -j RETURN
-A clash -d 101.5.0.0/16 -j RETURN
-A clash -d 101.6.0.0/16 -j RETURN
-A clash -d 118.229.0.0/19 -j RETURN
-A clash -d 166.111.0.0/16 -j RETURN
-A clash -d 183.172.0.0/15 -j RETURN
-A clash -d 202.112.39.2/32 -j RETURN
-A clash -d 219.223.168.0/21 -j RETURN
-A clash -d 219.223.176.0/20 -j RETURN

# 其余请求重定向至 clash 端口
-A clash -p tcp -j REDIRECT --to-ports 7891

COMMIT
+ +

IPv6

参考:https://www.sixxs.net/wiki/IPv6_Firewalling

+

关于为何 DHCPv6 相比 DHCPv4 要额外设置,参考:https://unix.stackexchange.com/questions/452880/what-are-the-essential-iptables-rules-for-ipv6-to-work-properly

+

RFC 4890 给出了针对 ICMPv6 的防火墙配置建议,由于时间有限未能细读与实现。

+

RFC 5095 废除了 Type 0 Routing Headers,防火墙中给予了实现。

+

Updated 2023-05-08: 在之前配置完 IPv6 NAT 网络后,并没有为 IPv6 配置代理。随着 IPv6 的不断推广,部分被墙网站出现了使用本地代理可以访问,透明代理无法访问的情况,包括但不限于 v2ex.com,Youtube 的视频播放等,于是也为 IPv6 配置了代理。原本使用的 Clash Premium 2022.08.26 版本的 IPv6 代理似乎有 bug,需要进行升级。由于想继续使用 AdGuardHome 统计 DNS 查询信息,故需要依赖 Clash 的 redir-host 功能(该功能在 Premium 2023.02.16 版本被弃用),因此选用 Clash Premium 2023.01.29 版本。巧合的是,Premium 2023.01.29 版本将核心版本升级到了 1.13.0,该版本添加了对 IPv6 REDIRECT 的支持(#2473),这让 IPv6 的代理成为了可能。相关改动已同步到下方规则文件中。

+
/etc/iptables/rules.v6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Filter all packets that have RH0 headers. Refer to RFC 5095
-A INPUT -m rt --rt-type 0 -j DROP
-A FORWARD -m rt --rt-type 0 -j DROP
-A OUTPUT -m rt --rt-type 0 -j DROP

# Allow trusted link to INPUT and FORWARD
-A INPUT -i lo -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -i wlx1cbfceb110dc -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i docker0 -j ACCEPT
-A FORWARD -i wlx1cbfceb110dc -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow DHCPv6
-A INPUT -p udp --dport 546 -d fe80::/10 -j ACCEPT

# Allow ICMPv6
-A INPUT -p icmpv6 -j ACCEPT

# Allow some server port
-A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT

COMMIT


*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:clash - [0:0]

# 内网 TCP 请求转发给 clash 链
-A PREROUTING -s fd22:41b7:e060::/64 -p tcp -j clash

# 将转发后的包源地址修改为本机地址
-A POSTROUTING -s fd22:41b7:e060::/64 -o eth0 -j MASQUERADE

# 访问内网和校园网不经过 clash
-A clash -d fd22:41b7:e060::/64 -j RETURN
-A clash -d 2402:f000::/32 -j RETURN

# 其余请求重定向至 clash 端口
-A clash -p tcp -j REDIRECT --to-ports 17891

COMMIT
+

使用 Clash + AdGuard Home 在树莓派软路由上搭建广告屏蔽与透明代理服务器

https://blog.centaurus99.top/2022/09/02/使用-Clash-AdGuard-Home-在树莓派软路由上搭建广告屏蔽与透明代理服务器/

作者

Centaurus99

发布于

2022-09-02

更新于

2023-05-08


评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/2022/09/02/\344\275\277\347\224\250-Clash-AdGuard-Home-\345\234\250\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\344\270\212\346\220\255\345\273\272\345\271\277\345\221\212\345\261\217\350\224\275\344\270\216\351\200\217\346\230\216\344\273\243\347\220\206\346\234\215\345\212\241\345\231\250/raspberry-pi-foundation-vector-logo.svg" "b/2022/09/02/\344\275\277\347\224\250-Clash-AdGuard-Home-\345\234\250\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\344\270\212\346\220\255\345\273\272\345\271\277\345\221\212\345\261\217\350\224\275\344\270\216\351\200\217\346\230\216\344\273\243\347\220\206\346\234\215\345\212\241\345\231\250/raspberry-pi-foundation-vector-logo.svg" new file mode 100644 index 0000000..8cdb0f0 --- /dev/null +++ "b/2022/09/02/\344\275\277\347\224\250-Clash-AdGuard-Home-\345\234\250\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\344\270\212\346\220\255\345\273\272\345\271\277\345\221\212\345\261\217\350\224\275\344\270\216\351\200\217\346\230\216\344\273\243\347\220\206\346\234\215\345\212\241\345\231\250/raspberry-pi-foundation-vector-logo.svg" @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2022/09/02/\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\351\205\215\347\275\256-IPv6-\347\275\221\347\273\234/index.html" "b/2022/09/02/\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\351\205\215\347\275\256-IPv6-\347\275\221\347\273\234/index.html" new file mode 100644 index 0000000..9b2ddc8 --- /dev/null +++ "b/2022/09/02/\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\351\205\215\347\275\256-IPv6-\347\275\221\347\273\234/index.html" @@ -0,0 +1,127 @@ + +树莓派软路由配置 IPv6 网络 - Centaurus99 的杂物堆

树莓派软路由配置 IPv6 网络

树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。

+ + +

网络环境:树莓派有线网卡 eth0 作为 WAN 口连接 IPv4 + IPv6 双栈的校园网,USB 无线网卡 wlx1cbfceb110dc 作为无线 AP 提供局域网,USB 网卡的驱动和 AP 的搭建见 【补档】树莓派折腾记录

+

网桥透传法

由于我的 IPv6 网络并没有透明代理的需求,所以其实在两个网卡间搭个网桥,把树莓派作为二层网络设备(类似交换机)使用即可。主要问题在于限制网桥只走 IPv6 流量,这个使用 ebtables 即可,局域网中的网络设备会联系校园网的网关获取到 IPv6 地址等信息。

+

部署完后才发现,校园网的 IPv6 也是需要登录认证的,所以这样整的话每次联网都需要手动登录,所以最终弃用了 QAQ.

+

主要参考:http://www.xingbin.net/blog_channel8/C/CampusNetwork_IPv6/

+

建立网桥:sudo brctl addbr ipv6br

+

启动网桥:sudo ifconfig ipv6br up

+

只允许 IPv6 数据包通过网桥:sudo ebtables -t broute -A BROUTING -p ! ipv6 -j DROP

+

这一步如果遇到了 RULE_APPEND failed (No such file or directory): rule in chain BROUTING. 之类的错误的话,可能是因为使用了基于 nf_tables 而不是 xtables 的 ebtables,(参见:https://sources.debian.org/src/iptables/1.8.2-4/debian/NEWS/),此时使用 ebtables-legacy 即可。

+

添加 eth0 进入网桥:sudo brctl addif ipv6br eth0

+

添加 wlx1cbfceb110dc 进入网桥:sudo brctl addif ipv6br wlx1cbfceb110dc

+

注意: 建议先设置 ebtables 再添加网卡,否则直接将网卡添加进网桥的话会导致 IPv4 流量都进入网桥,从而无法正常连接以及丢失 SSH 连接。

+

以上配置重启后会消失,需要可持久化的话可以参考 http://blog.yesterday17.cn/post/pi-router/ 中的配置。

+

NAT for IPv6

IPv6 网络中本不应使用 NAT,然而校园网中获得的 IPv6 地址使用 ifconfig 查看是 prefixlen 128 的(或许是由 prefixlen 64 的地址生成的?这块儿我不是很明白),并且对每一个 IP 都会要求身份认证,给连入宿舍局域网中的设备带来了一定的麻烦。于是选择搭建 NAT 网络,共用同一个校园网 IPv6 地址。

+

局域网中使用唯一本地 IPv6 单播地址 (ULA, Unique Local IPv6 Unicast Address, RFC 4193),要求拥有固定前缀 fd00::/8,然后是 40 位随机 Global ID(关于随机的必要性见:https://blogs.infoblox.com/ipv6-coe/3-ways-to-ruin-your-future-network-with-ipv6-unique-local-addresses-part-2-of-2/)。然而为了手打地址方便,我还是使用了有某种实际意义的地址:fd22:41b7:e060::/64至少没用全零

+

首先开启 IPv6 内核转发,编辑 /etc/sysctl.conf

+
/etc/sysctl.conf
1
2
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.accept_ra=2
+ +

关于 accept_ra 的设置参考:https://sysctl-explorer.net/net/ipv6/accept_ra/,大概是因为开启转发后会自动关闭 Accept Router Advertisements,设置值为 2 可以强制开启。

+

接着使用 dhcpcd 配置内网无线 AP 网卡的固定静态地址,在 /etc/dhcpcd.conf 中添加 static ip6_address,编辑后如下:

+
/etc/dhcpcd.conf
1
2
3
4
interface wlx1cbfceb110dc
static ip_address=192.168.22.1/24
static ip6_address=fd22:41b7:e060::/64
nohook wpa_supplicant
+ +

重启 dhcpcd 生效:sudo systemctl restart dhcpcd.service

+

然后使用 dnsmasq 配置地址分配相关服务,这里在内网同时开启 SLAAC 和 DHCPv6,编辑 /etc/dnsmasq.conf 后如下:

+
/etc/dnsmasq.conf
1
2
3
4
5
6
7
8
interface=wlx1cbfceb110dc
dhcp-range=192.168.22.100,192.168.22.200,255.255.255.0,24h
dhcp-range=fd22:41b7:e060::1,fd22:41b7:e060::fe,slaac,1h
dhcp-option=3,192.168.22.1
dhcp-option=6,192.168.22.1
dhcp-option=option6:dns-server,[fd22:41b7:e060::]
enable-ra
dhcp-authoritative
+ +

重启 dnsmasq 生效:sudo systemctl restart dnsmasq.service

+

再通过 ip6tables 在 POSTROUTING 链上做一个 SNAT 即可:

+
1
sudo ip6tables -t nat -A POSTROUTING -s fd22:41b7:e060::/64 -o eth0 -j MASQUERADE
+ +

上面配置了树莓派为 DNS 服务器,树莓派使用 Clash 和 Adguard Home 搭建 IPv4 与 IPv6 双栈 DNS 服务,上游服务器也均为双栈 DNS 服务器,重连设备获取 IP 后即可正常使用了。

+

如果要指定 DNS 服务器可以在 dnsmasq 中类似配置,以 TUNA DNS666 服务器为例:dhcp-option=option6:dns-server,[2001:da8::666]

+

配置的 SLAAC 支持使 Android 手机也能正常使用 IPv6 服务。

+

经测试,内网设备使用 IPv6 单栈也可以正常访问双栈或 IPv6 单栈网页。

+

一些测试网站

+

参考

+
作者

Centaurus99

发布于

2022-09-02

更新于

2022-09-03


评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/2022/09/02/\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\351\205\215\347\275\256-IPv6-\347\275\221\347\273\234/raspberry-pi-foundation-vector-logo.svg" "b/2022/09/02/\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\351\205\215\347\275\256-IPv6-\347\275\221\347\273\234/raspberry-pi-foundation-vector-logo.svg" new file mode 100644 index 0000000..8cdb0f0 --- /dev/null +++ "b/2022/09/02/\346\240\221\350\216\223\346\264\276\350\275\257\350\267\257\347\224\261\351\205\215\347\275\256-IPv6-\347\275\221\347\273\234/raspberry-pi-foundation-vector-logo.svg" @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2022/09/07/\344\275\277\347\224\250\346\240\221\350\216\223\346\264\276\345\222\214\345\260\217\347\261\263\350\223\235\347\211\231\346\270\251\346\271\277\345\272\246\350\256\241\345\217\257\350\247\206\345\214\226\345\256\277\350\210\215\346\270\251\346\271\277\345\272\246\345\217\230\345\214\226/index.html" "b/2022/09/07/\344\275\277\347\224\250\346\240\221\350\216\223\346\264\276\345\222\214\345\260\217\347\261\263\350\223\235\347\211\231\346\270\251\346\271\277\345\272\246\350\256\241\345\217\257\350\247\206\345\214\226\345\256\277\350\210\215\346\270\251\346\271\277\345\272\246\345\217\230\345\214\226/index.html" new file mode 100644 index 0000000..f3f44f3 --- /dev/null +++ "b/2022/09/07/\344\275\277\347\224\250\346\240\221\350\216\223\346\264\276\345\222\214\345\260\217\347\261\263\350\223\235\347\211\231\346\270\251\346\271\277\345\272\246\350\256\241\345\217\257\350\247\206\345\214\226\345\256\277\350\210\215\346\270\251\346\271\277\345\272\246\345\217\230\345\214\226/index.html" @@ -0,0 +1,119 @@ + +使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化 - Centaurus99 的杂物堆

使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化

最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,https://pvvx.github.io/ATC_MiThermometer/),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。

+

最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。

+ + +

刷入定制固件

参考:

+ +

使用 https://github.com/pvvx/ATC_MiThermometer 中的定制固件,老外非常 NB,还写了一套网页直接在线刷固件:https://pvvx.github.io/ATC_MiThermometer/TelinkMiFlasher.html,在仓库中查看使用说明即可。

+

刷入定制固件后开启小米蓝牙温湿度计的蓝牙广播功能,这样树莓派不用连接就能接收温湿度广播数据了。由于周围环境较为可信且刻意调低了发射增益,我没有设置 PIN 码和加密,防止哪天忘了连不上。就是懒了

+

树莓派接收蓝牙广播

参考:使用树莓派定时读取小米温湿度传感器数据并发送到微信

+

也已经有老外编写了完善的接收程序,直接查看仓库中说明使用即可:https://github.com/JsBergbau/MiTemperature2

+

存入 InfluxDB 数据库

安装并配置 InfluxDB 数据库

参考:https://blog.csdn.net/qq_41475058/article/details/108050440

+
1
sudo apt install influxdb influxdb-client
+ +

然后数据库服务器会在 8086 端口上开始监听。似乎需要添加 admin 用户才能开启权限认证,我只需要它能跑起来就行就没管。懒了

+
1
2
3
4
influx  # 默认连接到localhost:8086
show users # 查看所有用户,默认没有
CREATE USER "pi" WITH PASSWORD '******' WITH ALL PRIVILEGES # 创建 pi 用户用于管理数据
create database mi # 创建 mi 数据库用于存放数据
+ +

将广播数据存入

编辑接收程序中的 sendToInflux.sh 如下:

+
sendToInflux.sh
1
curl -i -u "pi:PASSWORD" -XPOST http://127.0.0.1:8086/write?db=mi\&precision=s --data-binary "AquaraBluetoothSensors,sensorname=$2 temperature=$3,calibratedHumidity=$4,voltage=$5,batteryLevel=$6 $7"
+ +

然后 python3 LYWSD03MMC.py --atc --battery --callback sendToInflux.sh 即可开始接受广播数据并存入数据库。

+

此时在数据库中可以看到数据了:

+
1
2
3
use mi # 进入 mi 数据库
show measurements # 查看表,此时应有表 AquaraBluetoothSensors
select * from AquaraBluetoothSensors # 查看表中所有数据
+ +

还可以写个 service 来跑,比如编辑 /etc/systemd/system/MiTemperature.service

+
/etc/systemd/system/MiTemperature.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=MiTemperature advertisements receiver
After=network.target

[Service]
Type=simple
User=pi
Restart=always
RestartSec=5
WorkingDirectory=/home/pi/Git/MiTemperature2
ExecStart=/usr/bin/python3 LYWSD03MMC.py --atc --battery --callback sendToInflux.sh
StandardOutput=file:/home/pi/Git/MiTemperature2/output.log
StandardError=file:/home/pi/Git/MiTemperature2/error.log

[Install]
WantedBy=multi-user.target
+ +

开启服务并开机自启

+
1
2
sudo systemctl start MiTemperature.service
sudo systemctl enable MiTemperature.service
+ +

Grafana 可视化

参考官方说明,使用 apt 安装:https://grafana.com/docs/grafana/v9.0/setup-grafana/installation/debian/#install-from-apt-repository

+
1
2
3
4
5
6
sudo apt install apt-transport-https
sudo apt install wget # 说明中的 software-properties-common 我没装上,好像不影响
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/enterprise/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt-get install grafana-enterprise
+ +

然后编辑 /etc/grafana/grafana.ini 更换服务端口,启动服务:

+
1
2
sudo systemctl start grafana-server.service
sudo systemctl enable grafana-server.service
+ +

最后浏览器访问对应端口上的网页,默认用户名和密码是 admin,然后进行配置即可。Grafana 的功能蛮复杂的,有空可能单独开一篇来记录~

+
作者

Centaurus99

发布于

2022-09-07

更新于

2022-09-07


评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/2022/09/07/\344\275\277\347\224\250\346\240\221\350\216\223\346\264\276\345\222\214\345\260\217\347\261\263\350\223\235\347\211\231\346\270\251\346\271\277\345\272\246\350\256\241\345\217\257\350\247\206\345\214\226\345\256\277\350\210\215\346\270\251\346\271\277\345\272\246\345\217\230\345\214\226/raspberry-pi-foundation-vector-logo.svg" "b/2022/09/07/\344\275\277\347\224\250\346\240\221\350\216\223\346\264\276\345\222\214\345\260\217\347\261\263\350\223\235\347\211\231\346\270\251\346\271\277\345\272\246\350\256\241\345\217\257\350\247\206\345\214\226\345\256\277\350\210\215\346\270\251\346\271\277\345\272\246\345\217\230\345\214\226/raspberry-pi-foundation-vector-logo.svg" new file mode 100644 index 0000000..8cdb0f0 --- /dev/null +++ "b/2022/09/07/\344\275\277\347\224\250\346\240\221\350\216\223\346\264\276\345\222\214\345\260\217\347\261\263\350\223\235\347\211\231\346\270\251\346\271\277\345\272\246\350\256\241\345\217\257\350\247\206\345\214\226\345\256\277\350\210\215\346\270\251\346\271\277\345\272\246\345\217\230\345\214\226/raspberry-pi-foundation-vector-logo.svg" @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2023/06/17/\345\237\272\344\272\216-Proxmox-VE-\347\232\204-All-in-One-\346\234\215\345\212\241\345\231\250\346\220\255\345\273\272/index.html" "b/2023/06/17/\345\237\272\344\272\216-Proxmox-VE-\347\232\204-All-in-One-\346\234\215\345\212\241\345\231\250\346\220\255\345\273\272/index.html" new file mode 100644 index 0000000..05cc3e4 --- /dev/null +++ "b/2023/06/17/\345\237\272\344\272\216-Proxmox-VE-\347\232\204-All-in-One-\346\234\215\345\212\241\345\231\250\346\220\255\345\273\272/index.html" @@ -0,0 +1,492 @@ + +基于 Proxmox VE 的 All in One 服务器搭建 - Centaurus99 的杂物堆

基于 Proxmox VE 的 All in One 服务器搭建

树莓派挂在宿舍当软路由已经两年了,大部分情况下都挺好用,透明代理体验也还算尚可。

+

然而由于使用的 USB 无线网卡驱动支持较差,无线峰值速率只能跑到 200+ Mbps,且不大稳定。并且树莓派性能不高,无法开设一些高负载服务。另外,树莓派作为路由常年开启,需要考虑散热问题,虽然给使用的小风扇写了启停功能,但是启动运转时还是会有一定的噪音,较为恼人。

+ + +

正好快到暑假了,需要开设一台 MC 服务器,于是打算换用一台较高性能的软路由,再配合 Wi-Fi 6 无线路由器作为 AP,提供高速率、高稳定性的有线无线网络接入。

+

整体配置概览

软路由

选用畅网奔腾 8505 软路由,1 大核 + 4 小核,大核的单核性能较高,CPU-Z 单核跑分相比我的笔记本(i5-1135G7)高出约 40%,可以用来开设一些吃单核性能的服务。

+

内存使用了两条光威 8GB DDR4 3200 内存,时序 CL-22-22-22-52。使用 16 GB 内存也主要是为了开设 MC 服务器考虑。

+

存储方面安装了西数 SN570 1T 固态作为系统盘,也暂时承担一部分文件存储功能。

+

作为一台路由器,这台软路由有 6 个 Intel i226-V 2.5G 网卡,即使以后有更多设备需要有线接入,也不一定需要增设交换机。

+

功耗方面,实测待机时输入功率约为 10 W。

+

温度方面,室温 24 度环境下,不加风扇待机时 CPU 约 40 度,NVME 固态约 50 度,软路由表面摸起来较热;加上赠送的 USB 12cm 风扇吹顶部铝制散热片后,待机时 CPU 约 30 度,NVME 固态约 40 度,外壳很凉快。

+

无线 AP

目前廉价的 Wi-Fi 6 路由器均使用千兆有线网口,单口有线速率甚至可能不及无线速率,故考虑需要能和软路由之间做链路聚合提高内网性能。

+

调查后发现,TP-Link 系列的路由器似乎原厂固件就有着端口聚合功能,其子品牌水星也有着相同的功能,且便宜几十元。

+

于是选用水星 X306G 路由器,AX3000 规格,计划只使用其 5G 频段 Wi-Fi 和端口聚合功能,运行在 AP 模式。

+

安装和调试 PVE

安装

参考官方教程或网上教程,一路 next 即可。

+

其中将 ETH5 对应的网卡设为管理口,静态 IP 设为 192.168.22.100(22 网段)。

+

更换内核版本

由于 8505 CPU 是大小核架构,建议使用较新的内核获取大小核调度优化。

+

先换源,参考:https://mirrors.tuna.tsinghua.edu.cn/help/proxmox/,并删除企业源:rm /etc/apt/sources.list.d/pve-install-repo.list

+

apt update 后搜索可用的内核版本,我这儿选择 6.2 版本:apt install pve-kernel-6.2,安装完重启后生效。

+

可以使用 proxmox-boot-tool 管理安装的以及用于启动的 kernel 版本。

+

管理页面添加温度显示

偷懒使用了恩山论坛的脚本,添加了温度,CPU频率,硬盘信息的显示:https://www.right.com.cn/forum/thread-6754687-1-1.html

+

删除 lvm-thin 并扩容 lvm

由于使用单盘搭建 All in One 服务器,计划在 PVE 系统中使用 samba 共享数据文件,因此需要较大的 lvm 空间。同时,由于不需要开大量的虚拟机,也用不到 lvm-thin 的特性。故将 lvm-thin 的空间全部合入 lvm 中。

+

参考:https://foxi.buduanwang.vip/virtualization/pve/1434.html/

+

删除 lvm-thin:lvremove /dev/pve/data

+

扩容 lvm:lvextend -rl +100%FREE /dev/pve/root

+

部署 samba

安装:apt update && apt install samba

+

添加用户:useradd thx

+

将用户添加到 samba:smbpasswd -a thx

+

编辑 samba 配置文件 /etc/samba/smb.conf,添加共享文件夹的配置:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[RaspCloud]
path = /data/RaspCloud
writeable = yes
create mask = 0777
directory mask = 1777
public = yes
guest ok = yes

[PT]
path = /data/PT
writeable = yes
create mask = 0644
directory mask = 1755
public = yes
guest ok = yes

[Private]
path = /data/Private
writeable = yes
create mask = 0644
directory mask = 1755
public = no
guest ok = no
valid users = thx
browseable = yes

[Sync]
path = /data/Sync
writeable = yes
create mask = 0644
directory mask = 1755
public = no
guest ok = no
valid users = thx
browseable = yes
+ +

其中 /data/RaspCloud 为公开共享目录,内部有 read-only 目录通过改变目录所有者来限制 guest 的写入。

+

/data/PT 为公开只读共享目录。

+

/data/Private/data/Sync 为私密目录,使用白名单限制访问用户。

+

如果需要在共享目录中软链接到系统里的其它目录中,则需要在 [global] 段中添加:

+
/etc/samba/smb.conf
1
2
3
4
[global]
follow symlinks = yes
wide links = yes
unix extensions = no
+ +

参考:https://blog.csdn.net/humanking7/article/details/85058471

+

smb.conf 中的配置项可查阅:https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html

+

更改 CPU 电源策略

作为一个桌面服务器,需要考虑到功耗与发热的问题。

+

参考:https://pve.sqlsec.com/4/6/

+
1
2
3
4
5
# 查看支持的 CPU 电源模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

# 查看当前的 CPU 电源模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
电源模式解释说明
performance性能模式,将 CPU 频率固定工作在其支持的较高运行频率上,而不动态调节。
userspace系统将变频策略的决策权交给了用户态应用程序,较为灵活。
powersave省电模式,CPU 会固定工作在其支持的最低运行频率上。
ondemand按需快速动态调整 CPU 频率,没有负载的时候就运行在低频,有负载就高频运行。
conservative与 ondemand 不同,平滑地调整 CPU 频率,频率的升降是渐变式的,稍微缓和一点。
schedutil负载变化回调机制,后面新引入的机制,通过触发 schedutil sugov_update 进行调频动作。
+

安装工具:apt install cpufrequtils

+

设为 ondemand 模式:cpufreq-set -g ondemand

+

无显示器启动问题

发现如果不接显示器,则无法正常启动。初步判断在启动 grub 或之后出现问题。

+

然而,对 BIOS 和 grub 配置文件做各种修改之后也无法解决问题。

+

最终打算网上买个 HDMI 诱骗器插上得了。

+

插上后也没用。

+

经仔细排查(偶然将接地良好的显示器的 Type-C 线的外壳接触到软路由 Type-C 口的外壳上,发现问题就消失了),发现是供电接地问题。

+

先前为了监测功耗,我将电源的 DC 转为了 USB 母口,插上了 USB 电压电流测量设备,再将测量设备的 USB 口转为 DC 口,接到软路由的 DC 供电口。在这个过程中可能丢失了地线。

+

直接接电源就不再有问题。

+

挂载硬盘

再接上一块老机械盘,用来挂 PT。

+

安装好硬盘后,先使用 lsblk -f 或者 ls -l /dev/disk/by-uuid 找到分区的 UUID,使用 UUID 进行挂载可以避免 /dev/ 下设备名的改变导致的挂载问题。

+

然后在 /etc/fstab 中添加挂载信息:

+
/etc/fstab
1
UUID=1f4a2672-3039-594b-808c-a5d3913b0fde /data/hdd ext4 defaults,nofail 0 0
+ +

注意 nofail 用来在硬盘没有成功挂载时也能正常启动,否则启动会等待硬盘挂载,失败后进入 emergency mode。

+

然后 mount -a 生效,开机后也会自动挂载。

+

硬盘维护

缩减数据盘的文件系统预留空间

参考:https://askubuntu.com/questions/249387/df-h-used-space-avail-free-space-is-less-than-the-total-size-of-home

+

默认情况下,df -h 查看硬盘空间会发现,Size 会大于 Used + Avail,如:

+
1
2
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1 294G 261G 19G 94% /data/hdd
+ +

这是由于 ext2/3/4 文件系统默认会保留 5% 的空间只供 root 使用,而数据盘就没这个必要了,可以 tune2fs -m 0 /dev/sda1 来取消预留空间。

+

S.M.A.R.T. 信息

在 WebUI 中,可以在节点的磁盘一栏中查看 S.M.A.R.T. 信息。

+

命令行中,可以使用 smartctl -a /dev/sda 查看。

+

S.M.A.R.T. 信息的解析,可以参考:https://blog.csdn.net/MrSate/article/details/88564764

+

使用 journalctl -u smartmontools.service 可以查看 smartmontools 守护进程的监测日志。

+

配置 smartd 守护程序

还可以在 /etc/smartd.conf 中配置守护程序,初始时配置如下:

+
/etc/smartd.conf
1
DEVICESCAN -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner
+ +

添加如下参数:

+
    +
  • 基于默认修改的监测与报警参数 -H -f -l error -l selftest -C 197 -U 198,相比默认的 -a 参数减少了等效的 -t 参数,否则每半小时都会在日志中输出 S.M.A.R.T. 信息的变化情况(详见 /etc/smartd.conf 中的说明)
  • +
  • 每周六凌晨三点短自检,每月二十号凌晨三点长自检:-s (S/../../6/03/|L/../20/./03)
  • +
  • 监控温度,在温度变化 5 度时记录,达到 40 度时记录,达到 45 度时警告(0 为关闭):-W 5,40,45
  • +
+

修改后如下:

+
/etc/smartd.conf
1
2
3
DEFAULT -H -f -l error -l selftest -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner
/dev/nvme0 -W 0,60,70
DEVICESCAN -C 197 -U 198 -s (S/../../6/03/|L/../20/./03) -W 0,40,50
+ +

重启服务后生效:systemctl restart smartd.service

+

如果守护程序检测到了出现问题,也会给安装 PVE 时填写的邮箱发邮件,实测 QQ 邮箱可以收到。

+

参考:

+ +

配置硬盘休眠

可能需要先关闭 pvestatd 对硬盘的扫描,参考:https://www.ippa.top/954.html

+

ls -l /dev/disk/by-uuid 找到硬盘的 UUID 1f4a2672-3039-594b-808c-a5d3913b0fde,然后编辑 /etc/lvm/lvm.conf,在 global_filter 中添加 "r|/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde.*|",结果如下:

+
/etc/lvm/lvm.conf
1
2
3
devices {
global_filter=["r|/dev/zd.*|", "r|/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde.*|"]
}
+ +

pvestatd restart 后生效。

+

查看硬盘当前状态:smartctl -i -n standby /dev/sda | grep "mode"|awk '{print $4}',ACTIVE 或者 IDLE 都为运转状态。

+

查询当前电源管理参数:hdparm -B /dev/sda

+

进入 standby modehdparm -y /dev/sda

+

进入 sleep modehdparm -Y /dev/sda

+

然后编辑 /etc/hdparm.conf,添加需要休眠的硬盘设置,比如十分钟后 standby 如下配置:

+
/etc/hdparm.conf
1
2
3
4
5
/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde {
apm = 127
acoustic_management = 127
spindown_time = 120
}
+ +

/usr/lib/pm-utils/power.d/95hdparm-apm resume 后生效(参考 man hdparm.conf

+

其中 spindown_time 参考 man hdparm 中的 -S 选项说明来设置。

+

不过我的这块硬盘似乎并不按照设定的 spindown_time 来休眠,于是打算观察一段时间 Load_Cycle_Count 的增长情况来决定是否开启休眠功能。

+

smartctl -a /dev/sda | grep Load_Cycle_Count 即可查看。

+

硬盘无法休眠 Debug

后来又入了两块盘,但是 hdparm -y 之后又会立即唤醒,无法进入休眠状态。

+

诊断方式参考:https://askubuntu.com/questions/1406434/block-dump-reporting-missing-from-ubuntu-22-04

+

监控对 /dev/sda 的使用:blktrace -d /dev/sda -a pc -o - | blkparse -i -

+

然后 hdparm -Y /dev/sda ,查看唤醒磁盘的进程。

+

我这儿结果如下,然而搜索相关资料后并没有获取到有用的信息:

+
1
2
3
4
5
6
7
8
9
8,16   0        1     0.000000000 18871  D   N 0 [hdparm]
8,16 1 1 0.497835738 0 C N [0]
8,16 0 2 1.412267626 168 D R 4 [scsi_eh_1]
8,16 0 3 1.412286261 14 C R [0]
8,16 0 4 1.412293625 18 D R 12 [kworker/0:1]
8,16 0 5 1.412295327 14 C R [0]
8,16 0 6 1.412297439 18 D R 4 [kworker/0:1]
8,16 0 7 1.412298518 14 C R [0]
...
+ +

有可能是 ext4 的 lazy init 导致,参考:https://unix.stackexchange.com/questions/533789/hard-drive-waking-from-sleep-for-no-apparent-reason

+

基于 LXC 安装 OpenWrt

LXC 开销小,故尝试使用 LXC 安装 OpenWrt

+

安装 OpenWrt

安装过程参考:https://virtualizeeverything.com/2022/05/23/setting-openwrt-in-proxmox-lxc/

+

下载地址:https://downloads.openwrt.org/

+

我选择了 20.03.5 版本:https://downloads.openwrt.org/releases/22.03.5/targets/x86/64/

+

下载 rootfs.tar.xz 即可,可以在下载时选择哈希校验。

+

创建容器的 UI 的文档:https://pve.proxmox.com/pve-docs/chapter-pct.html#pct_settings

+

似乎由于 Web 页面无法添加 --ostype unmanaged 参数,需要进入命令行创建:

+
1
pct create 101 /var/lib/vz/template/cache/openwrt-22.03.5-x86-64-rootfs.tar.gz --arch amd64 --hostname RaspCloud --rootfs local:1 --memory 1024 --cores 6 --cpuunits 200 --ostype unmanaged --unprivileged 1
+ +

然后在 Web UI 中添加一个虚拟网卡 veth0,桥接到 PVE 网桥 vmbr0 上,用于 OpenWrt 和 PVE 的交互。

+

此时连接在管理口上的设备便和 OpenWrt 连在同一个网桥上了,就可以通过这个虚拟网卡的地址访问 OpenWrt 了。

+

有可能启动后 veth0 并没被正确配置,可以手动 up 之后使用 IPv6 地址访问。

+

然后到配置文件 /etc/pve/lxc/101.conf 里添加直通网卡,比如:

+
1
2
3
4
lxc.net.0.type: phys
lxc.net.0.link: enp2s0 --- 需要使用的 host 中的网卡名
lxc.net.0.name: eth0 --- LXC 中显示的网卡名
lxc.net.0.flags: up
+ +

需要注意 net.id 的 id 不能和 Web UI 中添加的相同。

+

最终的 conf 文件:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
arch: amd64
cores: 6
cpuunits: 200
hostname: RaspCloud
memory: 1024
net0: name=veth0,bridge=vmbr0,firewall=1,hwaddr=92:81:93:06:8A:7E,type=veth
onboot: 1
ostype: unmanaged
rootfs: local:101/vm-101-disk-1.raw,size=1G
startup: order=1
swap: 512
unprivileged: 1
lxc.net.5.type: phys
lxc.net.5.link: enp2s0
lxc.net.5.name: eth0
lxc.net.5.flags: up
lxc.net.6.type: phys
lxc.net.6.link: enp3s0
lxc.net.6.name: eth1
lxc.net.6.flags: up
lxc.net.7.type: phys
lxc.net.7.link: enp4s0
lxc.net.7.name: eth2
lxc.net.7.flags: up
lxc.net.8.type: phys
lxc.net.8.link: enp5s0
lxc.net.8.name: eth3
lxc.net.8.flags: up
lxc.net.9.type: phys
lxc.net.9.link: enp6s0
lxc.net.9.name: eth4
lxc.net.9.flags: up
+ +

配置 OpenWrt

连接互联网

由于我需要 OpenWrt 通过 PVE 管理口连接电脑,通过电脑将无线网共享给有线网来访问互联网,所以需要先为 veth0 配置一些上网功能。

+

添加 Interface veth0,类型为静态地址,网卡设为 veth0,配置好对应的地址,网关和 DNS 服务器地址即可。

+

之后应该就可以访问网络了。

+

换源

参考:https://mirrors.tuna.tsinghua.edu.cn/help/openwrt/

+

添加中文

1
2
opkg update
opkg install luci-i18n-base-zh-cn
+ +

更改主题

不大喜欢 OpenWrt 的默认主题,换为 Argon

+

下载对应的 ipk:https://github.com/jerrykuku/luci-theme-argon/releases/download/v2.3.1/luci-theme-argon_2.3.1_all.ipk

+

然后安装:

+
1
2
3
opkg install luci-compat
opkg install luci-lib-ipkg
opkg install luci-theme-argon*.ipk
+ +

配置路由功能

启动后,只有 wan 和 wan6 两个 Interface,对应 eth0 网口(device)。

+

计划把其它网口都划入 LAN 中。

+

首先添加网桥设备 br-lan,把网口都加上去。

+

然后添加 lan 接口,使用静态地址,把 br-lan 加上去,配置地址即可。

+

然后发现,似乎 dnsmasq 出现了些问题,无法正常启动。

+

根据 https://github.com/openwrt/openwrt/issues/9064 中的方法,opkg remove procd-ujail 可以解决。

+

dnsmasq 正常后,在接口中配置 DHCP / DNS 的相关配置,然后 lan 口上接的设备就能获取到分配的地址了。

+

校园网只会分配 /128 地址,故 IPv6 也需要做个 NAT。OpenWrt 中 IPv6 默认并不会配置 SNAT,需要做一些手动配置,参考:https://openwrt.org/docs/guide-user/network/ipv6/ipv6.nat6

+

先启用 IPv6 masquerading,其中我这儿的 zone[1] 为 wan 域:

+
1
2
3
uci set firewall.@zone[1].masq6="1"
uci commit firewall
/etc/init.d/firewall restart
+ +

然后关闭 wan6 口的 sourcefilter:

+
1
2
3
uci set network.wan6.sourcefilter="0"
uci commit network
/etc/init.d/network restart
+ +

这样 lan 口上接的设备也能获取到 DHCPv6 分配的 IPv6 地址了,OpenWrt 也会为其提供 NAT6 服务。

+

配置 OpenClash

先卸载 dnsmasq:

+
1
2
opkg remove dnsmasq
mv /etc/config/dhcp /etc/config/dhcp.bak
+ +

再按照发布页的说明,先安装依赖,再下载安装 ipk 即可:https://github.com/vernesong/OpenClash/releases

+

之后按个人喜好配置即可,我选用的是 Meta 核心的 redir-host 模式。

+

可以将校园网网段设为绕过,减少校内网络访问开销:

+

IPv4:

+
1
2
3
4
5
6
7
8
9
59.66.0.0/16
101.5.0.0/16
101.6.0.0/16
118.229.0.0/19
166.111.0.0/16
183.172.0.0/15
202.112.39.2/32
219.223.168.0/21
219.223.176.0/20
+ +

IPv6:

+
1
2402:f000::/32
+ +

或者可以打开 实验性:绕过中国大陆 IP 功能,减少国内网络访问开销。

+

遇上 OpenClash 的一个 bug。(Updated 2023.07.02: 随着 0.45.128 版本的发布,该问题已得到修复)

+

在 LuCI 中,虽然已经关闭了 路由本机代理,但是还是会 nftables 中添加处理 Output 链的规则,见 https://github.com/vernesong/OpenClash/blob/9ee0f02ed7615a62f960c9ee2f951dd1b47e2411/luci-app-openclash/root/etc/init.d/openclash#LL1649C1-L1672C9

+
1
2
3
4
5
6
7
8
if [ "$enable_redirect_dns" != "2" ] || [ "$router_self_proxy" = "1" ]; then
nft 'add chain inet fw4 openclash_output' 2>/dev/null
nft 'flush chain inet fw4 openclash_output' 2>/dev/null
...
nft add rule inet fw4 openclash_output ip protocol tcp skuid != 65534 counter redirect to "$proxy_port" 2>/dev/null
nft 'add chain inet fw4 nat_output { type nat hook output priority -1; }' 2>/dev/null
nft 'add rule inet fw4 nat_output ip protocol tcp counter jump openclash_output' 2>/dev/null
fi
+ +

这里的判断中 上了不使用 Dnsmasq 转发,所以在我的工况下会被启用。暂时未明白为何要这样,故提了 Issue:https://github.com/vernesong/OpenClash/issues/3354

+

两天后作者在 d499374 中修复了该 bug,发布于 0.45.125 版本中,等待合入 master。

+
远程 Wireshark 抓包调试

有时配挂了需要抓包调试,可以使用远程主机上的 tcpdump + Windows 本机上的 wireshark 远程抓包分析。

+

给用户非 root 使用 tcpdump 权限:sudo chmod u+s /usr/sbin/tcpdump

+

然后 Windows 本机执行 ssh ubuntu "tcpdump -i br-lan -l -w - 'port not 22'" | wireshark -k -i - 即可开始抓包。

+

参考:https://thiscute.world/posts/tcpdump-and-wireshark

+
配置 UDP 代理

使用 Redir-Host 兼容模式 + UDP tproxy 转发似乎并不能正常运行,所以还是得使用 TUN 模式。

+

LXC 启用 TUN 需要一点额外的配置,参考 https://forum.proxmox.com/threads/how-to-enable-tun-tap-in-a-lxc-container.25339/,在配置文件中添加如下内容:

+
1
2
lxc.cgroup.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net dev/net none bind,create=dir
+ +

然后选用 Meta 内核,IPv4 和 IPv6 都启用 TUN 模式,即可代理 UDP 流量了。

+

还可以考虑开启 仅允许常用端口流量 来防止不必要的代理。具体地,此处所指的常用端口如下:21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 5222 5228 5229 5230 8080 8443 8880 8888 8889

+

配置校园网认证

使用 GoAuthing

+

新版本的 OpenWrt 配置起来似乎有些不一样的地方,参考 https://github.com/z4yx/GoAuthing/issues/30 进行修改。

+

goauthing@ 脚本放到 /etc/init.d/goauthing 目录下,并 chmod +x

+
/etc/init.d/goauthing
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh /etc/rc.common
# Authenticating utility for auth.tsinghua.edu.cn
# This init script is used explicitly with OpenWRT

USE_PROCD=1
START=96
PROG="/usr/bin/goauthing"
SERV=goauthing # UCI config at /etc/config/goauthing

start_instance() {
local config=$1
local username password
config_get username $config username
config_get password $config password
local args="-u $username -p $password"

sleep 10 # Wait for link up
"$PROG" $args deauth
"$PROG" $args auth
"$PROG" $args login

procd_open_instance
procd_set_param command "$PROG"
procd_append_param command $args online
procd_set_param stderr 1
procd_set_param respawn
procd_close_instance
}

logout() {
local config=$1
local username password
config_get username $config username
config_get password $config password
local args="-u $username -p $password"

"$PROG" $args logout
}

start_service() {
config_load "$SERV"
config_foreach start_instance "$SERV"
}

stop_service() {
config_load "$SERV"
config_foreach logout "$SERV"
}
+ +

其中更改了启动优先级,添加了 sleep 10 来等待 wan 口配置完成,否则会因为无法完成 auth / login 就直接进入 online 守护程序,从而一直无法完成登录认证。

+

然后下载 https://mirrors.tuna.tsinghua.edu.cn/github-release/z4yx/GoAuthing/LatestRelease/auth-thu.linux.x86_64,并移动至脚本中填写的位置(默认为 /usr/bin/goauthing)。

+

然后配置并启动服务:

+
1
2
3
4
5
6
7
8
touch /etc/config/goauthing
uci add goauthing goauthing
uci set goauthing.@goauthing[0].username='<YOUR-TUNET-ACCOUNT-NAME>'
uci set goauthing.@goauthing[0].password='<YOUR-TUNET-PASSWORD>'
uci commit

/etc/init.d/goauthing enable
/etc/init.d/goauthing start
+ +

配置链路聚合 AP

另购置了一台 Wi-Fi 6 无线路由器作为 AP,支持 2x2 MU-MIMO,160 MHz 频宽,理论带宽可达 2402 Mbps。

+

然而,路由器上只有四个千兆口,连接软路由后跑不到这么高。

+

不过,这款路由器支持两个端口链路聚合,故尝试配置一下。

+

首先在路由器上设置两个端口为聚合口,提示:

+
+

端口聚合使用IEEE 802.3ad动态聚合模式,请确保对端设备支持并配置为动态聚合模式。

+
+

然后在 OpenWrt 上安装需要的软件包:opkg install kmod-bonding proto-bonding luci-proto-bonding

+

然后将以下内容添加到 /etc/rc.localexit 0 前:

+
1
2
3
4
5
6
7
8
9
10
ip link add bond-lan type bond mode 802.3ad # 添加 bond 类型的虚拟接口 名称为 bond-lan
ip link set eth3 down
ip link set eth4 down
ip link set eth3 type bond_slave # 配置网卡模式
ip link set eth4 type bond_slave
ip link set eth3 master bond-lan # 加入名称为 bond-lan 的 bond 类型网卡
ip link set eth4 master bond-lan
ip link set bond-lan up # 启动该网卡
ip link set eth3 up
ip link set eth4 up
+ +

eth3eth4 从原来的 br-lan 中移除,添加上 bond-lan 即可。

+

实测无线可以跑到 1.6 Gbps 左右。

+

配置防火墙

官方原版 OpenWrt 默认有一套防火墙策略,简略微调即可。

+

配置端口转发

两种方式,一种是基于 iptables 实现,另一种是使用 socat 来转发。

+
基于 iptables 实现

OpenWrt 默认的端口转发基于 iptables / nftables 实现,然而,配置后发现,在内网无法使用外网地址访问对应端口,初步探索后推测是 NAT 环回时出现问题。

+

于是在 nftables 中进行调试。

+

先新建一个表为符合规则的包启用跟踪调试:

+
1
2
3
nft add table inet trace_debug
nft 'add chain inet trace_debug trace_pre { type filter hook prerouting priority -200000; }'
nft insert rule inet trace_debug trace_pre ip saddr 192.168.22.118 ip daddr ??.??.??.?? limit rate 1/second meta nftrace set 1
+ +

然后 nft monitor trace 就可以跟踪了。

+

跟踪检查后发现,包在 prerouting policy accept 后消失了。

+

一番摸索后发现,当对应网卡(br-lan)开启混杂模式后,就能正常工作了。

+

怀疑是 prerouting 后发现目标地址为本地链路地址,于是就修改了目的 mac 地址,导致非混杂模式的网卡将其丢弃。不过简单搜索后也没找到相关的资料。

+
使用 socat

Updated 2023.06.29: 使用 socat 遇到了一些问题,故弃用:

+
    +
  • 会修改源地址,丢失地址数据
  • +
  • UDP 的转发使用 fork 参数存在线程泄漏问题,似乎每个 UDP 包都会 fork 出一个进程且不释放,导致产生大量进程占满内存
  • +
+

安装:

+
1
2
opkg update
opkg install socat
+ +

然后配置端口转发。

+

例如,配置名为 mc-tcp 的策略,开启,监听本机所有地址的 25565 端口并转发到 192.168.22.3:25565 的配置如下(fork 允许多个连接,reuseaddr 允许 socket 的快速重用,TCP6-LISTEN 也同时监听 IPv4):

+
1
2
3
4
uci set socat.mc-tcp=socat
uci set socat.mc-tcp.enable=1
uci set socat.mc-tcp.SocatOptions='TCP6-LISTEN:25565,fork,reuseaddr TCP:192.168.22.3:25565'
uci commit
+ +

UDP 也类似:

+
1
2
3
4
uci set socat.mc-udp=socat
uci set socat.mc-udp.enable=1
uci set socat.mc-udp.SocatOptions='UDP6-LISTEN:25565,fork,reuseaddr UDP:192.168.22.3:25565'
uci commit
+ +

然后重启 socat 服务即可生效:/etc/init.d/socat restart

+

对外网开放还需在防火墙中允许对应端口的输入。

+

配置 DDNS

我的 DNS 解析提供商为 CloudFlare,故安装 ddns-scripts-cloudflare

+
1
opkg install ddns-scripts-cloudflare luci-i18n-ddns-zh-cn
+ +

安装完成后在 LuCI 中配置即可,没太大难度。IPv4 和 IPv6 地址需要分别配置。

+

配置 AdGuard Home

安装 AdGuard Home:

+
1
2
opkg update
opkg install adguardhome
+ +

在 DHCP/DNS 的高级设置中,将 DNS 服务器端口改为 53 以外的端口,如 5353。

+

然后登入 http://ip:3000 配置 AdGuard Home,将上游 DNS 服务器设为 OpenClash 设置的 DNS 服务地址,并停用 OpenClash 的 DNS 劫持。

+

然后应该就可以开始运作了,再添加屏蔽列表即可。

+

如果需要在 OpenClash 没有正常启动成功的情况下仍可以进行 DNS 服务,则需要设置 fallback DNS 服务器地址。然而目前 AdGuard Home 中并没有这个功能,相关功能 https://github.com/AdguardTeam/AdGuardHome/issues/3701 被设为了 v0.108.0 的目标,希望有生之年能等到 v0.108.0 出来获得这一功能。

+

(也是因为这个原因,校园网的认证脚本需要配置为 OpenClash 启动完成后再进行认证,感觉怪怪的,所以也暂时放弃了 AdGuard Home)

+

配置 WireGuard

安装 WireGuard

+
1
2
opkg update
opkg install luci-i18n-wireguard-zh-cn
+ +

重启后,在添加接口中就可以找到 WireGuard VPN 了,我添加了一个名为 wg0 的接口。

+

作为公网 IP 下供其它端来主动连接的一端,我特殊指定了这个接口的监听端口,并在防火墙中运行了该端口的 UDP 访问。

+

该接口的 IP 地址需要配置为单独的子网,用于各端 VPN 接口间的互相连接。我为其配置了 192.168.23.1/24fd23:41b7:e060::1/64 地址,与 22 网段区别开。

+

为了方便配置,我没有将这个接口划入单独的区域,而是划入了 lan 区域,共享 lan 区域的防火墙配置。

+

然后就可以添加对端了。注意 允许的 IP 的这一项中填写 “对端的隧道 IP 地址和对端经由隧道的网络”,对于对端为非路由设备的情况,这一项只填隧道 IP 地址就行,比如 192.168.23.102/32(/32 可省略),但不能填写 VPN 接口间的网段,即不能填写 192.168.23.102/24

+

各项设置可能需要重启后生效。

+

之后的计划

    +
  • 配置内网 IP 的域名
  • +
  • 配置 MosDNS 优化 DNS 解析(参考:https://rushb.pro/article/router-dns.html
  • +
  • 配置 Grafana 可视化路由运行状态、MosDNS 运行数据等
  • +
  • 配置 UDP 转发以及游戏优化
  • +
+

基于 LXC 的其它功能服务器

其它杂七杂八的服务以及 Docker 就另外开在一个虚拟机上吧。

+

选用 Debian 12 系统,可以直接从 CT 模板中下载。

+

参考 https://pve.proxmox.com/wiki/Unprivileged_LXC_containers#Using_local_directory_bind_mount_points,挂载宿主机的共享目录:pct set 100 -mp0 /host/dir,mp=/container/mount/point

+

似乎直接挂载宿主机中的 /mnt 的话,即使配置完 UID / GID 映射,LXC 容器也并不能正常访问其中宿主机挂载的子目录,可能需要在宿主机 umount 再 mount。所以需要将 mp 指定的目录细化到类似 /mnt/hdd1 这一层。

+

添加一个虚拟网卡 eth0 桥接到 vmbr0 上,IPv4 选择 DHCP 接收 OpenWrt 的地址分发;而如果 IPv6 选择 DHCP 的话,DHCPv6 是不会通告默认路由的,所以建议选择 SLAAC。

+

初始配置

换源,参考:https://mirrors.tuna.tsinghua.edu.cn/help/debian/

+

添加 sudo,先 apt install sudo,再 echo "username ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/username

+

默认下终端可能会有乱码,需要配置 UTF-8 语言,sudo dpkg-reconfigure locales 然后选中 en_US.UTF-8 即可。

+

配置 UID / GID 映射

如果直接挂载目录共享的话,容器内外会视为不同的用户,导致共享文件时有着麻烦的权限问题。不过我们可以通过 lxc.idmap 来将某一容器中的某些用户映射到 Host 中的某些用户。

+

参考:

+ +

以下以映射 102 容器中的 1000 用户为 Host 中的 1000 用户为例:

+

先在 /etc/subuid/etc/subgid 中都添加上 root:1000:1,来允许 root 创建到 1000 用户的映射。

+

然后在 /etc/pve/lxc/102.conf 的配置文件中,添加如下内容:

+
/etc/pve/lxc/102.conf
1
2
3
4
5
6
lxc.idmap: u 0 100000 1000
lxc.idmap: g 0 100000 1000
lxc.idmap: u 1000 1000 1
lxc.idmap: g 1000 1000 1
lxc.idmap: u 1001 101000 64535
lxc.idmap: g 1001 101000 64535
+ +

建议将原来容器内 1000 映射到的 101000 用户还包含在映射范围内,这样容器内的 root 才能够将文件的所有权从原先的转到现在的。

+

安装 Docker

由于并不想在 PVE 中直接装 Docker,故在 Debian 虚拟机中安装 Docker。

+

参考:

+ +

安装:

+
1
2
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
+ +

加入 Docker 用户组,在无 root 权限下使用 Docker:sudo usermod -aG docker $USER

+

验证安装正确性:docker run --rm hello-world

+

如没有方便的网络接入,配置镜像参考:https://yeasy.gitbook.io/docker_practice/install/mirror

+

在 LXC 容器启动后,Docker 会过一两分钟才会启动,暂时不知道原因为何。

+

Docker 启用 IPv6 支持

由于挂的 PT 需要有 IPv6 接入,故需要给 Docker 开启 IPv6。

+

参考:https://docs.docker.com/config/daemon/ipv6/

+

编辑配置文件:

+
/etc/docker/daemon.json
1
2
3
4
{
"experimental": true,
"ip6tables": true
}
+ +

然后重启 Docker:sudo systemctl restart docker

+

启动容器时,需要额外的配置。如果使用 Docker Compose,则添加如下内容,并在对应 service 配置中添加 networks 即可:

+
1
2
3
4
networks:
ip6net:
enable_ipv6: true
subnet: 2001:0DB8::/112
+ +

netstat -tunlp 可以查看监听端口,若对应的端口只有 tcp6 在监听也不用慌张,若 cat /proc/sys/net/ipv6/bindv6only 为 0 则表明已在双栈上监听,参考(https://unix.stackexchange.com/questions/496137/does-80-in-netstat-output-means-only-ipv6-or-ipv6ipv4

+

配置 PT 客户端

使用 linuxserver/transmission Docker 镜像。

+

使用 Docker Compose 来配置容器,按说明编写配置文件:

+
docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
---
version: "2.1"
services:
transmission:
image: lscr.io/linuxserver/transmission:latest
container_name: transmission
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- TRANSMISSION_WEB_HOME=/config/transmission-web-control/src #optional
- USER=thx #optional
- FILE__PASS=/config/password #optional
- WHITELIST= #optional
- PEERPORT= #optional
- HOST_WHITELIST= #optional
volumes:
- /home/thx/Service/transmission/config:/config
- /data/PT:/downloads
- /data/PT/torrentwatch:/watch
- /mnt:/mnt
ports:
- 9091:9091
- 51413:51413
- 51413:51413/udp
restart: unless-stopped
networks:
- ip6net
networks:
ip6net:
enable_ipv6: true
ipam:
config:
- subnet: 2001:0DB8:1::/112
+ +

其中 UID / GID 可以参考 id $user 的结果设置。

+

生成密钥文件时不能有行末符,可以这样生成:echo -n password_in_clear_text > password

+

Web UI 使用 transmission-web-control,在 /config 对应的目录下 git clone 即可。

+

迁移之前的种子和配置只需要将之前的 config 目录移过来即可,如果之前是裸机安装,目录可能在 /var/lib/transmission-daemon/info

+

还要记得在路由器上配置 51413 端口的 TCP & UDP 转发。

+

配完端口转发,查看防火墙规则链可知,无需再在通信规则中开放端口。

+

运行方法

创建 container 并启动后台运行:docker compose up -d

+

停止并删除 container 和对应的网络:docker compose down

+

启动 / 停止 对应的 container:docker compose start / docker compose stop

+

更新:先 docker-compose pull,然后 docker compose downdocker compose up -d

+

清理无用镜像:docker image prune

+

配置 Syncthing 同步服务

使用 linuxserver/syncthing Docker 镜像。

+

使用 Docker Compose 来配置容器,按说明编写配置文件。

+

由于 Syncthing 需要发送本地组播包来进行本地链路上的节点发现,故这里将网络模式修改为 host 模式,参考:https://github.com/syncthing/syncthing/blob/main/README-Docker.md#discovery

+
docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---
version: "2.1"
services:
syncthing:
image: lscr.io/linuxserver/syncthing:latest
container_name: syncthing
hostname: RaspCloud #optional
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- /home/thx/Service/syncthing/config:/config
- /mnt:/mnt
- /data:/data
network_mode: host
restart: unless-stopped
+ +

还要记得在路由器上配置 22000 端口的 TCP & UDP 转发。

+

运行方法同上。

+

配置蓝牙监听服务

之前 使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化 中配置了蓝牙接收温湿度计数据,也把这个服务迁移过来。

+

花费十元购入了 BR8651 芯片的 USB 蓝牙 5.1 适配器,据说该芯片在 Linux 下有驱动。

+

可能是因为芯片较新的原因,各方面的支持似乎都还不太好,尝试了几个方法都没能正常地使用脚本获取 BLE Advertising,这里记录了几次失败的过程。

+

配置 LXC 的 USB 直通

本来想在 LXC 容器中配置蓝牙服务,但是 hciconfig 会报错 Can't open HCI socket.: Address family not supported by protocol,查阅资料后发现,由于蓝牙将自身注册为网络接口,所以并不能像使用 USB 那样将蓝牙设备传给 LXC 容器,参考:https://forum.proxmox.com/threads/assign-a-bluetooth-dongle-to-a-ct.67577/

+

所以以下部分只是记录如何直通 USB 设备。

+

参考:https://medium.com/@konpat/usb-passthrough-to-an-lxc-proxmox-15482674f11d

+

直接在 LXC 中 lsusb 是可以看到各个 USB 设备的,但是无法使用。

+
1
2
3
4
5
6
7
8
Bus 004 Device 002: ID 174c:3074 ASMedia Technology Inc. ASM1074 SuperSpeed hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 05e3:0751 Genesys Logic, Inc. microSD Card Reader
Bus 003 Device 004: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 003 Device 002: ID 174c:2074 ASMedia Technology Inc. ASM1074 High-Speed hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
+ +

关注其中的 Bluetooth 设备,位于 Bus 003 Device 004

+

查看其主次设备号:

+
1
2
root@pve:/etc/pve/lxc# ls -al /dev/bus/usb/003/004
crw-rw-r-- 1 root root 189, 259 Jul 1 00:28 /dev/bus/usb/003/004
+ +

主设备号为 189,向配置文件中添加以下内容,将设备映射到容器内:

+
/etc/pve/lxc/102.conf
1
2
lxc.cgroup.devices.allow: c 189:* rwm
lxc.mount.entry: /dev/bus/usb/003/004 dev/bus/usb/003/004 none bind,optional,create=file
+ +

或者直接将目录映射过去也行,防止设备名发生变化:

+
/etc/pve/lxc/102.conf
1
lxc.mount.entry: /dev/bus/usb/003 dev/bus/usb/003 none bind,optional,create=dir
+ +

如果容器中 ls -al /dev/bus/usb/003/004 权限不对(nobody / nogroup),可以在 PVE 中 chown 100000:100000 /dev/bus/usb/003/004,这样容器中就为 root 权限了。

+

在宿主机中直接配置蓝牙

由于不想再单独开一台虚拟机,故打算在宿主机中直接运行蓝牙监听服务。

+

正好宿主机中也有一个非 root 用户,使用这个用户来运行服务,尽量减小对系统的影响。

+

先验证蓝牙功能是否正常,在 bluetoothctl 中运行

+
1
2
3
4
menu scan
transport le
back
scan on
+ +

应该能够看到一些广播和数据。

+

(我这儿 hcitool lescan 会报错 Set scan parameters failed: Input/output error,参考 https://stackoverflow.com/questions/70777475/hcitool-lescan-returns-an-i-o-error-on-manjaro 发现如上使用 bluetoothctl 就能正常工作)

+
非特权安装 pip3
1
2
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py --user
+ +

如果报错 ModuleNotFoundError: No module named 'distutils.cmd',则需要安装 python3-distutils

+
安装运行 MiTemperature2

按照 MiTemperature2 文档进行安装。

+

安装 bluepy 前需要先安装 libglib2.0-dev

+

安装 pybluez 时可能遇到 error in PyBluez setup command: use_2to3 is invalid. 的问题,参考 https://github.com/pybluez/pybluez/issues/467,先 pip3 install setuptools==58 再安装即可。

+

之后遇到类似 https://github.com/JsBergbau/MiTemperature2/issues/106 的问题,以及类似 https://stackoverflow.com/questions/75175755/not-seeing-ble-device-advertising-unless-set-bluetoothctl-transport-le 的问题,都暂时没有被解决。

+

于是也放弃了。

+

配置 MC 服务器

安装 Java 8

由于该整合包版本需要 Java 8,而 Debian 官方源中没有,故使用第三方源安装。

+

准备工作:sudo apt install apt-transport-https ca-certificates wget dirmngr gnupg software-properties-common

+

添加第三方源:

+
1
2
wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo tee /etc/apt/trusted.gpg.d/adoptopenjdk.asc
sudo add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
+ +

由于 adoptopenjdk 可能还没加上 bookworm 源,可能需要手动将源中的 bookworm 改为 bullseye

+

安装 Java 8 JRE:

+
1
2
sudo apt update
sudo apt install adoptopenjdk-8-hotspot-jre
+ +

添加为服务

添加为 systemd 服务,参考 https://gist.github.com/winny-/bb17853ffc76fbb9b039 进行修改。

+
/etc/systemd/system/minecraft.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Minecraft Server

[Service]
WorkingDirectory=/data/MC/RAD2-1.3/RAD2-Serverpack-1.3
User=thx
Type=forking
ExitType=cgroup
ExecStart=/usr/bin/tmux new-session -s mc -d './LaunchServer.sh'
ExecStop=/usr/bin/tmux send-keys -t mc:0.0 'say SERVER SHUTTING DOWN. Saving map...' C-m 'save-all' C-m 'stop' C-m
ExecStop=/bin/sleep 2

[Install]
WantedBy=multi-user.target
+ +

使用 Type=forking 来管理 tmux new-session fork 出的进程。

+

使用 ExitType=cgroup 等待所有程序退出。

+
作者

Centaurus99

发布于

2023-06-17

更新于

2023-08-22


评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/2023/06/17/\345\237\272\344\272\216-Proxmox-VE-\347\232\204-All-in-One-\346\234\215\345\212\241\345\231\250\346\220\255\345\273\272/proxmox-logo.svg" "b/2023/06/17/\345\237\272\344\272\216-Proxmox-VE-\347\232\204-All-in-One-\346\234\215\345\212\241\345\231\250\346\220\255\345\273\272/proxmox-logo.svg" new file mode 100644 index 0000000..8873350 --- /dev/null +++ "b/2023/06/17/\345\237\272\344\272\216-Proxmox-VE-\347\232\204-All-in-One-\346\234\215\345\212\241\345\231\250\346\220\255\345\273\272/proxmox-logo.svg" @@ -0,0 +1,5 @@ + +Proxmox icon + + + \ No newline at end of file diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000..2266fd8 --- /dev/null +++ b/about/index.html @@ -0,0 +1,83 @@ + +关于 - Centaurus99 的杂物堆

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/archives/2021/07/index.html b/archives/2021/07/index.html new file mode 100644 index 0000000..5a01170 --- /dev/null +++ b/archives/2021/07/index.html @@ -0,0 +1,60 @@ + +归档: 2021/7 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/archives/2021/index.html b/archives/2021/index.html new file mode 100644 index 0000000..dd67651 --- /dev/null +++ b/archives/2021/index.html @@ -0,0 +1,60 @@ + +归档: 2021 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/archives/2022/01/index.html b/archives/2022/01/index.html new file mode 100644 index 0000000..3f8ef35 --- /dev/null +++ b/archives/2022/01/index.html @@ -0,0 +1,60 @@ + +归档: 2022/1 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/archives/2022/06/index.html b/archives/2022/06/index.html new file mode 100644 index 0000000..683b312 --- /dev/null +++ b/archives/2022/06/index.html @@ -0,0 +1,60 @@ + +归档: 2022/6 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/archives/2022/09/index.html b/archives/2022/09/index.html new file mode 100644 index 0000000..fbe4b7a --- /dev/null +++ b/archives/2022/09/index.html @@ -0,0 +1,60 @@ + +归档: 2022/9 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/archives/2022/index.html b/archives/2022/index.html new file mode 100644 index 0000000..e2ec172 --- /dev/null +++ b/archives/2022/index.html @@ -0,0 +1,60 @@ + +归档: 2022 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/archives/2023/06/index.html b/archives/2023/06/index.html new file mode 100644 index 0000000..555c0d5 --- /dev/null +++ b/archives/2023/06/index.html @@ -0,0 +1,60 @@ + +归档: 2023/6 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/archives/2023/index.html b/archives/2023/index.html new file mode 100644 index 0000000..a3f039a --- /dev/null +++ b/archives/2023/index.html @@ -0,0 +1,60 @@ + +归档: 2023 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 0000000..bb2d176 --- /dev/null +++ b/archives/index.html @@ -0,0 +1,60 @@ + +归档 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/atom.xml b/atom.xml new file mode 100644 index 0000000..6a80d9c --- /dev/null +++ b/atom.xml @@ -0,0 +1,223 @@ + + + Centaurus99 的杂物堆 + + + + + + 2023-08-21T17:10:55.000Z + https://blog.centaurus99.top/ + + + Centaurus99 + + + + Hexo + + + 基于 Proxmox VE 的 All in One 服务器搭建 + + https://blog.centaurus99.top/2023/06/17/%E5%9F%BA%E4%BA%8E-Proxmox-VE-%E7%9A%84-All-in-One-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA/ + 2023-06-17T11:12:49.000Z + 2023-08-21T17:10:55.000Z + + 树莓派挂在宿舍当软路由已经两年了,大部分情况下都挺好用,透明代理体验也还算尚可。

然而由于使用的 USB 无线网卡驱动支持较差,无线峰值速率只能跑到 200+ Mbps,且不大稳定。并且树莓派性能不高,无法开设一些高负载服务。另外,树莓派作为路由常年开启,需要考虑散热问题,虽然给使用的小风扇写了启停功能,但是启动运转时还是会有一定的噪音,较为恼人。

正好快到暑假了,需要开设一台 MC 服务器,于是打算换用一台较高性能的软路由,再配合 Wi-Fi 6 无线路由器作为 AP,提供高速率、高稳定性的有线无线网络接入。

整体配置概览

软路由

选用畅网奔腾 8505 软路由,1 大核 + 4 小核,大核的单核性能较高,CPU-Z 单核跑分相比我的笔记本(i5-1135G7)高出约 40%,可以用来开设一些吃单核性能的服务。

内存使用了两条光威 8GB DDR4 3200 内存,时序 CL-22-22-22-52。使用 16 GB 内存也主要是为了开设 MC 服务器考虑。

存储方面安装了西数 SN570 1T 固态作为系统盘,也暂时承担一部分文件存储功能。

作为一台路由器,这台软路由有 6 个 Intel i226-V 2.5G 网卡,即使以后有更多设备需要有线接入,也不一定需要增设交换机。

功耗方面,实测待机时输入功率约为 10 W。

温度方面,室温 24 度环境下,不加风扇待机时 CPU 约 40 度,NVME 固态约 50 度,软路由表面摸起来较热;加上赠送的 USB 12cm 风扇吹顶部铝制散热片后,待机时 CPU 约 30 度,NVME 固态约 40 度,外壳很凉快。

无线 AP

目前廉价的 Wi-Fi 6 路由器均使用千兆有线网口,单口有线速率甚至可能不及无线速率,故考虑需要能和软路由之间做链路聚合提高内网性能。

调查后发现,TP-Link 系列的路由器似乎原厂固件就有着端口聚合功能,其子品牌水星也有着相同的功能,且便宜几十元。

于是选用水星 X306G 路由器,AX3000 规格,计划只使用其 5G 频段 Wi-Fi 和端口聚合功能,运行在 AP 模式。

安装和调试 PVE

安装

参考官方教程或网上教程,一路 next 即可。

其中将 ETH5 对应的网卡设为管理口,静态 IP 设为 192.168.22.100(22 网段)。

更换内核版本

由于 8505 CPU 是大小核架构,建议使用较新的内核获取大小核调度优化。

先换源,参考:https://mirrors.tuna.tsinghua.edu.cn/help/proxmox/,并删除企业源:rm /etc/apt/sources.list.d/pve-install-repo.list

apt update 后搜索可用的内核版本,我这儿选择 6.2 版本:apt install pve-kernel-6.2,安装完重启后生效。

可以使用 proxmox-boot-tool 管理安装的以及用于启动的 kernel 版本。

管理页面添加温度显示

偷懒使用了恩山论坛的脚本,添加了温度,CPU频率,硬盘信息的显示:https://www.right.com.cn/forum/thread-6754687-1-1.html

删除 lvm-thin 并扩容 lvm

由于使用单盘搭建 All in One 服务器,计划在 PVE 系统中使用 samba 共享数据文件,因此需要较大的 lvm 空间。同时,由于不需要开大量的虚拟机,也用不到 lvm-thin 的特性。故将 lvm-thin 的空间全部合入 lvm 中。

参考:https://foxi.buduanwang.vip/virtualization/pve/1434.html/

删除 lvm-thin:lvremove /dev/pve/data

扩容 lvm:lvextend -rl +100%FREE /dev/pve/root

部署 samba

安装:apt update && apt install samba

添加用户:useradd thx

将用户添加到 samba:smbpasswd -a thx

编辑 samba 配置文件 /etc/samba/smb.conf,添加共享文件夹的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[RaspCloud]
path = /data/RaspCloud
writeable = yes
create mask = 0777
directory mask = 1777
public = yes
guest ok = yes

[PT]
path = /data/PT
writeable = yes
create mask = 0644
directory mask = 1755
public = yes
guest ok = yes

[Private]
path = /data/Private
writeable = yes
create mask = 0644
directory mask = 1755
public = no
guest ok = no
valid users = thx
browseable = yes

[Sync]
path = /data/Sync
writeable = yes
create mask = 0644
directory mask = 1755
public = no
guest ok = no
valid users = thx
browseable = yes

其中 /data/RaspCloud 为公开共享目录,内部有 read-only 目录通过改变目录所有者来限制 guest 的写入。

/data/PT 为公开只读共享目录。

/data/Private/data/Sync 为私密目录,使用白名单限制访问用户。

如果需要在共享目录中软链接到系统里的其它目录中,则需要在 [global] 段中添加:

/etc/samba/smb.conf
1
2
3
4
[global]
follow symlinks = yes
wide links = yes
unix extensions = no

参考:https://blog.csdn.net/humanking7/article/details/85058471

smb.conf 中的配置项可查阅:https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html

更改 CPU 电源策略

作为一个桌面服务器,需要考虑到功耗与发热的问题。

参考:https://pve.sqlsec.com/4/6/

1
2
3
4
5
# 查看支持的 CPU 电源模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

# 查看当前的 CPU 电源模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
电源模式解释说明
performance性能模式,将 CPU 频率固定工作在其支持的较高运行频率上,而不动态调节。
userspace系统将变频策略的决策权交给了用户态应用程序,较为灵活。
powersave省电模式,CPU 会固定工作在其支持的最低运行频率上。
ondemand按需快速动态调整 CPU 频率,没有负载的时候就运行在低频,有负载就高频运行。
conservative与 ondemand 不同,平滑地调整 CPU 频率,频率的升降是渐变式的,稍微缓和一点。
schedutil负载变化回调机制,后面新引入的机制,通过触发 schedutil sugov_update 进行调频动作。

安装工具:apt install cpufrequtils

设为 ondemand 模式:cpufreq-set -g ondemand

无显示器启动问题

发现如果不接显示器,则无法正常启动。初步判断在启动 grub 或之后出现问题。

然而,对 BIOS 和 grub 配置文件做各种修改之后也无法解决问题。

最终打算网上买个 HDMI 诱骗器插上得了。

插上后也没用。

经仔细排查(偶然将接地良好的显示器的 Type-C 线的外壳接触到软路由 Type-C 口的外壳上,发现问题就消失了),发现是供电接地问题。

先前为了监测功耗,我将电源的 DC 转为了 USB 母口,插上了 USB 电压电流测量设备,再将测量设备的 USB 口转为 DC 口,接到软路由的 DC 供电口。在这个过程中可能丢失了地线。

直接接电源就不再有问题。

挂载硬盘

再接上一块老机械盘,用来挂 PT。

安装好硬盘后,先使用 lsblk -f 或者 ls -l /dev/disk/by-uuid 找到分区的 UUID,使用 UUID 进行挂载可以避免 /dev/ 下设备名的改变导致的挂载问题。

然后在 /etc/fstab 中添加挂载信息:

/etc/fstab
1
UUID=1f4a2672-3039-594b-808c-a5d3913b0fde /data/hdd ext4 defaults,nofail 0 0

注意 nofail 用来在硬盘没有成功挂载时也能正常启动,否则启动会等待硬盘挂载,失败后进入 emergency mode。

然后 mount -a 生效,开机后也会自动挂载。

硬盘维护

缩减数据盘的文件系统预留空间

参考:https://askubuntu.com/questions/249387/df-h-used-space-avail-free-space-is-less-than-the-total-size-of-home

默认情况下,df -h 查看硬盘空间会发现,Size 会大于 Used + Avail,如:

1
2
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1 294G 261G 19G 94% /data/hdd

这是由于 ext2/3/4 文件系统默认会保留 5% 的空间只供 root 使用,而数据盘就没这个必要了,可以 tune2fs -m 0 /dev/sda1 来取消预留空间。

S.M.A.R.T. 信息

在 WebUI 中,可以在节点的磁盘一栏中查看 S.M.A.R.T. 信息。

命令行中,可以使用 smartctl -a /dev/sda 查看。

S.M.A.R.T. 信息的解析,可以参考:https://blog.csdn.net/MrSate/article/details/88564764

使用 journalctl -u smartmontools.service 可以查看 smartmontools 守护进程的监测日志。

配置 smartd 守护程序

还可以在 /etc/smartd.conf 中配置守护程序,初始时配置如下:

/etc/smartd.conf
1
DEVICESCAN -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner

添加如下参数:

  • 基于默认修改的监测与报警参数 -H -f -l error -l selftest -C 197 -U 198,相比默认的 -a 参数减少了等效的 -t 参数,否则每半小时都会在日志中输出 S.M.A.R.T. 信息的变化情况(详见 /etc/smartd.conf 中的说明)
  • 每周六凌晨三点短自检,每月二十号凌晨三点长自检:-s (S/../../6/03/|L/../20/./03)
  • 监控温度,在温度变化 5 度时记录,达到 40 度时记录,达到 45 度时警告(0 为关闭):-W 5,40,45

修改后如下:

/etc/smartd.conf
1
2
3
DEFAULT -H -f -l error -l selftest -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner
/dev/nvme0 -W 0,60,70
DEVICESCAN -C 197 -U 198 -s (S/../../6/03/|L/../20/./03) -W 0,40,50

重启服务后生效:systemctl restart smartd.service

如果守护程序检测到了出现问题,也会给安装 PVE 时填写的邮箱发邮件,实测 QQ 邮箱可以收到。

参考:

配置硬盘休眠

可能需要先关闭 pvestatd 对硬盘的扫描,参考:https://www.ippa.top/954.html

ls -l /dev/disk/by-uuid 找到硬盘的 UUID 1f4a2672-3039-594b-808c-a5d3913b0fde,然后编辑 /etc/lvm/lvm.conf,在 global_filter 中添加 "r|/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde.*|",结果如下:

/etc/lvm/lvm.conf
1
2
3
devices {
global_filter=["r|/dev/zd.*|", "r|/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde.*|"]
}

pvestatd restart 后生效。

查看硬盘当前状态:smartctl -i -n standby /dev/sda | grep "mode"|awk '{print $4}',ACTIVE 或者 IDLE 都为运转状态。

查询当前电源管理参数:hdparm -B /dev/sda

进入 standby modehdparm -y /dev/sda

进入 sleep modehdparm -Y /dev/sda

然后编辑 /etc/hdparm.conf,添加需要休眠的硬盘设置,比如十分钟后 standby 如下配置:

/etc/hdparm.conf
1
2
3
4
5
/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde {
apm = 127
acoustic_management = 127
spindown_time = 120
}

/usr/lib/pm-utils/power.d/95hdparm-apm resume 后生效(参考 man hdparm.conf

其中 spindown_time 参考 man hdparm 中的 -S 选项说明来设置。

不过我的这块硬盘似乎并不按照设定的 spindown_time 来休眠,于是打算观察一段时间 Load_Cycle_Count 的增长情况来决定是否开启休眠功能。

smartctl -a /dev/sda | grep Load_Cycle_Count 即可查看。

硬盘无法休眠 Debug

后来又入了两块盘,但是 hdparm -y 之后又会立即唤醒,无法进入休眠状态。

诊断方式参考:https://askubuntu.com/questions/1406434/block-dump-reporting-missing-from-ubuntu-22-04

监控对 /dev/sda 的使用:blktrace -d /dev/sda -a pc -o - | blkparse -i -

然后 hdparm -Y /dev/sda ,查看唤醒磁盘的进程。

我这儿结果如下,然而搜索相关资料后并没有获取到有用的信息:

1
2
3
4
5
6
7
8
9
8,16   0        1     0.000000000 18871  D   N 0 [hdparm]
8,16 1 1 0.497835738 0 C N [0]
8,16 0 2 1.412267626 168 D R 4 [scsi_eh_1]
8,16 0 3 1.412286261 14 C R [0]
8,16 0 4 1.412293625 18 D R 12 [kworker/0:1]
8,16 0 5 1.412295327 14 C R [0]
8,16 0 6 1.412297439 18 D R 4 [kworker/0:1]
8,16 0 7 1.412298518 14 C R [0]
...

有可能是 ext4 的 lazy init 导致,参考:https://unix.stackexchange.com/questions/533789/hard-drive-waking-from-sleep-for-no-apparent-reason

基于 LXC 安装 OpenWrt

LXC 开销小,故尝试使用 LXC 安装 OpenWrt

安装 OpenWrt

安装过程参考:https://virtualizeeverything.com/2022/05/23/setting-openwrt-in-proxmox-lxc/

下载地址:https://downloads.openwrt.org/

我选择了 20.03.5 版本:https://downloads.openwrt.org/releases/22.03.5/targets/x86/64/

下载 rootfs.tar.xz 即可,可以在下载时选择哈希校验。

创建容器的 UI 的文档:https://pve.proxmox.com/pve-docs/chapter-pct.html#pct_settings

似乎由于 Web 页面无法添加 --ostype unmanaged 参数,需要进入命令行创建:

1
pct create 101 /var/lib/vz/template/cache/openwrt-22.03.5-x86-64-rootfs.tar.gz --arch amd64 --hostname RaspCloud --rootfs local:1 --memory 1024 --cores 6 --cpuunits 200 --ostype unmanaged --unprivileged 1

然后在 Web UI 中添加一个虚拟网卡 veth0,桥接到 PVE 网桥 vmbr0 上,用于 OpenWrt 和 PVE 的交互。

此时连接在管理口上的设备便和 OpenWrt 连在同一个网桥上了,就可以通过这个虚拟网卡的地址访问 OpenWrt 了。

有可能启动后 veth0 并没被正确配置,可以手动 up 之后使用 IPv6 地址访问。

然后到配置文件 /etc/pve/lxc/101.conf 里添加直通网卡,比如:

1
2
3
4
lxc.net.0.type: phys
lxc.net.0.link: enp2s0 --- 需要使用的 host 中的网卡名
lxc.net.0.name: eth0 --- LXC 中显示的网卡名
lxc.net.0.flags: up

需要注意 net.id 的 id 不能和 Web UI 中添加的相同。

最终的 conf 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
arch: amd64
cores: 6
cpuunits: 200
hostname: RaspCloud
memory: 1024
net0: name=veth0,bridge=vmbr0,firewall=1,hwaddr=92:81:93:06:8A:7E,type=veth
onboot: 1
ostype: unmanaged
rootfs: local:101/vm-101-disk-1.raw,size=1G
startup: order=1
swap: 512
unprivileged: 1
lxc.net.5.type: phys
lxc.net.5.link: enp2s0
lxc.net.5.name: eth0
lxc.net.5.flags: up
lxc.net.6.type: phys
lxc.net.6.link: enp3s0
lxc.net.6.name: eth1
lxc.net.6.flags: up
lxc.net.7.type: phys
lxc.net.7.link: enp4s0
lxc.net.7.name: eth2
lxc.net.7.flags: up
lxc.net.8.type: phys
lxc.net.8.link: enp5s0
lxc.net.8.name: eth3
lxc.net.8.flags: up
lxc.net.9.type: phys
lxc.net.9.link: enp6s0
lxc.net.9.name: eth4
lxc.net.9.flags: up

配置 OpenWrt

连接互联网

由于我需要 OpenWrt 通过 PVE 管理口连接电脑,通过电脑将无线网共享给有线网来访问互联网,所以需要先为 veth0 配置一些上网功能。

添加 Interface veth0,类型为静态地址,网卡设为 veth0,配置好对应的地址,网关和 DNS 服务器地址即可。

之后应该就可以访问网络了。

换源

参考:https://mirrors.tuna.tsinghua.edu.cn/help/openwrt/

添加中文

1
2
opkg update
opkg install luci-i18n-base-zh-cn

更改主题

不大喜欢 OpenWrt 的默认主题,换为 Argon

下载对应的 ipk:https://github.com/jerrykuku/luci-theme-argon/releases/download/v2.3.1/luci-theme-argon_2.3.1_all.ipk

然后安装:

1
2
3
opkg install luci-compat
opkg install luci-lib-ipkg
opkg install luci-theme-argon*.ipk

配置路由功能

启动后,只有 wan 和 wan6 两个 Interface,对应 eth0 网口(device)。

计划把其它网口都划入 LAN 中。

首先添加网桥设备 br-lan,把网口都加上去。

然后添加 lan 接口,使用静态地址,把 br-lan 加上去,配置地址即可。

然后发现,似乎 dnsmasq 出现了些问题,无法正常启动。

根据 https://github.com/openwrt/openwrt/issues/9064 中的方法,opkg remove procd-ujail 可以解决。

dnsmasq 正常后,在接口中配置 DHCP / DNS 的相关配置,然后 lan 口上接的设备就能获取到分配的地址了。

校园网只会分配 /128 地址,故 IPv6 也需要做个 NAT。OpenWrt 中 IPv6 默认并不会配置 SNAT,需要做一些手动配置,参考:https://openwrt.org/docs/guide-user/network/ipv6/ipv6.nat6

先启用 IPv6 masquerading,其中我这儿的 zone[1] 为 wan 域:

1
2
3
uci set firewall.@zone[1].masq6="1"
uci commit firewall
/etc/init.d/firewall restart

然后关闭 wan6 口的 sourcefilter:

1
2
3
uci set network.wan6.sourcefilter="0"
uci commit network
/etc/init.d/network restart

这样 lan 口上接的设备也能获取到 DHCPv6 分配的 IPv6 地址了,OpenWrt 也会为其提供 NAT6 服务。

配置 OpenClash

先卸载 dnsmasq:

1
2
opkg remove dnsmasq
mv /etc/config/dhcp /etc/config/dhcp.bak

再按照发布页的说明,先安装依赖,再下载安装 ipk 即可:https://github.com/vernesong/OpenClash/releases

之后按个人喜好配置即可,我选用的是 Meta 核心的 redir-host 模式。

可以将校园网网段设为绕过,减少校内网络访问开销:

IPv4:

1
2
3
4
5
6
7
8
9
59.66.0.0/16
101.5.0.0/16
101.6.0.0/16
118.229.0.0/19
166.111.0.0/16
183.172.0.0/15
202.112.39.2/32
219.223.168.0/21
219.223.176.0/20

IPv6:

1
2402:f000::/32

或者可以打开 实验性:绕过中国大陆 IP 功能,减少国内网络访问开销。

遇上 OpenClash 的一个 bug。(Updated 2023.07.02: 随着 0.45.128 版本的发布,该问题已得到修复)

在 LuCI 中,虽然已经关闭了 路由本机代理,但是还是会 nftables 中添加处理 Output 链的规则,见 https://github.com/vernesong/OpenClash/blob/9ee0f02ed7615a62f960c9ee2f951dd1b47e2411/luci-app-openclash/root/etc/init.d/openclash#LL1649C1-L1672C9

1
2
3
4
5
6
7
8
if [ "$enable_redirect_dns" != "2" ] || [ "$router_self_proxy" = "1" ]; then
nft 'add chain inet fw4 openclash_output' 2>/dev/null
nft 'flush chain inet fw4 openclash_output' 2>/dev/null
...
nft add rule inet fw4 openclash_output ip protocol tcp skuid != 65534 counter redirect to "$proxy_port" 2>/dev/null
nft 'add chain inet fw4 nat_output { type nat hook output priority -1; }' 2>/dev/null
nft 'add rule inet fw4 nat_output ip protocol tcp counter jump openclash_output' 2>/dev/null
fi

这里的判断中 上了不使用 Dnsmasq 转发,所以在我的工况下会被启用。暂时未明白为何要这样,故提了 Issue:https://github.com/vernesong/OpenClash/issues/3354

两天后作者在 d499374 中修复了该 bug,发布于 0.45.125 版本中,等待合入 master。

远程 Wireshark 抓包调试

有时配挂了需要抓包调试,可以使用远程主机上的 tcpdump + Windows 本机上的 wireshark 远程抓包分析。

给用户非 root 使用 tcpdump 权限:sudo chmod u+s /usr/sbin/tcpdump

然后 Windows 本机执行 ssh ubuntu "tcpdump -i br-lan -l -w - 'port not 22'" | wireshark -k -i - 即可开始抓包。

参考:https://thiscute.world/posts/tcpdump-and-wireshark

配置 UDP 代理

使用 Redir-Host 兼容模式 + UDP tproxy 转发似乎并不能正常运行,所以还是得使用 TUN 模式。

LXC 启用 TUN 需要一点额外的配置,参考 https://forum.proxmox.com/threads/how-to-enable-tun-tap-in-a-lxc-container.25339/,在配置文件中添加如下内容:

1
2
lxc.cgroup.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net dev/net none bind,create=dir

然后选用 Meta 内核,IPv4 和 IPv6 都启用 TUN 模式,即可代理 UDP 流量了。

还可以考虑开启 仅允许常用端口流量 来防止不必要的代理。具体地,此处所指的常用端口如下:21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 5222 5228 5229 5230 8080 8443 8880 8888 8889

配置校园网认证

使用 GoAuthing

新版本的 OpenWrt 配置起来似乎有些不一样的地方,参考 https://github.com/z4yx/GoAuthing/issues/30 进行修改。

goauthing@ 脚本放到 /etc/init.d/goauthing 目录下,并 chmod +x

/etc/init.d/goauthing
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh /etc/rc.common
# Authenticating utility for auth.tsinghua.edu.cn
# This init script is used explicitly with OpenWRT

USE_PROCD=1
START=96
PROG="/usr/bin/goauthing"
SERV=goauthing # UCI config at /etc/config/goauthing

start_instance() {
local config=$1
local username password
config_get username $config username
config_get password $config password
local args="-u $username -p $password"

sleep 10 # Wait for link up
"$PROG" $args deauth
"$PROG" $args auth
"$PROG" $args login

procd_open_instance
procd_set_param command "$PROG"
procd_append_param command $args online
procd_set_param stderr 1
procd_set_param respawn
procd_close_instance
}

logout() {
local config=$1
local username password
config_get username $config username
config_get password $config password
local args="-u $username -p $password"

"$PROG" $args logout
}

start_service() {
config_load "$SERV"
config_foreach start_instance "$SERV"
}

stop_service() {
config_load "$SERV"
config_foreach logout "$SERV"
}

其中更改了启动优先级,添加了 sleep 10 来等待 wan 口配置完成,否则会因为无法完成 auth / login 就直接进入 online 守护程序,从而一直无法完成登录认证。

然后下载 https://mirrors.tuna.tsinghua.edu.cn/github-release/z4yx/GoAuthing/LatestRelease/auth-thu.linux.x86_64,并移动至脚本中填写的位置(默认为 /usr/bin/goauthing)。

然后配置并启动服务:

1
2
3
4
5
6
7
8
touch /etc/config/goauthing
uci add goauthing goauthing
uci set goauthing.@goauthing[0].username='<YOUR-TUNET-ACCOUNT-NAME>'
uci set goauthing.@goauthing[0].password='<YOUR-TUNET-PASSWORD>'
uci commit

/etc/init.d/goauthing enable
/etc/init.d/goauthing start

配置链路聚合 AP

另购置了一台 Wi-Fi 6 无线路由器作为 AP,支持 2x2 MU-MIMO,160 MHz 频宽,理论带宽可达 2402 Mbps。

然而,路由器上只有四个千兆口,连接软路由后跑不到这么高。

不过,这款路由器支持两个端口链路聚合,故尝试配置一下。

首先在路由器上设置两个端口为聚合口,提示:

端口聚合使用IEEE 802.3ad动态聚合模式,请确保对端设备支持并配置为动态聚合模式。

然后在 OpenWrt 上安装需要的软件包:opkg install kmod-bonding proto-bonding luci-proto-bonding

然后将以下内容添加到 /etc/rc.localexit 0 前:

1
2
3
4
5
6
7
8
9
10
ip link add bond-lan type bond mode 802.3ad # 添加 bond 类型的虚拟接口 名称为 bond-lan
ip link set eth3 down
ip link set eth4 down
ip link set eth3 type bond_slave # 配置网卡模式
ip link set eth4 type bond_slave
ip link set eth3 master bond-lan # 加入名称为 bond-lan 的 bond 类型网卡
ip link set eth4 master bond-lan
ip link set bond-lan up # 启动该网卡
ip link set eth3 up
ip link set eth4 up

eth3eth4 从原来的 br-lan 中移除,添加上 bond-lan 即可。

实测无线可以跑到 1.6 Gbps 左右。

配置防火墙

官方原版 OpenWrt 默认有一套防火墙策略,简略微调即可。

配置端口转发

两种方式,一种是基于 iptables 实现,另一种是使用 socat 来转发。

基于 iptables 实现

OpenWrt 默认的端口转发基于 iptables / nftables 实现,然而,配置后发现,在内网无法使用外网地址访问对应端口,初步探索后推测是 NAT 环回时出现问题。

于是在 nftables 中进行调试。

先新建一个表为符合规则的包启用跟踪调试:

1
2
3
nft add table inet trace_debug
nft 'add chain inet trace_debug trace_pre { type filter hook prerouting priority -200000; }'
nft insert rule inet trace_debug trace_pre ip saddr 192.168.22.118 ip daddr ??.??.??.?? limit rate 1/second meta nftrace set 1

然后 nft monitor trace 就可以跟踪了。

跟踪检查后发现,包在 prerouting policy accept 后消失了。

一番摸索后发现,当对应网卡(br-lan)开启混杂模式后,就能正常工作了。

怀疑是 prerouting 后发现目标地址为本地链路地址,于是就修改了目的 mac 地址,导致非混杂模式的网卡将其丢弃。不过简单搜索后也没找到相关的资料。

使用 socat

Updated 2023.06.29: 使用 socat 遇到了一些问题,故弃用:

  • 会修改源地址,丢失地址数据
  • UDP 的转发使用 fork 参数存在线程泄漏问题,似乎每个 UDP 包都会 fork 出一个进程且不释放,导致产生大量进程占满内存

安装:

1
2
opkg update
opkg install socat

然后配置端口转发。

例如,配置名为 mc-tcp 的策略,开启,监听本机所有地址的 25565 端口并转发到 192.168.22.3:25565 的配置如下(fork 允许多个连接,reuseaddr 允许 socket 的快速重用,TCP6-LISTEN 也同时监听 IPv4):

1
2
3
4
uci set socat.mc-tcp=socat
uci set socat.mc-tcp.enable=1
uci set socat.mc-tcp.SocatOptions='TCP6-LISTEN:25565,fork,reuseaddr TCP:192.168.22.3:25565'
uci commit

UDP 也类似:

1
2
3
4
uci set socat.mc-udp=socat
uci set socat.mc-udp.enable=1
uci set socat.mc-udp.SocatOptions='UDP6-LISTEN:25565,fork,reuseaddr UDP:192.168.22.3:25565'
uci commit

然后重启 socat 服务即可生效:/etc/init.d/socat restart

对外网开放还需在防火墙中允许对应端口的输入。

配置 DDNS

我的 DNS 解析提供商为 CloudFlare,故安装 ddns-scripts-cloudflare

1
opkg install ddns-scripts-cloudflare luci-i18n-ddns-zh-cn

安装完成后在 LuCI 中配置即可,没太大难度。IPv4 和 IPv6 地址需要分别配置。

配置 AdGuard Home

安装 AdGuard Home:

1
2
opkg update
opkg install adguardhome

在 DHCP/DNS 的高级设置中,将 DNS 服务器端口改为 53 以外的端口,如 5353。

然后登入 http://ip:3000 配置 AdGuard Home,将上游 DNS 服务器设为 OpenClash 设置的 DNS 服务地址,并停用 OpenClash 的 DNS 劫持。

然后应该就可以开始运作了,再添加屏蔽列表即可。

如果需要在 OpenClash 没有正常启动成功的情况下仍可以进行 DNS 服务,则需要设置 fallback DNS 服务器地址。然而目前 AdGuard Home 中并没有这个功能,相关功能 https://github.com/AdguardTeam/AdGuardHome/issues/3701 被设为了 v0.108.0 的目标,希望有生之年能等到 v0.108.0 出来获得这一功能。

(也是因为这个原因,校园网的认证脚本需要配置为 OpenClash 启动完成后再进行认证,感觉怪怪的,所以也暂时放弃了 AdGuard Home)

配置 WireGuard

安装 WireGuard

1
2
opkg update
opkg install luci-i18n-wireguard-zh-cn

重启后,在添加接口中就可以找到 WireGuard VPN 了,我添加了一个名为 wg0 的接口。

作为公网 IP 下供其它端来主动连接的一端,我特殊指定了这个接口的监听端口,并在防火墙中运行了该端口的 UDP 访问。

该接口的 IP 地址需要配置为单独的子网,用于各端 VPN 接口间的互相连接。我为其配置了 192.168.23.1/24fd23:41b7:e060::1/64 地址,与 22 网段区别开。

为了方便配置,我没有将这个接口划入单独的区域,而是划入了 lan 区域,共享 lan 区域的防火墙配置。

然后就可以添加对端了。注意 允许的 IP 的这一项中填写 “对端的隧道 IP 地址和对端经由隧道的网络”,对于对端为非路由设备的情况,这一项只填隧道 IP 地址就行,比如 192.168.23.102/32(/32 可省略),但不能填写 VPN 接口间的网段,即不能填写 192.168.23.102/24

各项设置可能需要重启后生效。

之后的计划

  • 配置内网 IP 的域名
  • 配置 MosDNS 优化 DNS 解析(参考:https://rushb.pro/article/router-dns.html
  • 配置 Grafana 可视化路由运行状态、MosDNS 运行数据等
  • 配置 UDP 转发以及游戏优化

基于 LXC 的其它功能服务器

其它杂七杂八的服务以及 Docker 就另外开在一个虚拟机上吧。

选用 Debian 12 系统,可以直接从 CT 模板中下载。

参考 https://pve.proxmox.com/wiki/Unprivileged_LXC_containers#Using_local_directory_bind_mount_points,挂载宿主机的共享目录:pct set 100 -mp0 /host/dir,mp=/container/mount/point

似乎直接挂载宿主机中的 /mnt 的话,即使配置完 UID / GID 映射,LXC 容器也并不能正常访问其中宿主机挂载的子目录,可能需要在宿主机 umount 再 mount。所以需要将 mp 指定的目录细化到类似 /mnt/hdd1 这一层。

添加一个虚拟网卡 eth0 桥接到 vmbr0 上,IPv4 选择 DHCP 接收 OpenWrt 的地址分发;而如果 IPv6 选择 DHCP 的话,DHCPv6 是不会通告默认路由的,所以建议选择 SLAAC。

初始配置

换源,参考:https://mirrors.tuna.tsinghua.edu.cn/help/debian/

添加 sudo,先 apt install sudo,再 echo "username ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/username

默认下终端可能会有乱码,需要配置 UTF-8 语言,sudo dpkg-reconfigure locales 然后选中 en_US.UTF-8 即可。

配置 UID / GID 映射

如果直接挂载目录共享的话,容器内外会视为不同的用户,导致共享文件时有着麻烦的权限问题。不过我们可以通过 lxc.idmap 来将某一容器中的某些用户映射到 Host 中的某些用户。

参考:

以下以映射 102 容器中的 1000 用户为 Host 中的 1000 用户为例:

先在 /etc/subuid/etc/subgid 中都添加上 root:1000:1,来允许 root 创建到 1000 用户的映射。

然后在 /etc/pve/lxc/102.conf 的配置文件中,添加如下内容:

/etc/pve/lxc/102.conf
1
2
3
4
5
6
lxc.idmap: u 0 100000 1000
lxc.idmap: g 0 100000 1000
lxc.idmap: u 1000 1000 1
lxc.idmap: g 1000 1000 1
lxc.idmap: u 1001 101000 64535
lxc.idmap: g 1001 101000 64535

建议将原来容器内 1000 映射到的 101000 用户还包含在映射范围内,这样容器内的 root 才能够将文件的所有权从原先的转到现在的。

安装 Docker

由于并不想在 PVE 中直接装 Docker,故在 Debian 虚拟机中安装 Docker。

参考:

安装:

1
2
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

加入 Docker 用户组,在无 root 权限下使用 Docker:sudo usermod -aG docker $USER

验证安装正确性:docker run --rm hello-world

如没有方便的网络接入,配置镜像参考:https://yeasy.gitbook.io/docker_practice/install/mirror

在 LXC 容器启动后,Docker 会过一两分钟才会启动,暂时不知道原因为何。

Docker 启用 IPv6 支持

由于挂的 PT 需要有 IPv6 接入,故需要给 Docker 开启 IPv6。

参考:https://docs.docker.com/config/daemon/ipv6/

编辑配置文件:

/etc/docker/daemon.json
1
2
3
4
{
"experimental": true,
"ip6tables": true
}

然后重启 Docker:sudo systemctl restart docker

启动容器时,需要额外的配置。如果使用 Docker Compose,则添加如下内容,并在对应 service 配置中添加 networks 即可:

1
2
3
4
networks:
ip6net:
enable_ipv6: true
subnet: 2001:0DB8::/112

netstat -tunlp 可以查看监听端口,若对应的端口只有 tcp6 在监听也不用慌张,若 cat /proc/sys/net/ipv6/bindv6only 为 0 则表明已在双栈上监听,参考(https://unix.stackexchange.com/questions/496137/does-80-in-netstat-output-means-only-ipv6-or-ipv6ipv4

配置 PT 客户端

使用 linuxserver/transmission Docker 镜像。

使用 Docker Compose 来配置容器,按说明编写配置文件:

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
---
version: "2.1"
services:
transmission:
image: lscr.io/linuxserver/transmission:latest
container_name: transmission
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- TRANSMISSION_WEB_HOME=/config/transmission-web-control/src #optional
- USER=thx #optional
- FILE__PASS=/config/password #optional
- WHITELIST= #optional
- PEERPORT= #optional
- HOST_WHITELIST= #optional
volumes:
- /home/thx/Service/transmission/config:/config
- /data/PT:/downloads
- /data/PT/torrentwatch:/watch
- /mnt:/mnt
ports:
- 9091:9091
- 51413:51413
- 51413:51413/udp
restart: unless-stopped
networks:
- ip6net
networks:
ip6net:
enable_ipv6: true
ipam:
config:
- subnet: 2001:0DB8:1::/112

其中 UID / GID 可以参考 id $user 的结果设置。

生成密钥文件时不能有行末符,可以这样生成:echo -n password_in_clear_text > password

Web UI 使用 transmission-web-control,在 /config 对应的目录下 git clone 即可。

迁移之前的种子和配置只需要将之前的 config 目录移过来即可,如果之前是裸机安装,目录可能在 /var/lib/transmission-daemon/info

还要记得在路由器上配置 51413 端口的 TCP & UDP 转发。

配完端口转发,查看防火墙规则链可知,无需再在通信规则中开放端口。

运行方法

创建 container 并启动后台运行:docker compose up -d

停止并删除 container 和对应的网络:docker compose down

启动 / 停止 对应的 container:docker compose start / docker compose stop

更新:先 docker-compose pull,然后 docker compose downdocker compose up -d

清理无用镜像:docker image prune

配置 Syncthing 同步服务

使用 linuxserver/syncthing Docker 镜像。

使用 Docker Compose 来配置容器,按说明编写配置文件。

由于 Syncthing 需要发送本地组播包来进行本地链路上的节点发现,故这里将网络模式修改为 host 模式,参考:https://github.com/syncthing/syncthing/blob/main/README-Docker.md#discovery

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---
version: "2.1"
services:
syncthing:
image: lscr.io/linuxserver/syncthing:latest
container_name: syncthing
hostname: RaspCloud #optional
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- /home/thx/Service/syncthing/config:/config
- /mnt:/mnt
- /data:/data
network_mode: host
restart: unless-stopped

还要记得在路由器上配置 22000 端口的 TCP & UDP 转发。

运行方法同上。

配置蓝牙监听服务

之前 使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化 中配置了蓝牙接收温湿度计数据,也把这个服务迁移过来。

花费十元购入了 BR8651 芯片的 USB 蓝牙 5.1 适配器,据说该芯片在 Linux 下有驱动。

可能是因为芯片较新的原因,各方面的支持似乎都还不太好,尝试了几个方法都没能正常地使用脚本获取 BLE Advertising,这里记录了几次失败的过程。

配置 LXC 的 USB 直通

本来想在 LXC 容器中配置蓝牙服务,但是 hciconfig 会报错 Can't open HCI socket.: Address family not supported by protocol,查阅资料后发现,由于蓝牙将自身注册为网络接口,所以并不能像使用 USB 那样将蓝牙设备传给 LXC 容器,参考:https://forum.proxmox.com/threads/assign-a-bluetooth-dongle-to-a-ct.67577/

所以以下部分只是记录如何直通 USB 设备。

参考:https://medium.com/@konpat/usb-passthrough-to-an-lxc-proxmox-15482674f11d

直接在 LXC 中 lsusb 是可以看到各个 USB 设备的,但是无法使用。

1
2
3
4
5
6
7
8
Bus 004 Device 002: ID 174c:3074 ASMedia Technology Inc. ASM1074 SuperSpeed hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 05e3:0751 Genesys Logic, Inc. microSD Card Reader
Bus 003 Device 004: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 003 Device 002: ID 174c:2074 ASMedia Technology Inc. ASM1074 High-Speed hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

关注其中的 Bluetooth 设备,位于 Bus 003 Device 004

查看其主次设备号:

1
2
root@pve:/etc/pve/lxc# ls -al /dev/bus/usb/003/004
crw-rw-r-- 1 root root 189, 259 Jul 1 00:28 /dev/bus/usb/003/004

主设备号为 189,向配置文件中添加以下内容,将设备映射到容器内:

/etc/pve/lxc/102.conf
1
2
lxc.cgroup.devices.allow: c 189:* rwm
lxc.mount.entry: /dev/bus/usb/003/004 dev/bus/usb/003/004 none bind,optional,create=file

或者直接将目录映射过去也行,防止设备名发生变化:

/etc/pve/lxc/102.conf
1
lxc.mount.entry: /dev/bus/usb/003 dev/bus/usb/003 none bind,optional,create=dir

如果容器中 ls -al /dev/bus/usb/003/004 权限不对(nobody / nogroup),可以在 PVE 中 chown 100000:100000 /dev/bus/usb/003/004,这样容器中就为 root 权限了。

在宿主机中直接配置蓝牙

由于不想再单独开一台虚拟机,故打算在宿主机中直接运行蓝牙监听服务。

正好宿主机中也有一个非 root 用户,使用这个用户来运行服务,尽量减小对系统的影响。

先验证蓝牙功能是否正常,在 bluetoothctl 中运行

1
2
3
4
menu scan
transport le
back
scan on

应该能够看到一些广播和数据。

(我这儿 hcitool lescan 会报错 Set scan parameters failed: Input/output error,参考 https://stackoverflow.com/questions/70777475/hcitool-lescan-returns-an-i-o-error-on-manjaro 发现如上使用 bluetoothctl 就能正常工作)

非特权安装 pip3
1
2
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py --user

如果报错 ModuleNotFoundError: No module named 'distutils.cmd',则需要安装 python3-distutils

安装运行 MiTemperature2

按照 MiTemperature2 文档进行安装。

安装 bluepy 前需要先安装 libglib2.0-dev

安装 pybluez 时可能遇到 error in PyBluez setup command: use_2to3 is invalid. 的问题,参考 https://github.com/pybluez/pybluez/issues/467,先 pip3 install setuptools==58 再安装即可。

之后遇到类似 https://github.com/JsBergbau/MiTemperature2/issues/106 的问题,以及类似 https://stackoverflow.com/questions/75175755/not-seeing-ble-device-advertising-unless-set-bluetoothctl-transport-le 的问题,都暂时没有被解决。

于是也放弃了。

配置 MC 服务器

安装 Java 8

由于该整合包版本需要 Java 8,而 Debian 官方源中没有,故使用第三方源安装。

准备工作:sudo apt install apt-transport-https ca-certificates wget dirmngr gnupg software-properties-common

添加第三方源:

1
2
wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo tee /etc/apt/trusted.gpg.d/adoptopenjdk.asc
sudo add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/

由于 adoptopenjdk 可能还没加上 bookworm 源,可能需要手动将源中的 bookworm 改为 bullseye

安装 Java 8 JRE:

1
2
sudo apt update
sudo apt install adoptopenjdk-8-hotspot-jre

添加为服务

添加为 systemd 服务,参考 https://gist.github.com/winny-/bb17853ffc76fbb9b039 进行修改。

/etc/systemd/system/minecraft.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Minecraft Server

[Service]
WorkingDirectory=/data/MC/RAD2-1.3/RAD2-Serverpack-1.3
User=thx
Type=forking
ExitType=cgroup
ExecStart=/usr/bin/tmux new-session -s mc -d './LaunchServer.sh'
ExecStop=/usr/bin/tmux send-keys -t mc:0.0 'say SERVER SHUTTING DOWN. Saving map...' C-m 'save-all' C-m 'stop' C-m
ExecStop=/bin/sleep 2

[Install]
WantedBy=multi-user.target

使用 Type=forking 来管理 tmux new-session fork 出的进程。

使用 ExitType=cgroup 等待所有程序退出。

]]>
+ + + <p>树莓派挂在宿舍当软路由已经两年了,大部分情况下都挺好用,透明代理体验也还算尚可。</p> +<p>然而由于使用的 USB 无线网卡驱动支持较差,无线峰值速率只能跑到 200+ Mbps,且不大稳定。并且树莓派性能不高,无法开设一些高负载服务。另外,树莓派作为路由常年开启,需要考虑散热问题,虽然给使用的小风扇写了启停功能,但是启动运转时还是会有一定的噪音,较为恼人。</p> + + + + + + + + + + +
+ + + 使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化 + + https://blog.centaurus99.top/2022/09/07/%E4%BD%BF%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E5%92%8C%E5%B0%8F%E7%B1%B3%E8%93%9D%E7%89%99%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%AE%A1%E5%8F%AF%E8%A7%86%E5%8C%96%E5%AE%BF%E8%88%8D%E6%B8%A9%E6%B9%BF%E5%BA%A6%E5%8F%98%E5%8C%96/ + 2022-09-06T16:50:20.000Z + 2022-09-06T16:50:20.000Z + + 最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,https://pvvx.github.io/ATC_MiThermometer/),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。

最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。

刷入定制固件

参考:

使用 https://github.com/pvvx/ATC_MiThermometer 中的定制固件,老外非常 NB,还写了一套网页直接在线刷固件:https://pvvx.github.io/ATC_MiThermometer/TelinkMiFlasher.html,在仓库中查看使用说明即可。

刷入定制固件后开启小米蓝牙温湿度计的蓝牙广播功能,这样树莓派不用连接就能接收温湿度广播数据了。由于周围环境较为可信且刻意调低了发射增益,我没有设置 PIN 码和加密,防止哪天忘了连不上。就是懒了

树莓派接收蓝牙广播

参考:使用树莓派定时读取小米温湿度传感器数据并发送到微信

也已经有老外编写了完善的接收程序,直接查看仓库中说明使用即可:https://github.com/JsBergbau/MiTemperature2

存入 InfluxDB 数据库

安装并配置 InfluxDB 数据库

参考:https://blog.csdn.net/qq_41475058/article/details/108050440

1
sudo apt install influxdb influxdb-client

然后数据库服务器会在 8086 端口上开始监听。似乎需要添加 admin 用户才能开启权限认证,我只需要它能跑起来就行就没管。懒了

1
2
3
4
influx  # 默认连接到localhost:8086
show users # 查看所有用户,默认没有
CREATE USER "pi" WITH PASSWORD '******' WITH ALL PRIVILEGES # 创建 pi 用户用于管理数据
create database mi # 创建 mi 数据库用于存放数据

将广播数据存入

编辑接收程序中的 sendToInflux.sh 如下:

sendToInflux.sh
1
curl -i -u "pi:PASSWORD" -XPOST http://127.0.0.1:8086/write?db=mi\&precision=s --data-binary "AquaraBluetoothSensors,sensorname=$2 temperature=$3,calibratedHumidity=$4,voltage=$5,batteryLevel=$6 $7"

然后 python3 LYWSD03MMC.py --atc --battery --callback sendToInflux.sh 即可开始接受广播数据并存入数据库。

此时在数据库中可以看到数据了:

1
2
3
use mi # 进入 mi 数据库
show measurements # 查看表,此时应有表 AquaraBluetoothSensors
select * from AquaraBluetoothSensors # 查看表中所有数据

还可以写个 service 来跑,比如编辑 /etc/systemd/system/MiTemperature.service

/etc/systemd/system/MiTemperature.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=MiTemperature advertisements receiver
After=network.target

[Service]
Type=simple
User=pi
Restart=always
RestartSec=5
WorkingDirectory=/home/pi/Git/MiTemperature2
ExecStart=/usr/bin/python3 LYWSD03MMC.py --atc --battery --callback sendToInflux.sh
StandardOutput=file:/home/pi/Git/MiTemperature2/output.log
StandardError=file:/home/pi/Git/MiTemperature2/error.log

[Install]
WantedBy=multi-user.target

开启服务并开机自启

1
2
sudo systemctl start MiTemperature.service
sudo systemctl enable MiTemperature.service

Grafana 可视化

参考官方说明,使用 apt 安装:https://grafana.com/docs/grafana/v9.0/setup-grafana/installation/debian/#install-from-apt-repository

1
2
3
4
5
6
sudo apt install apt-transport-https
sudo apt install wget # 说明中的 software-properties-common 我没装上,好像不影响
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/enterprise/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt-get install grafana-enterprise

然后编辑 /etc/grafana/grafana.ini 更换服务端口,启动服务:

1
2
sudo systemctl start grafana-server.service
sudo systemctl enable grafana-server.service

最后浏览器访问对应端口上的网页,默认用户名和密码是 admin,然后进行配置即可。Grafana 的功能蛮复杂的,有空可能单独开一篇来记录~

]]>
+ + + <p>最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,<a href="https://pvvx.github.io/ATC_MiThermometer/">https://pvvx.github.io/ATC_MiThermometer/</a>),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。</p> +<p>最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。</p> + + + + + + + + + + + + + + +
+ + + 使用 Clash + AdGuard Home 在树莓派软路由上搭建广告屏蔽与透明代理服务器 + + https://blog.centaurus99.top/2022/09/02/%E4%BD%BF%E7%94%A8-Clash-AdGuard-Home-%E5%9C%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E8%BD%AF%E8%B7%AF%E7%94%B1%E4%B8%8A%E6%90%AD%E5%BB%BA%E5%B9%BF%E5%91%8A%E5%B1%8F%E8%94%BD%E4%B8%8E%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8/ + 2022-09-02T07:24:44.000Z + 2023-05-08T07:04:30.000Z + + 之前 【补档】树莓派折腾记录 中也记录过了相关内容,但是一年过来有些地方有些变动与改进,故单开一篇重新记录并长期更新。

配置 Clash 进行透明代理

TODO

配置 AdGuard Home 进行广告屏蔽

TODO

防火墙

作为一个挂在公网下 7×24h 运行的网关服务器,进行一定的防火墙配置是必不可少的。这里主要通过 iptables 和 ip6tables 实现。

由于使用了 iptables-persistent 进行 iptables 规则可持久化,方便起见下面就直接把保存的规则文件贴上来了。

IPv4

/etc/iptables/rules.v4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
*filter
# INPUT 和 FORWARD 链上默认 DROP 掉
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# 防止外网使用内网 IP 欺骗
-A INPUT -i eth0 -s 192.168.0.0/16 -j DROP

# 允许本机、内网以及已建立的连接通过和转发
-A INPUT -i lo -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -i wlx1cbfceb110dc -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i docker0 -j ACCEPT
-A FORWARD -i wlx1cbfceb110dc -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# 开放外网 SSH, HTTP, HTTPS 连接
-A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT

COMMIT


*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 新建 clash 链
:clash - [0:0]

# 内网 TCP 请求转发给 clash 链
-A PREROUTING -s 192.168.0.0/16 -p tcp -j clash

# 将转发后的包源地址修改为本机地址
-A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE

# 访问本机和内网不经过 clash
-A clash -d 10.0.0.0/8 -j RETURN
-A clash -d 127.0.0.0/8 -j RETURN
-A clash -d 169.254.0.0/16 -j RETURN
-A clash -d 172.16.0.0/12 -j RETURN
-A clash -d 192.168.0.0/16 -j RETURN
-A clash -d 224.0.0.0/4 -j RETURN
-A clash -d 240.0.0.0/4 -j RETURN

# 访问校园网不经过 clash
-A clash -d 59.66.0.0/16 -j RETURN
-A clash -d 101.5.0.0/16 -j RETURN
-A clash -d 101.6.0.0/16 -j RETURN
-A clash -d 118.229.0.0/19 -j RETURN
-A clash -d 166.111.0.0/16 -j RETURN
-A clash -d 183.172.0.0/15 -j RETURN
-A clash -d 202.112.39.2/32 -j RETURN
-A clash -d 219.223.168.0/21 -j RETURN
-A clash -d 219.223.176.0/20 -j RETURN

# 其余请求重定向至 clash 端口
-A clash -p tcp -j REDIRECT --to-ports 7891

COMMIT

IPv6

参考:https://www.sixxs.net/wiki/IPv6_Firewalling

关于为何 DHCPv6 相比 DHCPv4 要额外设置,参考:https://unix.stackexchange.com/questions/452880/what-are-the-essential-iptables-rules-for-ipv6-to-work-properly

RFC 4890 给出了针对 ICMPv6 的防火墙配置建议,由于时间有限未能细读与实现。

RFC 5095 废除了 Type 0 Routing Headers,防火墙中给予了实现。

Updated 2023-05-08: 在之前配置完 IPv6 NAT 网络后,并没有为 IPv6 配置代理。随着 IPv6 的不断推广,部分被墙网站出现了使用本地代理可以访问,透明代理无法访问的情况,包括但不限于 v2ex.com,Youtube 的视频播放等,于是也为 IPv6 配置了代理。原本使用的 Clash Premium 2022.08.26 版本的 IPv6 代理似乎有 bug,需要进行升级。由于想继续使用 AdGuardHome 统计 DNS 查询信息,故需要依赖 Clash 的 redir-host 功能(该功能在 Premium 2023.02.16 版本被弃用),因此选用 Clash Premium 2023.01.29 版本。巧合的是,Premium 2023.01.29 版本将核心版本升级到了 1.13.0,该版本添加了对 IPv6 REDIRECT 的支持(#2473),这让 IPv6 的代理成为了可能。相关改动已同步到下方规则文件中。

/etc/iptables/rules.v6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Filter all packets that have RH0 headers. Refer to RFC 5095
-A INPUT -m rt --rt-type 0 -j DROP
-A FORWARD -m rt --rt-type 0 -j DROP
-A OUTPUT -m rt --rt-type 0 -j DROP

# Allow trusted link to INPUT and FORWARD
-A INPUT -i lo -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -i wlx1cbfceb110dc -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i docker0 -j ACCEPT
-A FORWARD -i wlx1cbfceb110dc -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow DHCPv6
-A INPUT -p udp --dport 546 -d fe80::/10 -j ACCEPT

# Allow ICMPv6
-A INPUT -p icmpv6 -j ACCEPT

# Allow some server port
-A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT

COMMIT


*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:clash - [0:0]

# 内网 TCP 请求转发给 clash 链
-A PREROUTING -s fd22:41b7:e060::/64 -p tcp -j clash

# 将转发后的包源地址修改为本机地址
-A POSTROUTING -s fd22:41b7:e060::/64 -o eth0 -j MASQUERADE

# 访问内网和校园网不经过 clash
-A clash -d fd22:41b7:e060::/64 -j RETURN
-A clash -d 2402:f000::/32 -j RETURN

# 其余请求重定向至 clash 端口
-A clash -p tcp -j REDIRECT --to-ports 17891

COMMIT
]]>
+ + + <p>之前 <a href="/2021/07/11/%E3%80%90%E8%A1%A5%E6%A1%A3%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/#%E4%BD%BF%E7%94%A8-USB-%E7%BD%91%E5%8D%A1">【补档】树莓派折腾记录</a> 中也记录过了相关内容,但是一年过来有些地方有些变动与改进,故单开一篇重新记录并长期更新。</p> + + + + + + + + + + + + + + + + +
+ + + 树莓派软路由配置 IPv6 网络 + + https://blog.centaurus99.top/2022/09/02/%E6%A0%91%E8%8E%93%E6%B4%BE%E8%BD%AF%E8%B7%AF%E7%94%B1%E9%85%8D%E7%BD%AE-IPv6-%E7%BD%91%E7%BB%9C/ + 2022-09-01T16:24:49.000Z + 2022-09-03T13:02:26.000Z + + 树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。

网络环境:树莓派有线网卡 eth0 作为 WAN 口连接 IPv4 + IPv6 双栈的校园网,USB 无线网卡 wlx1cbfceb110dc 作为无线 AP 提供局域网,USB 网卡的驱动和 AP 的搭建见 【补档】树莓派折腾记录

网桥透传法

由于我的 IPv6 网络并没有透明代理的需求,所以其实在两个网卡间搭个网桥,把树莓派作为二层网络设备(类似交换机)使用即可。主要问题在于限制网桥只走 IPv6 流量,这个使用 ebtables 即可,局域网中的网络设备会联系校园网的网关获取到 IPv6 地址等信息。

部署完后才发现,校园网的 IPv6 也是需要登录认证的,所以这样整的话每次联网都需要手动登录,所以最终弃用了 QAQ.

主要参考:http://www.xingbin.net/blog_channel8/C/CampusNetwork_IPv6/

建立网桥:sudo brctl addbr ipv6br

启动网桥:sudo ifconfig ipv6br up

只允许 IPv6 数据包通过网桥:sudo ebtables -t broute -A BROUTING -p ! ipv6 -j DROP

这一步如果遇到了 RULE_APPEND failed (No such file or directory): rule in chain BROUTING. 之类的错误的话,可能是因为使用了基于 nf_tables 而不是 xtables 的 ebtables,(参见:https://sources.debian.org/src/iptables/1.8.2-4/debian/NEWS/),此时使用 ebtables-legacy 即可。

添加 eth0 进入网桥:sudo brctl addif ipv6br eth0

添加 wlx1cbfceb110dc 进入网桥:sudo brctl addif ipv6br wlx1cbfceb110dc

注意: 建议先设置 ebtables 再添加网卡,否则直接将网卡添加进网桥的话会导致 IPv4 流量都进入网桥,从而无法正常连接以及丢失 SSH 连接。

以上配置重启后会消失,需要可持久化的话可以参考 http://blog.yesterday17.cn/post/pi-router/ 中的配置。

NAT for IPv6

IPv6 网络中本不应使用 NAT,然而校园网中获得的 IPv6 地址使用 ifconfig 查看是 prefixlen 128 的(或许是由 prefixlen 64 的地址生成的?这块儿我不是很明白),并且对每一个 IP 都会要求身份认证,给连入宿舍局域网中的设备带来了一定的麻烦。于是选择搭建 NAT 网络,共用同一个校园网 IPv6 地址。

局域网中使用唯一本地 IPv6 单播地址 (ULA, Unique Local IPv6 Unicast Address, RFC 4193),要求拥有固定前缀 fd00::/8,然后是 40 位随机 Global ID(关于随机的必要性见:https://blogs.infoblox.com/ipv6-coe/3-ways-to-ruin-your-future-network-with-ipv6-unique-local-addresses-part-2-of-2/)。然而为了手打地址方便,我还是使用了有某种实际意义的地址:fd22:41b7:e060::/64至少没用全零

首先开启 IPv6 内核转发,编辑 /etc/sysctl.conf

/etc/sysctl.conf
1
2
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.accept_ra=2

关于 accept_ra 的设置参考:https://sysctl-explorer.net/net/ipv6/accept_ra/,大概是因为开启转发后会自动关闭 Accept Router Advertisements,设置值为 2 可以强制开启。

接着使用 dhcpcd 配置内网无线 AP 网卡的固定静态地址,在 /etc/dhcpcd.conf 中添加 static ip6_address,编辑后如下:

/etc/dhcpcd.conf
1
2
3
4
interface wlx1cbfceb110dc
static ip_address=192.168.22.1/24
static ip6_address=fd22:41b7:e060::/64
nohook wpa_supplicant

重启 dhcpcd 生效:sudo systemctl restart dhcpcd.service

然后使用 dnsmasq 配置地址分配相关服务,这里在内网同时开启 SLAAC 和 DHCPv6,编辑 /etc/dnsmasq.conf 后如下:

/etc/dnsmasq.conf
1
2
3
4
5
6
7
8
interface=wlx1cbfceb110dc
dhcp-range=192.168.22.100,192.168.22.200,255.255.255.0,24h
dhcp-range=fd22:41b7:e060::1,fd22:41b7:e060::fe,slaac,1h
dhcp-option=3,192.168.22.1
dhcp-option=6,192.168.22.1
dhcp-option=option6:dns-server,[fd22:41b7:e060::]
enable-ra
dhcp-authoritative

重启 dnsmasq 生效:sudo systemctl restart dnsmasq.service

再通过 ip6tables 在 POSTROUTING 链上做一个 SNAT 即可:

1
sudo ip6tables -t nat -A POSTROUTING -s fd22:41b7:e060::/64 -o eth0 -j MASQUERADE

上面配置了树莓派为 DNS 服务器,树莓派使用 Clash 和 Adguard Home 搭建 IPv4 与 IPv6 双栈 DNS 服务,上游服务器也均为双栈 DNS 服务器,重连设备获取 IP 后即可正常使用了。

如果要指定 DNS 服务器可以在 dnsmasq 中类似配置,以 TUNA DNS666 服务器为例:dhcp-option=option6:dns-server,[2001:da8::666]

配置的 SLAAC 支持使 Android 手机也能正常使用 IPv6 服务。

经测试,内网设备使用 IPv6 单栈也可以正常访问双栈或 IPv6 单栈网页。

一些测试网站

参考

]]>
+ + + <p>树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。</p> + + + + + + + + + + + + +
+ + + 使用acme.sh自动配置泛域名证书 + + https://blog.centaurus99.top/2022/06/21/%E4%BD%BF%E7%94%A8acme-sh%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E6%B3%9B%E5%9F%9F%E5%90%8D%E8%AF%81%E4%B9%A6/ + 2022-06-21T15:11:15.000Z + 2022-06-21T15:35:36.000Z + + 一年前用学生邮箱白嫖的域名要到期了,于是换了个便宜的 .top 域名,正好之前忘了记录自动签证书的过程了,这里记录一下以后再换域名的时候直接来抄。

由于同时有很多子域名在用,于是决定申请泛域名证书,共用同一个。

主要参考 官方文档 ,记录了仅适用于我个人的配置过程。

安装 acme.sh

1
curl  https://get.acme.sh | sh -s email=my@example.com

配置 DNS API

参考 官方文档

泛域名证书似乎需要用 DNS 验证,我的 DNS 解析是托管在 Cloudflare 上的,先登录获取 API 密钥,这里我图省事直接用了 Global API Key,然后:

1
2
export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Email="xxxx@sss.com"

生成/安装证书

生成证书:

1
acme.sh --issue --dns dns_cf -d centaurus99.top -d *.centaurus99.top

安装证书:

1
acme.sh --install-cert -d centaurus99.top --key-file /etc/v2ray/v2ray.key --fullchain-file /etc/v2ray/v2ray.crt --reloadcmd "sudo nginx -s reload"

据文档所说,DNS API 使用的变量,生成/安装参数都会被保存用于自动更新,60 天以后证书会自动更新并自动执行安装。下面再去 nginx 里配置证书位置即可。大功告成!

附录

1
2
3
root@cc:~/.acme.sh# acme.sh -v
https://github.com/acmesh-official/acme.sh
v3.0.5
]]>
+ + + <p>一年前用学生邮箱白嫖的域名要到期了,于是换了个便宜的 <code>.top</code> 域名,正好之前忘了记录自动签证书的过程了,这里记录一下以后再换域名的时候直接来抄。</p> +<p>由于同时有很多子域名在用,于是决定申请泛域名证书,共用同一个。</p> +<p>主要参考 <a href="https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E">官方文档</a> ,记录了仅适用于我个人的配置过程。</p> + + + + + + + + +
+ + + Icarus主题配置日记 + + https://blog.centaurus99.top/2022/01/15/Icarus%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE%E6%97%A5%E8%AE%B0/ + 2022-01-15T08:04:59.000Z + 2022-08-30T14:15:07.000Z + + 不知怎么发现了 Icarus 这个主题,看起来不错,尝试改一改换上。

为了方便自定义,采用源码安装的形式。其实踩了遍直接 npm 安装的坑

本篇博客将和我自定义后的主题 Icarus个人修改版 保持同步更新~

Icarus 安装

配置 Hexo

截至 2022-01-15,Icarus 还没有官方支持 Hexo 6.0.0,所以如果在这个时间点使用默认方式安装 Hexo 并装上了 6.0.0 版本的话,大概需要手动降级。

Updated 2022-01-16:Icarus 已有支持 Hexo 6.0.0 的预发布版本。

我是将 package.json 中将 Hexo 的版本从 6.0.0 改为了 5.4.0,然后 npm update

然后在 _config.yml 中将主题改为 Icarus

1
theme: icarus

可以选择将不用的默认主题 hexo-theme-landscape 卸载掉

安装 Icarus

为了方便对主题单独进行管理,我先将主题 Fork 一份到自己的 Github 上,即 Icarus个人修改版,然后通过 git 子模块进入到博客中来。

在博客根目录下使用如下命令:

1
git submodule add https://github.com/Centaurus99/hexo-theme-icarus.git themes/icarus

这样,即使到一台新设备上,也只需要在 clone 之后在项目目录下多一步 git submodule update --init,就能获取到主题了。

此时直接开始运行会发现缺少依赖,手动安装一下即可(直接 npm 安装也可能会遇到这个问题,参考 Issue#855)。

1
npm install --save bulma-stylus@0.8.0 hexo-renderer-inferno@^0.1.3

配置 Icarus 主题

themes/icarus/ 下没有配置文件的前提下(如果有就删了),可以先运行一下 hexo server ,会在博客根目录下自动生成 _config.icarus.yml 配置文件,在这里配置而不是主题目录下配置即可保持主题源码不含个人配置文件。

接着就可以对着 官方文档 配置自己的主题啦。

一些个性化的东西这里就不做记录了,记录一些功能的配置过程。

关于显示更新时间问题

这实际是不是主题配置相关内容,只是记录一下,如果使用 Git 管理博客源码,记得把 _config.yml 中的 updated_option 改为 'date',这样显示的更新时间是由博客 Front-matter 标记中的 updated 决定的,而不是由文件修改时间决定。

使用二次开发后的主题

这里发现有个大佬对主题做了很多不错的修改 大佬博客,可以提个 PR 到自己这儿来使用。源码

这个代码直接使用可能会因为编码规范问题不通过 Code Linting 检查,npm run lint 可以查看问题,可以临时在 package.json 中的 scripts > lint 对应的命令里添加 –fix 尝试自动修复,剩下的问题就要手动修复了。

评论插件

由于 Gitalk 请求的账户权限太高,又不想使用依托于其他第三方服务的评论插件,同时 Valine 又有着安全问题,Isso 又感觉较为简陋,所以最终选择了 Waline 评论插件。正好手头上有个 VPS,可以自建评论服务器。

twikoo 也是一个很不错的评论插件,不过由于不支持独立部署(imaegoo/twikoo#163)以及外观上更喜欢 Waline 的缘故,最终还是选择了 Waline

客户端配置

参考 Icarus评论插件文档,只需要在 _config.icarus.yml 中修改评论插件配置就可以啦。

1
2
3
comment:
type: waline
server_url: 服务端地址

服务端配置

目前本博客的评论服务器为自建服务器,参考 官方文档 搭建,以下为搭建过程记录(方便重建的时候过来直接 copy)。

> 创建对应用户

以下过程可能需要 sudo 权限,并非必须步骤。

新建一个无法直接登录的用户用于运行 waline 服务:

1
sudo adduser waline --disabled-login --disabled-password

切换到该用户:

1
sudo su - waline

使用 npm 安装 waline

1
npm install @waline/vercel
> 配置 MySQL 数据库

参考 大佬博客

1
2
3
4
5
6
7
8
9
10
11
--创建新的数据库,并设置数据库编码
$ CREATE DATABASE 你的数据库名 DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

--创建新的用户
$ CREATE USER '你的用户名'@'你的服务器IP' IDENTIFIED BY '你的密码';

--把数据库的管理权限给予刚刚创建的MySQL用户
$ GRANT ALL PRIVILEGES ON *.* TO '你的用户名'@'%';

--刷新权限,使用设置生效
$ FLUSH PRIVILEGES;

执行数据库初始化脚本 waline.sql,可以先登录到对应 MySQL 账户下,然后:

1
2
USE 你的数据库名;
SOURCE 脚本文件位置;
> 配置评论通知

参考 https://waline.js.org/guide/server/notification.html ,这里我只配置了邮件通知,见下面的配置文件。

> 配置为服务运行

可以先试一下能否直接运行,先配置环境变量:

1
2
3
export MYSQL_DB=你的数据库名
export MYSQL_USER=你的用户名
export MYSQL_PASSWORD=你的密码

然后尝试运行:

1
node node_modules/@waline/vercel/vanilla.js

如果没啥问题,就可以配置成服务了。

编辑文件 /etc/systemd/system/waline.service,如下配置:

/etc/systemd/system/waline.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Unit]
Description=Waline Comment Server

[Service]
Type=simple
User=waline
WorkingDirectory=/home/waline
ExecStart=/usr/bin/node /home/waline/node_modules/@waline/vercel/vanilla.js
Environment=MYSQL_DB=你的数据库名
Environment=MYSQL_USER=你的用户名
Environment=MYSQL_PASSWORD=你的密码
Environment=SMTP_SERVICE=SMTP 邮件发送服务提供商
Environment=SMTP_USER=SMTP 邮件发送服务的用户名
Environment=SMTP_PASS=SMTP 邮件发送服务的密码
Environment=SITE_NAME=网站名称
Environment=SITE_URL=网站地址(要去除末尾的'/'
Environment=AUTHOR_EMAIL=博主邮箱
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

然后使用 sudo systemctl enable --now waline.service 启动并设为开机自启动。

之后配置 Web 服务器转发到本地 8360 端口即可。Nginx 里可以这样配置:

1
2
3
4
5
6
7
8
9
10
11
12
location / {
proxy_pass http://127.0.0.1:8360/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
# cache
add_header Cache-Control no-cache;
expires 12h;
}

然后就可以去博客里测试一下了,第一个注册的用户将成为管理员。

使用 patch-package 修改第三方模块

主题中使用到的一些模块可能需要修改源码进行个性化,比如 hexo-component-inferno 中没有使用最新的 waline 前端模块,想要手动配置。可以使用 patch-package 来进行易于管理的修改。

  • 首先 npm install patch-package 安装

  • 然后在 node_modules/ 中修改源码

  • 运行 npx patch-package package-name 生成补丁文件

  • package.json 中加入执行脚本:

    1
    2
    3
      "scripts": {
    + "postinstall": "npx patch-package"
    },

这样之后就可以在 npm install 时自动打上个性化补丁了。

暗黑主题

参考:https://github.com/ppoffice/hexo-theme-icarus/issues/564

Waline 评论插件中代码高亮样式问题

如图:

研究一番后发现, Waline 使用 Prism 进行代码高亮,它会直接对代码的不同高亮的部分赋上不同的类,这个类名不会使用 namespace 进行保护(加个前缀啥的),这样的类名有 tag , number 等等。

比如上图代码中的 html 标签 <head> 会格式化为:

1
2
3
4
5
6
7
<span class="token tag">
<span class="token tag">
<span class="token punctuation">&lt;</span>
head
</span>
<span class="token punctuation">&gt;</span>
</span>

恰巧的是,Icarus 中使用了 CSS 框架 bulma,对 tag , number 之类的样式进行了设定,这就导致了评论区代码高亮出现问题。

PrismIssue#1324 中也提到了该问题并给出了解决方法,但由于评论区的代码高亮是在评论服务端完成的,懒得去改服务端代码了,于是就自定义 CSS 进行覆盖,顺便也解决一下默认情况下评论区中黑色代码块和主题格格不入的问题,适配一下明暗两种主题。commit#974b1c9

效果:

参考

附录:个性化修改记录

主要记录一下我的主题源码有什么额外的改动。

  • a05b870 为解决关于 Code Linting 的问题,对代码格式进行了一些修正。
  • 248a768 删除了 merge 过来的代码中的个人配置文件。
  • 229543d 个人信息页面上将 关注我 修改为 关注
  • e38ae7c 删除了 merge 过来代码中的个人 logo。
  • 658686a 将黑幕添加到 css 中便于直接使用。
  • 74416d2 添加暗黑主题,并在后面几个 commit 中进行适配。
  • 1544bb3 修改了代码块中字体大小。
  • 974b1c9 适配 Waline 评论插件中代码块的主题风格(包括黑白两种主题)。
  • 6b5da24 例行同步上游更新。
  • dcb178c 修复上游更新中引起的纯文字 logo 边角被上层容器覆盖的问题。
  • 3a3c5e6 修复上游更新中 Waline 评论插件升级至 v2 后 CSS 类开头从 v 改为 wl- 引起的问题。
]]>
+ + + <p>不知怎么发现了 <a href="https://github.com/ppoffice/hexo-theme-icarus">Icarus</a> 这个主题,看起来不错,尝试改一改换上。</p> +<p>为了方便自定义,采用源码安装的形式。<span class="heimu">其实踩了遍直接 npm 安装的坑</span></p> +<p>本篇博客将和我自定义后的主题 <a href="https://github.com/Centaurus99/hexo-theme-icarus">Icarus个人修改版</a> 保持同步更新~</p> + + + + + + + + + + + + +
+ + + Hexo博客架设日记 + + https://blog.centaurus99.top/2022/01/14/Hexo%E5%8D%9A%E5%AE%A2%E6%9E%B6%E8%AE%BE%E6%97%A5%E8%AE%B0/ + 2022-01-14T08:21:04.000Z + 2022-09-02T15:03:01.000Z + + 好久之前就想把博客搭起来的来着,结果一直咕到了现在,终于有空来搭啦 ✿✿ヽ(°▽°)ノ✿

博客使用 Hexo 搭建,博客源码位于 https://github.com/Centaurus99/centaurus99.github.iomaster 分支,静态页面同步部署于 gh-pages 分支和个人 VPS 上。

下面是搭建(踩坑)记录~ 其实是搭完后的回忆

Hexo 安装

对着官方文档搞,没啥好说 QWQ。

先装 nodejs,我这儿装的版本是 v16.13.2

然后 npm install -g hexo-cli

最后到博客文件夹下 hexo init,然后 npm install,完成!

GitHub Pages 的自动部署

关于如何使用 Hexo 写博客之类的官方文档里都有介绍,这儿就记录一点自动化部署的设置吧。

为了方便管理,我这儿将博客源码和部署后的静态页面放在了同一个库中,下面的配置以我的配置为例。

为了使用 用户名.github.io 访问,需要创建名为 用户名.github.io 的存储库。

配置 Hexo

首先配置运行 hexo deploy 时的部署方式。

先安装 Git 部署插件:

1
npm install hexo-deployer-git --save

然后在 _config.yml 中修改配置:

1
2
3
4
deploy:
type: git
repository: git@github.com:Centaurus99/centaurus99.github.io.git
branch: gh-pages

这样然后运行:

1
2
hexo generate
hexo deploy

应该就能在仓库的对应分支看到部署好的静态页面啦~

在仓库的 Settings > Pages 中将 Source 设为 gh-pages 分支,然后就可以通过 用户名.github.io 访问到博客了。

如果以后还要拓展部署方式,还可以继续往配置里面添加,如果用到了再来更新~

配置 Github Actions

Github Actions 是个好东西,搞自动工作流非常方便,白嫖真香!

这个部分基本是参照大佬的博客完成的,参见:https://tommy.net.cn/2020/08/06/deploy-hexo-with-github-actions/

仅对配置文件做了一点更新和修改,最终如下:

2022-01-15 更新:由于将主题以子模块的形式加入版本控制,添加了 submodules: 'recursive' 表示递归检出子模块

2022-09-02 更新:添加环境变量 TZ: Asia/Shanghai 设定时区,确保本地和远端生成的日期路径相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
name: Hexo Deploy

on:
push:
branches:
- master

env:
TZ: Asia/Shanghai

jobs:
build:
runs-on: ubuntu-latest
if: github.event.repository.owner.id == github.event.sender.id

steps:
- name: Checkout source
uses: actions/checkout@v2
with:
ref: master
submodules: 'recursive'

- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: '16'

- name: Setup Hexo
env:
ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.email "1102569568@qq.com"
git config --global user.name "Centaurus99"
npm install hexo-cli -g
npm install

- name: Hexo deploy
run: |
hexo clean
hexo deploy

这样,当我更新博客源码时,Github 就会帮我自动部署好静态页面啦。

配置 Webhooks

手头还有一台 VPS,还是打算把它作为博客的服务器。

Github 上有个功能叫 Webhooks,可以在你的库发生一些动作(比如有人 push 东西上来)的时候对着一个网址发个请求。利用这个就可以在更新时通知我的 VPS 去 pull 最新的静态分支,从而实现自动部署了。

关于 Web 服务器的搭建,Nginx 的使用这里就不记录了。 摆烂咯!

Webhooks 的使用也是学习大佬的博客,参见:https://maphical.cn/2020/03/build-blog-using-hexo/

在部署这个的过程中遇到了一堆奇奇怪怪的问题,由于时间久远了记不太清了,这里就不做记录了。 摆烂咯!×2

依稀记得一点点,比如脚本跑不起来考虑是 php 用户权限问题,最终通过给予它运行 git 命令的 sudo 权限解决;git pull 每次在更新的时候都需要处理冲突问题,原因是上面那个 git 部署工具每次会将这个分支完全覆盖,包括历史 commit 都会被删除,所以在一开始选择 pull 方式的时候要选择 rebase。

由于我把博客源码和静态页面放在了同一个存储库内,这会导致 Webhooks 每次更新会被激活两遍(两个分支的更新各激活一遍),不过问题不大。

总结

关于博客的配置文件 _config.yml 可以在我的 Github 对于仓库找到。

这样就完成了博客的自动化部署的配置,下一篇博客将记录配置主题的吐血过程。

参考

]]>
+ + + <p>好久之前就想把博客搭起来的来着,结果一直咕到了现在,终于有空来搭啦 ✿✿ヽ(°▽°)ノ✿</p> +<p>博客使用 <a href="https://hexo.io/">Hexo</a> 搭建,博客源码位于 <a href="https://github.com/Centaurus99/centaurus99.github.io">https://github.com/Centaurus99/centaurus99.github.io</a> 的 <code>master</code> 分支,静态页面同步部署于 <code>gh-pages</code> 分支和个人 VPS 上。</p> + + + + + + + + + + +
+ + + 【补档】树莓派折腾记录 + + https://blog.centaurus99.top/2021/07/11/%E3%80%90%E8%A1%A5%E6%A1%A3%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/ + 2021-07-11T02:02:33.000Z + 2022-09-06T11:47:41.000Z + + 2021 年初的时候入手了树莓派 4b,然后暑假的时候好好折腾了一下,留下了一些零散的记录,在这里整理起来,之后哪天重建的时候还能来参考一下。

由于距离记录已经有一段时间了,可能有些内容会有偏差。

初步尝试

参考:http://blog.dngz.net/RaspberryPiKodbox.htm

系统安装

尝试装了适配树莓派的 Ubuntu,后来还是为了更好的硬件兼容性换成官方系统了。

当时本着尝鲜的想法,选择了仍在 beta 测试中的官方 64-bit 系统 2021-05-07-raspios-buster-arm64-lite,由于计划作为服务器运行,不需要图形桌面,所以就选择了 lite。

注:现在官方 64-bit 系统已经正式发布了(https://www.raspberrypi.com/news/raspberry-pi-os-64-bit/)。

官网也给出了烧写 SD 卡的工具 Raspberry Pi Imager,GUI 好看,烧录系统非常方便。

初始配置

系统烧录完成后会有一个 boot 分区,做一些初始化的配置再进行第一次开机。

开启 ssh 服务

boot 分区下新建一个空文件,名为 ssh

开机自动连接 WIFI

boot 分区下新建 wpa_supplicant.conf 文件,内容如下:

1
2
3
4
5
6
7
8
9
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="wifi链接名"
psk="wifi密码"
key_mgmt=WPA-PSK
}

初次启动

插电开机~

ssh 可以连接,初始用户名 pi ,密码 raspberry

记得修改密码。

解锁root

sudo passwd root 修改 root 密码。

sudo passwd --unlock root 解锁 root 用户。

由于安全原因,默认情况下 root 是不能用 ssh 登录的,如果一定需要的话,编辑 /etc/ssh/sshd_config,将配置项 #PermitRootLogin prohibit-password 修改为 PermitRootLogin yes,然后 sudo systemctl restart sshd 重启 ssh 服务即可。

校正时区

sudo dpkg-reconfigure tzdata

选择 Asia/Shanghai 即可。

树莓派配置工具 raspi-config

sudo raspi-config

换源

参考:https://blog.csdn.net/baidu_26678247/article/details/108930421

如果遇到 The repository 'http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian buster InRelease' is not signed 错误,可以按如下操作添加公钥(参见:https://www.jianshu.com/p/c64deffb1308

1
2
gpg --keyserver  keyserver.ubuntu.com --recv-keys 9165938D90FDDD2E
gpg --export --armor 9165938D90FDDD2E | sudo apt-key add -

一些杂项

GPIO

使用 raspi-config 打开 GPIO

sudo apt-get install wiringpi

按照 http://wiringpi.com/wiringpi-updated-to-2-52-for-the-raspberry-pi-4b/ 更新 wiringpi 版本

gpio readall 即可查看 GPIO 概况

进一步配置 WIFI

参考:https://www.cnblogs.com/zhangyuejia/p/8945354.html

然后 sudo ifconfig wlan0 down 关闭 wifi,sudo ifconfig wlan0 up 启动 wifi。

超频

参考:https://cyfeng.science/2020/06/26/Unboxing-Raspberry-Pi-4B-8GB-and-Overclocking/

注意默认情况下 over_voltage 最大为 6

查看CPU频率:sudo watch -n 1 cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq

查看CPU温度:sudo watch -n 1 cat /sys/class/thermal/thermal_zone0/temp

CPU 电源计划

echo "powersave" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 可以将CPU设为省电模式,固定600MHz

echo "ondemand" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 设置回默认模式

风扇控制

风扇一直开着噪声大,也影响风扇寿命,设置一下温控。

为了美观,网购了一个插在 GPIO 座上的风扇插座,勉强塞进了外壳。

使用 raspi-config 自带的风扇控制需要注意,若使用 i2c 端口作为控制口,需要将 i2c 关闭。

使用 sudo -E rpi-eeprom-config --edit 设置 WAKE_ON_GPIO=0POWER_OFF_ON_HALT=1 可以在 shutdown 之后使风扇也关闭(否则关机后风扇会开始一直转)。

通过蓝牙 ssh 连接

即通过蓝牙连接创建局域网。

参考:

连接操作:更改适配器选项 -> 蓝牙网络连接 -> 查看蓝牙网络设备 -> 选中,连接时使用 -> 接入点

后来不知道装了啥蓝牙连不上了,排查之后发现似乎是 /usr/bin/bt-agent -c NoInputNoOutput 失效了,并不会自动配对,需要手动配对。(仍未解决,但也不怎么用蓝牙连接了)

OLED 显示屏

低价搞到一个小的 OLED 显示屏,装上。

由于风扇座占掉了 i2c1,只能通过奇技淫巧使用 i2c0 ,参考 https://blog.csdn.net/weixin_46145842/article/details/106128144 设置

驱动和使用参考:https://shumeipai.nxez.com/2019/04/29/use-the-ssd1306-oled-display-on-the-raspberry-pi.html

持续连接校园网

在 Github 上找了各种连校园网的轮子,试到最后只有这个能够稳定使用:

使用 https://github.com/z4yx/GoAuthing 对应程序和 service。

无线 AP 与路由

使用 RaspAP 创建无线 AP(已弃用)

RaspAP

手动安装教程:https://docs.raspap.com/manual/

开启 802.11ac

参考 https://docs.raspap.com/faq/#80211ac

信道选择 36 ,实测 48 无法开启,40 速率较慢。

流量监控问题

参考 https://github.com/RaspAP/raspap-webgui/issues/689 末尾。

sudo apt-get purge vnstat 卸载原来的 vnstat。

curl -O https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/pool/universe/v/vnstat/vnstat_1.18-1_arm64.deb 下载旧版 vnstat。

sudo dpkg -i vnstat_1.18-1_arm64.deb 安装。

echo "vnstat hold" | sudo dpkg --set-selections 禁用更新。

使用 OpenWrt-Docker(也已弃用)

安装 docker:参考 https://openwrt.club/93.html

增加用户权限:https://www.cnblogs.com/codeaaa/p/9041533.html

hostapd + dnsmasq + OpenWrt-Dockerhttps://zhuanlan.zhihu.com/p/163827788

使用的 OpenWrt-Docker

注意: 设置 dnsmasq 配置文件的时候一定要反注释bind-interfaces,不然会出现地址占用错误。

Openwrt 配合 AdGurad Home 屏蔽广告和 ShadownSocksR Plus 用于翻墙,参考:https://blog.zfdang.com/2020/07/adguard-home-work-with-ssr-plus-in-openwrt/

板载 WLAN 优化

sudo iw wlan0 set power_save off 关闭节能可以提高速度与稳定性。

使用 USB 网卡

板载网卡性能和稳定性还是不足的,于是入手了一个 USB 无线网卡。

由于预算有限,又想要 867Mbps 的 5G 频段支持,于是入手的网卡是 RTL8812BU 芯片,在驱动方面问题多多,悲。

驱动安装

支持 RaspberryOS(64bit) 的驱动地址:https://github.com/morrownr/88x2bu

关于 iw phy 输出参数的具体说明:https://c4pr1c3.github.io/cuc-mis/chap0x02/rt3572l_explained.html

优化WiFi睡眠:https://github.com/fastoe/RTL8812BU_for_Raspbian

关于 /etc/modprobe.d/88x2bu.conf 的一点额外说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
There's four parms listed in the document you cite.
Code: Select all

rtw_power_mgnt=0|1|2
0 == disable power saving
1 == power saving on, minPS
2 == power saving on, maxPS
Code: Select all

rtw_enusbss=0|1
0 == disable auto suspend
1 == enable auto suspend
Code: Select all

rtw_hwpwrp_detect=0|1
0 == disable HW power pin detection
1 == enable HW power pin detection
Code: Select all

rtw_ips_mode=0|1
0 == low power, IPS_NORMAL
1 == higher power, IPS_LEVEL2
The conventional wisdom, because we're running our RPis as server systems not clients, is to set rtw_power_mgnt=0 and rtw_enusbss=0 to prevent the dongle going into power saving and to ignore the other two parms because they don't make any difference. If the server goes into power saving we'd need a process to wake it up. That's different from a client system where interaction from a keyboard user will trigger a request to wake up and associate the dongle.

最终配置文件为:

1
options 88x2bu rtw_drv_log_level=2 rtw_led_ctrl=1 rtw_vht_enable=2 rtw_power_mgnt=0 rtw_switch_usb_mode=1 rtw_ips_mode=1 rtw_enusbss=0 rtw_beamform_cap=11

由于购买的网卡为 USB2.0 接口,不支持 USB3.0,需要 rtw_switch_usb_mode=0/2 才能正常使用。

一些关于 RTL8812BU 驱动 / hostapd 的问题

hostapd 完整配置文件注释:https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf

配置文件中最好去除注释,可能会有奇怪的问题

这张网卡无法在初始启动时应用 ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40] 设置 40/80MHz 带宽,似乎是网卡直接 UNINITIALIZED->HT_SCAN 有问题,会进行 neighbor scanning ,然后出现 hostapd[10529]: Failed to request a scan of neighboring BSSes ret=-16 (Device or resource busy) 错误。必须先以普通 20MHz 模式启动,然后转为(restart) 40/80MHz

启动时配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface=wlx1cbfce82adb3

bridge=brlan

hw_mode=a
channel=149
ieee80211n=1
wmm_enabled=1

ssid=RASPNET_402

auth_algs=1

wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

wpa_passphrase=密码

修改为如下配置后 restart :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
interface=wlx1cbfce82adb3

bridge=brlan

hw_mode=a
channel=149
ieee80211n=1
ieee80211ac=1
wmm_enabled=1
ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40]
vht_capab=[VHT80][SHORT-GI-80]

ssid=RASPNET_402

auth_algs=1

wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

wpa_passphrase=密码

Updated 似乎是因为放在5G路由器旁边的原因…

一些没什么效果的尝试

> 换驱动

https://github.com/cilynx/rtl88x2bu,在 arm64 系统上编译所需的额外操作:https://github.com/PieGuy314/RTL88x2BU-RPi4-arm64-Driver-Patch

> 修改 hostapd 源码重新编译

hostapd 编译方式:https://leux.cn/doc/hostapd.html

在源码中找到 neighboring BSSes 的对应部分,修改返回值。

1
2
install -D hostapd /usr/local/bin//hostapd
install -D hostapd_cli /usr/local/bin//hostapd_cli

2.9 版本似乎有点问题,目前在用 2.8 版本。

新网卡

原来的网卡是 USB2.0 的网卡,退货换了一个 3.0 的。

然而最终发现,新的网卡在运行在使用 rtw_switch_usb_mode=1 运行在 USB3.0 模式时会发生各种错误,且不稳定;而使用 rtw_switch_usb_mode=1 运行在 USB2.0 模式(插在哪个物理口都行)时会保持稳定。

Update 2022.02.15:相关问题也已经在驱动存储库的说明中提及了,见 88x2bu-20210702

只能跑在 2.0 模式了,速度大概在 200Mbps 左右。

最终配置文件:

/etc/modprobe.d/88x2bu.conf
1
options 88x2bu rtw_drv_log_level=3 rtw_led_ctrl=1 rtw_vht_enable=2 rtw_power_mgnt=1 rtw_switch_usb_mode=0 rtw_ips_mode=1 rtw_enusbss=0 rtw_beamform_cap=11
/etc/hostapd/hostapd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
interface=wlx1cbfceb110dc
driver=nl80211

country_code=CN
hw_mode=a
channel=149
ieee80211n=1
ieee80211ac=1
wmm_enabled=1
ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40]
vht_capab=[HTC-VHT][MAX-MPDU-11454][SHORT-GI-80]

ssid=RASPNET_402

wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

wpa_passphrase=密码

使用的 hostapd 版本: hostapd v2.8

Clash 代理 + AdGuardHome 广告屏蔽

配置 Clash

Clash 部署:https://cherysunzhang.com/2020/05/deploy-clash-as-transparent-proxy-on-raspberry-pi/

关于代理与 DNS 解析的原理说明:https://blog.skk.moe/post/what-happend-to-dns-in-proxy/

DNS 配置可参考:http://blog.joylau.cn/2020/05/01/Clash-Config/

Clash 可以配置 proxy-providers 订阅代理,使用 https://github.com/Loyalsoldier/clash-rules 配置 rules

可以使用 subconverter 筛选处理订阅节点:https://www.10101.io/2020/02/12/use-clash-proxy-provider-with-subconverter

subconverter 中文文档:https://github.com/tindy2013/subconverter/blob/master/README-cn.md

后续:发现机场提供了 subconverter ,不需要本地部署啦~

开启终端代理

方法一

设置 clash 配置文件 mixed-port: 7890 ,在终端中运行(或添加到 ~/.bashrc):

1
2
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

方法二

使用 Proxychains

安装后设置配置文件 /etc/proxychains.conf ,在最后一行设置本地代理服务器和端口 http 127.0.0.1 7890 ,在 /usr/lib/proxychains3/proxyresolv 中将原有的 DNS 4.2.2.2 改为本机的 DNS 服务器

然后使用 proxychains + 指令 进行代理,或者直接 proxychains bash 开启全代理的终端

使用 sudo 时会报错:ERROR: ld.so: object 'libproxychains.so.3' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.

解决方法:使用 find /usr/ -name libproxychains.so.3 -print 找到库的位置,然后参考:https://parrotsec-cn.org/t/proxychains/3012 修改文件

配置 AdGuardHome

最终决定将 Clash 作为 AdGuardHome 的上游服务器

/etc/dnsmasq.conf 中设置 port=0 关闭 dnsmasq 的 DNS 服务

安装 AdGuardHomehttps://github.com/AdguardTeam/AdGuardHome#installation

配置 AdGuardHome DNS 服务端口为 53,上游 DNS 服务器为 Clash 的 DNS 服务(Clash 需开启 DNS 服务)

透明代理:假设 Clash 的 redir-port7891iptable 进行以下设置:

Update 2022.04.23: 由于校园网分配的是公网IP,所以需要设置防火墙,限制 Clash 服务只能被内网访问,防止端口被扫到被攻击(会导致大量连接和高 CPU 占用)。iptables 也做了更新,增加了简单的防护。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 防止外网使用内网 IP 欺骗
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
# 允许已建立的连接通过
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许本机和内网 IP 的所有访问
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT
# 允许来自无线 AP 的 DHCP 请求, wlx1cbfceb110dc 为网卡名
iptables -A INPUT -i wlx1cbfceb110dc -p udp --dport 67 -j ACCEPT
# 开放外网 SSH, HTTP, HTTPS 连接
iptables -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT
# 若不是允许内网 IP 的所有访问, 则需添加该规则允许内网对 Clash 的访问
# iptables -A INPUT -s 192.168.0.0/16 -p tcp -m tcp --dport 7891 -j ACCEPT
# 丢弃其他所有请求
iptables -P INPUT DROP

# 将转发后的包源地址修改为本机地址
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -t nat -N clash
# 内网 TCP 请求转发给 clash 链
iptables -t nat -A PREROUTING -s 192.168.0.0/16 -p tcp -j clash

# 访问内网不经过 clash
iptables -t nat -A clash -d 10.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 127.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 169.254.0.0/16 -j RETURN
iptables -t nat -A clash -d 172.16.0.0/12 -j RETURN
iptables -t nat -A clash -d 192.168.0.0/16 -j RETURN
iptables -t nat -A clash -d 224.0.0.0/4 -j RETURN
iptables -t nat -A clash -d 240.0.0.0/4 -j RETURN

# 其余请求重定向至 clash 端口
iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7891

/etc/dnsmasq.conf 中将默认网关和默认 DNS 服务器设为本机,例如:

1
2
3
4
interface=wlx1cbfceb110dc
dhcp-range=192.168.22.100,192.168.22.200,255.255.255.0,24h
dhcp-option=3,192.168.22.1
dhcp-option=6,192.168.22.1

如上,连入树莓派网络即可走代理访问。

回环问题

Clash 做透明代理时访问对应端口会产生回环,有时候这个问题会莫名其妙地出现。

解决尝试一

解决方案:https://github.com/Dreamacro/clash/issues/425#issuecomment-566982655

1
2
3
4
iptables -A INPUT -p tcp -m tcp --dport 7891 -m connmark ! --mark 500 -j REJECT
...
iptables -A CLASH -p tcp -j CONNMARK --set-mark 500
iptables -A CLASH -p tcp -j REDIRECT --to-ports 7891

解决尝试二

似乎去除 udp 相关 iptables 可以解决,已将上面的配置文件更新,有待观察。UPD:未解决

解决尝试三

似乎改端口可能解决,有待观察。

Update 2022.02.15:暂时还没有遇到问题。

文件存储服务器

USB 移动硬盘

硬盘处理:使用 DiskGenius 软件将硬盘分区为 ext4。

插入硬盘,sudo fdisk -l 查看硬盘设备号,如 /dev/sda1

sudo mount /dev/sda1 /data 进行挂载,挂载完后可通过 df -hT 查看空间使用情况。

永久挂载:在 /etc/fstab 中加入:

1
/dev/sda1       /data           ext4    defaults          0      0

sudo mount -a 检查是否有问题。

重要:为了防止关机时直接对硬盘断电损伤硬盘,参考如下设置(似乎只对 shutdown 后手动重启有用,reboot 没用):https://iovxw.net/p/park-external-hdd/

SMB 服务器

(已弃用)使用 Openwrt 的 SMB 服务,在 网络存储->网络共享 里设置共享目录,在 网络存储->挂载 SMB 网络共享 里开启 SMB 服务。

直接在树莓派原系统内开设 Samba 服务器:https://zhuanlan.zhihu.com/p/266495858

testparm –v 检查 smb.conf 配置是否正确。

rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384) 的解决方法:https://ixnfo.com/en/samba-warning-solution-rlimit_max-increasing-rlimit_max-1024-to-minimum-windows-limit-16384.html

Aria2 下载机

新建用户:sudo adduser aria2 并进行相关用户组设定。

https://li-aaron.github.io/2019/01/aira2-on-raspberry/ ,将命令和配置文件中的 ~ 都换为绝对路径。

配置文件参考:http://ivo-wang.github.io/2019/04/18/%E5%85%B3%E4%BA%8Earia2%E6%9C%80%E5%AE%8C%E6%95%B4%E7%9A%84%E4%B8%80%E7%AF%87/

Update 2021.09.27:现在使用的是 Aria2 Pro

MC 服务器配置

MC1.16 及以前 && Ubuntu

依照 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports/ 换源,sudo apt update (或sudo apt-get full-upgrade)进行更新。

sudo apt install openjdk-8-jre-headless 安装 java8

于是直接按照正常 Ubuntu 情况配置 MC 服务器即可。

MC1.17 && Raspberry OS 64it

截至 2021.08.06openjdk-16debian 下只有 unstable(sid) 版,所以需要一些额外的配置来安装。

参考:https://packages.debian.org/sid/arm64/openjdk-16-jdk/download

/etc/apt/sources.list 中添加 deb http://ftp.de.debian.org/debian sid main (用完后记得注释掉)。

执行 sudo apt install openjdk-16-jre-headless 安装 java16

MC服务器的剩余步骤照常,可参考:https://blog.csdn.net/qq_36290650/article/details/106978441

同步照片

Lomorage (已弃用)

使用 Lomorage,使用 apt 安装。

文档:https://docs.lomorage.com/zh/docs/Installation/lomorage-service/installation-raspbian/

apt 安装后来出现了一些依赖问题,且 APP 实在有些丑,于是弃用。

Syncthing

syncthing

安卓客户端:https://github.com/syncthing/syncthing-android

安卓客户端增强版:https://github.com/catfriend1/syncthing-android

sudo apt install syncthing 安装,sudo systemctl enable syncthing@pi.service 启动服务。

apt 安装的版本过于老旧,需要从 github 上下载最新版本,扔到 /usr/bin/ 里替换掉。

可以在云服务器上搭建发现服务器和中继服务器。

功能杂项

同步百度云

使用 bypy

给装在树莓派上的 TF 卡续命

参考:https://raspberrypi.stackexchange.com/questions/169/how-can-i-extend-the-life-of-my-sd-card

省电

USB供电控制

USB 硬盘使用 udisksctl 安全移除,USB 端口使用 uhubctl 断电。

udisksctl: sudo apt install udisks2

uhubctl: https://github.com/mvp/uhubctl

usb-down.sh
1
2
3
4
5
6
7
8
9
10
#!/bin/sh

udisksctl unmount -b /dev/sda1 # 将硬盘卸载
udisksctl power-off -b /dev/sda # 将硬盘数据断电,表现为硬盘停转
systemctl stop hostapd.service # 将网卡的 AP 服务停止

sleep 2 # 延迟一会儿防止服务未关闭

uhubctl -l 2 -a off # 关闭USB电源
# 由于只有当四个USB端口都关闭时才会断电,索性直接全部断了
usb-up.sh
1
2
3
4
5
6
7
8
#!/bin/sh

uhubctl -l 2 -a on # 打开USB电源

sleep 5 # 延迟一会儿等待USB设备识别

mount -a # 恢复硬盘挂载
systemctl start hostapd.service # 开启 AP 服务

其它

https://www.raspberrypi.org/forums/viewtopic.php?t=257144

https://learn.pi-supply.com/make/how-to-save-power-on-your-raspberry-pi/

可以参考上面关闭 HDMI,LED 等。

相机

参考:https://www.raspberrypi.org/forums/viewtopic.php?t=285868

vcgencmd get_camera 检查相机是否开启。

sudo modprobe bcm2835-v4l2

vcgencmd

参考:

DDNS

使用 Cloudflare 的 DNS 托管。

参考:https://blog.wardchan.com/posts/use-ddclient-to-automatically-update-cloudflare-dns-record.html

备份

额外购置了一张与原来同款的 32G TF 卡,本来打算升级/重装系统和网卡驱动,但是驱动上遇到了稳定性问题,就懒得重装系统了,于是当作备份卡吧。

创建镜像备份法

使用 win32diskimager,把 TF 卡插到电脑上,可以生成整个卡的镜像文件。

接着使用 PiShrink 裁剪镜像。需要使用 Linux, WSL 实测没问题。

在线拷卡备份法

使用 rpi-clone,可以进行增量备份,适合使用另一张卡定期备份。

1
2
3
git clone https://github.com/billw2/rpi-clone.git
cd rpi-clone
sudo cp rpi-clone /usr/local/bin/

安装完成后,sudo fdisk -l 找到 USB 口上的备份卡,如 /dev/sdc 然后 sudo rpi-clone /dev/sdc 即可进行增量备份。

UART 与蓝牙

树莓派与 UPS 间的通讯使用 UART 串口通信。

参考:https://zhuanlan.zhihu.com/p/106904186

本文介绍在Raspberry Pi 3、3+,4和Raspberry Pi Zero W上配置串行端口。
上述的几种树莓派包含两个可用于串行通信的UART控制器,也就是常说的串口:mini UART和PL011 UART。默认情况下,mini UART映射到40引脚GPIO连接器的TXD(GPIO 14)和RXD(GPIO 15)上,PL011 UART用于蓝牙模块​​,但是任何一个模块都可以映射到GPIO端口。

额外参考:

问题杂项

systemctl status 不显示内存占用

https://dmesg.app/systemd-accounting.html (似乎还是不行)

VsCode 远程连接

出现 command: '_workbench.downloadResource' failed 错误。

解决方法:本地的梯子(远程端不需要梯子)开成全局代理。

在使用充电宝/UPS单独供电时,通过AP满负荷读写移动硬盘可能导致USB接口掉电

换用电源供电暂未发现问题。

Update 2021.09.11: 换用电源供电也会出现问题,于是加了一个带独立供电的 USB 拓展坞,由于手头只有一个 USB2.0 的拓展坞,所以只将无线网卡接到拓展坞上,实测减轻了约 0.3A 的树莓派 USB 负载,是否可以有效防止掉盘还待检验。

硬盘维护

fsck -f /dev/sda1 检查文件系统。

fsck -c /dev/sda1 扫描。

sudo smartctl -a /dev/sda 查看 S.M.A.R.T. 信息。

使用 smartctl 进行硬盘测试。

修复:https://www.smartmontools.org/wiki/BadBlockHowto

]]>
+ + + <p>2021 年初的时候入手了树莓派 4b,然后暑假的时候好好折腾了一下,留下了一些零散的记录,在这里整理起来,之后哪天重建的时候还能来参考一下。</p> +<p>由于距离记录已经有一段时间了,可能有些内容会有偏差。</p> + + + + + + + + + + +
+ +
diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 0000000..e57d21b --- /dev/null +++ b/categories/index.html @@ -0,0 +1,60 @@ + +分类 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/categories/\346\212\230\350\205\276/index.html" "b/categories/\346\212\230\350\205\276/index.html" new file mode 100644 index 0000000..763cda0 --- /dev/null +++ "b/categories/\346\212\230\350\205\276/index.html" @@ -0,0 +1,68 @@ + +分类: 折腾 - Centaurus99 的杂物堆

基于 Proxmox VE 的 All in One 服务器搭建

树莓派挂在宿舍当软路由已经两年了,大部分情况下都挺好用,透明代理体验也还算尚可。

+

然而由于使用的 USB 无线网卡驱动支持较差,无线峰值速率只能跑到 200+ Mbps,且不大稳定。并且树莓派性能不高,无法开设一些高负载服务。另外,树莓派作为路由常年开启,需要考虑散热问题,虽然给使用的小风扇写了启停功能,但是启动运转时还是会有一定的噪音,较为恼人。


使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化

最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,https://pvvx.github.io/ATC_MiThermometer/),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。

+

最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。


树莓派软路由配置 IPv6 网络

树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。


使用acme.sh自动配置泛域名证书

一年前用学生邮箱白嫖的域名要到期了,于是换了个便宜的 .top 域名,正好之前忘了记录自动签证书的过程了,这里记录一下以后再换域名的时候直接来抄。

+

由于同时有很多子域名在用,于是决定申请泛域名证书,共用同一个。

+

主要参考 官方文档 ,记录了仅适用于我个人的配置过程。


【补档】树莓派折腾记录

2021 年初的时候入手了树莓派 4b,然后暑假的时候好好折腾了一下,留下了一些零散的记录,在这里整理起来,之后哪天重建的时候还能来参考一下。

+

由于距离记录已经有一段时间了,可能有些内容会有偏差。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/categories/\346\212\230\350\205\276/\345\215\232\345\256\242/index.html" "b/categories/\346\212\230\350\205\276/\345\215\232\345\256\242/index.html" new file mode 100644 index 0000000..e2dce62 --- /dev/null +++ "b/categories/\346\212\230\350\205\276/\345\215\232\345\256\242/index.html" @@ -0,0 +1,63 @@ + +分类: 博客 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/categories/\346\212\230\350\205\276/\346\240\221\350\216\223\346\264\276/index.html" "b/categories/\346\212\230\350\205\276/\346\240\221\350\216\223\346\264\276/index.html" new file mode 100644 index 0000000..93c6f4a --- /dev/null +++ "b/categories/\346\212\230\350\205\276/\346\240\221\350\216\223\346\264\276/index.html" @@ -0,0 +1,62 @@ + +分类: 树莓派 - Centaurus99 的杂物堆

使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化

最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,https://pvvx.github.io/ATC_MiThermometer/),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。

+

最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。


树莓派软路由配置 IPv6 网络

树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。


【补档】树莓派折腾记录

2021 年初的时候入手了树莓派 4b,然后暑假的时候好好折腾了一下,留下了一些零散的记录,在这里整理起来,之后哪天重建的时候还能来参考一下。

+

由于距离记录已经有一段时间了,可能有些内容会有偏差。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/content.json b/content.json new file mode 100644 index 0000000..53105b4 --- /dev/null +++ b/content.json @@ -0,0 +1 @@ +{"posts":[{"title":"Hexo博客架设日记","text":"好久之前就想把博客搭起来的来着,结果一直咕到了现在,终于有空来搭啦 ✿✿ヽ(°▽°)ノ✿ 博客使用 Hexo 搭建,博客源码位于 https://github.com/Centaurus99/centaurus99.github.io 的 master 分支,静态页面同步部署于 gh-pages 分支和个人 VPS 上。 下面是搭建(踩坑)记录~ 其实是搭完后的回忆 Hexo 安装对着官方文档搞,没啥好说 QWQ。 先装 nodejs,我这儿装的版本是 v16.13.2。 然后 npm install -g hexo-cli。 最后到博客文件夹下 hexo init,然后 npm install,完成! GitHub Pages 的自动部署关于如何使用 Hexo 写博客之类的官方文档里都有介绍,这儿就记录一点自动化部署的设置吧。 为了方便管理,我这儿将博客源码和部署后的静态页面放在了同一个库中,下面的配置以我的配置为例。 为了使用 用户名.github.io 访问,需要创建名为 用户名.github.io 的存储库。 配置 Hexo首先配置运行 hexo deploy 时的部署方式。 先安装 Git 部署插件: 1npm install hexo-deployer-git --save 然后在 _config.yml 中修改配置: 1234deploy: type: git repository: git@github.com:Centaurus99/centaurus99.github.io.git branch: gh-pages 这样然后运行: 12hexo generatehexo deploy 应该就能在仓库的对应分支看到部署好的静态页面啦~ 在仓库的 Settings > Pages 中将 Source 设为 gh-pages 分支,然后就可以通过 用户名.github.io 访问到博客了。 如果以后还要拓展部署方式,还可以继续往配置里面添加,如果用到了再来更新~ 配置 Github ActionsGithub Actions 是个好东西,搞自动工作流非常方便,白嫖真香! 这个部分基本是参照大佬的博客完成的,参见:https://tommy.net.cn/2020/08/06/deploy-hexo-with-github-actions/ 仅对配置文件做了一点更新和修改,最终如下: 2022-01-15 更新:由于将主题以子模块的形式加入版本控制,添加了 submodules: 'recursive' 表示递归检出子模块 2022-09-02 更新:添加环境变量 TZ: Asia/Shanghai 设定时区,确保本地和远端生成的日期路径相同 123456789101112131415161718192021222324252627282930313233343536373839404142434445name: Hexo Deployon: push: branches: - masterenv: TZ: Asia/Shanghaijobs: build: runs-on: ubuntu-latest if: github.event.repository.owner.id == github.event.sender.id steps: - name: Checkout source uses: actions/checkout@v2 with: ref: master submodules: 'recursive' - name: Setup Node.js uses: actions/setup-node@v1 with: node-version: '16' - name: Setup Hexo env: ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_KEY }} run: | mkdir -p ~/.ssh/ echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa ssh-keyscan github.com >> ~/.ssh/known_hosts git config --global user.email "1102569568@qq.com" git config --global user.name "Centaurus99" npm install hexo-cli -g npm install - name: Hexo deploy run: | hexo clean hexo deploy 这样,当我更新博客源码时,Github 就会帮我自动部署好静态页面啦。 配置 Webhooks手头还有一台 VPS,还是打算把它作为博客的服务器。 Github 上有个功能叫 Webhooks,可以在你的库发生一些动作(比如有人 push 东西上来)的时候对着一个网址发个请求。利用这个就可以在更新时通知我的 VPS 去 pull 最新的静态分支,从而实现自动部署了。 关于 Web 服务器的搭建,Nginx 的使用这里就不记录了。 摆烂咯! Webhooks 的使用也是学习大佬的博客,参见:https://maphical.cn/2020/03/build-blog-using-hexo/ 在部署这个的过程中遇到了一堆奇奇怪怪的问题,由于时间久远了记不太清了,这里就不做记录了。 摆烂咯!×2 依稀记得一点点,比如脚本跑不起来考虑是 php 用户权限问题,最终通过给予它运行 git 命令的 sudo 权限解决;git pull 每次在更新的时候都需要处理冲突问题,原因是上面那个 git 部署工具每次会将这个分支完全覆盖,包括历史 commit 都会被删除,所以在一开始选择 pull 方式的时候要选择 rebase。 由于我把博客源码和静态页面放在了同一个存储库内,这会导致 Webhooks 每次更新会被激活两遍(两个分支的更新各激活一遍),不过问题不大。 总结关于博客的配置文件 _config.yml 可以在我的 Github 对于仓库找到。 这样就完成了博客的自动化部署的配置,下一篇博客将记录配置主题的吐血过程。 参考 https://hexo.io/zh-cn/docs/ https://tommy.net.cn/2020/08/06/deploy-hexo-with-github-actions/ https://maphical.cn/2020/03/build-blog-using-hexo/ https://wiki.eryajf.net/pages/47a507/","link":"/2022/01/14/Hexo%E5%8D%9A%E5%AE%A2%E6%9E%B6%E8%AE%BE%E6%97%A5%E8%AE%B0/"},{"title":"【补档】树莓派折腾记录","text":"2021 年初的时候入手了树莓派 4b,然后暑假的时候好好折腾了一下,留下了一些零散的记录,在这里整理起来,之后哪天重建的时候还能来参考一下。 由于距离记录已经有一段时间了,可能有些内容会有偏差。 初步尝试参考:http://blog.dngz.net/RaspberryPiKodbox.htm 系统安装尝试装了适配树莓派的 Ubuntu,后来还是为了更好的硬件兼容性换成官方系统了。 当时本着尝鲜的想法,选择了仍在 beta 测试中的官方 64-bit 系统 2021-05-07-raspios-buster-arm64-lite,由于计划作为服务器运行,不需要图形桌面,所以就选择了 lite。 注:现在官方 64-bit 系统已经正式发布了(https://www.raspberrypi.com/news/raspberry-pi-os-64-bit/)。 官网也给出了烧写 SD 卡的工具 Raspberry Pi Imager,GUI 好看,烧录系统非常方便。 初始配置系统烧录完成后会有一个 boot 分区,做一些初始化的配置再进行第一次开机。 开启 ssh 服务在 boot 分区下新建一个空文件,名为 ssh。 开机自动连接 WIFI在 boot 分区下新建 wpa_supplicant.conf 文件,内容如下: 123456789country=CNctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdevupdate_config=1network={ ssid="wifi链接名" psk="wifi密码" key_mgmt=WPA-PSK} 初次启动插电开机~ ssh 可以连接,初始用户名 pi ,密码 raspberry。 记得修改密码。 解锁rootsudo passwd root 修改 root 密码。 sudo passwd --unlock root 解锁 root 用户。 由于安全原因,默认情况下 root 是不能用 ssh 登录的,如果一定需要的话,编辑 /etc/ssh/sshd_config,将配置项 #PermitRootLogin prohibit-password 修改为 PermitRootLogin yes,然后 sudo systemctl restart sshd 重启 ssh 服务即可。 校正时区sudo dpkg-reconfigure tzdata 选择 Asia/Shanghai 即可。 树莓派配置工具 raspi-configsudo raspi-config 换源参考:https://blog.csdn.net/baidu_26678247/article/details/108930421 如果遇到 The repository 'http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian buster InRelease' is not signed 错误,可以按如下操作添加公钥(参见:https://www.jianshu.com/p/c64deffb1308) 12gpg --keyserver keyserver.ubuntu.com --recv-keys 9165938D90FDDD2Egpg --export --armor 9165938D90FDDD2E | sudo apt-key add - 一些杂项GPIO使用 raspi-config 打开 GPIO sudo apt-get install wiringpi 按照 http://wiringpi.com/wiringpi-updated-to-2-52-for-the-raspberry-pi-4b/ 更新 wiringpi 版本 gpio readall 即可查看 GPIO 概况 进一步配置 WIFI参考:https://www.cnblogs.com/zhangyuejia/p/8945354.html 然后 sudo ifconfig wlan0 down 关闭 wifi,sudo ifconfig wlan0 up 启动 wifi。 超频参考:https://cyfeng.science/2020/06/26/Unboxing-Raspberry-Pi-4B-8GB-and-Overclocking/ 注意默认情况下 over_voltage 最大为 6 查看CPU频率:sudo watch -n 1 cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq 查看CPU温度:sudo watch -n 1 cat /sys/class/thermal/thermal_zone0/temp CPU 电源计划echo "powersave" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 可以将CPU设为省电模式,固定600MHz echo "ondemand" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 设置回默认模式 风扇控制风扇一直开着噪声大,也影响风扇寿命,设置一下温控。 为了美观,网购了一个插在 GPIO 座上的风扇插座,勉强塞进了外壳。 使用 raspi-config 自带的风扇控制需要注意,若使用 i2c 端口作为控制口,需要将 i2c 关闭。 使用 sudo -E rpi-eeprom-config --edit 设置 WAKE_ON_GPIO=0 和 POWER_OFF_ON_HALT=1 可以在 shutdown 之后使风扇也关闭(否则关机后风扇会开始一直转)。 通过蓝牙 ssh 连接即通过蓝牙连接创建局域网。 参考: http://www.leux.cn/doc/Raspberry%E9%80%9A%E8%BF%87%E8%93%9D%E7%89%99SSH.html https://blog.csdn.net/Powerful_Green/article/details/88604205 连接操作:更改适配器选项 -> 蓝牙网络连接 -> 查看蓝牙网络设备 -> 选中,连接时使用 -> 接入点 后来不知道装了啥蓝牙连不上了,排查之后发现似乎是 /usr/bin/bt-agent -c NoInputNoOutput 失效了,并不会自动配对,需要手动配对。(仍未解决,但也不怎么用蓝牙连接了) OLED 显示屏低价搞到一个小的 OLED 显示屏,装上。 由于风扇座占掉了 i2c1,只能通过奇技淫巧使用 i2c0 ,参考 https://blog.csdn.net/weixin_46145842/article/details/106128144 设置 驱动和使用参考:https://shumeipai.nxez.com/2019/04/29/use-the-ssd1306-oled-display-on-the-raspberry-pi.html 持续连接校园网在 Github 上找了各种连校园网的轮子,试到最后只有这个能够稳定使用: 使用 https://github.com/z4yx/GoAuthing 对应程序和 service。 无线 AP 与路由使用 RaspAP 创建无线 AP(已弃用)RaspAP 手动安装教程:https://docs.raspap.com/manual/ 开启 802.11ac参考 https://docs.raspap.com/faq/#80211ac 信道选择 36 ,实测 48 无法开启,40 速率较慢。 流量监控问题参考 https://github.com/RaspAP/raspap-webgui/issues/689 末尾。 sudo apt-get purge vnstat 卸载原来的 vnstat。 curl -O https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/pool/universe/v/vnstat/vnstat_1.18-1_arm64.deb 下载旧版 vnstat。 sudo dpkg -i vnstat_1.18-1_arm64.deb 安装。 echo "vnstat hold" | sudo dpkg --set-selections 禁用更新。 使用 OpenWrt-Docker(也已弃用)安装 docker:参考 https://openwrt.club/93.html 增加用户权限:https://www.cnblogs.com/codeaaa/p/9041533.html hostapd + dnsmasq + OpenWrt-Docker:https://zhuanlan.zhihu.com/p/163827788 使用的 OpenWrt-Docker。 注意: 设置 dnsmasq 配置文件的时候一定要反注释掉 bind-interfaces,不然会出现地址占用错误。 Openwrt 配合 AdGurad Home 屏蔽广告和 ShadownSocksR Plus 用于翻墙,参考:https://blog.zfdang.com/2020/07/adguard-home-work-with-ssr-plus-in-openwrt/ 板载 WLAN 优化sudo iw wlan0 set power_save off 关闭节能可以提高速度与稳定性。 使用 USB 网卡板载网卡性能和稳定性还是不足的,于是入手了一个 USB 无线网卡。 由于预算有限,又想要 867Mbps 的 5G 频段支持,于是入手的网卡是 RTL8812BU 芯片,在驱动方面问题多多,悲。 驱动安装支持 RaspberryOS(64bit) 的驱动地址:https://github.com/morrownr/88x2bu 关于 iw phy 输出参数的具体说明:https://c4pr1c3.github.io/cuc-mis/chap0x02/rt3572l_explained.html 优化WiFi睡眠:https://github.com/fastoe/RTL8812BU_for_Raspbian 关于 /etc/modprobe.d/88x2bu.conf 的一点额外说明: 1234567891011121314151617181920212223There's four parms listed in the document you cite.Code: Select allrtw_power_mgnt=0|1|20 == disable power saving1 == power saving on, minPS2 == power saving on, maxPSCode: Select allrtw_enusbss=0|10 == disable auto suspend1 == enable auto suspendCode: Select allrtw_hwpwrp_detect=0|10 == disable HW power pin detection1 == enable HW power pin detectionCode: Select allrtw_ips_mode=0|10 == low power, IPS_NORMAL1 == higher power, IPS_LEVEL2The conventional wisdom, because we're running our RPis as server systems not clients, is to set rtw_power_mgnt=0 and rtw_enusbss=0 to prevent the dongle going into power saving and to ignore the other two parms because they don't make any difference. If the server goes into power saving we'd need a process to wake it up. That's different from a client system where interaction from a keyboard user will trigger a request to wake up and associate the dongle. 最终配置文件为: 1options 88x2bu rtw_drv_log_level=2 rtw_led_ctrl=1 rtw_vht_enable=2 rtw_power_mgnt=0 rtw_switch_usb_mode=1 rtw_ips_mode=1 rtw_enusbss=0 rtw_beamform_cap=11 由于购买的网卡为 USB2.0 接口,不支持 USB3.0,需要 rtw_switch_usb_mode=0/2 才能正常使用。 一些关于 RTL8812BU 驱动 / hostapd 的问题hostapd 完整配置文件注释:https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf 配置文件中最好去除注释,可能会有奇怪的问题 这张网卡无法在初始启动时应用 ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40] 设置 40/80MHz 带宽,似乎是网卡直接 UNINITIALIZED->HT_SCAN 有问题,会进行 neighbor scanning ,然后出现 hostapd[10529]: Failed to request a scan of neighboring BSSes ret=-16 (Device or resource busy) 错误。必须先以普通 20MHz 模式启动,然后转为(restart) 40/80MHz。 启动时配置文件: 123456789101112131415161718interface=wlx1cbfce82adb3bridge=brlanhw_mode=achannel=149ieee80211n=1wmm_enabled=1ssid=RASPNET_402auth_algs=1wpa=2wpa_key_mgmt=WPA-PSKrsn_pairwise=CCMPwpa_passphrase=密码 修改为如下配置后 restart : 123456789101112131415161718192021interface=wlx1cbfce82adb3bridge=brlanhw_mode=achannel=149ieee80211n=1ieee80211ac=1wmm_enabled=1ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40]vht_capab=[VHT80][SHORT-GI-80]ssid=RASPNET_402auth_algs=1wpa=2wpa_key_mgmt=WPA-PSKrsn_pairwise=CCMPwpa_passphrase=密码 Updated 似乎是因为放在5G路由器旁边的原因… 一些没什么效果的尝试> 换驱动https://github.com/cilynx/rtl88x2bu,在 arm64 系统上编译所需的额外操作:https://github.com/PieGuy314/RTL88x2BU-RPi4-arm64-Driver-Patch > 修改 hostapd 源码重新编译hostapd 编译方式:https://leux.cn/doc/hostapd.html 在源码中找到 neighboring BSSes 的对应部分,修改返回值。 12install -D hostapd /usr/local/bin//hostapdinstall -D hostapd_cli /usr/local/bin//hostapd_cli 2.9 版本似乎有点问题,目前在用 2.8 版本。 新网卡原来的网卡是 USB2.0 的网卡,退货换了一个 3.0 的。 然而最终发现,新的网卡在运行在使用 rtw_switch_usb_mode=1 运行在 USB3.0 模式时会发生各种错误,且不稳定;而使用 rtw_switch_usb_mode=1 运行在 USB2.0 模式(插在哪个物理口都行)时会保持稳定。 Update 2022.02.15:相关问题也已经在驱动存储库的说明中提及了,见 88x2bu-20210702。 只能跑在 2.0 模式了,速度大概在 200Mbps 左右。 最终配置文件: /etc/modprobe.d/88x2bu.conf1options 88x2bu rtw_drv_log_level=3 rtw_led_ctrl=1 rtw_vht_enable=2 rtw_power_mgnt=1 rtw_switch_usb_mode=0 rtw_ips_mode=1 rtw_enusbss=0 rtw_beamform_cap=11 /etc/hostapd/hostapd.conf12345678910111213141516171819interface=wlx1cbfceb110dcdriver=nl80211country_code=CNhw_mode=achannel=149ieee80211n=1ieee80211ac=1wmm_enabled=1ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40]vht_capab=[HTC-VHT][MAX-MPDU-11454][SHORT-GI-80]ssid=RASPNET_402wpa=2wpa_key_mgmt=WPA-PSKrsn_pairwise=CCMPwpa_passphrase=密码 使用的 hostapd 版本: hostapd v2.8。 Clash 代理 + AdGuardHome 广告屏蔽配置 ClashClash 部署:https://cherysunzhang.com/2020/05/deploy-clash-as-transparent-proxy-on-raspberry-pi/ 关于代理与 DNS 解析的原理说明:https://blog.skk.moe/post/what-happend-to-dns-in-proxy/ DNS 配置可参考:http://blog.joylau.cn/2020/05/01/Clash-Config/ Clash 可以配置 proxy-providers 订阅代理,使用 https://github.com/Loyalsoldier/clash-rules 配置 rules 可以使用 subconverter 筛选处理订阅节点:https://www.10101.io/2020/02/12/use-clash-proxy-provider-with-subconverter subconverter 中文文档:https://github.com/tindy2013/subconverter/blob/master/README-cn.md 后续:发现机场提供了 subconverter ,不需要本地部署啦~ 开启终端代理方法一设置 clash 配置文件 mixed-port: 7890 ,在终端中运行(或添加到 ~/.bashrc): 12export http_proxy=http://127.0.0.1:7890export https_proxy=http://127.0.0.1:7890 方法二使用 Proxychains 安装后设置配置文件 /etc/proxychains.conf ,在最后一行设置本地代理服务器和端口 http 127.0.0.1 7890 ,在 /usr/lib/proxychains3/proxyresolv 中将原有的 DNS 4.2.2.2 改为本机的 DNS 服务器 然后使用 proxychains + 指令 进行代理,或者直接 proxychains bash 开启全代理的终端 使用 sudo 时会报错:ERROR: ld.so: object 'libproxychains.so.3' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored. 解决方法:使用 find /usr/ -name libproxychains.so.3 -print 找到库的位置,然后参考:https://parrotsec-cn.org/t/proxychains/3012 修改文件 配置 AdGuardHome最终决定将 Clash 作为 AdGuardHome 的上游服务器 在 /etc/dnsmasq.conf 中设置 port=0 关闭 dnsmasq 的 DNS 服务 安装 AdGuardHome :https://github.com/AdguardTeam/AdGuardHome#installation 配置 AdGuardHome DNS 服务端口为 53,上游 DNS 服务器为 Clash 的 DNS 服务(Clash 需开启 DNS 服务) 透明代理:假设 Clash 的 redir-port为 7891,iptable 进行以下设置: Update 2022.04.23: 由于校园网分配的是公网IP,所以需要设置防火墙,限制 Clash 服务只能被内网访问,防止端口被扫到被攻击(会导致大量连接和高 CPU 占用)。iptables 也做了更新,增加了简单的防护。 12345678910111213141516171819202122232425262728293031323334# 防止外网使用内网 IP 欺骗iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP# 允许已建立的连接通过iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 允许本机和内网 IP 的所有访问iptables -A INPUT -s 127.0.0.1 -j ACCEPTiptables -A INPUT -s 192.168.0.0/16 -j ACCEPT# 允许来自无线 AP 的 DHCP 请求, wlx1cbfceb110dc 为网卡名iptables -A INPUT -i wlx1cbfceb110dc -p udp --dport 67 -j ACCEPT# 开放外网 SSH, HTTP, HTTPS 连接iptables -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT# 若不是允许内网 IP 的所有访问, 则需添加该规则允许内网对 Clash 的访问# iptables -A INPUT -s 192.168.0.0/16 -p tcp -m tcp --dport 7891 -j ACCEPT# 丢弃其他所有请求iptables -P INPUT DROP# 将转发后的包源地址修改为本机地址iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEiptables -t nat -N clash# 内网 TCP 请求转发给 clash 链iptables -t nat -A PREROUTING -s 192.168.0.0/16 -p tcp -j clash# 访问内网不经过 clashiptables -t nat -A clash -d 10.0.0.0/8 -j RETURNiptables -t nat -A clash -d 127.0.0.0/8 -j RETURNiptables -t nat -A clash -d 169.254.0.0/16 -j RETURNiptables -t nat -A clash -d 172.16.0.0/12 -j RETURNiptables -t nat -A clash -d 192.168.0.0/16 -j RETURNiptables -t nat -A clash -d 224.0.0.0/4 -j RETURNiptables -t nat -A clash -d 240.0.0.0/4 -j RETURN# 其余请求重定向至 clash 端口iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7891 在 /etc/dnsmasq.conf 中将默认网关和默认 DNS 服务器设为本机,例如: 1234interface=wlx1cbfceb110dcdhcp-range=192.168.22.100,192.168.22.200,255.255.255.0,24hdhcp-option=3,192.168.22.1dhcp-option=6,192.168.22.1 如上,连入树莓派网络即可走代理访问。 回环问题Clash 做透明代理时访问对应端口会产生回环,有时候这个问题会莫名其妙地出现。 解决尝试一解决方案:https://github.com/Dreamacro/clash/issues/425#issuecomment-566982655 1234iptables -A INPUT -p tcp -m tcp --dport 7891 -m connmark ! --mark 500 -j REJECT...iptables -A CLASH -p tcp -j CONNMARK --set-mark 500iptables -A CLASH -p tcp -j REDIRECT --to-ports 7891 解决尝试二似乎去除 udp 相关 iptables 可以解决,已将上面的配置文件更新,有待观察。UPD:未解决 解决尝试三似乎改端口可能解决,有待观察。 Update 2022.02.15:暂时还没有遇到问题。 文件存储服务器USB 移动硬盘硬盘处理:使用 DiskGenius 软件将硬盘分区为 ext4。 插入硬盘,sudo fdisk -l 查看硬盘设备号,如 /dev/sda1。 sudo mount /dev/sda1 /data 进行挂载,挂载完后可通过 df -hT 查看空间使用情况。 永久挂载:在 /etc/fstab 中加入: 1/dev/sda1 /data ext4 defaults 0 0 sudo mount -a 检查是否有问题。 重要:为了防止关机时直接对硬盘断电损伤硬盘,参考如下设置(似乎只对 shutdown 后手动重启有用,reboot 没用):https://iovxw.net/p/park-external-hdd/。 SMB 服务器(已弃用)使用 Openwrt 的 SMB 服务,在 网络存储->网络共享 里设置共享目录,在 网络存储->挂载 SMB 网络共享 里开启 SMB 服务。 直接在树莓派原系统内开设 Samba 服务器:https://zhuanlan.zhihu.com/p/266495858。 testparm –v 检查 smb.conf 配置是否正确。 rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384) 的解决方法:https://ixnfo.com/en/samba-warning-solution-rlimit_max-increasing-rlimit_max-1024-to-minimum-windows-limit-16384.html Aria2 下载机新建用户:sudo adduser aria2 并进行相关用户组设定。 https://li-aaron.github.io/2019/01/aira2-on-raspberry/ ,将命令和配置文件中的 ~ 都换为绝对路径。 配置文件参考:http://ivo-wang.github.io/2019/04/18/%E5%85%B3%E4%BA%8Earia2%E6%9C%80%E5%AE%8C%E6%95%B4%E7%9A%84%E4%B8%80%E7%AF%87/ Update 2021.09.27:现在使用的是 Aria2 Pro。 MC 服务器配置MC1.16 及以前 && Ubuntu依照 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports/ 换源,sudo apt update (或sudo apt-get full-upgrade)进行更新。 sudo apt install openjdk-8-jre-headless 安装 java8。 于是直接按照正常 Ubuntu 情况配置 MC 服务器即可。 MC1.17 && Raspberry OS 64it截至 2021.08.06 ,openjdk-16 在 debian 下只有 unstable(sid) 版,所以需要一些额外的配置来安装。 参考:https://packages.debian.org/sid/arm64/openjdk-16-jdk/download 向 /etc/apt/sources.list 中添加 deb http://ftp.de.debian.org/debian sid main (用完后记得注释掉)。 执行 sudo apt install openjdk-16-jre-headless 安装 java16。 MC服务器的剩余步骤照常,可参考:https://blog.csdn.net/qq_36290650/article/details/106978441。 同步照片Lomorage (已弃用)使用 Lomorage,使用 apt 安装。 文档:https://docs.lomorage.com/zh/docs/Installation/lomorage-service/installation-raspbian/ apt 安装后来出现了一些依赖问题,且 APP 实在有些丑,于是弃用。 Syncthingsyncthing 安卓客户端:https://github.com/syncthing/syncthing-android 安卓客户端增强版:https://github.com/catfriend1/syncthing-android sudo apt install syncthing 安装,sudo systemctl enable syncthing@pi.service 启动服务。 apt 安装的版本过于老旧,需要从 github 上下载最新版本,扔到 /usr/bin/ 里替换掉。 可以在云服务器上搭建发现服务器和中继服务器。 功能杂项同步百度云使用 bypy 给装在树莓派上的 TF 卡续命参考:https://raspberrypi.stackexchange.com/questions/169/how-can-i-extend-the-life-of-my-sd-card 省电USB供电控制USB 硬盘使用 udisksctl 安全移除,USB 端口使用 uhubctl 断电。 udisksctl: sudo apt install udisks2 uhubctl: https://github.com/mvp/uhubctl usb-down.sh12345678910#!/bin/shudisksctl unmount -b /dev/sda1 # 将硬盘卸载udisksctl power-off -b /dev/sda # 将硬盘数据断电,表现为硬盘停转systemctl stop hostapd.service # 将网卡的 AP 服务停止sleep 2 # 延迟一会儿防止服务未关闭uhubctl -l 2 -a off # 关闭USB电源# 由于只有当四个USB端口都关闭时才会断电,索性直接全部断了 usb-up.sh12345678#!/bin/shuhubctl -l 2 -a on # 打开USB电源sleep 5 # 延迟一会儿等待USB设备识别mount -a # 恢复硬盘挂载systemctl start hostapd.service # 开启 AP 服务 其它https://www.raspberrypi.org/forums/viewtopic.php?t=257144 https://learn.pi-supply.com/make/how-to-save-power-on-your-raspberry-pi/ 可以参考上面关闭 HDMI,LED 等。 相机参考:https://www.raspberrypi.org/forums/viewtopic.php?t=285868 vcgencmd get_camera 检查相机是否开启。 sudo modprobe bcm2835-v4l2 vcgencmd参考: https://www.raspberrypi.org/documentation/computers/os.html#vcgencmd https://www.lxx1.com/3683 DDNS使用 Cloudflare 的 DNS 托管。 参考:https://blog.wardchan.com/posts/use-ddclient-to-automatically-update-cloudflare-dns-record.html 备份额外购置了一张与原来同款的 32G TF 卡,本来打算升级/重装系统和网卡驱动,但是驱动上遇到了稳定性问题,就懒得重装系统了,于是当作备份卡吧。 创建镜像备份法使用 win32diskimager,把 TF 卡插到电脑上,可以生成整个卡的镜像文件。 接着使用 PiShrink 裁剪镜像。需要使用 Linux, WSL 实测没问题。 在线拷卡备份法使用 rpi-clone,可以进行增量备份,适合使用另一张卡定期备份。 123git clone https://github.com/billw2/rpi-clone.gitcd rpi-clonesudo cp rpi-clone /usr/local/bin/ 安装完成后,sudo fdisk -l 找到 USB 口上的备份卡,如 /dev/sdc 然后 sudo rpi-clone /dev/sdc 即可进行增量备份。 UART 与蓝牙树莓派与 UPS 间的通讯使用 UART 串口通信。 参考:https://zhuanlan.zhihu.com/p/106904186 本文介绍在Raspberry Pi 3、3+,4和Raspberry Pi Zero W上配置串行端口。上述的几种树莓派包含两个可用于串行通信的UART控制器,也就是常说的串口:mini UART和PL011 UART。默认情况下,mini UART映射到40引脚GPIO连接器的TXD(GPIO 14)和RXD(GPIO 15)上,PL011 UART用于蓝牙模块​​,但是任何一个模块都可以映射到GPIO端口。 额外参考: https://forums.raspberrypi.com/viewtopic.php?t=309763 https://forums.raspberrypi.com/viewtopic.php?t=261753 问题杂项systemctl status 不显示内存占用https://dmesg.app/systemd-accounting.html (似乎还是不行) VsCode 远程连接出现 command: '_workbench.downloadResource' failed 错误。 解决方法:本地的梯子(远程端不需要梯子)开成全局代理。 在使用充电宝/UPS单独供电时,通过AP满负荷读写移动硬盘可能导致USB接口掉电换用电源供电暂未发现问题。 Update 2021.09.11: 换用电源供电也会出现问题,于是加了一个带独立供电的 USB 拓展坞,由于手头只有一个 USB2.0 的拓展坞,所以只将无线网卡接到拓展坞上,实测减轻了约 0.3A 的树莓派 USB 负载,是否可以有效防止掉盘还待检验。 硬盘维护fsck -f /dev/sda1 检查文件系统。 fsck -c /dev/sda1 扫描。 sudo smartctl -a /dev/sda 查看 S.M.A.R.T. 信息。 使用 smartctl 进行硬盘测试。 修复:https://www.smartmontools.org/wiki/BadBlockHowto","link":"/2021/07/11/%E3%80%90%E8%A1%A5%E6%A1%A3%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/"},{"title":"使用acme.sh自动配置泛域名证书","text":"一年前用学生邮箱白嫖的域名要到期了,于是换了个便宜的 .top 域名,正好之前忘了记录自动签证书的过程了,这里记录一下以后再换域名的时候直接来抄。 由于同时有很多子域名在用,于是决定申请泛域名证书,共用同一个。 主要参考 官方文档 ,记录了仅适用于我个人的配置过程。 安装 acme.sh1curl https://get.acme.sh | sh -s email=my@example.com 配置 DNS API参考 官方文档 泛域名证书似乎需要用 DNS 验证,我的 DNS 解析是托管在 Cloudflare 上的,先登录获取 API 密钥,这里我图省事直接用了 Global API Key,然后: 12export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"export CF_Email="xxxx@sss.com" 生成/安装证书生成证书: 1acme.sh --issue --dns dns_cf -d centaurus99.top -d *.centaurus99.top 安装证书: 1acme.sh --install-cert -d centaurus99.top --key-file /etc/v2ray/v2ray.key --fullchain-file /etc/v2ray/v2ray.crt --reloadcmd "sudo nginx -s reload" 据文档所说,DNS API 使用的变量,生成/安装参数都会被保存用于自动更新,60 天以后证书会自动更新并自动执行安装。下面再去 nginx 里配置证书位置即可。大功告成! 附录123root@cc:~/.acme.sh# acme.sh -vhttps://github.com/acmesh-official/acme.shv3.0.5","link":"/2022/06/21/%E4%BD%BF%E7%94%A8acme-sh%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E6%B3%9B%E5%9F%9F%E5%90%8D%E8%AF%81%E4%B9%A6/"},{"title":"Icarus主题配置日记","text":"不知怎么发现了 Icarus 这个主题,看起来不错,尝试改一改换上。 为了方便自定义,采用源码安装的形式。其实踩了遍直接 npm 安装的坑 本篇博客将和我自定义后的主题 Icarus个人修改版 保持同步更新~ Icarus 安装配置 Hexo截至 2022-01-15,Icarus 还没有官方支持 Hexo 6.0.0,所以如果在这个时间点使用默认方式安装 Hexo 并装上了 6.0.0 版本的话,大概需要手动降级。 Updated 2022-01-16:Icarus 已有支持 Hexo 6.0.0 的预发布版本。 我是将 package.json 中将 Hexo 的版本从 6.0.0 改为了 5.4.0,然后 npm update。 然后在 _config.yml 中将主题改为 Icarus: 1theme: icarus 可以选择将不用的默认主题 hexo-theme-landscape 卸载掉 安装 Icarus为了方便对主题单独进行管理,我先将主题 Fork 一份到自己的 Github 上,即 Icarus个人修改版,然后通过 git 子模块进入到博客中来。 在博客根目录下使用如下命令: 1git submodule add https://github.com/Centaurus99/hexo-theme-icarus.git themes/icarus 这样,即使到一台新设备上,也只需要在 clone 之后在项目目录下多一步 git submodule update --init,就能获取到主题了。 此时直接开始运行会发现缺少依赖,手动安装一下即可(直接 npm 安装也可能会遇到这个问题,参考 Issue#855)。 1npm install --save bulma-stylus@0.8.0 hexo-renderer-inferno@^0.1.3 配置 Icarus 主题在 themes/icarus/ 下没有配置文件的前提下(如果有就删了),可以先运行一下 hexo server ,会在博客根目录下自动生成 _config.icarus.yml 配置文件,在这里配置而不是主题目录下配置即可保持主题源码不含个人配置文件。 接着就可以对着 官方文档 配置自己的主题啦。 一些个性化的东西这里就不做记录了,记录一些功能的配置过程。 关于显示更新时间问题这实际是不是主题配置相关内容,只是记录一下,如果使用 Git 管理博客源码,记得把 _config.yml 中的 updated_option 改为 'date',这样显示的更新时间是由博客 Front-matter 标记中的 updated 决定的,而不是由文件修改时间决定。 使用二次开发后的主题这里发现有个大佬对主题做了很多不错的修改 大佬博客,可以提个 PR 到自己这儿来使用。源码 这个代码直接使用可能会因为编码规范问题不通过 Code Linting 检查,npm run lint 可以查看问题,可以临时在 package.json 中的 scripts > lint 对应的命令里添加 –fix 尝试自动修复,剩下的问题就要手动修复了。 评论插件由于 Gitalk 请求的账户权限太高,又不想使用依托于其他第三方服务的评论插件,同时 Valine 又有着安全问题,Isso 又感觉较为简陋,所以最终选择了 Waline 评论插件。正好手头上有个 VPS,可以自建评论服务器。 twikoo 也是一个很不错的评论插件,不过由于不支持独立部署(imaegoo/twikoo#163)以及外观上更喜欢 Waline 的缘故,最终还是选择了 Waline。 客户端配置参考 Icarus评论插件文档,只需要在 _config.icarus.yml 中修改评论插件配置就可以啦。 123comment: type: waline server_url: 服务端地址 服务端配置目前本博客的评论服务器为自建服务器,参考 官方文档 搭建,以下为搭建过程记录(方便重建的时候过来直接 copy)。 > 创建对应用户以下过程可能需要 sudo 权限,并非必须步骤。 新建一个无法直接登录的用户用于运行 waline 服务: 1sudo adduser waline --disabled-login --disabled-password 切换到该用户: 1sudo su - waline 使用 npm 安装 waline: 1npm install @waline/vercel > 配置 MySQL 数据库参考 大佬博客。 1234567891011--创建新的数据库,并设置数据库编码$ CREATE DATABASE 你的数据库名 DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;--创建新的用户$ CREATE USER '你的用户名'@'你的服务器IP' IDENTIFIED BY '你的密码';--把数据库的管理权限给予刚刚创建的MySQL用户$ GRANT ALL PRIVILEGES ON *.* TO '你的用户名'@'%';--刷新权限,使用设置生效$ FLUSH PRIVILEGES; 执行数据库初始化脚本 waline.sql,可以先登录到对应 MySQL 账户下,然后: 12USE 你的数据库名;SOURCE 脚本文件位置; > 配置评论通知参考 https://waline.js.org/guide/server/notification.html ,这里我只配置了邮件通知,见下面的配置文件。 > 配置为服务运行可以先试一下能否直接运行,先配置环境变量: 123export MYSQL_DB=你的数据库名export MYSQL_USER=你的用户名export MYSQL_PASSWORD=你的密码 然后尝试运行: 1node node_modules/@waline/vercel/vanilla.js 如果没啥问题,就可以配置成服务了。 编辑文件 /etc/systemd/system/waline.service,如下配置: /etc/systemd/system/waline.service12345678910111213141516171819202122[Unit]Description=Waline Comment Server[Service]Type=simpleUser=walineWorkingDirectory=/home/walineExecStart=/usr/bin/node /home/waline/node_modules/@waline/vercel/vanilla.jsEnvironment=MYSQL_DB=你的数据库名Environment=MYSQL_USER=你的用户名Environment=MYSQL_PASSWORD=你的密码Environment=SMTP_SERVICE=SMTP 邮件发送服务提供商Environment=SMTP_USER=SMTP 邮件发送服务的用户名Environment=SMTP_PASS=SMTP 邮件发送服务的密码Environment=SITE_NAME=网站名称Environment=SITE_URL=网站地址(要去除末尾的'/')Environment=AUTHOR_EMAIL=博主邮箱Restart=on-failureRestartSec=5[Install]WantedBy=multi-user.target 然后使用 sudo systemctl enable --now waline.service 启动并设为开机自启动。 之后配置 Web 服务器转发到本地 8360 端口即可。Nginx 里可以这样配置: 123456789101112location / { proxy_pass http://127.0.0.1:8360/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header REMOTE-HOST $remote_addr; add_header X-Cache $upstream_cache_status; # cache add_header Cache-Control no-cache; expires 12h;} 然后就可以去博客里测试一下了,第一个注册的用户将成为管理员。 使用 patch-package 修改第三方模块主题中使用到的一些模块可能需要修改源码进行个性化,比如 hexo-component-inferno 中没有使用最新的 waline 前端模块,想要手动配置。可以使用 patch-package 来进行易于管理的修改。 首先 npm install patch-package 安装 然后在 node_modules/ 中修改源码 运行 npx patch-package package-name 生成补丁文件 在 package.json 中加入执行脚本: 123 "scripts": {+ "postinstall": "npx patch-package" }, 这样之后就可以在 npm install 时自动打上个性化补丁了。 暗黑主题参考:https://github.com/ppoffice/hexo-theme-icarus/issues/564 Waline 评论插件中代码高亮样式问题如图: 研究一番后发现, Waline 使用 Prism 进行代码高亮,它会直接对代码的不同高亮的部分赋上不同的类,这个类名不会使用 namespace 进行保护(加个前缀啥的),这样的类名有 tag , number 等等。 比如上图代码中的 html 标签 <head> 会格式化为: 1234567<span class="token tag"> <span class="token tag"> <span class="token punctuation">&lt;</span> head </span> <span class="token punctuation">&gt;</span></span> 恰巧的是,Icarus 中使用了 CSS 框架 bulma,对 tag , number 之类的样式进行了设定,这就导致了评论区代码高亮出现问题。 在 Prism 的 Issue#1324 中也提到了该问题并给出了解决方法,但由于评论区的代码高亮是在评论服务端完成的,懒得去改服务端代码了,于是就自定义 CSS 进行覆盖,顺便也解决一下默认情况下评论区中黑色代码块和主题格格不入的问题,适配一下明暗两种主题。commit#974b1c9 效果: 参考 https://xiongyingqi.com/2019/02/01/use-git-submodules/ https://ppoffice.github.io/hexo-theme-icarus/Configuration/icarus用户指南-主题配置/ https://www.alphalxy.com/2019/03/customize-icarus/ https://confluence.jaytaala.com/display/TKB/Installing%2C+configuring%2C+and+integrating+isso+%28commenting+web+app%29+into+Confluence https://www.eula.club/使用Waline给Hexo静态博客添加评论系统 https://www.jianshu.com/p/a4b6e06e9f8d 附录:个性化修改记录主要记录一下我的主题源码有什么额外的改动。 a05b870 为解决关于 Code Linting 的问题,对代码格式进行了一些修正。 248a768 删除了 merge 过来的代码中的个人配置文件。 229543d 个人信息页面上将 关注我 修改为 关注。 e38ae7c 删除了 merge 过来代码中的个人 logo。 658686a 将黑幕添加到 css 中便于直接使用。 74416d2 添加暗黑主题,并在后面几个 commit 中进行适配。 1544bb3 修改了代码块中字体大小。 974b1c9 适配 Waline 评论插件中代码块的主题风格(包括黑白两种主题)。 6b5da24 例行同步上游更新。 dcb178c 修复上游更新中引起的纯文字 logo 边角被上层容器覆盖的问题。 3a3c5e6 修复上游更新中 Waline 评论插件升级至 v2 后 CSS 类开头从 v 改为 wl- 引起的问题。","link":"/2022/01/15/Icarus%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE%E6%97%A5%E8%AE%B0/"},{"title":"使用 Clash + AdGuard Home 在树莓派软路由上搭建广告屏蔽与透明代理服务器","text":"之前 【补档】树莓派折腾记录 中也记录过了相关内容,但是一年过来有些地方有些变动与改进,故单开一篇重新记录并长期更新。 配置 Clash 进行透明代理TODO 配置 AdGuard Home 进行广告屏蔽TODO 防火墙作为一个挂在公网下 7×24h 运行的网关服务器,进行一定的防火墙配置是必不可少的。这里主要通过 iptables 和 ip6tables 实现。 由于使用了 iptables-persistent 进行 iptables 规则可持久化,方便起见下面就直接把保存的规则文件贴上来了。 IPv4/etc/iptables/rules.v4123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263*filter# INPUT 和 FORWARD 链上默认 DROP 掉:INPUT DROP [0:0]:FORWARD DROP [0:0]:OUTPUT ACCEPT [0:0]# 防止外网使用内网 IP 欺骗-A INPUT -i eth0 -s 192.168.0.0/16 -j DROP# 允许本机、内网以及已建立的连接通过和转发-A INPUT -i lo -j ACCEPT-A INPUT -i docker0 -j ACCEPT-A INPUT -i wlx1cbfceb110dc -j ACCEPT-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT-A FORWARD -i lo -j ACCEPT-A FORWARD -i docker0 -j ACCEPT-A FORWARD -i wlx1cbfceb110dc -j ACCEPT-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT# 开放外网 SSH, HTTP, HTTPS 连接-A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPTCOMMIT*nat:PREROUTING ACCEPT [0:0]:INPUT ACCEPT [0:0]:POSTROUTING ACCEPT [0:0]:OUTPUT ACCEPT [0:0]# 新建 clash 链:clash - [0:0]# 内网 TCP 请求转发给 clash 链-A PREROUTING -s 192.168.0.0/16 -p tcp -j clash# 将转发后的包源地址修改为本机地址-A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE# 访问本机和内网不经过 clash-A clash -d 10.0.0.0/8 -j RETURN-A clash -d 127.0.0.0/8 -j RETURN-A clash -d 169.254.0.0/16 -j RETURN-A clash -d 172.16.0.0/12 -j RETURN-A clash -d 192.168.0.0/16 -j RETURN-A clash -d 224.0.0.0/4 -j RETURN-A clash -d 240.0.0.0/4 -j RETURN# 访问校园网不经过 clash-A clash -d 59.66.0.0/16 -j RETURN-A clash -d 101.5.0.0/16 -j RETURN-A clash -d 101.6.0.0/16 -j RETURN-A clash -d 118.229.0.0/19 -j RETURN-A clash -d 166.111.0.0/16 -j RETURN-A clash -d 183.172.0.0/15 -j RETURN-A clash -d 202.112.39.2/32 -j RETURN-A clash -d 219.223.168.0/21 -j RETURN-A clash -d 219.223.176.0/20 -j RETURN# 其余请求重定向至 clash 端口-A clash -p tcp -j REDIRECT --to-ports 7891COMMIT IPv6参考:https://www.sixxs.net/wiki/IPv6_Firewalling 关于为何 DHCPv6 相比 DHCPv4 要额外设置,参考:https://unix.stackexchange.com/questions/452880/what-are-the-essential-iptables-rules-for-ipv6-to-work-properly RFC 4890 给出了针对 ICMPv6 的防火墙配置建议,由于时间有限未能细读与实现。 RFC 5095 废除了 Type 0 Routing Headers,防火墙中给予了实现。 Updated 2023-05-08: 在之前配置完 IPv6 NAT 网络后,并没有为 IPv6 配置代理。随着 IPv6 的不断推广,部分被墙网站出现了使用本地代理可以访问,透明代理无法访问的情况,包括但不限于 v2ex.com,Youtube 的视频播放等,于是也为 IPv6 配置了代理。原本使用的 Clash Premium 2022.08.26 版本的 IPv6 代理似乎有 bug,需要进行升级。由于想继续使用 AdGuardHome 统计 DNS 查询信息,故需要依赖 Clash 的 redir-host 功能(该功能在 Premium 2023.02.16 版本被弃用),因此选用 Clash Premium 2023.01.29 版本。巧合的是,Premium 2023.01.29 版本将核心版本升级到了 1.13.0,该版本添加了对 IPv6 REDIRECT 的支持(#2473),这让 IPv6 的代理成为了可能。相关改动已同步到下方规则文件中。 /etc/iptables/rules.v61234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253*filter:INPUT DROP [0:0]:FORWARD DROP [0:0]:OUTPUT ACCEPT [0:0]# Filter all packets that have RH0 headers. Refer to RFC 5095-A INPUT -m rt --rt-type 0 -j DROP-A FORWARD -m rt --rt-type 0 -j DROP-A OUTPUT -m rt --rt-type 0 -j DROP# Allow trusted link to INPUT and FORWARD-A INPUT -i lo -j ACCEPT-A INPUT -i docker0 -j ACCEPT-A INPUT -i wlx1cbfceb110dc -j ACCEPT-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT-A FORWARD -i lo -j ACCEPT-A FORWARD -i docker0 -j ACCEPT-A FORWARD -i wlx1cbfceb110dc -j ACCEPT-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT# Allow DHCPv6-A INPUT -p udp --dport 546 -d fe80::/10 -j ACCEPT# Allow ICMPv6-A INPUT -p icmpv6 -j ACCEPT# Allow some server port-A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPTCOMMIT*nat:PREROUTING ACCEPT [0:0]:INPUT ACCEPT [0:0]:POSTROUTING ACCEPT [0:0]:OUTPUT ACCEPT [0:0]:clash - [0:0]# 内网 TCP 请求转发给 clash 链-A PREROUTING -s fd22:41b7:e060::/64 -p tcp -j clash# 将转发后的包源地址修改为本机地址-A POSTROUTING -s fd22:41b7:e060::/64 -o eth0 -j MASQUERADE# 访问内网和校园网不经过 clash-A clash -d fd22:41b7:e060::/64 -j RETURN-A clash -d 2402:f000::/32 -j RETURN# 其余请求重定向至 clash 端口-A clash -p tcp -j REDIRECT --to-ports 17891COMMIT","link":"/2022/09/02/%E4%BD%BF%E7%94%A8-Clash-AdGuard-Home-%E5%9C%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E8%BD%AF%E8%B7%AF%E7%94%B1%E4%B8%8A%E6%90%AD%E5%BB%BA%E5%B9%BF%E5%91%8A%E5%B1%8F%E8%94%BD%E4%B8%8E%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8/"},{"title":"树莓派软路由配置 IPv6 网络","text":"树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。 网络环境:树莓派有线网卡 eth0 作为 WAN 口连接 IPv4 + IPv6 双栈的校园网,USB 无线网卡 wlx1cbfceb110dc 作为无线 AP 提供局域网,USB 网卡的驱动和 AP 的搭建见 【补档】树莓派折腾记录。 网桥透传法由于我的 IPv6 网络并没有透明代理的需求,所以其实在两个网卡间搭个网桥,把树莓派作为二层网络设备(类似交换机)使用即可。主要问题在于限制网桥只走 IPv6 流量,这个使用 ebtables 即可,局域网中的网络设备会联系校园网的网关获取到 IPv6 地址等信息。 部署完后才发现,校园网的 IPv6 也是需要登录认证的,所以这样整的话每次联网都需要手动登录,所以最终弃用了 QAQ. 主要参考:http://www.xingbin.net/blog_channel8/C/CampusNetwork_IPv6/ 建立网桥:sudo brctl addbr ipv6br 启动网桥:sudo ifconfig ipv6br up 只允许 IPv6 数据包通过网桥:sudo ebtables -t broute -A BROUTING -p ! ipv6 -j DROP 这一步如果遇到了 RULE_APPEND failed (No such file or directory): rule in chain BROUTING. 之类的错误的话,可能是因为使用了基于 nf_tables 而不是 xtables 的 ebtables,(参见:https://sources.debian.org/src/iptables/1.8.2-4/debian/NEWS/),此时使用 ebtables-legacy 即可。 添加 eth0 进入网桥:sudo brctl addif ipv6br eth0 添加 wlx1cbfceb110dc 进入网桥:sudo brctl addif ipv6br wlx1cbfceb110dc 注意: 建议先设置 ebtables 再添加网卡,否则直接将网卡添加进网桥的话会导致 IPv4 流量都进入网桥,从而无法正常连接以及丢失 SSH 连接。 以上配置重启后会消失,需要可持久化的话可以参考 http://blog.yesterday17.cn/post/pi-router/ 中的配置。 NAT for IPv6IPv6 网络中本不应使用 NAT,然而校园网中获得的 IPv6 地址使用 ifconfig 查看是 prefixlen 128 的(或许是由 prefixlen 64 的地址生成的?这块儿我不是很明白),并且对每一个 IP 都会要求身份认证,给连入宿舍局域网中的设备带来了一定的麻烦。于是选择搭建 NAT 网络,共用同一个校园网 IPv6 地址。 局域网中使用唯一本地 IPv6 单播地址 (ULA, Unique Local IPv6 Unicast Address, RFC 4193),要求拥有固定前缀 fd00::/8,然后是 40 位随机 Global ID(关于随机的必要性见:https://blogs.infoblox.com/ipv6-coe/3-ways-to-ruin-your-future-network-with-ipv6-unique-local-addresses-part-2-of-2/)。然而为了手打地址方便,我还是使用了有某种实际意义的地址:fd22:41b7:e060::/64。至少没用全零 首先开启 IPv6 内核转发,编辑 /etc/sysctl.conf /etc/sysctl.conf12net.ipv6.conf.all.forwarding=1net.ipv6.conf.all.accept_ra=2 关于 accept_ra 的设置参考:https://sysctl-explorer.net/net/ipv6/accept_ra/,大概是因为开启转发后会自动关闭 Accept Router Advertisements,设置值为 2 可以强制开启。 接着使用 dhcpcd 配置内网无线 AP 网卡的固定静态地址,在 /etc/dhcpcd.conf 中添加 static ip6_address,编辑后如下: /etc/dhcpcd.conf1234interface wlx1cbfceb110dc static ip_address=192.168.22.1/24 static ip6_address=fd22:41b7:e060::/64 nohook wpa_supplicant 重启 dhcpcd 生效:sudo systemctl restart dhcpcd.service 然后使用 dnsmasq 配置地址分配相关服务,这里在内网同时开启 SLAAC 和 DHCPv6,编辑 /etc/dnsmasq.conf 后如下: /etc/dnsmasq.conf12345678interface=wlx1cbfceb110dcdhcp-range=192.168.22.100,192.168.22.200,255.255.255.0,24hdhcp-range=fd22:41b7:e060::1,fd22:41b7:e060::fe,slaac,1hdhcp-option=3,192.168.22.1dhcp-option=6,192.168.22.1dhcp-option=option6:dns-server,[fd22:41b7:e060::]enable-radhcp-authoritative 重启 dnsmasq 生效:sudo systemctl restart dnsmasq.service 再通过 ip6tables 在 POSTROUTING 链上做一个 SNAT 即可: 1sudo ip6tables -t nat -A POSTROUTING -s fd22:41b7:e060::/64 -o eth0 -j MASQUERADE 上面配置了树莓派为 DNS 服务器,树莓派使用 Clash 和 Adguard Home 搭建 IPv4 与 IPv6 双栈 DNS 服务,上游服务器也均为双栈 DNS 服务器,重连设备获取 IP 后即可正常使用了。 如果要指定 DNS 服务器可以在 dnsmasq 中类似配置,以 TUNA DNS666 服务器为例:dhcp-option=option6:dns-server,[2001:da8::666] 配置的 SLAAC 支持使 Android 手机也能正常使用 IPv6 服务。 经测试,内网设备使用 IPv6 单栈也可以正常访问双栈或 IPv6 单栈网页。 一些测试网站 IPv6 测试站: http://test-ipv6.com 东北大学 IPv6 测速站:http://speed.neu6.edu.cn/ 参考 http://www.xingbin.net/blog_channel8/C/CampusNetwork_IPv6/ https://post.smzdm.com/p/ad9qkz9k/ https://tang.su/2017/03/openwrt-ipv6-nat/ https://lwz322.github.io/2018/10/07/IPv6_NAT.html Dnsmasq 手册:https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html","link":"/2022/09/02/%E6%A0%91%E8%8E%93%E6%B4%BE%E8%BD%AF%E8%B7%AF%E7%94%B1%E9%85%8D%E7%BD%AE-IPv6-%E7%BD%91%E7%BB%9C/"},{"title":"使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化","text":"最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,https://pvvx.github.io/ATC_MiThermometer/),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。 最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。 刷入定制固件参考: 小米温湿度传感器刷入定制固件,开启自定义功能 https://roov.org/2021/04/mi-thermometer-firmware/ 使用 https://github.com/pvvx/ATC_MiThermometer 中的定制固件,老外非常 NB,还写了一套网页直接在线刷固件:https://pvvx.github.io/ATC_MiThermometer/TelinkMiFlasher.html,在仓库中查看使用说明即可。 刷入定制固件后开启小米蓝牙温湿度计的蓝牙广播功能,这样树莓派不用连接就能接收温湿度广播数据了。由于周围环境较为可信且刻意调低了发射增益,我没有设置 PIN 码和加密,防止哪天忘了连不上。就是懒了 树莓派接收蓝牙广播参考:使用树莓派定时读取小米温湿度传感器数据并发送到微信 也已经有老外编写了完善的接收程序,直接查看仓库中说明使用即可:https://github.com/JsBergbau/MiTemperature2 存入 InfluxDB 数据库安装并配置 InfluxDB 数据库参考:https://blog.csdn.net/qq_41475058/article/details/108050440 1sudo apt install influxdb influxdb-client 然后数据库服务器会在 8086 端口上开始监听。似乎需要添加 admin 用户才能开启权限认证,我只需要它能跑起来就行就没管。懒了 1234influx # 默认连接到localhost:8086show users # 查看所有用户,默认没有CREATE USER "pi" WITH PASSWORD '******' WITH ALL PRIVILEGES # 创建 pi 用户用于管理数据create database mi # 创建 mi 数据库用于存放数据 将广播数据存入编辑接收程序中的 sendToInflux.sh 如下: sendToInflux.sh1curl -i -u "pi:PASSWORD" -XPOST http://127.0.0.1:8086/write?db=mi\\&precision=s --data-binary "AquaraBluetoothSensors,sensorname=$2 temperature=$3,calibratedHumidity=$4,voltage=$5,batteryLevel=$6 $7" 然后 python3 LYWSD03MMC.py --atc --battery --callback sendToInflux.sh 即可开始接受广播数据并存入数据库。 此时在数据库中可以看到数据了: 123use mi # 进入 mi 数据库show measurements # 查看表,此时应有表 AquaraBluetoothSensorsselect * from AquaraBluetoothSensors # 查看表中所有数据 还可以写个 service 来跑,比如编辑 /etc/systemd/system/MiTemperature.service : /etc/systemd/system/MiTemperature.service12345678910111213141516[Unit]Description=MiTemperature advertisements receiverAfter=network.target[Service]Type=simpleUser=piRestart=alwaysRestartSec=5WorkingDirectory=/home/pi/Git/MiTemperature2ExecStart=/usr/bin/python3 LYWSD03MMC.py --atc --battery --callback sendToInflux.shStandardOutput=file:/home/pi/Git/MiTemperature2/output.logStandardError=file:/home/pi/Git/MiTemperature2/error.log[Install]WantedBy=multi-user.target 开启服务并开机自启 12sudo systemctl start MiTemperature.servicesudo systemctl enable MiTemperature.service Grafana 可视化参考官方说明,使用 apt 安装:https://grafana.com/docs/grafana/v9.0/setup-grafana/installation/debian/#install-from-apt-repository 123456sudo apt install apt-transport-httpssudo apt install wget # 说明中的 software-properties-common 我没装上,好像不影响wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -echo "deb https://packages.grafana.com/enterprise/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.listsudo apt updatesudo apt-get install grafana-enterprise 然后编辑 /etc/grafana/grafana.ini 更换服务端口,启动服务: 12sudo systemctl start grafana-server.servicesudo systemctl enable grafana-server.service 最后浏览器访问对应端口上的网页,默认用户名和密码是 admin,然后进行配置即可。Grafana 的功能蛮复杂的,有空可能单独开一篇来记录~","link":"/2022/09/07/%E4%BD%BF%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E5%92%8C%E5%B0%8F%E7%B1%B3%E8%93%9D%E7%89%99%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%AE%A1%E5%8F%AF%E8%A7%86%E5%8C%96%E5%AE%BF%E8%88%8D%E6%B8%A9%E6%B9%BF%E5%BA%A6%E5%8F%98%E5%8C%96/"},{"title":"基于 Proxmox VE 的 All in One 服务器搭建","text":"树莓派挂在宿舍当软路由已经两年了,大部分情况下都挺好用,透明代理体验也还算尚可。 然而由于使用的 USB 无线网卡驱动支持较差,无线峰值速率只能跑到 200+ Mbps,且不大稳定。并且树莓派性能不高,无法开设一些高负载服务。另外,树莓派作为路由常年开启,需要考虑散热问题,虽然给使用的小风扇写了启停功能,但是启动运转时还是会有一定的噪音,较为恼人。 正好快到暑假了,需要开设一台 MC 服务器,于是打算换用一台较高性能的软路由,再配合 Wi-Fi 6 无线路由器作为 AP,提供高速率、高稳定性的有线无线网络接入。 整体配置概览软路由选用畅网奔腾 8505 软路由,1 大核 + 4 小核,大核的单核性能较高,CPU-Z 单核跑分相比我的笔记本(i5-1135G7)高出约 40%,可以用来开设一些吃单核性能的服务。 内存使用了两条光威 8GB DDR4 3200 内存,时序 CL-22-22-22-52。使用 16 GB 内存也主要是为了开设 MC 服务器考虑。 存储方面安装了西数 SN570 1T 固态作为系统盘,也暂时承担一部分文件存储功能。 作为一台路由器,这台软路由有 6 个 Intel i226-V 2.5G 网卡,即使以后有更多设备需要有线接入,也不一定需要增设交换机。 功耗方面,实测待机时输入功率约为 10 W。 温度方面,室温 24 度环境下,不加风扇待机时 CPU 约 40 度,NVME 固态约 50 度,软路由表面摸起来较热;加上赠送的 USB 12cm 风扇吹顶部铝制散热片后,待机时 CPU 约 30 度,NVME 固态约 40 度,外壳很凉快。 无线 AP目前廉价的 Wi-Fi 6 路由器均使用千兆有线网口,单口有线速率甚至可能不及无线速率,故考虑需要能和软路由之间做链路聚合提高内网性能。 调查后发现,TP-Link 系列的路由器似乎原厂固件就有着端口聚合功能,其子品牌水星也有着相同的功能,且便宜几十元。 于是选用水星 X306G 路由器,AX3000 规格,计划只使用其 5G 频段 Wi-Fi 和端口聚合功能,运行在 AP 模式。 安装和调试 PVE安装参考官方教程或网上教程,一路 next 即可。 其中将 ETH5 对应的网卡设为管理口,静态 IP 设为 192.168.22.100(22 网段)。 更换内核版本由于 8505 CPU 是大小核架构,建议使用较新的内核获取大小核调度优化。 先换源,参考:https://mirrors.tuna.tsinghua.edu.cn/help/proxmox/,并删除企业源:rm /etc/apt/sources.list.d/pve-install-repo.list apt update 后搜索可用的内核版本,我这儿选择 6.2 版本:apt install pve-kernel-6.2,安装完重启后生效。 可以使用 proxmox-boot-tool 管理安装的以及用于启动的 kernel 版本。 管理页面添加温度显示偷懒使用了恩山论坛的脚本,添加了温度,CPU频率,硬盘信息的显示:https://www.right.com.cn/forum/thread-6754687-1-1.html 删除 lvm-thin 并扩容 lvm由于使用单盘搭建 All in One 服务器,计划在 PVE 系统中使用 samba 共享数据文件,因此需要较大的 lvm 空间。同时,由于不需要开大量的虚拟机,也用不到 lvm-thin 的特性。故将 lvm-thin 的空间全部合入 lvm 中。 参考:https://foxi.buduanwang.vip/virtualization/pve/1434.html/ 删除 lvm-thin:lvremove /dev/pve/data 扩容 lvm:lvextend -rl +100%FREE /dev/pve/root 部署 samba安装:apt update && apt install samba 添加用户:useradd thx 将用户添加到 samba:smbpasswd -a thx 编辑 samba 配置文件 /etc/samba/smb.conf,添加共享文件夹的配置: 1234567891011121314151617181920212223242526272829303132333435[RaspCloud] path = /data/RaspCloud writeable = yes create mask = 0777 directory mask = 1777 public = yes guest ok = yes[PT] path = /data/PT writeable = yes create mask = 0644 directory mask = 1755 public = yes guest ok = yes[Private] path = /data/Private writeable = yes create mask = 0644 directory mask = 1755 public = no guest ok = no valid users = thx browseable = yes[Sync] path = /data/Sync writeable = yes create mask = 0644 directory mask = 1755 public = no guest ok = no valid users = thx browseable = yes 其中 /data/RaspCloud 为公开共享目录,内部有 read-only 目录通过改变目录所有者来限制 guest 的写入。 /data/PT 为公开只读共享目录。 /data/Private 和 /data/Sync 为私密目录,使用白名单限制访问用户。 如果需要在共享目录中软链接到系统里的其它目录中,则需要在 [global] 段中添加: /etc/samba/smb.conf1234[global] follow symlinks = yes wide links = yes unix extensions = no 参考:https://blog.csdn.net/humanking7/article/details/85058471 smb.conf 中的配置项可查阅:https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html 更改 CPU 电源策略作为一个桌面服务器,需要考虑到功耗与发热的问题。 参考:https://pve.sqlsec.com/4/6/ 12345# 查看支持的 CPU 电源模式cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors# 查看当前的 CPU 电源模式cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 电源模式 解释说明 performance 性能模式,将 CPU 频率固定工作在其支持的较高运行频率上,而不动态调节。 userspace 系统将变频策略的决策权交给了用户态应用程序,较为灵活。 powersave 省电模式,CPU 会固定工作在其支持的最低运行频率上。 ondemand 按需快速动态调整 CPU 频率,没有负载的时候就运行在低频,有负载就高频运行。 conservative 与 ondemand 不同,平滑地调整 CPU 频率,频率的升降是渐变式的,稍微缓和一点。 schedutil 负载变化回调机制,后面新引入的机制,通过触发 schedutil sugov_update 进行调频动作。 安装工具:apt install cpufrequtils 设为 ondemand 模式:cpufreq-set -g ondemand 无显示器启动问题发现如果不接显示器,则无法正常启动。初步判断在启动 grub 或之后出现问题。 然而,对 BIOS 和 grub 配置文件做各种修改之后也无法解决问题。 最终打算网上买个 HDMI 诱骗器插上得了。 插上后也没用。 经仔细排查(偶然将接地良好的显示器的 Type-C 线的外壳接触到软路由 Type-C 口的外壳上,发现问题就消失了),发现是供电接地问题。 先前为了监测功耗,我将电源的 DC 转为了 USB 母口,插上了 USB 电压电流测量设备,再将测量设备的 USB 口转为 DC 口,接到软路由的 DC 供电口。在这个过程中可能丢失了地线。 直接接电源就不再有问题。 挂载硬盘再接上一块老机械盘,用来挂 PT。 安装好硬盘后,先使用 lsblk -f 或者 ls -l /dev/disk/by-uuid 找到分区的 UUID,使用 UUID 进行挂载可以避免 /dev/ 下设备名的改变导致的挂载问题。 然后在 /etc/fstab 中添加挂载信息: /etc/fstab1UUID=1f4a2672-3039-594b-808c-a5d3913b0fde /data/hdd ext4 defaults,nofail 0 0 注意 nofail 用来在硬盘没有成功挂载时也能正常启动,否则启动会等待硬盘挂载,失败后进入 emergency mode。 然后 mount -a 生效,开机后也会自动挂载。 硬盘维护缩减数据盘的文件系统预留空间参考:https://askubuntu.com/questions/249387/df-h-used-space-avail-free-space-is-less-than-the-total-size-of-home 默认情况下,df -h 查看硬盘空间会发现,Size 会大于 Used + Avail,如: 12Filesystem Size Used Avail Use% Mounted on/dev/sda1 294G 261G 19G 94% /data/hdd 这是由于 ext2/3/4 文件系统默认会保留 5% 的空间只供 root 使用,而数据盘就没这个必要了,可以 tune2fs -m 0 /dev/sda1 来取消预留空间。 S.M.A.R.T. 信息在 WebUI 中,可以在节点的磁盘一栏中查看 S.M.A.R.T. 信息。 命令行中,可以使用 smartctl -a /dev/sda 查看。 S.M.A.R.T. 信息的解析,可以参考:https://blog.csdn.net/MrSate/article/details/88564764。 使用 journalctl -u smartmontools.service 可以查看 smartmontools 守护进程的监测日志。 配置 smartd 守护程序还可以在 /etc/smartd.conf 中配置守护程序,初始时配置如下: /etc/smartd.conf1DEVICESCAN -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner 添加如下参数: 基于默认修改的监测与报警参数 -H -f -l error -l selftest -C 197 -U 198,相比默认的 -a 参数减少了等效的 -t 参数,否则每半小时都会在日志中输出 S.M.A.R.T. 信息的变化情况(详见 /etc/smartd.conf 中的说明) 每周六凌晨三点短自检,每月二十号凌晨三点长自检:-s (S/../../6/03/|L/../20/./03) 监控温度,在温度变化 5 度时记录,达到 40 度时记录,达到 45 度时警告(0 为关闭):-W 5,40,45 修改后如下: /etc/smartd.conf123DEFAULT -H -f -l error -l selftest -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner/dev/nvme0 -W 0,60,70DEVICESCAN -C 197 -U 198 -s (S/../../6/03/|L/../20/./03) -W 0,40,50 重启服务后生效:systemctl restart smartd.service 如果守护程序检测到了出现问题,也会给安装 PVE 时填写的邮箱发邮件,实测 QQ 邮箱可以收到。 参考: man smartd.conf https://blog.kahosan.top/2022/06/20/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20smartd%20%E7%9B%91%E6%8E%A7%E4%BD%A0%E7%9A%84%E7%A1%AC%E7%9B%98/ https://forum.proxmox.com/threads/seagate-smart-prefailure-attribute.57454/ https://wiki.archlinux.org/title/S.M.A.R.T.#smartd 配置硬盘休眠可能需要先关闭 pvestatd 对硬盘的扫描,参考:https://www.ippa.top/954.html 先 ls -l /dev/disk/by-uuid 找到硬盘的 UUID 1f4a2672-3039-594b-808c-a5d3913b0fde,然后编辑 /etc/lvm/lvm.conf,在 global_filter 中添加 "r|/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde.*|",结果如下: /etc/lvm/lvm.conf123devices { global_filter=["r|/dev/zd.*|", "r|/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde.*|"]} pvestatd restart 后生效。 查看硬盘当前状态:smartctl -i -n standby /dev/sda | grep "mode"|awk '{print $4}',ACTIVE 或者 IDLE 都为运转状态。 查询当前电源管理参数:hdparm -B /dev/sda 进入 standby mode:hdparm -y /dev/sda 进入 sleep mode:hdparm -Y /dev/sda 然后编辑 /etc/hdparm.conf,添加需要休眠的硬盘设置,比如十分钟后 standby 如下配置: /etc/hdparm.conf12345/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde { apm = 127 acoustic_management = 127 spindown_time = 120} /usr/lib/pm-utils/power.d/95hdparm-apm resume 后生效(参考 man hdparm.conf) 其中 spindown_time 参考 man hdparm 中的 -S 选项说明来设置。 不过我的这块硬盘似乎并不按照设定的 spindown_time 来休眠,于是打算观察一段时间 Load_Cycle_Count 的增长情况来决定是否开启休眠功能。 smartctl -a /dev/sda | grep Load_Cycle_Count 即可查看。 硬盘无法休眠 Debug后来又入了两块盘,但是 hdparm -y 之后又会立即唤醒,无法进入休眠状态。 诊断方式参考:https://askubuntu.com/questions/1406434/block-dump-reporting-missing-from-ubuntu-22-04 监控对 /dev/sda 的使用:blktrace -d /dev/sda -a pc -o - | blkparse -i - 然后 hdparm -Y /dev/sda ,查看唤醒磁盘的进程。 我这儿结果如下,然而搜索相关资料后并没有获取到有用的信息: 1234567898,16 0 1 0.000000000 18871 D N 0 [hdparm]8,16 1 1 0.497835738 0 C N [0]8,16 0 2 1.412267626 168 D R 4 [scsi_eh_1]8,16 0 3 1.412286261 14 C R [0]8,16 0 4 1.412293625 18 D R 12 [kworker/0:1]8,16 0 5 1.412295327 14 C R [0]8,16 0 6 1.412297439 18 D R 4 [kworker/0:1]8,16 0 7 1.412298518 14 C R [0]... 有可能是 ext4 的 lazy init 导致,参考:https://unix.stackexchange.com/questions/533789/hard-drive-waking-from-sleep-for-no-apparent-reason 基于 LXC 安装 OpenWrtLXC 开销小,故尝试使用 LXC 安装 OpenWrt 安装 OpenWrt安装过程参考:https://virtualizeeverything.com/2022/05/23/setting-openwrt-in-proxmox-lxc/ 下载地址:https://downloads.openwrt.org/ 我选择了 20.03.5 版本:https://downloads.openwrt.org/releases/22.03.5/targets/x86/64/ 下载 rootfs.tar.xz 即可,可以在下载时选择哈希校验。 创建容器的 UI 的文档:https://pve.proxmox.com/pve-docs/chapter-pct.html#pct_settings 似乎由于 Web 页面无法添加 --ostype unmanaged 参数,需要进入命令行创建: 1pct create 101 /var/lib/vz/template/cache/openwrt-22.03.5-x86-64-rootfs.tar.gz --arch amd64 --hostname RaspCloud --rootfs local:1 --memory 1024 --cores 6 --cpuunits 200 --ostype unmanaged --unprivileged 1 然后在 Web UI 中添加一个虚拟网卡 veth0,桥接到 PVE 网桥 vmbr0 上,用于 OpenWrt 和 PVE 的交互。 此时连接在管理口上的设备便和 OpenWrt 连在同一个网桥上了,就可以通过这个虚拟网卡的地址访问 OpenWrt 了。 有可能启动后 veth0 并没被正确配置,可以手动 up 之后使用 IPv6 地址访问。 然后到配置文件 /etc/pve/lxc/101.conf 里添加直通网卡,比如: 1234lxc.net.0.type: physlxc.net.0.link: enp2s0 --- 需要使用的 host 中的网卡名lxc.net.0.name: eth0 --- LXC 中显示的网卡名lxc.net.0.flags: up 需要注意 net.id 的 id 不能和 Web UI 中添加的相同。 最终的 conf 文件: 1234567891011121314151617181920212223242526272829303132arch: amd64cores: 6cpuunits: 200hostname: RaspCloudmemory: 1024net0: name=veth0,bridge=vmbr0,firewall=1,hwaddr=92:81:93:06:8A:7E,type=vethonboot: 1ostype: unmanagedrootfs: local:101/vm-101-disk-1.raw,size=1Gstartup: order=1swap: 512unprivileged: 1lxc.net.5.type: physlxc.net.5.link: enp2s0lxc.net.5.name: eth0lxc.net.5.flags: uplxc.net.6.type: physlxc.net.6.link: enp3s0lxc.net.6.name: eth1lxc.net.6.flags: uplxc.net.7.type: physlxc.net.7.link: enp4s0lxc.net.7.name: eth2lxc.net.7.flags: uplxc.net.8.type: physlxc.net.8.link: enp5s0lxc.net.8.name: eth3lxc.net.8.flags: uplxc.net.9.type: physlxc.net.9.link: enp6s0lxc.net.9.name: eth4lxc.net.9.flags: up 配置 OpenWrt连接互联网由于我需要 OpenWrt 通过 PVE 管理口连接电脑,通过电脑将无线网共享给有线网来访问互联网,所以需要先为 veth0 配置一些上网功能。 添加 Interface veth0,类型为静态地址,网卡设为 veth0,配置好对应的地址,网关和 DNS 服务器地址即可。 之后应该就可以访问网络了。 换源参考:https://mirrors.tuna.tsinghua.edu.cn/help/openwrt/ 添加中文12opkg updateopkg install luci-i18n-base-zh-cn 更改主题不大喜欢 OpenWrt 的默认主题,换为 Argon 下载对应的 ipk:https://github.com/jerrykuku/luci-theme-argon/releases/download/v2.3.1/luci-theme-argon_2.3.1_all.ipk 然后安装: 123opkg install luci-compatopkg install luci-lib-ipkgopkg install luci-theme-argon*.ipk 配置路由功能启动后,只有 wan 和 wan6 两个 Interface,对应 eth0 网口(device)。 计划把其它网口都划入 LAN 中。 首先添加网桥设备 br-lan,把网口都加上去。 然后添加 lan 接口,使用静态地址,把 br-lan 加上去,配置地址即可。 然后发现,似乎 dnsmasq 出现了些问题,无法正常启动。 根据 https://github.com/openwrt/openwrt/issues/9064 中的方法,opkg remove procd-ujail 可以解决。 dnsmasq 正常后,在接口中配置 DHCP / DNS 的相关配置,然后 lan 口上接的设备就能获取到分配的地址了。 校园网只会分配 /128 地址,故 IPv6 也需要做个 NAT。OpenWrt 中 IPv6 默认并不会配置 SNAT,需要做一些手动配置,参考:https://openwrt.org/docs/guide-user/network/ipv6/ipv6.nat6 先启用 IPv6 masquerading,其中我这儿的 zone[1] 为 wan 域: 123uci set firewall.@zone[1].masq6="1"uci commit firewall/etc/init.d/firewall restart 然后关闭 wan6 口的 sourcefilter: 123uci set network.wan6.sourcefilter="0"uci commit network/etc/init.d/network restart 这样 lan 口上接的设备也能获取到 DHCPv6 分配的 IPv6 地址了,OpenWrt 也会为其提供 NAT6 服务。 配置 OpenClash先卸载 dnsmasq: 12opkg remove dnsmasqmv /etc/config/dhcp /etc/config/dhcp.bak 再按照发布页的说明,先安装依赖,再下载安装 ipk 即可:https://github.com/vernesong/OpenClash/releases 之后按个人喜好配置即可,我选用的是 Meta 核心的 redir-host 模式。 可以将校园网网段设为绕过,减少校内网络访问开销: IPv4: 12345678959.66.0.0/16101.5.0.0/16101.6.0.0/16118.229.0.0/19166.111.0.0/16183.172.0.0/15202.112.39.2/32219.223.168.0/21219.223.176.0/20 IPv6: 12402:f000::/32 或者可以打开 实验性:绕过中国大陆 IP 功能,减少国内网络访问开销。 遇上 OpenClash 的一个 bug。(Updated 2023.07.02: 随着 0.45.128 版本的发布,该问题已得到修复) 在 LuCI 中,虽然已经关闭了 路由本机代理,但是还是会 nftables 中添加处理 Output 链的规则,见 https://github.com/vernesong/OpenClash/blob/9ee0f02ed7615a62f960c9ee2f951dd1b47e2411/luci-app-openclash/root/etc/init.d/openclash#LL1649C1-L1672C9: 12345678if [ "$enable_redirect_dns" != "2" ] || [ "$router_self_proxy" = "1" ]; then nft 'add chain inet fw4 openclash_output' 2>/dev/null nft 'flush chain inet fw4 openclash_output' 2>/dev/null ... nft add rule inet fw4 openclash_output ip protocol tcp skuid != 65534 counter redirect to "$proxy_port" 2>/dev/null nft 'add chain inet fw4 nat_output { type nat hook output priority -1; }' 2>/dev/null nft 'add rule inet fw4 nat_output ip protocol tcp counter jump openclash_output' 2>/dev/nullfi 这里的判断中 或 上了不使用 Dnsmasq 转发,所以在我的工况下会被启用。暂时未明白为何要这样,故提了 Issue:https://github.com/vernesong/OpenClash/issues/3354。 两天后作者在 d499374 中修复了该 bug,发布于 0.45.125 版本中,等待合入 master。 远程 Wireshark 抓包调试有时配挂了需要抓包调试,可以使用远程主机上的 tcpdump + Windows 本机上的 wireshark 远程抓包分析。 给用户非 root 使用 tcpdump 权限:sudo chmod u+s /usr/sbin/tcpdump 然后 Windows 本机执行 ssh ubuntu "tcpdump -i br-lan -l -w - 'port not 22'" | wireshark -k -i - 即可开始抓包。 参考:https://thiscute.world/posts/tcpdump-and-wireshark 配置 UDP 代理使用 Redir-Host 兼容模式 + UDP tproxy 转发似乎并不能正常运行,所以还是得使用 TUN 模式。 LXC 启用 TUN 需要一点额外的配置,参考 https://forum.proxmox.com/threads/how-to-enable-tun-tap-in-a-lxc-container.25339/,在配置文件中添加如下内容: 12lxc.cgroup.devices.allow: c 10:200 rwmlxc.mount.entry: /dev/net dev/net none bind,create=dir 然后选用 Meta 内核,IPv4 和 IPv6 都启用 TUN 模式,即可代理 UDP 流量了。 还可以考虑开启 仅允许常用端口流量 来防止不必要的代理。具体地,此处所指的常用端口如下:21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 5222 5228 5229 5230 8080 8443 8880 8888 8889。 配置校园网认证使用 GoAuthing。 新版本的 OpenWrt 配置起来似乎有些不一样的地方,参考 https://github.com/z4yx/GoAuthing/issues/30 进行修改。 将 goauthing@ 脚本放到 /etc/init.d/goauthing 目录下,并 chmod +x。 /etc/init.d/goauthing123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#!/bin/sh /etc/rc.common# Authenticating utility for auth.tsinghua.edu.cn# This init script is used explicitly with OpenWRTUSE_PROCD=1START=96PROG="/usr/bin/goauthing"SERV=goauthing # UCI config at /etc/config/goauthingstart_instance() { local config=$1 local username password config_get username $config username config_get password $config password local args="-u $username -p $password" sleep 10 # Wait for link up "$PROG" $args deauth "$PROG" $args auth "$PROG" $args login procd_open_instance procd_set_param command "$PROG" procd_append_param command $args online procd_set_param stderr 1 procd_set_param respawn procd_close_instance}logout() { local config=$1 local username password config_get username $config username config_get password $config password local args="-u $username -p $password" "$PROG" $args logout}start_service() { config_load "$SERV" config_foreach start_instance "$SERV"}stop_service() { config_load "$SERV" config_foreach logout "$SERV"} 其中更改了启动优先级,添加了 sleep 10 来等待 wan 口配置完成,否则会因为无法完成 auth / login 就直接进入 online 守护程序,从而一直无法完成登录认证。 然后下载 https://mirrors.tuna.tsinghua.edu.cn/github-release/z4yx/GoAuthing/LatestRelease/auth-thu.linux.x86_64,并移动至脚本中填写的位置(默认为 /usr/bin/goauthing)。 然后配置并启动服务: 12345678touch /etc/config/goauthinguci add goauthing goauthinguci set goauthing.@goauthing[0].username='<YOUR-TUNET-ACCOUNT-NAME>'uci set goauthing.@goauthing[0].password='<YOUR-TUNET-PASSWORD>'uci commit/etc/init.d/goauthing enable/etc/init.d/goauthing start 配置链路聚合 AP另购置了一台 Wi-Fi 6 无线路由器作为 AP,支持 2x2 MU-MIMO,160 MHz 频宽,理论带宽可达 2402 Mbps。 然而,路由器上只有四个千兆口,连接软路由后跑不到这么高。 不过,这款路由器支持两个端口链路聚合,故尝试配置一下。 首先在路由器上设置两个端口为聚合口,提示: 端口聚合使用IEEE 802.3ad动态聚合模式,请确保对端设备支持并配置为动态聚合模式。 然后在 OpenWrt 上安装需要的软件包:opkg install kmod-bonding proto-bonding luci-proto-bonding 然后将以下内容添加到 /etc/rc.local 的 exit 0 前: 12345678910ip link add bond-lan type bond mode 802.3ad # 添加 bond 类型的虚拟接口 名称为 bond-lanip link set eth3 downip link set eth4 downip link set eth3 type bond_slave # 配置网卡模式ip link set eth4 type bond_slaveip link set eth3 master bond-lan # 加入名称为 bond-lan 的 bond 类型网卡ip link set eth4 master bond-lanip link set bond-lan up # 启动该网卡ip link set eth3 upip link set eth4 up 将 eth3 和 eth4 从原来的 br-lan 中移除,添加上 bond-lan 即可。 实测无线可以跑到 1.6 Gbps 左右。 配置防火墙官方原版 OpenWrt 默认有一套防火墙策略,简略微调即可。 配置端口转发两种方式,一种是基于 iptables 实现,另一种是使用 socat 来转发。 基于 iptables 实现OpenWrt 默认的端口转发基于 iptables / nftables 实现,然而,配置后发现,在内网无法使用外网地址访问对应端口,初步探索后推测是 NAT 环回时出现问题。 于是在 nftables 中进行调试。 先新建一个表为符合规则的包启用跟踪调试: 123nft add table inet trace_debugnft 'add chain inet trace_debug trace_pre { type filter hook prerouting priority -200000; }'nft insert rule inet trace_debug trace_pre ip saddr 192.168.22.118 ip daddr ??.??.??.?? limit rate 1/second meta nftrace set 1 然后 nft monitor trace 就可以跟踪了。 跟踪检查后发现,包在 prerouting policy accept 后消失了。 一番摸索后发现,当对应网卡(br-lan)开启混杂模式后,就能正常工作了。 怀疑是 prerouting 后发现目标地址为本地链路地址,于是就修改了目的 mac 地址,导致非混杂模式的网卡将其丢弃。不过简单搜索后也没找到相关的资料。 使用 socatUpdated 2023.06.29: 使用 socat 遇到了一些问题,故弃用: 会修改源地址,丢失地址数据 UDP 的转发使用 fork 参数存在线程泄漏问题,似乎每个 UDP 包都会 fork 出一个进程且不释放,导致产生大量进程占满内存 安装: 12opkg updateopkg install socat 然后配置端口转发。 例如,配置名为 mc-tcp 的策略,开启,监听本机所有地址的 25565 端口并转发到 192.168.22.3:25565 的配置如下(fork 允许多个连接,reuseaddr 允许 socket 的快速重用,TCP6-LISTEN 也同时监听 IPv4): 1234uci set socat.mc-tcp=socatuci set socat.mc-tcp.enable=1uci set socat.mc-tcp.SocatOptions='TCP6-LISTEN:25565,fork,reuseaddr TCP:192.168.22.3:25565'uci commit UDP 也类似: 1234uci set socat.mc-udp=socatuci set socat.mc-udp.enable=1uci set socat.mc-udp.SocatOptions='UDP6-LISTEN:25565,fork,reuseaddr UDP:192.168.22.3:25565'uci commit 然后重启 socat 服务即可生效:/etc/init.d/socat restart 对外网开放还需在防火墙中允许对应端口的输入。 配置 DDNS我的 DNS 解析提供商为 CloudFlare,故安装 ddns-scripts-cloudflare。 1opkg install ddns-scripts-cloudflare luci-i18n-ddns-zh-cn 安装完成后在 LuCI 中配置即可,没太大难度。IPv4 和 IPv6 地址需要分别配置。 配置 AdGuard Home安装 AdGuard Home: 12opkg updateopkg install adguardhome 在 DHCP/DNS 的高级设置中,将 DNS 服务器端口改为 53 以外的端口,如 5353。 然后登入 http://ip:3000 配置 AdGuard Home,将上游 DNS 服务器设为 OpenClash 设置的 DNS 服务地址,并停用 OpenClash 的 DNS 劫持。 然后应该就可以开始运作了,再添加屏蔽列表即可。 如果需要在 OpenClash 没有正常启动成功的情况下仍可以进行 DNS 服务,则需要设置 fallback DNS 服务器地址。然而目前 AdGuard Home 中并没有这个功能,相关功能 https://github.com/AdguardTeam/AdGuardHome/issues/3701 被设为了 v0.108.0 的目标,希望有生之年能等到 v0.108.0 出来获得这一功能。 (也是因为这个原因,校园网的认证脚本需要配置为 OpenClash 启动完成后再进行认证,感觉怪怪的,所以也暂时放弃了 AdGuard Home) 配置 WireGuard安装 WireGuard: 12opkg updateopkg install luci-i18n-wireguard-zh-cn 重启后,在添加接口中就可以找到 WireGuard VPN 了,我添加了一个名为 wg0 的接口。 作为公网 IP 下供其它端来主动连接的一端,我特殊指定了这个接口的监听端口,并在防火墙中运行了该端口的 UDP 访问。 该接口的 IP 地址需要配置为单独的子网,用于各端 VPN 接口间的互相连接。我为其配置了 192.168.23.1/24 和 fd23:41b7:e060::1/64 地址,与 22 网段区别开。 为了方便配置,我没有将这个接口划入单独的区域,而是划入了 lan 区域,共享 lan 区域的防火墙配置。 然后就可以添加对端了。注意 允许的 IP 的这一项中填写 “对端的隧道 IP 地址和对端经由隧道的网络”,对于对端为非路由设备的情况,这一项只填隧道 IP 地址就行,比如 192.168.23.102/32(/32 可省略),但不能填写 VPN 接口间的网段,即不能填写 192.168.23.102/24。 各项设置可能需要重启后生效。 之后的计划 配置内网 IP 的域名 配置 MosDNS 优化 DNS 解析(参考:https://rushb.pro/article/router-dns.html) 配置 Grafana 可视化路由运行状态、MosDNS 运行数据等 配置 UDP 转发以及游戏优化 基于 LXC 的其它功能服务器其它杂七杂八的服务以及 Docker 就另外开在一个虚拟机上吧。 选用 Debian 12 系统,可以直接从 CT 模板中下载。 参考 https://pve.proxmox.com/wiki/Unprivileged_LXC_containers#Using_local_directory_bind_mount_points,挂载宿主机的共享目录:pct set 100 -mp0 /host/dir,mp=/container/mount/point 似乎直接挂载宿主机中的 /mnt 的话,即使配置完 UID / GID 映射,LXC 容器也并不能正常访问其中宿主机挂载的子目录,可能需要在宿主机 umount 再 mount。所以需要将 mp 指定的目录细化到类似 /mnt/hdd1 这一层。 添加一个虚拟网卡 eth0 桥接到 vmbr0 上,IPv4 选择 DHCP 接收 OpenWrt 的地址分发;而如果 IPv6 选择 DHCP 的话,DHCPv6 是不会通告默认路由的,所以建议选择 SLAAC。 初始配置换源,参考:https://mirrors.tuna.tsinghua.edu.cn/help/debian/ 添加 sudo,先 apt install sudo,再 echo "username ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/username 默认下终端可能会有乱码,需要配置 UTF-8 语言,sudo dpkg-reconfigure locales 然后选中 en_US.UTF-8 即可。 配置 UID / GID 映射如果直接挂载目录共享的话,容器内外会视为不同的用户,导致共享文件时有着麻烦的权限问题。不过我们可以通过 lxc.idmap 来将某一容器中的某些用户映射到 Host 中的某些用户。 参考: https://kcore.org/2022/02/05/lxc-subuid-subgid/ https://pve.proxmox.com/wiki/Unprivileged_LXC_containers https://itsembedded.com/sysadmin/proxmox_bind_unprivileged_lxc/ 以下以映射 102 容器中的 1000 用户为 Host 中的 1000 用户为例: 先在 /etc/subuid 和 /etc/subgid 中都添加上 root:1000:1,来允许 root 创建到 1000 用户的映射。 然后在 /etc/pve/lxc/102.conf 的配置文件中,添加如下内容: /etc/pve/lxc/102.conf123456lxc.idmap: u 0 100000 1000lxc.idmap: g 0 100000 1000lxc.idmap: u 1000 1000 1lxc.idmap: g 1000 1000 1lxc.idmap: u 1001 101000 64535lxc.idmap: g 1001 101000 64535 建议将原来容器内 1000 映射到的 101000 用户还包含在映射范围内,这样容器内的 root 才能够将文件的所有权从原先的转到现在的。 安装 Docker由于并不想在 PVE 中直接装 Docker,故在 Debian 虚拟机中安装 Docker。 参考: https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script https://yeasy.gitbook.io/docker_practice/install/debian 安装: 12curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh 加入 Docker 用户组,在无 root 权限下使用 Docker:sudo usermod -aG docker $USER 验证安装正确性:docker run --rm hello-world 如没有方便的网络接入,配置镜像参考:https://yeasy.gitbook.io/docker_practice/install/mirror 在 LXC 容器启动后,Docker 会过一两分钟才会启动,暂时不知道原因为何。 Docker 启用 IPv6 支持由于挂的 PT 需要有 IPv6 接入,故需要给 Docker 开启 IPv6。 参考:https://docs.docker.com/config/daemon/ipv6/ 编辑配置文件: /etc/docker/daemon.json1234{ "experimental": true, "ip6tables": true} 然后重启 Docker:sudo systemctl restart docker 启动容器时,需要额外的配置。如果使用 Docker Compose,则添加如下内容,并在对应 service 配置中添加 networks 即可: 1234networks: ip6net: enable_ipv6: true subnet: 2001:0DB8::/112 netstat -tunlp 可以查看监听端口,若对应的端口只有 tcp6 在监听也不用慌张,若 cat /proc/sys/net/ipv6/bindv6only 为 0 则表明已在双栈上监听,参考(https://unix.stackexchange.com/questions/496137/does-80-in-netstat-output-means-only-ipv6-or-ipv6ipv4) 配置 PT 客户端使用 linuxserver/transmission Docker 镜像。 使用 Docker Compose 来配置容器,按说明编写配置文件: docker-compose.yml12345678910111213141516171819202122232425262728293031323334---version: "2.1"services: transmission: image: lscr.io/linuxserver/transmission:latest container_name: transmission environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai - TRANSMISSION_WEB_HOME=/config/transmission-web-control/src #optional - USER=thx #optional - FILE__PASS=/config/password #optional - WHITELIST= #optional - PEERPORT= #optional - HOST_WHITELIST= #optional volumes: - /home/thx/Service/transmission/config:/config - /data/PT:/downloads - /data/PT/torrentwatch:/watch - /mnt:/mnt ports: - 9091:9091 - 51413:51413 - 51413:51413/udp restart: unless-stopped networks: - ip6netnetworks: ip6net: enable_ipv6: true ipam: config: - subnet: 2001:0DB8:1::/112 其中 UID / GID 可以参考 id $user 的结果设置。 生成密钥文件时不能有行末符,可以这样生成:echo -n password_in_clear_text > password Web UI 使用 transmission-web-control,在 /config 对应的目录下 git clone 即可。 迁移之前的种子和配置只需要将之前的 config 目录移过来即可,如果之前是裸机安装,目录可能在 /var/lib/transmission-daemon/info 还要记得在路由器上配置 51413 端口的 TCP & UDP 转发。 配完端口转发,查看防火墙规则链可知,无需再在通信规则中开放端口。 运行方法创建 container 并启动后台运行:docker compose up -d 停止并删除 container 和对应的网络:docker compose down 启动 / 停止 对应的 container:docker compose start / docker compose stop 更新:先 docker-compose pull,然后 docker compose down 和 docker compose up -d 清理无用镜像:docker image prune 配置 Syncthing 同步服务使用 linuxserver/syncthing Docker 镜像。 使用 Docker Compose 来配置容器,按说明编写配置文件。 由于 Syncthing 需要发送本地组播包来进行本地链路上的节点发现,故这里将网络模式修改为 host 模式,参考:https://github.com/syncthing/syncthing/blob/main/README-Docker.md#discovery。 docker-compose.yml1234567891011121314151617---version: "2.1"services: syncthing: image: lscr.io/linuxserver/syncthing:latest container_name: syncthing hostname: RaspCloud #optional environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /home/thx/Service/syncthing/config:/config - /mnt:/mnt - /data:/data network_mode: host restart: unless-stopped 还要记得在路由器上配置 22000 端口的 TCP & UDP 转发。 运行方法同上。 配置蓝牙监听服务之前 使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化 中配置了蓝牙接收温湿度计数据,也把这个服务迁移过来。 花费十元购入了 BR8651 芯片的 USB 蓝牙 5.1 适配器,据说该芯片在 Linux 下有驱动。 可能是因为芯片较新的原因,各方面的支持似乎都还不太好,尝试了几个方法都没能正常地使用脚本获取 BLE Advertising,这里记录了几次失败的过程。 配置 LXC 的 USB 直通本来想在 LXC 容器中配置蓝牙服务,但是 hciconfig 会报错 Can't open HCI socket.: Address family not supported by protocol,查阅资料后发现,由于蓝牙将自身注册为网络接口,所以并不能像使用 USB 那样将蓝牙设备传给 LXC 容器,参考:https://forum.proxmox.com/threads/assign-a-bluetooth-dongle-to-a-ct.67577/。 所以以下部分只是记录如何直通 USB 设备。 参考:https://medium.com/@konpat/usb-passthrough-to-an-lxc-proxmox-15482674f11d 直接在 LXC 中 lsusb 是可以看到各个 USB 设备的,但是无法使用。 12345678Bus 004 Device 002: ID 174c:3074 ASMedia Technology Inc. ASM1074 SuperSpeed hubBus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 003 Device 003: ID 05e3:0751 Genesys Logic, Inc. microSD Card ReaderBus 003 Device 004: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)Bus 003 Device 002: ID 174c:2074 ASMedia Technology Inc. ASM1074 High-Speed hubBus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 关注其中的 Bluetooth 设备,位于 Bus 003 Device 004。 查看其主次设备号: 12root@pve:/etc/pve/lxc# ls -al /dev/bus/usb/003/004crw-rw-r-- 1 root root 189, 259 Jul 1 00:28 /dev/bus/usb/003/004 主设备号为 189,向配置文件中添加以下内容,将设备映射到容器内: /etc/pve/lxc/102.conf12lxc.cgroup.devices.allow: c 189:* rwmlxc.mount.entry: /dev/bus/usb/003/004 dev/bus/usb/003/004 none bind,optional,create=file 或者直接将目录映射过去也行,防止设备名发生变化: /etc/pve/lxc/102.conf1lxc.mount.entry: /dev/bus/usb/003 dev/bus/usb/003 none bind,optional,create=dir 如果容器中 ls -al /dev/bus/usb/003/004 权限不对(nobody / nogroup),可以在 PVE 中 chown 100000:100000 /dev/bus/usb/003/004,这样容器中就为 root 权限了。 在宿主机中直接配置蓝牙由于不想再单独开一台虚拟机,故打算在宿主机中直接运行蓝牙监听服务。 正好宿主机中也有一个非 root 用户,使用这个用户来运行服务,尽量减小对系统的影响。 先验证蓝牙功能是否正常,在 bluetoothctl 中运行 1234menu scantransport lebackscan on 应该能够看到一些广播和数据。 (我这儿 hcitool lescan 会报错 Set scan parameters failed: Input/output error,参考 https://stackoverflow.com/questions/70777475/hcitool-lescan-returns-an-i-o-error-on-manjaro 发现如上使用 bluetoothctl 就能正常工作) 非特权安装 pip312wget https://bootstrap.pypa.io/get-pip.pypython3 get-pip.py --user 如果报错 ModuleNotFoundError: No module named 'distutils.cmd',则需要安装 python3-distutils 安装运行 MiTemperature2按照 MiTemperature2 文档进行安装。 安装 bluepy 前需要先安装 libglib2.0-dev 安装 pybluez 时可能遇到 error in PyBluez setup command: use_2to3 is invalid. 的问题,参考 https://github.com/pybluez/pybluez/issues/467,先 pip3 install setuptools==58 再安装即可。 之后遇到类似 https://github.com/JsBergbau/MiTemperature2/issues/106 的问题,以及类似 https://stackoverflow.com/questions/75175755/not-seeing-ble-device-advertising-unless-set-bluetoothctl-transport-le 的问题,都暂时没有被解决。 于是也放弃了。 配置 MC 服务器安装 Java 8由于该整合包版本需要 Java 8,而 Debian 官方源中没有,故使用第三方源安装。 准备工作:sudo apt install apt-transport-https ca-certificates wget dirmngr gnupg software-properties-common 添加第三方源: 12wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo tee /etc/apt/trusted.gpg.d/adoptopenjdk.ascsudo add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ 由于 adoptopenjdk 可能还没加上 bookworm 源,可能需要手动将源中的 bookworm 改为 bullseye。 安装 Java 8 JRE: 12sudo apt updatesudo apt install adoptopenjdk-8-hotspot-jre 添加为服务添加为 systemd 服务,参考 https://gist.github.com/winny-/bb17853ffc76fbb9b039 进行修改。 /etc/systemd/system/minecraft.service1234567891011121314[Unit]Description=Minecraft Server[Service]WorkingDirectory=/data/MC/RAD2-1.3/RAD2-Serverpack-1.3User=thxType=forkingExitType=cgroupExecStart=/usr/bin/tmux new-session -s mc -d './LaunchServer.sh'ExecStop=/usr/bin/tmux send-keys -t mc:0.0 'say SERVER SHUTTING DOWN. Saving map...' C-m 'save-all' C-m 'stop' C-mExecStop=/bin/sleep 2[Install]WantedBy=multi-user.target 使用 Type=forking 来管理 tmux new-session fork 出的进程。 使用 ExitType=cgroup 等待所有程序退出。","link":"/2023/06/17/%E5%9F%BA%E4%BA%8E-Proxmox-VE-%E7%9A%84-All-in-One-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA/"}],"tags":[{"name":"Hexo","slug":"Hexo","link":"/tags/Hexo/"},{"name":"树莓派","slug":"树莓派","link":"/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"},{"name":"ACME","slug":"ACME","link":"/tags/ACME/"},{"name":"Icarus","slug":"Icarus","link":"/tags/Icarus/"},{"name":"软路由","slug":"软路由","link":"/tags/%E8%BD%AF%E8%B7%AF%E7%94%B1/"},{"name":"Clash","slug":"Clash","link":"/tags/Clash/"},{"name":"AdGuard Home","slug":"AdGuard-Home","link":"/tags/AdGuard-Home/"},{"name":"IoT","slug":"IoT","link":"/tags/IoT/"},{"name":"Grafana","slug":"Grafana","link":"/tags/Grafana/"},{"name":"PVE","slug":"PVE","link":"/tags/PVE/"}],"categories":[{"name":"折腾","slug":"折腾","link":"/categories/%E6%8A%98%E8%85%BE/"},{"name":"博客","slug":"折腾/博客","link":"/categories/%E6%8A%98%E8%85%BE/%E5%8D%9A%E5%AE%A2/"},{"name":"树莓派","slug":"折腾/树莓派","link":"/categories/%E6%8A%98%E8%85%BE/%E6%A0%91%E8%8E%93%E6%B4%BE/"}],"pages":[{"title":"关于","text":"曾经是 OIer,现在研一了,是菜狗QAQ","link":"/about/index.html"}]} \ No newline at end of file diff --git a/css/custom.css b/css/custom.css new file mode 100644 index 0000000..6bd2805 --- /dev/null +++ b/css/custom.css @@ -0,0 +1,373 @@ +.heimu { + color: #7a7a7a; + background-color: #7a7a7a; +} +.heimu:hover { + color: #fff; +} +.navbar-main, +.card { + transition: background-color 0.2s ease-out !important; +} +body, +hr, +.button, +.tag, +.level, +.box, +.wl-panel, +.wl-meta span, +[data-waline] pre { + transition: background-color 0.2s ease-out; +} +img, +ul, +.highlight, +code, +p, +i { + transition: 0.2s ease-out; +} +.navbar-main .navbar-menu { + background-color: transparent; +} +.navbar-main .navbar-menu .navbar-item.is-active { + color: inherit; + font-weight: bold; +} +.card { + overflow: visible; + background-color: rgba(255,255,255,0.95); +} +.card:hover { + background-color: #fff; +} +.card.card-transparent { + background-color: transparent !important; +} +.card.card-transparent .level-start, +.card.card-transparent .level-end { + overflow: hidden; +} +.footer a:not(.button) { + color: inherit; +} +.footer a:not(.button):hover { + text-decoration: underline; +} +article .title a { + background-image: linear-gradient(transparent calc(100% - 1px), $primary 1px); + background-repeat: no-repeat; + background-size: 0 100%; + transition: 0.2s ease-in-out !important; +} +article .title:hover a { + color: $primary; + background-size: 100% 100%; +} +pre, +code { + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +article.article .content pre, +article.article .content code { + font-size: 0.96em; +} +:root { + --waline-theme-color: $primary !important; + --waline-active-color: #276bda !important; + --waline-code-bgcolor: #f8f8f8 !important; + --waline-badge-color: #27ae60 !important; +} +body.night { + --waline-white: dark-font-color !important; + --waline-theme-color: dark-primary-color !important; + --waline-active-color: dark-primary-color-hover !important; + --waline-bgcolor: rgba(40,44,52,0.5) !important; + --waline-bgcolor-light: rgba(40,44,52,0.8) !important; + --waline-code-bgcolor: #282c34 !important; + --waline-border-color: dark-primary-color-hover !important; + --waline-badge-color: dark-primary-color !important; + --waline-border: 1px solid var(--waline-border-color) !important; +} +[data-waline] pre::-webkit-scrollbar-track { + background: rgba(0,0,0,0.06) !important; + box-shadow: inset 0 0 5px rgba(0,0,0,0.1) !important; +} +[data-waline] pre::-webkit-scrollbar-thumb { + background: rgba(0,0,0,0.12) !important; + box-shadow: inset 0 0 10px rgba(0,0,0,0.2) !important; +} +[data-waline] pre::-webkit-scrollbar-thumb:hover { + background: rgba(0,0,0,0.24) !important; +} +body:not(.night) [data-waline] .token { + all: unset; +} +body:not(.night) [data-waline] pre code { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body:not(.night) [data-waline] pre[class*=language-] { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body:not(.night) [data-waline] .token.comment, +body:not(.night) [data-waline] .token.prolog, +body:not(.night) [data-waline] .token.cdata { + color: #a0a1a7; +} +body:not(.night) [data-waline] .token.doctype, +body:not(.night) [data-waline] .token.punctuation, +body:not(.night) [data-waline] .token.entity { + color: #383a42; +} +body:not(.night) [data-waline] .token.attr-name, +body:not(.night) [data-waline] .token.class-name, +body:not(.night) [data-waline] .token.boolean, +body:not(.night) [data-waline] .token.constant, +body:not(.night) [data-waline] .token.number, +body:not(.night) [data-waline] .token.atrule { + color: #b76b01; +} +body:not(.night) [data-waline] .token.keyword { + color: #a626a4; +} +body:not(.night) [data-waline] .token.property, +body:not(.night) [data-waline] .token.tag, +body:not(.night) [data-waline] .token.symbol, +body:not(.night) [data-waline] .token.deleted, +body:not(.night) [data-waline] .token.important { + color: #e45649; +} +body:not(.night) [data-waline] .token.selector, +body:not(.night) [data-waline] .token.string, +body:not(.night) [data-waline] .token.char, +body:not(.night) [data-waline] .token.builtin, +body:not(.night) [data-waline] .token.inserted, +body:not(.night) [data-waline] .token.regex, +body:not(.night) [data-waline] .token.attr-value, +body:not(.night) [data-waline] .token.attr-value > .token.punctuation { + color: #50a14f; +} +body:not(.night) [data-waline] .token.variable, +body:not(.night) [data-waline] .token.operator, +body:not(.night) [data-waline] .token.function { + color: #4078f2; +} +body:not(.night) [data-waline] .token.url { + color: #0184bc; +} +body:not(.night) [data-waline] .token.attr-value > .token.punctuation.attr-equals, +body:not(.night) [data-waline] .token.special-attr > .token.attr-value > .token.value.css { + color: #383a42; +} +body:not(.night) [data-waline] .language-css .token.selector { + color: #e45649; +} +body:not(.night) [data-waline] .language-css .token.property { + color: #383a42; +} +body:not(.night) [data-waline] .language-css .token.function, +body:not(.night) [data-waline] .language-css .token.url > .token.function { + color: #0184bc; +} +body:not(.night) [data-waline] .language-css .token.url > .token.string.url { + color: #50a14f; +} +body:not(.night) [data-waline] .language-css .token.important, +body:not(.night) [data-waline] .language-css .token.atrule .token.rule { + color: #a626a4; +} +body:not(.night) [data-waline] .language-javascript .token.operator { + color: #a626a4; +} +body:not(.night) [data-waline] .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { + color: #ca1243; +} +body:not(.night) [data-waline] .language-json .token.operator { + color: #383a42; +} +body:not(.night) [data-waline] .language-json .token.null.keyword { + color: #b76b01; +} +body:not(.night) [data-waline] .language-markdown .token.url, +body:not(.night) [data-waline] .language-markdown .token.url > .token.operator, +body:not(.night) [data-waline] .language-markdown .token.url-reference.url > .token.string { + color: #383a42; +} +body:not(.night) [data-waline] .language-markdown .token.url > .token.content { + color: #4078f2; +} +body:not(.night) [data-waline] .language-markdown .token.url > .token.url, +body:not(.night) [data-waline] .language-markdown .token.url-reference.url { + color: #0184bc; +} +body:not(.night) [data-waline] .language-markdown .token.blockquote.punctuation, +body:not(.night) [data-waline] .language-markdown .token.hr.punctuation { + color: #a0a1a7; + font-style: italic; +} +body:not(.night) [data-waline] .language-markdown .token.code-snippet { + color: #50a14f; +} +body:not(.night) [data-waline] .language-markdown .token.bold .token.content { + color: #b76b01; +} +body:not(.night) [data-waline] .language-markdown .token.italic .token.content { + color: #a626a4; +} +body:not(.night) [data-waline] .language-markdown .token.strike .token.content, +body:not(.night) [data-waline] .language-markdown .token.strike .token.punctuation, +body:not(.night) [data-waline] .language-markdown .token.list.punctuation, +body:not(.night) [data-waline] .language-markdown .token.title.important > .token.punctuation { + color: #e45649; +} +body:not(.night) [data-waline] .token.bold { + font-weight: bold; +} +body:not(.night) [data-waline] .token.comment, +body:not(.night) [data-waline] .token.italic { + font-style: italic; +} +body:not(.night) [data-waline] .token.entity { + cursor: help; +} +body:not(.night) [data-waline] .token.namespace { + opacity: 0.8; +} +body.night [data-waline] .token { + all: unset; +} +body.night [data-waline] pre code { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body.night [data-waline] pre[class*=language-] { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body.night [data-waline] .token.comment, +body.night [data-waline] .token.prolog, +body.night [data-waline] .token.cdata { + color: #5c6370; +} +body.night [data-waline] .token.doctype, +body.night [data-waline] .token.punctuation, +body.night [data-waline] .token.entity { + color: #abb2bf; +} +body.night [data-waline] .token.attr-name, +body.night [data-waline] .token.class-name, +body.night [data-waline] .token.boolean, +body.night [data-waline] .token.constant, +body.night [data-waline] .token.number, +body.night [data-waline] .token.atrule { + color: #d19a66; +} +body.night [data-waline] .token.keyword { + color: #c678dd; +} +body.night [data-waline] .token.property, +body.night [data-waline] .token.tag, +body.night [data-waline] .token.symbol, +body.night [data-waline] .token.deleted, +body.night [data-waline] .token.important { + color: #e06c75; +} +body.night [data-waline] .token.selector, +body.night [data-waline] .token.string, +body.night [data-waline] .token.char, +body.night [data-waline] .token.builtin, +body.night [data-waline] .token.inserted, +body.night [data-waline] .token.regex, +body.night [data-waline] .token.attr-value, +body.night [data-waline] .token.attr-value > .token.punctuation { + color: #98c379; +} +body.night [data-waline] .token.variable, +body.night [data-waline] .token.operator, +body.night [data-waline] .token.function { + color: #61afef; +} +body.night [data-waline] .token.url { + color: #56b6c2; +} +body.night [data-waline] .token.attr-value > .token.punctuation.attr-equals, +body.night [data-waline] .token.special-attr > .token.attr-value > .token.value.css { + color: #abb2bf; +} +body.night [data-waline] .language-css .token.selector { + color: #e06c75; +} +body.night [data-waline] .language-css .token.property { + color: #abb2bf; +} +body.night [data-waline] .language-css .token.function, +body.night [data-waline] .language-css .token.url > .token.function { + color: #56b6c2; +} +body.night [data-waline] .language-css .token.url > .token.string.url { + color: #98c379; +} +body.night [data-waline] .language-css .token.important, +body.night [data-waline] .language-css .token.atrule .token.rule { + color: #c678dd; +} +body.night [data-waline] .language-javascript .token.operator { + color: #c678dd; +} +body.night [data-waline] .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { + color: #be5046; +} +body.night [data-waline] .language-json .token.operator { + color: #abb2bf; +} +body.night [data-waline] .language-json .token.null.keyword { + color: #d19a66; +} +body.night [data-waline] .language-markdown .token.url, +body.night [data-waline] .language-markdown .token.url > .token.operator, +body.night [data-waline] .language-markdown .token.url-reference.url > .token.string { + color: #abb2bf; +} +body.night [data-waline] .language-markdown .token.url > .token.content { + color: #61afef; +} +body.night [data-waline] .language-markdown .token.url > .token.url, +body.night [data-waline] .language-markdown .token.url-reference.url { + color: #56b6c2; +} +body.night [data-waline] .language-markdown .token.blockquote.punctuation, +body.night [data-waline] .language-markdown .token.hr.punctuation { + color: #5c6370; + font-style: italic; +} +body.night [data-waline] .language-markdown .token.code-snippet { + color: #98c379; +} +body.night [data-waline] .language-markdown .token.bold .token.content { + color: #d19a66; +} +body.night [data-waline] .language-markdown .token.italic .token.content { + color: #c678dd; +} +body.night [data-waline] .language-markdown .token.strike .token.content, +body.night [data-waline] .language-markdown .token.strike .token.punctuation, +body.night [data-waline] .language-markdown .token.list.punctuation, +body.night [data-waline] .language-markdown .token.title.important > .token.punctuation { + color: #e06c75; +} +body.night [data-waline] .token.bold { + font-weight: bold; +} +body.night [data-waline] .token.comment, +body.night [data-waline] .token.italic { + font-style: italic; +} +body.night [data-waline] .token.entity { + cursor: help; +} +body.night [data-waline] .token.namespace { + opacity: 0.8; +} diff --git a/css/cyberpunk.css b/css/cyberpunk.css new file mode 100644 index 0000000..4247cd1 --- /dev/null +++ b/css/cyberpunk.css @@ -0,0 +1,13445 @@ +@-moz-keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +@-webkit-keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +@-o-keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +@keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +.is-unselectable, +.breadcrumb, +.modal-close, +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, +.tabs, +.button, +.delete, +.file { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.navbar-link:not(.is-arrowless)::after, +.select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid transparent; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; +} +.breadcrumb:not(:last-child), +.level:not(:last-child), +.list:not(:last-child), +.message:not(:last-child), +.pagination:not(:last-child), +.tabs:not(:last-child), +.box:not(:last-child), +.content:not(:last-child), +.notification:not(:last-child), +.progress:not(:last-child), +.table:not(:last-child), +.table-container:not(:last-child), +.title:not(:last-child), +.subtitle:not(:last-child), +.block:not(:last-child), +.highlight:not(:last-child) { + margin-bottom: 1.5rem; +} +.modal-close, +.delete { + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(0,0,0,0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; +} +.modal-close::before, +.delete::before, +.modal-close::after, +.delete::after { + background-color: #000; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; +} +.modal-close::before, +.delete::before { + height: 2px; + width: 50%; +} +.modal-close::after, +.delete::after { + height: 50%; + width: 2px; +} +.modal-close:hover, +.delete:hover, +.modal-close:focus, +.delete:focus { + background-color: rgba(0,0,0,0.3); +} +.modal-close:active, +.delete:active { + background-color: rgba(0,0,0,0.4); +} +.modal-close.is-small, +.delete.is-small { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; +} +.modal-close.is-medium, +.delete.is-medium { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; +} +.modal-close.is-large, +.delete.is-large { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; +} +.button.is-loading::after, +.loader, +.select.is-loading::after, +.control.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; +} +.is-overlay, +.modal, +.modal-background, +.image.is-square img, +.image.is-1by1 img, +.image.is-5by4 img, +.image.is-4by3 img, +.image.is-3by2 img, +.image.is-5by3 img, +.image.is-16by9 img, +.image.is-2by1 img, +.image.is-3by1 img, +.image.is-4by5 img, +.image.is-3by4 img, +.image.is-2by3 img, +.image.is-3by5 img, +.image.is-9by16 img, +.image.is-1by2 img, +.image.is-1by3 img, +.image.is-square .has-ratio, +.image.is-1by1 .has-ratio, +.image.is-5by4 .has-ratio, +.image.is-4by3 .has-ratio, +.image.is-3by2 .has-ratio, +.image.is-5by3 .has-ratio, +.image.is-16by9 .has-ratio, +.image.is-2by1 .has-ratio, +.image.is-3by1 .has-ratio, +.image.is-4by5 .has-ratio, +.image.is-3by4 .has-ratio, +.image.is-2by3 .has-ratio, +.image.is-3by5 .has-ratio, +.image.is-9by16 .has-ratio, +.image.is-1by2 .has-ratio, +.image.is-1by3 .has-ratio, +.hero-video { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, +.button, +.input, +.textarea, +.select select, +.file-cta, +.file-name { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 0; + box-shadow: none; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.5em - 1px); + padding-left: calc(0.75em - 1px); + padding-right: calc(0.75em - 1px); + padding-top: calc(0.5em - 1px); + position: relative; + vertical-align: top; +} +.pagination-previous:focus, +.pagination-next:focus, +.pagination-link:focus, +.pagination-ellipsis:focus, +.button:focus, +.input:focus, +.textarea:focus, +.select select:focus, +.file-cta:focus, +.file-name:focus, +.pagination-previous.is-focused, +.pagination-next.is-focused, +.pagination-link.is-focused, +.pagination-ellipsis.is-focused, +.button.is-focused, +.input.is-focused, +.textarea.is-focused, +.select select.is-focused, +.file-cta.is-focused, +.file-name.is-focused, +.pagination-previous:active, +.pagination-next:active, +.pagination-link:active, +.pagination-ellipsis:active, +.button:active, +.input:active, +.textarea:active, +.select select:active, +.file-cta:active, +.file-name:active, +.pagination-previous.is-active, +.pagination-next.is-active, +.pagination-link.is-active, +.pagination-ellipsis.is-active, +.button.is-active, +.input.is-active, +.textarea.is-active, +.select select.is-active, +.file-cta.is-active, +.file-name.is-active { + outline: none; +} +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled], +.pagination-ellipsis[disabled], +.button[disabled], +.input[disabled], +.textarea[disabled], +.select select[disabled], +.file-cta[disabled], +.file-name[disabled], +fieldset[disabled] .pagination-previous, +fieldset[disabled] .pagination-next, +fieldset[disabled] .pagination-link, +fieldset[disabled] .pagination-ellipsis, +fieldset[disabled] .button, +fieldset[disabled] .input, +fieldset[disabled] .textarea, +fieldset[disabled] .select select, +fieldset[disabled] .file-cta, +fieldset[disabled] .file-name { + cursor: not-allowed; +} +/* minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; +} +ul { + list-style: none; +} +button, +input, +select, +textarea { + margin: 0; +} +html { + box-sizing: border-box; +} +*, +*::before, +*::after { + box-sizing: inherit; +} +img, +video { + height: auto; + max-width: 100%; +} +iframe { + border: 0; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +td:not([align]), +th:not([align]) { + text-align: left; +} +html { + background-color: #000; + font-size: 14px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: hidden; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; +} +article, +aside, +figure, +footer, +header, +hgroup, +section { + display: block; +} +body, +button, +input, +select, +textarea { + font-family: 'Oxanium', Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif; +} +code, +pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: 'Roboto Mono', monospace, 'Microsoft YaHei'; +} +body { + color: #cdcdcd; + font-size: 1em; + font-weight: 400; + line-height: 1.5; +} +a { + color: #02d7f2; + cursor: pointer; + text-decoration: none; +} +a strong { + color: currentColor; +} +a:hover { + color: #fcee09; +} +code { + background-color: #f5f5f5; + color: #ff003c; + font-size: 0.875em; + font-weight: normal; + padding: 0.25em 0.5em 0.25em; +} +hr { + background-color: #f5f5f5; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; +} +img { + height: auto; + max-width: 100%; +} +input[type="checkbox"], +input[type="radio"] { + vertical-align: baseline; +} +small { + font-size: 0.875em; +} +span { + font-style: inherit; + font-weight: inherit; +} +strong { + color: #fcee09; + font-weight: 700; +} +fieldset { + border: none; +} +pre { + -webkit-overflow-scrolling: touch; + background-color: #f5f5f5; + color: #cdcdcd; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; +} +pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; +} +table td, +table th { + vertical-align: top; +} +table td:not([align]), +table th:not([align]) { + text-align: left; +} +table th { + color: #fcee09; +} +.is-clearfix::after { + clear: both; + content: " "; + display: table; +} +.is-pulled-left { + float: left !important; +} +.is-pulled-right { + float: right !important; +} +.is-clipped { + overflow: hidden !important; +} +.is-size-1 { + font-size: 3rem !important; +} +.is-size-2 { + font-size: 2.5rem !important; +} +.is-size-3 { + font-size: 2rem !important; +} +.is-size-4 { + font-size: 1.5rem !important; +} +.is-size-5 { + font-size: 1.25rem !important; +} +.is-size-6, +article.media .title { + font-size: 1rem !important; +} +.is-size-7, +article.media .date, +article.media .categories, +.article-licensing .licensing-title a, +.article-licensing .licensing-meta h6 { + font-size: 0.85rem !important; +} +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; + } + .is-size-2-mobile { + font-size: 2.5rem !important; + } + .is-size-3-mobile { + font-size: 2rem !important; + } + .is-size-4-mobile { + font-size: 1.5rem !important; + } + .is-size-5-mobile { + font-size: 1.25rem !important; + } + .is-size-6-mobile { + font-size: 1rem !important; + } + .is-size-7-mobile { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; + } + .is-size-2-tablet { + font-size: 2.5rem !important; + } + .is-size-3-tablet { + font-size: 2rem !important; + } + .is-size-4-tablet { + font-size: 1.5rem !important; + } + .is-size-5-tablet { + font-size: 1.25rem !important; + } + .is-size-6-tablet { + font-size: 1rem !important; + } + .is-size-7-tablet { + font-size: 0.85rem !important; + } +} +@media screen and (max-width: 1087px) { + .is-size-1-touch { + font-size: 3rem !important; + } + .is-size-2-touch { + font-size: 2.5rem !important; + } + .is-size-3-touch { + font-size: 2rem !important; + } + .is-size-4-touch { + font-size: 1.5rem !important; + } + .is-size-5-touch { + font-size: 1.25rem !important; + } + .is-size-6-touch { + font-size: 1rem !important; + } + .is-size-7-touch { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 1088px) { + .is-size-1-desktop { + font-size: 3rem !important; + } + .is-size-2-desktop { + font-size: 2.5rem !important; + } + .is-size-3-desktop { + font-size: 2rem !important; + } + .is-size-4-desktop { + font-size: 1.5rem !important; + } + .is-size-5-desktop { + font-size: 1.25rem !important; + } + .is-size-6-desktop { + font-size: 1rem !important; + } + .is-size-7-desktop { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 1280px) { + .is-size-1-widescreen { + font-size: 3rem !important; + } + .is-size-2-widescreen { + font-size: 2.5rem !important; + } + .is-size-3-widescreen { + font-size: 2rem !important; + } + .is-size-4-widescreen { + font-size: 1.5rem !important; + } + .is-size-5-widescreen { + font-size: 1.25rem !important; + } + .is-size-6-widescreen { + font-size: 1rem !important; + } + .is-size-7-widescreen { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 1472px) { + .is-size-1-fullhd { + font-size: 3rem !important; + } + .is-size-2-fullhd { + font-size: 2.5rem !important; + } + .is-size-3-fullhd { + font-size: 2rem !important; + } + .is-size-4-fullhd { + font-size: 1.5rem !important; + } + .is-size-5-fullhd { + font-size: 1.25rem !important; + } + .is-size-6-fullhd { + font-size: 1rem !important; + } + .is-size-7-fullhd { + font-size: 0.85rem !important; + } +} +.has-text-centered { + text-align: center !important; +} +.has-text-justified { + text-align: justify !important; +} +.has-text-left { + text-align: left !important; +} +.has-text-right { + text-align: right !important; +} +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-centered-tablet-only { + text-align: center !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-centered-touch { + text-align: center !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-centered-desktop { + text-align: center !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-centered-desktop-only { + text-align: center !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-centered-widescreen { + text-align: center !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-centered-widescreen-only { + text-align: center !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-centered-fullhd { + text-align: center !important; + } +} +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-justified-tablet-only { + text-align: justify !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-justified-touch { + text-align: justify !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-justified-desktop { + text-align: justify !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-justified-desktop-only { + text-align: justify !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-justified-widescreen { + text-align: justify !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-justified-widescreen-only { + text-align: justify !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-justified-fullhd { + text-align: justify !important; + } +} +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-left-tablet-only { + text-align: left !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-left-touch { + text-align: left !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-left-desktop { + text-align: left !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-left-desktop-only { + text-align: left !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-left-widescreen { + text-align: left !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-left-widescreen-only { + text-align: left !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-left-fullhd { + text-align: left !important; + } +} +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-right-tablet-only { + text-align: right !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-right-touch { + text-align: right !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-right-desktop { + text-align: right !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-right-desktop-only { + text-align: right !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-right-widescreen { + text-align: right !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-right-widescreen-only { + text-align: right !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-right-fullhd { + text-align: right !important; + } +} +.is-capitalized { + text-transform: capitalize !important; +} +.is-lowercase { + text-transform: lowercase !important; +} +.is-uppercase, +article.media .categories { + text-transform: uppercase !important; +} +.is-italic { + font-style: italic !important; +} +.has-text-white { + color: #fff !important; +} +a.has-text-white:hover, +a.has-text-white:focus { + color: #e6e6e6 !important; +} +.has-background-white { + background-color: #fff !important; +} +.has-text-black { + color: #000 !important; +} +a.has-text-black:hover, +a.has-text-black:focus { + color: #000 !important; +} +.has-background-black { + background-color: #000 !important; +} +.has-text-light { + color: #f5f5f5 !important; +} +a.has-text-light:hover, +a.has-text-light:focus { + color: #dbdbdb !important; +} +.has-background-light { + background-color: #f5f5f5 !important; +} +.has-text-dark { + color: #363636 !important; +} +a.has-text-dark:hover, +a.has-text-dark:focus { + color: #1c1c1c !important; +} +.has-background-dark { + background-color: #363636 !important; +} +.has-text-primary { + color: #fcee09 !important; +} +a.has-text-primary:hover, +a.has-text-primary:focus { + color: #cfc403 !important; +} +.has-background-primary { + background-color: #fcee09 !important; +} +.has-text-link { + color: #02d7f2 !important; +} +a.has-text-link:hover, +a.has-text-link:focus { + color: #02aabf !important; +} +.has-background-link { + background-color: #02d7f2 !important; +} +.has-text-info { + color: #02d7f2 !important; +} +a.has-text-info:hover, +a.has-text-info:focus { + color: #02aabf !important; +} +.has-background-info { + background-color: #02d7f2 !important; +} +.has-text-success { + color: #00ff41 !important; +} +a.has-text-success:hover, +a.has-text-success:focus { + color: #00cc34 !important; +} +.has-background-success { + background-color: #00ff41 !important; +} +.has-text-warning { + color: #ff8e3c !important; +} +a.has-text-warning:hover, +a.has-text-warning:focus { + color: #ff7009 !important; +} +.has-background-warning { + background-color: #ff8e3c !important; +} +.has-text-danger { + color: #ff003c !important; +} +a.has-text-danger:hover, +a.has-text-danger:focus { + color: #cc0030 !important; +} +.has-background-danger { + background-color: #ff003c !important; +} +.has-text-grey-lightest { + color: #ededed !important; +} +a.has-text-grey-lightest:hover, +a.has-text-grey-lightest:focus { + color: #d4d4d4 !important; +} +.has-background-grey-lightest { + background-color: #ededed !important; +} +.has-text-black-bis { + color: #050a0e !important; +} +.has-background-black-bis { + background-color: #050a0e !important; +} +.has-text-black-ter { + color: #242424 !important; +} +.has-background-black-ter { + background-color: #242424 !important; +} +.has-text-grey-darker { + color: #363636 !important; +} +.has-background-grey-darker { + background-color: #363636 !important; +} +.has-text-grey-dark { + color: #4a4a4a !important; +} +.has-background-grey-dark { + background-color: #4a4a4a !important; +} +.has-text-grey, +.article-licensing .licensing-title a { + color: #848484 !important; +} +.has-background-grey { + background-color: #848484 !important; +} +.has-text-grey-light { + color: #b5b5b5 !important; +} +.has-background-grey-light { + background-color: #b5b5b5 !important; +} +.has-text-grey-lighter { + color: #dbdbdb !important; +} +.has-background-grey-lighter { + background-color: #dbdbdb !important; +} +.has-text-white-ter { + color: #f5f5f5 !important; +} +.has-background-white-ter { + background-color: #f5f5f5 !important; +} +.has-text-white-bis { + color: #cdcdcd !important; +} +.has-background-white-bis { + background-color: #cdcdcd !important; +} +.has-text-weight-light { + font-weight: 300 !important; +} +.has-text-weight-normal { + font-weight: 400 !important; +} +.has-text-weight-medium { + font-weight: 500 !important; +} +.has-text-weight-semibold { + font-weight: 600 !important; +} +.has-text-weight-bold { + font-weight: 700 !important; +} +.is-family-primary { + font-family: 'Oxanium', Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.is-family-secondary { + font-family: 'Oxanium', Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.is-family-sans-serif { + font-family: 'Oxanium', Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.is-family-monospace { + font-family: monospace !important; +} +.is-family-code { + font-family: 'Roboto Mono', monospace, 'Microsoft YaHei' !important; +} +.is-block { + display: block !important; +} +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; + } +} +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-block-tablet-only { + display: block !important; + } +} +@media screen and (max-width: 1087px) { + .is-block-touch { + display: block !important; + } +} +@media screen and (min-width: 1088px) { + .is-block-desktop { + display: block !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-block-desktop-only { + display: block !important; + } +} +@media screen and (min-width: 1280px) { + .is-block-widescreen { + display: block !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-block-widescreen-only { + display: block !important; + } +} +@media screen and (min-width: 1472px) { + .is-block-fullhd { + display: block !important; + } +} +.is-flex { + display: flex !important; +} +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; + } +} +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: flex !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-flex-tablet-only { + display: flex !important; + } +} +@media screen and (max-width: 1087px) { + .is-flex-touch { + display: flex !important; + } +} +@media screen and (min-width: 1088px) { + .is-flex-desktop { + display: flex !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-flex-desktop-only { + display: flex !important; + } +} +@media screen and (min-width: 1280px) { + .is-flex-widescreen { + display: flex !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-flex-widescreen-only { + display: flex !important; + } +} +@media screen and (min-width: 1472px) { + .is-flex-fullhd { + display: flex !important; + } +} +.is-inline { + display: inline !important; +} +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; + } +} +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-inline-tablet-only { + display: inline !important; + } +} +@media screen and (max-width: 1087px) { + .is-inline-touch { + display: inline !important; + } +} +@media screen and (min-width: 1088px) { + .is-inline-desktop { + display: inline !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-inline-desktop-only { + display: inline !important; + } +} +@media screen and (min-width: 1280px) { + .is-inline-widescreen { + display: inline !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-inline-widescreen-only { + display: inline !important; + } +} +@media screen and (min-width: 1472px) { + .is-inline-fullhd { + display: inline !important; + } +} +.is-inline-block { + display: inline-block !important; +} +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; + } +} +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-inline-block-tablet-only { + display: inline-block !important; + } +} +@media screen and (max-width: 1087px) { + .is-inline-block-touch { + display: inline-block !important; + } +} +@media screen and (min-width: 1088px) { + .is-inline-block-desktop { + display: inline-block !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-inline-block-desktop-only { + display: inline-block !important; + } +} +@media screen and (min-width: 1280px) { + .is-inline-block-widescreen { + display: inline-block !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-inline-block-widescreen-only { + display: inline-block !important; + } +} +@media screen and (min-width: 1472px) { + .is-inline-block-fullhd { + display: inline-block !important; + } +} +.is-inline-flex { + display: inline-flex !important; +} +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; + } +} +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: inline-flex !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; + } +} +@media screen and (max-width: 1087px) { + .is-inline-flex-touch { + display: inline-flex !important; + } +} +@media screen and (min-width: 1088px) { + .is-inline-flex-desktop { + display: inline-flex !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; + } +} +@media screen and (min-width: 1280px) { + .is-inline-flex-widescreen { + display: inline-flex !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; + } +} +@media screen and (min-width: 1472px) { + .is-inline-flex-fullhd { + display: inline-flex !important; + } +} +.is-hidden { + display: none !important; +} +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; +} +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; + } +} +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-hidden-tablet-only { + display: none !important; + } +} +@media screen and (max-width: 1087px) { + .is-hidden-touch { + display: none !important; + } +} +@media screen and (min-width: 1088px) { + .is-hidden-desktop { + display: none !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-hidden-desktop-only { + display: none !important; + } +} +@media screen and (min-width: 1280px) { + .is-hidden-widescreen { + display: none !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-hidden-widescreen-only { + display: none !important; + } +} +@media screen and (min-width: 1472px) { + .is-hidden-fullhd { + display: none !important; + } +} +.is-invisible { + visibility: hidden !important; +} +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; + } +} +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-invisible-tablet-only { + visibility: hidden !important; + } +} +@media screen and (max-width: 1087px) { + .is-invisible-touch { + visibility: hidden !important; + } +} +@media screen and (min-width: 1088px) { + .is-invisible-desktop { + visibility: hidden !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-invisible-desktop-only { + visibility: hidden !important; + } +} +@media screen and (min-width: 1280px) { + .is-invisible-widescreen { + visibility: hidden !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-invisible-widescreen-only { + visibility: hidden !important; + } +} +@media screen and (min-width: 1472px) { + .is-invisible-fullhd { + visibility: hidden !important; + } +} +.is-marginless { + margin: 0 !important; +} +.is-paddingless { + padding: 0 !important; +} +.is-radiusless { + border-radius: 0 !important; +} +.is-shadowless { + box-shadow: none !important; +} +.is-relative { + position: relative !important; +} +.breadcrumb { + font-size: 1rem; + white-space: nowrap; +} +.breadcrumb a { + align-items: center; + color: #02d7f2; + display: flex; + justify-content: center; + padding: 0 0.75em; +} +.breadcrumb a:hover { + color: #fcee09; +} +.breadcrumb li { + align-items: center; + display: flex; +} +.breadcrumb li:first-child a { + padding-left: 0; +} +.breadcrumb li.is-active a { + color: #fcee09; + cursor: default; + pointer-events: none; +} +.breadcrumb li + li::before { + color: #b5b5b5; + content: "\0002f"; +} +.breadcrumb ul, +.breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.breadcrumb .icon:first-child { + margin-right: 0.5em; +} +.breadcrumb .icon:last-child { + margin-left: 0.5em; +} +.breadcrumb.is-centered ol, +.breadcrumb.is-centered ul { + justify-content: center; +} +.breadcrumb.is-right ol, +.breadcrumb.is-right ul { + justify-content: flex-end; +} +.breadcrumb.is-small { + font-size: 0.75rem; +} +.breadcrumb.is-medium { + font-size: 1.25rem; +} +.breadcrumb.is-large { + font-size: 1.5rem; +} +.breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; +} +.breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; +} +.breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; +} +.breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; +} +.card { + background-color: transparent; + box-shadow: none, 0 0 1px rgba(0,0,0,0.1); + color: #cdcdcd; + max-width: 100%; + position: relative; +} +.card-header { + background-color: transparent; + align-items: stretch; + box-shadow: 0 0.125em 0.25em rgba(0,0,0,0.1); + display: flex; +} +.card-header-title { + align-items: center; + color: #fcee09; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem 1rem; +} +.card-header-title.is-centered { + justify-content: center; +} +.card-header-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem 1rem; +} +.card-image { + display: block; + position: relative; +} +.card-content { + background-color: transparent; + padding: 1.5rem; +} +.card-footer { + background-color: transparent; + border-top: 1px solid #ededed; + align-items: stretch; + display: flex; +} +.card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; +} +.card-footer-item:not(:last-child) { + border-right: 1px solid #ededed; +} +.card .media:not(:last-child) { + margin-bottom: 0.75rem; +} +.dropdown { + display: inline-flex; + position: relative; + vertical-align: top; +} +.dropdown.is-active .dropdown-menu, +.dropdown.is-hoverable:hover .dropdown-menu { + display: block; +} +.dropdown.is-right .dropdown-menu { + left: auto; + right: 0; +} +.dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; +} +.dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; +} +.dropdown-content { + background-color: #000; + border-radius: 0; + box-shadow: 0 0.5em 1em -0.125em rgba(0,0,0,0.1), 0 0px 0 1px rgba(0,0,0,0.02); + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} +.dropdown-item { + color: #cdcdcd; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; +} +a.dropdown-item, +button.dropdown-item { + padding-right: 3rem; + text-align: left; + white-space: nowrap; + width: 100%; +} +a.dropdown-item:hover, +button.dropdown-item:hover { + background-color: #f5f5f5; + color: #000; +} +a.dropdown-item.is-active, +button.dropdown-item.is-active { + background-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.dropdown-divider { + background-color: #ededed; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; +} +.level { + align-items: center; + justify-content: space-between; +} +.level code { + border-radius: 0; +} +.level img { + display: inline-block; + vertical-align: top; +} +.level.is-mobile { + display: flex; +} +.level.is-mobile .level-left, +.level.is-mobile .level-right { + display: flex; +} +.level.is-mobile .level-left + .level-right { + margin-top: 0; +} +.level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; +} +.level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; +} +@media screen and (min-width: 769px), print { + .level { + display: flex; + } + .level > .level-item:not(.is-narrow) { + flex-grow: 1; + } +} +.level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; +} +.level-item .title, +.level-item .subtitle { + margin-bottom: 0; +} +@media screen and (max-width: 768px) { + .level-item:not(:last-child) { + margin-bottom: 0.75rem; + } +} +.level-left, +.level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; +} +.level-left .level-item.is-flexible, +.level-right .level-item.is-flexible { + flex-grow: 1; +} +@media screen and (min-width: 769px), print { + .level-left .level-item:not(:last-child), + .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; + } +} +.level-left { + align-items: center; + justify-content: flex-start; +} +@media screen and (max-width: 768px) { + .level-left + .level-right { + margin-top: 1.5rem; + } +} +@media screen and (min-width: 769px), print { + .level-left { + display: flex; + } +} +.level-right { + align-items: center; + justify-content: flex-end; +} +@media screen and (min-width: 769px), print { + .level-right { + display: flex; + } +} +.list { + background-color: #000; + border-radius: 0; + box-shadow: 0 2px 3px rgba(0,0,0,0.1), 0 0 0 1px rgba(0,0,0,0.1); +} +.list-item { + display: block; + padding: 0.5em 1em; +} +.list-item:not(a) { + color: #cdcdcd; +} +.list-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.list-item:last-child { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.list-item:not(:last-child) { + border-bottom: 1px solid #dbdbdb; +} +.list-item.is-active { + background-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +a.list-item { + background-color: #f5f5f5; + cursor: pointer; +} +.media { + align-items: flex-start; + display: flex; + text-align: left; +} +.media .content:not(:last-child) { + margin-bottom: 0.75rem; +} +.media .media { + border-top: 1px solid rgba(219,219,219,0.5); + display: flex; + padding-top: 0.75rem; +} +.media .media .content:not(:last-child), +.media .media .control:not(:last-child) { + margin-bottom: 0.5rem; +} +.media .media .media { + padding-top: 0.5rem; +} +.media .media .media + .media { + margin-top: 0.5rem; +} +.media + .media { + border-top: 1px solid rgba(219,219,219,0.5); + margin-top: 1rem; + padding-top: 1rem; +} +.media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; +} +.media-left, +.media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; +} +.media-left { + margin-right: 1rem; +} +.media-right { + margin-left: 1rem; +} +.media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: left; +} +@media screen and (max-width: 768px) { + .media-content { + overflow-x: auto; + } +} +.menu { + font-size: 1rem; +} +.menu.is-small { + font-size: 0.75rem; +} +.menu.is-medium { + font-size: 1.25rem; +} +.menu.is-large { + font-size: 1.5rem; +} +.menu-list { + line-height: 1.25; +} +.menu-list a { + border-radius: 0; + color: #cdcdcd; + display: block; + padding: 0.5em 0.75em; +} +.menu-list a:hover { + background-color: #fcee09; + color: #000; +} +.menu-list a.is-active { + background-color: #fcee09; + color: #000; +} +.menu-list li ul { + border-left: 1px solid #cdcdcd; + margin: 0.75em; + padding-left: 0.75em; +} +.menu-label { + color: #02d7f2; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; +} +.menu-label:not(:first-child) { + margin-top: 1em; +} +.menu-label:not(:last-child) { + margin-bottom: 1em; +} +.message { + background-color: #f5f5f5; + border-radius: 0; + font-size: 1rem; +} +.message strong { + color: currentColor; +} +.message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; +} +.message.is-small { + font-size: 0.75rem; +} +.message.is-medium { + font-size: 1.25rem; +} +.message.is-large { + font-size: 1.5rem; +} +.message.is-white { + background-color: #fff; +} +.message.is-white .message-header { + background-color: #fff; + color: #000; +} +.message.is-white .message-body { + border-color: #fff; +} +.message.is-black { + background-color: #fafafa; +} +.message.is-black .message-header { + background-color: #000; + color: #fff; +} +.message.is-black .message-body { + border-color: #000; +} +.message.is-light { + background-color: #fafafa; +} +.message.is-light .message-header { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.message.is-light .message-body { + border-color: #f5f5f5; +} +.message.is-dark { + background-color: #fafafa; +} +.message.is-dark .message-header { + background-color: #363636; + color: #fff; +} +.message.is-dark .message-body { + border-color: #363636; +} +.message.is-primary { + background-color: #fffeeb; +} +.message.is-primary .message-header { + background-color: #fcee09; + color: #121617; +} +.message.is-primary .message-body { + border-color: #fcee09; + color: #928a02; +} +.message.is-link { + background-color: #ebfdff; +} +.message.is-link .message-header { + background-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.message.is-link .message-body { + border-color: #02d7f2; + color: #018293; +} +.message.is-info { + background-color: #ebfdff; +} +.message.is-info .message-header { + background-color: #02d7f2; + color: #121617; +} +.message.is-info .message-body { + border-color: #02d7f2; + color: #018293; +} +.message.is-success { + background-color: #ebfff0; +} +.message.is-success .message-header { + background-color: #00ff41; + color: #121617; +} +.message.is-success .message-body { + border-color: #00ff41; + color: #009426; +} +.message.is-warning { + background-color: #fff3eb; +} +.message.is-warning .message-header { + background-color: #ff8e3c; + color: #121617; +} +.message.is-warning .message-body { + border-color: #ff8e3c; + color: #a84700; +} +.message.is-danger { + background-color: #ffebef; +} +.message.is-danger .message-header { + background-color: #ff003c; + color: #121617; +} +.message.is-danger .message-body { + border-color: #ff003c; + color: #eb0037; +} +.message.is-grey-lightest { + background-color: #fafafa; +} +.message.is-grey-lightest .message-header { + background-color: #ededed; + color: #363636; +} +.message.is-grey-lightest .message-body { + border-color: #ededed; +} +.message-header { + align-items: center; + background-color: #cdcdcd; + border-radius: 0 0 0 0; + color: rgba(0,0,0,0.7); + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; +} +.message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; +} +.message-header + .message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.message-body { + border-color: #dbdbdb; + border-radius: 0; + border-style: solid; + border-width: 0 0 0 4px; + color: #cdcdcd; + padding: 1.25em 1.5em; +} +.message-body code, +.message-body pre { + background-color: #000; +} +.message-body pre code { + background-color: transparent; +} +.modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; +} +.modal.is-active { + display: flex; +} +.modal-background { + background-color: rgba(0,0,0,0.86); +} +.modal-content, +.modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; +} +@media screen and (min-width: 769px), print { + .modal-content, + .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; + } +} +.modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; +} +.modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; +} +.modal-card-head, +.modal-card-foot { + align-items: center; + background-color: #f5f5f5; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; +} +.modal-card-head { + border-bottom: 1px solid #dbdbdb; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} +.modal-card-title { + color: #fcee09; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; +} +.modal-card-foot { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 1px solid #dbdbdb; +} +.modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; +} +.modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: #000; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; +} +.navbar { + background-color: #fcee09; + min-height: 3.25rem; + position: relative; + z-index: 30; +} +.navbar.is-white { + background-color: #fff; + color: #000; +} +.navbar.is-white .navbar-brand > .navbar-item, +.navbar.is-white .navbar-brand .navbar-link { + color: #000; +} +.navbar.is-white .navbar-brand > a.navbar-item:focus, +.navbar.is-white .navbar-brand .navbar-link:focus, +.navbar.is-white .navbar-brand > a.navbar-item:hover, +.navbar.is-white .navbar-brand .navbar-link:hover, +.navbar.is-white .navbar-brand > a.navbar-item.is-active, +.navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #000; +} +.navbar.is-white .navbar-brand .navbar-link::after { + border-color: #000; +} +.navbar.is-white .navbar-burger { + color: #000; +} +@media screen and (min-width: 1088px) { + .navbar.is-white .navbar-start > .navbar-item, + .navbar.is-white .navbar-end > .navbar-item, + .navbar.is-white .navbar-start .navbar-link, + .navbar.is-white .navbar-end .navbar-link { + color: #000; + } + .navbar.is-white .navbar-start > a.navbar-item:focus, + .navbar.is-white .navbar-end > a.navbar-item:focus, + .navbar.is-white .navbar-start .navbar-link:focus, + .navbar.is-white .navbar-end .navbar-link:focus, + .navbar.is-white .navbar-start > a.navbar-item:hover, + .navbar.is-white .navbar-end > a.navbar-item:hover, + .navbar.is-white .navbar-start .navbar-link:hover, + .navbar.is-white .navbar-end .navbar-link:hover, + .navbar.is-white .navbar-start > a.navbar-item.is-active, + .navbar.is-white .navbar-end > a.navbar-item.is-active, + .navbar.is-white .navbar-start .navbar-link.is-active, + .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #000; + } + .navbar.is-white .navbar-start .navbar-link::after, + .navbar.is-white .navbar-end .navbar-link::after { + border-color: #000; + } + .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #000; + } + .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: #fff; + color: #000; + } +} +.navbar.is-black { + background-color: #000; + color: #fff; +} +.navbar.is-black .navbar-brand > .navbar-item, +.navbar.is-black .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-black .navbar-brand > a.navbar-item:focus, +.navbar.is-black .navbar-brand .navbar-link:focus, +.navbar.is-black .navbar-brand > a.navbar-item:hover, +.navbar.is-black .navbar-brand .navbar-link:hover, +.navbar.is-black .navbar-brand > a.navbar-item.is-active, +.navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: #000; + color: #fff; +} +.navbar.is-black .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-black .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-black .navbar-start > .navbar-item, + .navbar.is-black .navbar-end > .navbar-item, + .navbar.is-black .navbar-start .navbar-link, + .navbar.is-black .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-black .navbar-start > a.navbar-item:focus, + .navbar.is-black .navbar-end > a.navbar-item:focus, + .navbar.is-black .navbar-start .navbar-link:focus, + .navbar.is-black .navbar-end .navbar-link:focus, + .navbar.is-black .navbar-start > a.navbar-item:hover, + .navbar.is-black .navbar-end > a.navbar-item:hover, + .navbar.is-black .navbar-start .navbar-link:hover, + .navbar.is-black .navbar-end .navbar-link:hover, + .navbar.is-black .navbar-start > a.navbar-item.is-active, + .navbar.is-black .navbar-end > a.navbar-item.is-active, + .navbar.is-black .navbar-start .navbar-link.is-active, + .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: #000; + color: #fff; + } + .navbar.is-black .navbar-start .navbar-link::after, + .navbar.is-black .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #000; + color: #fff; + } + .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #000; + color: #fff; + } +} +.navbar.is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-brand > .navbar-item, +.navbar.is-light .navbar-brand .navbar-link { + color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-brand > a.navbar-item:focus, +.navbar.is-light .navbar-brand .navbar-link:focus, +.navbar.is-light .navbar-brand > a.navbar-item:hover, +.navbar.is-light .navbar-brand .navbar-link:hover, +.navbar.is-light .navbar-brand > a.navbar-item.is-active, +.navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-brand .navbar-link::after { + border-color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-burger { + color: rgba(0,0,0,0.7); +} +@media screen and (min-width: 1088px) { + .navbar.is-light .navbar-start > .navbar-item, + .navbar.is-light .navbar-end > .navbar-item, + .navbar.is-light .navbar-start .navbar-link, + .navbar.is-light .navbar-end .navbar-link { + color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-start > a.navbar-item:focus, + .navbar.is-light .navbar-end > a.navbar-item:focus, + .navbar.is-light .navbar-start .navbar-link:focus, + .navbar.is-light .navbar-end .navbar-link:focus, + .navbar.is-light .navbar-start > a.navbar-item:hover, + .navbar.is-light .navbar-end > a.navbar-item:hover, + .navbar.is-light .navbar-start .navbar-link:hover, + .navbar.is-light .navbar-end .navbar-link:hover, + .navbar.is-light .navbar-start > a.navbar-item.is-active, + .navbar.is-light .navbar-end > a.navbar-item.is-active, + .navbar.is-light .navbar-start .navbar-link.is-active, + .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-start .navbar-link::after, + .navbar.is-light .navbar-end .navbar-link::after { + border-color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); + } +} +.navbar.is-dark { + background-color: #363636; + color: #fff; +} +.navbar.is-dark .navbar-brand > .navbar-item, +.navbar.is-dark .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-dark .navbar-brand > a.navbar-item:focus, +.navbar.is-dark .navbar-brand .navbar-link:focus, +.navbar.is-dark .navbar-brand > a.navbar-item:hover, +.navbar.is-dark .navbar-brand .navbar-link:hover, +.navbar.is-dark .navbar-brand > a.navbar-item.is-active, +.navbar.is-dark .navbar-brand .navbar-link.is-active { + background-color: #292929; + color: #fff; +} +.navbar.is-dark .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-dark .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-dark .navbar-start > .navbar-item, + .navbar.is-dark .navbar-end > .navbar-item, + .navbar.is-dark .navbar-start .navbar-link, + .navbar.is-dark .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-dark .navbar-start > a.navbar-item:focus, + .navbar.is-dark .navbar-end > a.navbar-item:focus, + .navbar.is-dark .navbar-start .navbar-link:focus, + .navbar.is-dark .navbar-end .navbar-link:focus, + .navbar.is-dark .navbar-start > a.navbar-item:hover, + .navbar.is-dark .navbar-end > a.navbar-item:hover, + .navbar.is-dark .navbar-start .navbar-link:hover, + .navbar.is-dark .navbar-end .navbar-link:hover, + .navbar.is-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-dark .navbar-start .navbar-link.is-active, + .navbar.is-dark .navbar-end .navbar-link.is-active { + background-color: #292929; + color: #fff; + } + .navbar.is-dark .navbar-start .navbar-link::after, + .navbar.is-dark .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #292929; + color: #fff; + } + .navbar.is-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #363636; + color: #fff; + } +} +.navbar.is-primary { + background-color: #fcee09; + color: #121617; +} +.navbar.is-primary .navbar-brand > .navbar-item, +.navbar.is-primary .navbar-brand .navbar-link { + color: #121617; +} +.navbar.is-primary .navbar-brand > a.navbar-item:focus, +.navbar.is-primary .navbar-brand .navbar-link:focus, +.navbar.is-primary .navbar-brand > a.navbar-item:hover, +.navbar.is-primary .navbar-brand .navbar-link:hover, +.navbar.is-primary .navbar-brand > a.navbar-item.is-active, +.navbar.is-primary .navbar-brand .navbar-link.is-active { + background-color: #e9db03; + color: #121617; +} +.navbar.is-primary .navbar-brand .navbar-link::after { + border-color: #121617; +} +.navbar.is-primary .navbar-burger { + color: #121617; +} +@media screen and (min-width: 1088px) { + .navbar.is-primary .navbar-start > .navbar-item, + .navbar.is-primary .navbar-end > .navbar-item, + .navbar.is-primary .navbar-start .navbar-link, + .navbar.is-primary .navbar-end .navbar-link { + color: #121617; + } + .navbar.is-primary .navbar-start > a.navbar-item:focus, + .navbar.is-primary .navbar-end > a.navbar-item:focus, + .navbar.is-primary .navbar-start .navbar-link:focus, + .navbar.is-primary .navbar-end .navbar-link:focus, + .navbar.is-primary .navbar-start > a.navbar-item:hover, + .navbar.is-primary .navbar-end > a.navbar-item:hover, + .navbar.is-primary .navbar-start .navbar-link:hover, + .navbar.is-primary .navbar-end .navbar-link:hover, + .navbar.is-primary .navbar-start > a.navbar-item.is-active, + .navbar.is-primary .navbar-end > a.navbar-item.is-active, + .navbar.is-primary .navbar-start .navbar-link.is-active, + .navbar.is-primary .navbar-end .navbar-link.is-active { + background-color: #e9db03; + color: #121617; + } + .navbar.is-primary .navbar-start .navbar-link::after, + .navbar.is-primary .navbar-end .navbar-link::after { + border-color: #121617; + } + .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e9db03; + color: #121617; + } + .navbar.is-primary .navbar-dropdown a.navbar-item.is-active { + background-color: #fcee09; + color: #121617; + } +} +.navbar.is-link { + background-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.navbar.is-link .navbar-brand > .navbar-item, +.navbar.is-link .navbar-brand .navbar-link { + color: rgba(0,0,0,0.7); +} +.navbar.is-link .navbar-brand > a.navbar-item:focus, +.navbar.is-link .navbar-brand .navbar-link:focus, +.navbar.is-link .navbar-brand > a.navbar-item:hover, +.navbar.is-link .navbar-brand .navbar-link:hover, +.navbar.is-link .navbar-brand > a.navbar-item.is-active, +.navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #02c1d9; + color: rgba(0,0,0,0.7); +} +.navbar.is-link .navbar-brand .navbar-link::after { + border-color: rgba(0,0,0,0.7); +} +.navbar.is-link .navbar-burger { + color: rgba(0,0,0,0.7); +} +@media screen and (min-width: 1088px) { + .navbar.is-link .navbar-start > .navbar-item, + .navbar.is-link .navbar-end > .navbar-item, + .navbar.is-link .navbar-start .navbar-link, + .navbar.is-link .navbar-end .navbar-link { + color: rgba(0,0,0,0.7); + } + .navbar.is-link .navbar-start > a.navbar-item:focus, + .navbar.is-link .navbar-end > a.navbar-item:focus, + .navbar.is-link .navbar-start .navbar-link:focus, + .navbar.is-link .navbar-end .navbar-link:focus, + .navbar.is-link .navbar-start > a.navbar-item:hover, + .navbar.is-link .navbar-end > a.navbar-item:hover, + .navbar.is-link .navbar-start .navbar-link:hover, + .navbar.is-link .navbar-end .navbar-link:hover, + .navbar.is-link .navbar-start > a.navbar-item.is-active, + .navbar.is-link .navbar-end > a.navbar-item.is-active, + .navbar.is-link .navbar-start .navbar-link.is-active, + .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #02c1d9; + color: rgba(0,0,0,0.7); + } + .navbar.is-link .navbar-start .navbar-link::after, + .navbar.is-link .navbar-end .navbar-link::after { + border-color: rgba(0,0,0,0.7); + } + .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #02c1d9; + color: rgba(0,0,0,0.7); + } + .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #02d7f2; + color: rgba(0,0,0,0.7); + } +} +.navbar.is-info { + background-color: #02d7f2; + color: #121617; +} +.navbar.is-info .navbar-brand > .navbar-item, +.navbar.is-info .navbar-brand .navbar-link { + color: #121617; +} +.navbar.is-info .navbar-brand > a.navbar-item:focus, +.navbar.is-info .navbar-brand .navbar-link:focus, +.navbar.is-info .navbar-brand > a.navbar-item:hover, +.navbar.is-info .navbar-brand .navbar-link:hover, +.navbar.is-info .navbar-brand > a.navbar-item.is-active, +.navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #02c1d9; + color: #121617; +} +.navbar.is-info .navbar-brand .navbar-link::after { + border-color: #121617; +} +.navbar.is-info .navbar-burger { + color: #121617; +} +@media screen and (min-width: 1088px) { + .navbar.is-info .navbar-start > .navbar-item, + .navbar.is-info .navbar-end > .navbar-item, + .navbar.is-info .navbar-start .navbar-link, + .navbar.is-info .navbar-end .navbar-link { + color: #121617; + } + .navbar.is-info .navbar-start > a.navbar-item:focus, + .navbar.is-info .navbar-end > a.navbar-item:focus, + .navbar.is-info .navbar-start .navbar-link:focus, + .navbar.is-info .navbar-end .navbar-link:focus, + .navbar.is-info .navbar-start > a.navbar-item:hover, + .navbar.is-info .navbar-end > a.navbar-item:hover, + .navbar.is-info .navbar-start .navbar-link:hover, + .navbar.is-info .navbar-end .navbar-link:hover, + .navbar.is-info .navbar-start > a.navbar-item.is-active, + .navbar.is-info .navbar-end > a.navbar-item.is-active, + .navbar.is-info .navbar-start .navbar-link.is-active, + .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #02c1d9; + color: #121617; + } + .navbar.is-info .navbar-start .navbar-link::after, + .navbar.is-info .navbar-end .navbar-link::after { + border-color: #121617; + } + .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #02c1d9; + color: #121617; + } + .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #02d7f2; + color: #121617; + } +} +.navbar.is-success { + background-color: #00ff41; + color: #121617; +} +.navbar.is-success .navbar-brand > .navbar-item, +.navbar.is-success .navbar-brand .navbar-link { + color: #121617; +} +.navbar.is-success .navbar-brand > a.navbar-item:focus, +.navbar.is-success .navbar-brand .navbar-link:focus, +.navbar.is-success .navbar-brand > a.navbar-item:hover, +.navbar.is-success .navbar-brand .navbar-link:hover, +.navbar.is-success .navbar-brand > a.navbar-item.is-active, +.navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #00e63a; + color: #121617; +} +.navbar.is-success .navbar-brand .navbar-link::after { + border-color: #121617; +} +.navbar.is-success .navbar-burger { + color: #121617; +} +@media screen and (min-width: 1088px) { + .navbar.is-success .navbar-start > .navbar-item, + .navbar.is-success .navbar-end > .navbar-item, + .navbar.is-success .navbar-start .navbar-link, + .navbar.is-success .navbar-end .navbar-link { + color: #121617; + } + .navbar.is-success .navbar-start > a.navbar-item:focus, + .navbar.is-success .navbar-end > a.navbar-item:focus, + .navbar.is-success .navbar-start .navbar-link:focus, + .navbar.is-success .navbar-end .navbar-link:focus, + .navbar.is-success .navbar-start > a.navbar-item:hover, + .navbar.is-success .navbar-end > a.navbar-item:hover, + .navbar.is-success .navbar-start .navbar-link:hover, + .navbar.is-success .navbar-end .navbar-link:hover, + .navbar.is-success .navbar-start > a.navbar-item.is-active, + .navbar.is-success .navbar-end > a.navbar-item.is-active, + .navbar.is-success .navbar-start .navbar-link.is-active, + .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #00e63a; + color: #121617; + } + .navbar.is-success .navbar-start .navbar-link::after, + .navbar.is-success .navbar-end .navbar-link::after { + border-color: #121617; + } + .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #00e63a; + color: #121617; + } + .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #00ff41; + color: #121617; + } +} +.navbar.is-warning { + background-color: #ff8e3c; + color: #121617; +} +.navbar.is-warning .navbar-brand > .navbar-item, +.navbar.is-warning .navbar-brand .navbar-link { + color: #121617; +} +.navbar.is-warning .navbar-brand > a.navbar-item:focus, +.navbar.is-warning .navbar-brand .navbar-link:focus, +.navbar.is-warning .navbar-brand > a.navbar-item:hover, +.navbar.is-warning .navbar-brand .navbar-link:hover, +.navbar.is-warning .navbar-brand > a.navbar-item.is-active, +.navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #ff7f22; + color: #121617; +} +.navbar.is-warning .navbar-brand .navbar-link::after { + border-color: #121617; +} +.navbar.is-warning .navbar-burger { + color: #121617; +} +@media screen and (min-width: 1088px) { + .navbar.is-warning .navbar-start > .navbar-item, + .navbar.is-warning .navbar-end > .navbar-item, + .navbar.is-warning .navbar-start .navbar-link, + .navbar.is-warning .navbar-end .navbar-link { + color: #121617; + } + .navbar.is-warning .navbar-start > a.navbar-item:focus, + .navbar.is-warning .navbar-end > a.navbar-item:focus, + .navbar.is-warning .navbar-start .navbar-link:focus, + .navbar.is-warning .navbar-end .navbar-link:focus, + .navbar.is-warning .navbar-start > a.navbar-item:hover, + .navbar.is-warning .navbar-end > a.navbar-item:hover, + .navbar.is-warning .navbar-start .navbar-link:hover, + .navbar.is-warning .navbar-end .navbar-link:hover, + .navbar.is-warning .navbar-start > a.navbar-item.is-active, + .navbar.is-warning .navbar-end > a.navbar-item.is-active, + .navbar.is-warning .navbar-start .navbar-link.is-active, + .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #ff7f22; + color: #121617; + } + .navbar.is-warning .navbar-start .navbar-link::after, + .navbar.is-warning .navbar-end .navbar-link::after { + border-color: #121617; + } + .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ff7f22; + color: #121617; + } + .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ff8e3c; + color: #121617; + } +} +.navbar.is-danger { + background-color: #ff003c; + color: #121617; +} +.navbar.is-danger .navbar-brand > .navbar-item, +.navbar.is-danger .navbar-brand .navbar-link { + color: #121617; +} +.navbar.is-danger .navbar-brand > a.navbar-item:focus, +.navbar.is-danger .navbar-brand .navbar-link:focus, +.navbar.is-danger .navbar-brand > a.navbar-item:hover, +.navbar.is-danger .navbar-brand .navbar-link:hover, +.navbar.is-danger .navbar-brand > a.navbar-item.is-active, +.navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #e60036; + color: #121617; +} +.navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #121617; +} +.navbar.is-danger .navbar-burger { + color: #121617; +} +@media screen and (min-width: 1088px) { + .navbar.is-danger .navbar-start > .navbar-item, + .navbar.is-danger .navbar-end > .navbar-item, + .navbar.is-danger .navbar-start .navbar-link, + .navbar.is-danger .navbar-end .navbar-link { + color: #121617; + } + .navbar.is-danger .navbar-start > a.navbar-item:focus, + .navbar.is-danger .navbar-end > a.navbar-item:focus, + .navbar.is-danger .navbar-start .navbar-link:focus, + .navbar.is-danger .navbar-end .navbar-link:focus, + .navbar.is-danger .navbar-start > a.navbar-item:hover, + .navbar.is-danger .navbar-end > a.navbar-item:hover, + .navbar.is-danger .navbar-start .navbar-link:hover, + .navbar.is-danger .navbar-end .navbar-link:hover, + .navbar.is-danger .navbar-start > a.navbar-item.is-active, + .navbar.is-danger .navbar-end > a.navbar-item.is-active, + .navbar.is-danger .navbar-start .navbar-link.is-active, + .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #e60036; + color: #121617; + } + .navbar.is-danger .navbar-start .navbar-link::after, + .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #121617; + } + .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e60036; + color: #121617; + } + .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #ff003c; + color: #121617; + } +} +.navbar.is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.navbar.is-grey-lightest .navbar-brand > .navbar-item, +.navbar.is-grey-lightest .navbar-brand .navbar-link { + color: #363636; +} +.navbar.is-grey-lightest .navbar-brand > a.navbar-item:focus, +.navbar.is-grey-lightest .navbar-brand .navbar-link:focus, +.navbar.is-grey-lightest .navbar-brand > a.navbar-item:hover, +.navbar.is-grey-lightest .navbar-brand .navbar-link:hover, +.navbar.is-grey-lightest .navbar-brand > a.navbar-item.is-active, +.navbar.is-grey-lightest .navbar-brand .navbar-link.is-active { + background-color: #e0e0e0; + color: #363636; +} +.navbar.is-grey-lightest .navbar-brand .navbar-link::after { + border-color: #363636; +} +.navbar.is-grey-lightest .navbar-burger { + color: #363636; +} +@media screen and (min-width: 1088px) { + .navbar.is-grey-lightest .navbar-start > .navbar-item, + .navbar.is-grey-lightest .navbar-end > .navbar-item, + .navbar.is-grey-lightest .navbar-start .navbar-link, + .navbar.is-grey-lightest .navbar-end .navbar-link { + color: #363636; + } + .navbar.is-grey-lightest .navbar-start > a.navbar-item:focus, + .navbar.is-grey-lightest .navbar-end > a.navbar-item:focus, + .navbar.is-grey-lightest .navbar-start .navbar-link:focus, + .navbar.is-grey-lightest .navbar-end .navbar-link:focus, + .navbar.is-grey-lightest .navbar-start > a.navbar-item:hover, + .navbar.is-grey-lightest .navbar-end > a.navbar-item:hover, + .navbar.is-grey-lightest .navbar-start .navbar-link:hover, + .navbar.is-grey-lightest .navbar-end .navbar-link:hover, + .navbar.is-grey-lightest .navbar-start > a.navbar-item.is-active, + .navbar.is-grey-lightest .navbar-end > a.navbar-item.is-active, + .navbar.is-grey-lightest .navbar-start .navbar-link.is-active, + .navbar.is-grey-lightest .navbar-end .navbar-link.is-active { + background-color: #e0e0e0; + color: #363636; + } + .navbar.is-grey-lightest .navbar-start .navbar-link::after, + .navbar.is-grey-lightest .navbar-end .navbar-link::after { + border-color: #363636; + } + .navbar.is-grey-lightest .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-grey-lightest .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-grey-lightest .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e0e0e0; + color: #363636; + } + .navbar.is-grey-lightest .navbar-dropdown a.navbar-item.is-active { + background-color: #ededed; + color: #363636; + } +} +.navbar > .container { + align-items: stretch; + display: flex; + min-height: 3.25rem; + width: 100%; +} +.navbar.has-shadow { + box-shadow: 0 2px 0 0 #f5f5f5; +} +.navbar.is-fixed-bottom, +.navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; +} +.navbar.is-fixed-bottom { + bottom: 0; +} +.navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 #f5f5f5; +} +.navbar.is-fixed-top { + top: 0; +} +html.has-navbar-fixed-top, +body.has-navbar-fixed-top { + padding-top: 3.25rem; +} +html.has-navbar-fixed-bottom, +body.has-navbar-fixed-bottom { + padding-bottom: 3.25rem; +} +.navbar-brand, +.navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 3.25rem; +} +.navbar-brand a.navbar-item:focus, +.navbar-brand a.navbar-item:hover { + background-color: transparent; +} +.navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; +} +.navbar-burger { + color: #000; + cursor: pointer; + display: block; + height: 3.25rem; + position: relative; + width: 3.25rem; + margin-left: auto; +} +.navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; +} +.navbar-burger span:nth-child(1) { + top: calc(50% - 6px); +} +.navbar-burger span:nth-child(2) { + top: calc(50% - 1px); +} +.navbar-burger span:nth-child(3) { + top: calc(50% + 4px); +} +.navbar-burger:hover { + background-color: rgba(0,0,0,0.05); +} +.navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); +} +.navbar-burger.is-active span:nth-child(2) { + opacity: 0; +} +.navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); +} +.navbar-menu { + display: none; +} +.navbar-item, +.navbar-link { + color: #000; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; +} +.navbar-item .icon:only-child, +.navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; +} +a.navbar-item, +.navbar-link { + cursor: pointer; +} +a.navbar-item:focus, +.navbar-link:focus, +a.navbar-item:focus-within, +.navbar-link:focus-within, +a.navbar-item:hover, +.navbar-link:hover, +a.navbar-item.is-active, +.navbar-link.is-active { + background-color: transparent; + color: #000; +} +.navbar-item { + display: block; + flex-grow: 0; + flex-shrink: 0; +} +.navbar-item img { + max-height: 1.75rem; +} +.navbar-item.has-dropdown { + padding: 0; +} +.navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 3.25rem; + padding-bottom: calc(0.5rem - 1px); +} +.navbar-item.is-tab:focus, +.navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #02d7f2; +} +.navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #02d7f2; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #02d7f2; + padding-bottom: calc(0.5rem - 3px); +} +.navbar-content { + flex-grow: 1; + flex-shrink: 1; +} +.navbar-link:not(.is-arrowless) { + padding-right: 2.5em; +} +.navbar-link:not(.is-arrowless)::after { + border-color: #02d7f2; + margin-top: -0.375em; + right: 1.125em; +} +.navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} +.navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; +} +.navbar-divider { + background-color: #f5f5f5; + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; +} +@media screen and (max-width: 1087px) { + .navbar > .container { + display: block; + } + .navbar-brand .navbar-item, + .navbar-tabs .navbar-item { + align-items: center; + display: flex; + } + .navbar-link::after { + display: none; + } + .navbar-menu { + background-color: #fcee09; + box-shadow: 0 8px 16px rgba(0,0,0,0.1); + padding: 0.5rem 0; + } + .navbar-menu.is-active { + display: block; + } + .navbar.is-fixed-bottom-touch, + .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; + } + .navbar.is-fixed-bottom-touch { + bottom: 0; + } + .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(0,0,0,0.1); + } + .navbar.is-fixed-top-touch { + top: 0; + } + .navbar.is-fixed-top .navbar-menu, + .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 3.25rem); + overflow: auto; + } + html.has-navbar-fixed-top-touch, + body.has-navbar-fixed-top-touch { + padding-top: 3.25rem; + } + html.has-navbar-fixed-bottom-touch, + body.has-navbar-fixed-bottom-touch { + padding-bottom: 3.25rem; + } +} +@media screen and (min-width: 1088px) { + .navbar, + .navbar-menu, + .navbar-start, + .navbar-end { + align-items: stretch; + display: flex; + } + .navbar { + min-height: 3.25rem; + } + .navbar.is-spaced { + padding: 1rem 2rem; + } + .navbar.is-spaced .navbar-start, + .navbar.is-spaced .navbar-end { + align-items: center; + } + .navbar.is-spaced a.navbar-item, + .navbar.is-spaced .navbar-link { + border-radius: 0; + } + .navbar.is-transparent a.navbar-item:focus, + .navbar.is-transparent .navbar-link:focus, + .navbar.is-transparent a.navbar-item:hover, + .navbar.is-transparent .navbar-link:hover, + .navbar.is-transparent a.navbar-item.is-active, + .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; + } + .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; + } + .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, + .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: #f5f5f5; + color: #000; + } + .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: #02d7f2; + } + .navbar-burger { + display: none; + } + .navbar-item, + .navbar-link { + align-items: center; + display: flex; + } + .navbar-item { + display: flex; + } + .navbar-item.has-dropdown { + align-items: stretch; + } + .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); + } + .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 2px solid #dbdbdb; + border-radius: 6px 6px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(0,0,0,0.1); + top: auto; + } + .navbar-item.is-active .navbar-dropdown, + .navbar-item.is-hoverable:focus .navbar-dropdown, + .navbar-item.is-hoverable:focus-within .navbar-dropdown, + .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; + } + .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, + .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, + .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, + .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, + .navbar-item.is-active .navbar-dropdown.is-boxed, + .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, + .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, + .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); + } + .navbar-menu { + flex-grow: 1; + flex-shrink: 0; + } + .navbar-start { + justify-content: flex-start; + margin-right: auto; + } + .navbar-end { + justify-content: flex-end; + margin-left: auto; + } + .navbar-dropdown { + background-color: #000; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 2px solid #dbdbdb; + box-shadow: 0 8px 8px rgba(0,0,0,0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; + } + .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; + } + .navbar-dropdown a.navbar-item { + padding-right: 3rem; + } + .navbar-dropdown a.navbar-item:focus, + .navbar-dropdown a.navbar-item:hover { + background-color: #f5f5f5; + color: #000; + } + .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: #02d7f2; + } + .navbar.is-spaced .navbar-dropdown, + .navbar-dropdown.is-boxed { + border-radius: 6px; + border-top: none; + box-shadow: 0 8px 8px rgba(0,0,0,0.1), 0 0 0 1px rgba(0,0,0,0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + -4px); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; + } + .navbar-dropdown.is-right { + left: auto; + right: 0; + } + .navbar-divider { + display: block; + } + .navbar > .container .navbar-brand, + .container > .navbar .navbar-brand { + margin-left: -0.75rem; + } + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: -0.75rem; + } + .navbar.is-fixed-bottom-desktop, + .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; + } + .navbar.is-fixed-bottom-desktop { + bottom: 0; + } + .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(0,0,0,0.1); + } + .navbar.is-fixed-top-desktop { + top: 0; + } + html.has-navbar-fixed-top-desktop, + body.has-navbar-fixed-top-desktop { + padding-top: 3.25rem; + } + html.has-navbar-fixed-bottom-desktop, + body.has-navbar-fixed-bottom-desktop { + padding-bottom: 3.25rem; + } + html.has-spaced-navbar-fixed-top, + body.has-spaced-navbar-fixed-top { + padding-top: 5.25rem; + } + html.has-spaced-navbar-fixed-bottom, + body.has-spaced-navbar-fixed-bottom { + padding-bottom: 5.25rem; + } + a.navbar-item.is-active, + .navbar-link.is-active { + color: #000; + } + a.navbar-item.is-active:not(:focus):not(:hover), + .navbar-link.is-active:not(:focus):not(:hover) { + background-color: transparent; + } + .navbar-item.has-dropdown:focus .navbar-link, + .navbar-item.has-dropdown:hover .navbar-link, + .navbar-item.has-dropdown.is-active .navbar-link { + background-color: transparent; + } +} +.hero.is-fullheight-with-navbar { + min-height: calc(100vh - 3.25rem); +} +.pagination { + font-size: 1rem; + margin: -0.25rem; +} +.pagination.is-small { + font-size: 0.75rem; +} +.pagination.is-medium { + font-size: 1.25rem; +} +.pagination.is-large { + font-size: 1.5rem; +} +.pagination.is-rounded .pagination-previous, +.pagination.is-rounded .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 290486px; +} +.pagination.is-rounded .pagination-link { + border-radius: 290486px; +} +.pagination, +.pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; +} +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; +} +.pagination-previous, +.pagination-next, +.pagination-link { + border-color: #dbdbdb; + color: #fcee09; + min-width: 2.25em; +} +.pagination-previous:hover, +.pagination-next:hover, +.pagination-link:hover { + border-color: #b5b5b5; + color: #fcee09; +} +.pagination-previous:focus, +.pagination-next:focus, +.pagination-link:focus { + border-color: #02d7f2; +} +.pagination-previous:active, +.pagination-next:active, +.pagination-link:active { + box-shadow: inset 0 1px 2px rgba(0,0,0,0.2); +} +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled] { + background-color: #dbdbdb; + border-color: #dbdbdb; + box-shadow: none; + color: #848484; + opacity: 0.5; +} +.pagination-previous, +.pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} +.pagination-link.is-current { + background-color: #02d7f2; + border-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.pagination-ellipsis { + color: #b5b5b5; + pointer-events: none; +} +.pagination-list { + flex-wrap: wrap; +} +@media screen and (max-width: 768px) { + .pagination { + flex-wrap: wrap; + } + .pagination-previous, + .pagination-next { + flex-grow: 1; + flex-shrink: 1; + } + .pagination-list li { + flex-grow: 1; + flex-shrink: 1; + } +} +@media screen and (min-width: 769px), print { + .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; + } + .pagination-previous { + order: 2; + } + .pagination-next { + order: 3; + } + .pagination { + justify-content: space-between; + } + .pagination.is-centered .pagination-previous, + .pagination .pagination-previous { + order: 1; + } + .pagination.is-centered .pagination-list, + .pagination .pagination-list { + justify-content: center; + order: 2; + } + .pagination.is-centered .pagination-next, + .pagination .pagination-next { + order: 3; + } + .pagination.is-right .pagination-previous { + order: 1; + } + .pagination.is-right .pagination-next { + order: 2; + } + .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; + } +} +.panel { + border-radius: 6px; + box-shadow: 0 0.5em 1em -0.125em rgba(0,0,0,0.1), 0 0px 0 1px rgba(0,0,0,0.02); + font-size: 1rem; +} +.panel:not(:last-child) { + margin-bottom: 1.5rem; +} +.panel.is-white .panel-heading { + background-color: #fff; + color: #000; +} +.panel.is-white .panel-tabs a.is-active { + border-bottom-color: #fff; +} +.panel.is-white .panel-block.is-active .panel-icon { + color: #fff; +} +.panel.is-black .panel-heading { + background-color: #000; + color: #fff; +} +.panel.is-black .panel-tabs a.is-active { + border-bottom-color: #000; +} +.panel.is-black .panel-block.is-active .panel-icon { + color: #000; +} +.panel.is-light .panel-heading { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.panel.is-light .panel-tabs a.is-active { + border-bottom-color: #f5f5f5; +} +.panel.is-light .panel-block.is-active .panel-icon { + color: #f5f5f5; +} +.panel.is-dark .panel-heading { + background-color: #363636; + color: #fff; +} +.panel.is-dark .panel-tabs a.is-active { + border-bottom-color: #363636; +} +.panel.is-dark .panel-block.is-active .panel-icon { + color: #363636; +} +.panel.is-primary .panel-heading { + background-color: #fcee09; + color: #121617; +} +.panel.is-primary .panel-tabs a.is-active { + border-bottom-color: #fcee09; +} +.panel.is-primary .panel-block.is-active .panel-icon { + color: #fcee09; +} +.panel.is-link .panel-heading { + background-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.panel.is-link .panel-tabs a.is-active { + border-bottom-color: #02d7f2; +} +.panel.is-link .panel-block.is-active .panel-icon { + color: #02d7f2; +} +.panel.is-info .panel-heading { + background-color: #02d7f2; + color: #121617; +} +.panel.is-info .panel-tabs a.is-active { + border-bottom-color: #02d7f2; +} +.panel.is-info .panel-block.is-active .panel-icon { + color: #02d7f2; +} +.panel.is-success .panel-heading { + background-color: #00ff41; + color: #121617; +} +.panel.is-success .panel-tabs a.is-active { + border-bottom-color: #00ff41; +} +.panel.is-success .panel-block.is-active .panel-icon { + color: #00ff41; +} +.panel.is-warning .panel-heading { + background-color: #ff8e3c; + color: #121617; +} +.panel.is-warning .panel-tabs a.is-active { + border-bottom-color: #ff8e3c; +} +.panel.is-warning .panel-block.is-active .panel-icon { + color: #ff8e3c; +} +.panel.is-danger .panel-heading { + background-color: #ff003c; + color: #121617; +} +.panel.is-danger .panel-tabs a.is-active { + border-bottom-color: #ff003c; +} +.panel.is-danger .panel-block.is-active .panel-icon { + color: #ff003c; +} +.panel.is-grey-lightest .panel-heading { + background-color: #ededed; + color: #363636; +} +.panel.is-grey-lightest .panel-tabs a.is-active { + border-bottom-color: #ededed; +} +.panel.is-grey-lightest .panel-block.is-active .panel-icon { + color: #ededed; +} +.panel-tabs:not(:last-child), +.panel-block:not(:last-child) { + border-bottom: 1px solid #ededed; +} +.panel-heading { + background-color: #ededed; + border-radius: 6px 6px 0 0; + color: #fcee09; + font-size: 1.25em; + font-weight: 700; + line-height: 1.25; + padding: 0.75em 1em; +} +.panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; +} +.panel-tabs a { + border-bottom: 1px solid #dbdbdb; + margin-bottom: -1px; + padding: 0.5em; +} +.panel-tabs a.is-active { + border-bottom-color: #4a4a4a; + color: #363636; +} +.panel-list a { + color: #cdcdcd; +} +.panel-list a:hover { + color: #02d7f2; +} +.panel-block { + align-items: center; + color: #fcee09; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; +} +.panel-block input[type="checkbox"] { + margin-right: 0.75em; +} +.panel-block > .control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; +} +.panel-block.is-wrapped { + flex-wrap: wrap; +} +.panel-block.is-active { + border-left-color: #02d7f2; + color: #363636; +} +.panel-block.is-active .panel-icon { + color: #02d7f2; +} +.panel-block:last-child { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +a.panel-block, +label.panel-block { + cursor: pointer; +} +a.panel-block:hover, +label.panel-block:hover { + background-color: #f5f5f5; +} +.panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: #848484; + margin-right: 0.75em; +} +.panel-icon .fa { + font-size: inherit; + line-height: inherit; +} +.tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 1rem; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; +} +.tabs a { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #cdcdcd; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; +} +.tabs a:hover { + border-bottom-color: #fcee09; + color: #fcee09; +} +.tabs li { + display: block; +} +.tabs li.is-active a { + border-bottom-color: #02d7f2; + color: #02d7f2; +} +.tabs ul { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; +} +.tabs ul.is-left { + padding-right: 0.75em; +} +.tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; +} +.tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; +} +.tabs .icon:first-child { + margin-right: 0.5em; +} +.tabs .icon:last-child { + margin-left: 0.5em; +} +.tabs.is-centered ul { + justify-content: center; +} +.tabs.is-right ul { + justify-content: flex-end; +} +.tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 0 0 0 0; +} +.tabs.is-boxed a:hover { + background-color: #f5f5f5; + border-bottom-color: #dbdbdb; +} +.tabs.is-boxed li.is-active a { + background-color: #000; + border-color: #dbdbdb; + border-bottom-color: transparent !important; +} +.tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; +} +.tabs.is-toggle a { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; +} +.tabs.is-toggle a:hover { + background-color: #f5f5f5; + border-color: #b5b5b5; + z-index: 2; +} +.tabs.is-toggle li + li { + margin-left: -1px; +} +.tabs.is-toggle li:first-child a { + border-radius: 0 0 0 0; +} +.tabs.is-toggle li:last-child a { + border-radius: 0 0 0 0; +} +.tabs.is-toggle li.is-active a { + background-color: #02d7f2; + border-color: #02d7f2; + color: rgba(0,0,0,0.7); + z-index: 1; +} +.tabs.is-toggle ul { + border-bottom: none; +} +.tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 290486px; + border-top-left-radius: 290486px; + padding-left: 1.25em; +} +.tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 290486px; + border-top-right-radius: 290486px; + padding-right: 1.25em; +} +.tabs.is-small { + font-size: 0.75rem; +} +.tabs.is-medium { + font-size: 1.25rem; +} +.tabs.is-large { + font-size: 1.5rem; +} +.box { + background-color: #000; + border-radius: 6px; + box-shadow: 0 0.5em 1em -0.125em rgba(0,0,0,0.1), 0 0px 0 1px rgba(0,0,0,0.02); + color: #cdcdcd; + display: block; + padding: 1.25rem; +} +a.box:hover, +a.box:focus { + box-shadow: 0 0.5em 1em -0.125em rgba(0,0,0,0.1), 0 0 0 1px #02d7f2; +} +a.box:active { + box-shadow: inset 0 1px 2px rgba(0,0,0,0.2), 0 0 0 1px #02d7f2; +} +.button { + background-color: #000; + border-color: #dbdbdb; + border-width: 1px; + color: #fcee09; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.375em - 1px); + padding-left: 1em; + padding-right: 1em; + padding-top: calc(0.375em - 1px); + text-align: center; + white-space: nowrap; +} +.button strong { + color: inherit; +} +.button .icon, +.button .icon.is-small, +.button .icon.is-medium, +.button .icon.is-large { + height: 1.5em; + width: 1.5em; +} +.button .icon:first-child:not(:last-child) { + margin-left: calc(-0.5em - 1px); + margin-right: 0.25em; +} +.button .icon:last-child:not(:first-child) { + margin-left: 0.25em; + margin-right: calc(-0.5em - 1px); +} +.button .icon:first-child:last-child { + margin-left: calc(-0.5em - 1px); + margin-right: calc(-0.5em - 1px); +} +.button:hover, +.button.is-hovered { + border-color: #b5b5b5; + color: #fcee09; +} +.button:focus, +.button.is-focused { + border-color: #02d7f2; + color: #363636; +} +.button:focus:not(:active), +.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(2,215,242,0.25); +} +.button:active, +.button.is-active { + border-color: #4a4a4a; + color: #363636; +} +.button.is-text { + background-color: transparent; + border-color: transparent; + color: #cdcdcd; + text-decoration: underline; +} +.button.is-text:hover, +.button.is-text.is-hovered, +.button.is-text:focus, +.button.is-text.is-focused { + background-color: #f5f5f5; + color: #fcee09; +} +.button.is-text:active, +.button.is-text.is-active { + background-color: #e8e8e8; + color: #fcee09; +} +.button.is-text[disabled], +fieldset[disabled] .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; +} +.button.is-white { + background-color: #fff; + border-color: transparent; + color: #000; +} +.button.is-white:hover, +.button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #000; +} +.button.is-white:focus, +.button.is-white.is-focused { + border-color: transparent; + color: #000; +} +.button.is-white:focus:not(:active), +.button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,255,255,0.25); +} +.button.is-white:active, +.button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #000; +} +.button.is-white[disabled], +fieldset[disabled] .button.is-white { + background-color: #fff; + border-color: transparent; + box-shadow: none; +} +.button.is-white.is-inverted { + background-color: #000; + color: #fff; +} +.button.is-white.is-inverted:hover, +.button.is-white.is-inverted.is-hovered { + background-color: #000; +} +.button.is-white.is-inverted[disabled], +fieldset[disabled] .button.is-white.is-inverted { + background-color: #000; + border-color: transparent; + box-shadow: none; + color: #fff; +} +.button.is-white.is-loading::after { + border-color: transparent transparent #000 #000 !important; +} +.button.is-white.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-white.is-outlined:hover, +.button.is-white.is-outlined.is-hovered, +.button.is-white.is-outlined:focus, +.button.is-white.is-outlined.is-focused { + background-color: #fff; + border-color: #fff; + color: #000; +} +.button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-white.is-outlined.is-loading:hover::after, +.button.is-white.is-outlined.is-loading.is-hovered::after, +.button.is-white.is-outlined.is-loading:focus::after, +.button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #000 #000 !important; +} +.button.is-white.is-outlined[disabled], +fieldset[disabled] .button.is-white.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #000; + color: #000; +} +.button.is-white.is-inverted.is-outlined:hover, +.button.is-white.is-inverted.is-outlined.is-hovered, +.button.is-white.is-inverted.is-outlined:focus, +.button.is-white.is-inverted.is-outlined.is-focused { + background-color: #000; + color: #fff; +} +.button.is-white.is-inverted.is-outlined.is-loading:hover::after, +.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-white.is-inverted.is-outlined.is-loading:focus::after, +.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-white.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #000; + box-shadow: none; + color: #000; +} +.button.is-black { + background-color: #000; + border-color: transparent; + color: #fff; +} +.button.is-black:hover, +.button.is-black.is-hovered { + background-color: #000; + border-color: transparent; + color: #fff; +} +.button.is-black:focus, +.button.is-black.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-black:focus:not(:active), +.button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0,0,0,0.25); +} +.button.is-black:active, +.button.is-black.is-active { + background-color: #000; + border-color: transparent; + color: #fff; +} +.button.is-black[disabled], +fieldset[disabled] .button.is-black { + background-color: #000; + border-color: transparent; + box-shadow: none; +} +.button.is-black.is-inverted { + background-color: #fff; + color: #000; +} +.button.is-black.is-inverted:hover, +.button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-black.is-inverted[disabled], +fieldset[disabled] .button.is-black.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #000; +} +.button.is-black.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-black.is-outlined { + background-color: transparent; + border-color: #000; + color: #000; +} +.button.is-black.is-outlined:hover, +.button.is-black.is-outlined.is-hovered, +.button.is-black.is-outlined:focus, +.button.is-black.is-outlined.is-focused { + background-color: #000; + border-color: #000; + color: #fff; +} +.button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #000 #000 !important; +} +.button.is-black.is-outlined.is-loading:hover::after, +.button.is-black.is-outlined.is-loading.is-hovered::after, +.button.is-black.is-outlined.is-loading:focus::after, +.button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-black.is-outlined[disabled], +fieldset[disabled] .button.is-black.is-outlined { + background-color: transparent; + border-color: #000; + box-shadow: none; + color: #000; +} +.button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-black.is-inverted.is-outlined:hover, +.button.is-black.is-inverted.is-outlined.is-hovered, +.button.is-black.is-inverted.is-outlined:focus, +.button.is-black.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #000; +} +.button.is-black.is-inverted.is-outlined.is-loading:hover::after, +.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-black.is-inverted.is-outlined.is-loading:focus::after, +.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #000 #000 !important; +} +.button.is-black.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-light, +article.article .article-more { + background-color: #f5f5f5; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light:hover, +article.article .article-more:hover, +.button.is-light.is-hovered, +article.article .article-more.is-hovered { + background-color: #eee; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light:focus, +article.article .article-more:focus, +.button.is-light.is-focused, +article.article .article-more.is-focused { + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light:focus:not(:active), +article.article .article-more:focus:not(:active), +.button.is-light.is-focused:not(:active), +article.article .article-more.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(245,245,245,0.25); +} +.button.is-light:active, +article.article .article-more:active, +.button.is-light.is-active, +article.article .article-more.is-active { + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light[disabled], +article.article .article-more[disabled], +fieldset[disabled] .button.is-light, +fieldset[disabled] article.article .article-more { + background-color: #f5f5f5; + border-color: transparent; + box-shadow: none; +} +.button.is-light.is-inverted, +article.article .article-more.is-inverted { + background-color: rgba(0,0,0,0.7); + color: #f5f5f5; +} +.button.is-light.is-inverted:hover, +article.article .article-more.is-inverted:hover, +.button.is-light.is-inverted.is-hovered, +article.article .article-more.is-inverted.is-hovered { + background-color: rgba(0,0,0,0.7); +} +.button.is-light.is-inverted[disabled], +article.article .article-more.is-inverted[disabled], +fieldset[disabled] .button.is-light.is-inverted, +fieldset[disabled] article.article .article-more.is-inverted { + background-color: rgba(0,0,0,0.7); + border-color: transparent; + box-shadow: none; + color: #f5f5f5; +} +.button.is-light.is-loading::after, +article.article .article-more.is-loading::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-light.is-outlined, +article.article .article-more.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + color: #f5f5f5; +} +.button.is-light.is-outlined:hover, +article.article .article-more.is-outlined:hover, +.button.is-light.is-outlined.is-hovered, +article.article .article-more.is-outlined.is-hovered, +.button.is-light.is-outlined:focus, +article.article .article-more.is-outlined:focus, +.button.is-light.is-outlined.is-focused, +article.article .article-more.is-outlined.is-focused { + background-color: #f5f5f5; + border-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.button.is-light.is-outlined.is-loading::after, +article.article .article-more.is-outlined.is-loading::after { + border-color: transparent transparent #f5f5f5 #f5f5f5 !important; +} +.button.is-light.is-outlined.is-loading:hover::after, +article.article .article-more.is-outlined.is-loading:hover::after, +.button.is-light.is-outlined.is-loading.is-hovered::after, +article.article .article-more.is-outlined.is-loading.is-hovered::after, +.button.is-light.is-outlined.is-loading:focus::after, +article.article .article-more.is-outlined.is-loading:focus::after, +.button.is-light.is-outlined.is-loading.is-focused::after, +article.article .article-more.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-light.is-outlined[disabled], +article.article .article-more.is-outlined[disabled], +fieldset[disabled] .button.is-light.is-outlined, +fieldset[disabled] article.article .article-more.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + box-shadow: none; + color: #f5f5f5; +} +.button.is-light.is-inverted.is-outlined, +article.article .article-more.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + color: rgba(0,0,0,0.7); +} +.button.is-light.is-inverted.is-outlined:hover, +article.article .article-more.is-inverted.is-outlined:hover, +.button.is-light.is-inverted.is-outlined.is-hovered, +article.article .article-more.is-inverted.is-outlined.is-hovered, +.button.is-light.is-inverted.is-outlined:focus, +article.article .article-more.is-inverted.is-outlined:focus, +.button.is-light.is-inverted.is-outlined.is-focused, +article.article .article-more.is-inverted.is-outlined.is-focused { + background-color: rgba(0,0,0,0.7); + color: #f5f5f5; +} +.button.is-light.is-inverted.is-outlined.is-loading:hover::after, +article.article .article-more.is-inverted.is-outlined.is-loading:hover::after, +.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, +article.article .article-more.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-light.is-inverted.is-outlined.is-loading:focus::after, +article.article .article-more.is-inverted.is-outlined.is-loading:focus::after, +.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after, +article.article .article-more.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #f5f5f5 #f5f5f5 !important; +} +.button.is-light.is-inverted.is-outlined[disabled], +article.article .article-more.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-light.is-inverted.is-outlined, +fieldset[disabled] article.article .article-more.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + box-shadow: none; + color: rgba(0,0,0,0.7); +} +.button.is-dark { + background-color: #363636; + border-color: transparent; + color: #fff; +} +.button.is-dark:hover, +.button.is-dark.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: #fff; +} +.button.is-dark:focus, +.button.is-dark.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-dark:focus:not(:active), +.button.is-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(54,54,54,0.25); +} +.button.is-dark:active, +.button.is-dark.is-active { + background-color: #292929; + border-color: transparent; + color: #fff; +} +.button.is-dark[disabled], +fieldset[disabled] .button.is-dark { + background-color: #363636; + border-color: transparent; + box-shadow: none; +} +.button.is-dark.is-inverted { + background-color: #fff; + color: #363636; +} +.button.is-dark.is-inverted:hover, +.button.is-dark.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-dark.is-inverted[disabled], +fieldset[disabled] .button.is-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #363636; +} +.button.is-dark.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} +.button.is-dark.is-outlined:hover, +.button.is-dark.is-outlined.is-hovered, +.button.is-dark.is-outlined:focus, +.button.is-dark.is-outlined.is-focused { + background-color: #363636; + border-color: #363636; + color: #fff; +} +.button.is-dark.is-outlined.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-dark.is-outlined.is-loading:hover::after, +.button.is-dark.is-outlined.is-loading.is-hovered::after, +.button.is-dark.is-outlined.is-loading:focus::after, +.button.is-dark.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-dark.is-outlined[disabled], +fieldset[disabled] .button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; +} +.button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-dark.is-inverted.is-outlined:hover, +.button.is-dark.is-inverted.is-outlined.is-hovered, +.button.is-dark.is-inverted.is-outlined:focus, +.button.is-dark.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #363636; +} +.button.is-dark.is-inverted.is-outlined.is-loading:hover::after, +.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-dark.is-inverted.is-outlined.is-loading:focus::after, +.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-dark.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-primary { + background-color: #fcee09; + border-color: transparent; + color: #121617; +} +.button.is-primary:hover, +.button.is-primary.is-hovered { + background-color: #f5e703; + border-color: transparent; + color: #121617; +} +.button.is-primary:focus, +.button.is-primary.is-focused { + border-color: transparent; + color: #121617; +} +.button.is-primary:focus:not(:active), +.button.is-primary.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(252,238,9,0.25); +} +.button.is-primary:active, +.button.is-primary.is-active { + background-color: #e9db03; + border-color: transparent; + color: #121617; +} +.button.is-primary[disabled], +fieldset[disabled] .button.is-primary { + background-color: #fcee09; + border-color: transparent; + box-shadow: none; +} +.button.is-primary.is-inverted { + background-color: #121617; + color: #fcee09; +} +.button.is-primary.is-inverted:hover, +.button.is-primary.is-inverted.is-hovered { + background-color: #070809; +} +.button.is-primary.is-inverted[disabled], +fieldset[disabled] .button.is-primary.is-inverted { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #fcee09; +} +.button.is-primary.is-loading::after { + border-color: transparent transparent #121617 #121617 !important; +} +.button.is-primary.is-outlined { + background-color: transparent; + border-color: #fcee09; + color: #fcee09; +} +.button.is-primary.is-outlined:hover, +.button.is-primary.is-outlined.is-hovered, +.button.is-primary.is-outlined:focus, +.button.is-primary.is-outlined.is-focused { + background-color: #fcee09; + border-color: #fcee09; + color: #121617; +} +.button.is-primary.is-outlined.is-loading::after { + border-color: transparent transparent #fcee09 #fcee09 !important; +} +.button.is-primary.is-outlined.is-loading:hover::after, +.button.is-primary.is-outlined.is-loading.is-hovered::after, +.button.is-primary.is-outlined.is-loading:focus::after, +.button.is-primary.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #121617 #121617 !important; +} +.button.is-primary.is-outlined[disabled], +fieldset[disabled] .button.is-primary.is-outlined { + background-color: transparent; + border-color: #fcee09; + box-shadow: none; + color: #fcee09; +} +.button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #121617; + color: #121617; +} +.button.is-primary.is-inverted.is-outlined:hover, +.button.is-primary.is-inverted.is-outlined.is-hovered, +.button.is-primary.is-inverted.is-outlined:focus, +.button.is-primary.is-inverted.is-outlined.is-focused { + background-color: #121617; + color: #fcee09; +} +.button.is-primary.is-inverted.is-outlined.is-loading:hover::after, +.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-primary.is-inverted.is-outlined.is-loading:focus::after, +.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fcee09 #fcee09 !important; +} +.button.is-primary.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #121617; + box-shadow: none; + color: #121617; +} +.button.is-primary.is-light { + background-color: #fffeeb; + color: #928a02; +} +.button.is-primary.is-light:hover, +.button.is-primary.is-light.is-hovered { + background-color: #fffdde; + border-color: transparent; + color: #928a02; +} +.button.is-primary.is-light:active, +.button.is-primary.is-light.is-active { + background-color: #fefcd2; + border-color: transparent; + color: #928a02; +} +.button.is-link { + background-color: #02d7f2; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-link:hover, +.button.is-link.is-hovered { + background-color: #02cce5; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-link:focus, +.button.is-link.is-focused { + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-link:focus:not(:active), +.button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(2,215,242,0.25); +} +.button.is-link:active, +.button.is-link.is-active { + background-color: #02c1d9; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-link[disabled], +fieldset[disabled] .button.is-link { + background-color: #02d7f2; + border-color: transparent; + box-shadow: none; +} +.button.is-link.is-inverted { + background-color: rgba(0,0,0,0.7); + color: #02d7f2; +} +.button.is-link.is-inverted:hover, +.button.is-link.is-inverted.is-hovered { + background-color: rgba(0,0,0,0.7); +} +.button.is-link.is-inverted[disabled], +fieldset[disabled] .button.is-link.is-inverted { + background-color: rgba(0,0,0,0.7); + border-color: transparent; + box-shadow: none; + color: #02d7f2; +} +.button.is-link.is-loading::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-link.is-outlined { + background-color: transparent; + border-color: #02d7f2; + color: #02d7f2; +} +.button.is-link.is-outlined:hover, +.button.is-link.is-outlined.is-hovered, +.button.is-link.is-outlined:focus, +.button.is-link.is-outlined.is-focused { + background-color: #02d7f2; + border-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #02d7f2 #02d7f2 !important; +} +.button.is-link.is-outlined.is-loading:hover::after, +.button.is-link.is-outlined.is-loading.is-hovered::after, +.button.is-link.is-outlined.is-loading:focus::after, +.button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-link.is-outlined[disabled], +fieldset[disabled] .button.is-link.is-outlined { + background-color: transparent; + border-color: #02d7f2; + box-shadow: none; + color: #02d7f2; +} +.button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + color: rgba(0,0,0,0.7); +} +.button.is-link.is-inverted.is-outlined:hover, +.button.is-link.is-inverted.is-outlined.is-hovered, +.button.is-link.is-inverted.is-outlined:focus, +.button.is-link.is-inverted.is-outlined.is-focused { + background-color: rgba(0,0,0,0.7); + color: #02d7f2; +} +.button.is-link.is-inverted.is-outlined.is-loading:hover::after, +.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-link.is-inverted.is-outlined.is-loading:focus::after, +.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #02d7f2 #02d7f2 !important; +} +.button.is-link.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + box-shadow: none; + color: rgba(0,0,0,0.7); +} +.button.is-link.is-light { + background-color: #ebfdff; + color: #018293; +} +.button.is-link.is-light:hover, +.button.is-link.is-light.is-hovered { + background-color: #defbff; + border-color: transparent; + color: #018293; +} +.button.is-link.is-light:active, +.button.is-link.is-light.is-active { + background-color: #d1faff; + border-color: transparent; + color: #018293; +} +.button.is-info { + background-color: #02d7f2; + border-color: transparent; + color: #121617; +} +.button.is-info:hover, +.button.is-info.is-hovered { + background-color: #02cce5; + border-color: transparent; + color: #121617; +} +.button.is-info:focus, +.button.is-info.is-focused { + border-color: transparent; + color: #121617; +} +.button.is-info:focus:not(:active), +.button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(2,215,242,0.25); +} +.button.is-info:active, +.button.is-info.is-active { + background-color: #02c1d9; + border-color: transparent; + color: #121617; +} +.button.is-info[disabled], +fieldset[disabled] .button.is-info { + background-color: #02d7f2; + border-color: transparent; + box-shadow: none; +} +.button.is-info.is-inverted { + background-color: #121617; + color: #02d7f2; +} +.button.is-info.is-inverted:hover, +.button.is-info.is-inverted.is-hovered { + background-color: #070809; +} +.button.is-info.is-inverted[disabled], +fieldset[disabled] .button.is-info.is-inverted { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #02d7f2; +} +.button.is-info.is-loading::after { + border-color: transparent transparent #121617 #121617 !important; +} +.button.is-info.is-outlined { + background-color: transparent; + border-color: #02d7f2; + color: #02d7f2; +} +.button.is-info.is-outlined:hover, +.button.is-info.is-outlined.is-hovered, +.button.is-info.is-outlined:focus, +.button.is-info.is-outlined.is-focused { + background-color: #02d7f2; + border-color: #02d7f2; + color: #121617; +} +.button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #02d7f2 #02d7f2 !important; +} +.button.is-info.is-outlined.is-loading:hover::after, +.button.is-info.is-outlined.is-loading.is-hovered::after, +.button.is-info.is-outlined.is-loading:focus::after, +.button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #121617 #121617 !important; +} +.button.is-info.is-outlined[disabled], +fieldset[disabled] .button.is-info.is-outlined { + background-color: transparent; + border-color: #02d7f2; + box-shadow: none; + color: #02d7f2; +} +.button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #121617; + color: #121617; +} +.button.is-info.is-inverted.is-outlined:hover, +.button.is-info.is-inverted.is-outlined.is-hovered, +.button.is-info.is-inverted.is-outlined:focus, +.button.is-info.is-inverted.is-outlined.is-focused { + background-color: #121617; + color: #02d7f2; +} +.button.is-info.is-inverted.is-outlined.is-loading:hover::after, +.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-info.is-inverted.is-outlined.is-loading:focus::after, +.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #02d7f2 #02d7f2 !important; +} +.button.is-info.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #121617; + box-shadow: none; + color: #121617; +} +.button.is-info.is-light { + background-color: #ebfdff; + color: #018293; +} +.button.is-info.is-light:hover, +.button.is-info.is-light.is-hovered { + background-color: #defbff; + border-color: transparent; + color: #018293; +} +.button.is-info.is-light:active, +.button.is-info.is-light.is-active { + background-color: #d1faff; + border-color: transparent; + color: #018293; +} +.button.is-success { + background-color: #00ff41; + border-color: transparent; + color: #121617; +} +.button.is-success:hover, +.button.is-success.is-hovered { + background-color: #00f23e; + border-color: transparent; + color: #121617; +} +.button.is-success:focus, +.button.is-success.is-focused { + border-color: transparent; + color: #121617; +} +.button.is-success:focus:not(:active), +.button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0,255,65,0.25); +} +.button.is-success:active, +.button.is-success.is-active { + background-color: #00e63a; + border-color: transparent; + color: #121617; +} +.button.is-success[disabled], +fieldset[disabled] .button.is-success { + background-color: #00ff41; + border-color: transparent; + box-shadow: none; +} +.button.is-success.is-inverted { + background-color: #121617; + color: #00ff41; +} +.button.is-success.is-inverted:hover, +.button.is-success.is-inverted.is-hovered { + background-color: #070809; +} +.button.is-success.is-inverted[disabled], +fieldset[disabled] .button.is-success.is-inverted { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #00ff41; +} +.button.is-success.is-loading::after { + border-color: transparent transparent #121617 #121617 !important; +} +.button.is-success.is-outlined { + background-color: transparent; + border-color: #00ff41; + color: #00ff41; +} +.button.is-success.is-outlined:hover, +.button.is-success.is-outlined.is-hovered, +.button.is-success.is-outlined:focus, +.button.is-success.is-outlined.is-focused { + background-color: #00ff41; + border-color: #00ff41; + color: #121617; +} +.button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #00ff41 #00ff41 !important; +} +.button.is-success.is-outlined.is-loading:hover::after, +.button.is-success.is-outlined.is-loading.is-hovered::after, +.button.is-success.is-outlined.is-loading:focus::after, +.button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #121617 #121617 !important; +} +.button.is-success.is-outlined[disabled], +fieldset[disabled] .button.is-success.is-outlined { + background-color: transparent; + border-color: #00ff41; + box-shadow: none; + color: #00ff41; +} +.button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #121617; + color: #121617; +} +.button.is-success.is-inverted.is-outlined:hover, +.button.is-success.is-inverted.is-outlined.is-hovered, +.button.is-success.is-inverted.is-outlined:focus, +.button.is-success.is-inverted.is-outlined.is-focused { + background-color: #121617; + color: #00ff41; +} +.button.is-success.is-inverted.is-outlined.is-loading:hover::after, +.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-success.is-inverted.is-outlined.is-loading:focus::after, +.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #00ff41 #00ff41 !important; +} +.button.is-success.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #121617; + box-shadow: none; + color: #121617; +} +.button.is-success.is-light { + background-color: #ebfff0; + color: #009426; +} +.button.is-success.is-light:hover, +.button.is-success.is-light.is-hovered { + background-color: #deffe6; + border-color: transparent; + color: #009426; +} +.button.is-success.is-light:active, +.button.is-success.is-light.is-active { + background-color: #d1ffdd; + border-color: transparent; + color: #009426; +} +.button.is-warning { + background-color: #ff8e3c; + border-color: transparent; + color: #121617; +} +.button.is-warning:hover, +.button.is-warning.is-hovered { + background-color: #ff872f; + border-color: transparent; + color: #121617; +} +.button.is-warning:focus, +.button.is-warning.is-focused { + border-color: transparent; + color: #121617; +} +.button.is-warning:focus:not(:active), +.button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,142,60,0.25); +} +.button.is-warning:active, +.button.is-warning.is-active { + background-color: #ff7f22; + border-color: transparent; + color: #121617; +} +.button.is-warning[disabled], +fieldset[disabled] .button.is-warning { + background-color: #ff8e3c; + border-color: transparent; + box-shadow: none; +} +.button.is-warning.is-inverted { + background-color: #121617; + color: #ff8e3c; +} +.button.is-warning.is-inverted:hover, +.button.is-warning.is-inverted.is-hovered { + background-color: #070809; +} +.button.is-warning.is-inverted[disabled], +fieldset[disabled] .button.is-warning.is-inverted { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #ff8e3c; +} +.button.is-warning.is-loading::after { + border-color: transparent transparent #121617 #121617 !important; +} +.button.is-warning.is-outlined { + background-color: transparent; + border-color: #ff8e3c; + color: #ff8e3c; +} +.button.is-warning.is-outlined:hover, +.button.is-warning.is-outlined.is-hovered, +.button.is-warning.is-outlined:focus, +.button.is-warning.is-outlined.is-focused { + background-color: #ff8e3c; + border-color: #ff8e3c; + color: #121617; +} +.button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ff8e3c #ff8e3c !important; +} +.button.is-warning.is-outlined.is-loading:hover::after, +.button.is-warning.is-outlined.is-loading.is-hovered::after, +.button.is-warning.is-outlined.is-loading:focus::after, +.button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #121617 #121617 !important; +} +.button.is-warning.is-outlined[disabled], +fieldset[disabled] .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ff8e3c; + box-shadow: none; + color: #ff8e3c; +} +.button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: #121617; + color: #121617; +} +.button.is-warning.is-inverted.is-outlined:hover, +.button.is-warning.is-inverted.is-outlined.is-hovered, +.button.is-warning.is-inverted.is-outlined:focus, +.button.is-warning.is-inverted.is-outlined.is-focused { + background-color: #121617; + color: #ff8e3c; +} +.button.is-warning.is-inverted.is-outlined.is-loading:hover::after, +.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-warning.is-inverted.is-outlined.is-loading:focus::after, +.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ff8e3c #ff8e3c !important; +} +.button.is-warning.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: #121617; + box-shadow: none; + color: #121617; +} +.button.is-warning.is-light { + background-color: #fff3eb; + color: #a84700; +} +.button.is-warning.is-light:hover, +.button.is-warning.is-light.is-hovered { + background-color: #ffecde; + border-color: transparent; + color: #a84700; +} +.button.is-warning.is-light:active, +.button.is-warning.is-light.is-active { + background-color: #ffe4d1; + border-color: transparent; + color: #a84700; +} +.button.is-danger { + background-color: #ff003c; + border-color: transparent; + color: #121617; +} +.button.is-danger:hover, +.button.is-danger.is-hovered { + background-color: #f20039; + border-color: transparent; + color: #121617; +} +.button.is-danger:focus, +.button.is-danger.is-focused { + border-color: transparent; + color: #121617; +} +.button.is-danger:focus:not(:active), +.button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,0,60,0.25); +} +.button.is-danger:active, +.button.is-danger.is-active { + background-color: #e60036; + border-color: transparent; + color: #121617; +} +.button.is-danger[disabled], +fieldset[disabled] .button.is-danger { + background-color: #ff003c; + border-color: transparent; + box-shadow: none; +} +.button.is-danger.is-inverted { + background-color: #121617; + color: #ff003c; +} +.button.is-danger.is-inverted:hover, +.button.is-danger.is-inverted.is-hovered { + background-color: #070809; +} +.button.is-danger.is-inverted[disabled], +fieldset[disabled] .button.is-danger.is-inverted { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #ff003c; +} +.button.is-danger.is-loading::after { + border-color: transparent transparent #121617 #121617 !important; +} +.button.is-danger.is-outlined { + background-color: transparent; + border-color: #ff003c; + color: #ff003c; +} +.button.is-danger.is-outlined:hover, +.button.is-danger.is-outlined.is-hovered, +.button.is-danger.is-outlined:focus, +.button.is-danger.is-outlined.is-focused { + background-color: #ff003c; + border-color: #ff003c; + color: #121617; +} +.button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #ff003c #ff003c !important; +} +.button.is-danger.is-outlined.is-loading:hover::after, +.button.is-danger.is-outlined.is-loading.is-hovered::after, +.button.is-danger.is-outlined.is-loading:focus::after, +.button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #121617 #121617 !important; +} +.button.is-danger.is-outlined[disabled], +fieldset[disabled] .button.is-danger.is-outlined { + background-color: transparent; + border-color: #ff003c; + box-shadow: none; + color: #ff003c; +} +.button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #121617; + color: #121617; +} +.button.is-danger.is-inverted.is-outlined:hover, +.button.is-danger.is-inverted.is-outlined.is-hovered, +.button.is-danger.is-inverted.is-outlined:focus, +.button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #121617; + color: #ff003c; +} +.button.is-danger.is-inverted.is-outlined.is-loading:hover::after, +.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-danger.is-inverted.is-outlined.is-loading:focus::after, +.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ff003c #ff003c !important; +} +.button.is-danger.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #121617; + box-shadow: none; + color: #121617; +} +.button.is-danger.is-light { + background-color: #ffebef; + color: #eb0037; +} +.button.is-danger.is-light:hover, +.button.is-danger.is-light.is-hovered { + background-color: #ffdee6; + border-color: transparent; + color: #eb0037; +} +.button.is-danger.is-light:active, +.button.is-danger.is-light.is-active { + background-color: #ffd1dc; + border-color: transparent; + color: #eb0037; +} +.button.is-grey-lightest { + background-color: #ededed; + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest:hover, +.button.is-grey-lightest.is-hovered { + background-color: #e7e7e7; + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest:focus, +.button.is-grey-lightest.is-focused { + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest:focus:not(:active), +.button.is-grey-lightest.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(237,237,237,0.25); +} +.button.is-grey-lightest:active, +.button.is-grey-lightest.is-active { + background-color: #e0e0e0; + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest[disabled], +fieldset[disabled] .button.is-grey-lightest { + background-color: #ededed; + border-color: transparent; + box-shadow: none; +} +.button.is-grey-lightest.is-inverted { + background-color: #363636; + color: #ededed; +} +.button.is-grey-lightest.is-inverted:hover, +.button.is-grey-lightest.is-inverted.is-hovered { + background-color: #292929; +} +.button.is-grey-lightest.is-inverted[disabled], +fieldset[disabled] .button.is-grey-lightest.is-inverted { + background-color: #363636; + border-color: transparent; + box-shadow: none; + color: #ededed; +} +.button.is-grey-lightest.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-grey-lightest.is-outlined { + background-color: transparent; + border-color: #ededed; + color: #ededed; +} +.button.is-grey-lightest.is-outlined:hover, +.button.is-grey-lightest.is-outlined.is-hovered, +.button.is-grey-lightest.is-outlined:focus, +.button.is-grey-lightest.is-outlined.is-focused { + background-color: #ededed; + border-color: #ededed; + color: #363636; +} +.button.is-grey-lightest.is-outlined.is-loading::after { + border-color: transparent transparent #ededed #ededed !important; +} +.button.is-grey-lightest.is-outlined.is-loading:hover::after, +.button.is-grey-lightest.is-outlined.is-loading.is-hovered::after, +.button.is-grey-lightest.is-outlined.is-loading:focus::after, +.button.is-grey-lightest.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-grey-lightest.is-outlined[disabled], +fieldset[disabled] .button.is-grey-lightest.is-outlined { + background-color: transparent; + border-color: #ededed; + box-shadow: none; + color: #ededed; +} +.button.is-grey-lightest.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} +.button.is-grey-lightest.is-inverted.is-outlined:hover, +.button.is-grey-lightest.is-inverted.is-outlined.is-hovered, +.button.is-grey-lightest.is-inverted.is-outlined:focus, +.button.is-grey-lightest.is-inverted.is-outlined.is-focused { + background-color: #363636; + color: #ededed; +} +.button.is-grey-lightest.is-inverted.is-outlined.is-loading:hover::after, +.button.is-grey-lightest.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-grey-lightest.is-inverted.is-outlined.is-loading:focus::after, +.button.is-grey-lightest.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ededed #ededed !important; +} +.button.is-grey-lightest.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-grey-lightest.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; +} +.button.is-small { + border-radius: 0; + font-size: 0.75rem; +} +.button.is-normal { + font-size: 1rem; +} +.button.is-medium { + font-size: 1.25rem; +} +.button.is-large { + font-size: 1.5rem; +} +.button[disabled], +fieldset[disabled] .button { + background-color: #000; + border-color: #dbdbdb; + box-shadow: none; + opacity: 0.5; +} +.button.is-fullwidth { + display: flex; + width: 100%; +} +.button.is-loading { + color: transparent !important; + pointer-events: none; +} +.button.is-loading::after { + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; +} +.button.is-static { + background-color: #f5f5f5; + border-color: #dbdbdb; + color: #848484; + box-shadow: none; + pointer-events: none; +} +.button.is-rounded { + border-radius: 290486px; + padding-left: calc(1em + 0.25em); + padding-right: calc(1em + 0.25em); +} +.buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.buttons .button { + margin-bottom: 0.5rem; +} +.buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; +} +.buttons:last-child { + margin-bottom: -0.5rem; +} +.buttons:not(:last-child) { + margin-bottom: 1rem; +} +.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + border-radius: 0; + font-size: 0.75rem; +} +.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; +} +.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; +} +.buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; +} +.buttons.has-addons .button:last-child { + margin-right: 0; +} +.buttons.has-addons .button:hover, +.buttons.has-addons .button.is-hovered { + z-index: 2; +} +.buttons.has-addons .button:focus, +.buttons.has-addons .button.is-focused, +.buttons.has-addons .button:active, +.buttons.has-addons .button.is-active, +.buttons.has-addons .button.is-selected { + z-index: 3; +} +.buttons.has-addons .button:focus:hover, +.buttons.has-addons .button.is-focused:hover, +.buttons.has-addons .button:active:hover, +.buttons.has-addons .button.is-active:hover, +.buttons.has-addons .button.is-selected:hover { + z-index: 4; +} +.buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.buttons.is-centered { + justify-content: center; +} +.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; +} +.buttons.is-right { + justify-content: flex-end; +} +.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; +} +.container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; +} +.container.is-fluid { + max-width: none; + padding-left: 64px; + padding-right: 64px; + width: 100%; +} +@media screen and (min-width: 1088px) { + .container { + max-width: 960px; + } +} +@media screen and (max-width: 1279px) { + .container.is-widescreen { + max-width: 1152px; + } +} +@media screen and (max-width: 1471px) { + .container.is-fullhd { + max-width: 1344px; + } +} +@media screen and (min-width: 1280px) { + .container { + max-width: 1152px; + } +} +@media screen and (min-width: 1472px) { + .container { + max-width: 1344px; + } +} +.content li + li { + margin-top: 0.25em; +} +.content p:not(:last-child), +.content dl:not(:last-child), +.content ol:not(:last-child), +.content ul:not(:last-child), +.content blockquote:not(:last-child), +.content pre:not(:last-child), +.content table:not(:last-child) { + margin-bottom: 1em; +} +.content h1, +.content h2, +.content h3, +.content h4, +.content h5, +.content h6 { + color: #fcee09; + font-weight: 400; + line-height: 1.125; +} +.content h1 { + font-size: 2em; + margin-bottom: 0.5em; +} +.content h1:not(:first-child) { + margin-top: 1em; +} +.content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; +} +.content h2:not(:first-child) { + margin-top: 1.1428em; +} +.content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; +} +.content h3:not(:first-child) { + margin-top: 1.3333em; +} +.content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; +} +.content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; +} +.content h6 { + font-size: 1em; + margin-bottom: 1em; +} +.content blockquote { + background-color: #f5f5f5; + border-left: 5px solid #dbdbdb; + padding: 1.25em 1.5em; +} +.content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; +} +.content ol:not([type]) { + list-style-type: decimal; +} +.content ol:not([type]).is-lower-alpha { + list-style-type: lower-alpha; +} +.content ol:not([type]).is-lower-roman { + list-style-type: lower-roman; +} +.content ol:not([type]).is-upper-alpha { + list-style-type: upper-alpha; +} +.content ol:not([type]).is-upper-roman { + list-style-type: upper-roman; +} +.content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; +} +.content ul ul { + list-style-type: circle; + margin-top: 0.5em; +} +.content ul ul ul { + list-style-type: square; +} +.content dd { + margin-left: 2em; +} +.content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; +} +.content figure:not(:first-child) { + margin-top: 2em; +} +.content figure:not(:last-child) { + margin-bottom: 2em; +} +.content figure img { + display: inline-block; +} +.content figure figcaption { + font-style: italic; +} +.content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 1.25em 1.5em; + white-space: pre; + word-wrap: normal; +} +.content sup, +.content sub { + font-size: 75%; +} +.content table { + width: 100%; +} +.content table td, +.content table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} +.content table th { + color: #fcee09; +} +.content table th:not([align]) { + text-align: left; +} +.content table thead td, +.content table thead th { + border-width: 0 0 2px; + color: #fcee09; +} +.content table tfoot td, +.content table tfoot th { + border-width: 2px 0 0; + color: #fcee09; +} +.content table tbody tr:last-child td, +.content table tbody tr:last-child th { + border-bottom-width: 0; +} +.content .tabs li + li { + margin-top: 0; +} +.content.is-small { + font-size: 0.75rem; +} +.content.is-medium { + font-size: 1.25rem; +} +.content.is-large { + font-size: 1.5rem; +} +.icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; +} +.icon.is-small { + height: 1rem; + width: 1rem; +} +.icon.is-medium { + height: 2rem; + width: 2rem; +} +.icon.is-large { + height: 3rem; + width: 3rem; +} +.image { + display: block; + position: relative; +} +.image img { + display: block; + height: auto; + width: 100%; +} +.image img.is-rounded { + border-radius: 290486px; +} +.image.is-fullwidth { + width: 100%; +} +.image.is-square img, +.image.is-1by1 img, +.image.is-5by4 img, +.image.is-4by3 img, +.image.is-3by2 img, +.image.is-5by3 img, +.image.is-16by9 img, +.image.is-2by1 img, +.image.is-3by1 img, +.image.is-4by5 img, +.image.is-3by4 img, +.image.is-2by3 img, +.image.is-3by5 img, +.image.is-9by16 img, +.image.is-1by2 img, +.image.is-1by3 img, +.image.is-square .has-ratio, +.image.is-1by1 .has-ratio, +.image.is-5by4 .has-ratio, +.image.is-4by3 .has-ratio, +.image.is-3by2 .has-ratio, +.image.is-5by3 .has-ratio, +.image.is-16by9 .has-ratio, +.image.is-2by1 .has-ratio, +.image.is-3by1 .has-ratio, +.image.is-4by5 .has-ratio, +.image.is-3by4 .has-ratio, +.image.is-2by3 .has-ratio, +.image.is-3by5 .has-ratio, +.image.is-9by16 .has-ratio, +.image.is-1by2 .has-ratio, +.image.is-1by3 .has-ratio { + height: 100%; + width: 100%; +} +.image.is-square, +.image.is-1by1 { + padding-top: 100%; +} +.image.is-5by4 { + padding-top: 80%; +} +.image.is-4by3 { + padding-top: 75%; +} +.image.is-3by2 { + padding-top: 66.6666%; +} +.image.is-5by3 { + padding-top: 60%; +} +.image.is-16by9 { + padding-top: 56.25%; +} +.image.is-2by1 { + padding-top: 50%; +} +.image.is-3by1 { + padding-top: 33.3333%; +} +.image.is-4by5 { + padding-top: 125%; +} +.image.is-3by4 { + padding-top: 133.3333%; +} +.image.is-2by3 { + padding-top: 150%; +} +.image.is-3by5 { + padding-top: 166.6666%; +} +.image.is-9by16 { + padding-top: 177.7777%; +} +.image.is-1by2 { + padding-top: 200%; +} +.image.is-1by3 { + padding-top: 300%; +} +.image.is-16x16 { + height: 16px; + width: 16px; +} +.image.is-24x24 { + height: 24px; + width: 24px; +} +.image.is-32x32 { + height: 32px; + width: 32px; +} +.image.is-48x48 { + height: 48px; + width: 48px; +} +.image.is-64x64 { + height: 64px; + width: 64px; +} +.image.is-96x96 { + height: 96px; + width: 96px; +} +.image.is-128x128 { + height: 128px; + width: 128px; +} +.notification { + background-color: #f5f5f5; + border-radius: 0; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; +} +.notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; +} +.notification strong { + color: currentColor; +} +.notification code, +.notification pre { + background: #000; +} +.notification pre code { + background: transparent; +} +.notification > .delete { + position: absolute; + right: 0.5rem; + top: 0.5rem; +} +.notification .title, +.notification .subtitle, +.notification .content { + color: currentColor; +} +.notification.is-white { + background-color: #fff; + color: #000; +} +.notification.is-black { + background-color: #000; + color: #fff; +} +.notification.is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.notification.is-dark { + background-color: #363636; + color: #fff; +} +.notification.is-primary { + background-color: #fcee09; + color: #121617; +} +.notification.is-link { + background-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.notification.is-info { + background-color: #02d7f2; + color: #121617; +} +.notification.is-success { + background-color: #00ff41; + color: #121617; +} +.notification.is-warning { + background-color: #ff8e3c; + color: #121617; +} +.notification.is-danger { + background-color: #ff003c; + color: #121617; +} +.notification.is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 1rem; + overflow: hidden; + padding: 0; + width: 100%; +} +.progress::-webkit-progress-bar { + background-color: #ededed; +} +.progress::-webkit-progress-value { + background-color: #cdcdcd; +} +.progress::-moz-progress-bar { + background-color: #cdcdcd; +} +.progress::-ms-fill { + background-color: #cdcdcd; + border: none; +} +.progress.is-white::-webkit-progress-value { + background-color: #fff; +} +.progress.is-white::-moz-progress-bar { + background-color: #fff; +} +.progress.is-white::-ms-fill { + background-color: #fff; +} +.progress.is-white:indeterminate { + background-image: linear-gradient(to right, #fff 30%, #ededed 30%); +} +.progress.is-black::-webkit-progress-value { + background-color: #000; +} +.progress.is-black::-moz-progress-bar { + background-color: #000; +} +.progress.is-black::-ms-fill { + background-color: #000; +} +.progress.is-black:indeterminate { + background-image: linear-gradient(to right, #000 30%, #ededed 30%); +} +.progress.is-light::-webkit-progress-value { + background-color: #f5f5f5; +} +.progress.is-light::-moz-progress-bar { + background-color: #f5f5f5; +} +.progress.is-light::-ms-fill { + background-color: #f5f5f5; +} +.progress.is-light:indeterminate { + background-image: linear-gradient(to right, #f5f5f5 30%, #ededed 30%); +} +.progress.is-dark::-webkit-progress-value { + background-color: #363636; +} +.progress.is-dark::-moz-progress-bar { + background-color: #363636; +} +.progress.is-dark::-ms-fill { + background-color: #363636; +} +.progress.is-dark:indeterminate { + background-image: linear-gradient(to right, #363636 30%, #ededed 30%); +} +.progress.is-primary::-webkit-progress-value { + background-color: #fcee09; +} +.progress.is-primary::-moz-progress-bar { + background-color: #fcee09; +} +.progress.is-primary::-ms-fill { + background-color: #fcee09; +} +.progress.is-primary:indeterminate { + background-image: linear-gradient(to right, #fcee09 30%, #ededed 30%); +} +.progress.is-link::-webkit-progress-value { + background-color: #02d7f2; +} +.progress.is-link::-moz-progress-bar { + background-color: #02d7f2; +} +.progress.is-link::-ms-fill { + background-color: #02d7f2; +} +.progress.is-link:indeterminate { + background-image: linear-gradient(to right, #02d7f2 30%, #ededed 30%); +} +.progress.is-info::-webkit-progress-value { + background-color: #02d7f2; +} +.progress.is-info::-moz-progress-bar { + background-color: #02d7f2; +} +.progress.is-info::-ms-fill { + background-color: #02d7f2; +} +.progress.is-info:indeterminate { + background-image: linear-gradient(to right, #02d7f2 30%, #ededed 30%); +} +.progress.is-success::-webkit-progress-value { + background-color: #00ff41; +} +.progress.is-success::-moz-progress-bar { + background-color: #00ff41; +} +.progress.is-success::-ms-fill { + background-color: #00ff41; +} +.progress.is-success:indeterminate { + background-image: linear-gradient(to right, #00ff41 30%, #ededed 30%); +} +.progress.is-warning::-webkit-progress-value { + background-color: #ff8e3c; +} +.progress.is-warning::-moz-progress-bar { + background-color: #ff8e3c; +} +.progress.is-warning::-ms-fill { + background-color: #ff8e3c; +} +.progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ff8e3c 30%, #ededed 30%); +} +.progress.is-danger::-webkit-progress-value { + background-color: #ff003c; +} +.progress.is-danger::-moz-progress-bar { + background-color: #ff003c; +} +.progress.is-danger::-ms-fill { + background-color: #ff003c; +} +.progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #ff003c 30%, #ededed 30%); +} +.progress.is-grey-lightest::-webkit-progress-value { + background-color: #ededed; +} +.progress.is-grey-lightest::-moz-progress-bar { + background-color: #ededed; +} +.progress.is-grey-lightest::-ms-fill { + background-color: #ededed; +} +.progress.is-grey-lightest:indeterminate { + background-image: linear-gradient(to right, #ededed 30%, #ededed 30%); +} +.progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #ededed; + background-image: linear-gradient(to right, #cdcdcd 30%, #ededed 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; +} +.progress:indeterminate::-webkit-progress-bar { + background-color: transparent; +} +.progress:indeterminate::-moz-progress-bar { + background-color: transparent; +} +.progress.is-small { + height: 0.75rem; +} +.progress.is-medium { + height: 1.25rem; +} +.progress.is-large { + height: 1.5rem; +} +@-moz-keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +@-webkit-keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +@-o-keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +@keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +.table { + background-color: #000; + color: #fcee09; +} +.table td, +.table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} +.table td.is-white, +.table th.is-white { + background-color: #fff; + border-color: #fff; + color: #000; +} +.table td.is-black, +.table th.is-black { + background-color: #000; + border-color: #000; + color: #fff; +} +.table td.is-light, +.table th.is-light { + background-color: #f5f5f5; + border-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.table td.is-dark, +.table th.is-dark { + background-color: #363636; + border-color: #363636; + color: #fff; +} +.table td.is-primary, +.table th.is-primary { + background-color: #fcee09; + border-color: #fcee09; + color: #121617; +} +.table td.is-link, +.table th.is-link { + background-color: #02d7f2; + border-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.table td.is-info, +.table th.is-info { + background-color: #02d7f2; + border-color: #02d7f2; + color: #121617; +} +.table td.is-success, +.table th.is-success { + background-color: #00ff41; + border-color: #00ff41; + color: #121617; +} +.table td.is-warning, +.table th.is-warning { + background-color: #ff8e3c; + border-color: #ff8e3c; + color: #121617; +} +.table td.is-danger, +.table th.is-danger { + background-color: #ff003c; + border-color: #ff003c; + color: #121617; +} +.table td.is-grey-lightest, +.table th.is-grey-lightest { + background-color: #ededed; + border-color: #ededed; + color: #363636; +} +.table td.is-narrow, +.table th.is-narrow { + white-space: nowrap; + width: 1%; +} +.table td.is-selected, +.table th.is-selected { + background-color: #fcee09; + color: #121617; +} +.table td.is-selected a, +.table th.is-selected a, +.table td.is-selected strong, +.table th.is-selected strong { + color: currentColor; +} +.table th { + color: #fcee09; +} +.table th:not([align]) { + text-align: left; +} +.table tr.is-selected { + background-color: #fcee09; + color: #121617; +} +.table tr.is-selected a, +.table tr.is-selected strong { + color: currentColor; +} +.table tr.is-selected td, +.table tr.is-selected th { + border-color: #121617; + color: currentColor; +} +.table thead { + background-color: transparent; +} +.table thead td, +.table thead th { + border-width: 0 0 2px; + color: #fcee09; +} +.table tfoot { + background-color: transparent; +} +.table tfoot td, +.table tfoot th { + border-width: 2px 0 0; + color: #fcee09; +} +.table tbody { + background-color: transparent; +} +.table tbody tr:last-child td, +.table tbody tr:last-child th { + border-bottom-width: 0; +} +.table.is-bordered td, +.table.is-bordered th { + border-width: 1px; +} +.table.is-bordered tr:last-child td, +.table.is-bordered tr:last-child th { + border-bottom-width: 1px; +} +.table.is-fullwidth { + width: 100%; +} +.table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #cdcdcd; +} +.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #cdcdcd; +} +.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: #f5f5f5; +} +.table.is-narrow td, +.table.is-narrow th { + padding: 0.25em 0.5em; +} +.table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #cdcdcd; +} +.table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; +} +.tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.tags .tag { + margin-bottom: 0.5rem; +} +.tags .tag:not(:last-child) { + margin-right: 0.5rem; +} +.tags:last-child { + margin-bottom: -0.5rem; +} +.tags:not(:last-child) { + margin-bottom: 1rem; +} +.tags.are-medium .tag:not(.is-normal):not(.is-large) { + font-size: 1rem; +} +.tags.are-large .tag:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; +} +.tags.is-centered { + justify-content: center; +} +.tags.is-centered .tag { + margin-right: 0.25rem; + margin-left: 0.25rem; +} +.tags.is-right { + justify-content: flex-end; +} +.tags.is-right .tag:not(:first-child) { + margin-left: 0.5rem; +} +.tags.is-right .tag:not(:last-child) { + margin-right: 0; +} +.tags.has-addons .tag { + margin-right: 0; +} +.tags.has-addons .tag:not(:first-child) { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.tags.has-addons .tag:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.tag:not(body) { + align-items: center; + background-color: #02d7f2; + border-radius: 0; + color: #000; + display: inline-flex; + font-size: 0.75rem; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} +.tag:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; +} +.tag:not(body).is-white { + background-color: #fff; + color: #000; +} +.tag:not(body).is-black { + background-color: #000; + color: #fff; +} +.tag:not(body).is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.tag:not(body).is-dark { + background-color: #363636; + color: #fff; +} +.tag:not(body).is-primary { + background-color: #fcee09; + color: #121617; +} +.tag:not(body).is-primary.is-light { + background-color: #fffeeb; + color: #928a02; +} +.tag:not(body).is-link { + background-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.tag:not(body).is-link.is-light { + background-color: #ebfdff; + color: #018293; +} +.tag:not(body).is-info { + background-color: #02d7f2; + color: #121617; +} +.tag:not(body).is-info.is-light { + background-color: #ebfdff; + color: #018293; +} +.tag:not(body).is-success { + background-color: #00ff41; + color: #121617; +} +.tag:not(body).is-success.is-light { + background-color: #ebfff0; + color: #009426; +} +.tag:not(body).is-warning { + background-color: #ff8e3c; + color: #121617; +} +.tag:not(body).is-warning.is-light { + background-color: #fff3eb; + color: #a84700; +} +.tag:not(body).is-danger { + background-color: #ff003c; + color: #121617; +} +.tag:not(body).is-danger.is-light { + background-color: #ffebef; + color: #eb0037; +} +.tag:not(body).is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.tag:not(body).is-normal { + font-size: 0.75rem; +} +.tag:not(body).is-medium { + font-size: 1rem; +} +.tag:not(body).is-large { + font-size: 1.25rem; +} +.tag:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; +} +.tag:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; +} +.tag:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; +} +.tag:not(body).is-delete { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; +} +.tag:not(body).is-delete::before, +.tag:not(body).is-delete::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; +} +.tag:not(body).is-delete::before { + height: 1px; + width: 50%; +} +.tag:not(body).is-delete::after { + height: 50%; + width: 1px; +} +.tag:not(body).is-delete:hover, +.tag:not(body).is-delete:focus { + background-color: #02c1d9; +} +.tag:not(body).is-delete:active { + background-color: #02aabf; +} +.tag:not(body).is-rounded { + border-radius: 290486px; +} +a.tag:hover { + text-decoration: underline; +} +.title, +.subtitle { + word-break: break-word; +} +.title em, +.subtitle em, +.title span, +.subtitle span { + font-weight: inherit; +} +.title sub, +.subtitle sub { + font-size: 0.75em; +} +.title sup, +.subtitle sup { + font-size: 0.75em; +} +.title .tag, +.subtitle .tag { + vertical-align: middle; +} +.title { + color: #fcee09; + font-size: 2rem; + font-weight: 400; + line-height: 1.125; +} +.title strong { + color: inherit; + font-weight: inherit; +} +.title + .highlight { + margin-top: -0.75rem; +} +.title:not(.is-spaced) + .subtitle { + margin-top: -1.25rem; +} +.title.is-1 { + font-size: 3rem; +} +.title.is-2 { + font-size: 2.5rem; +} +.title.is-3 { + font-size: 2rem; +} +.title.is-4 { + font-size: 1.5rem; +} +.title.is-5 { + font-size: 1.25rem; +} +.title.is-6 { + font-size: 1rem; +} +.title.is-7 { + font-size: 0.85rem; +} +.subtitle { + color: #cdcdcd; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; +} +.subtitle strong { + color: #fcee09; + font-weight: 600; +} +.subtitle:not(.is-spaced) + .title { + margin-top: -1.25rem; +} +.subtitle.is-1 { + font-size: 3rem; +} +.subtitle.is-2 { + font-size: 2.5rem; +} +.subtitle.is-3 { + font-size: 2rem; +} +.subtitle.is-4 { + font-size: 1.5rem; +} +.subtitle.is-5 { + font-size: 1.25rem; +} +.subtitle.is-6 { + font-size: 1rem; +} +.subtitle.is-7 { + font-size: 0.85rem; +} +.heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; +} +.highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; +} +.highlight pre { + overflow: auto; + max-width: 100%; +} +.number { + align-items: center; + background-color: #f5f5f5; + border-radius: 290486px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; +} +.input, +.textarea, +.select select { + background-color: #000; + border-color: #dbdbdb; + border-radius: 0; + color: #cdcdcd; +} +.input::-moz-placeholder, +.textarea::-moz-placeholder, +.select select::-moz-placeholder { + color: rgba(205,205,205,0.8); +} +.input::-webkit-input-placeholder, +.textarea::-webkit-input-placeholder, +.select select::-webkit-input-placeholder { + color: rgba(205,205,205,0.8); +} +.input:-moz-placeholder, +.textarea:-moz-placeholder, +.select select:-moz-placeholder { + color: rgba(205,205,205,0.8); +} +.input:-ms-input-placeholder, +.textarea:-ms-input-placeholder, +.select select:-ms-input-placeholder { + color: rgba(205,205,205,0.8); +} +.input:hover, +.textarea:hover, +.select select:hover, +.input.is-hovered, +.textarea.is-hovered, +.select select.is-hovered { + border-color: #b5b5b5; +} +.input:focus, +.textarea:focus, +.select select:focus, +.input.is-focused, +.textarea.is-focused, +.select select.is-focused, +.input:active, +.textarea:active, +.select select:active, +.input.is-active, +.textarea.is-active, +.select select.is-active { + border-color: #02d7f2; + box-shadow: 0 0 0 0.125em rgba(2,215,242,0.25); +} +.input[disabled], +.textarea[disabled], +.select select[disabled], +fieldset[disabled] .input, +fieldset[disabled] .textarea, +fieldset[disabled] .select select { + background-color: #f5f5f5; + border-color: #f5f5f5; + box-shadow: none; + color: #848484; +} +.input[disabled]::-moz-placeholder, +.textarea[disabled]::-moz-placeholder, +.select select[disabled]::-moz-placeholder, +fieldset[disabled] .input::-moz-placeholder, +fieldset[disabled] .textarea::-moz-placeholder, +fieldset[disabled] .select select::-moz-placeholder { + color: rgba(132,132,132,0.3); +} +.input[disabled]::-webkit-input-placeholder, +.textarea[disabled]::-webkit-input-placeholder, +.select select[disabled]::-webkit-input-placeholder, +fieldset[disabled] .input::-webkit-input-placeholder, +fieldset[disabled] .textarea::-webkit-input-placeholder, +fieldset[disabled] .select select::-webkit-input-placeholder { + color: rgba(132,132,132,0.3); +} +.input[disabled]:-moz-placeholder, +.textarea[disabled]:-moz-placeholder, +.select select[disabled]:-moz-placeholder, +fieldset[disabled] .input:-moz-placeholder, +fieldset[disabled] .textarea:-moz-placeholder, +fieldset[disabled] .select select:-moz-placeholder { + color: rgba(132,132,132,0.3); +} +.input[disabled]:-ms-input-placeholder, +.textarea[disabled]:-ms-input-placeholder, +.select select[disabled]:-ms-input-placeholder, +fieldset[disabled] .input:-ms-input-placeholder, +fieldset[disabled] .textarea:-ms-input-placeholder, +fieldset[disabled] .select select:-ms-input-placeholder { + color: rgba(132,132,132,0.3); +} +.input, +.textarea { + box-shadow: inset 0 0.0625em 0.125em rgba(0,0,0,0.05); + max-width: 100%; + width: 100%; +} +.input[readonly], +.textarea[readonly] { + box-shadow: none; +} +.input.is-white, +.textarea.is-white { + border-color: #fff; +} +.input.is-white:focus, +.textarea.is-white:focus, +.input.is-white.is-focused, +.textarea.is-white.is-focused, +.input.is-white:active, +.textarea.is-white:active, +.input.is-white.is-active, +.textarea.is-white.is-active { + box-shadow: 0 0 0 0.125em rgba(255,255,255,0.25); +} +.input.is-black, +.textarea.is-black { + border-color: #000; +} +.input.is-black:focus, +.textarea.is-black:focus, +.input.is-black.is-focused, +.textarea.is-black.is-focused, +.input.is-black:active, +.textarea.is-black:active, +.input.is-black.is-active, +.textarea.is-black.is-active { + box-shadow: 0 0 0 0.125em rgba(0,0,0,0.25); +} +.input.is-light, +.textarea.is-light { + border-color: #f5f5f5; +} +.input.is-light:focus, +.textarea.is-light:focus, +.input.is-light.is-focused, +.textarea.is-light.is-focused, +.input.is-light:active, +.textarea.is-light:active, +.input.is-light.is-active, +.textarea.is-light.is-active { + box-shadow: 0 0 0 0.125em rgba(245,245,245,0.25); +} +.input.is-dark, +.textarea.is-dark { + border-color: #363636; +} +.input.is-dark:focus, +.textarea.is-dark:focus, +.input.is-dark.is-focused, +.textarea.is-dark.is-focused, +.input.is-dark:active, +.textarea.is-dark:active, +.input.is-dark.is-active, +.textarea.is-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(54,54,54,0.25); +} +.input.is-primary, +.textarea.is-primary { + border-color: #fcee09; +} +.input.is-primary:focus, +.textarea.is-primary:focus, +.input.is-primary.is-focused, +.textarea.is-primary.is-focused, +.input.is-primary:active, +.textarea.is-primary:active, +.input.is-primary.is-active, +.textarea.is-primary.is-active { + box-shadow: 0 0 0 0.125em rgba(252,238,9,0.25); +} +.input.is-link, +.textarea.is-link { + border-color: #02d7f2; +} +.input.is-link:focus, +.textarea.is-link:focus, +.input.is-link.is-focused, +.textarea.is-link.is-focused, +.input.is-link:active, +.textarea.is-link:active, +.input.is-link.is-active, +.textarea.is-link.is-active { + box-shadow: 0 0 0 0.125em rgba(2,215,242,0.25); +} +.input.is-info, +.textarea.is-info { + border-color: #02d7f2; +} +.input.is-info:focus, +.textarea.is-info:focus, +.input.is-info.is-focused, +.textarea.is-info.is-focused, +.input.is-info:active, +.textarea.is-info:active, +.input.is-info.is-active, +.textarea.is-info.is-active { + box-shadow: 0 0 0 0.125em rgba(2,215,242,0.25); +} +.input.is-success, +.textarea.is-success { + border-color: #00ff41; +} +.input.is-success:focus, +.textarea.is-success:focus, +.input.is-success.is-focused, +.textarea.is-success.is-focused, +.input.is-success:active, +.textarea.is-success:active, +.input.is-success.is-active, +.textarea.is-success.is-active { + box-shadow: 0 0 0 0.125em rgba(0,255,65,0.25); +} +.input.is-warning, +.textarea.is-warning { + border-color: #ff8e3c; +} +.input.is-warning:focus, +.textarea.is-warning:focus, +.input.is-warning.is-focused, +.textarea.is-warning.is-focused, +.input.is-warning:active, +.textarea.is-warning:active, +.input.is-warning.is-active, +.textarea.is-warning.is-active { + box-shadow: 0 0 0 0.125em rgba(255,142,60,0.25); +} +.input.is-danger, +.textarea.is-danger { + border-color: #ff003c; +} +.input.is-danger:focus, +.textarea.is-danger:focus, +.input.is-danger.is-focused, +.textarea.is-danger.is-focused, +.input.is-danger:active, +.textarea.is-danger:active, +.input.is-danger.is-active, +.textarea.is-danger.is-active { + box-shadow: 0 0 0 0.125em rgba(255,0,60,0.25); +} +.input.is-grey-lightest, +.textarea.is-grey-lightest { + border-color: #ededed; +} +.input.is-grey-lightest:focus, +.textarea.is-grey-lightest:focus, +.input.is-grey-lightest.is-focused, +.textarea.is-grey-lightest.is-focused, +.input.is-grey-lightest:active, +.textarea.is-grey-lightest:active, +.input.is-grey-lightest.is-active, +.textarea.is-grey-lightest.is-active { + box-shadow: 0 0 0 0.125em rgba(237,237,237,0.25); +} +.input.is-small, +.textarea.is-small { + border-radius: 0; + font-size: 0.75rem; +} +.input.is-medium, +.textarea.is-medium { + font-size: 1.25rem; +} +.input.is-large, +.textarea.is-large { + font-size: 1.5rem; +} +.input.is-fullwidth, +.textarea.is-fullwidth { + display: block; + width: 100%; +} +.input.is-inline, +.textarea.is-inline { + display: inline; + width: auto; +} +.input.is-rounded { + border-radius: 290486px; + padding-left: calc(calc(0.75em - 1px) + 0.375em); + padding-right: calc(calc(0.75em - 1px) + 0.375em); +} +.input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; +} +.textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: calc(0.75em - 1px); + resize: vertical; +} +.textarea:not([rows]) { + max-height: 40em; + min-height: 8em; +} +.textarea[rows] { + height: initial; +} +.textarea.has-fixed-size { + resize: none; +} +.checkbox, +.radio { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; +} +.checkbox input, +.radio input { + cursor: pointer; +} +.checkbox:hover, +.radio:hover { + color: #fcee09; +} +.checkbox[disabled], +.radio[disabled], +fieldset[disabled] .checkbox, +fieldset[disabled] .radio { + color: #848484; + cursor: not-allowed; +} +.radio + .radio { + margin-left: 0.5em; +} +.select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; +} +.select:not(.is-multiple) { + height: 2.25em; +} +.select:not(.is-multiple):not(.is-loading)::after { + border-color: #02d7f2; + right: 1.125em; + z-index: 4; +} +.select.is-rounded select { + border-radius: 290486px; + padding-left: 1em; +} +.select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; +} +.select select::-ms-expand { + display: none; +} +.select select[disabled]:hover, +fieldset[disabled] .select select:hover { + border-color: #f5f5f5; +} +.select select:not([multiple]) { + padding-right: 2.5em; +} +.select select[multiple] { + height: auto; + padding: 0; +} +.select select[multiple] option { + padding: 0.5em 1em; +} +.select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #fcee09; +} +.select.is-white:not(:hover)::after { + border-color: #fff; +} +.select.is-white select { + border-color: #fff; +} +.select.is-white select:hover, +.select.is-white select.is-hovered { + border-color: #f2f2f2; +} +.select.is-white select:focus, +.select.is-white select.is-focused, +.select.is-white select:active, +.select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255,255,255,0.25); +} +.select.is-black:not(:hover)::after { + border-color: #000; +} +.select.is-black select { + border-color: #000; +} +.select.is-black select:hover, +.select.is-black select.is-hovered { + border-color: #000; +} +.select.is-black select:focus, +.select.is-black select.is-focused, +.select.is-black select:active, +.select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(0,0,0,0.25); +} +.select.is-light:not(:hover)::after { + border-color: #f5f5f5; +} +.select.is-light select { + border-color: #f5f5f5; +} +.select.is-light select:hover, +.select.is-light select.is-hovered { + border-color: #e8e8e8; +} +.select.is-light select:focus, +.select.is-light select.is-focused, +.select.is-light select:active, +.select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(245,245,245,0.25); +} +.select.is-dark:not(:hover)::after { + border-color: #363636; +} +.select.is-dark select { + border-color: #363636; +} +.select.is-dark select:hover, +.select.is-dark select.is-hovered { + border-color: #292929; +} +.select.is-dark select:focus, +.select.is-dark select.is-focused, +.select.is-dark select:active, +.select.is-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(54,54,54,0.25); +} +.select.is-primary:not(:hover)::after { + border-color: #fcee09; +} +.select.is-primary select { + border-color: #fcee09; +} +.select.is-primary select:hover, +.select.is-primary select.is-hovered { + border-color: #e9db03; +} +.select.is-primary select:focus, +.select.is-primary select.is-focused, +.select.is-primary select:active, +.select.is-primary select.is-active { + box-shadow: 0 0 0 0.125em rgba(252,238,9,0.25); +} +.select.is-link:not(:hover)::after { + border-color: #02d7f2; +} +.select.is-link select { + border-color: #02d7f2; +} +.select.is-link select:hover, +.select.is-link select.is-hovered { + border-color: #02c1d9; +} +.select.is-link select:focus, +.select.is-link select.is-focused, +.select.is-link select:active, +.select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(2,215,242,0.25); +} +.select.is-info:not(:hover)::after { + border-color: #02d7f2; +} +.select.is-info select { + border-color: #02d7f2; +} +.select.is-info select:hover, +.select.is-info select.is-hovered { + border-color: #02c1d9; +} +.select.is-info select:focus, +.select.is-info select.is-focused, +.select.is-info select:active, +.select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(2,215,242,0.25); +} +.select.is-success:not(:hover)::after { + border-color: #00ff41; +} +.select.is-success select { + border-color: #00ff41; +} +.select.is-success select:hover, +.select.is-success select.is-hovered { + border-color: #00e63a; +} +.select.is-success select:focus, +.select.is-success select.is-focused, +.select.is-success select:active, +.select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(0,255,65,0.25); +} +.select.is-warning:not(:hover)::after { + border-color: #ff8e3c; +} +.select.is-warning select { + border-color: #ff8e3c; +} +.select.is-warning select:hover, +.select.is-warning select.is-hovered { + border-color: #ff7f22; +} +.select.is-warning select:focus, +.select.is-warning select.is-focused, +.select.is-warning select:active, +.select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(255,142,60,0.25); +} +.select.is-danger:not(:hover)::after { + border-color: #ff003c; +} +.select.is-danger select { + border-color: #ff003c; +} +.select.is-danger select:hover, +.select.is-danger select.is-hovered { + border-color: #e60036; +} +.select.is-danger select:focus, +.select.is-danger select.is-focused, +.select.is-danger select:active, +.select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(255,0,60,0.25); +} +.select.is-grey-lightest:not(:hover)::after { + border-color: #ededed; +} +.select.is-grey-lightest select { + border-color: #ededed; +} +.select.is-grey-lightest select:hover, +.select.is-grey-lightest select.is-hovered { + border-color: #e0e0e0; +} +.select.is-grey-lightest select:focus, +.select.is-grey-lightest select.is-focused, +.select.is-grey-lightest select:active, +.select.is-grey-lightest select.is-active { + box-shadow: 0 0 0 0.125em rgba(237,237,237,0.25); +} +.select.is-small { + border-radius: 0; + font-size: 0.75rem; +} +.select.is-medium { + font-size: 1.25rem; +} +.select.is-large { + font-size: 1.5rem; +} +.select.is-disabled::after { + border-color: #848484; +} +.select.is-fullwidth { + width: 100%; +} +.select.is-fullwidth select { + width: 100%; +} +.select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; +} +.select.is-loading.is-small:after { + font-size: 0.75rem; +} +.select.is-loading.is-medium:after { + font-size: 1.25rem; +} +.select.is-loading.is-large:after { + font-size: 1.5rem; +} +.file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; +} +.file.is-white .file-cta { + background-color: #fff; + border-color: transparent; + color: #000; +} +.file.is-white:hover .file-cta, +.file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #000; +} +.file.is-white:focus .file-cta, +.file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255,255,255,0.25); + color: #000; +} +.file.is-white:active .file-cta, +.file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #000; +} +.file.is-black .file-cta { + background-color: #000; + border-color: transparent; + color: #fff; +} +.file.is-black:hover .file-cta, +.file.is-black.is-hovered .file-cta { + background-color: #000; + border-color: transparent; + color: #fff; +} +.file.is-black:focus .file-cta, +.file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(0,0,0,0.25); + color: #fff; +} +.file.is-black:active .file-cta, +.file.is-black.is-active .file-cta { + background-color: #000; + border-color: transparent; + color: #fff; +} +.file.is-light .file-cta { + background-color: #f5f5f5; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-light:hover .file-cta, +.file.is-light.is-hovered .file-cta { + background-color: #eee; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-light:focus .file-cta, +.file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(245,245,245,0.25); + color: rgba(0,0,0,0.7); +} +.file.is-light:active .file-cta, +.file.is-light.is-active .file-cta { + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-dark .file-cta { + background-color: #363636; + border-color: transparent; + color: #fff; +} +.file.is-dark:hover .file-cta, +.file.is-dark.is-hovered .file-cta { + background-color: #2f2f2f; + border-color: transparent; + color: #fff; +} +.file.is-dark:focus .file-cta, +.file.is-dark.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(54,54,54,0.25); + color: #fff; +} +.file.is-dark:active .file-cta, +.file.is-dark.is-active .file-cta { + background-color: #292929; + border-color: transparent; + color: #fff; +} +.file.is-primary .file-cta { + background-color: #fcee09; + border-color: transparent; + color: #121617; +} +.file.is-primary:hover .file-cta, +.file.is-primary.is-hovered .file-cta { + background-color: #f5e703; + border-color: transparent; + color: #121617; +} +.file.is-primary:focus .file-cta, +.file.is-primary.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(252,238,9,0.25); + color: #121617; +} +.file.is-primary:active .file-cta, +.file.is-primary.is-active .file-cta { + background-color: #e9db03; + border-color: transparent; + color: #121617; +} +.file.is-link .file-cta { + background-color: #02d7f2; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-link:hover .file-cta, +.file.is-link.is-hovered .file-cta { + background-color: #02cce5; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-link:focus .file-cta, +.file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(2,215,242,0.25); + color: rgba(0,0,0,0.7); +} +.file.is-link:active .file-cta, +.file.is-link.is-active .file-cta { + background-color: #02c1d9; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-info .file-cta { + background-color: #02d7f2; + border-color: transparent; + color: #121617; +} +.file.is-info:hover .file-cta, +.file.is-info.is-hovered .file-cta { + background-color: #02cce5; + border-color: transparent; + color: #121617; +} +.file.is-info:focus .file-cta, +.file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(2,215,242,0.25); + color: #121617; +} +.file.is-info:active .file-cta, +.file.is-info.is-active .file-cta { + background-color: #02c1d9; + border-color: transparent; + color: #121617; +} +.file.is-success .file-cta { + background-color: #00ff41; + border-color: transparent; + color: #121617; +} +.file.is-success:hover .file-cta, +.file.is-success.is-hovered .file-cta { + background-color: #00f23e; + border-color: transparent; + color: #121617; +} +.file.is-success:focus .file-cta, +.file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(0,255,65,0.25); + color: #121617; +} +.file.is-success:active .file-cta, +.file.is-success.is-active .file-cta { + background-color: #00e63a; + border-color: transparent; + color: #121617; +} +.file.is-warning .file-cta { + background-color: #ff8e3c; + border-color: transparent; + color: #121617; +} +.file.is-warning:hover .file-cta, +.file.is-warning.is-hovered .file-cta { + background-color: #ff872f; + border-color: transparent; + color: #121617; +} +.file.is-warning:focus .file-cta, +.file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255,142,60,0.25); + color: #121617; +} +.file.is-warning:active .file-cta, +.file.is-warning.is-active .file-cta { + background-color: #ff7f22; + border-color: transparent; + color: #121617; +} +.file.is-danger .file-cta { + background-color: #ff003c; + border-color: transparent; + color: #121617; +} +.file.is-danger:hover .file-cta, +.file.is-danger.is-hovered .file-cta { + background-color: #f20039; + border-color: transparent; + color: #121617; +} +.file.is-danger:focus .file-cta, +.file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255,0,60,0.25); + color: #121617; +} +.file.is-danger:active .file-cta, +.file.is-danger.is-active .file-cta { + background-color: #e60036; + border-color: transparent; + color: #121617; +} +.file.is-grey-lightest .file-cta { + background-color: #ededed; + border-color: transparent; + color: #363636; +} +.file.is-grey-lightest:hover .file-cta, +.file.is-grey-lightest.is-hovered .file-cta { + background-color: #e7e7e7; + border-color: transparent; + color: #363636; +} +.file.is-grey-lightest:focus .file-cta, +.file.is-grey-lightest.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(237,237,237,0.25); + color: #363636; +} +.file.is-grey-lightest:active .file-cta, +.file.is-grey-lightest.is-active .file-cta { + background-color: #e0e0e0; + border-color: transparent; + color: #363636; +} +.file.is-small { + font-size: 0.75rem; +} +.file.is-medium { + font-size: 1.25rem; +} +.file.is-medium .file-icon .fa { + font-size: 21px; +} +.file.is-large { + font-size: 1.5rem; +} +.file.is-large .file-icon .fa { + font-size: 28px; +} +.file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.file.has-name.is-empty .file-cta { + border-radius: 0; +} +.file.has-name.is-empty .file-name { + display: none; +} +.file.is-boxed .file-label { + flex-direction: column; +} +.file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; +} +.file.is-boxed .file-name { + border-width: 0 1px 1px; +} +.file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; +} +.file.is-boxed .file-icon .fa { + font-size: 21px; +} +.file.is-boxed.is-small .file-icon .fa { + font-size: 14px; +} +.file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; +} +.file.is-boxed.is-large .file-icon .fa { + font-size: 35px; +} +.file.is-boxed.has-name .file-cta { + border-radius: 0 0 0 0; +} +.file.is-boxed.has-name .file-name { + border-radius: 0 0 0 0; + border-width: 0 1px 1px; +} +.file.is-centered { + justify-content: center; +} +.file.is-fullwidth .file-label { + width: 100%; +} +.file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; +} +.file.is-right { + justify-content: flex-end; +} +.file.is-right .file-cta { + border-radius: 0 0 0 0; +} +.file.is-right .file-name { + border-radius: 0 0 0 0; + border-width: 1px 0 1px 1px; + order: -1; +} +.file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; +} +.file-label:hover .file-cta { + background-color: #eee; + color: #fcee09; +} +.file-label:hover .file-name { + border-color: #d5d5d5; +} +.file-label:active .file-cta { + background-color: #e8e8e8; + color: #fcee09; +} +.file-label:active .file-name { + border-color: #cfcfcf; +} +.file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; +} +.file-cta, +.file-name { + border-color: #dbdbdb; + border-radius: 0; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; +} +.file-cta { + background-color: #f5f5f5; + color: #cdcdcd; +} +.file-name { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; +} +.file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; +} +.file-icon .fa { + font-size: 14px; +} +.label { + color: #fcee09; + display: block; + font-size: 1rem; + font-weight: 700; +} +.label:not(:last-child) { + margin-bottom: 0.5em; +} +.label.is-small { + font-size: 0.75rem; +} +.label.is-medium { + font-size: 1.25rem; +} +.label.is-large { + font-size: 1.5rem; +} +.help { + display: block; + font-size: 0.75rem; + margin-top: 0.25rem; +} +.help.is-white { + color: #fff; +} +.help.is-black { + color: #000; +} +.help.is-light { + color: #f5f5f5; +} +.help.is-dark { + color: #363636; +} +.help.is-primary { + color: #fcee09; +} +.help.is-link { + color: #02d7f2; +} +.help.is-info { + color: #02d7f2; +} +.help.is-success { + color: #00ff41; +} +.help.is-warning { + color: #ff8e3c; +} +.help.is-danger { + color: #ff003c; +} +.help.is-grey-lightest { + color: #ededed; +} +.field:not(:last-child) { + margin-bottom: 0.75rem; +} +.field.has-addons { + display: flex; + justify-content: flex-start; +} +.field.has-addons .control:not(:last-child) { + margin-right: -1px; +} +.field.has-addons .control:not(:first-child):not(:last-child) .button, +.field.has-addons .control:not(:first-child):not(:last-child) .input, +.field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; +} +.field.has-addons .control:first-child:not(:only-child) .button, +.field.has-addons .control:first-child:not(:only-child) .input, +.field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.field.has-addons .control:last-child:not(:only-child) .button, +.field.has-addons .control:last-child:not(:only-child) .input, +.field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.field.has-addons .control .button:not([disabled]):hover, +.field.has-addons .control .input:not([disabled]):hover, +.field.has-addons .control .select select:not([disabled]):hover, +.field.has-addons .control .button:not([disabled]).is-hovered, +.field.has-addons .control .input:not([disabled]).is-hovered, +.field.has-addons .control .select select:not([disabled]).is-hovered { + z-index: 2; +} +.field.has-addons .control .button:not([disabled]):focus, +.field.has-addons .control .input:not([disabled]):focus, +.field.has-addons .control .select select:not([disabled]):focus, +.field.has-addons .control .button:not([disabled]).is-focused, +.field.has-addons .control .input:not([disabled]).is-focused, +.field.has-addons .control .select select:not([disabled]).is-focused, +.field.has-addons .control .button:not([disabled]):active, +.field.has-addons .control .input:not([disabled]):active, +.field.has-addons .control .select select:not([disabled]):active, +.field.has-addons .control .button:not([disabled]).is-active, +.field.has-addons .control .input:not([disabled]).is-active, +.field.has-addons .control .select select:not([disabled]).is-active { + z-index: 3; +} +.field.has-addons .control .button:not([disabled]):focus:hover, +.field.has-addons .control .input:not([disabled]):focus:hover, +.field.has-addons .control .select select:not([disabled]):focus:hover, +.field.has-addons .control .button:not([disabled]).is-focused:hover, +.field.has-addons .control .input:not([disabled]).is-focused:hover, +.field.has-addons .control .select select:not([disabled]).is-focused:hover, +.field.has-addons .control .button:not([disabled]):active:hover, +.field.has-addons .control .input:not([disabled]):active:hover, +.field.has-addons .control .select select:not([disabled]):active:hover, +.field.has-addons .control .button:not([disabled]).is-active:hover, +.field.has-addons .control .input:not([disabled]).is-active:hover, +.field.has-addons .control .select select:not([disabled]).is-active:hover { + z-index: 4; +} +.field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.field.has-addons.has-addons-centered { + justify-content: center; +} +.field.has-addons.has-addons-right { + justify-content: flex-end; +} +.field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; +} +.field.is-grouped { + display: flex; + justify-content: flex-start; +} +.field.is-grouped > .control { + flex-shrink: 0; +} +.field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; +} +.field.is-grouped > .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.field.is-grouped.is-grouped-centered { + justify-content: center; +} +.field.is-grouped.is-grouped-right { + justify-content: flex-end; +} +.field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; +} +.field.is-grouped.is-grouped-multiline > .control:last-child, +.field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; +} +.field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; +} +.field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; +} +@media screen and (min-width: 769px), print { + .field.is-horizontal { + display: flex; + } +} +.field-label .label { + font-size: inherit; +} +@media screen and (max-width: 768px) { + .field-label { + margin-bottom: 0.5rem; + } +} +@media screen and (min-width: 769px), print { + .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; + } + .field-label.is-small { + font-size: 0.75rem; + padding-top: 0.375em; + } + .field-label.is-normal { + padding-top: 0.375em; + } + .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; + } + .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; + } +} +.field-body .field .field { + margin-bottom: 0; +} +@media screen and (min-width: 769px), print { + .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; + } + .field-body .field { + margin-bottom: 0; + } + .field-body > .field { + flex-shrink: 1; + } + .field-body > .field:not(.is-narrow) { + flex-grow: 1; + } + .field-body > .field:not(:last-child) { + margin-right: 0.75rem; + } +} +.control { + box-sizing: border-box; + clear: both; + font-size: 1rem; + position: relative; + text-align: left; +} +.control.has-icons-left .input:focus ~ .icon, +.control.has-icons-right .input:focus ~ .icon, +.control.has-icons-left .select:focus ~ .icon, +.control.has-icons-right .select:focus ~ .icon { + color: #cdcdcd; +} +.control.has-icons-left .input.is-small ~ .icon, +.control.has-icons-right .input.is-small ~ .icon, +.control.has-icons-left .select.is-small ~ .icon, +.control.has-icons-right .select.is-small ~ .icon { + font-size: 0.75rem; +} +.control.has-icons-left .input.is-medium ~ .icon, +.control.has-icons-right .input.is-medium ~ .icon, +.control.has-icons-left .select.is-medium ~ .icon, +.control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; +} +.control.has-icons-left .input.is-large ~ .icon, +.control.has-icons-right .input.is-large ~ .icon, +.control.has-icons-left .select.is-large ~ .icon, +.control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; +} +.control.has-icons-left .icon, +.control.has-icons-right .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; +} +.control.has-icons-left .input, +.control.has-icons-left .select select { + padding-left: 2.25em; +} +.control.has-icons-left .icon.is-left { + left: 0; +} +.control.has-icons-right .input, +.control.has-icons-right .select select { + padding-right: 2.25em; +} +.control.has-icons-right .icon.is-right { + right: 0; +} +.control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; +} +.control.is-loading.is-small:after { + font-size: 0.75rem; +} +.control.is-loading.is-medium:after { + font-size: 1.25rem; +} +.control.is-loading.is-large:after { + font-size: 1.5rem; +} +.column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; +} +.columns.is-mobile > .column.is-narrow { + flex: none; +} +.columns.is-mobile > .column.is-full { + flex: none; + width: 100%; +} +.columns.is-mobile > .column.is-three-quarters { + flex: none; + width: 75%; +} +.columns.is-mobile > .column.is-two-thirds { + flex: none; + width: 66.6666%; +} +.columns.is-mobile > .column.is-half { + flex: none; + width: 50%; +} +.columns.is-mobile > .column.is-one-third { + flex: none; + width: 33.3333%; +} +.columns.is-mobile > .column.is-one-quarter { + flex: none; + width: 25%; +} +.columns.is-mobile > .column.is-one-fifth { + flex: none; + width: 20%; +} +.columns.is-mobile > .column.is-two-fifths { + flex: none; + width: 40%; +} +.columns.is-mobile > .column.is-three-fifths { + flex: none; + width: 60%; +} +.columns.is-mobile > .column.is-four-fifths { + flex: none; + width: 80%; +} +.columns.is-mobile > .column.is-offset-three-quarters { + margin-left: 75%; +} +.columns.is-mobile > .column.is-offset-two-thirds { + margin-left: 66.6666%; +} +.columns.is-mobile > .column.is-offset-half { + margin-left: 50%; +} +.columns.is-mobile > .column.is-offset-one-third { + margin-left: 33.3333%; +} +.columns.is-mobile > .column.is-offset-one-quarter { + margin-left: 25%; +} +.columns.is-mobile > .column.is-offset-one-fifth { + margin-left: 20%; +} +.columns.is-mobile > .column.is-offset-two-fifths { + margin-left: 40%; +} +.columns.is-mobile > .column.is-offset-three-fifths { + margin-left: 60%; +} +.columns.is-mobile > .column.is-offset-four-fifths { + margin-left: 80%; +} +.columns.is-mobile > .column.is-0 { + flex: none; + width: 0%; +} +.columns.is-mobile > .column.is-offset-0 { + margin-left: 0%; +} +.columns.is-mobile > .column.is-1 { + flex: none; + width: 8.33333%; +} +.columns.is-mobile > .column.is-offset-1 { + margin-left: 8.33333%; +} +.columns.is-mobile > .column.is-2 { + flex: none; + width: 16.66667%; +} +.columns.is-mobile > .column.is-offset-2 { + margin-left: 16.66667%; +} +.columns.is-mobile > .column.is-3 { + flex: none; + width: 25%; +} +.columns.is-mobile > .column.is-offset-3 { + margin-left: 25%; +} +.columns.is-mobile > .column.is-4 { + flex: none; + width: 33.33333%; +} +.columns.is-mobile > .column.is-offset-4 { + margin-left: 33.33333%; +} +.columns.is-mobile > .column.is-5 { + flex: none; + width: 41.66667%; +} +.columns.is-mobile > .column.is-offset-5 { + margin-left: 41.66667%; +} +.columns.is-mobile > .column.is-6 { + flex: none; + width: 50%; +} +.columns.is-mobile > .column.is-offset-6 { + margin-left: 50%; +} +.columns.is-mobile > .column.is-7 { + flex: none; + width: 58.33333%; +} +.columns.is-mobile > .column.is-offset-7 { + margin-left: 58.33333%; +} +.columns.is-mobile > .column.is-8 { + flex: none; + width: 66.66667%; +} +.columns.is-mobile > .column.is-offset-8 { + margin-left: 66.66667%; +} +.columns.is-mobile > .column.is-9 { + flex: none; + width: 75%; +} +.columns.is-mobile > .column.is-offset-9 { + margin-left: 75%; +} +.columns.is-mobile > .column.is-10 { + flex: none; + width: 83.33333%; +} +.columns.is-mobile > .column.is-offset-10 { + margin-left: 83.33333%; +} +.columns.is-mobile > .column.is-11 { + flex: none; + width: 91.66667%; +} +.columns.is-mobile > .column.is-offset-11 { + margin-left: 91.66667%; +} +.columns.is-mobile > .column.is-12 { + flex: none; + width: 100%; +} +.columns.is-mobile > .column.is-offset-12 { + margin-left: 100%; +} +@media screen and (max-width: 768px) { + .column.is-narrow-mobile { + flex: none; + } + .column.is-full-mobile { + flex: none; + width: 100%; + } + .column.is-three-quarters-mobile { + flex: none; + width: 75%; + } + .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; + } + .column.is-half-mobile { + flex: none; + width: 50%; + } + .column.is-one-third-mobile { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-mobile { + flex: none; + width: 25%; + } + .column.is-one-fifth-mobile { + flex: none; + width: 20%; + } + .column.is-two-fifths-mobile { + flex: none; + width: 40%; + } + .column.is-three-fifths-mobile { + flex: none; + width: 60%; + } + .column.is-four-fifths-mobile { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-mobile { + margin-left: 75%; + } + .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; + } + .column.is-offset-half-mobile { + margin-left: 50%; + } + .column.is-offset-one-third-mobile { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-mobile { + margin-left: 25%; + } + .column.is-offset-one-fifth-mobile { + margin-left: 20%; + } + .column.is-offset-two-fifths-mobile { + margin-left: 40%; + } + .column.is-offset-three-fifths-mobile { + margin-left: 60%; + } + .column.is-offset-four-fifths-mobile { + margin-left: 80%; + } + .column.is-0-mobile { + flex: none; + width: 0%; + } + .column.is-offset-0-mobile { + margin-left: 0%; + } + .column.is-1-mobile { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-mobile { + margin-left: 8.33333%; + } + .column.is-2-mobile { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-mobile { + margin-left: 16.66667%; + } + .column.is-3-mobile { + flex: none; + width: 25%; + } + .column.is-offset-3-mobile { + margin-left: 25%; + } + .column.is-4-mobile { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-mobile { + margin-left: 33.33333%; + } + .column.is-5-mobile { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-mobile { + margin-left: 41.66667%; + } + .column.is-6-mobile { + flex: none; + width: 50%; + } + .column.is-offset-6-mobile { + margin-left: 50%; + } + .column.is-7-mobile { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-mobile { + margin-left: 58.33333%; + } + .column.is-8-mobile { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-mobile { + margin-left: 66.66667%; + } + .column.is-9-mobile { + flex: none; + width: 75%; + } + .column.is-offset-9-mobile { + margin-left: 75%; + } + .column.is-10-mobile { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-mobile { + margin-left: 83.33333%; + } + .column.is-11-mobile { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-mobile { + margin-left: 91.66667%; + } + .column.is-12-mobile { + flex: none; + width: 100%; + } + .column.is-offset-12-mobile { + margin-left: 100%; + } +} +@media screen and (min-width: 769px), print { + .column.is-narrow, + .column.is-narrow-tablet { + flex: none; + } + .column.is-full, + .column.is-full-tablet { + flex: none; + width: 100%; + } + .column.is-three-quarters, + .column.is-three-quarters-tablet { + flex: none; + width: 75%; + } + .column.is-two-thirds, + .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; + } + .column.is-half, + .column.is-half-tablet { + flex: none; + width: 50%; + } + .column.is-one-third, + .column.is-one-third-tablet { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter, + .column.is-one-quarter-tablet { + flex: none; + width: 25%; + } + .column.is-one-fifth, + .column.is-one-fifth-tablet { + flex: none; + width: 20%; + } + .column.is-two-fifths, + .column.is-two-fifths-tablet { + flex: none; + width: 40%; + } + .column.is-three-fifths, + .column.is-three-fifths-tablet { + flex: none; + width: 60%; + } + .column.is-four-fifths, + .column.is-four-fifths-tablet { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters, + .column.is-offset-three-quarters-tablet { + margin-left: 75%; + } + .column.is-offset-two-thirds, + .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; + } + .column.is-offset-half, + .column.is-offset-half-tablet { + margin-left: 50%; + } + .column.is-offset-one-third, + .column.is-offset-one-third-tablet { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter, + .column.is-offset-one-quarter-tablet { + margin-left: 25%; + } + .column.is-offset-one-fifth, + .column.is-offset-one-fifth-tablet { + margin-left: 20%; + } + .column.is-offset-two-fifths, + .column.is-offset-two-fifths-tablet { + margin-left: 40%; + } + .column.is-offset-three-fifths, + .column.is-offset-three-fifths-tablet { + margin-left: 60%; + } + .column.is-offset-four-fifths, + .column.is-offset-four-fifths-tablet { + margin-left: 80%; + } + .column.is-0, + .column.is-0-tablet { + flex: none; + width: 0%; + } + .column.is-offset-0, + .column.is-offset-0-tablet { + margin-left: 0%; + } + .column.is-1, + .column.is-1-tablet { + flex: none; + width: 8.33333%; + } + .column.is-offset-1, + .column.is-offset-1-tablet { + margin-left: 8.33333%; + } + .column.is-2, + .column.is-2-tablet { + flex: none; + width: 16.66667%; + } + .column.is-offset-2, + .column.is-offset-2-tablet { + margin-left: 16.66667%; + } + .column.is-3, + .column.is-3-tablet { + flex: none; + width: 25%; + } + .column.is-offset-3, + .column.is-offset-3-tablet { + margin-left: 25%; + } + .column.is-4, + .column.is-4-tablet { + flex: none; + width: 33.33333%; + } + .column.is-offset-4, + .column.is-offset-4-tablet { + margin-left: 33.33333%; + } + .column.is-5, + .column.is-5-tablet { + flex: none; + width: 41.66667%; + } + .column.is-offset-5, + .column.is-offset-5-tablet { + margin-left: 41.66667%; + } + .column.is-6, + .column.is-6-tablet { + flex: none; + width: 50%; + } + .column.is-offset-6, + .column.is-offset-6-tablet { + margin-left: 50%; + } + .column.is-7, + .column.is-7-tablet { + flex: none; + width: 58.33333%; + } + .column.is-offset-7, + .column.is-offset-7-tablet { + margin-left: 58.33333%; + } + .column.is-8, + .column.is-8-tablet { + flex: none; + width: 66.66667%; + } + .column.is-offset-8, + .column.is-offset-8-tablet { + margin-left: 66.66667%; + } + .column.is-9, + .column.is-9-tablet { + flex: none; + width: 75%; + } + .column.is-offset-9, + .column.is-offset-9-tablet { + margin-left: 75%; + } + .column.is-10, + .column.is-10-tablet { + flex: none; + width: 83.33333%; + } + .column.is-offset-10, + .column.is-offset-10-tablet { + margin-left: 83.33333%; + } + .column.is-11, + .column.is-11-tablet { + flex: none; + width: 91.66667%; + } + .column.is-offset-11, + .column.is-offset-11-tablet { + margin-left: 91.66667%; + } + .column.is-12, + .column.is-12-tablet { + flex: none; + width: 100%; + } + .column.is-offset-12, + .column.is-offset-12-tablet { + margin-left: 100%; + } +} +@media screen and (max-width: 1087px) { + .column.is-narrow-touch { + flex: none; + } + .column.is-full-touch { + flex: none; + width: 100%; + } + .column.is-three-quarters-touch { + flex: none; + width: 75%; + } + .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; + } + .column.is-half-touch { + flex: none; + width: 50%; + } + .column.is-one-third-touch { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-touch { + flex: none; + width: 25%; + } + .column.is-one-fifth-touch { + flex: none; + width: 20%; + } + .column.is-two-fifths-touch { + flex: none; + width: 40%; + } + .column.is-three-fifths-touch { + flex: none; + width: 60%; + } + .column.is-four-fifths-touch { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-touch { + margin-left: 75%; + } + .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; + } + .column.is-offset-half-touch { + margin-left: 50%; + } + .column.is-offset-one-third-touch { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-touch { + margin-left: 25%; + } + .column.is-offset-one-fifth-touch { + margin-left: 20%; + } + .column.is-offset-two-fifths-touch { + margin-left: 40%; + } + .column.is-offset-three-fifths-touch { + margin-left: 60%; + } + .column.is-offset-four-fifths-touch { + margin-left: 80%; + } + .column.is-0-touch { + flex: none; + width: 0%; + } + .column.is-offset-0-touch { + margin-left: 0%; + } + .column.is-1-touch { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-touch { + margin-left: 8.33333%; + } + .column.is-2-touch { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-touch { + margin-left: 16.66667%; + } + .column.is-3-touch { + flex: none; + width: 25%; + } + .column.is-offset-3-touch { + margin-left: 25%; + } + .column.is-4-touch { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-touch { + margin-left: 33.33333%; + } + .column.is-5-touch { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-touch { + margin-left: 41.66667%; + } + .column.is-6-touch { + flex: none; + width: 50%; + } + .column.is-offset-6-touch { + margin-left: 50%; + } + .column.is-7-touch { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-touch { + margin-left: 58.33333%; + } + .column.is-8-touch { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-touch { + margin-left: 66.66667%; + } + .column.is-9-touch { + flex: none; + width: 75%; + } + .column.is-offset-9-touch { + margin-left: 75%; + } + .column.is-10-touch { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-touch { + margin-left: 83.33333%; + } + .column.is-11-touch { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-touch { + margin-left: 91.66667%; + } + .column.is-12-touch { + flex: none; + width: 100%; + } + .column.is-offset-12-touch { + margin-left: 100%; + } +} +@media screen and (min-width: 1088px) { + .column.is-narrow-desktop { + flex: none; + } + .column.is-full-desktop { + flex: none; + width: 100%; + } + .column.is-three-quarters-desktop { + flex: none; + width: 75%; + } + .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; + } + .column.is-half-desktop { + flex: none; + width: 50%; + } + .column.is-one-third-desktop { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-desktop { + flex: none; + width: 25%; + } + .column.is-one-fifth-desktop { + flex: none; + width: 20%; + } + .column.is-two-fifths-desktop { + flex: none; + width: 40%; + } + .column.is-three-fifths-desktop { + flex: none; + width: 60%; + } + .column.is-four-fifths-desktop { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-desktop { + margin-left: 75%; + } + .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; + } + .column.is-offset-half-desktop { + margin-left: 50%; + } + .column.is-offset-one-third-desktop { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-desktop { + margin-left: 25%; + } + .column.is-offset-one-fifth-desktop { + margin-left: 20%; + } + .column.is-offset-two-fifths-desktop { + margin-left: 40%; + } + .column.is-offset-three-fifths-desktop { + margin-left: 60%; + } + .column.is-offset-four-fifths-desktop { + margin-left: 80%; + } + .column.is-0-desktop { + flex: none; + width: 0%; + } + .column.is-offset-0-desktop { + margin-left: 0%; + } + .column.is-1-desktop { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-desktop { + margin-left: 8.33333%; + } + .column.is-2-desktop { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-desktop { + margin-left: 16.66667%; + } + .column.is-3-desktop { + flex: none; + width: 25%; + } + .column.is-offset-3-desktop { + margin-left: 25%; + } + .column.is-4-desktop { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-desktop { + margin-left: 33.33333%; + } + .column.is-5-desktop { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-desktop { + margin-left: 41.66667%; + } + .column.is-6-desktop { + flex: none; + width: 50%; + } + .column.is-offset-6-desktop { + margin-left: 50%; + } + .column.is-7-desktop { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-desktop { + margin-left: 58.33333%; + } + .column.is-8-desktop { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-desktop { + margin-left: 66.66667%; + } + .column.is-9-desktop { + flex: none; + width: 75%; + } + .column.is-offset-9-desktop { + margin-left: 75%; + } + .column.is-10-desktop { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-desktop { + margin-left: 83.33333%; + } + .column.is-11-desktop { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-desktop { + margin-left: 91.66667%; + } + .column.is-12-desktop { + flex: none; + width: 100%; + } + .column.is-offset-12-desktop { + margin-left: 100%; + } +} +@media screen and (min-width: 1280px) { + .column.is-narrow-widescreen { + flex: none; + } + .column.is-full-widescreen { + flex: none; + width: 100%; + } + .column.is-three-quarters-widescreen { + flex: none; + width: 75%; + } + .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; + } + .column.is-half-widescreen { + flex: none; + width: 50%; + } + .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-widescreen { + flex: none; + width: 25%; + } + .column.is-one-fifth-widescreen { + flex: none; + width: 20%; + } + .column.is-two-fifths-widescreen { + flex: none; + width: 40%; + } + .column.is-three-fifths-widescreen { + flex: none; + width: 60%; + } + .column.is-four-fifths-widescreen { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-widescreen { + margin-left: 75%; + } + .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; + } + .column.is-offset-half-widescreen { + margin-left: 50%; + } + .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-widescreen { + margin-left: 25%; + } + .column.is-offset-one-fifth-widescreen { + margin-left: 20%; + } + .column.is-offset-two-fifths-widescreen { + margin-left: 40%; + } + .column.is-offset-three-fifths-widescreen { + margin-left: 60%; + } + .column.is-offset-four-fifths-widescreen { + margin-left: 80%; + } + .column.is-0-widescreen { + flex: none; + width: 0%; + } + .column.is-offset-0-widescreen { + margin-left: 0%; + } + .column.is-1-widescreen { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-widescreen { + margin-left: 8.33333%; + } + .column.is-2-widescreen { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-widescreen { + margin-left: 16.66667%; + } + .column.is-3-widescreen { + flex: none; + width: 25%; + } + .column.is-offset-3-widescreen { + margin-left: 25%; + } + .column.is-4-widescreen { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-widescreen { + margin-left: 33.33333%; + } + .column.is-5-widescreen { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-widescreen { + margin-left: 41.66667%; + } + .column.is-6-widescreen { + flex: none; + width: 50%; + } + .column.is-offset-6-widescreen { + margin-left: 50%; + } + .column.is-7-widescreen { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-widescreen { + margin-left: 58.33333%; + } + .column.is-8-widescreen { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-widescreen { + margin-left: 66.66667%; + } + .column.is-9-widescreen { + flex: none; + width: 75%; + } + .column.is-offset-9-widescreen { + margin-left: 75%; + } + .column.is-10-widescreen { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-widescreen { + margin-left: 83.33333%; + } + .column.is-11-widescreen { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-widescreen { + margin-left: 91.66667%; + } + .column.is-12-widescreen { + flex: none; + width: 100%; + } + .column.is-offset-12-widescreen { + margin-left: 100%; + } +} +@media screen and (min-width: 1472px) { + .column.is-narrow-fullhd { + flex: none; + } + .column.is-full-fullhd { + flex: none; + width: 100%; + } + .column.is-three-quarters-fullhd { + flex: none; + width: 75%; + } + .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; + } + .column.is-half-fullhd { + flex: none; + width: 50%; + } + .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-fullhd { + flex: none; + width: 25%; + } + .column.is-one-fifth-fullhd { + flex: none; + width: 20%; + } + .column.is-two-fifths-fullhd { + flex: none; + width: 40%; + } + .column.is-three-fifths-fullhd { + flex: none; + width: 60%; + } + .column.is-four-fifths-fullhd { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-fullhd { + margin-left: 75%; + } + .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; + } + .column.is-offset-half-fullhd { + margin-left: 50%; + } + .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-fullhd { + margin-left: 25%; + } + .column.is-offset-one-fifth-fullhd { + margin-left: 20%; + } + .column.is-offset-two-fifths-fullhd { + margin-left: 40%; + } + .column.is-offset-three-fifths-fullhd { + margin-left: 60%; + } + .column.is-offset-four-fifths-fullhd { + margin-left: 80%; + } + .column.is-0-fullhd { + flex: none; + width: 0%; + } + .column.is-offset-0-fullhd { + margin-left: 0%; + } + .column.is-1-fullhd { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-fullhd { + margin-left: 8.33333%; + } + .column.is-2-fullhd { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-fullhd { + margin-left: 16.66667%; + } + .column.is-3-fullhd { + flex: none; + width: 25%; + } + .column.is-offset-3-fullhd { + margin-left: 25%; + } + .column.is-4-fullhd { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-fullhd { + margin-left: 33.33333%; + } + .column.is-5-fullhd { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-fullhd { + margin-left: 41.66667%; + } + .column.is-6-fullhd { + flex: none; + width: 50%; + } + .column.is-offset-6-fullhd { + margin-left: 50%; + } + .column.is-7-fullhd { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-fullhd { + margin-left: 58.33333%; + } + .column.is-8-fullhd { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-fullhd { + margin-left: 66.66667%; + } + .column.is-9-fullhd { + flex: none; + width: 75%; + } + .column.is-offset-9-fullhd { + margin-left: 75%; + } + .column.is-10-fullhd { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-fullhd { + margin-left: 83.33333%; + } + .column.is-11-fullhd { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-fullhd { + margin-left: 91.66667%; + } + .column.is-12-fullhd { + flex: none; + width: 100%; + } + .column.is-offset-12-fullhd { + margin-left: 100%; + } +} +.columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} +.columns:last-child { + margin-bottom: -0.75rem; +} +.columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); +} +.columns.is-centered { + justify-content: center; +} +.columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; +} +.columns.is-gapless > .column { + margin: 0; + padding: 0 !important; +} +.columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; +} +.columns.is-gapless:last-child { + margin-bottom: 0; +} +.columns.is-mobile { + display: flex; +} +.columns.is-multiline { + flex-wrap: wrap; +} +.columns.is-vcentered { + align-items: center; +} +@media screen and (min-width: 769px), print { + .columns:not(.is-desktop) { + display: flex; + } +} +@media screen and (min-width: 1088px) { + .columns.is-desktop { + display: flex; + } +} +.columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); +} +.columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); +} +.columns.is-variable.is-0 { + --columnGap: 0rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-0-mobile { + --columnGap: 0rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-0-tablet { + --columnGap: 0rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-0-touch { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-0-desktop { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; + } +} +.columns.is-variable.is-1 { + --columnGap: 0.25rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; + } +} +.columns.is-variable.is-2 { + --columnGap: 0.5rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; + } +} +.columns.is-variable.is-3 { + --columnGap: 0.75rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; + } +} +.columns.is-variable.is-4 { + --columnGap: 1rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-4-mobile { + --columnGap: 1rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-4-tablet { + --columnGap: 1rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-4-touch { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-4-desktop { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; + } +} +.columns.is-variable.is-5 { + --columnGap: 1.25rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; + } +} +.columns.is-variable.is-6 { + --columnGap: 1.5rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; + } +} +.columns.is-variable.is-7 { + --columnGap: 1.75rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; + } +} +.columns.is-variable.is-8 { + --columnGap: 2rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-8-mobile { + --columnGap: 2rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-8-tablet { + --columnGap: 2rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-8-touch { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-8-desktop { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; + } +} +.tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; +} +.tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} +.tile.is-ancestor:last-child { + margin-bottom: -0.75rem; +} +.tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; +} +.tile.is-child { + margin: 0 !important; +} +.tile.is-parent { + padding: 0.75rem; +} +.tile.is-vertical { + flex-direction: column; +} +.tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; +} +@media screen and (min-width: 769px), print { + .tile:not(.is-child) { + display: flex; + } + .tile.is-1 { + flex: none; + width: 8.33333%; + } + .tile.is-2 { + flex: none; + width: 16.66667%; + } + .tile.is-3 { + flex: none; + width: 25%; + } + .tile.is-4 { + flex: none; + width: 33.33333%; + } + .tile.is-5 { + flex: none; + width: 41.66667%; + } + .tile.is-6 { + flex: none; + width: 50%; + } + .tile.is-7 { + flex: none; + width: 58.33333%; + } + .tile.is-8 { + flex: none; + width: 66.66667%; + } + .tile.is-9 { + flex: none; + width: 75%; + } + .tile.is-10 { + flex: none; + width: 83.33333%; + } + .tile.is-11 { + flex: none; + width: 91.66667%; + } + .tile.is-12 { + flex: none; + width: 100%; + } +} +.hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; +} +.hero .navbar { + background: none; +} +.hero .tabs ul { + border-bottom: none; +} +.hero.is-white { + background-color: #fff; + color: #000; +} +.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-white strong { + color: inherit; +} +.hero.is-white .title { + color: #000; +} +.hero.is-white .subtitle { + color: rgba(0,0,0,0.9); +} +.hero.is-white .subtitle a:not(.button), +.hero.is-white .subtitle strong { + color: #000; +} +@media screen and (max-width: 1087px) { + .hero.is-white .navbar-menu { + background-color: #fff; + } +} +.hero.is-white .navbar-item, +.hero.is-white .navbar-link { + color: rgba(0,0,0,0.7); +} +.hero.is-white a.navbar-item:hover, +.hero.is-white .navbar-link:hover, +.hero.is-white a.navbar-item.is-active, +.hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #000; +} +.hero.is-white .tabs a { + color: #000; + opacity: 0.9; +} +.hero.is-white .tabs a:hover { + opacity: 1; +} +.hero.is-white .tabs li.is-active a { + opacity: 1; +} +.hero.is-white .tabs.is-boxed a, +.hero.is-white .tabs.is-toggle a { + color: #000; +} +.hero.is-white .tabs.is-boxed a:hover, +.hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-white .tabs.is-boxed li.is-active a, +.hero.is-white .tabs.is-toggle li.is-active a, +.hero.is-white .tabs.is-boxed li.is-active a:hover, +.hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #000; + border-color: #000; + color: #fff; +} +.hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e3 0%, #fff 71%, #fff 100%); +} +@media screen and (max-width: 768px) { + .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e3 0%, #fff 71%, #fff 100%); + } +} +.hero.is-black { + background-color: #000; + color: #fff; +} +.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-black strong { + color: inherit; +} +.hero.is-black .title { + color: #fff; +} +.hero.is-black .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-black .subtitle a:not(.button), +.hero.is-black .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-black .navbar-menu { + background-color: #000; + } +} +.hero.is-black .navbar-item, +.hero.is-black .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-black a.navbar-item:hover, +.hero.is-black .navbar-link:hover, +.hero.is-black a.navbar-item.is-active, +.hero.is-black .navbar-link.is-active { + background-color: #000; + color: #fff; +} +.hero.is-black .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-black .tabs a:hover { + opacity: 1; +} +.hero.is-black .tabs li.is-active a { + opacity: 1; +} +.hero.is-black .tabs.is-boxed a, +.hero.is-black .tabs.is-toggle a { + color: #fff; +} +.hero.is-black .tabs.is-boxed a:hover, +.hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-black .tabs.is-boxed li.is-active a, +.hero.is-black .tabs.is-toggle li.is-active a, +.hero.is-black .tabs.is-boxed li.is-active a:hover, +.hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #000; +} +.hero.is-black.is-bold { + background-image: linear-gradient(141deg, #000 0%, #000 71%, #0d0c0c 100%); +} +@media screen and (max-width: 768px) { + .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #000 0%, #000 71%, #0d0c0c 100%); + } +} +.hero.is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-light strong { + color: inherit; +} +.hero.is-light .title { + color: rgba(0,0,0,0.7); +} +.hero.is-light .subtitle { + color: rgba(0,0,0,0.9); +} +.hero.is-light .subtitle a:not(.button), +.hero.is-light .subtitle strong { + color: rgba(0,0,0,0.7); +} +@media screen and (max-width: 1087px) { + .hero.is-light .navbar-menu { + background-color: #f5f5f5; + } +} +.hero.is-light .navbar-item, +.hero.is-light .navbar-link { + color: rgba(0,0,0,0.7); +} +.hero.is-light a.navbar-item:hover, +.hero.is-light .navbar-link:hover, +.hero.is-light a.navbar-item.is-active, +.hero.is-light .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); +} +.hero.is-light .tabs a { + color: rgba(0,0,0,0.7); + opacity: 0.9; +} +.hero.is-light .tabs a:hover { + opacity: 1; +} +.hero.is-light .tabs li.is-active a { + opacity: 1; +} +.hero.is-light .tabs.is-boxed a, +.hero.is-light .tabs.is-toggle a { + color: rgba(0,0,0,0.7); +} +.hero.is-light .tabs.is-boxed a:hover, +.hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-light .tabs.is-boxed li.is-active a, +.hero.is-light .tabs.is-toggle li.is-active a, +.hero.is-light .tabs.is-boxed li.is-active a:hover, +.hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0,0,0,0.7); + border-color: rgba(0,0,0,0.7); + color: #f5f5f5; +} +.hero.is-light.is-bold { + background-image: linear-gradient(141deg, #dfd8d8 0%, #f5f5f5 71%, #fff 100%); +} +@media screen and (max-width: 768px) { + .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #dfd8d8 0%, #f5f5f5 71%, #fff 100%); + } +} +.hero.is-dark { + background-color: #363636; + color: #fff; +} +.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-dark strong { + color: inherit; +} +.hero.is-dark .title { + color: #fff; +} +.hero.is-dark .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-dark .subtitle a:not(.button), +.hero.is-dark .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-dark .navbar-menu { + background-color: #363636; + } +} +.hero.is-dark .navbar-item, +.hero.is-dark .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-dark a.navbar-item:hover, +.hero.is-dark .navbar-link:hover, +.hero.is-dark a.navbar-item.is-active, +.hero.is-dark .navbar-link.is-active { + background-color: #292929; + color: #fff; +} +.hero.is-dark .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-dark .tabs a:hover { + opacity: 1; +} +.hero.is-dark .tabs li.is-active a { + opacity: 1; +} +.hero.is-dark .tabs.is-boxed a, +.hero.is-dark .tabs.is-toggle a { + color: #fff; +} +.hero.is-dark .tabs.is-boxed a:hover, +.hero.is-dark .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-dark .tabs.is-boxed li.is-active a, +.hero.is-dark .tabs.is-toggle li.is-active a, +.hero.is-dark .tabs.is-boxed li.is-active a:hover, +.hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #363636; +} +.hero.is-dark.is-bold { + background-image: linear-gradient(141deg, #1f1a1a 0%, #363636 71%, #463f3f 100%); +} +@media screen and (max-width: 768px) { + .hero.is-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1f1a1a 0%, #363636 71%, #463f3f 100%); + } +} +.hero.is-primary { + background-color: #fcee09; + color: #121617; +} +.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-primary strong { + color: inherit; +} +.hero.is-primary .title { + color: #121617; +} +.hero.is-primary .subtitle { + color: rgba(18,22,23,0.9); +} +.hero.is-primary .subtitle a:not(.button), +.hero.is-primary .subtitle strong { + color: #121617; +} +@media screen and (max-width: 1087px) { + .hero.is-primary .navbar-menu { + background-color: #fcee09; + } +} +.hero.is-primary .navbar-item, +.hero.is-primary .navbar-link { + color: rgba(18,22,23,0.7); +} +.hero.is-primary a.navbar-item:hover, +.hero.is-primary .navbar-link:hover, +.hero.is-primary a.navbar-item.is-active, +.hero.is-primary .navbar-link.is-active { + background-color: #e9db03; + color: #121617; +} +.hero.is-primary .tabs a { + color: #121617; + opacity: 0.9; +} +.hero.is-primary .tabs a:hover { + opacity: 1; +} +.hero.is-primary .tabs li.is-active a { + opacity: 1; +} +.hero.is-primary .tabs.is-boxed a, +.hero.is-primary .tabs.is-toggle a { + color: #121617; +} +.hero.is-primary .tabs.is-boxed a:hover, +.hero.is-primary .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-primary .tabs.is-boxed li.is-active a, +.hero.is-primary .tabs.is-toggle li.is-active a, +.hero.is-primary .tabs.is-boxed li.is-active a:hover, +.hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #121617; + border-color: #121617; + color: #fcee09; +} +.hero.is-primary.is-bold { + background-image: linear-gradient(141deg, #d2a300 0%, #fcee09 71%, #e7ff20 100%); +} +@media screen and (max-width: 768px) { + .hero.is-primary.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #d2a300 0%, #fcee09 71%, #e7ff20 100%); + } +} +.hero.is-link { + background-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-link strong { + color: inherit; +} +.hero.is-link .title { + color: rgba(0,0,0,0.7); +} +.hero.is-link .subtitle { + color: rgba(0,0,0,0.9); +} +.hero.is-link .subtitle a:not(.button), +.hero.is-link .subtitle strong { + color: rgba(0,0,0,0.7); +} +@media screen and (max-width: 1087px) { + .hero.is-link .navbar-menu { + background-color: #02d7f2; + } +} +.hero.is-link .navbar-item, +.hero.is-link .navbar-link { + color: rgba(0,0,0,0.7); +} +.hero.is-link a.navbar-item:hover, +.hero.is-link .navbar-link:hover, +.hero.is-link a.navbar-item.is-active, +.hero.is-link .navbar-link.is-active { + background-color: #02c1d9; + color: rgba(0,0,0,0.7); +} +.hero.is-link .tabs a { + color: rgba(0,0,0,0.7); + opacity: 0.9; +} +.hero.is-link .tabs a:hover { + opacity: 1; +} +.hero.is-link .tabs li.is-active a { + opacity: 1; +} +.hero.is-link .tabs.is-boxed a, +.hero.is-link .tabs.is-toggle a { + color: rgba(0,0,0,0.7); +} +.hero.is-link .tabs.is-boxed a:hover, +.hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-link .tabs.is-boxed li.is-active a, +.hero.is-link .tabs.is-toggle li.is-active a, +.hero.is-link .tabs.is-boxed li.is-active a:hover, +.hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0,0,0,0.7); + border-color: rgba(0,0,0,0.7); + color: #02d7f2; +} +.hero.is-link.is-bold { + background-image: linear-gradient(141deg, #00c1b7 0%, #02d7f2 71%, #0ebcff 100%); +} +@media screen and (max-width: 768px) { + .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #00c1b7 0%, #02d7f2 71%, #0ebcff 100%); + } +} +.hero.is-info { + background-color: #02d7f2; + color: #121617; +} +.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-info strong { + color: inherit; +} +.hero.is-info .title { + color: #121617; +} +.hero.is-info .subtitle { + color: rgba(18,22,23,0.9); +} +.hero.is-info .subtitle a:not(.button), +.hero.is-info .subtitle strong { + color: #121617; +} +@media screen and (max-width: 1087px) { + .hero.is-info .navbar-menu { + background-color: #02d7f2; + } +} +.hero.is-info .navbar-item, +.hero.is-info .navbar-link { + color: rgba(18,22,23,0.7); +} +.hero.is-info a.navbar-item:hover, +.hero.is-info .navbar-link:hover, +.hero.is-info a.navbar-item.is-active, +.hero.is-info .navbar-link.is-active { + background-color: #02c1d9; + color: #121617; +} +.hero.is-info .tabs a { + color: #121617; + opacity: 0.9; +} +.hero.is-info .tabs a:hover { + opacity: 1; +} +.hero.is-info .tabs li.is-active a { + opacity: 1; +} +.hero.is-info .tabs.is-boxed a, +.hero.is-info .tabs.is-toggle a { + color: #121617; +} +.hero.is-info .tabs.is-boxed a:hover, +.hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-info .tabs.is-boxed li.is-active a, +.hero.is-info .tabs.is-toggle li.is-active a, +.hero.is-info .tabs.is-boxed li.is-active a:hover, +.hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #121617; + border-color: #121617; + color: #02d7f2; +} +.hero.is-info.is-bold { + background-image: linear-gradient(141deg, #00c1b7 0%, #02d7f2 71%, #0ebcff 100%); +} +@media screen and (max-width: 768px) { + .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #00c1b7 0%, #02d7f2 71%, #0ebcff 100%); + } +} +.hero.is-success { + background-color: #00ff41; + color: #121617; +} +.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-success strong { + color: inherit; +} +.hero.is-success .title { + color: #121617; +} +.hero.is-success .subtitle { + color: rgba(18,22,23,0.9); +} +.hero.is-success .subtitle a:not(.button), +.hero.is-success .subtitle strong { + color: #121617; +} +@media screen and (max-width: 1087px) { + .hero.is-success .navbar-menu { + background-color: #00ff41; + } +} +.hero.is-success .navbar-item, +.hero.is-success .navbar-link { + color: rgba(18,22,23,0.7); +} +.hero.is-success a.navbar-item:hover, +.hero.is-success .navbar-link:hover, +.hero.is-success a.navbar-item.is-active, +.hero.is-success .navbar-link.is-active { + background-color: #00e63a; + color: #121617; +} +.hero.is-success .tabs a { + color: #121617; + opacity: 0.9; +} +.hero.is-success .tabs a:hover { + opacity: 1; +} +.hero.is-success .tabs li.is-active a { + opacity: 1; +} +.hero.is-success .tabs.is-boxed a, +.hero.is-success .tabs.is-toggle a { + color: #121617; +} +.hero.is-success .tabs.is-boxed a:hover, +.hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-success .tabs.is-boxed li.is-active a, +.hero.is-success .tabs.is-toggle li.is-active a, +.hero.is-success .tabs.is-boxed li.is-active a:hover, +.hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #121617; + border-color: #121617; + color: #00ff41; +} +.hero.is-success.is-bold { + background-image: linear-gradient(141deg, #00cc12 0%, #00ff41 71%, #1aff7a 100%); +} +@media screen and (max-width: 768px) { + .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #00cc12 0%, #00ff41 71%, #1aff7a 100%); + } +} +.hero.is-warning { + background-color: #ff8e3c; + color: #121617; +} +.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-warning strong { + color: inherit; +} +.hero.is-warning .title { + color: #121617; +} +.hero.is-warning .subtitle { + color: rgba(18,22,23,0.9); +} +.hero.is-warning .subtitle a:not(.button), +.hero.is-warning .subtitle strong { + color: #121617; +} +@media screen and (max-width: 1087px) { + .hero.is-warning .navbar-menu { + background-color: #ff8e3c; + } +} +.hero.is-warning .navbar-item, +.hero.is-warning .navbar-link { + color: rgba(18,22,23,0.7); +} +.hero.is-warning a.navbar-item:hover, +.hero.is-warning .navbar-link:hover, +.hero.is-warning a.navbar-item.is-active, +.hero.is-warning .navbar-link.is-active { + background-color: #ff7f22; + color: #121617; +} +.hero.is-warning .tabs a { + color: #121617; + opacity: 0.9; +} +.hero.is-warning .tabs a:hover { + opacity: 1; +} +.hero.is-warning .tabs li.is-active a { + opacity: 1; +} +.hero.is-warning .tabs.is-boxed a, +.hero.is-warning .tabs.is-toggle a { + color: #121617; +} +.hero.is-warning .tabs.is-boxed a:hover, +.hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-warning .tabs.is-boxed li.is-active a, +.hero.is-warning .tabs.is-toggle li.is-active a, +.hero.is-warning .tabs.is-boxed li.is-active a:hover, +.hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: #121617; + border-color: #121617; + color: #ff8e3c; +} +.hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #ff4809 0%, #ff8e3c 71%, #ffb956 100%); +} +@media screen and (max-width: 768px) { + .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #ff4809 0%, #ff8e3c 71%, #ffb956 100%); + } +} +.hero.is-danger { + background-color: #ff003c; + color: #121617; +} +.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-danger strong { + color: inherit; +} +.hero.is-danger .title { + color: #121617; +} +.hero.is-danger .subtitle { + color: rgba(18,22,23,0.9); +} +.hero.is-danger .subtitle a:not(.button), +.hero.is-danger .subtitle strong { + color: #121617; +} +@media screen and (max-width: 1087px) { + .hero.is-danger .navbar-menu { + background-color: #ff003c; + } +} +.hero.is-danger .navbar-item, +.hero.is-danger .navbar-link { + color: rgba(18,22,23,0.7); +} +.hero.is-danger a.navbar-item:hover, +.hero.is-danger .navbar-link:hover, +.hero.is-danger a.navbar-item.is-active, +.hero.is-danger .navbar-link.is-active { + background-color: #e60036; + color: #121617; +} +.hero.is-danger .tabs a { + color: #121617; + opacity: 0.9; +} +.hero.is-danger .tabs a:hover { + opacity: 1; +} +.hero.is-danger .tabs li.is-active a { + opacity: 1; +} +.hero.is-danger .tabs.is-boxed a, +.hero.is-danger .tabs.is-toggle a { + color: #121617; +} +.hero.is-danger .tabs.is-boxed a:hover, +.hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-danger .tabs.is-boxed li.is-active a, +.hero.is-danger .tabs.is-toggle li.is-active a, +.hero.is-danger .tabs.is-boxed li.is-active a:hover, +.hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #121617; + border-color: #121617; + color: #ff003c; +} +.hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #cc0052 0%, #ff003c 71%, #ff1a2a 100%); +} +@media screen and (max-width: 768px) { + .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #cc0052 0%, #ff003c 71%, #ff1a2a 100%); + } +} +.hero.is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.hero.is-grey-lightest a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-grey-lightest strong { + color: inherit; +} +.hero.is-grey-lightest .title { + color: #363636; +} +.hero.is-grey-lightest .subtitle { + color: rgba(54,54,54,0.9); +} +.hero.is-grey-lightest .subtitle a:not(.button), +.hero.is-grey-lightest .subtitle strong { + color: #363636; +} +@media screen and (max-width: 1087px) { + .hero.is-grey-lightest .navbar-menu { + background-color: #ededed; + } +} +.hero.is-grey-lightest .navbar-item, +.hero.is-grey-lightest .navbar-link { + color: rgba(54,54,54,0.7); +} +.hero.is-grey-lightest a.navbar-item:hover, +.hero.is-grey-lightest .navbar-link:hover, +.hero.is-grey-lightest a.navbar-item.is-active, +.hero.is-grey-lightest .navbar-link.is-active { + background-color: #e0e0e0; + color: #363636; +} +.hero.is-grey-lightest .tabs a { + color: #363636; + opacity: 0.9; +} +.hero.is-grey-lightest .tabs a:hover { + opacity: 1; +} +.hero.is-grey-lightest .tabs li.is-active a { + opacity: 1; +} +.hero.is-grey-lightest .tabs.is-boxed a, +.hero.is-grey-lightest .tabs.is-toggle a { + color: #363636; +} +.hero.is-grey-lightest .tabs.is-boxed a:hover, +.hero.is-grey-lightest .tabs.is-toggle a:hover { + background-color: rgba(0,0,0,0.1); +} +.hero.is-grey-lightest .tabs.is-boxed li.is-active a, +.hero.is-grey-lightest .tabs.is-toggle li.is-active a, +.hero.is-grey-lightest .tabs.is-boxed li.is-active a:hover, +.hero.is-grey-lightest .tabs.is-toggle li.is-active a:hover { + background-color: #363636; + border-color: #363636; + color: #ededed; +} +.hero.is-grey-lightest.is-bold { + background-image: linear-gradient(141deg, #d8cfcf 0%, #ededed 71%, #faf9f9 100%); +} +@media screen and (max-width: 768px) { + .hero.is-grey-lightest.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #d8cfcf 0%, #ededed 71%, #faf9f9 100%); + } +} +.hero.is-small .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; +} +@media screen and (min-width: 769px), print { + .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; + } +} +@media screen and (min-width: 769px), print { + .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; + } +} +.hero.is-halfheight .hero-body, +.hero.is-fullheight .hero-body, +.hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; +} +.hero.is-halfheight .hero-body > .container, +.hero.is-fullheight .hero-body > .container, +.hero.is-fullheight-with-navbar .hero-body > .container { + flex-grow: 1; + flex-shrink: 1; +} +.hero.is-halfheight { + min-height: 50vh; +} +.hero.is-fullheight { + min-height: 100vh; +} +.hero-video { + overflow: hidden; +} +.hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); +} +.hero-video.is-transparent { + opacity: 0.3; +} +@media screen and (max-width: 768px) { + .hero-video { + display: none; + } +} +.hero-buttons { + margin-top: 1.5rem; +} +@media screen and (max-width: 768px) { + .hero-buttons .button { + display: flex; + } + .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; + } +} +@media screen and (min-width: 769px), print { + .hero-buttons { + display: flex; + justify-content: center; + } + .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; + } +} +.hero-head, +.hero-foot { + flex-grow: 0; + flex-shrink: 0; +} +.hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; +} +.section { + padding: 3rem 1.5rem; +} +@media screen and (min-width: 1088px) { + .section.is-medium { + padding: 9rem 1.5rem; + } + .section.is-large { + padding: 18rem 1.5rem; + } +} +.footer { + background-color: #fcee09; + padding: 3rem 1.5rem 6rem; + color: #000; +} +html { + height: 100%; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-size-adjust: 100%; +} +body { + min-height: 100%; + display: flex; + flex-direction: column; +} +body > .section { + flex-grow: 1; +} +::-webkit-scrollbar { + width: 10px; + height: 8px; +} +::-webkit-scrollbar-track { + border-radius: 3px; + background: rgba(0,0,0,0.06); + box-shadow: inset 0 0 5px rgba(0,0,0,0.1); +} +::-webkit-scrollbar-thumb { + border-radius: 3px; + background: rgba(0,0,0,0.12); + box-shadow: inset 0 0 10px rgba(0,0,0,0.2); +} +::-webkit-scrollbar-thumb:hover { + background: rgba(0,0,0,0.24); +} +.ml-0, +.mx-0 { + margin-left: 0 !important; +} +.mr-0, +.mx-0 { + margin-right: 0 !important; +} +.ml-n0, +.mx-n0 { + margin-left: 0 !important; +} +.mr-n0, +.mx-n0 { + margin-right: 0 !important; +} +.mt-0, +.my-0 { + margin-top: 0 !important; +} +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} +.mt-n0, +.my-n0 { + margin-top: 0 !important; +} +.mb-n0, +.my-n0 { + margin-bottom: 0 !important; +} +.pl-0, +.px-0 { + padding-left: 0 !important; +} +.pr-0, +.px-0 { + padding-right: 0 !important; +} +.pl-n0, +.px-n0 { + padding-left: 0 !important; +} +.pr-n0, +.px-n0 { + padding-right: 0 !important; +} +.pt-0, +.py-0 { + padding-top: 0 !important; +} +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} +.pt-n0, +.py-n0 { + padding-top: 0 !important; +} +.pb-n0, +.py-n0 { + padding-bottom: 0 !important; +} +.ml-1, +.mx-1, +.article-licensing .licensing-meta .icons .icon { + margin-left: 0.25rem !important; +} +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} +.mb-1, +.my-1, +.article-licensing .licensing-title p:not(:last-child) { + margin-bottom: 0.25rem !important; +} +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} +.pl-n1, +.px-n1 { + padding-left: -0.25rem !important; +} +.pr-n1, +.px-n1 { + padding-right: -0.25rem !important; +} +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} +.pt-n1, +.py-n1 { + padding-top: -0.25rem !important; +} +.pb-n1, +.py-n1 { + padding-bottom: -0.25rem !important; +} +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} +.pl-n2, +.px-n2 { + padding-left: -0.5rem !important; +} +.pr-n2, +.px-n2 { + padding-right: -0.5rem !important; +} +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} +.pt-n2, +.py-n2 { + padding-top: -0.5rem !important; +} +.pb-n2, +.py-n2 { + padding-bottom: -0.5rem !important; +} +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} +.mt-3, +.my-3 { + margin-top: 1rem !important; +} +.mb-3, +.my-3, +.article-licensing .licensing-title { + margin-bottom: 1rem !important; +} +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} +.pl-3, +.px-3 { + padding-left: 1rem !important; +} +.pr-3, +.px-3 { + padding-right: 1rem !important; +} +.pl-n3, +.px-n3 { + padding-left: -1rem !important; +} +.pr-n3, +.px-n3 { + padding-right: -1rem !important; +} +.pt-3, +.py-3 { + padding-top: 1rem !important; +} +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} +.pt-n3, +.py-n3 { + padding-top: -1rem !important; +} +.pb-n3, +.py-n3 { + padding-bottom: -1rem !important; +} +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} +.mr-4, +.mx-4, +.article-licensing .licensing-meta .level-item { + margin-right: 1.5rem !important; +} +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} +.pl-n4, +.px-n4 { + padding-left: -1.5rem !important; +} +.pr-n4, +.px-n4 { + padding-right: -1.5rem !important; +} +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} +.pt-n4, +.py-n4 { + padding-top: -1.5rem !important; +} +.pb-n4, +.py-n4 { + padding-bottom: -1.5rem !important; +} +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} +.mt-5, +.my-5 { + margin-top: 3rem !important; +} +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} +.pl-5, +.px-5 { + padding-left: 3rem !important; +} +.pr-5, +.px-5 { + padding-right: 3rem !important; +} +.pl-n5, +.px-n5 { + padding-left: -3rem !important; +} +.pr-n5, +.px-n5 { + padding-right: -3rem !important; +} +.pt-5, +.py-5 { + padding-top: 3rem !important; +} +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} +.pt-n5, +.py-n5 { + padding-top: -3rem !important; +} +.pb-n5, +.py-n5 { + padding-bottom: -3rem !important; +} +.ml-auto, +.mx-auto { + margin-left: auto !important; +} +.mr-auto, +.mx-auto { + margin-right: auto !important; +} +.mt-auto, +.my-auto { + margin-top: auto !important; +} +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} +.pl-auto, +.px-auto { + margin-left: auto !important; +} +.pr-auto, +.px-auto { + margin-right: auto !important; +} +.pt-auto, +.py-auto { + margin-top: auto !important; +} +.pb-auto, +.py-auto { + margin-bottom: auto !important; +} +.order-0 { + order: 0 !important; +} +.order-1 { + order: 1 !important; +} +.order-2 { + order: 2 !important; +} +.order-3 { + order: 3 !important; +} +.order-4 { + order: 4 !important; +} +.order-5 { + order: 5 !important; +} +.justify-content-start { + justify-content: start !important; +} +.justify-content-center { + justify-content: center !important; +} +.flex-shrink-1 { + flex-shrink: 1 !important; +} +.link-muted { + color: inherit; + transition: 0.2s ease; +} +.link-muted:hover { + color: #fcee09 !important; +} +.image.is-7by3 { + padding-top: 42.8%; +} +.image.is-7by3 img { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.image .avatar { + height: 100%; + object-fit: cover; +} +.image .fill { + object-fit: cover; + width: 100% !important; + height: 100% !important; +} +.button.is-transparent { + color: inherit; + background: transparent; + border-color: transparent; +} +.card { + overflow: visible; + border-radius: 0; +} +.card:hover { + box-shadow: 0 6px 15px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.1); +} +.card + .card, +.card + .column-right-shadow { + margin-top: 1.5rem; +} +.card .card-image { + overflow: hidden; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.card .media + .media { + border: none; + margin-top: 0; +} +article.media { + color: #848484; +} +article.media a { + color: inherit; +} +article.media a:hover { + color: #fcee09; +} +article.media .image { + width: 64px; + height: 64px; +} +article.media .image img { + object-fit: cover; + width: 100%; + height: 100%; +} +article.media .title { + margin-bottom: 0.25em; +} +article.media .media-content { + color: #848484; +} +article.media .media-content .title { + margin: 0; + line-height: inherit; +} +article.article { + padding: 1.5rem 1.8rem; +} +article.article .title { + margin: 0 0 0.5rem -0.1rem !important; +} +article.article .title .fas { + margin-right: 0.5rem; +} +article.article .article-meta, +article.article .article-tags { + color: #848484; +} +article.article .article-meta { + overflow-x: auto; + margin-bottom: 1.5rem !important; +} +article.article .article-meta >:first-child { + flex-wrap: wrap; + width: 100%; +} +article.article .article-meta >:first-child >* { + flex-grow: 0 !important; +} +article.article .content { + word-wrap: break-word; + font-size: 1.1rem; + letter-spacing: 0.02rem; +} +article.article .content h1 { + font-size: 1.75em; +} +article.article .content h2 { + font-size: 1.5em; +} +article.article .content h3 { + font-size: 1.25em; +} +article.article .content h4 { + font-size: 1.125em; +} +article.article .content h5 { + font-size: 1em; +} +article.article .content pre { + font-size: 0.95em; +} +article.article .content code { + font-size: 0.95em; + padding: 0; + background: transparent; + overflow-wrap: break-word; +} +article.article .content blockquote.pullquote { + float: right; + max-width: 50%; + font-size: 1.15rem; + position: relative; +} +article.article .content blockquote footer strong + cite { + margin-left: 0.5em; +} +article.article .content .message.message-immersive { + border-radius: 0; + margin: 0 -1.8rem 1.5rem -1.8rem; +} +article.article .content .message.message-immersive .message-body { + border: none; +} +article.article .article-tags { + display: flex; + flex-wrap: wrap; +} +.rtl { + direction: rtl; +} +.rtl .level .level-item:not(:last-child), +.rtl .level.is-mobile .level-item:not(:last-child) { + margin-left: 0.75rem; + margin-right: 0; +} +.table-overflow { + overflow-x: auto; +} +.table-overflow table { + width: auto !important; +} +.table-overflow table th { + word-break: keep-all; +} +.video-container { + position: relative; + padding-bottom: 56.25%; + padding-top: 25px; + height: 0; +} +.video-container iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.article-licensing { + position: relative; + z-index: 1; + box-shadow: none; + background: #f5f5f5; + border-radius: 0; + overflow: hidden; +} +.article-licensing:after { + position: absolute; + z-index: -1; + right: -50px; + top: -87.87px; + content: '\f25e'; + font-size: 200px; + font-family: 'Font Awesome 5 Brands'; + opacity: 0.1; +} +.article-licensing .level-left { + flex-wrap: wrap; + max-width: 100%; +} +.article-licensing .licensing-title { + line-height: 1.2; +} +.article-licensing .licensing-meta .icons .icon { + width: 1.2em; + height: 1.2em; + font-size: 1.2em; + vertical-align: bottom; +} +.article-licensing .licensing-meta a { + color: inherit; +} +a.article-nav-prev span { + text-align: left; + flex-shrink: 1; + word-wrap: break-word; + white-space: normal; +} +a.article-nav-next span { + text-align: right; + flex-shrink: 1; + word-wrap: break-word; + white-space: normal; +} +.article { + counter-reset: section; +} +.article h2 { + counter-reset: sub-section; +} +.article h3 { + counter-reset: composite; +} +.article h4 { + counter-reset: detail; +} +.article h2:before { + content: counter(section) " "; + counter-increment: section; +} +.article h3:before { + content: counter(section) "." counter(sub-section) " "; + counter-increment: sub-section; +} +.article h4:before { + content: counter(section) "." counter(sub-section) "." counter(composite) " "; + counter-increment: composite; +} +.navbar-main { + box-shadow: none; +} +.navbar-main .navbar-container { + overflow-x: auto; +} +.navbar-main .navbar-menu, +.navbar-main .navbar-start, +.navbar-main .navbar-end { + align-items: stretch; + display: flex; + padding: 0; + flex-shrink: 0; +} +.navbar-main .navbar-menu { + flex-grow: 1; + flex-shrink: 0; + overflow-x: auto; +} +.navbar-main .navbar-start { + justify-content: flex-start; + margin-right: auto; +} +.navbar-main .navbar-end { + justify-content: flex-end; + margin-left: auto; +} +.navbar-main .navbar-item { + display: flex; + align-items: center; + padding: 0 0.5rem; + margin: 1.25rem 0.25rem; +} +.navbar-main .navbar-item.is-active { + background-color: transparent; +} +@media screen and (max-width: 1087px) { + .navbar-main .navbar-menu { + justify-content: center; + box-shadow: none; + } + .navbar-main .navbar-start { + margin-right: 0; + } + .navbar-main .navbar-end { + margin-left: 0; + } +} +.navbar-logo img { + max-height: 2.5rem; +} +@media screen and (min-width: 1088px) { + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: 0rem; + } +} +footer.footer { + padding: 1.5rem; +} +@media screen and (max-width: 768px) { + footer.footer .level-start { + text-align: center; + } +} +footer.footer .level-end .field { + flex-wrap: wrap; + align-items: center; +} +@media screen and (max-width: 768px) { + footer.footer .level-end .field { + justify-content: center; + margin-top: 1rem; + } +} +.footer-logo img { + max-height: 2.5rem; +} +.pagination { + margin-top: 1.5rem; +} +.pagination .pagination-link a, +.pagination .pagination-ellipsis a, +.pagination .pagination-previous a, +.pagination .pagination-next a { + color: #fcee09; +} +.pagination .pagination-link, +.pagination .pagination-previous, +.pagination .pagination-next { + border: none; + background: #000; + box-shadow: none, 0 0 1px rgba(0,0,0,0.1); +} +.pagination .pagination-link.is-current { + background: #02d7f2; +} +.post-navigation { + color: #cdcdcd; + flex-wrap: wrap; + justify-content: space-around; +} +.post-navigation .level-item { + margin-bottom: 0; +} +.timeline { + margin-left: 1rem; + padding: 1rem 0 0 1.5rem; + border-left: 1px solid #02d7f2; +} +.timeline .media { + position: relative; +} +.timeline .media:before, +.timeline .media:last-child:after { + content: ''; + display: block; + position: absolute; + left: calc(-0.375rem - 1.5rem - 0.25px); +} +.timeline .media:before { + width: 0.75rem; + height: 0.75rem; + top: calc(1rem + 1.5 * 0.85rem / 2 - 0.75rem / 2); + background: #02d7f2; + border-radius: 50%; +} +.timeline .media:first-child:before { + top: calc(1.5 * 0.85rem / 2 - 0.75rem / 2); +} +.timeline .media:last-child:after { + width: 0.75rem; + top: calc(1rem + 1.5 * 0.85rem / 2 + 0.75rem / 2); + bottom: 0; + background: #000; +} +.timeline .media:first-child:last-child:after { + top: calc(1.5 * 0.85rem / 2 + 0.75rem / 2); +} +.searchbox { + display: none; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; + font-size: 1rem; + line-height: 0; + background: rgba(0,0,0,0.86); +} +.searchbox.show { + display: flex; +} +.searchbox a, +.searchbox a:hover { + color: inherit; + text-decoration: none; +} +.searchbox input { + font-size: 1rem; + border: none; + outline: none; + box-shadow: none; + border-radius: 0; +} +.searchbox, +.searchbox .searchbox-container { + position: fixed; + align-items: center; + flex-direction: column; + line-height: 1.25em; +} +.searchbox .searchbox-container { + z-index: 101; + display: flex; + overflow: hidden; + box-shadow: none, 0 0 1px rgba(0,0,0,0.1); + border-radius: 0; + background-color: #050a0e; + width: 540px; + top: 100px; + bottom: 100px; +} +.searchbox .searchbox-header, +.searchbox .searchbox-body, +.searchbox .searchbox-footer { + width: 100%; +} +.searchbox .searchbox-header { + display: flex; + flex-direction: row; + line-height: 1.5em; + font-weight: normal; + background-color: #050a0e; + min-height: 3rem; +} +.searchbox .searchbox-input-container { + display: flex; + flex-grow: 1; +} +.searchbox .searchbox-input { + flex-grow: 1; + color: inherit; + box-sizing: border-box; + padding: 0.75em 0 0.75em 1.25em; + background: #050a0e; +} +.searchbox .searchbox-close { + display: inline-block; + font-size: 1.5em; + padding: 0.5em 0.75em; + cursor: pointer; +} +.searchbox .searchbox-close:hover { + background: #000; +} +.searchbox .searchbox-close:active { + background: #000; +} +.searchbox .searchbox-body { + flex-grow: 1; + overflow-y: auto; + border-top: 1px solid #02d7f2; +} +.searchbox .searchbox-result-section header, +.searchbox .searchbox-result-item { + padding: 0.75em 1em; +} +.searchbox .searchbox-result-section { + border-bottom: 1px solid #02d7f2; +} +.searchbox .searchbox-result-section header { + color: #b5b5b5; +} +.searchbox .searchbox-result-item { + display: flex; + flex-direction: row; +} +.searchbox .searchbox-result-item:not(.disabled):not(.active):not(:active):hover { + background-color: #000; +} +.searchbox .searchbox-result-item:active, +.searchbox .searchbox-result-item.active { + color: rgba(0,0,0,0.7); + background-color: #fcee09; +} +.searchbox .searchbox-result-item em { + font-style: normal; + background: #fcee09; +} +.searchbox .searchbox-result-icon { + margin-right: 1em; +} +.searchbox .searchbox-result-content { + overflow: hidden; +} +.searchbox .searchbox-result-title, +.searchbox .searchbox-result-preview { + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.searchbox .searchbox-result-title-secondary { + color: #b5b5b5; +} +.searchbox .searchbox-result-preview { + margin-top: 0.25em; +} +.searchbox .searchbox-result-item:not(:active):not(.active) .searchbox-result-preview { + color: #b5b5b5; +} +.searchbox .searchbox-footer { + padding: 0.5em 1em; +} +.searchbox .searchbox-pagination { + margin: 0; + padding: 0; + list-style: none; + text-align: center; +} +.searchbox .searchbox-pagination .searchbox-pagination-item { + margin: 0 0.25rem; +} +.searchbox .searchbox-pagination .searchbox-pagination-item, +.searchbox .searchbox-pagination .searchbox-pagination-link { + display: inline-block; +} +.searchbox .searchbox-pagination .searchbox-pagination-link { + overflow: hidden; + padding: 0.5em 0.8em; + box-shadow: none, 0 0 1px rgba(0,0,0,0.1); + border-radius: 0; + background-color: #050a0e; +} +.searchbox .searchbox-pagination .searchbox-pagination-item.active .searchbox-pagination-link { + color: rgba(0,0,0,0.7); + background-color: #fcee09; +} +.searchbox .searchbox-pagination .searchbox-pagination-item.disabled .searchbox-pagination-link { + cursor: not-allowed; + background-color: #050a0e; +} +.searchbox .searchbox-pagination .searchbox-pagination-item:not(.active):not(.disabled) .searchbox-pagination-link:hover { + background-color: #050a0e; +} +@media screen and (max-width: 559px), screen and (max-height: 479px) { + .searchbox .searchbox-container { + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 0; + } +} +div.highlight-tree td.code pre { + font-family: Consolas, Menlo, Courier, monospace !important; + font-size: 0.9em; +} +figure.highlight { + padding: 0; + width: 100%; + position: relative; + margin: 1em 0 1em !important; + border-radius: 0; +} +figure.highlight span.fold { + width: 18px; +} +figure.highlight.folded .highlight-body { + height: 0; +} +figure.highlight .copy { + opacity: 0.7; +} +figure.highlight pre, +figure.highlight table tr:hover { + color: inherit; + background: transparent; +} +figure.highlight table { + width: auto; +} +figure.highlight table tr td { + border: none; +} +figure.highlight table tr:not(:first-child) td { + padding-top: 0; +} +figure.highlight table tr:not(:last-child) td { + padding-bottom: 0; +} +figure.highlight pre { + padding: 0; + overflow: visible; +} +figure.highlight pre .line, +figure.highlight pre code .hljs { + line-height: 1.5rem; +} +figure.highlight figcaption, +figure.highlight .gutter { + background: rgba(200,200,200,0.15); +} +figure.highlight figcaption { + margin: 0 !important; + padding: 0.3em 0em 0.3em 0.75em; + font-style: normal; + font-size: 0.8em; +} +figure.highlight figcaption * { + color: inherit; +} +figure.highlight figcaption span { + font-weight: 500; + font-family: 'Roboto Mono', monospace, 'Microsoft YaHei'; +} +figure.highlight figcaption .level-left *:not(:last-child) { + margin-right: 0.5em; +} +figure.highlight figcaption .level-right *:not(:first-child) { + margin-left: 0.5em; +} +figure.highlight figcaption .fold { + cursor: pointer; +} +figure.highlight figcaption.level { + overflow: auto; +} +figure.highlight figcaption.level .level-right a { + padding: 0em 0.75em; +} +figure.highlight .highlight-body { + overflow: auto; +} +figure.highlight .gutter { + text-align: right; +} +figure.highlight .tag, +figure.highlight .title, +figure.highlight .number, +figure.highlight .section { + display: inherit; + font: inherit; + margin: inherit; + padding: inherit; + background: inherit; + height: inherit; + text-align: inherit; + vertical-align: inherit; + min-width: inherit; + border-radius: inherit; +} +figure.highlight.foldable div.level-left { + cursor: pointer; +} +.gist table tr:hover { + background: transparent; +} +.gist table td { + border: none; +} +.gist .file { + all: initial; +} +.widget .menu-list li ul { + margin-right: 0; +} +.widget .menu-list .level { + margin-bottom: 0; +} +.widget .menu-list .level .level-left, +.widget .menu-list .level .level-right, +.widget .menu-list .level .level-item { + flex-shrink: 1; +} +.widget .menu-list .level .level-left, +.widget .menu-list .level .level-right { + align-items: flex-start; +} +.widget .menu-list .tag { + background: $light-grey; + color: $white-invert; +} +.widget .tags .tag:first-child { + background: #fcee09; + color: #121617; +} +.widget .tags .tag:last-child { + background: $light-grey; + color: $white-invert; +} +#toc { + max-height: calc(100vh - 22px); + overflow-y: scroll; +} +.level.is-multiline { + flex-wrap: wrap; +} +@media screen and (max-width: 768px) { + .widget.card#toc { + display: none; + position: fixed; + margin: 1rem; + left: 0; + right: 0; + bottom: 0; + z-index: 100; + } + .widget.card#toc .card-content { + padding: 0; + } + .widget.card#toc .menu { + padding: 1.5rem; + max-height: calc(100vh - 2rem); + overflow-y: auto; + } + #toc-mask { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 99; + background: rgba(0,0,0,0.7); + } + .widget.card#toc.is-active, + #toc-mask.is-active { + display: block; + } +} +.donate { + position: relative; +} +.donate .qrcode { + display: none; + position: absolute; + z-index: 99; + bottom: 2.5em; + line-height: 0; + overflow: hidden; + box-shadow: none, 0 0 1px rgba(0,0,0,0.1); + border-radius: 0; +} +.donate .qrcode img { + max-width: 280px; +} +.donate:hover .qrcode { + display: block; +} +.donate:first-child:not(:last-child) .qrcode { + left: -0.75rem; +} +.donate:last-child:not(:first-child) .qrcode { + right: -0.75rem; +} +.donate[data-type="afdian"] { + color: #fff; + background-color: #885fd9; + border-color: transparent; +} +.donate[data-type="afdian"]:active { + background-color: #794ad4; +} +.donate[data-type="afdian"]:hover { + background-color: #8055d7; +} +.donate[data-type="afdian"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(136,95,217,0.25); +} +.donate[data-type="alipay"] { + color: #fff; + background-color: #00a0e8; + border-color: transparent; +} +.donate[data-type="alipay"]:active { + background-color: #008ecf; +} +.donate[data-type="alipay"]:hover { + background-color: #0097db; +} +.donate[data-type="alipay"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0,160,232,0.25); +} +.donate[data-type="buymeacoffee"] { + color: rgba(0,0,0,0.7); + background-color: #fd0; + border-color: transparent; +} +.donate[data-type="buymeacoffee"]:active { + background-color: #e6c700; +} +.donate[data-type="buymeacoffee"]:hover { + background-color: #f2d200; +} +.donate[data-type="buymeacoffee"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,221,0,0.25); +} +.donate[data-type="paypal"] { + color: rgba(0,0,0,0.7); + background-color: #feb700; + border-color: transparent; +} +.donate[data-type="paypal"]:active { + background-color: #e5a500; +} +.donate[data-type="paypal"]:hover { + background-color: #f1ae00; +} +.donate[data-type="paypal"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(254,183,0,0.25); +} +.donate[data-type="patreon"] { + color: #fff; + background-color: #ff424d; + border-color: transparent; +} +.donate[data-type="patreon"]:active { + background-color: #ff2835; +} +.donate[data-type="patreon"]:hover { + background-color: #ff3541; +} +.donate[data-type="patreon"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,66,77,0.25); +} +.donate[data-type="wechat"] { + color: #fff; + background-color: #1aad19; + border-color: transparent; +} +.donate[data-type="wechat"]:active { + background-color: #179716; +} +.donate[data-type="wechat"]:hover { + background-color: #18a217; +} +.donate[data-type="wechat"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(26,173,25,0.25); +} +#back-to-top { + position: fixed; + opacity: 0; + outline: none; + padding: 8px 0; + line-height: 24px; + border-radius: 0; + transform: translateY(120px); + transition: 0.4s ease opacity, 0.4s ease width, 0.4s ease transform, 0.4s ease border-radius; +} +#back-to-top.is-rounded { + border-radius: 50%; +} +#back-to-top.fade-in { + opacity: 1; +} +#back-to-top.rise-up { + transform: translateY(0); +} +.gallery-item .caption { + color: #848484; +} +.pace { + user-select: none; + pointer-events: none; +} +.pace .pace-progress { + top: 0; + right: 100%; + width: 100%; + height: 2px; + z-index: 2000; + position: fixed; + background: #fcee09; +} +.pace-inactive { + display: none; +} +.fa, +.fab, +.fal, +.far, +.fas { + line-height: inherit; +} +.MathJax, +.MathJax_Display, +.MJXc-display, +.MathJax_SVG_Display, +.katex-display { + overflow-x: auto; + overflow-y: hidden; +} +.katex { + white-space: nowrap; +} +.katex-display { + margin-top: -1em !important; +} +.katex-html { + padding-top: 1em; +} +.katex-html .tag { + align-items: unset; + background-color: unset; + border-radius: unset; + color: unset; + display: unset; + font-size: unset; + height: unset; + justify-content: unset; + line-height: unset; + padding-left: unset; + padding-right: unset; + white-space: unset; +} +.cc-window, +.cc-revoke { + font-size: 1.1rem !important; + font-family: 'Oxanium', Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.cc-window { + color: #cdcdcd !important; + background-color: #000 !important; +} +.cc-window.cc-floating { + border-radius: 0; + box-shadow: none, 0 0 1px rgba(0,0,0,0.1); +} +.cc-window.cc-banner { + background-color: #000 !important; +} +.cc-window.cc-theme-block .cc-compliance > .cc-btn, +.cc-window.cc-theme-classic .cc-compliance > .cc-btn { + border-radius: 290486px; +} +.cc-window .cc-compliance > .cc-btn { + font-weight: 400; + border: none; + color: #121617; + background-color: #fcee09; +} +.cc-window .cc-compliance > .cc-btn:hover, +.cc-window .cc-compliance > .cc-btn:focus { + background-color: #f5e703; +} +.cc-window .cc-compliance > .cc-btn.cc-deny:hover { + color: #fcee09; + text-decoration: none; +} +.cc-revoke { + padding: 0.5rem 1rem !important; + color: #121617 !important; + background-color: #fcee09 !important; +} +.cc-revoke:hover { + text-decoration: none !important; + background-color: #f5e703; +} +@media screen and (min-width: 1280px) { + .is-3-column .container { + max-width: 1216px; + width: 1216px; + } + .is-1-column .container, + .is-2-column .container { + max-width: 960px; + width: 960px; + } +} +@media screen and (min-width: 1472px) { + .is-3-column .container { + max-width: 1344px; + width: 1344px; + } + .is-2-column .container { + max-width: 1152px; + width: 1152px; + } + .is-1-column .container { + max-width: 960px; + width: 960px; + } +} +@media screen and (min-width: 769px), print { + .is-sticky { + position: -webkit-sticky; + position: sticky; + top: 1.5rem; + z-index: 99; + } + .column-main.is-sticky, + .column-left.is-sticky, + .column-right.is-sticky, + .column-right-shadow.is-sticky { + top: 0.75rem; + align-self: flex-start; + } +} +@media screen and (max-width: 768px) { + .section { + padding: 1.5rem 1rem; + } +} +.navbar-logo .logo-img-dark, +.footer-logo .logo-img-dark { + display: none; +} +body.night { + background: #0e1225; +} +body.night .hljs { + display: block; + overflow-x: auto; + color: #abb2bf; + background: #282c34; +} +body.night .hljs-comment, +body.night .hljs-quote { + color: #5c6370; + font-style: italic; +} +body.night .hljs-doctag, +body.night .hljs-keyword, +body.night .hljs-formula { + color: #c678dd; +} +body.night .hljs-section, +body.night .hljs-name, +body.night .hljs-selector-tag, +body.night .hljs-deletion, +body.night .hljs-subst { + color: #e06c75; +} +body.night .hljs-literal { + color: #56b6c2; +} +body.night .hljs-string, +body.night .hljs-regexp, +body.night .hljs-addition, +body.night .hljs-attribute, +body.night .hljs-meta-string { + color: #98c379; +} +body.night .hljs-built_in, +body.night .hljs-class .hljs-title { + color: #e6c07b; +} +body.night .hljs-attr, +body.night .hljs-variable, +body.night .hljs-template-variable, +body.night .hljs-type, +body.night .hljs-selector-class, +body.night .hljs-selector-attr, +body.night .hljs-selector-pseudo, +body.night .hljs-number { + color: #d19a66; +} +body.night .hljs-symbol, +body.night .hljs-bullet, +body.night .hljs-link, +body.night .hljs-meta, +body.night .hljs-selector-id, +body.night .hljs-title { + color: #61aeee; +} +body.night .hljs-emphasis { + font-style: italic; +} +body.night .hljs-strong { + font-weight: bold; +} +body.night .hljs-link { + text-decoration: underline; +} +body.night .content code { + color: #cbba7d; +} +body.night #night-nav #night-icon:before { + content: '\f0eb'; +} +body.night img, +body.night video, +body.night iframe, +body.night .waifu, +body.night .donate { + filter: brightness(0.8); + -webkit-filter: brightness(0.8); +} +body.night .navbar-logo .logo-img, +body.night .footer-logo .logo-img { + display: none; +} +body.night .navbar-logo .logo-img-dark, +body.night .footer-logo .logo-img-dark { + display: inline-block; +} +body.night .navbar-main .navbar-menu .navbar-item:hover, +body.night .navbar-main .navbar-menu .navbar-item:focus { + color: #fff; + background-color: #373d48; +} +body.night .navbar-main .navbar-menu .navbar-item.is-active { + color: #c0c0c0; +} +body.night .navbar { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); +} +body.night .card { + background-color: rgba(40,44,52,0.5); + backdrop-filter: none; + -webkit-backdrop-filter: none; +} +body.night .card:hover { + background-color: rgba(40,44,52,0.8); +} +body.night .card .breadcrumb li.is-active a { + color: #c0c0c0; +} +body.night .footer { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); +} +body.night .input, +body.night .textarea { + background-color: #434a56; + border-color: #373d48; +} +body.night .button.is-primary, +body.night .button.is-light, +body.night .button.is-small { + background-color: #373d48; + color: #c0c0c0; +} +body.night .button.is-primary:hover, +body.night .button.is-light:hover, +body.night .button.is-small:hover, +body.night .button.is-primary.is-hovered, +body.night .button.is-light.is-hovered, +body.night .button.is-small.is-hovered { + color: #fff; + background-color: #434a56; +} +body.night .button.is-primary:active, +body.night .button.is-light:active, +body.night .button.is-small:active, +body.night .button.is-primary.is-active, +body.night .button.is-light.is-active, +body.night .button.is-small.is-active { + color: #fff; + background-color: #2c313a; +} +body.night .button.is-white, +body.night .button.is-transparent { + background-color: transparent; +} +body.night .button.is-white:hover, +body.night .button.is-transparent:hover { + background-color: #373d48 !important; +} +body.night .pagination .pagination-next, +body.night .pagination .pagination-previous, +body.night .pagination-link:not(.is-current) { + color: #c0c0c0; + background-color: #373d48; +} +body.night .pagination .pagination-next a, +body.night .pagination .pagination-previous a, +body.night .pagination-link:not(.is-current) a { + color: #c0c0c0; +} +body.night .pagination-link.is-current { + background-color: #434a56; + border-color: #434a56; +} +body.night [data-waline] .wl-wrap, +body.night [data-waline] .wl-wrap .wl-header .wl-input { + border-color: #373d48; +} +body.night [data-waline] .wl-wrap .wl-header .wl-input:focus { + border-color: #434a56; +} +body.night [data-waline] .wl-btn { + color: #c0c0c0; + background-color: #373d48; + border-color: #373d48; +} +body.night [data-waline] .wl-btn:hover { + background-color: #434a56; +} +body.night [data-waline] .wl-btn:active { + background-color: #2c313a; +} +body.night [data-waline] .wl-list .wl-card .wl-head .wl-sys { + background-color: #373d48; +} +body.night [data-waline] a:hover, +body.night [data-waline] .wl-list .wl-card .wl-h .wl-meta .wl-at { + color: #fff; +} +body.night [data-waline] .wl-list .wl-card .wl-content.expand:before { + background: -webkit-gradient(linear, left top, left bottom, , to(#252936)); + background: linear-gradient(180deg, rgba(37,41,54,0), #252936); +} +body.night [data-waline] .wl-list .wl-card .wl-content.expand:after { + background: #252936; +} +body.night [data-waline] .wl-list .wl-card .wl-h, +body.night [data-waline] .wl-list .wl-card .wl-quote { + border-color: #434a56; +} +body.night body, +body.night strong, +body.night time, +body.night .title, +body.night .footer, +body.night .card, +body.night .content h1, +body.night .content h2, +body.night .content h3, +body.night .content h4, +body.night .content h5, +body.night .content h6, +body.night .navbar-item, +body.night .navbar-item.is-active, +body.night .navbar-link, +body.night .menu-list a, +body.night .menu-label, +body.night .level-item, +body.night .input, +body.night .textarea, +body.night .button.is-white, +body.night .button.is-transparent, +body.night .article-licensing, +body.night [data-waline] * { + color: #c0c0c0; +} +body.night .media-content, +body.night .has-text-grey, +body.night .link-muted { + color: #c0c0c0 !important; +} +body.night a { + color: #5299e0; +} +body.night a:hover { + color: #fff; +} +body.night .timeline a, +body.night [data-type="recent-posts"] a { + color: #c0c0c0; +} +body.night .timeline a:hover, +body.night [data-type="recent-posts"] a:hover { + color: #fff; +} +body.night .content blockquote, +body.night .article-licensing { + background-color: #373d48; + border-color: #434a56; +} +body.night .content table thead td, +body.night .content table thead th { + color: #c0c0c0; +} +body.night .content table td, +body.night .content table th { + border-color: #434a56; +} +body.night hr { + background-color: #434a56; +} +body.night article.article .title a, +body.night article.media .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #c0c0c0 1px); +} +body.night article.article .title:hover a, +body.night article.media .title:hover a { + color: #c0c0c0 !important; +} +body.night .tag:not(body) { + color: #c0c0c0; + background-color: #373d48; +} +body.night .widget .tags .tag:first-child, +body.night .tag.is-grey { + background-color: #434a56; +} +body.night .menu-list a:hover { + background-color: #373d48; +} +body.night .menu-list a.is-active { + background-color: #434a56; +} +body.night .menu-list li ul { + border-color: #373d48; +} +body.night .timeline .media:last-child:after { + background-color: #252936; +} +body.night .timeline { + border-color: #434a56; +} +body.night .timeline .media:before { + background-color: #434a56; +} +body.night .searchbox .searchbox-container, +body.night .searchbox .searchbox-header, +body.night .searchbox .searchbox-header .searchbox-input, +body.night .searchbox .searchbox-header .searchbox-close, +body.night .searchbox .searchbox-body, +body.night .searchbox .searchbox-result-section, +body.night .searchbox .searchbox-result-item { + color: #c0c0c0; + background-color: #373d48; + border-color: #434a56; +} +body.night .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item:hover, +body.night .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item.active, +body.night .searchbox .searchbox-container .searchbox-header .searchbox-close:hover { + color: #fff; + background-color: #434a56; +} +body.night ::selection { + color: #fff; + background-color: rgba(52,109,167,0.8); +} +body.night ::-moz-selection { + color: #fff; + background-color: rgba(52,109,167,0.8); +} +body.night input:-webkit-autofill { + -webkit-text-fill-color: #c0c0c0 !important; + box-shadow: 0 0 0px 1000px #373d48 inset; +} +body.night .twikoo pre { + background-color: #373d48; +} +body.night .twikoo code { + color: #cbba7d; + background-color: #373d48; +} +@media (prefers-color-scheme: dark) { + body:not(.light) { + background: #0e1225; + } + body:not(.light) .hljs { + display: block; + overflow-x: auto; + color: #abb2bf; + background: #282c34; + } + body:not(.light) .hljs-comment, + body:not(.light) .hljs-quote { + color: #5c6370; + font-style: italic; + } + body:not(.light) .hljs-doctag, + body:not(.light) .hljs-keyword, + body:not(.light) .hljs-formula { + color: #c678dd; + } + body:not(.light) .hljs-section, + body:not(.light) .hljs-name, + body:not(.light) .hljs-selector-tag, + body:not(.light) .hljs-deletion, + body:not(.light) .hljs-subst { + color: #e06c75; + } + body:not(.light) .hljs-literal { + color: #56b6c2; + } + body:not(.light) .hljs-string, + body:not(.light) .hljs-regexp, + body:not(.light) .hljs-addition, + body:not(.light) .hljs-attribute, + body:not(.light) .hljs-meta-string { + color: #98c379; + } + body:not(.light) .hljs-built_in, + body:not(.light) .hljs-class .hljs-title { + color: #e6c07b; + } + body:not(.light) .hljs-attr, + body:not(.light) .hljs-variable, + body:not(.light) .hljs-template-variable, + body:not(.light) .hljs-type, + body:not(.light) .hljs-selector-class, + body:not(.light) .hljs-selector-attr, + body:not(.light) .hljs-selector-pseudo, + body:not(.light) .hljs-number { + color: #d19a66; + } + body:not(.light) .hljs-symbol, + body:not(.light) .hljs-bullet, + body:not(.light) .hljs-link, + body:not(.light) .hljs-meta, + body:not(.light) .hljs-selector-id, + body:not(.light) .hljs-title { + color: #61aeee; + } + body:not(.light) .hljs-emphasis { + font-style: italic; + } + body:not(.light) .hljs-strong { + font-weight: bold; + } + body:not(.light) .hljs-link { + text-decoration: underline; + } + body:not(.light) .content code { + color: #cbba7d; + } + body:not(.light) #night-nav #night-icon:before { + content: '\f0eb'; + } + body:not(.light) img, + body:not(.light) video, + body:not(.light) iframe, + body:not(.light) .waifu, + body:not(.light) .donate { + filter: brightness(0.8); + -webkit-filter: brightness(0.8); + } + body:not(.light) .navbar-logo .logo-img, + body:not(.light) .footer-logo .logo-img { + display: none; + } + body:not(.light) .navbar-logo .logo-img-dark, + body:not(.light) .footer-logo .logo-img-dark { + display: inline-block; + } + body:not(.light) .navbar-main .navbar-menu .navbar-item:hover, + body:not(.light) .navbar-main .navbar-menu .navbar-item:focus { + color: #fff; + background-color: #373d48; + } + body:not(.light) .navbar-main .navbar-menu .navbar-item.is-active { + color: #c0c0c0; + } + body:not(.light) .navbar { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); + } + body:not(.light) .card { + background-color: rgba(40,44,52,0.5); + backdrop-filter: none; + -webkit-backdrop-filter: none; + } + body:not(.light) .card:hover { + background-color: rgba(40,44,52,0.8); + } + body:not(.light) .card .breadcrumb li.is-active a { + color: #c0c0c0; + } + body:not(.light) .footer { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); + } + body:not(.light) .input, + body:not(.light) .textarea { + background-color: #434a56; + border-color: #373d48; + } + body:not(.light) .button.is-primary, + body:not(.light) .button.is-light, + body:not(.light) .button.is-small { + background-color: #373d48; + color: #c0c0c0; + } + body:not(.light) .button.is-primary:hover, + body:not(.light) .button.is-light:hover, + body:not(.light) .button.is-small:hover, + body:not(.light) .button.is-primary.is-hovered, + body:not(.light) .button.is-light.is-hovered, + body:not(.light) .button.is-small.is-hovered { + color: #fff; + background-color: #434a56; + } + body:not(.light) .button.is-primary:active, + body:not(.light) .button.is-light:active, + body:not(.light) .button.is-small:active, + body:not(.light) .button.is-primary.is-active, + body:not(.light) .button.is-light.is-active, + body:not(.light) .button.is-small.is-active { + color: #fff; + background-color: #2c313a; + } + body:not(.light) .button.is-white, + body:not(.light) .button.is-transparent { + background-color: transparent; + } + body:not(.light) .button.is-white:hover, + body:not(.light) .button.is-transparent:hover { + background-color: #373d48 !important; + } + body:not(.light) .pagination .pagination-next, + body:not(.light) .pagination .pagination-previous, + body:not(.light) .pagination-link:not(.is-current) { + color: #c0c0c0; + background-color: #373d48; + } + body:not(.light) .pagination .pagination-next a, + body:not(.light) .pagination .pagination-previous a, + body:not(.light) .pagination-link:not(.is-current) a { + color: #c0c0c0; + } + body:not(.light) .pagination-link.is-current { + background-color: #434a56; + border-color: #434a56; + } + body:not(.light) [data-waline] .wl-wrap, + body:not(.light) [data-waline] .wl-wrap .wl-header .wl-input { + border-color: #373d48; + } + body:not(.light) [data-waline] .wl-wrap .wl-header .wl-input:focus { + border-color: #434a56; + } + body:not(.light) [data-waline] .wl-btn { + color: #c0c0c0; + background-color: #373d48; + border-color: #373d48; + } + body:not(.light) [data-waline] .wl-btn:hover { + background-color: #434a56; + } + body:not(.light) [data-waline] .wl-btn:active { + background-color: #2c313a; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-head .wl-sys { + background-color: #373d48; + } + body:not(.light) [data-waline] a:hover, + body:not(.light) [data-waline] .wl-list .wl-card .wl-h .wl-meta .wl-at { + color: #fff; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-content.expand:before { + background: -webkit-gradient(linear, left top, left bottom, , to(#252936)); + background: linear-gradient(180deg, rgba(37,41,54,0), #252936); + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-content.expand:after { + background: #252936; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-h, + body:not(.light) [data-waline] .wl-list .wl-card .wl-quote { + border-color: #434a56; + } + body:not(.light) body, + body:not(.light) strong, + body:not(.light) time, + body:not(.light) .title, + body:not(.light) .footer, + body:not(.light) .card, + body:not(.light) .content h1, + body:not(.light) .content h2, + body:not(.light) .content h3, + body:not(.light) .content h4, + body:not(.light) .content h5, + body:not(.light) .content h6, + body:not(.light) .navbar-item, + body:not(.light) .navbar-item.is-active, + body:not(.light) .navbar-link, + body:not(.light) .menu-list a, + body:not(.light) .menu-label, + body:not(.light) .level-item, + body:not(.light) .input, + body:not(.light) .textarea, + body:not(.light) .button.is-white, + body:not(.light) .button.is-transparent, + body:not(.light) .article-licensing, + body:not(.light) [data-waline] * { + color: #c0c0c0; + } + body:not(.light) .media-content, + body:not(.light) .has-text-grey, + body:not(.light) .link-muted { + color: #c0c0c0 !important; + } + body:not(.light) a { + color: #5299e0; + } + body:not(.light) a:hover { + color: #fff; + } + body:not(.light) .timeline a, + body:not(.light) [data-type="recent-posts"] a { + color: #c0c0c0; + } + body:not(.light) .timeline a:hover, + body:not(.light) [data-type="recent-posts"] a:hover { + color: #fff; + } + body:not(.light) .content blockquote, + body:not(.light) .article-licensing { + background-color: #373d48; + border-color: #434a56; + } + body:not(.light) .content table thead td, + body:not(.light) .content table thead th { + color: #c0c0c0; + } + body:not(.light) .content table td, + body:not(.light) .content table th { + border-color: #434a56; + } + body:not(.light) hr { + background-color: #434a56; + } + body:not(.light) article.article .title a, + body:not(.light) article.media .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #c0c0c0 1px); + } + body:not(.light) article.article .title:hover a, + body:not(.light) article.media .title:hover a { + color: #c0c0c0 !important; + } + body:not(.light) .tag:not(body) { + color: #c0c0c0; + background-color: #373d48; + } + body:not(.light) .widget .tags .tag:first-child, + body:not(.light) .tag.is-grey { + background-color: #434a56; + } + body:not(.light) .menu-list a:hover { + background-color: #373d48; + } + body:not(.light) .menu-list a.is-active { + background-color: #434a56; + } + body:not(.light) .menu-list li ul { + border-color: #373d48; + } + body:not(.light) .timeline .media:last-child:after { + background-color: #252936; + } + body:not(.light) .timeline { + border-color: #434a56; + } + body:not(.light) .timeline .media:before { + background-color: #434a56; + } + body:not(.light) .searchbox .searchbox-container, + body:not(.light) .searchbox .searchbox-header, + body:not(.light) .searchbox .searchbox-header .searchbox-input, + body:not(.light) .searchbox .searchbox-header .searchbox-close, + body:not(.light) .searchbox .searchbox-body, + body:not(.light) .searchbox .searchbox-result-section, + body:not(.light) .searchbox .searchbox-result-item { + color: #c0c0c0; + background-color: #373d48; + border-color: #434a56; + } + body:not(.light) .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item:hover, + body:not(.light) .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item.active, + body:not(.light) .searchbox .searchbox-container .searchbox-header .searchbox-close:hover { + color: #fff; + background-color: #434a56; + } + body:not(.light) ::selection { + color: #fff; + background-color: rgba(52,109,167,0.8); + } + body:not(.light) ::-moz-selection { + color: #fff; + background-color: rgba(52,109,167,0.8); + } + body:not(.light) input:-webkit-autofill { + -webkit-text-fill-color: #c0c0c0 !important; + box-shadow: 0 0 0px 1000px #373d48 inset; + } + body:not(.light) .twikoo pre { + background-color: #373d48; + } + body:not(.light) .twikoo code { + color: #cbba7d; + background-color: #373d48; + } +} +.heimu { + color: #7a7a7a; + background-color: #7a7a7a; +} +.heimu:hover { + color: #fff; +} +.navbar-main, +.card { + transition: background-color 0.2s ease-out !important; +} +body, +hr, +.button, +.tag, +.level, +.box, +.wl-panel, +.wl-meta span, +[data-waline] pre { + transition: background-color 0.2s ease-out; +} +img, +ul, +.highlight, +code, +p, +i { + transition: 0.2s ease-out; +} +.navbar-main .navbar-menu { + background-color: transparent; +} +.navbar-main .navbar-menu .navbar-item.is-active { + color: inherit; + font-weight: bold; +} +.card { + overflow: visible; + background-color: rgba(255,255,255,0.95); +} +.card:hover { + background-color: #fff; +} +.card.card-transparent { + background-color: transparent !important; +} +.card.card-transparent .level-start, +.card.card-transparent .level-end { + overflow: hidden; +} +.footer a:not(.button) { + color: inherit; +} +.footer a:not(.button):hover { + text-decoration: underline; +} +article .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #fcee09 1px); + background-repeat: no-repeat; + background-size: 0 100%; + transition: 0.2s ease-in-out !important; +} +article .title:hover a { + color: #fcee09; + background-size: 100% 100%; +} +pre, +code { + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +article.article .content pre, +article.article .content code { + font-size: 0.96em; +} +:root { + --waline-theme-color: #fcee09 !important; + --waline-active-color: #2366d1 !important; + --waline-code-bgcolor: #f8f8f8 !important; + --waline-badge-color: #27ae60 !important; +} +body.night { + --waline-white: #c0c0c0 !important; + --waline-theme-color: #373d48 !important; + --waline-active-color: #434a56 !important; + --waline-bgcolor: rgba(40,44,52,0.5) !important; + --waline-bgcolor-light: rgba(40,44,52,0.8) !important; + --waline-code-bgcolor: #282c34 !important; + --waline-border-color: #434a56 !important; + --waline-badge-color: #373d48 !important; + --waline-border: 1px solid var(--waline-border-color) !important; +} +[data-waline] pre::-webkit-scrollbar-track { + background: rgba(0,0,0,0.06) !important; + box-shadow: inset 0 0 5px rgba(0,0,0,0.1) !important; +} +[data-waline] pre::-webkit-scrollbar-thumb { + background: rgba(0,0,0,0.12) !important; + box-shadow: inset 0 0 10px rgba(0,0,0,0.2) !important; +} +[data-waline] pre::-webkit-scrollbar-thumb:hover { + background: rgba(0,0,0,0.24) !important; +} +body:not(.night) [data-waline] .token { + all: unset; +} +body:not(.night) [data-waline] pre code { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body:not(.night) [data-waline] pre[class*=language-] { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body:not(.night) [data-waline] .token.comment, +body:not(.night) [data-waline] .token.prolog, +body:not(.night) [data-waline] .token.cdata { + color: #a0a1a7; +} +body:not(.night) [data-waline] .token.doctype, +body:not(.night) [data-waline] .token.punctuation, +body:not(.night) [data-waline] .token.entity { + color: #383a42; +} +body:not(.night) [data-waline] .token.attr-name, +body:not(.night) [data-waline] .token.class-name, +body:not(.night) [data-waline] .token.boolean, +body:not(.night) [data-waline] .token.constant, +body:not(.night) [data-waline] .token.number, +body:not(.night) [data-waline] .token.atrule { + color: #b76b01; +} +body:not(.night) [data-waline] .token.keyword { + color: #a626a4; +} +body:not(.night) [data-waline] .token.property, +body:not(.night) [data-waline] .token.tag, +body:not(.night) [data-waline] .token.symbol, +body:not(.night) [data-waline] .token.deleted, +body:not(.night) [data-waline] .token.important { + color: #e45649; +} +body:not(.night) [data-waline] .token.selector, +body:not(.night) [data-waline] .token.string, +body:not(.night) [data-waline] .token.char, +body:not(.night) [data-waline] .token.builtin, +body:not(.night) [data-waline] .token.inserted, +body:not(.night) [data-waline] .token.regex, +body:not(.night) [data-waline] .token.attr-value, +body:not(.night) [data-waline] .token.attr-value > .token.punctuation { + color: #50a14f; +} +body:not(.night) [data-waline] .token.variable, +body:not(.night) [data-waline] .token.operator, +body:not(.night) [data-waline] .token.function { + color: #4078f2; +} +body:not(.night) [data-waline] .token.url { + color: #0184bc; +} +body:not(.night) [data-waline] .token.attr-value > .token.punctuation.attr-equals, +body:not(.night) [data-waline] .token.special-attr > .token.attr-value > .token.value.css { + color: #383a42; +} +body:not(.night) [data-waline] .language-css .token.selector { + color: #e45649; +} +body:not(.night) [data-waline] .language-css .token.property { + color: #383a42; +} +body:not(.night) [data-waline] .language-css .token.function, +body:not(.night) [data-waline] .language-css .token.url > .token.function { + color: #0184bc; +} +body:not(.night) [data-waline] .language-css .token.url > .token.string.url { + color: #50a14f; +} +body:not(.night) [data-waline] .language-css .token.important, +body:not(.night) [data-waline] .language-css .token.atrule .token.rule { + color: #a626a4; +} +body:not(.night) [data-waline] .language-javascript .token.operator { + color: #a626a4; +} +body:not(.night) [data-waline] .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { + color: #ca1243; +} +body:not(.night) [data-waline] .language-json .token.operator { + color: #383a42; +} +body:not(.night) [data-waline] .language-json .token.null.keyword { + color: #b76b01; +} +body:not(.night) [data-waline] .language-markdown .token.url, +body:not(.night) [data-waline] .language-markdown .token.url > .token.operator, +body:not(.night) [data-waline] .language-markdown .token.url-reference.url > .token.string { + color: #383a42; +} +body:not(.night) [data-waline] .language-markdown .token.url > .token.content { + color: #4078f2; +} +body:not(.night) [data-waline] .language-markdown .token.url > .token.url, +body:not(.night) [data-waline] .language-markdown .token.url-reference.url { + color: #0184bc; +} +body:not(.night) [data-waline] .language-markdown .token.blockquote.punctuation, +body:not(.night) [data-waline] .language-markdown .token.hr.punctuation { + color: #a0a1a7; + font-style: italic; +} +body:not(.night) [data-waline] .language-markdown .token.code-snippet { + color: #50a14f; +} +body:not(.night) [data-waline] .language-markdown .token.bold .token.content { + color: #b76b01; +} +body:not(.night) [data-waline] .language-markdown .token.italic .token.content { + color: #a626a4; +} +body:not(.night) [data-waline] .language-markdown .token.strike .token.content, +body:not(.night) [data-waline] .language-markdown .token.strike .token.punctuation, +body:not(.night) [data-waline] .language-markdown .token.list.punctuation, +body:not(.night) [data-waline] .language-markdown .token.title.important > .token.punctuation { + color: #e45649; +} +body:not(.night) [data-waline] .token.bold { + font-weight: bold; +} +body:not(.night) [data-waline] .token.comment, +body:not(.night) [data-waline] .token.italic { + font-style: italic; +} +body:not(.night) [data-waline] .token.entity { + cursor: help; +} +body:not(.night) [data-waline] .token.namespace { + opacity: 0.8; +} +body.night [data-waline] .token { + all: unset; +} +body.night [data-waline] pre code { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body.night [data-waline] pre[class*=language-] { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body.night [data-waline] .token.comment, +body.night [data-waline] .token.prolog, +body.night [data-waline] .token.cdata { + color: #5c6370; +} +body.night [data-waline] .token.doctype, +body.night [data-waline] .token.punctuation, +body.night [data-waline] .token.entity { + color: #abb2bf; +} +body.night [data-waline] .token.attr-name, +body.night [data-waline] .token.class-name, +body.night [data-waline] .token.boolean, +body.night [data-waline] .token.constant, +body.night [data-waline] .token.number, +body.night [data-waline] .token.atrule { + color: #d19a66; +} +body.night [data-waline] .token.keyword { + color: #c678dd; +} +body.night [data-waline] .token.property, +body.night [data-waline] .token.tag, +body.night [data-waline] .token.symbol, +body.night [data-waline] .token.deleted, +body.night [data-waline] .token.important { + color: #e06c75; +} +body.night [data-waline] .token.selector, +body.night [data-waline] .token.string, +body.night [data-waline] .token.char, +body.night [data-waline] .token.builtin, +body.night [data-waline] .token.inserted, +body.night [data-waline] .token.regex, +body.night [data-waline] .token.attr-value, +body.night [data-waline] .token.attr-value > .token.punctuation { + color: #98c379; +} +body.night [data-waline] .token.variable, +body.night [data-waline] .token.operator, +body.night [data-waline] .token.function { + color: #61afef; +} +body.night [data-waline] .token.url { + color: #56b6c2; +} +body.night [data-waline] .token.attr-value > .token.punctuation.attr-equals, +body.night [data-waline] .token.special-attr > .token.attr-value > .token.value.css { + color: #abb2bf; +} +body.night [data-waline] .language-css .token.selector { + color: #e06c75; +} +body.night [data-waline] .language-css .token.property { + color: #abb2bf; +} +body.night [data-waline] .language-css .token.function, +body.night [data-waline] .language-css .token.url > .token.function { + color: #56b6c2; +} +body.night [data-waline] .language-css .token.url > .token.string.url { + color: #98c379; +} +body.night [data-waline] .language-css .token.important, +body.night [data-waline] .language-css .token.atrule .token.rule { + color: #c678dd; +} +body.night [data-waline] .language-javascript .token.operator { + color: #c678dd; +} +body.night [data-waline] .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { + color: #be5046; +} +body.night [data-waline] .language-json .token.operator { + color: #abb2bf; +} +body.night [data-waline] .language-json .token.null.keyword { + color: #d19a66; +} +body.night [data-waline] .language-markdown .token.url, +body.night [data-waline] .language-markdown .token.url > .token.operator, +body.night [data-waline] .language-markdown .token.url-reference.url > .token.string { + color: #abb2bf; +} +body.night [data-waline] .language-markdown .token.url > .token.content { + color: #61afef; +} +body.night [data-waline] .language-markdown .token.url > .token.url, +body.night [data-waline] .language-markdown .token.url-reference.url { + color: #56b6c2; +} +body.night [data-waline] .language-markdown .token.blockquote.punctuation, +body.night [data-waline] .language-markdown .token.hr.punctuation { + color: #5c6370; + font-style: italic; +} +body.night [data-waline] .language-markdown .token.code-snippet { + color: #98c379; +} +body.night [data-waline] .language-markdown .token.bold .token.content { + color: #d19a66; +} +body.night [data-waline] .language-markdown .token.italic .token.content { + color: #c678dd; +} +body.night [data-waline] .language-markdown .token.strike .token.content, +body.night [data-waline] .language-markdown .token.strike .token.punctuation, +body.night [data-waline] .language-markdown .token.list.punctuation, +body.night [data-waline] .language-markdown .token.title.important > .token.punctuation { + color: #e06c75; +} +body.night [data-waline] .token.bold { + font-weight: bold; +} +body.night [data-waline] .token.comment, +body.night [data-waline] .token.italic { + font-style: italic; +} +body.night [data-waline] .token.entity { + cursor: help; +} +body.night [data-waline] .token.namespace { + opacity: 0.8; +} +body { + counter-reset: card; +} +::selection { + color: #000; + background: #02d7f2; +} +.card:not(#back-to-top) { + position: relative; + counter-increment: card; +} +.card:not(#back-to-top), +.card:not(#back-to-top) .card-content { + position: relative; +} +.card:not(#back-to-top):before, +.card:not(#back-to-top) .card-content:before { + content: ''; + position: absolute; + z-index: -1; + top: 0; + left: 0; + right: 0; + bottom: 0; +} +.card:not(#back-to-top):before { + top: -1.2px; + left: -1.2px; + right: -1.2px; + bottom: -1.2px; + background-color: #02d7f2; + clip-path: polygon(0 0, calc(100% - 16px) 0, 100% 16px, 100% 100%, 16px 100%, 0 calc(100% - 16px), 0 0); + -webkit-clip-path: polygon(0 0, calc(100% - 16px) 0, 100% 16px, 100% 100%, 16px 100%, 0 calc(100% - 16px), 0 0); +} +.card:not(#back-to-top):after { + content: 'R' counter(card); + position: absolute; + color: #02d7f2; + right: 2rem; + bottom: -0.6em; + font-size: 0.75rem; + padding: 0 0.25em; + background: #000; +} +.card:not(#back-to-top) .card-image { + clip-path: polygon(0 0, calc(100% - 16px) 0, 100% 16px, 100% 100%, 0 100%); + -webkit-clip-path: polygon(0 0, calc(100% - 16px) 0, 100% 16px, 100% 100%, 0 100%); +} +.card:not(#back-to-top) .card-content:before { + background-color: #000; + clip-path: polygon(0 0, calc(100% - 16px) 0, 100% 16px, 100% 100%, 16px 100%, 0 calc(100% - 16px), 0 0); + -webkit-clip-path: polygon(0 0, calc(100% - 16px) 0, 100% 16px, 100% 100%, 16px 100%, 0 calc(100% - 16px), 0 0); +} +.card:not(#back-to-top) .card-image + .card-content:before { + clip-path: polygon(0 0, 100% 0, 100% 100%, 16px 100%, 0 calc(100% - 16px)); + -webkit-clip-path: polygon(0 0, 100% 0, 100% 100%, 16px 100%, 0 calc(100% - 16px)); +} +.button:not(input) { + border: none; + outline: none; + background: transparent !important; + position: relative; +} +.button:not(input):before { + content: ''; + position: absolute; + z-index: -1; + top: 0; + left: 0; + right: 0; + bottom: 0; +} +.button:not(input):before { + clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px); + -webkit-clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px); +} +.button:not(input).is-white:before { + background-color: #fff; + color: #000; +} +.button:not(input).is-white:hover:before, +.button:not(input).is-white.is-hovered:before { + background-color: #f9f9f9; + color: #000; +} +.button:not(input).is-white:focus:before, +.button:not(input).is-white.is-focused:before { + color: #000; +} +.button:not(input).is-white:active:before, +.button:not(input).is-white.is-active:before { + background-color: #f2f2f2; + color: #000; +} +.button:not(input).is-white[disabled]:before, +fieldset[disabled] .button:not(input).is-white:before { + background-color: #fff; +} +.button:not(input).is-white.is-inverted:before { + background-color: #000; + color: #fff; +} +.button:not(input).is-white.is-inverted:before:hover:before, +.button:not(input).is-white.is-inverted:before.is-hovered:before { + background-color: #000; +} +.button:not(input).is-white.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-white.is-inverted:before:before { + background-color: #000; + border-color: transparent; + box-shadow: none; + color: #fff; +} +.button:not(input).is-black:before { + background-color: #000; + color: #fff; +} +.button:not(input).is-black:hover:before, +.button:not(input).is-black.is-hovered:before { + background-color: #000; + color: #fff; +} +.button:not(input).is-black:focus:before, +.button:not(input).is-black.is-focused:before { + color: #fff; +} +.button:not(input).is-black:active:before, +.button:not(input).is-black.is-active:before { + background-color: #000; + color: #fff; +} +.button:not(input).is-black[disabled]:before, +fieldset[disabled] .button:not(input).is-black:before { + background-color: #000; +} +.button:not(input).is-black.is-inverted:before { + background-color: #fff; + color: #000; +} +.button:not(input).is-black.is-inverted:before:hover:before, +.button:not(input).is-black.is-inverted:before.is-hovered:before { + background-color: #f2f2f2; +} +.button:not(input).is-black.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-black.is-inverted:before:before { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #000; +} +.button:not(input).is-light:before { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.button:not(input).is-light:hover:before, +.button:not(input).is-light.is-hovered:before { + background-color: #eee; + color: rgba(0,0,0,0.7); +} +.button:not(input).is-light:focus:before, +.button:not(input).is-light.is-focused:before { + color: rgba(0,0,0,0.7); +} +.button:not(input).is-light:active:before, +.button:not(input).is-light.is-active:before { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); +} +.button:not(input).is-light[disabled]:before, +fieldset[disabled] .button:not(input).is-light:before { + background-color: #f5f5f5; +} +.button:not(input).is-light.is-inverted:before { + background-color: rgba(0,0,0,0.7); + color: #f5f5f5; +} +.button:not(input).is-light.is-inverted:before:hover:before, +.button:not(input).is-light.is-inverted:before.is-hovered:before { + background-color: rgba(0,0,0,0.7); +} +.button:not(input).is-light.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-light.is-inverted:before:before { + background-color: rgba(0,0,0,0.7); + border-color: transparent; + box-shadow: none; + color: #f5f5f5; +} +.button:not(input).is-dark:before { + background-color: #363636; + color: #fff; +} +.button:not(input).is-dark:hover:before, +.button:not(input).is-dark.is-hovered:before { + background-color: #2f2f2f; + color: #fff; +} +.button:not(input).is-dark:focus:before, +.button:not(input).is-dark.is-focused:before { + color: #fff; +} +.button:not(input).is-dark:active:before, +.button:not(input).is-dark.is-active:before { + background-color: #292929; + color: #fff; +} +.button:not(input).is-dark[disabled]:before, +fieldset[disabled] .button:not(input).is-dark:before { + background-color: #363636; +} +.button:not(input).is-dark.is-inverted:before { + background-color: #fff; + color: #363636; +} +.button:not(input).is-dark.is-inverted:before:hover:before, +.button:not(input).is-dark.is-inverted:before.is-hovered:before { + background-color: #f2f2f2; +} +.button:not(input).is-dark.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-dark.is-inverted:before:before { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #363636; +} +.button:not(input).is-primary:before { + background-color: #fcee09; + color: #121617; +} +.button:not(input).is-primary:hover:before, +.button:not(input).is-primary.is-hovered:before { + background-color: #f5e703; + color: #121617; +} +.button:not(input).is-primary:focus:before, +.button:not(input).is-primary.is-focused:before { + color: #121617; +} +.button:not(input).is-primary:active:before, +.button:not(input).is-primary.is-active:before { + background-color: #e9db03; + color: #121617; +} +.button:not(input).is-primary[disabled]:before, +fieldset[disabled] .button:not(input).is-primary:before { + background-color: #fcee09; +} +.button:not(input).is-primary.is-inverted:before { + background-color: #121617; + color: #fcee09; +} +.button:not(input).is-primary.is-inverted:before:hover:before, +.button:not(input).is-primary.is-inverted:before.is-hovered:before { + background-color: #070809; +} +.button:not(input).is-primary.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-primary.is-inverted:before:before { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #fcee09; +} +.button:not(input).is-link:before { + background-color: #02d7f2; + color: rgba(0,0,0,0.7); +} +.button:not(input).is-link:hover:before, +.button:not(input).is-link.is-hovered:before { + background-color: #02cce5; + color: rgba(0,0,0,0.7); +} +.button:not(input).is-link:focus:before, +.button:not(input).is-link.is-focused:before { + color: rgba(0,0,0,0.7); +} +.button:not(input).is-link:active:before, +.button:not(input).is-link.is-active:before { + background-color: #02c1d9; + color: rgba(0,0,0,0.7); +} +.button:not(input).is-link[disabled]:before, +fieldset[disabled] .button:not(input).is-link:before { + background-color: #02d7f2; +} +.button:not(input).is-link.is-inverted:before { + background-color: rgba(0,0,0,0.7); + color: #02d7f2; +} +.button:not(input).is-link.is-inverted:before:hover:before, +.button:not(input).is-link.is-inverted:before.is-hovered:before { + background-color: rgba(0,0,0,0.7); +} +.button:not(input).is-link.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-link.is-inverted:before:before { + background-color: rgba(0,0,0,0.7); + border-color: transparent; + box-shadow: none; + color: #02d7f2; +} +.button:not(input).is-info:before { + background-color: #02d7f2; + color: #121617; +} +.button:not(input).is-info:hover:before, +.button:not(input).is-info.is-hovered:before { + background-color: #02cce5; + color: #121617; +} +.button:not(input).is-info:focus:before, +.button:not(input).is-info.is-focused:before { + color: #121617; +} +.button:not(input).is-info:active:before, +.button:not(input).is-info.is-active:before { + background-color: #02c1d9; + color: #121617; +} +.button:not(input).is-info[disabled]:before, +fieldset[disabled] .button:not(input).is-info:before { + background-color: #02d7f2; +} +.button:not(input).is-info.is-inverted:before { + background-color: #121617; + color: #02d7f2; +} +.button:not(input).is-info.is-inverted:before:hover:before, +.button:not(input).is-info.is-inverted:before.is-hovered:before { + background-color: #070809; +} +.button:not(input).is-info.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-info.is-inverted:before:before { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #02d7f2; +} +.button:not(input).is-success:before { + background-color: #00ff41; + color: #121617; +} +.button:not(input).is-success:hover:before, +.button:not(input).is-success.is-hovered:before { + background-color: #00f23e; + color: #121617; +} +.button:not(input).is-success:focus:before, +.button:not(input).is-success.is-focused:before { + color: #121617; +} +.button:not(input).is-success:active:before, +.button:not(input).is-success.is-active:before { + background-color: #00e63a; + color: #121617; +} +.button:not(input).is-success[disabled]:before, +fieldset[disabled] .button:not(input).is-success:before { + background-color: #00ff41; +} +.button:not(input).is-success.is-inverted:before { + background-color: #121617; + color: #00ff41; +} +.button:not(input).is-success.is-inverted:before:hover:before, +.button:not(input).is-success.is-inverted:before.is-hovered:before { + background-color: #070809; +} +.button:not(input).is-success.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-success.is-inverted:before:before { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #00ff41; +} +.button:not(input).is-warning:before { + background-color: #ff8e3c; + color: #121617; +} +.button:not(input).is-warning:hover:before, +.button:not(input).is-warning.is-hovered:before { + background-color: #ff872f; + color: #121617; +} +.button:not(input).is-warning:focus:before, +.button:not(input).is-warning.is-focused:before { + color: #121617; +} +.button:not(input).is-warning:active:before, +.button:not(input).is-warning.is-active:before { + background-color: #ff7f22; + color: #121617; +} +.button:not(input).is-warning[disabled]:before, +fieldset[disabled] .button:not(input).is-warning:before { + background-color: #ff8e3c; +} +.button:not(input).is-warning.is-inverted:before { + background-color: #121617; + color: #ff8e3c; +} +.button:not(input).is-warning.is-inverted:before:hover:before, +.button:not(input).is-warning.is-inverted:before.is-hovered:before { + background-color: #070809; +} +.button:not(input).is-warning.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-warning.is-inverted:before:before { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #ff8e3c; +} +.button:not(input).is-danger:before { + background-color: #ff003c; + color: #121617; +} +.button:not(input).is-danger:hover:before, +.button:not(input).is-danger.is-hovered:before { + background-color: #f20039; + color: #121617; +} +.button:not(input).is-danger:focus:before, +.button:not(input).is-danger.is-focused:before { + color: #121617; +} +.button:not(input).is-danger:active:before, +.button:not(input).is-danger.is-active:before { + background-color: #e60036; + color: #121617; +} +.button:not(input).is-danger[disabled]:before, +fieldset[disabled] .button:not(input).is-danger:before { + background-color: #ff003c; +} +.button:not(input).is-danger.is-inverted:before { + background-color: #121617; + color: #ff003c; +} +.button:not(input).is-danger.is-inverted:before:hover:before, +.button:not(input).is-danger.is-inverted:before.is-hovered:before { + background-color: #070809; +} +.button:not(input).is-danger.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-danger.is-inverted:before:before { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #ff003c; +} +.button:not(input).is-grey-lightest:before { + background-color: #ededed; + color: #363636; +} +.button:not(input).is-grey-lightest:hover:before, +.button:not(input).is-grey-lightest.is-hovered:before { + background-color: #e7e7e7; + color: #363636; +} +.button:not(input).is-grey-lightest:focus:before, +.button:not(input).is-grey-lightest.is-focused:before { + color: #363636; +} +.button:not(input).is-grey-lightest:active:before, +.button:not(input).is-grey-lightest.is-active:before { + background-color: #e0e0e0; + color: #363636; +} +.button:not(input).is-grey-lightest[disabled]:before, +fieldset[disabled] .button:not(input).is-grey-lightest:before { + background-color: #ededed; +} +.button:not(input).is-grey-lightest.is-inverted:before { + background-color: #363636; + color: #ededed; +} +.button:not(input).is-grey-lightest.is-inverted:before:hover:before, +.button:not(input).is-grey-lightest.is-inverted:before.is-hovered:before { + background-color: #292929; +} +.button:not(input).is-grey-lightest.is-inverted:before[disabled]:before, +fieldset[disabled] .button:not(input).is-grey-lightest.is-inverted:before:before { + background-color: #363636; + border-color: transparent; + box-shadow: none; + color: #ededed; +} +.field.has-addons .control:not(:first-child) .button { + clip-path: polygon(0 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%); + -webkit-clip-path: polygon(0 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%); +} +.menu-list a { + clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px); + -webkit-clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px); +} +.tags.has-addons .tag:first-child { + background: #fcee09 !important; +} +.tags.has-addons .tag:last-child { + background: #02d7f2 !important; +} +.pagination-previous, +.pagination-next, +.pagination-link { + clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px); + -webkit-clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px); +} +.pagination-previous:hover, +.pagination-next:hover, +.pagination-link:hover { + background-color: #02d7f2; +} +.pagination-previous:hover, +.pagination-next:hover, +.pagination-link:hover, +.pagination-previous:hover a, +.pagination-next:hover a, +.pagination-link:hover a { + color: #000; +} +.navbar-main { + padding-top: 10px; + padding-bottom: 30px; +} +.navbar-main:after { + content: ''; + position: absolute; + left: 0; + right: 0; + bottom: -2px; + background: url("../img/razor-top-black.svg") repeat-x top; + height: 40px; +} +.navbar-main .navbar-menu .navbar-item:hover, +.navbar-main .navbar-menu .navbar-item.is-active { + color: #fcee09; + background-color: #000 !important; +} +article.article .title a, +article.media .title a { + background-image: linear-gradient(transparent calc(100% - 2px), #fcee09 2px); + background-repeat: no-repeat; + background-size: 0 100%; + transition: background-size 0.25s ease-in-out; +} +article.article .title:hover a, +article.media .title:hover a { + background-size: 100% 100%; +} +article.article .article-more:before { + background-color: #02d7f2; + color: #121617; +} +article.article .article-more:hover:before, +article.article .article-more.is-hovered:before { + background-color: #02cce5; + color: #121617; +} +article.article .article-more:focus:before, +article.article .article-more.is-focused:before { + color: #121617; +} +article.article .article-more:active:before, +article.article .article-more.is-active:before { + background-color: #02c1d9; + color: #121617; +} +article.article .article-more[disabled]:before, +fieldset[disabled] article.article .article-more:before { + background-color: #02d7f2; +} +article.article .article-more.is-inverted:before { + background-color: #121617; + color: #02d7f2; +} +article.article .article-more.is-inverted:before:hover:before, +article.article .article-more.is-inverted:before.is-hovered:before { + background-color: #070809; +} +article.article .article-more.is-inverted:before[disabled]:before, +fieldset[disabled] article.article .article-more.is-inverted:before:before { + background-color: #121617; + border-color: transparent; + box-shadow: none; + color: #02d7f2; +} +.article-licensing { + background: #242424; +} +.content blockquote { + background: transparent; + border: 0.5px solid #02d7f2; + border-left: 5px solid #02d7f2; +} +.footer { + position: relative; +} +.footer:before { + content: ''; + position: absolute; + left: 0; + right: 0; + top: -1px; + height: 39px; + background: url("../img/razor-bottom-black.svg") repeat-x top; +} +.footer > .container { + padding-top: 40px; +} +.timeline .media:before { + clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%); + -webkit-clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%); +} +.searchbox .searchbox-container { + border: 1px solid #02d7f2; +} +.searchbox .searchbox-container .searchbox-body { + border-bottom: 1px solid #02d7f2; +} +.searchbox .searchbox-container .searchbox-body li:last-child .searchbox-result-section { + border-bottom: none; +} +.searchbox .searchbox-container .searchbox-result-item em { + color: #000; +} +#back-to-top { + color: #000; + background: #02d7f2; + margin-top: 45px; + clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px); + -webkit-clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px); +} +.cc-window, +.cc-revoke { + border-radius: 0 !important; +} +.cc-window:not(.cc-banner) { + border: 1px solid #02d7f2; +} +.cc-window.cc-theme-classic .cc-compliance > .cc-btn, +.cc-window.cc-theme-block .cc-compliance > .cc-btn { + border-radius: 0; +} +.cc-window.cc-banner .cc-compliance > .cc-btn { + background-color: #02d7f2; +} +.cc-window.cc-banner .cc-compliance > .cc-btn:hover, +.cc-window.cc-banner .cc-compliance > .cc-btn:focus { + background-color: #02cce5; +} diff --git a/css/default.css b/css/default.css new file mode 100644 index 0000000..f72b145 --- /dev/null +++ b/css/default.css @@ -0,0 +1,12798 @@ +@-moz-keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +@-webkit-keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +@-o-keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +@keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +.is-unselectable, +.breadcrumb, +.modal-close, +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, +.tabs, +.button, +.delete, +.file { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.navbar-link:not(.is-arrowless)::after, +.select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid transparent; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; +} +.breadcrumb:not(:last-child), +.level:not(:last-child), +.list:not(:last-child), +.message:not(:last-child), +.pagination:not(:last-child), +.tabs:not(:last-child), +.box:not(:last-child), +.content:not(:last-child), +.notification:not(:last-child), +.progress:not(:last-child), +.table:not(:last-child), +.table-container:not(:last-child), +.title:not(:last-child), +.subtitle:not(:last-child), +.block:not(:last-child), +.highlight:not(:last-child) { + margin-bottom: 1.5rem; +} +.modal-close, +.delete { + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10,10,10,0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; +} +.modal-close::before, +.delete::before, +.modal-close::after, +.delete::after { + background-color: #fff; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; +} +.modal-close::before, +.delete::before { + height: 2px; + width: 50%; +} +.modal-close::after, +.delete::after { + height: 50%; + width: 2px; +} +.modal-close:hover, +.delete:hover, +.modal-close:focus, +.delete:focus { + background-color: rgba(10,10,10,0.3); +} +.modal-close:active, +.delete:active { + background-color: rgba(10,10,10,0.4); +} +.modal-close.is-small, +.delete.is-small { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; +} +.modal-close.is-medium, +.delete.is-medium { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; +} +.modal-close.is-large, +.delete.is-large { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; +} +.button.is-loading::after, +.loader, +.select.is-loading::after, +.control.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; +} +.is-overlay, +.modal, +.modal-background, +.image.is-square img, +.image.is-1by1 img, +.image.is-5by4 img, +.image.is-4by3 img, +.image.is-3by2 img, +.image.is-5by3 img, +.image.is-16by9 img, +.image.is-2by1 img, +.image.is-3by1 img, +.image.is-4by5 img, +.image.is-3by4 img, +.image.is-2by3 img, +.image.is-3by5 img, +.image.is-9by16 img, +.image.is-1by2 img, +.image.is-1by3 img, +.image.is-square .has-ratio, +.image.is-1by1 .has-ratio, +.image.is-5by4 .has-ratio, +.image.is-4by3 .has-ratio, +.image.is-3by2 .has-ratio, +.image.is-5by3 .has-ratio, +.image.is-16by9 .has-ratio, +.image.is-2by1 .has-ratio, +.image.is-3by1 .has-ratio, +.image.is-4by5 .has-ratio, +.image.is-3by4 .has-ratio, +.image.is-2by3 .has-ratio, +.image.is-3by5 .has-ratio, +.image.is-9by16 .has-ratio, +.image.is-1by2 .has-ratio, +.image.is-1by3 .has-ratio, +.hero-video { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, +.button, +.input, +.textarea, +.select select, +.file-cta, +.file-name { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 4px; + box-shadow: none; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.5em - 1px); + padding-left: calc(0.75em - 1px); + padding-right: calc(0.75em - 1px); + padding-top: calc(0.5em - 1px); + position: relative; + vertical-align: top; +} +.pagination-previous:focus, +.pagination-next:focus, +.pagination-link:focus, +.pagination-ellipsis:focus, +.button:focus, +.input:focus, +.textarea:focus, +.select select:focus, +.file-cta:focus, +.file-name:focus, +.pagination-previous.is-focused, +.pagination-next.is-focused, +.pagination-link.is-focused, +.pagination-ellipsis.is-focused, +.button.is-focused, +.input.is-focused, +.textarea.is-focused, +.select select.is-focused, +.file-cta.is-focused, +.file-name.is-focused, +.pagination-previous:active, +.pagination-next:active, +.pagination-link:active, +.pagination-ellipsis:active, +.button:active, +.input:active, +.textarea:active, +.select select:active, +.file-cta:active, +.file-name:active, +.pagination-previous.is-active, +.pagination-next.is-active, +.pagination-link.is-active, +.pagination-ellipsis.is-active, +.button.is-active, +.input.is-active, +.textarea.is-active, +.select select.is-active, +.file-cta.is-active, +.file-name.is-active { + outline: none; +} +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled], +.pagination-ellipsis[disabled], +.button[disabled], +.input[disabled], +.textarea[disabled], +.select select[disabled], +.file-cta[disabled], +.file-name[disabled], +fieldset[disabled] .pagination-previous, +fieldset[disabled] .pagination-next, +fieldset[disabled] .pagination-link, +fieldset[disabled] .pagination-ellipsis, +fieldset[disabled] .button, +fieldset[disabled] .input, +fieldset[disabled] .textarea, +fieldset[disabled] .select select, +fieldset[disabled] .file-cta, +fieldset[disabled] .file-name { + cursor: not-allowed; +} +/* minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; +} +ul { + list-style: none; +} +button, +input, +select, +textarea { + margin: 0; +} +html { + box-sizing: border-box; +} +*, +*::before, +*::after { + box-sizing: inherit; +} +img, +video { + height: auto; + max-width: 100%; +} +iframe { + border: 0; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +td:not([align]), +th:not([align]) { + text-align: left; +} +html { + background-color: #f7f7f7; + font-size: 14px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: hidden; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; +} +article, +aside, +figure, +footer, +header, +hgroup, +section { + display: block; +} +body, +button, +input, +select, +textarea { + font-family: Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif; +} +code, +pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: 'Source Code Pro', monospace, 'Microsoft YaHei'; +} +body { + color: #4a4a4a; + font-size: 1em; + font-weight: 400; + line-height: 1.5; +} +a { + color: #3273dc; + cursor: pointer; + text-decoration: none; +} +a strong { + color: currentColor; +} +a:hover { + color: #363636; +} +code { + background-color: #f5f5f5; + color: #f14668; + font-size: 0.875em; + font-weight: normal; + padding: 0.25em 0.5em 0.25em; +} +hr { + background-color: #f5f5f5; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; +} +img { + height: auto; + max-width: 100%; +} +input[type="checkbox"], +input[type="radio"] { + vertical-align: baseline; +} +small { + font-size: 0.875em; +} +span { + font-style: inherit; + font-weight: inherit; +} +strong { + color: #363636; + font-weight: 700; +} +fieldset { + border: none; +} +pre { + -webkit-overflow-scrolling: touch; + background-color: #f5f5f5; + color: #4a4a4a; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; +} +pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; +} +table td, +table th { + vertical-align: top; +} +table td:not([align]), +table th:not([align]) { + text-align: left; +} +table th { + color: #363636; +} +.is-clearfix::after { + clear: both; + content: " "; + display: table; +} +.is-pulled-left { + float: left !important; +} +.is-pulled-right { + float: right !important; +} +.is-clipped { + overflow: hidden !important; +} +.is-size-1 { + font-size: 3rem !important; +} +.is-size-2 { + font-size: 2.5rem !important; +} +.is-size-3 { + font-size: 2rem !important; +} +.is-size-4 { + font-size: 1.5rem !important; +} +.is-size-5 { + font-size: 1.25rem !important; +} +.is-size-6, +article.media .title { + font-size: 1rem !important; +} +.is-size-7, +article.media .date, +article.media .categories, +.article-licensing .licensing-title a, +.article-licensing .licensing-meta h6 { + font-size: 0.85rem !important; +} +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; + } + .is-size-2-mobile { + font-size: 2.5rem !important; + } + .is-size-3-mobile { + font-size: 2rem !important; + } + .is-size-4-mobile { + font-size: 1.5rem !important; + } + .is-size-5-mobile { + font-size: 1.25rem !important; + } + .is-size-6-mobile { + font-size: 1rem !important; + } + .is-size-7-mobile { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; + } + .is-size-2-tablet { + font-size: 2.5rem !important; + } + .is-size-3-tablet { + font-size: 2rem !important; + } + .is-size-4-tablet { + font-size: 1.5rem !important; + } + .is-size-5-tablet { + font-size: 1.25rem !important; + } + .is-size-6-tablet { + font-size: 1rem !important; + } + .is-size-7-tablet { + font-size: 0.85rem !important; + } +} +@media screen and (max-width: 1087px) { + .is-size-1-touch { + font-size: 3rem !important; + } + .is-size-2-touch { + font-size: 2.5rem !important; + } + .is-size-3-touch { + font-size: 2rem !important; + } + .is-size-4-touch { + font-size: 1.5rem !important; + } + .is-size-5-touch { + font-size: 1.25rem !important; + } + .is-size-6-touch { + font-size: 1rem !important; + } + .is-size-7-touch { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 1088px) { + .is-size-1-desktop { + font-size: 3rem !important; + } + .is-size-2-desktop { + font-size: 2.5rem !important; + } + .is-size-3-desktop { + font-size: 2rem !important; + } + .is-size-4-desktop { + font-size: 1.5rem !important; + } + .is-size-5-desktop { + font-size: 1.25rem !important; + } + .is-size-6-desktop { + font-size: 1rem !important; + } + .is-size-7-desktop { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 1280px) { + .is-size-1-widescreen { + font-size: 3rem !important; + } + .is-size-2-widescreen { + font-size: 2.5rem !important; + } + .is-size-3-widescreen { + font-size: 2rem !important; + } + .is-size-4-widescreen { + font-size: 1.5rem !important; + } + .is-size-5-widescreen { + font-size: 1.25rem !important; + } + .is-size-6-widescreen { + font-size: 1rem !important; + } + .is-size-7-widescreen { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 1472px) { + .is-size-1-fullhd { + font-size: 3rem !important; + } + .is-size-2-fullhd { + font-size: 2.5rem !important; + } + .is-size-3-fullhd { + font-size: 2rem !important; + } + .is-size-4-fullhd { + font-size: 1.5rem !important; + } + .is-size-5-fullhd { + font-size: 1.25rem !important; + } + .is-size-6-fullhd { + font-size: 1rem !important; + } + .is-size-7-fullhd { + font-size: 0.85rem !important; + } +} +.has-text-centered { + text-align: center !important; +} +.has-text-justified { + text-align: justify !important; +} +.has-text-left { + text-align: left !important; +} +.has-text-right { + text-align: right !important; +} +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-centered-tablet-only { + text-align: center !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-centered-touch { + text-align: center !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-centered-desktop { + text-align: center !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-centered-desktop-only { + text-align: center !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-centered-widescreen { + text-align: center !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-centered-widescreen-only { + text-align: center !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-centered-fullhd { + text-align: center !important; + } +} +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-justified-tablet-only { + text-align: justify !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-justified-touch { + text-align: justify !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-justified-desktop { + text-align: justify !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-justified-desktop-only { + text-align: justify !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-justified-widescreen { + text-align: justify !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-justified-widescreen-only { + text-align: justify !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-justified-fullhd { + text-align: justify !important; + } +} +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-left-tablet-only { + text-align: left !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-left-touch { + text-align: left !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-left-desktop { + text-align: left !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-left-desktop-only { + text-align: left !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-left-widescreen { + text-align: left !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-left-widescreen-only { + text-align: left !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-left-fullhd { + text-align: left !important; + } +} +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-right-tablet-only { + text-align: right !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-right-touch { + text-align: right !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-right-desktop { + text-align: right !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-right-desktop-only { + text-align: right !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-right-widescreen { + text-align: right !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-right-widescreen-only { + text-align: right !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-right-fullhd { + text-align: right !important; + } +} +.is-capitalized { + text-transform: capitalize !important; +} +.is-lowercase { + text-transform: lowercase !important; +} +.is-uppercase, +article.media .categories { + text-transform: uppercase !important; +} +.is-italic { + font-style: italic !important; +} +.has-text-white { + color: #fff !important; +} +a.has-text-white:hover, +a.has-text-white:focus { + color: #e6e6e6 !important; +} +.has-background-white { + background-color: #fff !important; +} +.has-text-black { + color: #0a0a0a !important; +} +a.has-text-black:hover, +a.has-text-black:focus { + color: #000 !important; +} +.has-background-black { + background-color: #0a0a0a !important; +} +.has-text-light { + color: #f5f5f5 !important; +} +a.has-text-light:hover, +a.has-text-light:focus { + color: #dbdbdb !important; +} +.has-background-light { + background-color: #f5f5f5 !important; +} +.has-text-dark { + color: #363636 !important; +} +a.has-text-dark:hover, +a.has-text-dark:focus { + color: #1c1c1c !important; +} +.has-background-dark { + background-color: #363636 !important; +} +.has-text-primary { + color: #3273dc !important; +} +a.has-text-primary:hover, +a.has-text-primary:focus { + color: #205bbc !important; +} +.has-background-primary { + background-color: #3273dc !important; +} +.has-text-link { + color: #3273dc !important; +} +a.has-text-link:hover, +a.has-text-link:focus { + color: #205bbc !important; +} +.has-background-link { + background-color: #3273dc !important; +} +.has-text-info { + color: #3298dc !important; +} +a.has-text-info:hover, +a.has-text-info:focus { + color: #207dbc !important; +} +.has-background-info { + background-color: #3298dc !important; +} +.has-text-success { + color: #48c774 !important; +} +a.has-text-success:hover, +a.has-text-success:focus { + color: #34a85c !important; +} +.has-background-success { + background-color: #48c774 !important; +} +.has-text-warning { + color: #ffdd57 !important; +} +a.has-text-warning:hover, +a.has-text-warning:focus { + color: #ffd324 !important; +} +.has-background-warning { + background-color: #ffdd57 !important; +} +.has-text-danger { + color: #f14668 !important; +} +a.has-text-danger:hover, +a.has-text-danger:focus { + color: #ee1742 !important; +} +.has-background-danger { + background-color: #f14668 !important; +} +.has-text-grey-lightest { + color: #ededed !important; +} +a.has-text-grey-lightest:hover, +a.has-text-grey-lightest:focus { + color: #d4d4d4 !important; +} +.has-background-grey-lightest { + background-color: #ededed !important; +} +.has-text-black-bis { + color: #121212 !important; +} +.has-background-black-bis { + background-color: #121212 !important; +} +.has-text-black-ter { + color: #242424 !important; +} +.has-background-black-ter { + background-color: #242424 !important; +} +.has-text-grey-darker { + color: #363636 !important; +} +.has-background-grey-darker { + background-color: #363636 !important; +} +.has-text-grey-dark { + color: #4a4a4a !important; +} +.has-background-grey-dark { + background-color: #4a4a4a !important; +} +.has-text-grey, +.article-licensing .licensing-title a { + color: #7a7a7a !important; +} +.has-background-grey { + background-color: #7a7a7a !important; +} +.has-text-grey-light { + color: #b5b5b5 !important; +} +.has-background-grey-light { + background-color: #b5b5b5 !important; +} +.has-text-grey-lighter { + color: #dbdbdb !important; +} +.has-background-grey-lighter { + background-color: #dbdbdb !important; +} +.has-text-white-ter { + color: #f5f5f5 !important; +} +.has-background-white-ter { + background-color: #f5f5f5 !important; +} +.has-text-white-bis { + color: #fafafa !important; +} +.has-background-white-bis { + background-color: #fafafa !important; +} +.has-text-weight-light { + font-weight: 300 !important; +} +.has-text-weight-normal { + font-weight: 400 !important; +} +.has-text-weight-medium { + font-weight: 500 !important; +} +.has-text-weight-semibold { + font-weight: 600 !important; +} +.has-text-weight-bold { + font-weight: 700 !important; +} +.is-family-primary { + font-family: Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.is-family-secondary { + font-family: Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.is-family-sans-serif { + font-family: Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.is-family-monospace { + font-family: monospace !important; +} +.is-family-code { + font-family: 'Source Code Pro', monospace, 'Microsoft YaHei' !important; +} +.is-block { + display: block !important; +} +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; + } +} +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-block-tablet-only { + display: block !important; + } +} +@media screen and (max-width: 1087px) { + .is-block-touch { + display: block !important; + } +} +@media screen and (min-width: 1088px) { + .is-block-desktop { + display: block !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-block-desktop-only { + display: block !important; + } +} +@media screen and (min-width: 1280px) { + .is-block-widescreen { + display: block !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-block-widescreen-only { + display: block !important; + } +} +@media screen and (min-width: 1472px) { + .is-block-fullhd { + display: block !important; + } +} +.is-flex { + display: flex !important; +} +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; + } +} +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: flex !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-flex-tablet-only { + display: flex !important; + } +} +@media screen and (max-width: 1087px) { + .is-flex-touch { + display: flex !important; + } +} +@media screen and (min-width: 1088px) { + .is-flex-desktop { + display: flex !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-flex-desktop-only { + display: flex !important; + } +} +@media screen and (min-width: 1280px) { + .is-flex-widescreen { + display: flex !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-flex-widescreen-only { + display: flex !important; + } +} +@media screen and (min-width: 1472px) { + .is-flex-fullhd { + display: flex !important; + } +} +.is-inline { + display: inline !important; +} +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; + } +} +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-inline-tablet-only { + display: inline !important; + } +} +@media screen and (max-width: 1087px) { + .is-inline-touch { + display: inline !important; + } +} +@media screen and (min-width: 1088px) { + .is-inline-desktop { + display: inline !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-inline-desktop-only { + display: inline !important; + } +} +@media screen and (min-width: 1280px) { + .is-inline-widescreen { + display: inline !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-inline-widescreen-only { + display: inline !important; + } +} +@media screen and (min-width: 1472px) { + .is-inline-fullhd { + display: inline !important; + } +} +.is-inline-block { + display: inline-block !important; +} +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; + } +} +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-inline-block-tablet-only { + display: inline-block !important; + } +} +@media screen and (max-width: 1087px) { + .is-inline-block-touch { + display: inline-block !important; + } +} +@media screen and (min-width: 1088px) { + .is-inline-block-desktop { + display: inline-block !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-inline-block-desktop-only { + display: inline-block !important; + } +} +@media screen and (min-width: 1280px) { + .is-inline-block-widescreen { + display: inline-block !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-inline-block-widescreen-only { + display: inline-block !important; + } +} +@media screen and (min-width: 1472px) { + .is-inline-block-fullhd { + display: inline-block !important; + } +} +.is-inline-flex { + display: inline-flex !important; +} +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; + } +} +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: inline-flex !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; + } +} +@media screen and (max-width: 1087px) { + .is-inline-flex-touch { + display: inline-flex !important; + } +} +@media screen and (min-width: 1088px) { + .is-inline-flex-desktop { + display: inline-flex !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; + } +} +@media screen and (min-width: 1280px) { + .is-inline-flex-widescreen { + display: inline-flex !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; + } +} +@media screen and (min-width: 1472px) { + .is-inline-flex-fullhd { + display: inline-flex !important; + } +} +.is-hidden { + display: none !important; +} +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; +} +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; + } +} +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-hidden-tablet-only { + display: none !important; + } +} +@media screen and (max-width: 1087px) { + .is-hidden-touch { + display: none !important; + } +} +@media screen and (min-width: 1088px) { + .is-hidden-desktop { + display: none !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-hidden-desktop-only { + display: none !important; + } +} +@media screen and (min-width: 1280px) { + .is-hidden-widescreen { + display: none !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-hidden-widescreen-only { + display: none !important; + } +} +@media screen and (min-width: 1472px) { + .is-hidden-fullhd { + display: none !important; + } +} +.is-invisible { + visibility: hidden !important; +} +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; + } +} +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-invisible-tablet-only { + visibility: hidden !important; + } +} +@media screen and (max-width: 1087px) { + .is-invisible-touch { + visibility: hidden !important; + } +} +@media screen and (min-width: 1088px) { + .is-invisible-desktop { + visibility: hidden !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-invisible-desktop-only { + visibility: hidden !important; + } +} +@media screen and (min-width: 1280px) { + .is-invisible-widescreen { + visibility: hidden !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-invisible-widescreen-only { + visibility: hidden !important; + } +} +@media screen and (min-width: 1472px) { + .is-invisible-fullhd { + visibility: hidden !important; + } +} +.is-marginless { + margin: 0 !important; +} +.is-paddingless { + padding: 0 !important; +} +.is-radiusless { + border-radius: 0 !important; +} +.is-shadowless { + box-shadow: none !important; +} +.is-relative { + position: relative !important; +} +.breadcrumb { + font-size: 1rem; + white-space: nowrap; +} +.breadcrumb a { + align-items: center; + color: #3273dc; + display: flex; + justify-content: center; + padding: 0 0.75em; +} +.breadcrumb a:hover { + color: #363636; +} +.breadcrumb li { + align-items: center; + display: flex; +} +.breadcrumb li:first-child a { + padding-left: 0; +} +.breadcrumb li.is-active a { + color: #363636; + cursor: default; + pointer-events: none; +} +.breadcrumb li + li::before { + color: #b5b5b5; + content: "\0002f"; +} +.breadcrumb ul, +.breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.breadcrumb .icon:first-child { + margin-right: 0.5em; +} +.breadcrumb .icon:last-child { + margin-left: 0.5em; +} +.breadcrumb.is-centered ol, +.breadcrumb.is-centered ul { + justify-content: center; +} +.breadcrumb.is-right ol, +.breadcrumb.is-right ul { + justify-content: flex-end; +} +.breadcrumb.is-small { + font-size: 0.75rem; +} +.breadcrumb.is-medium { + font-size: 1.25rem; +} +.breadcrumb.is-large { + font-size: 1.5rem; +} +.breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; +} +.breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; +} +.breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; +} +.breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; +} +.card { + background-color: #fff; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); + color: #4a4a4a; + max-width: 100%; + position: relative; +} +.card-header { + background-color: transparent; + align-items: stretch; + box-shadow: 0 0.125em 0.25em rgba(10,10,10,0.1); + display: flex; +} +.card-header-title { + align-items: center; + color: #363636; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem 1rem; +} +.card-header-title.is-centered { + justify-content: center; +} +.card-header-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem 1rem; +} +.card-image { + display: block; + position: relative; +} +.card-content { + background-color: transparent; + padding: 1.5rem; +} +.card-footer { + background-color: transparent; + border-top: 1px solid #ededed; + align-items: stretch; + display: flex; +} +.card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; +} +.card-footer-item:not(:last-child) { + border-right: 1px solid #ededed; +} +.card .media:not(:last-child) { + margin-bottom: 0.75rem; +} +.dropdown { + display: inline-flex; + position: relative; + vertical-align: top; +} +.dropdown.is-active .dropdown-menu, +.dropdown.is-hoverable:hover .dropdown-menu { + display: block; +} +.dropdown.is-right .dropdown-menu { + left: auto; + right: 0; +} +.dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; +} +.dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; +} +.dropdown-content { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 0.5em 1em -0.125em rgba(10,10,10,0.1), 0 0px 0 1px rgba(10,10,10,0.02); + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} +.dropdown-item { + color: #4a4a4a; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; +} +a.dropdown-item, +button.dropdown-item { + padding-right: 3rem; + text-align: left; + white-space: nowrap; + width: 100%; +} +a.dropdown-item:hover, +button.dropdown-item:hover { + background-color: #f5f5f5; + color: #0a0a0a; +} +a.dropdown-item.is-active, +button.dropdown-item.is-active { + background-color: #3273dc; + color: #fff; +} +.dropdown-divider { + background-color: #ededed; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; +} +.level { + align-items: center; + justify-content: space-between; +} +.level code { + border-radius: 4px; +} +.level img { + display: inline-block; + vertical-align: top; +} +.level.is-mobile { + display: flex; +} +.level.is-mobile .level-left, +.level.is-mobile .level-right { + display: flex; +} +.level.is-mobile .level-left + .level-right { + margin-top: 0; +} +.level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; +} +.level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; +} +@media screen and (min-width: 769px), print { + .level { + display: flex; + } + .level > .level-item:not(.is-narrow) { + flex-grow: 1; + } +} +.level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; +} +.level-item .title, +.level-item .subtitle { + margin-bottom: 0; +} +@media screen and (max-width: 768px) { + .level-item:not(:last-child) { + margin-bottom: 0.75rem; + } +} +.level-left, +.level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; +} +.level-left .level-item.is-flexible, +.level-right .level-item.is-flexible { + flex-grow: 1; +} +@media screen and (min-width: 769px), print { + .level-left .level-item:not(:last-child), + .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; + } +} +.level-left { + align-items: center; + justify-content: flex-start; +} +@media screen and (max-width: 768px) { + .level-left + .level-right { + margin-top: 1.5rem; + } +} +@media screen and (min-width: 769px), print { + .level-left { + display: flex; + } +} +.level-right { + align-items: center; + justify-content: flex-end; +} +@media screen and (min-width: 769px), print { + .level-right { + display: flex; + } +} +.list { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 3px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1); +} +.list-item { + display: block; + padding: 0.5em 1em; +} +.list-item:not(a) { + color: #4a4a4a; +} +.list-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-item:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} +.list-item:not(:last-child) { + border-bottom: 1px solid #dbdbdb; +} +.list-item.is-active { + background-color: #3273dc; + color: #fff; +} +a.list-item { + background-color: #f5f5f5; + cursor: pointer; +} +.media { + align-items: flex-start; + display: flex; + text-align: left; +} +.media .content:not(:last-child) { + margin-bottom: 0.75rem; +} +.media .media { + border-top: 1px solid rgba(219,219,219,0.5); + display: flex; + padding-top: 0.75rem; +} +.media .media .content:not(:last-child), +.media .media .control:not(:last-child) { + margin-bottom: 0.5rem; +} +.media .media .media { + padding-top: 0.5rem; +} +.media .media .media + .media { + margin-top: 0.5rem; +} +.media + .media { + border-top: 1px solid rgba(219,219,219,0.5); + margin-top: 1rem; + padding-top: 1rem; +} +.media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; +} +.media-left, +.media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; +} +.media-left { + margin-right: 1rem; +} +.media-right { + margin-left: 1rem; +} +.media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: left; +} +@media screen and (max-width: 768px) { + .media-content { + overflow-x: auto; + } +} +.menu { + font-size: 1rem; +} +.menu.is-small { + font-size: 0.75rem; +} +.menu.is-medium { + font-size: 1.25rem; +} +.menu.is-large { + font-size: 1.5rem; +} +.menu-list { + line-height: 1.25; +} +.menu-list a { + border-radius: 2px; + color: #4a4a4a; + display: block; + padding: 0.5em 0.75em; +} +.menu-list a:hover { + background-color: #f5f5f5; + color: #363636; +} +.menu-list a.is-active { + background-color: #eef3fc; + color: #3273dc; +} +.menu-list li ul { + border-left: 1px solid #dbdbdb; + margin: 0.75em; + padding-left: 0.75em; +} +.menu-label { + color: #7a7a7a; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; +} +.menu-label:not(:first-child) { + margin-top: 1em; +} +.menu-label:not(:last-child) { + margin-bottom: 1em; +} +.message { + background-color: #f5f5f5; + border-radius: 4px; + font-size: 1rem; +} +.message strong { + color: currentColor; +} +.message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; +} +.message.is-small { + font-size: 0.75rem; +} +.message.is-medium { + font-size: 1.25rem; +} +.message.is-large { + font-size: 1.5rem; +} +.message.is-white { + background-color: #fff; +} +.message.is-white .message-header { + background-color: #fff; + color: #0a0a0a; +} +.message.is-white .message-body { + border-color: #fff; +} +.message.is-black { + background-color: #fafafa; +} +.message.is-black .message-header { + background-color: #0a0a0a; + color: #fff; +} +.message.is-black .message-body { + border-color: #0a0a0a; +} +.message.is-light { + background-color: #fafafa; +} +.message.is-light .message-header { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.message.is-light .message-body { + border-color: #f5f5f5; +} +.message.is-dark { + background-color: #fafafa; +} +.message.is-dark .message-header { + background-color: #363636; + color: #fff; +} +.message.is-dark .message-body { + border-color: #363636; +} +.message.is-primary { + background-color: #eef3fc; +} +.message.is-primary .message-header { + background-color: #3273dc; + color: #fff; +} +.message.is-primary .message-body { + border-color: #3273dc; + color: #2160c4; +} +.message.is-link { + background-color: #eef3fc; +} +.message.is-link .message-header { + background-color: #3273dc; + color: #fff; +} +.message.is-link .message-body { + border-color: #3273dc; + color: #2160c4; +} +.message.is-info { + background-color: #eef6fc; +} +.message.is-info .message-header { + background-color: #3298dc; + color: #fff; +} +.message.is-info .message-body { + border-color: #3298dc; + color: #1d72aa; +} +.message.is-success { + background-color: #effaf3; +} +.message.is-success .message-header { + background-color: #48c774; + color: #fff; +} +.message.is-success .message-body { + border-color: #48c774; + color: #257942; +} +.message.is-warning { + background-color: #fffbeb; +} +.message.is-warning .message-header { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.message.is-warning .message-body { + border-color: #ffdd57; + color: #947600; +} +.message.is-danger { + background-color: #feecf0; +} +.message.is-danger .message-header { + background-color: #f14668; + color: #fff; +} +.message.is-danger .message-body { + border-color: #f14668; + color: #cc0f35; +} +.message.is-grey-lightest { + background-color: #fafafa; +} +.message.is-grey-lightest .message-header { + background-color: #ededed; + color: #363636; +} +.message.is-grey-lightest .message-body { + border-color: #ededed; +} +.message-header { + align-items: center; + background-color: #4a4a4a; + border-radius: 4px 4px 0 0; + color: #fff; + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; +} +.message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; +} +.message-header + .message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.message-body { + border-color: #dbdbdb; + border-radius: 4px; + border-style: solid; + border-width: 0 0 0 4px; + color: #4a4a4a; + padding: 1.25em 1.5em; +} +.message-body code, +.message-body pre { + background-color: #fff; +} +.message-body pre code { + background-color: transparent; +} +.modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; +} +.modal.is-active { + display: flex; +} +.modal-background { + background-color: rgba(10,10,10,0.86); +} +.modal-content, +.modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; +} +@media screen and (min-width: 769px), print { + .modal-content, + .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; + } +} +.modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; +} +.modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; +} +.modal-card-head, +.modal-card-foot { + align-items: center; + background-color: #f5f5f5; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; +} +.modal-card-head { + border-bottom: 1px solid #dbdbdb; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} +.modal-card-title { + color: #363636; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; +} +.modal-card-foot { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 1px solid #dbdbdb; +} +.modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; +} +.modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: #fff; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; +} +.navbar { + background-color: #fff; + min-height: 3.25rem; + position: relative; + z-index: 30; +} +.navbar.is-white { + background-color: #fff; + color: #0a0a0a; +} +.navbar.is-white .navbar-brand > .navbar-item, +.navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; +} +.navbar.is-white .navbar-brand > a.navbar-item:focus, +.navbar.is-white .navbar-brand .navbar-link:focus, +.navbar.is-white .navbar-brand > a.navbar-item:hover, +.navbar.is-white .navbar-brand .navbar-link:hover, +.navbar.is-white .navbar-brand > a.navbar-item.is-active, +.navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; +} +.navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; +} +.navbar.is-white .navbar-burger { + color: #0a0a0a; +} +@media screen and (min-width: 1088px) { + .navbar.is-white .navbar-start > .navbar-item, + .navbar.is-white .navbar-end > .navbar-item, + .navbar.is-white .navbar-start .navbar-link, + .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; + } + .navbar.is-white .navbar-start > a.navbar-item:focus, + .navbar.is-white .navbar-end > a.navbar-item:focus, + .navbar.is-white .navbar-start .navbar-link:focus, + .navbar.is-white .navbar-end .navbar-link:focus, + .navbar.is-white .navbar-start > a.navbar-item:hover, + .navbar.is-white .navbar-end > a.navbar-item:hover, + .navbar.is-white .navbar-start .navbar-link:hover, + .navbar.is-white .navbar-end .navbar-link:hover, + .navbar.is-white .navbar-start > a.navbar-item.is-active, + .navbar.is-white .navbar-end > a.navbar-item.is-active, + .navbar.is-white .navbar-start .navbar-link.is-active, + .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; + } + .navbar.is-white .navbar-start .navbar-link::after, + .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; + } + .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; + } + .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: #fff; + color: #0a0a0a; + } +} +.navbar.is-black { + background-color: #0a0a0a; + color: #fff; +} +.navbar.is-black .navbar-brand > .navbar-item, +.navbar.is-black .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-black .navbar-brand > a.navbar-item:focus, +.navbar.is-black .navbar-brand .navbar-link:focus, +.navbar.is-black .navbar-brand > a.navbar-item:hover, +.navbar.is-black .navbar-brand .navbar-link:hover, +.navbar.is-black .navbar-brand > a.navbar-item.is-active, +.navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: #000; + color: #fff; +} +.navbar.is-black .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-black .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-black .navbar-start > .navbar-item, + .navbar.is-black .navbar-end > .navbar-item, + .navbar.is-black .navbar-start .navbar-link, + .navbar.is-black .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-black .navbar-start > a.navbar-item:focus, + .navbar.is-black .navbar-end > a.navbar-item:focus, + .navbar.is-black .navbar-start .navbar-link:focus, + .navbar.is-black .navbar-end .navbar-link:focus, + .navbar.is-black .navbar-start > a.navbar-item:hover, + .navbar.is-black .navbar-end > a.navbar-item:hover, + .navbar.is-black .navbar-start .navbar-link:hover, + .navbar.is-black .navbar-end .navbar-link:hover, + .navbar.is-black .navbar-start > a.navbar-item.is-active, + .navbar.is-black .navbar-end > a.navbar-item.is-active, + .navbar.is-black .navbar-start .navbar-link.is-active, + .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: #000; + color: #fff; + } + .navbar.is-black .navbar-start .navbar-link::after, + .navbar.is-black .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #000; + color: #fff; + } + .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: #fff; + } +} +.navbar.is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-brand > .navbar-item, +.navbar.is-light .navbar-brand .navbar-link { + color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-brand > a.navbar-item:focus, +.navbar.is-light .navbar-brand .navbar-link:focus, +.navbar.is-light .navbar-brand > a.navbar-item:hover, +.navbar.is-light .navbar-brand .navbar-link:hover, +.navbar.is-light .navbar-brand > a.navbar-item.is-active, +.navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-brand .navbar-link::after { + border-color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-burger { + color: rgba(0,0,0,0.7); +} +@media screen and (min-width: 1088px) { + .navbar.is-light .navbar-start > .navbar-item, + .navbar.is-light .navbar-end > .navbar-item, + .navbar.is-light .navbar-start .navbar-link, + .navbar.is-light .navbar-end .navbar-link { + color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-start > a.navbar-item:focus, + .navbar.is-light .navbar-end > a.navbar-item:focus, + .navbar.is-light .navbar-start .navbar-link:focus, + .navbar.is-light .navbar-end .navbar-link:focus, + .navbar.is-light .navbar-start > a.navbar-item:hover, + .navbar.is-light .navbar-end > a.navbar-item:hover, + .navbar.is-light .navbar-start .navbar-link:hover, + .navbar.is-light .navbar-end .navbar-link:hover, + .navbar.is-light .navbar-start > a.navbar-item.is-active, + .navbar.is-light .navbar-end > a.navbar-item.is-active, + .navbar.is-light .navbar-start .navbar-link.is-active, + .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-start .navbar-link::after, + .navbar.is-light .navbar-end .navbar-link::after { + border-color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); + } +} +.navbar.is-dark { + background-color: #363636; + color: #fff; +} +.navbar.is-dark .navbar-brand > .navbar-item, +.navbar.is-dark .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-dark .navbar-brand > a.navbar-item:focus, +.navbar.is-dark .navbar-brand .navbar-link:focus, +.navbar.is-dark .navbar-brand > a.navbar-item:hover, +.navbar.is-dark .navbar-brand .navbar-link:hover, +.navbar.is-dark .navbar-brand > a.navbar-item.is-active, +.navbar.is-dark .navbar-brand .navbar-link.is-active { + background-color: #292929; + color: #fff; +} +.navbar.is-dark .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-dark .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-dark .navbar-start > .navbar-item, + .navbar.is-dark .navbar-end > .navbar-item, + .navbar.is-dark .navbar-start .navbar-link, + .navbar.is-dark .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-dark .navbar-start > a.navbar-item:focus, + .navbar.is-dark .navbar-end > a.navbar-item:focus, + .navbar.is-dark .navbar-start .navbar-link:focus, + .navbar.is-dark .navbar-end .navbar-link:focus, + .navbar.is-dark .navbar-start > a.navbar-item:hover, + .navbar.is-dark .navbar-end > a.navbar-item:hover, + .navbar.is-dark .navbar-start .navbar-link:hover, + .navbar.is-dark .navbar-end .navbar-link:hover, + .navbar.is-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-dark .navbar-start .navbar-link.is-active, + .navbar.is-dark .navbar-end .navbar-link.is-active { + background-color: #292929; + color: #fff; + } + .navbar.is-dark .navbar-start .navbar-link::after, + .navbar.is-dark .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #292929; + color: #fff; + } + .navbar.is-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #363636; + color: #fff; + } +} +.navbar.is-primary { + background-color: #3273dc; + color: #fff; +} +.navbar.is-primary .navbar-brand > .navbar-item, +.navbar.is-primary .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-primary .navbar-brand > a.navbar-item:focus, +.navbar.is-primary .navbar-brand .navbar-link:focus, +.navbar.is-primary .navbar-brand > a.navbar-item:hover, +.navbar.is-primary .navbar-brand .navbar-link:hover, +.navbar.is-primary .navbar-brand > a.navbar-item.is-active, +.navbar.is-primary .navbar-brand .navbar-link.is-active { + background-color: #2366d1; + color: #fff; +} +.navbar.is-primary .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-primary .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-primary .navbar-start > .navbar-item, + .navbar.is-primary .navbar-end > .navbar-item, + .navbar.is-primary .navbar-start .navbar-link, + .navbar.is-primary .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-primary .navbar-start > a.navbar-item:focus, + .navbar.is-primary .navbar-end > a.navbar-item:focus, + .navbar.is-primary .navbar-start .navbar-link:focus, + .navbar.is-primary .navbar-end .navbar-link:focus, + .navbar.is-primary .navbar-start > a.navbar-item:hover, + .navbar.is-primary .navbar-end > a.navbar-item:hover, + .navbar.is-primary .navbar-start .navbar-link:hover, + .navbar.is-primary .navbar-end .navbar-link:hover, + .navbar.is-primary .navbar-start > a.navbar-item.is-active, + .navbar.is-primary .navbar-end > a.navbar-item.is-active, + .navbar.is-primary .navbar-start .navbar-link.is-active, + .navbar.is-primary .navbar-end .navbar-link.is-active { + background-color: #2366d1; + color: #fff; + } + .navbar.is-primary .navbar-start .navbar-link::after, + .navbar.is-primary .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2366d1; + color: #fff; + } + .navbar.is-primary .navbar-dropdown a.navbar-item.is-active { + background-color: #3273dc; + color: #fff; + } +} +.navbar.is-link { + background-color: #3273dc; + color: #fff; +} +.navbar.is-link .navbar-brand > .navbar-item, +.navbar.is-link .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-link .navbar-brand > a.navbar-item:focus, +.navbar.is-link .navbar-brand .navbar-link:focus, +.navbar.is-link .navbar-brand > a.navbar-item:hover, +.navbar.is-link .navbar-brand .navbar-link:hover, +.navbar.is-link .navbar-brand > a.navbar-item.is-active, +.navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #2366d1; + color: #fff; +} +.navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-link .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-link .navbar-start > .navbar-item, + .navbar.is-link .navbar-end > .navbar-item, + .navbar.is-link .navbar-start .navbar-link, + .navbar.is-link .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-link .navbar-start > a.navbar-item:focus, + .navbar.is-link .navbar-end > a.navbar-item:focus, + .navbar.is-link .navbar-start .navbar-link:focus, + .navbar.is-link .navbar-end .navbar-link:focus, + .navbar.is-link .navbar-start > a.navbar-item:hover, + .navbar.is-link .navbar-end > a.navbar-item:hover, + .navbar.is-link .navbar-start .navbar-link:hover, + .navbar.is-link .navbar-end .navbar-link:hover, + .navbar.is-link .navbar-start > a.navbar-item.is-active, + .navbar.is-link .navbar-end > a.navbar-item.is-active, + .navbar.is-link .navbar-start .navbar-link.is-active, + .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #2366d1; + color: #fff; + } + .navbar.is-link .navbar-start .navbar-link::after, + .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2366d1; + color: #fff; + } + .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #3273dc; + color: #fff; + } +} +.navbar.is-info { + background-color: #3298dc; + color: #fff; +} +.navbar.is-info .navbar-brand > .navbar-item, +.navbar.is-info .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-info .navbar-brand > a.navbar-item:focus, +.navbar.is-info .navbar-brand .navbar-link:focus, +.navbar.is-info .navbar-brand > a.navbar-item:hover, +.navbar.is-info .navbar-brand .navbar-link:hover, +.navbar.is-info .navbar-brand > a.navbar-item.is-active, +.navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #238cd1; + color: #fff; +} +.navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-info .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-info .navbar-start > .navbar-item, + .navbar.is-info .navbar-end > .navbar-item, + .navbar.is-info .navbar-start .navbar-link, + .navbar.is-info .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-info .navbar-start > a.navbar-item:focus, + .navbar.is-info .navbar-end > a.navbar-item:focus, + .navbar.is-info .navbar-start .navbar-link:focus, + .navbar.is-info .navbar-end .navbar-link:focus, + .navbar.is-info .navbar-start > a.navbar-item:hover, + .navbar.is-info .navbar-end > a.navbar-item:hover, + .navbar.is-info .navbar-start .navbar-link:hover, + .navbar.is-info .navbar-end .navbar-link:hover, + .navbar.is-info .navbar-start > a.navbar-item.is-active, + .navbar.is-info .navbar-end > a.navbar-item.is-active, + .navbar.is-info .navbar-start .navbar-link.is-active, + .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #238cd1; + color: #fff; + } + .navbar.is-info .navbar-start .navbar-link::after, + .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #238cd1; + color: #fff; + } + .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #3298dc; + color: #fff; + } +} +.navbar.is-success { + background-color: #48c774; + color: #fff; +} +.navbar.is-success .navbar-brand > .navbar-item, +.navbar.is-success .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-success .navbar-brand > a.navbar-item:focus, +.navbar.is-success .navbar-brand .navbar-link:focus, +.navbar.is-success .navbar-brand > a.navbar-item:hover, +.navbar.is-success .navbar-brand .navbar-link:hover, +.navbar.is-success .navbar-brand > a.navbar-item.is-active, +.navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #3abb67; + color: #fff; +} +.navbar.is-success .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-success .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-success .navbar-start > .navbar-item, + .navbar.is-success .navbar-end > .navbar-item, + .navbar.is-success .navbar-start .navbar-link, + .navbar.is-success .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-success .navbar-start > a.navbar-item:focus, + .navbar.is-success .navbar-end > a.navbar-item:focus, + .navbar.is-success .navbar-start .navbar-link:focus, + .navbar.is-success .navbar-end .navbar-link:focus, + .navbar.is-success .navbar-start > a.navbar-item:hover, + .navbar.is-success .navbar-end > a.navbar-item:hover, + .navbar.is-success .navbar-start .navbar-link:hover, + .navbar.is-success .navbar-end .navbar-link:hover, + .navbar.is-success .navbar-start > a.navbar-item.is-active, + .navbar.is-success .navbar-end > a.navbar-item.is-active, + .navbar.is-success .navbar-start .navbar-link.is-active, + .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #3abb67; + color: #fff; + } + .navbar.is-success .navbar-start .navbar-link::after, + .navbar.is-success .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #3abb67; + color: #fff; + } + .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #48c774; + color: #fff; + } +} +.navbar.is-warning { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.navbar.is-warning .navbar-brand > .navbar-item, +.navbar.is-warning .navbar-brand .navbar-link { + color: rgba(0,0,0,0.7); +} +.navbar.is-warning .navbar-brand > a.navbar-item:focus, +.navbar.is-warning .navbar-brand .navbar-link:focus, +.navbar.is-warning .navbar-brand > a.navbar-item:hover, +.navbar.is-warning .navbar-brand .navbar-link:hover, +.navbar.is-warning .navbar-brand > a.navbar-item.is-active, +.navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #ffd83d; + color: rgba(0,0,0,0.7); +} +.navbar.is-warning .navbar-brand .navbar-link::after { + border-color: rgba(0,0,0,0.7); +} +.navbar.is-warning .navbar-burger { + color: rgba(0,0,0,0.7); +} +@media screen and (min-width: 1088px) { + .navbar.is-warning .navbar-start > .navbar-item, + .navbar.is-warning .navbar-end > .navbar-item, + .navbar.is-warning .navbar-start .navbar-link, + .navbar.is-warning .navbar-end .navbar-link { + color: rgba(0,0,0,0.7); + } + .navbar.is-warning .navbar-start > a.navbar-item:focus, + .navbar.is-warning .navbar-end > a.navbar-item:focus, + .navbar.is-warning .navbar-start .navbar-link:focus, + .navbar.is-warning .navbar-end .navbar-link:focus, + .navbar.is-warning .navbar-start > a.navbar-item:hover, + .navbar.is-warning .navbar-end > a.navbar-item:hover, + .navbar.is-warning .navbar-start .navbar-link:hover, + .navbar.is-warning .navbar-end .navbar-link:hover, + .navbar.is-warning .navbar-start > a.navbar-item.is-active, + .navbar.is-warning .navbar-end > a.navbar-item.is-active, + .navbar.is-warning .navbar-start .navbar-link.is-active, + .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #ffd83d; + color: rgba(0,0,0,0.7); + } + .navbar.is-warning .navbar-start .navbar-link::after, + .navbar.is-warning .navbar-end .navbar-link::after { + border-color: rgba(0,0,0,0.7); + } + .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ffd83d; + color: rgba(0,0,0,0.7); + } + .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); + } +} +.navbar.is-danger { + background-color: #f14668; + color: #fff; +} +.navbar.is-danger .navbar-brand > .navbar-item, +.navbar.is-danger .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-danger .navbar-brand > a.navbar-item:focus, +.navbar.is-danger .navbar-brand .navbar-link:focus, +.navbar.is-danger .navbar-brand > a.navbar-item:hover, +.navbar.is-danger .navbar-brand .navbar-link:hover, +.navbar.is-danger .navbar-brand > a.navbar-item.is-active, +.navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; +} +.navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-danger .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-danger .navbar-start > .navbar-item, + .navbar.is-danger .navbar-end > .navbar-item, + .navbar.is-danger .navbar-start .navbar-link, + .navbar.is-danger .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-danger .navbar-start > a.navbar-item:focus, + .navbar.is-danger .navbar-end > a.navbar-item:focus, + .navbar.is-danger .navbar-start .navbar-link:focus, + .navbar.is-danger .navbar-end .navbar-link:focus, + .navbar.is-danger .navbar-start > a.navbar-item:hover, + .navbar.is-danger .navbar-end > a.navbar-item:hover, + .navbar.is-danger .navbar-start .navbar-link:hover, + .navbar.is-danger .navbar-end .navbar-link:hover, + .navbar.is-danger .navbar-start > a.navbar-item.is-active, + .navbar.is-danger .navbar-end > a.navbar-item.is-active, + .navbar.is-danger .navbar-start .navbar-link.is-active, + .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; + } + .navbar.is-danger .navbar-start .navbar-link::after, + .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ef2e55; + color: #fff; + } + .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #f14668; + color: #fff; + } +} +.navbar.is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.navbar.is-grey-lightest .navbar-brand > .navbar-item, +.navbar.is-grey-lightest .navbar-brand .navbar-link { + color: #363636; +} +.navbar.is-grey-lightest .navbar-brand > a.navbar-item:focus, +.navbar.is-grey-lightest .navbar-brand .navbar-link:focus, +.navbar.is-grey-lightest .navbar-brand > a.navbar-item:hover, +.navbar.is-grey-lightest .navbar-brand .navbar-link:hover, +.navbar.is-grey-lightest .navbar-brand > a.navbar-item.is-active, +.navbar.is-grey-lightest .navbar-brand .navbar-link.is-active { + background-color: #e0e0e0; + color: #363636; +} +.navbar.is-grey-lightest .navbar-brand .navbar-link::after { + border-color: #363636; +} +.navbar.is-grey-lightest .navbar-burger { + color: #363636; +} +@media screen and (min-width: 1088px) { + .navbar.is-grey-lightest .navbar-start > .navbar-item, + .navbar.is-grey-lightest .navbar-end > .navbar-item, + .navbar.is-grey-lightest .navbar-start .navbar-link, + .navbar.is-grey-lightest .navbar-end .navbar-link { + color: #363636; + } + .navbar.is-grey-lightest .navbar-start > a.navbar-item:focus, + .navbar.is-grey-lightest .navbar-end > a.navbar-item:focus, + .navbar.is-grey-lightest .navbar-start .navbar-link:focus, + .navbar.is-grey-lightest .navbar-end .navbar-link:focus, + .navbar.is-grey-lightest .navbar-start > a.navbar-item:hover, + .navbar.is-grey-lightest .navbar-end > a.navbar-item:hover, + .navbar.is-grey-lightest .navbar-start .navbar-link:hover, + .navbar.is-grey-lightest .navbar-end .navbar-link:hover, + .navbar.is-grey-lightest .navbar-start > a.navbar-item.is-active, + .navbar.is-grey-lightest .navbar-end > a.navbar-item.is-active, + .navbar.is-grey-lightest .navbar-start .navbar-link.is-active, + .navbar.is-grey-lightest .navbar-end .navbar-link.is-active { + background-color: #e0e0e0; + color: #363636; + } + .navbar.is-grey-lightest .navbar-start .navbar-link::after, + .navbar.is-grey-lightest .navbar-end .navbar-link::after { + border-color: #363636; + } + .navbar.is-grey-lightest .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-grey-lightest .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-grey-lightest .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e0e0e0; + color: #363636; + } + .navbar.is-grey-lightest .navbar-dropdown a.navbar-item.is-active { + background-color: #ededed; + color: #363636; + } +} +.navbar > .container { + align-items: stretch; + display: flex; + min-height: 3.25rem; + width: 100%; +} +.navbar.has-shadow { + box-shadow: 0 2px 0 0 #f5f5f5; +} +.navbar.is-fixed-bottom, +.navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; +} +.navbar.is-fixed-bottom { + bottom: 0; +} +.navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 #f5f5f5; +} +.navbar.is-fixed-top { + top: 0; +} +html.has-navbar-fixed-top, +body.has-navbar-fixed-top { + padding-top: 3.25rem; +} +html.has-navbar-fixed-bottom, +body.has-navbar-fixed-bottom { + padding-bottom: 3.25rem; +} +.navbar-brand, +.navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 3.25rem; +} +.navbar-brand a.navbar-item:focus, +.navbar-brand a.navbar-item:hover { + background-color: transparent; +} +.navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; +} +.navbar-burger { + color: #4a4a4a; + cursor: pointer; + display: block; + height: 3.25rem; + position: relative; + width: 3.25rem; + margin-left: auto; +} +.navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; +} +.navbar-burger span:nth-child(1) { + top: calc(50% - 6px); +} +.navbar-burger span:nth-child(2) { + top: calc(50% - 1px); +} +.navbar-burger span:nth-child(3) { + top: calc(50% + 4px); +} +.navbar-burger:hover { + background-color: rgba(0,0,0,0.05); +} +.navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); +} +.navbar-burger.is-active span:nth-child(2) { + opacity: 0; +} +.navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); +} +.navbar-menu { + display: none; +} +.navbar-item, +.navbar-link { + color: #4a4a4a; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; +} +.navbar-item .icon:only-child, +.navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; +} +a.navbar-item, +.navbar-link { + cursor: pointer; +} +a.navbar-item:focus, +.navbar-link:focus, +a.navbar-item:focus-within, +.navbar-link:focus-within, +a.navbar-item:hover, +.navbar-link:hover, +a.navbar-item.is-active, +.navbar-link.is-active { + background-color: #fafafa; + color: #3273dc; +} +.navbar-item { + display: block; + flex-grow: 0; + flex-shrink: 0; +} +.navbar-item img { + max-height: 1.75rem; +} +.navbar-item.has-dropdown { + padding: 0; +} +.navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 3.25rem; + padding-bottom: calc(0.5rem - 1px); +} +.navbar-item.is-tab:focus, +.navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #3273dc; +} +.navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #3273dc; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #3273dc; + padding-bottom: calc(0.5rem - 3px); +} +.navbar-content { + flex-grow: 1; + flex-shrink: 1; +} +.navbar-link:not(.is-arrowless) { + padding-right: 2.5em; +} +.navbar-link:not(.is-arrowless)::after { + border-color: #3273dc; + margin-top: -0.375em; + right: 1.125em; +} +.navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} +.navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; +} +.navbar-divider { + background-color: #f5f5f5; + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; +} +@media screen and (max-width: 1087px) { + .navbar > .container { + display: block; + } + .navbar-brand .navbar-item, + .navbar-tabs .navbar-item { + align-items: center; + display: flex; + } + .navbar-link::after { + display: none; + } + .navbar-menu { + background-color: #fff; + box-shadow: 0 8px 16px rgba(10,10,10,0.1); + padding: 0.5rem 0; + } + .navbar-menu.is-active { + display: block; + } + .navbar.is-fixed-bottom-touch, + .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; + } + .navbar.is-fixed-bottom-touch { + bottom: 0; + } + .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(10,10,10,0.1); + } + .navbar.is-fixed-top-touch { + top: 0; + } + .navbar.is-fixed-top .navbar-menu, + .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 3.25rem); + overflow: auto; + } + html.has-navbar-fixed-top-touch, + body.has-navbar-fixed-top-touch { + padding-top: 3.25rem; + } + html.has-navbar-fixed-bottom-touch, + body.has-navbar-fixed-bottom-touch { + padding-bottom: 3.25rem; + } +} +@media screen and (min-width: 1088px) { + .navbar, + .navbar-menu, + .navbar-start, + .navbar-end { + align-items: stretch; + display: flex; + } + .navbar { + min-height: 3.25rem; + } + .navbar.is-spaced { + padding: 1rem 2rem; + } + .navbar.is-spaced .navbar-start, + .navbar.is-spaced .navbar-end { + align-items: center; + } + .navbar.is-spaced a.navbar-item, + .navbar.is-spaced .navbar-link { + border-radius: 4px; + } + .navbar.is-transparent a.navbar-item:focus, + .navbar.is-transparent .navbar-link:focus, + .navbar.is-transparent a.navbar-item:hover, + .navbar.is-transparent .navbar-link:hover, + .navbar.is-transparent a.navbar-item.is-active, + .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; + } + .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; + } + .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, + .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: #f5f5f5; + color: #0a0a0a; + } + .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: #3273dc; + } + .navbar-burger { + display: none; + } + .navbar-item, + .navbar-link { + align-items: center; + display: flex; + } + .navbar-item { + display: flex; + } + .navbar-item.has-dropdown { + align-items: stretch; + } + .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); + } + .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 2px solid #dbdbdb; + border-radius: 6px 6px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(10,10,10,0.1); + top: auto; + } + .navbar-item.is-active .navbar-dropdown, + .navbar-item.is-hoverable:focus .navbar-dropdown, + .navbar-item.is-hoverable:focus-within .navbar-dropdown, + .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; + } + .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, + .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, + .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, + .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, + .navbar-item.is-active .navbar-dropdown.is-boxed, + .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, + .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, + .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); + } + .navbar-menu { + flex-grow: 1; + flex-shrink: 0; + } + .navbar-start { + justify-content: flex-start; + margin-right: auto; + } + .navbar-end { + justify-content: flex-end; + margin-left: auto; + } + .navbar-dropdown { + background-color: #fff; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 2px solid #dbdbdb; + box-shadow: 0 8px 8px rgba(10,10,10,0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; + } + .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; + } + .navbar-dropdown a.navbar-item { + padding-right: 3rem; + } + .navbar-dropdown a.navbar-item:focus, + .navbar-dropdown a.navbar-item:hover { + background-color: #f5f5f5; + color: #0a0a0a; + } + .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: #3273dc; + } + .navbar.is-spaced .navbar-dropdown, + .navbar-dropdown.is-boxed { + border-radius: 6px; + border-top: none; + box-shadow: 0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + -4px); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; + } + .navbar-dropdown.is-right { + left: auto; + right: 0; + } + .navbar-divider { + display: block; + } + .navbar > .container .navbar-brand, + .container > .navbar .navbar-brand { + margin-left: -0.75rem; + } + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: -0.75rem; + } + .navbar.is-fixed-bottom-desktop, + .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; + } + .navbar.is-fixed-bottom-desktop { + bottom: 0; + } + .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(10,10,10,0.1); + } + .navbar.is-fixed-top-desktop { + top: 0; + } + html.has-navbar-fixed-top-desktop, + body.has-navbar-fixed-top-desktop { + padding-top: 3.25rem; + } + html.has-navbar-fixed-bottom-desktop, + body.has-navbar-fixed-bottom-desktop { + padding-bottom: 3.25rem; + } + html.has-spaced-navbar-fixed-top, + body.has-spaced-navbar-fixed-top { + padding-top: 5.25rem; + } + html.has-spaced-navbar-fixed-bottom, + body.has-spaced-navbar-fixed-bottom { + padding-bottom: 5.25rem; + } + a.navbar-item.is-active, + .navbar-link.is-active { + color: #3273dc; + } + a.navbar-item.is-active:not(:focus):not(:hover), + .navbar-link.is-active:not(:focus):not(:hover) { + background-color: transparent; + } + .navbar-item.has-dropdown:focus .navbar-link, + .navbar-item.has-dropdown:hover .navbar-link, + .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #fafafa; + } +} +.hero.is-fullheight-with-navbar { + min-height: calc(100vh - 3.25rem); +} +.pagination { + font-size: 1rem; + margin: -0.25rem; +} +.pagination.is-small { + font-size: 0.75rem; +} +.pagination.is-medium { + font-size: 1.25rem; +} +.pagination.is-large { + font-size: 1.5rem; +} +.pagination.is-rounded .pagination-previous, +.pagination.is-rounded .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 290486px; +} +.pagination.is-rounded .pagination-link { + border-radius: 290486px; +} +.pagination, +.pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; +} +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; +} +.pagination-previous, +.pagination-next, +.pagination-link { + border-color: #dbdbdb; + color: #363636; + min-width: 2.25em; +} +.pagination-previous:hover, +.pagination-next:hover, +.pagination-link:hover { + border-color: #b5b5b5; + color: #363636; +} +.pagination-previous:focus, +.pagination-next:focus, +.pagination-link:focus { + border-color: #3273dc; +} +.pagination-previous:active, +.pagination-next:active, +.pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10,10,10,0.2); +} +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled] { + background-color: #dbdbdb; + border-color: #dbdbdb; + box-shadow: none; + color: #7a7a7a; + opacity: 0.5; +} +.pagination-previous, +.pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} +.pagination-link.is-current { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} +.pagination-ellipsis { + color: #b5b5b5; + pointer-events: none; +} +.pagination-list { + flex-wrap: wrap; +} +@media screen and (max-width: 768px) { + .pagination { + flex-wrap: wrap; + } + .pagination-previous, + .pagination-next { + flex-grow: 1; + flex-shrink: 1; + } + .pagination-list li { + flex-grow: 1; + flex-shrink: 1; + } +} +@media screen and (min-width: 769px), print { + .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; + } + .pagination-previous { + order: 2; + } + .pagination-next { + order: 3; + } + .pagination { + justify-content: space-between; + } + .pagination.is-centered .pagination-previous, + .pagination .pagination-previous { + order: 1; + } + .pagination.is-centered .pagination-list, + .pagination .pagination-list { + justify-content: center; + order: 2; + } + .pagination.is-centered .pagination-next, + .pagination .pagination-next { + order: 3; + } + .pagination.is-right .pagination-previous { + order: 1; + } + .pagination.is-right .pagination-next { + order: 2; + } + .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; + } +} +.panel { + border-radius: 6px; + box-shadow: 0 0.5em 1em -0.125em rgba(10,10,10,0.1), 0 0px 0 1px rgba(10,10,10,0.02); + font-size: 1rem; +} +.panel:not(:last-child) { + margin-bottom: 1.5rem; +} +.panel.is-white .panel-heading { + background-color: #fff; + color: #0a0a0a; +} +.panel.is-white .panel-tabs a.is-active { + border-bottom-color: #fff; +} +.panel.is-white .panel-block.is-active .panel-icon { + color: #fff; +} +.panel.is-black .panel-heading { + background-color: #0a0a0a; + color: #fff; +} +.panel.is-black .panel-tabs a.is-active { + border-bottom-color: #0a0a0a; +} +.panel.is-black .panel-block.is-active .panel-icon { + color: #0a0a0a; +} +.panel.is-light .panel-heading { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.panel.is-light .panel-tabs a.is-active { + border-bottom-color: #f5f5f5; +} +.panel.is-light .panel-block.is-active .panel-icon { + color: #f5f5f5; +} +.panel.is-dark .panel-heading { + background-color: #363636; + color: #fff; +} +.panel.is-dark .panel-tabs a.is-active { + border-bottom-color: #363636; +} +.panel.is-dark .panel-block.is-active .panel-icon { + color: #363636; +} +.panel.is-primary .panel-heading { + background-color: #3273dc; + color: #fff; +} +.panel.is-primary .panel-tabs a.is-active { + border-bottom-color: #3273dc; +} +.panel.is-primary .panel-block.is-active .panel-icon { + color: #3273dc; +} +.panel.is-link .panel-heading { + background-color: #3273dc; + color: #fff; +} +.panel.is-link .panel-tabs a.is-active { + border-bottom-color: #3273dc; +} +.panel.is-link .panel-block.is-active .panel-icon { + color: #3273dc; +} +.panel.is-info .panel-heading { + background-color: #3298dc; + color: #fff; +} +.panel.is-info .panel-tabs a.is-active { + border-bottom-color: #3298dc; +} +.panel.is-info .panel-block.is-active .panel-icon { + color: #3298dc; +} +.panel.is-success .panel-heading { + background-color: #48c774; + color: #fff; +} +.panel.is-success .panel-tabs a.is-active { + border-bottom-color: #48c774; +} +.panel.is-success .panel-block.is-active .panel-icon { + color: #48c774; +} +.panel.is-warning .panel-heading { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.panel.is-warning .panel-tabs a.is-active { + border-bottom-color: #ffdd57; +} +.panel.is-warning .panel-block.is-active .panel-icon { + color: #ffdd57; +} +.panel.is-danger .panel-heading { + background-color: #f14668; + color: #fff; +} +.panel.is-danger .panel-tabs a.is-active { + border-bottom-color: #f14668; +} +.panel.is-danger .panel-block.is-active .panel-icon { + color: #f14668; +} +.panel.is-grey-lightest .panel-heading { + background-color: #ededed; + color: #363636; +} +.panel.is-grey-lightest .panel-tabs a.is-active { + border-bottom-color: #ededed; +} +.panel.is-grey-lightest .panel-block.is-active .panel-icon { + color: #ededed; +} +.panel-tabs:not(:last-child), +.panel-block:not(:last-child) { + border-bottom: 1px solid #ededed; +} +.panel-heading { + background-color: #ededed; + border-radius: 6px 6px 0 0; + color: #363636; + font-size: 1.25em; + font-weight: 700; + line-height: 1.25; + padding: 0.75em 1em; +} +.panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; +} +.panel-tabs a { + border-bottom: 1px solid #dbdbdb; + margin-bottom: -1px; + padding: 0.5em; +} +.panel-tabs a.is-active { + border-bottom-color: #4a4a4a; + color: #363636; +} +.panel-list a { + color: #4a4a4a; +} +.panel-list a:hover { + color: #3273dc; +} +.panel-block { + align-items: center; + color: #363636; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; +} +.panel-block input[type="checkbox"] { + margin-right: 0.75em; +} +.panel-block > .control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; +} +.panel-block.is-wrapped { + flex-wrap: wrap; +} +.panel-block.is-active { + border-left-color: #3273dc; + color: #363636; +} +.panel-block.is-active .panel-icon { + color: #3273dc; +} +.panel-block:last-child { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +a.panel-block, +label.panel-block { + cursor: pointer; +} +a.panel-block:hover, +label.panel-block:hover { + background-color: #f5f5f5; +} +.panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: #7a7a7a; + margin-right: 0.75em; +} +.panel-icon .fa { + font-size: inherit; + line-height: inherit; +} +.tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 1rem; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; +} +.tabs a { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #4a4a4a; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; +} +.tabs a:hover { + border-bottom-color: #363636; + color: #363636; +} +.tabs li { + display: block; +} +.tabs li.is-active a { + border-bottom-color: #3273dc; + color: #3273dc; +} +.tabs ul { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; +} +.tabs ul.is-left { + padding-right: 0.75em; +} +.tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; +} +.tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; +} +.tabs .icon:first-child { + margin-right: 0.5em; +} +.tabs .icon:last-child { + margin-left: 0.5em; +} +.tabs.is-centered ul { + justify-content: center; +} +.tabs.is-right ul { + justify-content: flex-end; +} +.tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.tabs.is-boxed a:hover { + background-color: #f5f5f5; + border-bottom-color: #dbdbdb; +} +.tabs.is-boxed li.is-active a { + background-color: #fff; + border-color: #dbdbdb; + border-bottom-color: transparent !important; +} +.tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; +} +.tabs.is-toggle a { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; +} +.tabs.is-toggle a:hover { + background-color: #f5f5f5; + border-color: #b5b5b5; + z-index: 2; +} +.tabs.is-toggle li + li { + margin-left: -1px; +} +.tabs.is-toggle li:first-child a { + border-radius: 4px 0 0 4px; +} +.tabs.is-toggle li:last-child a { + border-radius: 0 4px 4px 0; +} +.tabs.is-toggle li.is-active a { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; + z-index: 1; +} +.tabs.is-toggle ul { + border-bottom: none; +} +.tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 290486px; + border-top-left-radius: 290486px; + padding-left: 1.25em; +} +.tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 290486px; + border-top-right-radius: 290486px; + padding-right: 1.25em; +} +.tabs.is-small { + font-size: 0.75rem; +} +.tabs.is-medium { + font-size: 1.25rem; +} +.tabs.is-large { + font-size: 1.5rem; +} +.box { + background-color: #fff; + border-radius: 6px; + box-shadow: 0 0.5em 1em -0.125em rgba(10,10,10,0.1), 0 0px 0 1px rgba(10,10,10,0.02); + color: #4a4a4a; + display: block; + padding: 1.25rem; +} +a.box:hover, +a.box:focus { + box-shadow: 0 0.5em 1em -0.125em rgba(10,10,10,0.1), 0 0 0 1px #3273dc; +} +a.box:active { + box-shadow: inset 0 1px 2px rgba(10,10,10,0.2), 0 0 0 1px #3273dc; +} +.button { + background-color: #fff; + border-color: #dbdbdb; + border-width: 1px; + color: #363636; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.375em - 1px); + padding-left: 1em; + padding-right: 1em; + padding-top: calc(0.375em - 1px); + text-align: center; + white-space: nowrap; +} +.button strong { + color: inherit; +} +.button .icon, +.button .icon.is-small, +.button .icon.is-medium, +.button .icon.is-large { + height: 1.5em; + width: 1.5em; +} +.button .icon:first-child:not(:last-child) { + margin-left: calc(-0.5em - 1px); + margin-right: 0.25em; +} +.button .icon:last-child:not(:first-child) { + margin-left: 0.25em; + margin-right: calc(-0.5em - 1px); +} +.button .icon:first-child:last-child { + margin-left: calc(-0.5em - 1px); + margin-right: calc(-0.5em - 1px); +} +.button:hover, +.button.is-hovered { + border-color: #b5b5b5; + color: #363636; +} +.button:focus, +.button.is-focused { + border-color: #3273dc; + color: #363636; +} +.button:focus:not(:active), +.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.button:active, +.button.is-active { + border-color: #4a4a4a; + color: #363636; +} +.button.is-text { + background-color: transparent; + border-color: transparent; + color: #4a4a4a; + text-decoration: underline; +} +.button.is-text:hover, +.button.is-text.is-hovered, +.button.is-text:focus, +.button.is-text.is-focused { + background-color: #f5f5f5; + color: #363636; +} +.button.is-text:active, +.button.is-text.is-active { + background-color: #e8e8e8; + color: #363636; +} +.button.is-text[disabled], +fieldset[disabled] .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; +} +.button.is-white { + background-color: #fff; + border-color: transparent; + color: #0a0a0a; +} +.button.is-white:hover, +.button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; +} +.button.is-white:focus, +.button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; +} +.button.is-white:focus:not(:active), +.button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,255,255,0.25); +} +.button.is-white:active, +.button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; +} +.button.is-white[disabled], +fieldset[disabled] .button.is-white { + background-color: #fff; + border-color: transparent; + box-shadow: none; +} +.button.is-white.is-inverted { + background-color: #0a0a0a; + color: #fff; +} +.button.is-white.is-inverted:hover, +.button.is-white.is-inverted.is-hovered { + background-color: #000; +} +.button.is-white.is-inverted[disabled], +fieldset[disabled] .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: #fff; +} +.button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} +.button.is-white.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-white.is-outlined:hover, +.button.is-white.is-outlined.is-hovered, +.button.is-white.is-outlined:focus, +.button.is-white.is-outlined.is-focused { + background-color: #fff; + border-color: #fff; + color: #0a0a0a; +} +.button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-white.is-outlined.is-loading:hover::after, +.button.is-white.is-outlined.is-loading.is-hovered::after, +.button.is-white.is-outlined.is-loading:focus::after, +.button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} +.button.is-white.is-outlined[disabled], +fieldset[disabled] .button.is-white.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; +} +.button.is-white.is-inverted.is-outlined:hover, +.button.is-white.is-inverted.is-outlined.is-hovered, +.button.is-white.is-inverted.is-outlined:focus, +.button.is-white.is-inverted.is-outlined.is-focused { + background-color: #0a0a0a; + color: #fff; +} +.button.is-white.is-inverted.is-outlined.is-loading:hover::after, +.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-white.is-inverted.is-outlined.is-loading:focus::after, +.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-white.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; +} +.button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: #fff; +} +.button.is-black:hover, +.button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: #fff; +} +.button.is-black:focus, +.button.is-black.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-black:focus:not(:active), +.button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10,10,10,0.25); +} +.button.is-black:active, +.button.is-black.is-active { + background-color: #000; + border-color: transparent; + color: #fff; +} +.button.is-black[disabled], +fieldset[disabled] .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; +} +.button.is-black.is-inverted { + background-color: #fff; + color: #0a0a0a; +} +.button.is-black.is-inverted:hover, +.button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-black.is-inverted[disabled], +fieldset[disabled] .button.is-black.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; +} +.button.is-black.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; +} +.button.is-black.is-outlined:hover, +.button.is-black.is-outlined.is-hovered, +.button.is-black.is-outlined:focus, +.button.is-black.is-outlined.is-focused { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff; +} +.button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} +.button.is-black.is-outlined.is-loading:hover::after, +.button.is-black.is-outlined.is-loading.is-hovered::after, +.button.is-black.is-outlined.is-loading:focus::after, +.button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-black.is-outlined[disabled], +fieldset[disabled] .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; +} +.button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-black.is-inverted.is-outlined:hover, +.button.is-black.is-inverted.is-outlined.is-hovered, +.button.is-black.is-inverted.is-outlined:focus, +.button.is-black.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #0a0a0a; +} +.button.is-black.is-inverted.is-outlined.is-loading:hover::after, +.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-black.is-inverted.is-outlined.is-loading:focus::after, +.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} +.button.is-black.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-light, +article.article .article-more { + background-color: #f5f5f5; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light:hover, +article.article .article-more:hover, +.button.is-light.is-hovered, +article.article .article-more.is-hovered { + background-color: #eee; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light:focus, +article.article .article-more:focus, +.button.is-light.is-focused, +article.article .article-more.is-focused { + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light:focus:not(:active), +article.article .article-more:focus:not(:active), +.button.is-light.is-focused:not(:active), +article.article .article-more.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(245,245,245,0.25); +} +.button.is-light:active, +article.article .article-more:active, +.button.is-light.is-active, +article.article .article-more.is-active { + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light[disabled], +article.article .article-more[disabled], +fieldset[disabled] .button.is-light, +fieldset[disabled] article.article .article-more { + background-color: #f5f5f5; + border-color: transparent; + box-shadow: none; +} +.button.is-light.is-inverted, +article.article .article-more.is-inverted { + background-color: rgba(0,0,0,0.7); + color: #f5f5f5; +} +.button.is-light.is-inverted:hover, +article.article .article-more.is-inverted:hover, +.button.is-light.is-inverted.is-hovered, +article.article .article-more.is-inverted.is-hovered { + background-color: rgba(0,0,0,0.7); +} +.button.is-light.is-inverted[disabled], +article.article .article-more.is-inverted[disabled], +fieldset[disabled] .button.is-light.is-inverted, +fieldset[disabled] article.article .article-more.is-inverted { + background-color: rgba(0,0,0,0.7); + border-color: transparent; + box-shadow: none; + color: #f5f5f5; +} +.button.is-light.is-loading::after, +article.article .article-more.is-loading::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-light.is-outlined, +article.article .article-more.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + color: #f5f5f5; +} +.button.is-light.is-outlined:hover, +article.article .article-more.is-outlined:hover, +.button.is-light.is-outlined.is-hovered, +article.article .article-more.is-outlined.is-hovered, +.button.is-light.is-outlined:focus, +article.article .article-more.is-outlined:focus, +.button.is-light.is-outlined.is-focused, +article.article .article-more.is-outlined.is-focused { + background-color: #f5f5f5; + border-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.button.is-light.is-outlined.is-loading::after, +article.article .article-more.is-outlined.is-loading::after { + border-color: transparent transparent #f5f5f5 #f5f5f5 !important; +} +.button.is-light.is-outlined.is-loading:hover::after, +article.article .article-more.is-outlined.is-loading:hover::after, +.button.is-light.is-outlined.is-loading.is-hovered::after, +article.article .article-more.is-outlined.is-loading.is-hovered::after, +.button.is-light.is-outlined.is-loading:focus::after, +article.article .article-more.is-outlined.is-loading:focus::after, +.button.is-light.is-outlined.is-loading.is-focused::after, +article.article .article-more.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-light.is-outlined[disabled], +article.article .article-more.is-outlined[disabled], +fieldset[disabled] .button.is-light.is-outlined, +fieldset[disabled] article.article .article-more.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + box-shadow: none; + color: #f5f5f5; +} +.button.is-light.is-inverted.is-outlined, +article.article .article-more.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + color: rgba(0,0,0,0.7); +} +.button.is-light.is-inverted.is-outlined:hover, +article.article .article-more.is-inverted.is-outlined:hover, +.button.is-light.is-inverted.is-outlined.is-hovered, +article.article .article-more.is-inverted.is-outlined.is-hovered, +.button.is-light.is-inverted.is-outlined:focus, +article.article .article-more.is-inverted.is-outlined:focus, +.button.is-light.is-inverted.is-outlined.is-focused, +article.article .article-more.is-inverted.is-outlined.is-focused { + background-color: rgba(0,0,0,0.7); + color: #f5f5f5; +} +.button.is-light.is-inverted.is-outlined.is-loading:hover::after, +article.article .article-more.is-inverted.is-outlined.is-loading:hover::after, +.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, +article.article .article-more.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-light.is-inverted.is-outlined.is-loading:focus::after, +article.article .article-more.is-inverted.is-outlined.is-loading:focus::after, +.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after, +article.article .article-more.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #f5f5f5 #f5f5f5 !important; +} +.button.is-light.is-inverted.is-outlined[disabled], +article.article .article-more.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-light.is-inverted.is-outlined, +fieldset[disabled] article.article .article-more.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + box-shadow: none; + color: rgba(0,0,0,0.7); +} +.button.is-dark { + background-color: #363636; + border-color: transparent; + color: #fff; +} +.button.is-dark:hover, +.button.is-dark.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: #fff; +} +.button.is-dark:focus, +.button.is-dark.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-dark:focus:not(:active), +.button.is-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(54,54,54,0.25); +} +.button.is-dark:active, +.button.is-dark.is-active { + background-color: #292929; + border-color: transparent; + color: #fff; +} +.button.is-dark[disabled], +fieldset[disabled] .button.is-dark { + background-color: #363636; + border-color: transparent; + box-shadow: none; +} +.button.is-dark.is-inverted { + background-color: #fff; + color: #363636; +} +.button.is-dark.is-inverted:hover, +.button.is-dark.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-dark.is-inverted[disabled], +fieldset[disabled] .button.is-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #363636; +} +.button.is-dark.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} +.button.is-dark.is-outlined:hover, +.button.is-dark.is-outlined.is-hovered, +.button.is-dark.is-outlined:focus, +.button.is-dark.is-outlined.is-focused { + background-color: #363636; + border-color: #363636; + color: #fff; +} +.button.is-dark.is-outlined.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-dark.is-outlined.is-loading:hover::after, +.button.is-dark.is-outlined.is-loading.is-hovered::after, +.button.is-dark.is-outlined.is-loading:focus::after, +.button.is-dark.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-dark.is-outlined[disabled], +fieldset[disabled] .button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; +} +.button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-dark.is-inverted.is-outlined:hover, +.button.is-dark.is-inverted.is-outlined.is-hovered, +.button.is-dark.is-inverted.is-outlined:focus, +.button.is-dark.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #363636; +} +.button.is-dark.is-inverted.is-outlined.is-loading:hover::after, +.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-dark.is-inverted.is-outlined.is-loading:focus::after, +.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-dark.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-primary { + background-color: #3273dc; + border-color: transparent; + color: #fff; +} +.button.is-primary:hover, +.button.is-primary.is-hovered { + background-color: #276cda; + border-color: transparent; + color: #fff; +} +.button.is-primary:focus, +.button.is-primary.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-primary:focus:not(:active), +.button.is-primary.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.button.is-primary:active, +.button.is-primary.is-active { + background-color: #2366d1; + border-color: transparent; + color: #fff; +} +.button.is-primary[disabled], +fieldset[disabled] .button.is-primary { + background-color: #3273dc; + border-color: transparent; + box-shadow: none; +} +.button.is-primary.is-inverted { + background-color: #fff; + color: #3273dc; +} +.button.is-primary.is-inverted:hover, +.button.is-primary.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-primary.is-inverted[disabled], +fieldset[disabled] .button.is-primary.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #3273dc; +} +.button.is-primary.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-primary.is-outlined { + background-color: transparent; + border-color: #3273dc; + color: #3273dc; +} +.button.is-primary.is-outlined:hover, +.button.is-primary.is-outlined.is-hovered, +.button.is-primary.is-outlined:focus, +.button.is-primary.is-outlined.is-focused { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} +.button.is-primary.is-outlined.is-loading::after { + border-color: transparent transparent #3273dc #3273dc !important; +} +.button.is-primary.is-outlined.is-loading:hover::after, +.button.is-primary.is-outlined.is-loading.is-hovered::after, +.button.is-primary.is-outlined.is-loading:focus::after, +.button.is-primary.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-primary.is-outlined[disabled], +fieldset[disabled] .button.is-primary.is-outlined { + background-color: transparent; + border-color: #3273dc; + box-shadow: none; + color: #3273dc; +} +.button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-primary.is-inverted.is-outlined:hover, +.button.is-primary.is-inverted.is-outlined.is-hovered, +.button.is-primary.is-inverted.is-outlined:focus, +.button.is-primary.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #3273dc; +} +.button.is-primary.is-inverted.is-outlined.is-loading:hover::after, +.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-primary.is-inverted.is-outlined.is-loading:focus::after, +.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #3273dc #3273dc !important; +} +.button.is-primary.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-primary.is-light { + background-color: #eef3fc; + color: #2160c4; +} +.button.is-primary.is-light:hover, +.button.is-primary.is-light.is-hovered { + background-color: #e3ecfa; + border-color: transparent; + color: #2160c4; +} +.button.is-primary.is-light:active, +.button.is-primary.is-light.is-active { + background-color: #d8e4f8; + border-color: transparent; + color: #2160c4; +} +.button.is-link { + background-color: #3273dc; + border-color: transparent; + color: #fff; +} +.button.is-link:hover, +.button.is-link.is-hovered { + background-color: #276cda; + border-color: transparent; + color: #fff; +} +.button.is-link:focus, +.button.is-link.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-link:focus:not(:active), +.button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.button.is-link:active, +.button.is-link.is-active { + background-color: #2366d1; + border-color: transparent; + color: #fff; +} +.button.is-link[disabled], +fieldset[disabled] .button.is-link { + background-color: #3273dc; + border-color: transparent; + box-shadow: none; +} +.button.is-link.is-inverted { + background-color: #fff; + color: #3273dc; +} +.button.is-link.is-inverted:hover, +.button.is-link.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-link.is-inverted[disabled], +fieldset[disabled] .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #3273dc; +} +.button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-link.is-outlined { + background-color: transparent; + border-color: #3273dc; + color: #3273dc; +} +.button.is-link.is-outlined:hover, +.button.is-link.is-outlined.is-hovered, +.button.is-link.is-outlined:focus, +.button.is-link.is-outlined.is-focused { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} +.button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #3273dc #3273dc !important; +} +.button.is-link.is-outlined.is-loading:hover::after, +.button.is-link.is-outlined.is-loading.is-hovered::after, +.button.is-link.is-outlined.is-loading:focus::after, +.button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-link.is-outlined[disabled], +fieldset[disabled] .button.is-link.is-outlined { + background-color: transparent; + border-color: #3273dc; + box-shadow: none; + color: #3273dc; +} +.button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-link.is-inverted.is-outlined:hover, +.button.is-link.is-inverted.is-outlined.is-hovered, +.button.is-link.is-inverted.is-outlined:focus, +.button.is-link.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #3273dc; +} +.button.is-link.is-inverted.is-outlined.is-loading:hover::after, +.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-link.is-inverted.is-outlined.is-loading:focus::after, +.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #3273dc #3273dc !important; +} +.button.is-link.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-link.is-light { + background-color: #eef3fc; + color: #2160c4; +} +.button.is-link.is-light:hover, +.button.is-link.is-light.is-hovered { + background-color: #e3ecfa; + border-color: transparent; + color: #2160c4; +} +.button.is-link.is-light:active, +.button.is-link.is-light.is-active { + background-color: #d8e4f8; + border-color: transparent; + color: #2160c4; +} +.button.is-info { + background-color: #3298dc; + border-color: transparent; + color: #fff; +} +.button.is-info:hover, +.button.is-info.is-hovered { + background-color: #2793da; + border-color: transparent; + color: #fff; +} +.button.is-info:focus, +.button.is-info.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-info:focus:not(:active), +.button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(50,152,220,0.25); +} +.button.is-info:active, +.button.is-info.is-active { + background-color: #238cd1; + border-color: transparent; + color: #fff; +} +.button.is-info[disabled], +fieldset[disabled] .button.is-info { + background-color: #3298dc; + border-color: transparent; + box-shadow: none; +} +.button.is-info.is-inverted { + background-color: #fff; + color: #3298dc; +} +.button.is-info.is-inverted:hover, +.button.is-info.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-info.is-inverted[disabled], +fieldset[disabled] .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #3298dc; +} +.button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-info.is-outlined { + background-color: transparent; + border-color: #3298dc; + color: #3298dc; +} +.button.is-info.is-outlined:hover, +.button.is-info.is-outlined.is-hovered, +.button.is-info.is-outlined:focus, +.button.is-info.is-outlined.is-focused { + background-color: #3298dc; + border-color: #3298dc; + color: #fff; +} +.button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #3298dc #3298dc !important; +} +.button.is-info.is-outlined.is-loading:hover::after, +.button.is-info.is-outlined.is-loading.is-hovered::after, +.button.is-info.is-outlined.is-loading:focus::after, +.button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-info.is-outlined[disabled], +fieldset[disabled] .button.is-info.is-outlined { + background-color: transparent; + border-color: #3298dc; + box-shadow: none; + color: #3298dc; +} +.button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-info.is-inverted.is-outlined:hover, +.button.is-info.is-inverted.is-outlined.is-hovered, +.button.is-info.is-inverted.is-outlined:focus, +.button.is-info.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #3298dc; +} +.button.is-info.is-inverted.is-outlined.is-loading:hover::after, +.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-info.is-inverted.is-outlined.is-loading:focus::after, +.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #3298dc #3298dc !important; +} +.button.is-info.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-info.is-light { + background-color: #eef6fc; + color: #1d72aa; +} +.button.is-info.is-light:hover, +.button.is-info.is-light.is-hovered { + background-color: #e3f1fa; + border-color: transparent; + color: #1d72aa; +} +.button.is-info.is-light:active, +.button.is-info.is-light.is-active { + background-color: #d8ebf8; + border-color: transparent; + color: #1d72aa; +} +.button.is-success { + background-color: #48c774; + border-color: transparent; + color: #fff; +} +.button.is-success:hover, +.button.is-success.is-hovered { + background-color: #3ec46d; + border-color: transparent; + color: #fff; +} +.button.is-success:focus, +.button.is-success.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-success:focus:not(:active), +.button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(72,199,116,0.25); +} +.button.is-success:active, +.button.is-success.is-active { + background-color: #3abb67; + border-color: transparent; + color: #fff; +} +.button.is-success[disabled], +fieldset[disabled] .button.is-success { + background-color: #48c774; + border-color: transparent; + box-shadow: none; +} +.button.is-success.is-inverted { + background-color: #fff; + color: #48c774; +} +.button.is-success.is-inverted:hover, +.button.is-success.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-success.is-inverted[disabled], +fieldset[disabled] .button.is-success.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #48c774; +} +.button.is-success.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-success.is-outlined { + background-color: transparent; + border-color: #48c774; + color: #48c774; +} +.button.is-success.is-outlined:hover, +.button.is-success.is-outlined.is-hovered, +.button.is-success.is-outlined:focus, +.button.is-success.is-outlined.is-focused { + background-color: #48c774; + border-color: #48c774; + color: #fff; +} +.button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #48c774 #48c774 !important; +} +.button.is-success.is-outlined.is-loading:hover::after, +.button.is-success.is-outlined.is-loading.is-hovered::after, +.button.is-success.is-outlined.is-loading:focus::after, +.button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-success.is-outlined[disabled], +fieldset[disabled] .button.is-success.is-outlined { + background-color: transparent; + border-color: #48c774; + box-shadow: none; + color: #48c774; +} +.button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-success.is-inverted.is-outlined:hover, +.button.is-success.is-inverted.is-outlined.is-hovered, +.button.is-success.is-inverted.is-outlined:focus, +.button.is-success.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #48c774; +} +.button.is-success.is-inverted.is-outlined.is-loading:hover::after, +.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-success.is-inverted.is-outlined.is-loading:focus::after, +.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #48c774 #48c774 !important; +} +.button.is-success.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-success.is-light { + background-color: #effaf3; + color: #257942; +} +.button.is-success.is-light:hover, +.button.is-success.is-light.is-hovered { + background-color: #e6f7ec; + border-color: transparent; + color: #257942; +} +.button.is-success.is-light:active, +.button.is-success.is-light.is-active { + background-color: #dcf4e4; + border-color: transparent; + color: #257942; +} +.button.is-warning { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-warning:hover, +.button.is-warning.is-hovered { + background-color: #ffdb4a; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-warning:focus, +.button.is-warning.is-focused { + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-warning:focus:not(:active), +.button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,221,87,0.25); +} +.button.is-warning:active, +.button.is-warning.is-active { + background-color: #ffd83d; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-warning[disabled], +fieldset[disabled] .button.is-warning { + background-color: #ffdd57; + border-color: transparent; + box-shadow: none; +} +.button.is-warning.is-inverted { + background-color: rgba(0,0,0,0.7); + color: #ffdd57; +} +.button.is-warning.is-inverted:hover, +.button.is-warning.is-inverted.is-hovered { + background-color: rgba(0,0,0,0.7); +} +.button.is-warning.is-inverted[disabled], +fieldset[disabled] .button.is-warning.is-inverted { + background-color: rgba(0,0,0,0.7); + border-color: transparent; + box-shadow: none; + color: #ffdd57; +} +.button.is-warning.is-loading::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + color: #ffdd57; +} +.button.is-warning.is-outlined:hover, +.button.is-warning.is-outlined.is-hovered, +.button.is-warning.is-outlined:focus, +.button.is-warning.is-outlined.is-focused { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; +} +.button.is-warning.is-outlined.is-loading:hover::after, +.button.is-warning.is-outlined.is-loading.is-hovered::after, +.button.is-warning.is-outlined.is-loading:focus::after, +.button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-warning.is-outlined[disabled], +fieldset[disabled] .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + box-shadow: none; + color: #ffdd57; +} +.button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + color: rgba(0,0,0,0.7); +} +.button.is-warning.is-inverted.is-outlined:hover, +.button.is-warning.is-inverted.is-outlined.is-hovered, +.button.is-warning.is-inverted.is-outlined:focus, +.button.is-warning.is-inverted.is-outlined.is-focused { + background-color: rgba(0,0,0,0.7); + color: #ffdd57; +} +.button.is-warning.is-inverted.is-outlined.is-loading:hover::after, +.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-warning.is-inverted.is-outlined.is-loading:focus::after, +.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; +} +.button.is-warning.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + box-shadow: none; + color: rgba(0,0,0,0.7); +} +.button.is-warning.is-light { + background-color: #fffbeb; + color: #947600; +} +.button.is-warning.is-light:hover, +.button.is-warning.is-light.is-hovered { + background-color: #fff8de; + border-color: transparent; + color: #947600; +} +.button.is-warning.is-light:active, +.button.is-warning.is-light.is-active { + background-color: #fff6d1; + border-color: transparent; + color: #947600; +} +.button.is-danger { + background-color: #f14668; + border-color: transparent; + color: #fff; +} +.button.is-danger:hover, +.button.is-danger.is-hovered { + background-color: #f03a5f; + border-color: transparent; + color: #fff; +} +.button.is-danger:focus, +.button.is-danger.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-danger:focus:not(:active), +.button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(241,70,104,0.25); +} +.button.is-danger:active, +.button.is-danger.is-active { + background-color: #ef2e55; + border-color: transparent; + color: #fff; +} +.button.is-danger[disabled], +fieldset[disabled] .button.is-danger { + background-color: #f14668; + border-color: transparent; + box-shadow: none; +} +.button.is-danger.is-inverted { + background-color: #fff; + color: #f14668; +} +.button.is-danger.is-inverted:hover, +.button.is-danger.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-danger.is-inverted[disabled], +fieldset[disabled] .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #f14668; +} +.button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-danger.is-outlined { + background-color: transparent; + border-color: #f14668; + color: #f14668; +} +.button.is-danger.is-outlined:hover, +.button.is-danger.is-outlined.is-hovered, +.button.is-danger.is-outlined:focus, +.button.is-danger.is-outlined.is-focused { + background-color: #f14668; + border-color: #f14668; + color: #fff; +} +.button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #f14668 #f14668 !important; +} +.button.is-danger.is-outlined.is-loading:hover::after, +.button.is-danger.is-outlined.is-loading.is-hovered::after, +.button.is-danger.is-outlined.is-loading:focus::after, +.button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-danger.is-outlined[disabled], +fieldset[disabled] .button.is-danger.is-outlined { + background-color: transparent; + border-color: #f14668; + box-shadow: none; + color: #f14668; +} +.button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-danger.is-inverted.is-outlined:hover, +.button.is-danger.is-inverted.is-outlined.is-hovered, +.button.is-danger.is-inverted.is-outlined:focus, +.button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #f14668; +} +.button.is-danger.is-inverted.is-outlined.is-loading:hover::after, +.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-danger.is-inverted.is-outlined.is-loading:focus::after, +.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #f14668 #f14668 !important; +} +.button.is-danger.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-danger.is-light { + background-color: #feecf0; + color: #cc0f35; +} +.button.is-danger.is-light:hover, +.button.is-danger.is-light.is-hovered { + background-color: #fde0e6; + border-color: transparent; + color: #cc0f35; +} +.button.is-danger.is-light:active, +.button.is-danger.is-light.is-active { + background-color: #fcd4dc; + border-color: transparent; + color: #cc0f35; +} +.button.is-grey-lightest { + background-color: #ededed; + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest:hover, +.button.is-grey-lightest.is-hovered { + background-color: #e7e7e7; + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest:focus, +.button.is-grey-lightest.is-focused { + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest:focus:not(:active), +.button.is-grey-lightest.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(237,237,237,0.25); +} +.button.is-grey-lightest:active, +.button.is-grey-lightest.is-active { + background-color: #e0e0e0; + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest[disabled], +fieldset[disabled] .button.is-grey-lightest { + background-color: #ededed; + border-color: transparent; + box-shadow: none; +} +.button.is-grey-lightest.is-inverted { + background-color: #363636; + color: #ededed; +} +.button.is-grey-lightest.is-inverted:hover, +.button.is-grey-lightest.is-inverted.is-hovered { + background-color: #292929; +} +.button.is-grey-lightest.is-inverted[disabled], +fieldset[disabled] .button.is-grey-lightest.is-inverted { + background-color: #363636; + border-color: transparent; + box-shadow: none; + color: #ededed; +} +.button.is-grey-lightest.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-grey-lightest.is-outlined { + background-color: transparent; + border-color: #ededed; + color: #ededed; +} +.button.is-grey-lightest.is-outlined:hover, +.button.is-grey-lightest.is-outlined.is-hovered, +.button.is-grey-lightest.is-outlined:focus, +.button.is-grey-lightest.is-outlined.is-focused { + background-color: #ededed; + border-color: #ededed; + color: #363636; +} +.button.is-grey-lightest.is-outlined.is-loading::after { + border-color: transparent transparent #ededed #ededed !important; +} +.button.is-grey-lightest.is-outlined.is-loading:hover::after, +.button.is-grey-lightest.is-outlined.is-loading.is-hovered::after, +.button.is-grey-lightest.is-outlined.is-loading:focus::after, +.button.is-grey-lightest.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-grey-lightest.is-outlined[disabled], +fieldset[disabled] .button.is-grey-lightest.is-outlined { + background-color: transparent; + border-color: #ededed; + box-shadow: none; + color: #ededed; +} +.button.is-grey-lightest.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} +.button.is-grey-lightest.is-inverted.is-outlined:hover, +.button.is-grey-lightest.is-inverted.is-outlined.is-hovered, +.button.is-grey-lightest.is-inverted.is-outlined:focus, +.button.is-grey-lightest.is-inverted.is-outlined.is-focused { + background-color: #363636; + color: #ededed; +} +.button.is-grey-lightest.is-inverted.is-outlined.is-loading:hover::after, +.button.is-grey-lightest.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-grey-lightest.is-inverted.is-outlined.is-loading:focus::after, +.button.is-grey-lightest.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ededed #ededed !important; +} +.button.is-grey-lightest.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-grey-lightest.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; +} +.button.is-small { + border-radius: 2px; + font-size: 0.75rem; +} +.button.is-normal { + font-size: 1rem; +} +.button.is-medium { + font-size: 1.25rem; +} +.button.is-large { + font-size: 1.5rem; +} +.button[disabled], +fieldset[disabled] .button { + background-color: #fff; + border-color: #dbdbdb; + box-shadow: none; + opacity: 0.5; +} +.button.is-fullwidth { + display: flex; + width: 100%; +} +.button.is-loading { + color: transparent !important; + pointer-events: none; +} +.button.is-loading::after { + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; +} +.button.is-static { + background-color: #f5f5f5; + border-color: #dbdbdb; + color: #7a7a7a; + box-shadow: none; + pointer-events: none; +} +.button.is-rounded { + border-radius: 290486px; + padding-left: calc(1em + 0.25em); + padding-right: calc(1em + 0.25em); +} +.buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.buttons .button { + margin-bottom: 0.5rem; +} +.buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; +} +.buttons:last-child { + margin-bottom: -0.5rem; +} +.buttons:not(:last-child) { + margin-bottom: 1rem; +} +.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + border-radius: 2px; + font-size: 0.75rem; +} +.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; +} +.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; +} +.buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; +} +.buttons.has-addons .button:last-child { + margin-right: 0; +} +.buttons.has-addons .button:hover, +.buttons.has-addons .button.is-hovered { + z-index: 2; +} +.buttons.has-addons .button:focus, +.buttons.has-addons .button.is-focused, +.buttons.has-addons .button:active, +.buttons.has-addons .button.is-active, +.buttons.has-addons .button.is-selected { + z-index: 3; +} +.buttons.has-addons .button:focus:hover, +.buttons.has-addons .button.is-focused:hover, +.buttons.has-addons .button:active:hover, +.buttons.has-addons .button.is-active:hover, +.buttons.has-addons .button.is-selected:hover { + z-index: 4; +} +.buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.buttons.is-centered { + justify-content: center; +} +.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; +} +.buttons.is-right { + justify-content: flex-end; +} +.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; +} +.container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; +} +.container.is-fluid { + max-width: none; + padding-left: 64px; + padding-right: 64px; + width: 100%; +} +@media screen and (min-width: 1088px) { + .container { + max-width: 960px; + } +} +@media screen and (max-width: 1279px) { + .container.is-widescreen { + max-width: 1152px; + } +} +@media screen and (max-width: 1471px) { + .container.is-fullhd { + max-width: 1344px; + } +} +@media screen and (min-width: 1280px) { + .container { + max-width: 1152px; + } +} +@media screen and (min-width: 1472px) { + .container { + max-width: 1344px; + } +} +.content li + li { + margin-top: 0.25em; +} +.content p:not(:last-child), +.content dl:not(:last-child), +.content ol:not(:last-child), +.content ul:not(:last-child), +.content blockquote:not(:last-child), +.content pre:not(:last-child), +.content table:not(:last-child) { + margin-bottom: 1em; +} +.content h1, +.content h2, +.content h3, +.content h4, +.content h5, +.content h6 { + color: #363636; + font-weight: 400; + line-height: 1.125; +} +.content h1 { + font-size: 2em; + margin-bottom: 0.5em; +} +.content h1:not(:first-child) { + margin-top: 1em; +} +.content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; +} +.content h2:not(:first-child) { + margin-top: 1.1428em; +} +.content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; +} +.content h3:not(:first-child) { + margin-top: 1.3333em; +} +.content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; +} +.content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; +} +.content h6 { + font-size: 1em; + margin-bottom: 1em; +} +.content blockquote { + background-color: #f5f5f5; + border-left: 5px solid #dbdbdb; + padding: 1.25em 1.5em; +} +.content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; +} +.content ol:not([type]) { + list-style-type: decimal; +} +.content ol:not([type]).is-lower-alpha { + list-style-type: lower-alpha; +} +.content ol:not([type]).is-lower-roman { + list-style-type: lower-roman; +} +.content ol:not([type]).is-upper-alpha { + list-style-type: upper-alpha; +} +.content ol:not([type]).is-upper-roman { + list-style-type: upper-roman; +} +.content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; +} +.content ul ul { + list-style-type: circle; + margin-top: 0.5em; +} +.content ul ul ul { + list-style-type: square; +} +.content dd { + margin-left: 2em; +} +.content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; +} +.content figure:not(:first-child) { + margin-top: 2em; +} +.content figure:not(:last-child) { + margin-bottom: 2em; +} +.content figure img { + display: inline-block; +} +.content figure figcaption { + font-style: italic; +} +.content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 1.25em 1.5em; + white-space: pre; + word-wrap: normal; +} +.content sup, +.content sub { + font-size: 75%; +} +.content table { + width: 100%; +} +.content table td, +.content table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} +.content table th { + color: #363636; +} +.content table th:not([align]) { + text-align: left; +} +.content table thead td, +.content table thead th { + border-width: 0 0 2px; + color: #363636; +} +.content table tfoot td, +.content table tfoot th { + border-width: 2px 0 0; + color: #363636; +} +.content table tbody tr:last-child td, +.content table tbody tr:last-child th { + border-bottom-width: 0; +} +.content .tabs li + li { + margin-top: 0; +} +.content.is-small { + font-size: 0.75rem; +} +.content.is-medium { + font-size: 1.25rem; +} +.content.is-large { + font-size: 1.5rem; +} +.icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; +} +.icon.is-small { + height: 1rem; + width: 1rem; +} +.icon.is-medium { + height: 2rem; + width: 2rem; +} +.icon.is-large { + height: 3rem; + width: 3rem; +} +.image { + display: block; + position: relative; +} +.image img { + display: block; + height: auto; + width: 100%; +} +.image img.is-rounded { + border-radius: 290486px; +} +.image.is-fullwidth { + width: 100%; +} +.image.is-square img, +.image.is-1by1 img, +.image.is-5by4 img, +.image.is-4by3 img, +.image.is-3by2 img, +.image.is-5by3 img, +.image.is-16by9 img, +.image.is-2by1 img, +.image.is-3by1 img, +.image.is-4by5 img, +.image.is-3by4 img, +.image.is-2by3 img, +.image.is-3by5 img, +.image.is-9by16 img, +.image.is-1by2 img, +.image.is-1by3 img, +.image.is-square .has-ratio, +.image.is-1by1 .has-ratio, +.image.is-5by4 .has-ratio, +.image.is-4by3 .has-ratio, +.image.is-3by2 .has-ratio, +.image.is-5by3 .has-ratio, +.image.is-16by9 .has-ratio, +.image.is-2by1 .has-ratio, +.image.is-3by1 .has-ratio, +.image.is-4by5 .has-ratio, +.image.is-3by4 .has-ratio, +.image.is-2by3 .has-ratio, +.image.is-3by5 .has-ratio, +.image.is-9by16 .has-ratio, +.image.is-1by2 .has-ratio, +.image.is-1by3 .has-ratio { + height: 100%; + width: 100%; +} +.image.is-square, +.image.is-1by1 { + padding-top: 100%; +} +.image.is-5by4 { + padding-top: 80%; +} +.image.is-4by3 { + padding-top: 75%; +} +.image.is-3by2 { + padding-top: 66.6666%; +} +.image.is-5by3 { + padding-top: 60%; +} +.image.is-16by9 { + padding-top: 56.25%; +} +.image.is-2by1 { + padding-top: 50%; +} +.image.is-3by1 { + padding-top: 33.3333%; +} +.image.is-4by5 { + padding-top: 125%; +} +.image.is-3by4 { + padding-top: 133.3333%; +} +.image.is-2by3 { + padding-top: 150%; +} +.image.is-3by5 { + padding-top: 166.6666%; +} +.image.is-9by16 { + padding-top: 177.7777%; +} +.image.is-1by2 { + padding-top: 200%; +} +.image.is-1by3 { + padding-top: 300%; +} +.image.is-16x16 { + height: 16px; + width: 16px; +} +.image.is-24x24 { + height: 24px; + width: 24px; +} +.image.is-32x32 { + height: 32px; + width: 32px; +} +.image.is-48x48 { + height: 48px; + width: 48px; +} +.image.is-64x64 { + height: 64px; + width: 64px; +} +.image.is-96x96 { + height: 96px; + width: 96px; +} +.image.is-128x128 { + height: 128px; + width: 128px; +} +.notification { + background-color: #f5f5f5; + border-radius: 4px; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; +} +.notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; +} +.notification strong { + color: currentColor; +} +.notification code, +.notification pre { + background: #fff; +} +.notification pre code { + background: transparent; +} +.notification > .delete { + position: absolute; + right: 0.5rem; + top: 0.5rem; +} +.notification .title, +.notification .subtitle, +.notification .content { + color: currentColor; +} +.notification.is-white { + background-color: #fff; + color: #0a0a0a; +} +.notification.is-black { + background-color: #0a0a0a; + color: #fff; +} +.notification.is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.notification.is-dark { + background-color: #363636; + color: #fff; +} +.notification.is-primary { + background-color: #3273dc; + color: #fff; +} +.notification.is-link { + background-color: #3273dc; + color: #fff; +} +.notification.is-info { + background-color: #3298dc; + color: #fff; +} +.notification.is-success { + background-color: #48c774; + color: #fff; +} +.notification.is-warning { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.notification.is-danger { + background-color: #f14668; + color: #fff; +} +.notification.is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 1rem; + overflow: hidden; + padding: 0; + width: 100%; +} +.progress::-webkit-progress-bar { + background-color: #ededed; +} +.progress::-webkit-progress-value { + background-color: #4a4a4a; +} +.progress::-moz-progress-bar { + background-color: #4a4a4a; +} +.progress::-ms-fill { + background-color: #4a4a4a; + border: none; +} +.progress.is-white::-webkit-progress-value { + background-color: #fff; +} +.progress.is-white::-moz-progress-bar { + background-color: #fff; +} +.progress.is-white::-ms-fill { + background-color: #fff; +} +.progress.is-white:indeterminate { + background-image: linear-gradient(to right, #fff 30%, #ededed 30%); +} +.progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; +} +.progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; +} +.progress.is-black::-ms-fill { + background-color: #0a0a0a; +} +.progress.is-black:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #ededed 30%); +} +.progress.is-light::-webkit-progress-value { + background-color: #f5f5f5; +} +.progress.is-light::-moz-progress-bar { + background-color: #f5f5f5; +} +.progress.is-light::-ms-fill { + background-color: #f5f5f5; +} +.progress.is-light:indeterminate { + background-image: linear-gradient(to right, #f5f5f5 30%, #ededed 30%); +} +.progress.is-dark::-webkit-progress-value { + background-color: #363636; +} +.progress.is-dark::-moz-progress-bar { + background-color: #363636; +} +.progress.is-dark::-ms-fill { + background-color: #363636; +} +.progress.is-dark:indeterminate { + background-image: linear-gradient(to right, #363636 30%, #ededed 30%); +} +.progress.is-primary::-webkit-progress-value { + background-color: #3273dc; +} +.progress.is-primary::-moz-progress-bar { + background-color: #3273dc; +} +.progress.is-primary::-ms-fill { + background-color: #3273dc; +} +.progress.is-primary:indeterminate { + background-image: linear-gradient(to right, #3273dc 30%, #ededed 30%); +} +.progress.is-link::-webkit-progress-value { + background-color: #3273dc; +} +.progress.is-link::-moz-progress-bar { + background-color: #3273dc; +} +.progress.is-link::-ms-fill { + background-color: #3273dc; +} +.progress.is-link:indeterminate { + background-image: linear-gradient(to right, #3273dc 30%, #ededed 30%); +} +.progress.is-info::-webkit-progress-value { + background-color: #3298dc; +} +.progress.is-info::-moz-progress-bar { + background-color: #3298dc; +} +.progress.is-info::-ms-fill { + background-color: #3298dc; +} +.progress.is-info:indeterminate { + background-image: linear-gradient(to right, #3298dc 30%, #ededed 30%); +} +.progress.is-success::-webkit-progress-value { + background-color: #48c774; +} +.progress.is-success::-moz-progress-bar { + background-color: #48c774; +} +.progress.is-success::-ms-fill { + background-color: #48c774; +} +.progress.is-success:indeterminate { + background-image: linear-gradient(to right, #48c774 30%, #ededed 30%); +} +.progress.is-warning::-webkit-progress-value { + background-color: #ffdd57; +} +.progress.is-warning::-moz-progress-bar { + background-color: #ffdd57; +} +.progress.is-warning::-ms-fill { + background-color: #ffdd57; +} +.progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ffdd57 30%, #ededed 30%); +} +.progress.is-danger::-webkit-progress-value { + background-color: #f14668; +} +.progress.is-danger::-moz-progress-bar { + background-color: #f14668; +} +.progress.is-danger::-ms-fill { + background-color: #f14668; +} +.progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #f14668 30%, #ededed 30%); +} +.progress.is-grey-lightest::-webkit-progress-value { + background-color: #ededed; +} +.progress.is-grey-lightest::-moz-progress-bar { + background-color: #ededed; +} +.progress.is-grey-lightest::-ms-fill { + background-color: #ededed; +} +.progress.is-grey-lightest:indeterminate { + background-image: linear-gradient(to right, #ededed 30%, #ededed 30%); +} +.progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #ededed; + background-image: linear-gradient(to right, #4a4a4a 30%, #ededed 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; +} +.progress:indeterminate::-webkit-progress-bar { + background-color: transparent; +} +.progress:indeterminate::-moz-progress-bar { + background-color: transparent; +} +.progress.is-small { + height: 0.75rem; +} +.progress.is-medium { + height: 1.25rem; +} +.progress.is-large { + height: 1.5rem; +} +@-moz-keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +@-webkit-keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +@-o-keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +@keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +.table { + background-color: #fff; + color: #363636; +} +.table td, +.table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} +.table td.is-white, +.table th.is-white { + background-color: #fff; + border-color: #fff; + color: #0a0a0a; +} +.table td.is-black, +.table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff; +} +.table td.is-light, +.table th.is-light { + background-color: #f5f5f5; + border-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.table td.is-dark, +.table th.is-dark { + background-color: #363636; + border-color: #363636; + color: #fff; +} +.table td.is-primary, +.table th.is-primary { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} +.table td.is-link, +.table th.is-link { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} +.table td.is-info, +.table th.is-info { + background-color: #3298dc; + border-color: #3298dc; + color: #fff; +} +.table td.is-success, +.table th.is-success { + background-color: #48c774; + border-color: #48c774; + color: #fff; +} +.table td.is-warning, +.table th.is-warning { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.table td.is-danger, +.table th.is-danger { + background-color: #f14668; + border-color: #f14668; + color: #fff; +} +.table td.is-grey-lightest, +.table th.is-grey-lightest { + background-color: #ededed; + border-color: #ededed; + color: #363636; +} +.table td.is-narrow, +.table th.is-narrow { + white-space: nowrap; + width: 1%; +} +.table td.is-selected, +.table th.is-selected { + background-color: #3273dc; + color: #fff; +} +.table td.is-selected a, +.table th.is-selected a, +.table td.is-selected strong, +.table th.is-selected strong { + color: currentColor; +} +.table th { + color: #363636; +} +.table th:not([align]) { + text-align: left; +} +.table tr.is-selected { + background-color: #3273dc; + color: #fff; +} +.table tr.is-selected a, +.table tr.is-selected strong { + color: currentColor; +} +.table tr.is-selected td, +.table tr.is-selected th { + border-color: #fff; + color: currentColor; +} +.table thead { + background-color: transparent; +} +.table thead td, +.table thead th { + border-width: 0 0 2px; + color: #363636; +} +.table tfoot { + background-color: transparent; +} +.table tfoot td, +.table tfoot th { + border-width: 2px 0 0; + color: #363636; +} +.table tbody { + background-color: transparent; +} +.table tbody tr:last-child td, +.table tbody tr:last-child th { + border-bottom-width: 0; +} +.table.is-bordered td, +.table.is-bordered th { + border-width: 1px; +} +.table.is-bordered tr:last-child td, +.table.is-bordered tr:last-child th { + border-bottom-width: 1px; +} +.table.is-fullwidth { + width: 100%; +} +.table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #fafafa; +} +.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #fafafa; +} +.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: #f5f5f5; +} +.table.is-narrow td, +.table.is-narrow th { + padding: 0.25em 0.5em; +} +.table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #fafafa; +} +.table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; +} +.tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.tags .tag { + margin-bottom: 0.5rem; +} +.tags .tag:not(:last-child) { + margin-right: 0.5rem; +} +.tags:last-child { + margin-bottom: -0.5rem; +} +.tags:not(:last-child) { + margin-bottom: 1rem; +} +.tags.are-medium .tag:not(.is-normal):not(.is-large) { + font-size: 1rem; +} +.tags.are-large .tag:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; +} +.tags.is-centered { + justify-content: center; +} +.tags.is-centered .tag { + margin-right: 0.25rem; + margin-left: 0.25rem; +} +.tags.is-right { + justify-content: flex-end; +} +.tags.is-right .tag:not(:first-child) { + margin-left: 0.5rem; +} +.tags.is-right .tag:not(:last-child) { + margin-right: 0; +} +.tags.has-addons .tag { + margin-right: 0; +} +.tags.has-addons .tag:not(:first-child) { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.tags.has-addons .tag:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.tag:not(body) { + align-items: center; + background-color: #f5f5f5; + border-radius: 4px; + color: #4a4a4a; + display: inline-flex; + font-size: 0.75rem; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} +.tag:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; +} +.tag:not(body).is-white { + background-color: #fff; + color: #0a0a0a; +} +.tag:not(body).is-black { + background-color: #0a0a0a; + color: #fff; +} +.tag:not(body).is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.tag:not(body).is-dark { + background-color: #363636; + color: #fff; +} +.tag:not(body).is-primary { + background-color: #3273dc; + color: #fff; +} +.tag:not(body).is-primary.is-light { + background-color: #eef3fc; + color: #2160c4; +} +.tag:not(body).is-link { + background-color: #3273dc; + color: #fff; +} +.tag:not(body).is-link.is-light { + background-color: #eef3fc; + color: #2160c4; +} +.tag:not(body).is-info { + background-color: #3298dc; + color: #fff; +} +.tag:not(body).is-info.is-light { + background-color: #eef6fc; + color: #1d72aa; +} +.tag:not(body).is-success { + background-color: #48c774; + color: #fff; +} +.tag:not(body).is-success.is-light { + background-color: #effaf3; + color: #257942; +} +.tag:not(body).is-warning { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.tag:not(body).is-warning.is-light { + background-color: #fffbeb; + color: #947600; +} +.tag:not(body).is-danger { + background-color: #f14668; + color: #fff; +} +.tag:not(body).is-danger.is-light { + background-color: #feecf0; + color: #cc0f35; +} +.tag:not(body).is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.tag:not(body).is-normal { + font-size: 0.75rem; +} +.tag:not(body).is-medium { + font-size: 1rem; +} +.tag:not(body).is-large { + font-size: 1.25rem; +} +.tag:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; +} +.tag:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; +} +.tag:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; +} +.tag:not(body).is-delete { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; +} +.tag:not(body).is-delete::before, +.tag:not(body).is-delete::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; +} +.tag:not(body).is-delete::before { + height: 1px; + width: 50%; +} +.tag:not(body).is-delete::after { + height: 50%; + width: 1px; +} +.tag:not(body).is-delete:hover, +.tag:not(body).is-delete:focus { + background-color: #e8e8e8; +} +.tag:not(body).is-delete:active { + background-color: #dbdbdb; +} +.tag:not(body).is-rounded { + border-radius: 290486px; +} +a.tag:hover { + text-decoration: underline; +} +.title, +.subtitle { + word-break: break-word; +} +.title em, +.subtitle em, +.title span, +.subtitle span { + font-weight: inherit; +} +.title sub, +.subtitle sub { + font-size: 0.75em; +} +.title sup, +.subtitle sup { + font-size: 0.75em; +} +.title .tag, +.subtitle .tag { + vertical-align: middle; +} +.title { + color: #363636; + font-size: 2rem; + font-weight: 400; + line-height: 1.125; +} +.title strong { + color: inherit; + font-weight: inherit; +} +.title + .highlight { + margin-top: -0.75rem; +} +.title:not(.is-spaced) + .subtitle { + margin-top: -1.25rem; +} +.title.is-1 { + font-size: 3rem; +} +.title.is-2 { + font-size: 2.5rem; +} +.title.is-3 { + font-size: 2rem; +} +.title.is-4 { + font-size: 1.5rem; +} +.title.is-5 { + font-size: 1.25rem; +} +.title.is-6 { + font-size: 1rem; +} +.title.is-7 { + font-size: 0.85rem; +} +.subtitle { + color: #4a4a4a; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; +} +.subtitle strong { + color: #363636; + font-weight: 600; +} +.subtitle:not(.is-spaced) + .title { + margin-top: -1.25rem; +} +.subtitle.is-1 { + font-size: 3rem; +} +.subtitle.is-2 { + font-size: 2.5rem; +} +.subtitle.is-3 { + font-size: 2rem; +} +.subtitle.is-4 { + font-size: 1.5rem; +} +.subtitle.is-5 { + font-size: 1.25rem; +} +.subtitle.is-6 { + font-size: 1rem; +} +.subtitle.is-7 { + font-size: 0.85rem; +} +.heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; +} +.highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; +} +.highlight pre { + overflow: auto; + max-width: 100%; +} +.number { + align-items: center; + background-color: #f5f5f5; + border-radius: 290486px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; +} +.input, +.textarea, +.select select { + background-color: #fff; + border-color: #dbdbdb; + border-radius: 4px; + color: #363636; +} +.input::-moz-placeholder, +.textarea::-moz-placeholder, +.select select::-moz-placeholder { + color: rgba(54,54,54,0.3); +} +.input::-webkit-input-placeholder, +.textarea::-webkit-input-placeholder, +.select select::-webkit-input-placeholder { + color: rgba(54,54,54,0.3); +} +.input:-moz-placeholder, +.textarea:-moz-placeholder, +.select select:-moz-placeholder { + color: rgba(54,54,54,0.3); +} +.input:-ms-input-placeholder, +.textarea:-ms-input-placeholder, +.select select:-ms-input-placeholder { + color: rgba(54,54,54,0.3); +} +.input:hover, +.textarea:hover, +.select select:hover, +.input.is-hovered, +.textarea.is-hovered, +.select select.is-hovered { + border-color: #b5b5b5; +} +.input:focus, +.textarea:focus, +.select select:focus, +.input.is-focused, +.textarea.is-focused, +.select select.is-focused, +.input:active, +.textarea:active, +.select select:active, +.input.is-active, +.textarea.is-active, +.select select.is-active { + border-color: #3273dc; + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.input[disabled], +.textarea[disabled], +.select select[disabled], +fieldset[disabled] .input, +fieldset[disabled] .textarea, +fieldset[disabled] .select select { + background-color: #f5f5f5; + border-color: #f5f5f5; + box-shadow: none; + color: #7a7a7a; +} +.input[disabled]::-moz-placeholder, +.textarea[disabled]::-moz-placeholder, +.select select[disabled]::-moz-placeholder, +fieldset[disabled] .input::-moz-placeholder, +fieldset[disabled] .textarea::-moz-placeholder, +fieldset[disabled] .select select::-moz-placeholder { + color: rgba(122,122,122,0.3); +} +.input[disabled]::-webkit-input-placeholder, +.textarea[disabled]::-webkit-input-placeholder, +.select select[disabled]::-webkit-input-placeholder, +fieldset[disabled] .input::-webkit-input-placeholder, +fieldset[disabled] .textarea::-webkit-input-placeholder, +fieldset[disabled] .select select::-webkit-input-placeholder { + color: rgba(122,122,122,0.3); +} +.input[disabled]:-moz-placeholder, +.textarea[disabled]:-moz-placeholder, +.select select[disabled]:-moz-placeholder, +fieldset[disabled] .input:-moz-placeholder, +fieldset[disabled] .textarea:-moz-placeholder, +fieldset[disabled] .select select:-moz-placeholder { + color: rgba(122,122,122,0.3); +} +.input[disabled]:-ms-input-placeholder, +.textarea[disabled]:-ms-input-placeholder, +.select select[disabled]:-ms-input-placeholder, +fieldset[disabled] .input:-ms-input-placeholder, +fieldset[disabled] .textarea:-ms-input-placeholder, +fieldset[disabled] .select select:-ms-input-placeholder { + color: rgba(122,122,122,0.3); +} +.input, +.textarea { + box-shadow: inset 0 0.0625em 0.125em rgba(10,10,10,0.05); + max-width: 100%; + width: 100%; +} +.input[readonly], +.textarea[readonly] { + box-shadow: none; +} +.input.is-white, +.textarea.is-white { + border-color: #fff; +} +.input.is-white:focus, +.textarea.is-white:focus, +.input.is-white.is-focused, +.textarea.is-white.is-focused, +.input.is-white:active, +.textarea.is-white:active, +.input.is-white.is-active, +.textarea.is-white.is-active { + box-shadow: 0 0 0 0.125em rgba(255,255,255,0.25); +} +.input.is-black, +.textarea.is-black { + border-color: #0a0a0a; +} +.input.is-black:focus, +.textarea.is-black:focus, +.input.is-black.is-focused, +.textarea.is-black.is-focused, +.input.is-black:active, +.textarea.is-black:active, +.input.is-black.is-active, +.textarea.is-black.is-active { + box-shadow: 0 0 0 0.125em rgba(10,10,10,0.25); +} +.input.is-light, +.textarea.is-light { + border-color: #f5f5f5; +} +.input.is-light:focus, +.textarea.is-light:focus, +.input.is-light.is-focused, +.textarea.is-light.is-focused, +.input.is-light:active, +.textarea.is-light:active, +.input.is-light.is-active, +.textarea.is-light.is-active { + box-shadow: 0 0 0 0.125em rgba(245,245,245,0.25); +} +.input.is-dark, +.textarea.is-dark { + border-color: #363636; +} +.input.is-dark:focus, +.textarea.is-dark:focus, +.input.is-dark.is-focused, +.textarea.is-dark.is-focused, +.input.is-dark:active, +.textarea.is-dark:active, +.input.is-dark.is-active, +.textarea.is-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(54,54,54,0.25); +} +.input.is-primary, +.textarea.is-primary { + border-color: #3273dc; +} +.input.is-primary:focus, +.textarea.is-primary:focus, +.input.is-primary.is-focused, +.textarea.is-primary.is-focused, +.input.is-primary:active, +.textarea.is-primary:active, +.input.is-primary.is-active, +.textarea.is-primary.is-active { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.input.is-link, +.textarea.is-link { + border-color: #3273dc; +} +.input.is-link:focus, +.textarea.is-link:focus, +.input.is-link.is-focused, +.textarea.is-link.is-focused, +.input.is-link:active, +.textarea.is-link:active, +.input.is-link.is-active, +.textarea.is-link.is-active { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.input.is-info, +.textarea.is-info { + border-color: #3298dc; +} +.input.is-info:focus, +.textarea.is-info:focus, +.input.is-info.is-focused, +.textarea.is-info.is-focused, +.input.is-info:active, +.textarea.is-info:active, +.input.is-info.is-active, +.textarea.is-info.is-active { + box-shadow: 0 0 0 0.125em rgba(50,152,220,0.25); +} +.input.is-success, +.textarea.is-success { + border-color: #48c774; +} +.input.is-success:focus, +.textarea.is-success:focus, +.input.is-success.is-focused, +.textarea.is-success.is-focused, +.input.is-success:active, +.textarea.is-success:active, +.input.is-success.is-active, +.textarea.is-success.is-active { + box-shadow: 0 0 0 0.125em rgba(72,199,116,0.25); +} +.input.is-warning, +.textarea.is-warning { + border-color: #ffdd57; +} +.input.is-warning:focus, +.textarea.is-warning:focus, +.input.is-warning.is-focused, +.textarea.is-warning.is-focused, +.input.is-warning:active, +.textarea.is-warning:active, +.input.is-warning.is-active, +.textarea.is-warning.is-active { + box-shadow: 0 0 0 0.125em rgba(255,221,87,0.25); +} +.input.is-danger, +.textarea.is-danger { + border-color: #f14668; +} +.input.is-danger:focus, +.textarea.is-danger:focus, +.input.is-danger.is-focused, +.textarea.is-danger.is-focused, +.input.is-danger:active, +.textarea.is-danger:active, +.input.is-danger.is-active, +.textarea.is-danger.is-active { + box-shadow: 0 0 0 0.125em rgba(241,70,104,0.25); +} +.input.is-grey-lightest, +.textarea.is-grey-lightest { + border-color: #ededed; +} +.input.is-grey-lightest:focus, +.textarea.is-grey-lightest:focus, +.input.is-grey-lightest.is-focused, +.textarea.is-grey-lightest.is-focused, +.input.is-grey-lightest:active, +.textarea.is-grey-lightest:active, +.input.is-grey-lightest.is-active, +.textarea.is-grey-lightest.is-active { + box-shadow: 0 0 0 0.125em rgba(237,237,237,0.25); +} +.input.is-small, +.textarea.is-small { + border-radius: 2px; + font-size: 0.75rem; +} +.input.is-medium, +.textarea.is-medium { + font-size: 1.25rem; +} +.input.is-large, +.textarea.is-large { + font-size: 1.5rem; +} +.input.is-fullwidth, +.textarea.is-fullwidth { + display: block; + width: 100%; +} +.input.is-inline, +.textarea.is-inline { + display: inline; + width: auto; +} +.input.is-rounded { + border-radius: 290486px; + padding-left: calc(calc(0.75em - 1px) + 0.375em); + padding-right: calc(calc(0.75em - 1px) + 0.375em); +} +.input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; +} +.textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: calc(0.75em - 1px); + resize: vertical; +} +.textarea:not([rows]) { + max-height: 40em; + min-height: 8em; +} +.textarea[rows] { + height: initial; +} +.textarea.has-fixed-size { + resize: none; +} +.checkbox, +.radio { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; +} +.checkbox input, +.radio input { + cursor: pointer; +} +.checkbox:hover, +.radio:hover { + color: #363636; +} +.checkbox[disabled], +.radio[disabled], +fieldset[disabled] .checkbox, +fieldset[disabled] .radio { + color: #7a7a7a; + cursor: not-allowed; +} +.radio + .radio { + margin-left: 0.5em; +} +.select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; +} +.select:not(.is-multiple) { + height: 2.25em; +} +.select:not(.is-multiple):not(.is-loading)::after { + border-color: #3273dc; + right: 1.125em; + z-index: 4; +} +.select.is-rounded select { + border-radius: 290486px; + padding-left: 1em; +} +.select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; +} +.select select::-ms-expand { + display: none; +} +.select select[disabled]:hover, +fieldset[disabled] .select select:hover { + border-color: #f5f5f5; +} +.select select:not([multiple]) { + padding-right: 2.5em; +} +.select select[multiple] { + height: auto; + padding: 0; +} +.select select[multiple] option { + padding: 0.5em 1em; +} +.select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #363636; +} +.select.is-white:not(:hover)::after { + border-color: #fff; +} +.select.is-white select { + border-color: #fff; +} +.select.is-white select:hover, +.select.is-white select.is-hovered { + border-color: #f2f2f2; +} +.select.is-white select:focus, +.select.is-white select.is-focused, +.select.is-white select:active, +.select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255,255,255,0.25); +} +.select.is-black:not(:hover)::after { + border-color: #0a0a0a; +} +.select.is-black select { + border-color: #0a0a0a; +} +.select.is-black select:hover, +.select.is-black select.is-hovered { + border-color: #000; +} +.select.is-black select:focus, +.select.is-black select.is-focused, +.select.is-black select:active, +.select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(10,10,10,0.25); +} +.select.is-light:not(:hover)::after { + border-color: #f5f5f5; +} +.select.is-light select { + border-color: #f5f5f5; +} +.select.is-light select:hover, +.select.is-light select.is-hovered { + border-color: #e8e8e8; +} +.select.is-light select:focus, +.select.is-light select.is-focused, +.select.is-light select:active, +.select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(245,245,245,0.25); +} +.select.is-dark:not(:hover)::after { + border-color: #363636; +} +.select.is-dark select { + border-color: #363636; +} +.select.is-dark select:hover, +.select.is-dark select.is-hovered { + border-color: #292929; +} +.select.is-dark select:focus, +.select.is-dark select.is-focused, +.select.is-dark select:active, +.select.is-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(54,54,54,0.25); +} +.select.is-primary:not(:hover)::after { + border-color: #3273dc; +} +.select.is-primary select { + border-color: #3273dc; +} +.select.is-primary select:hover, +.select.is-primary select.is-hovered { + border-color: #2366d1; +} +.select.is-primary select:focus, +.select.is-primary select.is-focused, +.select.is-primary select:active, +.select.is-primary select.is-active { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.select.is-link:not(:hover)::after { + border-color: #3273dc; +} +.select.is-link select { + border-color: #3273dc; +} +.select.is-link select:hover, +.select.is-link select.is-hovered { + border-color: #2366d1; +} +.select.is-link select:focus, +.select.is-link select.is-focused, +.select.is-link select:active, +.select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.select.is-info:not(:hover)::after { + border-color: #3298dc; +} +.select.is-info select { + border-color: #3298dc; +} +.select.is-info select:hover, +.select.is-info select.is-hovered { + border-color: #238cd1; +} +.select.is-info select:focus, +.select.is-info select.is-focused, +.select.is-info select:active, +.select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(50,152,220,0.25); +} +.select.is-success:not(:hover)::after { + border-color: #48c774; +} +.select.is-success select { + border-color: #48c774; +} +.select.is-success select:hover, +.select.is-success select.is-hovered { + border-color: #3abb67; +} +.select.is-success select:focus, +.select.is-success select.is-focused, +.select.is-success select:active, +.select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(72,199,116,0.25); +} +.select.is-warning:not(:hover)::after { + border-color: #ffdd57; +} +.select.is-warning select { + border-color: #ffdd57; +} +.select.is-warning select:hover, +.select.is-warning select.is-hovered { + border-color: #ffd83d; +} +.select.is-warning select:focus, +.select.is-warning select.is-focused, +.select.is-warning select:active, +.select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(255,221,87,0.25); +} +.select.is-danger:not(:hover)::after { + border-color: #f14668; +} +.select.is-danger select { + border-color: #f14668; +} +.select.is-danger select:hover, +.select.is-danger select.is-hovered { + border-color: #ef2e55; +} +.select.is-danger select:focus, +.select.is-danger select.is-focused, +.select.is-danger select:active, +.select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(241,70,104,0.25); +} +.select.is-grey-lightest:not(:hover)::after { + border-color: #ededed; +} +.select.is-grey-lightest select { + border-color: #ededed; +} +.select.is-grey-lightest select:hover, +.select.is-grey-lightest select.is-hovered { + border-color: #e0e0e0; +} +.select.is-grey-lightest select:focus, +.select.is-grey-lightest select.is-focused, +.select.is-grey-lightest select:active, +.select.is-grey-lightest select.is-active { + box-shadow: 0 0 0 0.125em rgba(237,237,237,0.25); +} +.select.is-small { + border-radius: 2px; + font-size: 0.75rem; +} +.select.is-medium { + font-size: 1.25rem; +} +.select.is-large { + font-size: 1.5rem; +} +.select.is-disabled::after { + border-color: #7a7a7a; +} +.select.is-fullwidth { + width: 100%; +} +.select.is-fullwidth select { + width: 100%; +} +.select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; +} +.select.is-loading.is-small:after { + font-size: 0.75rem; +} +.select.is-loading.is-medium:after { + font-size: 1.25rem; +} +.select.is-loading.is-large:after { + font-size: 1.5rem; +} +.file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; +} +.file.is-white .file-cta { + background-color: #fff; + border-color: transparent; + color: #0a0a0a; +} +.file.is-white:hover .file-cta, +.file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; +} +.file.is-white:focus .file-cta, +.file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255,255,255,0.25); + color: #0a0a0a; +} +.file.is-white:active .file-cta, +.file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; +} +.file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: #fff; +} +.file.is-black:hover .file-cta, +.file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: #fff; +} +.file.is-black:focus .file-cta, +.file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10,10,10,0.25); + color: #fff; +} +.file.is-black:active .file-cta, +.file.is-black.is-active .file-cta { + background-color: #000; + border-color: transparent; + color: #fff; +} +.file.is-light .file-cta { + background-color: #f5f5f5; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-light:hover .file-cta, +.file.is-light.is-hovered .file-cta { + background-color: #eee; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-light:focus .file-cta, +.file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(245,245,245,0.25); + color: rgba(0,0,0,0.7); +} +.file.is-light:active .file-cta, +.file.is-light.is-active .file-cta { + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-dark .file-cta { + background-color: #363636; + border-color: transparent; + color: #fff; +} +.file.is-dark:hover .file-cta, +.file.is-dark.is-hovered .file-cta { + background-color: #2f2f2f; + border-color: transparent; + color: #fff; +} +.file.is-dark:focus .file-cta, +.file.is-dark.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(54,54,54,0.25); + color: #fff; +} +.file.is-dark:active .file-cta, +.file.is-dark.is-active .file-cta { + background-color: #292929; + border-color: transparent; + color: #fff; +} +.file.is-primary .file-cta { + background-color: #3273dc; + border-color: transparent; + color: #fff; +} +.file.is-primary:hover .file-cta, +.file.is-primary.is-hovered .file-cta { + background-color: #276cda; + border-color: transparent; + color: #fff; +} +.file.is-primary:focus .file-cta, +.file.is-primary.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(50,115,220,0.25); + color: #fff; +} +.file.is-primary:active .file-cta, +.file.is-primary.is-active .file-cta { + background-color: #2366d1; + border-color: transparent; + color: #fff; +} +.file.is-link .file-cta { + background-color: #3273dc; + border-color: transparent; + color: #fff; +} +.file.is-link:hover .file-cta, +.file.is-link.is-hovered .file-cta { + background-color: #276cda; + border-color: transparent; + color: #fff; +} +.file.is-link:focus .file-cta, +.file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(50,115,220,0.25); + color: #fff; +} +.file.is-link:active .file-cta, +.file.is-link.is-active .file-cta { + background-color: #2366d1; + border-color: transparent; + color: #fff; +} +.file.is-info .file-cta { + background-color: #3298dc; + border-color: transparent; + color: #fff; +} +.file.is-info:hover .file-cta, +.file.is-info.is-hovered .file-cta { + background-color: #2793da; + border-color: transparent; + color: #fff; +} +.file.is-info:focus .file-cta, +.file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(50,152,220,0.25); + color: #fff; +} +.file.is-info:active .file-cta, +.file.is-info.is-active .file-cta { + background-color: #238cd1; + border-color: transparent; + color: #fff; +} +.file.is-success .file-cta { + background-color: #48c774; + border-color: transparent; + color: #fff; +} +.file.is-success:hover .file-cta, +.file.is-success.is-hovered .file-cta { + background-color: #3ec46d; + border-color: transparent; + color: #fff; +} +.file.is-success:focus .file-cta, +.file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(72,199,116,0.25); + color: #fff; +} +.file.is-success:active .file-cta, +.file.is-success.is-active .file-cta { + background-color: #3abb67; + border-color: transparent; + color: #fff; +} +.file.is-warning .file-cta { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-warning:hover .file-cta, +.file.is-warning.is-hovered .file-cta { + background-color: #ffdb4a; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-warning:focus .file-cta, +.file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255,221,87,0.25); + color: rgba(0,0,0,0.7); +} +.file.is-warning:active .file-cta, +.file.is-warning.is-active .file-cta { + background-color: #ffd83d; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-danger .file-cta { + background-color: #f14668; + border-color: transparent; + color: #fff; +} +.file.is-danger:hover .file-cta, +.file.is-danger.is-hovered .file-cta { + background-color: #f03a5f; + border-color: transparent; + color: #fff; +} +.file.is-danger:focus .file-cta, +.file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(241,70,104,0.25); + color: #fff; +} +.file.is-danger:active .file-cta, +.file.is-danger.is-active .file-cta { + background-color: #ef2e55; + border-color: transparent; + color: #fff; +} +.file.is-grey-lightest .file-cta { + background-color: #ededed; + border-color: transparent; + color: #363636; +} +.file.is-grey-lightest:hover .file-cta, +.file.is-grey-lightest.is-hovered .file-cta { + background-color: #e7e7e7; + border-color: transparent; + color: #363636; +} +.file.is-grey-lightest:focus .file-cta, +.file.is-grey-lightest.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(237,237,237,0.25); + color: #363636; +} +.file.is-grey-lightest:active .file-cta, +.file.is-grey-lightest.is-active .file-cta { + background-color: #e0e0e0; + border-color: transparent; + color: #363636; +} +.file.is-small { + font-size: 0.75rem; +} +.file.is-medium { + font-size: 1.25rem; +} +.file.is-medium .file-icon .fa { + font-size: 21px; +} +.file.is-large { + font-size: 1.5rem; +} +.file.is-large .file-icon .fa { + font-size: 28px; +} +.file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.file.has-name.is-empty .file-cta { + border-radius: 4px; +} +.file.has-name.is-empty .file-name { + display: none; +} +.file.is-boxed .file-label { + flex-direction: column; +} +.file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; +} +.file.is-boxed .file-name { + border-width: 0 1px 1px; +} +.file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; +} +.file.is-boxed .file-icon .fa { + font-size: 21px; +} +.file.is-boxed.is-small .file-icon .fa { + font-size: 14px; +} +.file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; +} +.file.is-boxed.is-large .file-icon .fa { + font-size: 35px; +} +.file.is-boxed.has-name .file-cta { + border-radius: 4px 4px 0 0; +} +.file.is-boxed.has-name .file-name { + border-radius: 0 0 4px 4px; + border-width: 0 1px 1px; +} +.file.is-centered { + justify-content: center; +} +.file.is-fullwidth .file-label { + width: 100%; +} +.file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; +} +.file.is-right { + justify-content: flex-end; +} +.file.is-right .file-cta { + border-radius: 0 4px 4px 0; +} +.file.is-right .file-name { + border-radius: 4px 0 0 4px; + border-width: 1px 0 1px 1px; + order: -1; +} +.file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; +} +.file-label:hover .file-cta { + background-color: #eee; + color: #363636; +} +.file-label:hover .file-name { + border-color: #d5d5d5; +} +.file-label:active .file-cta { + background-color: #e8e8e8; + color: #363636; +} +.file-label:active .file-name { + border-color: #cfcfcf; +} +.file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; +} +.file-cta, +.file-name { + border-color: #dbdbdb; + border-radius: 4px; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; +} +.file-cta { + background-color: #f5f5f5; + color: #4a4a4a; +} +.file-name { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; +} +.file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; +} +.file-icon .fa { + font-size: 14px; +} +.label { + color: #363636; + display: block; + font-size: 1rem; + font-weight: 700; +} +.label:not(:last-child) { + margin-bottom: 0.5em; +} +.label.is-small { + font-size: 0.75rem; +} +.label.is-medium { + font-size: 1.25rem; +} +.label.is-large { + font-size: 1.5rem; +} +.help { + display: block; + font-size: 0.75rem; + margin-top: 0.25rem; +} +.help.is-white { + color: #fff; +} +.help.is-black { + color: #0a0a0a; +} +.help.is-light { + color: #f5f5f5; +} +.help.is-dark { + color: #363636; +} +.help.is-primary { + color: #3273dc; +} +.help.is-link { + color: #3273dc; +} +.help.is-info { + color: #3298dc; +} +.help.is-success { + color: #48c774; +} +.help.is-warning { + color: #ffdd57; +} +.help.is-danger { + color: #f14668; +} +.help.is-grey-lightest { + color: #ededed; +} +.field:not(:last-child) { + margin-bottom: 0.75rem; +} +.field.has-addons { + display: flex; + justify-content: flex-start; +} +.field.has-addons .control:not(:last-child) { + margin-right: -1px; +} +.field.has-addons .control:not(:first-child):not(:last-child) .button, +.field.has-addons .control:not(:first-child):not(:last-child) .input, +.field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; +} +.field.has-addons .control:first-child:not(:only-child) .button, +.field.has-addons .control:first-child:not(:only-child) .input, +.field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.field.has-addons .control:last-child:not(:only-child) .button, +.field.has-addons .control:last-child:not(:only-child) .input, +.field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.field.has-addons .control .button:not([disabled]):hover, +.field.has-addons .control .input:not([disabled]):hover, +.field.has-addons .control .select select:not([disabled]):hover, +.field.has-addons .control .button:not([disabled]).is-hovered, +.field.has-addons .control .input:not([disabled]).is-hovered, +.field.has-addons .control .select select:not([disabled]).is-hovered { + z-index: 2; +} +.field.has-addons .control .button:not([disabled]):focus, +.field.has-addons .control .input:not([disabled]):focus, +.field.has-addons .control .select select:not([disabled]):focus, +.field.has-addons .control .button:not([disabled]).is-focused, +.field.has-addons .control .input:not([disabled]).is-focused, +.field.has-addons .control .select select:not([disabled]).is-focused, +.field.has-addons .control .button:not([disabled]):active, +.field.has-addons .control .input:not([disabled]):active, +.field.has-addons .control .select select:not([disabled]):active, +.field.has-addons .control .button:not([disabled]).is-active, +.field.has-addons .control .input:not([disabled]).is-active, +.field.has-addons .control .select select:not([disabled]).is-active { + z-index: 3; +} +.field.has-addons .control .button:not([disabled]):focus:hover, +.field.has-addons .control .input:not([disabled]):focus:hover, +.field.has-addons .control .select select:not([disabled]):focus:hover, +.field.has-addons .control .button:not([disabled]).is-focused:hover, +.field.has-addons .control .input:not([disabled]).is-focused:hover, +.field.has-addons .control .select select:not([disabled]).is-focused:hover, +.field.has-addons .control .button:not([disabled]):active:hover, +.field.has-addons .control .input:not([disabled]):active:hover, +.field.has-addons .control .select select:not([disabled]):active:hover, +.field.has-addons .control .button:not([disabled]).is-active:hover, +.field.has-addons .control .input:not([disabled]).is-active:hover, +.field.has-addons .control .select select:not([disabled]).is-active:hover { + z-index: 4; +} +.field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.field.has-addons.has-addons-centered { + justify-content: center; +} +.field.has-addons.has-addons-right { + justify-content: flex-end; +} +.field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; +} +.field.is-grouped { + display: flex; + justify-content: flex-start; +} +.field.is-grouped > .control { + flex-shrink: 0; +} +.field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; +} +.field.is-grouped > .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.field.is-grouped.is-grouped-centered { + justify-content: center; +} +.field.is-grouped.is-grouped-right { + justify-content: flex-end; +} +.field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; +} +.field.is-grouped.is-grouped-multiline > .control:last-child, +.field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; +} +.field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; +} +.field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; +} +@media screen and (min-width: 769px), print { + .field.is-horizontal { + display: flex; + } +} +.field-label .label { + font-size: inherit; +} +@media screen and (max-width: 768px) { + .field-label { + margin-bottom: 0.5rem; + } +} +@media screen and (min-width: 769px), print { + .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; + } + .field-label.is-small { + font-size: 0.75rem; + padding-top: 0.375em; + } + .field-label.is-normal { + padding-top: 0.375em; + } + .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; + } + .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; + } +} +.field-body .field .field { + margin-bottom: 0; +} +@media screen and (min-width: 769px), print { + .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; + } + .field-body .field { + margin-bottom: 0; + } + .field-body > .field { + flex-shrink: 1; + } + .field-body > .field:not(.is-narrow) { + flex-grow: 1; + } + .field-body > .field:not(:last-child) { + margin-right: 0.75rem; + } +} +.control { + box-sizing: border-box; + clear: both; + font-size: 1rem; + position: relative; + text-align: left; +} +.control.has-icons-left .input:focus ~ .icon, +.control.has-icons-right .input:focus ~ .icon, +.control.has-icons-left .select:focus ~ .icon, +.control.has-icons-right .select:focus ~ .icon { + color: #4a4a4a; +} +.control.has-icons-left .input.is-small ~ .icon, +.control.has-icons-right .input.is-small ~ .icon, +.control.has-icons-left .select.is-small ~ .icon, +.control.has-icons-right .select.is-small ~ .icon { + font-size: 0.75rem; +} +.control.has-icons-left .input.is-medium ~ .icon, +.control.has-icons-right .input.is-medium ~ .icon, +.control.has-icons-left .select.is-medium ~ .icon, +.control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; +} +.control.has-icons-left .input.is-large ~ .icon, +.control.has-icons-right .input.is-large ~ .icon, +.control.has-icons-left .select.is-large ~ .icon, +.control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; +} +.control.has-icons-left .icon, +.control.has-icons-right .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; +} +.control.has-icons-left .input, +.control.has-icons-left .select select { + padding-left: 2.25em; +} +.control.has-icons-left .icon.is-left { + left: 0; +} +.control.has-icons-right .input, +.control.has-icons-right .select select { + padding-right: 2.25em; +} +.control.has-icons-right .icon.is-right { + right: 0; +} +.control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; +} +.control.is-loading.is-small:after { + font-size: 0.75rem; +} +.control.is-loading.is-medium:after { + font-size: 1.25rem; +} +.control.is-loading.is-large:after { + font-size: 1.5rem; +} +.column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; +} +.columns.is-mobile > .column.is-narrow { + flex: none; +} +.columns.is-mobile > .column.is-full { + flex: none; + width: 100%; +} +.columns.is-mobile > .column.is-three-quarters { + flex: none; + width: 75%; +} +.columns.is-mobile > .column.is-two-thirds { + flex: none; + width: 66.6666%; +} +.columns.is-mobile > .column.is-half { + flex: none; + width: 50%; +} +.columns.is-mobile > .column.is-one-third { + flex: none; + width: 33.3333%; +} +.columns.is-mobile > .column.is-one-quarter { + flex: none; + width: 25%; +} +.columns.is-mobile > .column.is-one-fifth { + flex: none; + width: 20%; +} +.columns.is-mobile > .column.is-two-fifths { + flex: none; + width: 40%; +} +.columns.is-mobile > .column.is-three-fifths { + flex: none; + width: 60%; +} +.columns.is-mobile > .column.is-four-fifths { + flex: none; + width: 80%; +} +.columns.is-mobile > .column.is-offset-three-quarters { + margin-left: 75%; +} +.columns.is-mobile > .column.is-offset-two-thirds { + margin-left: 66.6666%; +} +.columns.is-mobile > .column.is-offset-half { + margin-left: 50%; +} +.columns.is-mobile > .column.is-offset-one-third { + margin-left: 33.3333%; +} +.columns.is-mobile > .column.is-offset-one-quarter { + margin-left: 25%; +} +.columns.is-mobile > .column.is-offset-one-fifth { + margin-left: 20%; +} +.columns.is-mobile > .column.is-offset-two-fifths { + margin-left: 40%; +} +.columns.is-mobile > .column.is-offset-three-fifths { + margin-left: 60%; +} +.columns.is-mobile > .column.is-offset-four-fifths { + margin-left: 80%; +} +.columns.is-mobile > .column.is-0 { + flex: none; + width: 0%; +} +.columns.is-mobile > .column.is-offset-0 { + margin-left: 0%; +} +.columns.is-mobile > .column.is-1 { + flex: none; + width: 8.33333%; +} +.columns.is-mobile > .column.is-offset-1 { + margin-left: 8.33333%; +} +.columns.is-mobile > .column.is-2 { + flex: none; + width: 16.66667%; +} +.columns.is-mobile > .column.is-offset-2 { + margin-left: 16.66667%; +} +.columns.is-mobile > .column.is-3 { + flex: none; + width: 25%; +} +.columns.is-mobile > .column.is-offset-3 { + margin-left: 25%; +} +.columns.is-mobile > .column.is-4 { + flex: none; + width: 33.33333%; +} +.columns.is-mobile > .column.is-offset-4 { + margin-left: 33.33333%; +} +.columns.is-mobile > .column.is-5 { + flex: none; + width: 41.66667%; +} +.columns.is-mobile > .column.is-offset-5 { + margin-left: 41.66667%; +} +.columns.is-mobile > .column.is-6 { + flex: none; + width: 50%; +} +.columns.is-mobile > .column.is-offset-6 { + margin-left: 50%; +} +.columns.is-mobile > .column.is-7 { + flex: none; + width: 58.33333%; +} +.columns.is-mobile > .column.is-offset-7 { + margin-left: 58.33333%; +} +.columns.is-mobile > .column.is-8 { + flex: none; + width: 66.66667%; +} +.columns.is-mobile > .column.is-offset-8 { + margin-left: 66.66667%; +} +.columns.is-mobile > .column.is-9 { + flex: none; + width: 75%; +} +.columns.is-mobile > .column.is-offset-9 { + margin-left: 75%; +} +.columns.is-mobile > .column.is-10 { + flex: none; + width: 83.33333%; +} +.columns.is-mobile > .column.is-offset-10 { + margin-left: 83.33333%; +} +.columns.is-mobile > .column.is-11 { + flex: none; + width: 91.66667%; +} +.columns.is-mobile > .column.is-offset-11 { + margin-left: 91.66667%; +} +.columns.is-mobile > .column.is-12 { + flex: none; + width: 100%; +} +.columns.is-mobile > .column.is-offset-12 { + margin-left: 100%; +} +@media screen and (max-width: 768px) { + .column.is-narrow-mobile { + flex: none; + } + .column.is-full-mobile { + flex: none; + width: 100%; + } + .column.is-three-quarters-mobile { + flex: none; + width: 75%; + } + .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; + } + .column.is-half-mobile { + flex: none; + width: 50%; + } + .column.is-one-third-mobile { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-mobile { + flex: none; + width: 25%; + } + .column.is-one-fifth-mobile { + flex: none; + width: 20%; + } + .column.is-two-fifths-mobile { + flex: none; + width: 40%; + } + .column.is-three-fifths-mobile { + flex: none; + width: 60%; + } + .column.is-four-fifths-mobile { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-mobile { + margin-left: 75%; + } + .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; + } + .column.is-offset-half-mobile { + margin-left: 50%; + } + .column.is-offset-one-third-mobile { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-mobile { + margin-left: 25%; + } + .column.is-offset-one-fifth-mobile { + margin-left: 20%; + } + .column.is-offset-two-fifths-mobile { + margin-left: 40%; + } + .column.is-offset-three-fifths-mobile { + margin-left: 60%; + } + .column.is-offset-four-fifths-mobile { + margin-left: 80%; + } + .column.is-0-mobile { + flex: none; + width: 0%; + } + .column.is-offset-0-mobile { + margin-left: 0%; + } + .column.is-1-mobile { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-mobile { + margin-left: 8.33333%; + } + .column.is-2-mobile { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-mobile { + margin-left: 16.66667%; + } + .column.is-3-mobile { + flex: none; + width: 25%; + } + .column.is-offset-3-mobile { + margin-left: 25%; + } + .column.is-4-mobile { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-mobile { + margin-left: 33.33333%; + } + .column.is-5-mobile { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-mobile { + margin-left: 41.66667%; + } + .column.is-6-mobile { + flex: none; + width: 50%; + } + .column.is-offset-6-mobile { + margin-left: 50%; + } + .column.is-7-mobile { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-mobile { + margin-left: 58.33333%; + } + .column.is-8-mobile { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-mobile { + margin-left: 66.66667%; + } + .column.is-9-mobile { + flex: none; + width: 75%; + } + .column.is-offset-9-mobile { + margin-left: 75%; + } + .column.is-10-mobile { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-mobile { + margin-left: 83.33333%; + } + .column.is-11-mobile { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-mobile { + margin-left: 91.66667%; + } + .column.is-12-mobile { + flex: none; + width: 100%; + } + .column.is-offset-12-mobile { + margin-left: 100%; + } +} +@media screen and (min-width: 769px), print { + .column.is-narrow, + .column.is-narrow-tablet { + flex: none; + } + .column.is-full, + .column.is-full-tablet { + flex: none; + width: 100%; + } + .column.is-three-quarters, + .column.is-three-quarters-tablet { + flex: none; + width: 75%; + } + .column.is-two-thirds, + .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; + } + .column.is-half, + .column.is-half-tablet { + flex: none; + width: 50%; + } + .column.is-one-third, + .column.is-one-third-tablet { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter, + .column.is-one-quarter-tablet { + flex: none; + width: 25%; + } + .column.is-one-fifth, + .column.is-one-fifth-tablet { + flex: none; + width: 20%; + } + .column.is-two-fifths, + .column.is-two-fifths-tablet { + flex: none; + width: 40%; + } + .column.is-three-fifths, + .column.is-three-fifths-tablet { + flex: none; + width: 60%; + } + .column.is-four-fifths, + .column.is-four-fifths-tablet { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters, + .column.is-offset-three-quarters-tablet { + margin-left: 75%; + } + .column.is-offset-two-thirds, + .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; + } + .column.is-offset-half, + .column.is-offset-half-tablet { + margin-left: 50%; + } + .column.is-offset-one-third, + .column.is-offset-one-third-tablet { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter, + .column.is-offset-one-quarter-tablet { + margin-left: 25%; + } + .column.is-offset-one-fifth, + .column.is-offset-one-fifth-tablet { + margin-left: 20%; + } + .column.is-offset-two-fifths, + .column.is-offset-two-fifths-tablet { + margin-left: 40%; + } + .column.is-offset-three-fifths, + .column.is-offset-three-fifths-tablet { + margin-left: 60%; + } + .column.is-offset-four-fifths, + .column.is-offset-four-fifths-tablet { + margin-left: 80%; + } + .column.is-0, + .column.is-0-tablet { + flex: none; + width: 0%; + } + .column.is-offset-0, + .column.is-offset-0-tablet { + margin-left: 0%; + } + .column.is-1, + .column.is-1-tablet { + flex: none; + width: 8.33333%; + } + .column.is-offset-1, + .column.is-offset-1-tablet { + margin-left: 8.33333%; + } + .column.is-2, + .column.is-2-tablet { + flex: none; + width: 16.66667%; + } + .column.is-offset-2, + .column.is-offset-2-tablet { + margin-left: 16.66667%; + } + .column.is-3, + .column.is-3-tablet { + flex: none; + width: 25%; + } + .column.is-offset-3, + .column.is-offset-3-tablet { + margin-left: 25%; + } + .column.is-4, + .column.is-4-tablet { + flex: none; + width: 33.33333%; + } + .column.is-offset-4, + .column.is-offset-4-tablet { + margin-left: 33.33333%; + } + .column.is-5, + .column.is-5-tablet { + flex: none; + width: 41.66667%; + } + .column.is-offset-5, + .column.is-offset-5-tablet { + margin-left: 41.66667%; + } + .column.is-6, + .column.is-6-tablet { + flex: none; + width: 50%; + } + .column.is-offset-6, + .column.is-offset-6-tablet { + margin-left: 50%; + } + .column.is-7, + .column.is-7-tablet { + flex: none; + width: 58.33333%; + } + .column.is-offset-7, + .column.is-offset-7-tablet { + margin-left: 58.33333%; + } + .column.is-8, + .column.is-8-tablet { + flex: none; + width: 66.66667%; + } + .column.is-offset-8, + .column.is-offset-8-tablet { + margin-left: 66.66667%; + } + .column.is-9, + .column.is-9-tablet { + flex: none; + width: 75%; + } + .column.is-offset-9, + .column.is-offset-9-tablet { + margin-left: 75%; + } + .column.is-10, + .column.is-10-tablet { + flex: none; + width: 83.33333%; + } + .column.is-offset-10, + .column.is-offset-10-tablet { + margin-left: 83.33333%; + } + .column.is-11, + .column.is-11-tablet { + flex: none; + width: 91.66667%; + } + .column.is-offset-11, + .column.is-offset-11-tablet { + margin-left: 91.66667%; + } + .column.is-12, + .column.is-12-tablet { + flex: none; + width: 100%; + } + .column.is-offset-12, + .column.is-offset-12-tablet { + margin-left: 100%; + } +} +@media screen and (max-width: 1087px) { + .column.is-narrow-touch { + flex: none; + } + .column.is-full-touch { + flex: none; + width: 100%; + } + .column.is-three-quarters-touch { + flex: none; + width: 75%; + } + .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; + } + .column.is-half-touch { + flex: none; + width: 50%; + } + .column.is-one-third-touch { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-touch { + flex: none; + width: 25%; + } + .column.is-one-fifth-touch { + flex: none; + width: 20%; + } + .column.is-two-fifths-touch { + flex: none; + width: 40%; + } + .column.is-three-fifths-touch { + flex: none; + width: 60%; + } + .column.is-four-fifths-touch { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-touch { + margin-left: 75%; + } + .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; + } + .column.is-offset-half-touch { + margin-left: 50%; + } + .column.is-offset-one-third-touch { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-touch { + margin-left: 25%; + } + .column.is-offset-one-fifth-touch { + margin-left: 20%; + } + .column.is-offset-two-fifths-touch { + margin-left: 40%; + } + .column.is-offset-three-fifths-touch { + margin-left: 60%; + } + .column.is-offset-four-fifths-touch { + margin-left: 80%; + } + .column.is-0-touch { + flex: none; + width: 0%; + } + .column.is-offset-0-touch { + margin-left: 0%; + } + .column.is-1-touch { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-touch { + margin-left: 8.33333%; + } + .column.is-2-touch { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-touch { + margin-left: 16.66667%; + } + .column.is-3-touch { + flex: none; + width: 25%; + } + .column.is-offset-3-touch { + margin-left: 25%; + } + .column.is-4-touch { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-touch { + margin-left: 33.33333%; + } + .column.is-5-touch { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-touch { + margin-left: 41.66667%; + } + .column.is-6-touch { + flex: none; + width: 50%; + } + .column.is-offset-6-touch { + margin-left: 50%; + } + .column.is-7-touch { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-touch { + margin-left: 58.33333%; + } + .column.is-8-touch { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-touch { + margin-left: 66.66667%; + } + .column.is-9-touch { + flex: none; + width: 75%; + } + .column.is-offset-9-touch { + margin-left: 75%; + } + .column.is-10-touch { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-touch { + margin-left: 83.33333%; + } + .column.is-11-touch { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-touch { + margin-left: 91.66667%; + } + .column.is-12-touch { + flex: none; + width: 100%; + } + .column.is-offset-12-touch { + margin-left: 100%; + } +} +@media screen and (min-width: 1088px) { + .column.is-narrow-desktop { + flex: none; + } + .column.is-full-desktop { + flex: none; + width: 100%; + } + .column.is-three-quarters-desktop { + flex: none; + width: 75%; + } + .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; + } + .column.is-half-desktop { + flex: none; + width: 50%; + } + .column.is-one-third-desktop { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-desktop { + flex: none; + width: 25%; + } + .column.is-one-fifth-desktop { + flex: none; + width: 20%; + } + .column.is-two-fifths-desktop { + flex: none; + width: 40%; + } + .column.is-three-fifths-desktop { + flex: none; + width: 60%; + } + .column.is-four-fifths-desktop { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-desktop { + margin-left: 75%; + } + .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; + } + .column.is-offset-half-desktop { + margin-left: 50%; + } + .column.is-offset-one-third-desktop { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-desktop { + margin-left: 25%; + } + .column.is-offset-one-fifth-desktop { + margin-left: 20%; + } + .column.is-offset-two-fifths-desktop { + margin-left: 40%; + } + .column.is-offset-three-fifths-desktop { + margin-left: 60%; + } + .column.is-offset-four-fifths-desktop { + margin-left: 80%; + } + .column.is-0-desktop { + flex: none; + width: 0%; + } + .column.is-offset-0-desktop { + margin-left: 0%; + } + .column.is-1-desktop { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-desktop { + margin-left: 8.33333%; + } + .column.is-2-desktop { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-desktop { + margin-left: 16.66667%; + } + .column.is-3-desktop { + flex: none; + width: 25%; + } + .column.is-offset-3-desktop { + margin-left: 25%; + } + .column.is-4-desktop { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-desktop { + margin-left: 33.33333%; + } + .column.is-5-desktop { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-desktop { + margin-left: 41.66667%; + } + .column.is-6-desktop { + flex: none; + width: 50%; + } + .column.is-offset-6-desktop { + margin-left: 50%; + } + .column.is-7-desktop { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-desktop { + margin-left: 58.33333%; + } + .column.is-8-desktop { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-desktop { + margin-left: 66.66667%; + } + .column.is-9-desktop { + flex: none; + width: 75%; + } + .column.is-offset-9-desktop { + margin-left: 75%; + } + .column.is-10-desktop { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-desktop { + margin-left: 83.33333%; + } + .column.is-11-desktop { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-desktop { + margin-left: 91.66667%; + } + .column.is-12-desktop { + flex: none; + width: 100%; + } + .column.is-offset-12-desktop { + margin-left: 100%; + } +} +@media screen and (min-width: 1280px) { + .column.is-narrow-widescreen { + flex: none; + } + .column.is-full-widescreen { + flex: none; + width: 100%; + } + .column.is-three-quarters-widescreen { + flex: none; + width: 75%; + } + .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; + } + .column.is-half-widescreen { + flex: none; + width: 50%; + } + .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-widescreen { + flex: none; + width: 25%; + } + .column.is-one-fifth-widescreen { + flex: none; + width: 20%; + } + .column.is-two-fifths-widescreen { + flex: none; + width: 40%; + } + .column.is-three-fifths-widescreen { + flex: none; + width: 60%; + } + .column.is-four-fifths-widescreen { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-widescreen { + margin-left: 75%; + } + .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; + } + .column.is-offset-half-widescreen { + margin-left: 50%; + } + .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-widescreen { + margin-left: 25%; + } + .column.is-offset-one-fifth-widescreen { + margin-left: 20%; + } + .column.is-offset-two-fifths-widescreen { + margin-left: 40%; + } + .column.is-offset-three-fifths-widescreen { + margin-left: 60%; + } + .column.is-offset-four-fifths-widescreen { + margin-left: 80%; + } + .column.is-0-widescreen { + flex: none; + width: 0%; + } + .column.is-offset-0-widescreen { + margin-left: 0%; + } + .column.is-1-widescreen { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-widescreen { + margin-left: 8.33333%; + } + .column.is-2-widescreen { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-widescreen { + margin-left: 16.66667%; + } + .column.is-3-widescreen { + flex: none; + width: 25%; + } + .column.is-offset-3-widescreen { + margin-left: 25%; + } + .column.is-4-widescreen { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-widescreen { + margin-left: 33.33333%; + } + .column.is-5-widescreen { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-widescreen { + margin-left: 41.66667%; + } + .column.is-6-widescreen { + flex: none; + width: 50%; + } + .column.is-offset-6-widescreen { + margin-left: 50%; + } + .column.is-7-widescreen { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-widescreen { + margin-left: 58.33333%; + } + .column.is-8-widescreen { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-widescreen { + margin-left: 66.66667%; + } + .column.is-9-widescreen { + flex: none; + width: 75%; + } + .column.is-offset-9-widescreen { + margin-left: 75%; + } + .column.is-10-widescreen { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-widescreen { + margin-left: 83.33333%; + } + .column.is-11-widescreen { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-widescreen { + margin-left: 91.66667%; + } + .column.is-12-widescreen { + flex: none; + width: 100%; + } + .column.is-offset-12-widescreen { + margin-left: 100%; + } +} +@media screen and (min-width: 1472px) { + .column.is-narrow-fullhd { + flex: none; + } + .column.is-full-fullhd { + flex: none; + width: 100%; + } + .column.is-three-quarters-fullhd { + flex: none; + width: 75%; + } + .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; + } + .column.is-half-fullhd { + flex: none; + width: 50%; + } + .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-fullhd { + flex: none; + width: 25%; + } + .column.is-one-fifth-fullhd { + flex: none; + width: 20%; + } + .column.is-two-fifths-fullhd { + flex: none; + width: 40%; + } + .column.is-three-fifths-fullhd { + flex: none; + width: 60%; + } + .column.is-four-fifths-fullhd { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-fullhd { + margin-left: 75%; + } + .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; + } + .column.is-offset-half-fullhd { + margin-left: 50%; + } + .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-fullhd { + margin-left: 25%; + } + .column.is-offset-one-fifth-fullhd { + margin-left: 20%; + } + .column.is-offset-two-fifths-fullhd { + margin-left: 40%; + } + .column.is-offset-three-fifths-fullhd { + margin-left: 60%; + } + .column.is-offset-four-fifths-fullhd { + margin-left: 80%; + } + .column.is-0-fullhd { + flex: none; + width: 0%; + } + .column.is-offset-0-fullhd { + margin-left: 0%; + } + .column.is-1-fullhd { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-fullhd { + margin-left: 8.33333%; + } + .column.is-2-fullhd { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-fullhd { + margin-left: 16.66667%; + } + .column.is-3-fullhd { + flex: none; + width: 25%; + } + .column.is-offset-3-fullhd { + margin-left: 25%; + } + .column.is-4-fullhd { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-fullhd { + margin-left: 33.33333%; + } + .column.is-5-fullhd { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-fullhd { + margin-left: 41.66667%; + } + .column.is-6-fullhd { + flex: none; + width: 50%; + } + .column.is-offset-6-fullhd { + margin-left: 50%; + } + .column.is-7-fullhd { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-fullhd { + margin-left: 58.33333%; + } + .column.is-8-fullhd { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-fullhd { + margin-left: 66.66667%; + } + .column.is-9-fullhd { + flex: none; + width: 75%; + } + .column.is-offset-9-fullhd { + margin-left: 75%; + } + .column.is-10-fullhd { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-fullhd { + margin-left: 83.33333%; + } + .column.is-11-fullhd { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-fullhd { + margin-left: 91.66667%; + } + .column.is-12-fullhd { + flex: none; + width: 100%; + } + .column.is-offset-12-fullhd { + margin-left: 100%; + } +} +.columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} +.columns:last-child { + margin-bottom: -0.75rem; +} +.columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); +} +.columns.is-centered { + justify-content: center; +} +.columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; +} +.columns.is-gapless > .column { + margin: 0; + padding: 0 !important; +} +.columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; +} +.columns.is-gapless:last-child { + margin-bottom: 0; +} +.columns.is-mobile { + display: flex; +} +.columns.is-multiline { + flex-wrap: wrap; +} +.columns.is-vcentered { + align-items: center; +} +@media screen and (min-width: 769px), print { + .columns:not(.is-desktop) { + display: flex; + } +} +@media screen and (min-width: 1088px) { + .columns.is-desktop { + display: flex; + } +} +.columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); +} +.columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); +} +.columns.is-variable.is-0 { + --columnGap: 0rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-0-mobile { + --columnGap: 0rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-0-tablet { + --columnGap: 0rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-0-touch { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-0-desktop { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; + } +} +.columns.is-variable.is-1 { + --columnGap: 0.25rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; + } +} +.columns.is-variable.is-2 { + --columnGap: 0.5rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; + } +} +.columns.is-variable.is-3 { + --columnGap: 0.75rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; + } +} +.columns.is-variable.is-4 { + --columnGap: 1rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-4-mobile { + --columnGap: 1rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-4-tablet { + --columnGap: 1rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-4-touch { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-4-desktop { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; + } +} +.columns.is-variable.is-5 { + --columnGap: 1.25rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; + } +} +.columns.is-variable.is-6 { + --columnGap: 1.5rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; + } +} +.columns.is-variable.is-7 { + --columnGap: 1.75rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; + } +} +.columns.is-variable.is-8 { + --columnGap: 2rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-8-mobile { + --columnGap: 2rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-8-tablet { + --columnGap: 2rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-8-touch { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-8-desktop { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; + } +} +.tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; +} +.tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} +.tile.is-ancestor:last-child { + margin-bottom: -0.75rem; +} +.tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; +} +.tile.is-child { + margin: 0 !important; +} +.tile.is-parent { + padding: 0.75rem; +} +.tile.is-vertical { + flex-direction: column; +} +.tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; +} +@media screen and (min-width: 769px), print { + .tile:not(.is-child) { + display: flex; + } + .tile.is-1 { + flex: none; + width: 8.33333%; + } + .tile.is-2 { + flex: none; + width: 16.66667%; + } + .tile.is-3 { + flex: none; + width: 25%; + } + .tile.is-4 { + flex: none; + width: 33.33333%; + } + .tile.is-5 { + flex: none; + width: 41.66667%; + } + .tile.is-6 { + flex: none; + width: 50%; + } + .tile.is-7 { + flex: none; + width: 58.33333%; + } + .tile.is-8 { + flex: none; + width: 66.66667%; + } + .tile.is-9 { + flex: none; + width: 75%; + } + .tile.is-10 { + flex: none; + width: 83.33333%; + } + .tile.is-11 { + flex: none; + width: 91.66667%; + } + .tile.is-12 { + flex: none; + width: 100%; + } +} +.hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; +} +.hero .navbar { + background: none; +} +.hero .tabs ul { + border-bottom: none; +} +.hero.is-white { + background-color: #fff; + color: #0a0a0a; +} +.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-white strong { + color: inherit; +} +.hero.is-white .title { + color: #0a0a0a; +} +.hero.is-white .subtitle { + color: rgba(10,10,10,0.9); +} +.hero.is-white .subtitle a:not(.button), +.hero.is-white .subtitle strong { + color: #0a0a0a; +} +@media screen and (max-width: 1087px) { + .hero.is-white .navbar-menu { + background-color: #fff; + } +} +.hero.is-white .navbar-item, +.hero.is-white .navbar-link { + color: rgba(10,10,10,0.7); +} +.hero.is-white a.navbar-item:hover, +.hero.is-white .navbar-link:hover, +.hero.is-white a.navbar-item.is-active, +.hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; +} +.hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; +} +.hero.is-white .tabs a:hover { + opacity: 1; +} +.hero.is-white .tabs li.is-active a { + opacity: 1; +} +.hero.is-white .tabs.is-boxed a, +.hero.is-white .tabs.is-toggle a { + color: #0a0a0a; +} +.hero.is-white .tabs.is-boxed a:hover, +.hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-white .tabs.is-boxed li.is-active a, +.hero.is-white .tabs.is-toggle li.is-active a, +.hero.is-white .tabs.is-boxed li.is-active a:hover, +.hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff; +} +.hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e3 0%, #fff 71%, #fff 100%); +} +@media screen and (max-width: 768px) { + .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e3 0%, #fff 71%, #fff 100%); + } +} +.hero.is-black { + background-color: #0a0a0a; + color: #fff; +} +.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-black strong { + color: inherit; +} +.hero.is-black .title { + color: #fff; +} +.hero.is-black .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-black .subtitle a:not(.button), +.hero.is-black .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-black .navbar-menu { + background-color: #0a0a0a; + } +} +.hero.is-black .navbar-item, +.hero.is-black .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-black a.navbar-item:hover, +.hero.is-black .navbar-link:hover, +.hero.is-black a.navbar-item.is-active, +.hero.is-black .navbar-link.is-active { + background-color: #000; + color: #fff; +} +.hero.is-black .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-black .tabs a:hover { + opacity: 1; +} +.hero.is-black .tabs li.is-active a { + opacity: 1; +} +.hero.is-black .tabs.is-boxed a, +.hero.is-black .tabs.is-toggle a { + color: #fff; +} +.hero.is-black .tabs.is-boxed a:hover, +.hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-black .tabs.is-boxed li.is-active a, +.hero.is-black .tabs.is-toggle li.is-active a, +.hero.is-black .tabs.is-boxed li.is-active a:hover, +.hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #0a0a0a; +} +.hero.is-black.is-bold { + background-image: linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%); +} +@media screen and (max-width: 768px) { + .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%); + } +} +.hero.is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-light strong { + color: inherit; +} +.hero.is-light .title { + color: rgba(0,0,0,0.7); +} +.hero.is-light .subtitle { + color: rgba(0,0,0,0.9); +} +.hero.is-light .subtitle a:not(.button), +.hero.is-light .subtitle strong { + color: rgba(0,0,0,0.7); +} +@media screen and (max-width: 1087px) { + .hero.is-light .navbar-menu { + background-color: #f5f5f5; + } +} +.hero.is-light .navbar-item, +.hero.is-light .navbar-link { + color: rgba(0,0,0,0.7); +} +.hero.is-light a.navbar-item:hover, +.hero.is-light .navbar-link:hover, +.hero.is-light a.navbar-item.is-active, +.hero.is-light .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); +} +.hero.is-light .tabs a { + color: rgba(0,0,0,0.7); + opacity: 0.9; +} +.hero.is-light .tabs a:hover { + opacity: 1; +} +.hero.is-light .tabs li.is-active a { + opacity: 1; +} +.hero.is-light .tabs.is-boxed a, +.hero.is-light .tabs.is-toggle a { + color: rgba(0,0,0,0.7); +} +.hero.is-light .tabs.is-boxed a:hover, +.hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-light .tabs.is-boxed li.is-active a, +.hero.is-light .tabs.is-toggle li.is-active a, +.hero.is-light .tabs.is-boxed li.is-active a:hover, +.hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0,0,0,0.7); + border-color: rgba(0,0,0,0.7); + color: #f5f5f5; +} +.hero.is-light.is-bold { + background-image: linear-gradient(141deg, #dfd8d8 0%, #f5f5f5 71%, #fff 100%); +} +@media screen and (max-width: 768px) { + .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #dfd8d8 0%, #f5f5f5 71%, #fff 100%); + } +} +.hero.is-dark { + background-color: #363636; + color: #fff; +} +.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-dark strong { + color: inherit; +} +.hero.is-dark .title { + color: #fff; +} +.hero.is-dark .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-dark .subtitle a:not(.button), +.hero.is-dark .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-dark .navbar-menu { + background-color: #363636; + } +} +.hero.is-dark .navbar-item, +.hero.is-dark .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-dark a.navbar-item:hover, +.hero.is-dark .navbar-link:hover, +.hero.is-dark a.navbar-item.is-active, +.hero.is-dark .navbar-link.is-active { + background-color: #292929; + color: #fff; +} +.hero.is-dark .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-dark .tabs a:hover { + opacity: 1; +} +.hero.is-dark .tabs li.is-active a { + opacity: 1; +} +.hero.is-dark .tabs.is-boxed a, +.hero.is-dark .tabs.is-toggle a { + color: #fff; +} +.hero.is-dark .tabs.is-boxed a:hover, +.hero.is-dark .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-dark .tabs.is-boxed li.is-active a, +.hero.is-dark .tabs.is-toggle li.is-active a, +.hero.is-dark .tabs.is-boxed li.is-active a:hover, +.hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #363636; +} +.hero.is-dark.is-bold { + background-image: linear-gradient(141deg, #1f1a1a 0%, #363636 71%, #463f3f 100%); +} +@media screen and (max-width: 768px) { + .hero.is-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1f1a1a 0%, #363636 71%, #463f3f 100%); + } +} +.hero.is-primary { + background-color: #3273dc; + color: #fff; +} +.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-primary strong { + color: inherit; +} +.hero.is-primary .title { + color: #fff; +} +.hero.is-primary .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-primary .subtitle a:not(.button), +.hero.is-primary .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-primary .navbar-menu { + background-color: #3273dc; + } +} +.hero.is-primary .navbar-item, +.hero.is-primary .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-primary a.navbar-item:hover, +.hero.is-primary .navbar-link:hover, +.hero.is-primary a.navbar-item.is-active, +.hero.is-primary .navbar-link.is-active { + background-color: #2366d1; + color: #fff; +} +.hero.is-primary .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-primary .tabs a:hover { + opacity: 1; +} +.hero.is-primary .tabs li.is-active a { + opacity: 1; +} +.hero.is-primary .tabs.is-boxed a, +.hero.is-primary .tabs.is-toggle a { + color: #fff; +} +.hero.is-primary .tabs.is-boxed a:hover, +.hero.is-primary .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-primary .tabs.is-boxed li.is-active a, +.hero.is-primary .tabs.is-toggle li.is-active a, +.hero.is-primary .tabs.is-boxed li.is-active a:hover, +.hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #3273dc; +} +.hero.is-primary.is-bold { + background-image: linear-gradient(141deg, #1576c6 0%, #3273dc 71%, #4266e5 100%); +} +@media screen and (max-width: 768px) { + .hero.is-primary.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1576c6 0%, #3273dc 71%, #4266e5 100%); + } +} +.hero.is-link { + background-color: #3273dc; + color: #fff; +} +.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-link strong { + color: inherit; +} +.hero.is-link .title { + color: #fff; +} +.hero.is-link .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-link .subtitle a:not(.button), +.hero.is-link .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-link .navbar-menu { + background-color: #3273dc; + } +} +.hero.is-link .navbar-item, +.hero.is-link .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-link a.navbar-item:hover, +.hero.is-link .navbar-link:hover, +.hero.is-link a.navbar-item.is-active, +.hero.is-link .navbar-link.is-active { + background-color: #2366d1; + color: #fff; +} +.hero.is-link .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-link .tabs a:hover { + opacity: 1; +} +.hero.is-link .tabs li.is-active a { + opacity: 1; +} +.hero.is-link .tabs.is-boxed a, +.hero.is-link .tabs.is-toggle a { + color: #fff; +} +.hero.is-link .tabs.is-boxed a:hover, +.hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-link .tabs.is-boxed li.is-active a, +.hero.is-link .tabs.is-toggle li.is-active a, +.hero.is-link .tabs.is-boxed li.is-active a:hover, +.hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #3273dc; +} +.hero.is-link.is-bold { + background-image: linear-gradient(141deg, #1576c6 0%, #3273dc 71%, #4266e5 100%); +} +@media screen and (max-width: 768px) { + .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1576c6 0%, #3273dc 71%, #4266e5 100%); + } +} +.hero.is-info { + background-color: #3298dc; + color: #fff; +} +.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-info strong { + color: inherit; +} +.hero.is-info .title { + color: #fff; +} +.hero.is-info .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-info .subtitle a:not(.button), +.hero.is-info .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-info .navbar-menu { + background-color: #3298dc; + } +} +.hero.is-info .navbar-item, +.hero.is-info .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-info a.navbar-item:hover, +.hero.is-info .navbar-link:hover, +.hero.is-info a.navbar-item.is-active, +.hero.is-info .navbar-link.is-active { + background-color: #238cd1; + color: #fff; +} +.hero.is-info .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-info .tabs a:hover { + opacity: 1; +} +.hero.is-info .tabs li.is-active a { + opacity: 1; +} +.hero.is-info .tabs.is-boxed a, +.hero.is-info .tabs.is-toggle a { + color: #fff; +} +.hero.is-info .tabs.is-boxed a:hover, +.hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-info .tabs.is-boxed li.is-active a, +.hero.is-info .tabs.is-toggle li.is-active a, +.hero.is-info .tabs.is-boxed li.is-active a:hover, +.hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #3298dc; +} +.hero.is-info.is-bold { + background-image: linear-gradient(141deg, #159cc6 0%, #3298dc 71%, #4289e5 100%); +} +@media screen and (max-width: 768px) { + .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #159cc6 0%, #3298dc 71%, #4289e5 100%); + } +} +.hero.is-success { + background-color: #48c774; + color: #fff; +} +.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-success strong { + color: inherit; +} +.hero.is-success .title { + color: #fff; +} +.hero.is-success .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-success .subtitle a:not(.button), +.hero.is-success .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-success .navbar-menu { + background-color: #48c774; + } +} +.hero.is-success .navbar-item, +.hero.is-success .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-success a.navbar-item:hover, +.hero.is-success .navbar-link:hover, +.hero.is-success a.navbar-item.is-active, +.hero.is-success .navbar-link.is-active { + background-color: #3abb67; + color: #fff; +} +.hero.is-success .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-success .tabs a:hover { + opacity: 1; +} +.hero.is-success .tabs li.is-active a { + opacity: 1; +} +.hero.is-success .tabs.is-boxed a, +.hero.is-success .tabs.is-toggle a { + color: #fff; +} +.hero.is-success .tabs.is-boxed a:hover, +.hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-success .tabs.is-boxed li.is-active a, +.hero.is-success .tabs.is-toggle li.is-active a, +.hero.is-success .tabs.is-boxed li.is-active a:hover, +.hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #48c774; +} +.hero.is-success.is-bold { + background-image: linear-gradient(141deg, #29b342 0%, #48c774 71%, #56d296 100%); +} +@media screen and (max-width: 768px) { + .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #29b342 0%, #48c774 71%, #56d296 100%); + } +} +.hero.is-warning { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-warning strong { + color: inherit; +} +.hero.is-warning .title { + color: rgba(0,0,0,0.7); +} +.hero.is-warning .subtitle { + color: rgba(0,0,0,0.9); +} +.hero.is-warning .subtitle a:not(.button), +.hero.is-warning .subtitle strong { + color: rgba(0,0,0,0.7); +} +@media screen and (max-width: 1087px) { + .hero.is-warning .navbar-menu { + background-color: #ffdd57; + } +} +.hero.is-warning .navbar-item, +.hero.is-warning .navbar-link { + color: rgba(0,0,0,0.7); +} +.hero.is-warning a.navbar-item:hover, +.hero.is-warning .navbar-link:hover, +.hero.is-warning a.navbar-item.is-active, +.hero.is-warning .navbar-link.is-active { + background-color: #ffd83d; + color: rgba(0,0,0,0.7); +} +.hero.is-warning .tabs a { + color: rgba(0,0,0,0.7); + opacity: 0.9; +} +.hero.is-warning .tabs a:hover { + opacity: 1; +} +.hero.is-warning .tabs li.is-active a { + opacity: 1; +} +.hero.is-warning .tabs.is-boxed a, +.hero.is-warning .tabs.is-toggle a { + color: rgba(0,0,0,0.7); +} +.hero.is-warning .tabs.is-boxed a:hover, +.hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-warning .tabs.is-boxed li.is-active a, +.hero.is-warning .tabs.is-toggle li.is-active a, +.hero.is-warning .tabs.is-boxed li.is-active a:hover, +.hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0,0,0,0.7); + border-color: rgba(0,0,0,0.7); + color: #ffdd57; +} +.hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); +} +@media screen and (max-width: 768px) { + .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); + } +} +.hero.is-danger { + background-color: #f14668; + color: #fff; +} +.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-danger strong { + color: inherit; +} +.hero.is-danger .title { + color: #fff; +} +.hero.is-danger .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-danger .subtitle a:not(.button), +.hero.is-danger .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-danger .navbar-menu { + background-color: #f14668; + } +} +.hero.is-danger .navbar-item, +.hero.is-danger .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-danger a.navbar-item:hover, +.hero.is-danger .navbar-link:hover, +.hero.is-danger a.navbar-item.is-active, +.hero.is-danger .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; +} +.hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-danger .tabs a:hover { + opacity: 1; +} +.hero.is-danger .tabs li.is-active a { + opacity: 1; +} +.hero.is-danger .tabs.is-boxed a, +.hero.is-danger .tabs.is-toggle a { + color: #fff; +} +.hero.is-danger .tabs.is-boxed a:hover, +.hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-danger .tabs.is-boxed li.is-active a, +.hero.is-danger .tabs.is-toggle li.is-active a, +.hero.is-danger .tabs.is-boxed li.is-active a:hover, +.hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #f14668; +} +.hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #fa0a61 0%, #f14668 71%, #f7595f 100%); +} +@media screen and (max-width: 768px) { + .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #fa0a61 0%, #f14668 71%, #f7595f 100%); + } +} +.hero.is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.hero.is-grey-lightest a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-grey-lightest strong { + color: inherit; +} +.hero.is-grey-lightest .title { + color: #363636; +} +.hero.is-grey-lightest .subtitle { + color: rgba(54,54,54,0.9); +} +.hero.is-grey-lightest .subtitle a:not(.button), +.hero.is-grey-lightest .subtitle strong { + color: #363636; +} +@media screen and (max-width: 1087px) { + .hero.is-grey-lightest .navbar-menu { + background-color: #ededed; + } +} +.hero.is-grey-lightest .navbar-item, +.hero.is-grey-lightest .navbar-link { + color: rgba(54,54,54,0.7); +} +.hero.is-grey-lightest a.navbar-item:hover, +.hero.is-grey-lightest .navbar-link:hover, +.hero.is-grey-lightest a.navbar-item.is-active, +.hero.is-grey-lightest .navbar-link.is-active { + background-color: #e0e0e0; + color: #363636; +} +.hero.is-grey-lightest .tabs a { + color: #363636; + opacity: 0.9; +} +.hero.is-grey-lightest .tabs a:hover { + opacity: 1; +} +.hero.is-grey-lightest .tabs li.is-active a { + opacity: 1; +} +.hero.is-grey-lightest .tabs.is-boxed a, +.hero.is-grey-lightest .tabs.is-toggle a { + color: #363636; +} +.hero.is-grey-lightest .tabs.is-boxed a:hover, +.hero.is-grey-lightest .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-grey-lightest .tabs.is-boxed li.is-active a, +.hero.is-grey-lightest .tabs.is-toggle li.is-active a, +.hero.is-grey-lightest .tabs.is-boxed li.is-active a:hover, +.hero.is-grey-lightest .tabs.is-toggle li.is-active a:hover { + background-color: #363636; + border-color: #363636; + color: #ededed; +} +.hero.is-grey-lightest.is-bold { + background-image: linear-gradient(141deg, #d8cfcf 0%, #ededed 71%, #faf9f9 100%); +} +@media screen and (max-width: 768px) { + .hero.is-grey-lightest.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #d8cfcf 0%, #ededed 71%, #faf9f9 100%); + } +} +.hero.is-small .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; +} +@media screen and (min-width: 769px), print { + .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; + } +} +@media screen and (min-width: 769px), print { + .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; + } +} +.hero.is-halfheight .hero-body, +.hero.is-fullheight .hero-body, +.hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; +} +.hero.is-halfheight .hero-body > .container, +.hero.is-fullheight .hero-body > .container, +.hero.is-fullheight-with-navbar .hero-body > .container { + flex-grow: 1; + flex-shrink: 1; +} +.hero.is-halfheight { + min-height: 50vh; +} +.hero.is-fullheight { + min-height: 100vh; +} +.hero-video { + overflow: hidden; +} +.hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); +} +.hero-video.is-transparent { + opacity: 0.3; +} +@media screen and (max-width: 768px) { + .hero-video { + display: none; + } +} +.hero-buttons { + margin-top: 1.5rem; +} +@media screen and (max-width: 768px) { + .hero-buttons .button { + display: flex; + } + .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; + } +} +@media screen and (min-width: 769px), print { + .hero-buttons { + display: flex; + justify-content: center; + } + .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; + } +} +.hero-head, +.hero-foot { + flex-grow: 0; + flex-shrink: 0; +} +.hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; +} +.section { + padding: 3rem 1.5rem; +} +@media screen and (min-width: 1088px) { + .section.is-medium { + padding: 9rem 1.5rem; + } + .section.is-large { + padding: 18rem 1.5rem; + } +} +.footer { + background-color: #fff; + padding: 3rem 1.5rem 6rem; +} +html { + height: 100%; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-size-adjust: 100%; +} +body { + min-height: 100%; + display: flex; + flex-direction: column; +} +body > .section { + flex-grow: 1; +} +::-webkit-scrollbar { + width: 10px; + height: 8px; +} +::-webkit-scrollbar-track { + border-radius: 3px; + background: rgba(0,0,0,0.06); + box-shadow: inset 0 0 5px rgba(0,0,0,0.1); +} +::-webkit-scrollbar-thumb { + border-radius: 3px; + background: rgba(0,0,0,0.12); + box-shadow: inset 0 0 10px rgba(0,0,0,0.2); +} +::-webkit-scrollbar-thumb:hover { + background: rgba(0,0,0,0.24); +} +.ml-0, +.mx-0 { + margin-left: 0 !important; +} +.mr-0, +.mx-0 { + margin-right: 0 !important; +} +.ml-n0, +.mx-n0 { + margin-left: 0 !important; +} +.mr-n0, +.mx-n0 { + margin-right: 0 !important; +} +.mt-0, +.my-0 { + margin-top: 0 !important; +} +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} +.mt-n0, +.my-n0 { + margin-top: 0 !important; +} +.mb-n0, +.my-n0 { + margin-bottom: 0 !important; +} +.pl-0, +.px-0 { + padding-left: 0 !important; +} +.pr-0, +.px-0 { + padding-right: 0 !important; +} +.pl-n0, +.px-n0 { + padding-left: 0 !important; +} +.pr-n0, +.px-n0 { + padding-right: 0 !important; +} +.pt-0, +.py-0 { + padding-top: 0 !important; +} +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} +.pt-n0, +.py-n0 { + padding-top: 0 !important; +} +.pb-n0, +.py-n0 { + padding-bottom: 0 !important; +} +.ml-1, +.mx-1, +.article-licensing .licensing-meta .icons .icon { + margin-left: 0.25rem !important; +} +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} +.mb-1, +.my-1, +.article-licensing .licensing-title p:not(:last-child) { + margin-bottom: 0.25rem !important; +} +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} +.pl-n1, +.px-n1 { + padding-left: -0.25rem !important; +} +.pr-n1, +.px-n1 { + padding-right: -0.25rem !important; +} +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} +.pt-n1, +.py-n1 { + padding-top: -0.25rem !important; +} +.pb-n1, +.py-n1 { + padding-bottom: -0.25rem !important; +} +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} +.pl-n2, +.px-n2 { + padding-left: -0.5rem !important; +} +.pr-n2, +.px-n2 { + padding-right: -0.5rem !important; +} +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} +.pt-n2, +.py-n2 { + padding-top: -0.5rem !important; +} +.pb-n2, +.py-n2 { + padding-bottom: -0.5rem !important; +} +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} +.mt-3, +.my-3 { + margin-top: 1rem !important; +} +.mb-3, +.my-3, +.article-licensing .licensing-title { + margin-bottom: 1rem !important; +} +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} +.pl-3, +.px-3 { + padding-left: 1rem !important; +} +.pr-3, +.px-3 { + padding-right: 1rem !important; +} +.pl-n3, +.px-n3 { + padding-left: -1rem !important; +} +.pr-n3, +.px-n3 { + padding-right: -1rem !important; +} +.pt-3, +.py-3 { + padding-top: 1rem !important; +} +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} +.pt-n3, +.py-n3 { + padding-top: -1rem !important; +} +.pb-n3, +.py-n3 { + padding-bottom: -1rem !important; +} +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} +.mr-4, +.mx-4, +.article-licensing .licensing-meta .level-item { + margin-right: 1.5rem !important; +} +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} +.pl-n4, +.px-n4 { + padding-left: -1.5rem !important; +} +.pr-n4, +.px-n4 { + padding-right: -1.5rem !important; +} +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} +.pt-n4, +.py-n4 { + padding-top: -1.5rem !important; +} +.pb-n4, +.py-n4 { + padding-bottom: -1.5rem !important; +} +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} +.mt-5, +.my-5 { + margin-top: 3rem !important; +} +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} +.pl-5, +.px-5 { + padding-left: 3rem !important; +} +.pr-5, +.px-5 { + padding-right: 3rem !important; +} +.pl-n5, +.px-n5 { + padding-left: -3rem !important; +} +.pr-n5, +.px-n5 { + padding-right: -3rem !important; +} +.pt-5, +.py-5 { + padding-top: 3rem !important; +} +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} +.pt-n5, +.py-n5 { + padding-top: -3rem !important; +} +.pb-n5, +.py-n5 { + padding-bottom: -3rem !important; +} +.ml-auto, +.mx-auto { + margin-left: auto !important; +} +.mr-auto, +.mx-auto { + margin-right: auto !important; +} +.mt-auto, +.my-auto { + margin-top: auto !important; +} +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} +.pl-auto, +.px-auto { + margin-left: auto !important; +} +.pr-auto, +.px-auto { + margin-right: auto !important; +} +.pt-auto, +.py-auto { + margin-top: auto !important; +} +.pb-auto, +.py-auto { + margin-bottom: auto !important; +} +.order-0 { + order: 0 !important; +} +.order-1 { + order: 1 !important; +} +.order-2 { + order: 2 !important; +} +.order-3 { + order: 3 !important; +} +.order-4 { + order: 4 !important; +} +.order-5 { + order: 5 !important; +} +.justify-content-start { + justify-content: start !important; +} +.justify-content-center { + justify-content: center !important; +} +.flex-shrink-1 { + flex-shrink: 1 !important; +} +.link-muted { + color: inherit; + transition: 0.2s ease; +} +.link-muted:hover { + color: #3273dc !important; +} +.image.is-7by3 { + padding-top: 42.8%; +} +.image.is-7by3 img { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.image .avatar { + height: 100%; + object-fit: cover; +} +.image .fill { + object-fit: cover; + width: 100% !important; + height: 100% !important; +} +.button.is-transparent { + color: inherit; + background: transparent; + border-color: transparent; +} +.card { + overflow: visible; + border-radius: 4px; +} +.card:hover { + box-shadow: 0 6px 15px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.1); +} +.card + .card, +.card + .column-right-shadow { + margin-top: 1.5rem; +} +.card .card-image { + overflow: hidden; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.card .media + .media { + border: none; + margin-top: 0; +} +article.media { + color: #7a7a7a; +} +article.media a { + color: inherit; +} +article.media a:hover { + color: #3273dc; +} +article.media .image { + width: 64px; + height: 64px; +} +article.media .image img { + object-fit: cover; + width: 100%; + height: 100%; +} +article.media .title { + margin-bottom: 0.25em; +} +article.media .media-content { + color: #7a7a7a; +} +article.media .media-content .title { + margin: 0; + line-height: inherit; +} +article.article { + padding: 1.5rem 1.8rem; +} +article.article .title { + margin: 0 0 0.5rem -0.1rem !important; +} +article.article .title .fas { + margin-right: 0.5rem; +} +article.article .article-meta, +article.article .article-tags { + color: #7a7a7a; +} +article.article .article-meta { + overflow-x: auto; + margin-bottom: 1.5rem !important; +} +article.article .article-meta >:first-child { + flex-wrap: wrap; + width: 100%; +} +article.article .article-meta >:first-child >* { + flex-grow: 0 !important; +} +article.article .content { + word-wrap: break-word; + font-size: 1.1rem; + letter-spacing: 0.02rem; +} +article.article .content h1 { + font-size: 1.75em; +} +article.article .content h2 { + font-size: 1.5em; +} +article.article .content h3 { + font-size: 1.25em; +} +article.article .content h4 { + font-size: 1.125em; +} +article.article .content h5 { + font-size: 1em; +} +article.article .content pre { + font-size: 0.95em; +} +article.article .content code { + font-size: 0.95em; + padding: 0; + background: transparent; + overflow-wrap: break-word; +} +article.article .content blockquote.pullquote { + float: right; + max-width: 50%; + font-size: 1.15rem; + position: relative; +} +article.article .content blockquote footer strong + cite { + margin-left: 0.5em; +} +article.article .content .message.message-immersive { + border-radius: 0; + margin: 0 -1.8rem 1.5rem -1.8rem; +} +article.article .content .message.message-immersive .message-body { + border: none; +} +article.article .article-tags { + display: flex; + flex-wrap: wrap; +} +.rtl { + direction: rtl; +} +.rtl .level .level-item:not(:last-child), +.rtl .level.is-mobile .level-item:not(:last-child) { + margin-left: 0.75rem; + margin-right: 0; +} +.table-overflow { + overflow-x: auto; +} +.table-overflow table { + width: auto !important; +} +.table-overflow table th { + word-break: keep-all; +} +.video-container { + position: relative; + padding-bottom: 56.25%; + padding-top: 25px; + height: 0; +} +.video-container iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.article-licensing { + position: relative; + z-index: 1; + box-shadow: none; + background: #f5f5f5; + border-radius: 4px; + overflow: hidden; +} +.article-licensing:after { + position: absolute; + z-index: -1; + right: -50px; + top: -87.87px; + content: '\f25e'; + font-size: 200px; + font-family: 'Font Awesome 5 Brands'; + opacity: 0.1; +} +.article-licensing .level-left { + flex-wrap: wrap; + max-width: 100%; +} +.article-licensing .licensing-title { + line-height: 1.2; +} +.article-licensing .licensing-meta .icons .icon { + width: 1.2em; + height: 1.2em; + font-size: 1.2em; + vertical-align: bottom; +} +.article-licensing .licensing-meta a { + color: inherit; +} +a.article-nav-prev span { + text-align: left; + flex-shrink: 1; + word-wrap: break-word; + white-space: normal; +} +a.article-nav-next span { + text-align: right; + flex-shrink: 1; + word-wrap: break-word; + white-space: normal; +} +.article { + counter-reset: section; +} +.article h2 { + counter-reset: sub-section; +} +.article h3 { + counter-reset: composite; +} +.article h4 { + counter-reset: detail; +} +.article h2:before { + content: counter(section) " "; + counter-increment: section; +} +.article h3:before { + content: counter(section) "." counter(sub-section) " "; + counter-increment: sub-section; +} +.article h4:before { + content: counter(section) "." counter(sub-section) "." counter(composite) " "; + counter-increment: composite; +} +.navbar-main { + box-shadow: 0 4px 10px rgba(0,0,0,0.05); +} +.navbar-main .navbar-container { + overflow-x: auto; +} +.navbar-main .navbar-menu, +.navbar-main .navbar-start, +.navbar-main .navbar-end { + align-items: stretch; + display: flex; + padding: 0; + flex-shrink: 0; +} +.navbar-main .navbar-menu { + flex-grow: 1; + flex-shrink: 0; + overflow-x: auto; +} +.navbar-main .navbar-start { + justify-content: flex-start; + margin-right: auto; +} +.navbar-main .navbar-end { + justify-content: flex-end; + margin-left: auto; +} +.navbar-main .navbar-item { + display: flex; + align-items: center; + padding: 1.25rem 0.75rem; + margin: 0 0; +} +.navbar-main .navbar-item.is-active { + background-color: transparent; +} +@media screen and (max-width: 1087px) { + .navbar-main .navbar-menu { + justify-content: center; + box-shadow: none; + } + .navbar-main .navbar-start { + margin-right: 0; + } + .navbar-main .navbar-end { + margin-left: 0; + } +} +.navbar-logo img { + max-height: 2.5rem; +} +@media screen and (min-width: 1088px) { + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: 0rem; + } +} +footer.footer { + padding: 1.5rem; +} +@media screen and (max-width: 768px) { + footer.footer .level-start { + text-align: center; + } +} +footer.footer .level-end .field { + flex-wrap: wrap; + align-items: center; +} +@media screen and (max-width: 768px) { + footer.footer .level-end .field { + justify-content: center; + margin-top: 1rem; + } +} +.footer-logo img { + max-height: 2.5rem; +} +.pagination { + margin-top: 1.5rem; +} +.pagination .pagination-link a, +.pagination .pagination-ellipsis a, +.pagination .pagination-previous a, +.pagination .pagination-next a { + color: #363636; +} +.pagination .pagination-link, +.pagination .pagination-previous, +.pagination .pagination-next { + border: none; + background: #fff; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); +} +.pagination .pagination-link.is-current { + background: #3273dc; +} +.post-navigation { + color: #7a7a7a; + flex-wrap: wrap; + justify-content: space-around; +} +.post-navigation .level-item { + margin-bottom: 0; +} +.timeline { + margin-left: 1rem; + padding: 1rem 0 0 1.5rem; + border-left: 1px solid #dbdbdb; +} +.timeline .media { + position: relative; +} +.timeline .media:before, +.timeline .media:last-child:after { + content: ''; + display: block; + position: absolute; + left: calc(-0.375rem - 1.5rem - 0.25px); +} +.timeline .media:before { + width: 0.75rem; + height: 0.75rem; + top: calc(1rem + 1.5 * 0.85rem / 2 - 0.75rem / 2); + background: #dbdbdb; + border-radius: 50%; +} +.timeline .media:first-child:before { + top: calc(1.5 * 0.85rem / 2 - 0.75rem / 2); +} +.timeline .media:last-child:after { + width: 0.75rem; + top: calc(1rem + 1.5 * 0.85rem / 2 + 0.75rem / 2); + bottom: 0; + background: #fff; +} +.timeline .media:first-child:last-child:after { + top: calc(1.5 * 0.85rem / 2 + 0.75rem / 2); +} +.searchbox { + display: none; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; + font-size: 1rem; + line-height: 0; + background: rgba(10,10,10,0.86); +} +.searchbox.show { + display: flex; +} +.searchbox a, +.searchbox a:hover { + color: inherit; + text-decoration: none; +} +.searchbox input { + font-size: 1rem; + border: none; + outline: none; + box-shadow: none; + border-radius: 0; +} +.searchbox, +.searchbox .searchbox-container { + position: fixed; + align-items: center; + flex-direction: column; + line-height: 1.25em; +} +.searchbox .searchbox-container { + z-index: 101; + display: flex; + overflow: hidden; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); + border-radius: 4px; + background-color: #f5f5f5; + width: 540px; + top: 100px; + bottom: 100px; +} +.searchbox .searchbox-header, +.searchbox .searchbox-body, +.searchbox .searchbox-footer { + width: 100%; +} +.searchbox .searchbox-header { + display: flex; + flex-direction: row; + line-height: 1.5em; + font-weight: normal; + background-color: #fff; + min-height: 3rem; +} +.searchbox .searchbox-input-container { + display: flex; + flex-grow: 1; +} +.searchbox .searchbox-input { + flex-grow: 1; + color: inherit; + box-sizing: border-box; + padding: 0.75em 0 0.75em 1.25em; + background: #fff; +} +.searchbox .searchbox-close { + display: inline-block; + font-size: 1.5em; + padding: 0.5em 0.75em; + cursor: pointer; +} +.searchbox .searchbox-close:hover { + background: #f5f5f5; +} +.searchbox .searchbox-close:active { + background: #dbdbdb; +} +.searchbox .searchbox-body { + flex-grow: 1; + overflow-y: auto; + border-top: 1px solid #dbdbdb; +} +.searchbox .searchbox-result-section header, +.searchbox .searchbox-result-item { + padding: 0.75em 1em; +} +.searchbox .searchbox-result-section { + border-bottom: 1px solid #dbdbdb; +} +.searchbox .searchbox-result-section header { + color: #b5b5b5; +} +.searchbox .searchbox-result-item { + display: flex; + flex-direction: row; +} +.searchbox .searchbox-result-item:not(.disabled):not(.active):not(:active):hover { + background-color: #fff; +} +.searchbox .searchbox-result-item:active, +.searchbox .searchbox-result-item.active { + color: #fff; + background-color: #3273dc; +} +.searchbox .searchbox-result-item em { + font-style: normal; + background: #ffdd57; +} +.searchbox .searchbox-result-icon { + margin-right: 1em; +} +.searchbox .searchbox-result-content { + overflow: hidden; +} +.searchbox .searchbox-result-title, +.searchbox .searchbox-result-preview { + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.searchbox .searchbox-result-title-secondary { + color: #b5b5b5; +} +.searchbox .searchbox-result-preview { + margin-top: 0.25em; +} +.searchbox .searchbox-result-item:not(:active):not(.active) .searchbox-result-preview { + color: #b5b5b5; +} +.searchbox .searchbox-footer { + padding: 0.5em 1em; +} +.searchbox .searchbox-pagination { + margin: 0; + padding: 0; + list-style: none; + text-align: center; +} +.searchbox .searchbox-pagination .searchbox-pagination-item { + margin: 0 0.25rem; +} +.searchbox .searchbox-pagination .searchbox-pagination-item, +.searchbox .searchbox-pagination .searchbox-pagination-link { + display: inline-block; +} +.searchbox .searchbox-pagination .searchbox-pagination-link { + overflow: hidden; + padding: 0.5em 0.8em; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); + border-radius: 4px; + background-color: #fff; +} +.searchbox .searchbox-pagination .searchbox-pagination-item.active .searchbox-pagination-link { + color: #fff; + background-color: #3273dc; +} +.searchbox .searchbox-pagination .searchbox-pagination-item.disabled .searchbox-pagination-link { + cursor: not-allowed; + background-color: #f5f5f5; +} +.searchbox .searchbox-pagination .searchbox-pagination-item:not(.active):not(.disabled) .searchbox-pagination-link:hover { + background-color: #f5f5f5; +} +@media screen and (max-width: 559px), screen and (max-height: 479px) { + .searchbox .searchbox-container { + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 0; + } +} +div.highlight-tree td.code pre { + font-family: Consolas, Menlo, Courier, monospace !important; + font-size: 0.9em; +} +figure.highlight { + padding: 0; + width: 100%; + position: relative; + margin: 1em 0 1em !important; + border-radius: 4px; +} +figure.highlight span.fold { + width: 18px; +} +figure.highlight.folded .highlight-body { + height: 0; +} +figure.highlight .copy { + opacity: 0.7; +} +figure.highlight pre, +figure.highlight table tr:hover { + color: inherit; + background: transparent; +} +figure.highlight table { + width: auto; +} +figure.highlight table tr td { + border: none; +} +figure.highlight table tr:not(:first-child) td { + padding-top: 0; +} +figure.highlight table tr:not(:last-child) td { + padding-bottom: 0; +} +figure.highlight pre { + padding: 0; + overflow: visible; +} +figure.highlight pre .line, +figure.highlight pre code .hljs { + line-height: 1.5rem; +} +figure.highlight figcaption, +figure.highlight .gutter { + background: rgba(200,200,200,0.15); +} +figure.highlight figcaption { + margin: 0 !important; + padding: 0.3em 0em 0.3em 0.75em; + font-style: normal; + font-size: 0.8em; +} +figure.highlight figcaption * { + color: inherit; +} +figure.highlight figcaption span { + font-weight: 500; + font-family: 'Source Code Pro', monospace, 'Microsoft YaHei'; +} +figure.highlight figcaption .level-left *:not(:last-child) { + margin-right: 0.5em; +} +figure.highlight figcaption .level-right *:not(:first-child) { + margin-left: 0.5em; +} +figure.highlight figcaption .fold { + cursor: pointer; +} +figure.highlight figcaption.level { + overflow: auto; +} +figure.highlight figcaption.level .level-right a { + padding: 0em 0.75em; +} +figure.highlight .highlight-body { + overflow: auto; +} +figure.highlight .gutter { + text-align: right; +} +figure.highlight .tag, +figure.highlight .title, +figure.highlight .number, +figure.highlight .section { + display: inherit; + font: inherit; + margin: inherit; + padding: inherit; + background: inherit; + height: inherit; + text-align: inherit; + vertical-align: inherit; + min-width: inherit; + border-radius: inherit; +} +figure.highlight.foldable div.level-left { + cursor: pointer; +} +.gist table tr:hover { + background: transparent; +} +.gist table td { + border: none; +} +.gist .file { + all: initial; +} +.widget .menu-list li ul { + margin-right: 0; +} +.widget .menu-list .level { + margin-bottom: 0; +} +.widget .menu-list .level .level-left, +.widget .menu-list .level .level-right, +.widget .menu-list .level .level-item { + flex-shrink: 1; +} +.widget .menu-list .level .level-left, +.widget .menu-list .level .level-right { + align-items: flex-start; +} +.widget .menu-list .tag { + background: $light-grey; + color: $white-invert; +} +.widget .tags .tag:first-child { + background: #3273dc; + color: #fff; +} +.widget .tags .tag:last-child { + background: $light-grey; + color: $white-invert; +} +#toc { + max-height: calc(100vh - 22px); + overflow-y: scroll; +} +.level.is-multiline { + flex-wrap: wrap; +} +@media screen and (max-width: 768px) { + .widget.card#toc { + display: none; + position: fixed; + margin: 1rem; + left: 0; + right: 0; + bottom: 0; + z-index: 100; + } + .widget.card#toc .card-content { + padding: 0; + } + .widget.card#toc .menu { + padding: 1.5rem; + max-height: calc(100vh - 2rem); + overflow-y: auto; + } + #toc-mask { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 99; + background: rgba(0,0,0,0.7); + } + .widget.card#toc.is-active, + #toc-mask.is-active { + display: block; + } +} +.donate { + position: relative; +} +.donate .qrcode { + display: none; + position: absolute; + z-index: 99; + bottom: 2.5em; + line-height: 0; + overflow: hidden; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); + border-radius: 4px; +} +.donate .qrcode img { + max-width: 280px; +} +.donate:hover .qrcode { + display: block; +} +.donate:first-child:not(:last-child) .qrcode { + left: -0.75rem; +} +.donate:last-child:not(:first-child) .qrcode { + right: -0.75rem; +} +.donate[data-type="afdian"] { + color: #fff; + background-color: #885fd9; + border-color: transparent; +} +.donate[data-type="afdian"]:active { + background-color: #794ad4; +} +.donate[data-type="afdian"]:hover { + background-color: #8055d7; +} +.donate[data-type="afdian"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(136,95,217,0.25); +} +.donate[data-type="alipay"] { + color: #fff; + background-color: #00a0e8; + border-color: transparent; +} +.donate[data-type="alipay"]:active { + background-color: #008ecf; +} +.donate[data-type="alipay"]:hover { + background-color: #0097db; +} +.donate[data-type="alipay"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0,160,232,0.25); +} +.donate[data-type="buymeacoffee"] { + color: rgba(0,0,0,0.7); + background-color: #fd0; + border-color: transparent; +} +.donate[data-type="buymeacoffee"]:active { + background-color: #e6c700; +} +.donate[data-type="buymeacoffee"]:hover { + background-color: #f2d200; +} +.donate[data-type="buymeacoffee"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,221,0,0.25); +} +.donate[data-type="paypal"] { + color: rgba(0,0,0,0.7); + background-color: #feb700; + border-color: transparent; +} +.donate[data-type="paypal"]:active { + background-color: #e5a500; +} +.donate[data-type="paypal"]:hover { + background-color: #f1ae00; +} +.donate[data-type="paypal"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(254,183,0,0.25); +} +.donate[data-type="patreon"] { + color: #fff; + background-color: #ff424d; + border-color: transparent; +} +.donate[data-type="patreon"]:active { + background-color: #ff2835; +} +.donate[data-type="patreon"]:hover { + background-color: #ff3541; +} +.donate[data-type="patreon"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,66,77,0.25); +} +.donate[data-type="wechat"] { + color: #fff; + background-color: #1aad19; + border-color: transparent; +} +.donate[data-type="wechat"]:active { + background-color: #179716; +} +.donate[data-type="wechat"]:hover { + background-color: #18a217; +} +.donate[data-type="wechat"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(26,173,25,0.25); +} +#back-to-top { + position: fixed; + opacity: 0; + outline: none; + padding: 8px 0; + line-height: 24px; + border-radius: 4px; + transform: translateY(120px); + transition: 0.4s ease opacity, 0.4s ease width, 0.4s ease transform, 0.4s ease border-radius; +} +#back-to-top.is-rounded { + border-radius: 50%; +} +#back-to-top.fade-in { + opacity: 1; +} +#back-to-top.rise-up { + transform: translateY(0); +} +.gallery-item .caption { + color: #7a7a7a; +} +.pace { + user-select: none; + pointer-events: none; +} +.pace .pace-progress { + top: 0; + right: 100%; + width: 100%; + height: 2px; + z-index: 2000; + position: fixed; + background: #3273dc; +} +.pace-inactive { + display: none; +} +.fa, +.fab, +.fal, +.far, +.fas { + line-height: inherit; +} +.MathJax, +.MathJax_Display, +.MJXc-display, +.MathJax_SVG_Display, +.katex-display { + overflow-x: auto; + overflow-y: hidden; +} +.katex { + white-space: nowrap; +} +.katex-display { + margin-top: -1em !important; +} +.katex-html { + padding-top: 1em; +} +.katex-html .tag { + align-items: unset; + background-color: unset; + border-radius: unset; + color: unset; + display: unset; + font-size: unset; + height: unset; + justify-content: unset; + line-height: unset; + padding-left: unset; + padding-right: unset; + white-space: unset; +} +.cc-window, +.cc-revoke { + font-size: 1.1rem !important; + font-family: Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.cc-window { + color: #4a4a4a !important; + background-color: #fff !important; +} +.cc-window.cc-floating { + border-radius: 4px; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); +} +.cc-window.cc-banner { + background-color: #f9f9f9 !important; +} +.cc-window.cc-theme-block .cc-compliance > .cc-btn, +.cc-window.cc-theme-classic .cc-compliance > .cc-btn { + border-radius: 290486px; +} +.cc-window .cc-compliance > .cc-btn { + font-weight: 400; + border: none; + color: #fff; + background-color: #3273dc; +} +.cc-window .cc-compliance > .cc-btn:hover, +.cc-window .cc-compliance > .cc-btn:focus { + background-color: #276cda; +} +.cc-window .cc-compliance > .cc-btn.cc-deny:hover { + color: #3273dc; + text-decoration: none; +} +.cc-revoke { + padding: 0.5rem 1rem !important; + color: #fff !important; + background-color: #3273dc !important; +} +.cc-revoke:hover { + text-decoration: none !important; + background-color: #276cda; +} +@media screen and (min-width: 1280px) { + .is-3-column .container { + max-width: 1216px; + width: 1216px; + } + .is-1-column .container, + .is-2-column .container { + max-width: 960px; + width: 960px; + } +} +@media screen and (min-width: 1472px) { + .is-3-column .container { + max-width: 1344px; + width: 1344px; + } + .is-2-column .container { + max-width: 1152px; + width: 1152px; + } + .is-1-column .container { + max-width: 960px; + width: 960px; + } +} +@media screen and (min-width: 769px), print { + .is-sticky { + position: -webkit-sticky; + position: sticky; + top: 1.5rem; + z-index: 99; + } + .column-main.is-sticky, + .column-left.is-sticky, + .column-right.is-sticky, + .column-right-shadow.is-sticky { + top: 0.75rem; + align-self: flex-start; + } +} +@media screen and (max-width: 768px) { + .section { + padding: 1.5rem 1rem; + } +} +.navbar-logo .logo-img-dark, +.footer-logo .logo-img-dark { + display: none; +} +body.night { + background: #0e1225; +} +body.night .hljs { + display: block; + overflow-x: auto; + color: #abb2bf; + background: #282c34; +} +body.night .hljs-comment, +body.night .hljs-quote { + color: #5c6370; + font-style: italic; +} +body.night .hljs-doctag, +body.night .hljs-keyword, +body.night .hljs-formula { + color: #c678dd; +} +body.night .hljs-section, +body.night .hljs-name, +body.night .hljs-selector-tag, +body.night .hljs-deletion, +body.night .hljs-subst { + color: #e06c75; +} +body.night .hljs-literal { + color: #56b6c2; +} +body.night .hljs-string, +body.night .hljs-regexp, +body.night .hljs-addition, +body.night .hljs-attribute, +body.night .hljs-meta-string { + color: #98c379; +} +body.night .hljs-built_in, +body.night .hljs-class .hljs-title { + color: #e6c07b; +} +body.night .hljs-attr, +body.night .hljs-variable, +body.night .hljs-template-variable, +body.night .hljs-type, +body.night .hljs-selector-class, +body.night .hljs-selector-attr, +body.night .hljs-selector-pseudo, +body.night .hljs-number { + color: #d19a66; +} +body.night .hljs-symbol, +body.night .hljs-bullet, +body.night .hljs-link, +body.night .hljs-meta, +body.night .hljs-selector-id, +body.night .hljs-title { + color: #61aeee; +} +body.night .hljs-emphasis { + font-style: italic; +} +body.night .hljs-strong { + font-weight: bold; +} +body.night .hljs-link { + text-decoration: underline; +} +body.night .content code { + color: #cbba7d; +} +body.night #night-nav #night-icon:before { + content: '\f0eb'; +} +body.night img, +body.night video, +body.night iframe, +body.night .waifu, +body.night .donate { + filter: brightness(0.8); + -webkit-filter: brightness(0.8); +} +body.night .navbar-logo .logo-img, +body.night .footer-logo .logo-img { + display: none; +} +body.night .navbar-logo .logo-img-dark, +body.night .footer-logo .logo-img-dark { + display: inline-block; +} +body.night .navbar-main .navbar-menu .navbar-item:hover, +body.night .navbar-main .navbar-menu .navbar-item:focus { + color: #fff; + background-color: #373d48; +} +body.night .navbar-main .navbar-menu .navbar-item.is-active { + color: #c0c0c0; +} +body.night .navbar { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); +} +body.night .card { + background-color: rgba(40,44,52,0.5); + backdrop-filter: none; + -webkit-backdrop-filter: none; +} +body.night .card:hover { + background-color: rgba(40,44,52,0.8); +} +body.night .card .breadcrumb li.is-active a { + color: #c0c0c0; +} +body.night .footer { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); +} +body.night .input, +body.night .textarea { + background-color: #434a56; + border-color: #373d48; +} +body.night .button.is-primary, +body.night .button.is-light, +body.night .button.is-small { + background-color: #373d48; + color: #c0c0c0; +} +body.night .button.is-primary:hover, +body.night .button.is-light:hover, +body.night .button.is-small:hover, +body.night .button.is-primary.is-hovered, +body.night .button.is-light.is-hovered, +body.night .button.is-small.is-hovered { + color: #fff; + background-color: #434a56; +} +body.night .button.is-primary:active, +body.night .button.is-light:active, +body.night .button.is-small:active, +body.night .button.is-primary.is-active, +body.night .button.is-light.is-active, +body.night .button.is-small.is-active { + color: #fff; + background-color: #2c313a; +} +body.night .button.is-white, +body.night .button.is-transparent { + background-color: transparent; +} +body.night .button.is-white:hover, +body.night .button.is-transparent:hover { + background-color: #373d48 !important; +} +body.night .pagination .pagination-next, +body.night .pagination .pagination-previous, +body.night .pagination-link:not(.is-current) { + color: #c0c0c0; + background-color: #373d48; +} +body.night .pagination .pagination-next a, +body.night .pagination .pagination-previous a, +body.night .pagination-link:not(.is-current) a { + color: #c0c0c0; +} +body.night .pagination-link.is-current { + background-color: #434a56; + border-color: #434a56; +} +body.night [data-waline] .wl-wrap, +body.night [data-waline] .wl-wrap .wl-header .wl-input { + border-color: #373d48; +} +body.night [data-waline] .wl-wrap .wl-header .wl-input:focus { + border-color: #434a56; +} +body.night [data-waline] .wl-btn { + color: #c0c0c0; + background-color: #373d48; + border-color: #373d48; +} +body.night [data-waline] .wl-btn:hover { + background-color: #434a56; +} +body.night [data-waline] .wl-btn:active { + background-color: #2c313a; +} +body.night [data-waline] .wl-list .wl-card .wl-head .wl-sys { + background-color: #373d48; +} +body.night [data-waline] a:hover, +body.night [data-waline] .wl-list .wl-card .wl-h .wl-meta .wl-at { + color: #fff; +} +body.night [data-waline] .wl-list .wl-card .wl-content.expand:before { + background: -webkit-gradient(linear, left top, left bottom, , to(#252936)); + background: linear-gradient(180deg, rgba(37,41,54,0), #252936); +} +body.night [data-waline] .wl-list .wl-card .wl-content.expand:after { + background: #252936; +} +body.night [data-waline] .wl-list .wl-card .wl-h, +body.night [data-waline] .wl-list .wl-card .wl-quote { + border-color: #434a56; +} +body.night body, +body.night strong, +body.night time, +body.night .title, +body.night .footer, +body.night .card, +body.night .content h1, +body.night .content h2, +body.night .content h3, +body.night .content h4, +body.night .content h5, +body.night .content h6, +body.night .navbar-item, +body.night .navbar-item.is-active, +body.night .navbar-link, +body.night .menu-list a, +body.night .menu-label, +body.night .level-item, +body.night .input, +body.night .textarea, +body.night .button.is-white, +body.night .button.is-transparent, +body.night .article-licensing, +body.night [data-waline] * { + color: #c0c0c0; +} +body.night .media-content, +body.night .has-text-grey, +body.night .link-muted { + color: #c0c0c0 !important; +} +body.night a { + color: #5299e0; +} +body.night a:hover { + color: #fff; +} +body.night .timeline a, +body.night [data-type="recent-posts"] a { + color: #c0c0c0; +} +body.night .timeline a:hover, +body.night [data-type="recent-posts"] a:hover { + color: #fff; +} +body.night .content blockquote, +body.night .article-licensing { + background-color: #373d48; + border-color: #434a56; +} +body.night .content table thead td, +body.night .content table thead th { + color: #c0c0c0; +} +body.night .content table td, +body.night .content table th { + border-color: #434a56; +} +body.night hr { + background-color: #434a56; +} +body.night article.article .title a, +body.night article.media .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #c0c0c0 1px); +} +body.night article.article .title:hover a, +body.night article.media .title:hover a { + color: #c0c0c0 !important; +} +body.night .tag:not(body) { + color: #c0c0c0; + background-color: #373d48; +} +body.night .widget .tags .tag:first-child, +body.night .tag.is-grey { + background-color: #434a56; +} +body.night .menu-list a:hover { + background-color: #373d48; +} +body.night .menu-list a.is-active { + background-color: #434a56; +} +body.night .menu-list li ul { + border-color: #373d48; +} +body.night .timeline .media:last-child:after { + background-color: #252936; +} +body.night .timeline { + border-color: #434a56; +} +body.night .timeline .media:before { + background-color: #434a56; +} +body.night .searchbox .searchbox-container, +body.night .searchbox .searchbox-header, +body.night .searchbox .searchbox-header .searchbox-input, +body.night .searchbox .searchbox-header .searchbox-close, +body.night .searchbox .searchbox-body, +body.night .searchbox .searchbox-result-section, +body.night .searchbox .searchbox-result-item { + color: #c0c0c0; + background-color: #373d48; + border-color: #434a56; +} +body.night .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item:hover, +body.night .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item.active, +body.night .searchbox .searchbox-container .searchbox-header .searchbox-close:hover { + color: #fff; + background-color: #434a56; +} +body.night ::selection { + color: #fff; + background-color: rgba(52,109,167,0.8); +} +body.night ::-moz-selection { + color: #fff; + background-color: rgba(52,109,167,0.8); +} +body.night input:-webkit-autofill { + -webkit-text-fill-color: #c0c0c0 !important; + box-shadow: 0 0 0px 1000px #373d48 inset; +} +body.night .twikoo pre { + background-color: #373d48; +} +body.night .twikoo code { + color: #cbba7d; + background-color: #373d48; +} +@media (prefers-color-scheme: dark) { + body:not(.light) { + background: #0e1225; + } + body:not(.light) .hljs { + display: block; + overflow-x: auto; + color: #abb2bf; + background: #282c34; + } + body:not(.light) .hljs-comment, + body:not(.light) .hljs-quote { + color: #5c6370; + font-style: italic; + } + body:not(.light) .hljs-doctag, + body:not(.light) .hljs-keyword, + body:not(.light) .hljs-formula { + color: #c678dd; + } + body:not(.light) .hljs-section, + body:not(.light) .hljs-name, + body:not(.light) .hljs-selector-tag, + body:not(.light) .hljs-deletion, + body:not(.light) .hljs-subst { + color: #e06c75; + } + body:not(.light) .hljs-literal { + color: #56b6c2; + } + body:not(.light) .hljs-string, + body:not(.light) .hljs-regexp, + body:not(.light) .hljs-addition, + body:not(.light) .hljs-attribute, + body:not(.light) .hljs-meta-string { + color: #98c379; + } + body:not(.light) .hljs-built_in, + body:not(.light) .hljs-class .hljs-title { + color: #e6c07b; + } + body:not(.light) .hljs-attr, + body:not(.light) .hljs-variable, + body:not(.light) .hljs-template-variable, + body:not(.light) .hljs-type, + body:not(.light) .hljs-selector-class, + body:not(.light) .hljs-selector-attr, + body:not(.light) .hljs-selector-pseudo, + body:not(.light) .hljs-number { + color: #d19a66; + } + body:not(.light) .hljs-symbol, + body:not(.light) .hljs-bullet, + body:not(.light) .hljs-link, + body:not(.light) .hljs-meta, + body:not(.light) .hljs-selector-id, + body:not(.light) .hljs-title { + color: #61aeee; + } + body:not(.light) .hljs-emphasis { + font-style: italic; + } + body:not(.light) .hljs-strong { + font-weight: bold; + } + body:not(.light) .hljs-link { + text-decoration: underline; + } + body:not(.light) .content code { + color: #cbba7d; + } + body:not(.light) #night-nav #night-icon:before { + content: '\f0eb'; + } + body:not(.light) img, + body:not(.light) video, + body:not(.light) iframe, + body:not(.light) .waifu, + body:not(.light) .donate { + filter: brightness(0.8); + -webkit-filter: brightness(0.8); + } + body:not(.light) .navbar-logo .logo-img, + body:not(.light) .footer-logo .logo-img { + display: none; + } + body:not(.light) .navbar-logo .logo-img-dark, + body:not(.light) .footer-logo .logo-img-dark { + display: inline-block; + } + body:not(.light) .navbar-main .navbar-menu .navbar-item:hover, + body:not(.light) .navbar-main .navbar-menu .navbar-item:focus { + color: #fff; + background-color: #373d48; + } + body:not(.light) .navbar-main .navbar-menu .navbar-item.is-active { + color: #c0c0c0; + } + body:not(.light) .navbar { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); + } + body:not(.light) .card { + background-color: rgba(40,44,52,0.5); + backdrop-filter: none; + -webkit-backdrop-filter: none; + } + body:not(.light) .card:hover { + background-color: rgba(40,44,52,0.8); + } + body:not(.light) .card .breadcrumb li.is-active a { + color: #c0c0c0; + } + body:not(.light) .footer { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); + } + body:not(.light) .input, + body:not(.light) .textarea { + background-color: #434a56; + border-color: #373d48; + } + body:not(.light) .button.is-primary, + body:not(.light) .button.is-light, + body:not(.light) .button.is-small { + background-color: #373d48; + color: #c0c0c0; + } + body:not(.light) .button.is-primary:hover, + body:not(.light) .button.is-light:hover, + body:not(.light) .button.is-small:hover, + body:not(.light) .button.is-primary.is-hovered, + body:not(.light) .button.is-light.is-hovered, + body:not(.light) .button.is-small.is-hovered { + color: #fff; + background-color: #434a56; + } + body:not(.light) .button.is-primary:active, + body:not(.light) .button.is-light:active, + body:not(.light) .button.is-small:active, + body:not(.light) .button.is-primary.is-active, + body:not(.light) .button.is-light.is-active, + body:not(.light) .button.is-small.is-active { + color: #fff; + background-color: #2c313a; + } + body:not(.light) .button.is-white, + body:not(.light) .button.is-transparent { + background-color: transparent; + } + body:not(.light) .button.is-white:hover, + body:not(.light) .button.is-transparent:hover { + background-color: #373d48 !important; + } + body:not(.light) .pagination .pagination-next, + body:not(.light) .pagination .pagination-previous, + body:not(.light) .pagination-link:not(.is-current) { + color: #c0c0c0; + background-color: #373d48; + } + body:not(.light) .pagination .pagination-next a, + body:not(.light) .pagination .pagination-previous a, + body:not(.light) .pagination-link:not(.is-current) a { + color: #c0c0c0; + } + body:not(.light) .pagination-link.is-current { + background-color: #434a56; + border-color: #434a56; + } + body:not(.light) [data-waline] .wl-wrap, + body:not(.light) [data-waline] .wl-wrap .wl-header .wl-input { + border-color: #373d48; + } + body:not(.light) [data-waline] .wl-wrap .wl-header .wl-input:focus { + border-color: #434a56; + } + body:not(.light) [data-waline] .wl-btn { + color: #c0c0c0; + background-color: #373d48; + border-color: #373d48; + } + body:not(.light) [data-waline] .wl-btn:hover { + background-color: #434a56; + } + body:not(.light) [data-waline] .wl-btn:active { + background-color: #2c313a; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-head .wl-sys { + background-color: #373d48; + } + body:not(.light) [data-waline] a:hover, + body:not(.light) [data-waline] .wl-list .wl-card .wl-h .wl-meta .wl-at { + color: #fff; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-content.expand:before { + background: -webkit-gradient(linear, left top, left bottom, , to(#252936)); + background: linear-gradient(180deg, rgba(37,41,54,0), #252936); + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-content.expand:after { + background: #252936; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-h, + body:not(.light) [data-waline] .wl-list .wl-card .wl-quote { + border-color: #434a56; + } + body:not(.light) body, + body:not(.light) strong, + body:not(.light) time, + body:not(.light) .title, + body:not(.light) .footer, + body:not(.light) .card, + body:not(.light) .content h1, + body:not(.light) .content h2, + body:not(.light) .content h3, + body:not(.light) .content h4, + body:not(.light) .content h5, + body:not(.light) .content h6, + body:not(.light) .navbar-item, + body:not(.light) .navbar-item.is-active, + body:not(.light) .navbar-link, + body:not(.light) .menu-list a, + body:not(.light) .menu-label, + body:not(.light) .level-item, + body:not(.light) .input, + body:not(.light) .textarea, + body:not(.light) .button.is-white, + body:not(.light) .button.is-transparent, + body:not(.light) .article-licensing, + body:not(.light) [data-waline] * { + color: #c0c0c0; + } + body:not(.light) .media-content, + body:not(.light) .has-text-grey, + body:not(.light) .link-muted { + color: #c0c0c0 !important; + } + body:not(.light) a { + color: #5299e0; + } + body:not(.light) a:hover { + color: #fff; + } + body:not(.light) .timeline a, + body:not(.light) [data-type="recent-posts"] a { + color: #c0c0c0; + } + body:not(.light) .timeline a:hover, + body:not(.light) [data-type="recent-posts"] a:hover { + color: #fff; + } + body:not(.light) .content blockquote, + body:not(.light) .article-licensing { + background-color: #373d48; + border-color: #434a56; + } + body:not(.light) .content table thead td, + body:not(.light) .content table thead th { + color: #c0c0c0; + } + body:not(.light) .content table td, + body:not(.light) .content table th { + border-color: #434a56; + } + body:not(.light) hr { + background-color: #434a56; + } + body:not(.light) article.article .title a, + body:not(.light) article.media .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #c0c0c0 1px); + } + body:not(.light) article.article .title:hover a, + body:not(.light) article.media .title:hover a { + color: #c0c0c0 !important; + } + body:not(.light) .tag:not(body) { + color: #c0c0c0; + background-color: #373d48; + } + body:not(.light) .widget .tags .tag:first-child, + body:not(.light) .tag.is-grey { + background-color: #434a56; + } + body:not(.light) .menu-list a:hover { + background-color: #373d48; + } + body:not(.light) .menu-list a.is-active { + background-color: #434a56; + } + body:not(.light) .menu-list li ul { + border-color: #373d48; + } + body:not(.light) .timeline .media:last-child:after { + background-color: #252936; + } + body:not(.light) .timeline { + border-color: #434a56; + } + body:not(.light) .timeline .media:before { + background-color: #434a56; + } + body:not(.light) .searchbox .searchbox-container, + body:not(.light) .searchbox .searchbox-header, + body:not(.light) .searchbox .searchbox-header .searchbox-input, + body:not(.light) .searchbox .searchbox-header .searchbox-close, + body:not(.light) .searchbox .searchbox-body, + body:not(.light) .searchbox .searchbox-result-section, + body:not(.light) .searchbox .searchbox-result-item { + color: #c0c0c0; + background-color: #373d48; + border-color: #434a56; + } + body:not(.light) .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item:hover, + body:not(.light) .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item.active, + body:not(.light) .searchbox .searchbox-container .searchbox-header .searchbox-close:hover { + color: #fff; + background-color: #434a56; + } + body:not(.light) ::selection { + color: #fff; + background-color: rgba(52,109,167,0.8); + } + body:not(.light) ::-moz-selection { + color: #fff; + background-color: rgba(52,109,167,0.8); + } + body:not(.light) input:-webkit-autofill { + -webkit-text-fill-color: #c0c0c0 !important; + box-shadow: 0 0 0px 1000px #373d48 inset; + } + body:not(.light) .twikoo pre { + background-color: #373d48; + } + body:not(.light) .twikoo code { + color: #cbba7d; + background-color: #373d48; + } +} +.heimu { + color: #7a7a7a; + background-color: #7a7a7a; +} +.heimu:hover { + color: #fff; +} +.navbar-main, +.card { + transition: background-color 0.2s ease-out !important; +} +body, +hr, +.button, +.tag, +.level, +.box, +.wl-panel, +.wl-meta span, +[data-waline] pre { + transition: background-color 0.2s ease-out; +} +img, +ul, +.highlight, +code, +p, +i { + transition: 0.2s ease-out; +} +.navbar-main .navbar-menu { + background-color: transparent; +} +.navbar-main .navbar-menu .navbar-item.is-active { + color: inherit; + font-weight: bold; +} +.card { + overflow: visible; + background-color: rgba(255,255,255,0.95); +} +.card:hover { + background-color: #fff; +} +.card.card-transparent { + background-color: transparent !important; +} +.card.card-transparent .level-start, +.card.card-transparent .level-end { + overflow: hidden; +} +.footer a:not(.button) { + color: inherit; +} +.footer a:not(.button):hover { + text-decoration: underline; +} +article .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #3273dc 1px); + background-repeat: no-repeat; + background-size: 0 100%; + transition: 0.2s ease-in-out !important; +} +article .title:hover a { + color: #3273dc; + background-size: 100% 100%; +} +pre, +code { + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +article.article .content pre, +article.article .content code { + font-size: 0.96em; +} +:root { + --waline-theme-color: #3273dc !important; + --waline-active-color: #2366d1 !important; + --waline-code-bgcolor: #f8f8f8 !important; + --waline-badge-color: #27ae60 !important; +} +body.night { + --waline-white: #c0c0c0 !important; + --waline-theme-color: #373d48 !important; + --waline-active-color: #434a56 !important; + --waline-bgcolor: rgba(40,44,52,0.5) !important; + --waline-bgcolor-light: rgba(40,44,52,0.8) !important; + --waline-code-bgcolor: #282c34 !important; + --waline-border-color: #434a56 !important; + --waline-badge-color: #373d48 !important; + --waline-border: 1px solid var(--waline-border-color) !important; +} +[data-waline] pre::-webkit-scrollbar-track { + background: rgba(0,0,0,0.06) !important; + box-shadow: inset 0 0 5px rgba(0,0,0,0.1) !important; +} +[data-waline] pre::-webkit-scrollbar-thumb { + background: rgba(0,0,0,0.12) !important; + box-shadow: inset 0 0 10px rgba(0,0,0,0.2) !important; +} +[data-waline] pre::-webkit-scrollbar-thumb:hover { + background: rgba(0,0,0,0.24) !important; +} +body:not(.night) [data-waline] .token { + all: unset; +} +body:not(.night) [data-waline] pre code { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body:not(.night) [data-waline] pre[class*=language-] { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body:not(.night) [data-waline] .token.comment, +body:not(.night) [data-waline] .token.prolog, +body:not(.night) [data-waline] .token.cdata { + color: #a0a1a7; +} +body:not(.night) [data-waline] .token.doctype, +body:not(.night) [data-waline] .token.punctuation, +body:not(.night) [data-waline] .token.entity { + color: #383a42; +} +body:not(.night) [data-waline] .token.attr-name, +body:not(.night) [data-waline] .token.class-name, +body:not(.night) [data-waline] .token.boolean, +body:not(.night) [data-waline] .token.constant, +body:not(.night) [data-waline] .token.number, +body:not(.night) [data-waline] .token.atrule { + color: #b76b01; +} +body:not(.night) [data-waline] .token.keyword { + color: #a626a4; +} +body:not(.night) [data-waline] .token.property, +body:not(.night) [data-waline] .token.tag, +body:not(.night) [data-waline] .token.symbol, +body:not(.night) [data-waline] .token.deleted, +body:not(.night) [data-waline] .token.important { + color: #e45649; +} +body:not(.night) [data-waline] .token.selector, +body:not(.night) [data-waline] .token.string, +body:not(.night) [data-waline] .token.char, +body:not(.night) [data-waline] .token.builtin, +body:not(.night) [data-waline] .token.inserted, +body:not(.night) [data-waline] .token.regex, +body:not(.night) [data-waline] .token.attr-value, +body:not(.night) [data-waline] .token.attr-value > .token.punctuation { + color: #50a14f; +} +body:not(.night) [data-waline] .token.variable, +body:not(.night) [data-waline] .token.operator, +body:not(.night) [data-waline] .token.function { + color: #4078f2; +} +body:not(.night) [data-waline] .token.url { + color: #0184bc; +} +body:not(.night) [data-waline] .token.attr-value > .token.punctuation.attr-equals, +body:not(.night) [data-waline] .token.special-attr > .token.attr-value > .token.value.css { + color: #383a42; +} +body:not(.night) [data-waline] .language-css .token.selector { + color: #e45649; +} +body:not(.night) [data-waline] .language-css .token.property { + color: #383a42; +} +body:not(.night) [data-waline] .language-css .token.function, +body:not(.night) [data-waline] .language-css .token.url > .token.function { + color: #0184bc; +} +body:not(.night) [data-waline] .language-css .token.url > .token.string.url { + color: #50a14f; +} +body:not(.night) [data-waline] .language-css .token.important, +body:not(.night) [data-waline] .language-css .token.atrule .token.rule { + color: #a626a4; +} +body:not(.night) [data-waline] .language-javascript .token.operator { + color: #a626a4; +} +body:not(.night) [data-waline] .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { + color: #ca1243; +} +body:not(.night) [data-waline] .language-json .token.operator { + color: #383a42; +} +body:not(.night) [data-waline] .language-json .token.null.keyword { + color: #b76b01; +} +body:not(.night) [data-waline] .language-markdown .token.url, +body:not(.night) [data-waline] .language-markdown .token.url > .token.operator, +body:not(.night) [data-waline] .language-markdown .token.url-reference.url > .token.string { + color: #383a42; +} +body:not(.night) [data-waline] .language-markdown .token.url > .token.content { + color: #4078f2; +} +body:not(.night) [data-waline] .language-markdown .token.url > .token.url, +body:not(.night) [data-waline] .language-markdown .token.url-reference.url { + color: #0184bc; +} +body:not(.night) [data-waline] .language-markdown .token.blockquote.punctuation, +body:not(.night) [data-waline] .language-markdown .token.hr.punctuation { + color: #a0a1a7; + font-style: italic; +} +body:not(.night) [data-waline] .language-markdown .token.code-snippet { + color: #50a14f; +} +body:not(.night) [data-waline] .language-markdown .token.bold .token.content { + color: #b76b01; +} +body:not(.night) [data-waline] .language-markdown .token.italic .token.content { + color: #a626a4; +} +body:not(.night) [data-waline] .language-markdown .token.strike .token.content, +body:not(.night) [data-waline] .language-markdown .token.strike .token.punctuation, +body:not(.night) [data-waline] .language-markdown .token.list.punctuation, +body:not(.night) [data-waline] .language-markdown .token.title.important > .token.punctuation { + color: #e45649; +} +body:not(.night) [data-waline] .token.bold { + font-weight: bold; +} +body:not(.night) [data-waline] .token.comment, +body:not(.night) [data-waline] .token.italic { + font-style: italic; +} +body:not(.night) [data-waline] .token.entity { + cursor: help; +} +body:not(.night) [data-waline] .token.namespace { + opacity: 0.8; +} +body.night [data-waline] .token { + all: unset; +} +body.night [data-waline] pre code { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body.night [data-waline] pre[class*=language-] { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body.night [data-waline] .token.comment, +body.night [data-waline] .token.prolog, +body.night [data-waline] .token.cdata { + color: #5c6370; +} +body.night [data-waline] .token.doctype, +body.night [data-waline] .token.punctuation, +body.night [data-waline] .token.entity { + color: #abb2bf; +} +body.night [data-waline] .token.attr-name, +body.night [data-waline] .token.class-name, +body.night [data-waline] .token.boolean, +body.night [data-waline] .token.constant, +body.night [data-waline] .token.number, +body.night [data-waline] .token.atrule { + color: #d19a66; +} +body.night [data-waline] .token.keyword { + color: #c678dd; +} +body.night [data-waline] .token.property, +body.night [data-waline] .token.tag, +body.night [data-waline] .token.symbol, +body.night [data-waline] .token.deleted, +body.night [data-waline] .token.important { + color: #e06c75; +} +body.night [data-waline] .token.selector, +body.night [data-waline] .token.string, +body.night [data-waline] .token.char, +body.night [data-waline] .token.builtin, +body.night [data-waline] .token.inserted, +body.night [data-waline] .token.regex, +body.night [data-waline] .token.attr-value, +body.night [data-waline] .token.attr-value > .token.punctuation { + color: #98c379; +} +body.night [data-waline] .token.variable, +body.night [data-waline] .token.operator, +body.night [data-waline] .token.function { + color: #61afef; +} +body.night [data-waline] .token.url { + color: #56b6c2; +} +body.night [data-waline] .token.attr-value > .token.punctuation.attr-equals, +body.night [data-waline] .token.special-attr > .token.attr-value > .token.value.css { + color: #abb2bf; +} +body.night [data-waline] .language-css .token.selector { + color: #e06c75; +} +body.night [data-waline] .language-css .token.property { + color: #abb2bf; +} +body.night [data-waline] .language-css .token.function, +body.night [data-waline] .language-css .token.url > .token.function { + color: #56b6c2; +} +body.night [data-waline] .language-css .token.url > .token.string.url { + color: #98c379; +} +body.night [data-waline] .language-css .token.important, +body.night [data-waline] .language-css .token.atrule .token.rule { + color: #c678dd; +} +body.night [data-waline] .language-javascript .token.operator { + color: #c678dd; +} +body.night [data-waline] .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { + color: #be5046; +} +body.night [data-waline] .language-json .token.operator { + color: #abb2bf; +} +body.night [data-waline] .language-json .token.null.keyword { + color: #d19a66; +} +body.night [data-waline] .language-markdown .token.url, +body.night [data-waline] .language-markdown .token.url > .token.operator, +body.night [data-waline] .language-markdown .token.url-reference.url > .token.string { + color: #abb2bf; +} +body.night [data-waline] .language-markdown .token.url > .token.content { + color: #61afef; +} +body.night [data-waline] .language-markdown .token.url > .token.url, +body.night [data-waline] .language-markdown .token.url-reference.url { + color: #56b6c2; +} +body.night [data-waline] .language-markdown .token.blockquote.punctuation, +body.night [data-waline] .language-markdown .token.hr.punctuation { + color: #5c6370; + font-style: italic; +} +body.night [data-waline] .language-markdown .token.code-snippet { + color: #98c379; +} +body.night [data-waline] .language-markdown .token.bold .token.content { + color: #d19a66; +} +body.night [data-waline] .language-markdown .token.italic .token.content { + color: #c678dd; +} +body.night [data-waline] .language-markdown .token.strike .token.content, +body.night [data-waline] .language-markdown .token.strike .token.punctuation, +body.night [data-waline] .language-markdown .token.list.punctuation, +body.night [data-waline] .language-markdown .token.title.important > .token.punctuation { + color: #e06c75; +} +body.night [data-waline] .token.bold { + font-weight: bold; +} +body.night [data-waline] .token.comment, +body.night [data-waline] .token.italic { + font-style: italic; +} +body.night [data-waline] .token.entity { + cursor: help; +} +body.night [data-waline] .token.namespace { + opacity: 0.8; +} diff --git a/css/night.css b/css/night.css new file mode 100644 index 0000000..58740d5 --- /dev/null +++ b/css/night.css @@ -0,0 +1,680 @@ +.navbar-logo .logo-img-dark, +.footer-logo .logo-img-dark { + display: none; +} +body.night { + background: #0e1225; +} +body.night .hljs { + display: block; + overflow-x: auto; + color: #abb2bf; + background: #282c34; +} +body.night .hljs-comment, +body.night .hljs-quote { + color: #5c6370; + font-style: italic; +} +body.night .hljs-doctag, +body.night .hljs-keyword, +body.night .hljs-formula { + color: #c678dd; +} +body.night .hljs-section, +body.night .hljs-name, +body.night .hljs-selector-tag, +body.night .hljs-deletion, +body.night .hljs-subst { + color: #e06c75; +} +body.night .hljs-literal { + color: #56b6c2; +} +body.night .hljs-string, +body.night .hljs-regexp, +body.night .hljs-addition, +body.night .hljs-attribute, +body.night .hljs-meta-string { + color: #98c379; +} +body.night .hljs-built_in, +body.night .hljs-class .hljs-title { + color: #e6c07b; +} +body.night .hljs-attr, +body.night .hljs-variable, +body.night .hljs-template-variable, +body.night .hljs-type, +body.night .hljs-selector-class, +body.night .hljs-selector-attr, +body.night .hljs-selector-pseudo, +body.night .hljs-number { + color: #d19a66; +} +body.night .hljs-symbol, +body.night .hljs-bullet, +body.night .hljs-link, +body.night .hljs-meta, +body.night .hljs-selector-id, +body.night .hljs-title { + color: #61aeee; +} +body.night .hljs-emphasis { + font-style: italic; +} +body.night .hljs-strong { + font-weight: bold; +} +body.night .hljs-link { + text-decoration: underline; +} +body.night .content code { + color: #cbba7d; +} +body.night #night-nav #night-icon:before { + content: '\f0eb'; +} +body.night img, +body.night video, +body.night iframe, +body.night .waifu, +body.night .donate { + filter: brightness(0.8); + -webkit-filter: brightness(0.8); +} +body.night .navbar-logo .logo-img, +body.night .footer-logo .logo-img { + display: none; +} +body.night .navbar-logo .logo-img-dark, +body.night .footer-logo .logo-img-dark { + display: inline-block; +} +body.night .navbar-main .navbar-menu .navbar-item:hover, +body.night .navbar-main .navbar-menu .navbar-item:focus { + color: #fff; + background-color: #373d48; +} +body.night .navbar-main .navbar-menu .navbar-item.is-active { + color: #c0c0c0; +} +body.night .navbar { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); +} +body.night .card { + background-color: rgba(40,44,52,0.5); + backdrop-filter: none; + -webkit-backdrop-filter: none; +} +body.night .card:hover { + background-color: rgba(40,44,52,0.8); +} +body.night .card .breadcrumb li.is-active a { + color: #c0c0c0; +} +body.night .footer { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); +} +body.night .input, +body.night .textarea { + background-color: #434a56; + border-color: #373d48; +} +body.night .button.is-primary, +body.night .button.is-light, +body.night .button.is-small { + background-color: #373d48; + color: #c0c0c0; +} +body.night .button.is-primary:hover, +body.night .button.is-light:hover, +body.night .button.is-small:hover, +body.night .button.is-primary.is-hovered, +body.night .button.is-light.is-hovered, +body.night .button.is-small.is-hovered { + color: #fff; + background-color: #434a56; +} +body.night .button.is-primary:active, +body.night .button.is-light:active, +body.night .button.is-small:active, +body.night .button.is-primary.is-active, +body.night .button.is-light.is-active, +body.night .button.is-small.is-active { + color: #fff; + background-color: #2c313a; +} +body.night .button.is-white, +body.night .button.is-transparent { + background-color: transparent; +} +body.night .button.is-white:hover, +body.night .button.is-transparent:hover { + background-color: #373d48 !important; +} +body.night .pagination .pagination-next, +body.night .pagination .pagination-previous, +body.night .pagination-link:not(.is-current) { + color: #c0c0c0; + background-color: #373d48; +} +body.night .pagination .pagination-next a, +body.night .pagination .pagination-previous a, +body.night .pagination-link:not(.is-current) a { + color: #c0c0c0; +} +body.night .pagination-link.is-current { + background-color: #434a56; + border-color: #434a56; +} +body.night [data-waline] .wl-wrap, +body.night [data-waline] .wl-wrap .wl-header .wl-input { + border-color: #373d48; +} +body.night [data-waline] .wl-wrap .wl-header .wl-input:focus { + border-color: #434a56; +} +body.night [data-waline] .wl-btn { + color: #c0c0c0; + background-color: #373d48; + border-color: #373d48; +} +body.night [data-waline] .wl-btn:hover { + background-color: #434a56; +} +body.night [data-waline] .wl-btn:active { + background-color: #2c313a; +} +body.night [data-waline] .wl-list .wl-card .wl-head .wl-sys { + background-color: #373d48; +} +body.night [data-waline] a:hover, +body.night [data-waline] .wl-list .wl-card .wl-h .wl-meta .wl-at { + color: #fff; +} +body.night [data-waline] .wl-list .wl-card .wl-content.expand:before { + background: -webkit-gradient(linear, left top, left bottom, from(rgba(37,41,54,0)), to(#252936)); + background: linear-gradient(180deg, rgba(37,41,54,0), #252936); +} +body.night [data-waline] .wl-list .wl-card .wl-content.expand:after { + background: #252936; +} +body.night [data-waline] .wl-list .wl-card .wl-h, +body.night [data-waline] .wl-list .wl-card .wl-quote { + border-color: #434a56; +} +body.night body, +body.night strong, +body.night time, +body.night .title, +body.night .footer, +body.night .card, +body.night .content h1, +body.night .content h2, +body.night .content h3, +body.night .content h4, +body.night .content h5, +body.night .content h6, +body.night .navbar-item, +body.night .navbar-item.is-active, +body.night .navbar-link, +body.night .menu-list a, +body.night .menu-label, +body.night .level-item, +body.night .input, +body.night .textarea, +body.night .button.is-white, +body.night .button.is-transparent, +body.night .article-licensing, +body.night [data-waline] * { + color: #c0c0c0; +} +body.night .media-content, +body.night .has-text-grey, +body.night .link-muted { + color: #c0c0c0 !important; +} +body.night a { + color: #5299e0; +} +body.night a:hover { + color: #fff; +} +body.night .timeline a, +body.night [data-type="recent-posts"] a { + color: #c0c0c0; +} +body.night .timeline a:hover, +body.night [data-type="recent-posts"] a:hover { + color: #fff; +} +body.night .content blockquote, +body.night .article-licensing { + background-color: #373d48; + border-color: #434a56; +} +body.night .content table thead td, +body.night .content table thead th { + color: #c0c0c0; +} +body.night .content table td, +body.night .content table th { + border-color: #434a56; +} +body.night hr { + background-color: #434a56; +} +body.night article.article .title a, +body.night article.media .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #c0c0c0 1px); +} +body.night article.article .title:hover a, +body.night article.media .title:hover a { + color: #c0c0c0 !important; +} +body.night .tag:not(body) { + color: #c0c0c0; + background-color: #373d48; +} +body.night .widget .tags .tag:first-child, +body.night .tag.is-grey { + background-color: #434a56; +} +body.night .menu-list a:hover { + background-color: #373d48; +} +body.night .menu-list a.is-active { + background-color: #434a56; +} +body.night .menu-list li ul { + border-color: #373d48; +} +body.night .timeline .media:last-child:after { + background-color: #252936; +} +body.night .timeline { + border-color: #434a56; +} +body.night .timeline .media:before { + background-color: #434a56; +} +body.night .searchbox .searchbox-container, +body.night .searchbox .searchbox-header, +body.night .searchbox .searchbox-header .searchbox-input, +body.night .searchbox .searchbox-header .searchbox-close, +body.night .searchbox .searchbox-body, +body.night .searchbox .searchbox-result-section, +body.night .searchbox .searchbox-result-item { + color: #c0c0c0; + background-color: #373d48; + border-color: #434a56; +} +body.night .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item:hover, +body.night .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item.active, +body.night .searchbox .searchbox-container .searchbox-header .searchbox-close:hover { + color: #fff; + background-color: #434a56; +} +body.night ::selection { + color: #fff; + background-color: rgba(52,109,167,0.8); +} +body.night ::-moz-selection { + color: #fff; + background-color: rgba(52,109,167,0.8); +} +body.night input:-webkit-autofill { + -webkit-text-fill-color: #c0c0c0 !important; + box-shadow: 0 0 0px 1000px #373d48 inset; +} +body.night .twikoo pre { + background-color: #373d48; +} +body.night .twikoo code { + color: #cbba7d; + background-color: #373d48; +} +@media (prefers-color-scheme: dark) { + body:not(.light) { + background: #0e1225; + } + body:not(.light) .hljs { + display: block; + overflow-x: auto; + color: #abb2bf; + background: #282c34; + } + body:not(.light) .hljs-comment, + body:not(.light) .hljs-quote { + color: #5c6370; + font-style: italic; + } + body:not(.light) .hljs-doctag, + body:not(.light) .hljs-keyword, + body:not(.light) .hljs-formula { + color: #c678dd; + } + body:not(.light) .hljs-section, + body:not(.light) .hljs-name, + body:not(.light) .hljs-selector-tag, + body:not(.light) .hljs-deletion, + body:not(.light) .hljs-subst { + color: #e06c75; + } + body:not(.light) .hljs-literal { + color: #56b6c2; + } + body:not(.light) .hljs-string, + body:not(.light) .hljs-regexp, + body:not(.light) .hljs-addition, + body:not(.light) .hljs-attribute, + body:not(.light) .hljs-meta-string { + color: #98c379; + } + body:not(.light) .hljs-built_in, + body:not(.light) .hljs-class .hljs-title { + color: #e6c07b; + } + body:not(.light) .hljs-attr, + body:not(.light) .hljs-variable, + body:not(.light) .hljs-template-variable, + body:not(.light) .hljs-type, + body:not(.light) .hljs-selector-class, + body:not(.light) .hljs-selector-attr, + body:not(.light) .hljs-selector-pseudo, + body:not(.light) .hljs-number { + color: #d19a66; + } + body:not(.light) .hljs-symbol, + body:not(.light) .hljs-bullet, + body:not(.light) .hljs-link, + body:not(.light) .hljs-meta, + body:not(.light) .hljs-selector-id, + body:not(.light) .hljs-title { + color: #61aeee; + } + body:not(.light) .hljs-emphasis { + font-style: italic; + } + body:not(.light) .hljs-strong { + font-weight: bold; + } + body:not(.light) .hljs-link { + text-decoration: underline; + } + body:not(.light) .content code { + color: #cbba7d; + } + body:not(.light) #night-nav #night-icon:before { + content: '\f0eb'; + } + body:not(.light) img, + body:not(.light) video, + body:not(.light) iframe, + body:not(.light) .waifu, + body:not(.light) .donate { + filter: brightness(0.8); + -webkit-filter: brightness(0.8); + } + body:not(.light) .navbar-logo .logo-img, + body:not(.light) .footer-logo .logo-img { + display: none; + } + body:not(.light) .navbar-logo .logo-img-dark, + body:not(.light) .footer-logo .logo-img-dark { + display: inline-block; + } + body:not(.light) .navbar-main .navbar-menu .navbar-item:hover, + body:not(.light) .navbar-main .navbar-menu .navbar-item:focus { + color: #fff; + background-color: #373d48; + } + body:not(.light) .navbar-main .navbar-menu .navbar-item.is-active { + color: #c0c0c0; + } + body:not(.light) .navbar { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); + } + body:not(.light) .card { + background-color: rgba(40,44,52,0.5); + backdrop-filter: none; + -webkit-backdrop-filter: none; + } + body:not(.light) .card:hover { + background-color: rgba(40,44,52,0.8); + } + body:not(.light) .card .breadcrumb li.is-active a { + color: #c0c0c0; + } + body:not(.light) .footer { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); + } + body:not(.light) .input, + body:not(.light) .textarea { + background-color: #434a56; + border-color: #373d48; + } + body:not(.light) .button.is-primary, + body:not(.light) .button.is-light, + body:not(.light) .button.is-small { + background-color: #373d48; + color: #c0c0c0; + } + body:not(.light) .button.is-primary:hover, + body:not(.light) .button.is-light:hover, + body:not(.light) .button.is-small:hover, + body:not(.light) .button.is-primary.is-hovered, + body:not(.light) .button.is-light.is-hovered, + body:not(.light) .button.is-small.is-hovered { + color: #fff; + background-color: #434a56; + } + body:not(.light) .button.is-primary:active, + body:not(.light) .button.is-light:active, + body:not(.light) .button.is-small:active, + body:not(.light) .button.is-primary.is-active, + body:not(.light) .button.is-light.is-active, + body:not(.light) .button.is-small.is-active { + color: #fff; + background-color: #2c313a; + } + body:not(.light) .button.is-white, + body:not(.light) .button.is-transparent { + background-color: transparent; + } + body:not(.light) .button.is-white:hover, + body:not(.light) .button.is-transparent:hover { + background-color: #373d48 !important; + } + body:not(.light) .pagination .pagination-next, + body:not(.light) .pagination .pagination-previous, + body:not(.light) .pagination-link:not(.is-current) { + color: #c0c0c0; + background-color: #373d48; + } + body:not(.light) .pagination .pagination-next a, + body:not(.light) .pagination .pagination-previous a, + body:not(.light) .pagination-link:not(.is-current) a { + color: #c0c0c0; + } + body:not(.light) .pagination-link.is-current { + background-color: #434a56; + border-color: #434a56; + } + body:not(.light) [data-waline] .wl-wrap, + body:not(.light) [data-waline] .wl-wrap .wl-header .wl-input { + border-color: #373d48; + } + body:not(.light) [data-waline] .wl-wrap .wl-header .wl-input:focus { + border-color: #434a56; + } + body:not(.light) [data-waline] .wl-btn { + color: #c0c0c0; + background-color: #373d48; + border-color: #373d48; + } + body:not(.light) [data-waline] .wl-btn:hover { + background-color: #434a56; + } + body:not(.light) [data-waline] .wl-btn:active { + background-color: #2c313a; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-head .wl-sys { + background-color: #373d48; + } + body:not(.light) [data-waline] a:hover, + body:not(.light) [data-waline] .wl-list .wl-card .wl-h .wl-meta .wl-at { + color: #fff; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-content.expand:before { + background: -webkit-gradient(linear, left top, left bottom, from(rgba(37,41,54,0)), to(#252936)); + background: linear-gradient(180deg, rgba(37,41,54,0), #252936); + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-content.expand:after { + background: #252936; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-h, + body:not(.light) [data-waline] .wl-list .wl-card .wl-quote { + border-color: #434a56; + } + body:not(.light) body, + body:not(.light) strong, + body:not(.light) time, + body:not(.light) .title, + body:not(.light) .footer, + body:not(.light) .card, + body:not(.light) .content h1, + body:not(.light) .content h2, + body:not(.light) .content h3, + body:not(.light) .content h4, + body:not(.light) .content h5, + body:not(.light) .content h6, + body:not(.light) .navbar-item, + body:not(.light) .navbar-item.is-active, + body:not(.light) .navbar-link, + body:not(.light) .menu-list a, + body:not(.light) .menu-label, + body:not(.light) .level-item, + body:not(.light) .input, + body:not(.light) .textarea, + body:not(.light) .button.is-white, + body:not(.light) .button.is-transparent, + body:not(.light) .article-licensing, + body:not(.light) [data-waline] * { + color: #c0c0c0; + } + body:not(.light) .media-content, + body:not(.light) .has-text-grey, + body:not(.light) .link-muted { + color: #c0c0c0 !important; + } + body:not(.light) a { + color: #5299e0; + } + body:not(.light) a:hover { + color: #fff; + } + body:not(.light) .timeline a, + body:not(.light) [data-type="recent-posts"] a { + color: #c0c0c0; + } + body:not(.light) .timeline a:hover, + body:not(.light) [data-type="recent-posts"] a:hover { + color: #fff; + } + body:not(.light) .content blockquote, + body:not(.light) .article-licensing { + background-color: #373d48; + border-color: #434a56; + } + body:not(.light) .content table thead td, + body:not(.light) .content table thead th { + color: #c0c0c0; + } + body:not(.light) .content table td, + body:not(.light) .content table th { + border-color: #434a56; + } + body:not(.light) hr { + background-color: #434a56; + } + body:not(.light) article.article .title a, + body:not(.light) article.media .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #c0c0c0 1px); + } + body:not(.light) article.article .title:hover a, + body:not(.light) article.media .title:hover a { + color: #c0c0c0 !important; + } + body:not(.light) .tag:not(body) { + color: #c0c0c0; + background-color: #373d48; + } + body:not(.light) .widget .tags .tag:first-child, + body:not(.light) .tag.is-grey { + background-color: #434a56; + } + body:not(.light) .menu-list a:hover { + background-color: #373d48; + } + body:not(.light) .menu-list a.is-active { + background-color: #434a56; + } + body:not(.light) .menu-list li ul { + border-color: #373d48; + } + body:not(.light) .timeline .media:last-child:after { + background-color: #252936; + } + body:not(.light) .timeline { + border-color: #434a56; + } + body:not(.light) .timeline .media:before { + background-color: #434a56; + } + body:not(.light) .searchbox .searchbox-container, + body:not(.light) .searchbox .searchbox-header, + body:not(.light) .searchbox .searchbox-header .searchbox-input, + body:not(.light) .searchbox .searchbox-header .searchbox-close, + body:not(.light) .searchbox .searchbox-body, + body:not(.light) .searchbox .searchbox-result-section, + body:not(.light) .searchbox .searchbox-result-item { + color: #c0c0c0; + background-color: #373d48; + border-color: #434a56; + } + body:not(.light) .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item:hover, + body:not(.light) .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item.active, + body:not(.light) .searchbox .searchbox-container .searchbox-header .searchbox-close:hover { + color: #fff; + background-color: #434a56; + } + body:not(.light) ::selection { + color: #fff; + background-color: rgba(52,109,167,0.8); + } + body:not(.light) ::-moz-selection { + color: #fff; + background-color: rgba(52,109,167,0.8); + } + body:not(.light) input:-webkit-autofill { + -webkit-text-fill-color: #c0c0c0 !important; + box-shadow: 0 0 0px 1000px #373d48 inset; + } + body:not(.light) .twikoo pre { + background-color: #373d48; + } + body:not(.light) .twikoo code { + color: #cbba7d; + background-color: #373d48; + } +} diff --git a/css/prismjs.css b/css/prismjs.css new file mode 100644 index 0000000..1806e03 --- /dev/null +++ b/css/prismjs.css @@ -0,0 +1,270 @@ +body:not(.night) [data-waline] .token { + all: unset; +} +body:not(.night) [data-waline] pre code { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body:not(.night) [data-waline] pre[class*=language-] { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body:not(.night) [data-waline] .token.comment, +body:not(.night) [data-waline] .token.prolog, +body:not(.night) [data-waline] .token.cdata { + color: #a0a1a7; +} +body:not(.night) [data-waline] .token.doctype, +body:not(.night) [data-waline] .token.punctuation, +body:not(.night) [data-waline] .token.entity { + color: #383a42; +} +body:not(.night) [data-waline] .token.attr-name, +body:not(.night) [data-waline] .token.class-name, +body:not(.night) [data-waline] .token.boolean, +body:not(.night) [data-waline] .token.constant, +body:not(.night) [data-waline] .token.number, +body:not(.night) [data-waline] .token.atrule { + color: #b76b01; +} +body:not(.night) [data-waline] .token.keyword { + color: #a626a4; +} +body:not(.night) [data-waline] .token.property, +body:not(.night) [data-waline] .token.tag, +body:not(.night) [data-waline] .token.symbol, +body:not(.night) [data-waline] .token.deleted, +body:not(.night) [data-waline] .token.important { + color: #e45649; +} +body:not(.night) [data-waline] .token.selector, +body:not(.night) [data-waline] .token.string, +body:not(.night) [data-waline] .token.char, +body:not(.night) [data-waline] .token.builtin, +body:not(.night) [data-waline] .token.inserted, +body:not(.night) [data-waline] .token.regex, +body:not(.night) [data-waline] .token.attr-value, +body:not(.night) [data-waline] .token.attr-value > .token.punctuation { + color: #50a14f; +} +body:not(.night) [data-waline] .token.variable, +body:not(.night) [data-waline] .token.operator, +body:not(.night) [data-waline] .token.function { + color: #4078f2; +} +body:not(.night) [data-waline] .token.url { + color: #0184bc; +} +body:not(.night) [data-waline] .token.attr-value > .token.punctuation.attr-equals, +body:not(.night) [data-waline] .token.special-attr > .token.attr-value > .token.value.css { + color: #383a42; +} +body:not(.night) [data-waline] .language-css .token.selector { + color: #e45649; +} +body:not(.night) [data-waline] .language-css .token.property { + color: #383a42; +} +body:not(.night) [data-waline] .language-css .token.function, +body:not(.night) [data-waline] .language-css .token.url > .token.function { + color: #0184bc; +} +body:not(.night) [data-waline] .language-css .token.url > .token.string.url { + color: #50a14f; +} +body:not(.night) [data-waline] .language-css .token.important, +body:not(.night) [data-waline] .language-css .token.atrule .token.rule { + color: #a626a4; +} +body:not(.night) [data-waline] .language-javascript .token.operator { + color: #a626a4; +} +body:not(.night) [data-waline] .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { + color: #ca1243; +} +body:not(.night) [data-waline] .language-json .token.operator { + color: #383a42; +} +body:not(.night) [data-waline] .language-json .token.null.keyword { + color: #b76b01; +} +body:not(.night) [data-waline] .language-markdown .token.url, +body:not(.night) [data-waline] .language-markdown .token.url > .token.operator, +body:not(.night) [data-waline] .language-markdown .token.url-reference.url > .token.string { + color: #383a42; +} +body:not(.night) [data-waline] .language-markdown .token.url > .token.content { + color: #4078f2; +} +body:not(.night) [data-waline] .language-markdown .token.url > .token.url, +body:not(.night) [data-waline] .language-markdown .token.url-reference.url { + color: #0184bc; +} +body:not(.night) [data-waline] .language-markdown .token.blockquote.punctuation, +body:not(.night) [data-waline] .language-markdown .token.hr.punctuation { + color: #a0a1a7; + font-style: italic; +} +body:not(.night) [data-waline] .language-markdown .token.code-snippet { + color: #50a14f; +} +body:not(.night) [data-waline] .language-markdown .token.bold .token.content { + color: #b76b01; +} +body:not(.night) [data-waline] .language-markdown .token.italic .token.content { + color: #a626a4; +} +body:not(.night) [data-waline] .language-markdown .token.strike .token.content, +body:not(.night) [data-waline] .language-markdown .token.strike .token.punctuation, +body:not(.night) [data-waline] .language-markdown .token.list.punctuation, +body:not(.night) [data-waline] .language-markdown .token.title.important > .token.punctuation { + color: #e45649; +} +body:not(.night) [data-waline] .token.bold { + font-weight: bold; +} +body:not(.night) [data-waline] .token.comment, +body:not(.night) [data-waline] .token.italic { + font-style: italic; +} +body:not(.night) [data-waline] .token.entity { + cursor: help; +} +body:not(.night) [data-waline] .token.namespace { + opacity: 0.8; +} +body.night [data-waline] .token { + all: unset; +} +body.night [data-waline] pre code { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body.night [data-waline] pre[class*=language-] { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body.night [data-waline] .token.comment, +body.night [data-waline] .token.prolog, +body.night [data-waline] .token.cdata { + color: #5c6370; +} +body.night [data-waline] .token.doctype, +body.night [data-waline] .token.punctuation, +body.night [data-waline] .token.entity { + color: #abb2bf; +} +body.night [data-waline] .token.attr-name, +body.night [data-waline] .token.class-name, +body.night [data-waline] .token.boolean, +body.night [data-waline] .token.constant, +body.night [data-waline] .token.number, +body.night [data-waline] .token.atrule { + color: #d19a66; +} +body.night [data-waline] .token.keyword { + color: #c678dd; +} +body.night [data-waline] .token.property, +body.night [data-waline] .token.tag, +body.night [data-waline] .token.symbol, +body.night [data-waline] .token.deleted, +body.night [data-waline] .token.important { + color: #e06c75; +} +body.night [data-waline] .token.selector, +body.night [data-waline] .token.string, +body.night [data-waline] .token.char, +body.night [data-waline] .token.builtin, +body.night [data-waline] .token.inserted, +body.night [data-waline] .token.regex, +body.night [data-waline] .token.attr-value, +body.night [data-waline] .token.attr-value > .token.punctuation { + color: #98c379; +} +body.night [data-waline] .token.variable, +body.night [data-waline] .token.operator, +body.night [data-waline] .token.function { + color: #61afef; +} +body.night [data-waline] .token.url { + color: #56b6c2; +} +body.night [data-waline] .token.attr-value > .token.punctuation.attr-equals, +body.night [data-waline] .token.special-attr > .token.attr-value > .token.value.css { + color: #abb2bf; +} +body.night [data-waline] .language-css .token.selector { + color: #e06c75; +} +body.night [data-waline] .language-css .token.property { + color: #abb2bf; +} +body.night [data-waline] .language-css .token.function, +body.night [data-waline] .language-css .token.url > .token.function { + color: #56b6c2; +} +body.night [data-waline] .language-css .token.url > .token.string.url { + color: #98c379; +} +body.night [data-waline] .language-css .token.important, +body.night [data-waline] .language-css .token.atrule .token.rule { + color: #c678dd; +} +body.night [data-waline] .language-javascript .token.operator { + color: #c678dd; +} +body.night [data-waline] .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { + color: #be5046; +} +body.night [data-waline] .language-json .token.operator { + color: #abb2bf; +} +body.night [data-waline] .language-json .token.null.keyword { + color: #d19a66; +} +body.night [data-waline] .language-markdown .token.url, +body.night [data-waline] .language-markdown .token.url > .token.operator, +body.night [data-waline] .language-markdown .token.url-reference.url > .token.string { + color: #abb2bf; +} +body.night [data-waline] .language-markdown .token.url > .token.content { + color: #61afef; +} +body.night [data-waline] .language-markdown .token.url > .token.url, +body.night [data-waline] .language-markdown .token.url-reference.url { + color: #56b6c2; +} +body.night [data-waline] .language-markdown .token.blockquote.punctuation, +body.night [data-waline] .language-markdown .token.hr.punctuation { + color: #5c6370; + font-style: italic; +} +body.night [data-waline] .language-markdown .token.code-snippet { + color: #98c379; +} +body.night [data-waline] .language-markdown .token.bold .token.content { + color: #d19a66; +} +body.night [data-waline] .language-markdown .token.italic .token.content { + color: #c678dd; +} +body.night [data-waline] .language-markdown .token.strike .token.content, +body.night [data-waline] .language-markdown .token.strike .token.punctuation, +body.night [data-waline] .language-markdown .token.list.punctuation, +body.night [data-waline] .language-markdown .token.title.important > .token.punctuation { + color: #e06c75; +} +body.night [data-waline] .token.bold { + font-weight: bold; +} +body.night [data-waline] .token.comment, +body.night [data-waline] .token.italic { + font-style: italic; +} +body.night [data-waline] .token.entity { + cursor: help; +} +body.night [data-waline] .token.namespace { + opacity: 0.8; +} diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..f72b145 --- /dev/null +++ b/css/style.css @@ -0,0 +1,12798 @@ +@-moz-keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +@-webkit-keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +@-o-keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +@keyframes spinAround { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +.is-unselectable, +.breadcrumb, +.modal-close, +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, +.tabs, +.button, +.delete, +.file { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.navbar-link:not(.is-arrowless)::after, +.select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid transparent; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; +} +.breadcrumb:not(:last-child), +.level:not(:last-child), +.list:not(:last-child), +.message:not(:last-child), +.pagination:not(:last-child), +.tabs:not(:last-child), +.box:not(:last-child), +.content:not(:last-child), +.notification:not(:last-child), +.progress:not(:last-child), +.table:not(:last-child), +.table-container:not(:last-child), +.title:not(:last-child), +.subtitle:not(:last-child), +.block:not(:last-child), +.highlight:not(:last-child) { + margin-bottom: 1.5rem; +} +.modal-close, +.delete { + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10,10,10,0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; +} +.modal-close::before, +.delete::before, +.modal-close::after, +.delete::after { + background-color: #fff; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; +} +.modal-close::before, +.delete::before { + height: 2px; + width: 50%; +} +.modal-close::after, +.delete::after { + height: 50%; + width: 2px; +} +.modal-close:hover, +.delete:hover, +.modal-close:focus, +.delete:focus { + background-color: rgba(10,10,10,0.3); +} +.modal-close:active, +.delete:active { + background-color: rgba(10,10,10,0.4); +} +.modal-close.is-small, +.delete.is-small { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; +} +.modal-close.is-medium, +.delete.is-medium { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; +} +.modal-close.is-large, +.delete.is-large { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; +} +.button.is-loading::after, +.loader, +.select.is-loading::after, +.control.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; +} +.is-overlay, +.modal, +.modal-background, +.image.is-square img, +.image.is-1by1 img, +.image.is-5by4 img, +.image.is-4by3 img, +.image.is-3by2 img, +.image.is-5by3 img, +.image.is-16by9 img, +.image.is-2by1 img, +.image.is-3by1 img, +.image.is-4by5 img, +.image.is-3by4 img, +.image.is-2by3 img, +.image.is-3by5 img, +.image.is-9by16 img, +.image.is-1by2 img, +.image.is-1by3 img, +.image.is-square .has-ratio, +.image.is-1by1 .has-ratio, +.image.is-5by4 .has-ratio, +.image.is-4by3 .has-ratio, +.image.is-3by2 .has-ratio, +.image.is-5by3 .has-ratio, +.image.is-16by9 .has-ratio, +.image.is-2by1 .has-ratio, +.image.is-3by1 .has-ratio, +.image.is-4by5 .has-ratio, +.image.is-3by4 .has-ratio, +.image.is-2by3 .has-ratio, +.image.is-3by5 .has-ratio, +.image.is-9by16 .has-ratio, +.image.is-1by2 .has-ratio, +.image.is-1by3 .has-ratio, +.hero-video { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, +.button, +.input, +.textarea, +.select select, +.file-cta, +.file-name { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 4px; + box-shadow: none; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.5em - 1px); + padding-left: calc(0.75em - 1px); + padding-right: calc(0.75em - 1px); + padding-top: calc(0.5em - 1px); + position: relative; + vertical-align: top; +} +.pagination-previous:focus, +.pagination-next:focus, +.pagination-link:focus, +.pagination-ellipsis:focus, +.button:focus, +.input:focus, +.textarea:focus, +.select select:focus, +.file-cta:focus, +.file-name:focus, +.pagination-previous.is-focused, +.pagination-next.is-focused, +.pagination-link.is-focused, +.pagination-ellipsis.is-focused, +.button.is-focused, +.input.is-focused, +.textarea.is-focused, +.select select.is-focused, +.file-cta.is-focused, +.file-name.is-focused, +.pagination-previous:active, +.pagination-next:active, +.pagination-link:active, +.pagination-ellipsis:active, +.button:active, +.input:active, +.textarea:active, +.select select:active, +.file-cta:active, +.file-name:active, +.pagination-previous.is-active, +.pagination-next.is-active, +.pagination-link.is-active, +.pagination-ellipsis.is-active, +.button.is-active, +.input.is-active, +.textarea.is-active, +.select select.is-active, +.file-cta.is-active, +.file-name.is-active { + outline: none; +} +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled], +.pagination-ellipsis[disabled], +.button[disabled], +.input[disabled], +.textarea[disabled], +.select select[disabled], +.file-cta[disabled], +.file-name[disabled], +fieldset[disabled] .pagination-previous, +fieldset[disabled] .pagination-next, +fieldset[disabled] .pagination-link, +fieldset[disabled] .pagination-ellipsis, +fieldset[disabled] .button, +fieldset[disabled] .input, +fieldset[disabled] .textarea, +fieldset[disabled] .select select, +fieldset[disabled] .file-cta, +fieldset[disabled] .file-name { + cursor: not-allowed; +} +/* minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; +} +ul { + list-style: none; +} +button, +input, +select, +textarea { + margin: 0; +} +html { + box-sizing: border-box; +} +*, +*::before, +*::after { + box-sizing: inherit; +} +img, +video { + height: auto; + max-width: 100%; +} +iframe { + border: 0; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +td:not([align]), +th:not([align]) { + text-align: left; +} +html { + background-color: #f7f7f7; + font-size: 14px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: hidden; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; +} +article, +aside, +figure, +footer, +header, +hgroup, +section { + display: block; +} +body, +button, +input, +select, +textarea { + font-family: Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif; +} +code, +pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: 'Source Code Pro', monospace, 'Microsoft YaHei'; +} +body { + color: #4a4a4a; + font-size: 1em; + font-weight: 400; + line-height: 1.5; +} +a { + color: #3273dc; + cursor: pointer; + text-decoration: none; +} +a strong { + color: currentColor; +} +a:hover { + color: #363636; +} +code { + background-color: #f5f5f5; + color: #f14668; + font-size: 0.875em; + font-weight: normal; + padding: 0.25em 0.5em 0.25em; +} +hr { + background-color: #f5f5f5; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; +} +img { + height: auto; + max-width: 100%; +} +input[type="checkbox"], +input[type="radio"] { + vertical-align: baseline; +} +small { + font-size: 0.875em; +} +span { + font-style: inherit; + font-weight: inherit; +} +strong { + color: #363636; + font-weight: 700; +} +fieldset { + border: none; +} +pre { + -webkit-overflow-scrolling: touch; + background-color: #f5f5f5; + color: #4a4a4a; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; +} +pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; +} +table td, +table th { + vertical-align: top; +} +table td:not([align]), +table th:not([align]) { + text-align: left; +} +table th { + color: #363636; +} +.is-clearfix::after { + clear: both; + content: " "; + display: table; +} +.is-pulled-left { + float: left !important; +} +.is-pulled-right { + float: right !important; +} +.is-clipped { + overflow: hidden !important; +} +.is-size-1 { + font-size: 3rem !important; +} +.is-size-2 { + font-size: 2.5rem !important; +} +.is-size-3 { + font-size: 2rem !important; +} +.is-size-4 { + font-size: 1.5rem !important; +} +.is-size-5 { + font-size: 1.25rem !important; +} +.is-size-6, +article.media .title { + font-size: 1rem !important; +} +.is-size-7, +article.media .date, +article.media .categories, +.article-licensing .licensing-title a, +.article-licensing .licensing-meta h6 { + font-size: 0.85rem !important; +} +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; + } + .is-size-2-mobile { + font-size: 2.5rem !important; + } + .is-size-3-mobile { + font-size: 2rem !important; + } + .is-size-4-mobile { + font-size: 1.5rem !important; + } + .is-size-5-mobile { + font-size: 1.25rem !important; + } + .is-size-6-mobile { + font-size: 1rem !important; + } + .is-size-7-mobile { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; + } + .is-size-2-tablet { + font-size: 2.5rem !important; + } + .is-size-3-tablet { + font-size: 2rem !important; + } + .is-size-4-tablet { + font-size: 1.5rem !important; + } + .is-size-5-tablet { + font-size: 1.25rem !important; + } + .is-size-6-tablet { + font-size: 1rem !important; + } + .is-size-7-tablet { + font-size: 0.85rem !important; + } +} +@media screen and (max-width: 1087px) { + .is-size-1-touch { + font-size: 3rem !important; + } + .is-size-2-touch { + font-size: 2.5rem !important; + } + .is-size-3-touch { + font-size: 2rem !important; + } + .is-size-4-touch { + font-size: 1.5rem !important; + } + .is-size-5-touch { + font-size: 1.25rem !important; + } + .is-size-6-touch { + font-size: 1rem !important; + } + .is-size-7-touch { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 1088px) { + .is-size-1-desktop { + font-size: 3rem !important; + } + .is-size-2-desktop { + font-size: 2.5rem !important; + } + .is-size-3-desktop { + font-size: 2rem !important; + } + .is-size-4-desktop { + font-size: 1.5rem !important; + } + .is-size-5-desktop { + font-size: 1.25rem !important; + } + .is-size-6-desktop { + font-size: 1rem !important; + } + .is-size-7-desktop { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 1280px) { + .is-size-1-widescreen { + font-size: 3rem !important; + } + .is-size-2-widescreen { + font-size: 2.5rem !important; + } + .is-size-3-widescreen { + font-size: 2rem !important; + } + .is-size-4-widescreen { + font-size: 1.5rem !important; + } + .is-size-5-widescreen { + font-size: 1.25rem !important; + } + .is-size-6-widescreen { + font-size: 1rem !important; + } + .is-size-7-widescreen { + font-size: 0.85rem !important; + } +} +@media screen and (min-width: 1472px) { + .is-size-1-fullhd { + font-size: 3rem !important; + } + .is-size-2-fullhd { + font-size: 2.5rem !important; + } + .is-size-3-fullhd { + font-size: 2rem !important; + } + .is-size-4-fullhd { + font-size: 1.5rem !important; + } + .is-size-5-fullhd { + font-size: 1.25rem !important; + } + .is-size-6-fullhd { + font-size: 1rem !important; + } + .is-size-7-fullhd { + font-size: 0.85rem !important; + } +} +.has-text-centered { + text-align: center !important; +} +.has-text-justified { + text-align: justify !important; +} +.has-text-left { + text-align: left !important; +} +.has-text-right { + text-align: right !important; +} +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-centered-tablet-only { + text-align: center !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-centered-touch { + text-align: center !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-centered-desktop { + text-align: center !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-centered-desktop-only { + text-align: center !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-centered-widescreen { + text-align: center !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-centered-widescreen-only { + text-align: center !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-centered-fullhd { + text-align: center !important; + } +} +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-justified-tablet-only { + text-align: justify !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-justified-touch { + text-align: justify !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-justified-desktop { + text-align: justify !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-justified-desktop-only { + text-align: justify !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-justified-widescreen { + text-align: justify !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-justified-widescreen-only { + text-align: justify !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-justified-fullhd { + text-align: justify !important; + } +} +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-left-tablet-only { + text-align: left !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-left-touch { + text-align: left !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-left-desktop { + text-align: left !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-left-desktop-only { + text-align: left !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-left-widescreen { + text-align: left !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-left-widescreen-only { + text-align: left !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-left-fullhd { + text-align: left !important; + } +} +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; + } +} +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .has-text-right-tablet-only { + text-align: right !important; + } +} +@media screen and (max-width: 1087px) { + .has-text-right-touch { + text-align: right !important; + } +} +@media screen and (min-width: 1088px) { + .has-text-right-desktop { + text-align: right !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .has-text-right-desktop-only { + text-align: right !important; + } +} +@media screen and (min-width: 1280px) { + .has-text-right-widescreen { + text-align: right !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .has-text-right-widescreen-only { + text-align: right !important; + } +} +@media screen and (min-width: 1472px) { + .has-text-right-fullhd { + text-align: right !important; + } +} +.is-capitalized { + text-transform: capitalize !important; +} +.is-lowercase { + text-transform: lowercase !important; +} +.is-uppercase, +article.media .categories { + text-transform: uppercase !important; +} +.is-italic { + font-style: italic !important; +} +.has-text-white { + color: #fff !important; +} +a.has-text-white:hover, +a.has-text-white:focus { + color: #e6e6e6 !important; +} +.has-background-white { + background-color: #fff !important; +} +.has-text-black { + color: #0a0a0a !important; +} +a.has-text-black:hover, +a.has-text-black:focus { + color: #000 !important; +} +.has-background-black { + background-color: #0a0a0a !important; +} +.has-text-light { + color: #f5f5f5 !important; +} +a.has-text-light:hover, +a.has-text-light:focus { + color: #dbdbdb !important; +} +.has-background-light { + background-color: #f5f5f5 !important; +} +.has-text-dark { + color: #363636 !important; +} +a.has-text-dark:hover, +a.has-text-dark:focus { + color: #1c1c1c !important; +} +.has-background-dark { + background-color: #363636 !important; +} +.has-text-primary { + color: #3273dc !important; +} +a.has-text-primary:hover, +a.has-text-primary:focus { + color: #205bbc !important; +} +.has-background-primary { + background-color: #3273dc !important; +} +.has-text-link { + color: #3273dc !important; +} +a.has-text-link:hover, +a.has-text-link:focus { + color: #205bbc !important; +} +.has-background-link { + background-color: #3273dc !important; +} +.has-text-info { + color: #3298dc !important; +} +a.has-text-info:hover, +a.has-text-info:focus { + color: #207dbc !important; +} +.has-background-info { + background-color: #3298dc !important; +} +.has-text-success { + color: #48c774 !important; +} +a.has-text-success:hover, +a.has-text-success:focus { + color: #34a85c !important; +} +.has-background-success { + background-color: #48c774 !important; +} +.has-text-warning { + color: #ffdd57 !important; +} +a.has-text-warning:hover, +a.has-text-warning:focus { + color: #ffd324 !important; +} +.has-background-warning { + background-color: #ffdd57 !important; +} +.has-text-danger { + color: #f14668 !important; +} +a.has-text-danger:hover, +a.has-text-danger:focus { + color: #ee1742 !important; +} +.has-background-danger { + background-color: #f14668 !important; +} +.has-text-grey-lightest { + color: #ededed !important; +} +a.has-text-grey-lightest:hover, +a.has-text-grey-lightest:focus { + color: #d4d4d4 !important; +} +.has-background-grey-lightest { + background-color: #ededed !important; +} +.has-text-black-bis { + color: #121212 !important; +} +.has-background-black-bis { + background-color: #121212 !important; +} +.has-text-black-ter { + color: #242424 !important; +} +.has-background-black-ter { + background-color: #242424 !important; +} +.has-text-grey-darker { + color: #363636 !important; +} +.has-background-grey-darker { + background-color: #363636 !important; +} +.has-text-grey-dark { + color: #4a4a4a !important; +} +.has-background-grey-dark { + background-color: #4a4a4a !important; +} +.has-text-grey, +.article-licensing .licensing-title a { + color: #7a7a7a !important; +} +.has-background-grey { + background-color: #7a7a7a !important; +} +.has-text-grey-light { + color: #b5b5b5 !important; +} +.has-background-grey-light { + background-color: #b5b5b5 !important; +} +.has-text-grey-lighter { + color: #dbdbdb !important; +} +.has-background-grey-lighter { + background-color: #dbdbdb !important; +} +.has-text-white-ter { + color: #f5f5f5 !important; +} +.has-background-white-ter { + background-color: #f5f5f5 !important; +} +.has-text-white-bis { + color: #fafafa !important; +} +.has-background-white-bis { + background-color: #fafafa !important; +} +.has-text-weight-light { + font-weight: 300 !important; +} +.has-text-weight-normal { + font-weight: 400 !important; +} +.has-text-weight-medium { + font-weight: 500 !important; +} +.has-text-weight-semibold { + font-weight: 600 !important; +} +.has-text-weight-bold { + font-weight: 700 !important; +} +.is-family-primary { + font-family: Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.is-family-secondary { + font-family: Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.is-family-sans-serif { + font-family: Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.is-family-monospace { + font-family: monospace !important; +} +.is-family-code { + font-family: 'Source Code Pro', monospace, 'Microsoft YaHei' !important; +} +.is-block { + display: block !important; +} +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; + } +} +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-block-tablet-only { + display: block !important; + } +} +@media screen and (max-width: 1087px) { + .is-block-touch { + display: block !important; + } +} +@media screen and (min-width: 1088px) { + .is-block-desktop { + display: block !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-block-desktop-only { + display: block !important; + } +} +@media screen and (min-width: 1280px) { + .is-block-widescreen { + display: block !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-block-widescreen-only { + display: block !important; + } +} +@media screen and (min-width: 1472px) { + .is-block-fullhd { + display: block !important; + } +} +.is-flex { + display: flex !important; +} +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; + } +} +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: flex !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-flex-tablet-only { + display: flex !important; + } +} +@media screen and (max-width: 1087px) { + .is-flex-touch { + display: flex !important; + } +} +@media screen and (min-width: 1088px) { + .is-flex-desktop { + display: flex !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-flex-desktop-only { + display: flex !important; + } +} +@media screen and (min-width: 1280px) { + .is-flex-widescreen { + display: flex !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-flex-widescreen-only { + display: flex !important; + } +} +@media screen and (min-width: 1472px) { + .is-flex-fullhd { + display: flex !important; + } +} +.is-inline { + display: inline !important; +} +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; + } +} +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-inline-tablet-only { + display: inline !important; + } +} +@media screen and (max-width: 1087px) { + .is-inline-touch { + display: inline !important; + } +} +@media screen and (min-width: 1088px) { + .is-inline-desktop { + display: inline !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-inline-desktop-only { + display: inline !important; + } +} +@media screen and (min-width: 1280px) { + .is-inline-widescreen { + display: inline !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-inline-widescreen-only { + display: inline !important; + } +} +@media screen and (min-width: 1472px) { + .is-inline-fullhd { + display: inline !important; + } +} +.is-inline-block { + display: inline-block !important; +} +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; + } +} +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-inline-block-tablet-only { + display: inline-block !important; + } +} +@media screen and (max-width: 1087px) { + .is-inline-block-touch { + display: inline-block !important; + } +} +@media screen and (min-width: 1088px) { + .is-inline-block-desktop { + display: inline-block !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-inline-block-desktop-only { + display: inline-block !important; + } +} +@media screen and (min-width: 1280px) { + .is-inline-block-widescreen { + display: inline-block !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-inline-block-widescreen-only { + display: inline-block !important; + } +} +@media screen and (min-width: 1472px) { + .is-inline-block-fullhd { + display: inline-block !important; + } +} +.is-inline-flex { + display: inline-flex !important; +} +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; + } +} +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: inline-flex !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; + } +} +@media screen and (max-width: 1087px) { + .is-inline-flex-touch { + display: inline-flex !important; + } +} +@media screen and (min-width: 1088px) { + .is-inline-flex-desktop { + display: inline-flex !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; + } +} +@media screen and (min-width: 1280px) { + .is-inline-flex-widescreen { + display: inline-flex !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; + } +} +@media screen and (min-width: 1472px) { + .is-inline-flex-fullhd { + display: inline-flex !important; + } +} +.is-hidden { + display: none !important; +} +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; +} +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; + } +} +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-hidden-tablet-only { + display: none !important; + } +} +@media screen and (max-width: 1087px) { + .is-hidden-touch { + display: none !important; + } +} +@media screen and (min-width: 1088px) { + .is-hidden-desktop { + display: none !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-hidden-desktop-only { + display: none !important; + } +} +@media screen and (min-width: 1280px) { + .is-hidden-widescreen { + display: none !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-hidden-widescreen-only { + display: none !important; + } +} +@media screen and (min-width: 1472px) { + .is-hidden-fullhd { + display: none !important; + } +} +.is-invisible { + visibility: hidden !important; +} +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; + } +} +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .is-invisible-tablet-only { + visibility: hidden !important; + } +} +@media screen and (max-width: 1087px) { + .is-invisible-touch { + visibility: hidden !important; + } +} +@media screen and (min-width: 1088px) { + .is-invisible-desktop { + visibility: hidden !important; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .is-invisible-desktop-only { + visibility: hidden !important; + } +} +@media screen and (min-width: 1280px) { + .is-invisible-widescreen { + visibility: hidden !important; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .is-invisible-widescreen-only { + visibility: hidden !important; + } +} +@media screen and (min-width: 1472px) { + .is-invisible-fullhd { + visibility: hidden !important; + } +} +.is-marginless { + margin: 0 !important; +} +.is-paddingless { + padding: 0 !important; +} +.is-radiusless { + border-radius: 0 !important; +} +.is-shadowless { + box-shadow: none !important; +} +.is-relative { + position: relative !important; +} +.breadcrumb { + font-size: 1rem; + white-space: nowrap; +} +.breadcrumb a { + align-items: center; + color: #3273dc; + display: flex; + justify-content: center; + padding: 0 0.75em; +} +.breadcrumb a:hover { + color: #363636; +} +.breadcrumb li { + align-items: center; + display: flex; +} +.breadcrumb li:first-child a { + padding-left: 0; +} +.breadcrumb li.is-active a { + color: #363636; + cursor: default; + pointer-events: none; +} +.breadcrumb li + li::before { + color: #b5b5b5; + content: "\0002f"; +} +.breadcrumb ul, +.breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.breadcrumb .icon:first-child { + margin-right: 0.5em; +} +.breadcrumb .icon:last-child { + margin-left: 0.5em; +} +.breadcrumb.is-centered ol, +.breadcrumb.is-centered ul { + justify-content: center; +} +.breadcrumb.is-right ol, +.breadcrumb.is-right ul { + justify-content: flex-end; +} +.breadcrumb.is-small { + font-size: 0.75rem; +} +.breadcrumb.is-medium { + font-size: 1.25rem; +} +.breadcrumb.is-large { + font-size: 1.5rem; +} +.breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; +} +.breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; +} +.breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; +} +.breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; +} +.card { + background-color: #fff; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); + color: #4a4a4a; + max-width: 100%; + position: relative; +} +.card-header { + background-color: transparent; + align-items: stretch; + box-shadow: 0 0.125em 0.25em rgba(10,10,10,0.1); + display: flex; +} +.card-header-title { + align-items: center; + color: #363636; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem 1rem; +} +.card-header-title.is-centered { + justify-content: center; +} +.card-header-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem 1rem; +} +.card-image { + display: block; + position: relative; +} +.card-content { + background-color: transparent; + padding: 1.5rem; +} +.card-footer { + background-color: transparent; + border-top: 1px solid #ededed; + align-items: stretch; + display: flex; +} +.card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; +} +.card-footer-item:not(:last-child) { + border-right: 1px solid #ededed; +} +.card .media:not(:last-child) { + margin-bottom: 0.75rem; +} +.dropdown { + display: inline-flex; + position: relative; + vertical-align: top; +} +.dropdown.is-active .dropdown-menu, +.dropdown.is-hoverable:hover .dropdown-menu { + display: block; +} +.dropdown.is-right .dropdown-menu { + left: auto; + right: 0; +} +.dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; +} +.dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; +} +.dropdown-content { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 0.5em 1em -0.125em rgba(10,10,10,0.1), 0 0px 0 1px rgba(10,10,10,0.02); + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} +.dropdown-item { + color: #4a4a4a; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; +} +a.dropdown-item, +button.dropdown-item { + padding-right: 3rem; + text-align: left; + white-space: nowrap; + width: 100%; +} +a.dropdown-item:hover, +button.dropdown-item:hover { + background-color: #f5f5f5; + color: #0a0a0a; +} +a.dropdown-item.is-active, +button.dropdown-item.is-active { + background-color: #3273dc; + color: #fff; +} +.dropdown-divider { + background-color: #ededed; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; +} +.level { + align-items: center; + justify-content: space-between; +} +.level code { + border-radius: 4px; +} +.level img { + display: inline-block; + vertical-align: top; +} +.level.is-mobile { + display: flex; +} +.level.is-mobile .level-left, +.level.is-mobile .level-right { + display: flex; +} +.level.is-mobile .level-left + .level-right { + margin-top: 0; +} +.level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; +} +.level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; +} +@media screen and (min-width: 769px), print { + .level { + display: flex; + } + .level > .level-item:not(.is-narrow) { + flex-grow: 1; + } +} +.level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; +} +.level-item .title, +.level-item .subtitle { + margin-bottom: 0; +} +@media screen and (max-width: 768px) { + .level-item:not(:last-child) { + margin-bottom: 0.75rem; + } +} +.level-left, +.level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; +} +.level-left .level-item.is-flexible, +.level-right .level-item.is-flexible { + flex-grow: 1; +} +@media screen and (min-width: 769px), print { + .level-left .level-item:not(:last-child), + .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; + } +} +.level-left { + align-items: center; + justify-content: flex-start; +} +@media screen and (max-width: 768px) { + .level-left + .level-right { + margin-top: 1.5rem; + } +} +@media screen and (min-width: 769px), print { + .level-left { + display: flex; + } +} +.level-right { + align-items: center; + justify-content: flex-end; +} +@media screen and (min-width: 769px), print { + .level-right { + display: flex; + } +} +.list { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 3px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1); +} +.list-item { + display: block; + padding: 0.5em 1em; +} +.list-item:not(a) { + color: #4a4a4a; +} +.list-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-item:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} +.list-item:not(:last-child) { + border-bottom: 1px solid #dbdbdb; +} +.list-item.is-active { + background-color: #3273dc; + color: #fff; +} +a.list-item { + background-color: #f5f5f5; + cursor: pointer; +} +.media { + align-items: flex-start; + display: flex; + text-align: left; +} +.media .content:not(:last-child) { + margin-bottom: 0.75rem; +} +.media .media { + border-top: 1px solid rgba(219,219,219,0.5); + display: flex; + padding-top: 0.75rem; +} +.media .media .content:not(:last-child), +.media .media .control:not(:last-child) { + margin-bottom: 0.5rem; +} +.media .media .media { + padding-top: 0.5rem; +} +.media .media .media + .media { + margin-top: 0.5rem; +} +.media + .media { + border-top: 1px solid rgba(219,219,219,0.5); + margin-top: 1rem; + padding-top: 1rem; +} +.media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; +} +.media-left, +.media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; +} +.media-left { + margin-right: 1rem; +} +.media-right { + margin-left: 1rem; +} +.media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: left; +} +@media screen and (max-width: 768px) { + .media-content { + overflow-x: auto; + } +} +.menu { + font-size: 1rem; +} +.menu.is-small { + font-size: 0.75rem; +} +.menu.is-medium { + font-size: 1.25rem; +} +.menu.is-large { + font-size: 1.5rem; +} +.menu-list { + line-height: 1.25; +} +.menu-list a { + border-radius: 2px; + color: #4a4a4a; + display: block; + padding: 0.5em 0.75em; +} +.menu-list a:hover { + background-color: #f5f5f5; + color: #363636; +} +.menu-list a.is-active { + background-color: #eef3fc; + color: #3273dc; +} +.menu-list li ul { + border-left: 1px solid #dbdbdb; + margin: 0.75em; + padding-left: 0.75em; +} +.menu-label { + color: #7a7a7a; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; +} +.menu-label:not(:first-child) { + margin-top: 1em; +} +.menu-label:not(:last-child) { + margin-bottom: 1em; +} +.message { + background-color: #f5f5f5; + border-radius: 4px; + font-size: 1rem; +} +.message strong { + color: currentColor; +} +.message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; +} +.message.is-small { + font-size: 0.75rem; +} +.message.is-medium { + font-size: 1.25rem; +} +.message.is-large { + font-size: 1.5rem; +} +.message.is-white { + background-color: #fff; +} +.message.is-white .message-header { + background-color: #fff; + color: #0a0a0a; +} +.message.is-white .message-body { + border-color: #fff; +} +.message.is-black { + background-color: #fafafa; +} +.message.is-black .message-header { + background-color: #0a0a0a; + color: #fff; +} +.message.is-black .message-body { + border-color: #0a0a0a; +} +.message.is-light { + background-color: #fafafa; +} +.message.is-light .message-header { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.message.is-light .message-body { + border-color: #f5f5f5; +} +.message.is-dark { + background-color: #fafafa; +} +.message.is-dark .message-header { + background-color: #363636; + color: #fff; +} +.message.is-dark .message-body { + border-color: #363636; +} +.message.is-primary { + background-color: #eef3fc; +} +.message.is-primary .message-header { + background-color: #3273dc; + color: #fff; +} +.message.is-primary .message-body { + border-color: #3273dc; + color: #2160c4; +} +.message.is-link { + background-color: #eef3fc; +} +.message.is-link .message-header { + background-color: #3273dc; + color: #fff; +} +.message.is-link .message-body { + border-color: #3273dc; + color: #2160c4; +} +.message.is-info { + background-color: #eef6fc; +} +.message.is-info .message-header { + background-color: #3298dc; + color: #fff; +} +.message.is-info .message-body { + border-color: #3298dc; + color: #1d72aa; +} +.message.is-success { + background-color: #effaf3; +} +.message.is-success .message-header { + background-color: #48c774; + color: #fff; +} +.message.is-success .message-body { + border-color: #48c774; + color: #257942; +} +.message.is-warning { + background-color: #fffbeb; +} +.message.is-warning .message-header { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.message.is-warning .message-body { + border-color: #ffdd57; + color: #947600; +} +.message.is-danger { + background-color: #feecf0; +} +.message.is-danger .message-header { + background-color: #f14668; + color: #fff; +} +.message.is-danger .message-body { + border-color: #f14668; + color: #cc0f35; +} +.message.is-grey-lightest { + background-color: #fafafa; +} +.message.is-grey-lightest .message-header { + background-color: #ededed; + color: #363636; +} +.message.is-grey-lightest .message-body { + border-color: #ededed; +} +.message-header { + align-items: center; + background-color: #4a4a4a; + border-radius: 4px 4px 0 0; + color: #fff; + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; +} +.message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; +} +.message-header + .message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.message-body { + border-color: #dbdbdb; + border-radius: 4px; + border-style: solid; + border-width: 0 0 0 4px; + color: #4a4a4a; + padding: 1.25em 1.5em; +} +.message-body code, +.message-body pre { + background-color: #fff; +} +.message-body pre code { + background-color: transparent; +} +.modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; +} +.modal.is-active { + display: flex; +} +.modal-background { + background-color: rgba(10,10,10,0.86); +} +.modal-content, +.modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; +} +@media screen and (min-width: 769px), print { + .modal-content, + .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; + } +} +.modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; +} +.modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; +} +.modal-card-head, +.modal-card-foot { + align-items: center; + background-color: #f5f5f5; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; +} +.modal-card-head { + border-bottom: 1px solid #dbdbdb; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} +.modal-card-title { + color: #363636; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; +} +.modal-card-foot { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 1px solid #dbdbdb; +} +.modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; +} +.modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: #fff; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; +} +.navbar { + background-color: #fff; + min-height: 3.25rem; + position: relative; + z-index: 30; +} +.navbar.is-white { + background-color: #fff; + color: #0a0a0a; +} +.navbar.is-white .navbar-brand > .navbar-item, +.navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; +} +.navbar.is-white .navbar-brand > a.navbar-item:focus, +.navbar.is-white .navbar-brand .navbar-link:focus, +.navbar.is-white .navbar-brand > a.navbar-item:hover, +.navbar.is-white .navbar-brand .navbar-link:hover, +.navbar.is-white .navbar-brand > a.navbar-item.is-active, +.navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; +} +.navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; +} +.navbar.is-white .navbar-burger { + color: #0a0a0a; +} +@media screen and (min-width: 1088px) { + .navbar.is-white .navbar-start > .navbar-item, + .navbar.is-white .navbar-end > .navbar-item, + .navbar.is-white .navbar-start .navbar-link, + .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; + } + .navbar.is-white .navbar-start > a.navbar-item:focus, + .navbar.is-white .navbar-end > a.navbar-item:focus, + .navbar.is-white .navbar-start .navbar-link:focus, + .navbar.is-white .navbar-end .navbar-link:focus, + .navbar.is-white .navbar-start > a.navbar-item:hover, + .navbar.is-white .navbar-end > a.navbar-item:hover, + .navbar.is-white .navbar-start .navbar-link:hover, + .navbar.is-white .navbar-end .navbar-link:hover, + .navbar.is-white .navbar-start > a.navbar-item.is-active, + .navbar.is-white .navbar-end > a.navbar-item.is-active, + .navbar.is-white .navbar-start .navbar-link.is-active, + .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; + } + .navbar.is-white .navbar-start .navbar-link::after, + .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; + } + .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; + } + .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: #fff; + color: #0a0a0a; + } +} +.navbar.is-black { + background-color: #0a0a0a; + color: #fff; +} +.navbar.is-black .navbar-brand > .navbar-item, +.navbar.is-black .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-black .navbar-brand > a.navbar-item:focus, +.navbar.is-black .navbar-brand .navbar-link:focus, +.navbar.is-black .navbar-brand > a.navbar-item:hover, +.navbar.is-black .navbar-brand .navbar-link:hover, +.navbar.is-black .navbar-brand > a.navbar-item.is-active, +.navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: #000; + color: #fff; +} +.navbar.is-black .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-black .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-black .navbar-start > .navbar-item, + .navbar.is-black .navbar-end > .navbar-item, + .navbar.is-black .navbar-start .navbar-link, + .navbar.is-black .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-black .navbar-start > a.navbar-item:focus, + .navbar.is-black .navbar-end > a.navbar-item:focus, + .navbar.is-black .navbar-start .navbar-link:focus, + .navbar.is-black .navbar-end .navbar-link:focus, + .navbar.is-black .navbar-start > a.navbar-item:hover, + .navbar.is-black .navbar-end > a.navbar-item:hover, + .navbar.is-black .navbar-start .navbar-link:hover, + .navbar.is-black .navbar-end .navbar-link:hover, + .navbar.is-black .navbar-start > a.navbar-item.is-active, + .navbar.is-black .navbar-end > a.navbar-item.is-active, + .navbar.is-black .navbar-start .navbar-link.is-active, + .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: #000; + color: #fff; + } + .navbar.is-black .navbar-start .navbar-link::after, + .navbar.is-black .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #000; + color: #fff; + } + .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: #fff; + } +} +.navbar.is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-brand > .navbar-item, +.navbar.is-light .navbar-brand .navbar-link { + color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-brand > a.navbar-item:focus, +.navbar.is-light .navbar-brand .navbar-link:focus, +.navbar.is-light .navbar-brand > a.navbar-item:hover, +.navbar.is-light .navbar-brand .navbar-link:hover, +.navbar.is-light .navbar-brand > a.navbar-item.is-active, +.navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-brand .navbar-link::after { + border-color: rgba(0,0,0,0.7); +} +.navbar.is-light .navbar-burger { + color: rgba(0,0,0,0.7); +} +@media screen and (min-width: 1088px) { + .navbar.is-light .navbar-start > .navbar-item, + .navbar.is-light .navbar-end > .navbar-item, + .navbar.is-light .navbar-start .navbar-link, + .navbar.is-light .navbar-end .navbar-link { + color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-start > a.navbar-item:focus, + .navbar.is-light .navbar-end > a.navbar-item:focus, + .navbar.is-light .navbar-start .navbar-link:focus, + .navbar.is-light .navbar-end .navbar-link:focus, + .navbar.is-light .navbar-start > a.navbar-item:hover, + .navbar.is-light .navbar-end > a.navbar-item:hover, + .navbar.is-light .navbar-start .navbar-link:hover, + .navbar.is-light .navbar-end .navbar-link:hover, + .navbar.is-light .navbar-start > a.navbar-item.is-active, + .navbar.is-light .navbar-end > a.navbar-item.is-active, + .navbar.is-light .navbar-start .navbar-link.is-active, + .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-start .navbar-link::after, + .navbar.is-light .navbar-end .navbar-link::after { + border-color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); + } + .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); + } +} +.navbar.is-dark { + background-color: #363636; + color: #fff; +} +.navbar.is-dark .navbar-brand > .navbar-item, +.navbar.is-dark .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-dark .navbar-brand > a.navbar-item:focus, +.navbar.is-dark .navbar-brand .navbar-link:focus, +.navbar.is-dark .navbar-brand > a.navbar-item:hover, +.navbar.is-dark .navbar-brand .navbar-link:hover, +.navbar.is-dark .navbar-brand > a.navbar-item.is-active, +.navbar.is-dark .navbar-brand .navbar-link.is-active { + background-color: #292929; + color: #fff; +} +.navbar.is-dark .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-dark .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-dark .navbar-start > .navbar-item, + .navbar.is-dark .navbar-end > .navbar-item, + .navbar.is-dark .navbar-start .navbar-link, + .navbar.is-dark .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-dark .navbar-start > a.navbar-item:focus, + .navbar.is-dark .navbar-end > a.navbar-item:focus, + .navbar.is-dark .navbar-start .navbar-link:focus, + .navbar.is-dark .navbar-end .navbar-link:focus, + .navbar.is-dark .navbar-start > a.navbar-item:hover, + .navbar.is-dark .navbar-end > a.navbar-item:hover, + .navbar.is-dark .navbar-start .navbar-link:hover, + .navbar.is-dark .navbar-end .navbar-link:hover, + .navbar.is-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-dark .navbar-start .navbar-link.is-active, + .navbar.is-dark .navbar-end .navbar-link.is-active { + background-color: #292929; + color: #fff; + } + .navbar.is-dark .navbar-start .navbar-link::after, + .navbar.is-dark .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #292929; + color: #fff; + } + .navbar.is-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #363636; + color: #fff; + } +} +.navbar.is-primary { + background-color: #3273dc; + color: #fff; +} +.navbar.is-primary .navbar-brand > .navbar-item, +.navbar.is-primary .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-primary .navbar-brand > a.navbar-item:focus, +.navbar.is-primary .navbar-brand .navbar-link:focus, +.navbar.is-primary .navbar-brand > a.navbar-item:hover, +.navbar.is-primary .navbar-brand .navbar-link:hover, +.navbar.is-primary .navbar-brand > a.navbar-item.is-active, +.navbar.is-primary .navbar-brand .navbar-link.is-active { + background-color: #2366d1; + color: #fff; +} +.navbar.is-primary .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-primary .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-primary .navbar-start > .navbar-item, + .navbar.is-primary .navbar-end > .navbar-item, + .navbar.is-primary .navbar-start .navbar-link, + .navbar.is-primary .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-primary .navbar-start > a.navbar-item:focus, + .navbar.is-primary .navbar-end > a.navbar-item:focus, + .navbar.is-primary .navbar-start .navbar-link:focus, + .navbar.is-primary .navbar-end .navbar-link:focus, + .navbar.is-primary .navbar-start > a.navbar-item:hover, + .navbar.is-primary .navbar-end > a.navbar-item:hover, + .navbar.is-primary .navbar-start .navbar-link:hover, + .navbar.is-primary .navbar-end .navbar-link:hover, + .navbar.is-primary .navbar-start > a.navbar-item.is-active, + .navbar.is-primary .navbar-end > a.navbar-item.is-active, + .navbar.is-primary .navbar-start .navbar-link.is-active, + .navbar.is-primary .navbar-end .navbar-link.is-active { + background-color: #2366d1; + color: #fff; + } + .navbar.is-primary .navbar-start .navbar-link::after, + .navbar.is-primary .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2366d1; + color: #fff; + } + .navbar.is-primary .navbar-dropdown a.navbar-item.is-active { + background-color: #3273dc; + color: #fff; + } +} +.navbar.is-link { + background-color: #3273dc; + color: #fff; +} +.navbar.is-link .navbar-brand > .navbar-item, +.navbar.is-link .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-link .navbar-brand > a.navbar-item:focus, +.navbar.is-link .navbar-brand .navbar-link:focus, +.navbar.is-link .navbar-brand > a.navbar-item:hover, +.navbar.is-link .navbar-brand .navbar-link:hover, +.navbar.is-link .navbar-brand > a.navbar-item.is-active, +.navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #2366d1; + color: #fff; +} +.navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-link .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-link .navbar-start > .navbar-item, + .navbar.is-link .navbar-end > .navbar-item, + .navbar.is-link .navbar-start .navbar-link, + .navbar.is-link .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-link .navbar-start > a.navbar-item:focus, + .navbar.is-link .navbar-end > a.navbar-item:focus, + .navbar.is-link .navbar-start .navbar-link:focus, + .navbar.is-link .navbar-end .navbar-link:focus, + .navbar.is-link .navbar-start > a.navbar-item:hover, + .navbar.is-link .navbar-end > a.navbar-item:hover, + .navbar.is-link .navbar-start .navbar-link:hover, + .navbar.is-link .navbar-end .navbar-link:hover, + .navbar.is-link .navbar-start > a.navbar-item.is-active, + .navbar.is-link .navbar-end > a.navbar-item.is-active, + .navbar.is-link .navbar-start .navbar-link.is-active, + .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #2366d1; + color: #fff; + } + .navbar.is-link .navbar-start .navbar-link::after, + .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2366d1; + color: #fff; + } + .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #3273dc; + color: #fff; + } +} +.navbar.is-info { + background-color: #3298dc; + color: #fff; +} +.navbar.is-info .navbar-brand > .navbar-item, +.navbar.is-info .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-info .navbar-brand > a.navbar-item:focus, +.navbar.is-info .navbar-brand .navbar-link:focus, +.navbar.is-info .navbar-brand > a.navbar-item:hover, +.navbar.is-info .navbar-brand .navbar-link:hover, +.navbar.is-info .navbar-brand > a.navbar-item.is-active, +.navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #238cd1; + color: #fff; +} +.navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-info .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-info .navbar-start > .navbar-item, + .navbar.is-info .navbar-end > .navbar-item, + .navbar.is-info .navbar-start .navbar-link, + .navbar.is-info .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-info .navbar-start > a.navbar-item:focus, + .navbar.is-info .navbar-end > a.navbar-item:focus, + .navbar.is-info .navbar-start .navbar-link:focus, + .navbar.is-info .navbar-end .navbar-link:focus, + .navbar.is-info .navbar-start > a.navbar-item:hover, + .navbar.is-info .navbar-end > a.navbar-item:hover, + .navbar.is-info .navbar-start .navbar-link:hover, + .navbar.is-info .navbar-end .navbar-link:hover, + .navbar.is-info .navbar-start > a.navbar-item.is-active, + .navbar.is-info .navbar-end > a.navbar-item.is-active, + .navbar.is-info .navbar-start .navbar-link.is-active, + .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #238cd1; + color: #fff; + } + .navbar.is-info .navbar-start .navbar-link::after, + .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #238cd1; + color: #fff; + } + .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #3298dc; + color: #fff; + } +} +.navbar.is-success { + background-color: #48c774; + color: #fff; +} +.navbar.is-success .navbar-brand > .navbar-item, +.navbar.is-success .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-success .navbar-brand > a.navbar-item:focus, +.navbar.is-success .navbar-brand .navbar-link:focus, +.navbar.is-success .navbar-brand > a.navbar-item:hover, +.navbar.is-success .navbar-brand .navbar-link:hover, +.navbar.is-success .navbar-brand > a.navbar-item.is-active, +.navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #3abb67; + color: #fff; +} +.navbar.is-success .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-success .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-success .navbar-start > .navbar-item, + .navbar.is-success .navbar-end > .navbar-item, + .navbar.is-success .navbar-start .navbar-link, + .navbar.is-success .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-success .navbar-start > a.navbar-item:focus, + .navbar.is-success .navbar-end > a.navbar-item:focus, + .navbar.is-success .navbar-start .navbar-link:focus, + .navbar.is-success .navbar-end .navbar-link:focus, + .navbar.is-success .navbar-start > a.navbar-item:hover, + .navbar.is-success .navbar-end > a.navbar-item:hover, + .navbar.is-success .navbar-start .navbar-link:hover, + .navbar.is-success .navbar-end .navbar-link:hover, + .navbar.is-success .navbar-start > a.navbar-item.is-active, + .navbar.is-success .navbar-end > a.navbar-item.is-active, + .navbar.is-success .navbar-start .navbar-link.is-active, + .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #3abb67; + color: #fff; + } + .navbar.is-success .navbar-start .navbar-link::after, + .navbar.is-success .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #3abb67; + color: #fff; + } + .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #48c774; + color: #fff; + } +} +.navbar.is-warning { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.navbar.is-warning .navbar-brand > .navbar-item, +.navbar.is-warning .navbar-brand .navbar-link { + color: rgba(0,0,0,0.7); +} +.navbar.is-warning .navbar-brand > a.navbar-item:focus, +.navbar.is-warning .navbar-brand .navbar-link:focus, +.navbar.is-warning .navbar-brand > a.navbar-item:hover, +.navbar.is-warning .navbar-brand .navbar-link:hover, +.navbar.is-warning .navbar-brand > a.navbar-item.is-active, +.navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #ffd83d; + color: rgba(0,0,0,0.7); +} +.navbar.is-warning .navbar-brand .navbar-link::after { + border-color: rgba(0,0,0,0.7); +} +.navbar.is-warning .navbar-burger { + color: rgba(0,0,0,0.7); +} +@media screen and (min-width: 1088px) { + .navbar.is-warning .navbar-start > .navbar-item, + .navbar.is-warning .navbar-end > .navbar-item, + .navbar.is-warning .navbar-start .navbar-link, + .navbar.is-warning .navbar-end .navbar-link { + color: rgba(0,0,0,0.7); + } + .navbar.is-warning .navbar-start > a.navbar-item:focus, + .navbar.is-warning .navbar-end > a.navbar-item:focus, + .navbar.is-warning .navbar-start .navbar-link:focus, + .navbar.is-warning .navbar-end .navbar-link:focus, + .navbar.is-warning .navbar-start > a.navbar-item:hover, + .navbar.is-warning .navbar-end > a.navbar-item:hover, + .navbar.is-warning .navbar-start .navbar-link:hover, + .navbar.is-warning .navbar-end .navbar-link:hover, + .navbar.is-warning .navbar-start > a.navbar-item.is-active, + .navbar.is-warning .navbar-end > a.navbar-item.is-active, + .navbar.is-warning .navbar-start .navbar-link.is-active, + .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #ffd83d; + color: rgba(0,0,0,0.7); + } + .navbar.is-warning .navbar-start .navbar-link::after, + .navbar.is-warning .navbar-end .navbar-link::after { + border-color: rgba(0,0,0,0.7); + } + .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ffd83d; + color: rgba(0,0,0,0.7); + } + .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); + } +} +.navbar.is-danger { + background-color: #f14668; + color: #fff; +} +.navbar.is-danger .navbar-brand > .navbar-item, +.navbar.is-danger .navbar-brand .navbar-link { + color: #fff; +} +.navbar.is-danger .navbar-brand > a.navbar-item:focus, +.navbar.is-danger .navbar-brand .navbar-link:focus, +.navbar.is-danger .navbar-brand > a.navbar-item:hover, +.navbar.is-danger .navbar-brand .navbar-link:hover, +.navbar.is-danger .navbar-brand > a.navbar-item.is-active, +.navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; +} +.navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; +} +.navbar.is-danger .navbar-burger { + color: #fff; +} +@media screen and (min-width: 1088px) { + .navbar.is-danger .navbar-start > .navbar-item, + .navbar.is-danger .navbar-end > .navbar-item, + .navbar.is-danger .navbar-start .navbar-link, + .navbar.is-danger .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-danger .navbar-start > a.navbar-item:focus, + .navbar.is-danger .navbar-end > a.navbar-item:focus, + .navbar.is-danger .navbar-start .navbar-link:focus, + .navbar.is-danger .navbar-end .navbar-link:focus, + .navbar.is-danger .navbar-start > a.navbar-item:hover, + .navbar.is-danger .navbar-end > a.navbar-item:hover, + .navbar.is-danger .navbar-start .navbar-link:hover, + .navbar.is-danger .navbar-end .navbar-link:hover, + .navbar.is-danger .navbar-start > a.navbar-item.is-active, + .navbar.is-danger .navbar-end > a.navbar-item.is-active, + .navbar.is-danger .navbar-start .navbar-link.is-active, + .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; + } + .navbar.is-danger .navbar-start .navbar-link::after, + .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ef2e55; + color: #fff; + } + .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #f14668; + color: #fff; + } +} +.navbar.is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.navbar.is-grey-lightest .navbar-brand > .navbar-item, +.navbar.is-grey-lightest .navbar-brand .navbar-link { + color: #363636; +} +.navbar.is-grey-lightest .navbar-brand > a.navbar-item:focus, +.navbar.is-grey-lightest .navbar-brand .navbar-link:focus, +.navbar.is-grey-lightest .navbar-brand > a.navbar-item:hover, +.navbar.is-grey-lightest .navbar-brand .navbar-link:hover, +.navbar.is-grey-lightest .navbar-brand > a.navbar-item.is-active, +.navbar.is-grey-lightest .navbar-brand .navbar-link.is-active { + background-color: #e0e0e0; + color: #363636; +} +.navbar.is-grey-lightest .navbar-brand .navbar-link::after { + border-color: #363636; +} +.navbar.is-grey-lightest .navbar-burger { + color: #363636; +} +@media screen and (min-width: 1088px) { + .navbar.is-grey-lightest .navbar-start > .navbar-item, + .navbar.is-grey-lightest .navbar-end > .navbar-item, + .navbar.is-grey-lightest .navbar-start .navbar-link, + .navbar.is-grey-lightest .navbar-end .navbar-link { + color: #363636; + } + .navbar.is-grey-lightest .navbar-start > a.navbar-item:focus, + .navbar.is-grey-lightest .navbar-end > a.navbar-item:focus, + .navbar.is-grey-lightest .navbar-start .navbar-link:focus, + .navbar.is-grey-lightest .navbar-end .navbar-link:focus, + .navbar.is-grey-lightest .navbar-start > a.navbar-item:hover, + .navbar.is-grey-lightest .navbar-end > a.navbar-item:hover, + .navbar.is-grey-lightest .navbar-start .navbar-link:hover, + .navbar.is-grey-lightest .navbar-end .navbar-link:hover, + .navbar.is-grey-lightest .navbar-start > a.navbar-item.is-active, + .navbar.is-grey-lightest .navbar-end > a.navbar-item.is-active, + .navbar.is-grey-lightest .navbar-start .navbar-link.is-active, + .navbar.is-grey-lightest .navbar-end .navbar-link.is-active { + background-color: #e0e0e0; + color: #363636; + } + .navbar.is-grey-lightest .navbar-start .navbar-link::after, + .navbar.is-grey-lightest .navbar-end .navbar-link::after { + border-color: #363636; + } + .navbar.is-grey-lightest .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-grey-lightest .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-grey-lightest .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e0e0e0; + color: #363636; + } + .navbar.is-grey-lightest .navbar-dropdown a.navbar-item.is-active { + background-color: #ededed; + color: #363636; + } +} +.navbar > .container { + align-items: stretch; + display: flex; + min-height: 3.25rem; + width: 100%; +} +.navbar.has-shadow { + box-shadow: 0 2px 0 0 #f5f5f5; +} +.navbar.is-fixed-bottom, +.navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; +} +.navbar.is-fixed-bottom { + bottom: 0; +} +.navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 #f5f5f5; +} +.navbar.is-fixed-top { + top: 0; +} +html.has-navbar-fixed-top, +body.has-navbar-fixed-top { + padding-top: 3.25rem; +} +html.has-navbar-fixed-bottom, +body.has-navbar-fixed-bottom { + padding-bottom: 3.25rem; +} +.navbar-brand, +.navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 3.25rem; +} +.navbar-brand a.navbar-item:focus, +.navbar-brand a.navbar-item:hover { + background-color: transparent; +} +.navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; +} +.navbar-burger { + color: #4a4a4a; + cursor: pointer; + display: block; + height: 3.25rem; + position: relative; + width: 3.25rem; + margin-left: auto; +} +.navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; +} +.navbar-burger span:nth-child(1) { + top: calc(50% - 6px); +} +.navbar-burger span:nth-child(2) { + top: calc(50% - 1px); +} +.navbar-burger span:nth-child(3) { + top: calc(50% + 4px); +} +.navbar-burger:hover { + background-color: rgba(0,0,0,0.05); +} +.navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); +} +.navbar-burger.is-active span:nth-child(2) { + opacity: 0; +} +.navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); +} +.navbar-menu { + display: none; +} +.navbar-item, +.navbar-link { + color: #4a4a4a; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; +} +.navbar-item .icon:only-child, +.navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; +} +a.navbar-item, +.navbar-link { + cursor: pointer; +} +a.navbar-item:focus, +.navbar-link:focus, +a.navbar-item:focus-within, +.navbar-link:focus-within, +a.navbar-item:hover, +.navbar-link:hover, +a.navbar-item.is-active, +.navbar-link.is-active { + background-color: #fafafa; + color: #3273dc; +} +.navbar-item { + display: block; + flex-grow: 0; + flex-shrink: 0; +} +.navbar-item img { + max-height: 1.75rem; +} +.navbar-item.has-dropdown { + padding: 0; +} +.navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 3.25rem; + padding-bottom: calc(0.5rem - 1px); +} +.navbar-item.is-tab:focus, +.navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #3273dc; +} +.navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #3273dc; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #3273dc; + padding-bottom: calc(0.5rem - 3px); +} +.navbar-content { + flex-grow: 1; + flex-shrink: 1; +} +.navbar-link:not(.is-arrowless) { + padding-right: 2.5em; +} +.navbar-link:not(.is-arrowless)::after { + border-color: #3273dc; + margin-top: -0.375em; + right: 1.125em; +} +.navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} +.navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; +} +.navbar-divider { + background-color: #f5f5f5; + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; +} +@media screen and (max-width: 1087px) { + .navbar > .container { + display: block; + } + .navbar-brand .navbar-item, + .navbar-tabs .navbar-item { + align-items: center; + display: flex; + } + .navbar-link::after { + display: none; + } + .navbar-menu { + background-color: #fff; + box-shadow: 0 8px 16px rgba(10,10,10,0.1); + padding: 0.5rem 0; + } + .navbar-menu.is-active { + display: block; + } + .navbar.is-fixed-bottom-touch, + .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; + } + .navbar.is-fixed-bottom-touch { + bottom: 0; + } + .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(10,10,10,0.1); + } + .navbar.is-fixed-top-touch { + top: 0; + } + .navbar.is-fixed-top .navbar-menu, + .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 3.25rem); + overflow: auto; + } + html.has-navbar-fixed-top-touch, + body.has-navbar-fixed-top-touch { + padding-top: 3.25rem; + } + html.has-navbar-fixed-bottom-touch, + body.has-navbar-fixed-bottom-touch { + padding-bottom: 3.25rem; + } +} +@media screen and (min-width: 1088px) { + .navbar, + .navbar-menu, + .navbar-start, + .navbar-end { + align-items: stretch; + display: flex; + } + .navbar { + min-height: 3.25rem; + } + .navbar.is-spaced { + padding: 1rem 2rem; + } + .navbar.is-spaced .navbar-start, + .navbar.is-spaced .navbar-end { + align-items: center; + } + .navbar.is-spaced a.navbar-item, + .navbar.is-spaced .navbar-link { + border-radius: 4px; + } + .navbar.is-transparent a.navbar-item:focus, + .navbar.is-transparent .navbar-link:focus, + .navbar.is-transparent a.navbar-item:hover, + .navbar.is-transparent .navbar-link:hover, + .navbar.is-transparent a.navbar-item.is-active, + .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; + } + .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; + } + .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, + .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: #f5f5f5; + color: #0a0a0a; + } + .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: #3273dc; + } + .navbar-burger { + display: none; + } + .navbar-item, + .navbar-link { + align-items: center; + display: flex; + } + .navbar-item { + display: flex; + } + .navbar-item.has-dropdown { + align-items: stretch; + } + .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); + } + .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 2px solid #dbdbdb; + border-radius: 6px 6px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(10,10,10,0.1); + top: auto; + } + .navbar-item.is-active .navbar-dropdown, + .navbar-item.is-hoverable:focus .navbar-dropdown, + .navbar-item.is-hoverable:focus-within .navbar-dropdown, + .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; + } + .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, + .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, + .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, + .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, + .navbar-item.is-active .navbar-dropdown.is-boxed, + .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, + .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, + .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); + } + .navbar-menu { + flex-grow: 1; + flex-shrink: 0; + } + .navbar-start { + justify-content: flex-start; + margin-right: auto; + } + .navbar-end { + justify-content: flex-end; + margin-left: auto; + } + .navbar-dropdown { + background-color: #fff; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 2px solid #dbdbdb; + box-shadow: 0 8px 8px rgba(10,10,10,0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; + } + .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; + } + .navbar-dropdown a.navbar-item { + padding-right: 3rem; + } + .navbar-dropdown a.navbar-item:focus, + .navbar-dropdown a.navbar-item:hover { + background-color: #f5f5f5; + color: #0a0a0a; + } + .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: #3273dc; + } + .navbar.is-spaced .navbar-dropdown, + .navbar-dropdown.is-boxed { + border-radius: 6px; + border-top: none; + box-shadow: 0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + -4px); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; + } + .navbar-dropdown.is-right { + left: auto; + right: 0; + } + .navbar-divider { + display: block; + } + .navbar > .container .navbar-brand, + .container > .navbar .navbar-brand { + margin-left: -0.75rem; + } + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: -0.75rem; + } + .navbar.is-fixed-bottom-desktop, + .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; + } + .navbar.is-fixed-bottom-desktop { + bottom: 0; + } + .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(10,10,10,0.1); + } + .navbar.is-fixed-top-desktop { + top: 0; + } + html.has-navbar-fixed-top-desktop, + body.has-navbar-fixed-top-desktop { + padding-top: 3.25rem; + } + html.has-navbar-fixed-bottom-desktop, + body.has-navbar-fixed-bottom-desktop { + padding-bottom: 3.25rem; + } + html.has-spaced-navbar-fixed-top, + body.has-spaced-navbar-fixed-top { + padding-top: 5.25rem; + } + html.has-spaced-navbar-fixed-bottom, + body.has-spaced-navbar-fixed-bottom { + padding-bottom: 5.25rem; + } + a.navbar-item.is-active, + .navbar-link.is-active { + color: #3273dc; + } + a.navbar-item.is-active:not(:focus):not(:hover), + .navbar-link.is-active:not(:focus):not(:hover) { + background-color: transparent; + } + .navbar-item.has-dropdown:focus .navbar-link, + .navbar-item.has-dropdown:hover .navbar-link, + .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #fafafa; + } +} +.hero.is-fullheight-with-navbar { + min-height: calc(100vh - 3.25rem); +} +.pagination { + font-size: 1rem; + margin: -0.25rem; +} +.pagination.is-small { + font-size: 0.75rem; +} +.pagination.is-medium { + font-size: 1.25rem; +} +.pagination.is-large { + font-size: 1.5rem; +} +.pagination.is-rounded .pagination-previous, +.pagination.is-rounded .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 290486px; +} +.pagination.is-rounded .pagination-link { + border-radius: 290486px; +} +.pagination, +.pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; +} +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; +} +.pagination-previous, +.pagination-next, +.pagination-link { + border-color: #dbdbdb; + color: #363636; + min-width: 2.25em; +} +.pagination-previous:hover, +.pagination-next:hover, +.pagination-link:hover { + border-color: #b5b5b5; + color: #363636; +} +.pagination-previous:focus, +.pagination-next:focus, +.pagination-link:focus { + border-color: #3273dc; +} +.pagination-previous:active, +.pagination-next:active, +.pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10,10,10,0.2); +} +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled] { + background-color: #dbdbdb; + border-color: #dbdbdb; + box-shadow: none; + color: #7a7a7a; + opacity: 0.5; +} +.pagination-previous, +.pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} +.pagination-link.is-current { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} +.pagination-ellipsis { + color: #b5b5b5; + pointer-events: none; +} +.pagination-list { + flex-wrap: wrap; +} +@media screen and (max-width: 768px) { + .pagination { + flex-wrap: wrap; + } + .pagination-previous, + .pagination-next { + flex-grow: 1; + flex-shrink: 1; + } + .pagination-list li { + flex-grow: 1; + flex-shrink: 1; + } +} +@media screen and (min-width: 769px), print { + .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; + } + .pagination-previous { + order: 2; + } + .pagination-next { + order: 3; + } + .pagination { + justify-content: space-between; + } + .pagination.is-centered .pagination-previous, + .pagination .pagination-previous { + order: 1; + } + .pagination.is-centered .pagination-list, + .pagination .pagination-list { + justify-content: center; + order: 2; + } + .pagination.is-centered .pagination-next, + .pagination .pagination-next { + order: 3; + } + .pagination.is-right .pagination-previous { + order: 1; + } + .pagination.is-right .pagination-next { + order: 2; + } + .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; + } +} +.panel { + border-radius: 6px; + box-shadow: 0 0.5em 1em -0.125em rgba(10,10,10,0.1), 0 0px 0 1px rgba(10,10,10,0.02); + font-size: 1rem; +} +.panel:not(:last-child) { + margin-bottom: 1.5rem; +} +.panel.is-white .panel-heading { + background-color: #fff; + color: #0a0a0a; +} +.panel.is-white .panel-tabs a.is-active { + border-bottom-color: #fff; +} +.panel.is-white .panel-block.is-active .panel-icon { + color: #fff; +} +.panel.is-black .panel-heading { + background-color: #0a0a0a; + color: #fff; +} +.panel.is-black .panel-tabs a.is-active { + border-bottom-color: #0a0a0a; +} +.panel.is-black .panel-block.is-active .panel-icon { + color: #0a0a0a; +} +.panel.is-light .panel-heading { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.panel.is-light .panel-tabs a.is-active { + border-bottom-color: #f5f5f5; +} +.panel.is-light .panel-block.is-active .panel-icon { + color: #f5f5f5; +} +.panel.is-dark .panel-heading { + background-color: #363636; + color: #fff; +} +.panel.is-dark .panel-tabs a.is-active { + border-bottom-color: #363636; +} +.panel.is-dark .panel-block.is-active .panel-icon { + color: #363636; +} +.panel.is-primary .panel-heading { + background-color: #3273dc; + color: #fff; +} +.panel.is-primary .panel-tabs a.is-active { + border-bottom-color: #3273dc; +} +.panel.is-primary .panel-block.is-active .panel-icon { + color: #3273dc; +} +.panel.is-link .panel-heading { + background-color: #3273dc; + color: #fff; +} +.panel.is-link .panel-tabs a.is-active { + border-bottom-color: #3273dc; +} +.panel.is-link .panel-block.is-active .panel-icon { + color: #3273dc; +} +.panel.is-info .panel-heading { + background-color: #3298dc; + color: #fff; +} +.panel.is-info .panel-tabs a.is-active { + border-bottom-color: #3298dc; +} +.panel.is-info .panel-block.is-active .panel-icon { + color: #3298dc; +} +.panel.is-success .panel-heading { + background-color: #48c774; + color: #fff; +} +.panel.is-success .panel-tabs a.is-active { + border-bottom-color: #48c774; +} +.panel.is-success .panel-block.is-active .panel-icon { + color: #48c774; +} +.panel.is-warning .panel-heading { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.panel.is-warning .panel-tabs a.is-active { + border-bottom-color: #ffdd57; +} +.panel.is-warning .panel-block.is-active .panel-icon { + color: #ffdd57; +} +.panel.is-danger .panel-heading { + background-color: #f14668; + color: #fff; +} +.panel.is-danger .panel-tabs a.is-active { + border-bottom-color: #f14668; +} +.panel.is-danger .panel-block.is-active .panel-icon { + color: #f14668; +} +.panel.is-grey-lightest .panel-heading { + background-color: #ededed; + color: #363636; +} +.panel.is-grey-lightest .panel-tabs a.is-active { + border-bottom-color: #ededed; +} +.panel.is-grey-lightest .panel-block.is-active .panel-icon { + color: #ededed; +} +.panel-tabs:not(:last-child), +.panel-block:not(:last-child) { + border-bottom: 1px solid #ededed; +} +.panel-heading { + background-color: #ededed; + border-radius: 6px 6px 0 0; + color: #363636; + font-size: 1.25em; + font-weight: 700; + line-height: 1.25; + padding: 0.75em 1em; +} +.panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; +} +.panel-tabs a { + border-bottom: 1px solid #dbdbdb; + margin-bottom: -1px; + padding: 0.5em; +} +.panel-tabs a.is-active { + border-bottom-color: #4a4a4a; + color: #363636; +} +.panel-list a { + color: #4a4a4a; +} +.panel-list a:hover { + color: #3273dc; +} +.panel-block { + align-items: center; + color: #363636; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; +} +.panel-block input[type="checkbox"] { + margin-right: 0.75em; +} +.panel-block > .control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; +} +.panel-block.is-wrapped { + flex-wrap: wrap; +} +.panel-block.is-active { + border-left-color: #3273dc; + color: #363636; +} +.panel-block.is-active .panel-icon { + color: #3273dc; +} +.panel-block:last-child { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} +a.panel-block, +label.panel-block { + cursor: pointer; +} +a.panel-block:hover, +label.panel-block:hover { + background-color: #f5f5f5; +} +.panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: #7a7a7a; + margin-right: 0.75em; +} +.panel-icon .fa { + font-size: inherit; + line-height: inherit; +} +.tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 1rem; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; +} +.tabs a { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #4a4a4a; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; +} +.tabs a:hover { + border-bottom-color: #363636; + color: #363636; +} +.tabs li { + display: block; +} +.tabs li.is-active a { + border-bottom-color: #3273dc; + color: #3273dc; +} +.tabs ul { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; +} +.tabs ul.is-left { + padding-right: 0.75em; +} +.tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; +} +.tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; +} +.tabs .icon:first-child { + margin-right: 0.5em; +} +.tabs .icon:last-child { + margin-left: 0.5em; +} +.tabs.is-centered ul { + justify-content: center; +} +.tabs.is-right ul { + justify-content: flex-end; +} +.tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.tabs.is-boxed a:hover { + background-color: #f5f5f5; + border-bottom-color: #dbdbdb; +} +.tabs.is-boxed li.is-active a { + background-color: #fff; + border-color: #dbdbdb; + border-bottom-color: transparent !important; +} +.tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; +} +.tabs.is-toggle a { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; +} +.tabs.is-toggle a:hover { + background-color: #f5f5f5; + border-color: #b5b5b5; + z-index: 2; +} +.tabs.is-toggle li + li { + margin-left: -1px; +} +.tabs.is-toggle li:first-child a { + border-radius: 4px 0 0 4px; +} +.tabs.is-toggle li:last-child a { + border-radius: 0 4px 4px 0; +} +.tabs.is-toggle li.is-active a { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; + z-index: 1; +} +.tabs.is-toggle ul { + border-bottom: none; +} +.tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 290486px; + border-top-left-radius: 290486px; + padding-left: 1.25em; +} +.tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 290486px; + border-top-right-radius: 290486px; + padding-right: 1.25em; +} +.tabs.is-small { + font-size: 0.75rem; +} +.tabs.is-medium { + font-size: 1.25rem; +} +.tabs.is-large { + font-size: 1.5rem; +} +.box { + background-color: #fff; + border-radius: 6px; + box-shadow: 0 0.5em 1em -0.125em rgba(10,10,10,0.1), 0 0px 0 1px rgba(10,10,10,0.02); + color: #4a4a4a; + display: block; + padding: 1.25rem; +} +a.box:hover, +a.box:focus { + box-shadow: 0 0.5em 1em -0.125em rgba(10,10,10,0.1), 0 0 0 1px #3273dc; +} +a.box:active { + box-shadow: inset 0 1px 2px rgba(10,10,10,0.2), 0 0 0 1px #3273dc; +} +.button { + background-color: #fff; + border-color: #dbdbdb; + border-width: 1px; + color: #363636; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.375em - 1px); + padding-left: 1em; + padding-right: 1em; + padding-top: calc(0.375em - 1px); + text-align: center; + white-space: nowrap; +} +.button strong { + color: inherit; +} +.button .icon, +.button .icon.is-small, +.button .icon.is-medium, +.button .icon.is-large { + height: 1.5em; + width: 1.5em; +} +.button .icon:first-child:not(:last-child) { + margin-left: calc(-0.5em - 1px); + margin-right: 0.25em; +} +.button .icon:last-child:not(:first-child) { + margin-left: 0.25em; + margin-right: calc(-0.5em - 1px); +} +.button .icon:first-child:last-child { + margin-left: calc(-0.5em - 1px); + margin-right: calc(-0.5em - 1px); +} +.button:hover, +.button.is-hovered { + border-color: #b5b5b5; + color: #363636; +} +.button:focus, +.button.is-focused { + border-color: #3273dc; + color: #363636; +} +.button:focus:not(:active), +.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.button:active, +.button.is-active { + border-color: #4a4a4a; + color: #363636; +} +.button.is-text { + background-color: transparent; + border-color: transparent; + color: #4a4a4a; + text-decoration: underline; +} +.button.is-text:hover, +.button.is-text.is-hovered, +.button.is-text:focus, +.button.is-text.is-focused { + background-color: #f5f5f5; + color: #363636; +} +.button.is-text:active, +.button.is-text.is-active { + background-color: #e8e8e8; + color: #363636; +} +.button.is-text[disabled], +fieldset[disabled] .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; +} +.button.is-white { + background-color: #fff; + border-color: transparent; + color: #0a0a0a; +} +.button.is-white:hover, +.button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; +} +.button.is-white:focus, +.button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; +} +.button.is-white:focus:not(:active), +.button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,255,255,0.25); +} +.button.is-white:active, +.button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; +} +.button.is-white[disabled], +fieldset[disabled] .button.is-white { + background-color: #fff; + border-color: transparent; + box-shadow: none; +} +.button.is-white.is-inverted { + background-color: #0a0a0a; + color: #fff; +} +.button.is-white.is-inverted:hover, +.button.is-white.is-inverted.is-hovered { + background-color: #000; +} +.button.is-white.is-inverted[disabled], +fieldset[disabled] .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: #fff; +} +.button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} +.button.is-white.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-white.is-outlined:hover, +.button.is-white.is-outlined.is-hovered, +.button.is-white.is-outlined:focus, +.button.is-white.is-outlined.is-focused { + background-color: #fff; + border-color: #fff; + color: #0a0a0a; +} +.button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-white.is-outlined.is-loading:hover::after, +.button.is-white.is-outlined.is-loading.is-hovered::after, +.button.is-white.is-outlined.is-loading:focus::after, +.button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} +.button.is-white.is-outlined[disabled], +fieldset[disabled] .button.is-white.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; +} +.button.is-white.is-inverted.is-outlined:hover, +.button.is-white.is-inverted.is-outlined.is-hovered, +.button.is-white.is-inverted.is-outlined:focus, +.button.is-white.is-inverted.is-outlined.is-focused { + background-color: #0a0a0a; + color: #fff; +} +.button.is-white.is-inverted.is-outlined.is-loading:hover::after, +.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-white.is-inverted.is-outlined.is-loading:focus::after, +.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-white.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; +} +.button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: #fff; +} +.button.is-black:hover, +.button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: #fff; +} +.button.is-black:focus, +.button.is-black.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-black:focus:not(:active), +.button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10,10,10,0.25); +} +.button.is-black:active, +.button.is-black.is-active { + background-color: #000; + border-color: transparent; + color: #fff; +} +.button.is-black[disabled], +fieldset[disabled] .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; +} +.button.is-black.is-inverted { + background-color: #fff; + color: #0a0a0a; +} +.button.is-black.is-inverted:hover, +.button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-black.is-inverted[disabled], +fieldset[disabled] .button.is-black.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; +} +.button.is-black.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; +} +.button.is-black.is-outlined:hover, +.button.is-black.is-outlined.is-hovered, +.button.is-black.is-outlined:focus, +.button.is-black.is-outlined.is-focused { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff; +} +.button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} +.button.is-black.is-outlined.is-loading:hover::after, +.button.is-black.is-outlined.is-loading.is-hovered::after, +.button.is-black.is-outlined.is-loading:focus::after, +.button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-black.is-outlined[disabled], +fieldset[disabled] .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; +} +.button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-black.is-inverted.is-outlined:hover, +.button.is-black.is-inverted.is-outlined.is-hovered, +.button.is-black.is-inverted.is-outlined:focus, +.button.is-black.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #0a0a0a; +} +.button.is-black.is-inverted.is-outlined.is-loading:hover::after, +.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-black.is-inverted.is-outlined.is-loading:focus::after, +.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} +.button.is-black.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-light, +article.article .article-more { + background-color: #f5f5f5; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light:hover, +article.article .article-more:hover, +.button.is-light.is-hovered, +article.article .article-more.is-hovered { + background-color: #eee; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light:focus, +article.article .article-more:focus, +.button.is-light.is-focused, +article.article .article-more.is-focused { + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light:focus:not(:active), +article.article .article-more:focus:not(:active), +.button.is-light.is-focused:not(:active), +article.article .article-more.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(245,245,245,0.25); +} +.button.is-light:active, +article.article .article-more:active, +.button.is-light.is-active, +article.article .article-more.is-active { + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-light[disabled], +article.article .article-more[disabled], +fieldset[disabled] .button.is-light, +fieldset[disabled] article.article .article-more { + background-color: #f5f5f5; + border-color: transparent; + box-shadow: none; +} +.button.is-light.is-inverted, +article.article .article-more.is-inverted { + background-color: rgba(0,0,0,0.7); + color: #f5f5f5; +} +.button.is-light.is-inverted:hover, +article.article .article-more.is-inverted:hover, +.button.is-light.is-inverted.is-hovered, +article.article .article-more.is-inverted.is-hovered { + background-color: rgba(0,0,0,0.7); +} +.button.is-light.is-inverted[disabled], +article.article .article-more.is-inverted[disabled], +fieldset[disabled] .button.is-light.is-inverted, +fieldset[disabled] article.article .article-more.is-inverted { + background-color: rgba(0,0,0,0.7); + border-color: transparent; + box-shadow: none; + color: #f5f5f5; +} +.button.is-light.is-loading::after, +article.article .article-more.is-loading::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-light.is-outlined, +article.article .article-more.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + color: #f5f5f5; +} +.button.is-light.is-outlined:hover, +article.article .article-more.is-outlined:hover, +.button.is-light.is-outlined.is-hovered, +article.article .article-more.is-outlined.is-hovered, +.button.is-light.is-outlined:focus, +article.article .article-more.is-outlined:focus, +.button.is-light.is-outlined.is-focused, +article.article .article-more.is-outlined.is-focused { + background-color: #f5f5f5; + border-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.button.is-light.is-outlined.is-loading::after, +article.article .article-more.is-outlined.is-loading::after { + border-color: transparent transparent #f5f5f5 #f5f5f5 !important; +} +.button.is-light.is-outlined.is-loading:hover::after, +article.article .article-more.is-outlined.is-loading:hover::after, +.button.is-light.is-outlined.is-loading.is-hovered::after, +article.article .article-more.is-outlined.is-loading.is-hovered::after, +.button.is-light.is-outlined.is-loading:focus::after, +article.article .article-more.is-outlined.is-loading:focus::after, +.button.is-light.is-outlined.is-loading.is-focused::after, +article.article .article-more.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-light.is-outlined[disabled], +article.article .article-more.is-outlined[disabled], +fieldset[disabled] .button.is-light.is-outlined, +fieldset[disabled] article.article .article-more.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + box-shadow: none; + color: #f5f5f5; +} +.button.is-light.is-inverted.is-outlined, +article.article .article-more.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + color: rgba(0,0,0,0.7); +} +.button.is-light.is-inverted.is-outlined:hover, +article.article .article-more.is-inverted.is-outlined:hover, +.button.is-light.is-inverted.is-outlined.is-hovered, +article.article .article-more.is-inverted.is-outlined.is-hovered, +.button.is-light.is-inverted.is-outlined:focus, +article.article .article-more.is-inverted.is-outlined:focus, +.button.is-light.is-inverted.is-outlined.is-focused, +article.article .article-more.is-inverted.is-outlined.is-focused { + background-color: rgba(0,0,0,0.7); + color: #f5f5f5; +} +.button.is-light.is-inverted.is-outlined.is-loading:hover::after, +article.article .article-more.is-inverted.is-outlined.is-loading:hover::after, +.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, +article.article .article-more.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-light.is-inverted.is-outlined.is-loading:focus::after, +article.article .article-more.is-inverted.is-outlined.is-loading:focus::after, +.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after, +article.article .article-more.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #f5f5f5 #f5f5f5 !important; +} +.button.is-light.is-inverted.is-outlined[disabled], +article.article .article-more.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-light.is-inverted.is-outlined, +fieldset[disabled] article.article .article-more.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + box-shadow: none; + color: rgba(0,0,0,0.7); +} +.button.is-dark { + background-color: #363636; + border-color: transparent; + color: #fff; +} +.button.is-dark:hover, +.button.is-dark.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: #fff; +} +.button.is-dark:focus, +.button.is-dark.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-dark:focus:not(:active), +.button.is-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(54,54,54,0.25); +} +.button.is-dark:active, +.button.is-dark.is-active { + background-color: #292929; + border-color: transparent; + color: #fff; +} +.button.is-dark[disabled], +fieldset[disabled] .button.is-dark { + background-color: #363636; + border-color: transparent; + box-shadow: none; +} +.button.is-dark.is-inverted { + background-color: #fff; + color: #363636; +} +.button.is-dark.is-inverted:hover, +.button.is-dark.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-dark.is-inverted[disabled], +fieldset[disabled] .button.is-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #363636; +} +.button.is-dark.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} +.button.is-dark.is-outlined:hover, +.button.is-dark.is-outlined.is-hovered, +.button.is-dark.is-outlined:focus, +.button.is-dark.is-outlined.is-focused { + background-color: #363636; + border-color: #363636; + color: #fff; +} +.button.is-dark.is-outlined.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-dark.is-outlined.is-loading:hover::after, +.button.is-dark.is-outlined.is-loading.is-hovered::after, +.button.is-dark.is-outlined.is-loading:focus::after, +.button.is-dark.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-dark.is-outlined[disabled], +fieldset[disabled] .button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; +} +.button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-dark.is-inverted.is-outlined:hover, +.button.is-dark.is-inverted.is-outlined.is-hovered, +.button.is-dark.is-inverted.is-outlined:focus, +.button.is-dark.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #363636; +} +.button.is-dark.is-inverted.is-outlined.is-loading:hover::after, +.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-dark.is-inverted.is-outlined.is-loading:focus::after, +.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-dark.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-primary { + background-color: #3273dc; + border-color: transparent; + color: #fff; +} +.button.is-primary:hover, +.button.is-primary.is-hovered { + background-color: #276cda; + border-color: transparent; + color: #fff; +} +.button.is-primary:focus, +.button.is-primary.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-primary:focus:not(:active), +.button.is-primary.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.button.is-primary:active, +.button.is-primary.is-active { + background-color: #2366d1; + border-color: transparent; + color: #fff; +} +.button.is-primary[disabled], +fieldset[disabled] .button.is-primary { + background-color: #3273dc; + border-color: transparent; + box-shadow: none; +} +.button.is-primary.is-inverted { + background-color: #fff; + color: #3273dc; +} +.button.is-primary.is-inverted:hover, +.button.is-primary.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-primary.is-inverted[disabled], +fieldset[disabled] .button.is-primary.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #3273dc; +} +.button.is-primary.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-primary.is-outlined { + background-color: transparent; + border-color: #3273dc; + color: #3273dc; +} +.button.is-primary.is-outlined:hover, +.button.is-primary.is-outlined.is-hovered, +.button.is-primary.is-outlined:focus, +.button.is-primary.is-outlined.is-focused { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} +.button.is-primary.is-outlined.is-loading::after { + border-color: transparent transparent #3273dc #3273dc !important; +} +.button.is-primary.is-outlined.is-loading:hover::after, +.button.is-primary.is-outlined.is-loading.is-hovered::after, +.button.is-primary.is-outlined.is-loading:focus::after, +.button.is-primary.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-primary.is-outlined[disabled], +fieldset[disabled] .button.is-primary.is-outlined { + background-color: transparent; + border-color: #3273dc; + box-shadow: none; + color: #3273dc; +} +.button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-primary.is-inverted.is-outlined:hover, +.button.is-primary.is-inverted.is-outlined.is-hovered, +.button.is-primary.is-inverted.is-outlined:focus, +.button.is-primary.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #3273dc; +} +.button.is-primary.is-inverted.is-outlined.is-loading:hover::after, +.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-primary.is-inverted.is-outlined.is-loading:focus::after, +.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #3273dc #3273dc !important; +} +.button.is-primary.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-primary.is-light { + background-color: #eef3fc; + color: #2160c4; +} +.button.is-primary.is-light:hover, +.button.is-primary.is-light.is-hovered { + background-color: #e3ecfa; + border-color: transparent; + color: #2160c4; +} +.button.is-primary.is-light:active, +.button.is-primary.is-light.is-active { + background-color: #d8e4f8; + border-color: transparent; + color: #2160c4; +} +.button.is-link { + background-color: #3273dc; + border-color: transparent; + color: #fff; +} +.button.is-link:hover, +.button.is-link.is-hovered { + background-color: #276cda; + border-color: transparent; + color: #fff; +} +.button.is-link:focus, +.button.is-link.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-link:focus:not(:active), +.button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.button.is-link:active, +.button.is-link.is-active { + background-color: #2366d1; + border-color: transparent; + color: #fff; +} +.button.is-link[disabled], +fieldset[disabled] .button.is-link { + background-color: #3273dc; + border-color: transparent; + box-shadow: none; +} +.button.is-link.is-inverted { + background-color: #fff; + color: #3273dc; +} +.button.is-link.is-inverted:hover, +.button.is-link.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-link.is-inverted[disabled], +fieldset[disabled] .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #3273dc; +} +.button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-link.is-outlined { + background-color: transparent; + border-color: #3273dc; + color: #3273dc; +} +.button.is-link.is-outlined:hover, +.button.is-link.is-outlined.is-hovered, +.button.is-link.is-outlined:focus, +.button.is-link.is-outlined.is-focused { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} +.button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #3273dc #3273dc !important; +} +.button.is-link.is-outlined.is-loading:hover::after, +.button.is-link.is-outlined.is-loading.is-hovered::after, +.button.is-link.is-outlined.is-loading:focus::after, +.button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-link.is-outlined[disabled], +fieldset[disabled] .button.is-link.is-outlined { + background-color: transparent; + border-color: #3273dc; + box-shadow: none; + color: #3273dc; +} +.button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-link.is-inverted.is-outlined:hover, +.button.is-link.is-inverted.is-outlined.is-hovered, +.button.is-link.is-inverted.is-outlined:focus, +.button.is-link.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #3273dc; +} +.button.is-link.is-inverted.is-outlined.is-loading:hover::after, +.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-link.is-inverted.is-outlined.is-loading:focus::after, +.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #3273dc #3273dc !important; +} +.button.is-link.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-link.is-light { + background-color: #eef3fc; + color: #2160c4; +} +.button.is-link.is-light:hover, +.button.is-link.is-light.is-hovered { + background-color: #e3ecfa; + border-color: transparent; + color: #2160c4; +} +.button.is-link.is-light:active, +.button.is-link.is-light.is-active { + background-color: #d8e4f8; + border-color: transparent; + color: #2160c4; +} +.button.is-info { + background-color: #3298dc; + border-color: transparent; + color: #fff; +} +.button.is-info:hover, +.button.is-info.is-hovered { + background-color: #2793da; + border-color: transparent; + color: #fff; +} +.button.is-info:focus, +.button.is-info.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-info:focus:not(:active), +.button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(50,152,220,0.25); +} +.button.is-info:active, +.button.is-info.is-active { + background-color: #238cd1; + border-color: transparent; + color: #fff; +} +.button.is-info[disabled], +fieldset[disabled] .button.is-info { + background-color: #3298dc; + border-color: transparent; + box-shadow: none; +} +.button.is-info.is-inverted { + background-color: #fff; + color: #3298dc; +} +.button.is-info.is-inverted:hover, +.button.is-info.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-info.is-inverted[disabled], +fieldset[disabled] .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #3298dc; +} +.button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-info.is-outlined { + background-color: transparent; + border-color: #3298dc; + color: #3298dc; +} +.button.is-info.is-outlined:hover, +.button.is-info.is-outlined.is-hovered, +.button.is-info.is-outlined:focus, +.button.is-info.is-outlined.is-focused { + background-color: #3298dc; + border-color: #3298dc; + color: #fff; +} +.button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #3298dc #3298dc !important; +} +.button.is-info.is-outlined.is-loading:hover::after, +.button.is-info.is-outlined.is-loading.is-hovered::after, +.button.is-info.is-outlined.is-loading:focus::after, +.button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-info.is-outlined[disabled], +fieldset[disabled] .button.is-info.is-outlined { + background-color: transparent; + border-color: #3298dc; + box-shadow: none; + color: #3298dc; +} +.button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-info.is-inverted.is-outlined:hover, +.button.is-info.is-inverted.is-outlined.is-hovered, +.button.is-info.is-inverted.is-outlined:focus, +.button.is-info.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #3298dc; +} +.button.is-info.is-inverted.is-outlined.is-loading:hover::after, +.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-info.is-inverted.is-outlined.is-loading:focus::after, +.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #3298dc #3298dc !important; +} +.button.is-info.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-info.is-light { + background-color: #eef6fc; + color: #1d72aa; +} +.button.is-info.is-light:hover, +.button.is-info.is-light.is-hovered { + background-color: #e3f1fa; + border-color: transparent; + color: #1d72aa; +} +.button.is-info.is-light:active, +.button.is-info.is-light.is-active { + background-color: #d8ebf8; + border-color: transparent; + color: #1d72aa; +} +.button.is-success { + background-color: #48c774; + border-color: transparent; + color: #fff; +} +.button.is-success:hover, +.button.is-success.is-hovered { + background-color: #3ec46d; + border-color: transparent; + color: #fff; +} +.button.is-success:focus, +.button.is-success.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-success:focus:not(:active), +.button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(72,199,116,0.25); +} +.button.is-success:active, +.button.is-success.is-active { + background-color: #3abb67; + border-color: transparent; + color: #fff; +} +.button.is-success[disabled], +fieldset[disabled] .button.is-success { + background-color: #48c774; + border-color: transparent; + box-shadow: none; +} +.button.is-success.is-inverted { + background-color: #fff; + color: #48c774; +} +.button.is-success.is-inverted:hover, +.button.is-success.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-success.is-inverted[disabled], +fieldset[disabled] .button.is-success.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #48c774; +} +.button.is-success.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-success.is-outlined { + background-color: transparent; + border-color: #48c774; + color: #48c774; +} +.button.is-success.is-outlined:hover, +.button.is-success.is-outlined.is-hovered, +.button.is-success.is-outlined:focus, +.button.is-success.is-outlined.is-focused { + background-color: #48c774; + border-color: #48c774; + color: #fff; +} +.button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #48c774 #48c774 !important; +} +.button.is-success.is-outlined.is-loading:hover::after, +.button.is-success.is-outlined.is-loading.is-hovered::after, +.button.is-success.is-outlined.is-loading:focus::after, +.button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-success.is-outlined[disabled], +fieldset[disabled] .button.is-success.is-outlined { + background-color: transparent; + border-color: #48c774; + box-shadow: none; + color: #48c774; +} +.button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-success.is-inverted.is-outlined:hover, +.button.is-success.is-inverted.is-outlined.is-hovered, +.button.is-success.is-inverted.is-outlined:focus, +.button.is-success.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #48c774; +} +.button.is-success.is-inverted.is-outlined.is-loading:hover::after, +.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-success.is-inverted.is-outlined.is-loading:focus::after, +.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #48c774 #48c774 !important; +} +.button.is-success.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-success.is-light { + background-color: #effaf3; + color: #257942; +} +.button.is-success.is-light:hover, +.button.is-success.is-light.is-hovered { + background-color: #e6f7ec; + border-color: transparent; + color: #257942; +} +.button.is-success.is-light:active, +.button.is-success.is-light.is-active { + background-color: #dcf4e4; + border-color: transparent; + color: #257942; +} +.button.is-warning { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-warning:hover, +.button.is-warning.is-hovered { + background-color: #ffdb4a; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-warning:focus, +.button.is-warning.is-focused { + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-warning:focus:not(:active), +.button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,221,87,0.25); +} +.button.is-warning:active, +.button.is-warning.is-active { + background-color: #ffd83d; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.button.is-warning[disabled], +fieldset[disabled] .button.is-warning { + background-color: #ffdd57; + border-color: transparent; + box-shadow: none; +} +.button.is-warning.is-inverted { + background-color: rgba(0,0,0,0.7); + color: #ffdd57; +} +.button.is-warning.is-inverted:hover, +.button.is-warning.is-inverted.is-hovered { + background-color: rgba(0,0,0,0.7); +} +.button.is-warning.is-inverted[disabled], +fieldset[disabled] .button.is-warning.is-inverted { + background-color: rgba(0,0,0,0.7); + border-color: transparent; + box-shadow: none; + color: #ffdd57; +} +.button.is-warning.is-loading::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + color: #ffdd57; +} +.button.is-warning.is-outlined:hover, +.button.is-warning.is-outlined.is-hovered, +.button.is-warning.is-outlined:focus, +.button.is-warning.is-outlined.is-focused { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; +} +.button.is-warning.is-outlined.is-loading:hover::after, +.button.is-warning.is-outlined.is-loading.is-hovered::after, +.button.is-warning.is-outlined.is-loading:focus::after, +.button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important; +} +.button.is-warning.is-outlined[disabled], +fieldset[disabled] .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + box-shadow: none; + color: #ffdd57; +} +.button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + color: rgba(0,0,0,0.7); +} +.button.is-warning.is-inverted.is-outlined:hover, +.button.is-warning.is-inverted.is-outlined.is-hovered, +.button.is-warning.is-inverted.is-outlined:focus, +.button.is-warning.is-inverted.is-outlined.is-focused { + background-color: rgba(0,0,0,0.7); + color: #ffdd57; +} +.button.is-warning.is-inverted.is-outlined.is-loading:hover::after, +.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-warning.is-inverted.is-outlined.is-loading:focus::after, +.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; +} +.button.is-warning.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,0.7); + box-shadow: none; + color: rgba(0,0,0,0.7); +} +.button.is-warning.is-light { + background-color: #fffbeb; + color: #947600; +} +.button.is-warning.is-light:hover, +.button.is-warning.is-light.is-hovered { + background-color: #fff8de; + border-color: transparent; + color: #947600; +} +.button.is-warning.is-light:active, +.button.is-warning.is-light.is-active { + background-color: #fff6d1; + border-color: transparent; + color: #947600; +} +.button.is-danger { + background-color: #f14668; + border-color: transparent; + color: #fff; +} +.button.is-danger:hover, +.button.is-danger.is-hovered { + background-color: #f03a5f; + border-color: transparent; + color: #fff; +} +.button.is-danger:focus, +.button.is-danger.is-focused { + border-color: transparent; + color: #fff; +} +.button.is-danger:focus:not(:active), +.button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(241,70,104,0.25); +} +.button.is-danger:active, +.button.is-danger.is-active { + background-color: #ef2e55; + border-color: transparent; + color: #fff; +} +.button.is-danger[disabled], +fieldset[disabled] .button.is-danger { + background-color: #f14668; + border-color: transparent; + box-shadow: none; +} +.button.is-danger.is-inverted { + background-color: #fff; + color: #f14668; +} +.button.is-danger.is-inverted:hover, +.button.is-danger.is-inverted.is-hovered { + background-color: #f2f2f2; +} +.button.is-danger.is-inverted[disabled], +fieldset[disabled] .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #f14668; +} +.button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-danger.is-outlined { + background-color: transparent; + border-color: #f14668; + color: #f14668; +} +.button.is-danger.is-outlined:hover, +.button.is-danger.is-outlined.is-hovered, +.button.is-danger.is-outlined:focus, +.button.is-danger.is-outlined.is-focused { + background-color: #f14668; + border-color: #f14668; + color: #fff; +} +.button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #f14668 #f14668 !important; +} +.button.is-danger.is-outlined.is-loading:hover::after, +.button.is-danger.is-outlined.is-loading.is-hovered::after, +.button.is-danger.is-outlined.is-loading:focus::after, +.button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} +.button.is-danger.is-outlined[disabled], +fieldset[disabled] .button.is-danger.is-outlined { + background-color: transparent; + border-color: #f14668; + box-shadow: none; + color: #f14668; +} +.button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} +.button.is-danger.is-inverted.is-outlined:hover, +.button.is-danger.is-inverted.is-outlined.is-hovered, +.button.is-danger.is-inverted.is-outlined:focus, +.button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #f14668; +} +.button.is-danger.is-inverted.is-outlined.is-loading:hover::after, +.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-danger.is-inverted.is-outlined.is-loading:focus::after, +.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #f14668 #f14668 !important; +} +.button.is-danger.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} +.button.is-danger.is-light { + background-color: #feecf0; + color: #cc0f35; +} +.button.is-danger.is-light:hover, +.button.is-danger.is-light.is-hovered { + background-color: #fde0e6; + border-color: transparent; + color: #cc0f35; +} +.button.is-danger.is-light:active, +.button.is-danger.is-light.is-active { + background-color: #fcd4dc; + border-color: transparent; + color: #cc0f35; +} +.button.is-grey-lightest { + background-color: #ededed; + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest:hover, +.button.is-grey-lightest.is-hovered { + background-color: #e7e7e7; + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest:focus, +.button.is-grey-lightest.is-focused { + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest:focus:not(:active), +.button.is-grey-lightest.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(237,237,237,0.25); +} +.button.is-grey-lightest:active, +.button.is-grey-lightest.is-active { + background-color: #e0e0e0; + border-color: transparent; + color: #363636; +} +.button.is-grey-lightest[disabled], +fieldset[disabled] .button.is-grey-lightest { + background-color: #ededed; + border-color: transparent; + box-shadow: none; +} +.button.is-grey-lightest.is-inverted { + background-color: #363636; + color: #ededed; +} +.button.is-grey-lightest.is-inverted:hover, +.button.is-grey-lightest.is-inverted.is-hovered { + background-color: #292929; +} +.button.is-grey-lightest.is-inverted[disabled], +fieldset[disabled] .button.is-grey-lightest.is-inverted { + background-color: #363636; + border-color: transparent; + box-shadow: none; + color: #ededed; +} +.button.is-grey-lightest.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-grey-lightest.is-outlined { + background-color: transparent; + border-color: #ededed; + color: #ededed; +} +.button.is-grey-lightest.is-outlined:hover, +.button.is-grey-lightest.is-outlined.is-hovered, +.button.is-grey-lightest.is-outlined:focus, +.button.is-grey-lightest.is-outlined.is-focused { + background-color: #ededed; + border-color: #ededed; + color: #363636; +} +.button.is-grey-lightest.is-outlined.is-loading::after { + border-color: transparent transparent #ededed #ededed !important; +} +.button.is-grey-lightest.is-outlined.is-loading:hover::after, +.button.is-grey-lightest.is-outlined.is-loading.is-hovered::after, +.button.is-grey-lightest.is-outlined.is-loading:focus::after, +.button.is-grey-lightest.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; +} +.button.is-grey-lightest.is-outlined[disabled], +fieldset[disabled] .button.is-grey-lightest.is-outlined { + background-color: transparent; + border-color: #ededed; + box-shadow: none; + color: #ededed; +} +.button.is-grey-lightest.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} +.button.is-grey-lightest.is-inverted.is-outlined:hover, +.button.is-grey-lightest.is-inverted.is-outlined.is-hovered, +.button.is-grey-lightest.is-inverted.is-outlined:focus, +.button.is-grey-lightest.is-inverted.is-outlined.is-focused { + background-color: #363636; + color: #ededed; +} +.button.is-grey-lightest.is-inverted.is-outlined.is-loading:hover::after, +.button.is-grey-lightest.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-grey-lightest.is-inverted.is-outlined.is-loading:focus::after, +.button.is-grey-lightest.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ededed #ededed !important; +} +.button.is-grey-lightest.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-grey-lightest.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; +} +.button.is-small { + border-radius: 2px; + font-size: 0.75rem; +} +.button.is-normal { + font-size: 1rem; +} +.button.is-medium { + font-size: 1.25rem; +} +.button.is-large { + font-size: 1.5rem; +} +.button[disabled], +fieldset[disabled] .button { + background-color: #fff; + border-color: #dbdbdb; + box-shadow: none; + opacity: 0.5; +} +.button.is-fullwidth { + display: flex; + width: 100%; +} +.button.is-loading { + color: transparent !important; + pointer-events: none; +} +.button.is-loading::after { + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; +} +.button.is-static { + background-color: #f5f5f5; + border-color: #dbdbdb; + color: #7a7a7a; + box-shadow: none; + pointer-events: none; +} +.button.is-rounded { + border-radius: 290486px; + padding-left: calc(1em + 0.25em); + padding-right: calc(1em + 0.25em); +} +.buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.buttons .button { + margin-bottom: 0.5rem; +} +.buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; +} +.buttons:last-child { + margin-bottom: -0.5rem; +} +.buttons:not(:last-child) { + margin-bottom: 1rem; +} +.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + border-radius: 2px; + font-size: 0.75rem; +} +.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; +} +.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; +} +.buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; +} +.buttons.has-addons .button:last-child { + margin-right: 0; +} +.buttons.has-addons .button:hover, +.buttons.has-addons .button.is-hovered { + z-index: 2; +} +.buttons.has-addons .button:focus, +.buttons.has-addons .button.is-focused, +.buttons.has-addons .button:active, +.buttons.has-addons .button.is-active, +.buttons.has-addons .button.is-selected { + z-index: 3; +} +.buttons.has-addons .button:focus:hover, +.buttons.has-addons .button.is-focused:hover, +.buttons.has-addons .button:active:hover, +.buttons.has-addons .button.is-active:hover, +.buttons.has-addons .button.is-selected:hover { + z-index: 4; +} +.buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.buttons.is-centered { + justify-content: center; +} +.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; +} +.buttons.is-right { + justify-content: flex-end; +} +.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; +} +.container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; +} +.container.is-fluid { + max-width: none; + padding-left: 64px; + padding-right: 64px; + width: 100%; +} +@media screen and (min-width: 1088px) { + .container { + max-width: 960px; + } +} +@media screen and (max-width: 1279px) { + .container.is-widescreen { + max-width: 1152px; + } +} +@media screen and (max-width: 1471px) { + .container.is-fullhd { + max-width: 1344px; + } +} +@media screen and (min-width: 1280px) { + .container { + max-width: 1152px; + } +} +@media screen and (min-width: 1472px) { + .container { + max-width: 1344px; + } +} +.content li + li { + margin-top: 0.25em; +} +.content p:not(:last-child), +.content dl:not(:last-child), +.content ol:not(:last-child), +.content ul:not(:last-child), +.content blockquote:not(:last-child), +.content pre:not(:last-child), +.content table:not(:last-child) { + margin-bottom: 1em; +} +.content h1, +.content h2, +.content h3, +.content h4, +.content h5, +.content h6 { + color: #363636; + font-weight: 400; + line-height: 1.125; +} +.content h1 { + font-size: 2em; + margin-bottom: 0.5em; +} +.content h1:not(:first-child) { + margin-top: 1em; +} +.content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; +} +.content h2:not(:first-child) { + margin-top: 1.1428em; +} +.content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; +} +.content h3:not(:first-child) { + margin-top: 1.3333em; +} +.content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; +} +.content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; +} +.content h6 { + font-size: 1em; + margin-bottom: 1em; +} +.content blockquote { + background-color: #f5f5f5; + border-left: 5px solid #dbdbdb; + padding: 1.25em 1.5em; +} +.content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; +} +.content ol:not([type]) { + list-style-type: decimal; +} +.content ol:not([type]).is-lower-alpha { + list-style-type: lower-alpha; +} +.content ol:not([type]).is-lower-roman { + list-style-type: lower-roman; +} +.content ol:not([type]).is-upper-alpha { + list-style-type: upper-alpha; +} +.content ol:not([type]).is-upper-roman { + list-style-type: upper-roman; +} +.content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; +} +.content ul ul { + list-style-type: circle; + margin-top: 0.5em; +} +.content ul ul ul { + list-style-type: square; +} +.content dd { + margin-left: 2em; +} +.content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; +} +.content figure:not(:first-child) { + margin-top: 2em; +} +.content figure:not(:last-child) { + margin-bottom: 2em; +} +.content figure img { + display: inline-block; +} +.content figure figcaption { + font-style: italic; +} +.content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 1.25em 1.5em; + white-space: pre; + word-wrap: normal; +} +.content sup, +.content sub { + font-size: 75%; +} +.content table { + width: 100%; +} +.content table td, +.content table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} +.content table th { + color: #363636; +} +.content table th:not([align]) { + text-align: left; +} +.content table thead td, +.content table thead th { + border-width: 0 0 2px; + color: #363636; +} +.content table tfoot td, +.content table tfoot th { + border-width: 2px 0 0; + color: #363636; +} +.content table tbody tr:last-child td, +.content table tbody tr:last-child th { + border-bottom-width: 0; +} +.content .tabs li + li { + margin-top: 0; +} +.content.is-small { + font-size: 0.75rem; +} +.content.is-medium { + font-size: 1.25rem; +} +.content.is-large { + font-size: 1.5rem; +} +.icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; +} +.icon.is-small { + height: 1rem; + width: 1rem; +} +.icon.is-medium { + height: 2rem; + width: 2rem; +} +.icon.is-large { + height: 3rem; + width: 3rem; +} +.image { + display: block; + position: relative; +} +.image img { + display: block; + height: auto; + width: 100%; +} +.image img.is-rounded { + border-radius: 290486px; +} +.image.is-fullwidth { + width: 100%; +} +.image.is-square img, +.image.is-1by1 img, +.image.is-5by4 img, +.image.is-4by3 img, +.image.is-3by2 img, +.image.is-5by3 img, +.image.is-16by9 img, +.image.is-2by1 img, +.image.is-3by1 img, +.image.is-4by5 img, +.image.is-3by4 img, +.image.is-2by3 img, +.image.is-3by5 img, +.image.is-9by16 img, +.image.is-1by2 img, +.image.is-1by3 img, +.image.is-square .has-ratio, +.image.is-1by1 .has-ratio, +.image.is-5by4 .has-ratio, +.image.is-4by3 .has-ratio, +.image.is-3by2 .has-ratio, +.image.is-5by3 .has-ratio, +.image.is-16by9 .has-ratio, +.image.is-2by1 .has-ratio, +.image.is-3by1 .has-ratio, +.image.is-4by5 .has-ratio, +.image.is-3by4 .has-ratio, +.image.is-2by3 .has-ratio, +.image.is-3by5 .has-ratio, +.image.is-9by16 .has-ratio, +.image.is-1by2 .has-ratio, +.image.is-1by3 .has-ratio { + height: 100%; + width: 100%; +} +.image.is-square, +.image.is-1by1 { + padding-top: 100%; +} +.image.is-5by4 { + padding-top: 80%; +} +.image.is-4by3 { + padding-top: 75%; +} +.image.is-3by2 { + padding-top: 66.6666%; +} +.image.is-5by3 { + padding-top: 60%; +} +.image.is-16by9 { + padding-top: 56.25%; +} +.image.is-2by1 { + padding-top: 50%; +} +.image.is-3by1 { + padding-top: 33.3333%; +} +.image.is-4by5 { + padding-top: 125%; +} +.image.is-3by4 { + padding-top: 133.3333%; +} +.image.is-2by3 { + padding-top: 150%; +} +.image.is-3by5 { + padding-top: 166.6666%; +} +.image.is-9by16 { + padding-top: 177.7777%; +} +.image.is-1by2 { + padding-top: 200%; +} +.image.is-1by3 { + padding-top: 300%; +} +.image.is-16x16 { + height: 16px; + width: 16px; +} +.image.is-24x24 { + height: 24px; + width: 24px; +} +.image.is-32x32 { + height: 32px; + width: 32px; +} +.image.is-48x48 { + height: 48px; + width: 48px; +} +.image.is-64x64 { + height: 64px; + width: 64px; +} +.image.is-96x96 { + height: 96px; + width: 96px; +} +.image.is-128x128 { + height: 128px; + width: 128px; +} +.notification { + background-color: #f5f5f5; + border-radius: 4px; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; +} +.notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; +} +.notification strong { + color: currentColor; +} +.notification code, +.notification pre { + background: #fff; +} +.notification pre code { + background: transparent; +} +.notification > .delete { + position: absolute; + right: 0.5rem; + top: 0.5rem; +} +.notification .title, +.notification .subtitle, +.notification .content { + color: currentColor; +} +.notification.is-white { + background-color: #fff; + color: #0a0a0a; +} +.notification.is-black { + background-color: #0a0a0a; + color: #fff; +} +.notification.is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.notification.is-dark { + background-color: #363636; + color: #fff; +} +.notification.is-primary { + background-color: #3273dc; + color: #fff; +} +.notification.is-link { + background-color: #3273dc; + color: #fff; +} +.notification.is-info { + background-color: #3298dc; + color: #fff; +} +.notification.is-success { + background-color: #48c774; + color: #fff; +} +.notification.is-warning { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.notification.is-danger { + background-color: #f14668; + color: #fff; +} +.notification.is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 1rem; + overflow: hidden; + padding: 0; + width: 100%; +} +.progress::-webkit-progress-bar { + background-color: #ededed; +} +.progress::-webkit-progress-value { + background-color: #4a4a4a; +} +.progress::-moz-progress-bar { + background-color: #4a4a4a; +} +.progress::-ms-fill { + background-color: #4a4a4a; + border: none; +} +.progress.is-white::-webkit-progress-value { + background-color: #fff; +} +.progress.is-white::-moz-progress-bar { + background-color: #fff; +} +.progress.is-white::-ms-fill { + background-color: #fff; +} +.progress.is-white:indeterminate { + background-image: linear-gradient(to right, #fff 30%, #ededed 30%); +} +.progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; +} +.progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; +} +.progress.is-black::-ms-fill { + background-color: #0a0a0a; +} +.progress.is-black:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #ededed 30%); +} +.progress.is-light::-webkit-progress-value { + background-color: #f5f5f5; +} +.progress.is-light::-moz-progress-bar { + background-color: #f5f5f5; +} +.progress.is-light::-ms-fill { + background-color: #f5f5f5; +} +.progress.is-light:indeterminate { + background-image: linear-gradient(to right, #f5f5f5 30%, #ededed 30%); +} +.progress.is-dark::-webkit-progress-value { + background-color: #363636; +} +.progress.is-dark::-moz-progress-bar { + background-color: #363636; +} +.progress.is-dark::-ms-fill { + background-color: #363636; +} +.progress.is-dark:indeterminate { + background-image: linear-gradient(to right, #363636 30%, #ededed 30%); +} +.progress.is-primary::-webkit-progress-value { + background-color: #3273dc; +} +.progress.is-primary::-moz-progress-bar { + background-color: #3273dc; +} +.progress.is-primary::-ms-fill { + background-color: #3273dc; +} +.progress.is-primary:indeterminate { + background-image: linear-gradient(to right, #3273dc 30%, #ededed 30%); +} +.progress.is-link::-webkit-progress-value { + background-color: #3273dc; +} +.progress.is-link::-moz-progress-bar { + background-color: #3273dc; +} +.progress.is-link::-ms-fill { + background-color: #3273dc; +} +.progress.is-link:indeterminate { + background-image: linear-gradient(to right, #3273dc 30%, #ededed 30%); +} +.progress.is-info::-webkit-progress-value { + background-color: #3298dc; +} +.progress.is-info::-moz-progress-bar { + background-color: #3298dc; +} +.progress.is-info::-ms-fill { + background-color: #3298dc; +} +.progress.is-info:indeterminate { + background-image: linear-gradient(to right, #3298dc 30%, #ededed 30%); +} +.progress.is-success::-webkit-progress-value { + background-color: #48c774; +} +.progress.is-success::-moz-progress-bar { + background-color: #48c774; +} +.progress.is-success::-ms-fill { + background-color: #48c774; +} +.progress.is-success:indeterminate { + background-image: linear-gradient(to right, #48c774 30%, #ededed 30%); +} +.progress.is-warning::-webkit-progress-value { + background-color: #ffdd57; +} +.progress.is-warning::-moz-progress-bar { + background-color: #ffdd57; +} +.progress.is-warning::-ms-fill { + background-color: #ffdd57; +} +.progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ffdd57 30%, #ededed 30%); +} +.progress.is-danger::-webkit-progress-value { + background-color: #f14668; +} +.progress.is-danger::-moz-progress-bar { + background-color: #f14668; +} +.progress.is-danger::-ms-fill { + background-color: #f14668; +} +.progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #f14668 30%, #ededed 30%); +} +.progress.is-grey-lightest::-webkit-progress-value { + background-color: #ededed; +} +.progress.is-grey-lightest::-moz-progress-bar { + background-color: #ededed; +} +.progress.is-grey-lightest::-ms-fill { + background-color: #ededed; +} +.progress.is-grey-lightest:indeterminate { + background-image: linear-gradient(to right, #ededed 30%, #ededed 30%); +} +.progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #ededed; + background-image: linear-gradient(to right, #4a4a4a 30%, #ededed 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; +} +.progress:indeterminate::-webkit-progress-bar { + background-color: transparent; +} +.progress:indeterminate::-moz-progress-bar { + background-color: transparent; +} +.progress.is-small { + height: 0.75rem; +} +.progress.is-medium { + height: 1.25rem; +} +.progress.is-large { + height: 1.5rem; +} +@-moz-keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +@-webkit-keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +@-o-keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +@keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + to { + background-position: -200% 0; + } +} +.table { + background-color: #fff; + color: #363636; +} +.table td, +.table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} +.table td.is-white, +.table th.is-white { + background-color: #fff; + border-color: #fff; + color: #0a0a0a; +} +.table td.is-black, +.table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff; +} +.table td.is-light, +.table th.is-light { + background-color: #f5f5f5; + border-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.table td.is-dark, +.table th.is-dark { + background-color: #363636; + border-color: #363636; + color: #fff; +} +.table td.is-primary, +.table th.is-primary { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} +.table td.is-link, +.table th.is-link { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} +.table td.is-info, +.table th.is-info { + background-color: #3298dc; + border-color: #3298dc; + color: #fff; +} +.table td.is-success, +.table th.is-success { + background-color: #48c774; + border-color: #48c774; + color: #fff; +} +.table td.is-warning, +.table th.is-warning { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.table td.is-danger, +.table th.is-danger { + background-color: #f14668; + border-color: #f14668; + color: #fff; +} +.table td.is-grey-lightest, +.table th.is-grey-lightest { + background-color: #ededed; + border-color: #ededed; + color: #363636; +} +.table td.is-narrow, +.table th.is-narrow { + white-space: nowrap; + width: 1%; +} +.table td.is-selected, +.table th.is-selected { + background-color: #3273dc; + color: #fff; +} +.table td.is-selected a, +.table th.is-selected a, +.table td.is-selected strong, +.table th.is-selected strong { + color: currentColor; +} +.table th { + color: #363636; +} +.table th:not([align]) { + text-align: left; +} +.table tr.is-selected { + background-color: #3273dc; + color: #fff; +} +.table tr.is-selected a, +.table tr.is-selected strong { + color: currentColor; +} +.table tr.is-selected td, +.table tr.is-selected th { + border-color: #fff; + color: currentColor; +} +.table thead { + background-color: transparent; +} +.table thead td, +.table thead th { + border-width: 0 0 2px; + color: #363636; +} +.table tfoot { + background-color: transparent; +} +.table tfoot td, +.table tfoot th { + border-width: 2px 0 0; + color: #363636; +} +.table tbody { + background-color: transparent; +} +.table tbody tr:last-child td, +.table tbody tr:last-child th { + border-bottom-width: 0; +} +.table.is-bordered td, +.table.is-bordered th { + border-width: 1px; +} +.table.is-bordered tr:last-child td, +.table.is-bordered tr:last-child th { + border-bottom-width: 1px; +} +.table.is-fullwidth { + width: 100%; +} +.table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #fafafa; +} +.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #fafafa; +} +.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: #f5f5f5; +} +.table.is-narrow td, +.table.is-narrow th { + padding: 0.25em 0.5em; +} +.table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #fafafa; +} +.table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; +} +.tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.tags .tag { + margin-bottom: 0.5rem; +} +.tags .tag:not(:last-child) { + margin-right: 0.5rem; +} +.tags:last-child { + margin-bottom: -0.5rem; +} +.tags:not(:last-child) { + margin-bottom: 1rem; +} +.tags.are-medium .tag:not(.is-normal):not(.is-large) { + font-size: 1rem; +} +.tags.are-large .tag:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; +} +.tags.is-centered { + justify-content: center; +} +.tags.is-centered .tag { + margin-right: 0.25rem; + margin-left: 0.25rem; +} +.tags.is-right { + justify-content: flex-end; +} +.tags.is-right .tag:not(:first-child) { + margin-left: 0.5rem; +} +.tags.is-right .tag:not(:last-child) { + margin-right: 0; +} +.tags.has-addons .tag { + margin-right: 0; +} +.tags.has-addons .tag:not(:first-child) { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.tags.has-addons .tag:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.tag:not(body) { + align-items: center; + background-color: #f5f5f5; + border-radius: 4px; + color: #4a4a4a; + display: inline-flex; + font-size: 0.75rem; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} +.tag:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; +} +.tag:not(body).is-white { + background-color: #fff; + color: #0a0a0a; +} +.tag:not(body).is-black { + background-color: #0a0a0a; + color: #fff; +} +.tag:not(body).is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.tag:not(body).is-dark { + background-color: #363636; + color: #fff; +} +.tag:not(body).is-primary { + background-color: #3273dc; + color: #fff; +} +.tag:not(body).is-primary.is-light { + background-color: #eef3fc; + color: #2160c4; +} +.tag:not(body).is-link { + background-color: #3273dc; + color: #fff; +} +.tag:not(body).is-link.is-light { + background-color: #eef3fc; + color: #2160c4; +} +.tag:not(body).is-info { + background-color: #3298dc; + color: #fff; +} +.tag:not(body).is-info.is-light { + background-color: #eef6fc; + color: #1d72aa; +} +.tag:not(body).is-success { + background-color: #48c774; + color: #fff; +} +.tag:not(body).is-success.is-light { + background-color: #effaf3; + color: #257942; +} +.tag:not(body).is-warning { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.tag:not(body).is-warning.is-light { + background-color: #fffbeb; + color: #947600; +} +.tag:not(body).is-danger { + background-color: #f14668; + color: #fff; +} +.tag:not(body).is-danger.is-light { + background-color: #feecf0; + color: #cc0f35; +} +.tag:not(body).is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.tag:not(body).is-normal { + font-size: 0.75rem; +} +.tag:not(body).is-medium { + font-size: 1rem; +} +.tag:not(body).is-large { + font-size: 1.25rem; +} +.tag:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; +} +.tag:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; +} +.tag:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; +} +.tag:not(body).is-delete { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; +} +.tag:not(body).is-delete::before, +.tag:not(body).is-delete::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; +} +.tag:not(body).is-delete::before { + height: 1px; + width: 50%; +} +.tag:not(body).is-delete::after { + height: 50%; + width: 1px; +} +.tag:not(body).is-delete:hover, +.tag:not(body).is-delete:focus { + background-color: #e8e8e8; +} +.tag:not(body).is-delete:active { + background-color: #dbdbdb; +} +.tag:not(body).is-rounded { + border-radius: 290486px; +} +a.tag:hover { + text-decoration: underline; +} +.title, +.subtitle { + word-break: break-word; +} +.title em, +.subtitle em, +.title span, +.subtitle span { + font-weight: inherit; +} +.title sub, +.subtitle sub { + font-size: 0.75em; +} +.title sup, +.subtitle sup { + font-size: 0.75em; +} +.title .tag, +.subtitle .tag { + vertical-align: middle; +} +.title { + color: #363636; + font-size: 2rem; + font-weight: 400; + line-height: 1.125; +} +.title strong { + color: inherit; + font-weight: inherit; +} +.title + .highlight { + margin-top: -0.75rem; +} +.title:not(.is-spaced) + .subtitle { + margin-top: -1.25rem; +} +.title.is-1 { + font-size: 3rem; +} +.title.is-2 { + font-size: 2.5rem; +} +.title.is-3 { + font-size: 2rem; +} +.title.is-4 { + font-size: 1.5rem; +} +.title.is-5 { + font-size: 1.25rem; +} +.title.is-6 { + font-size: 1rem; +} +.title.is-7 { + font-size: 0.85rem; +} +.subtitle { + color: #4a4a4a; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; +} +.subtitle strong { + color: #363636; + font-weight: 600; +} +.subtitle:not(.is-spaced) + .title { + margin-top: -1.25rem; +} +.subtitle.is-1 { + font-size: 3rem; +} +.subtitle.is-2 { + font-size: 2.5rem; +} +.subtitle.is-3 { + font-size: 2rem; +} +.subtitle.is-4 { + font-size: 1.5rem; +} +.subtitle.is-5 { + font-size: 1.25rem; +} +.subtitle.is-6 { + font-size: 1rem; +} +.subtitle.is-7 { + font-size: 0.85rem; +} +.heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; +} +.highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; +} +.highlight pre { + overflow: auto; + max-width: 100%; +} +.number { + align-items: center; + background-color: #f5f5f5; + border-radius: 290486px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; +} +.input, +.textarea, +.select select { + background-color: #fff; + border-color: #dbdbdb; + border-radius: 4px; + color: #363636; +} +.input::-moz-placeholder, +.textarea::-moz-placeholder, +.select select::-moz-placeholder { + color: rgba(54,54,54,0.3); +} +.input::-webkit-input-placeholder, +.textarea::-webkit-input-placeholder, +.select select::-webkit-input-placeholder { + color: rgba(54,54,54,0.3); +} +.input:-moz-placeholder, +.textarea:-moz-placeholder, +.select select:-moz-placeholder { + color: rgba(54,54,54,0.3); +} +.input:-ms-input-placeholder, +.textarea:-ms-input-placeholder, +.select select:-ms-input-placeholder { + color: rgba(54,54,54,0.3); +} +.input:hover, +.textarea:hover, +.select select:hover, +.input.is-hovered, +.textarea.is-hovered, +.select select.is-hovered { + border-color: #b5b5b5; +} +.input:focus, +.textarea:focus, +.select select:focus, +.input.is-focused, +.textarea.is-focused, +.select select.is-focused, +.input:active, +.textarea:active, +.select select:active, +.input.is-active, +.textarea.is-active, +.select select.is-active { + border-color: #3273dc; + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.input[disabled], +.textarea[disabled], +.select select[disabled], +fieldset[disabled] .input, +fieldset[disabled] .textarea, +fieldset[disabled] .select select { + background-color: #f5f5f5; + border-color: #f5f5f5; + box-shadow: none; + color: #7a7a7a; +} +.input[disabled]::-moz-placeholder, +.textarea[disabled]::-moz-placeholder, +.select select[disabled]::-moz-placeholder, +fieldset[disabled] .input::-moz-placeholder, +fieldset[disabled] .textarea::-moz-placeholder, +fieldset[disabled] .select select::-moz-placeholder { + color: rgba(122,122,122,0.3); +} +.input[disabled]::-webkit-input-placeholder, +.textarea[disabled]::-webkit-input-placeholder, +.select select[disabled]::-webkit-input-placeholder, +fieldset[disabled] .input::-webkit-input-placeholder, +fieldset[disabled] .textarea::-webkit-input-placeholder, +fieldset[disabled] .select select::-webkit-input-placeholder { + color: rgba(122,122,122,0.3); +} +.input[disabled]:-moz-placeholder, +.textarea[disabled]:-moz-placeholder, +.select select[disabled]:-moz-placeholder, +fieldset[disabled] .input:-moz-placeholder, +fieldset[disabled] .textarea:-moz-placeholder, +fieldset[disabled] .select select:-moz-placeholder { + color: rgba(122,122,122,0.3); +} +.input[disabled]:-ms-input-placeholder, +.textarea[disabled]:-ms-input-placeholder, +.select select[disabled]:-ms-input-placeholder, +fieldset[disabled] .input:-ms-input-placeholder, +fieldset[disabled] .textarea:-ms-input-placeholder, +fieldset[disabled] .select select:-ms-input-placeholder { + color: rgba(122,122,122,0.3); +} +.input, +.textarea { + box-shadow: inset 0 0.0625em 0.125em rgba(10,10,10,0.05); + max-width: 100%; + width: 100%; +} +.input[readonly], +.textarea[readonly] { + box-shadow: none; +} +.input.is-white, +.textarea.is-white { + border-color: #fff; +} +.input.is-white:focus, +.textarea.is-white:focus, +.input.is-white.is-focused, +.textarea.is-white.is-focused, +.input.is-white:active, +.textarea.is-white:active, +.input.is-white.is-active, +.textarea.is-white.is-active { + box-shadow: 0 0 0 0.125em rgba(255,255,255,0.25); +} +.input.is-black, +.textarea.is-black { + border-color: #0a0a0a; +} +.input.is-black:focus, +.textarea.is-black:focus, +.input.is-black.is-focused, +.textarea.is-black.is-focused, +.input.is-black:active, +.textarea.is-black:active, +.input.is-black.is-active, +.textarea.is-black.is-active { + box-shadow: 0 0 0 0.125em rgba(10,10,10,0.25); +} +.input.is-light, +.textarea.is-light { + border-color: #f5f5f5; +} +.input.is-light:focus, +.textarea.is-light:focus, +.input.is-light.is-focused, +.textarea.is-light.is-focused, +.input.is-light:active, +.textarea.is-light:active, +.input.is-light.is-active, +.textarea.is-light.is-active { + box-shadow: 0 0 0 0.125em rgba(245,245,245,0.25); +} +.input.is-dark, +.textarea.is-dark { + border-color: #363636; +} +.input.is-dark:focus, +.textarea.is-dark:focus, +.input.is-dark.is-focused, +.textarea.is-dark.is-focused, +.input.is-dark:active, +.textarea.is-dark:active, +.input.is-dark.is-active, +.textarea.is-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(54,54,54,0.25); +} +.input.is-primary, +.textarea.is-primary { + border-color: #3273dc; +} +.input.is-primary:focus, +.textarea.is-primary:focus, +.input.is-primary.is-focused, +.textarea.is-primary.is-focused, +.input.is-primary:active, +.textarea.is-primary:active, +.input.is-primary.is-active, +.textarea.is-primary.is-active { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.input.is-link, +.textarea.is-link { + border-color: #3273dc; +} +.input.is-link:focus, +.textarea.is-link:focus, +.input.is-link.is-focused, +.textarea.is-link.is-focused, +.input.is-link:active, +.textarea.is-link:active, +.input.is-link.is-active, +.textarea.is-link.is-active { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.input.is-info, +.textarea.is-info { + border-color: #3298dc; +} +.input.is-info:focus, +.textarea.is-info:focus, +.input.is-info.is-focused, +.textarea.is-info.is-focused, +.input.is-info:active, +.textarea.is-info:active, +.input.is-info.is-active, +.textarea.is-info.is-active { + box-shadow: 0 0 0 0.125em rgba(50,152,220,0.25); +} +.input.is-success, +.textarea.is-success { + border-color: #48c774; +} +.input.is-success:focus, +.textarea.is-success:focus, +.input.is-success.is-focused, +.textarea.is-success.is-focused, +.input.is-success:active, +.textarea.is-success:active, +.input.is-success.is-active, +.textarea.is-success.is-active { + box-shadow: 0 0 0 0.125em rgba(72,199,116,0.25); +} +.input.is-warning, +.textarea.is-warning { + border-color: #ffdd57; +} +.input.is-warning:focus, +.textarea.is-warning:focus, +.input.is-warning.is-focused, +.textarea.is-warning.is-focused, +.input.is-warning:active, +.textarea.is-warning:active, +.input.is-warning.is-active, +.textarea.is-warning.is-active { + box-shadow: 0 0 0 0.125em rgba(255,221,87,0.25); +} +.input.is-danger, +.textarea.is-danger { + border-color: #f14668; +} +.input.is-danger:focus, +.textarea.is-danger:focus, +.input.is-danger.is-focused, +.textarea.is-danger.is-focused, +.input.is-danger:active, +.textarea.is-danger:active, +.input.is-danger.is-active, +.textarea.is-danger.is-active { + box-shadow: 0 0 0 0.125em rgba(241,70,104,0.25); +} +.input.is-grey-lightest, +.textarea.is-grey-lightest { + border-color: #ededed; +} +.input.is-grey-lightest:focus, +.textarea.is-grey-lightest:focus, +.input.is-grey-lightest.is-focused, +.textarea.is-grey-lightest.is-focused, +.input.is-grey-lightest:active, +.textarea.is-grey-lightest:active, +.input.is-grey-lightest.is-active, +.textarea.is-grey-lightest.is-active { + box-shadow: 0 0 0 0.125em rgba(237,237,237,0.25); +} +.input.is-small, +.textarea.is-small { + border-radius: 2px; + font-size: 0.75rem; +} +.input.is-medium, +.textarea.is-medium { + font-size: 1.25rem; +} +.input.is-large, +.textarea.is-large { + font-size: 1.5rem; +} +.input.is-fullwidth, +.textarea.is-fullwidth { + display: block; + width: 100%; +} +.input.is-inline, +.textarea.is-inline { + display: inline; + width: auto; +} +.input.is-rounded { + border-radius: 290486px; + padding-left: calc(calc(0.75em - 1px) + 0.375em); + padding-right: calc(calc(0.75em - 1px) + 0.375em); +} +.input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; +} +.textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: calc(0.75em - 1px); + resize: vertical; +} +.textarea:not([rows]) { + max-height: 40em; + min-height: 8em; +} +.textarea[rows] { + height: initial; +} +.textarea.has-fixed-size { + resize: none; +} +.checkbox, +.radio { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; +} +.checkbox input, +.radio input { + cursor: pointer; +} +.checkbox:hover, +.radio:hover { + color: #363636; +} +.checkbox[disabled], +.radio[disabled], +fieldset[disabled] .checkbox, +fieldset[disabled] .radio { + color: #7a7a7a; + cursor: not-allowed; +} +.radio + .radio { + margin-left: 0.5em; +} +.select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; +} +.select:not(.is-multiple) { + height: 2.25em; +} +.select:not(.is-multiple):not(.is-loading)::after { + border-color: #3273dc; + right: 1.125em; + z-index: 4; +} +.select.is-rounded select { + border-radius: 290486px; + padding-left: 1em; +} +.select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; +} +.select select::-ms-expand { + display: none; +} +.select select[disabled]:hover, +fieldset[disabled] .select select:hover { + border-color: #f5f5f5; +} +.select select:not([multiple]) { + padding-right: 2.5em; +} +.select select[multiple] { + height: auto; + padding: 0; +} +.select select[multiple] option { + padding: 0.5em 1em; +} +.select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #363636; +} +.select.is-white:not(:hover)::after { + border-color: #fff; +} +.select.is-white select { + border-color: #fff; +} +.select.is-white select:hover, +.select.is-white select.is-hovered { + border-color: #f2f2f2; +} +.select.is-white select:focus, +.select.is-white select.is-focused, +.select.is-white select:active, +.select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255,255,255,0.25); +} +.select.is-black:not(:hover)::after { + border-color: #0a0a0a; +} +.select.is-black select { + border-color: #0a0a0a; +} +.select.is-black select:hover, +.select.is-black select.is-hovered { + border-color: #000; +} +.select.is-black select:focus, +.select.is-black select.is-focused, +.select.is-black select:active, +.select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(10,10,10,0.25); +} +.select.is-light:not(:hover)::after { + border-color: #f5f5f5; +} +.select.is-light select { + border-color: #f5f5f5; +} +.select.is-light select:hover, +.select.is-light select.is-hovered { + border-color: #e8e8e8; +} +.select.is-light select:focus, +.select.is-light select.is-focused, +.select.is-light select:active, +.select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(245,245,245,0.25); +} +.select.is-dark:not(:hover)::after { + border-color: #363636; +} +.select.is-dark select { + border-color: #363636; +} +.select.is-dark select:hover, +.select.is-dark select.is-hovered { + border-color: #292929; +} +.select.is-dark select:focus, +.select.is-dark select.is-focused, +.select.is-dark select:active, +.select.is-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(54,54,54,0.25); +} +.select.is-primary:not(:hover)::after { + border-color: #3273dc; +} +.select.is-primary select { + border-color: #3273dc; +} +.select.is-primary select:hover, +.select.is-primary select.is-hovered { + border-color: #2366d1; +} +.select.is-primary select:focus, +.select.is-primary select.is-focused, +.select.is-primary select:active, +.select.is-primary select.is-active { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.select.is-link:not(:hover)::after { + border-color: #3273dc; +} +.select.is-link select { + border-color: #3273dc; +} +.select.is-link select:hover, +.select.is-link select.is-hovered { + border-color: #2366d1; +} +.select.is-link select:focus, +.select.is-link select.is-focused, +.select.is-link select:active, +.select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(50,115,220,0.25); +} +.select.is-info:not(:hover)::after { + border-color: #3298dc; +} +.select.is-info select { + border-color: #3298dc; +} +.select.is-info select:hover, +.select.is-info select.is-hovered { + border-color: #238cd1; +} +.select.is-info select:focus, +.select.is-info select.is-focused, +.select.is-info select:active, +.select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(50,152,220,0.25); +} +.select.is-success:not(:hover)::after { + border-color: #48c774; +} +.select.is-success select { + border-color: #48c774; +} +.select.is-success select:hover, +.select.is-success select.is-hovered { + border-color: #3abb67; +} +.select.is-success select:focus, +.select.is-success select.is-focused, +.select.is-success select:active, +.select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(72,199,116,0.25); +} +.select.is-warning:not(:hover)::after { + border-color: #ffdd57; +} +.select.is-warning select { + border-color: #ffdd57; +} +.select.is-warning select:hover, +.select.is-warning select.is-hovered { + border-color: #ffd83d; +} +.select.is-warning select:focus, +.select.is-warning select.is-focused, +.select.is-warning select:active, +.select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(255,221,87,0.25); +} +.select.is-danger:not(:hover)::after { + border-color: #f14668; +} +.select.is-danger select { + border-color: #f14668; +} +.select.is-danger select:hover, +.select.is-danger select.is-hovered { + border-color: #ef2e55; +} +.select.is-danger select:focus, +.select.is-danger select.is-focused, +.select.is-danger select:active, +.select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(241,70,104,0.25); +} +.select.is-grey-lightest:not(:hover)::after { + border-color: #ededed; +} +.select.is-grey-lightest select { + border-color: #ededed; +} +.select.is-grey-lightest select:hover, +.select.is-grey-lightest select.is-hovered { + border-color: #e0e0e0; +} +.select.is-grey-lightest select:focus, +.select.is-grey-lightest select.is-focused, +.select.is-grey-lightest select:active, +.select.is-grey-lightest select.is-active { + box-shadow: 0 0 0 0.125em rgba(237,237,237,0.25); +} +.select.is-small { + border-radius: 2px; + font-size: 0.75rem; +} +.select.is-medium { + font-size: 1.25rem; +} +.select.is-large { + font-size: 1.5rem; +} +.select.is-disabled::after { + border-color: #7a7a7a; +} +.select.is-fullwidth { + width: 100%; +} +.select.is-fullwidth select { + width: 100%; +} +.select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; +} +.select.is-loading.is-small:after { + font-size: 0.75rem; +} +.select.is-loading.is-medium:after { + font-size: 1.25rem; +} +.select.is-loading.is-large:after { + font-size: 1.5rem; +} +.file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; +} +.file.is-white .file-cta { + background-color: #fff; + border-color: transparent; + color: #0a0a0a; +} +.file.is-white:hover .file-cta, +.file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; +} +.file.is-white:focus .file-cta, +.file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255,255,255,0.25); + color: #0a0a0a; +} +.file.is-white:active .file-cta, +.file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; +} +.file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: #fff; +} +.file.is-black:hover .file-cta, +.file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: #fff; +} +.file.is-black:focus .file-cta, +.file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10,10,10,0.25); + color: #fff; +} +.file.is-black:active .file-cta, +.file.is-black.is-active .file-cta { + background-color: #000; + border-color: transparent; + color: #fff; +} +.file.is-light .file-cta { + background-color: #f5f5f5; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-light:hover .file-cta, +.file.is-light.is-hovered .file-cta { + background-color: #eee; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-light:focus .file-cta, +.file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(245,245,245,0.25); + color: rgba(0,0,0,0.7); +} +.file.is-light:active .file-cta, +.file.is-light.is-active .file-cta { + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-dark .file-cta { + background-color: #363636; + border-color: transparent; + color: #fff; +} +.file.is-dark:hover .file-cta, +.file.is-dark.is-hovered .file-cta { + background-color: #2f2f2f; + border-color: transparent; + color: #fff; +} +.file.is-dark:focus .file-cta, +.file.is-dark.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(54,54,54,0.25); + color: #fff; +} +.file.is-dark:active .file-cta, +.file.is-dark.is-active .file-cta { + background-color: #292929; + border-color: transparent; + color: #fff; +} +.file.is-primary .file-cta { + background-color: #3273dc; + border-color: transparent; + color: #fff; +} +.file.is-primary:hover .file-cta, +.file.is-primary.is-hovered .file-cta { + background-color: #276cda; + border-color: transparent; + color: #fff; +} +.file.is-primary:focus .file-cta, +.file.is-primary.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(50,115,220,0.25); + color: #fff; +} +.file.is-primary:active .file-cta, +.file.is-primary.is-active .file-cta { + background-color: #2366d1; + border-color: transparent; + color: #fff; +} +.file.is-link .file-cta { + background-color: #3273dc; + border-color: transparent; + color: #fff; +} +.file.is-link:hover .file-cta, +.file.is-link.is-hovered .file-cta { + background-color: #276cda; + border-color: transparent; + color: #fff; +} +.file.is-link:focus .file-cta, +.file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(50,115,220,0.25); + color: #fff; +} +.file.is-link:active .file-cta, +.file.is-link.is-active .file-cta { + background-color: #2366d1; + border-color: transparent; + color: #fff; +} +.file.is-info .file-cta { + background-color: #3298dc; + border-color: transparent; + color: #fff; +} +.file.is-info:hover .file-cta, +.file.is-info.is-hovered .file-cta { + background-color: #2793da; + border-color: transparent; + color: #fff; +} +.file.is-info:focus .file-cta, +.file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(50,152,220,0.25); + color: #fff; +} +.file.is-info:active .file-cta, +.file.is-info.is-active .file-cta { + background-color: #238cd1; + border-color: transparent; + color: #fff; +} +.file.is-success .file-cta { + background-color: #48c774; + border-color: transparent; + color: #fff; +} +.file.is-success:hover .file-cta, +.file.is-success.is-hovered .file-cta { + background-color: #3ec46d; + border-color: transparent; + color: #fff; +} +.file.is-success:focus .file-cta, +.file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(72,199,116,0.25); + color: #fff; +} +.file.is-success:active .file-cta, +.file.is-success.is-active .file-cta { + background-color: #3abb67; + border-color: transparent; + color: #fff; +} +.file.is-warning .file-cta { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-warning:hover .file-cta, +.file.is-warning.is-hovered .file-cta { + background-color: #ffdb4a; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-warning:focus .file-cta, +.file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255,221,87,0.25); + color: rgba(0,0,0,0.7); +} +.file.is-warning:active .file-cta, +.file.is-warning.is-active .file-cta { + background-color: #ffd83d; + border-color: transparent; + color: rgba(0,0,0,0.7); +} +.file.is-danger .file-cta { + background-color: #f14668; + border-color: transparent; + color: #fff; +} +.file.is-danger:hover .file-cta, +.file.is-danger.is-hovered .file-cta { + background-color: #f03a5f; + border-color: transparent; + color: #fff; +} +.file.is-danger:focus .file-cta, +.file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(241,70,104,0.25); + color: #fff; +} +.file.is-danger:active .file-cta, +.file.is-danger.is-active .file-cta { + background-color: #ef2e55; + border-color: transparent; + color: #fff; +} +.file.is-grey-lightest .file-cta { + background-color: #ededed; + border-color: transparent; + color: #363636; +} +.file.is-grey-lightest:hover .file-cta, +.file.is-grey-lightest.is-hovered .file-cta { + background-color: #e7e7e7; + border-color: transparent; + color: #363636; +} +.file.is-grey-lightest:focus .file-cta, +.file.is-grey-lightest.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(237,237,237,0.25); + color: #363636; +} +.file.is-grey-lightest:active .file-cta, +.file.is-grey-lightest.is-active .file-cta { + background-color: #e0e0e0; + border-color: transparent; + color: #363636; +} +.file.is-small { + font-size: 0.75rem; +} +.file.is-medium { + font-size: 1.25rem; +} +.file.is-medium .file-icon .fa { + font-size: 21px; +} +.file.is-large { + font-size: 1.5rem; +} +.file.is-large .file-icon .fa { + font-size: 28px; +} +.file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.file.has-name.is-empty .file-cta { + border-radius: 4px; +} +.file.has-name.is-empty .file-name { + display: none; +} +.file.is-boxed .file-label { + flex-direction: column; +} +.file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; +} +.file.is-boxed .file-name { + border-width: 0 1px 1px; +} +.file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; +} +.file.is-boxed .file-icon .fa { + font-size: 21px; +} +.file.is-boxed.is-small .file-icon .fa { + font-size: 14px; +} +.file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; +} +.file.is-boxed.is-large .file-icon .fa { + font-size: 35px; +} +.file.is-boxed.has-name .file-cta { + border-radius: 4px 4px 0 0; +} +.file.is-boxed.has-name .file-name { + border-radius: 0 0 4px 4px; + border-width: 0 1px 1px; +} +.file.is-centered { + justify-content: center; +} +.file.is-fullwidth .file-label { + width: 100%; +} +.file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; +} +.file.is-right { + justify-content: flex-end; +} +.file.is-right .file-cta { + border-radius: 0 4px 4px 0; +} +.file.is-right .file-name { + border-radius: 4px 0 0 4px; + border-width: 1px 0 1px 1px; + order: -1; +} +.file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; +} +.file-label:hover .file-cta { + background-color: #eee; + color: #363636; +} +.file-label:hover .file-name { + border-color: #d5d5d5; +} +.file-label:active .file-cta { + background-color: #e8e8e8; + color: #363636; +} +.file-label:active .file-name { + border-color: #cfcfcf; +} +.file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; +} +.file-cta, +.file-name { + border-color: #dbdbdb; + border-radius: 4px; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; +} +.file-cta { + background-color: #f5f5f5; + color: #4a4a4a; +} +.file-name { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; +} +.file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; +} +.file-icon .fa { + font-size: 14px; +} +.label { + color: #363636; + display: block; + font-size: 1rem; + font-weight: 700; +} +.label:not(:last-child) { + margin-bottom: 0.5em; +} +.label.is-small { + font-size: 0.75rem; +} +.label.is-medium { + font-size: 1.25rem; +} +.label.is-large { + font-size: 1.5rem; +} +.help { + display: block; + font-size: 0.75rem; + margin-top: 0.25rem; +} +.help.is-white { + color: #fff; +} +.help.is-black { + color: #0a0a0a; +} +.help.is-light { + color: #f5f5f5; +} +.help.is-dark { + color: #363636; +} +.help.is-primary { + color: #3273dc; +} +.help.is-link { + color: #3273dc; +} +.help.is-info { + color: #3298dc; +} +.help.is-success { + color: #48c774; +} +.help.is-warning { + color: #ffdd57; +} +.help.is-danger { + color: #f14668; +} +.help.is-grey-lightest { + color: #ededed; +} +.field:not(:last-child) { + margin-bottom: 0.75rem; +} +.field.has-addons { + display: flex; + justify-content: flex-start; +} +.field.has-addons .control:not(:last-child) { + margin-right: -1px; +} +.field.has-addons .control:not(:first-child):not(:last-child) .button, +.field.has-addons .control:not(:first-child):not(:last-child) .input, +.field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; +} +.field.has-addons .control:first-child:not(:only-child) .button, +.field.has-addons .control:first-child:not(:only-child) .input, +.field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.field.has-addons .control:last-child:not(:only-child) .button, +.field.has-addons .control:last-child:not(:only-child) .input, +.field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.field.has-addons .control .button:not([disabled]):hover, +.field.has-addons .control .input:not([disabled]):hover, +.field.has-addons .control .select select:not([disabled]):hover, +.field.has-addons .control .button:not([disabled]).is-hovered, +.field.has-addons .control .input:not([disabled]).is-hovered, +.field.has-addons .control .select select:not([disabled]).is-hovered { + z-index: 2; +} +.field.has-addons .control .button:not([disabled]):focus, +.field.has-addons .control .input:not([disabled]):focus, +.field.has-addons .control .select select:not([disabled]):focus, +.field.has-addons .control .button:not([disabled]).is-focused, +.field.has-addons .control .input:not([disabled]).is-focused, +.field.has-addons .control .select select:not([disabled]).is-focused, +.field.has-addons .control .button:not([disabled]):active, +.field.has-addons .control .input:not([disabled]):active, +.field.has-addons .control .select select:not([disabled]):active, +.field.has-addons .control .button:not([disabled]).is-active, +.field.has-addons .control .input:not([disabled]).is-active, +.field.has-addons .control .select select:not([disabled]).is-active { + z-index: 3; +} +.field.has-addons .control .button:not([disabled]):focus:hover, +.field.has-addons .control .input:not([disabled]):focus:hover, +.field.has-addons .control .select select:not([disabled]):focus:hover, +.field.has-addons .control .button:not([disabled]).is-focused:hover, +.field.has-addons .control .input:not([disabled]).is-focused:hover, +.field.has-addons .control .select select:not([disabled]).is-focused:hover, +.field.has-addons .control .button:not([disabled]):active:hover, +.field.has-addons .control .input:not([disabled]):active:hover, +.field.has-addons .control .select select:not([disabled]):active:hover, +.field.has-addons .control .button:not([disabled]).is-active:hover, +.field.has-addons .control .input:not([disabled]).is-active:hover, +.field.has-addons .control .select select:not([disabled]).is-active:hover { + z-index: 4; +} +.field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.field.has-addons.has-addons-centered { + justify-content: center; +} +.field.has-addons.has-addons-right { + justify-content: flex-end; +} +.field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; +} +.field.is-grouped { + display: flex; + justify-content: flex-start; +} +.field.is-grouped > .control { + flex-shrink: 0; +} +.field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; +} +.field.is-grouped > .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} +.field.is-grouped.is-grouped-centered { + justify-content: center; +} +.field.is-grouped.is-grouped-right { + justify-content: flex-end; +} +.field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; +} +.field.is-grouped.is-grouped-multiline > .control:last-child, +.field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; +} +.field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; +} +.field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; +} +@media screen and (min-width: 769px), print { + .field.is-horizontal { + display: flex; + } +} +.field-label .label { + font-size: inherit; +} +@media screen and (max-width: 768px) { + .field-label { + margin-bottom: 0.5rem; + } +} +@media screen and (min-width: 769px), print { + .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; + } + .field-label.is-small { + font-size: 0.75rem; + padding-top: 0.375em; + } + .field-label.is-normal { + padding-top: 0.375em; + } + .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; + } + .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; + } +} +.field-body .field .field { + margin-bottom: 0; +} +@media screen and (min-width: 769px), print { + .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; + } + .field-body .field { + margin-bottom: 0; + } + .field-body > .field { + flex-shrink: 1; + } + .field-body > .field:not(.is-narrow) { + flex-grow: 1; + } + .field-body > .field:not(:last-child) { + margin-right: 0.75rem; + } +} +.control { + box-sizing: border-box; + clear: both; + font-size: 1rem; + position: relative; + text-align: left; +} +.control.has-icons-left .input:focus ~ .icon, +.control.has-icons-right .input:focus ~ .icon, +.control.has-icons-left .select:focus ~ .icon, +.control.has-icons-right .select:focus ~ .icon { + color: #4a4a4a; +} +.control.has-icons-left .input.is-small ~ .icon, +.control.has-icons-right .input.is-small ~ .icon, +.control.has-icons-left .select.is-small ~ .icon, +.control.has-icons-right .select.is-small ~ .icon { + font-size: 0.75rem; +} +.control.has-icons-left .input.is-medium ~ .icon, +.control.has-icons-right .input.is-medium ~ .icon, +.control.has-icons-left .select.is-medium ~ .icon, +.control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; +} +.control.has-icons-left .input.is-large ~ .icon, +.control.has-icons-right .input.is-large ~ .icon, +.control.has-icons-left .select.is-large ~ .icon, +.control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; +} +.control.has-icons-left .icon, +.control.has-icons-right .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; +} +.control.has-icons-left .input, +.control.has-icons-left .select select { + padding-left: 2.25em; +} +.control.has-icons-left .icon.is-left { + left: 0; +} +.control.has-icons-right .input, +.control.has-icons-right .select select { + padding-right: 2.25em; +} +.control.has-icons-right .icon.is-right { + right: 0; +} +.control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; +} +.control.is-loading.is-small:after { + font-size: 0.75rem; +} +.control.is-loading.is-medium:after { + font-size: 1.25rem; +} +.control.is-loading.is-large:after { + font-size: 1.5rem; +} +.column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; +} +.columns.is-mobile > .column.is-narrow { + flex: none; +} +.columns.is-mobile > .column.is-full { + flex: none; + width: 100%; +} +.columns.is-mobile > .column.is-three-quarters { + flex: none; + width: 75%; +} +.columns.is-mobile > .column.is-two-thirds { + flex: none; + width: 66.6666%; +} +.columns.is-mobile > .column.is-half { + flex: none; + width: 50%; +} +.columns.is-mobile > .column.is-one-third { + flex: none; + width: 33.3333%; +} +.columns.is-mobile > .column.is-one-quarter { + flex: none; + width: 25%; +} +.columns.is-mobile > .column.is-one-fifth { + flex: none; + width: 20%; +} +.columns.is-mobile > .column.is-two-fifths { + flex: none; + width: 40%; +} +.columns.is-mobile > .column.is-three-fifths { + flex: none; + width: 60%; +} +.columns.is-mobile > .column.is-four-fifths { + flex: none; + width: 80%; +} +.columns.is-mobile > .column.is-offset-three-quarters { + margin-left: 75%; +} +.columns.is-mobile > .column.is-offset-two-thirds { + margin-left: 66.6666%; +} +.columns.is-mobile > .column.is-offset-half { + margin-left: 50%; +} +.columns.is-mobile > .column.is-offset-one-third { + margin-left: 33.3333%; +} +.columns.is-mobile > .column.is-offset-one-quarter { + margin-left: 25%; +} +.columns.is-mobile > .column.is-offset-one-fifth { + margin-left: 20%; +} +.columns.is-mobile > .column.is-offset-two-fifths { + margin-left: 40%; +} +.columns.is-mobile > .column.is-offset-three-fifths { + margin-left: 60%; +} +.columns.is-mobile > .column.is-offset-four-fifths { + margin-left: 80%; +} +.columns.is-mobile > .column.is-0 { + flex: none; + width: 0%; +} +.columns.is-mobile > .column.is-offset-0 { + margin-left: 0%; +} +.columns.is-mobile > .column.is-1 { + flex: none; + width: 8.33333%; +} +.columns.is-mobile > .column.is-offset-1 { + margin-left: 8.33333%; +} +.columns.is-mobile > .column.is-2 { + flex: none; + width: 16.66667%; +} +.columns.is-mobile > .column.is-offset-2 { + margin-left: 16.66667%; +} +.columns.is-mobile > .column.is-3 { + flex: none; + width: 25%; +} +.columns.is-mobile > .column.is-offset-3 { + margin-left: 25%; +} +.columns.is-mobile > .column.is-4 { + flex: none; + width: 33.33333%; +} +.columns.is-mobile > .column.is-offset-4 { + margin-left: 33.33333%; +} +.columns.is-mobile > .column.is-5 { + flex: none; + width: 41.66667%; +} +.columns.is-mobile > .column.is-offset-5 { + margin-left: 41.66667%; +} +.columns.is-mobile > .column.is-6 { + flex: none; + width: 50%; +} +.columns.is-mobile > .column.is-offset-6 { + margin-left: 50%; +} +.columns.is-mobile > .column.is-7 { + flex: none; + width: 58.33333%; +} +.columns.is-mobile > .column.is-offset-7 { + margin-left: 58.33333%; +} +.columns.is-mobile > .column.is-8 { + flex: none; + width: 66.66667%; +} +.columns.is-mobile > .column.is-offset-8 { + margin-left: 66.66667%; +} +.columns.is-mobile > .column.is-9 { + flex: none; + width: 75%; +} +.columns.is-mobile > .column.is-offset-9 { + margin-left: 75%; +} +.columns.is-mobile > .column.is-10 { + flex: none; + width: 83.33333%; +} +.columns.is-mobile > .column.is-offset-10 { + margin-left: 83.33333%; +} +.columns.is-mobile > .column.is-11 { + flex: none; + width: 91.66667%; +} +.columns.is-mobile > .column.is-offset-11 { + margin-left: 91.66667%; +} +.columns.is-mobile > .column.is-12 { + flex: none; + width: 100%; +} +.columns.is-mobile > .column.is-offset-12 { + margin-left: 100%; +} +@media screen and (max-width: 768px) { + .column.is-narrow-mobile { + flex: none; + } + .column.is-full-mobile { + flex: none; + width: 100%; + } + .column.is-three-quarters-mobile { + flex: none; + width: 75%; + } + .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; + } + .column.is-half-mobile { + flex: none; + width: 50%; + } + .column.is-one-third-mobile { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-mobile { + flex: none; + width: 25%; + } + .column.is-one-fifth-mobile { + flex: none; + width: 20%; + } + .column.is-two-fifths-mobile { + flex: none; + width: 40%; + } + .column.is-three-fifths-mobile { + flex: none; + width: 60%; + } + .column.is-four-fifths-mobile { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-mobile { + margin-left: 75%; + } + .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; + } + .column.is-offset-half-mobile { + margin-left: 50%; + } + .column.is-offset-one-third-mobile { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-mobile { + margin-left: 25%; + } + .column.is-offset-one-fifth-mobile { + margin-left: 20%; + } + .column.is-offset-two-fifths-mobile { + margin-left: 40%; + } + .column.is-offset-three-fifths-mobile { + margin-left: 60%; + } + .column.is-offset-four-fifths-mobile { + margin-left: 80%; + } + .column.is-0-mobile { + flex: none; + width: 0%; + } + .column.is-offset-0-mobile { + margin-left: 0%; + } + .column.is-1-mobile { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-mobile { + margin-left: 8.33333%; + } + .column.is-2-mobile { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-mobile { + margin-left: 16.66667%; + } + .column.is-3-mobile { + flex: none; + width: 25%; + } + .column.is-offset-3-mobile { + margin-left: 25%; + } + .column.is-4-mobile { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-mobile { + margin-left: 33.33333%; + } + .column.is-5-mobile { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-mobile { + margin-left: 41.66667%; + } + .column.is-6-mobile { + flex: none; + width: 50%; + } + .column.is-offset-6-mobile { + margin-left: 50%; + } + .column.is-7-mobile { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-mobile { + margin-left: 58.33333%; + } + .column.is-8-mobile { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-mobile { + margin-left: 66.66667%; + } + .column.is-9-mobile { + flex: none; + width: 75%; + } + .column.is-offset-9-mobile { + margin-left: 75%; + } + .column.is-10-mobile { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-mobile { + margin-left: 83.33333%; + } + .column.is-11-mobile { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-mobile { + margin-left: 91.66667%; + } + .column.is-12-mobile { + flex: none; + width: 100%; + } + .column.is-offset-12-mobile { + margin-left: 100%; + } +} +@media screen and (min-width: 769px), print { + .column.is-narrow, + .column.is-narrow-tablet { + flex: none; + } + .column.is-full, + .column.is-full-tablet { + flex: none; + width: 100%; + } + .column.is-three-quarters, + .column.is-three-quarters-tablet { + flex: none; + width: 75%; + } + .column.is-two-thirds, + .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; + } + .column.is-half, + .column.is-half-tablet { + flex: none; + width: 50%; + } + .column.is-one-third, + .column.is-one-third-tablet { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter, + .column.is-one-quarter-tablet { + flex: none; + width: 25%; + } + .column.is-one-fifth, + .column.is-one-fifth-tablet { + flex: none; + width: 20%; + } + .column.is-two-fifths, + .column.is-two-fifths-tablet { + flex: none; + width: 40%; + } + .column.is-three-fifths, + .column.is-three-fifths-tablet { + flex: none; + width: 60%; + } + .column.is-four-fifths, + .column.is-four-fifths-tablet { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters, + .column.is-offset-three-quarters-tablet { + margin-left: 75%; + } + .column.is-offset-two-thirds, + .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; + } + .column.is-offset-half, + .column.is-offset-half-tablet { + margin-left: 50%; + } + .column.is-offset-one-third, + .column.is-offset-one-third-tablet { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter, + .column.is-offset-one-quarter-tablet { + margin-left: 25%; + } + .column.is-offset-one-fifth, + .column.is-offset-one-fifth-tablet { + margin-left: 20%; + } + .column.is-offset-two-fifths, + .column.is-offset-two-fifths-tablet { + margin-left: 40%; + } + .column.is-offset-three-fifths, + .column.is-offset-three-fifths-tablet { + margin-left: 60%; + } + .column.is-offset-four-fifths, + .column.is-offset-four-fifths-tablet { + margin-left: 80%; + } + .column.is-0, + .column.is-0-tablet { + flex: none; + width: 0%; + } + .column.is-offset-0, + .column.is-offset-0-tablet { + margin-left: 0%; + } + .column.is-1, + .column.is-1-tablet { + flex: none; + width: 8.33333%; + } + .column.is-offset-1, + .column.is-offset-1-tablet { + margin-left: 8.33333%; + } + .column.is-2, + .column.is-2-tablet { + flex: none; + width: 16.66667%; + } + .column.is-offset-2, + .column.is-offset-2-tablet { + margin-left: 16.66667%; + } + .column.is-3, + .column.is-3-tablet { + flex: none; + width: 25%; + } + .column.is-offset-3, + .column.is-offset-3-tablet { + margin-left: 25%; + } + .column.is-4, + .column.is-4-tablet { + flex: none; + width: 33.33333%; + } + .column.is-offset-4, + .column.is-offset-4-tablet { + margin-left: 33.33333%; + } + .column.is-5, + .column.is-5-tablet { + flex: none; + width: 41.66667%; + } + .column.is-offset-5, + .column.is-offset-5-tablet { + margin-left: 41.66667%; + } + .column.is-6, + .column.is-6-tablet { + flex: none; + width: 50%; + } + .column.is-offset-6, + .column.is-offset-6-tablet { + margin-left: 50%; + } + .column.is-7, + .column.is-7-tablet { + flex: none; + width: 58.33333%; + } + .column.is-offset-7, + .column.is-offset-7-tablet { + margin-left: 58.33333%; + } + .column.is-8, + .column.is-8-tablet { + flex: none; + width: 66.66667%; + } + .column.is-offset-8, + .column.is-offset-8-tablet { + margin-left: 66.66667%; + } + .column.is-9, + .column.is-9-tablet { + flex: none; + width: 75%; + } + .column.is-offset-9, + .column.is-offset-9-tablet { + margin-left: 75%; + } + .column.is-10, + .column.is-10-tablet { + flex: none; + width: 83.33333%; + } + .column.is-offset-10, + .column.is-offset-10-tablet { + margin-left: 83.33333%; + } + .column.is-11, + .column.is-11-tablet { + flex: none; + width: 91.66667%; + } + .column.is-offset-11, + .column.is-offset-11-tablet { + margin-left: 91.66667%; + } + .column.is-12, + .column.is-12-tablet { + flex: none; + width: 100%; + } + .column.is-offset-12, + .column.is-offset-12-tablet { + margin-left: 100%; + } +} +@media screen and (max-width: 1087px) { + .column.is-narrow-touch { + flex: none; + } + .column.is-full-touch { + flex: none; + width: 100%; + } + .column.is-three-quarters-touch { + flex: none; + width: 75%; + } + .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; + } + .column.is-half-touch { + flex: none; + width: 50%; + } + .column.is-one-third-touch { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-touch { + flex: none; + width: 25%; + } + .column.is-one-fifth-touch { + flex: none; + width: 20%; + } + .column.is-two-fifths-touch { + flex: none; + width: 40%; + } + .column.is-three-fifths-touch { + flex: none; + width: 60%; + } + .column.is-four-fifths-touch { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-touch { + margin-left: 75%; + } + .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; + } + .column.is-offset-half-touch { + margin-left: 50%; + } + .column.is-offset-one-third-touch { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-touch { + margin-left: 25%; + } + .column.is-offset-one-fifth-touch { + margin-left: 20%; + } + .column.is-offset-two-fifths-touch { + margin-left: 40%; + } + .column.is-offset-three-fifths-touch { + margin-left: 60%; + } + .column.is-offset-four-fifths-touch { + margin-left: 80%; + } + .column.is-0-touch { + flex: none; + width: 0%; + } + .column.is-offset-0-touch { + margin-left: 0%; + } + .column.is-1-touch { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-touch { + margin-left: 8.33333%; + } + .column.is-2-touch { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-touch { + margin-left: 16.66667%; + } + .column.is-3-touch { + flex: none; + width: 25%; + } + .column.is-offset-3-touch { + margin-left: 25%; + } + .column.is-4-touch { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-touch { + margin-left: 33.33333%; + } + .column.is-5-touch { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-touch { + margin-left: 41.66667%; + } + .column.is-6-touch { + flex: none; + width: 50%; + } + .column.is-offset-6-touch { + margin-left: 50%; + } + .column.is-7-touch { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-touch { + margin-left: 58.33333%; + } + .column.is-8-touch { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-touch { + margin-left: 66.66667%; + } + .column.is-9-touch { + flex: none; + width: 75%; + } + .column.is-offset-9-touch { + margin-left: 75%; + } + .column.is-10-touch { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-touch { + margin-left: 83.33333%; + } + .column.is-11-touch { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-touch { + margin-left: 91.66667%; + } + .column.is-12-touch { + flex: none; + width: 100%; + } + .column.is-offset-12-touch { + margin-left: 100%; + } +} +@media screen and (min-width: 1088px) { + .column.is-narrow-desktop { + flex: none; + } + .column.is-full-desktop { + flex: none; + width: 100%; + } + .column.is-three-quarters-desktop { + flex: none; + width: 75%; + } + .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; + } + .column.is-half-desktop { + flex: none; + width: 50%; + } + .column.is-one-third-desktop { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-desktop { + flex: none; + width: 25%; + } + .column.is-one-fifth-desktop { + flex: none; + width: 20%; + } + .column.is-two-fifths-desktop { + flex: none; + width: 40%; + } + .column.is-three-fifths-desktop { + flex: none; + width: 60%; + } + .column.is-four-fifths-desktop { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-desktop { + margin-left: 75%; + } + .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; + } + .column.is-offset-half-desktop { + margin-left: 50%; + } + .column.is-offset-one-third-desktop { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-desktop { + margin-left: 25%; + } + .column.is-offset-one-fifth-desktop { + margin-left: 20%; + } + .column.is-offset-two-fifths-desktop { + margin-left: 40%; + } + .column.is-offset-three-fifths-desktop { + margin-left: 60%; + } + .column.is-offset-four-fifths-desktop { + margin-left: 80%; + } + .column.is-0-desktop { + flex: none; + width: 0%; + } + .column.is-offset-0-desktop { + margin-left: 0%; + } + .column.is-1-desktop { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-desktop { + margin-left: 8.33333%; + } + .column.is-2-desktop { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-desktop { + margin-left: 16.66667%; + } + .column.is-3-desktop { + flex: none; + width: 25%; + } + .column.is-offset-3-desktop { + margin-left: 25%; + } + .column.is-4-desktop { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-desktop { + margin-left: 33.33333%; + } + .column.is-5-desktop { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-desktop { + margin-left: 41.66667%; + } + .column.is-6-desktop { + flex: none; + width: 50%; + } + .column.is-offset-6-desktop { + margin-left: 50%; + } + .column.is-7-desktop { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-desktop { + margin-left: 58.33333%; + } + .column.is-8-desktop { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-desktop { + margin-left: 66.66667%; + } + .column.is-9-desktop { + flex: none; + width: 75%; + } + .column.is-offset-9-desktop { + margin-left: 75%; + } + .column.is-10-desktop { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-desktop { + margin-left: 83.33333%; + } + .column.is-11-desktop { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-desktop { + margin-left: 91.66667%; + } + .column.is-12-desktop { + flex: none; + width: 100%; + } + .column.is-offset-12-desktop { + margin-left: 100%; + } +} +@media screen and (min-width: 1280px) { + .column.is-narrow-widescreen { + flex: none; + } + .column.is-full-widescreen { + flex: none; + width: 100%; + } + .column.is-three-quarters-widescreen { + flex: none; + width: 75%; + } + .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; + } + .column.is-half-widescreen { + flex: none; + width: 50%; + } + .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-widescreen { + flex: none; + width: 25%; + } + .column.is-one-fifth-widescreen { + flex: none; + width: 20%; + } + .column.is-two-fifths-widescreen { + flex: none; + width: 40%; + } + .column.is-three-fifths-widescreen { + flex: none; + width: 60%; + } + .column.is-four-fifths-widescreen { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-widescreen { + margin-left: 75%; + } + .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; + } + .column.is-offset-half-widescreen { + margin-left: 50%; + } + .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-widescreen { + margin-left: 25%; + } + .column.is-offset-one-fifth-widescreen { + margin-left: 20%; + } + .column.is-offset-two-fifths-widescreen { + margin-left: 40%; + } + .column.is-offset-three-fifths-widescreen { + margin-left: 60%; + } + .column.is-offset-four-fifths-widescreen { + margin-left: 80%; + } + .column.is-0-widescreen { + flex: none; + width: 0%; + } + .column.is-offset-0-widescreen { + margin-left: 0%; + } + .column.is-1-widescreen { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-widescreen { + margin-left: 8.33333%; + } + .column.is-2-widescreen { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-widescreen { + margin-left: 16.66667%; + } + .column.is-3-widescreen { + flex: none; + width: 25%; + } + .column.is-offset-3-widescreen { + margin-left: 25%; + } + .column.is-4-widescreen { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-widescreen { + margin-left: 33.33333%; + } + .column.is-5-widescreen { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-widescreen { + margin-left: 41.66667%; + } + .column.is-6-widescreen { + flex: none; + width: 50%; + } + .column.is-offset-6-widescreen { + margin-left: 50%; + } + .column.is-7-widescreen { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-widescreen { + margin-left: 58.33333%; + } + .column.is-8-widescreen { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-widescreen { + margin-left: 66.66667%; + } + .column.is-9-widescreen { + flex: none; + width: 75%; + } + .column.is-offset-9-widescreen { + margin-left: 75%; + } + .column.is-10-widescreen { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-widescreen { + margin-left: 83.33333%; + } + .column.is-11-widescreen { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-widescreen { + margin-left: 91.66667%; + } + .column.is-12-widescreen { + flex: none; + width: 100%; + } + .column.is-offset-12-widescreen { + margin-left: 100%; + } +} +@media screen and (min-width: 1472px) { + .column.is-narrow-fullhd { + flex: none; + } + .column.is-full-fullhd { + flex: none; + width: 100%; + } + .column.is-three-quarters-fullhd { + flex: none; + width: 75%; + } + .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; + } + .column.is-half-fullhd { + flex: none; + width: 50%; + } + .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-fullhd { + flex: none; + width: 25%; + } + .column.is-one-fifth-fullhd { + flex: none; + width: 20%; + } + .column.is-two-fifths-fullhd { + flex: none; + width: 40%; + } + .column.is-three-fifths-fullhd { + flex: none; + width: 60%; + } + .column.is-four-fifths-fullhd { + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-fullhd { + margin-left: 75%; + } + .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; + } + .column.is-offset-half-fullhd { + margin-left: 50%; + } + .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-fullhd { + margin-left: 25%; + } + .column.is-offset-one-fifth-fullhd { + margin-left: 20%; + } + .column.is-offset-two-fifths-fullhd { + margin-left: 40%; + } + .column.is-offset-three-fifths-fullhd { + margin-left: 60%; + } + .column.is-offset-four-fifths-fullhd { + margin-left: 80%; + } + .column.is-0-fullhd { + flex: none; + width: 0%; + } + .column.is-offset-0-fullhd { + margin-left: 0%; + } + .column.is-1-fullhd { + flex: none; + width: 8.33333%; + } + .column.is-offset-1-fullhd { + margin-left: 8.33333%; + } + .column.is-2-fullhd { + flex: none; + width: 16.66667%; + } + .column.is-offset-2-fullhd { + margin-left: 16.66667%; + } + .column.is-3-fullhd { + flex: none; + width: 25%; + } + .column.is-offset-3-fullhd { + margin-left: 25%; + } + .column.is-4-fullhd { + flex: none; + width: 33.33333%; + } + .column.is-offset-4-fullhd { + margin-left: 33.33333%; + } + .column.is-5-fullhd { + flex: none; + width: 41.66667%; + } + .column.is-offset-5-fullhd { + margin-left: 41.66667%; + } + .column.is-6-fullhd { + flex: none; + width: 50%; + } + .column.is-offset-6-fullhd { + margin-left: 50%; + } + .column.is-7-fullhd { + flex: none; + width: 58.33333%; + } + .column.is-offset-7-fullhd { + margin-left: 58.33333%; + } + .column.is-8-fullhd { + flex: none; + width: 66.66667%; + } + .column.is-offset-8-fullhd { + margin-left: 66.66667%; + } + .column.is-9-fullhd { + flex: none; + width: 75%; + } + .column.is-offset-9-fullhd { + margin-left: 75%; + } + .column.is-10-fullhd { + flex: none; + width: 83.33333%; + } + .column.is-offset-10-fullhd { + margin-left: 83.33333%; + } + .column.is-11-fullhd { + flex: none; + width: 91.66667%; + } + .column.is-offset-11-fullhd { + margin-left: 91.66667%; + } + .column.is-12-fullhd { + flex: none; + width: 100%; + } + .column.is-offset-12-fullhd { + margin-left: 100%; + } +} +.columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} +.columns:last-child { + margin-bottom: -0.75rem; +} +.columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); +} +.columns.is-centered { + justify-content: center; +} +.columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; +} +.columns.is-gapless > .column { + margin: 0; + padding: 0 !important; +} +.columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; +} +.columns.is-gapless:last-child { + margin-bottom: 0; +} +.columns.is-mobile { + display: flex; +} +.columns.is-multiline { + flex-wrap: wrap; +} +.columns.is-vcentered { + align-items: center; +} +@media screen and (min-width: 769px), print { + .columns:not(.is-desktop) { + display: flex; + } +} +@media screen and (min-width: 1088px) { + .columns.is-desktop { + display: flex; + } +} +.columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); +} +.columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); +} +.columns.is-variable.is-0 { + --columnGap: 0rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-0-mobile { + --columnGap: 0rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-0-tablet { + --columnGap: 0rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-0-touch { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-0-desktop { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; + } +} +.columns.is-variable.is-1 { + --columnGap: 0.25rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; + } +} +.columns.is-variable.is-2 { + --columnGap: 0.5rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; + } +} +.columns.is-variable.is-3 { + --columnGap: 0.75rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; + } +} +.columns.is-variable.is-4 { + --columnGap: 1rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-4-mobile { + --columnGap: 1rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-4-tablet { + --columnGap: 1rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-4-touch { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-4-desktop { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; + } +} +.columns.is-variable.is-5 { + --columnGap: 1.25rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; + } +} +.columns.is-variable.is-6 { + --columnGap: 1.5rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; + } +} +.columns.is-variable.is-7 { + --columnGap: 1.75rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; + } +} +.columns.is-variable.is-8 { + --columnGap: 2rem; +} +@media screen and (max-width: 768px) { + .columns.is-variable.is-8-mobile { + --columnGap: 2rem; + } +} +@media screen and (min-width: 769px), print { + .columns.is-variable.is-8-tablet { + --columnGap: 2rem; + } +} +@media screen and (min-width: 769px) and (max-width: 1087px) { + .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; + } +} +@media screen and (max-width: 1087px) { + .columns.is-variable.is-8-touch { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1088px) { + .columns.is-variable.is-8-desktop { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1088px) and (max-width: 1279px) { + .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1280px) { + .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1280px) and (max-width: 1471px) { + .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; + } +} +@media screen and (min-width: 1472px) { + .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; + } +} +.tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; +} +.tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} +.tile.is-ancestor:last-child { + margin-bottom: -0.75rem; +} +.tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; +} +.tile.is-child { + margin: 0 !important; +} +.tile.is-parent { + padding: 0.75rem; +} +.tile.is-vertical { + flex-direction: column; +} +.tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; +} +@media screen and (min-width: 769px), print { + .tile:not(.is-child) { + display: flex; + } + .tile.is-1 { + flex: none; + width: 8.33333%; + } + .tile.is-2 { + flex: none; + width: 16.66667%; + } + .tile.is-3 { + flex: none; + width: 25%; + } + .tile.is-4 { + flex: none; + width: 33.33333%; + } + .tile.is-5 { + flex: none; + width: 41.66667%; + } + .tile.is-6 { + flex: none; + width: 50%; + } + .tile.is-7 { + flex: none; + width: 58.33333%; + } + .tile.is-8 { + flex: none; + width: 66.66667%; + } + .tile.is-9 { + flex: none; + width: 75%; + } + .tile.is-10 { + flex: none; + width: 83.33333%; + } + .tile.is-11 { + flex: none; + width: 91.66667%; + } + .tile.is-12 { + flex: none; + width: 100%; + } +} +.hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; +} +.hero .navbar { + background: none; +} +.hero .tabs ul { + border-bottom: none; +} +.hero.is-white { + background-color: #fff; + color: #0a0a0a; +} +.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-white strong { + color: inherit; +} +.hero.is-white .title { + color: #0a0a0a; +} +.hero.is-white .subtitle { + color: rgba(10,10,10,0.9); +} +.hero.is-white .subtitle a:not(.button), +.hero.is-white .subtitle strong { + color: #0a0a0a; +} +@media screen and (max-width: 1087px) { + .hero.is-white .navbar-menu { + background-color: #fff; + } +} +.hero.is-white .navbar-item, +.hero.is-white .navbar-link { + color: rgba(10,10,10,0.7); +} +.hero.is-white a.navbar-item:hover, +.hero.is-white .navbar-link:hover, +.hero.is-white a.navbar-item.is-active, +.hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; +} +.hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; +} +.hero.is-white .tabs a:hover { + opacity: 1; +} +.hero.is-white .tabs li.is-active a { + opacity: 1; +} +.hero.is-white .tabs.is-boxed a, +.hero.is-white .tabs.is-toggle a { + color: #0a0a0a; +} +.hero.is-white .tabs.is-boxed a:hover, +.hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-white .tabs.is-boxed li.is-active a, +.hero.is-white .tabs.is-toggle li.is-active a, +.hero.is-white .tabs.is-boxed li.is-active a:hover, +.hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff; +} +.hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e3 0%, #fff 71%, #fff 100%); +} +@media screen and (max-width: 768px) { + .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e3 0%, #fff 71%, #fff 100%); + } +} +.hero.is-black { + background-color: #0a0a0a; + color: #fff; +} +.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-black strong { + color: inherit; +} +.hero.is-black .title { + color: #fff; +} +.hero.is-black .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-black .subtitle a:not(.button), +.hero.is-black .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-black .navbar-menu { + background-color: #0a0a0a; + } +} +.hero.is-black .navbar-item, +.hero.is-black .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-black a.navbar-item:hover, +.hero.is-black .navbar-link:hover, +.hero.is-black a.navbar-item.is-active, +.hero.is-black .navbar-link.is-active { + background-color: #000; + color: #fff; +} +.hero.is-black .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-black .tabs a:hover { + opacity: 1; +} +.hero.is-black .tabs li.is-active a { + opacity: 1; +} +.hero.is-black .tabs.is-boxed a, +.hero.is-black .tabs.is-toggle a { + color: #fff; +} +.hero.is-black .tabs.is-boxed a:hover, +.hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-black .tabs.is-boxed li.is-active a, +.hero.is-black .tabs.is-toggle li.is-active a, +.hero.is-black .tabs.is-boxed li.is-active a:hover, +.hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #0a0a0a; +} +.hero.is-black.is-bold { + background-image: linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%); +} +@media screen and (max-width: 768px) { + .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%); + } +} +.hero.is-light { + background-color: #f5f5f5; + color: rgba(0,0,0,0.7); +} +.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-light strong { + color: inherit; +} +.hero.is-light .title { + color: rgba(0,0,0,0.7); +} +.hero.is-light .subtitle { + color: rgba(0,0,0,0.9); +} +.hero.is-light .subtitle a:not(.button), +.hero.is-light .subtitle strong { + color: rgba(0,0,0,0.7); +} +@media screen and (max-width: 1087px) { + .hero.is-light .navbar-menu { + background-color: #f5f5f5; + } +} +.hero.is-light .navbar-item, +.hero.is-light .navbar-link { + color: rgba(0,0,0,0.7); +} +.hero.is-light a.navbar-item:hover, +.hero.is-light .navbar-link:hover, +.hero.is-light a.navbar-item.is-active, +.hero.is-light .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0,0,0,0.7); +} +.hero.is-light .tabs a { + color: rgba(0,0,0,0.7); + opacity: 0.9; +} +.hero.is-light .tabs a:hover { + opacity: 1; +} +.hero.is-light .tabs li.is-active a { + opacity: 1; +} +.hero.is-light .tabs.is-boxed a, +.hero.is-light .tabs.is-toggle a { + color: rgba(0,0,0,0.7); +} +.hero.is-light .tabs.is-boxed a:hover, +.hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-light .tabs.is-boxed li.is-active a, +.hero.is-light .tabs.is-toggle li.is-active a, +.hero.is-light .tabs.is-boxed li.is-active a:hover, +.hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0,0,0,0.7); + border-color: rgba(0,0,0,0.7); + color: #f5f5f5; +} +.hero.is-light.is-bold { + background-image: linear-gradient(141deg, #dfd8d8 0%, #f5f5f5 71%, #fff 100%); +} +@media screen and (max-width: 768px) { + .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #dfd8d8 0%, #f5f5f5 71%, #fff 100%); + } +} +.hero.is-dark { + background-color: #363636; + color: #fff; +} +.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-dark strong { + color: inherit; +} +.hero.is-dark .title { + color: #fff; +} +.hero.is-dark .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-dark .subtitle a:not(.button), +.hero.is-dark .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-dark .navbar-menu { + background-color: #363636; + } +} +.hero.is-dark .navbar-item, +.hero.is-dark .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-dark a.navbar-item:hover, +.hero.is-dark .navbar-link:hover, +.hero.is-dark a.navbar-item.is-active, +.hero.is-dark .navbar-link.is-active { + background-color: #292929; + color: #fff; +} +.hero.is-dark .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-dark .tabs a:hover { + opacity: 1; +} +.hero.is-dark .tabs li.is-active a { + opacity: 1; +} +.hero.is-dark .tabs.is-boxed a, +.hero.is-dark .tabs.is-toggle a { + color: #fff; +} +.hero.is-dark .tabs.is-boxed a:hover, +.hero.is-dark .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-dark .tabs.is-boxed li.is-active a, +.hero.is-dark .tabs.is-toggle li.is-active a, +.hero.is-dark .tabs.is-boxed li.is-active a:hover, +.hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #363636; +} +.hero.is-dark.is-bold { + background-image: linear-gradient(141deg, #1f1a1a 0%, #363636 71%, #463f3f 100%); +} +@media screen and (max-width: 768px) { + .hero.is-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1f1a1a 0%, #363636 71%, #463f3f 100%); + } +} +.hero.is-primary { + background-color: #3273dc; + color: #fff; +} +.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-primary strong { + color: inherit; +} +.hero.is-primary .title { + color: #fff; +} +.hero.is-primary .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-primary .subtitle a:not(.button), +.hero.is-primary .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-primary .navbar-menu { + background-color: #3273dc; + } +} +.hero.is-primary .navbar-item, +.hero.is-primary .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-primary a.navbar-item:hover, +.hero.is-primary .navbar-link:hover, +.hero.is-primary a.navbar-item.is-active, +.hero.is-primary .navbar-link.is-active { + background-color: #2366d1; + color: #fff; +} +.hero.is-primary .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-primary .tabs a:hover { + opacity: 1; +} +.hero.is-primary .tabs li.is-active a { + opacity: 1; +} +.hero.is-primary .tabs.is-boxed a, +.hero.is-primary .tabs.is-toggle a { + color: #fff; +} +.hero.is-primary .tabs.is-boxed a:hover, +.hero.is-primary .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-primary .tabs.is-boxed li.is-active a, +.hero.is-primary .tabs.is-toggle li.is-active a, +.hero.is-primary .tabs.is-boxed li.is-active a:hover, +.hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #3273dc; +} +.hero.is-primary.is-bold { + background-image: linear-gradient(141deg, #1576c6 0%, #3273dc 71%, #4266e5 100%); +} +@media screen and (max-width: 768px) { + .hero.is-primary.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1576c6 0%, #3273dc 71%, #4266e5 100%); + } +} +.hero.is-link { + background-color: #3273dc; + color: #fff; +} +.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-link strong { + color: inherit; +} +.hero.is-link .title { + color: #fff; +} +.hero.is-link .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-link .subtitle a:not(.button), +.hero.is-link .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-link .navbar-menu { + background-color: #3273dc; + } +} +.hero.is-link .navbar-item, +.hero.is-link .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-link a.navbar-item:hover, +.hero.is-link .navbar-link:hover, +.hero.is-link a.navbar-item.is-active, +.hero.is-link .navbar-link.is-active { + background-color: #2366d1; + color: #fff; +} +.hero.is-link .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-link .tabs a:hover { + opacity: 1; +} +.hero.is-link .tabs li.is-active a { + opacity: 1; +} +.hero.is-link .tabs.is-boxed a, +.hero.is-link .tabs.is-toggle a { + color: #fff; +} +.hero.is-link .tabs.is-boxed a:hover, +.hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-link .tabs.is-boxed li.is-active a, +.hero.is-link .tabs.is-toggle li.is-active a, +.hero.is-link .tabs.is-boxed li.is-active a:hover, +.hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #3273dc; +} +.hero.is-link.is-bold { + background-image: linear-gradient(141deg, #1576c6 0%, #3273dc 71%, #4266e5 100%); +} +@media screen and (max-width: 768px) { + .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1576c6 0%, #3273dc 71%, #4266e5 100%); + } +} +.hero.is-info { + background-color: #3298dc; + color: #fff; +} +.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-info strong { + color: inherit; +} +.hero.is-info .title { + color: #fff; +} +.hero.is-info .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-info .subtitle a:not(.button), +.hero.is-info .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-info .navbar-menu { + background-color: #3298dc; + } +} +.hero.is-info .navbar-item, +.hero.is-info .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-info a.navbar-item:hover, +.hero.is-info .navbar-link:hover, +.hero.is-info a.navbar-item.is-active, +.hero.is-info .navbar-link.is-active { + background-color: #238cd1; + color: #fff; +} +.hero.is-info .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-info .tabs a:hover { + opacity: 1; +} +.hero.is-info .tabs li.is-active a { + opacity: 1; +} +.hero.is-info .tabs.is-boxed a, +.hero.is-info .tabs.is-toggle a { + color: #fff; +} +.hero.is-info .tabs.is-boxed a:hover, +.hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-info .tabs.is-boxed li.is-active a, +.hero.is-info .tabs.is-toggle li.is-active a, +.hero.is-info .tabs.is-boxed li.is-active a:hover, +.hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #3298dc; +} +.hero.is-info.is-bold { + background-image: linear-gradient(141deg, #159cc6 0%, #3298dc 71%, #4289e5 100%); +} +@media screen and (max-width: 768px) { + .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #159cc6 0%, #3298dc 71%, #4289e5 100%); + } +} +.hero.is-success { + background-color: #48c774; + color: #fff; +} +.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-success strong { + color: inherit; +} +.hero.is-success .title { + color: #fff; +} +.hero.is-success .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-success .subtitle a:not(.button), +.hero.is-success .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-success .navbar-menu { + background-color: #48c774; + } +} +.hero.is-success .navbar-item, +.hero.is-success .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-success a.navbar-item:hover, +.hero.is-success .navbar-link:hover, +.hero.is-success a.navbar-item.is-active, +.hero.is-success .navbar-link.is-active { + background-color: #3abb67; + color: #fff; +} +.hero.is-success .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-success .tabs a:hover { + opacity: 1; +} +.hero.is-success .tabs li.is-active a { + opacity: 1; +} +.hero.is-success .tabs.is-boxed a, +.hero.is-success .tabs.is-toggle a { + color: #fff; +} +.hero.is-success .tabs.is-boxed a:hover, +.hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-success .tabs.is-boxed li.is-active a, +.hero.is-success .tabs.is-toggle li.is-active a, +.hero.is-success .tabs.is-boxed li.is-active a:hover, +.hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #48c774; +} +.hero.is-success.is-bold { + background-image: linear-gradient(141deg, #29b342 0%, #48c774 71%, #56d296 100%); +} +@media screen and (max-width: 768px) { + .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #29b342 0%, #48c774 71%, #56d296 100%); + } +} +.hero.is-warning { + background-color: #ffdd57; + color: rgba(0,0,0,0.7); +} +.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-warning strong { + color: inherit; +} +.hero.is-warning .title { + color: rgba(0,0,0,0.7); +} +.hero.is-warning .subtitle { + color: rgba(0,0,0,0.9); +} +.hero.is-warning .subtitle a:not(.button), +.hero.is-warning .subtitle strong { + color: rgba(0,0,0,0.7); +} +@media screen and (max-width: 1087px) { + .hero.is-warning .navbar-menu { + background-color: #ffdd57; + } +} +.hero.is-warning .navbar-item, +.hero.is-warning .navbar-link { + color: rgba(0,0,0,0.7); +} +.hero.is-warning a.navbar-item:hover, +.hero.is-warning .navbar-link:hover, +.hero.is-warning a.navbar-item.is-active, +.hero.is-warning .navbar-link.is-active { + background-color: #ffd83d; + color: rgba(0,0,0,0.7); +} +.hero.is-warning .tabs a { + color: rgba(0,0,0,0.7); + opacity: 0.9; +} +.hero.is-warning .tabs a:hover { + opacity: 1; +} +.hero.is-warning .tabs li.is-active a { + opacity: 1; +} +.hero.is-warning .tabs.is-boxed a, +.hero.is-warning .tabs.is-toggle a { + color: rgba(0,0,0,0.7); +} +.hero.is-warning .tabs.is-boxed a:hover, +.hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-warning .tabs.is-boxed li.is-active a, +.hero.is-warning .tabs.is-toggle li.is-active a, +.hero.is-warning .tabs.is-boxed li.is-active a:hover, +.hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0,0,0,0.7); + border-color: rgba(0,0,0,0.7); + color: #ffdd57; +} +.hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); +} +@media screen and (max-width: 768px) { + .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); + } +} +.hero.is-danger { + background-color: #f14668; + color: #fff; +} +.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-danger strong { + color: inherit; +} +.hero.is-danger .title { + color: #fff; +} +.hero.is-danger .subtitle { + color: rgba(255,255,255,0.9); +} +.hero.is-danger .subtitle a:not(.button), +.hero.is-danger .subtitle strong { + color: #fff; +} +@media screen and (max-width: 1087px) { + .hero.is-danger .navbar-menu { + background-color: #f14668; + } +} +.hero.is-danger .navbar-item, +.hero.is-danger .navbar-link { + color: rgba(255,255,255,0.7); +} +.hero.is-danger a.navbar-item:hover, +.hero.is-danger .navbar-link:hover, +.hero.is-danger a.navbar-item.is-active, +.hero.is-danger .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; +} +.hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; +} +.hero.is-danger .tabs a:hover { + opacity: 1; +} +.hero.is-danger .tabs li.is-active a { + opacity: 1; +} +.hero.is-danger .tabs.is-boxed a, +.hero.is-danger .tabs.is-toggle a { + color: #fff; +} +.hero.is-danger .tabs.is-boxed a:hover, +.hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-danger .tabs.is-boxed li.is-active a, +.hero.is-danger .tabs.is-toggle li.is-active a, +.hero.is-danger .tabs.is-boxed li.is-active a:hover, +.hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #f14668; +} +.hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #fa0a61 0%, #f14668 71%, #f7595f 100%); +} +@media screen and (max-width: 768px) { + .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #fa0a61 0%, #f14668 71%, #f7595f 100%); + } +} +.hero.is-grey-lightest { + background-color: #ededed; + color: #363636; +} +.hero.is-grey-lightest a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-grey-lightest strong { + color: inherit; +} +.hero.is-grey-lightest .title { + color: #363636; +} +.hero.is-grey-lightest .subtitle { + color: rgba(54,54,54,0.9); +} +.hero.is-grey-lightest .subtitle a:not(.button), +.hero.is-grey-lightest .subtitle strong { + color: #363636; +} +@media screen and (max-width: 1087px) { + .hero.is-grey-lightest .navbar-menu { + background-color: #ededed; + } +} +.hero.is-grey-lightest .navbar-item, +.hero.is-grey-lightest .navbar-link { + color: rgba(54,54,54,0.7); +} +.hero.is-grey-lightest a.navbar-item:hover, +.hero.is-grey-lightest .navbar-link:hover, +.hero.is-grey-lightest a.navbar-item.is-active, +.hero.is-grey-lightest .navbar-link.is-active { + background-color: #e0e0e0; + color: #363636; +} +.hero.is-grey-lightest .tabs a { + color: #363636; + opacity: 0.9; +} +.hero.is-grey-lightest .tabs a:hover { + opacity: 1; +} +.hero.is-grey-lightest .tabs li.is-active a { + opacity: 1; +} +.hero.is-grey-lightest .tabs.is-boxed a, +.hero.is-grey-lightest .tabs.is-toggle a { + color: #363636; +} +.hero.is-grey-lightest .tabs.is-boxed a:hover, +.hero.is-grey-lightest .tabs.is-toggle a:hover { + background-color: rgba(10,10,10,0.1); +} +.hero.is-grey-lightest .tabs.is-boxed li.is-active a, +.hero.is-grey-lightest .tabs.is-toggle li.is-active a, +.hero.is-grey-lightest .tabs.is-boxed li.is-active a:hover, +.hero.is-grey-lightest .tabs.is-toggle li.is-active a:hover { + background-color: #363636; + border-color: #363636; + color: #ededed; +} +.hero.is-grey-lightest.is-bold { + background-image: linear-gradient(141deg, #d8cfcf 0%, #ededed 71%, #faf9f9 100%); +} +@media screen and (max-width: 768px) { + .hero.is-grey-lightest.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #d8cfcf 0%, #ededed 71%, #faf9f9 100%); + } +} +.hero.is-small .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; +} +@media screen and (min-width: 769px), print { + .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; + } +} +@media screen and (min-width: 769px), print { + .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; + } +} +.hero.is-halfheight .hero-body, +.hero.is-fullheight .hero-body, +.hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; +} +.hero.is-halfheight .hero-body > .container, +.hero.is-fullheight .hero-body > .container, +.hero.is-fullheight-with-navbar .hero-body > .container { + flex-grow: 1; + flex-shrink: 1; +} +.hero.is-halfheight { + min-height: 50vh; +} +.hero.is-fullheight { + min-height: 100vh; +} +.hero-video { + overflow: hidden; +} +.hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); +} +.hero-video.is-transparent { + opacity: 0.3; +} +@media screen and (max-width: 768px) { + .hero-video { + display: none; + } +} +.hero-buttons { + margin-top: 1.5rem; +} +@media screen and (max-width: 768px) { + .hero-buttons .button { + display: flex; + } + .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; + } +} +@media screen and (min-width: 769px), print { + .hero-buttons { + display: flex; + justify-content: center; + } + .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; + } +} +.hero-head, +.hero-foot { + flex-grow: 0; + flex-shrink: 0; +} +.hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; +} +.section { + padding: 3rem 1.5rem; +} +@media screen and (min-width: 1088px) { + .section.is-medium { + padding: 9rem 1.5rem; + } + .section.is-large { + padding: 18rem 1.5rem; + } +} +.footer { + background-color: #fff; + padding: 3rem 1.5rem 6rem; +} +html { + height: 100%; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-size-adjust: 100%; +} +body { + min-height: 100%; + display: flex; + flex-direction: column; +} +body > .section { + flex-grow: 1; +} +::-webkit-scrollbar { + width: 10px; + height: 8px; +} +::-webkit-scrollbar-track { + border-radius: 3px; + background: rgba(0,0,0,0.06); + box-shadow: inset 0 0 5px rgba(0,0,0,0.1); +} +::-webkit-scrollbar-thumb { + border-radius: 3px; + background: rgba(0,0,0,0.12); + box-shadow: inset 0 0 10px rgba(0,0,0,0.2); +} +::-webkit-scrollbar-thumb:hover { + background: rgba(0,0,0,0.24); +} +.ml-0, +.mx-0 { + margin-left: 0 !important; +} +.mr-0, +.mx-0 { + margin-right: 0 !important; +} +.ml-n0, +.mx-n0 { + margin-left: 0 !important; +} +.mr-n0, +.mx-n0 { + margin-right: 0 !important; +} +.mt-0, +.my-0 { + margin-top: 0 !important; +} +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} +.mt-n0, +.my-n0 { + margin-top: 0 !important; +} +.mb-n0, +.my-n0 { + margin-bottom: 0 !important; +} +.pl-0, +.px-0 { + padding-left: 0 !important; +} +.pr-0, +.px-0 { + padding-right: 0 !important; +} +.pl-n0, +.px-n0 { + padding-left: 0 !important; +} +.pr-n0, +.px-n0 { + padding-right: 0 !important; +} +.pt-0, +.py-0 { + padding-top: 0 !important; +} +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} +.pt-n0, +.py-n0 { + padding-top: 0 !important; +} +.pb-n0, +.py-n0 { + padding-bottom: 0 !important; +} +.ml-1, +.mx-1, +.article-licensing .licensing-meta .icons .icon { + margin-left: 0.25rem !important; +} +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} +.mb-1, +.my-1, +.article-licensing .licensing-title p:not(:last-child) { + margin-bottom: 0.25rem !important; +} +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} +.pl-n1, +.px-n1 { + padding-left: -0.25rem !important; +} +.pr-n1, +.px-n1 { + padding-right: -0.25rem !important; +} +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} +.pt-n1, +.py-n1 { + padding-top: -0.25rem !important; +} +.pb-n1, +.py-n1 { + padding-bottom: -0.25rem !important; +} +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} +.pl-n2, +.px-n2 { + padding-left: -0.5rem !important; +} +.pr-n2, +.px-n2 { + padding-right: -0.5rem !important; +} +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} +.pt-n2, +.py-n2 { + padding-top: -0.5rem !important; +} +.pb-n2, +.py-n2 { + padding-bottom: -0.5rem !important; +} +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} +.mt-3, +.my-3 { + margin-top: 1rem !important; +} +.mb-3, +.my-3, +.article-licensing .licensing-title { + margin-bottom: 1rem !important; +} +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} +.pl-3, +.px-3 { + padding-left: 1rem !important; +} +.pr-3, +.px-3 { + padding-right: 1rem !important; +} +.pl-n3, +.px-n3 { + padding-left: -1rem !important; +} +.pr-n3, +.px-n3 { + padding-right: -1rem !important; +} +.pt-3, +.py-3 { + padding-top: 1rem !important; +} +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} +.pt-n3, +.py-n3 { + padding-top: -1rem !important; +} +.pb-n3, +.py-n3 { + padding-bottom: -1rem !important; +} +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} +.mr-4, +.mx-4, +.article-licensing .licensing-meta .level-item { + margin-right: 1.5rem !important; +} +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} +.pl-n4, +.px-n4 { + padding-left: -1.5rem !important; +} +.pr-n4, +.px-n4 { + padding-right: -1.5rem !important; +} +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} +.pt-n4, +.py-n4 { + padding-top: -1.5rem !important; +} +.pb-n4, +.py-n4 { + padding-bottom: -1.5rem !important; +} +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} +.mt-5, +.my-5 { + margin-top: 3rem !important; +} +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} +.pl-5, +.px-5 { + padding-left: 3rem !important; +} +.pr-5, +.px-5 { + padding-right: 3rem !important; +} +.pl-n5, +.px-n5 { + padding-left: -3rem !important; +} +.pr-n5, +.px-n5 { + padding-right: -3rem !important; +} +.pt-5, +.py-5 { + padding-top: 3rem !important; +} +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} +.pt-n5, +.py-n5 { + padding-top: -3rem !important; +} +.pb-n5, +.py-n5 { + padding-bottom: -3rem !important; +} +.ml-auto, +.mx-auto { + margin-left: auto !important; +} +.mr-auto, +.mx-auto { + margin-right: auto !important; +} +.mt-auto, +.my-auto { + margin-top: auto !important; +} +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} +.pl-auto, +.px-auto { + margin-left: auto !important; +} +.pr-auto, +.px-auto { + margin-right: auto !important; +} +.pt-auto, +.py-auto { + margin-top: auto !important; +} +.pb-auto, +.py-auto { + margin-bottom: auto !important; +} +.order-0 { + order: 0 !important; +} +.order-1 { + order: 1 !important; +} +.order-2 { + order: 2 !important; +} +.order-3 { + order: 3 !important; +} +.order-4 { + order: 4 !important; +} +.order-5 { + order: 5 !important; +} +.justify-content-start { + justify-content: start !important; +} +.justify-content-center { + justify-content: center !important; +} +.flex-shrink-1 { + flex-shrink: 1 !important; +} +.link-muted { + color: inherit; + transition: 0.2s ease; +} +.link-muted:hover { + color: #3273dc !important; +} +.image.is-7by3 { + padding-top: 42.8%; +} +.image.is-7by3 img { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.image .avatar { + height: 100%; + object-fit: cover; +} +.image .fill { + object-fit: cover; + width: 100% !important; + height: 100% !important; +} +.button.is-transparent { + color: inherit; + background: transparent; + border-color: transparent; +} +.card { + overflow: visible; + border-radius: 4px; +} +.card:hover { + box-shadow: 0 6px 15px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.1); +} +.card + .card, +.card + .column-right-shadow { + margin-top: 1.5rem; +} +.card .card-image { + overflow: hidden; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.card .media + .media { + border: none; + margin-top: 0; +} +article.media { + color: #7a7a7a; +} +article.media a { + color: inherit; +} +article.media a:hover { + color: #3273dc; +} +article.media .image { + width: 64px; + height: 64px; +} +article.media .image img { + object-fit: cover; + width: 100%; + height: 100%; +} +article.media .title { + margin-bottom: 0.25em; +} +article.media .media-content { + color: #7a7a7a; +} +article.media .media-content .title { + margin: 0; + line-height: inherit; +} +article.article { + padding: 1.5rem 1.8rem; +} +article.article .title { + margin: 0 0 0.5rem -0.1rem !important; +} +article.article .title .fas { + margin-right: 0.5rem; +} +article.article .article-meta, +article.article .article-tags { + color: #7a7a7a; +} +article.article .article-meta { + overflow-x: auto; + margin-bottom: 1.5rem !important; +} +article.article .article-meta >:first-child { + flex-wrap: wrap; + width: 100%; +} +article.article .article-meta >:first-child >* { + flex-grow: 0 !important; +} +article.article .content { + word-wrap: break-word; + font-size: 1.1rem; + letter-spacing: 0.02rem; +} +article.article .content h1 { + font-size: 1.75em; +} +article.article .content h2 { + font-size: 1.5em; +} +article.article .content h3 { + font-size: 1.25em; +} +article.article .content h4 { + font-size: 1.125em; +} +article.article .content h5 { + font-size: 1em; +} +article.article .content pre { + font-size: 0.95em; +} +article.article .content code { + font-size: 0.95em; + padding: 0; + background: transparent; + overflow-wrap: break-word; +} +article.article .content blockquote.pullquote { + float: right; + max-width: 50%; + font-size: 1.15rem; + position: relative; +} +article.article .content blockquote footer strong + cite { + margin-left: 0.5em; +} +article.article .content .message.message-immersive { + border-radius: 0; + margin: 0 -1.8rem 1.5rem -1.8rem; +} +article.article .content .message.message-immersive .message-body { + border: none; +} +article.article .article-tags { + display: flex; + flex-wrap: wrap; +} +.rtl { + direction: rtl; +} +.rtl .level .level-item:not(:last-child), +.rtl .level.is-mobile .level-item:not(:last-child) { + margin-left: 0.75rem; + margin-right: 0; +} +.table-overflow { + overflow-x: auto; +} +.table-overflow table { + width: auto !important; +} +.table-overflow table th { + word-break: keep-all; +} +.video-container { + position: relative; + padding-bottom: 56.25%; + padding-top: 25px; + height: 0; +} +.video-container iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.article-licensing { + position: relative; + z-index: 1; + box-shadow: none; + background: #f5f5f5; + border-radius: 4px; + overflow: hidden; +} +.article-licensing:after { + position: absolute; + z-index: -1; + right: -50px; + top: -87.87px; + content: '\f25e'; + font-size: 200px; + font-family: 'Font Awesome 5 Brands'; + opacity: 0.1; +} +.article-licensing .level-left { + flex-wrap: wrap; + max-width: 100%; +} +.article-licensing .licensing-title { + line-height: 1.2; +} +.article-licensing .licensing-meta .icons .icon { + width: 1.2em; + height: 1.2em; + font-size: 1.2em; + vertical-align: bottom; +} +.article-licensing .licensing-meta a { + color: inherit; +} +a.article-nav-prev span { + text-align: left; + flex-shrink: 1; + word-wrap: break-word; + white-space: normal; +} +a.article-nav-next span { + text-align: right; + flex-shrink: 1; + word-wrap: break-word; + white-space: normal; +} +.article { + counter-reset: section; +} +.article h2 { + counter-reset: sub-section; +} +.article h3 { + counter-reset: composite; +} +.article h4 { + counter-reset: detail; +} +.article h2:before { + content: counter(section) " "; + counter-increment: section; +} +.article h3:before { + content: counter(section) "." counter(sub-section) " "; + counter-increment: sub-section; +} +.article h4:before { + content: counter(section) "." counter(sub-section) "." counter(composite) " "; + counter-increment: composite; +} +.navbar-main { + box-shadow: 0 4px 10px rgba(0,0,0,0.05); +} +.navbar-main .navbar-container { + overflow-x: auto; +} +.navbar-main .navbar-menu, +.navbar-main .navbar-start, +.navbar-main .navbar-end { + align-items: stretch; + display: flex; + padding: 0; + flex-shrink: 0; +} +.navbar-main .navbar-menu { + flex-grow: 1; + flex-shrink: 0; + overflow-x: auto; +} +.navbar-main .navbar-start { + justify-content: flex-start; + margin-right: auto; +} +.navbar-main .navbar-end { + justify-content: flex-end; + margin-left: auto; +} +.navbar-main .navbar-item { + display: flex; + align-items: center; + padding: 1.25rem 0.75rem; + margin: 0 0; +} +.navbar-main .navbar-item.is-active { + background-color: transparent; +} +@media screen and (max-width: 1087px) { + .navbar-main .navbar-menu { + justify-content: center; + box-shadow: none; + } + .navbar-main .navbar-start { + margin-right: 0; + } + .navbar-main .navbar-end { + margin-left: 0; + } +} +.navbar-logo img { + max-height: 2.5rem; +} +@media screen and (min-width: 1088px) { + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: 0rem; + } +} +footer.footer { + padding: 1.5rem; +} +@media screen and (max-width: 768px) { + footer.footer .level-start { + text-align: center; + } +} +footer.footer .level-end .field { + flex-wrap: wrap; + align-items: center; +} +@media screen and (max-width: 768px) { + footer.footer .level-end .field { + justify-content: center; + margin-top: 1rem; + } +} +.footer-logo img { + max-height: 2.5rem; +} +.pagination { + margin-top: 1.5rem; +} +.pagination .pagination-link a, +.pagination .pagination-ellipsis a, +.pagination .pagination-previous a, +.pagination .pagination-next a { + color: #363636; +} +.pagination .pagination-link, +.pagination .pagination-previous, +.pagination .pagination-next { + border: none; + background: #fff; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); +} +.pagination .pagination-link.is-current { + background: #3273dc; +} +.post-navigation { + color: #7a7a7a; + flex-wrap: wrap; + justify-content: space-around; +} +.post-navigation .level-item { + margin-bottom: 0; +} +.timeline { + margin-left: 1rem; + padding: 1rem 0 0 1.5rem; + border-left: 1px solid #dbdbdb; +} +.timeline .media { + position: relative; +} +.timeline .media:before, +.timeline .media:last-child:after { + content: ''; + display: block; + position: absolute; + left: calc(-0.375rem - 1.5rem - 0.25px); +} +.timeline .media:before { + width: 0.75rem; + height: 0.75rem; + top: calc(1rem + 1.5 * 0.85rem / 2 - 0.75rem / 2); + background: #dbdbdb; + border-radius: 50%; +} +.timeline .media:first-child:before { + top: calc(1.5 * 0.85rem / 2 - 0.75rem / 2); +} +.timeline .media:last-child:after { + width: 0.75rem; + top: calc(1rem + 1.5 * 0.85rem / 2 + 0.75rem / 2); + bottom: 0; + background: #fff; +} +.timeline .media:first-child:last-child:after { + top: calc(1.5 * 0.85rem / 2 + 0.75rem / 2); +} +.searchbox { + display: none; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; + font-size: 1rem; + line-height: 0; + background: rgba(10,10,10,0.86); +} +.searchbox.show { + display: flex; +} +.searchbox a, +.searchbox a:hover { + color: inherit; + text-decoration: none; +} +.searchbox input { + font-size: 1rem; + border: none; + outline: none; + box-shadow: none; + border-radius: 0; +} +.searchbox, +.searchbox .searchbox-container { + position: fixed; + align-items: center; + flex-direction: column; + line-height: 1.25em; +} +.searchbox .searchbox-container { + z-index: 101; + display: flex; + overflow: hidden; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); + border-radius: 4px; + background-color: #f5f5f5; + width: 540px; + top: 100px; + bottom: 100px; +} +.searchbox .searchbox-header, +.searchbox .searchbox-body, +.searchbox .searchbox-footer { + width: 100%; +} +.searchbox .searchbox-header { + display: flex; + flex-direction: row; + line-height: 1.5em; + font-weight: normal; + background-color: #fff; + min-height: 3rem; +} +.searchbox .searchbox-input-container { + display: flex; + flex-grow: 1; +} +.searchbox .searchbox-input { + flex-grow: 1; + color: inherit; + box-sizing: border-box; + padding: 0.75em 0 0.75em 1.25em; + background: #fff; +} +.searchbox .searchbox-close { + display: inline-block; + font-size: 1.5em; + padding: 0.5em 0.75em; + cursor: pointer; +} +.searchbox .searchbox-close:hover { + background: #f5f5f5; +} +.searchbox .searchbox-close:active { + background: #dbdbdb; +} +.searchbox .searchbox-body { + flex-grow: 1; + overflow-y: auto; + border-top: 1px solid #dbdbdb; +} +.searchbox .searchbox-result-section header, +.searchbox .searchbox-result-item { + padding: 0.75em 1em; +} +.searchbox .searchbox-result-section { + border-bottom: 1px solid #dbdbdb; +} +.searchbox .searchbox-result-section header { + color: #b5b5b5; +} +.searchbox .searchbox-result-item { + display: flex; + flex-direction: row; +} +.searchbox .searchbox-result-item:not(.disabled):not(.active):not(:active):hover { + background-color: #fff; +} +.searchbox .searchbox-result-item:active, +.searchbox .searchbox-result-item.active { + color: #fff; + background-color: #3273dc; +} +.searchbox .searchbox-result-item em { + font-style: normal; + background: #ffdd57; +} +.searchbox .searchbox-result-icon { + margin-right: 1em; +} +.searchbox .searchbox-result-content { + overflow: hidden; +} +.searchbox .searchbox-result-title, +.searchbox .searchbox-result-preview { + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.searchbox .searchbox-result-title-secondary { + color: #b5b5b5; +} +.searchbox .searchbox-result-preview { + margin-top: 0.25em; +} +.searchbox .searchbox-result-item:not(:active):not(.active) .searchbox-result-preview { + color: #b5b5b5; +} +.searchbox .searchbox-footer { + padding: 0.5em 1em; +} +.searchbox .searchbox-pagination { + margin: 0; + padding: 0; + list-style: none; + text-align: center; +} +.searchbox .searchbox-pagination .searchbox-pagination-item { + margin: 0 0.25rem; +} +.searchbox .searchbox-pagination .searchbox-pagination-item, +.searchbox .searchbox-pagination .searchbox-pagination-link { + display: inline-block; +} +.searchbox .searchbox-pagination .searchbox-pagination-link { + overflow: hidden; + padding: 0.5em 0.8em; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); + border-radius: 4px; + background-color: #fff; +} +.searchbox .searchbox-pagination .searchbox-pagination-item.active .searchbox-pagination-link { + color: #fff; + background-color: #3273dc; +} +.searchbox .searchbox-pagination .searchbox-pagination-item.disabled .searchbox-pagination-link { + cursor: not-allowed; + background-color: #f5f5f5; +} +.searchbox .searchbox-pagination .searchbox-pagination-item:not(.active):not(.disabled) .searchbox-pagination-link:hover { + background-color: #f5f5f5; +} +@media screen and (max-width: 559px), screen and (max-height: 479px) { + .searchbox .searchbox-container { + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 0; + } +} +div.highlight-tree td.code pre { + font-family: Consolas, Menlo, Courier, monospace !important; + font-size: 0.9em; +} +figure.highlight { + padding: 0; + width: 100%; + position: relative; + margin: 1em 0 1em !important; + border-radius: 4px; +} +figure.highlight span.fold { + width: 18px; +} +figure.highlight.folded .highlight-body { + height: 0; +} +figure.highlight .copy { + opacity: 0.7; +} +figure.highlight pre, +figure.highlight table tr:hover { + color: inherit; + background: transparent; +} +figure.highlight table { + width: auto; +} +figure.highlight table tr td { + border: none; +} +figure.highlight table tr:not(:first-child) td { + padding-top: 0; +} +figure.highlight table tr:not(:last-child) td { + padding-bottom: 0; +} +figure.highlight pre { + padding: 0; + overflow: visible; +} +figure.highlight pre .line, +figure.highlight pre code .hljs { + line-height: 1.5rem; +} +figure.highlight figcaption, +figure.highlight .gutter { + background: rgba(200,200,200,0.15); +} +figure.highlight figcaption { + margin: 0 !important; + padding: 0.3em 0em 0.3em 0.75em; + font-style: normal; + font-size: 0.8em; +} +figure.highlight figcaption * { + color: inherit; +} +figure.highlight figcaption span { + font-weight: 500; + font-family: 'Source Code Pro', monospace, 'Microsoft YaHei'; +} +figure.highlight figcaption .level-left *:not(:last-child) { + margin-right: 0.5em; +} +figure.highlight figcaption .level-right *:not(:first-child) { + margin-left: 0.5em; +} +figure.highlight figcaption .fold { + cursor: pointer; +} +figure.highlight figcaption.level { + overflow: auto; +} +figure.highlight figcaption.level .level-right a { + padding: 0em 0.75em; +} +figure.highlight .highlight-body { + overflow: auto; +} +figure.highlight .gutter { + text-align: right; +} +figure.highlight .tag, +figure.highlight .title, +figure.highlight .number, +figure.highlight .section { + display: inherit; + font: inherit; + margin: inherit; + padding: inherit; + background: inherit; + height: inherit; + text-align: inherit; + vertical-align: inherit; + min-width: inherit; + border-radius: inherit; +} +figure.highlight.foldable div.level-left { + cursor: pointer; +} +.gist table tr:hover { + background: transparent; +} +.gist table td { + border: none; +} +.gist .file { + all: initial; +} +.widget .menu-list li ul { + margin-right: 0; +} +.widget .menu-list .level { + margin-bottom: 0; +} +.widget .menu-list .level .level-left, +.widget .menu-list .level .level-right, +.widget .menu-list .level .level-item { + flex-shrink: 1; +} +.widget .menu-list .level .level-left, +.widget .menu-list .level .level-right { + align-items: flex-start; +} +.widget .menu-list .tag { + background: $light-grey; + color: $white-invert; +} +.widget .tags .tag:first-child { + background: #3273dc; + color: #fff; +} +.widget .tags .tag:last-child { + background: $light-grey; + color: $white-invert; +} +#toc { + max-height: calc(100vh - 22px); + overflow-y: scroll; +} +.level.is-multiline { + flex-wrap: wrap; +} +@media screen and (max-width: 768px) { + .widget.card#toc { + display: none; + position: fixed; + margin: 1rem; + left: 0; + right: 0; + bottom: 0; + z-index: 100; + } + .widget.card#toc .card-content { + padding: 0; + } + .widget.card#toc .menu { + padding: 1.5rem; + max-height: calc(100vh - 2rem); + overflow-y: auto; + } + #toc-mask { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 99; + background: rgba(0,0,0,0.7); + } + .widget.card#toc.is-active, + #toc-mask.is-active { + display: block; + } +} +.donate { + position: relative; +} +.donate .qrcode { + display: none; + position: absolute; + z-index: 99; + bottom: 2.5em; + line-height: 0; + overflow: hidden; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); + border-radius: 4px; +} +.donate .qrcode img { + max-width: 280px; +} +.donate:hover .qrcode { + display: block; +} +.donate:first-child:not(:last-child) .qrcode { + left: -0.75rem; +} +.donate:last-child:not(:first-child) .qrcode { + right: -0.75rem; +} +.donate[data-type="afdian"] { + color: #fff; + background-color: #885fd9; + border-color: transparent; +} +.donate[data-type="afdian"]:active { + background-color: #794ad4; +} +.donate[data-type="afdian"]:hover { + background-color: #8055d7; +} +.donate[data-type="afdian"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(136,95,217,0.25); +} +.donate[data-type="alipay"] { + color: #fff; + background-color: #00a0e8; + border-color: transparent; +} +.donate[data-type="alipay"]:active { + background-color: #008ecf; +} +.donate[data-type="alipay"]:hover { + background-color: #0097db; +} +.donate[data-type="alipay"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0,160,232,0.25); +} +.donate[data-type="buymeacoffee"] { + color: rgba(0,0,0,0.7); + background-color: #fd0; + border-color: transparent; +} +.donate[data-type="buymeacoffee"]:active { + background-color: #e6c700; +} +.donate[data-type="buymeacoffee"]:hover { + background-color: #f2d200; +} +.donate[data-type="buymeacoffee"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,221,0,0.25); +} +.donate[data-type="paypal"] { + color: rgba(0,0,0,0.7); + background-color: #feb700; + border-color: transparent; +} +.donate[data-type="paypal"]:active { + background-color: #e5a500; +} +.donate[data-type="paypal"]:hover { + background-color: #f1ae00; +} +.donate[data-type="paypal"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(254,183,0,0.25); +} +.donate[data-type="patreon"] { + color: #fff; + background-color: #ff424d; + border-color: transparent; +} +.donate[data-type="patreon"]:active { + background-color: #ff2835; +} +.donate[data-type="patreon"]:hover { + background-color: #ff3541; +} +.donate[data-type="patreon"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255,66,77,0.25); +} +.donate[data-type="wechat"] { + color: #fff; + background-color: #1aad19; + border-color: transparent; +} +.donate[data-type="wechat"]:active { + background-color: #179716; +} +.donate[data-type="wechat"]:hover { + background-color: #18a217; +} +.donate[data-type="wechat"]:focus:not(:active) { + box-shadow: 0 0 0 0.125em rgba(26,173,25,0.25); +} +#back-to-top { + position: fixed; + opacity: 0; + outline: none; + padding: 8px 0; + line-height: 24px; + border-radius: 4px; + transform: translateY(120px); + transition: 0.4s ease opacity, 0.4s ease width, 0.4s ease transform, 0.4s ease border-radius; +} +#back-to-top.is-rounded { + border-radius: 50%; +} +#back-to-top.fade-in { + opacity: 1; +} +#back-to-top.rise-up { + transform: translateY(0); +} +.gallery-item .caption { + color: #7a7a7a; +} +.pace { + user-select: none; + pointer-events: none; +} +.pace .pace-progress { + top: 0; + right: 100%; + width: 100%; + height: 2px; + z-index: 2000; + position: fixed; + background: #3273dc; +} +.pace-inactive { + display: none; +} +.fa, +.fab, +.fal, +.far, +.fas { + line-height: inherit; +} +.MathJax, +.MathJax_Display, +.MJXc-display, +.MathJax_SVG_Display, +.katex-display { + overflow-x: auto; + overflow-y: hidden; +} +.katex { + white-space: nowrap; +} +.katex-display { + margin-top: -1em !important; +} +.katex-html { + padding-top: 1em; +} +.katex-html .tag { + align-items: unset; + background-color: unset; + border-radius: unset; + color: unset; + display: unset; + font-size: unset; + height: unset; + justify-content: unset; + line-height: unset; + padding-left: unset; + padding-right: unset; + white-space: unset; +} +.cc-window, +.cc-revoke { + font-size: 1.1rem !important; + font-family: Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif !important; +} +.cc-window { + color: #4a4a4a !important; + background-color: #fff !important; +} +.cc-window.cc-floating { + border-radius: 4px; + box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1); +} +.cc-window.cc-banner { + background-color: #f9f9f9 !important; +} +.cc-window.cc-theme-block .cc-compliance > .cc-btn, +.cc-window.cc-theme-classic .cc-compliance > .cc-btn { + border-radius: 290486px; +} +.cc-window .cc-compliance > .cc-btn { + font-weight: 400; + border: none; + color: #fff; + background-color: #3273dc; +} +.cc-window .cc-compliance > .cc-btn:hover, +.cc-window .cc-compliance > .cc-btn:focus { + background-color: #276cda; +} +.cc-window .cc-compliance > .cc-btn.cc-deny:hover { + color: #3273dc; + text-decoration: none; +} +.cc-revoke { + padding: 0.5rem 1rem !important; + color: #fff !important; + background-color: #3273dc !important; +} +.cc-revoke:hover { + text-decoration: none !important; + background-color: #276cda; +} +@media screen and (min-width: 1280px) { + .is-3-column .container { + max-width: 1216px; + width: 1216px; + } + .is-1-column .container, + .is-2-column .container { + max-width: 960px; + width: 960px; + } +} +@media screen and (min-width: 1472px) { + .is-3-column .container { + max-width: 1344px; + width: 1344px; + } + .is-2-column .container { + max-width: 1152px; + width: 1152px; + } + .is-1-column .container { + max-width: 960px; + width: 960px; + } +} +@media screen and (min-width: 769px), print { + .is-sticky { + position: -webkit-sticky; + position: sticky; + top: 1.5rem; + z-index: 99; + } + .column-main.is-sticky, + .column-left.is-sticky, + .column-right.is-sticky, + .column-right-shadow.is-sticky { + top: 0.75rem; + align-self: flex-start; + } +} +@media screen and (max-width: 768px) { + .section { + padding: 1.5rem 1rem; + } +} +.navbar-logo .logo-img-dark, +.footer-logo .logo-img-dark { + display: none; +} +body.night { + background: #0e1225; +} +body.night .hljs { + display: block; + overflow-x: auto; + color: #abb2bf; + background: #282c34; +} +body.night .hljs-comment, +body.night .hljs-quote { + color: #5c6370; + font-style: italic; +} +body.night .hljs-doctag, +body.night .hljs-keyword, +body.night .hljs-formula { + color: #c678dd; +} +body.night .hljs-section, +body.night .hljs-name, +body.night .hljs-selector-tag, +body.night .hljs-deletion, +body.night .hljs-subst { + color: #e06c75; +} +body.night .hljs-literal { + color: #56b6c2; +} +body.night .hljs-string, +body.night .hljs-regexp, +body.night .hljs-addition, +body.night .hljs-attribute, +body.night .hljs-meta-string { + color: #98c379; +} +body.night .hljs-built_in, +body.night .hljs-class .hljs-title { + color: #e6c07b; +} +body.night .hljs-attr, +body.night .hljs-variable, +body.night .hljs-template-variable, +body.night .hljs-type, +body.night .hljs-selector-class, +body.night .hljs-selector-attr, +body.night .hljs-selector-pseudo, +body.night .hljs-number { + color: #d19a66; +} +body.night .hljs-symbol, +body.night .hljs-bullet, +body.night .hljs-link, +body.night .hljs-meta, +body.night .hljs-selector-id, +body.night .hljs-title { + color: #61aeee; +} +body.night .hljs-emphasis { + font-style: italic; +} +body.night .hljs-strong { + font-weight: bold; +} +body.night .hljs-link { + text-decoration: underline; +} +body.night .content code { + color: #cbba7d; +} +body.night #night-nav #night-icon:before { + content: '\f0eb'; +} +body.night img, +body.night video, +body.night iframe, +body.night .waifu, +body.night .donate { + filter: brightness(0.8); + -webkit-filter: brightness(0.8); +} +body.night .navbar-logo .logo-img, +body.night .footer-logo .logo-img { + display: none; +} +body.night .navbar-logo .logo-img-dark, +body.night .footer-logo .logo-img-dark { + display: inline-block; +} +body.night .navbar-main .navbar-menu .navbar-item:hover, +body.night .navbar-main .navbar-menu .navbar-item:focus { + color: #fff; + background-color: #373d48; +} +body.night .navbar-main .navbar-menu .navbar-item.is-active { + color: #c0c0c0; +} +body.night .navbar { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); +} +body.night .card { + background-color: rgba(40,44,52,0.5); + backdrop-filter: none; + -webkit-backdrop-filter: none; +} +body.night .card:hover { + background-color: rgba(40,44,52,0.8); +} +body.night .card .breadcrumb li.is-active a { + color: #c0c0c0; +} +body.night .footer { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); +} +body.night .input, +body.night .textarea { + background-color: #434a56; + border-color: #373d48; +} +body.night .button.is-primary, +body.night .button.is-light, +body.night .button.is-small { + background-color: #373d48; + color: #c0c0c0; +} +body.night .button.is-primary:hover, +body.night .button.is-light:hover, +body.night .button.is-small:hover, +body.night .button.is-primary.is-hovered, +body.night .button.is-light.is-hovered, +body.night .button.is-small.is-hovered { + color: #fff; + background-color: #434a56; +} +body.night .button.is-primary:active, +body.night .button.is-light:active, +body.night .button.is-small:active, +body.night .button.is-primary.is-active, +body.night .button.is-light.is-active, +body.night .button.is-small.is-active { + color: #fff; + background-color: #2c313a; +} +body.night .button.is-white, +body.night .button.is-transparent { + background-color: transparent; +} +body.night .button.is-white:hover, +body.night .button.is-transparent:hover { + background-color: #373d48 !important; +} +body.night .pagination .pagination-next, +body.night .pagination .pagination-previous, +body.night .pagination-link:not(.is-current) { + color: #c0c0c0; + background-color: #373d48; +} +body.night .pagination .pagination-next a, +body.night .pagination .pagination-previous a, +body.night .pagination-link:not(.is-current) a { + color: #c0c0c0; +} +body.night .pagination-link.is-current { + background-color: #434a56; + border-color: #434a56; +} +body.night [data-waline] .wl-wrap, +body.night [data-waline] .wl-wrap .wl-header .wl-input { + border-color: #373d48; +} +body.night [data-waline] .wl-wrap .wl-header .wl-input:focus { + border-color: #434a56; +} +body.night [data-waline] .wl-btn { + color: #c0c0c0; + background-color: #373d48; + border-color: #373d48; +} +body.night [data-waline] .wl-btn:hover { + background-color: #434a56; +} +body.night [data-waline] .wl-btn:active { + background-color: #2c313a; +} +body.night [data-waline] .wl-list .wl-card .wl-head .wl-sys { + background-color: #373d48; +} +body.night [data-waline] a:hover, +body.night [data-waline] .wl-list .wl-card .wl-h .wl-meta .wl-at { + color: #fff; +} +body.night [data-waline] .wl-list .wl-card .wl-content.expand:before { + background: -webkit-gradient(linear, left top, left bottom, , to(#252936)); + background: linear-gradient(180deg, rgba(37,41,54,0), #252936); +} +body.night [data-waline] .wl-list .wl-card .wl-content.expand:after { + background: #252936; +} +body.night [data-waline] .wl-list .wl-card .wl-h, +body.night [data-waline] .wl-list .wl-card .wl-quote { + border-color: #434a56; +} +body.night body, +body.night strong, +body.night time, +body.night .title, +body.night .footer, +body.night .card, +body.night .content h1, +body.night .content h2, +body.night .content h3, +body.night .content h4, +body.night .content h5, +body.night .content h6, +body.night .navbar-item, +body.night .navbar-item.is-active, +body.night .navbar-link, +body.night .menu-list a, +body.night .menu-label, +body.night .level-item, +body.night .input, +body.night .textarea, +body.night .button.is-white, +body.night .button.is-transparent, +body.night .article-licensing, +body.night [data-waline] * { + color: #c0c0c0; +} +body.night .media-content, +body.night .has-text-grey, +body.night .link-muted { + color: #c0c0c0 !important; +} +body.night a { + color: #5299e0; +} +body.night a:hover { + color: #fff; +} +body.night .timeline a, +body.night [data-type="recent-posts"] a { + color: #c0c0c0; +} +body.night .timeline a:hover, +body.night [data-type="recent-posts"] a:hover { + color: #fff; +} +body.night .content blockquote, +body.night .article-licensing { + background-color: #373d48; + border-color: #434a56; +} +body.night .content table thead td, +body.night .content table thead th { + color: #c0c0c0; +} +body.night .content table td, +body.night .content table th { + border-color: #434a56; +} +body.night hr { + background-color: #434a56; +} +body.night article.article .title a, +body.night article.media .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #c0c0c0 1px); +} +body.night article.article .title:hover a, +body.night article.media .title:hover a { + color: #c0c0c0 !important; +} +body.night .tag:not(body) { + color: #c0c0c0; + background-color: #373d48; +} +body.night .widget .tags .tag:first-child, +body.night .tag.is-grey { + background-color: #434a56; +} +body.night .menu-list a:hover { + background-color: #373d48; +} +body.night .menu-list a.is-active { + background-color: #434a56; +} +body.night .menu-list li ul { + border-color: #373d48; +} +body.night .timeline .media:last-child:after { + background-color: #252936; +} +body.night .timeline { + border-color: #434a56; +} +body.night .timeline .media:before { + background-color: #434a56; +} +body.night .searchbox .searchbox-container, +body.night .searchbox .searchbox-header, +body.night .searchbox .searchbox-header .searchbox-input, +body.night .searchbox .searchbox-header .searchbox-close, +body.night .searchbox .searchbox-body, +body.night .searchbox .searchbox-result-section, +body.night .searchbox .searchbox-result-item { + color: #c0c0c0; + background-color: #373d48; + border-color: #434a56; +} +body.night .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item:hover, +body.night .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item.active, +body.night .searchbox .searchbox-container .searchbox-header .searchbox-close:hover { + color: #fff; + background-color: #434a56; +} +body.night ::selection { + color: #fff; + background-color: rgba(52,109,167,0.8); +} +body.night ::-moz-selection { + color: #fff; + background-color: rgba(52,109,167,0.8); +} +body.night input:-webkit-autofill { + -webkit-text-fill-color: #c0c0c0 !important; + box-shadow: 0 0 0px 1000px #373d48 inset; +} +body.night .twikoo pre { + background-color: #373d48; +} +body.night .twikoo code { + color: #cbba7d; + background-color: #373d48; +} +@media (prefers-color-scheme: dark) { + body:not(.light) { + background: #0e1225; + } + body:not(.light) .hljs { + display: block; + overflow-x: auto; + color: #abb2bf; + background: #282c34; + } + body:not(.light) .hljs-comment, + body:not(.light) .hljs-quote { + color: #5c6370; + font-style: italic; + } + body:not(.light) .hljs-doctag, + body:not(.light) .hljs-keyword, + body:not(.light) .hljs-formula { + color: #c678dd; + } + body:not(.light) .hljs-section, + body:not(.light) .hljs-name, + body:not(.light) .hljs-selector-tag, + body:not(.light) .hljs-deletion, + body:not(.light) .hljs-subst { + color: #e06c75; + } + body:not(.light) .hljs-literal { + color: #56b6c2; + } + body:not(.light) .hljs-string, + body:not(.light) .hljs-regexp, + body:not(.light) .hljs-addition, + body:not(.light) .hljs-attribute, + body:not(.light) .hljs-meta-string { + color: #98c379; + } + body:not(.light) .hljs-built_in, + body:not(.light) .hljs-class .hljs-title { + color: #e6c07b; + } + body:not(.light) .hljs-attr, + body:not(.light) .hljs-variable, + body:not(.light) .hljs-template-variable, + body:not(.light) .hljs-type, + body:not(.light) .hljs-selector-class, + body:not(.light) .hljs-selector-attr, + body:not(.light) .hljs-selector-pseudo, + body:not(.light) .hljs-number { + color: #d19a66; + } + body:not(.light) .hljs-symbol, + body:not(.light) .hljs-bullet, + body:not(.light) .hljs-link, + body:not(.light) .hljs-meta, + body:not(.light) .hljs-selector-id, + body:not(.light) .hljs-title { + color: #61aeee; + } + body:not(.light) .hljs-emphasis { + font-style: italic; + } + body:not(.light) .hljs-strong { + font-weight: bold; + } + body:not(.light) .hljs-link { + text-decoration: underline; + } + body:not(.light) .content code { + color: #cbba7d; + } + body:not(.light) #night-nav #night-icon:before { + content: '\f0eb'; + } + body:not(.light) img, + body:not(.light) video, + body:not(.light) iframe, + body:not(.light) .waifu, + body:not(.light) .donate { + filter: brightness(0.8); + -webkit-filter: brightness(0.8); + } + body:not(.light) .navbar-logo .logo-img, + body:not(.light) .footer-logo .logo-img { + display: none; + } + body:not(.light) .navbar-logo .logo-img-dark, + body:not(.light) .footer-logo .logo-img-dark { + display: inline-block; + } + body:not(.light) .navbar-main .navbar-menu .navbar-item:hover, + body:not(.light) .navbar-main .navbar-menu .navbar-item:focus { + color: #fff; + background-color: #373d48; + } + body:not(.light) .navbar-main .navbar-menu .navbar-item.is-active { + color: #c0c0c0; + } + body:not(.light) .navbar { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); + } + body:not(.light) .card { + background-color: rgba(40,44,52,0.5); + backdrop-filter: none; + -webkit-backdrop-filter: none; + } + body:not(.light) .card:hover { + background-color: rgba(40,44,52,0.8); + } + body:not(.light) .card .breadcrumb li.is-active a { + color: #c0c0c0; + } + body:not(.light) .footer { + backdrop-filter: none; + -webkit-backdrop-filter: none; + background-color: rgba(40,44,52,0.5); + } + body:not(.light) .input, + body:not(.light) .textarea { + background-color: #434a56; + border-color: #373d48; + } + body:not(.light) .button.is-primary, + body:not(.light) .button.is-light, + body:not(.light) .button.is-small { + background-color: #373d48; + color: #c0c0c0; + } + body:not(.light) .button.is-primary:hover, + body:not(.light) .button.is-light:hover, + body:not(.light) .button.is-small:hover, + body:not(.light) .button.is-primary.is-hovered, + body:not(.light) .button.is-light.is-hovered, + body:not(.light) .button.is-small.is-hovered { + color: #fff; + background-color: #434a56; + } + body:not(.light) .button.is-primary:active, + body:not(.light) .button.is-light:active, + body:not(.light) .button.is-small:active, + body:not(.light) .button.is-primary.is-active, + body:not(.light) .button.is-light.is-active, + body:not(.light) .button.is-small.is-active { + color: #fff; + background-color: #2c313a; + } + body:not(.light) .button.is-white, + body:not(.light) .button.is-transparent { + background-color: transparent; + } + body:not(.light) .button.is-white:hover, + body:not(.light) .button.is-transparent:hover { + background-color: #373d48 !important; + } + body:not(.light) .pagination .pagination-next, + body:not(.light) .pagination .pagination-previous, + body:not(.light) .pagination-link:not(.is-current) { + color: #c0c0c0; + background-color: #373d48; + } + body:not(.light) .pagination .pagination-next a, + body:not(.light) .pagination .pagination-previous a, + body:not(.light) .pagination-link:not(.is-current) a { + color: #c0c0c0; + } + body:not(.light) .pagination-link.is-current { + background-color: #434a56; + border-color: #434a56; + } + body:not(.light) [data-waline] .wl-wrap, + body:not(.light) [data-waline] .wl-wrap .wl-header .wl-input { + border-color: #373d48; + } + body:not(.light) [data-waline] .wl-wrap .wl-header .wl-input:focus { + border-color: #434a56; + } + body:not(.light) [data-waline] .wl-btn { + color: #c0c0c0; + background-color: #373d48; + border-color: #373d48; + } + body:not(.light) [data-waline] .wl-btn:hover { + background-color: #434a56; + } + body:not(.light) [data-waline] .wl-btn:active { + background-color: #2c313a; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-head .wl-sys { + background-color: #373d48; + } + body:not(.light) [data-waline] a:hover, + body:not(.light) [data-waline] .wl-list .wl-card .wl-h .wl-meta .wl-at { + color: #fff; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-content.expand:before { + background: -webkit-gradient(linear, left top, left bottom, , to(#252936)); + background: linear-gradient(180deg, rgba(37,41,54,0), #252936); + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-content.expand:after { + background: #252936; + } + body:not(.light) [data-waline] .wl-list .wl-card .wl-h, + body:not(.light) [data-waline] .wl-list .wl-card .wl-quote { + border-color: #434a56; + } + body:not(.light) body, + body:not(.light) strong, + body:not(.light) time, + body:not(.light) .title, + body:not(.light) .footer, + body:not(.light) .card, + body:not(.light) .content h1, + body:not(.light) .content h2, + body:not(.light) .content h3, + body:not(.light) .content h4, + body:not(.light) .content h5, + body:not(.light) .content h6, + body:not(.light) .navbar-item, + body:not(.light) .navbar-item.is-active, + body:not(.light) .navbar-link, + body:not(.light) .menu-list a, + body:not(.light) .menu-label, + body:not(.light) .level-item, + body:not(.light) .input, + body:not(.light) .textarea, + body:not(.light) .button.is-white, + body:not(.light) .button.is-transparent, + body:not(.light) .article-licensing, + body:not(.light) [data-waline] * { + color: #c0c0c0; + } + body:not(.light) .media-content, + body:not(.light) .has-text-grey, + body:not(.light) .link-muted { + color: #c0c0c0 !important; + } + body:not(.light) a { + color: #5299e0; + } + body:not(.light) a:hover { + color: #fff; + } + body:not(.light) .timeline a, + body:not(.light) [data-type="recent-posts"] a { + color: #c0c0c0; + } + body:not(.light) .timeline a:hover, + body:not(.light) [data-type="recent-posts"] a:hover { + color: #fff; + } + body:not(.light) .content blockquote, + body:not(.light) .article-licensing { + background-color: #373d48; + border-color: #434a56; + } + body:not(.light) .content table thead td, + body:not(.light) .content table thead th { + color: #c0c0c0; + } + body:not(.light) .content table td, + body:not(.light) .content table th { + border-color: #434a56; + } + body:not(.light) hr { + background-color: #434a56; + } + body:not(.light) article.article .title a, + body:not(.light) article.media .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #c0c0c0 1px); + } + body:not(.light) article.article .title:hover a, + body:not(.light) article.media .title:hover a { + color: #c0c0c0 !important; + } + body:not(.light) .tag:not(body) { + color: #c0c0c0; + background-color: #373d48; + } + body:not(.light) .widget .tags .tag:first-child, + body:not(.light) .tag.is-grey { + background-color: #434a56; + } + body:not(.light) .menu-list a:hover { + background-color: #373d48; + } + body:not(.light) .menu-list a.is-active { + background-color: #434a56; + } + body:not(.light) .menu-list li ul { + border-color: #373d48; + } + body:not(.light) .timeline .media:last-child:after { + background-color: #252936; + } + body:not(.light) .timeline { + border-color: #434a56; + } + body:not(.light) .timeline .media:before { + background-color: #434a56; + } + body:not(.light) .searchbox .searchbox-container, + body:not(.light) .searchbox .searchbox-header, + body:not(.light) .searchbox .searchbox-header .searchbox-input, + body:not(.light) .searchbox .searchbox-header .searchbox-close, + body:not(.light) .searchbox .searchbox-body, + body:not(.light) .searchbox .searchbox-result-section, + body:not(.light) .searchbox .searchbox-result-item { + color: #c0c0c0; + background-color: #373d48; + border-color: #434a56; + } + body:not(.light) .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item:hover, + body:not(.light) .searchbox .searchbox-container .searchbox-result-section .searchbox-result-item.active, + body:not(.light) .searchbox .searchbox-container .searchbox-header .searchbox-close:hover { + color: #fff; + background-color: #434a56; + } + body:not(.light) ::selection { + color: #fff; + background-color: rgba(52,109,167,0.8); + } + body:not(.light) ::-moz-selection { + color: #fff; + background-color: rgba(52,109,167,0.8); + } + body:not(.light) input:-webkit-autofill { + -webkit-text-fill-color: #c0c0c0 !important; + box-shadow: 0 0 0px 1000px #373d48 inset; + } + body:not(.light) .twikoo pre { + background-color: #373d48; + } + body:not(.light) .twikoo code { + color: #cbba7d; + background-color: #373d48; + } +} +.heimu { + color: #7a7a7a; + background-color: #7a7a7a; +} +.heimu:hover { + color: #fff; +} +.navbar-main, +.card { + transition: background-color 0.2s ease-out !important; +} +body, +hr, +.button, +.tag, +.level, +.box, +.wl-panel, +.wl-meta span, +[data-waline] pre { + transition: background-color 0.2s ease-out; +} +img, +ul, +.highlight, +code, +p, +i { + transition: 0.2s ease-out; +} +.navbar-main .navbar-menu { + background-color: transparent; +} +.navbar-main .navbar-menu .navbar-item.is-active { + color: inherit; + font-weight: bold; +} +.card { + overflow: visible; + background-color: rgba(255,255,255,0.95); +} +.card:hover { + background-color: #fff; +} +.card.card-transparent { + background-color: transparent !important; +} +.card.card-transparent .level-start, +.card.card-transparent .level-end { + overflow: hidden; +} +.footer a:not(.button) { + color: inherit; +} +.footer a:not(.button):hover { + text-decoration: underline; +} +article .title a { + background-image: linear-gradient(transparent calc(100% - 1px), #3273dc 1px); + background-repeat: no-repeat; + background-size: 0 100%; + transition: 0.2s ease-in-out !important; +} +article .title:hover a { + color: #3273dc; + background-size: 100% 100%; +} +pre, +code { + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +article.article .content pre, +article.article .content code { + font-size: 0.96em; +} +:root { + --waline-theme-color: #3273dc !important; + --waline-active-color: #2366d1 !important; + --waline-code-bgcolor: #f8f8f8 !important; + --waline-badge-color: #27ae60 !important; +} +body.night { + --waline-white: #c0c0c0 !important; + --waline-theme-color: #373d48 !important; + --waline-active-color: #434a56 !important; + --waline-bgcolor: rgba(40,44,52,0.5) !important; + --waline-bgcolor-light: rgba(40,44,52,0.8) !important; + --waline-code-bgcolor: #282c34 !important; + --waline-border-color: #434a56 !important; + --waline-badge-color: #373d48 !important; + --waline-border: 1px solid var(--waline-border-color) !important; +} +[data-waline] pre::-webkit-scrollbar-track { + background: rgba(0,0,0,0.06) !important; + box-shadow: inset 0 0 5px rgba(0,0,0,0.1) !important; +} +[data-waline] pre::-webkit-scrollbar-thumb { + background: rgba(0,0,0,0.12) !important; + box-shadow: inset 0 0 10px rgba(0,0,0,0.2) !important; +} +[data-waline] pre::-webkit-scrollbar-thumb:hover { + background: rgba(0,0,0,0.24) !important; +} +body:not(.night) [data-waline] .token { + all: unset; +} +body:not(.night) [data-waline] pre code { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body:not(.night) [data-waline] pre[class*=language-] { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body:not(.night) [data-waline] .token.comment, +body:not(.night) [data-waline] .token.prolog, +body:not(.night) [data-waline] .token.cdata { + color: #a0a1a7; +} +body:not(.night) [data-waline] .token.doctype, +body:not(.night) [data-waline] .token.punctuation, +body:not(.night) [data-waline] .token.entity { + color: #383a42; +} +body:not(.night) [data-waline] .token.attr-name, +body:not(.night) [data-waline] .token.class-name, +body:not(.night) [data-waline] .token.boolean, +body:not(.night) [data-waline] .token.constant, +body:not(.night) [data-waline] .token.number, +body:not(.night) [data-waline] .token.atrule { + color: #b76b01; +} +body:not(.night) [data-waline] .token.keyword { + color: #a626a4; +} +body:not(.night) [data-waline] .token.property, +body:not(.night) [data-waline] .token.tag, +body:not(.night) [data-waline] .token.symbol, +body:not(.night) [data-waline] .token.deleted, +body:not(.night) [data-waline] .token.important { + color: #e45649; +} +body:not(.night) [data-waline] .token.selector, +body:not(.night) [data-waline] .token.string, +body:not(.night) [data-waline] .token.char, +body:not(.night) [data-waline] .token.builtin, +body:not(.night) [data-waline] .token.inserted, +body:not(.night) [data-waline] .token.regex, +body:not(.night) [data-waline] .token.attr-value, +body:not(.night) [data-waline] .token.attr-value > .token.punctuation { + color: #50a14f; +} +body:not(.night) [data-waline] .token.variable, +body:not(.night) [data-waline] .token.operator, +body:not(.night) [data-waline] .token.function { + color: #4078f2; +} +body:not(.night) [data-waline] .token.url { + color: #0184bc; +} +body:not(.night) [data-waline] .token.attr-value > .token.punctuation.attr-equals, +body:not(.night) [data-waline] .token.special-attr > .token.attr-value > .token.value.css { + color: #383a42; +} +body:not(.night) [data-waline] .language-css .token.selector { + color: #e45649; +} +body:not(.night) [data-waline] .language-css .token.property { + color: #383a42; +} +body:not(.night) [data-waline] .language-css .token.function, +body:not(.night) [data-waline] .language-css .token.url > .token.function { + color: #0184bc; +} +body:not(.night) [data-waline] .language-css .token.url > .token.string.url { + color: #50a14f; +} +body:not(.night) [data-waline] .language-css .token.important, +body:not(.night) [data-waline] .language-css .token.atrule .token.rule { + color: #a626a4; +} +body:not(.night) [data-waline] .language-javascript .token.operator { + color: #a626a4; +} +body:not(.night) [data-waline] .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { + color: #ca1243; +} +body:not(.night) [data-waline] .language-json .token.operator { + color: #383a42; +} +body:not(.night) [data-waline] .language-json .token.null.keyword { + color: #b76b01; +} +body:not(.night) [data-waline] .language-markdown .token.url, +body:not(.night) [data-waline] .language-markdown .token.url > .token.operator, +body:not(.night) [data-waline] .language-markdown .token.url-reference.url > .token.string { + color: #383a42; +} +body:not(.night) [data-waline] .language-markdown .token.url > .token.content { + color: #4078f2; +} +body:not(.night) [data-waline] .language-markdown .token.url > .token.url, +body:not(.night) [data-waline] .language-markdown .token.url-reference.url { + color: #0184bc; +} +body:not(.night) [data-waline] .language-markdown .token.blockquote.punctuation, +body:not(.night) [data-waline] .language-markdown .token.hr.punctuation { + color: #a0a1a7; + font-style: italic; +} +body:not(.night) [data-waline] .language-markdown .token.code-snippet { + color: #50a14f; +} +body:not(.night) [data-waline] .language-markdown .token.bold .token.content { + color: #b76b01; +} +body:not(.night) [data-waline] .language-markdown .token.italic .token.content { + color: #a626a4; +} +body:not(.night) [data-waline] .language-markdown .token.strike .token.content, +body:not(.night) [data-waline] .language-markdown .token.strike .token.punctuation, +body:not(.night) [data-waline] .language-markdown .token.list.punctuation, +body:not(.night) [data-waline] .language-markdown .token.title.important > .token.punctuation { + color: #e45649; +} +body:not(.night) [data-waline] .token.bold { + font-weight: bold; +} +body:not(.night) [data-waline] .token.comment, +body:not(.night) [data-waline] .token.italic { + font-style: italic; +} +body:not(.night) [data-waline] .token.entity { + cursor: help; +} +body:not(.night) [data-waline] .token.namespace { + opacity: 0.8; +} +body.night [data-waline] .token { + all: unset; +} +body.night [data-waline] pre code { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body.night [data-waline] pre[class*=language-] { + all: unset; + font-family: Consolas, Courier, Menlo, monospace, Ubuntu, Roboto; +} +body.night [data-waline] .token.comment, +body.night [data-waline] .token.prolog, +body.night [data-waline] .token.cdata { + color: #5c6370; +} +body.night [data-waline] .token.doctype, +body.night [data-waline] .token.punctuation, +body.night [data-waline] .token.entity { + color: #abb2bf; +} +body.night [data-waline] .token.attr-name, +body.night [data-waline] .token.class-name, +body.night [data-waline] .token.boolean, +body.night [data-waline] .token.constant, +body.night [data-waline] .token.number, +body.night [data-waline] .token.atrule { + color: #d19a66; +} +body.night [data-waline] .token.keyword { + color: #c678dd; +} +body.night [data-waline] .token.property, +body.night [data-waline] .token.tag, +body.night [data-waline] .token.symbol, +body.night [data-waline] .token.deleted, +body.night [data-waline] .token.important { + color: #e06c75; +} +body.night [data-waline] .token.selector, +body.night [data-waline] .token.string, +body.night [data-waline] .token.char, +body.night [data-waline] .token.builtin, +body.night [data-waline] .token.inserted, +body.night [data-waline] .token.regex, +body.night [data-waline] .token.attr-value, +body.night [data-waline] .token.attr-value > .token.punctuation { + color: #98c379; +} +body.night [data-waline] .token.variable, +body.night [data-waline] .token.operator, +body.night [data-waline] .token.function { + color: #61afef; +} +body.night [data-waline] .token.url { + color: #56b6c2; +} +body.night [data-waline] .token.attr-value > .token.punctuation.attr-equals, +body.night [data-waline] .token.special-attr > .token.attr-value > .token.value.css { + color: #abb2bf; +} +body.night [data-waline] .language-css .token.selector { + color: #e06c75; +} +body.night [data-waline] .language-css .token.property { + color: #abb2bf; +} +body.night [data-waline] .language-css .token.function, +body.night [data-waline] .language-css .token.url > .token.function { + color: #56b6c2; +} +body.night [data-waline] .language-css .token.url > .token.string.url { + color: #98c379; +} +body.night [data-waline] .language-css .token.important, +body.night [data-waline] .language-css .token.atrule .token.rule { + color: #c678dd; +} +body.night [data-waline] .language-javascript .token.operator { + color: #c678dd; +} +body.night [data-waline] .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { + color: #be5046; +} +body.night [data-waline] .language-json .token.operator { + color: #abb2bf; +} +body.night [data-waline] .language-json .token.null.keyword { + color: #d19a66; +} +body.night [data-waline] .language-markdown .token.url, +body.night [data-waline] .language-markdown .token.url > .token.operator, +body.night [data-waline] .language-markdown .token.url-reference.url > .token.string { + color: #abb2bf; +} +body.night [data-waline] .language-markdown .token.url > .token.content { + color: #61afef; +} +body.night [data-waline] .language-markdown .token.url > .token.url, +body.night [data-waline] .language-markdown .token.url-reference.url { + color: #56b6c2; +} +body.night [data-waline] .language-markdown .token.blockquote.punctuation, +body.night [data-waline] .language-markdown .token.hr.punctuation { + color: #5c6370; + font-style: italic; +} +body.night [data-waline] .language-markdown .token.code-snippet { + color: #98c379; +} +body.night [data-waline] .language-markdown .token.bold .token.content { + color: #d19a66; +} +body.night [data-waline] .language-markdown .token.italic .token.content { + color: #c678dd; +} +body.night [data-waline] .language-markdown .token.strike .token.content, +body.night [data-waline] .language-markdown .token.strike .token.punctuation, +body.night [data-waline] .language-markdown .token.list.punctuation, +body.night [data-waline] .language-markdown .token.title.important > .token.punctuation { + color: #e06c75; +} +body.night [data-waline] .token.bold { + font-weight: bold; +} +body.night [data-waline] .token.comment, +body.night [data-waline] .token.italic { + font-style: italic; +} +body.night [data-waline] .token.entity { + cursor: help; +} +body.night [data-waline] .token.namespace { + opacity: 0.8; +} diff --git a/img/gravatar.jpg b/img/gravatar.jpg new file mode 100644 index 0000000..e5a59f7 Binary files /dev/null and b/img/gravatar.jpg differ diff --git a/img/razor-bottom-black.svg b/img/razor-bottom-black.svg new file mode 100644 index 0000000..a3bcb49 --- /dev/null +++ b/img/razor-bottom-black.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/img/razor-top-black.svg b/img/razor-top-black.svg new file mode 100644 index 0000000..df7d497 --- /dev/null +++ b/img/razor-top-black.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/img/thumbnail.svg b/img/thumbnail.svg new file mode 100644 index 0000000..59505dc --- /dev/null +++ b/img/thumbnail.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..55d18f1 --- /dev/null +++ b/index.html @@ -0,0 +1,64 @@ + +Centaurus99 的杂物堆

基于 Proxmox VE 的 All in One 服务器搭建

树莓派挂在宿舍当软路由已经两年了,大部分情况下都挺好用,透明代理体验也还算尚可。

+

然而由于使用的 USB 无线网卡驱动支持较差,无线峰值速率只能跑到 200+ Mbps,且不大稳定。并且树莓派性能不高,无法开设一些高负载服务。另外,树莓派作为路由常年开启,需要考虑散热问题,虽然给使用的小风扇写了启停功能,但是启动运转时还是会有一定的噪音,较为恼人。


使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化

最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,https://pvvx.github.io/ATC_MiThermometer/),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。

+

最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。


树莓派软路由配置 IPv6 网络

树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。


使用acme.sh自动配置泛域名证书

一年前用学生邮箱白嫖的域名要到期了,于是换了个便宜的 .top 域名,正好之前忘了记录自动签证书的过程了,这里记录一下以后再换域名的时候直接来抄。

+

由于同时有很多子域名在用,于是决定申请泛域名证书,共用同一个。

+

主要参考 官方文档 ,记录了仅适用于我个人的配置过程。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/js/algolia.js b/js/algolia.js new file mode 100644 index 0000000..d59f1ef --- /dev/null +++ b/js/algolia.js @@ -0,0 +1,102 @@ +/* global instantsearch, algoliasearch */ +// eslint-disable-next-line no-unused-vars +function loadAlgolia(config, translation) { + const search = instantsearch({ + indexName: config.indexName, + searchClient: algoliasearch(config.applicationId, config.apiKey), + }); + + search.addWidgets([ + instantsearch.widgets.configure({ + attributesToSnippet: ['excerpt'], + }), + ]); + + search.addWidget( + instantsearch.widgets.searchBox({ + container: '#algolia-input', + placeholder: translation.hint, + showReset: false, + showSubmit: false, + showLoadingIndicator: false, + cssClasses: { + root: 'searchbox-input-container', + form: 'searchbox-input-container', + input: 'searchbox-input', + }, + }), + ); + + search.addWidget( + instantsearch.widgets.poweredBy({ + container: '#algolia-poweredby', + }), + ); + + search.addWidget( + instantsearch.widgets.hits({ + container: '.searchbox-body', + escapeHTML: false, + cssClasses: { + root: 'searchbox-result-container', + emptyRoot: ['searchbox-result-item', 'disabled'], + }, + templates: { + empty: function (results) { + return translation.no_result + ': ' + results.query; + }, + item: function (hit) { + let title = instantsearch.highlight({ attribute: 'title', hit }); + let excerpt = instantsearch.highlight({ attribute: 'excerpt', hit }); + title = title ? title : translation.untitled; + excerpt = excerpt + .replace(new RegExp('', 'ig'), '[algolia-highlight]') + .replace(new RegExp('', 'ig'), '[/algolia-highlight]') + .replace(/(<([^>]+)>)/gi, '') + .replace(/(\[algolia-highlight\])/gi, '') + .replace(/(\[\/algolia-highlight\])/gi, ''); + excerpt = excerpt ? excerpt : translation.empty_preview; + return `
+ + + ${title} + ${excerpt} + + +
`; + }, + }, + }), + ); + + search.addWidget( + instantsearch.widgets.pagination({ + container: '.searchbox-footer', + cssClasses: { + list: 'searchbox-pagination', + item: 'searchbox-pagination-item', + link: 'searchbox-pagination-link', + selectedItem: 'active', + disabledItem: 'disabled', + }, + }), + ); + + search.start(); + + if (location.hash.trim() === '#algolia-search') { + $('.searchbox').addClass('show'); + } + + $(document) + .on('click', '.navbar-main .search', () => { + $('.searchbox').toggleClass('show'); + $('.searchbox-input').focus(); + }) + .on('click', '.searchbox .searchbox-mask', () => { + $('.searchbox').removeClass('show'); + }) + .on('click', '.searchbox-close', () => { + $('.searchbox').removeClass('show'); + }); +} diff --git a/js/animation.js b/js/animation.js new file mode 100644 index 0000000..cc1b17d --- /dev/null +++ b/js/animation.js @@ -0,0 +1,45 @@ +(function() { + function $() { + return Array.prototype.slice.call(document.querySelectorAll.apply(document, arguments)); + } + + $('body > .navbar, body > .section, body > .footer').forEach(element => { + element.style.transition = '0s'; + element.style.opacity = '0'; + }); + document.querySelector('body > .navbar').style.transform = 'translateY(-100px)'; + [ + '.column-main > .card, .column-main > .pagination, .column-main > .post-navigation', + '.column-left > .card, .column-right-shadow > .card', + '.column-right > .card' + ].forEach(selector => { + $(selector).forEach(element => { + element.style.transition = '0s'; + element.style.opacity = '0'; + element.style.transform = 'scale(0.8)'; + element.style.transformOrigin = 'center top'; + }); + }); + setTimeout(() => { + $('body > .navbar, body > .section, body > .footer').forEach(element => { + element.style.opacity = '1'; + element.style.transition = 'opacity 0.3s ease-out, transform 0.3s ease-out, box-shadow 0.3s ease-in-out'; + }); + document.querySelector('body > .navbar').style.transform = 'translateY(0)'; + [ + '.column-main > .card, .column-main > .pagination, .column-main > .post-navigation', + '.column-left > .card, .column-right-shadow > .card', + '.column-right > .card' + ].forEach(selector => { + let i = 1; + $(selector).forEach(element => { + setTimeout(() => { + element.style.opacity = '1'; + element.style.transform = ''; + element.style.transition = 'opacity 0.3s ease-out, transform 0.3s ease-out, box-shadow 0.3s ease-in-out'; + }, i * 100); + i++; + }); + }); + }); +}()); diff --git a/js/back_to_top.js b/js/back_to_top.js new file mode 100644 index 0000000..cf56af1 --- /dev/null +++ b/js/back_to_top.js @@ -0,0 +1,152 @@ +$(document).ready(() => { + const $button = $('#back-to-top'); + const $footer = $('footer.footer'); + const $mainColumn = $('.column-main'); + const $leftSidebar = $('.column-left'); + const $rightSidebar = $('.column-right'); + let lastScrollTop = 0; + const rightMargin = 20; + const bottomMargin = 20; + let lastState = null; + const state = { + base: { + classname: 'card has-text-centered', + left: '', + width: 64, + bottom: bottomMargin + } + }; + state['desktop-hidden'] = Object.assign({}, state.base, { + classname: state.base.classname + ' rise-up' + }); + state['desktop-visible'] = Object.assign({}, state['desktop-hidden'], { + classname: state['desktop-hidden'].classname + ' fade-in' + }); + state['desktop-dock'] = Object.assign({}, state['desktop-visible'], { + classname: state['desktop-visible'].classname + ' fade-in is-rounded', + width: 40 + }); + state['mobile-hidden'] = Object.assign({}, state.base, { + classname: state.base.classname + ' fade-in', + right: rightMargin + }); + state['mobile-visible'] = Object.assign({}, state['mobile-hidden'], { + classname: state['mobile-hidden'].classname + ' rise-up' + }); + + function isStateEquals(prev, next) { + return ![].concat(Object.keys(prev), Object.keys(next)).some(key => { + return !Object.prototype.hasOwnProperty.call(prev, key) + || !Object.prototype.hasOwnProperty.call(next, key) + || next[key] !== prev[key]; + }); + } + + function applyState(state) { + if (lastState !== null && isStateEquals(lastState, state)) { + return; + } + $button.attr('class', state.classname); + for (const prop in state) { + if (prop === 'classname') { + continue; + } + $button.css(prop, state[prop]); + } + lastState = state; + } + + function isDesktop() { + return window.innerWidth >= 1078; + } + + function isTablet() { + return window.innerWidth >= 768 && !isDesktop(); + } + + function isScrollUp() { + return $(window).scrollTop() < lastScrollTop && $(window).scrollTop() > 0; + } + + function hasLeftSidebar() { + return $leftSidebar.length > 0; + } + + function hasRightSidebar() { + return $rightSidebar.length > 0; + } + + function getRightSidebarBottom() { + if (!hasRightSidebar()) { + return 0; + } + return Math.max.apply(null, $rightSidebar.find('.widget').map(function() { + return $(this).offset().top + $(this).outerHeight(true); + })); + } + + function getScrollTop() { + return $(window).scrollTop(); + } + + function getScrollBottom() { + return $(window).scrollTop() + $(window).height(); + } + + function getButtonWidth() { + return $button.outerWidth(true); + } + + function getButtonHeight() { + return $button.outerHeight(true); + } + + function updateScrollTop() { + lastScrollTop = $(window).scrollTop(); + } + + function update() { + // desktop mode or tablet mode with only right sidebar enabled + if (isDesktop() || (isTablet() && !hasLeftSidebar() && hasRightSidebar())) { + let nextState; + const padding = ($mainColumn.outerWidth() - $mainColumn.width()) / 2; + const maxLeft = $(window).width() - getButtonWidth() - rightMargin; + const maxBottom = $footer.offset().top + (getButtonHeight() / 2) + bottomMargin; + if (getScrollTop() === 0 || getScrollBottom() < getRightSidebarBottom() + padding + getButtonHeight()) { + nextState = state['desktop-hidden']; + } else if (getScrollBottom() < maxBottom) { + nextState = state['desktop-visible']; + } else { + nextState = Object.assign({}, state['desktop-dock'], { + bottom: getScrollBottom() - maxBottom + bottomMargin + }); + } + + const left = $mainColumn.offset().left + $mainColumn.outerWidth() + padding; + nextState = Object.assign({}, nextState, { + left: Math.min(left, maxLeft) + }); + applyState(nextState); + } else { + // mobile and tablet mode + if (!isScrollUp()) { + applyState(state['mobile-hidden']); + } else { + applyState(state['mobile-visible']); + } + updateScrollTop(); + } + } + + update(); + $(window).resize(update); + $(window).scroll(update); + + $('#back-to-top').on('click', () => { + if (CSS && CSS.supports && CSS.supports('(scroll-behavior: smooth)')) { + window.scroll({ top: 0, behavior: 'smooth' }); + } else { + $('body, html').animate({ scrollTop: 0 }, 400); + } + }); +}); diff --git a/js/column.js b/js/column.js new file mode 100644 index 0000000..a39d8aa --- /dev/null +++ b/js/column.js @@ -0,0 +1,12 @@ +(function() { + function $() { + return Array.prototype.slice.call(document.querySelectorAll.apply(document, arguments)); + } + + // copy widgets in the right column, when exist, to the bottom of the left column + if ($('.columns .column-right').length && $('.columns .column-right-shadow').length && !$('.columns .column-right-shadow')[0].children.length) { + for (const child of $('.columns .column-right')[0].children) { + $('.columns .column-right-shadow')[0].append(child.cloneNode(true)); + } + } +}()); diff --git a/js/google_cse.js b/js/google_cse.js new file mode 100644 index 0000000..6c311d1 --- /dev/null +++ b/js/google_cse.js @@ -0,0 +1,44 @@ +/* global google */ +(function (document, $) { + function debounce(func, wait, immediate) { + let timeout; + return function () { + const context = this; + const args = arguments; + const later = function () { + timeout = null; + if (!immediate) func.apply(context, args); + }; + const callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) func.apply(context, args); + }; + } + + $(document) + .on('click', '.navbar-main .search', () => { + $('.searchbox').toggleClass('show'); + }) + .on('click', '.searchbox .searchbox-mask', () => { + $('.searchbox').removeClass('show'); + }) + .on('click', '.searchbox-close', () => { + $('.searchbox').removeClass('show'); + }) + .on( + 'keydown', + '.searchbox-input', + debounce(function () { + const value = $(this).val(); + try { + const element = google.search.cse.element.getElement('searchresults-only0'); + if (value.trim() === '') { + element.clearAllResults(); + } else { + element.execute(value); + } + } catch (e) {} + }, 300), + ); +})(document, jQuery); diff --git a/js/imaegoo/night.js b/js/imaegoo/night.js new file mode 100644 index 0000000..1150b08 --- /dev/null +++ b/js/imaegoo/night.js @@ -0,0 +1,37 @@ +(function() { + + /** + * Icarus 夜间模式 by iMaeGoo + * https://www.imaegoo.com/ + */ + let isNight = localStorage.getItem('night'); + let nightNav; + + function applyNight(value) { + if (value.toString() === 'true') { + document.body.classList.remove('light'); + document.body.classList.add('night'); + } else { + document.body.classList.remove('night'); + document.body.classList.add('light'); + } + } + + function findNightNav() { + nightNav = document.getElementById('night-nav'); + if (!nightNav) { + setTimeout(findNightNav, 100); + } else { + nightNav.addEventListener('click', switchNight); + } + } + + function switchNight() { + isNight = isNight ? isNight.toString() !== 'true' : true; + applyNight(isNight); + localStorage.setItem('night', isNight); + } + + findNightNav(); + isNight && applyNight(isNight); +}()); diff --git a/js/insight.js b/js/insight.js new file mode 100644 index 0000000..5112280 --- /dev/null +++ b/js/insight.js @@ -0,0 +1,354 @@ +/** + * Insight search plugin + * @author PPOffice { @link https://github.com/ppoffice } + */ +// eslint-disable-next-line no-unused-vars +function loadInsight(config, translation) { + const $main = $('.searchbox'); + const $input = $main.find('.searchbox-input'); + const $container = $main.find('.searchbox-body'); + + function section(title) { + return $('
').addClass('searchbox-result-section').append($('
').text(title)); + } + + function merge(ranges) { + let last; + const result = []; + + ranges.forEach((r) => { + if (!last || r[0] > last[1]) { + result.push((last = r)); + } else if (r[1] > last[1]) { + last[1] = r[1]; + } + }); + + return result; + } + + function findAndHighlight(text, matches, maxlen) { + if (!Array.isArray(matches) || !matches.length || !text) { + return maxlen ? text.slice(0, maxlen) : text; + } + const testText = text.toLowerCase(); + const indices = matches + .map((match) => { + const index = testText.indexOf(match.toLowerCase()); + if (!match || index === -1) { + return null; + } + return [index, index + match.length]; + }) + .filter((match) => { + return match !== null; + }) + .sort((a, b) => { + return a[0] - b[0] || a[1] - b[1]; + }); + + if (!indices.length) { + return text; + } + + let result = ''; + let last = 0; + const ranges = merge(indices); + const sumRange = [ranges[0][0], ranges[ranges.length - 1][1]]; + if (maxlen && maxlen < sumRange[1]) { + last = sumRange[0]; + } + + for (let i = 0; i < ranges.length; i++) { + const range = ranges[i]; + result += text.slice(last, Math.min(range[0], sumRange[0] + maxlen)); + if (maxlen && range[0] >= sumRange[0] + maxlen) { + break; + } + result += '' + text.slice(range[0], range[1]) + ''; + last = range[1]; + if (i === ranges.length - 1) { + if (maxlen) { + result += text.slice(range[1], Math.min(text.length, sumRange[0] + maxlen + 1)); + } else { + result += text.slice(range[1]); + } + } + } + + return result; + } + + function searchItem(icon, title, slug, preview, url) { + title = title != null && title !== '' ? title : translation.untitled; + const subtitle = slug + ? '(' + slug + ')' + : ''; + + return ` + + + + + + ${title} + ${subtitle} + + ${preview ? '' + preview + '' : ''} + + `; + } + + function sectionFactory(keywords, type, array) { + let $searchItems; + if (array.length === 0) return null; + const sectionTitle = translation[type.toLowerCase()]; + switch (type) { + case 'POSTS': + case 'PAGES': + $searchItems = array.map((item) => { + const title = findAndHighlight(item.title, keywords); + const text = findAndHighlight(item.text, keywords, 100); + return searchItem('file', title, null, text, item.link); + }); + break; + case 'CATEGORIES': + case 'TAGS': + $searchItems = array.map((item) => { + const name = findAndHighlight(item.name, keywords); + const slug = findAndHighlight(item.slug, keywords); + return searchItem(type === 'CATEGORIES' ? 'folder' : 'tag', name, slug, null, item.link); + }); + break; + default: + return null; + } + return section(sectionTitle).append($searchItems); + } + + function parseKeywords(keywords) { + return keywords + .split(' ') + .filter((keyword) => { + return !!keyword; + }) + .map((keyword) => { + return keyword.toLowerCase(); + }); + } + + /** + * Judge if a given post/page/category/tag contains all of the keywords. + * @param Object obj Object to be weighted + * @param Array fields Object's fields to find matches + */ + function filter(keywords, obj, fields) { + const keywordArray = parseKeywords(keywords); + const containKeywords = keywordArray.filter((keyword) => { + const containFields = fields.filter((field) => { + if (!Object.prototype.hasOwnProperty.call(obj, field)) { + return false; + } + if (obj[field].toLowerCase().indexOf(keyword) > -1) { + return true; + } + return false; + }); + if (containFields.length > 0) { + return true; + } + return false; + }); + return containKeywords.length === keywordArray.length; + } + + function filterFactory(keywords) { + return { + post: function (obj) { + return filter(keywords, obj, ['title', 'text']); + }, + page: function (obj) { + return filter(keywords, obj, ['title', 'text']); + }, + category: function (obj) { + return filter(keywords, obj, ['name', 'slug']); + }, + tag: function (obj) { + return filter(keywords, obj, ['name', 'slug']); + }, + }; + } + + /** + * Calculate the weight of a matched post/page/category/tag. + * @param Object obj Object to be weighted + * @param Array fields Object's fields to find matches + * @param Array weights Weight of every field + */ + function weight(keywords, obj, fields, weights) { + let value = 0; + parseKeywords(keywords).forEach((keyword) => { + const pattern = new RegExp(keyword, 'img'); // Global, Multi-line, Case-insensitive + fields.forEach((field, index) => { + if (Object.prototype.hasOwnProperty.call(obj, field)) { + const matches = obj[field].match(pattern); + value += matches ? matches.length * weights[index] : 0; + } + }); + }); + return value; + } + + function weightFactory(keywords) { + return { + post: function (obj) { + return weight(keywords, obj, ['title', 'text'], [3, 1]); + }, + page: function (obj) { + return weight(keywords, obj, ['title', 'text'], [3, 1]); + }, + category: function (obj) { + return weight(keywords, obj, ['name', 'slug'], [1, 1]); + }, + tag: function (obj) { + return weight(keywords, obj, ['name', 'slug'], [1, 1]); + }, + }; + } + + function search(json, keywords) { + const weights = weightFactory(keywords); + const filters = filterFactory(keywords); + const posts = json.posts; + const pages = json.pages; + const tags = json.tags; + const categories = json.categories; + return { + posts: posts + .filter(filters.post) + .sort((a, b) => { + return weights.post(b) - weights.post(a); + }) + .slice(0, 5), + pages: pages + .filter(filters.page) + .sort((a, b) => { + return weights.page(b) - weights.page(a); + }) + .slice(0, 5), + categories: categories + .filter(filters.category) + .sort((a, b) => { + return weights.category(b) - weights.category(a); + }) + .slice(0, 5), + tags: tags + .filter(filters.tag) + .sort((a, b) => { + return weights.tag(b) - weights.tag(a); + }) + .slice(0, 5), + }; + } + + function searchResultToDOM(keywords, searchResult) { + $container.empty(); + for (const key in searchResult) { + $container.append( + sectionFactory(parseKeywords(keywords), key.toUpperCase(), searchResult[key]), + ); + } + } + + function scrollTo($item) { + if ($item.length === 0) return; + const wrapperHeight = $container[0].clientHeight; + const itemTop = $item.position().top - $container.scrollTop(); + const itemBottom = $item[0].clientHeight + $item.position().top; + if (itemBottom > wrapperHeight + $container.scrollTop()) { + $container.scrollTop(itemBottom - $container[0].clientHeight); + } + if (itemTop < 0) { + $container.scrollTop($item.position().top); + } + } + + function selectItemByDiff(value) { + const $items = $.makeArray($container.find('.searchbox-result-item')); + let prevPosition = -1; + $items.forEach((item, index) => { + if ($(item).hasClass('active')) { + prevPosition = index; + } + }); + const nextPosition = ($items.length + prevPosition + value) % $items.length; + $($items[prevPosition]).removeClass('active'); + $($items[nextPosition]).addClass('active'); + scrollTo($($items[nextPosition])); + } + + function gotoLink($item) { + if ($item && $item.length) { + location.href = $item.attr('href'); + } + } + + $.getJSON(config.contentUrl, (json) => { + if (location.hash.trim() === '#insight-search') { + $main.addClass('show'); + } + $input.on('input', function () { + const keywords = $(this).val(); + searchResultToDOM(keywords, search(json, keywords)); + }); + $input.trigger('input'); + }); + + let touch = false; + $(document) + .on('click focus', '.navbar-main .search', () => { + $main.addClass('show'); + $main.find('.searchbox-input').focus(); + }) + .on('click touchend', '.searchbox-result-item', function (e) { + if (e.type !== 'click' && !touch) { + return; + } + gotoLink($(this)); + touch = false; + }) + .on('click touchend', '.searchbox-close', (e) => { + if (e.type !== 'click' && !touch) { + return; + } + $('.navbar-main').css('pointer-events', 'none'); + setTimeout(() => { + $('.navbar-main').css('pointer-events', 'auto'); + }, 400); + $main.removeClass('show'); + touch = false; + }) + .on('keydown', (e) => { + if (!$main.hasClass('show')) return; + switch (e.keyCode) { + case 27: // ESC + $main.removeClass('show'); + break; + case 38: // UP + selectItemByDiff(-1); + break; + case 40: // DOWN + selectItemByDiff(1); + break; + case 13: // ENTER + gotoLink($container.find('.searchbox-result-item.active').eq(0)); + break; + } + }) + .on('touchstart', (e) => { + touch = true; + }) + .on('touchmove', (e) => { + touch = false; + }); +} diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..0733cbf --- /dev/null +++ b/js/main.js @@ -0,0 +1,140 @@ +/* eslint-disable node/no-unsupported-features/node-builtins */ +(function($, moment, ClipboardJS, config) { + $('.article img:not(".not-gallery-item")').each(function() { + // wrap images with link and add caption if possible + if ($(this).parent('a').length === 0) { + $(this).wrap(''); + if (this.alt) { + $(this).after('

' + this.alt + '

'); + } + } + }); + + if (typeof $.fn.lightGallery === 'function') { + $('.article').lightGallery({ selector: '.gallery-item' }); + } + if (typeof $.fn.justifiedGallery === 'function') { + if ($('.justified-gallery > p > .gallery-item').length) { + $('.justified-gallery > p > .gallery-item').unwrap(); + } + $('.justified-gallery').justifiedGallery(); + } + + // if (typeof moment === 'function') { + // $('.article-meta time').each(function() { + // $(this).text(moment($(this).attr('datetime')).fromNow()); + // }); + // } + + $('.article > .content > table').each(function() { + if ($(this).width() > $(this).parent().width()) { + $(this).wrap('
'); + } + }); + + function adjustNavbar() { + const navbarWidth = $('.navbar-main .navbar-start').outerWidth() + $('.navbar-main .navbar-end').outerWidth(); + if ($(document).outerWidth() < navbarWidth) { + $('.navbar-main .navbar-menu').addClass('justify-content-start'); + } else { + $('.navbar-main .navbar-menu').removeClass('justify-content-start'); + } + } + adjustNavbar(); + $(window).resize(adjustNavbar); + + function toggleFold(codeBlock, isFolded) { + const $toggle = $(codeBlock).find('.fold i'); + !isFolded ? $(codeBlock).removeClass('folded') : $(codeBlock).addClass('folded'); + !isFolded ? $toggle.removeClass('fa-angle-right') : $toggle.removeClass('fa-angle-down'); + !isFolded ? $toggle.addClass('fa-angle-down') : $toggle.addClass('fa-angle-right'); + } + + function createFoldButton(fold) { + return '' + (fold === 'unfolded' ? '' : '') + ''; + } + + $('figure.highlight table').wrap('
'); + if (typeof config !== 'undefined' + && typeof config.article !== 'undefined' + && typeof config.article.highlight !== 'undefined') { + + $('figure.highlight').addClass('hljs'); + $('figure.highlight .code .line span').each(function() { + const classes = $(this).attr('class').split(/\s+/); + if (classes.length === 1) { + $(this).addClass('hljs-' + classes[0]); + $(this).removeClass(classes[0]); + } + }); + + + const clipboard = config.article.highlight.clipboard; + const fold = config.article.highlight.fold.trim(); + + $('figure.highlight').each(function() { + if ($(this).find('figcaption').length) { + $(this).find('figcaption').addClass('level is-mobile'); + $(this).find('figcaption').append('
'); + $(this).find('figcaption').append('
'); + $(this).find('figcaption div.level-left').append($(this).find('figcaption').find('span')); + $(this).find('figcaption div.level-right').append($(this).find('figcaption').find('a')); + } else { + if (clipboard || fold) { + $(this).prepend('
'); + } + } + }); + + if (typeof ClipboardJS !== 'undefined' && clipboard) { + $('figure.highlight').each(function() { + const id = 'code-' + Date.now() + (Math.random() * 1000 | 0); + const button = ''; + $(this).attr('id', id); + $(this).find('figcaption div.level-right').append(button); + }); + new ClipboardJS('.highlight .copy'); // eslint-disable-line no-new + } + + if (fold) { + $('figure.highlight').each(function() { + $(this).addClass('foldable'); // add 'foldable' class as long as fold is enabled + + if ($(this).find('figcaption').find('span').length > 0) { + const span = $(this).find('figcaption').find('span'); + if (span[0].innerText.indexOf('>folded') > -1) { + span[0].innerText = span[0].innerText.replace('>folded', ''); + $(this).find('figcaption div.level-left').prepend(createFoldButton('folded')); + toggleFold(this, true); + return; + } + } + $(this).find('figcaption div.level-left').prepend(createFoldButton(fold)); + toggleFold(this, fold === 'folded'); + }); + + $('figure.highlight figcaption .level-left').click(function() { + const $code = $(this).closest('figure.highlight'); + toggleFold($code.eq(0), !$code.hasClass('folded')); + }); + } + } + + const $toc = $('#toc'); + if ($toc.length > 0) { + $toc.addClass('column-left is-sticky'); + const $mask = $('
'); + $mask.attr('id', 'toc-mask'); + + $('body').append($mask); + + function toggleToc() { // eslint-disable-line no-inner-declarations + $toc.toggleClass('is-active'); + $mask.toggleClass('is-active'); + } + + $toc.on('click', toggleToc); + $mask.on('click', toggleToc); + $('.navbar-main .catalogue').on('click', toggleToc); + } +}(jQuery, window.moment, window.ClipboardJS, window.IcarusThemeSettings)); diff --git a/js/toc.js b/js/toc.js new file mode 100644 index 0000000..dcdde5e --- /dev/null +++ b/js/toc.js @@ -0,0 +1,80 @@ +(function (window, document) { + function register($toc) { + const currentInView = new Set(); + const headingToMenu = new Map(); + const $menus = Array.from($toc.querySelectorAll('.menu-list > li > a')); + + for (const $menu of $menus) { + const elementId = $menu.getAttribute('href').trim().slice(1); + const $heading = document.getElementById(elementId); + if ($heading) { + headingToMenu.set($heading, $menu); + } + } + + const $headings = Array.from(headingToMenu.keys()); + + const callback = (entries) => { + for (const entry of entries) { + if (entry.isIntersecting) { + currentInView.add(entry.target); + } else { + currentInView.delete(entry.target); + } + } + let $heading; + if (currentInView.size) { + // heading is the first in-view heading + $heading = [...currentInView].sort(($el1, $el2) => $el1.offsetTop - $el2.offsetTop)[0]; + } else if ($headings.length) { + // heading is the closest heading above the viewport top + $heading = $headings + .filter(($heading) => $heading.offsetTop < window.scrollY) + .sort(($el1, $el2) => $el2.offsetTop - $el1.offsetTop)[0]; + } + if ($heading && headingToMenu.has($heading)) { + $menus.forEach(($menu) => $menu.classList.remove('is-active')); + + const $menu = headingToMenu.get($heading); + $menu.classList.add('is-active'); + let $menuList = $menu.parentElement.parentElement; + while ( + $menuList.classList.contains('menu-list') && + $menuList.parentElement.tagName.toLowerCase() === 'li' + ) { + $menuList.parentElement.children[0].classList.add('is-active'); + $menuList = $menuList.parentElement.parentElement; + } + } + }; + const observer = new IntersectionObserver(callback, { threshold: 0 }); + + for (const $heading of $headings) { + observer.observe($heading); + // smooth scroll to the heading + if (headingToMenu.has($heading)) { + const $menu = headingToMenu.get($heading); + $menu.setAttribute('data-href', $menu.getAttribute('href')); + $menu.setAttribute('href', 'javascript:;'); + $menu.addEventListener('click', () => { + if (typeof $heading.scrollIntoView === 'function') { + $heading.scrollIntoView({ behavior: 'smooth' }); + } + const anchor = $menu.getAttribute('data-href'); + if (history.pushState) { + history.pushState(null, null, anchor); + } else { + location.hash = anchor; + } + }); + $heading.style.scrollMargin = '1em'; + } + } + } + + if (typeof window.IntersectionObserver === 'undefined') { + return; + } + + document.querySelectorAll('#toc').forEach(register); +})(window, document); diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..b31deb4 --- /dev/null +++ b/manifest.json @@ -0,0 +1 @@ +{"name":"Centaurus99 的杂物堆","start_url":"/index.html"} \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 0000000..0531627 --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,64 @@ + +Centaurus99 的杂物堆

【补档】树莓派折腾记录

2021 年初的时候入手了树莓派 4b,然后暑假的时候好好折腾了一下,留下了一些零散的记录,在这里整理起来,之后哪天重建的时候还能来参考一下。

+

由于距离记录已经有一段时间了,可能有些内容会有偏差。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/placeholder b/placeholder deleted file mode 100644 index e69de29..0000000 diff --git a/rss2.xml b/rss2.xml new file mode 100644 index 0000000..878fe62 --- /dev/null +++ b/rss2.xml @@ -0,0 +1,236 @@ + + + + Centaurus99 的杂物堆 + https://blog.centaurus99.top/ + + + + 只是一个长草的杂物堆 + Mon, 21 Aug 2023 17:10:55 GMT + http://hexo.io/ + + + 基于 Proxmox VE 的 All in One 服务器搭建 + https://blog.centaurus99.top/2023/06/17/%E5%9F%BA%E4%BA%8E-Proxmox-VE-%E7%9A%84-All-in-One-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA/ + https://blog.centaurus99.top/2023/06/17/%E5%9F%BA%E4%BA%8E-Proxmox-VE-%E7%9A%84-All-in-One-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA/ + Sat, 17 Jun 2023 11:12:49 GMT + + <p>树莓派挂在宿舍当软路由已经两年了,大部分情况下都挺好用,透明代理体验也还算尚可。</p> +<p>然而由于使用的 USB 无线网卡驱动支持较差,无线峰值速率只能跑到 200+ Mbps,且不大稳定。并且树莓派性能不高,无法开设一些高负载服务。另外,树莓派作为路由常年开启,需要考虑散热问题,虽然给使用的小风扇写了启停功能,但是启动运转时还是会有一定的噪音,较为恼人。</p> + + + + 树莓派挂在宿舍当软路由已经两年了,大部分情况下都挺好用,透明代理体验也还算尚可。

然而由于使用的 USB 无线网卡驱动支持较差,无线峰值速率只能跑到 200+ Mbps,且不大稳定。并且树莓派性能不高,无法开设一些高负载服务。另外,树莓派作为路由常年开启,需要考虑散热问题,虽然给使用的小风扇写了启停功能,但是启动运转时还是会有一定的噪音,较为恼人。

正好快到暑假了,需要开设一台 MC 服务器,于是打算换用一台较高性能的软路由,再配合 Wi-Fi 6 无线路由器作为 AP,提供高速率、高稳定性的有线无线网络接入。

整体配置概览

软路由

选用畅网奔腾 8505 软路由,1 大核 + 4 小核,大核的单核性能较高,CPU-Z 单核跑分相比我的笔记本(i5-1135G7)高出约 40%,可以用来开设一些吃单核性能的服务。

内存使用了两条光威 8GB DDR4 3200 内存,时序 CL-22-22-22-52。使用 16 GB 内存也主要是为了开设 MC 服务器考虑。

存储方面安装了西数 SN570 1T 固态作为系统盘,也暂时承担一部分文件存储功能。

作为一台路由器,这台软路由有 6 个 Intel i226-V 2.5G 网卡,即使以后有更多设备需要有线接入,也不一定需要增设交换机。

功耗方面,实测待机时输入功率约为 10 W。

温度方面,室温 24 度环境下,不加风扇待机时 CPU 约 40 度,NVME 固态约 50 度,软路由表面摸起来较热;加上赠送的 USB 12cm 风扇吹顶部铝制散热片后,待机时 CPU 约 30 度,NVME 固态约 40 度,外壳很凉快。

无线 AP

目前廉价的 Wi-Fi 6 路由器均使用千兆有线网口,单口有线速率甚至可能不及无线速率,故考虑需要能和软路由之间做链路聚合提高内网性能。

调查后发现,TP-Link 系列的路由器似乎原厂固件就有着端口聚合功能,其子品牌水星也有着相同的功能,且便宜几十元。

于是选用水星 X306G 路由器,AX3000 规格,计划只使用其 5G 频段 Wi-Fi 和端口聚合功能,运行在 AP 模式。

安装和调试 PVE

安装

参考官方教程或网上教程,一路 next 即可。

其中将 ETH5 对应的网卡设为管理口,静态 IP 设为 192.168.22.100(22 网段)。

更换内核版本

由于 8505 CPU 是大小核架构,建议使用较新的内核获取大小核调度优化。

先换源,参考:https://mirrors.tuna.tsinghua.edu.cn/help/proxmox/,并删除企业源:rm /etc/apt/sources.list.d/pve-install-repo.list

apt update 后搜索可用的内核版本,我这儿选择 6.2 版本:apt install pve-kernel-6.2,安装完重启后生效。

可以使用 proxmox-boot-tool 管理安装的以及用于启动的 kernel 版本。

管理页面添加温度显示

偷懒使用了恩山论坛的脚本,添加了温度,CPU频率,硬盘信息的显示:https://www.right.com.cn/forum/thread-6754687-1-1.html

删除 lvm-thin 并扩容 lvm

由于使用单盘搭建 All in One 服务器,计划在 PVE 系统中使用 samba 共享数据文件,因此需要较大的 lvm 空间。同时,由于不需要开大量的虚拟机,也用不到 lvm-thin 的特性。故将 lvm-thin 的空间全部合入 lvm 中。

参考:https://foxi.buduanwang.vip/virtualization/pve/1434.html/

删除 lvm-thin:lvremove /dev/pve/data

扩容 lvm:lvextend -rl +100%FREE /dev/pve/root

部署 samba

安装:apt update && apt install samba

添加用户:useradd thx

将用户添加到 samba:smbpasswd -a thx

编辑 samba 配置文件 /etc/samba/smb.conf,添加共享文件夹的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[RaspCloud]
path = /data/RaspCloud
writeable = yes
create mask = 0777
directory mask = 1777
public = yes
guest ok = yes

[PT]
path = /data/PT
writeable = yes
create mask = 0644
directory mask = 1755
public = yes
guest ok = yes

[Private]
path = /data/Private
writeable = yes
create mask = 0644
directory mask = 1755
public = no
guest ok = no
valid users = thx
browseable = yes

[Sync]
path = /data/Sync
writeable = yes
create mask = 0644
directory mask = 1755
public = no
guest ok = no
valid users = thx
browseable = yes

其中 /data/RaspCloud 为公开共享目录,内部有 read-only 目录通过改变目录所有者来限制 guest 的写入。

/data/PT 为公开只读共享目录。

/data/Private/data/Sync 为私密目录,使用白名单限制访问用户。

如果需要在共享目录中软链接到系统里的其它目录中,则需要在 [global] 段中添加:

/etc/samba/smb.conf
1
2
3
4
[global]
follow symlinks = yes
wide links = yes
unix extensions = no

参考:https://blog.csdn.net/humanking7/article/details/85058471

smb.conf 中的配置项可查阅:https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html

更改 CPU 电源策略

作为一个桌面服务器,需要考虑到功耗与发热的问题。

参考:https://pve.sqlsec.com/4/6/

1
2
3
4
5
# 查看支持的 CPU 电源模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

# 查看当前的 CPU 电源模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
电源模式解释说明
performance性能模式,将 CPU 频率固定工作在其支持的较高运行频率上,而不动态调节。
userspace系统将变频策略的决策权交给了用户态应用程序,较为灵活。
powersave省电模式,CPU 会固定工作在其支持的最低运行频率上。
ondemand按需快速动态调整 CPU 频率,没有负载的时候就运行在低频,有负载就高频运行。
conservative与 ondemand 不同,平滑地调整 CPU 频率,频率的升降是渐变式的,稍微缓和一点。
schedutil负载变化回调机制,后面新引入的机制,通过触发 schedutil sugov_update 进行调频动作。

安装工具:apt install cpufrequtils

设为 ondemand 模式:cpufreq-set -g ondemand

无显示器启动问题

发现如果不接显示器,则无法正常启动。初步判断在启动 grub 或之后出现问题。

然而,对 BIOS 和 grub 配置文件做各种修改之后也无法解决问题。

最终打算网上买个 HDMI 诱骗器插上得了。

插上后也没用。

经仔细排查(偶然将接地良好的显示器的 Type-C 线的外壳接触到软路由 Type-C 口的外壳上,发现问题就消失了),发现是供电接地问题。

先前为了监测功耗,我将电源的 DC 转为了 USB 母口,插上了 USB 电压电流测量设备,再将测量设备的 USB 口转为 DC 口,接到软路由的 DC 供电口。在这个过程中可能丢失了地线。

直接接电源就不再有问题。

挂载硬盘

再接上一块老机械盘,用来挂 PT。

安装好硬盘后,先使用 lsblk -f 或者 ls -l /dev/disk/by-uuid 找到分区的 UUID,使用 UUID 进行挂载可以避免 /dev/ 下设备名的改变导致的挂载问题。

然后在 /etc/fstab 中添加挂载信息:

/etc/fstab
1
UUID=1f4a2672-3039-594b-808c-a5d3913b0fde /data/hdd ext4 defaults,nofail 0 0

注意 nofail 用来在硬盘没有成功挂载时也能正常启动,否则启动会等待硬盘挂载,失败后进入 emergency mode。

然后 mount -a 生效,开机后也会自动挂载。

硬盘维护

缩减数据盘的文件系统预留空间

参考:https://askubuntu.com/questions/249387/df-h-used-space-avail-free-space-is-less-than-the-total-size-of-home

默认情况下,df -h 查看硬盘空间会发现,Size 会大于 Used + Avail,如:

1
2
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1 294G 261G 19G 94% /data/hdd

这是由于 ext2/3/4 文件系统默认会保留 5% 的空间只供 root 使用,而数据盘就没这个必要了,可以 tune2fs -m 0 /dev/sda1 来取消预留空间。

S.M.A.R.T. 信息

在 WebUI 中,可以在节点的磁盘一栏中查看 S.M.A.R.T. 信息。

命令行中,可以使用 smartctl -a /dev/sda 查看。

S.M.A.R.T. 信息的解析,可以参考:https://blog.csdn.net/MrSate/article/details/88564764

使用 journalctl -u smartmontools.service 可以查看 smartmontools 守护进程的监测日志。

配置 smartd 守护程序

还可以在 /etc/smartd.conf 中配置守护程序,初始时配置如下:

/etc/smartd.conf
1
DEVICESCAN -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner

添加如下参数:

  • 基于默认修改的监测与报警参数 -H -f -l error -l selftest -C 197 -U 198,相比默认的 -a 参数减少了等效的 -t 参数,否则每半小时都会在日志中输出 S.M.A.R.T. 信息的变化情况(详见 /etc/smartd.conf 中的说明)
  • 每周六凌晨三点短自检,每月二十号凌晨三点长自检:-s (S/../../6/03/|L/../20/./03)
  • 监控温度,在温度变化 5 度时记录,达到 40 度时记录,达到 45 度时警告(0 为关闭):-W 5,40,45

修改后如下:

/etc/smartd.conf
1
2
3
DEFAULT -H -f -l error -l selftest -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner
/dev/nvme0 -W 0,60,70
DEVICESCAN -C 197 -U 198 -s (S/../../6/03/|L/../20/./03) -W 0,40,50

重启服务后生效:systemctl restart smartd.service

如果守护程序检测到了出现问题,也会给安装 PVE 时填写的邮箱发邮件,实测 QQ 邮箱可以收到。

参考:

配置硬盘休眠

可能需要先关闭 pvestatd 对硬盘的扫描,参考:https://www.ippa.top/954.html

ls -l /dev/disk/by-uuid 找到硬盘的 UUID 1f4a2672-3039-594b-808c-a5d3913b0fde,然后编辑 /etc/lvm/lvm.conf,在 global_filter 中添加 "r|/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde.*|",结果如下:

/etc/lvm/lvm.conf
1
2
3
devices {
global_filter=["r|/dev/zd.*|", "r|/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde.*|"]
}

pvestatd restart 后生效。

查看硬盘当前状态:smartctl -i -n standby /dev/sda | grep "mode"|awk '{print $4}',ACTIVE 或者 IDLE 都为运转状态。

查询当前电源管理参数:hdparm -B /dev/sda

进入 standby modehdparm -y /dev/sda

进入 sleep modehdparm -Y /dev/sda

然后编辑 /etc/hdparm.conf,添加需要休眠的硬盘设置,比如十分钟后 standby 如下配置:

/etc/hdparm.conf
1
2
3
4
5
/dev/disk/by-uuid/1f4a2672-3039-594b-808c-a5d3913b0fde {
apm = 127
acoustic_management = 127
spindown_time = 120
}

/usr/lib/pm-utils/power.d/95hdparm-apm resume 后生效(参考 man hdparm.conf

其中 spindown_time 参考 man hdparm 中的 -S 选项说明来设置。

不过我的这块硬盘似乎并不按照设定的 spindown_time 来休眠,于是打算观察一段时间 Load_Cycle_Count 的增长情况来决定是否开启休眠功能。

smartctl -a /dev/sda | grep Load_Cycle_Count 即可查看。

硬盘无法休眠 Debug

后来又入了两块盘,但是 hdparm -y 之后又会立即唤醒,无法进入休眠状态。

诊断方式参考:https://askubuntu.com/questions/1406434/block-dump-reporting-missing-from-ubuntu-22-04

监控对 /dev/sda 的使用:blktrace -d /dev/sda -a pc -o - | blkparse -i -

然后 hdparm -Y /dev/sda ,查看唤醒磁盘的进程。

我这儿结果如下,然而搜索相关资料后并没有获取到有用的信息:

1
2
3
4
5
6
7
8
9
8,16   0        1     0.000000000 18871  D   N 0 [hdparm]
8,16 1 1 0.497835738 0 C N [0]
8,16 0 2 1.412267626 168 D R 4 [scsi_eh_1]
8,16 0 3 1.412286261 14 C R [0]
8,16 0 4 1.412293625 18 D R 12 [kworker/0:1]
8,16 0 5 1.412295327 14 C R [0]
8,16 0 6 1.412297439 18 D R 4 [kworker/0:1]
8,16 0 7 1.412298518 14 C R [0]
...

有可能是 ext4 的 lazy init 导致,参考:https://unix.stackexchange.com/questions/533789/hard-drive-waking-from-sleep-for-no-apparent-reason

基于 LXC 安装 OpenWrt

LXC 开销小,故尝试使用 LXC 安装 OpenWrt

安装 OpenWrt

安装过程参考:https://virtualizeeverything.com/2022/05/23/setting-openwrt-in-proxmox-lxc/

下载地址:https://downloads.openwrt.org/

我选择了 20.03.5 版本:https://downloads.openwrt.org/releases/22.03.5/targets/x86/64/

下载 rootfs.tar.xz 即可,可以在下载时选择哈希校验。

创建容器的 UI 的文档:https://pve.proxmox.com/pve-docs/chapter-pct.html#pct_settings

似乎由于 Web 页面无法添加 --ostype unmanaged 参数,需要进入命令行创建:

1
pct create 101 /var/lib/vz/template/cache/openwrt-22.03.5-x86-64-rootfs.tar.gz --arch amd64 --hostname RaspCloud --rootfs local:1 --memory 1024 --cores 6 --cpuunits 200 --ostype unmanaged --unprivileged 1

然后在 Web UI 中添加一个虚拟网卡 veth0,桥接到 PVE 网桥 vmbr0 上,用于 OpenWrt 和 PVE 的交互。

此时连接在管理口上的设备便和 OpenWrt 连在同一个网桥上了,就可以通过这个虚拟网卡的地址访问 OpenWrt 了。

有可能启动后 veth0 并没被正确配置,可以手动 up 之后使用 IPv6 地址访问。

然后到配置文件 /etc/pve/lxc/101.conf 里添加直通网卡,比如:

1
2
3
4
lxc.net.0.type: phys
lxc.net.0.link: enp2s0 --- 需要使用的 host 中的网卡名
lxc.net.0.name: eth0 --- LXC 中显示的网卡名
lxc.net.0.flags: up

需要注意 net.id 的 id 不能和 Web UI 中添加的相同。

最终的 conf 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
arch: amd64
cores: 6
cpuunits: 200
hostname: RaspCloud
memory: 1024
net0: name=veth0,bridge=vmbr0,firewall=1,hwaddr=92:81:93:06:8A:7E,type=veth
onboot: 1
ostype: unmanaged
rootfs: local:101/vm-101-disk-1.raw,size=1G
startup: order=1
swap: 512
unprivileged: 1
lxc.net.5.type: phys
lxc.net.5.link: enp2s0
lxc.net.5.name: eth0
lxc.net.5.flags: up
lxc.net.6.type: phys
lxc.net.6.link: enp3s0
lxc.net.6.name: eth1
lxc.net.6.flags: up
lxc.net.7.type: phys
lxc.net.7.link: enp4s0
lxc.net.7.name: eth2
lxc.net.7.flags: up
lxc.net.8.type: phys
lxc.net.8.link: enp5s0
lxc.net.8.name: eth3
lxc.net.8.flags: up
lxc.net.9.type: phys
lxc.net.9.link: enp6s0
lxc.net.9.name: eth4
lxc.net.9.flags: up

配置 OpenWrt

连接互联网

由于我需要 OpenWrt 通过 PVE 管理口连接电脑,通过电脑将无线网共享给有线网来访问互联网,所以需要先为 veth0 配置一些上网功能。

添加 Interface veth0,类型为静态地址,网卡设为 veth0,配置好对应的地址,网关和 DNS 服务器地址即可。

之后应该就可以访问网络了。

换源

参考:https://mirrors.tuna.tsinghua.edu.cn/help/openwrt/

添加中文

1
2
opkg update
opkg install luci-i18n-base-zh-cn

更改主题

不大喜欢 OpenWrt 的默认主题,换为 Argon

下载对应的 ipk:https://github.com/jerrykuku/luci-theme-argon/releases/download/v2.3.1/luci-theme-argon_2.3.1_all.ipk

然后安装:

1
2
3
opkg install luci-compat
opkg install luci-lib-ipkg
opkg install luci-theme-argon*.ipk

配置路由功能

启动后,只有 wan 和 wan6 两个 Interface,对应 eth0 网口(device)。

计划把其它网口都划入 LAN 中。

首先添加网桥设备 br-lan,把网口都加上去。

然后添加 lan 接口,使用静态地址,把 br-lan 加上去,配置地址即可。

然后发现,似乎 dnsmasq 出现了些问题,无法正常启动。

根据 https://github.com/openwrt/openwrt/issues/9064 中的方法,opkg remove procd-ujail 可以解决。

dnsmasq 正常后,在接口中配置 DHCP / DNS 的相关配置,然后 lan 口上接的设备就能获取到分配的地址了。

校园网只会分配 /128 地址,故 IPv6 也需要做个 NAT。OpenWrt 中 IPv6 默认并不会配置 SNAT,需要做一些手动配置,参考:https://openwrt.org/docs/guide-user/network/ipv6/ipv6.nat6

先启用 IPv6 masquerading,其中我这儿的 zone[1] 为 wan 域:

1
2
3
uci set firewall.@zone[1].masq6="1"
uci commit firewall
/etc/init.d/firewall restart

然后关闭 wan6 口的 sourcefilter:

1
2
3
uci set network.wan6.sourcefilter="0"
uci commit network
/etc/init.d/network restart

这样 lan 口上接的设备也能获取到 DHCPv6 分配的 IPv6 地址了,OpenWrt 也会为其提供 NAT6 服务。

配置 OpenClash

先卸载 dnsmasq:

1
2
opkg remove dnsmasq
mv /etc/config/dhcp /etc/config/dhcp.bak

再按照发布页的说明,先安装依赖,再下载安装 ipk 即可:https://github.com/vernesong/OpenClash/releases

之后按个人喜好配置即可,我选用的是 Meta 核心的 redir-host 模式。

可以将校园网网段设为绕过,减少校内网络访问开销:

IPv4:

1
2
3
4
5
6
7
8
9
59.66.0.0/16
101.5.0.0/16
101.6.0.0/16
118.229.0.0/19
166.111.0.0/16
183.172.0.0/15
202.112.39.2/32
219.223.168.0/21
219.223.176.0/20

IPv6:

1
2402:f000::/32

或者可以打开 实验性:绕过中国大陆 IP 功能,减少国内网络访问开销。

遇上 OpenClash 的一个 bug。(Updated 2023.07.02: 随着 0.45.128 版本的发布,该问题已得到修复)

在 LuCI 中,虽然已经关闭了 路由本机代理,但是还是会 nftables 中添加处理 Output 链的规则,见 https://github.com/vernesong/OpenClash/blob/9ee0f02ed7615a62f960c9ee2f951dd1b47e2411/luci-app-openclash/root/etc/init.d/openclash#LL1649C1-L1672C9

1
2
3
4
5
6
7
8
if [ "$enable_redirect_dns" != "2" ] || [ "$router_self_proxy" = "1" ]; then
nft 'add chain inet fw4 openclash_output' 2>/dev/null
nft 'flush chain inet fw4 openclash_output' 2>/dev/null
...
nft add rule inet fw4 openclash_output ip protocol tcp skuid != 65534 counter redirect to "$proxy_port" 2>/dev/null
nft 'add chain inet fw4 nat_output { type nat hook output priority -1; }' 2>/dev/null
nft 'add rule inet fw4 nat_output ip protocol tcp counter jump openclash_output' 2>/dev/null
fi

这里的判断中 上了不使用 Dnsmasq 转发,所以在我的工况下会被启用。暂时未明白为何要这样,故提了 Issue:https://github.com/vernesong/OpenClash/issues/3354

两天后作者在 d499374 中修复了该 bug,发布于 0.45.125 版本中,等待合入 master。

远程 Wireshark 抓包调试

有时配挂了需要抓包调试,可以使用远程主机上的 tcpdump + Windows 本机上的 wireshark 远程抓包分析。

给用户非 root 使用 tcpdump 权限:sudo chmod u+s /usr/sbin/tcpdump

然后 Windows 本机执行 ssh ubuntu "tcpdump -i br-lan -l -w - 'port not 22'" | wireshark -k -i - 即可开始抓包。

参考:https://thiscute.world/posts/tcpdump-and-wireshark

配置 UDP 代理

使用 Redir-Host 兼容模式 + UDP tproxy 转发似乎并不能正常运行,所以还是得使用 TUN 模式。

LXC 启用 TUN 需要一点额外的配置,参考 https://forum.proxmox.com/threads/how-to-enable-tun-tap-in-a-lxc-container.25339/,在配置文件中添加如下内容:

1
2
lxc.cgroup.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net dev/net none bind,create=dir

然后选用 Meta 内核,IPv4 和 IPv6 都启用 TUN 模式,即可代理 UDP 流量了。

还可以考虑开启 仅允许常用端口流量 来防止不必要的代理。具体地,此处所指的常用端口如下:21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 5222 5228 5229 5230 8080 8443 8880 8888 8889

配置校园网认证

使用 GoAuthing

新版本的 OpenWrt 配置起来似乎有些不一样的地方,参考 https://github.com/z4yx/GoAuthing/issues/30 进行修改。

goauthing@ 脚本放到 /etc/init.d/goauthing 目录下,并 chmod +x

/etc/init.d/goauthing
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh /etc/rc.common
# Authenticating utility for auth.tsinghua.edu.cn
# This init script is used explicitly with OpenWRT

USE_PROCD=1
START=96
PROG="/usr/bin/goauthing"
SERV=goauthing # UCI config at /etc/config/goauthing

start_instance() {
local config=$1
local username password
config_get username $config username
config_get password $config password
local args="-u $username -p $password"

sleep 10 # Wait for link up
"$PROG" $args deauth
"$PROG" $args auth
"$PROG" $args login

procd_open_instance
procd_set_param command "$PROG"
procd_append_param command $args online
procd_set_param stderr 1
procd_set_param respawn
procd_close_instance
}

logout() {
local config=$1
local username password
config_get username $config username
config_get password $config password
local args="-u $username -p $password"

"$PROG" $args logout
}

start_service() {
config_load "$SERV"
config_foreach start_instance "$SERV"
}

stop_service() {
config_load "$SERV"
config_foreach logout "$SERV"
}

其中更改了启动优先级,添加了 sleep 10 来等待 wan 口配置完成,否则会因为无法完成 auth / login 就直接进入 online 守护程序,从而一直无法完成登录认证。

然后下载 https://mirrors.tuna.tsinghua.edu.cn/github-release/z4yx/GoAuthing/LatestRelease/auth-thu.linux.x86_64,并移动至脚本中填写的位置(默认为 /usr/bin/goauthing)。

然后配置并启动服务:

1
2
3
4
5
6
7
8
touch /etc/config/goauthing
uci add goauthing goauthing
uci set goauthing.@goauthing[0].username='<YOUR-TUNET-ACCOUNT-NAME>'
uci set goauthing.@goauthing[0].password='<YOUR-TUNET-PASSWORD>'
uci commit

/etc/init.d/goauthing enable
/etc/init.d/goauthing start

配置链路聚合 AP

另购置了一台 Wi-Fi 6 无线路由器作为 AP,支持 2x2 MU-MIMO,160 MHz 频宽,理论带宽可达 2402 Mbps。

然而,路由器上只有四个千兆口,连接软路由后跑不到这么高。

不过,这款路由器支持两个端口链路聚合,故尝试配置一下。

首先在路由器上设置两个端口为聚合口,提示:

端口聚合使用IEEE 802.3ad动态聚合模式,请确保对端设备支持并配置为动态聚合模式。

然后在 OpenWrt 上安装需要的软件包:opkg install kmod-bonding proto-bonding luci-proto-bonding

然后将以下内容添加到 /etc/rc.localexit 0 前:

1
2
3
4
5
6
7
8
9
10
ip link add bond-lan type bond mode 802.3ad # 添加 bond 类型的虚拟接口 名称为 bond-lan
ip link set eth3 down
ip link set eth4 down
ip link set eth3 type bond_slave # 配置网卡模式
ip link set eth4 type bond_slave
ip link set eth3 master bond-lan # 加入名称为 bond-lan 的 bond 类型网卡
ip link set eth4 master bond-lan
ip link set bond-lan up # 启动该网卡
ip link set eth3 up
ip link set eth4 up

eth3eth4 从原来的 br-lan 中移除,添加上 bond-lan 即可。

实测无线可以跑到 1.6 Gbps 左右。

配置防火墙

官方原版 OpenWrt 默认有一套防火墙策略,简略微调即可。

配置端口转发

两种方式,一种是基于 iptables 实现,另一种是使用 socat 来转发。

基于 iptables 实现

OpenWrt 默认的端口转发基于 iptables / nftables 实现,然而,配置后发现,在内网无法使用外网地址访问对应端口,初步探索后推测是 NAT 环回时出现问题。

于是在 nftables 中进行调试。

先新建一个表为符合规则的包启用跟踪调试:

1
2
3
nft add table inet trace_debug
nft 'add chain inet trace_debug trace_pre { type filter hook prerouting priority -200000; }'
nft insert rule inet trace_debug trace_pre ip saddr 192.168.22.118 ip daddr ??.??.??.?? limit rate 1/second meta nftrace set 1

然后 nft monitor trace 就可以跟踪了。

跟踪检查后发现,包在 prerouting policy accept 后消失了。

一番摸索后发现,当对应网卡(br-lan)开启混杂模式后,就能正常工作了。

怀疑是 prerouting 后发现目标地址为本地链路地址,于是就修改了目的 mac 地址,导致非混杂模式的网卡将其丢弃。不过简单搜索后也没找到相关的资料。

使用 socat

Updated 2023.06.29: 使用 socat 遇到了一些问题,故弃用:

  • 会修改源地址,丢失地址数据
  • UDP 的转发使用 fork 参数存在线程泄漏问题,似乎每个 UDP 包都会 fork 出一个进程且不释放,导致产生大量进程占满内存

安装:

1
2
opkg update
opkg install socat

然后配置端口转发。

例如,配置名为 mc-tcp 的策略,开启,监听本机所有地址的 25565 端口并转发到 192.168.22.3:25565 的配置如下(fork 允许多个连接,reuseaddr 允许 socket 的快速重用,TCP6-LISTEN 也同时监听 IPv4):

1
2
3
4
uci set socat.mc-tcp=socat
uci set socat.mc-tcp.enable=1
uci set socat.mc-tcp.SocatOptions='TCP6-LISTEN:25565,fork,reuseaddr TCP:192.168.22.3:25565'
uci commit

UDP 也类似:

1
2
3
4
uci set socat.mc-udp=socat
uci set socat.mc-udp.enable=1
uci set socat.mc-udp.SocatOptions='UDP6-LISTEN:25565,fork,reuseaddr UDP:192.168.22.3:25565'
uci commit

然后重启 socat 服务即可生效:/etc/init.d/socat restart

对外网开放还需在防火墙中允许对应端口的输入。

配置 DDNS

我的 DNS 解析提供商为 CloudFlare,故安装 ddns-scripts-cloudflare

1
opkg install ddns-scripts-cloudflare luci-i18n-ddns-zh-cn

安装完成后在 LuCI 中配置即可,没太大难度。IPv4 和 IPv6 地址需要分别配置。

配置 AdGuard Home

安装 AdGuard Home:

1
2
opkg update
opkg install adguardhome

在 DHCP/DNS 的高级设置中,将 DNS 服务器端口改为 53 以外的端口,如 5353。

然后登入 http://ip:3000 配置 AdGuard Home,将上游 DNS 服务器设为 OpenClash 设置的 DNS 服务地址,并停用 OpenClash 的 DNS 劫持。

然后应该就可以开始运作了,再添加屏蔽列表即可。

如果需要在 OpenClash 没有正常启动成功的情况下仍可以进行 DNS 服务,则需要设置 fallback DNS 服务器地址。然而目前 AdGuard Home 中并没有这个功能,相关功能 https://github.com/AdguardTeam/AdGuardHome/issues/3701 被设为了 v0.108.0 的目标,希望有生之年能等到 v0.108.0 出来获得这一功能。

(也是因为这个原因,校园网的认证脚本需要配置为 OpenClash 启动完成后再进行认证,感觉怪怪的,所以也暂时放弃了 AdGuard Home)

配置 WireGuard

安装 WireGuard

1
2
opkg update
opkg install luci-i18n-wireguard-zh-cn

重启后,在添加接口中就可以找到 WireGuard VPN 了,我添加了一个名为 wg0 的接口。

作为公网 IP 下供其它端来主动连接的一端,我特殊指定了这个接口的监听端口,并在防火墙中运行了该端口的 UDP 访问。

该接口的 IP 地址需要配置为单独的子网,用于各端 VPN 接口间的互相连接。我为其配置了 192.168.23.1/24fd23:41b7:e060::1/64 地址,与 22 网段区别开。

为了方便配置,我没有将这个接口划入单独的区域,而是划入了 lan 区域,共享 lan 区域的防火墙配置。

然后就可以添加对端了。注意 允许的 IP 的这一项中填写 “对端的隧道 IP 地址和对端经由隧道的网络”,对于对端为非路由设备的情况,这一项只填隧道 IP 地址就行,比如 192.168.23.102/32(/32 可省略),但不能填写 VPN 接口间的网段,即不能填写 192.168.23.102/24

各项设置可能需要重启后生效。

之后的计划

  • 配置内网 IP 的域名
  • 配置 MosDNS 优化 DNS 解析(参考:https://rushb.pro/article/router-dns.html
  • 配置 Grafana 可视化路由运行状态、MosDNS 运行数据等
  • 配置 UDP 转发以及游戏优化

基于 LXC 的其它功能服务器

其它杂七杂八的服务以及 Docker 就另外开在一个虚拟机上吧。

选用 Debian 12 系统,可以直接从 CT 模板中下载。

参考 https://pve.proxmox.com/wiki/Unprivileged_LXC_containers#Using_local_directory_bind_mount_points,挂载宿主机的共享目录:pct set 100 -mp0 /host/dir,mp=/container/mount/point

似乎直接挂载宿主机中的 /mnt 的话,即使配置完 UID / GID 映射,LXC 容器也并不能正常访问其中宿主机挂载的子目录,可能需要在宿主机 umount 再 mount。所以需要将 mp 指定的目录细化到类似 /mnt/hdd1 这一层。

添加一个虚拟网卡 eth0 桥接到 vmbr0 上,IPv4 选择 DHCP 接收 OpenWrt 的地址分发;而如果 IPv6 选择 DHCP 的话,DHCPv6 是不会通告默认路由的,所以建议选择 SLAAC。

初始配置

换源,参考:https://mirrors.tuna.tsinghua.edu.cn/help/debian/

添加 sudo,先 apt install sudo,再 echo "username ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/username

默认下终端可能会有乱码,需要配置 UTF-8 语言,sudo dpkg-reconfigure locales 然后选中 en_US.UTF-8 即可。

配置 UID / GID 映射

如果直接挂载目录共享的话,容器内外会视为不同的用户,导致共享文件时有着麻烦的权限问题。不过我们可以通过 lxc.idmap 来将某一容器中的某些用户映射到 Host 中的某些用户。

参考:

以下以映射 102 容器中的 1000 用户为 Host 中的 1000 用户为例:

先在 /etc/subuid/etc/subgid 中都添加上 root:1000:1,来允许 root 创建到 1000 用户的映射。

然后在 /etc/pve/lxc/102.conf 的配置文件中,添加如下内容:

/etc/pve/lxc/102.conf
1
2
3
4
5
6
lxc.idmap: u 0 100000 1000
lxc.idmap: g 0 100000 1000
lxc.idmap: u 1000 1000 1
lxc.idmap: g 1000 1000 1
lxc.idmap: u 1001 101000 64535
lxc.idmap: g 1001 101000 64535

建议将原来容器内 1000 映射到的 101000 用户还包含在映射范围内,这样容器内的 root 才能够将文件的所有权从原先的转到现在的。

安装 Docker

由于并不想在 PVE 中直接装 Docker,故在 Debian 虚拟机中安装 Docker。

参考:

安装:

1
2
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

加入 Docker 用户组,在无 root 权限下使用 Docker:sudo usermod -aG docker $USER

验证安装正确性:docker run --rm hello-world

如没有方便的网络接入,配置镜像参考:https://yeasy.gitbook.io/docker_practice/install/mirror

在 LXC 容器启动后,Docker 会过一两分钟才会启动,暂时不知道原因为何。

Docker 启用 IPv6 支持

由于挂的 PT 需要有 IPv6 接入,故需要给 Docker 开启 IPv6。

参考:https://docs.docker.com/config/daemon/ipv6/

编辑配置文件:

/etc/docker/daemon.json
1
2
3
4
{
"experimental": true,
"ip6tables": true
}

然后重启 Docker:sudo systemctl restart docker

启动容器时,需要额外的配置。如果使用 Docker Compose,则添加如下内容,并在对应 service 配置中添加 networks 即可:

1
2
3
4
networks:
ip6net:
enable_ipv6: true
subnet: 2001:0DB8::/112

netstat -tunlp 可以查看监听端口,若对应的端口只有 tcp6 在监听也不用慌张,若 cat /proc/sys/net/ipv6/bindv6only 为 0 则表明已在双栈上监听,参考(https://unix.stackexchange.com/questions/496137/does-80-in-netstat-output-means-only-ipv6-or-ipv6ipv4

配置 PT 客户端

使用 linuxserver/transmission Docker 镜像。

使用 Docker Compose 来配置容器,按说明编写配置文件:

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
---
version: "2.1"
services:
transmission:
image: lscr.io/linuxserver/transmission:latest
container_name: transmission
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- TRANSMISSION_WEB_HOME=/config/transmission-web-control/src #optional
- USER=thx #optional
- FILE__PASS=/config/password #optional
- WHITELIST= #optional
- PEERPORT= #optional
- HOST_WHITELIST= #optional
volumes:
- /home/thx/Service/transmission/config:/config
- /data/PT:/downloads
- /data/PT/torrentwatch:/watch
- /mnt:/mnt
ports:
- 9091:9091
- 51413:51413
- 51413:51413/udp
restart: unless-stopped
networks:
- ip6net
networks:
ip6net:
enable_ipv6: true
ipam:
config:
- subnet: 2001:0DB8:1::/112

其中 UID / GID 可以参考 id $user 的结果设置。

生成密钥文件时不能有行末符,可以这样生成:echo -n password_in_clear_text > password

Web UI 使用 transmission-web-control,在 /config 对应的目录下 git clone 即可。

迁移之前的种子和配置只需要将之前的 config 目录移过来即可,如果之前是裸机安装,目录可能在 /var/lib/transmission-daemon/info

还要记得在路由器上配置 51413 端口的 TCP & UDP 转发。

配完端口转发,查看防火墙规则链可知,无需再在通信规则中开放端口。

运行方法

创建 container 并启动后台运行:docker compose up -d

停止并删除 container 和对应的网络:docker compose down

启动 / 停止 对应的 container:docker compose start / docker compose stop

更新:先 docker-compose pull,然后 docker compose downdocker compose up -d

清理无用镜像:docker image prune

配置 Syncthing 同步服务

使用 linuxserver/syncthing Docker 镜像。

使用 Docker Compose 来配置容器,按说明编写配置文件。

由于 Syncthing 需要发送本地组播包来进行本地链路上的节点发现,故这里将网络模式修改为 host 模式,参考:https://github.com/syncthing/syncthing/blob/main/README-Docker.md#discovery

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---
version: "2.1"
services:
syncthing:
image: lscr.io/linuxserver/syncthing:latest
container_name: syncthing
hostname: RaspCloud #optional
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- /home/thx/Service/syncthing/config:/config
- /mnt:/mnt
- /data:/data
network_mode: host
restart: unless-stopped

还要记得在路由器上配置 22000 端口的 TCP & UDP 转发。

运行方法同上。

配置蓝牙监听服务

之前 使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化 中配置了蓝牙接收温湿度计数据,也把这个服务迁移过来。

花费十元购入了 BR8651 芯片的 USB 蓝牙 5.1 适配器,据说该芯片在 Linux 下有驱动。

可能是因为芯片较新的原因,各方面的支持似乎都还不太好,尝试了几个方法都没能正常地使用脚本获取 BLE Advertising,这里记录了几次失败的过程。

配置 LXC 的 USB 直通

本来想在 LXC 容器中配置蓝牙服务,但是 hciconfig 会报错 Can't open HCI socket.: Address family not supported by protocol,查阅资料后发现,由于蓝牙将自身注册为网络接口,所以并不能像使用 USB 那样将蓝牙设备传给 LXC 容器,参考:https://forum.proxmox.com/threads/assign-a-bluetooth-dongle-to-a-ct.67577/

所以以下部分只是记录如何直通 USB 设备。

参考:https://medium.com/@konpat/usb-passthrough-to-an-lxc-proxmox-15482674f11d

直接在 LXC 中 lsusb 是可以看到各个 USB 设备的,但是无法使用。

1
2
3
4
5
6
7
8
Bus 004 Device 002: ID 174c:3074 ASMedia Technology Inc. ASM1074 SuperSpeed hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 05e3:0751 Genesys Logic, Inc. microSD Card Reader
Bus 003 Device 004: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 003 Device 002: ID 174c:2074 ASMedia Technology Inc. ASM1074 High-Speed hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

关注其中的 Bluetooth 设备,位于 Bus 003 Device 004

查看其主次设备号:

1
2
root@pve:/etc/pve/lxc# ls -al /dev/bus/usb/003/004
crw-rw-r-- 1 root root 189, 259 Jul 1 00:28 /dev/bus/usb/003/004

主设备号为 189,向配置文件中添加以下内容,将设备映射到容器内:

/etc/pve/lxc/102.conf
1
2
lxc.cgroup.devices.allow: c 189:* rwm
lxc.mount.entry: /dev/bus/usb/003/004 dev/bus/usb/003/004 none bind,optional,create=file

或者直接将目录映射过去也行,防止设备名发生变化:

/etc/pve/lxc/102.conf
1
lxc.mount.entry: /dev/bus/usb/003 dev/bus/usb/003 none bind,optional,create=dir

如果容器中 ls -al /dev/bus/usb/003/004 权限不对(nobody / nogroup),可以在 PVE 中 chown 100000:100000 /dev/bus/usb/003/004,这样容器中就为 root 权限了。

在宿主机中直接配置蓝牙

由于不想再单独开一台虚拟机,故打算在宿主机中直接运行蓝牙监听服务。

正好宿主机中也有一个非 root 用户,使用这个用户来运行服务,尽量减小对系统的影响。

先验证蓝牙功能是否正常,在 bluetoothctl 中运行

1
2
3
4
menu scan
transport le
back
scan on

应该能够看到一些广播和数据。

(我这儿 hcitool lescan 会报错 Set scan parameters failed: Input/output error,参考 https://stackoverflow.com/questions/70777475/hcitool-lescan-returns-an-i-o-error-on-manjaro 发现如上使用 bluetoothctl 就能正常工作)

非特权安装 pip3
1
2
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py --user

如果报错 ModuleNotFoundError: No module named 'distutils.cmd',则需要安装 python3-distutils

安装运行 MiTemperature2

按照 MiTemperature2 文档进行安装。

安装 bluepy 前需要先安装 libglib2.0-dev

安装 pybluez 时可能遇到 error in PyBluez setup command: use_2to3 is invalid. 的问题,参考 https://github.com/pybluez/pybluez/issues/467,先 pip3 install setuptools==58 再安装即可。

之后遇到类似 https://github.com/JsBergbau/MiTemperature2/issues/106 的问题,以及类似 https://stackoverflow.com/questions/75175755/not-seeing-ble-device-advertising-unless-set-bluetoothctl-transport-le 的问题,都暂时没有被解决。

于是也放弃了。

配置 MC 服务器

安装 Java 8

由于该整合包版本需要 Java 8,而 Debian 官方源中没有,故使用第三方源安装。

准备工作:sudo apt install apt-transport-https ca-certificates wget dirmngr gnupg software-properties-common

添加第三方源:

1
2
wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo tee /etc/apt/trusted.gpg.d/adoptopenjdk.asc
sudo add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/

由于 adoptopenjdk 可能还没加上 bookworm 源,可能需要手动将源中的 bookworm 改为 bullseye

安装 Java 8 JRE:

1
2
sudo apt update
sudo apt install adoptopenjdk-8-hotspot-jre

添加为服务

添加为 systemd 服务,参考 https://gist.github.com/winny-/bb17853ffc76fbb9b039 进行修改。

/etc/systemd/system/minecraft.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Minecraft Server

[Service]
WorkingDirectory=/data/MC/RAD2-1.3/RAD2-Serverpack-1.3
User=thx
Type=forking
ExitType=cgroup
ExecStart=/usr/bin/tmux new-session -s mc -d './LaunchServer.sh'
ExecStop=/usr/bin/tmux send-keys -t mc:0.0 'say SERVER SHUTTING DOWN. Saving map...' C-m 'save-all' C-m 'stop' C-m
ExecStop=/bin/sleep 2

[Install]
WantedBy=multi-user.target

使用 Type=forking 来管理 tmux new-session fork 出的进程。

使用 ExitType=cgroup 等待所有程序退出。

]]>
+ + + 折腾 + + + 软路由 + + PVE + + + https://blog.centaurus99.top/2023/06/17/%E5%9F%BA%E4%BA%8E-Proxmox-VE-%E7%9A%84-All-in-One-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA/#disqus_thread + +
+ + + 使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化 + https://blog.centaurus99.top/2022/09/07/%E4%BD%BF%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E5%92%8C%E5%B0%8F%E7%B1%B3%E8%93%9D%E7%89%99%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%AE%A1%E5%8F%AF%E8%A7%86%E5%8C%96%E5%AE%BF%E8%88%8D%E6%B8%A9%E6%B9%BF%E5%BA%A6%E5%8F%98%E5%8C%96/ + https://blog.centaurus99.top/2022/09/07/%E4%BD%BF%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E5%92%8C%E5%B0%8F%E7%B1%B3%E8%93%9D%E7%89%99%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%AE%A1%E5%8F%AF%E8%A7%86%E5%8C%96%E5%AE%BF%E8%88%8D%E6%B8%A9%E6%B9%BF%E5%BA%A6%E5%8F%98%E5%8C%96/ + Tue, 06 Sep 2022 16:50:20 GMT + + <p>最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,<a href="https://pvvx.github.io/ATC_MiThermometer/">https://pvvx.github.io/ATC_MiThermometer/</a>),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。</p> +<p>最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。</p> + + + + 最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,https://pvvx.github.io/ATC_MiThermometer/),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。

最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。

刷入定制固件

参考:

使用 https://github.com/pvvx/ATC_MiThermometer 中的定制固件,老外非常 NB,还写了一套网页直接在线刷固件:https://pvvx.github.io/ATC_MiThermometer/TelinkMiFlasher.html,在仓库中查看使用说明即可。

刷入定制固件后开启小米蓝牙温湿度计的蓝牙广播功能,这样树莓派不用连接就能接收温湿度广播数据了。由于周围环境较为可信且刻意调低了发射增益,我没有设置 PIN 码和加密,防止哪天忘了连不上。就是懒了

树莓派接收蓝牙广播

参考:使用树莓派定时读取小米温湿度传感器数据并发送到微信

也已经有老外编写了完善的接收程序,直接查看仓库中说明使用即可:https://github.com/JsBergbau/MiTemperature2

存入 InfluxDB 数据库

安装并配置 InfluxDB 数据库

参考:https://blog.csdn.net/qq_41475058/article/details/108050440

1
sudo apt install influxdb influxdb-client

然后数据库服务器会在 8086 端口上开始监听。似乎需要添加 admin 用户才能开启权限认证,我只需要它能跑起来就行就没管。懒了

1
2
3
4
influx  # 默认连接到localhost:8086
show users # 查看所有用户,默认没有
CREATE USER "pi" WITH PASSWORD '******' WITH ALL PRIVILEGES # 创建 pi 用户用于管理数据
create database mi # 创建 mi 数据库用于存放数据

将广播数据存入

编辑接收程序中的 sendToInflux.sh 如下:

sendToInflux.sh
1
curl -i -u "pi:PASSWORD" -XPOST http://127.0.0.1:8086/write?db=mi\&precision=s --data-binary "AquaraBluetoothSensors,sensorname=$2 temperature=$3,calibratedHumidity=$4,voltage=$5,batteryLevel=$6 $7"

然后 python3 LYWSD03MMC.py --atc --battery --callback sendToInflux.sh 即可开始接受广播数据并存入数据库。

此时在数据库中可以看到数据了:

1
2
3
use mi # 进入 mi 数据库
show measurements # 查看表,此时应有表 AquaraBluetoothSensors
select * from AquaraBluetoothSensors # 查看表中所有数据

还可以写个 service 来跑,比如编辑 /etc/systemd/system/MiTemperature.service

/etc/systemd/system/MiTemperature.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=MiTemperature advertisements receiver
After=network.target

[Service]
Type=simple
User=pi
Restart=always
RestartSec=5
WorkingDirectory=/home/pi/Git/MiTemperature2
ExecStart=/usr/bin/python3 LYWSD03MMC.py --atc --battery --callback sendToInflux.sh
StandardOutput=file:/home/pi/Git/MiTemperature2/output.log
StandardError=file:/home/pi/Git/MiTemperature2/error.log

[Install]
WantedBy=multi-user.target

开启服务并开机自启

1
2
sudo systemctl start MiTemperature.service
sudo systemctl enable MiTemperature.service

Grafana 可视化

参考官方说明,使用 apt 安装:https://grafana.com/docs/grafana/v9.0/setup-grafana/installation/debian/#install-from-apt-repository

1
2
3
4
5
6
sudo apt install apt-transport-https
sudo apt install wget # 说明中的 software-properties-common 我没装上,好像不影响
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/enterprise/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt-get install grafana-enterprise

然后编辑 /etc/grafana/grafana.ini 更换服务端口,启动服务:

1
2
sudo systemctl start grafana-server.service
sudo systemctl enable grafana-server.service

最后浏览器访问对应端口上的网页,默认用户名和密码是 admin,然后进行配置即可。Grafana 的功能蛮复杂的,有空可能单独开一篇来记录~

]]>
+ + + 折腾 + + 树莓派 + + + 树莓派 + + IoT + + Grafana + + + https://blog.centaurus99.top/2022/09/07/%E4%BD%BF%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E5%92%8C%E5%B0%8F%E7%B1%B3%E8%93%9D%E7%89%99%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%AE%A1%E5%8F%AF%E8%A7%86%E5%8C%96%E5%AE%BF%E8%88%8D%E6%B8%A9%E6%B9%BF%E5%BA%A6%E5%8F%98%E5%8C%96/#disqus_thread + +
+ + + 使用 Clash + AdGuard Home 在树莓派软路由上搭建广告屏蔽与透明代理服务器 + https://blog.centaurus99.top/2022/09/02/%E4%BD%BF%E7%94%A8-Clash-AdGuard-Home-%E5%9C%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E8%BD%AF%E8%B7%AF%E7%94%B1%E4%B8%8A%E6%90%AD%E5%BB%BA%E5%B9%BF%E5%91%8A%E5%B1%8F%E8%94%BD%E4%B8%8E%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8/ + https://blog.centaurus99.top/2022/09/02/%E4%BD%BF%E7%94%A8-Clash-AdGuard-Home-%E5%9C%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E8%BD%AF%E8%B7%AF%E7%94%B1%E4%B8%8A%E6%90%AD%E5%BB%BA%E5%B9%BF%E5%91%8A%E5%B1%8F%E8%94%BD%E4%B8%8E%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8/ + Fri, 02 Sep 2022 07:24:44 GMT + + <p>之前 <a href="/2021/07/11/%E3%80%90%E8%A1%A5%E6%A1%A3%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/#%E4%BD%BF%E7%94%A8-USB-%E7%BD%91%E5%8D%A1">【补档】树莓派折腾记录</a> 中也记录过了相关内容,但是一年过来有些地方有些变动与改进,故单开一篇重新记录并长期更新。</p> + + + + 之前 【补档】树莓派折腾记录 中也记录过了相关内容,但是一年过来有些地方有些变动与改进,故单开一篇重新记录并长期更新。

配置 Clash 进行透明代理

TODO

配置 AdGuard Home 进行广告屏蔽

TODO

防火墙

作为一个挂在公网下 7×24h 运行的网关服务器,进行一定的防火墙配置是必不可少的。这里主要通过 iptables 和 ip6tables 实现。

由于使用了 iptables-persistent 进行 iptables 规则可持久化,方便起见下面就直接把保存的规则文件贴上来了。

IPv4

/etc/iptables/rules.v4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
*filter
# INPUT 和 FORWARD 链上默认 DROP 掉
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# 防止外网使用内网 IP 欺骗
-A INPUT -i eth0 -s 192.168.0.0/16 -j DROP

# 允许本机、内网以及已建立的连接通过和转发
-A INPUT -i lo -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -i wlx1cbfceb110dc -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i docker0 -j ACCEPT
-A FORWARD -i wlx1cbfceb110dc -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# 开放外网 SSH, HTTP, HTTPS 连接
-A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT

COMMIT


*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 新建 clash 链
:clash - [0:0]

# 内网 TCP 请求转发给 clash 链
-A PREROUTING -s 192.168.0.0/16 -p tcp -j clash

# 将转发后的包源地址修改为本机地址
-A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE

# 访问本机和内网不经过 clash
-A clash -d 10.0.0.0/8 -j RETURN
-A clash -d 127.0.0.0/8 -j RETURN
-A clash -d 169.254.0.0/16 -j RETURN
-A clash -d 172.16.0.0/12 -j RETURN
-A clash -d 192.168.0.0/16 -j RETURN
-A clash -d 224.0.0.0/4 -j RETURN
-A clash -d 240.0.0.0/4 -j RETURN

# 访问校园网不经过 clash
-A clash -d 59.66.0.0/16 -j RETURN
-A clash -d 101.5.0.0/16 -j RETURN
-A clash -d 101.6.0.0/16 -j RETURN
-A clash -d 118.229.0.0/19 -j RETURN
-A clash -d 166.111.0.0/16 -j RETURN
-A clash -d 183.172.0.0/15 -j RETURN
-A clash -d 202.112.39.2/32 -j RETURN
-A clash -d 219.223.168.0/21 -j RETURN
-A clash -d 219.223.176.0/20 -j RETURN

# 其余请求重定向至 clash 端口
-A clash -p tcp -j REDIRECT --to-ports 7891

COMMIT

IPv6

参考:https://www.sixxs.net/wiki/IPv6_Firewalling

关于为何 DHCPv6 相比 DHCPv4 要额外设置,参考:https://unix.stackexchange.com/questions/452880/what-are-the-essential-iptables-rules-for-ipv6-to-work-properly

RFC 4890 给出了针对 ICMPv6 的防火墙配置建议,由于时间有限未能细读与实现。

RFC 5095 废除了 Type 0 Routing Headers,防火墙中给予了实现。

Updated 2023-05-08: 在之前配置完 IPv6 NAT 网络后,并没有为 IPv6 配置代理。随着 IPv6 的不断推广,部分被墙网站出现了使用本地代理可以访问,透明代理无法访问的情况,包括但不限于 v2ex.com,Youtube 的视频播放等,于是也为 IPv6 配置了代理。原本使用的 Clash Premium 2022.08.26 版本的 IPv6 代理似乎有 bug,需要进行升级。由于想继续使用 AdGuardHome 统计 DNS 查询信息,故需要依赖 Clash 的 redir-host 功能(该功能在 Premium 2023.02.16 版本被弃用),因此选用 Clash Premium 2023.01.29 版本。巧合的是,Premium 2023.01.29 版本将核心版本升级到了 1.13.0,该版本添加了对 IPv6 REDIRECT 的支持(#2473),这让 IPv6 的代理成为了可能。相关改动已同步到下方规则文件中。

/etc/iptables/rules.v6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Filter all packets that have RH0 headers. Refer to RFC 5095
-A INPUT -m rt --rt-type 0 -j DROP
-A FORWARD -m rt --rt-type 0 -j DROP
-A OUTPUT -m rt --rt-type 0 -j DROP

# Allow trusted link to INPUT and FORWARD
-A INPUT -i lo -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -i wlx1cbfceb110dc -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i docker0 -j ACCEPT
-A FORWARD -i wlx1cbfceb110dc -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow DHCPv6
-A INPUT -p udp --dport 546 -d fe80::/10 -j ACCEPT

# Allow ICMPv6
-A INPUT -p icmpv6 -j ACCEPT

# Allow some server port
-A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT

COMMIT


*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:clash - [0:0]

# 内网 TCP 请求转发给 clash 链
-A PREROUTING -s fd22:41b7:e060::/64 -p tcp -j clash

# 将转发后的包源地址修改为本机地址
-A POSTROUTING -s fd22:41b7:e060::/64 -o eth0 -j MASQUERADE

# 访问内网和校园网不经过 clash
-A clash -d fd22:41b7:e060::/64 -j RETURN
-A clash -d 2402:f000::/32 -j RETURN

# 其余请求重定向至 clash 端口
-A clash -p tcp -j REDIRECT --to-ports 17891

COMMIT
]]>
+ + + 折腾 + + 树莓派 + + + 树莓派 + + 软路由 + + Clash + + AdGuard Home + + + https://blog.centaurus99.top/2022/09/02/%E4%BD%BF%E7%94%A8-Clash-AdGuard-Home-%E5%9C%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E8%BD%AF%E8%B7%AF%E7%94%B1%E4%B8%8A%E6%90%AD%E5%BB%BA%E5%B9%BF%E5%91%8A%E5%B1%8F%E8%94%BD%E4%B8%8E%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8/#disqus_thread + +
+ + + 树莓派软路由配置 IPv6 网络 + https://blog.centaurus99.top/2022/09/02/%E6%A0%91%E8%8E%93%E6%B4%BE%E8%BD%AF%E8%B7%AF%E7%94%B1%E9%85%8D%E7%BD%AE-IPv6-%E7%BD%91%E7%BB%9C/ + https://blog.centaurus99.top/2022/09/02/%E6%A0%91%E8%8E%93%E6%B4%BE%E8%BD%AF%E8%B7%AF%E7%94%B1%E9%85%8D%E7%BD%AE-IPv6-%E7%BD%91%E7%BB%9C/ + Thu, 01 Sep 2022 16:24:49 GMT + + <p>树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。</p> + + + + 树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。

网络环境:树莓派有线网卡 eth0 作为 WAN 口连接 IPv4 + IPv6 双栈的校园网,USB 无线网卡 wlx1cbfceb110dc 作为无线 AP 提供局域网,USB 网卡的驱动和 AP 的搭建见 【补档】树莓派折腾记录

网桥透传法

由于我的 IPv6 网络并没有透明代理的需求,所以其实在两个网卡间搭个网桥,把树莓派作为二层网络设备(类似交换机)使用即可。主要问题在于限制网桥只走 IPv6 流量,这个使用 ebtables 即可,局域网中的网络设备会联系校园网的网关获取到 IPv6 地址等信息。

部署完后才发现,校园网的 IPv6 也是需要登录认证的,所以这样整的话每次联网都需要手动登录,所以最终弃用了 QAQ.

主要参考:http://www.xingbin.net/blog_channel8/C/CampusNetwork_IPv6/

建立网桥:sudo brctl addbr ipv6br

启动网桥:sudo ifconfig ipv6br up

只允许 IPv6 数据包通过网桥:sudo ebtables -t broute -A BROUTING -p ! ipv6 -j DROP

这一步如果遇到了 RULE_APPEND failed (No such file or directory): rule in chain BROUTING. 之类的错误的话,可能是因为使用了基于 nf_tables 而不是 xtables 的 ebtables,(参见:https://sources.debian.org/src/iptables/1.8.2-4/debian/NEWS/),此时使用 ebtables-legacy 即可。

添加 eth0 进入网桥:sudo brctl addif ipv6br eth0

添加 wlx1cbfceb110dc 进入网桥:sudo brctl addif ipv6br wlx1cbfceb110dc

注意: 建议先设置 ebtables 再添加网卡,否则直接将网卡添加进网桥的话会导致 IPv4 流量都进入网桥,从而无法正常连接以及丢失 SSH 连接。

以上配置重启后会消失,需要可持久化的话可以参考 http://blog.yesterday17.cn/post/pi-router/ 中的配置。

NAT for IPv6

IPv6 网络中本不应使用 NAT,然而校园网中获得的 IPv6 地址使用 ifconfig 查看是 prefixlen 128 的(或许是由 prefixlen 64 的地址生成的?这块儿我不是很明白),并且对每一个 IP 都会要求身份认证,给连入宿舍局域网中的设备带来了一定的麻烦。于是选择搭建 NAT 网络,共用同一个校园网 IPv6 地址。

局域网中使用唯一本地 IPv6 单播地址 (ULA, Unique Local IPv6 Unicast Address, RFC 4193),要求拥有固定前缀 fd00::/8,然后是 40 位随机 Global ID(关于随机的必要性见:https://blogs.infoblox.com/ipv6-coe/3-ways-to-ruin-your-future-network-with-ipv6-unique-local-addresses-part-2-of-2/)。然而为了手打地址方便,我还是使用了有某种实际意义的地址:fd22:41b7:e060::/64至少没用全零

首先开启 IPv6 内核转发,编辑 /etc/sysctl.conf

/etc/sysctl.conf
1
2
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.accept_ra=2

关于 accept_ra 的设置参考:https://sysctl-explorer.net/net/ipv6/accept_ra/,大概是因为开启转发后会自动关闭 Accept Router Advertisements,设置值为 2 可以强制开启。

接着使用 dhcpcd 配置内网无线 AP 网卡的固定静态地址,在 /etc/dhcpcd.conf 中添加 static ip6_address,编辑后如下:

/etc/dhcpcd.conf
1
2
3
4
interface wlx1cbfceb110dc
static ip_address=192.168.22.1/24
static ip6_address=fd22:41b7:e060::/64
nohook wpa_supplicant

重启 dhcpcd 生效:sudo systemctl restart dhcpcd.service

然后使用 dnsmasq 配置地址分配相关服务,这里在内网同时开启 SLAAC 和 DHCPv6,编辑 /etc/dnsmasq.conf 后如下:

/etc/dnsmasq.conf
1
2
3
4
5
6
7
8
interface=wlx1cbfceb110dc
dhcp-range=192.168.22.100,192.168.22.200,255.255.255.0,24h
dhcp-range=fd22:41b7:e060::1,fd22:41b7:e060::fe,slaac,1h
dhcp-option=3,192.168.22.1
dhcp-option=6,192.168.22.1
dhcp-option=option6:dns-server,[fd22:41b7:e060::]
enable-ra
dhcp-authoritative

重启 dnsmasq 生效:sudo systemctl restart dnsmasq.service

再通过 ip6tables 在 POSTROUTING 链上做一个 SNAT 即可:

1
sudo ip6tables -t nat -A POSTROUTING -s fd22:41b7:e060::/64 -o eth0 -j MASQUERADE

上面配置了树莓派为 DNS 服务器,树莓派使用 Clash 和 Adguard Home 搭建 IPv4 与 IPv6 双栈 DNS 服务,上游服务器也均为双栈 DNS 服务器,重连设备获取 IP 后即可正常使用了。

如果要指定 DNS 服务器可以在 dnsmasq 中类似配置,以 TUNA DNS666 服务器为例:dhcp-option=option6:dns-server,[2001:da8::666]

配置的 SLAAC 支持使 Android 手机也能正常使用 IPv6 服务。

经测试,内网设备使用 IPv6 单栈也可以正常访问双栈或 IPv6 单栈网页。

一些测试网站

参考

]]>
+ + + 折腾 + + 树莓派 + + + 树莓派 + + 软路由 + + + https://blog.centaurus99.top/2022/09/02/%E6%A0%91%E8%8E%93%E6%B4%BE%E8%BD%AF%E8%B7%AF%E7%94%B1%E9%85%8D%E7%BD%AE-IPv6-%E7%BD%91%E7%BB%9C/#disqus_thread + +
+ + + 使用acme.sh自动配置泛域名证书 + https://blog.centaurus99.top/2022/06/21/%E4%BD%BF%E7%94%A8acme-sh%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E6%B3%9B%E5%9F%9F%E5%90%8D%E8%AF%81%E4%B9%A6/ + https://blog.centaurus99.top/2022/06/21/%E4%BD%BF%E7%94%A8acme-sh%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E6%B3%9B%E5%9F%9F%E5%90%8D%E8%AF%81%E4%B9%A6/ + Tue, 21 Jun 2022 15:11:15 GMT + + <p>一年前用学生邮箱白嫖的域名要到期了,于是换了个便宜的 <code>.top</code> 域名,正好之前忘了记录自动签证书的过程了,这里记录一下以后再换域名的时候直接来抄。</p> +<p>由于同时有很多子域名在用,于是决定申请泛域名证书,共用同一个。</p> +<p>主要参考 <a href="https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E">官方文档</a> ,记录了仅适用于我个人的配置过程。</p> + + + + 一年前用学生邮箱白嫖的域名要到期了,于是换了个便宜的 .top 域名,正好之前忘了记录自动签证书的过程了,这里记录一下以后再换域名的时候直接来抄。

由于同时有很多子域名在用,于是决定申请泛域名证书,共用同一个。

主要参考 官方文档 ,记录了仅适用于我个人的配置过程。

安装 acme.sh

1
curl  https://get.acme.sh | sh -s email=my@example.com

配置 DNS API

参考 官方文档

泛域名证书似乎需要用 DNS 验证,我的 DNS 解析是托管在 Cloudflare 上的,先登录获取 API 密钥,这里我图省事直接用了 Global API Key,然后:

1
2
export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Email="xxxx@sss.com"

生成/安装证书

生成证书:

1
acme.sh --issue --dns dns_cf -d centaurus99.top -d *.centaurus99.top

安装证书:

1
acme.sh --install-cert -d centaurus99.top --key-file /etc/v2ray/v2ray.key --fullchain-file /etc/v2ray/v2ray.crt --reloadcmd "sudo nginx -s reload"

据文档所说,DNS API 使用的变量,生成/安装参数都会被保存用于自动更新,60 天以后证书会自动更新并自动执行安装。下面再去 nginx 里配置证书位置即可。大功告成!

附录

1
2
3
root@cc:~/.acme.sh# acme.sh -v
https://github.com/acmesh-official/acme.sh
v3.0.5
]]>
+ + + 折腾 + + + ACME + + + https://blog.centaurus99.top/2022/06/21/%E4%BD%BF%E7%94%A8acme-sh%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E6%B3%9B%E5%9F%9F%E5%90%8D%E8%AF%81%E4%B9%A6/#disqus_thread + +
+ + + Icarus主题配置日记 + https://blog.centaurus99.top/2022/01/15/Icarus%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE%E6%97%A5%E8%AE%B0/ + https://blog.centaurus99.top/2022/01/15/Icarus%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE%E6%97%A5%E8%AE%B0/ + Sat, 15 Jan 2022 08:04:59 GMT + + <p>不知怎么发现了 <a href="https://github.com/ppoffice/hexo-theme-icarus">Icarus</a> 这个主题,看起来不错,尝试改一改换上。</p> +<p>为了方便自定义,采用源码安装的形式。<span class="heimu">其实踩了遍直接 npm 安装的坑</span></p> +<p>本篇博客将和我自定义后的主题 <a href="https://github.com/Centaurus99/hexo-theme-icarus">Icarus个人修改版</a> 保持同步更新~</p> + + + + 不知怎么发现了 Icarus 这个主题,看起来不错,尝试改一改换上。

为了方便自定义,采用源码安装的形式。其实踩了遍直接 npm 安装的坑

本篇博客将和我自定义后的主题 Icarus个人修改版 保持同步更新~

Icarus 安装

配置 Hexo

截至 2022-01-15,Icarus 还没有官方支持 Hexo 6.0.0,所以如果在这个时间点使用默认方式安装 Hexo 并装上了 6.0.0 版本的话,大概需要手动降级。

Updated 2022-01-16:Icarus 已有支持 Hexo 6.0.0 的预发布版本。

我是将 package.json 中将 Hexo 的版本从 6.0.0 改为了 5.4.0,然后 npm update

然后在 _config.yml 中将主题改为 Icarus

1
theme: icarus

可以选择将不用的默认主题 hexo-theme-landscape 卸载掉

安装 Icarus

为了方便对主题单独进行管理,我先将主题 Fork 一份到自己的 Github 上,即 Icarus个人修改版,然后通过 git 子模块进入到博客中来。

在博客根目录下使用如下命令:

1
git submodule add https://github.com/Centaurus99/hexo-theme-icarus.git themes/icarus

这样,即使到一台新设备上,也只需要在 clone 之后在项目目录下多一步 git submodule update --init,就能获取到主题了。

此时直接开始运行会发现缺少依赖,手动安装一下即可(直接 npm 安装也可能会遇到这个问题,参考 Issue#855)。

1
npm install --save bulma-stylus@0.8.0 hexo-renderer-inferno@^0.1.3

配置 Icarus 主题

themes/icarus/ 下没有配置文件的前提下(如果有就删了),可以先运行一下 hexo server ,会在博客根目录下自动生成 _config.icarus.yml 配置文件,在这里配置而不是主题目录下配置即可保持主题源码不含个人配置文件。

接着就可以对着 官方文档 配置自己的主题啦。

一些个性化的东西这里就不做记录了,记录一些功能的配置过程。

关于显示更新时间问题

这实际是不是主题配置相关内容,只是记录一下,如果使用 Git 管理博客源码,记得把 _config.yml 中的 updated_option 改为 'date',这样显示的更新时间是由博客 Front-matter 标记中的 updated 决定的,而不是由文件修改时间决定。

使用二次开发后的主题

这里发现有个大佬对主题做了很多不错的修改 大佬博客,可以提个 PR 到自己这儿来使用。源码

这个代码直接使用可能会因为编码规范问题不通过 Code Linting 检查,npm run lint 可以查看问题,可以临时在 package.json 中的 scripts > lint 对应的命令里添加 –fix 尝试自动修复,剩下的问题就要手动修复了。

评论插件

由于 Gitalk 请求的账户权限太高,又不想使用依托于其他第三方服务的评论插件,同时 Valine 又有着安全问题,Isso 又感觉较为简陋,所以最终选择了 Waline 评论插件。正好手头上有个 VPS,可以自建评论服务器。

twikoo 也是一个很不错的评论插件,不过由于不支持独立部署(imaegoo/twikoo#163)以及外观上更喜欢 Waline 的缘故,最终还是选择了 Waline

客户端配置

参考 Icarus评论插件文档,只需要在 _config.icarus.yml 中修改评论插件配置就可以啦。

1
2
3
comment:
type: waline
server_url: 服务端地址

服务端配置

目前本博客的评论服务器为自建服务器,参考 官方文档 搭建,以下为搭建过程记录(方便重建的时候过来直接 copy)。

> 创建对应用户

以下过程可能需要 sudo 权限,并非必须步骤。

新建一个无法直接登录的用户用于运行 waline 服务:

1
sudo adduser waline --disabled-login --disabled-password

切换到该用户:

1
sudo su - waline

使用 npm 安装 waline

1
npm install @waline/vercel
> 配置 MySQL 数据库

参考 大佬博客

1
2
3
4
5
6
7
8
9
10
11
--创建新的数据库,并设置数据库编码
$ CREATE DATABASE 你的数据库名 DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

--创建新的用户
$ CREATE USER '你的用户名'@'你的服务器IP' IDENTIFIED BY '你的密码';

--把数据库的管理权限给予刚刚创建的MySQL用户
$ GRANT ALL PRIVILEGES ON *.* TO '你的用户名'@'%';

--刷新权限,使用设置生效
$ FLUSH PRIVILEGES;

执行数据库初始化脚本 waline.sql,可以先登录到对应 MySQL 账户下,然后:

1
2
USE 你的数据库名;
SOURCE 脚本文件位置;
> 配置评论通知

参考 https://waline.js.org/guide/server/notification.html ,这里我只配置了邮件通知,见下面的配置文件。

> 配置为服务运行

可以先试一下能否直接运行,先配置环境变量:

1
2
3
export MYSQL_DB=你的数据库名
export MYSQL_USER=你的用户名
export MYSQL_PASSWORD=你的密码

然后尝试运行:

1
node node_modules/@waline/vercel/vanilla.js

如果没啥问题,就可以配置成服务了。

编辑文件 /etc/systemd/system/waline.service,如下配置:

/etc/systemd/system/waline.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Unit]
Description=Waline Comment Server

[Service]
Type=simple
User=waline
WorkingDirectory=/home/waline
ExecStart=/usr/bin/node /home/waline/node_modules/@waline/vercel/vanilla.js
Environment=MYSQL_DB=你的数据库名
Environment=MYSQL_USER=你的用户名
Environment=MYSQL_PASSWORD=你的密码
Environment=SMTP_SERVICE=SMTP 邮件发送服务提供商
Environment=SMTP_USER=SMTP 邮件发送服务的用户名
Environment=SMTP_PASS=SMTP 邮件发送服务的密码
Environment=SITE_NAME=网站名称
Environment=SITE_URL=网站地址(要去除末尾的'/'
Environment=AUTHOR_EMAIL=博主邮箱
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

然后使用 sudo systemctl enable --now waline.service 启动并设为开机自启动。

之后配置 Web 服务器转发到本地 8360 端口即可。Nginx 里可以这样配置:

1
2
3
4
5
6
7
8
9
10
11
12
location / {
proxy_pass http://127.0.0.1:8360/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
# cache
add_header Cache-Control no-cache;
expires 12h;
}

然后就可以去博客里测试一下了,第一个注册的用户将成为管理员。

使用 patch-package 修改第三方模块

主题中使用到的一些模块可能需要修改源码进行个性化,比如 hexo-component-inferno 中没有使用最新的 waline 前端模块,想要手动配置。可以使用 patch-package 来进行易于管理的修改。

  • 首先 npm install patch-package 安装

  • 然后在 node_modules/ 中修改源码

  • 运行 npx patch-package package-name 生成补丁文件

  • package.json 中加入执行脚本:

    1
    2
    3
      "scripts": {
    + "postinstall": "npx patch-package"
    },

这样之后就可以在 npm install 时自动打上个性化补丁了。

暗黑主题

参考:https://github.com/ppoffice/hexo-theme-icarus/issues/564

Waline 评论插件中代码高亮样式问题

如图:

研究一番后发现, Waline 使用 Prism 进行代码高亮,它会直接对代码的不同高亮的部分赋上不同的类,这个类名不会使用 namespace 进行保护(加个前缀啥的),这样的类名有 tag , number 等等。

比如上图代码中的 html 标签 <head> 会格式化为:

1
2
3
4
5
6
7
<span class="token tag">
<span class="token tag">
<span class="token punctuation">&lt;</span>
head
</span>
<span class="token punctuation">&gt;</span>
</span>

恰巧的是,Icarus 中使用了 CSS 框架 bulma,对 tag , number 之类的样式进行了设定,这就导致了评论区代码高亮出现问题。

PrismIssue#1324 中也提到了该问题并给出了解决方法,但由于评论区的代码高亮是在评论服务端完成的,懒得去改服务端代码了,于是就自定义 CSS 进行覆盖,顺便也解决一下默认情况下评论区中黑色代码块和主题格格不入的问题,适配一下明暗两种主题。commit#974b1c9

效果:

参考

附录:个性化修改记录

主要记录一下我的主题源码有什么额外的改动。

  • a05b870 为解决关于 Code Linting 的问题,对代码格式进行了一些修正。
  • 248a768 删除了 merge 过来的代码中的个人配置文件。
  • 229543d 个人信息页面上将 关注我 修改为 关注
  • e38ae7c 删除了 merge 过来代码中的个人 logo。
  • 658686a 将黑幕添加到 css 中便于直接使用。
  • 74416d2 添加暗黑主题,并在后面几个 commit 中进行适配。
  • 1544bb3 修改了代码块中字体大小。
  • 974b1c9 适配 Waline 评论插件中代码块的主题风格(包括黑白两种主题)。
  • 6b5da24 例行同步上游更新。
  • dcb178c 修复上游更新中引起的纯文字 logo 边角被上层容器覆盖的问题。
  • 3a3c5e6 修复上游更新中 Waline 评论插件升级至 v2 后 CSS 类开头从 v 改为 wl- 引起的问题。
]]>
+ + + 折腾 + + 博客 + + + Hexo + + Icarus + + + https://blog.centaurus99.top/2022/01/15/Icarus%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE%E6%97%A5%E8%AE%B0/#disqus_thread + +
+ + + Hexo博客架设日记 + https://blog.centaurus99.top/2022/01/14/Hexo%E5%8D%9A%E5%AE%A2%E6%9E%B6%E8%AE%BE%E6%97%A5%E8%AE%B0/ + https://blog.centaurus99.top/2022/01/14/Hexo%E5%8D%9A%E5%AE%A2%E6%9E%B6%E8%AE%BE%E6%97%A5%E8%AE%B0/ + Fri, 14 Jan 2022 08:21:04 GMT + + <p>好久之前就想把博客搭起来的来着,结果一直咕到了现在,终于有空来搭啦 ✿✿ヽ(°▽°)ノ✿</p> +<p>博客使用 <a href="https://hexo.io/">Hexo</a> 搭建,博客源码位于 <a href="https://github.com/Centaurus99/centaurus99.github.io">https://github.com/Centaurus99/centaurus99.github.io</a> 的 <code>master</code> 分支,静态页面同步部署于 <code>gh-pages</code> 分支和个人 VPS 上。</p> + + + + 好久之前就想把博客搭起来的来着,结果一直咕到了现在,终于有空来搭啦 ✿✿ヽ(°▽°)ノ✿

博客使用 Hexo 搭建,博客源码位于 https://github.com/Centaurus99/centaurus99.github.iomaster 分支,静态页面同步部署于 gh-pages 分支和个人 VPS 上。

下面是搭建(踩坑)记录~ 其实是搭完后的回忆

Hexo 安装

对着官方文档搞,没啥好说 QWQ。

先装 nodejs,我这儿装的版本是 v16.13.2

然后 npm install -g hexo-cli

最后到博客文件夹下 hexo init,然后 npm install,完成!

GitHub Pages 的自动部署

关于如何使用 Hexo 写博客之类的官方文档里都有介绍,这儿就记录一点自动化部署的设置吧。

为了方便管理,我这儿将博客源码和部署后的静态页面放在了同一个库中,下面的配置以我的配置为例。

为了使用 用户名.github.io 访问,需要创建名为 用户名.github.io 的存储库。

配置 Hexo

首先配置运行 hexo deploy 时的部署方式。

先安装 Git 部署插件:

1
npm install hexo-deployer-git --save

然后在 _config.yml 中修改配置:

1
2
3
4
deploy:
type: git
repository: git@github.com:Centaurus99/centaurus99.github.io.git
branch: gh-pages

这样然后运行:

1
2
hexo generate
hexo deploy

应该就能在仓库的对应分支看到部署好的静态页面啦~

在仓库的 Settings > Pages 中将 Source 设为 gh-pages 分支,然后就可以通过 用户名.github.io 访问到博客了。

如果以后还要拓展部署方式,还可以继续往配置里面添加,如果用到了再来更新~

配置 Github Actions

Github Actions 是个好东西,搞自动工作流非常方便,白嫖真香!

这个部分基本是参照大佬的博客完成的,参见:https://tommy.net.cn/2020/08/06/deploy-hexo-with-github-actions/

仅对配置文件做了一点更新和修改,最终如下:

2022-01-15 更新:由于将主题以子模块的形式加入版本控制,添加了 submodules: 'recursive' 表示递归检出子模块

2022-09-02 更新:添加环境变量 TZ: Asia/Shanghai 设定时区,确保本地和远端生成的日期路径相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
name: Hexo Deploy

on:
push:
branches:
- master

env:
TZ: Asia/Shanghai

jobs:
build:
runs-on: ubuntu-latest
if: github.event.repository.owner.id == github.event.sender.id

steps:
- name: Checkout source
uses: actions/checkout@v2
with:
ref: master
submodules: 'recursive'

- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: '16'

- name: Setup Hexo
env:
ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.email "1102569568@qq.com"
git config --global user.name "Centaurus99"
npm install hexo-cli -g
npm install

- name: Hexo deploy
run: |
hexo clean
hexo deploy

这样,当我更新博客源码时,Github 就会帮我自动部署好静态页面啦。

配置 Webhooks

手头还有一台 VPS,还是打算把它作为博客的服务器。

Github 上有个功能叫 Webhooks,可以在你的库发生一些动作(比如有人 push 东西上来)的时候对着一个网址发个请求。利用这个就可以在更新时通知我的 VPS 去 pull 最新的静态分支,从而实现自动部署了。

关于 Web 服务器的搭建,Nginx 的使用这里就不记录了。 摆烂咯!

Webhooks 的使用也是学习大佬的博客,参见:https://maphical.cn/2020/03/build-blog-using-hexo/

在部署这个的过程中遇到了一堆奇奇怪怪的问题,由于时间久远了记不太清了,这里就不做记录了。 摆烂咯!×2

依稀记得一点点,比如脚本跑不起来考虑是 php 用户权限问题,最终通过给予它运行 git 命令的 sudo 权限解决;git pull 每次在更新的时候都需要处理冲突问题,原因是上面那个 git 部署工具每次会将这个分支完全覆盖,包括历史 commit 都会被删除,所以在一开始选择 pull 方式的时候要选择 rebase。

由于我把博客源码和静态页面放在了同一个存储库内,这会导致 Webhooks 每次更新会被激活两遍(两个分支的更新各激活一遍),不过问题不大。

总结

关于博客的配置文件 _config.yml 可以在我的 Github 对于仓库找到。

这样就完成了博客的自动化部署的配置,下一篇博客将记录配置主题的吐血过程。

参考

]]>
+ + + 折腾 + + 博客 + + + Hexo + + + https://blog.centaurus99.top/2022/01/14/Hexo%E5%8D%9A%E5%AE%A2%E6%9E%B6%E8%AE%BE%E6%97%A5%E8%AE%B0/#disqus_thread + +
+ + + 【补档】树莓派折腾记录 + https://blog.centaurus99.top/2021/07/11/%E3%80%90%E8%A1%A5%E6%A1%A3%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/ + https://blog.centaurus99.top/2021/07/11/%E3%80%90%E8%A1%A5%E6%A1%A3%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/ + Sun, 11 Jul 2021 02:02:33 GMT + + <p>2021 年初的时候入手了树莓派 4b,然后暑假的时候好好折腾了一下,留下了一些零散的记录,在这里整理起来,之后哪天重建的时候还能来参考一下。</p> +<p>由于距离记录已经有一段时间了,可能有些内容会有偏差。</p> + + + + 2021 年初的时候入手了树莓派 4b,然后暑假的时候好好折腾了一下,留下了一些零散的记录,在这里整理起来,之后哪天重建的时候还能来参考一下。

由于距离记录已经有一段时间了,可能有些内容会有偏差。

初步尝试

参考:http://blog.dngz.net/RaspberryPiKodbox.htm

系统安装

尝试装了适配树莓派的 Ubuntu,后来还是为了更好的硬件兼容性换成官方系统了。

当时本着尝鲜的想法,选择了仍在 beta 测试中的官方 64-bit 系统 2021-05-07-raspios-buster-arm64-lite,由于计划作为服务器运行,不需要图形桌面,所以就选择了 lite。

注:现在官方 64-bit 系统已经正式发布了(https://www.raspberrypi.com/news/raspberry-pi-os-64-bit/)。

官网也给出了烧写 SD 卡的工具 Raspberry Pi Imager,GUI 好看,烧录系统非常方便。

初始配置

系统烧录完成后会有一个 boot 分区,做一些初始化的配置再进行第一次开机。

开启 ssh 服务

boot 分区下新建一个空文件,名为 ssh

开机自动连接 WIFI

boot 分区下新建 wpa_supplicant.conf 文件,内容如下:

1
2
3
4
5
6
7
8
9
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="wifi链接名"
psk="wifi密码"
key_mgmt=WPA-PSK
}

初次启动

插电开机~

ssh 可以连接,初始用户名 pi ,密码 raspberry

记得修改密码。

解锁root

sudo passwd root 修改 root 密码。

sudo passwd --unlock root 解锁 root 用户。

由于安全原因,默认情况下 root 是不能用 ssh 登录的,如果一定需要的话,编辑 /etc/ssh/sshd_config,将配置项 #PermitRootLogin prohibit-password 修改为 PermitRootLogin yes,然后 sudo systemctl restart sshd 重启 ssh 服务即可。

校正时区

sudo dpkg-reconfigure tzdata

选择 Asia/Shanghai 即可。

树莓派配置工具 raspi-config

sudo raspi-config

换源

参考:https://blog.csdn.net/baidu_26678247/article/details/108930421

如果遇到 The repository 'http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian buster InRelease' is not signed 错误,可以按如下操作添加公钥(参见:https://www.jianshu.com/p/c64deffb1308

1
2
gpg --keyserver  keyserver.ubuntu.com --recv-keys 9165938D90FDDD2E
gpg --export --armor 9165938D90FDDD2E | sudo apt-key add -

一些杂项

GPIO

使用 raspi-config 打开 GPIO

sudo apt-get install wiringpi

按照 http://wiringpi.com/wiringpi-updated-to-2-52-for-the-raspberry-pi-4b/ 更新 wiringpi 版本

gpio readall 即可查看 GPIO 概况

进一步配置 WIFI

参考:https://www.cnblogs.com/zhangyuejia/p/8945354.html

然后 sudo ifconfig wlan0 down 关闭 wifi,sudo ifconfig wlan0 up 启动 wifi。

超频

参考:https://cyfeng.science/2020/06/26/Unboxing-Raspberry-Pi-4B-8GB-and-Overclocking/

注意默认情况下 over_voltage 最大为 6

查看CPU频率:sudo watch -n 1 cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq

查看CPU温度:sudo watch -n 1 cat /sys/class/thermal/thermal_zone0/temp

CPU 电源计划

echo "powersave" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 可以将CPU设为省电模式,固定600MHz

echo "ondemand" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 设置回默认模式

风扇控制

风扇一直开着噪声大,也影响风扇寿命,设置一下温控。

为了美观,网购了一个插在 GPIO 座上的风扇插座,勉强塞进了外壳。

使用 raspi-config 自带的风扇控制需要注意,若使用 i2c 端口作为控制口,需要将 i2c 关闭。

使用 sudo -E rpi-eeprom-config --edit 设置 WAKE_ON_GPIO=0POWER_OFF_ON_HALT=1 可以在 shutdown 之后使风扇也关闭(否则关机后风扇会开始一直转)。

通过蓝牙 ssh 连接

即通过蓝牙连接创建局域网。

参考:

连接操作:更改适配器选项 -> 蓝牙网络连接 -> 查看蓝牙网络设备 -> 选中,连接时使用 -> 接入点

后来不知道装了啥蓝牙连不上了,排查之后发现似乎是 /usr/bin/bt-agent -c NoInputNoOutput 失效了,并不会自动配对,需要手动配对。(仍未解决,但也不怎么用蓝牙连接了)

OLED 显示屏

低价搞到一个小的 OLED 显示屏,装上。

由于风扇座占掉了 i2c1,只能通过奇技淫巧使用 i2c0 ,参考 https://blog.csdn.net/weixin_46145842/article/details/106128144 设置

驱动和使用参考:https://shumeipai.nxez.com/2019/04/29/use-the-ssd1306-oled-display-on-the-raspberry-pi.html

持续连接校园网

在 Github 上找了各种连校园网的轮子,试到最后只有这个能够稳定使用:

使用 https://github.com/z4yx/GoAuthing 对应程序和 service。

无线 AP 与路由

使用 RaspAP 创建无线 AP(已弃用)

RaspAP

手动安装教程:https://docs.raspap.com/manual/

开启 802.11ac

参考 https://docs.raspap.com/faq/#80211ac

信道选择 36 ,实测 48 无法开启,40 速率较慢。

流量监控问题

参考 https://github.com/RaspAP/raspap-webgui/issues/689 末尾。

sudo apt-get purge vnstat 卸载原来的 vnstat。

curl -O https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/pool/universe/v/vnstat/vnstat_1.18-1_arm64.deb 下载旧版 vnstat。

sudo dpkg -i vnstat_1.18-1_arm64.deb 安装。

echo "vnstat hold" | sudo dpkg --set-selections 禁用更新。

使用 OpenWrt-Docker(也已弃用)

安装 docker:参考 https://openwrt.club/93.html

增加用户权限:https://www.cnblogs.com/codeaaa/p/9041533.html

hostapd + dnsmasq + OpenWrt-Dockerhttps://zhuanlan.zhihu.com/p/163827788

使用的 OpenWrt-Docker

注意: 设置 dnsmasq 配置文件的时候一定要反注释bind-interfaces,不然会出现地址占用错误。

Openwrt 配合 AdGurad Home 屏蔽广告和 ShadownSocksR Plus 用于翻墙,参考:https://blog.zfdang.com/2020/07/adguard-home-work-with-ssr-plus-in-openwrt/

板载 WLAN 优化

sudo iw wlan0 set power_save off 关闭节能可以提高速度与稳定性。

使用 USB 网卡

板载网卡性能和稳定性还是不足的,于是入手了一个 USB 无线网卡。

由于预算有限,又想要 867Mbps 的 5G 频段支持,于是入手的网卡是 RTL8812BU 芯片,在驱动方面问题多多,悲。

驱动安装

支持 RaspberryOS(64bit) 的驱动地址:https://github.com/morrownr/88x2bu

关于 iw phy 输出参数的具体说明:https://c4pr1c3.github.io/cuc-mis/chap0x02/rt3572l_explained.html

优化WiFi睡眠:https://github.com/fastoe/RTL8812BU_for_Raspbian

关于 /etc/modprobe.d/88x2bu.conf 的一点额外说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
There's four parms listed in the document you cite.
Code: Select all

rtw_power_mgnt=0|1|2
0 == disable power saving
1 == power saving on, minPS
2 == power saving on, maxPS
Code: Select all

rtw_enusbss=0|1
0 == disable auto suspend
1 == enable auto suspend
Code: Select all

rtw_hwpwrp_detect=0|1
0 == disable HW power pin detection
1 == enable HW power pin detection
Code: Select all

rtw_ips_mode=0|1
0 == low power, IPS_NORMAL
1 == higher power, IPS_LEVEL2
The conventional wisdom, because we're running our RPis as server systems not clients, is to set rtw_power_mgnt=0 and rtw_enusbss=0 to prevent the dongle going into power saving and to ignore the other two parms because they don't make any difference. If the server goes into power saving we'd need a process to wake it up. That's different from a client system where interaction from a keyboard user will trigger a request to wake up and associate the dongle.

最终配置文件为:

1
options 88x2bu rtw_drv_log_level=2 rtw_led_ctrl=1 rtw_vht_enable=2 rtw_power_mgnt=0 rtw_switch_usb_mode=1 rtw_ips_mode=1 rtw_enusbss=0 rtw_beamform_cap=11

由于购买的网卡为 USB2.0 接口,不支持 USB3.0,需要 rtw_switch_usb_mode=0/2 才能正常使用。

一些关于 RTL8812BU 驱动 / hostapd 的问题

hostapd 完整配置文件注释:https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf

配置文件中最好去除注释,可能会有奇怪的问题

这张网卡无法在初始启动时应用 ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40] 设置 40/80MHz 带宽,似乎是网卡直接 UNINITIALIZED->HT_SCAN 有问题,会进行 neighbor scanning ,然后出现 hostapd[10529]: Failed to request a scan of neighboring BSSes ret=-16 (Device or resource busy) 错误。必须先以普通 20MHz 模式启动,然后转为(restart) 40/80MHz

启动时配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface=wlx1cbfce82adb3

bridge=brlan

hw_mode=a
channel=149
ieee80211n=1
wmm_enabled=1

ssid=RASPNET_402

auth_algs=1

wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

wpa_passphrase=密码

修改为如下配置后 restart :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
interface=wlx1cbfce82adb3

bridge=brlan

hw_mode=a
channel=149
ieee80211n=1
ieee80211ac=1
wmm_enabled=1
ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40]
vht_capab=[VHT80][SHORT-GI-80]

ssid=RASPNET_402

auth_algs=1

wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

wpa_passphrase=密码

Updated 似乎是因为放在5G路由器旁边的原因…

一些没什么效果的尝试

> 换驱动

https://github.com/cilynx/rtl88x2bu,在 arm64 系统上编译所需的额外操作:https://github.com/PieGuy314/RTL88x2BU-RPi4-arm64-Driver-Patch

> 修改 hostapd 源码重新编译

hostapd 编译方式:https://leux.cn/doc/hostapd.html

在源码中找到 neighboring BSSes 的对应部分,修改返回值。

1
2
install -D hostapd /usr/local/bin//hostapd
install -D hostapd_cli /usr/local/bin//hostapd_cli

2.9 版本似乎有点问题,目前在用 2.8 版本。

新网卡

原来的网卡是 USB2.0 的网卡,退货换了一个 3.0 的。

然而最终发现,新的网卡在运行在使用 rtw_switch_usb_mode=1 运行在 USB3.0 模式时会发生各种错误,且不稳定;而使用 rtw_switch_usb_mode=1 运行在 USB2.0 模式(插在哪个物理口都行)时会保持稳定。

Update 2022.02.15:相关问题也已经在驱动存储库的说明中提及了,见 88x2bu-20210702

只能跑在 2.0 模式了,速度大概在 200Mbps 左右。

最终配置文件:

/etc/modprobe.d/88x2bu.conf
1
options 88x2bu rtw_drv_log_level=3 rtw_led_ctrl=1 rtw_vht_enable=2 rtw_power_mgnt=1 rtw_switch_usb_mode=0 rtw_ips_mode=1 rtw_enusbss=0 rtw_beamform_cap=11
/etc/hostapd/hostapd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
interface=wlx1cbfceb110dc
driver=nl80211

country_code=CN
hw_mode=a
channel=149
ieee80211n=1
ieee80211ac=1
wmm_enabled=1
ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40]
vht_capab=[HTC-VHT][MAX-MPDU-11454][SHORT-GI-80]

ssid=RASPNET_402

wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

wpa_passphrase=密码

使用的 hostapd 版本: hostapd v2.8

Clash 代理 + AdGuardHome 广告屏蔽

配置 Clash

Clash 部署:https://cherysunzhang.com/2020/05/deploy-clash-as-transparent-proxy-on-raspberry-pi/

关于代理与 DNS 解析的原理说明:https://blog.skk.moe/post/what-happend-to-dns-in-proxy/

DNS 配置可参考:http://blog.joylau.cn/2020/05/01/Clash-Config/

Clash 可以配置 proxy-providers 订阅代理,使用 https://github.com/Loyalsoldier/clash-rules 配置 rules

可以使用 subconverter 筛选处理订阅节点:https://www.10101.io/2020/02/12/use-clash-proxy-provider-with-subconverter

subconverter 中文文档:https://github.com/tindy2013/subconverter/blob/master/README-cn.md

后续:发现机场提供了 subconverter ,不需要本地部署啦~

开启终端代理

方法一

设置 clash 配置文件 mixed-port: 7890 ,在终端中运行(或添加到 ~/.bashrc):

1
2
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

方法二

使用 Proxychains

安装后设置配置文件 /etc/proxychains.conf ,在最后一行设置本地代理服务器和端口 http 127.0.0.1 7890 ,在 /usr/lib/proxychains3/proxyresolv 中将原有的 DNS 4.2.2.2 改为本机的 DNS 服务器

然后使用 proxychains + 指令 进行代理,或者直接 proxychains bash 开启全代理的终端

使用 sudo 时会报错:ERROR: ld.so: object 'libproxychains.so.3' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.

解决方法:使用 find /usr/ -name libproxychains.so.3 -print 找到库的位置,然后参考:https://parrotsec-cn.org/t/proxychains/3012 修改文件

配置 AdGuardHome

最终决定将 Clash 作为 AdGuardHome 的上游服务器

/etc/dnsmasq.conf 中设置 port=0 关闭 dnsmasq 的 DNS 服务

安装 AdGuardHomehttps://github.com/AdguardTeam/AdGuardHome#installation

配置 AdGuardHome DNS 服务端口为 53,上游 DNS 服务器为 Clash 的 DNS 服务(Clash 需开启 DNS 服务)

透明代理:假设 Clash 的 redir-port7891iptable 进行以下设置:

Update 2022.04.23: 由于校园网分配的是公网IP,所以需要设置防火墙,限制 Clash 服务只能被内网访问,防止端口被扫到被攻击(会导致大量连接和高 CPU 占用)。iptables 也做了更新,增加了简单的防护。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 防止外网使用内网 IP 欺骗
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
# 允许已建立的连接通过
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许本机和内网 IP 的所有访问
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT
# 允许来自无线 AP 的 DHCP 请求, wlx1cbfceb110dc 为网卡名
iptables -A INPUT -i wlx1cbfceb110dc -p udp --dport 67 -j ACCEPT
# 开放外网 SSH, HTTP, HTTPS 连接
iptables -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT
# 若不是允许内网 IP 的所有访问, 则需添加该规则允许内网对 Clash 的访问
# iptables -A INPUT -s 192.168.0.0/16 -p tcp -m tcp --dport 7891 -j ACCEPT
# 丢弃其他所有请求
iptables -P INPUT DROP

# 将转发后的包源地址修改为本机地址
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -t nat -N clash
# 内网 TCP 请求转发给 clash 链
iptables -t nat -A PREROUTING -s 192.168.0.0/16 -p tcp -j clash

# 访问内网不经过 clash
iptables -t nat -A clash -d 10.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 127.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 169.254.0.0/16 -j RETURN
iptables -t nat -A clash -d 172.16.0.0/12 -j RETURN
iptables -t nat -A clash -d 192.168.0.0/16 -j RETURN
iptables -t nat -A clash -d 224.0.0.0/4 -j RETURN
iptables -t nat -A clash -d 240.0.0.0/4 -j RETURN

# 其余请求重定向至 clash 端口
iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7891

/etc/dnsmasq.conf 中将默认网关和默认 DNS 服务器设为本机,例如:

1
2
3
4
interface=wlx1cbfceb110dc
dhcp-range=192.168.22.100,192.168.22.200,255.255.255.0,24h
dhcp-option=3,192.168.22.1
dhcp-option=6,192.168.22.1

如上,连入树莓派网络即可走代理访问。

回环问题

Clash 做透明代理时访问对应端口会产生回环,有时候这个问题会莫名其妙地出现。

解决尝试一

解决方案:https://github.com/Dreamacro/clash/issues/425#issuecomment-566982655

1
2
3
4
iptables -A INPUT -p tcp -m tcp --dport 7891 -m connmark ! --mark 500 -j REJECT
...
iptables -A CLASH -p tcp -j CONNMARK --set-mark 500
iptables -A CLASH -p tcp -j REDIRECT --to-ports 7891

解决尝试二

似乎去除 udp 相关 iptables 可以解决,已将上面的配置文件更新,有待观察。UPD:未解决

解决尝试三

似乎改端口可能解决,有待观察。

Update 2022.02.15:暂时还没有遇到问题。

文件存储服务器

USB 移动硬盘

硬盘处理:使用 DiskGenius 软件将硬盘分区为 ext4。

插入硬盘,sudo fdisk -l 查看硬盘设备号,如 /dev/sda1

sudo mount /dev/sda1 /data 进行挂载,挂载完后可通过 df -hT 查看空间使用情况。

永久挂载:在 /etc/fstab 中加入:

1
/dev/sda1       /data           ext4    defaults          0      0

sudo mount -a 检查是否有问题。

重要:为了防止关机时直接对硬盘断电损伤硬盘,参考如下设置(似乎只对 shutdown 后手动重启有用,reboot 没用):https://iovxw.net/p/park-external-hdd/

SMB 服务器

(已弃用)使用 Openwrt 的 SMB 服务,在 网络存储->网络共享 里设置共享目录,在 网络存储->挂载 SMB 网络共享 里开启 SMB 服务。

直接在树莓派原系统内开设 Samba 服务器:https://zhuanlan.zhihu.com/p/266495858

testparm –v 检查 smb.conf 配置是否正确。

rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384) 的解决方法:https://ixnfo.com/en/samba-warning-solution-rlimit_max-increasing-rlimit_max-1024-to-minimum-windows-limit-16384.html

Aria2 下载机

新建用户:sudo adduser aria2 并进行相关用户组设定。

https://li-aaron.github.io/2019/01/aira2-on-raspberry/ ,将命令和配置文件中的 ~ 都换为绝对路径。

配置文件参考:http://ivo-wang.github.io/2019/04/18/%E5%85%B3%E4%BA%8Earia2%E6%9C%80%E5%AE%8C%E6%95%B4%E7%9A%84%E4%B8%80%E7%AF%87/

Update 2021.09.27:现在使用的是 Aria2 Pro

MC 服务器配置

MC1.16 及以前 && Ubuntu

依照 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports/ 换源,sudo apt update (或sudo apt-get full-upgrade)进行更新。

sudo apt install openjdk-8-jre-headless 安装 java8

于是直接按照正常 Ubuntu 情况配置 MC 服务器即可。

MC1.17 && Raspberry OS 64it

截至 2021.08.06openjdk-16debian 下只有 unstable(sid) 版,所以需要一些额外的配置来安装。

参考:https://packages.debian.org/sid/arm64/openjdk-16-jdk/download

/etc/apt/sources.list 中添加 deb http://ftp.de.debian.org/debian sid main (用完后记得注释掉)。

执行 sudo apt install openjdk-16-jre-headless 安装 java16

MC服务器的剩余步骤照常,可参考:https://blog.csdn.net/qq_36290650/article/details/106978441

同步照片

Lomorage (已弃用)

使用 Lomorage,使用 apt 安装。

文档:https://docs.lomorage.com/zh/docs/Installation/lomorage-service/installation-raspbian/

apt 安装后来出现了一些依赖问题,且 APP 实在有些丑,于是弃用。

Syncthing

syncthing

安卓客户端:https://github.com/syncthing/syncthing-android

安卓客户端增强版:https://github.com/catfriend1/syncthing-android

sudo apt install syncthing 安装,sudo systemctl enable syncthing@pi.service 启动服务。

apt 安装的版本过于老旧,需要从 github 上下载最新版本,扔到 /usr/bin/ 里替换掉。

可以在云服务器上搭建发现服务器和中继服务器。

功能杂项

同步百度云

使用 bypy

给装在树莓派上的 TF 卡续命

参考:https://raspberrypi.stackexchange.com/questions/169/how-can-i-extend-the-life-of-my-sd-card

省电

USB供电控制

USB 硬盘使用 udisksctl 安全移除,USB 端口使用 uhubctl 断电。

udisksctl: sudo apt install udisks2

uhubctl: https://github.com/mvp/uhubctl

usb-down.sh
1
2
3
4
5
6
7
8
9
10
#!/bin/sh

udisksctl unmount -b /dev/sda1 # 将硬盘卸载
udisksctl power-off -b /dev/sda # 将硬盘数据断电,表现为硬盘停转
systemctl stop hostapd.service # 将网卡的 AP 服务停止

sleep 2 # 延迟一会儿防止服务未关闭

uhubctl -l 2 -a off # 关闭USB电源
# 由于只有当四个USB端口都关闭时才会断电,索性直接全部断了
usb-up.sh
1
2
3
4
5
6
7
8
#!/bin/sh

uhubctl -l 2 -a on # 打开USB电源

sleep 5 # 延迟一会儿等待USB设备识别

mount -a # 恢复硬盘挂载
systemctl start hostapd.service # 开启 AP 服务

其它

https://www.raspberrypi.org/forums/viewtopic.php?t=257144

https://learn.pi-supply.com/make/how-to-save-power-on-your-raspberry-pi/

可以参考上面关闭 HDMI,LED 等。

相机

参考:https://www.raspberrypi.org/forums/viewtopic.php?t=285868

vcgencmd get_camera 检查相机是否开启。

sudo modprobe bcm2835-v4l2

vcgencmd

参考:

DDNS

使用 Cloudflare 的 DNS 托管。

参考:https://blog.wardchan.com/posts/use-ddclient-to-automatically-update-cloudflare-dns-record.html

备份

额外购置了一张与原来同款的 32G TF 卡,本来打算升级/重装系统和网卡驱动,但是驱动上遇到了稳定性问题,就懒得重装系统了,于是当作备份卡吧。

创建镜像备份法

使用 win32diskimager,把 TF 卡插到电脑上,可以生成整个卡的镜像文件。

接着使用 PiShrink 裁剪镜像。需要使用 Linux, WSL 实测没问题。

在线拷卡备份法

使用 rpi-clone,可以进行增量备份,适合使用另一张卡定期备份。

1
2
3
git clone https://github.com/billw2/rpi-clone.git
cd rpi-clone
sudo cp rpi-clone /usr/local/bin/

安装完成后,sudo fdisk -l 找到 USB 口上的备份卡,如 /dev/sdc 然后 sudo rpi-clone /dev/sdc 即可进行增量备份。

UART 与蓝牙

树莓派与 UPS 间的通讯使用 UART 串口通信。

参考:https://zhuanlan.zhihu.com/p/106904186

本文介绍在Raspberry Pi 3、3+,4和Raspberry Pi Zero W上配置串行端口。
上述的几种树莓派包含两个可用于串行通信的UART控制器,也就是常说的串口:mini UART和PL011 UART。默认情况下,mini UART映射到40引脚GPIO连接器的TXD(GPIO 14)和RXD(GPIO 15)上,PL011 UART用于蓝牙模块​​,但是任何一个模块都可以映射到GPIO端口。

额外参考:

问题杂项

systemctl status 不显示内存占用

https://dmesg.app/systemd-accounting.html (似乎还是不行)

VsCode 远程连接

出现 command: '_workbench.downloadResource' failed 错误。

解决方法:本地的梯子(远程端不需要梯子)开成全局代理。

在使用充电宝/UPS单独供电时,通过AP满负荷读写移动硬盘可能导致USB接口掉电

换用电源供电暂未发现问题。

Update 2021.09.11: 换用电源供电也会出现问题,于是加了一个带独立供电的 USB 拓展坞,由于手头只有一个 USB2.0 的拓展坞,所以只将无线网卡接到拓展坞上,实测减轻了约 0.3A 的树莓派 USB 负载,是否可以有效防止掉盘还待检验。

硬盘维护

fsck -f /dev/sda1 检查文件系统。

fsck -c /dev/sda1 扫描。

sudo smartctl -a /dev/sda 查看 S.M.A.R.T. 信息。

使用 smartctl 进行硬盘测试。

修复:https://www.smartmontools.org/wiki/BadBlockHowto

]]>
+ + + 折腾 + + 树莓派 + + + 树莓派 + + + https://blog.centaurus99.top/2021/07/11/%E3%80%90%E8%A1%A5%E6%A1%A3%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/#disqus_thread + +
+ +
+
diff --git a/tags/ACME/index.html b/tags/ACME/index.html new file mode 100644 index 0000000..cb00a38 --- /dev/null +++ b/tags/ACME/index.html @@ -0,0 +1,62 @@ + +标签: ACME - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/tags/AdGuard-Home/index.html b/tags/AdGuard-Home/index.html new file mode 100644 index 0000000..d3e6a27 --- /dev/null +++ b/tags/AdGuard-Home/index.html @@ -0,0 +1,60 @@ + +标签: AdGuard Home - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/tags/Clash/index.html b/tags/Clash/index.html new file mode 100644 index 0000000..7f34f89 --- /dev/null +++ b/tags/Clash/index.html @@ -0,0 +1,60 @@ + +标签: Clash - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/tags/Grafana/index.html b/tags/Grafana/index.html new file mode 100644 index 0000000..61f3d02 --- /dev/null +++ b/tags/Grafana/index.html @@ -0,0 +1,61 @@ + +标签: Grafana - Centaurus99 的杂物堆

使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化

最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,https://pvvx.github.io/ATC_MiThermometer/),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。

+

最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/tags/Hexo/index.html b/tags/Hexo/index.html new file mode 100644 index 0000000..486972e --- /dev/null +++ b/tags/Hexo/index.html @@ -0,0 +1,63 @@ + +标签: Hexo - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/tags/Icarus/index.html b/tags/Icarus/index.html new file mode 100644 index 0000000..9ecbaef --- /dev/null +++ b/tags/Icarus/index.html @@ -0,0 +1,62 @@ + +标签: Icarus - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/tags/IoT/index.html b/tags/IoT/index.html new file mode 100644 index 0000000..743e210 --- /dev/null +++ b/tags/IoT/index.html @@ -0,0 +1,61 @@ + +标签: IoT - Centaurus99 的杂物堆

使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化

最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,https://pvvx.github.io/ATC_MiThermometer/),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。

+

最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/tags/PVE/index.html b/tags/PVE/index.html new file mode 100644 index 0000000..b43cd1c --- /dev/null +++ b/tags/PVE/index.html @@ -0,0 +1,61 @@ + +标签: PVE - Centaurus99 的杂物堆

基于 Proxmox VE 的 All in One 服务器搭建

树莓派挂在宿舍当软路由已经两年了,大部分情况下都挺好用,透明代理体验也还算尚可。

+

然而由于使用的 USB 无线网卡驱动支持较差,无线峰值速率只能跑到 200+ Mbps,且不大稳定。并且树莓派性能不高,无法开设一些高负载服务。另外,树莓派作为路由常年开启,需要考虑散热问题,虽然给使用的小风扇写了启停功能,但是启动运转时还是会有一定的噪音,较为恼人。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 0000000..9b82a0c --- /dev/null +++ b/tags/index.html @@ -0,0 +1,60 @@ + +标签 - Centaurus99 的杂物堆
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/tags/\346\240\221\350\216\223\346\264\276/index.html" "b/tags/\346\240\221\350\216\223\346\264\276/index.html" new file mode 100644 index 0000000..d0dba65 --- /dev/null +++ "b/tags/\346\240\221\350\216\223\346\264\276/index.html" @@ -0,0 +1,62 @@ + +标签: 树莓派 - Centaurus99 的杂物堆

使用树莓派和小米蓝牙温湿度计可视化宿舍温湿度变化

最近入手了一个小米蓝牙温湿度计(最便宜的 LCD 屏那款,https://pvvx.github.io/ATC_MiThermometer/),可以连米家查看温湿度,但是没有历史记录功能。于是想着能不能连树莓派记录温湿度,Google 上一搜还真有,赶紧整一套玩玩。

+

最终将小米蓝牙温湿度计刷入定制固件发送温湿度数据广播,树莓派接收广播存入 InfluxDB 数据库,然后使用 Grafana 可视化。


树莓派软路由配置 IPv6 网络

树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。


【补档】树莓派折腾记录

2021 年初的时候入手了树莓派 4b,然后暑假的时候好好折腾了一下,留下了一些零散的记录,在这里整理起来,之后哪天重建的时候还能来参考一下。

+

由于距离记录已经有一段时间了,可能有些内容会有偏差。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file diff --git "a/tags/\350\275\257\350\267\257\347\224\261/index.html" "b/tags/\350\275\257\350\267\257\347\224\261/index.html" new file mode 100644 index 0000000..e6289e1 --- /dev/null +++ "b/tags/\350\275\257\350\267\257\347\224\261/index.html" @@ -0,0 +1,61 @@ + +标签: 软路由 - Centaurus99 的杂物堆

基于 Proxmox VE 的 All in One 服务器搭建

树莓派挂在宿舍当软路由已经两年了,大部分情况下都挺好用,透明代理体验也还算尚可。

+

然而由于使用的 USB 无线网卡驱动支持较差,无线峰值速率只能跑到 200+ Mbps,且不大稳定。并且树莓派性能不高,无法开设一些高负载服务。另外,树莓派作为路由常年开启,需要考虑散热问题,虽然给使用的小风扇写了启停功能,但是启动运转时还是会有一定的噪音,较为恼人。


树莓派软路由配置 IPv6 网络

树莓派挂在宿舍当软路由已经一年了,当时只部署了 IPv4 下的 NAT 网络,没有 IPv6 支持显然已经过于落后了,访问纯 IPv6 网站也还得换回校园网。这两天抽空学习了一点 IPv6 相关知识,对着搜索引擎配置好了 IPv6 网络。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×

\ No newline at end of file