Compare commits

...

7 commits

Author SHA1 Message Date
dependabot[bot]
5a92927d1e
Merge 70180c8426 into 865d8cc80f 2024-02-11 20:11:49 +01:00
865d8cc80f
Merge pull request #8 from LBRYFoundation/collection-layout
Collection layout
2024-02-11 20:08:47 +01:00
a34326ea00 fix link to heading not hide the heading behind the header 2024-01-25 23:25:41 +01:00
91e39ec624 make layout mobile friendly 2024-01-25 23:01:52 +01:00
b816c3598d fix lock 2024-01-25 20:21:13 +01:00
f86d82aa00 make toc a floating element 2024-01-17 18:48:17 +01:00
fe64789b8f fix toc and markdown position 2024-01-11 23:21:20 +01:00
22 changed files with 348 additions and 119 deletions

View file

@ -16,6 +16,10 @@ const isActive = (href: string)=>{
return href === pathname || href === pathname.split('/').slice(0,2).join('/'); return href === pathname || href === pathname.split('/').slice(0,2).join('/');
} }
function handleMenu(e) {
console.log(e);
}
--- ---
<header> <header>
@ -35,7 +39,24 @@ const isActive = (href: string)=>{
</div> </div>
<div class="right"> <div class="right">
<div class="search"><p>Search TODO</p></div> <div class="search"><p>Search TODO</p></div>
<btn class="menu"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></btn> <btn id="menu">
<span></span>
<span></span>
<span></span>
</btn>
</div> </div>
</nav> </nav>
</header> </header>
<script>
const btn = document.querySelector('#menu');
btn.addEventListener('click', () => {
btn.classList.toggle('open');
document.querySelectorAll('.sidebar').forEach(sidebar=>{
sidebar.classList.toggle('active');
})
});
</script>
<style>
</style>

View file

@ -2,24 +2,68 @@
// TableOfContents.astro // TableOfContents.astro
import TableOfContentsHeading from "./TableOfContentsHeading.astro"; import TableOfContentsHeading from "./TableOfContentsHeading.astro";
import TocItem from '../utils/generateToc.ts'; import TocItem from '../utils/generateToc.ts';
const { headings } = Astro.props; const { headings, edit } = Astro.props;
import { REPOSITORY } from "../config";
const toc = headings && headings.length ? TocItem(headings) : []; const toc = headings && headings.length ? TocItem(headings) : [];
console.log(toc);
--- ---
<nav class="toc"> <section class="toc">
<h2 id="on-this-page">On this page</h2> <div class="container">
<summary><p id="on-this-page">On this page</p></summary>
<nav>
<ul> <ul>
{toc.map((heading) => <TableOfContentsHeading heading={heading}/>)} {toc.map((heading) => <TableOfContentsHeading heading={heading}/>)}
</ul> </ul>
</nav> </nav>
<style> </div>
</section>
<style is:inline>
.toc {
width: calc(var(--sidebar-width) - 2rem);
height: 100%;
overflow-y: scroll;
/* max-height: 80%; */
/* inset-block: 0; */
transition: 0.3s;
}
.toc .container {
display: flex;
flex-direction: column;
padding: 1rem 1rem 0;
overflow-y: auto;
}
.toc .container summary {
font-weight: bold;
}
.toc .container nav {
}
.toc ul { .toc ul {
list-style: none; list-style: none;
padding-inline-start: 0; padding-inline-start: 0;
border-left: 1px solid var(--secondary-background); }
.toc .container nav > ul {
margin: 0.5rem;
border-left: 1px solid var(--background);
}
.toc ul li:hover {
font-size: 0.785rem;
}
@media only screen and (max-width: 750px) {
/* .toc {
margin-top: var(--nav-height);
margin-bottom: 0;
inset-inline-start: 0;
inset-inline-end: unset;
transform: translateX(-100%);
} */
} }
</style> </style>

View file

@ -22,7 +22,7 @@ const { heading } = Astro.props;
display: inline-block; display: inline-block;
font-size: 0.875rem; font-size: 0.875rem;
width: 100%; width: 100%;
/* margin-left: 0.3rem; */ margin-left: 0.3rem;
padding: 0.5em 0.5rem; padding: 0.5em 0.5rem;
border-radius: 0.25em; border-radius: 0.25em;
} }

View file

@ -1,4 +1,6 @@
export const AWESOME_LBRY = "https://github.com/LBRYFoundation/Awesome-LBRY"; export const AWESOME_LBRY = "https://github.com/LBRYFoundation/Awesome-LBRY";
export const EDIT_PAGE = "Edit this page";
export const REPOSITORY = "LBRYFoundation/lbry-tech";
export const features = [ export const features = [
{ {

View file

@ -4,7 +4,7 @@ description: How does signing a claim (a publish) work in LBRY-land? This page e
--- ---
Reilly wants to publish _Terror on the Midway_ to the channel he claimed `lbry://@FleischerSuperman`. He picks the name "terroronthemidway", and fills in the information for the claim: Reilly wants to publish _Terror on the Midway_ to the channel he claimed `lbry://@FleischerSuperman`. He picks the name "terroronthemidway", and fills in the information for the claim:
```json
{ {
"claimType": "streamType", "claimType": "streamType",
"stream": { "stream": {
@ -30,6 +30,7 @@ Reilly wants to publish _Terror on the Midway_ to the channel he claimed `lbry:/
}, },
"version": "_0_0_1" "version": "_0_0_1"
} }
```
This is serialized as: This is serialized as:
@ -47,10 +48,10 @@ He starts by generating an address for the new name claim:
His claim for the certificate at the uri `lbry://@FleischerSuperman` has a `claim_id` of His claim for the certificate at the uri `lbry://@FleischerSuperman` has a `claim_id` of
2996b9a087c18456402b57cba6085b2a8fcc136d `2996b9a087c18456402b57cba6085b2a8fcc136d`
It contains a der-encoded SECP256k1 public key It contains a der-encoded SECP256k1 public key
```json
{ {
"certificate": { "certificate": {
"keyType": "SECP256k1", "keyType": "SECP256k1",
@ -58,6 +59,7 @@ It contains a der-encoded SECP256k1 public key
c59363aa5d77ff2b7ff06cddc07116b335a4a0849b1b524a4a69d908d69f1bcebb", c59363aa5d77ff2b7ff06cddc07116b335a4a0849b1b524a4a69d908d69f1bcebb",
"version": "_0_0_1" "version": "_0_0_1"
} }
```
### Signing the claim in detail ### Signing the claim in detail
@ -74,14 +76,14 @@ Reilly decodes and combines the claim address, the serialized claim value, and t
Then he takes the SHA256 of the combined string, giving: Then he takes the SHA256 of the combined string, giving:
dea44974ace1893f304cae4073af06a7a6cbb209f97cf8ad5f322216f044304e `dea44974ace1893f304cae4073af06a7a6cbb209f97cf8ad5f322216f044304e`
He signs (RFC 6979) this hash using the private key to the previously shown certificate, giving the signature: He signs (RFC 6979) this hash using the private key to the previously shown certificate, giving the signature:
bf82d53143155bb0cac1fd3d917c000322244b5ad17e7865124db2ed33812ea66c9b0c3f390a65a9e2d452e315e91ae695642847d88e90348ef3c1fa283a36a8 `bf82d53143155bb0cac1fd3d917c000322244b5ad17e7865124db2ed33812ea66c9b0c3f390a65a9e2d452e315e91ae695642847d88e90348ef3c1fa283a36a8`
Now he add this signature to the claim: Now he add this signature to the claim:
```json
{ {
"claimType": "streamType", "claimType": "streamType",
"publisherSignature": { "publisherSignature": {
@ -113,6 +115,7 @@ Now he add this signature to the claim:
}, },
"version": "_0_0_1" "version": "_0_0_1"
} }
```
Serialized, the signed claim is represented as: Serialized, the signed claim is represented as:

View file

@ -63,7 +63,7 @@ Use the blob exchange protocol to request the manifest blob from the hosts found
The manifest is JSON-formatted text. It contains a dictionary with the following structure: The manifest is JSON-formatted text. It contains a dictionary with the following structure:
``` ```json
{ {
"blobs": [ "blobs": [
{ {

View file

@ -7,8 +7,8 @@ description: Learn how to use encryption with lbrycrd, the full blockchain softw
You can use `lbrycrd-cli encryptwallet <passphrase>` to encrypt your wallet. You can use `lbrycrd-cli encryptwallet <passphrase>` to encrypt your wallet.
You can use `lbrycrd-cli walletpassphrase <passphrase> <timeout>` to temporarily unlock the wallet. The <timeout> parameter is in seconds. You can use `lbrycrd-cli walletpassphrase <passphrase> <timeout>` to temporarily unlock the wallet. The `<timeout>` parameter is in seconds.
For example, `lbrycrd-cli walletpassphrase 'open sesame 321' 300` would unlock your wallet for five minutes, assuming your passphrase was `open sesame 321`. (In reality, you should choose a harder-to-guess passphrase than that.) For example, `lbrycrd-cli walletpassphrase 'open sesame 321' 300` would unlock your wallet for five minutes, assuming your passphrase was `open sesame 321`. (In reality, you should choose a harder-to-guess passphrase than that.)
If you set <timeout> too low, it might expire before you get done using your wallet. If you set it too high, you might forget that you left your wallet unlocked. If you set `<timeout>` too low, it might expire before you get done using your wallet. If you set it too high, you might forget that you left your wallet unlocked.

View file

@ -1,6 +1,6 @@
--- ---
title: "LBRY P2P: Settings and troubleshooting" title: "LBRY P2P: Settings and troubleshooting"
description: Guide on properly setting up P2P nodes and how to diagnose/fix common issues. description: "Guide on properly setting up P2P nodes and how to diagnose/fix common issues."
--- ---
# LBRY P2P: Settings and troubleshooting # LBRY P2P: Settings and troubleshooting
@ -21,8 +21,8 @@ There are some websites providing generic ways to check ports, like:
- https://portchecker.co/check - https://portchecker.co/check
However, checking the port does not check if LBRY P2P protocol is working behind it. For a better check, we can use a tool hosted by Madiator, a community member. However, checking the port does not check if LBRY P2P protocol is working behind it. For a better check, we can use a tool hosted by Madiator, a community member.
- To test for UDP (DHT): http://test.madiator.com:60666/dht/<your `udp_port`> - To test for UDP (DHT): `http://test.madiator.com:60666/dht/<your udp_port>`
- To test for TCP (P2P): http://test.madiator.com:60666/p2p/<your `tcp_port`> - To test for TCP (P2P): `http://test.madiator.com:60666/p2p/<your tcp_port>`
As a last resource to test a remote machine DHT service, from a local SDK try: As a last resource to test a remote machine DHT service, from a local SDK try:
```bash ```bash

View file

@ -8,13 +8,13 @@ This guide will walk you through the process of claiming a time locked transacti
If you already have `lbrynet` installed then you can check your version like this: If you already have `lbrynet` installed then you can check your version like this:
``` ```bash
lbrynet version lbrynet version
``` ```
If above command fails, you may need to start `lbrynet` first (and then try above again): If above command fails, you may need to start `lbrynet` first (and then try above again):
``` ```bash
lbrynet start lbrynet start
``` ```
@ -39,7 +39,7 @@ If you do not have `lbrynet` installed or your version is less than `v0.108.0` t
1. On the USB key, find a file named `key.zip` and unzip this file using the password emailed to you previously. 1. On the USB key, find a file named `key.zip` and unzip this file using the password emailed to you previously.
1. You should now have a file named `key.txt` which is base64 encoded and contains your `private key` and `redeem script`. 1. You should now have a file named `key.txt` which is base64 encoded and contains your `private key` and `redeem script`.
1. To decode the contents of the file you can use a website such as [base64decode.org](https://www.base64decode.org/) (not a secure option) or if you have Python installed you can do this on the command line: 1. To decode the contents of the file you can use a website such as [base64decode.org](https://www.base64decode.org/) (not a secure option) or if you have Python installed you can do this on the command line:
``` ```bash
python -m base64 -d /path/to/key.txt python -m base64 -d /path/to/key.txt
``` ```
1. After decoding you will see a key/value mapping of various items, including `privateKey` and `redeemScript`. Take note of these values. 1. After decoding you will see a key/value mapping of various items, including `privateKey` and `redeemScript`. Take note of these values.
@ -48,7 +48,7 @@ If you do not have `lbrynet` installed or your version is less than `v0.108.0` t
Now that you have gathered the necessary information it is easy to redeem your LBC. Time locked transaction can be redeemed using the `lbrynet account deposit` command (fill in the values you gathered previously): Now that you have gathered the necessary information it is easy to redeem your LBC. Time locked transaction can be redeemed using the `lbrynet account deposit` command (fill in the values you gathered previously):
``` ```bash
lbrynet account deposit <transaction id> <nout> <redeemScript> <privateKey> lbrynet account deposit <transaction id> <nout> <redeemScript> <privateKey>
``` ```

View file

@ -19,7 +19,7 @@ Make sure your firewall has ports 9246 and 50001 open. 9246 is the port lbrycrd
Download the [latest release of lbrycrd](https://github.com/lbryio/lbrycrd/releases/latest). Download the [latest release of lbrycrd](https://github.com/lbryio/lbrycrd/releases/latest).
Then, create a folder on your home directory called `.lbrycrd` and save the following to `.lbrycrd/lbrycrd.conf`: Then, create a folder on your home directory called `.lbrycrd` and save the following to `.lbrycrd/lbrycrd.conf`:
``` ```json
txindex=1 txindex=1
server=1 server=1
daemon=1 daemon=1
@ -36,7 +36,7 @@ You can run lbrycrdd directly using `./lbrycrdd`. However, we recommend creating
Create a file at `/etc/systemd/system/lbrycrdd.service` with the following contents: Create a file at `/etc/systemd/system/lbrycrdd.service` with the following contents:
``` ```json
[Unit] [Unit]
Description="LBRYcrd daemon" Description="LBRYcrd daemon"
After=network.target After=network.target
@ -69,7 +69,7 @@ You can watch the lbrycrd log with `tail -f ~/.lbrycrd/debug.log`
## Set Up Docker ## Set Up Docker
### Install Docker & Docker Compose ### Install Docker & Docker Compose
``` ```bash
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common && \ sudo apt install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
@ -83,7 +83,7 @@ sudo usermod -aG docker $USER
### Download our example docker-compose.yml ### Download our example docker-compose.yml
You can see it [here](https://github.com/lbryio/lbry-sdk/blob/master/docker/docker-compose-wallet-server.yml). You can see it [here](https://github.com/lbryio/lbry-sdk/blob/master/docker/docker-compose-wallet-server.yml).
``` ```bash
curl -L "https://raw.githubusercontent.com/lbryio/lbry-sdk/master/docker/docker-compose-wallet-server.yml" -o docker-compose.yml curl -L "https://raw.githubusercontent.com/lbryio/lbry-sdk/master/docker/docker-compose-wallet-server.yml" -o docker-compose.yml
``` ```
@ -130,7 +130,7 @@ sudo mv "snapshot_${SNAPSHOT_HEIGHT}" "${HUB_VOLUME_PATH}/_data"
### Start the servers ### Start the servers
``` ```bash
docker-compose up --detach docker-compose up --detach
``` ```
@ -138,13 +138,13 @@ docker-compose up --detach
The first time you start the wallet server, it will take a few minutes to download a recent snapshot of the database and extract it. You can follow the progress with The first time you start the wallet server, it will take a few minutes to download a recent snapshot of the database and extract it. You can follow the progress with
``` ```bash
docker-compose logs --follow docker-compose logs --follow
``` ```
After the wallet server has caught up, it will bind to port 50001 and start responding to requests. You can check if this happened by running After the wallet server has caught up, it will bind to port 50001 and start responding to requests. You can check if this happened by running
``` ```bash
sudo netstat -tlpn | grep 50001 sudo netstat -tlpn | grep 50001
``` ```
@ -152,7 +152,7 @@ If there is no output, the port is ont bound yet and the server is still catchin
After the wallet server is ready, check that it responds to basic RPC calls: After the wallet server is ready, check that it responds to basic RPC calls:
``` ```bash
echo '{"id":1,"method":"server.version"}' | timeout 1 curl telnet://localhost:50001 echo '{"id":1,"method":"server.version"}' | timeout 1 curl telnet://localhost:50001
``` ```
@ -161,7 +161,7 @@ You should see a response like `{"jsonrpc": "2.0", "result": ["0.46.1", "0.0"],
To check Elastic search, there are two commands you can use: To check Elastic search, there are two commands you can use:
``` ```bash
curl localhost:9200 # get Elastic status curl localhost:9200 # get Elastic status
curl localhost:9200/claims/_count # check how many claims have been synced to Elastic curl localhost:9200/claims/_count # check how many claims have been synced to Elastic
@ -178,7 +178,7 @@ options.
### Updating ### Updating
To update to the latest wallet server release, run the following: To update to the latest wallet server release, run the following:
``` ```bash
docker pull lbry/wallet-server:latest-release docker pull lbry/wallet-server:latest-release
docker-compose down docker-compose down
docker-compose up --detach docker-compose up --detach
@ -192,7 +192,7 @@ The process is similar to an update, but causes the server to be down for much l
#### Main database #### Main database
Holds the raw blockchain data and takes several days to resync from scratch, so be sure to have a snapshot or try that last. Holds the raw blockchain data and takes several days to resync from scratch, so be sure to have a snapshot or try that last.
``` ```bash
docker pull lbry/wallet-server:latest-release docker pull lbry/wallet-server:latest-release
docker-compose down docker-compose down
docker volume rm "$(whoami)_wallet_server" docker volume rm "$(whoami)_wallet_server"
@ -202,7 +202,7 @@ WALLET_SERVER_SNAPSHOT_URL= docker-compose up --detach
#### Elasticsearch #### Elasticsearch
ES does the indexing of claims from the main database. It should take around 6 hours to resync on a fast machine. ES does the indexing of claims from the main database. It should take around 6 hours to resync on a fast machine.
``` ```bash
docker pull lbry/wallet-server:latest-release docker pull lbry/wallet-server:latest-release
docker-compose down docker-compose down
docker volume rm "$(whoami)_es01" docker volume rm "$(whoami)_es01"

View file

@ -10,7 +10,7 @@ Run your own instance of https://lbry.tv using Docker images.
The LBRY SDK provides RPC and streaming endpoints to interact with the LBRY network. Web users will connect to it directly, so it must be web-accessible. You may have to open ports on your firewall. The LBRY SDK provides RPC and streaming endpoints to interact with the LBRY network. Web users will connect to it directly, so it must be web-accessible. You may have to open ports on your firewall.
``` ```bash
docker run -d -p 5279:5279 -p 5280:5280 vshyba/websdk docker run -d -p 5279:5279 -p 5280:5280 vshyba/websdk
``` ```
@ -22,14 +22,14 @@ This image will not save files to disk. It has the `save_blobs` and `save_files`
Clone and install the app as described in the [lbry-desktop repo README](https://github.com/lbryio/lbry-desktop). Clone and install the app as described in the [lbry-desktop repo README](https://github.com/lbryio/lbry-desktop).
If you want to customize it further, follow the extra steps in `Customize the web app` section. Otherwise: If you want to customize it further, follow the extra steps in `Customize the web app` section. Otherwise:
``` ```bash
git clone https://github.com/lbryio/lbry-desktop.git git clone https://github.com/lbryio/lbry-desktop.git
yarn yarn
cp .env.defaults .env cp .env.defaults .env
``` ```
Configure .env with the following settings. They must match the SDK ports in the previous section. Configure .env with the following settings. They must match the SDK ports in the previous section.
``` ```json
WEB_SERVER_PORT=8080 WEB_SERVER_PORT=8080
SDK_API_PATH=http://localhost:5279 SDK_API_PATH=http://localhost:5279
LBRY_WEB_API=http://localhost:5279 LBRY_WEB_API=http://localhost:5279
@ -39,7 +39,7 @@ LBRY_WEB_BUFFER_API=https://disabled
``` ```
Compile and run Compile and run
``` ```bash
NODE_ENV=production yarn compile:web NODE_ENV=production yarn compile:web
nodejs web/index.js nodejs web/index.js
``` ```
@ -50,12 +50,12 @@ nodejs web/index.js
If you want to customize the SDK settings, you can If you want to customize the SDK settings, you can
Clone the SDK repo: Clone the SDK repo:
``` ```bash
git clone https://github.com/lbryio/lbry-sdk.git git clone https://github.com/lbryio/lbry-sdk.git
``` ```
Create a `docker/webconf.yaml` file and modify as you need. This is a good start: Create a `docker/webconf.yaml` file and modify as you need. This is a good start:
``` ```yaml
allowed_origin: "*" allowed_origin: "*"
max_key_fee: "0.0 USD" max_key_fee: "0.0 USD"
save_files: false save_files: false
@ -71,7 +71,7 @@ Note that it is required to have `streaming_server` and `api` set to user-access
To build the image, run: To build the image, run:
``` ```bash
docker build -f docker/Dockerfile.web -t <your dockerhub username>/<project name, like 'websdk'> . docker build -f docker/Dockerfile.web -t <your dockerhub username>/<project name, like 'websdk'> .
docker push <dockerhub username/project name> docker push <dockerhub username/project name>
``` ```

View file

@ -5,9 +5,13 @@ import markdown from 'markdown-wasm';
import { getCollection } from "astro:content"; import { getCollection } from "astro:content";
import TableOfContents from '../components/TableOfContents.astro'; import TableOfContents from '../components/TableOfContents.astro';
import { REPOSITORY, EDIT_PAGE } from '../config';
import '../styles/markdown.css'; import '../styles/markdown.css';
const { frontmatter, headings, collection } = Astro.props;
const { frontmatter, headings, collection, noedit } = Astro.props;
let { pathname } = Astro.url; let { pathname } = Astro.url;
if (pathname.split('')[pathname.length - 1] === '/') pathname = pathname.substring(0, pathname.length - 1); if (pathname.split('')[pathname.length - 1] === '/') pathname = pathname.substring(0, pathname.length - 1);
@ -21,18 +25,21 @@ const isActive = (href: string)=>{
pathname.pop(); pathname.pop();
pathname = pathname.join(''); pathname = pathname.join('');
} }
console.log(pathname);
return href === pathname || href === pathname.split('/').slice(0,2).join('/'); return href === pathname || href === pathname.split('/').slice(0,2).join('/');
} }
--- ---
<Layout title={frontmatter.title}> <Layout title={frontmatter.title}>
<div class="wrapper"> <div class="wrapper">
<section class="sidebar"> <section class="sidebar">
{(headings && headings.length) ? (
<aside id="toc">
<TableOfContents headings={headings} />
</aside>
) : ''}
<div class="container"> <div class="container">
{items.length ? ( {items.length ? (
<summary> <summary>
@ -48,13 +55,19 @@ const isActive = (href: string)=>{
</section> </section>
<div class="main"> <div class="main">
<div class="content"> <div class="content">
<aside class="toc"> <!-- {headings && (
<aside id="toc">
<TableOfContents headings={headings} /> <TableOfContents headings={headings} />
</aside> </aside>
)} -->
<div class="markdown-body"> <div class="markdown-body">
<h1>{frontmatter.title}</h1> <h1>{frontmatter.title}</h1>
<h3><Fragment set:html={description}/></h3> <h3><Fragment set:html={description}/></h3>
<slot/> <slot/>
{!noedit && (
<hr/>
<a class="edit" href={`https://github.com/${REPOSITORY}/tree/master/src/content${pathname}.mdx`} target="_blank">{EDIT_PAGE}</a>
)}
</div> </div>
</div> </div>
</div> </div>
@ -62,24 +75,29 @@ const isActive = (href: string)=>{
<style> <style>
.wrapper { .wrapper {
display: flex; display: flex;
--sidebar-width: 300px;
/* max-width: 1000px; */
} }
.wrapper .sidebar { .wrapper .sidebar {
position: fixed; position: fixed;
width: var(--sidebar-width); width: var(--sidebar-width);
height: 100vh; height: 100%;
max-height: calc(100% - var(--nav-height));
overflow-y: auto; overflow-y: auto;
inset-block: 0; inset-block: 0;
inset-inline-start: 0; inset-inline-start: 0;
margin-top: var(--nav-height);
padding-bottom: var(--nav-height);
/* padding: 20px; */ /* padding: 20px; */
padding-top: var(--nav-height); // padding: var(--nav-height) 0;
background-color: var(--secondary-background); background-color: var(--secondary-background);
transition: 0.3s;
z-index: 10;
} }
.wrapper .sidebar .container { .wrapper .sidebar .container {
position: relative;
padding: 1rem 1rem 0; padding: 1rem 1rem 0;
// height: calc(100vh - var(--nav-height)*2);
} }
.wrapper .sidebar summary .title { .wrapper .sidebar summary .title {
@ -124,8 +142,13 @@ const isActive = (href: string)=>{
} }
.wrapper .main { .wrapper .main {
width: 100vw; // width: calc(100vw - var(--sidebar-width));
padding-inline-start: var(--sidebar-width); padding-inline-start: var(--sidebar-width);
padding-inline-end: var(--sidebar-width);
transition: 0.3s;
overflow-x: hidden;
max-width: 1750px;
width: calc(100vw);
} }
.wrapper .main .content { .wrapper .main .content {
@ -133,35 +156,60 @@ const isActive = (href: string)=>{
/* width: fit-content; */ /* width: fit-content; */
/* max-width: 100%; */ /* max-width: 100%; */
order: 1; order: 1;
margin: 20px 0 0 20px; // width: 100%;
} margin: 1rem;
.wrapper .main aside {
display: flex;
align-items: center;
order: 2;
width: fit-content;
max-width: 25%;
margin: 0 auto;
} }
.wrapper .markdown-body { .wrapper .markdown-body {
/* margin: 10px 20px; */ // padding: 10px 20px;
max-width: 75%; width: 100%;
} }
.wrapper .toc { .wrapper #toc {
display: flex; position: fixed;
flex-direction: column; width: calc(var(--sidebar-width) - 2rem);
height: fit-content;
max-height: calc(100vh - var(--nav-height)*2 - 2rem * 2);
inset-block: 0;
inset-inline-end: 2rem;
margin: calc(2rem + var(--nav-height)) 0;
// background-color: var(--secondary-background);
transition: 0.3s;
z-index: 10;
overflow-y: auto;
border-radius: 1em;
background-color: var(--secondary-background);
}
@media only screen and (max-width: 1000px) {
.wrapper #toc {
position: relative;
width: var(--sidebar-width);
max-height: unset;
inset-block: unset;
inset-inline-end: unset;
margin-top: 0;
z-index: 1;
background-color: transparent;
}
.wrapper .main {
padding-inline-end: unset;
}
} }
@media only screen and (max-width: 750px) { @media only screen and (max-width: 750px) {
.wrapper .sidebar { .wrapper .sidebar {
transform: translateX(-80%); transform: translateX(-100%);
} }
.wrapper .sidebar.active {
transform: translateX(0);
}
.wrapper .main { .wrapper .main {
padding-inline-start: calc(var(--sidebar-width) * 0.2); padding-inline-start: unset;
} }
} }
</style> </style>

View file

@ -17,13 +17,15 @@ const description = await markdown.parse(frontmatter.description);
<Layout title={frontmatter.title}> <Layout title={frontmatter.title}>
<div class="wrapper"> <div class="wrapper">
<div class="main"> <section class="sidebar">
<div class="content">
{headings && ( {headings && (
<aside class="toc"> <aside id="toc">
<TableOfContents headings={headings} /> <TableOfContents headings={headings} />
</aside> </aside>
)} )}
</section>
<div class="main">
<div class="content">
<div class="markdown-body"> <div class="markdown-body">
<h1>{frontmatter.title}</h1> <h1>{frontmatter.title}</h1>
<h3><Fragment set:html={description}/></h3> <h3><Fragment set:html={description}/></h3>
@ -39,7 +41,7 @@ const description = await markdown.parse(frontmatter.description);
} }
.wrapper .main { .wrapper .main {
width: 100vw; width: calc(100vw - var(--sidebar-width));
} }
.wrapper .main .content { .wrapper .main .content {
@ -47,35 +49,78 @@ const description = await markdown.parse(frontmatter.description);
/* width: fit-content; */ /* width: fit-content; */
/* max-width: 100%; */ /* max-width: 100%; */
order: 1; order: 1;
margin: 20px 0 0 20px; margin: 1rem;
}
.wrapper .main aside {
display: flex;
align-items: center;
order: 2;
width: fit-content;
max-width: 25%;
margin: 0 auto;
} }
.wrapper .markdown-body { .wrapper .markdown-body {
/* margin: 10px 20px; */ /* margin: 10px 20px; */
max-width: 75%; /* max-width: 75%; */
max-width: 100%;
} }
.wrapper .toc { .wrapper #toc {
display: flex; position: fixed;
flex-direction: column; width: calc(var(--sidebar-width) - 2rem);
height: fit-content;
max-height: calc(100vh - var(--nav-height)*2 - 2rem * 2);
inset-block: 0;
inset-inline-end: 2rem;
margin: calc(2rem + var(--nav-height)) 0;
background-color: var(--secondary-background);
transition: 0.3s;
z-index: 10;
overflow-y: auto;
border-radius: 1em;
background-color: var(--secondary-background);
}
@media only screen and (max-width: 1000px) {
.wrapper .sidebar {
position: fixed;
width: var(--sidebar-width);
height: 100%;
max-height: calc(100% - var(--nav-height));
overflow-y: auto;
inset-block: 0;
inset-inline-start: 0;
margin-top: var(--nav-height);
padding-bottom: var(--nav-height);
/* padding: 20px; */
// padding: var(--nav-height) 0;
background-color: var(--secondary-background);
transition: 0.3s;
z-index: 10;
}
.wrapper #toc {
position: relative;
width: var(--sidebar-width);
max-height: unset;
inset-block: unset;
inset-inline-end: unset;
margin-top: 0;
z-index: 1;
background-color: transparent;
}
.wrapper .main {
width: 100%;
padding-inline-start: var(--sidebar-width);
}
} }
@media only screen and (max-width: 750px) { @media only screen and (max-width: 750px) {
.wrapper .sidebar { .wrapper .sidebar {
transform: translateX(-80%); transform: translateX(-100%);
}
.wrapper .sidebar.active {
transform: translateX(0);
} }
.wrapper .main { .wrapper .main {
padding-inline-start: calc(400px * 0.2); width: 100%;
padding-inline-start: 0;
} }
} }
</style> </style>

View file

@ -7,6 +7,6 @@ const frontmatter = {
} }
--- ---
<Collections title="Resources" frontmatter={frontmatter} collection="resources"> <Collections title="Resources" frontmatter={frontmatter} collection="resources" noedit={true}>
</Collections> </Collections>

View file

@ -2,11 +2,12 @@
import Markdown from '../layouts/Collections.astro'; import Markdown from '../layouts/Collections.astro';
const frontmatter = { const frontmatter = {
title: "Tutorials",
description: "Find the LBRY specification, API documentation, our Contributor's guide, and more in the Resources area." description: "Find the LBRY specification, API documentation, our Contributor's guide, and more in the Resources area."
} }
--- ---
<Markdown title="Tutorials" frontmatter={frontmatter} collection="tutorials"> <Markdown title="Tutorials" frontmatter={frontmatter} collection="tutorials" noedit={true}>
<h2>Setup your Development Environment</h2> <h2>Setup your Development Environment</h2>
<h3>Desktop Application</h3> <h3>Desktop Application</h3>
@ -21,11 +22,3 @@ const frontmatter = {
<h3>LBRY Blockchain</h3> <h3>LBRY Blockchain</h3>
<p><a href="/resources/video-lbrycrd">Video tutorial</a> to setup the <a href="https://github.com/lbryio/lbrycrd">LBRY Blockchain</a> development environment.</p> <p><a href="/resources/video-lbrycrd">Video tutorial</a> to setup the <a href="https://github.com/lbryio/lbrycrd">LBRY Blockchain</a> development environment.</p>
</Markdown> </Markdown>
---
layout: '../layouts/Markdown.astro'
title: Tutorials
description: Learn how to setup, use, deploy, and develop with LBRY.
---

View file

@ -41,17 +41,74 @@ header ul li:hover a {
list-style: none; list-style: none;
} }
header .right .menu { header .right #menu {
display: none; display: none;
cursor: pointer;
} }
@media only screen and (max-width: 600px) { #menu {
flex-direction: column;
/* justify-content: space-between; */
justify-content: center;
width: 2rem;
height: 1.5rem;
position: relative;
/* margin: 50px auto; */
-webkit-transition: .5s ease-in-out;
-moz-transition: .5s ease-in-out;
-o-transition: .5s ease-in-out;
transition: .5s ease-in-out;
cursor: pointer;
/* border:1px solid red; */
}
#menu span {
display: block;
position: absolute;
height: 3px;
width: 100%;
background: var(--header-text);
border-radius: 9px;
opacity: 1;
left: 0;
transform: rotate(0deg);
transition: .2s ease-in-out;
/* border:4px solid black; */
}
#menu span:nth-child(1) {
top: 0;
}
#menu span:nth-child(3) {
bottom: 0;
}
#menu.open span:nth-child(1) {
top: 50%;
transform: translateY(-50%);
transform: rotate(45deg);
}
#menu.open span:nth-child(2) {
width: 0;
left: 50%;
transform: translateX(-50%);
}
#menu.open span:nth-child(3) {
top: 50%;
transform: translateY(-50%);
transform: rotate(-45deg);
}
@media only screen and (max-width: 750px) {
header .left ul, header .right .search { header .left ul, header .right .search {
display: none; display: none;
} }
header .right .menu { header .right #menu {
display: block; display: flex;
width: 25px; /* width: 25px; */
} }
} }

View file

@ -7,7 +7,9 @@
--tertiary-background: #041523; --tertiary-background: #041523;
--header-text: #FAFAFA; --header-text: #FAFAFA;
--body-text: #DDDDDD; --body-text: #DDDDDD;
--nav-height: 75px; --nav-height: 75px;
--sidebar-width: 300px;
--astro-code-color-text: white; --astro-code-color-text: white;
--astro-code-color-background: black; --astro-code-color-background: black;
@ -22,12 +24,26 @@
--astro-code-token-link: firebrick; --astro-code-token-link: firebrick;
} }
@media only screen and (max-width: 1000px) {
:root {
--sidebar-width: 200px;
}
}
@media only screen and (max-width: 750px) {
:root {
--sidebar-width: 80vw;
}
}
* { * {
margin: 0; margin: 0;
box-sizing: border-box; box-sizing: border-box;
} }
*:target{ padding-top: 100px;margin-top: -100px} *:target{
scroll-margin-top: calc(var(--nav-height) + 1em);
}
html { html {
font-family: 'Roboto', sans-serif; font-family: 'Roboto', sans-serif;