forked from oyd/guvenlik
parent
87ff4d547b
commit
db94d6788e
@ -1,108 +1 @@ |
|||||||
## Shadowsocks nedir? |
# Shadow Proxy |
||||||
|
|
||||||
[Shadowsocks](https://en.wikipedia.org/wiki/Shadowsocks), socks5 protokolünü temel alan bir proxy uygulamasıdır. 2012’de [Çin Halk Cumhuriyeti’nin ünlü güvenlik duvarını](https://en.wikipedia.org/wiki/Great_Firewall) aşabilmek için [Python dilinde](https://www.python.org/) geliştirilmiştir. İlerleyen zamanlarda farklı dil ve platformlarda sunucu ve istemcileri de yazılmıştır. En popülerleri; shadowsocks-rust, shadowsocks-libev ve go-shadowsocks2 yazılımlarıdır. GNU/Linux, BSD türevleri ile MacOS ve Windows işletim sistemleri için Qt5 grafik arayüz içeren [shadowsocks-qt5](https://github.com/shadowsocks/shadowsocks-qt5/releases) adında bir istemcisi vardır. Ayrıca Android, iOS ve Windows için özel yazılmış istemcileri de bulunmaktadır. Orjinal python sunucu/istemcisi PIP paket yöneticisi ile kurulabilmektedir. |
|
||||||
|
|
||||||
Shadowsocks, akan veriyi şifrelemek için [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) ve [ChaCha](https://www.cryptopp.com/wiki/ChaCha20) algoritmalarını kullanmaktadır. Ayrıca bu algoritmaların üzerine [AEAD(Authenticated Encryption with Associated Data)](https://en.wikipedia.org/wiki/Authenticated_encryption) yani "İlişkili Verilerle Kimlik Doğrulamalı Şifreleme" yapmaktadır. Bu sayede veri hem şifreli hem de doğrulanmış şekilde iletilmektedir. |
|
||||||
|
|
||||||
Shadowsocks’u diğer proxy yöntemlerinden ayrıştıran bir nokta da TCP’nin yanında UDP trafiğini de taşıyabilmesidir. Ek olarak bir eklenti sistemi de bulunmaktadır ve [v2ray](https://github.com/v2ray/v2ray-core) bu eklentilerden en popüleridir. v2ray'ın kullanım amacı akan verinin şeklini gizlemektir. Bu eklenti sayesinde akan trafik HTTP, HTTPS veya QUIC protokolleri gibi bir ağda doğal olarak beklenen trafiği taklit edebilir. |
|
||||||
|
|
||||||
|
|
||||||
## Basit bir sunucu istemci kurulumu |
|
||||||
|
|
||||||
|
|
||||||
### Sunucu tarafında |
|
||||||
|
|
||||||
Tercihinize bağlı olarak sunucunuzda bir shadowsocks yazılımını seçip çalıştırmanız gerekmektedir. Bu rehber shadowsocks-rust kurulumunu takip edecektir fakat json ayar dosyası neredeys tüm istemciler için benzer olacaktır. |
|
||||||
|
|
||||||
[github/shadowsocks-rust](https://github.com/shadowsocks/shadowsocks-rust/releases/) adresinden en güncel yayınlanmış sürümü seçip detaylarına göz gezdirin. Bu rehberin yazıldığı tarihteki en güncel sürüm v1.8.12'dir. Platformunuza göre yayınlanan bir kurulum dosyasını seçmeniz gerekmekte. Rehber GNU/Linux üzerinden ilerleyeceği için Gnu/Linux dağıtımları için derlenmiş olan dosya kullanılacaktır. |
|
||||||
|
|
||||||
Karşınıza iki seçenek çıkacaktır: Glibc ve MUSL. Tercihimiz Glibc olacak lakin bir **GNU/Linux değil Busybox/Linux dağıtımı** kullanıyorsanız **MUSL** için derlenmiş halini seçmeniz gerekecektir. |
|
||||||
|
|
||||||
"shadowsocks-v1.8.12.x86_64-unknown-linux-gnu.tar.xz" dosyasını indirdikten sonra sunucuda dosyayı açıp içindeki dört çalıştırılabilir dosyayı, komut dizinlerinden birine koyun. /usr/local/sbin/ dizinini tercih edilebilir çünkü bu dizinin amacı root yetkisi ile çalıştırılacak ama paket yöneticisi vasıtasıyla kurulmamış uygulamaları barındırmaktır. |
|
||||||
|
|
||||||
Daha sonrasında /etc/ dizini altında shadowsocks-config.json adında bir dosya oluşturup içine aşağıdakileri yazın; |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"server":"<sunucunuzun ip adresi>", |
|
||||||
"server_port": 8388, |
|
||||||
"password":"<güvenli bir parola>", |
|
||||||
"timeout":300, |
|
||||||
"method":"aes-256-gcm" |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
- *server* kalemi shadowsocks’un dinleyeceği, sunucunuzun IP adresini seçmenizi sağlar. Tek ağ kontrolcüsü olan cihazlarda tek bir IP olacağından işiniz kolay olacaktır. Eğer birden fazla ağ kontrolcünüz varsa hangisinde çalışmasını istediğinize siz karar vermelisiniz, yahut 0.0.0.0 yazarak bütün ip adreslerinizi dinlemesini sağlayabilirsiniz. |
|
||||||
|
|
||||||
- _server_port_ kalemi yazılımın kullanacağı IP adreslerinde dinlemesini istediğiniz portu belirttiğiniz yerdir, standart 8388 kullanılır. Örnek sunucumuzda önceki bölümde bahsedilen v2ray pluginini kullanıldığından 443 HTTPS portunu kullanılmakta. Böylece trafik HTTPS portuna akmak ile veri HTTPS trafiği gibi gözükmekte, dolayısıyla [DPI (derin paket incelemesi)](https://en.wikipedia.org/wiki/Deep_packet_inspection) yapan güvenlik duvarları tarafından shadowsocks takip edilememektedir. |
|
||||||
|
|
||||||
- _password_ parolanızı belirttiğiniz yer, basit bir şekilde çalıştığından ötürü güvenli bir parola kullanmanız şart. Bunun için [Zarola](https://zarola.oyd.org.tr) kullanmanızı hararetle öneririz. |
|
||||||
|
|
||||||
- _timeout_ bağlantı zaman aşımının belirlendiği ayar kalemi, 300 saniye makul bir süre. |
|
||||||
|
|
||||||
- _method_ şifreleme algoritmanız bu bölümde belirlenir, tercihimiz aes-256-gcm. Bu algoritma [256 bitlik bir anahtar kullanarak simetrik](https://en.wikipedia.org/wiki/Symmetric-key_algorithm) blok şifreleme yapan bir algoritma. Genel ihtiyaçlara yetecek kadar hızlı ve şu an desteklenen en güçlü algoritma. |
|
||||||
|
|
||||||
Bu dosyayı kaydettikten sonra servis yöneticinize bir servis yazmanız gerekmekte. Bu kısım tercihinize kalmış, lakin örnek sunucumuz systemd kullandığından systemd için basit bir servisi aşağıdaki gibi yazabilirsiniz: |
|
||||||
|
|
||||||
``` |
|
||||||
[Unit] |
|
||||||
After=network.target |
|
||||||
[Service] |
|
||||||
Type=simple |
|
||||||
User=nobody |
|
||||||
Group=nobody |
|
||||||
ExecStart=/usr/local/sbin/ssserver -c /etc/shadowsocks-config.json |
|
||||||
[Install] |
|
||||||
WantedBy=multi-user.target |
|
||||||
``` |
|
||||||
|
|
||||||
Daha sonrasında bu servisi aktif hale getirip başlangıçta çalışacak şekilde ayarlanması gerekiyor. Ardından shadowsocks sunucunuz hizmet vermeye hazır olacak. |
|
||||||
|
|
||||||
[systemd'de bu servisin aktif hale getirilmesini anlatarak katkıda bulunabilirsiniz](https:/git.oyd.org.tr) |
|
||||||
|
|
||||||
|
|
||||||
### İstemci Tarafında |
|
||||||
|
|
||||||
Teknik olarak sunucu tarafındaki ayarların aynısı istemci için de geçerli fakat ayar dosyasınun şu şekilde değiştirilmesi gerekli: |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"server":"<sunucunuzun ip adresi>", |
|
||||||
"server_port": 8388, |
|
||||||
"local_address":"<istemcinizin ip adresi>", |
|
||||||
"local_port": 1080, |
|
||||||
"password":"<güvenli bir parola>", |
|
||||||
"timeout":300, |
|
||||||
"method":"aes-256-gcm" |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
- _local_address_ kalemi istemciniz üzerinde, sslocal'ın (shadowsocks istemcinizin) dinleyecegi, programlarinizi yönlendireceginiz yerel adresin seçildiği yer. |
|
||||||
|
|
||||||
- _local_port_ kalemi, istemci olarak kullandığınız bilgisayarda, localhost’ta hangi port üzerinden socks5 yayını yapacağınının seçildiği yer. Bazı istemciler bu ayarı kullanmamakta (android istemcisi, android’in kendi VPN altyapısını kullandığından yerel bir socks5 bağlantısı yerine tüm trafiği yönetebilmekte) lakin shadowsocks-rust istemcisi ve diğer bir çok istemci bu ayarı kullanıyor. |
|
||||||
|
|
||||||
Son olarak da systemd servis dosyamı şu şekilde düzenleyin: |
|
||||||
|
|
||||||
``` |
|
||||||
[Unit] |
|
||||||
After=network.target |
|
||||||
[Service] |
|
||||||
Type=simple |
|
||||||
User=nobody |
|
||||||
Group=nobody |
|
||||||
ExecStart=/usr/local/sbin/sslocal -c /etc/shadowsocks-config.json |
|
||||||
[Install] |
|
||||||
WantedBy=multi-user.target |
|
||||||
``` |
|
||||||
|
|
||||||
Ve hepsi bu kadar! Artık socks5 destekleyen yazılımlarınızı shadowsocks proxy’si üzerinden internete, farklı bir noktadan çıkartabilirsiniz. Örnek olarak Firefox, Thunderbird ve Telegram uygulamaları üzerinde bu proxy’i kullanabilirsiniz. |
|
||||||
|
|
||||||
Eğer bütün trafiğinizi shadowsocks üzerinden yönlendirmek isterseniz iptables ve redsocks uygulamaları ile bunu sağlayabilirsiniz. |
|
||||||
|
|
||||||
[iptables ve redsocks ile yönlendirme yapılmasını anlatarak bu rehbere katkı verebilirsiniz.](https://git.oyd.org.tr) |
|
||||||
|
|
||||||
Android temelli cihazlar üzerinde de shadowsocks kullanılabilir. Android VPN ayarlarından "Sürekli VPN modu" etkinleştirilerek bağlantının sürekliliği sağlanabilir.Bu sayede cihazdan geçen bütün trafik sunucunuz üzerinden internete çıkar, güvenli olmayan ağlarda iletişiminiz takip edilemez ve bütün trafik tek bir IP adresine doğru gözükür. |
|
||||||
|
|
||||||
Shadowsocks belki Çin Halk Cumhuriyeti devleti tarafından erişimi engellenmeye çalışılan, önlem geliştirilen ve kısıtlanan bir yazılım olabilir ancak aktif geliştirici kitlesi, eklentileri ve genel basitliği ile sadece Çin vatandaşları tarafından değil aynı zamanda diğer bütün dünya vatandaşları tarafından da tercih edilesi bir noktaya gelmiştir. |
|
||||||
|
|
||||||
Güncelliğini farklı dil ve platformlarda koruyan ciddi bir geliştirici kitlesi bulunmakta ve aktif kullanıcı sayısı ile güçlü bir proxy yazılımı olan Shadowsocks kitlesel gözetime karşı etkili bir araçtır. |
|
||||||
|
@ -0,0 +1,108 @@ |
|||||||
|
## Shadowsocks nedir? |
||||||
|
|
||||||
|
[Shadowsocks](https://en.wikipedia.org/wiki/Shadowsocks), socks5 protokolünü temel alan bir proxy uygulamasıdır. 2012’de [Çin Halk Cumhuriyeti’nin ünlü güvenlik duvarını](https://en.wikipedia.org/wiki/Great_Firewall) aşabilmek için [Python dilinde](https://www.python.org/) geliştirilmiştir. İlerleyen zamanlarda farklı dil ve platformlarda sunucu ve istemcileri de yazılmıştır. En popülerleri; shadowsocks-rust, shadowsocks-libev ve go-shadowsocks2 yazılımlarıdır. GNU/Linux, BSD türevleri ile MacOS ve Windows işletim sistemleri için Qt5 grafik arayüz içeren [shadowsocks-qt5](https://github.com/shadowsocks/shadowsocks-qt5/releases) adında bir istemcisi vardır. Ayrıca Android, iOS ve Windows için özel yazılmış istemcileri de bulunmaktadır. Orjinal python sunucu/istemcisi PIP paket yöneticisi ile kurulabilmektedir. |
||||||
|
|
||||||
|
Shadowsocks, akan veriyi şifrelemek için [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) ve [ChaCha](https://www.cryptopp.com/wiki/ChaCha20) algoritmalarını kullanmaktadır. Ayrıca bu algoritmaların üzerine [AEAD(Authenticated Encryption with Associated Data)](https://en.wikipedia.org/wiki/Authenticated_encryption) yani "İlişkili Verilerle Kimlik Doğrulamalı Şifreleme" yapmaktadır. Bu sayede veri hem şifreli hem de doğrulanmış şekilde iletilmektedir. |
||||||
|
|
||||||
|
Shadowsocks’u diğer proxy yöntemlerinden ayrıştıran bir nokta da TCP’nin yanında UDP trafiğini de taşıyabilmesidir. Ek olarak bir eklenti sistemi de bulunmaktadır ve [v2ray](https://github.com/v2ray/v2ray-core) bu eklentilerden en popüleridir. v2ray'ın kullanım amacı akan verinin şeklini gizlemektir. Bu eklenti sayesinde akan trafik HTTP, HTTPS veya QUIC protokolleri gibi bir ağda doğal olarak beklenen trafiği taklit edebilir. |
||||||
|
|
||||||
|
|
||||||
|
## Basit bir sunucu istemci kurulumu |
||||||
|
|
||||||
|
|
||||||
|
### Sunucu tarafında |
||||||
|
|
||||||
|
Tercihinize bağlı olarak sunucunuzda bir shadowsocks yazılımını seçip çalıştırmanız gerekmektedir. Bu rehber shadowsocks-rust kurulumunu takip edecektir fakat json ayar dosyası neredeys tüm istemciler için benzer olacaktır. |
||||||
|
|
||||||
|
[github/shadowsocks-rust](https://github.com/shadowsocks/shadowsocks-rust/releases/) adresinden en güncel yayınlanmış sürümü seçip detaylarına göz gezdirin. Bu rehberin yazıldığı tarihteki en güncel sürüm v1.8.12'dir. Platformunuza göre yayınlanan bir kurulum dosyasını seçmeniz gerekmekte. Rehber GNU/Linux üzerinden ilerleyeceği için Gnu/Linux dağıtımları için derlenmiş olan dosya kullanılacaktır. |
||||||
|
|
||||||
|
Karşınıza iki seçenek çıkacaktır: Glibc ve MUSL. Tercihimiz Glibc olacak lakin bir **GNU/Linux değil Busybox/Linux dağıtımı** kullanıyorsanız **MUSL** için derlenmiş halini seçmeniz gerekecektir. |
||||||
|
|
||||||
|
"shadowsocks-v1.8.12.x86_64-unknown-linux-gnu.tar.xz" dosyasını indirdikten sonra sunucuda dosyayı açıp içindeki dört çalıştırılabilir dosyayı, komut dizinlerinden birine koyun. /usr/local/sbin/ dizinini tercih edilebilir çünkü bu dizinin amacı root yetkisi ile çalıştırılacak ama paket yöneticisi vasıtasıyla kurulmamış uygulamaları barındırmaktır. |
||||||
|
|
||||||
|
Daha sonrasında /etc/ dizini altında shadowsocks-config.json adında bir dosya oluşturup içine aşağıdakileri yazın; |
||||||
|
|
||||||
|
```json |
||||||
|
{ |
||||||
|
"server":"<sunucunuzun ip adresi>", |
||||||
|
"server_port": 8388, |
||||||
|
"password":"<güvenli bir parola>", |
||||||
|
"timeout":300, |
||||||
|
"method":"aes-256-gcm" |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
- *server* kalemi shadowsocks’un dinleyeceği, sunucunuzun IP adresini seçmenizi sağlar. Tek ağ kontrolcüsü olan cihazlarda tek bir IP olacağından işiniz kolay olacaktır. Eğer birden fazla ağ kontrolcünüz varsa hangisinde çalışmasını istediğinize siz karar vermelisiniz, yahut 0.0.0.0 yazarak bütün ip adreslerinizi dinlemesini sağlayabilirsiniz. |
||||||
|
|
||||||
|
- _server_port_ kalemi yazılımın kullanacağı IP adreslerinde dinlemesini istediğiniz portu belirttiğiniz yerdir, standart 8388 kullanılır. Örnek sunucumuzda önceki bölümde bahsedilen v2ray pluginini kullanıldığından 443 HTTPS portunu kullanılmakta. Böylece trafik HTTPS portuna akmak ile veri HTTPS trafiği gibi gözükmekte, dolayısıyla [DPI (derin paket incelemesi)](https://en.wikipedia.org/wiki/Deep_packet_inspection) yapan güvenlik duvarları tarafından shadowsocks takip edilememektedir. |
||||||
|
|
||||||
|
- _password_ parolanızı belirttiğiniz yer, basit bir şekilde çalıştığından ötürü güvenli bir parola kullanmanız şart. Bunun için [Zarola](https://zarola.oyd.org.tr) kullanmanızı hararetle öneririz. |
||||||
|
|
||||||
|
- _timeout_ bağlantı zaman aşımının belirlendiği ayar kalemi, 300 saniye makul bir süre. |
||||||
|
|
||||||
|
- _method_ şifreleme algoritmanız bu bölümde belirlenir, tercihimiz aes-256-gcm. Bu algoritma [256 bitlik bir anahtar kullanarak simetrik](https://en.wikipedia.org/wiki/Symmetric-key_algorithm) blok şifreleme yapan bir algoritma. Genel ihtiyaçlara yetecek kadar hızlı ve şu an desteklenen en güçlü algoritma. |
||||||
|
|
||||||
|
Bu dosyayı kaydettikten sonra servis yöneticinize bir servis yazmanız gerekmekte. Bu kısım tercihinize kalmış, lakin örnek sunucumuz systemd kullandığından systemd için basit bir servisi aşağıdaki gibi yazabilirsiniz: |
||||||
|
|
||||||
|
``` |
||||||
|
[Unit] |
||||||
|
After=network.target |
||||||
|
[Service] |
||||||
|
Type=simple |
||||||
|
User=nobody |
||||||
|
Group=nobody |
||||||
|
ExecStart=/usr/local/sbin/ssserver -c /etc/shadowsocks-config.json |
||||||
|
[Install] |
||||||
|
WantedBy=multi-user.target |
||||||
|
``` |
||||||
|
|
||||||
|
Daha sonrasında bu servisi aktif hale getirip başlangıçta çalışacak şekilde ayarlanması gerekiyor. Ardından shadowsocks sunucunuz hizmet vermeye hazır olacak. |
||||||
|
|
||||||
|
[systemd'de bu servisin aktif hale getirilmesini anlatarak katkıda bulunabilirsiniz](https:/git.oyd.org.tr) |
||||||
|
|
||||||
|
|
||||||
|
### İstemci Tarafında |
||||||
|
|
||||||
|
Teknik olarak sunucu tarafındaki ayarların aynısı istemci için de geçerli fakat ayar dosyasınun şu şekilde değiştirilmesi gerekli: |
||||||
|
|
||||||
|
```json |
||||||
|
{ |
||||||
|
"server":"<sunucunuzun ip adresi>", |
||||||
|
"server_port": 8388, |
||||||
|
"local_address":"<istemcinizin ip adresi>", |
||||||
|
"local_port": 1080, |
||||||
|
"password":"<güvenli bir parola>", |
||||||
|
"timeout":300, |
||||||
|
"method":"aes-256-gcm" |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
- _local_address_ kalemi istemciniz üzerinde, sslocal'ın (shadowsocks istemcinizin) dinleyecegi, programlarinizi yönlendireceginiz yerel adresin seçildiği yer. |
||||||
|
|
||||||
|
- _local_port_ kalemi, istemci olarak kullandığınız bilgisayarda, localhost’ta hangi port üzerinden socks5 yayını yapacağınının seçildiği yer. Bazı istemciler bu ayarı kullanmamakta (android istemcisi, android’in kendi VPN altyapısını kullandığından yerel bir socks5 bağlantısı yerine tüm trafiği yönetebilmekte) lakin shadowsocks-rust istemcisi ve diğer bir çok istemci bu ayarı kullanıyor. |
||||||
|
|
||||||
|
Son olarak da systemd servis dosyamı şu şekilde düzenleyin: |
||||||
|
|
||||||
|
``` |
||||||
|
[Unit] |
||||||
|
After=network.target |
||||||
|
[Service] |
||||||
|
Type=simple |
||||||
|
User=nobody |
||||||
|
Group=nobody |
||||||
|
ExecStart=/usr/local/sbin/sslocal -c /etc/shadowsocks-config.json |
||||||
|
[Install] |
||||||
|
WantedBy=multi-user.target |
||||||
|
``` |
||||||
|
|
||||||
|
Ve hepsi bu kadar! Artık socks5 destekleyen yazılımlarınızı shadowsocks proxy’si üzerinden internete, farklı bir noktadan çıkartabilirsiniz. Örnek olarak Firefox, Thunderbird ve Telegram uygulamaları üzerinde bu proxy’i kullanabilirsiniz. |
||||||
|
|
||||||
|
Eğer bütün trafiğinizi shadowsocks üzerinden yönlendirmek isterseniz iptables ve redsocks uygulamaları ile bunu sağlayabilirsiniz. |
||||||
|
|
||||||
|
[iptables ve redsocks ile yönlendirme yapılmasını anlatarak bu rehbere katkı verebilirsiniz.](https://git.oyd.org.tr) |
||||||
|
|
||||||
|
Android temelli cihazlar üzerinde de shadowsocks kullanılabilir. Android VPN ayarlarından "Sürekli VPN modu" etkinleştirilerek bağlantının sürekliliği sağlanabilir.Bu sayede cihazdan geçen bütün trafik sunucunuz üzerinden internete çıkar, güvenli olmayan ağlarda iletişiminiz takip edilemez ve bütün trafik tek bir IP adresine doğru gözükür. |
||||||
|
|
||||||
|
Shadowsocks belki Çin Halk Cumhuriyeti devleti tarafından erişimi engellenmeye çalışılan, önlem geliştirilen ve kısıtlanan bir yazılım olabilir ancak aktif geliştirici kitlesi, eklentileri ve genel basitliği ile sadece Çin vatandaşları tarafından değil aynı zamanda diğer bütün dünya vatandaşları tarafından da tercih edilesi bir noktaya gelmiştir. |
||||||
|
|
||||||
|
Güncelliğini farklı dil ve platformlarda koruyan ciddi bir geliştirici kitlesi bulunmakta ve aktif kullanıcı sayısı ile güçlü bir proxy yazılımı olan Shadowsocks kitlesel gözetime karşı etkili bir araçtır. |
@ -0,0 +1,495 @@ |
|||||||
|
/* CSS for UI elements (a.k.a. chrome) */ |
||||||
|
|
||||||
|
@import 'variables.css'; |
||||||
|
|
||||||
|
::-webkit-scrollbar { |
||||||
|
background: var(--bg); |
||||||
|
} |
||||||
|
::-webkit-scrollbar-thumb { |
||||||
|
background: var(--scrollbar); |
||||||
|
} |
||||||
|
html { |
||||||
|
scrollbar-color: var(--scrollbar) var(--bg); |
||||||
|
} |
||||||
|
#searchresults a, |
||||||
|
.content a:link, |
||||||
|
a:visited, |
||||||
|
a > .hljs { |
||||||
|
color: var(--links); |
||||||
|
} |
||||||
|
|
||||||
|
/* Menu Bar */ |
||||||
|
|
||||||
|
#menu-bar, |
||||||
|
#menu-bar-hover-placeholder { |
||||||
|
z-index: 101; |
||||||
|
margin: auto calc(0px - var(--page-padding)); |
||||||
|
} |
||||||
|
#menu-bar { |
||||||
|
position: relative; |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
background-color: var(--bg); |
||||||
|
border-bottom-color: var(--bg); |
||||||
|
border-bottom-width: 1px; |
||||||
|
border-bottom-style: solid; |
||||||
|
} |
||||||
|
#menu-bar.sticky, |
||||||
|
.js #menu-bar-hover-placeholder:hover + #menu-bar, |
||||||
|
.js #menu-bar:hover, |
||||||
|
.js.sidebar-visible #menu-bar { |
||||||
|
position: -webkit-sticky; |
||||||
|
position: sticky; |
||||||
|
top: 0 !important; |
||||||
|
} |
||||||
|
#menu-bar-hover-placeholder { |
||||||
|
position: sticky; |
||||||
|
position: -webkit-sticky; |
||||||
|
top: 0; |
||||||
|
height: var(--menu-bar-height); |
||||||
|
} |
||||||
|
#menu-bar.bordered { |
||||||
|
border-bottom-color: var(--table-border-color); |
||||||
|
} |
||||||
|
#menu-bar i, #menu-bar .icon-button { |
||||||
|
position: relative; |
||||||
|
padding: 0 8px; |
||||||
|
z-index: 10; |
||||||
|
line-height: var(--menu-bar-height); |
||||||
|
cursor: pointer; |
||||||
|
transition: color 0.5s; |
||||||
|
} |
||||||
|
@media only screen and (max-width: 420px) { |
||||||
|
#menu-bar i, #menu-bar .icon-button { |
||||||
|
padding: 0 5px; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.icon-button { |
||||||
|
border: none; |
||||||
|
background: none; |
||||||
|
padding: 0; |
||||||
|
color: inherit; |
||||||
|
} |
||||||
|
.icon-button i { |
||||||
|
margin: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.right-buttons { |
||||||
|
margin: 0 15px; |
||||||
|
} |
||||||
|
.right-buttons a { |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
.left-buttons { |
||||||
|
display: flex; |
||||||
|
margin: 0 5px; |
||||||
|
} |
||||||
|
.no-js .left-buttons { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.menu-title { |
||||||
|
display: inline-block; |
||||||
|
font-weight: 200; |
||||||
|
font-size: 2rem; |
||||||
|
line-height: var(--menu-bar-height); |
||||||
|
text-align: center; |
||||||
|
margin: 0; |
||||||
|
flex: 1; |
||||||
|
white-space: nowrap; |
||||||
|
overflow: hidden; |
||||||
|
text-overflow: ellipsis; |
||||||
|
} |
||||||
|
.js .menu-title { |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
.menu-bar, |
||||||
|
.menu-bar:visited, |
||||||
|
.nav-chapters, |
||||||
|
.nav-chapters:visited, |
||||||
|
.mobile-nav-chapters, |
||||||
|
.mobile-nav-chapters:visited, |
||||||
|
.menu-bar .icon-button, |
||||||
|
.menu-bar a i { |
||||||
|
color: var(--icons); |
||||||
|
} |
||||||
|
|
||||||
|
.menu-bar i:hover, |
||||||
|
.menu-bar .icon-button:hover, |
||||||
|
.nav-chapters:hover, |
||||||
|
.mobile-nav-chapters i:hover { |
||||||
|
color: var(--icons-hover); |
||||||
|
} |
||||||
|
|
||||||
|
/* Nav Icons */ |
||||||
|
|
||||||
|
.nav-chapters { |
||||||
|
font-size: 2.5em; |
||||||
|
text-align: center; |
||||||
|
text-decoration: none; |
||||||
|
|
||||||
|
position: fixed; |
||||||
|
top: 0; |
||||||
|
bottom: 0; |
||||||
|
margin: 0; |
||||||
|
max-width: 150px; |
||||||
|
min-width: 90px; |
||||||
|
|
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
align-content: center; |
||||||
|
flex-direction: column; |
||||||
|
|
||||||
|
transition: color 0.5s, background-color 0.5s; |
||||||
|
} |
||||||
|
|
||||||
|
.nav-chapters:hover { |
||||||
|
text-decoration: none; |
||||||
|
background-color: var(--theme-hover); |
||||||
|
transition: background-color 0.15s, color 0.15s; |
||||||
|
} |
||||||
|
|
||||||
|
.nav-wrapper { |
||||||
|
margin-top: 50px; |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.mobile-nav-chapters { |
||||||
|
font-size: 2.5em; |
||||||
|
text-align: center; |
||||||
|
text-decoration: none; |
||||||
|
width: 90px; |
||||||
|
border-radius: 5px; |
||||||
|
background-color: var(--sidebar-bg); |
||||||
|
} |
||||||
|
|
||||||
|
.previous { |
||||||
|
float: left; |
||||||
|
} |
||||||
|
|
||||||
|
.next { |
||||||
|
float: right; |
||||||
|
right: var(--page-padding); |
||||||
|
} |
||||||
|
|
||||||
|
@media only screen and (max-width: 1080px) { |
||||||
|
.nav-wide-wrapper { display: none; } |
||||||
|
.nav-wrapper { display: block; } |
||||||
|
} |
||||||
|
|
||||||
|
@media only screen and (max-width: 1380px) { |
||||||
|
.sidebar-visible .nav-wide-wrapper { display: none; } |
||||||
|
.sidebar-visible .nav-wrapper { display: block; } |
||||||
|
} |
||||||
|
|
||||||
|
/* Inline code */ |
||||||
|
|
||||||
|
:not(pre) > .hljs { |
||||||
|
display: inline; |
||||||
|
padding: 0.1em 0.3em; |
||||||
|
border-radius: 3px; |
||||||
|
} |
||||||
|
|
||||||
|
:not(pre):not(a) > .hljs { |
||||||
|
color: var(--inline-code-color); |
||||||
|
overflow-x: initial; |
||||||
|
} |
||||||
|
|
||||||
|
a:hover > .hljs { |
||||||
|
text-decoration: underline; |
||||||
|
} |
||||||
|
|
||||||
|
pre { |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
pre > .buttons { |
||||||
|
position: absolute; |
||||||
|
z-index: 100; |
||||||
|
right: 5px; |
||||||
|
top: 5px; |
||||||
|
|
||||||
|
color: var(--sidebar-fg); |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
pre > .buttons :hover { |
||||||
|
color: var(--sidebar-active); |
||||||
|
} |
||||||
|
pre > .buttons i { |
||||||
|
margin-left: 8px; |
||||||
|
} |
||||||
|
pre > .buttons button { |
||||||
|
color: inherit; |
||||||
|
background: transparent; |
||||||
|
border: none; |
||||||
|
cursor: inherit; |
||||||
|
} |
||||||
|
pre > .result { |
||||||
|
margin-top: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Search */ |
||||||
|
|
||||||
|
#searchresults a { |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
mark { |
||||||
|
border-radius: 2px; |
||||||
|
padding: 0 3px 1px 3px; |
||||||
|
margin: 0 -3px -1px -3px; |
||||||
|
background-color: var(--search-mark-bg); |
||||||
|
transition: background-color 300ms linear; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
mark.fade-out { |
||||||
|
background-color: rgba(0,0,0,0) !important; |
||||||
|
cursor: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.searchbar-outer { |
||||||
|
margin-left: auto; |
||||||
|
margin-right: auto; |
||||||
|
max-width: var(--content-max-width); |
||||||
|
} |
||||||
|
|
||||||
|
#searchbar { |
||||||
|
width: 100%; |
||||||
|
margin: 5px auto 0px auto; |
||||||
|
padding: 10px 16px; |
||||||
|
transition: box-shadow 300ms ease-in-out; |
||||||
|
border: 1px solid var(--searchbar-border-color); |
||||||
|
border-radius: 3px; |
||||||
|
background-color: var(--searchbar-bg); |
||||||
|
color: var(--searchbar-fg); |
||||||
|
} |
||||||
|
#searchbar:focus, |
||||||
|
#searchbar.active { |
||||||
|
box-shadow: 0 0 3px var(--searchbar-shadow-color); |
||||||
|
} |
||||||
|
|
||||||
|
.searchresults-header { |
||||||
|
font-weight: bold; |
||||||
|
font-size: 1em; |
||||||
|
padding: 18px 0 0 5px; |
||||||
|
color: var(--searchresults-header-fg); |
||||||
|
} |
||||||
|
|
||||||
|
.searchresults-outer { |
||||||
|
margin-left: auto; |
||||||
|
margin-right: auto; |
||||||
|
max-width: var(--content-max-width); |
||||||
|
border-bottom: 1px dashed var(--searchresults-border-color); |
||||||
|
} |
||||||
|
|
||||||
|
ul#searchresults { |
||||||
|
list-style: none; |
||||||
|
padding-left: 20px; |
||||||
|
} |
||||||
|
ul#searchresults li { |
||||||
|
margin: 10px 0px; |
||||||
|
padding: 2px; |
||||||
|
border-radius: 2px; |
||||||
|
} |
||||||
|
ul#searchresults li.focus { |
||||||
|
background-color: var(--searchresults-li-bg); |
||||||
|
} |
||||||
|
ul#searchresults span.teaser { |
||||||
|
display: block; |
||||||
|
clear: both; |
||||||
|
margin: 5px 0 0 20px; |
||||||
|
font-size: 0.8em; |
||||||
|
} |
||||||
|
ul#searchresults span.teaser em { |
||||||
|
font-weight: bold; |
||||||
|
font-style: normal; |
||||||
|
} |
||||||
|
|
||||||
|
/* Sidebar */ |
||||||
|
|
||||||
|
.sidebar { |
||||||
|
position: fixed; |
||||||
|
left: 0; |
||||||
|
top: 0; |
||||||
|
bottom: 0; |
||||||
|
width: var(--sidebar-width); |
||||||
|
font-size: 0.875em; |
||||||
|
box-sizing: border-box; |
||||||
|
-webkit-overflow-scrolling: touch; |
||||||
|
overscroll-behavior-y: contain; |
||||||
|
background-color: var(--sidebar-bg); |
||||||
|
color: var(--sidebar-fg); |
||||||
|
} |
||||||
|
.sidebar-resizing { |
||||||
|
-moz-user-select: none; |
||||||
|
-webkit-user-select: none; |
||||||
|
-ms-user-select: none; |
||||||
|
user-select: none; |
||||||
|
} |
||||||
|
.js:not(.sidebar-resizing) .sidebar { |
||||||
|
transition: transform 0.3s; /* Animation: slide away */ |
||||||
|
} |
||||||
|
.sidebar code { |
||||||
|
line-height: 2em; |
||||||
|
} |
||||||
|
.sidebar .sidebar-scrollbox { |
||||||
|
overflow-y: auto; |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
bottom: 0; |
||||||
|
left: 0; |
||||||
|
right: 0; |
||||||
|
padding: 10px 10px; |
||||||
|
} |
||||||
|
.sidebar .sidebar-resize-handle { |
||||||
|
position: absolute; |
||||||
|
cursor: col-resize; |
||||||
|
width: 0; |
||||||
|
right: 0; |
||||||
|
top: 0; |
||||||
|
bottom: 0; |
||||||
|
} |
||||||
|
.js .sidebar .sidebar-resize-handle { |
||||||
|
cursor: col-resize; |
||||||
|
width: 5px; |
||||||
|
} |
||||||
|
.sidebar-hidden .sidebar { |
||||||
|
transform: translateX(calc(0px - var(--sidebar-width))); |
||||||
|
} |
||||||
|
.sidebar::-webkit-scrollbar { |
||||||
|
background: var(--sidebar-bg); |
||||||
|
} |
||||||
|
.sidebar::-webkit-scrollbar-thumb { |
||||||
|
background: var(--scrollbar); |
||||||
|
} |
||||||
|
|
||||||
|
.sidebar-visible .page-wrapper { |
||||||
|
transform: translateX(var(--sidebar-width)); |
||||||
|
} |
||||||
|
@media only screen and (min-width: 620px) { |
||||||
|
.sidebar-visible .page-wrapper { |
||||||
|
transform: none; |
||||||
|
margin-left: var(--sidebar-width); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.chapter { |
||||||
|
list-style: none outside none; |
||||||
|
padding-left: 0; |
||||||
|
line-height: 2.2em; |
||||||
|
} |
||||||
|
|
||||||
|
.chapter ol { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.chapter li { |
||||||
|
display: flex; |
||||||
|
color: var(--sidebar-non-existant); |
||||||
|
} |
||||||
|
.chapter li a { |
||||||
|
display: block; |
||||||
|
padding: 0; |
||||||
|
text-decoration: none; |
||||||
|
color: var(--sidebar-fg); |
||||||
|
} |
||||||
|
|
||||||
|
.chapter li a:hover { |
||||||
|
color: var(--sidebar-active); |
||||||
|
} |
||||||
|
|
||||||
|
.chapter li a.active { |
||||||
|
color: var(--sidebar-active); |
||||||
|
} |
||||||
|
|
||||||
|
.chapter li > a.toggle { |
||||||
|
cursor: pointer; |
||||||
|
display: block; |
||||||
|
margin-left: auto; |
||||||
|
padding: 0 10px; |
||||||
|
user-select: none; |
||||||
|
opacity: 0.68; |
||||||
|
} |
||||||
|
|
||||||
|
.chapter li > a.toggle div { |
||||||
|
transition: transform 0.5s; |
||||||
|
} |
||||||
|
|
||||||
|
/* collapse the section */ |
||||||
|
.chapter li:not(.expanded) + li > ol { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.chapter li.chapter-item { |
||||||
|
line-height: 1.5em; |
||||||
|
margin-top: 0.6em; |
||||||
|
} |
||||||
|
|
||||||
|
.chapter li.expanded > a.toggle div { |
||||||
|
transform: rotate(90deg); |
||||||
|
} |
||||||
|
|
||||||
|
.spacer { |
||||||
|
width: 100%; |
||||||
|
height: 3px; |
||||||
|
margin: 5px 0px; |
||||||
|
} |
||||||
|
.chapter .spacer { |
||||||
|
background-color: var(--sidebar-spacer); |
||||||
|
} |
||||||
|
|
||||||
|
@media (-moz-touch-enabled: 1), (pointer: coarse) { |
||||||
|
.chapter li a { padding: 5px 0; } |
||||||
|
.spacer { margin: 10px 0; } |
||||||
|
} |
||||||
|
|
||||||
|
.section { |
||||||
|
list-style: none outside none; |
||||||
|
padding-left: 20px; |
||||||
|
line-height: 1.9em; |
||||||
|
} |
||||||
|
|
||||||
|
/* Theme Menu Popup */ |
||||||
|
|
||||||
|
.theme-popup { |
||||||
|
position: absolute; |
||||||
|
left: 10px; |
||||||
|
top: var(--menu-bar-height); |
||||||
|
z-index: 1000; |
||||||
|
border-radius: 4px; |
||||||
|
font-size: 0.7em; |
||||||
|
color: var(--fg); |
||||||
|
background: var(--theme-popup-bg); |
||||||
|
border: 1px solid var(--theme-popup-border); |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
list-style: none; |
||||||
|
display: none; |
||||||
|
} |
||||||
|
.theme-popup .default { |
||||||
|
color: var(--icons); |
||||||
|
} |
||||||
|
.theme-popup .theme { |
||||||
|
width: 100%; |
||||||
|
border: 0; |
||||||
|
margin: 0; |
||||||
|
padding: 2px 10px; |
||||||
|
line-height: 25px; |
||||||
|
white-space: nowrap; |
||||||
|
text-align: left; |
||||||
|
cursor: pointer; |
||||||
|
color: inherit; |
||||||
|
background: inherit; |
||||||
|
font-size: inherit; |
||||||
|
} |
||||||
|
.theme-popup .theme:hover { |
||||||
|
background-color: var(--theme-hover); |
||||||
|
} |
||||||
|
.theme-popup .theme:hover:first-child, |
||||||
|
.theme-popup .theme:hover:last-child { |
||||||
|
border-top-left-radius: inherit; |
||||||
|
border-top-right-radius: inherit; |
||||||
|
} |
@ -0,0 +1,174 @@ |
|||||||
|
/* Base styles and content styles */ |
||||||
|
|
||||||
|
@import 'variables.css'; |
||||||
|
|
||||||
|
:root { |
||||||
|
/* Browser default font-size is 16px, this way 1 rem = 10px */ |
||||||
|
font-size: 62.5%; |
||||||
|
} |
||||||
|
|
||||||
|
html { |
||||||
|
font-family: "Open Sans", sans-serif; |
||||||
|
color: var(--fg); |
||||||
|
background-color: var(--bg); |
||||||
|
text-size-adjust: none; |
||||||
|
} |
||||||
|
|
||||||
|
body { |
||||||
|
margin: 0; |
||||||
|
font-size: 1.6rem; |
||||||
|
overflow-x: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
code { |
||||||
|
font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; |
||||||
|
font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */ |
||||||
|
} |
||||||
|
|
||||||
|
/* Don't change font size in headers. */ |
||||||
|
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { |
||||||
|
font-size: unset; |
||||||
|
} |
||||||
|
|
||||||
|
.left { float: left; } |
||||||
|
.right { float: right; } |
||||||
|
.boring { opacity: 0.6; } |
||||||
|
.hide-boring .boring { display: none; } |
||||||
|
.hidden { display: none !important; } |
||||||
|
|
||||||
|
h2, h3 { margin-top: 2.5em; } |
||||||
|
h4, h5 { margin-top: 2em; } |
||||||
|
|
||||||
|
.header + .header h3, |
||||||
|
.header + .header h4, |
||||||
|
.header + .header h5 { |
||||||
|
margin-top: 1em; |
||||||
|
} |
||||||
|
|
||||||
|
h1 a.header:target::before, |
||||||
|
h2 a.header:target::before, |
||||||
|
h3 a.header:target::before, |
||||||
|
h4 a.header:target::before { |
||||||
|
display: inline-block; |
||||||
|
content: "»"; |
||||||
|
margin-left: -30px; |
||||||
|
width: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
h1 a.header:target, |
||||||
|
h2 a.header:target, |
||||||
|
h3 a.header:target, |
||||||
|
h4 a.header:target { |
||||||
|
scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); |
||||||
|
} |
||||||
|
|
||||||
|
.page { |
||||||
|
outline: 0; |
||||||
|
padding: 0 var(--page-padding); |
||||||
|
margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ |
||||||
|
} |
||||||
|
.page-wrapper { |
||||||
|
box-sizing: border-box; |
||||||
|
} |
||||||
|
.js:not(.sidebar-resizing) .page-wrapper { |
||||||
|
transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ |
||||||
|
} |
||||||
|
|
||||||
|
.content { |
||||||
|
overflow-y: auto; |
||||||
|
padding: 0 15px; |
||||||
|
padding-bottom: 50px; |
||||||
|
} |
||||||
|
.content main { |
||||||
|
margin-left: auto; |
||||||
|
margin-right: auto; |
||||||
|
max-width: var(--content-max-width); |
||||||
|
} |
||||||
|
.content p { line-height: 1.45em; } |
||||||
|
.content ol { line-height: 1.45em; } |
||||||
|
.content ul { line-height: 1.45em; } |
||||||
|
.content a { text-decoration: none; } |
||||||
|
.content a:hover { text-decoration: underline; } |
||||||
|
.content img { max-width: 100%; } |
||||||
|
.content .header:link, |
||||||
|
.content .header:visited { |
||||||
|
color: var(--fg); |
||||||
|
} |
||||||
|
.content .header:link, |
||||||
|
.content .header:visited:hover { |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
table { |
||||||
|
margin: 0 auto; |
||||||
|
border-collapse: collapse; |
||||||
|
} |
||||||
|
table td { |
||||||
|
padding: 3px 20px; |
||||||
|
border: 1px var(--table-border-color) solid; |
||||||
|
} |
||||||
|
table thead { |
||||||
|
background: var(--table-header-bg); |
||||||
|
} |
||||||
|
table thead td { |
||||||
|
font-weight: 700; |
||||||
|
border: none; |
||||||
|
} |
||||||
|
table thead th { |
||||||
|
padding: 3px 20px; |
||||||
|
} |
||||||
|
table thead tr { |
||||||
|
border: 1px var(--table-header-bg) solid; |
||||||
|
} |
||||||
|
/* Alternate background colors for rows */ |
||||||
|
table tbody tr:nth-child(2n) { |
||||||
|
background: var(--table-alternate-bg); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
blockquote { |
||||||
|
margin: 20px 0; |
||||||
|
padding: 0 20px; |
||||||
|
color: var(--fg); |
||||||
|
background-color: var(--quote-bg); |
||||||
|
border-top: .1em solid var(--quote-border); |
||||||
|
border-bottom: .1em solid var(--quote-border); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
:not(.footnote-definition) + .footnote-definition, |
||||||
|
.footnote-definition + :not(.footnote-definition) { |
||||||
|
margin-top: 2em; |
||||||
|
} |
||||||
|
.footnote-definition { |
||||||
|
font-size: 0.9em; |
||||||
|
margin: 0.5em 0; |
||||||
|
} |
||||||
|
.footnote-definition p { |
||||||
|
display: inline; |
||||||
|
} |
||||||
|
|
||||||
|
.tooltiptext { |
||||||
|
position: absolute; |
||||||
|
visibility: hidden; |
||||||
|
color: #fff; |
||||||
|
background-color: #333; |
||||||
|
transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ |
||||||
|
left: -8px; /* Half of the width of the icon */ |
||||||
|
top: -35px; |
||||||
|
font-size: 0.8em; |
||||||
|
text-align: center; |
||||||
|
border-radius: 6px; |
||||||
|
padding: 5px 8px; |
||||||
|
margin: 5px; |
||||||
|
z-index: 1000; |
||||||
|
} |
||||||
|
.tooltipped .tooltiptext { |
||||||
|
visibility: visible; |
||||||
|
} |
||||||
|
|
||||||
|
.chapter li.part-title { |
||||||
|
color: var(--sidebar-fg); |
||||||
|
margin: 5px 0px; |
||||||
|
font-weight: bold; |
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
|
||||||
|
#sidebar, |
||||||
|
#menu-bar, |
||||||
|
.nav-chapters, |
||||||
|
.mobile-nav-chapters { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
#page-wrapper.page-wrapper { |
||||||
|
transform: none; |
||||||
|
margin-left: 0px; |
||||||
|
overflow-y: initial; |
||||||
|
} |
||||||
|
|
||||||
|
#content { |
||||||
|
max-width: none; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.page { |
||||||
|
overflow-y: initial; |
||||||
|
} |
||||||
|
|
||||||
|
code { |
||||||
|
background-color: #666666; |
||||||
|
border-radius: 5px; |
||||||
|
|
||||||
|
/* Force background to be printed in Chrome */ |
||||||
|
-webkit-print-color-adjust: exact; |
||||||
|
} |
||||||
|
|
||||||
|
pre > .buttons { |
||||||
|
z-index: 2; |
||||||
|
} |
||||||
|
|
||||||
|
a, a:visited, a:active, a:hover { |
||||||
|
color: #4183c4; |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 { |
||||||
|
page-break-inside: avoid; |
||||||
|
page-break-after: avoid; |
||||||
|
} |
||||||
|
|
||||||
|
pre, code { |
||||||
|
page-break-inside: avoid; |
||||||
|
white-space: pre-wrap; |
||||||
|
} |
||||||
|
|
||||||
|
.fa { |
||||||
|
display: none !important; |
||||||
|
} |
Loading…
Reference in new issue