diff --git a/.github/workflows/upload-website-docker-hub.yaml b/.github/workflows/upload-website-docker-hub.yaml new file mode 100644 index 00000000..608902df --- /dev/null +++ b/.github/workflows/upload-website-docker-hub.yaml @@ -0,0 +1,43 @@ +name: Publish Website to Docker image + +on: + # pull_request: + # paths: + # - '*' + push: + branches: + - main + paths: + - 'leptos-website/**' + - docker/Dockerfile.website + +jobs: + push_to_registry: + name: Push Website Docker image to Docker Hub + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v3 + id: checkout + + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract SHA + id: extract_sha + run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA::8})" + + - name: Extract branch name + id: extract_branch + run: echo "::set-output name=branch::${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" + + - name: Build and push UI Docker image + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: ./leptos-website + file: docker/Dockerfile.website + push: true + tags: securityunion/video-call-rs-website:${{ steps.extract_branch.outputs.branch }}-${{ steps.extract_sha.outputs.sha8 }} diff --git a/Cargo.toml b/Cargo.toml index 515893ff..370f56d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,10 +4,12 @@ members = [ "actix-api", "bot", "types", - "videocall-client", + "videocall-client" ] exclude = [ "src-tauri", "video-daemon", - "yew-ui" + "yew-ui", + "leptos-website" ] + diff --git a/README.md b/README.md index 233361ae..00111f61 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,13 @@ -## News +## π Try videocall.rs Today! -https://www.reddit.com/r/rust/comments/14vwxfh/we_just_released_our_rust_webtransport/ +Experience seamless, real-time video communication with **[videocall.rs](https://videocall.rs)**, a cutting-edge platform built for developers by developers. Whether you're building the next big thing in robotics or just need reliable video calls, videocall.rs has got you covered. + +π **[Get Started Now](https://videocall.rs)** and bring your ideas to life with crystal-clear video and audio. Perfect for remote collaboration, demos, and beyond! + +π¨βπ» **Why videocall.rs?** +- Built with **Rust** for performance and safety. +- Low latency, high-quality streaming. +- Easy integration with your projects. ## βΆοΈ YouTube Videos diff --git a/docker/Dockerfile.website b/docker/Dockerfile.website new file mode 100644 index 00000000..bcced51a --- /dev/null +++ b/docker/Dockerfile.website @@ -0,0 +1,34 @@ +FROM rust:1.80-slim-bookworm as builder + +RUN rustup default nightly-2024-08-21 +RUN rustup target add wasm32-unknown-unknown + +RUN apt-get update && apt-get install -y \ + libssl-dev \ + pkg-config \ + g++ \ + && rm -rf /var/lib/apt/lists/* + +RUN cargo install cargo-leptos --version 0.2.20 + +WORKDIR /app + +COPY . . + +RUN cargo leptos build --release + +FROM debian:bookworm-slim + +# Copy the server binary to the /app directory +COPY --from=builder /app/target/release/leptos_website /app/ +# /target/site contains our JS/WASM/CSS, etc. +COPY --from=builder /app/target/site /app/site +# Copy Cargo.toml if itβs needed at runtime +COPY --from=builder /app/Cargo.toml /app/ +WORKDIR /app +ENV RUST_LOG="info" +ENV LEPTOS_SITE_ADDR="0.0.0.0:8080" +ENV LEPTOS_SITE_ROOT="site" +EXPOSE 8080 + +CMD ["/app/leptos_website"] \ No newline at end of file diff --git a/helm/rustlemania-ui/values.yaml b/helm/rustlemania-ui/values.yaml index ab3933f7..e7686112 100644 --- a/helm/rustlemania-ui/values.yaml +++ b/helm/rustlemania-ui/values.yaml @@ -40,15 +40,7 @@ ingress: nginx.ingress.kubernetes.io/ssl-redirect: "true" kubernetes.io/tls-acme: "true" hosts: - - host: www.rustlemania.com - paths: - - path: / - pathType: Prefix - service: - name: rustlemania-ui - port: - number: 80 - - host: rustlemania.com + - host: app.videocall.rs paths: - path: / pathType: Prefix @@ -59,5 +51,5 @@ ingress: tls: - secretName: rustlemania-ui-tls hosts: - - rustlemania.com - - '*.rustlemania.com' + - app.videocall.rs + - transport.rustlemania.com diff --git a/helm/videocall-website/.helmignore b/helm/videocall-website/.helmignore new file mode 100644 index 00000000..0e8a0eb3 --- /dev/null +++ b/helm/videocall-website/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/videocall-website/Chart.yaml b/helm/videocall-website/Chart.yaml new file mode 100644 index 00000000..e0a11b63 --- /dev/null +++ b/helm/videocall-website/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: videocall-website +description: A Helm chart for videocall-website +type: application +version: 0.1.0 diff --git a/helm/videocall-website/templates/NOTES.txt b/helm/videocall-website/templates/NOTES.txt new file mode 100644 index 00000000..67c60bff --- /dev/null +++ b/helm/videocall-website/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "videocall-website.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "videocall-website.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "videocall-website.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "videocall-website.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/helm/videocall-website/templates/_helpers.tpl b/helm/videocall-website/templates/_helpers.tpl new file mode 100644 index 00000000..2c720034 --- /dev/null +++ b/helm/videocall-website/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "videocall-website.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "videocall-website.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "videocall-website.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "videocall-website.labels" -}} +helm.sh/chart: {{ include "videocall-website.chart" . }} +{{ include "videocall-website.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "videocall-website.selectorLabels" -}} +app.kubernetes.io/name: {{ include "videocall-website.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "videocall-website.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "videocall-website.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/helm/videocall-website/templates/deployment.yaml b/helm/videocall-website/templates/deployment.yaml new file mode 100644 index 00000000..c86dd986 --- /dev/null +++ b/helm/videocall-website/templates/deployment.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "videocall-website.fullname" . }} + labels: + {{- include "videocall-website.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "videocall-website.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + app: videocall-website + {{- include "videocall-website.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ include "videocall-website.fullname" . }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + {{- toYaml .Values.env | nindent 12 }} + ports: + - name: website + containerPort: {{ .Values.service.port }} + protocol: TCP + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/helm/videocall-website/templates/ingress.yaml b/helm/videocall-website/templates/ingress.yaml new file mode 100644 index 00000000..7287693d --- /dev/null +++ b/helm/videocall-website/templates/ingress.yaml @@ -0,0 +1,60 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "videocall-website.fullname" . -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "videocall-website.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ .service.name }} + port: + number: {{ .service.port.number }} + {{- else }} + serviceName: {{ .service.name }} + servicePort: {{ .service.port.number }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/helm/videocall-website/templates/service.yaml b/helm/videocall-website/templates/service.yaml new file mode 100644 index 00000000..bf83124a --- /dev/null +++ b/helm/videocall-website/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.service.name }} + labels: + {{- include "videocall-website.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: 80 + protocol: TCP + name: website + selector: + app: videocall-website \ No newline at end of file diff --git a/helm/videocall-website/values.yaml b/helm/videocall-website/values.yaml new file mode 100644 index 00000000..dc27073c --- /dev/null +++ b/helm/videocall-website/values.yaml @@ -0,0 +1,71 @@ +# Default values for videocall-website. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. +nameOverride: "" +fullnameOverride: "" + +replicaCount: 1 +image: + repository: securityunion/video-call-rs-website + pullPolicy: Always + tag: add-website-e303a7a9 +env: + - name: RUST_LOG + value: info + - name: LISTEN_URL + value: "0.0.0.0:80" + - name: LEPTOS_SITE_ADDR + value: "0.0.0.0:80" +resources: + limits: + cpu: "50m" + memory: "10Mi" + requests: + cpu: "20m" + memory: "10Mi" +podAnnotations: {} +podSecurityContext: {} +securityContext: {} +service: + name: videocall-website + type: ClusterIP + port: 80 +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 +nodeSelector: {} +tolerations: [] +affinity: {} + +ingress: + enabled: true + className: nginx + annotations: + cert-manager.io/issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/ssl-redirect: "true" + kubernetes.io/tls-acme: "true" + hosts: + - host: www.videocall.rs + paths: + - path: / + pathType: Prefix + service: + name: videocall-website + port: + number: 80 + - host: videocall.rs + paths: + - path: / + pathType: Prefix + service: + name: videocall-website + port: + number: 80 + tls: + - secretName: videocall-website-tls + hosts: + - videocall.rs + - www.videocall.rs diff --git a/helm/website/.helmignore b/helm/website/.helmignore new file mode 100644 index 00000000..e69de29b diff --git a/helm/website/Chart.yaml b/helm/website/Chart.yaml new file mode 100644 index 00000000..336106f1 --- /dev/null +++ b/helm/website/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: website +description: A Helm chart for the website +type: application +version: 0.1.0 \ No newline at end of file diff --git a/helm/website/templates/_helpers.yaml b/helm/website/templates/_helpers.yaml new file mode 100644 index 00000000..904a3a4a --- /dev/null +++ b/helm/website/templates/_helpers.yaml @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "webtransport-rs.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "webtransport-rs.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "webtransport-rs.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "webtransport-rs.labels" -}} +helm.sh/chart: {{ include "webtransport-rs.chart" . }} +{{ include "webtransport-rs.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "webtransport-rs.selectorLabels" -}} +app.kubernetes.io/name: {{ include "webtransport-rs.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "webtransport-rs.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "webtransport-rs.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/website/templates/deployment.yaml b/helm/website/templates/deployment.yaml new file mode 100644 index 00000000..a6f10f59 --- /dev/null +++ b/helm/website/templates/deployment.yaml @@ -0,0 +1,69 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "webtransport-rs.fullname" . }} + labels: + {{- include "webtransport-rs.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "webtransport-rs.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "webtransport-rs.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ include "webtransport-rs.fullname" . }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + command: {{ .Values.command }} + args: {{ .Values.args }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + {{- toYaml .Values.env | nindent 12 }} + ports: + - name: wt-udp + containerPort: {{ .Values.service.port }} + protocol: UDP + - name: http + containerPort: {{ .Values.service.appPort }} + protocol: TCP + - name: health + containerPort: {{ .Values.service.healthPort }} + protocol: TCP + resources: + {{- toYaml .Values.resources | nindent 12 }} + volumeMounts: + - name: tls + mountPath: "/certs" + readOnly: true + volumes: + - name: tls + secret: + secretName: {{ .Values.tlsSecret }} + optional: true + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} \ No newline at end of file diff --git a/helm/website/templates/ingress.yaml b/helm/website/templates/ingress.yaml new file mode 100644 index 00000000..f4afcb6f --- /dev/null +++ b/helm/website/templates/ingress.yaml @@ -0,0 +1,60 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "webtransport-rs.fullname" . -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "webtransport-rs.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ .service.name }} + port: + number: {{ .service.port.number }} + {{- else }} + serviceName: {{ .service.name }} + servicePort: {{ .service.port.number }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/website/templates/service.yaml b/helm/website/templates/service.yaml new file mode 100644 index 00000000..d6738586 --- /dev/null +++ b/helm/website/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "webtransport-rs.fullname" . }} + labels: + {{- include "webtransport-rs.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.appPort }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "webtransport-rs.selectorLabels" . | nindent 4 }} \ No newline at end of file diff --git a/helm/website/values.yaml b/helm/website/values.yaml new file mode 100644 index 00000000..ad5f451c --- /dev/null +++ b/helm/website/values.yaml @@ -0,0 +1,72 @@ +# Default values for webtransport-rs. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. +nameOverride: "" +fullnameOverride: "" +replicaCount: 1 +image: + repository: securityunion/video-call-rs-website + pullPolicy: Always + tag: 260113d +tlsSecret: videocall-rs-tls +env: + - name: RUST_LOG + value: info,quinn=warn + - name: LISTEN_URL + value: 0.0.0.0:443 + - name: LEPTOS_SITE_ADDR + value: 0.0.0.0:80 + - name: CERT_PATH + value: /certs/tls.crt + - name: KEY_PATH + value: /certs/tls.key +resources: {} +podAnnotations: {} +podSecurityContext: {} +securityContext: {} +service: + type: NodePort + appPort: 80 + port: 443 + healthPort: 8080 +nodeSelector: + node-role: worker +tolerations: [] +affinity: + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app + operator: Exists + topologyKey: "kubernetes.io/hostname" +ingress: + enabled: true + className: nginx + annotations: + cert-manager.io/issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/ssl-redirect: "true" + kubernetes.io/tls-acme: "true" + external-dns.alpha.kubernetes.io/hostname: "videocall.rs" + hosts: + - host: www.videocall.rs + paths: + - path: / + pathType: Prefix + service: + name: videocall-rs + port: + number: 80 + - host: videocall.rs + paths: + - path: / + pathType: Prefix + service: + name: videocall-rs + port: + number: 80 + tls: + - secretName: webt-rs-tls + hosts: + - videocall.rs + - 'www.videocall.rs' \ No newline at end of file diff --git a/leptos-website/.dockerignore b/leptos-website/.dockerignore new file mode 100644 index 00000000..a5bd1f12 --- /dev/null +++ b/leptos-website/.dockerignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# These are backup files generated by rustfmt +**/*.rs.bk +.direnv \ No newline at end of file diff --git a/leptos-website/.envrc b/leptos-website/.envrc new file mode 100644 index 00000000..3550a30f --- /dev/null +++ b/leptos-website/.envrc @@ -0,0 +1 @@ +use flake diff --git a/leptos-website/.gitignore b/leptos-website/.gitignore new file mode 100644 index 00000000..a5bd1f12 --- /dev/null +++ b/leptos-website/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# These are backup files generated by rustfmt +**/*.rs.bk +.direnv \ No newline at end of file diff --git a/leptos-website/Cargo.lock b/leptos-website/Cargo.lock new file mode 100644 index 00000000..346dc2a8 --- /dev/null +++ b/leptos-website/Cargo.lock @@ -0,0 +1,3393 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "anyhow" +version = "1.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" + +[[package]] +name = "async-compression" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b74f44609f0f91493e3082d3734d98497e094777144380ea4db9f9905dd5b6" +dependencies = [ + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-recursion" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "async-trait" +version = "0.1.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "async_once" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ce4f10ea3abcd6617873bae9f91d1c5332b4a778bd9ce34d0cd517474c1de82" + +[[package]] +name = "atoi" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" +dependencies = [ + "num-traits", +] + +[[package]] +name = "attribute-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c94f43ede6f25dab1dea046bff84d85dea61bd49aba7a9011ad66c0d449077b" +dependencies = [ + "attribute-derive-macro", + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "attribute-derive-macro" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b409e2b2d2dc206d2c0ad3575a93f001ae21a1593e2d0c69b69c308e63f3b422" +dependencies = [ + "collection_literals", + "interpolator", + "manyhow", + "proc-macro-utils", + "proc-macro2", + "quote", + "quote-use", + "syn 2.0.32", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "axum-macros", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-extra" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a93e433be9382c737320af3924f7d5fc6f89c155cf2bf88949d8f5126fab283f" +dependencies = [ + "axum", + "axum-core", + "bytes", + "cookie", + "futures-util", + "http", + "http-body", + "mime", + "pin-project-lite", + "serde", + "tokio", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-macros" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdca6a10ecad987bda04e95606ef85a5417dcaac1a78455242d72e031e2b6b62" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "bytecheck" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", + "uuid", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cached" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc2fafddf188d13788e7099295a59b99e99b2148ab2195cae454e754cc099925" +dependencies = [ + "async-trait", + "async_once", + "cached_proc_macro 0.16.0", + "cached_proc_macro_types", + "futures", + "hashbrown 0.13.2", + "instant", + "lazy_static", + "once_cell", + "thiserror", + "tokio", +] + +[[package]] +name = "cached" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eb5776f28a149524d1d8623035760b4454ec881e8cf3838fa8d7e1b11254b3" +dependencies = [ + "cached_proc_macro 0.18.0", + "cached_proc_macro_types", + "hashbrown 0.13.2", + "instant", + "once_cell", + "thiserror", +] + +[[package]] +name = "cached_proc_macro" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10ca87c81aaa3a949dbbe2b5e6c2c45dbc94ba4897e45ea31ff9ec5087be3dc" +dependencies = [ + "cached_proc_macro_types", + "darling", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cached_proc_macro" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8245dd5f576a41c3b76247b54c15b0e43139ceeb4f732033e15be7c005176" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cached_proc_macro_types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663" + +[[package]] +name = "camino" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" + +[[package]] +name = "cc" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" + +[[package]] +name = "ciborium-ll" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "collection_literals" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" + +[[package]] +name = "colored" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" +dependencies = [ + "is-terminal", + "lazy_static", + "windows-sys 0.48.0", +] + +[[package]] +name = "common_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6d59c71e7dc3af60f0af9db32364d96a16e9310f3f5db2b55ed642162dd35" + +[[package]] +name = "config" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d379af7f68bfc21714c6c7dea883544201741d2ce8274bb12fa54f89507f52a7" +dependencies = [ + "async-trait", + "lazy_static", + "nom", + "pathdiff", + "serde", + "toml", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8aed40e4edbf4d3b4431ab260b63fdc40f5780a4766824329ea0f1eefe3c0f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const_format" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c990efc7a285731f9a4378d81aff2f0e85a2c8781a05ef0f8baa8dac54d0ff48" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e026b6ce194a874cb9cf32cd5772d1ef9767cc8fcb5765948d74f37a9d8b2bf6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cookie" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cpufeatures" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive-where" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bc1955a640c4464859ae700fbe48e666da6fdce99ce5fe1acd08dd295889d10" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "deunicode" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95203a6a50906215a502507c0f879a0ce7ff205a6111e2db2a5ef8e4bb92e43" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "drain_filter_polyfill" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "eyre" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "femark" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83ffa26f4395a5b79271ca2ced8ace4a619c32058fe97678ffbf50794a38b331" +dependencies = [ + "eyre", + "once_cell", + "pulldown-cmark", + "serde", + "slug", + "thiserror", + "tracing", + "tree-sitter", + "tree-sitter-c", + "tree-sitter-dockerfile", + "tree-sitter-go", + "tree-sitter-highlight", + "tree-sitter-html", + "tree-sitter-javascript", + "tree-sitter-json", + "tree-sitter-nix", + "tree-sitter-python", + "tree-sitter-rust", + "tree-sitter-toml", + "tree-sitter-typescript", +] + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project", + "spin 0.9.8", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot 0.11.2", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getopts" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + +[[package]] +name = "gloo-net" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "h2" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 1.9.3", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashlink" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" +dependencies = [ + "hashbrown 0.14.0", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html-escape" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" +dependencies = [ + "utf8-width", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.4.9", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "interpolator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" + +[[package]] +name = "inventory" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53088c87cf71c9d4f3372a2cb9eea1e7b8a0b1bf8b7f7d23fe5b76dbb07e63b" + +[[package]] +name = "ipnet" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "leptos" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "cfg-if", + "leptos_config", + "leptos_dom", + "leptos_macro", + "leptos_reactive", + "leptos_server", + "serde", + "serde_json", + "server_fn", + "tracing", + "typed-builder", + "typed-builder-macro", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_axum" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "axum", + "cfg-if", + "futures", + "http", + "hyper", + "leptos", + "leptos_integration_utils", + "leptos_meta", + "leptos_router", + "once_cell", + "parking_lot 0.12.1", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "leptos_config" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "config", + "regex", + "serde", + "thiserror", + "typed-builder", +] + +[[package]] +name = "leptos_dom" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "async-recursion", + "cfg-if", + "drain_filter_polyfill", + "futures", + "getrandom", + "html-escape", + "indexmap 2.0.0", + "itertools 0.10.5", + "js-sys", + "leptos_reactive", + "once_cell", + "pad-adapter", + "paste", + "rustc-hash", + "serde", + "serde_json", + "server_fn", + "smallvec", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "leptos_hot_reload" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "anyhow", + "camino", + "indexmap 2.0.0", + "parking_lot 0.12.1", + "proc-macro2", + "quote", + "rstml", + "serde", + "syn 2.0.32", + "walkdir", +] + +[[package]] +name = "leptos_integration_utils" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "futures", + "leptos", + "leptos_config", + "leptos_hot_reload", + "leptos_meta", + "tracing", +] + +[[package]] +name = "leptos_macro" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "attribute-derive", + "cfg-if", + "convert_case", + "html-escape", + "itertools 0.11.0", + "leptos_hot_reload", + "prettyplease", + "proc-macro-error", + "proc-macro2", + "quote", + "rstml", + "server_fn_macro", + "syn 2.0.32", + "tracing", + "uuid", +] + +[[package]] +name = "leptos_meta" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "cfg-if", + "indexmap 2.0.0", + "leptos", + "tracing", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_reactive" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "base64", + "cfg-if", + "futures", + "indexmap 2.0.0", + "js-sys", + "pin-project", + "rkyv", + "rustc-hash", + "self_cell", + "serde", + "serde-wasm-bindgen", + "serde_json", + "slotmap", + "thiserror", + "tokio", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "leptos_router" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "cached 0.45.1", + "cfg-if", + "common_macros", + "gloo-net", + "js-sys", + "lazy_static", + "leptos", + "leptos_integration_utils", + "leptos_meta", + "linear-map", + "lru", + "once_cell", + "percent-encoding", + "regex", + "serde", + "serde_json", + "serde_qs", + "thiserror", + "tracing", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "leptos_server" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "inventory", + "lazy_static", + "leptos_macro", + "leptos_reactive", + "serde", + "server_fn", + "thiserror", + "tracing", +] + +[[package]] +name = "leptos_website" +version = "0.1.0" +dependencies = [ + "axum", + "axum-extra", + "cached 0.43.0", + "cfg-if", + "console_error_panic_hook", + "console_log", + "femark", + "futures", + "http", + "leptos", + "leptos_axum", + "leptos_meta", + "leptos_router", + "log", + "serde", + "simple_logger", + "sqlx", + "thiserror", + "tokio", + "tower", + "tower-http", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "libsqlite3-sys" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linear-map" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" +dependencies = [ + "serde", + "serde_test", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "lru" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a83fb7698b3643a0e34f9ae6f2e8f0178c0fd42f8b59d493aa271ff3a5bf21" +dependencies = [ + "hashbrown 0.14.0", +] + +[[package]] +name = "manyhow" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b76546495d933baa165075b95c0a15e8f7ef75e53f56b19b7144d80fd52bd" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "manyhow-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ba072c0eadade3160232e70893311f1f8903974488096e2eb8e48caba2f0cf1" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + +[[package]] +name = "matchit" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "pad-adapter" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d80efc4b6721e8be2a10a5df21a30fa0b470f1539e53d8b4e6e75faf938b63" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.8", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "prettyplease" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" +dependencies = [ + "proc-macro2", + "syn 2.0.32", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-utils" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f59e109e2f795a5070e69578c4dc101068139f74616778025ae1011d4cd41a8" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", + "version_check", + "yansi", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pulldown-cmark" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" +dependencies = [ + "bitflags 1.3.2", + "getopts", + "memchr", + "unicase", +] + +[[package]] +name = "quote" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quote-use" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e9a38ef862d7fec635661503289062bc5b3035e61859a8de3d3f81823accd2" +dependencies = [ + "derive-where", + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "rend" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.11.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rkyv" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +dependencies = [ + "bitvec", + "bytecheck", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rstml" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6522514806fbc2fc4c3d54ee9cc01e928fa00e1c988af4c730a64f57637ad7cf" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.32", + "syn_derive", + "thiserror", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "172891ebdceb05aa0005f533a6cbfca599ddd7d966f6f5d4d9b2e70478e70399" +dependencies = [ + "bitflags 2.3.3", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "serde_json" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_qs" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" +dependencies = [ + "percent-encoding", + "serde", + "thiserror", +] + +[[package]] +name = "serde_test" +version = "1.0.176" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a2f49ace1498612d14f7e0b8245519584db8299541dfe31a06374a828d620ab" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "server_fn" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "ciborium", + "const_format", + "gloo-net", + "inventory", + "js-sys", + "lazy_static", + "once_cell", + "proc-macro2", + "quote", + "reqwest", + "serde", + "serde_json", + "serde_qs", + "server_fn_macro_default", + "syn 2.0.32", + "thiserror", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "const_format", + "proc-macro-error", + "proc-macro2", + "quote", + "serde", + "syn 2.0.32", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro_default" +version = "0.5.1" +source = "git+https://github.com/leptos-rs/leptos#f3508cef36e4f5628692bbd8fbcbd50fe69bc2d3" +dependencies = [ + "server_fn_macro", + "syn 2.0.32", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "simple_logger" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2230cd5c29b815c9b699fb610b49a5ed65588f3509d9f0108be3a885da629333" +dependencies = [ + "colored", + "log", + "time", + "windows-sys 0.42.0", +] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +dependencies = [ + "serde", + "version_check", +] + +[[package]] +name = "slug" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" +dependencies = [ + "deunicode", +] + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "sqlformat" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" +dependencies = [ + "itertools 0.10.5", + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8de3b03a925878ed54a954f621e64bf55a3c1bd29652d0d1a17830405350188" +dependencies = [ + "sqlx-core", + "sqlx-macros", +] + +[[package]] +name = "sqlx-core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa8241483a83a3f33aa5fff7e7d9def398ff9990b2752b6c6112b83c6d246029" +dependencies = [ + "ahash 0.7.8", + "atoi", + "bitflags 1.3.2", + "byteorder", + "bytes", + "crc", + "crossbeam-queue", + "dotenvy", + "either", + "event-listener", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "hashlink", + "hex", + "indexmap 1.9.3", + "itoa", + "libc", + "libsqlite3-sys", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rustls", + "rustls-pemfile", + "sha2", + "smallvec", + "sqlformat", + "sqlx-rt", + "stringprep", + "thiserror", + "tokio-stream", + "url", + "webpki-roots", +] + +[[package]] +name = "sqlx-macros" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9966e64ae989e7e575b19d7265cb79d7fc3cbbdf179835cb0d716f294c2049c9" +dependencies = [ + "dotenvy", + "either", + "heck", + "once_cell", + "proc-macro2", + "quote", + "sha2", + "sqlx-core", + "sqlx-rt", + "syn 1.0.109", + "url", +] + +[[package]] +name = "sqlx-rt" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804d3f245f894e61b1e6263c84b23ca675d96753b5abfd5cc8597d86806e8024" +dependencies = [ + "once_cell", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "stringprep" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3737bde7edce97102e0e2b15365bf7a20bfdb5f60f4f9e8d7004258a51a8da" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8128874d02f9a114ade6d9ad252078cb32d3cb240e26477ac73d7e9c495c605e" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3ce25f50619af8b0aec2eb23deebe84249e19e2ddd393a6e16e3300a6dadfd" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot 0.12.1", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.5.3", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "futures-util", + "hashbrown 0.12.3", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ae70283aba8d2a8b411c695c437fe25b8b5e44e23e780662002fc72fb47a82" +dependencies = [ + "async-compression", + "bitflags 2.3.3", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "httpdate", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tree-sitter" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e747b1f9b7b931ed39a548c1fae149101497de3c1fc8d9e18c62c1a66c683d3d" +dependencies = [ + "cc", + "regex", +] + +[[package]] +name = "tree-sitter-c" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9bf56ce53d01af84b031acbbb465cc0689eb3a679801b6163726a3695f7a37" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-dockerfile" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01e314ed278a8392df8579f3a2321959118cdaced00cf90cc9a1230c6f7637a5" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-go" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71967701c8214be4aa77e0260e98361e6fd71ceec1d9d03abb37a22c9f60d0ff" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-highlight" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "042342584c5a7a0b833d9fc4e2bdab3f9868ddc6c4b339a1e01451c6720868bc" +dependencies = [ + "regex", + "thiserror", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-html" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "184e6b77953a354303dc87bf5fe36558c83569ce92606e7b382a0dc1b7443443" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-javascript" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2490fab08630b2c8943c320f7b63473cbf65511c8d83aec551beb9b4375906ed" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-json" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90b04c4e1a92139535eb9fca4ec8fa9666cc96b618005d3ae35f3c957fa92f92" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-nix" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8c93b7dd2afcd9667daae048135be9ee268e9e3900f4d7d0556a63ec5336b1" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-python" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83c46916553ebc2a5b23763cd2da8d2b104c515c8f828eb678d1477ccd8c379c" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-rust" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "797842733e252dc11ae5d403a18060bf337b822fc2ae5ddfaa6ff4d9cc20bda6" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-toml" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca517f578a98b23d20780247cc2688407fa81effad5b627a5a364ec3339b53e8" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "tree-sitter-typescript" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "079c695c32d39ad089101c66393aeaca30e967fba3486a91f573d2f0e12d290a" +dependencies = [ + "cc", + "tree-sitter", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "typed-builder" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34085c17941e36627a879208083e25d357243812c30e7d7387c3b954f30ade16" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f03ca4cb38206e2bef0700092660bb74d696f808514dae47fa1467cbfe26e96e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8-width" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" + +[[package]] +name = "uuid" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +dependencies = [ + "getrandom", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.32", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xxhash-rust" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "735a71d46c4d68d71d4b24d03fdc2b98e38cea81730595801db779c04fe80d70" + +[[package]] +name = "yansi" +version = "1.0.0-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee746ad3851dd3bc40e4a028ab3b00b99278d929e48957bcb2d111874a7e43e" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] diff --git a/leptos-website/Cargo.toml b/leptos-website/Cargo.toml new file mode 100644 index 00000000..baf0a38c --- /dev/null +++ b/leptos-website/Cargo.toml @@ -0,0 +1,142 @@ +[package] +name = "leptos_website" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +cached = { version = "0.43", optional = true } +console_log = "1.0.0" +console_error_panic_hook = "0.1.7" +futures = "0.3.25" +cfg-if = "1.0.0" +leptos = { git = "https://github.com/leptos-rs/leptos", features = [ + "nightly", + "experimental-islands", +] } +leptos_axum = { git = "https://github.com/leptos-rs/leptos", optional = true, features = [ + "experimental-islands", +] } +leptos_meta = { git = "https://github.com/leptos-rs/leptos", features = [ + "nightly", +] } +leptos_router = { git = "https://github.com/leptos-rs/leptos", features = [ + "nightly", +] } +log = "0.4.17" +simple_logger = "4.0.0" +serde = { version = "1", features = ["derive"] } +axum = { version = "0.6.1", optional = true } +tower = { version = "0.4.13", optional = true } +tower-http = { version = "0.4", features = [ + "compression-gzip", + "fs", + "trace", +], optional = true } +tokio = { version = "1.22.0", features = ["full"], optional = true } +http = { version = "0.2.8" } +sqlx = { version = "0.6.2", features = [ + "runtime-tokio-rustls", + "sqlite", +], optional = true } +thiserror = "1.0.38" +wasm-bindgen = "0.2.85" +femark = { version = "=0.1.3", optional = true } +axum-extra = { version = "0.7.4", optional = true, features = ["cookie"] } +web-sys = { version = "0.3", optional = true, features = [ + "HtmlDocument", + "MediaQueryList", +] } + +[features] +default = ["csr"] +csr = ["leptos/csr", "leptos_meta/csr", "leptos_router/csr"] +hydrate = [ + "leptos/hydrate", + "leptos_meta/hydrate", + "leptos_router/hydrate", + "dep:web-sys", +] +ssr = [ + "dep:axum", + "dep:tower", + "dep:tower-http", + "dep:tokio", + "dep:sqlx", + "leptos/ssr", + "leptos_meta/ssr", + "leptos_router/ssr", + "dep:leptos_axum", + "dep:femark", + "dep:cached", + "dep:axum-extra", +] + +[package.metadata.cargo-all-features] +denylist = [ + "axum", + "tower", + "tower-http", + "tokio", + "sqlx", + "leptos_axum", + "femark", +] +skip_feature_sets = [["csr", "ssr"], ["csr", "hydrate"], ["ssr", "hydrate"]] + +[profile.wasm-release] +inherits = "release" +lto = true +opt-level = 'z' +codegen-units = 1 + +[package.metadata.leptos] +# The name used by wasm-bindgen/cargo-leptos for the JS/WASM bundle. Defaults to the crate name +output-name = "leptos_website" +# The site root folder is where cargo-leptos generate all output. WARNING: all content of this folder will be erased on a rebuild. Use it in your server setup. +site-root = "target/site" +# The site-root relative folder where all compiled output (JS, WASM and CSS) is written +# Defaults to pkg +site-pkg-dir = "pkg" +# [Optional] The source CSS file. If it ends with .sass or .scss then it will be compiled by dart-sass into CSS. The CSS is optimized by Lightning CSS before being written to <site-root>/<site-pkg>/app.css +style-file = "style/output.css" +# [Optional] Files in the asset-dir will be copied to the site-root directory +assets-dir = "public" +# The IP and port (ex: 127.0.0.1:3000) where the server serves the content. Use it in your server setup. +site-addr = "127.0.0.1:3000" +# The port to use for automatic reload monitoring +reload-port = 3001 +# [Optional] Command to use when running end2end tests. It will run in the end2end dir. +end2end-cmd = "npx playwright test" +# The browserlist query used for optimizing the CSS. +browserquery = "defaults" +# Set by cargo-leptos watch when building with tha tool. Controls whether autoreload JS will be included in the head +watch = false +# The environment Leptos will run in, usually either "DEV" or "PROD" +env = "DEV" +# The features to use when compiling the bin target +# +# Optional. Can be over-ridden with the command line parameter --bin-features +bin-features = ["ssr"] + +# If the --no-default-features flag should be used when compiling the bin target +# +# Optional. Defaults to false. +bin-default-features = false + +# The features to use when compiling the lib target +# +# Optional. Can be over-ridden with the command line parameter --lib-features +lib-features = ["hydrate"] + +# If the --no-default-features flag should be used when compiling the lib target +# +# Optional. Defaults to false. +lib-default-features = false + +# The profile to use for the lib target when compiling for release +# +# Optional. Defaults to "release". +lib-profile-release = "wasm-release" diff --git a/leptos-website/LICENSE b/leptos-website/LICENSE new file mode 100644 index 00000000..ff56c294 --- /dev/null +++ b/leptos-website/LICENSE @@ -0,0 +1,43 @@ +MIT License + +Copyright (c) 2024 Security Union LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +MIT License + +Copyright (c) 2022 Greg Johnston + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/leptos-website/Makefile.toml b/leptos-website/Makefile.toml new file mode 100644 index 00000000..ab917560 --- /dev/null +++ b/leptos-website/Makefile.toml @@ -0,0 +1,9 @@ +[tasks.build] +command = "cargo" +args = ["+nightly", "build-all-features"] +install_crate = "cargo-all-features" + +[tasks.check] +command = "cargo" +args = ["+nightly", "check-all-features"] +install_crate = "cargo-all-features" diff --git a/leptos-website/README.md b/leptos-website/README.md new file mode 100644 index 00000000..416711f7 --- /dev/null +++ b/leptos-website/README.md @@ -0,0 +1,42 @@ +# Leptos Website + +A Repo for the [public facing Leptos website](https://leptos.dev/). Still a WIP. + +## Client Side Rendering +This example cannot be built as a trunk standalone CSR-only app. Only the server may directly connect to the database. + +## Server Side Rendering with cargo-leptos +cargo-leptos is now the easiest and most featureful way to build server side rendered apps with hydration. It provides automatic recompilation of client and server code, wasm optimisation, CSS minification, and more! Check out more about it [here](https://github.com/akesson/cargo-leptos) + +1. Install cargo-leptos +```bash +cargo install --locked cargo-leptos +``` +2. Build the site in watch mode, recompiling on file changes +```bash +cargo leptos watch +``` + +Open browser on [http://localhost:3000/](http://localhost:3000/) + +3. When ready to deploy, run +```bash +cargo leptos build --release +``` + +## Server Side Rendering without cargo-leptos +To run it as a server side app with hydration, you'll need to have wasm-pack installed. + +0. Edit the `[package.metadata.leptos]` section and set `site-root` to `"."`. You'll also want to change the path of the `<StyleSheet / >` component in the root component to point towards the CSS file in the root. This tells leptos that the WASM/JS files generated by wasm-pack are available at `./pkg` and that the CSS files are no longer processed by cargo-leptos. Building to alternative folders is not supported at this time. You'll also want to edit the call to `get_configuration()` to pass in `Some(Cargo.toml)`, so that Leptos will read the settings instead of cargo-leptos. If you do so, your file/folder names cannot include dashes. +1. Install wasm-pack +```bash +cargo install wasm-pack +``` +2. Build the Webassembly used to hydrate the HTML from the server +```bash +wasm-pack build --target=web --debug --no-default-features --features=hydrate +``` +3. Run the server to serve the Webassembly, JS, and HTML +```bash +cargo run --no-default-features --features=ssr +``` diff --git a/leptos-website/Todos.db b/leptos-website/Todos.db new file mode 100644 index 00000000..c9e91811 Binary files /dev/null and b/leptos-website/Todos.db differ diff --git a/leptos-website/build_and_push_docker.sh b/leptos-website/build_and_push_docker.sh new file mode 100755 index 00000000..4042535c --- /dev/null +++ b/leptos-website/build_and_push_docker.sh @@ -0,0 +1,13 @@ +TAG=$(git rev-parse --short HEAD) +FROM=type=local,src=/var/lib/docker/volumes/buildx_buildkit_jovial_mcclintock0_state +TO=type=local,dest=cachebuildx_buildkit_jovial_mcclintock0_state +echo "Building and pushing docker image with tag $TAG" +docker buildx create --use +docker buildx build \ +--platform linux/arm64 \ +-f ../docker/Dockerfile.website \ +--cache-from=$FROM \ +--cache-to=$TO \ +-t securityunion/video-call-rs-website \ +--load . +# docker push securityunion/video-call-rs-website:$TAG \ No newline at end of file diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/08751abf6348a21ab7f00ad14392dac4349fe23bf977e639aaefd2fb0239f5ea b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/08751abf6348a21ab7f00ad14392dac4349fe23bf977e639aaefd2fb0239f5ea new file mode 100644 index 00000000..b0ec0494 --- /dev/null +++ b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/08751abf6348a21ab7f00ad14392dac4349fe23bf977e639aaefd2fb0239f5ea @@ -0,0 +1 @@ +{"schemaVersion":2,"mediaType":"application/vnd.oci.image.index.v1+json","manifests":[{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:3b1d2354a65299f651509bbb258b85ee0a5e074bb8af3c450b5f0dfb6adf51e2","size":4506802,"annotations":{"buildkit/createdat":"2024-08-31T18:40:23.446014083Z","containerd.io/uncompressed":"sha256:a71d6961a5534251c1e2f878c1fe0271401f95ffc966b396c5475b118d923b52"}},{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:45c6c5f320e38d2aa1864b36caf40198b7cddcf8c77a7c26339f5c2e7594f0e2","size":401319,"annotations":{"buildkit/createdat":"2024-08-31T18:40:23.464936875Z","containerd.io/uncompressed":"sha256:f14c7e6deaf508e350aaf749f162159584e214ed1d0a6c0eaca1af5d2426d111"}},{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1","size":32,"annotations":{"buildkit/createdat":"2024-08-31T18:40:23.487323791Z","containerd.io/uncompressed":"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"}},{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:aa6fbc30c84e14e64571d3d7b547ea801dfca8a7bd74bd930b5ea5de3eb2f442","size":29156528,"annotations":{"buildkit/createdat":"2024-08-31T18:32:31.610485462Z","containerd.io/uncompressed":"sha256:07d2ee3f57121ff2c3c8279d6f8d3236f2c835fd616f5c9b4e3346c30b90a36d"}},{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:efc996aa95d2ea97b2fff109a6f8939e64971c2d79b4834dbf7461c5faddfffb","size":1726,"annotations":{"buildkit/createdat":"2024-08-31T18:40:23.476767541Z","containerd.io/uncompressed":"sha256:39edcb0894e5b702ef5dcb8643baa09bde3301e102bb565d103f52628b010f32"}},{"mediaType":"application/vnd.buildkit.cacheconfig.v0","digest":"sha256:df521774fc04848b7f07c11b03a319ee85e8aa11b6bf2eb6f2bad4b6db6a710b","size":3516}]} \ No newline at end of file diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/3b1d2354a65299f651509bbb258b85ee0a5e074bb8af3c450b5f0dfb6adf51e2 b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/3b1d2354a65299f651509bbb258b85ee0a5e074bb8af3c450b5f0dfb6adf51e2 new file mode 100644 index 00000000..78e5538f Binary files /dev/null and b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/3b1d2354a65299f651509bbb258b85ee0a5e074bb8af3c450b5f0dfb6adf51e2 differ diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/442ba446f94b680572e59f6f076fbdef793301102c825ae211b2246c605f9af5 b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/442ba446f94b680572e59f6f076fbdef793301102c825ae211b2246c605f9af5 new file mode 100644 index 00000000..bf5e3e48 Binary files /dev/null and b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/442ba446f94b680572e59f6f076fbdef793301102c825ae211b2246c605f9af5 differ diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/45c6c5f320e38d2aa1864b36caf40198b7cddcf8c77a7c26339f5c2e7594f0e2 b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/45c6c5f320e38d2aa1864b36caf40198b7cddcf8c77a7c26339f5c2e7594f0e2 new file mode 100644 index 00000000..9e1b54ce Binary files /dev/null and b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/45c6c5f320e38d2aa1864b36caf40198b7cddcf8c77a7c26339f5c2e7594f0e2 differ diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/4daa4e094fa64ec2bbd3e3fc37eb66fe068b2e7827a1c8c11ce204585e05e11f b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/4daa4e094fa64ec2bbd3e3fc37eb66fe068b2e7827a1c8c11ce204585e05e11f new file mode 100644 index 00000000..18705849 Binary files /dev/null and b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/4daa4e094fa64ec2bbd3e3fc37eb66fe068b2e7827a1c8c11ce204585e05e11f differ diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 new file mode 100644 index 00000000..8de86822 Binary files /dev/null and b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 differ diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/7341e416f6af4646c0ba47646a690b7646afad159888588c40ce3cd56f540adf b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/7341e416f6af4646c0ba47646a690b7646afad159888588c40ce3cd56f540adf new file mode 100644 index 00000000..a492f641 Binary files /dev/null and b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/7341e416f6af4646c0ba47646a690b7646afad159888588c40ce3cd56f540adf differ diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/7c2084ef72a9163fce828ced89efe3ffa8bc15f2b22868a16cf249229bcbf691 b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/7c2084ef72a9163fce828ced89efe3ffa8bc15f2b22868a16cf249229bcbf691 new file mode 100644 index 00000000..c04947a3 --- /dev/null +++ b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/7c2084ef72a9163fce828ced89efe3ffa8bc15f2b22868a16cf249229bcbf691 @@ -0,0 +1 @@ +{"schemaVersion":2,"mediaType":"application/vnd.oci.image.index.v1+json","manifests":[{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:442ba446f94b680572e59f6f076fbdef793301102c825ae211b2246c605f9af5","size":1726,"annotations":{"buildkit/createdat":"2024-08-31T18:27:59.405186336Z","containerd.io/uncompressed":"sha256:bdb36cdf747912ec7ae270b4364b5db88fddd99b075fd7e19b72d6dec4418fc4"}},{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:4daa4e094fa64ec2bbd3e3fc37eb66fe068b2e7827a1c8c11ce204585e05e11f","size":401316,"annotations":{"buildkit/createdat":"2024-08-31T18:27:59.392584544Z","containerd.io/uncompressed":"sha256:d0a0133da646e80deacd06822c88a51a021dbf3b0ce3274ecb5c8541827f6583"}},{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1","size":32,"annotations":{"buildkit/createdat":"2024-08-31T18:27:59.427323253Z","containerd.io/uncompressed":"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"}},{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:7341e416f6af4646c0ba47646a690b7646afad159888588c40ce3cd56f540adf","size":4507403,"annotations":{"buildkit/createdat":"2024-08-31T18:27:59.373934711Z","containerd.io/uncompressed":"sha256:80c930365b238fd8f21288cb4817356d29890993417172aa98317b64c3b383f3"}},{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:aa6fbc30c84e14e64571d3d7b547ea801dfca8a7bd74bd930b5ea5de3eb2f442","size":29156528,"annotations":{"buildkit/createdat":"2024-08-31T18:19:20.456550846Z","containerd.io/uncompressed":"sha256:07d2ee3f57121ff2c3c8279d6f8d3236f2c835fd616f5c9b4e3346c30b90a36d"}},{"mediaType":"application/vnd.buildkit.cacheconfig.v0","digest":"sha256:a687cbe181a8c6d2c86b141a94f32e7fcd0ff6ab0b91991584a1f22074798a76","size":3518}]} \ No newline at end of file diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/a687cbe181a8c6d2c86b141a94f32e7fcd0ff6ab0b91991584a1f22074798a76 b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/a687cbe181a8c6d2c86b141a94f32e7fcd0ff6ab0b91991584a1f22074798a76 new file mode 100644 index 00000000..91f20c2e --- /dev/null +++ b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/a687cbe181a8c6d2c86b141a94f32e7fcd0ff6ab0b91991584a1f22074798a76 @@ -0,0 +1 @@ +{"layers":[{"blob":"sha256:442ba446f94b680572e59f6f076fbdef793301102c825ae211b2246c605f9af5","parent":1},{"blob":"sha256:4daa4e094fa64ec2bbd3e3fc37eb66fe068b2e7827a1c8c11ce204585e05e11f","parent":3},{"blob":"sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1"},{"blob":"sha256:7341e416f6af4646c0ba47646a690b7646afad159888588c40ce3cd56f540adf","parent":4},{"blob":"sha256:aa6fbc30c84e14e64571d3d7b547ea801dfca8a7bd74bd930b5ea5de3eb2f442","parent":-1}],"records":[{"digest":"sha256:0b7ec3a160616f50903923a3793cb906a4f6111d1a919121fba0a2210be5b00c","inputs":[[{"link":8}],[{"link":14}]]},{"digest":"sha256:0f12fb98f7c70b9ffdb6c9bdbe2270aeb9c5b70d72f43b80141240c30454ce02"},{"digest":"sha256:0face0941cc4ba8962e0f57a5eb20656faba3de161ef3c6ed5ace8ad4e0c5567"},{"digest":"sha256:2b3a8c8018c5f77f0f25408c28041369594c5616b748c60782663d96ab59b30b","inputs":[[{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":16}]]},{"layers":[{"layer":3,"createdAt":"2024-08-31T18:27:59.375443086Z"}],"digest":"sha256:37402ccd25e2a5096fbe50f077b52dca92ec0abcf78cd5031a51f8baef244b08","inputs":[[{"link":10},{"link":15}],[{"link":2},{"selector":"sha256:ed294c9eb7626ff51fb4b0448276d6f3b54006a041e3acc4b3f23b7eed297aef","link":17}]]},{"digest":"sha256:68d98a5648d019230d3cf315c3e360a893325132ae3133c65fab94927b5737b3","inputs":[[{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":3}]]},{"layers":[{"layer":0,"createdAt":"2024-08-31T18:27:59.406549794Z"}],"digest":"sha256:730badd261733ab4176a5cad9a1bcbcd2735442442328a80bf6b62e49f4e9894","inputs":[[{"link":18}],[{"link":9},{"selector":"sha256:911a803570c67ebd4cbcd8e67e16dbe8575cdf1cdcaa5abd2fdb33655abe3c0e","link":17}]]},{"layers":[{"layer":2,"createdAt":"2024-08-31T18:27:59.428492753Z"}],"digest":"sha256:807b3e8722c68572736f54d83fd741a5b1d69ccbef218fae52b4149a56d232ce","inputs":[[{"link":6}]]},{"digest":"sha256:807b3e8722c68572736f54d83fd741a5b1d69ccbef218fae52b4149a56d232ce","inputs":[[{"link":13}]]},{"digest":"sha256:855342413262a7b735f58acb18b31d132868c9069833ff68bbd703610eaf9655"},{"digest":"sha256:928cbbf8ac15ea25e078848d137ff0fadc98e0b98c6973aaf78913237d96c1c4"},{"digest":"sha256:a8eaf6a6d800041678cb53f382e74dfed726c97c6b709b3c19ffc0e9ca0fafcd"},{"digest":"sha256:aac0ff481f630988347a9bbbf6328a3e27f940e39f75a64b1f0546c270e0016f"},{"digest":"sha256:b97397be6886535176ebc792b1e63cd9ea902805d25424b822579c5c25c3da12","inputs":[[{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":5}]]},{"digest":"sha256:c6dfc378ae4216f6ddd363c463121ed74210cdd9a6160541cd371aa4276bb060"},{"digest":"sha256:cda1dd86b906c3346a6fa0bbe9401d640eaa55b0cbcf05a4d01a0e7c2d94f6c3"},{"digest":"sha256:ce181f5e256821a948b08f283e89e96788de84b9bf9780147e2479cd9a82ece7","inputs":[[{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":1},{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":12}]]},{"digest":"sha256:e0c278a19bac000bc0eabc34628008bb03dc088ab7071ca06ada3835f2324772","inputs":[[{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":0}]]},{"layers":[{"layer":1,"createdAt":"2024-08-31T18:27:59.393436753Z"}],"digest":"sha256:f5515978751e6f128e01de1f15f2797a4cdb1cee0257483d946202649190e7e1","inputs":[[{"link":4}],[{"link":11},{"selector":"sha256:c997c3f67e0f41530576a3521806de70371bba671252cbf9fd411a6a5d8f7faf","link":17}]]}]} \ No newline at end of file diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/aa6fbc30c84e14e64571d3d7b547ea801dfca8a7bd74bd930b5ea5de3eb2f442 b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/aa6fbc30c84e14e64571d3d7b547ea801dfca8a7bd74bd930b5ea5de3eb2f442 new file mode 100644 index 00000000..3a88c001 Binary files /dev/null and b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/aa6fbc30c84e14e64571d3d7b547ea801dfca8a7bd74bd930b5ea5de3eb2f442 differ diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/df521774fc04848b7f07c11b03a319ee85e8aa11b6bf2eb6f2bad4b6db6a710b b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/df521774fc04848b7f07c11b03a319ee85e8aa11b6bf2eb6f2bad4b6db6a710b new file mode 100644 index 00000000..e59feb08 --- /dev/null +++ b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/df521774fc04848b7f07c11b03a319ee85e8aa11b6bf2eb6f2bad4b6db6a710b @@ -0,0 +1 @@ +{"layers":[{"blob":"sha256:3b1d2354a65299f651509bbb258b85ee0a5e074bb8af3c450b5f0dfb6adf51e2","parent":3},{"blob":"sha256:45c6c5f320e38d2aa1864b36caf40198b7cddcf8c77a7c26339f5c2e7594f0e2"},{"blob":"sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1","parent":4},{"blob":"sha256:aa6fbc30c84e14e64571d3d7b547ea801dfca8a7bd74bd930b5ea5de3eb2f442","parent":-1},{"blob":"sha256:efc996aa95d2ea97b2fff109a6f8939e64971c2d79b4834dbf7461c5faddfffb","parent":1}],"records":[{"digest":"sha256:0b7ec3a160616f50903923a3793cb906a4f6111d1a919121fba0a2210be5b00c","inputs":[[{"link":7}],[{"link":13}]]},{"digest":"sha256:0f12fb98f7c70b9ffdb6c9bdbe2270aeb9c5b70d72f43b80141240c30454ce02"},{"digest":"sha256:2b3a8c8018c5f77f0f25408c28041369594c5616b748c60782663d96ab59b30b","inputs":[[{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":16}]]},{"layers":[{"layer":0,"createdAt":"2024-08-31T18:40:23.449748125Z"}],"digest":"sha256:37402ccd25e2a5096fbe50f077b52dca92ec0abcf78cd5031a51f8baef244b08","inputs":[[{"link":9},{"link":15}],[{"link":10},{"selector":"sha256:ed294c9eb7626ff51fb4b0448276d6f3b54006a041e3acc4b3f23b7eed297aef","link":17}]]},{"digest":"sha256:68d98a5648d019230d3cf315c3e360a893325132ae3133c65fab94927b5737b3","inputs":[[{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":2}]]},{"layers":[{"layer":4,"createdAt":"2024-08-31T18:40:23.479037541Z"}],"digest":"sha256:730badd261733ab4176a5cad9a1bcbcd2735442442328a80bf6b62e49f4e9894","inputs":[[{"link":18}],[{"link":8},{"selector":"sha256:911a803570c67ebd4cbcd8e67e16dbe8575cdf1cdcaa5abd2fdb33655abe3c0e","link":17}]]},{"layers":[{"layer":2,"createdAt":"2024-08-31T18:40:23.4886355Z"}],"digest":"sha256:807b3e8722c68572736f54d83fd741a5b1d69ccbef218fae52b4149a56d232ce","inputs":[[{"link":5}]]},{"digest":"sha256:807b3e8722c68572736f54d83fd741a5b1d69ccbef218fae52b4149a56d232ce","inputs":[[{"link":14}]]},{"digest":"sha256:855342413262a7b735f58acb18b31d132868c9069833ff68bbd703610eaf9655"},{"digest":"sha256:928cbbf8ac15ea25e078848d137ff0fadc98e0b98c6973aaf78913237d96c1c4"},{"digest":"sha256:a4666dd8b828100dde876691448f36b53766bd73fcf760dc110680fd26073644"},{"digest":"sha256:a8eaf6a6d800041678cb53f382e74dfed726c97c6b709b3c19ffc0e9ca0fafcd"},{"digest":"sha256:aac0ff481f630988347a9bbbf6328a3e27f940e39f75a64b1f0546c270e0016f"},{"digest":"sha256:adf004c5e6c438d8ffd38e1d19708d75599741d79cc5e3a0b199d57563c152c7"},{"digest":"sha256:b97397be6886535176ebc792b1e63cd9ea902805d25424b822579c5c25c3da12","inputs":[[{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":4}]]},{"digest":"sha256:cda1dd86b906c3346a6fa0bbe9401d640eaa55b0cbcf05a4d01a0e7c2d94f6c3"},{"digest":"sha256:ce181f5e256821a948b08f283e89e96788de84b9bf9780147e2479cd9a82ece7","inputs":[[{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":1},{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":12}]]},{"digest":"sha256:e0c278a19bac000bc0eabc34628008bb03dc088ab7071ca06ada3835f2324772","inputs":[[{"selector":"sha256:8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","link":0}]]},{"layers":[{"layer":1,"createdAt":"2024-08-31T18:40:23.466236583Z"}],"digest":"sha256:f5515978751e6f128e01de1f15f2797a4cdb1cee0257483d946202649190e7e1","inputs":[[{"link":3}],[{"link":11},{"selector":"sha256:c997c3f67e0f41530576a3521806de70371bba671252cbf9fd411a6a5d8f7faf","link":17}]]}]} \ No newline at end of file diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/efc996aa95d2ea97b2fff109a6f8939e64971c2d79b4834dbf7461c5faddfffb b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/efc996aa95d2ea97b2fff109a6f8939e64971c2d79b4834dbf7461c5faddfffb new file mode 100644 index 00000000..33e37b54 Binary files /dev/null and b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/blobs/sha256/efc996aa95d2ea97b2fff109a6f8939e64971c2d79b4834dbf7461c5faddfffb differ diff --git a/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/oci-layout b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/oci-layout new file mode 100644 index 00000000..1343d370 --- /dev/null +++ b/leptos-website/cachebuildx_buildkit_jovial_mcclintock0_state/oci-layout @@ -0,0 +1 @@ +{"imageLayoutVersion":"1.0.0"} \ No newline at end of file diff --git a/leptos-website/input.css b/leptos-website/input.css new file mode 100644 index 00000000..6dd832aa --- /dev/null +++ b/leptos-website/input.css @@ -0,0 +1,156 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +html { + font-size: 22px; + font-family: system-ui, Arial, Helvetica, sans-serif; + background-color: #0f191c; +} + +leptos-island { + display: contents; +} + +/* +CODE TOKENIZATION STUFF https://crates.io/crates/femark + + + +/* Color styles */ +.hh1 { color: #EF3939; } /* attribute */ +.hh2 { color: #A8DADC; } /* constant */ +.hh3 { color: #F2F8FA; } /* function.builtin */ +.hh4 { color: #F2F8FA; } /* function */ +.hh5 { color: #A8DADC; } /* keyword */ +.hh6 { color: #D2D7B4; } /* operator */ +.hh7 { color: #A8DADC; } /* property */ +.hh8 { color: #F2F8FA; } /* punctuation */ +.hh9 { color: #F2F8FA; } /* punctuation.bracket */ +.hh10 { color: #F2F8FA; } /* punctuation.delimiter */ +.hh11 { color: #F2F8FA; } /* string */ +.hh12 { color: #F2F8FA; } /* string.special */ +.hh13 { color: #F2F8FA; } /* tag */ +.hh14 { color: #D2D7B4; } /* type */ +.hh15 { color: #D2D7B4; } /* type.builtin */ +.hh16 { color: #A8DADC; } /* variable */ +.hh17 { color: #A8DADC; } /* variable.builtin */ +.hh18 { color: #F0ADA8; } /* variable.parameter */ +.hh19 { color: #F0ADA8; } /* comment */ +.hh20 { color: #D2D7B4; } /* macro */ +.hh21 { color: #D2D7B4; } /* label */ + +/* Code block styles */ +.code-block { + + /* background-color: #F1FAEE; + border-radius: 5px; + padding: 2.1em 2em; + font-size: 14px; + line-height: 1.4em; + position: relative; + max-width: fit-content; + box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + font-style: normal; + max-width: 800px; + overflow-x: scroll; */ +} + +.code-block .language-tag { + display: none; + /* position: absolute; + top: 0; + right: 0; + font-size: 14px; + background-color: #a5a5a5; + color: #0c181d; + border-radius: 0 5px 0 5px; + padding: 2px 7px; + font-weight: bold; + text-transform: uppercase; + font-style: normal; */ +} + +.code-block .code-block-inner { + font-family: 'courier new', courier, monospace; + font-style: normal; + +} + +pre i { + font-style: normal; +} + + +.ball { + display: inline-block; + width: 100%; + height: 100%; + margin: 0; + border-radius: 50%; + position: relative; + background: #18123A; +} + +.logo::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url("/images/face.svg") ; + animation: scrollBackground 5s linear infinite; + z-index: 1; +} + + + +.ball:before { + content: ""; + position: absolute; + background: radial-gradient(circle at 50% 120%, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0) 70%); + border-radius: 50%; + bottom: 2.5%; + left: 5%; + opacity: 0.6; + height: 100%; + width: 90%; + -webkit-filter: blur(5px); + z-index: 2; +} + +.ball:after { + width: 100%; + height: 100%; + content: ""; + position: absolute; + top: 2%; + left: 2%; + border-radius: 50%; + background: radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.25), rgba(255, 255, 255, 0.25) 14%, rgba(255, 255, 255, 0) 24%); + -webkit-transform: translateX(-80px) translateY(-90px) skewX(-20deg); + -moz-transform: translateX(-80px) translateY(-90px) skewX(-20deg); + -ms-transform: translateX(-80px) translateY(-90px) skewX(-20deg); + -o-transform: translateX(-80px) translateY(-90px) skewX(-20deg); + transform: translateX(-80px) translateY(-90px) skewX(-20deg); + -webkit-filter: blur(10px); + z-index:10; +} + + +.stage { + pointer-events: none; + display: block; + -webkit-perspective: 1200px; + -moz-perspective: 1200px; + -ms-perspective: 1200px; + -o-perspective: 1200px; + perspective: 1200px; + -webkit-perspective-origin: 50% 50%; + -moz-perspective-origin: 50% 50%; + -ms-perspective-origin: 50% 50%; + -o-perspective-origin: 50% 50%; + perspective-origin: 50% 50%; +} + diff --git a/leptos-website/public/.well-known/robots.txt b/leptos-website/public/.well-known/robots.txt new file mode 100644 index 00000000..f677fae7 --- /dev/null +++ b/leptos-website/public/.well-known/robots.txt @@ -0,0 +1 @@ +User-agent: * Disallow: / \ No newline at end of file diff --git a/leptos-website/public/favicon.ico b/leptos-website/public/favicon.ico new file mode 100644 index 00000000..2b90b08e Binary files /dev/null and b/leptos-website/public/favicon.ico differ diff --git a/leptos-website/public/images/discord_logo.svg b/leptos-website/public/images/discord_logo.svg new file mode 100644 index 00000000..cdde1df7 --- /dev/null +++ b/leptos-website/public/images/discord_logo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="800" height="800" preserveAspectRatio="xMidYMid" viewBox="0 -28.5 256 256"><path fill="#F2F8FA" d="M216.856 16.597A208.502 208.502 0 0 0 164.042 0c-2.275 4.113-4.933 9.645-6.766 14.046-19.692-2.961-39.203-2.961-58.533 0-1.832-4.4-4.55-9.933-6.846-14.046a207.809 207.809 0 0 0-52.855 16.638C5.618 67.147-3.443 116.4 1.087 164.956c22.169 16.555 43.653 26.612 64.775 33.193A161.094 161.094 0 0 0 79.735 175.3a136.413 136.413 0 0 1-21.846-10.632 108.636 108.636 0 0 0 5.356-4.237c42.122 19.702 87.89 19.702 129.51 0a131.66 131.66 0 0 0 5.355 4.237 136.07 136.07 0 0 1-21.886 10.653c4.006 8.02 8.638 15.67 13.873 22.848 21.142-6.58 42.646-16.637 64.815-33.213 5.316-56.288-9.08-105.09-38.056-148.36ZM85.474 135.095c-12.645 0-23.015-11.805-23.015-26.18s10.149-26.2 23.015-26.2c12.867 0 23.236 11.804 23.015 26.2.02 14.375-10.148 26.18-23.015 26.18Zm85.051 0c-12.645 0-23.014-11.805-23.014-26.18s10.148-26.2 23.014-26.2c12.867 0 23.236 11.804 23.015 26.2 0 14.375-10.148 26.18-23.015 26.18Z"/></svg> \ No newline at end of file diff --git a/leptos-website/public/images/face.svg b/leptos-website/public/images/face.svg new file mode 100644 index 00000000..b59b5a04 --- /dev/null +++ b/leptos-website/public/images/face.svg @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="400" + height="400" + viewBox="0 0 400 400" + version="1.1" + id="svg5" + inkscape:version="1.2 (dc2aeda, 2022-05-15)" + sodipodi:docname="face.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview7" + pagecolor="#505050" + bordercolor="#eeeeee" + borderopacity="1" + inkscape:showpageshadow="0" + inkscape:pageopacity="0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#505050" + inkscape:document-units="mm" + showgrid="false" + inkscape:zoom="1.907548" + inkscape:cx="149.9307" + inkscape:cy="195.8011" + inkscape:window-width="1920" + inkscape:window-height="1027" + inkscape:window-x="0" + inkscape:window-y="395" + inkscape:window-maximized="1" + inkscape:current-layer="layer1" /> + <defs + id="defs2"> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath2732"> + <circle + style="fill:none;stroke:#000000;stroke-width:4.14988;stroke-linecap:round;stroke-opacity:1" + id="circle2734" + cx="145.03644" + cy="142.29344" + r="132.80373" /> + </clipPath> + </defs> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g1922" + transform="matrix(0.87257093,0,0,0.87257093,33.48734,1.6285671)"> + <image + width="329.06616" + height="329.06616" + preserveAspectRatio="none" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIbGNtcwIQAABtbnRyUkdC IFhZWiAH4gADABQACQAOAB1hY3NwTVNGVAAAAABzYXdzY3RybAAAAAAAAAAAAAAAAAAA9tYAAQAA AADTLWhhbmSdkQA9QICwPUB0LIGepSKOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlk ZXNjAAAA8AAAAF9jcHJ0AAABDAAAAAx3dHB0AAABGAAAABRyWFlaAAABLAAAABRnWFlaAAABQAAA ABRiWFlaAAABVAAAABRyVFJDAAABaAAAAGBnVFJDAAABaAAAAGBiVFJDAAABaAAAAGBkZXNjAAAA AAAAAAV1UkdCAAAAAAAAAAAAAAAAdGV4dAAAAABDQzAAWFlaIAAAAAAAAPNUAAEAAAABFslYWVog AAAAAAAAb6AAADjyAAADj1hZWiAAAAAAAABilgAAt4kAABjaWFlaIAAAAAAAACSgAAAPhQAAtsRj dXJ2AAAAAAAAACoAAAB8APgBnAJ1A4MEyQZOCBIKGAxiDvQRzxT2GGocLiBDJKwpai5+M+s5sz/W RldNNlR2XBdkHWyGdVZ+jYgskjacq6eMstu+mcrH12Xkd/H5////2wBDAAcHBwcHBwwHBwwRDAwM ERcRERERFx4XFxcXFx4kHh4eHh4eJCQkJCQkJCQrKysrKysyMjIyMjg4ODg4ODg4ODj/2wBDAQkJ CQ4NDhkNDRk7KCEoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozv/wAARCAPAA8ADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL /8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2Jy ggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo 6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQD 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 " + id="image2338" + x="-14.628901" + y="1.4188" + clip-path="url(#clipPath2732)" + transform="matrix(1.2657875,0,0,1.2657875,8.7360068,-5.0805908)" /> + <circle + style="fill:none;stroke:#000000;stroke-width:5.25289;stroke-linecap:round;stroke-opacity:1" + id="circle1208-9-6" + cx="194.15161" + cy="175.28009" + r="168.1013" /> + </g> + <text + xml:space="preserve" + style="font-weight:bold;font-size:42.0111px;line-height:0;font-family:'Russo One';-inkscape-font-specification:'Russo One Bold';text-align:center;text-anchor:middle;fill:none;stroke:#000000;stroke-width:2.48097;stroke-linecap:round" + x="201.74275" + y="352.21188" + id="text469"><tspan + sodipodi:role="line" + id="tspan467" + x="201.74275" + y="352.21188" + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.48097">dario.lencina</tspan><tspan + sodipodi:role="line" + x="201.74275" + y="352.21188" + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.48097" + id="tspan1179" /></text> + <text + xml:space="preserve" + style="font-weight:bold;font-size:42.0111px;line-height:0;font-family:'Russo One';-inkscape-font-specification:'Russo One Bold';text-align:center;text-anchor:middle;fill:none;stroke:#000000;stroke-width:2.48097;stroke-linecap:round" + x="201.30554" + y="390.05484" + id="text469-6"><tspan + sodipodi:role="line" + id="tspan467-0" + x="201.30554" + y="390.05484" + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.48097">creator</tspan><tspan + sodipodi:role="line" + x="201.30554" + y="390.05484" + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.48097" + id="tspan1179-3" /></text> + </g> +</svg> diff --git a/leptos-website/public/images/generate_favcon.sh b/leptos-website/public/images/generate_favcon.sh new file mode 100755 index 00000000..976ec2f0 --- /dev/null +++ b/leptos-website/public/images/generate_favcon.sh @@ -0,0 +1,5 @@ +ffmpeg -i icon.png -vf scale=16:16 favicon-16.png +ffmpeg -i icon.png -vf scale=32:32 favicon-32.png +ffmpeg -i icon.png -vf scale=48:48 favicon-48.png + +ffmpeg -i favicon-16.png -i favicon-32.png -i favicon-48.png -c:v copy favicon.ico diff --git a/leptos-website/public/images/github_logo.svg b/leptos-website/public/images/github_logo.svg new file mode 100644 index 00000000..6dcfdf85 --- /dev/null +++ b/leptos-website/public/images/github_logo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" fill="#F2F8FA" width="24" height="24"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0 1 12 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg> \ No newline at end of file diff --git a/leptos-website/public/images/icon.png b/leptos-website/public/images/icon.png new file mode 100644 index 00000000..be34f308 Binary files /dev/null and b/leptos-website/public/images/icon.png differ diff --git a/leptos-website/public/images/mobile_menu.svg b/leptos-website/public/images/mobile_menu.svg new file mode 100644 index 00000000..76bf7a0d --- /dev/null +++ b/leptos-website/public/images/mobile_menu.svg @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + fill="#f2f8fa" + class="w-6 h-6" + viewBox="0 0 13.518048 13.537416" + version="1.1" + id="svg4" + sodipodi:docname="mobile_menu.svg" + width="13.518048" + height="13.537416" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="46.333333" + inkscape:cx="3.1726619" + inkscape:cy="6.7661871" + inkscape:window-width="3739" + inkscape:window-height="2096" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + fill-rule="evenodd" + d="m 0.05927139,0.70955351 c 0,-0.41421356 0.335786,-0.75 0.75,-0.75 H 12.779284 c 0.999884,1.1546e-4 0.999884,1.50011549 0,1.49999999 H 0.80927139 c -0.414214,0 -0.75,-0.3357864 -0.75,-0.74999999 z m 0,5.91801619 c 0,-0.4142136 0.335786,-0.75 0.75,-0.75 H 12.779284 c 1,0 1,1.5 0,1.5 H 0.80927139 c -0.414214,0 -0.75,-0.3357865 -0.75,-0.75 z m 0,6.1458603 c 0,-0.414213 0.335786,-0.75 0.75,-0.75 H 12.779284 c 1,0 1,1.5 0,1.5 H 0.80927139 c -0.414214,0 -0.75,-0.335786 -0.75,-0.75 z" + clip-rule="evenodd" + id="path42" + sodipodi:nodetypes="ssccssssssssssssss" /> +</svg> diff --git a/leptos-website/public/images/moon.svg b/leptos-website/public/images/moon.svg new file mode 100644 index 00000000..4660632a --- /dev/null +++ b/leptos-website/public/images/moon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" fill="#F2F8FA" class="w-6 h-6" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M9.528 1.718a.75.75 0 0 1 .162.819A8.97 8.97 0 0 0 9 6a9 9 0 0 0 9 9 8.97 8.97 0 0 0 3.463-.69.75.75 0 0 1 .981.98 10.503 10.503 0 0 1-9.694 6.46c-5.799 0-10.5-4.701-10.5-10.5 0-4.368 2.667-8.112 6.46-9.694a.75.75 0 0 1 .818.162z" clip-rule="evenodd"/></svg> \ No newline at end of file diff --git a/leptos-website/public/images/sun.svg b/leptos-website/public/images/sun.svg new file mode 100644 index 00000000..cc987ee9 --- /dev/null +++ b/leptos-website/public/images/sun.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" fill="#F2F8FA" class="w-6 h-6" viewBox="0 0 24 24"><path d="M12 2.25a.75.75 0 0 1 .75.75v2.25a.75.75 0 0 1-1.5 0V3a.75.75 0 0 1 .75-.75zM7.5 12a4.5 4.5 0 1 1 9 0 4.5 4.5 0 0 1-9 0zm11.394-5.834a.75.75 0 0 0-1.06-1.06l-1.591 1.59a.75.75 0 1 0 1.06 1.061l1.591-1.59zM21.75 12a.75.75 0 0 1-.75.75h-2.25a.75.75 0 0 1 0-1.5H21a.75.75 0 0 1 .75.75zm-3.916 6.894a.75.75 0 0 0 1.06-1.06l-1.59-1.591a.75.75 0 1 0-1.061 1.06l1.59 1.591zM12 18a.75.75 0 0 1 .75.75V21a.75.75 0 0 1-1.5 0v-2.25A.75.75 0 0 1 12 18zm-4.242-.697a.75.75 0 0 0-1.061-1.06l-1.591 1.59a.75.75 0 0 0 1.06 1.061l1.591-1.59zM6 12a.75.75 0 0 1-.75.75H3a.75.75 0 0 1 0-1.5h2.25A.75.75 0 0 1 6 12zm.697-4.243a.75.75 0 0 0 1.06-1.06l-1.59-1.591a.75.75 0 0 0-1.061 1.06l1.59 1.591z"/></svg> \ No newline at end of file diff --git a/leptos-website/public/images/videocall_logo.svg b/leptos-website/public/images/videocall_logo.svg new file mode 100644 index 00000000..bb738917 --- /dev/null +++ b/leptos-website/public/images/videocall_logo.svg @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="1920" + height="1080" + viewBox="0 0 507.99998 285.75" + version="1.1" + id="svg720" + inkscape:version="1.2 (dc2aeda, 2022-05-15)" + sodipodi:docname="videocall_logo.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview722" + pagecolor="#505050" + bordercolor="#eeeeee" + borderopacity="1" + inkscape:showpageshadow="0" + inkscape:pageopacity="0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#505050" + inkscape:document-units="mm" + showgrid="false" + inkscape:zoom="0.17046523" + inkscape:cx="1091.1316" + inkscape:cy="695.15643" + inkscape:window-width="1390" + inkscape:window-height="1027" + inkscape:window-x="304" + inkscape:window-y="506" + inkscape:window-maximized="0" + inkscape:current-layer="layer1" /> + <defs + id="defs717" /> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <text + xml:space="preserve" + style="font-weight:bold;font-size:81.7204px;line-height:0;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue Bold';fill:#333333;stroke:none;stroke-width:4.59724;stroke-dasharray:none" + x="14.577497" + y="169.84549" + id="text19581-4-4-4-5-7" + inkscape:export-filename="videocall.png" + inkscape:export-xdpi="64" + inkscape:export-ydpi="64"><tspan + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:81.7204px;font-family:'Russo One';-inkscape-font-specification:'Russo One Bold';fill:#ffffff;stroke:none;stroke-width:4.59724;stroke-dasharray:none" + x="14.577497" + y="169.84549" + id="tspan19735-3-3-8-1-8" + sodipodi:role="line">videocall.rs</tspan></text> + </g> +</svg> diff --git a/leptos-website/public/images/wave.svg b/leptos-website/public/images/wave.svg new file mode 100644 index 00000000..b3c99449 --- /dev/null +++ b/leptos-website/public/images/wave.svg @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + preserveAspectRatio="none" + viewBox="0 0 960 251" + version="1.1" + id="svg191" + sodipodi:docname="wave.svg" + inkscape:version="1.2 (dc2aeda, 2022-05-15)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview193" + pagecolor="#505050" + bordercolor="#eeeeee" + borderopacity="1" + inkscape:showpageshadow="0" + inkscape:pageopacity="0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#505050" + showgrid="false" + inkscape:zoom="1.3166667" + inkscape:cx="397.21519" + inkscape:cy="129.49367" + inkscape:window-width="1884" + inkscape:window-height="1027" + inkscape:window-x="0" + inkscape:window-y="395" + inkscape:window-maximized="0" + inkscape:current-layer="svg191" /> + <defs + id="defs187"> + <linearGradient + id="a" + x1="0" + x2="491.201" + y1="0" + y2="-.022" + gradientTransform="scale(1.9544 .51166)" + gradientUnits="userSpaceOnUse"> + <stop + offset="0" + style="stop-color:#190e00;stop-opacity:1;" + id="stop182" /> + <stop + offset="100%" + style="stop-color:#ec373b" + id="stop184" /> + </linearGradient> + </defs> + <path + fill="url(#a)" + d="m924.31 227.157 7.384 3.078 24.612 10.23c1.758.73 3.693-.561 3.694-2.465l.01-238.008L0 0v219.113c0 2.21 1.735 4.444 3.875 4.992 431.611 101.524 609.132-126.496 920.435 3.052" + style="fill:url(#a)" + id="path189" /> +</svg> diff --git a/leptos-website/public/images/wave_small.svg b/leptos-website/public/images/wave_small.svg new file mode 100644 index 00000000..14c5d3d3 --- /dev/null +++ b/leptos-website/public/images/wave_small.svg @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + preserveAspectRatio="none" + viewBox="0 0 960 251" + version="1.1" + id="svg191" + sodipodi:docname="wave_small.svg" + inkscape:version="1.2 (dc2aeda, 2022-05-15)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview193" + pagecolor="#505050" + bordercolor="#eeeeee" + borderopacity="1" + inkscape:showpageshadow="0" + inkscape:pageopacity="0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#505050" + showgrid="false" + inkscape:zoom="1.3166667" + inkscape:cx="399.11392" + inkscape:cy="131.01266" + inkscape:window-width="1831" + inkscape:window-height="1027" + inkscape:window-x="0" + inkscape:window-y="395" + inkscape:window-maximized="0" + inkscape:current-layer="svg191" /> + <defs + id="defs187"> + <linearGradient + id="a" + x1="0" + x2="491.198" + y1="0" + y2="0" + gradientTransform="scale(1.9544 .51166)" + gradientUnits="userSpaceOnUse"> + <stop + offset="0" + style="stop-color:#190e00;stop-opacity:1;" + id="stop182" /> + <stop + offset="100%" + style="stop-color:#ec373b" + id="stop184" /> + </linearGradient> + </defs> + <path + fill="url(#a)" + d="M3.875 228.26c514.543 63.604 506.767-41.918 952.431 21.072 1.758.73 3.693-.562 3.694-2.465V4a4 4 0 0 0-4-4H0v223.268c0 2.21 1.735 4.444 3.875 4.992z" + style="fill:url(#a)" + id="path189" /> +</svg> diff --git a/leptos-website/public/images/x_close.svg b/leptos-website/public/images/x_close.svg new file mode 100644 index 00000000..f2c41733 --- /dev/null +++ b/leptos-website/public/images/x_close.svg @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + fill="#f2f8fa" + class="w-6 h-6" + viewBox="0 0 13.518048 13.537416" + version="1.1" + id="svg4" + sodipodi:docname="x_close.svg" + width="13.518048" + height="13.537416" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="46.333333" + inkscape:cx="3.1726619" + inkscape:cy="6.7661871" + inkscape:window-width="3739" + inkscape:window-height="2096" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + fill-rule="evenodd" + d="m 0.21934003,0.23870829 a 0.75,0.75 0 0 1 1.05999997,0 l 5.47,5.47000001 5.47,-5.47000001 a 0.75,0.75 0 1 1 1.06,1.06000001 l -5.47,5.47 5.47,5.4699997 a 0.75,0.75 0 1 1 -1.06,1.06 l -5.47,-5.4699997 -5.47,5.4699997 a 0.75,0.75 0 0 1 -1.05999997,-1.06 L 5.68934,6.7687083 l -5.46999997,-5.47 a 0.75,0.75 0 0 1 0,-1.06000001 z" + clip-rule="evenodd" + id="path2" /> +</svg> diff --git a/leptos-website/src/app.rs b/leptos-website/src/app.rs new file mode 100644 index 00000000..02277f49 --- /dev/null +++ b/leptos-website/src/app.rs @@ -0,0 +1,26 @@ +use crate::pages::Home::*; +use leptos::*; +use leptos_meta::*; +use leptos_router::*; + +#[component] +pub fn App() -> impl IntoView { + let formatter = |text| format!("{text} - VideoCall.rs"); + provide_meta_context(); + + view! { + <Html lang="en"/> + <Stylesheet id="leptos" href="/pkg/leptos_website.css"/> + <Title formatter/> + <Meta + name="description" + content="Leptos is a cutting-edge Rust web framework designed for building fast, reliable, web applications." + /> + <Router> + <Routes> + <Route path="" view=Home ssr=SsrMode::Async/> + </Routes> + </Router> + <script defer data-domain="leptos.dev" src="https://plausible.io/js/script.js"></script> + } +} diff --git a/leptos-website/src/components.rs b/leptos-website/src/components.rs new file mode 100644 index 00000000..81a78a45 --- /dev/null +++ b/leptos-website/src/components.rs @@ -0,0 +1,11 @@ +pub mod CodeExample; +//pub mod DarkModeToggle; +pub mod ExampleServerFunction; +pub mod ExampleTailwind; +pub mod FeatureList; +pub mod Footer; +pub mod HeroHeader; +pub mod InteractiveCodeExample; +pub mod Page; +pub mod SpeedStats; +pub mod SphereLogo; diff --git a/leptos-website/src/components/CodeExample.rs b/leptos-website/src/components/CodeExample.rs new file mode 100644 index 00000000..1aa6bd0f --- /dev/null +++ b/leptos-website/src/components/CodeExample.rs @@ -0,0 +1,93 @@ +use leptos::*; + +use crate::pages::Home::perform_markdown_code_to_html; + +#[component] +pub fn CodeExample( + children: Children, + code: String, + shadow: bool, + border: bool, + background: String, +) -> impl IntoView { + let code_resource = create_resource( + || false, + move |_| perform_markdown_code_to_html(code.clone()), + ); + + view! { + <CodeExampleLayout + shadow + border + background + code=CodeExampleMode::Html(code_resource) + children=children + /> + } +} + +#[derive(Clone)] +pub enum CodeExampleMode { + Html(Resource<bool, Result<String, ServerFnError>>), + View(View), +} + +#[component] +pub fn CodeExampleLayout( + code: CodeExampleMode, + shadow: bool, + border: bool, + background: String, + children: Children, +) -> impl IntoView { + let shadow_class = if shadow { + "shadow-[10px_10px_0px_#190E3825]" + } else { + "" + }; + + let border_class = if border { "border" } else { "" }; + let code_children_class = "w-full lg:max-w-md max-w-full p-3 md:p-6 bg-[#0b081a] text-[14px] lg:text-[16px] text-white overflow-x-scroll"; + + view! { + <div class=format!( + "flex flex-col lg:flex-row w-full max-w-4xl border-black border-opacity-30 bg-white rounded-md overflow-hidden mx-auto {} {}", + shadow_class, border_class + )> + {match code { + CodeExampleMode::Html(code_resource) => { + view! { + <Suspense fallback=move || { + view! { <div class=code_children_class>"fallback"</div> } + }> + {move || { + code_resource + .and_then(|code| { + view! { <div class=code_children_class inner_html=code></div> } + }) + }} + </Suspense> + } + .into_view() + } + CodeExampleMode::View(child) => { + view! { <div class=code_children_class>{child}</div> } + .into_view() + } + }} + <div class="w-full flex flex-col lg:max-w-md max-w-full border-black dark:border-eggshell border-opacity-30 items-center "> + <div class=" w-full bg-white dark:bg-black flex h-10 lg:rounded-tr-lg border-b border-black dark:border-eggshell border-opacity-30 gap-4 justify-between items-center px-4 pointer-events-none border-t lg:border-t-0 "> + <div class="w-full rounded-md bg-[#dbdbdb] items-center text-sm text-black text-opacity-80 h-5 px-2 pointer-events-none"> + "example.com" + </div> + <div class="flex gap-3"> + <span class="w-3 h-3 rounded-full bg-beige"></span> + <span class="w-3 h-3 rounded-full bg-pink"></span> + <span class="w-3 h-3 rounded-full bg-light_blue"></span> + </div> + </div> + <div class=format!("w-full h-full {}", background)>{children()}</div> + </div> + </div> + } +} diff --git a/leptos-website/src/components/DarkModeToggle.js b/leptos-website/src/components/DarkModeToggle.js new file mode 100644 index 00000000..23f93ad5 --- /dev/null +++ b/leptos-website/src/components/DarkModeToggle.js @@ -0,0 +1,9 @@ +const classList = document.body.classList; +// check if we've loaded already from cookie +if (!(classList.contains("dark") || classList.contains("light"))) { + if (window.matchMedia("(prefers-color-scheme: dark)").matches) { + classList.add("dark"); + } else { + classList.remove("dark"); + } +} diff --git a/leptos-website/src/components/DarkModeToggle.rs b/leptos-website/src/components/DarkModeToggle.rs new file mode 100644 index 00000000..6d026e21 --- /dev/null +++ b/leptos-website/src/components/DarkModeToggle.rs @@ -0,0 +1,112 @@ +use leptos::*; +use leptos_meta::Body; +use leptos_router::ActionForm; + +#[server(ToggleDarkMode, "/api")] +pub async fn toggle_dark_mode(prefers_dark: bool) -> Result<bool, ServerFnError> { + use axum::http::{header::SET_COOKIE, HeaderMap, HeaderValue}; + use leptos_axum::{ResponseOptions, ResponseParts}; + + let response = + use_context::<ResponseOptions>().expect("to have leptos_axum::ResponseOptions provided"); + let mut response_parts = ResponseParts::default(); + let mut headers = HeaderMap::new(); + headers.insert( + SET_COOKIE, + HeaderValue::from_str(&format!("darkmode={prefers_dark}; Path=/")) + .expect("to create header value"), + ); + response_parts.headers = headers; + + response.overwrite(response_parts); + Ok(prefers_dark) +} + +#[cfg(not(feature = "ssr"))] +fn initial_prefers_dark() -> Option<bool> { + use wasm_bindgen::JsCast; + + let doc = document().unchecked_into::<web_sys::HtmlDocument>(); + let query = window() + .match_media("(prefers-color-scheme: dark)") + .ok() + .and_then(|ql| ql.map(|ql| ql.matches())); + let cookie = doc.cookie().unwrap_or_default(); + if cookie.contains("darkmode") { + Some(cookie.contains("darkmode=true")) + } else { + query + } +} + +#[cfg(feature = "ssr")] +fn initial_prefers_dark() -> Option<bool> { + use axum_extra::extract::cookie::CookieJar; + use_context::<leptos_axum::RequestParts>().and_then(|req| { + let cookies = CookieJar::from_headers(&req.headers); + cookies.get("darkmode").and_then(|v| match v.value() { + "true" => Some(true), + "false" => Some(false), + _ => None, + }) + }) +} + +#[component] +pub fn DarkModeToggle() -> impl IntoView { + let initial = initial_prefers_dark(); + let toggle_dark_mode_action = create_server_action::<ToggleDarkMode>(); + // input is `Some(value)` when pending, and `None` if not pending + let input = toggle_dark_mode_action.input(); + // value contains most recently-returned value + let value = toggle_dark_mode_action.value(); + let prefers_dark = create_memo(move |_| { + match (input(), value()) { + // if there's some current input, use that optimistically + (Some(submission), _) => Some(submission.prefers_dark), + // otherwise, if there was a previous value confirmed by server, use that + (_, Some(Ok(value))) => Some(value), + // otherwise, use the initial value + _ => initial, + } + }); + let prefers_dark = move || { + if cfg!(feature = "ssr") { + initial + } else { + prefers_dark() + } + }; + + view! { + <Body class=move || match prefers_dark() { + Some(true) => "dark".to_string(), + Some(false) => "light".to_string(), + _ => "".to_string(), + }/> + <script>{include_str!("DarkModeToggle.js")}</script> + <ActionForm action=toggle_dark_mode_action + class="flex items-center" + > + <input + type="hidden" + name="prefers_dark" + value=move || (!(prefers_dark().unwrap_or(false))).to_string() + /> + <button + type="submit" + > + <img + class="h-6 w-6 hidden dark:block" + src="/images/sun.svg" + alt="Go to Light Mode" + /> + <img + class="h-6 w-6 block dark:hidden" + src="/images/moon.svg" + alt="Go to Dark Mode" + /> + </button> + </ActionForm> + } +} diff --git a/leptos-website/src/components/ExampleServerFunction.rs b/leptos-website/src/components/ExampleServerFunction.rs new file mode 100644 index 00000000..5f8af734 --- /dev/null +++ b/leptos-website/src/components/ExampleServerFunction.rs @@ -0,0 +1,134 @@ +use leptos::*; +use leptos_router::ActionForm; + +#[server(SaveFavorites, "/api")] +pub async fn save_favorites( + favorite_cookie_type: String, + favorite_color: String, +) -> Result<String, ServerFnError> { + tokio::time::sleep(std::time::Duration::from_millis(250)).await; + Ok(format!( + "Here, have some {favorite_color} {favorite_cookie_type} cookies!" + )) +} + +pub const EXAMPLE_SERVER_FUNCTION_CODE: &str = r#"```rust +#[server(SaveFavorites, "/api")] +pub async fn save_favorites( + favorite_cookie_type: String, + favorite_color: String, +) -> Result<(), ServerFnError> { + let pool = get_pool()?; + + let query = " + INSERT INTO COOKIES + (favorite_cookie_type, favorite_color) + VALUES ($1, $2) + "; + + sqlx::query(query) + .bind(favorite_cookie_type) + .bind(favorite_color) + .execute(&pool) + .await + .map_err(|e| + ServerFnError::ServerError(e.to_string())?; + + Ok(format!("Here, have some {favorite_color} {favorite_cookie_type} cookies!")) +} + +#[component] +pub fn FavoritesForm() -> impl IntoView { + let favorites = create_server_action::<SaveFavorites>(); + let value = favorites.value(); + view! { + <ActionForm action=favorites> + <label> + "Favorite type of cookie" + <input + type="text" + name="favorite_cookie_type" + /> + </label> + <label> + "Favorite color" + <input + type="text" + name="favorite_color" + /> + </label> + <input type="submit"/> + </ActionForm> + <Show when=favorites.pending()> + <div>"Loading..."</div> + </Show> + <Show when=move || value.with(Option::is_some)> + <div>{value}</div> + </Show> + } +} +```"#; + +#[island] +pub fn ExampleServerFunction() -> impl IntoView { + let favorites = create_server_action::<SaveFavorites>(); + let value = favorites.value(); + view! { + <ActionForm action=favorites> + <div class="p-4 sm:p-8"> + <h2 class="text-2xl font-bold text-black dark:text-eggshell">"Save to database"</h2> + <div class="my-4"> + <div class="flex flex-col gap-4"> + <div> + <label + for="favorite_cookie_type" + class="block text-sm font-bold text-black dark:text-eggshell " + > + "Favorite type of cookie" + </label> + <div class="mt-1"> + <input + type="text" + name="favorite_cookie_type" + id="favorite_cookie_type" + class="block w-full p-2 max-w-[250px] rounded-md border border-black text-black" + required + /> + </div> + </div> + <div> + <label + for="favorite_color" + class="block text-sm font-bold text-black dark:text-eggshell" + > + "Favorite color" + </label> + <div class="mt-1"> + <input + type="text" + id="favorite_color" + name="favorite_color" + class="block w-full p-2 max-w-[250px] rounded-md border border-black text-black" + required + /> + </div> + </div> + <div class="flex items-center"> + <button class="block max-w-fit mt-1 text-lg py-2 px-4 text-purple dark:text-eggshell rounded-md border border-purple dark:border-eggshell"> + "Submit" + </button> + <Show when=favorites.pending()> + <div class=" text-black dark:text-eggshell h-4 ml-4"> + "Loading..." + </div> + </Show> + </div> + </div> + </div> + </div> + </ActionForm> + <Show when=move || value.with(Option::is_some)> + <div class="text-center text-black dark:text-eggshell">{value}</div> + </Show> + } +} diff --git a/leptos-website/src/components/ExampleTailwind.rs b/leptos-website/src/components/ExampleTailwind.rs new file mode 100644 index 00000000..5052b13c --- /dev/null +++ b/leptos-website/src/components/ExampleTailwind.rs @@ -0,0 +1,60 @@ +use leptos::*; + +pub enum AlertType { + Info, + Success, + Warning, + Error, +} + +pub const EXAMPLE_TAILWIND_CODE: &str = r#"```tsx +#[component] +pub fn Collections() -> impl IntoView { + view! { + <h2 class="text-2xl font-bold text-black"> + "Collections" + </h2> + <div class="my-4"> + <div class="cursor-pointer"> + <div class="max-w-sm h-40 overflow-hidden rounded-lg"> + <img loading="lazy" src="desk.jpg" + class="h-full w-full object-cover object-center"/> + </div> + <h3 class="mt-6 text-sm text-[#3f3f3f] dark:text-[#e0e0e0]"> + "Desk and Office" + </h3> + <p class="font-semibold text-black"> + "Work from home accessories" + </p> + </div> + </div> + } +} +```"#; + +#[component] +pub fn ExampleTailwind() -> impl IntoView { + view! { + <div class="p-4 sm:p-8"> + <h2 class="text-2xl font-bold text-black dark:text-eggshell">"Collections"</h2> + <div class="my-4"> + <div class="cursor-not-allowed"> + <div class="max-w-sm h-40 overflow-hidden rounded-lg"> + <img + loading="lazy" + src="https://tailwindui.com/img/ecommerce-images/home-page-02-edition-01.jpg" + class="h-full w-full object-cover object-center" + alt="" + /> + </div> + <h3 class="mt-6 text-sm text-[#3f3f3f] dark:text-[#e0e0e0]"> + "Desk and Office" + </h3> + <p class="font-semibold text-black dark:text-eggshell"> + "Work from home accessories" + </p> + </div> + </div> + </div> + } +} diff --git a/leptos-website/src/components/FeatureList.rs b/leptos-website/src/components/FeatureList.rs new file mode 100644 index 00000000..4715c77c --- /dev/null +++ b/leptos-website/src/components/FeatureList.rs @@ -0,0 +1,40 @@ +use leptos::*; + +#[component] +pub fn FeatureListItem(text: String) -> impl IntoView { + view! { + <div class="w-14 h-14 table-row"> + <svg + xmlns="http://www.w3.org/2000/svg" + fill="none" + stroke="currentColor" + stroke-width="1" + class="w-10 h-10 stroke-purple dark:stroke-eggshell table-cell" + viewBox="0 0 24 24" + > + <path + stroke-linecap="round" + stroke-linejoin="round" + d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0z" + ></path> + </svg> + <p class="pl-2 pb-2 text-purple dark:text-eggshell table-cell align-top"> + {text} + </p> + </div> + } +} + +#[component] +pub fn FeatureList(items: Vec<String>) -> impl IntoView { + let feature_list_items: Vec<_> = items + .iter() + .map(|item_text| { + FeatureListItem(FeatureListItemProps { + text: item_text.clone(), + }) + }) + .collect(); + + view! { <div class="table">{feature_list_items}</div> } +} diff --git a/leptos-website/src/components/Footer.rs b/leptos-website/src/components/Footer.rs new file mode 100644 index 00000000..c288fee0 --- /dev/null +++ b/leptos-website/src/components/Footer.rs @@ -0,0 +1,6 @@ +use leptos::*; + +#[component] +pub fn Footer() -> impl IntoView { + view! { <></> } +} diff --git a/leptos-website/src/components/HeroHeader.css b/leptos-website/src/components/HeroHeader.css new file mode 100644 index 00000000..53cce2da --- /dev/null +++ b/leptos-website/src/components/HeroHeader.css @@ -0,0 +1,9 @@ +.hero-header { + background-image: url("data: image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none' viewBox='0 0 960 251' %3E%3Cdefs%3E%3ClinearGradient id='a' x1='0' x2='491.198' y1='0' y2='0' gradientTransform='scale(1.9544 .51166)' gradientUnits='userSpaceOnUse' %3E%3Cstop offset='0%25' style='stop-color:%23190e38' /%3E%3Cstop offset='100%25' style='stop-color:%23ec373b' /%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath fill='url(%23a)' d='M3.875 228.26c514.543 63.604 506.767-41.918 952.431 21.072 1.758.73 3.693-.562 3.694-2.465V4a4 4 0 0 0-4-4H0v223.268c0 2.21 1.735 4.444 3.875 4.992z' style='fill:url(%23a)' /%3E%3C/svg%3E"); +} + +@media (min-width: 1024px) { + .hero-header { + background-image: url('/images/wave.svg'); + } +} \ No newline at end of file diff --git a/leptos-website/src/components/HeroHeader.rs b/leptos-website/src/components/HeroHeader.rs new file mode 100644 index 00000000..3065f75b --- /dev/null +++ b/leptos-website/src/components/HeroHeader.rs @@ -0,0 +1,136 @@ +use crate::components::SphereLogo::*; +use leptos::*; +use leptos_meta::Style; +use leptos_router::A; +#[component] +pub fn HeroHeader() -> impl IntoView { + view! { + <HamburgerProvider> + <Style>{include_str!("./HeroHeader.css")}</Style> + <div class="max-w-[1920px] mx-auto relative"> + <div class="relative bg-no-repeat bg-center bg-[length:100%_100%] w-[calc(100%+25px)] h-full top-0 4xl:top-[-10px] left-[-15px] 4xl:left-0 hero-header drop-shadow-[10px_10px_0px_#190E3825]"> + <div class="pl-6 pr-4 md:pl-8 md:pr-6 lg:pl-12 lg:pr-8 pt-2 md:pt-4 lg:pt-8 text-white w-full "> + <div class="flex w-full items-center justify-between max-w-4xl mx-auto"> + <A href="/"> + <img + class="block w-[90px] h-[38px] sm:w-28 sm:h-auto" + src="/images/videocall_logo.svg" + alt="Home" + /> + </A> + <ShowWhenOpen is=false> + <div class="hidden lg:block"> + <div class="flex gap-1 xl:gap-4 justify-center items-center"> + <a + href="https://crates.io/crates/yew-webtransport" + class="font-bold transition-all text-white aria-[current]:bg-purple hover:bg-purple hover:bg-opacity-50 px-4 py-2 rounded-md " + > + "yew-webtransport" + </a> + </div> + </div> + </ShowWhenOpen> + <div> + <div class="flex gap-5 md:gap-8 justify-center items-center"> + <a href="https://discord.gg/XRdt6WfZyf"> + <img + class="block h-6 w-6" + src="/images/discord_logo.svg" + alt="Discord" + /> + </a> + <a href="https://github.com/security-union/videocall-rs"> + <img + class="block h-6 w-6" + src="/images/github_logo.svg" + alt="GitHub" + /> + </a> + <DarkModeToggle/> + </div> + </div> + </div> + <ShowWhenOpen is=true> + <div class="max-w-4xl mx-auto mt-8 pb-16 lg:hidden"> + <div class="flex flex-col gap-2"> + <a + href="https://crates.io/crates/yew-webtransport" + class="font-bold transition-all text-white aria-[current]:bg-purple hover:bg-purple hover:bg-opacity-50 px-4 py-2 rounded-md " + > + "yew-webtransport" + </a> + </div> + </div> + </ShowWhenOpen> + <ShowWhenOpen is=false> + <div class="max-w-4xl mx-auto relative "> + <div class="flex gap-12 justify-start xl:justify-between items-center pt-12 pb-24 md:py-24"> + <div class="md:mt-[-60px] lg:mt-[-60px]"> + <h1 class="font-bold text-4xl lg:text-5xl tracking-tight"> + "Ultra-low latency videocalls" + </h1> + <p class="mt-2 opacity-90 max-w-[40ch] "> + "Always open-source, always awesome, powered by Rust" + </p> + <div class="mt-4 flex gap-3"> + <a + href="https://www.youtube.com/watch?v=LWwOSZJwEJI&list=PLxM2CWwQlzBtmhdaK2IeuQvpepKC6BYLO&index=3 " + class="font-semibold text-lg py-2 px-4 text-purple bg-light_blue rounded-md shadow-[3px_3px_0px_#5e7a7b50] hover:saturate-200 transition-all" + > + "Video" + </a> + </div> + </div> + <div class="w-[40%]"></div> + <div class="max-w-[320px] md:max-w-[360px] lg:max-w-[400px] hidden md:block w-full h-full absolute right-0 top-4 aspect-square"> + <SphereLogo/> + </div> + </div> + </div> + </ShowWhenOpen> + </div> + </div> + </div> + </HamburgerProvider> + } +} + +#[island] +fn HamburgerProvider(children: Children) -> impl IntoView { + provide_context(RwSignal::new(false)); + + children() +} + +#[island] +fn DarkModeToggle() -> impl IntoView { + let (hamburger_menu_open, set_hamburger_menu_open) = expect_context::<RwSignal<bool>>().split(); + + view! { + <button on:click=move |_| set_hamburger_menu_open.update(|n| *n = !*n)> + <img + class=" h-6 w-6 block lg:hidden" + src=move || match hamburger_menu_open() { + true => "/images/x_close.svg", + false => "/images/mobile_menu.svg", + } + alt="Toggle Menu" + /> + </button> + } +} + +#[island] +fn ShowWhenOpen(is: bool, children: Children) -> impl IntoView { + let hamburger_menu_open = expect_context::<RwSignal<bool>>().read_only(); + + view! { + <div style:display=move || if hamburger_menu_open() == is { + "contents" + } else { + "none" + }> + {children()} + </div> + } +} diff --git a/leptos-website/src/components/InteractiveCodeExample.rs b/leptos-website/src/components/InteractiveCodeExample.rs new file mode 100644 index 00000000..444b23ce --- /dev/null +++ b/leptos-website/src/components/InteractiveCodeExample.rs @@ -0,0 +1,268 @@ +use leptos::*; + +#[island] +pub fn InteractiveCodeExample(children: Children) -> impl IntoView { + provide_context(RwSignal::new(OnStep::Idle)); + + children() +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +enum OnStep { + Idle, + Callback, + Setter, + Getter, +} + +impl OnStep { + fn next(&mut self) { + match self { + Self::Idle => *self = Self::Callback, + Self::Callback => *self = Self::Setter, + Self::Setter => *self = Self::Getter, + Self::Getter => *self = Self::Idle, + } + } + + fn prev(&mut self) { + match self { + Self::Idle => *self = Self::Getter, + Self::Callback => *self = Self::Idle, + Self::Setter => *self = Self::Callback, + Self::Getter => *self = Self::Setter, + } + } +} + +#[island] +pub fn CodeView() -> impl IntoView { + let phase = expect_context::<RwSignal<OnStep>>().read_only(); + let callback_class = move || { + if phase() == OnStep::Callback { + "border-2 border-red rounded-sm" + } else { + "border-2 border-transparent" + } + }; + let setter_class = move || { + if phase() == OnStep::Setter { + "border-2 border-red rounded-sm" + } else { + "border-2 border-transparent" + } + }; + let getter_class = move || { + if phase() == OnStep::Getter { + "border-2 border-red rounded-sm" + } else { + "border-2 border-transparent" + } + }; + + view! { + <pre class="code-block-inner" data-lang="tsx"> + "#" + <i class="hh8">"["</i> + <i class="hh15">"component"</i> + <i class="hh8">"]"</i> + "\n" + <i class="hh15">"pub"</i> + " " + <i class="hh15">"fn"</i> + " " + <i class="hh13">"Button"</i> + <i class="hh8">"()"</i> + " " + <i class="hh5">"-"</i> + <i class="hh5">">"</i> + " " + <i class="hh15">"impl"</i> + " " + <i class="hh13">"IntoView"</i> + " " + <i class="hh8">"{"</i> + "\n " + <i class="hh6">"let"</i> + " " + <i class="hh8">"("</i> + <span class=getter_class> + <i class="hh17">"count"</i> + </span> + <i class="hh9">","</i> + " " + <span class=setter_class> + <i class="hh17">"set_count"</i> + </span> + <i class="hh8">")"</i> + " " + <i class="hh5">"="</i> + " " + <i class="hh6">"create_signal"</i> + <i class="hh8">"("</i> + "0" + <i class="hh8">")"</i> + <i class="hh9">";"</i> + "\n " + <i class="hh15">"view"</i> + <i class="hh5">"!"</i> + " " + <i class="hh8">"{"</i> + " \n " + <i class="hh5">"<"</i> + <i class="hh12">"button"</i> + " " + <i class="hh15">"on"</i> + ":" + <span class=callback_class> + <i class="hh15">"click"</i> + </span> + <i class="hh5">"="</i> + <i class="hh15">"move"</i> + " " + <i class="hh5">"|"</i> + <i class="hh15">"_"</i> + <i class="hh5">"|"</i> + " " + <i class="hh8">"{"</i> + " \n " + <i class="hh17">"set_count"</i> + <i class="hh9">"."</i> + <span class=setter_class> + <i class="hh3">"update"</i> + </span> + <i class="hh8">"("</i> + <i class="hh5">"|"</i> + <i class="hh15">"n"</i> + <i class="hh5">"|"</i> + " " + <i class="hh5">"*"</i> + <i class="hh15">"n"</i> + " " + <i class="hh5">"+="</i> + " " + "1" + <i class="hh8">")"</i> + <i class="hh9">";"</i> + "\n " + <i class="hh8">"}"</i> + "\n " + <i class="hh5">">"</i> + "\n " + "\"Click me: \"" + "\n " + <i class="hh8">"{"</i> + <span class=getter_class> + <i class="hh17">"count"</i> + </span> + <i class="hh8">"}"</i> + "\n " + <i class="hh5">"<"</i> + <i class="hh5">"/"</i> + <i class="hh12">"button"</i> + <i class="hh5">">"</i> + "\n " + <i class="hh8">"}"</i> + "\n" + <i class="hh8">"}"</i> + </pre> + } +} + +#[island] +pub fn ExampleComponent() -> impl IntoView { + let (phase, set_phase) = expect_context::<RwSignal<OnStep>>().split(); + let (count, set_count) = create_signal(0); + let (interactive, set_interactive) = create_signal(false); + + view! { + <div class="px-2 py-6 h-full w-full flex flex-col justify-center items-center "> + <div class="flex justify-around w-full mb-8"> + <button + class=move || { + if !interactive() { + "border-b-2 dark:text-white dark:border-white" + } else { + "dark:text-white dark:border-white" + } + } + on:click=move |_| set_interactive(false) + > + "Counter Button" + </button> + <button + class=move || { + if interactive() { + "border-b-2 dark:text-white dark:border-white" + } else { + "dark:text-white dark:border-white" + } + } + on:click=move |_| set_interactive(true) + > + "How does it work?" + </button> + </div> + <button + class="text-lg py-2 px-4 text-purple dark:text-eggshell rounded-md \ + border border-purple dark:border-eggshell disabled:opacity-50" + disabled=move || interactive() && phase() != OnStep::Idle + on:click=move |_| { + set_count.update(|n| *n += 1); + if interactive() { + set_phase.update(OnStep::next); + } + } + > + "Click me: " + {count} + </button> + <Show + when=move || interactive() && phase() != OnStep::Idle + fallback=|| { + view! { <div class="h-8"></div> } + } + > + <div class="h-8 flex justify-around w-full dark:text-white"> + <button on:click=move |_| set_phase.update(OnStep::prev)> + "γ Previous Step" + </button> + <button on:click=move |_| set_phase.update(OnStep::next)> + "Next Step γ" + </button> + </div> + </Show> + {move || { + interactive() + .then(|| { + view! { + <ol class="text-sm w-3/4 mt-8 dark:text-white list-decimal"> + <li> + "The component function runs once, creating the DOM elements and setting up the reactive system." + </li> + <li> + "Clicking the button fires the " + <code class=move || { if phase() == OnStep::Callback { "border-2 border-red rounded-sm" } else { "border-2 border-transparent" } }> + "on:click" + </code> " handler. " + </li> + <li> + "The click handler calls " + <code class=move || { if phase() == OnStep::Setter { "border-2 border-red rounded-sm" } else { "border-2 border-transparent" } }> + "set_count.update" + </code> " to increment the count." + </li> + <li> + "The change to the " + <code class=move || { if phase() == OnStep::Getter { "border-2 border-red rounded-sm" } else { "border-2 border-transparent" } }> + "count" + </code> + " signal makes a targeted update to the DOM, changing the value of a single text node without re-rendering anything else." + </li> + </ol> + } + }) + }} + </div> + } +} diff --git a/leptos-website/src/components/Page.rs b/leptos-website/src/components/Page.rs new file mode 100644 index 00000000..cf0fbdd7 --- /dev/null +++ b/leptos-website/src/components/Page.rs @@ -0,0 +1,8 @@ +use crate::components::Footer::*; +// use crate::components::Header::*; +use leptos::*; + +#[component] +pub fn Page(children: Children) -> impl IntoView { + view! { <div class="overflow-x-hidden bg-white dark:bg-black">{children()} <Footer/></div> } +} diff --git a/leptos-website/src/components/SpeedStats.rs b/leptos-website/src/components/SpeedStats.rs new file mode 100644 index 00000000..b5e25a40 --- /dev/null +++ b/leptos-website/src/components/SpeedStats.rs @@ -0,0 +1,136 @@ +use leptos::*; + +struct SpeedStat { + name: String, + color: String, + color_transparent: String, + background: String, + percentage: u8, +} + +#[component] +pub fn PercentageBar( + color: String, + percentage: u8, + background: String, + color_transparent: String, + tech_name: String, +) -> impl IntoView { + view! { + <div class="text-eggshell flex flex-col lg:items-center lg:flex-row"> + <div class=" mb-2 font-bold lg:hidden">{tech_name}</div> + <div + style=format!("border-color: {color_transparent}") + class="w-full h-10 relative rounded-md border-2" + > + <div + style=format!("width: {percentage}%; outline-color: {color}") + class=format!( + "h-full absolute top-0 left-0 outline-2 outline flex items-center justify-end px-2 {background}" + ) + > + <span class="relative ">{percentage} "%"</span> + </div> + </div> + </div> + } +} + +#[component] +pub fn Label(tech_name: String) -> impl IntoView { + view! { + <div class="text-purple dark:text-eggshell"> + <div class="h-10 text-xl flex items-center justify-end">{tech_name}</div> + </div> + } +} + +#[component] +pub fn SpeedStats(shadow: bool, border: bool) -> impl IntoView { + let shadow_class = if shadow { + "shadow-[10px_10px_0px_#190E3825]" + } else { + "" + }; + + let border_class = if border { "border" } else { "" }; + + let labels = vec![ + SpeedStat { + name: String::from("VanillaJS"), + color: String::from("#A5D6A7"), + color_transparent: String::from("#A5D6A740"), + background: String::from(""), + percentage: 100, + }, + SpeedStat { + name: String::from("Leptos"), + color: String::from("#ED3135"), + color_transparent: String::from("#ED313540"), + background: String::from("bg-gradient-to-r from-purple to-red"), + percentage: 92, + }, + SpeedStat { + name: String::from("Vue"), + color: String::from("#F0ADA8"), + color_transparent: String::from("#F0ADA840"), + background: String::from(""), + percentage: 80, + }, + SpeedStat { + name: String::from("Svelte"), + color: String::from("#D2D7B4"), + color_transparent: String::from("#D2D7B440"), + background: String::from(""), + percentage: 73, + }, + SpeedStat { + name: String::from("React"), + color: String::from("#A8DADC"), + color_transparent: String::from("#A8DADC40"), + background: String::from(""), + percentage: 33, + }, + ]; + + view! { + <div class="2xl:ml-[-100px]"> + <div class="flex max-w-4xl mx-auto"> + <div class="hidden lg:flex flex-col gap-4 py-8 pr-4 pl-0 mt-0.5 font-bold "> + {labels + .iter() + .map(|row| { + view! { <Label tech_name=row.name.clone()/> } + }) + .collect::<Vec<_>>()} + </div> + <div class=format!( + "w-full h-full p-8 gap-4 bg-gradient-to-tr from-purple to-dark_blue rounded-md mx-auto flex flex-col {} {}", + shadow_class, border_class + )> + {labels + .iter() + .map(|row| { + view! { + <PercentageBar + tech_name=row.name.clone() + color=row.color.clone() + color_transparent=row.color_transparent.clone() + background=row.background.clone() + percentage=row.percentage + /> + } + }) + .collect::<Vec<_>>()} + <p class="text-white opacity-50 text-sm"> + "Source: " + <a href="https://krausest.github.io/js-framework-benchmark/2023/table_chrome_113.0.5672.63.html"> + <code>"js-framework-benchmark"</code> + " official results for Chrome 113." + </a> + </p> + </div> + </div> + </div> + } +} diff --git a/leptos-website/src/components/SphereLogo.rs b/leptos-website/src/components/SphereLogo.rs new file mode 100644 index 00000000..dec130d7 --- /dev/null +++ b/leptos-website/src/components/SphereLogo.rs @@ -0,0 +1,10 @@ +use leptos::*; + +#[component] +pub fn SphereLogo() -> impl IntoView { + view! { + <div class="stage"> + <div class="logo aspect-square"></div> + </div> + } +} diff --git a/leptos-website/src/error_template.rs b/leptos-website/src/error_template.rs new file mode 100644 index 00000000..6f6c133e --- /dev/null +++ b/leptos-website/src/error_template.rs @@ -0,0 +1,51 @@ +use crate::errors::TodoAppError; +use cfg_if::cfg_if; +use leptos::{Errors, *}; +#[cfg(feature = "ssr")] +use leptos_axum::ResponseOptions; + +// A basic function to display errors served by the error boundaries. Feel free to do more complicated things +// here than just displaying them +#[component] +pub fn ErrorTemplate( + #[prop(optional)] outside_errors: Option<Errors>, + #[prop(optional)] errors: Option<RwSignal<Errors>>, +) -> impl IntoView { + let errors = match outside_errors { + Some(e) => create_rw_signal(e), + None => match errors { + Some(e) => e, + None => panic!("No Errors found and we expected errors!"), + }, + }; + + // Get Errors from Signal + // Downcast lets us take a type that implements `std::error::Error` + let errors: Vec<TodoAppError> = errors + .get() + .into_iter() + .filter_map(|(_, v)| v.downcast_ref::<TodoAppError>().cloned()) + .collect(); + + // Only the response code for the first error is actually sent from the server + // this may be customized by the specific application + #[cfg(feature = "ssr")] + { + let response = use_context::<ResponseOptions>(); + if let Some(response) = response { + response.set_status(errors[0].status_code()); + } + } + + view! { + <h1>"Errors"</h1> + <For + each=move || { errors.clone().into_iter().enumerate() } + key=|(index, _error)| *index + let:error + > + <h2>{error.1.status_code().to_string()}</h2> + <p>"Error: " {error.1.to_string()}</p> + </For> + } +} diff --git a/leptos-website/src/errors.rs b/leptos-website/src/errors.rs new file mode 100644 index 00000000..35682848 --- /dev/null +++ b/leptos-website/src/errors.rs @@ -0,0 +1,19 @@ +use http::status::StatusCode; +use thiserror::Error; + +#[derive(Debug, Clone, Error)] +pub enum TodoAppError { + #[error("Not Found")] + NotFound, + #[error("Internal Server Error")] + InternalServerError, +} + +impl TodoAppError { + pub fn status_code(&self) -> StatusCode { + match self { + TodoAppError::NotFound => StatusCode::NOT_FOUND, + TodoAppError::InternalServerError => StatusCode::INTERNAL_SERVER_ERROR, + } + } +} diff --git a/leptos-website/src/fallback.rs b/leptos-website/src/fallback.rs new file mode 100644 index 00000000..635d4de9 --- /dev/null +++ b/leptos-website/src/fallback.rs @@ -0,0 +1,47 @@ +use cfg_if::cfg_if; + +cfg_if! { +if #[cfg(feature = "ssr")] { + use axum::{ + body::{boxed, Body, BoxBody}, + extract::State, + response::IntoResponse, + http::{Request, Response, StatusCode, Uri}, + }; + use axum::response::Response as AxumResponse; + use tower::ServiceExt; + use tower_http::services::ServeDir; + use leptos::{LeptosOptions, Errors, view}; + use crate::error_template::ErrorTemplate; + use crate::errors::TodoAppError; + + pub async fn file_and_error_handler(uri: Uri, State(options): State<LeptosOptions>, req: Request<Body>) -> AxumResponse { + let root = options.site_root.clone(); + let res = get_static_file(uri.clone(), &root).await.unwrap(); + + if res.status() == StatusCode::OK { + res.into_response() + } else{ + let mut errors = Errors::default(); + errors.insert_with_default_key(TodoAppError::NotFound); + let handler = leptos_axum::render_app_to_stream(options.to_owned(), move || view!{<ErrorTemplate outside_errors=errors.clone()/>}); + handler(req).await.into_response() + } + } + + async fn get_static_file(uri: Uri, root: &str) -> Result<Response<BoxBody>, (StatusCode, String)> { + let req = Request::builder().uri(uri.clone()).body(Body::empty()).unwrap(); + // `ServeDir` implements `tower::Service` so we can call it with `tower::ServiceExt::oneshot` + // This path is relative to the cargo root + match ServeDir::new(root).oneshot(req).await { + Ok(res) => Ok(res.map(boxed)), + Err(err) => Err(( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Something went wrong: {err}"), + )), + } + } + + +} +} diff --git a/leptos-website/src/lib.rs b/leptos-website/src/lib.rs new file mode 100644 index 00000000..a4d9bbfe --- /dev/null +++ b/leptos-website/src/lib.rs @@ -0,0 +1,23 @@ +#![allow(non_snake_case)] + +use cfg_if::cfg_if; +pub mod app; +pub mod components; +pub mod error_template; +pub mod errors; +pub mod fallback; +pub mod pages; + +cfg_if! { + if #[cfg(feature = "hydrate")] { + use leptos::*; + + use wasm_bindgen::prelude::wasm_bindgen; + + #[wasm_bindgen] + pub fn hydrate() { + console_error_panic_hook::set_once(); + leptos::leptos_dom::HydrationCtx::stop_hydrating(); + } + } +} diff --git a/leptos-website/src/main.rs b/leptos-website/src/main.rs new file mode 100644 index 00000000..67d751e0 --- /dev/null +++ b/leptos-website/src/main.rs @@ -0,0 +1,41 @@ +use cfg_if::cfg_if; + +// boilerplate to run in different modes +cfg_if! { + if #[cfg(feature = "ssr")] { + use leptos::*; + use axum::{ + routing::{post, }, + Router, + }; + use leptos_website::app::*; + use leptos_website::fallback::file_and_error_handler; + use leptos_axum::{generate_route_list, LeptosRoutes}; + use tower_http::{compression::CompressionLayer}; + + #[tokio::main] + async fn main() { + simple_logger::init_with_level(log::Level::Warn).expect("couldn't initialize logging"); + let conf = get_configuration(None).await.unwrap(); + let leptos_options = conf.leptos_options; + let addr = leptos_options.site_addr; + let routes = generate_route_list(App); + + // build our application with a route + let app = Router::new() + .route("/api/*fn_name", post(leptos_axum::handle_server_fns)) + .leptos_routes(&leptos_options, routes, App) + .fallback(file_and_error_handler) + .with_state(leptos_options) + .layer(CompressionLayer::new()); + + // run our app with hyper + // `axum::Server` is a re-export of `hyper::Server` + logging::log!("listening on http://{}", &addr); + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .await + .unwrap(); + } + } +} diff --git a/leptos-website/src/pages.rs b/leptos-website/src/pages.rs new file mode 100644 index 00000000..1629028e --- /dev/null +++ b/leptos-website/src/pages.rs @@ -0,0 +1 @@ +pub mod Home; diff --git a/leptos-website/src/pages/Home.rs b/leptos-website/src/pages/Home.rs new file mode 100644 index 00000000..480a5c41 --- /dev/null +++ b/leptos-website/src/pages/Home.rs @@ -0,0 +1,45 @@ +use crate::components::CodeExample::*; +use crate::components::ExampleServerFunction::*; +use crate::components::ExampleTailwind::*; +use crate::components::FeatureList::*; +use crate::components::HeroHeader::*; +use crate::components::InteractiveCodeExample::*; +use crate::components::Page::*; +use crate::components::SpeedStats::*; +use leptos::*; +use leptos_meta::*; + +#[server(PerformMarkdownCodeToHtml, "/api", "GetJSON")] +pub async fn perform_markdown_code_to_html(markdown: String) -> Result<String, ServerFnError> { + use cached::proc_macro::cached; + + #[cached] + fn process_markdown(markdown: String) -> Result<String, ServerFnError> { + use femark::{process_markdown_to_html, HTMLOutput}; + + match process_markdown_to_html(markdown) { + Ok(HTMLOutput { content, toc: _ }) => Ok(content), + Err(e) => Err(ServerFnError::ServerError(e.to_string())), + } + } + + process_markdown(markdown) +} + +#[component] +pub fn Home() -> impl IntoView { + view! { + <Title text="Home"/> + <Page> + <HeroHeader/> + <div class="w-full flex justify-center pb-16"> + <a + href="https://app.videocall.rs" + class="font-semibold text-eggshell text-2xl px-8 py-5 bg-gradient-to-r from-dark_blue to-purple rounded-md shadow-[3px_3px_0px_#0d0b29] hover:saturate-200 transition-all" + > + "Create a meeting" + </a> + </div> + </Page> + } +} diff --git a/leptos-website/start_docker.sh b/leptos-website/start_docker.sh new file mode 100755 index 00000000..c9dc9a09 --- /dev/null +++ b/leptos-website/start_docker.sh @@ -0,0 +1,9 @@ +docker run \ + -d \ + -p 443:443 \ + -p 443:443/udp \ + -e RUST_LOG=info,quinn=warn,leptos_meta=warn,leptos_router=warn,leptos_dom=warn \ + -e LISTEN_URL=0.0.0.0:443 \ + -e LEPTOS_SITE_ADDR=0.0.0.0:443 \ + --rm \ + securityunion/video-call-rs-website:latest \ No newline at end of file diff --git a/leptos-website/style/.gitkeep b/leptos-website/style/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/leptos-website/style/output.css b/leptos-website/style/output.css new file mode 100644 index 00000000..afd7ce35 --- /dev/null +++ b/leptos-website/style/output.css @@ -0,0 +1,1667 @@ +/* +! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: currentColor; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +.pointer-events-none { + pointer-events: none; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.left-0 { + left: 0px; +} + +.left-\[-15px\] { + left: -15px; +} + +.right-0 { + right: 0px; +} + +.top-0 { + top: 0px; +} + +.top-4 { + top: 1rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.ml-4 { + margin-left: 1rem; +} + +.mt-0\.5 { + margin-top: 0.125rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-6 { + margin-top: 1.5rem; +} + +.mt-8 { + margin-top: 2rem; +} + +.block { + display: block; +} + +.flex { + display: flex; +} + +.table { + display: table; +} + +.table-cell { + display: table-cell; +} + +.table-row { + display: table-row; +} + +.contents { + display: contents; +} + +.hidden { + display: none; +} + +.aspect-square { + aspect-ratio: 1 / 1; +} + +.h-10 { + height: 2.5rem; +} + +.h-14 { + height: 3.5rem; +} + +.h-3 { + height: 0.75rem; +} + +.h-4 { + height: 1rem; +} + +.h-40 { + height: 10rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-8 { + height: 2rem; +} + +.h-\[38px\] { + height: 38px; +} + +.h-full { + height: 100%; +} + +.w-10 { + width: 2.5rem; +} + +.w-14 { + width: 3.5rem; +} + +.w-3 { + width: 0.75rem; +} + +.w-3\/4 { + width: 75%; +} + +.w-6 { + width: 1.5rem; +} + +.w-\[40\%\] { + width: 40%; +} + +.w-\[90px\] { + width: 90px; +} + +.w-\[calc\(100\%\+25px\)\] { + width: calc(100% + 25px); +} + +.w-full { + width: 100%; +} + +.max-w-4xl { + max-width: 56rem; +} + +.max-w-\[1920px\] { + max-width: 1920px; +} + +.max-w-\[250px\] { + max-width: 250px; +} + +.max-w-\[320px\] { + max-width: 320px; +} + +.max-w-\[40ch\] { + max-width: 40ch; +} + +.max-w-fit { + max-width: -moz-fit-content; + max-width: fit-content; +} + +.max-w-full { + max-width: 100%; +} + +.max-w-sm { + max-width: 24rem; +} + +.cursor-not-allowed { + cursor: not-allowed; +} + +.cursor-pointer { + cursor: pointer; +} + +.list-decimal { + list-style-type: decimal; +} + +.flex-col { + flex-direction: column; +} + +.items-center { + align-items: center; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-around { + justify-content: space-around; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-12 { + gap: 3rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-5 { + gap: 1.25rem; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-hidden { + overflow-x: hidden; +} + +.overflow-x-scroll { + overflow-x: scroll; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-sm { + border-radius: 0.125rem; +} + +.border { + border-width: 1px; +} + +.border-2 { + border-width: 2px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-b-2 { + border-bottom-width: 2px; +} + +.border-t { + border-top-width: 1px; +} + +.border-black { + --tw-border-opacity: 1; + border-color: rgb(15 25 28 / var(--tw-border-opacity)); +} + +.border-purple { + --tw-border-opacity: 1; + border-color: rgb(24 17 57 / var(--tw-border-opacity)); +} + +.border-red { + --tw-border-opacity: 1; + border-color: rgb(239 57 57 / var(--tw-border-opacity)); +} + +.border-transparent { + border-color: transparent; +} + +.border-opacity-30 { + --tw-border-opacity: 0.3; +} + +.bg-\[\#0b081a\] { + --tw-bg-opacity: 1; + background-color: rgb(11 8 26 / var(--tw-bg-opacity)); +} + +.bg-\[\#dbdbdb\] { + --tw-bg-opacity: 1; + background-color: rgb(219 219 219 / var(--tw-bg-opacity)); +} + +.bg-beige { + --tw-bg-opacity: 1; + background-color: rgb(210 215 180 / var(--tw-bg-opacity)); +} + +.bg-light_blue { + --tw-bg-opacity: 1; + background-color: rgb(168 218 220 / var(--tw-bg-opacity)); +} + +.bg-pink { + --tw-bg-opacity: 1; + background-color: rgb(240 173 168 / var(--tw-bg-opacity)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(242 248 250 / var(--tw-bg-opacity)); +} + +.bg-gradient-to-r { + background-image: linear-gradient(to right, var(--tw-gradient-stops)); +} + +.bg-gradient-to-tr { + background-image: linear-gradient(to top right, var(--tw-gradient-stops)); +} + +.from-dark_blue { + --tw-gradient-from: #324571 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(50 69 113 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-purple { + --tw-gradient-from: #181139 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(24 17 57 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.to-dark_blue { + --tw-gradient-to: #324571 var(--tw-gradient-to-position); +} + +.to-purple { + --tw-gradient-to: #181139 var(--tw-gradient-to-position); +} + +.to-red { + --tw-gradient-to: #EF3939 var(--tw-gradient-to-position); +} + +.bg-\[length\:100\%_100\%\] { + background-size: 100% 100%; +} + +.bg-center { + background-position: center; +} + +.bg-no-repeat { + background-repeat: no-repeat; +} + +.stroke-purple { + stroke: #181139; +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover; +} + +.object-center { + -o-object-position: center; + object-position: center; +} + +.p-2 { + padding: 0.5rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.p-8 { + padding: 2rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-8 { + padding-left: 2rem; + padding-right: 2rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.pb-16 { + padding-bottom: 4rem; +} + +.pb-2 { + padding-bottom: 0.5rem; +} + +.pb-24 { + padding-bottom: 6rem; +} + +.pl-0 { + padding-left: 0px; +} + +.pl-2 { + padding-left: 0.5rem; +} + +.pl-6 { + padding-left: 1.5rem; +} + +.pr-4 { + padding-right: 1rem; +} + +.pt-12 { + padding-top: 3rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.text-center { + text-align: center; +} + +.align-top { + vertical-align: top; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + +.text-\[14px\] { + font-size: 14px; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.font-bold { + font-weight: 700; +} + +.font-semibold { + font-weight: 600; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.text-\[\#3f3f3f\] { + --tw-text-opacity: 1; + color: rgb(63 63 63 / var(--tw-text-opacity)); +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(15 25 28 / var(--tw-text-opacity)); +} + +.text-eggshell { + --tw-text-opacity: 1; + color: rgb(241 250 238 / var(--tw-text-opacity)); +} + +.text-purple { + --tw-text-opacity: 1; + color: rgb(24 17 57 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(242 248 250 / var(--tw-text-opacity)); +} + +.text-opacity-80 { + --tw-text-opacity: 0.8; +} + +.opacity-50 { + opacity: 0.5; +} + +.opacity-90 { + opacity: 0.9; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[10px_10px_0px_\#190E3825\] { + --tw-shadow: 10px 10px 0px #190E3825; + --tw-shadow-colored: 10px 10px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[3px_3px_0px_\#0d0b29\] { + --tw-shadow: 3px 3px 0px #0d0b29; + --tw-shadow-colored: 3px 3px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[3px_3px_0px_\#5e7a7b50\] { + --tw-shadow: 3px 3px 0px #5e7a7b50; + --tw-shadow-colored: 3px 3px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.outline { + outline-style: solid; +} + +.outline-2 { + outline-width: 2px; +} + +.drop-shadow-\[10px_10px_0px_\#190E3825\] { + --tw-drop-shadow: drop-shadow(10px 10px 0px #190E3825); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +html { + font-size: 22px; + font-family: system-ui, Arial, Helvetica, sans-serif; + background-color: #0f191c; +} + +leptos-island { + display: contents; +} + +/* +CODE TOKENIZATION STUFF https://crates.io/crates/femark + + + +/* Color styles */ + +.hh1 { + color: #EF3939; +} + +/* attribute */ + +.hh2 { + color: #A8DADC; +} + +/* constant */ + +.hh3 { + color: #F2F8FA; +} + +/* function.builtin */ + +.hh4 { + color: #F2F8FA; +} + +/* function */ + +.hh5 { + color: #A8DADC; +} + +/* keyword */ + +.hh6 { + color: #D2D7B4; +} + +/* operator */ + +.hh7 { + color: #A8DADC; +} + +/* property */ + +.hh8 { + color: #F2F8FA; +} + +/* punctuation */ + +.hh9 { + color: #F2F8FA; +} + +/* punctuation.bracket */ + +.hh10 { + color: #F2F8FA; +} + +/* punctuation.delimiter */ + +.hh11 { + color: #F2F8FA; +} + +/* string */ + +.hh12 { + color: #F2F8FA; +} + +/* string.special */ + +.hh13 { + color: #F2F8FA; +} + +/* tag */ + +.hh14 { + color: #D2D7B4; +} + +/* type */ + +.hh15 { + color: #D2D7B4; +} + +/* type.builtin */ + +.hh16 { + color: #A8DADC; +} + +/* variable */ + +.hh17 { + color: #A8DADC; +} + +/* variable.builtin */ + +.hh18 { + color: #F0ADA8; +} + +/* variable.parameter */ + +.hh19 { + color: #F0ADA8; +} + +/* comment */ + +.hh20 { + color: #D2D7B4; +} + +/* macro */ + +.hh21 { + color: #D2D7B4; +} + +/* label */ + +/* Code block styles */ + +.code-block { + /* background-color: #F1FAEE; + border-radius: 5px; + padding: 2.1em 2em; + font-size: 14px; + line-height: 1.4em; + position: relative; + max-width: fit-content; + box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + font-style: normal; + max-width: 800px; + overflow-x: scroll; */ +} + +.code-block .language-tag { + display: none; + /* position: absolute; + top: 0; + right: 0; + font-size: 14px; + background-color: #a5a5a5; + color: #0c181d; + border-radius: 0 5px 0 5px; + padding: 2px 7px; + font-weight: bold; + text-transform: uppercase; + font-style: normal; */ +} + +.code-block .code-block-inner { + font-family: 'courier new', courier, monospace; + font-style: normal; +} + +pre i { + font-style: normal; +} + +.ball { + display: inline-block; + width: 100%; + height: 100%; + margin: 0; + border-radius: 50%; + position: relative; + background: #18123A; +} + +.logo::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url("/images/face.svg") ; + animation: scrollBackground 5s linear infinite; + z-index: 1; +} + +.ball:before { + content: ""; + position: absolute; + background: radial-gradient(circle at 50% 120%, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0) 70%); + border-radius: 50%; + bottom: 2.5%; + left: 5%; + opacity: 0.6; + height: 100%; + width: 90%; + -webkit-filter: blur(5px); + z-index: 2; +} + +.ball:after { + width: 100%; + height: 100%; + content: ""; + position: absolute; + top: 2%; + left: 2%; + border-radius: 50%; + background: radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.25), rgba(255, 255, 255, 0.25) 14%, rgba(255, 255, 255, 0) 24%); + transform: translateX(-80px) translateY(-90px) skewX(-20deg); + -webkit-filter: blur(10px); + z-index:10; +} + +.stage { + pointer-events: none; + display: block; + -ms-perspective: 1200px; + -o-perspective: 1200px; + perspective: 1200px; + -ms-perspective-origin: 50% 50%; + -o-perspective-origin: 50% 50%; + perspective-origin: 50% 50%; +} + +.hover\:bg-purple:hover { + --tw-bg-opacity: 1; + background-color: rgb(24 17 57 / var(--tw-bg-opacity)); +} + +.hover\:bg-opacity-50:hover { + --tw-bg-opacity: 0.5; +} + +.hover\:saturate-200:hover { + --tw-saturate: saturate(2); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.disabled\:opacity-50:disabled { + opacity: 0.5; +} + +.aria-\[current\]\:bg-purple[aria-current] { + --tw-bg-opacity: 1; + background-color: rgb(24 17 57 / var(--tw-bg-opacity)); +} + +@media (min-width: 640px) { + .sm\:h-auto { + height: auto; + } + + .sm\:w-28 { + width: 7rem; + } + + .sm\:p-8 { + padding: 2rem; + } +} + +@media (min-width: 768px) { + .md\:mt-\[-60px\] { + margin-top: -60px; + } + + .md\:block { + display: block; + } + + .md\:max-w-\[360px\] { + max-width: 360px; + } + + .md\:gap-8 { + gap: 2rem; + } + + .md\:p-6 { + padding: 1.5rem; + } + + .md\:py-24 { + padding-top: 6rem; + padding-bottom: 6rem; + } + + .md\:pl-8 { + padding-left: 2rem; + } + + .md\:pr-6 { + padding-right: 1.5rem; + } + + .md\:pt-4 { + padding-top: 1rem; + } +} + +@media (min-width: 1024px) { + .lg\:mt-\[-60px\] { + margin-top: -60px; + } + + .lg\:block { + display: block; + } + + .lg\:flex { + display: flex; + } + + .lg\:hidden { + display: none; + } + + .lg\:max-w-\[400px\] { + max-width: 400px; + } + + .lg\:max-w-md { + max-width: 28rem; + } + + .lg\:flex-row { + flex-direction: row; + } + + .lg\:items-center { + align-items: center; + } + + .lg\:rounded-tr-lg { + border-top-right-radius: 0.5rem; + } + + .lg\:border-t-0 { + border-top-width: 0px; + } + + .lg\:pl-12 { + padding-left: 3rem; + } + + .lg\:pr-8 { + padding-right: 2rem; + } + + .lg\:pt-8 { + padding-top: 2rem; + } + + .lg\:text-5xl { + font-size: 3rem; + line-height: 1; + } + + .lg\:text-\[16px\] { + font-size: 16px; + } +} + +@media (min-width: 1280px) { + .xl\:justify-between { + justify-content: space-between; + } + + .xl\:gap-4 { + gap: 1rem; + } +} + +@media (min-width: 1536px) { + .\32xl\:ml-\[-100px\] { + margin-left: -100px; + } +} + +@media (min-width: 1920px) { + .\34xl\:left-0 { + left: 0px; + } + + .\34xl\:top-\[-10px\] { + top: -10px; + } +} + +@media (prefers-color-scheme: dark) { + .dark\:block { + display: block; + } + + .dark\:hidden { + display: none; + } + + .dark\:border-eggshell { + --tw-border-opacity: 1; + border-color: rgb(241 250 238 / var(--tw-border-opacity)); + } + + .dark\:border-white { + --tw-border-opacity: 1; + border-color: rgb(242 248 250 / var(--tw-border-opacity)); + } + + .dark\:bg-black { + --tw-bg-opacity: 1; + background-color: rgb(15 25 28 / var(--tw-bg-opacity)); + } + + .dark\:stroke-eggshell { + stroke: #F1FAEE; + } + + .dark\:text-\[\#e0e0e0\] { + --tw-text-opacity: 1; + color: rgb(224 224 224 / var(--tw-text-opacity)); + } + + .dark\:text-eggshell { + --tw-text-opacity: 1; + color: rgb(241 250 238 / var(--tw-text-opacity)); + } + + .dark\:text-white { + --tw-text-opacity: 1; + color: rgb(242 248 250 / var(--tw-text-opacity)); + } +} + diff --git a/leptos-website/tailwind.config.js b/leptos-website/tailwind.config.js new file mode 100644 index 00000000..8fe3e7cf --- /dev/null +++ b/leptos-website/tailwind.config.js @@ -0,0 +1,38 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: { + files: ["*.html", "./src/**/*.rs"], + }, + //darkMode: "class", + + theme: { + extend: { + screens: { + "4xl": "1920px", + }, + }, + colors: { + transparent: "transparent", + red: "#EF3939", + pink: "#F0ADA8", + eggshell: "#F1FAEE", + white: "#F2F8FA", + light_blue: "#A8DADC", + beige: "#D2D7B4", + dark_blue: "#324571", + purple: "#181139", + black: "#0F191C", + }, + // fontSize: { + // sm: "0.8rem", + // base: "1rem", + // lg: "1.2rem", + // xl: "1.5rem", + // "2xl": "1.8rem", + // "3xl": "2.4rem", + // "4xl": "3.2rem", + // "5xl": "4.8rem", + // "6xl": "6.4rem", + // }, + }, +};