Upload folder using huggingface_hub
Browse files- activation/impls/artifacts/benchmark/activation.jsonl +9 -9
- activation/impls/cells/benchmark.py +13 -7
- activation/impls/hf_kernels_swiglu.html +0 -0
- activation/impls/torch_swiglu.html +0 -0
- activation/results/artifacts/combine/latency.svg +2 -2
- activation/results/combined_results.html +0 -0
- causal_conv1d/impls/artifacts/benchmark/causal_conv1d.jsonl +24 -24
- causal_conv1d/impls/cells/benchmark.py +9 -18
- causal_conv1d/impls/hf_kernels_causal_conv1d.html +0 -0
- causal_conv1d/impls/torch_causal_conv1d.html +0 -0
- causal_conv1d/results/artifacts/combine/latency.svg +2 -2
- causal_conv1d/results/combined_results.html +0 -0
- flash_attn/impls/artifacts/benchmark/attention.jsonl +6 -6
- flash_attn/impls/cells/benchmark.py +10 -10
- flash_attn/impls/flash_attention.html +0 -0
- flash_attn/impls/hf_kernels_flash_attn.html +0 -0
- flash_attn/impls/hf_kernels_flash_attn3.html +0 -0
- flash_attn/impls/mem_efficient_attention.html +0 -0
- flash_attn/impls/sage_attention.html +1551 -1323
- flash_attn/impls/xformers.html +0 -0
- flash_attn/results/artifacts/combine/latency.svg +2 -2
- flash_attn/results/combined_results.html +0 -0
- index.html +1690 -1362
- layer_norm/impls/artifacts/benchmark/layer_norm.jsonl +4 -4
- layer_norm/impls/cells/benchmark.py +28 -5
- layer_norm/impls/hf_kernels_layer_norm.html +0 -0
- layer_norm/impls/torch_layer_norm.html +0 -0
- layer_norm/results/artifacts/combine/latency.svg +2 -2
- layer_norm/results/combined_results.html +0 -0
- rotary/impls/artifacts/benchmark/rotary.jsonl +24 -24
- rotary/impls/cells/benchmark.py +21 -12
- rotary/impls/hf_kernels_rotary.html +0 -0
- rotary/impls/torch_rotary.html +0 -0
- rotary/index.html +1541 -1314
- rotary/results/artifacts/combine/latency.svg +2 -2
- rotary/results/combined_results.html +0 -0
activation/impls/artifacts/benchmark/activation.jsonl
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
-
{"ts": "2025-10-
|
| 2 |
-
{"ts": "2025-10-
|
| 3 |
-
{"ts": "2025-10-
|
| 4 |
-
{"ts": "2025-10-
|
| 5 |
-
{"ts": "2025-10-
|
| 6 |
-
{"ts": "2025-10-
|
| 7 |
-
{"ts": "2025-10-
|
| 8 |
-
{"ts": "2025-10-
|
| 9 |
-
{"ts": "2025-10-
|
|
|
|
| 1 |
+
{"ts": "2025-10-30T15:52:35Z", "run": "37230f1ce31641f2b6ebd7aba7f793c9", "impl": "hf_kernels_swiglu", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_T128_D768", "num_tokens": 128, "hidden_dim": 768, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.022969999974975508, "p50": 0.023499999997511622, "p90": 0.023961000010785938, "mean": 0.02361460000201987, "iqr": 0.0009899999895424116, "raw_times": [0.022971000021243526, 0.022969999974975508, 0.023961000010785938, 0.023499999997511622, 0.024671000005582755], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.03073999999969601, "peak_bytes": 1966080, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "swiglu_fp32"}, "err": null}
|
| 2 |
+
{"ts": "2025-10-30T15:52:35Z", "run": "37230f1ce31641f2b6ebd7aba7f793c9", "impl": "hf_kernels_swiglu", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_T128_D1024", "num_tokens": 128, "hidden_dim": 1024, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.027540000019143918, "p50": 0.029130999962490023, "p90": 0.03002100004323438, "mean": 0.029014800009008468, "iqr": 0.0016900000332498166, "raw_times": [0.027540000019143918, 0.030051000010189455, 0.03002100004323438, 0.029130999962490023, 0.028331000009984564], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.03343999998151048, "peak_bytes": 2621440, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "swiglu_fp32"}, "err": null}
|
| 3 |
+
{"ts": "2025-10-30T15:52:35Z", "run": "37230f1ce31641f2b6ebd7aba7f793c9", "impl": "hf_kernels_swiglu", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_T128_D2048", "num_tokens": 128, "hidden_dim": 2048, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.02829999999676147, "p50": 0.029119999965132592, "p90": 0.03051000004461457, "mean": 0.029939999990347133, "iqr": 0.0019500000689731678, "raw_times": [0.02829999999676147, 0.03051000004461457, 0.033209999969585624, 0.029119999965132592, 0.028559999975641404], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.031761000002461515, "peak_bytes": 5242880, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "swiglu_fp32"}, "err": null}
|
| 4 |
+
{"ts": "2025-10-30T15:52:35Z", "run": "37230f1ce31641f2b6ebd7aba7f793c9", "impl": "hf_kernels_swiglu", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_T256_D768", "num_tokens": 256, "hidden_dim": 768, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.027531000000635686, "p50": 0.028170999996746104, "p90": 0.028501000031155854, "mean": 0.028293000002577173, "iqr": 0.0008900000239009387, "raw_times": [0.027611000007254916, 0.028170999996746104, 0.029650999977093306, 0.027531000000635686, 0.028501000031155854], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.03130000004603062, "peak_bytes": 3932160, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "swiglu_fp32"}, "err": null}
|
| 5 |
+
{"ts": "2025-10-30T15:52:35Z", "run": "37230f1ce31641f2b6ebd7aba7f793c9", "impl": "hf_kernels_swiglu", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_T256_D1024", "num_tokens": 256, "hidden_dim": 1024, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.02755000002707675, "p50": 0.02861000001530556, "p90": 0.028831000008722185, "mean": 0.02867660001584227, "iqr": 0.00023000001192485797, "raw_times": [0.028600999996797327, 0.029791000031309522, 0.028831000008722185, 0.02755000002707675, 0.02861000001530556], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.03139000000373926, "peak_bytes": 5242880, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "swiglu_fp32"}, "err": null}
|
| 6 |
+
{"ts": "2025-10-30T15:52:35Z", "run": "37230f1ce31641f2b6ebd7aba7f793c9", "impl": "hf_kernels_swiglu", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_T256_D2048", "num_tokens": 256, "hidden_dim": 2048, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.02618100000972845, "p50": 0.027131000024382956, "p90": 0.02731099999664366, "mean": 0.026918799994746223, "iqr": 0.0007610000238855719, "raw_times": [0.02618100000972845, 0.027131000024382956, 0.027420999970217963, 0.02731099999664366, 0.026549999972758087], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.03008099997714453, "peak_bytes": 10485760, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "swiglu_fp32"}, "err": null}
|
| 7 |
+
{"ts": "2025-10-30T15:52:35Z", "run": "37230f1ce31641f2b6ebd7aba7f793c9", "impl": "hf_kernels_swiglu", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_T512_D768", "num_tokens": 512, "hidden_dim": 768, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.026950999995278835, "p50": 0.02748000002839035, "p90": 0.02804100000730614, "mean": 0.02758480000011332, "iqr": 0.0006300000450210064, "raw_times": [0.026950999995278835, 0.02804100000730614, 0.027410999962285132, 0.02804100000730614, 0.02748000002839035], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.03104999996139668, "peak_bytes": 7864320, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "swiglu_fp32"}, "err": null}
|
| 8 |
+
{"ts": "2025-10-30T15:52:35Z", "run": "37230f1ce31641f2b6ebd7aba7f793c9", "impl": "hf_kernels_swiglu", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_T512_D1024", "num_tokens": 512, "hidden_dim": 1024, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.026300000001810986, "p50": 0.02733100001250932, "p90": 0.0275399999623005, "mean": 0.02720039998393986, "iqr": 0.0004789999934473599, "raw_times": [0.02706099996885314, 0.02733100001250932, 0.027769999974225357, 0.0275399999623005, 0.026300000001810986], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.03032000000757762, "peak_bytes": 10485760, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "swiglu_fp32"}, "err": null}
|
| 9 |
+
{"ts": "2025-10-30T15:52:35Z", "run": "37230f1ce31641f2b6ebd7aba7f793c9", "impl": "hf_kernels_swiglu", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_T512_D2048", "num_tokens": 512, "hidden_dim": 2048, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.02642100002958614, "p50": 0.027860999978202017, "p90": 0.02790100000993334, "mean": 0.027615000010428048, "iqr": 0.00036000000136482413, "raw_times": [0.02642100002958614, 0.028351000025850226, 0.027541000008568517, 0.02790100000993334, 0.027860999978202017], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.03163999997468636, "peak_bytes": 20971520, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "swiglu_fp32"}, "err": null}
|
activation/impls/cells/benchmark.py
CHANGED
|
@@ -4,6 +4,7 @@
|
|
| 4 |
# "numpy",
|
| 5 |
# "torch==2.8.0",
|
| 6 |
# "kernels-benchmark-tools",
|
|
|
|
| 7 |
# ]
|
| 8 |
#
|
| 9 |
# [tool.uv.sources]
|
|
@@ -12,17 +13,22 @@
|
|
| 12 |
import torch
|
| 13 |
import sys
|
| 14 |
from kernels_benchmark_tools import KernelTypeEnum, run_benchmark
|
| 15 |
-
|
| 16 |
|
|
|
|
|
|
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
|
| 23 |
run_benchmark(
|
| 24 |
kernel_type=KernelTypeEnum.ACTIVATION,
|
| 25 |
-
impl_name="
|
| 26 |
-
impl_tags={"family":"hf-kernels", "backend":"
|
| 27 |
-
impl_func=
|
| 28 |
)
|
|
|
|
| 4 |
# "numpy",
|
| 5 |
# "torch==2.8.0",
|
| 6 |
# "kernels-benchmark-tools",
|
| 7 |
+
# "kernels",
|
| 8 |
# ]
|
| 9 |
#
|
| 10 |
# [tool.uv.sources]
|
|
|
|
| 13 |
import torch
|
| 14 |
import sys
|
| 15 |
from kernels_benchmark_tools import KernelTypeEnum, run_benchmark
|
| 16 |
+
from kernels import get_kernel
|
| 17 |
|
| 18 |
+
# Load the activation kernel
|
| 19 |
+
activation = get_kernel("kernels-community/activation")
|
| 20 |
|
| 21 |
+
|
| 22 |
+
def hf_kernels_swiglu(input_tensor):
|
| 23 |
+
hidden_dim = input_tensor.shape[-1] // 2
|
| 24 |
+
out_shape = input_tensor.shape[:-1] + (hidden_dim,)
|
| 25 |
+
out = torch.empty(out_shape, dtype=input_tensor.dtype, device=input_tensor.device)
|
| 26 |
+
return activation.silu_and_mul(out, input_tensor)
|
| 27 |
|
| 28 |
|
| 29 |
run_benchmark(
|
| 30 |
kernel_type=KernelTypeEnum.ACTIVATION,
|
| 31 |
+
impl_name="hf_kernels_swiglu",
|
| 32 |
+
impl_tags={"family": "hf-kernels", "backend": "cuda"},
|
| 33 |
+
impl_func=hf_kernels_swiglu,
|
| 34 |
)
|
activation/impls/hf_kernels_swiglu.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
activation/impls/torch_swiglu.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
activation/results/artifacts/combine/latency.svg
CHANGED
|
|
Git LFS Details
|
|
|
Git LFS Details
|
activation/results/combined_results.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
causal_conv1d/impls/artifacts/benchmark/causal_conv1d.jsonl
CHANGED
|
@@ -1,24 +1,24 @@
|
|
| 1 |
-
{"ts": "2025-10-
|
| 2 |
-
{"ts": "2025-10-
|
| 3 |
-
{"ts": "2025-10-
|
| 4 |
-
{"ts": "2025-10-
|
| 5 |
-
{"ts": "2025-10-
|
| 6 |
-
{"ts": "2025-10-
|
| 7 |
-
{"ts": "2025-10-
|
| 8 |
-
{"ts": "2025-10-
|
| 9 |
-
{"ts": "2025-10-
|
| 10 |
-
{"ts": "2025-10-
|
| 11 |
-
{"ts": "2025-10-
|
| 12 |
-
{"ts": "2025-10-
|
| 13 |
-
{"ts": "2025-10-
|
| 14 |
-
{"ts": "2025-10-
|
| 15 |
-
{"ts": "2025-10-
|
| 16 |
-
{"ts": "2025-10-
|
| 17 |
-
{"ts": "2025-10-
|
| 18 |
-
{"ts": "2025-10-
|
| 19 |
-
{"ts": "2025-10-
|
| 20 |
-
{"ts": "2025-10-
|
| 21 |
-
{"ts": "2025-10-
|
| 22 |
-
{"ts": "2025-10-
|
| 23 |
-
{"ts": "2025-10-
|
| 24 |
-
{"ts": "2025-10-
|
|
|
|
| 1 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D64_S128_W2", "batch": 2, "dim": 64, "seqlen": 128, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.04394999996293336, "p50": 0.04566100000147344, "p90": 0.046750000024076144, "mean": 0.04579239999884521, "iqr": 0.0020500000346146408, "raw_times": [0.0446999999894615, 0.047901000016281614, 0.046750000024076144, 0.04566100000147344, 0.04394999996293336], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05609099997627709, "peak_bytes": 295936, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 2 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D64_S128_W4", "batch": 2, "dim": 64, "seqlen": 128, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.05193099997313766, "p50": 0.05449100001442275, "p90": 0.054510999973444996, "mean": 0.05559319998837964, "iqr": 0.0010200000133409048, "raw_times": [0.05349099996010409, 0.05449100001442275, 0.06354200002078869, 0.05193099997313766, 0.054510999973444996], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.060221000012461445, "peak_bytes": 296448, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 3 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D64_S512_W2", "batch": 2, "dim": 64, "seqlen": 512, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.051560999963840004, "p50": 0.05184100001542902, "p90": 0.05310099999178419, "mean": 0.05230499999697713, "iqr": 0.0014099999816608033, "raw_times": [0.05184100001542902, 0.05333100000370905, 0.05310099999178419, 0.05169100001012339, 0.051560999963840004], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.058330999991085264, "peak_bytes": 1180672, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 4 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D64_S512_W4", "batch": 2, "dim": 64, "seqlen": 512, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.05121099997040801, "p50": 0.051831000007496186, "p90": 0.052310999990368146, "mean": 0.05185479999454401, "iqr": 0.0008799999591246888, "raw_times": [0.05121099997040801, 0.051831000007496186, 0.052310999990368146, 0.05248999997320425, 0.05143100003124346], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05627100000538121, "peak_bytes": 1181184, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 5 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D64_S2048_W2", "batch": 2, "dim": 64, "seqlen": 2048, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.050751000003401714, "p50": 0.051640999970459234, "p90": 0.05217000000357075, "mean": 0.05161080000561924, "iqr": 0.0008689999617672584, "raw_times": [0.05219100000886101, 0.05217000000357075, 0.050751000003401714, 0.05130100004180349, 0.051640999970459234], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.055421000013211597, "peak_bytes": 4719616, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 6 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D64_S2048_W4", "batch": 2, "dim": 64, "seqlen": 2048, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.04883100001507046, "p50": 0.049950999994052836, "p90": 0.05039000001261229, "mean": 0.04992260001017712, "iqr": 0.0006600000119760807, "raw_times": [0.04883100001507046, 0.05071100002851381, 0.04973000000063621, 0.05039000001261229, 0.049950999994052836], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05684100000280523, "peak_bytes": 4720128, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 7 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D2048_S128_W2", "batch": 2, "dim": 2048, "seqlen": 128, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.04895099999657759, "p50": 0.050181000005977694, "p90": 0.05176100000880979, "mean": 0.05066500000339147, "iqr": 0.0021600000081889448, "raw_times": [0.04960100000062084, 0.05176100000880979, 0.050181000005977694, 0.05283100000497143, 0.04895099999657759], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05629100002124687, "peak_bytes": 9461760, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 8 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D2048_S128_W4", "batch": 2, "dim": 2048, "seqlen": 128, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.048800999991271965, "p50": 0.051240999994206504, "p90": 0.0513809999915793, "mean": 0.05085500000632237, "iqr": 0.00043999995114063495, "raw_times": [0.051240999994206504, 0.048800999991271965, 0.051911000014115416, 0.050941000040438666, 0.0513809999915793], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.056131000008008414, "peak_bytes": 9478144, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 9 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D2048_S512_W2", "batch": 2, "dim": 2048, "seqlen": 512, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.04940100001249448, "p50": 0.05085099996904319, "p90": 0.05221100002472667, "mean": 0.05112659999895186, "iqr": 0.0015410000742122065, "raw_times": [0.050669999950514466, 0.05221100002472667, 0.04940100001249448, 0.0525000000379805, 0.05085099996904319], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.053861000026245165, "peak_bytes": 37773312, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 10 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D2048_S512_W4", "batch": 2, "dim": 2048, "seqlen": 512, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.04947999997284569, "p50": 0.05073100004437947, "p90": 0.05098100001532657, "mean": 0.05063280001422754, "iqr": 0.0010900000120273035, "raw_times": [0.04947999997284569, 0.05098100001532657, 0.04989100000329927, 0.05073100004437947, 0.052081000035286706], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.054841000007854745, "peak_bytes": 37789696, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 11 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D2048_S2048_W2", "batch": 2, "dim": 2048, "seqlen": 2048, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.05039100000203689, "p50": 0.051160999987587275, "p90": 0.05154000001539316, "mean": 0.051364599994485616, "iqr": 0.00038000001723048626, "raw_times": [0.051160999987587275, 0.05257099996924808, 0.05039100000203689, 0.05154000001539316, 0.051159999998162675], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05513099995368975, "peak_bytes": 151019520, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 12 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B2_D2048_S2048_W4", "batch": 2, "dim": 2048, "seqlen": 2048, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.048071000037452905, "p50": 0.05178100002467545, "p90": 0.0526809999996658, "mean": 0.05150900001353875, "iqr": 0.0032599999713056604, "raw_times": [0.04942100002836014, 0.0526809999996658, 0.05178100002467545, 0.05559099997753947, 0.048071000037452905], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05527100000790597, "peak_bytes": 151035904, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 13 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D64_S128_W2", "batch": 4, "dim": 64, "seqlen": 128, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.04963099996757592, "p50": 0.05203099999562255, "p90": 0.052549999963957816, "mean": 0.05276679999042244, "iqr": 0.0005189999683352653, "raw_times": [0.05759100002933337, 0.05203099999562255, 0.052549999963957816, 0.04963099996757592, 0.05203099999562255], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.07661199998665325, "peak_bytes": 33727488, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 14 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D64_S128_W4", "batch": 4, "dim": 64, "seqlen": 128, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.049701000023105735, "p50": 0.051581000036549085, "p90": 0.05290100000365783, "mean": 0.05255880001868718, "iqr": 0.002381000001605571, "raw_times": [0.05290100000365783, 0.058091000028070994, 0.051581000036549085, 0.05052000000205226, 0.049701000023105735], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.054920000025049376, "peak_bytes": 591360, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 15 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D64_S512_W2", "batch": 4, "dim": 64, "seqlen": 512, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.0517009999612128, "p50": 0.05219999997052582, "p90": 0.05233100000623381, "mean": 0.05215079999061345, "iqr": 0.0001500000053056283, "raw_times": [0.05233100000623381, 0.05234100001416664, 0.05219999997052582, 0.0517009999612128, 0.05218100000092818], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.055141000018466, "peak_bytes": 2360320, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 16 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D64_S512_W4", "batch": 4, "dim": 64, "seqlen": 512, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.05047100000865612, "p50": 0.05349100001694751, "p90": 0.05691100000149163, "mean": 0.057148999997025385, "iqr": 0.004350000040176383, "raw_times": [0.05047100000865612, 0.05349100001694751, 0.07231099999671642, 0.05256099996131525, 0.05691100000149163], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05554099999471873, "peak_bytes": 2360832, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 17 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D64_S2048_W2", "batch": 4, "dim": 64, "seqlen": 2048, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.049690000025748304, "p50": 0.050921000024573004, "p90": 0.051730999985011294, "mean": 0.051232800001344, "iqr": 0.0010800000040944724, "raw_times": [0.05065099998091682, 0.051730999985011294, 0.05317099999047059, 0.049690000025748304, 0.050921000024573004], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05373099997996178, "peak_bytes": 9438208, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 18 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D64_S2048_W4", "batch": 4, "dim": 64, "seqlen": 2048, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.05013100002315696, "p50": 0.05073099998753605, "p90": 0.052470999946763186, "mean": 0.051448999988679134, "iqr": 0.001829999973779195, "raw_times": [0.05013100002315696, 0.05073099998753605, 0.05327100001295548, 0.052470999946763186, 0.05064099997298399], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05419999996547631, "peak_bytes": 9438720, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 19 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D2048_S128_W2", "batch": 4, "dim": 2048, "seqlen": 128, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.04918100000850245, "p50": 0.050670999996782484, "p90": 0.05192099996520483, "mean": 0.050938799995492445, "iqr": 0.0013709999393540784, "raw_times": [0.04918100000850245, 0.05192099996520483, 0.05237099998112171, 0.05055000002585075, 0.050670999996782484], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05559099997753947, "peak_bytes": 18931712, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 20 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D2048_S128_W4", "batch": 4, "dim": 2048, "seqlen": 128, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.049871000044277025, "p50": 0.05047100000865612, "p90": 0.05118100000345294, "mean": 0.050820800015571876, "iqr": 0.0007699999855503847, "raw_times": [0.049871000044277025, 0.05041100001790255, 0.05217000000357075, 0.05047100000865612, 0.05118100000345294], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05564100001720362, "peak_bytes": 18948096, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 21 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D2048_S512_W2", "batch": 4, "dim": 2048, "seqlen": 512, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.05115100003649786, "p50": 0.052071000027353875, "p90": 0.05212100001017461, "mean": 0.05199700001412566, "iqr": 0.0006100000291553442, "raw_times": [0.05115100003649786, 0.052071000027353875, 0.053131000015582686, 0.05212100001017461, 0.05151099998101927], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05440099999987069, "peak_bytes": 75522048, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 22 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D2048_S512_W4", "batch": 4, "dim": 2048, "seqlen": 512, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.04927099996621109, "p50": 0.051500999973086437, "p90": 0.05194099998107049, "mean": 0.05114499998626343, "iqr": 0.000919999990856013, "raw_times": [0.051500999973086437, 0.04927099996621109, 0.051991000020734646, 0.05194099998107049, 0.05102099999021448], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.054591000036907644, "peak_bytes": 75538432, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 23 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D2048_S2048_W2", "batch": 4, "dim": 2048, "seqlen": 2048, "width": 2, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.049930999978187174, "p50": 0.050361000035081815, "p90": 0.05102099999021448, "mean": 0.05066480000550655, "iqr": 0.0008009999987734773, "raw_times": [0.050219999991441, 0.050361000035081815, 0.05179100003260828, 0.049930999978187174, 0.05102099999021448], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05545099998016667, "peak_bytes": 302014464, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
| 24 |
+
{"ts": "2025-10-30T15:53:36Z", "run": "a6ca6031a2be44b8852eef7e2bbddc9e", "impl": "hf_kernels_causal_conv1d", "tags": {"family": "hf-kernels", "backend": "cuda"}, "wl": {"name": "cuda_B4_D2048_S2048_W4", "batch": 4, "dim": 2048, "seqlen": 2048, "width": 4, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.0500799999940682, "p50": 0.05195099998900332, "p90": 0.051991000020734646, "mean": 0.05318280000210507, "iqr": 0.0014600000213249587, "raw_times": [0.0500799999940682, 0.05195099998900332, 0.051991000020734646, 0.05053099999940969, 0.061361000007309485], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.05489099999067548, "peak_bytes": 302030848, "ok": true, "absmax": 0.0, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax": 0.0, "mae": 0.0, "mse": 0.0, "ref": "causal_conv1d_fp32"}, "err": null}
|
causal_conv1d/impls/cells/benchmark.py
CHANGED
|
@@ -4,37 +4,28 @@
|
|
| 4 |
# "numpy",
|
| 5 |
# "torch==2.8.0",
|
| 6 |
# "kernels-benchmark-tools",
|
|
|
|
| 7 |
# ]
|
| 8 |
#
|
| 9 |
# [tool.uv.sources]
|
| 10 |
# kernels-benchmark-tools = { path = "../../../../../tools", editable = true }
|
| 11 |
# ///
|
| 12 |
import torch
|
| 13 |
-
import torch.nn.functional as F
|
| 14 |
import sys
|
| 15 |
from kernels_benchmark_tools import KernelTypeEnum, run_benchmark
|
|
|
|
| 16 |
|
|
|
|
|
|
|
| 17 |
|
| 18 |
-
def torch_causal_conv1d(input_tensor, weight, bias):
|
| 19 |
-
# Convert to weight dtype for computation
|
| 20 |
-
x = input_tensor.to(weight.dtype)
|
| 21 |
-
dim = weight.shape[0]
|
| 22 |
-
width = weight.shape[1]
|
| 23 |
-
seqlen = input_tensor.shape[-1]
|
| 24 |
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
# Truncate to original sequence length
|
| 29 |
-
out = out[..., :seqlen]
|
| 30 |
-
|
| 31 |
-
# Convert back to original dtype
|
| 32 |
-
return out.to(input_tensor.dtype)
|
| 33 |
|
| 34 |
|
| 35 |
run_benchmark(
|
| 36 |
kernel_type=KernelTypeEnum.CAUSAL_CONV1D,
|
| 37 |
-
impl_name="
|
| 38 |
-
impl_tags={"family": "
|
| 39 |
-
impl_func=
|
| 40 |
)
|
|
|
|
| 4 |
# "numpy",
|
| 5 |
# "torch==2.8.0",
|
| 6 |
# "kernels-benchmark-tools",
|
| 7 |
+
# "kernels",
|
| 8 |
# ]
|
| 9 |
#
|
| 10 |
# [tool.uv.sources]
|
| 11 |
# kernels-benchmark-tools = { path = "../../../../../tools", editable = true }
|
| 12 |
# ///
|
| 13 |
import torch
|
|
|
|
| 14 |
import sys
|
| 15 |
from kernels_benchmark_tools import KernelTypeEnum, run_benchmark
|
| 16 |
+
from kernels import get_kernel
|
| 17 |
|
| 18 |
+
# Load the causal conv1d kernel
|
| 19 |
+
causal_conv1d = get_kernel("kernels-community/causal-conv1d")
|
| 20 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
+
def hf_kernels_causal_conv1d(input_tensor, weight, bias):
|
| 23 |
+
return causal_conv1d.causal_conv1d_fn(input_tensor, weight, bias)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
|
| 26 |
run_benchmark(
|
| 27 |
kernel_type=KernelTypeEnum.CAUSAL_CONV1D,
|
| 28 |
+
impl_name="hf_kernels_causal_conv1d",
|
| 29 |
+
impl_tags={"family": "hf-kernels", "backend": "cuda"},
|
| 30 |
+
impl_func=hf_kernels_causal_conv1d,
|
| 31 |
)
|
causal_conv1d/impls/hf_kernels_causal_conv1d.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
causal_conv1d/impls/torch_causal_conv1d.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
causal_conv1d/results/artifacts/combine/latency.svg
CHANGED
|
|
Git LFS Details
|
|
|
Git LFS Details
|
causal_conv1d/results/combined_results.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
flash_attn/impls/artifacts/benchmark/attention.jsonl
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
-
{"ts": "2025-10-
|
| 2 |
-
{"ts": "2025-10-
|
| 3 |
-
{"ts": "2025-10-
|
| 4 |
-
{"ts": "2025-10-
|
| 5 |
-
{"ts": "2025-10-
|
| 6 |
-
{"ts": "2025-10-
|
|
|
|
| 1 |
+
{"ts": "2025-10-30T15:53:30Z", "run": "30999c763e9c4aa995d0df5078964128", "impl": "hf_kernels_flash_attn3", "tags": {"family": "hf-kernels", "backend": "flash-attn3", "compile": "none"}, "wl": {"name": "cuda_attn_L128_bfloat16", "batch": 1, "seq_len": 4224, "heads": 24, "head_dim": 128, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.9094910000158052, "p50": 0.9113720000186731, "p90": 0.9181919999718957, "mean": 0.9141214000010223, "iqr": 0.007780999965234514, "raw_times": [0.9104110000066612, 0.9094910000158052, 0.9113720000186731, 0.9181919999718957, 0.9211409999920761], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.9259819999556385, "peak_bytes": 295567360, "ok": true, "absmax": 0.0625, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0625, "mae": 0.0003604888916015625, "mse": 2.8014183044433594e-06, "ref": "sdpa_math_fp32"}, "err": null}
|
| 2 |
+
{"ts": "2025-10-30T15:53:30Z", "run": "30999c763e9c4aa995d0df5078964128", "impl": "hf_kernels_flash_attn3", "tags": {"family": "hf-kernels", "backend": "flash-attn3", "compile": "none"}, "wl": {"name": "cuda_attn_L256_bfloat16", "batch": 1, "seq_len": 4352, "heads": 24, "head_dim": 128, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.9480720000283327, "p50": 0.9496129999888581, "p90": 0.9558429999856344, "mean": 0.952826599996115, "iqr": 0.00735100002202671, "raw_times": [0.9480720000283327, 0.9484919999636077, 0.9496129999888581, 0.9558429999856344, 0.962113000014142], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.9554529999604711, "peak_bytes": 304742400, "ok": true, "absmax": 0.0625, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0625, "mae": 0.00035858154296875, "mse": 2.7865171432495117e-06, "ref": "sdpa_math_fp32"}, "err": null}
|
| 3 |
+
{"ts": "2025-10-30T15:53:30Z", "run": "30999c763e9c4aa995d0df5078964128", "impl": "hf_kernels_flash_attn3", "tags": {"family": "hf-kernels", "backend": "flash-attn3", "compile": "none"}, "wl": {"name": "cuda_attn_L320_bfloat16", "batch": 1, "seq_len": 4416, "heads": 24, "head_dim": 128, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 1.0061439999731192, "p50": 1.0189639999680367, "p90": 1.0215840000000753, "mean": 1.017895999996199, "iqr": 0.0038299999687296804, "raw_times": [1.0189639999680367, 1.025034000008418, 1.0177540000313456, 1.0061439999731192, 1.0215840000000753], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 1.0171540000101231, "peak_bytes": 307494912, "ok": true, "absmax": 0.0625, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0625, "mae": 0.00035858154296875, "mse": 2.7865171432495117e-06, "ref": "sdpa_math_fp32"}, "err": null}
|
| 4 |
+
{"ts": "2025-10-30T15:53:30Z", "run": "30999c763e9c4aa995d0df5078964128", "impl": "hf_kernels_flash_attn3", "tags": {"family": "hf-kernels", "backend": "flash-attn3", "compile": "none"}, "wl": {"name": "cuda_attn_L384_bfloat16", "batch": 1, "seq_len": 4480, "heads": 24, "head_dim": 128, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 1.0146539999595916, "p50": 1.019383999960155, "p90": 1.0202839999919888, "mean": 1.018159799980367, "iqr": 0.004200999967451935, "raw_times": [1.0202839999919888, 1.0146539999595916, 1.0160830000245369, 1.0203939999655631, 1.019383999960155], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 1.0248149999938505, "peak_bytes": 311296000, "ok": true, "absmax": 0.0625, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0625, "mae": 0.00035858154296875, "mse": 2.7865171432495117e-06, "ref": "sdpa_math_fp32"}, "err": null}
|
| 5 |
+
{"ts": "2025-10-30T15:53:30Z", "run": "30999c763e9c4aa995d0df5078964128", "impl": "hf_kernels_flash_attn3", "tags": {"family": "hf-kernels", "backend": "flash-attn3", "compile": "none"}, "wl": {"name": "cuda_attn_L448_bfloat16", "batch": 1, "seq_len": 4544, "heads": 24, "head_dim": 128, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 1.1737179999613545, "p50": 1.184327000032681, "p90": 1.1859380000487363, "mean": 1.186479800003326, "iqr": 0.010300000042207103, "raw_times": [1.1756380000065292, 1.1737179999613545, 1.1859380000487363, 1.184327000032681, 1.2127779999673294], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 1.1959679999904438, "peak_bytes": 315621376, "ok": true, "absmax": 0.0625, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.0625, "mae": 0.00035858154296875, "mse": 2.7865171432495117e-06, "ref": "sdpa_math_fp32"}, "err": null}
|
| 6 |
+
{"ts": "2025-10-30T15:53:30Z", "run": "30999c763e9c4aa995d0df5078964128", "impl": "hf_kernels_flash_attn3", "tags": {"family": "hf-kernels", "backend": "flash-attn3", "compile": "none"}, "wl": {"name": "cuda_attn_L512_bfloat16", "batch": 1, "seq_len": 4608, "heads": 24, "head_dim": 128, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 1.1702179999701912, "p50": 1.1838479999823903, "p90": 1.1906280000175684, "mean": 1.1843698000006952, "iqr": 0.016700999992735888, "raw_times": [1.1739270000248325, 1.1702179999701912, 1.1838479999823903, 1.1906280000175684, 1.2032280000084938], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 1.1880579999683505, "peak_bytes": 319946752, "ok": true, "absmax": 0.125, "corr": {"ok": true, "rtol": 0.02, "atol": 0.02, "absmax": 0.125, "mae": 0.000362396240234375, "mse": 2.8014183044433594e-06, "ref": "sdpa_math_fp32"}, "err": null}
|
flash_attn/impls/cells/benchmark.py
CHANGED
|
@@ -4,6 +4,7 @@
|
|
| 4 |
# "numpy",
|
| 5 |
# "torch==2.8.0",
|
| 6 |
# "kernels-benchmark-tools",
|
|
|
|
| 7 |
# ]
|
| 8 |
#
|
| 9 |
# [tool.uv.sources]
|
|
@@ -12,20 +13,19 @@
|
|
| 12 |
import torch
|
| 13 |
import sys
|
| 14 |
from kernels_benchmark_tools import KernelTypeEnum, run_benchmark
|
|
|
|
| 15 |
|
|
|
|
|
|
|
| 16 |
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
torch.nn.attention.SDPBackend.EFFICIENT_ATTENTION
|
| 21 |
-
):
|
| 22 |
-
o = torch.nn.functional.scaled_dot_product_attention(qt, kt, vt)
|
| 23 |
-
return o.transpose(1, 2).contiguous()
|
| 24 |
|
| 25 |
|
| 26 |
run_benchmark(
|
| 27 |
kernel_type=KernelTypeEnum.ATTENTION,
|
| 28 |
-
impl_name="
|
| 29 |
-
impl_tags={"family": "
|
| 30 |
-
impl_func=
|
| 31 |
)
|
|
|
|
| 4 |
# "numpy",
|
| 5 |
# "torch==2.8.0",
|
| 6 |
# "kernels-benchmark-tools",
|
| 7 |
+
# "kernels",
|
| 8 |
# ]
|
| 9 |
#
|
| 10 |
# [tool.uv.sources]
|
|
|
|
| 13 |
import torch
|
| 14 |
import sys
|
| 15 |
from kernels_benchmark_tools import KernelTypeEnum, run_benchmark
|
| 16 |
+
from kernels import get_kernel
|
| 17 |
|
| 18 |
+
# Load the flash attention 3 kernel
|
| 19 |
+
hf_kernels_flash_attn3 = get_kernel("kernels-community/flash-attn3")
|
| 20 |
|
| 21 |
+
|
| 22 |
+
def hf_flash_attention3(query, key, value):
|
| 23 |
+
return hf_kernels_flash_attn3.flash_attn_func(query, key, value, causal=False)[0]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
|
| 26 |
run_benchmark(
|
| 27 |
kernel_type=KernelTypeEnum.ATTENTION,
|
| 28 |
+
impl_name="hf_kernels_flash_attn3",
|
| 29 |
+
impl_tags={"family": "hf-kernels", "backend": "flash-attn3", "compile": "none"},
|
| 30 |
+
impl_func=hf_flash_attention3,
|
| 31 |
)
|
flash_attn/impls/flash_attention.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
flash_attn/impls/hf_kernels_flash_attn.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
flash_attn/impls/hf_kernels_flash_attn3.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
flash_attn/impls/mem_efficient_attention.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
flash_attn/impls/sage_attention.html
CHANGED
|
@@ -4,6 +4,11 @@
|
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
<title>sage_attention</title>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
<script>
|
| 8 |
// Iframe-friendly navigation router
|
| 9 |
(function() {
|
|
@@ -87,1320 +92,1542 @@
|
|
| 87 |
</script>
|
| 88 |
<style>
|
| 89 |
:root[data-theme="light"] {
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 343 |
-
|
| 344 |
-
|
| 345 |
-
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
| 354 |
-
|
| 355 |
-
|
| 356 |
-
|
| 357 |
-
|
| 358 |
-
|
| 359 |
-
|
| 360 |
-
|
| 361 |
-
|
| 362 |
-
|
| 363 |
-
|
| 364 |
-
|
| 365 |
-
|
| 366 |
-
|
| 367 |
-
|
| 368 |
-
|
| 369 |
-
|
| 370 |
-
|
| 371 |
-
|
| 372 |
-
|
| 373 |
-
|
| 374 |
-
|
| 375 |
-
|
| 376 |
-
|
| 377 |
-
|
| 378 |
-
|
| 379 |
-
|
| 380 |
-
|
| 381 |
-
|
| 382 |
-
|
| 383 |
-
|
| 384 |
-
|
| 385 |
-
|
| 386 |
-
|
| 387 |
-
|
| 388 |
-
|
| 389 |
-
|
| 390 |
-
|
| 391 |
-
|
| 392 |
-
|
| 393 |
-
|
| 394 |
-
|
| 395 |
-
|
| 396 |
-
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
|
| 405 |
-
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
|
| 419 |
-
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
|
| 430 |
-
|
| 431 |
-
|
| 432 |
-
|
| 433 |
-
|
| 434 |
-
|
| 435 |
-
|
| 436 |
-
|
| 437 |
-
|
| 438 |
-
|
| 439 |
-
|
| 440 |
-
|
| 441 |
-
|
| 442 |
-
|
| 443 |
-
|
| 444 |
-
|
| 445 |
-
|
| 446 |
-
|
| 447 |
-
|
| 448 |
-
|
| 449 |
-
|
| 450 |
-
|
| 451 |
-
|
| 452 |
-
|
| 453 |
-
|
| 454 |
-
|
| 455 |
-
|
| 456 |
-
|
| 457 |
-
|
| 458 |
-
|
| 459 |
-
|
| 460 |
-
|
| 461 |
-
|
| 462 |
-
|
| 463 |
-
|
| 464 |
-
|
| 465 |
-
|
| 466 |
-
|
| 467 |
-
|
| 468 |
-
|
| 469 |
-
|
| 470 |
-
|
| 471 |
-
|
| 472 |
-
|
| 473 |
-
|
| 474 |
-
|
| 475 |
-
|
| 476 |
-
|
| 477 |
-
|
| 478 |
-
|
| 479 |
-
|
| 480 |
-
|
| 481 |
-
|
| 482 |
-
|
| 483 |
-
|
| 484 |
-
|
| 485 |
-
|
| 486 |
-
|
| 487 |
-
|
| 488 |
-
|
| 489 |
-
|
| 490 |
-
|
| 491 |
-
|
| 492 |
-
|
| 493 |
-
|
| 494 |
-
|
| 495 |
-
|
| 496 |
-
|
| 497 |
-
|
| 498 |
-
|
| 499 |
-
|
| 500 |
-
|
| 501 |
-
|
| 502 |
-
|
| 503 |
-
|
| 504 |
-
|
| 505 |
-
|
| 506 |
-
|
| 507 |
-
|
| 508 |
-
|
| 509 |
-
|
| 510 |
-
|
| 511 |
-
|
| 512 |
-
|
| 513 |
-
|
| 514 |
-
|
| 515 |
-
|
| 516 |
-
|
| 517 |
-
|
| 518 |
-
|
| 519 |
-
|
| 520 |
-
|
| 521 |
-
|
| 522 |
-
|
| 523 |
-
|
| 524 |
-
|
| 525 |
-
|
| 526 |
-
|
| 527 |
-
|
| 528 |
-
|
| 529 |
-
|
| 530 |
-
|
| 531 |
-
|
| 532 |
-
|
| 533 |
-
|
| 534 |
-
|
| 535 |
-
|
| 536 |
-
|
| 537 |
-
|
| 538 |
-
|
| 539 |
-
|
| 540 |
-
|
| 541 |
-
|
| 542 |
-
|
| 543 |
-
|
| 544 |
-
|
| 545 |
-
|
| 546 |
-
|
| 547 |
-
|
| 548 |
-
|
| 549 |
-
|
| 550 |
-
|
| 551 |
-
|
| 552 |
-
|
| 553 |
-
|
| 554 |
-
|
| 555 |
-
|
| 556 |
-
|
| 557 |
-
|
| 558 |
-
|
| 559 |
-
|
| 560 |
-
|
| 561 |
-
|
| 562 |
-
|
| 563 |
-
|
| 564 |
-
|
| 565 |
-
|
| 566 |
-
|
| 567 |
-
|
| 568 |
-
|
| 569 |
-
|
| 570 |
-
|
| 571 |
-
|
| 572 |
-
|
| 573 |
-
|
| 574 |
-
|
| 575 |
-
|
| 576 |
-
|
| 577 |
-
|
| 578 |
-
|
| 579 |
-
|
| 580 |
-
|
| 581 |
-
|
| 582 |
-
|
| 583 |
-
|
| 584 |
-
|
| 585 |
-
|
| 586 |
-
|
| 587 |
-
|
| 588 |
-
|
| 589 |
-
|
| 590 |
-
|
| 591 |
-
|
| 592 |
-
|
| 593 |
-
|
| 594 |
-
|
| 595 |
-
|
| 596 |
-
|
| 597 |
-
|
| 598 |
-
|
| 599 |
-
|
| 600 |
-
|
| 601 |
-
|
| 602 |
-
|
| 603 |
-
|
| 604 |
-
|
| 605 |
-
|
| 606 |
-
|
| 607 |
-
|
| 608 |
-
|
| 609 |
-
|
| 610 |
-
|
| 611 |
-
|
| 612 |
-
|
| 613 |
-
|
| 614 |
-
|
| 615 |
-
|
| 616 |
-
|
| 617 |
-
|
| 618 |
-
|
| 619 |
-
|
| 620 |
-
|
| 621 |
-
|
| 622 |
-
|
| 623 |
-
|
| 624 |
-
|
| 625 |
-
|
| 626 |
-
|
| 627 |
-
|
| 628 |
-
|
| 629 |
-
|
| 630 |
-
|
| 631 |
-
|
| 632 |
-
|
| 633 |
-
|
| 634 |
-
|
| 635 |
-
|
| 636 |
-
|
| 637 |
-
|
| 638 |
-
|
| 639 |
-
|
| 640 |
-
|
| 641 |
-
|
| 642 |
-
|
| 643 |
-
|
| 644 |
-
|
| 645 |
-
|
| 646 |
-
|
| 647 |
-
|
| 648 |
-
|
| 649 |
-
|
| 650 |
-
|
| 651 |
-
|
| 652 |
-
|
| 653 |
-
|
| 654 |
-
|
| 655 |
-
|
| 656 |
-
|
| 657 |
-
|
| 658 |
-
|
| 659 |
-
|
| 660 |
-
|
| 661 |
-
|
| 662 |
-
|
| 663 |
-
|
| 664 |
-
|
| 665 |
-
|
| 666 |
-
|
| 667 |
-
|
| 668 |
-
|
| 669 |
-
|
| 670 |
-
|
| 671 |
-
|
| 672 |
-
|
| 673 |
-
|
| 674 |
-
|
| 675 |
-
|
| 676 |
-
|
| 677 |
-
|
| 678 |
-
|
| 679 |
-
|
| 680 |
-
|
| 681 |
-
|
| 682 |
-
|
| 683 |
-
|
| 684 |
-
|
| 685 |
-
|
| 686 |
-
|
| 687 |
-
|
| 688 |
-
|
| 689 |
-
|
| 690 |
-
|
| 691 |
-
|
| 692 |
-
|
| 693 |
-
|
| 694 |
-
|
| 695 |
-
|
| 696 |
-
|
| 697 |
-
|
| 698 |
-
|
| 699 |
-
|
| 700 |
-
|
| 701 |
-
|
| 702 |
-
|
| 703 |
-
|
| 704 |
-
|
| 705 |
-
|
| 706 |
-
|
| 707 |
-
|
| 708 |
-
|
| 709 |
-
|
| 710 |
-
|
| 711 |
-
|
| 712 |
-
|
| 713 |
-
|
| 714 |
-
|
| 715 |
-
|
| 716 |
-
|
| 717 |
-
|
| 718 |
-
|
| 719 |
-
|
| 720 |
-
|
| 721 |
-
|
| 722 |
-
|
| 723 |
-
|
| 724 |
-
|
| 725 |
-
|
| 726 |
-
|
| 727 |
-
|
| 728 |
-
|
| 729 |
-
|
| 730 |
-
|
| 731 |
-
|
| 732 |
-
|
| 733 |
-
|
| 734 |
-
|
| 735 |
-
|
| 736 |
-
|
| 737 |
-
|
| 738 |
-
|
| 739 |
-
|
| 740 |
-
|
| 741 |
-
|
| 742 |
-
|
| 743 |
-
|
| 744 |
-
|
| 745 |
-
|
| 746 |
-
|
| 747 |
-
|
| 748 |
-
|
| 749 |
-
|
| 750 |
-
|
| 751 |
-
|
| 752 |
-
|
| 753 |
-
|
| 754 |
-
|
| 755 |
-
|
| 756 |
-
|
| 757 |
-
|
| 758 |
-
|
| 759 |
-
|
| 760 |
-
|
| 761 |
-
|
| 762 |
-
|
| 763 |
-
|
| 764 |
-
|
| 765 |
-
|
| 766 |
-
|
| 767 |
-
|
| 768 |
-
|
| 769 |
-
|
| 770 |
-
|
| 771 |
-
|
| 772 |
-
|
| 773 |
-
|
| 774 |
-
|
| 775 |
-
|
| 776 |
-
|
| 777 |
-
|
| 778 |
-
|
| 779 |
-
|
| 780 |
-
|
| 781 |
-
|
| 782 |
-
|
| 783 |
-
|
| 784 |
-
|
| 785 |
-
|
| 786 |
-
|
| 787 |
-
|
| 788 |
-
|
| 789 |
-
|
| 790 |
-
|
| 791 |
-
|
| 792 |
-
|
| 793 |
-
|
| 794 |
-
|
| 795 |
-
|
| 796 |
-
|
| 797 |
-
|
| 798 |
-
|
| 799 |
-
|
| 800 |
-
|
| 801 |
-
|
| 802 |
-
|
| 803 |
-
|
| 804 |
-
|
| 805 |
-
|
| 806 |
-
|
| 807 |
-
|
| 808 |
-
|
| 809 |
-
|
| 810 |
-
|
| 811 |
-
|
| 812 |
-
|
| 813 |
-
|
| 814 |
-
|
| 815 |
-
|
| 816 |
-
|
| 817 |
-
|
| 818 |
-
|
| 819 |
-
|
| 820 |
-
|
| 821 |
-
|
| 822 |
-
|
| 823 |
-
|
| 824 |
-
|
| 825 |
-
|
| 826 |
-
|
| 827 |
-
|
| 828 |
-
|
| 829 |
-
|
| 830 |
-
|
| 831 |
-
|
| 832 |
-
|
| 833 |
-
|
| 834 |
-
|
| 835 |
-
|
| 836 |
-
|
| 837 |
-
|
| 838 |
-
|
| 839 |
-
|
| 840 |
-
|
| 841 |
-
|
| 842 |
-
|
| 843 |
-
|
| 844 |
-
|
| 845 |
-
|
| 846 |
-
|
| 847 |
-
|
| 848 |
-
|
| 849 |
-
|
| 850 |
-
|
| 851 |
-
|
| 852 |
-
|
| 853 |
-
|
| 854 |
-
|
| 855 |
-
|
| 856 |
-
|
| 857 |
-
|
| 858 |
-
|
| 859 |
-
|
| 860 |
-
|
| 861 |
-
|
| 862 |
-
|
| 863 |
-
|
| 864 |
-
|
| 865 |
-
|
| 866 |
-
|
| 867 |
-
|
| 868 |
-
|
| 869 |
-
|
| 870 |
-
|
| 871 |
-
|
| 872 |
-
|
| 873 |
-
|
| 874 |
-
|
| 875 |
-
|
| 876 |
-
|
| 877 |
-
|
| 878 |
-
|
| 879 |
-
|
| 880 |
-
|
| 881 |
-
|
| 882 |
-
|
| 883 |
-
|
| 884 |
-
|
| 885 |
-
|
| 886 |
-
|
| 887 |
-
|
| 888 |
-
|
| 889 |
-
|
| 890 |
-
|
| 891 |
-
|
| 892 |
-
|
| 893 |
-
|
| 894 |
-
|
| 895 |
-
|
| 896 |
-
|
| 897 |
-
|
| 898 |
-
|
| 899 |
-
|
| 900 |
-
|
| 901 |
-
|
| 902 |
-
|
| 903 |
-
|
| 904 |
-
|
| 905 |
-
|
| 906 |
-
|
| 907 |
-
|
| 908 |
-
|
| 909 |
-
|
| 910 |
-
|
| 911 |
-
|
| 912 |
-
|
| 913 |
-
|
| 914 |
-
|
| 915 |
-
|
| 916 |
-
|
| 917 |
-
|
| 918 |
-
|
| 919 |
-
|
| 920 |
-
|
| 921 |
-
|
| 922 |
-
|
| 923 |
-
|
| 924 |
-
|
| 925 |
-
|
| 926 |
-
|
| 927 |
-
|
| 928 |
-
|
| 929 |
-
|
| 930 |
-
|
| 931 |
-
|
| 932 |
-
|
| 933 |
-
|
| 934 |
-
|
| 935 |
-
|
| 936 |
-
|
| 937 |
-
|
| 938 |
-
|
| 939 |
-
|
| 940 |
-
|
| 941 |
-
|
| 942 |
-
|
| 943 |
-
|
| 944 |
-
|
| 945 |
-
|
| 946 |
-
|
| 947 |
-
|
| 948 |
-
|
| 949 |
-
|
| 950 |
-
|
| 951 |
-
|
| 952 |
-
|
| 953 |
-
|
| 954 |
-
|
| 955 |
-
|
| 956 |
-
|
| 957 |
-
|
| 958 |
-
|
| 959 |
-
|
| 960 |
-
|
| 961 |
-
|
| 962 |
-
|
| 963 |
-
|
| 964 |
-
|
| 965 |
-
|
| 966 |
-
|
| 967 |
-
|
| 968 |
-
|
| 969 |
-
|
| 970 |
-
|
| 971 |
-
|
| 972 |
-
|
| 973 |
-
|
| 974 |
-
|
| 975 |
-
|
| 976 |
-
|
| 977 |
-
|
| 978 |
-
|
| 979 |
-
|
| 980 |
-
|
| 981 |
-
|
| 982 |
-
|
| 983 |
-
|
| 984 |
-
|
| 985 |
-
|
| 986 |
-
|
| 987 |
-
|
| 988 |
-
|
| 989 |
-
|
| 990 |
-
|
| 991 |
-
|
| 992 |
-
|
| 993 |
-
|
| 994 |
-
|
| 995 |
-
|
| 996 |
-
|
| 997 |
-
|
| 998 |
-
|
| 999 |
-
|
| 1000 |
-
|
| 1001 |
-
|
| 1002 |
-
|
| 1003 |
-
|
| 1004 |
-
|
| 1005 |
-
|
| 1006 |
-
|
| 1007 |
-
|
| 1008 |
-
|
| 1009 |
-
|
| 1010 |
-
|
| 1011 |
-
|
| 1012 |
-
|
| 1013 |
-
|
| 1014 |
-
|
| 1015 |
-
|
| 1016 |
-
|
| 1017 |
-
|
| 1018 |
-
|
| 1019 |
-
|
| 1020 |
-
|
| 1021 |
-
|
| 1022 |
-
|
| 1023 |
-
|
| 1024 |
-
|
| 1025 |
-
|
| 1026 |
-
|
| 1027 |
-
|
| 1028 |
-
|
| 1029 |
-
|
| 1030 |
-
|
| 1031 |
-
|
| 1032 |
-
|
| 1033 |
-
|
| 1034 |
-
|
| 1035 |
-
|
| 1036 |
-
|
| 1037 |
-
|
| 1038 |
-
|
| 1039 |
-
|
| 1040 |
-
|
| 1041 |
-
|
| 1042 |
-
|
| 1043 |
-
|
| 1044 |
-
|
| 1045 |
-
|
| 1046 |
-
|
| 1047 |
-
|
| 1048 |
-
|
| 1049 |
-
|
| 1050 |
-
|
| 1051 |
-
|
| 1052 |
-
|
| 1053 |
-
|
| 1054 |
-
|
| 1055 |
-
|
| 1056 |
-
|
| 1057 |
-
|
| 1058 |
-
|
| 1059 |
-
|
| 1060 |
-
|
| 1061 |
-
|
| 1062 |
-
|
| 1063 |
-
|
| 1064 |
-
|
| 1065 |
-
|
| 1066 |
-
|
| 1067 |
-
|
| 1068 |
-
|
| 1069 |
-
|
| 1070 |
-
|
| 1071 |
-
|
| 1072 |
-
|
| 1073 |
-
|
| 1074 |
-
|
| 1075 |
-
|
| 1076 |
-
|
| 1077 |
-
|
| 1078 |
-
|
| 1079 |
-
|
| 1080 |
-
|
| 1081 |
-
|
| 1082 |
-
|
| 1083 |
-
|
| 1084 |
-
|
| 1085 |
-
|
| 1086 |
-
|
| 1087 |
-
|
| 1088 |
-
|
| 1089 |
-
|
| 1090 |
-
|
| 1091 |
-
|
| 1092 |
-
|
| 1093 |
-
|
| 1094 |
-
|
| 1095 |
-
|
| 1096 |
-
|
| 1097 |
-
|
| 1098 |
-
|
| 1099 |
-
|
| 1100 |
-
|
| 1101 |
-
|
| 1102 |
-
|
| 1103 |
-
|
| 1104 |
-
|
| 1105 |
-
|
| 1106 |
-
|
| 1107 |
-
|
| 1108 |
-
|
| 1109 |
-
|
| 1110 |
-
|
| 1111 |
-
|
| 1112 |
-
|
| 1113 |
-
|
| 1114 |
-
|
| 1115 |
-
|
| 1116 |
-
|
| 1117 |
-
|
| 1118 |
-
|
| 1119 |
-
|
| 1120 |
-
|
| 1121 |
-
|
| 1122 |
-
|
| 1123 |
-
|
| 1124 |
-
|
| 1125 |
-
|
| 1126 |
-
|
| 1127 |
-
|
| 1128 |
-
|
| 1129 |
-
|
| 1130 |
-
|
| 1131 |
-
|
| 1132 |
-
|
| 1133 |
-
|
| 1134 |
-
|
| 1135 |
-
|
| 1136 |
-
|
| 1137 |
-
|
| 1138 |
-
|
| 1139 |
-
|
| 1140 |
-
|
| 1141 |
-
|
| 1142 |
-
|
| 1143 |
-
|
| 1144 |
-
|
| 1145 |
-
|
| 1146 |
-
|
| 1147 |
-
|
| 1148 |
-
|
| 1149 |
-
|
| 1150 |
-
|
| 1151 |
-
|
| 1152 |
-
|
| 1153 |
-
|
| 1154 |
-
|
| 1155 |
-
|
| 1156 |
-
|
| 1157 |
-
|
| 1158 |
-
|
| 1159 |
-
|
| 1160 |
-
|
| 1161 |
-
|
| 1162 |
-
|
| 1163 |
-
|
| 1164 |
-
|
| 1165 |
-
|
| 1166 |
-
|
| 1167 |
-
|
| 1168 |
-
|
| 1169 |
-
|
| 1170 |
-
|
| 1171 |
-
|
| 1172 |
-
|
| 1173 |
-
|
| 1174 |
-
|
| 1175 |
-
|
| 1176 |
-
|
| 1177 |
-
|
| 1178 |
-
|
| 1179 |
-
|
| 1180 |
-
|
| 1181 |
-
|
| 1182 |
-
|
| 1183 |
-
|
| 1184 |
-
|
| 1185 |
-
|
| 1186 |
-
|
| 1187 |
-
|
| 1188 |
-
|
| 1189 |
-
|
| 1190 |
-
|
| 1191 |
-
|
| 1192 |
-
|
| 1193 |
-
|
| 1194 |
-
|
| 1195 |
-
|
| 1196 |
-
|
| 1197 |
-
|
| 1198 |
-
|
| 1199 |
-
|
| 1200 |
-
|
| 1201 |
-
|
| 1202 |
-
|
| 1203 |
-
|
| 1204 |
-
|
| 1205 |
-
|
| 1206 |
-
|
| 1207 |
-
|
| 1208 |
-
|
| 1209 |
-
|
| 1210 |
-
|
| 1211 |
-
|
| 1212 |
-
|
| 1213 |
-
|
| 1214 |
-
|
| 1215 |
-
|
| 1216 |
-
|
| 1217 |
-
|
| 1218 |
-
|
| 1219 |
-
|
| 1220 |
-
|
| 1221 |
-
|
| 1222 |
-
|
| 1223 |
-
|
| 1224 |
-
|
| 1225 |
-
|
| 1226 |
-
|
| 1227 |
-
|
| 1228 |
-
|
| 1229 |
-
|
| 1230 |
-
|
| 1231 |
-
|
| 1232 |
-
|
| 1233 |
-
|
| 1234 |
-
|
| 1235 |
-
|
| 1236 |
-
|
| 1237 |
-
|
| 1238 |
-
|
| 1239 |
-
|
| 1240 |
-
|
| 1241 |
-
|
| 1242 |
-
|
| 1243 |
-
|
| 1244 |
-
|
| 1245 |
-
|
| 1246 |
-
|
| 1247 |
-
|
| 1248 |
-
|
| 1249 |
-
|
| 1250 |
-
|
| 1251 |
-
|
| 1252 |
-
|
| 1253 |
-
|
| 1254 |
-
|
| 1255 |
-
|
| 1256 |
-
|
| 1257 |
-
|
| 1258 |
-
|
| 1259 |
-
|
| 1260 |
-
|
| 1261 |
-
|
| 1262 |
-
|
| 1263 |
-
|
| 1264 |
-
|
| 1265 |
-
|
| 1266 |
-
|
| 1267 |
-
|
| 1268 |
-
|
| 1269 |
-
|
| 1270 |
-
|
| 1271 |
-
|
| 1272 |
-
|
| 1273 |
-
|
| 1274 |
-
|
| 1275 |
-
|
| 1276 |
-
|
| 1277 |
-
|
| 1278 |
-
|
| 1279 |
-
|
| 1280 |
-
|
| 1281 |
-
|
| 1282 |
-
|
| 1283 |
-
|
| 1284 |
-
|
| 1285 |
-
|
| 1286 |
-
|
| 1287 |
-
|
| 1288 |
-
|
| 1289 |
-
|
| 1290 |
-
|
| 1291 |
-
|
| 1292 |
-
|
| 1293 |
-
|
| 1294 |
-
|
| 1295 |
-
|
| 1296 |
-
|
| 1297 |
-
|
| 1298 |
-
|
| 1299 |
-
|
| 1300 |
-
|
| 1301 |
-
|
| 1302 |
-
|
| 1303 |
-
|
| 1304 |
-
|
| 1305 |
-
|
| 1306 |
-
|
| 1307 |
-
|
| 1308 |
-
|
| 1309 |
-
|
| 1310 |
-
|
| 1311 |
-
|
| 1312 |
-
|
| 1313 |
-
|
| 1314 |
-
|
| 1315 |
-
|
| 1316 |
-
|
| 1317 |
-
|
| 1318 |
-
|
| 1319 |
-
|
| 1320 |
-
|
| 1321 |
-
|
| 1322 |
-
|
| 1323 |
-
|
| 1324 |
-
|
| 1325 |
-
|
| 1326 |
-
|
| 1327 |
-
|
| 1328 |
-
|
| 1329 |
-
|
| 1330 |
-
|
| 1331 |
-
|
| 1332 |
-
|
| 1333 |
-
|
| 1334 |
-
|
| 1335 |
-
|
| 1336 |
-
|
| 1337 |
-
|
| 1338 |
-
|
| 1339 |
-
|
| 1340 |
-
|
| 1341 |
-
|
| 1342 |
-
|
| 1343 |
-
|
| 1344 |
-
|
| 1345 |
-
|
| 1346 |
-
|
| 1347 |
-
|
| 1348 |
-
|
| 1349 |
-
|
| 1350 |
-
|
| 1351 |
-
|
| 1352 |
-
|
| 1353 |
-
|
| 1354 |
-
|
| 1355 |
-
|
| 1356 |
-
|
| 1357 |
-
|
| 1358 |
-
|
| 1359 |
-
|
| 1360 |
-
|
| 1361 |
-
|
| 1362 |
-
|
| 1363 |
-
|
| 1364 |
-
|
| 1365 |
-
|
| 1366 |
-
|
| 1367 |
-
|
| 1368 |
-
|
| 1369 |
-
|
| 1370 |
-
|
| 1371 |
-
|
| 1372 |
-
|
| 1373 |
-
|
| 1374 |
-
|
| 1375 |
-
|
| 1376 |
-
|
| 1377 |
-
|
| 1378 |
-
|
| 1379 |
-
|
| 1380 |
-
|
| 1381 |
-
|
| 1382 |
-
|
| 1383 |
-
|
| 1384 |
-
|
| 1385 |
-
|
| 1386 |
-
|
| 1387 |
-
|
| 1388 |
-
|
| 1389 |
-
|
| 1390 |
-
|
| 1391 |
-
|
| 1392 |
-
|
| 1393 |
-
|
| 1394 |
-
|
| 1395 |
-
|
| 1396 |
-
|
| 1397 |
-
|
| 1398 |
-
|
| 1399 |
-
|
| 1400 |
-
|
| 1401 |
-
|
| 1402 |
-
|
| 1403 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1404 |
</style>
|
| 1405 |
<script>
|
| 1406 |
// --- Drag utilities ---
|
|
@@ -3879,7 +4106,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
|
|
| 3879 |
<span onclick="toggleOutput('benchmark')" style="cursor: pointer;">▼ output</span>
|
| 3880 |
<span id="uv-indicator-benchmark" style="cursor: default; opacity: 0.3;">▶ uv-logs</span>
|
| 3881 |
</span> |
|
| 3882 |
-
Cell: benchmark | 4.
|
| 3883 |
| <button class="run-btn" onclick="runCell('benchmark')">▶ run</button>
|
| 3884 |
<button class="copy-btn" onclick="copyCell('benchmark')">Copy</button>
|
| 3885 |
<a href="cells/benchmark.py" target="_blank" class="raw-btn">Raw</a>
|
|
@@ -3928,22 +4155,23 @@ Cell: benchmark | 4.19s
|
|
| 3928 |
<div class="cell-stdout"><pre class="stdout-text">Running attention benchmark on cuda with 6 workloads.
|
| 3929 |
impl wl p50(ms) ok
|
| 3930 |
sage_int8_fp16 cuda_attn_L128_bfloat16 FAIL False
|
| 3931 |
-
Error: module '
|
| 3932 |
sage_int8_fp16 cuda_attn_L256_bfloat16 FAIL False
|
| 3933 |
-
Error: module '
|
| 3934 |
sage_int8_fp16 cuda_attn_L320_bfloat16 FAIL False
|
| 3935 |
-
Error: module '
|
| 3936 |
sage_int8_fp16 cuda_attn_L384_bfloat16 FAIL False
|
| 3937 |
-
Error: module '
|
| 3938 |
sage_int8_fp16 cuda_attn_L448_bfloat16 FAIL False
|
| 3939 |
-
Error: module '
|
| 3940 |
sage_int8_fp16 cuda_attn_L512_bfloat16 FAIL False
|
| 3941 |
-
Error: module '
|
| 3942 |
</pre></div>
|
| 3943 |
<div class="cell-stderr">
|
| 3944 |
Fetching 11 files: 0%| | 0/11 [00:00<?, ?it/s]
|
| 3945 |
-
Fetching 11 files:
|
| 3946 |
-
Fetching 11 files:
|
|
|
|
| 3947 |
</div>
|
| 3948 |
<div class="cell-artifacts">
|
| 3949 |
<h4>Artifacts:</h4>
|
|
|
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
<title>sage_attention</title>
|
| 7 |
+
|
| 8 |
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 9 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
|
| 11 |
+
|
| 12 |
<script>
|
| 13 |
// Iframe-friendly navigation router
|
| 14 |
(function() {
|
|
|
|
| 92 |
</script>
|
| 93 |
<style>
|
| 94 |
:root[data-theme="light"] {
|
| 95 |
+
--bg-primary: #ffffff;
|
| 96 |
+
--bg-secondary: #f6f8fa;
|
| 97 |
+
--bg-tertiary: #f8f9fa;
|
| 98 |
+
--bg-code: #f8f9fa;
|
| 99 |
+
--bg-error: #fdf2f2;
|
| 100 |
+
--bg-artifact: #e6f3ff;
|
| 101 |
+
--bg-artifact-hover: #d0e7ff;
|
| 102 |
+
|
| 103 |
+
--text-primary: #333;
|
| 104 |
+
--text-secondary: #656d76;
|
| 105 |
+
--text-error: #c53030;
|
| 106 |
+
--text-link: #0969da;
|
| 107 |
+
|
| 108 |
+
--border-primary: #e1e5e9;
|
| 109 |
+
--border-error: #e53e3e;
|
| 110 |
+
--border-cell-failed: #d73a49;
|
| 111 |
+
|
| 112 |
+
--shadow: rgba(0, 0, 0, 0.1);
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
:root[data-theme="dark"] {
|
| 116 |
+
--bg-primary: #0a0a0a;
|
| 117 |
+
--bg-secondary: #121212;
|
| 118 |
+
--bg-tertiary: #181818;
|
| 119 |
+
--bg-code: #0d0d0d;
|
| 120 |
+
--bg-error: #1a0f0f;
|
| 121 |
+
--bg-artifact: #151515;
|
| 122 |
+
--bg-artifact-hover: #1a1a1a;
|
| 123 |
+
|
| 124 |
+
--text-primary: #e0e0e0;
|
| 125 |
+
--text-secondary: #888888;
|
| 126 |
+
--text-error: #ff6b6b;
|
| 127 |
+
--text-link: #64b5f6;
|
| 128 |
+
|
| 129 |
+
--border-primary: #2a2a2a;
|
| 130 |
+
--border-error: #ff6b6b;
|
| 131 |
+
--border-cell-failed: #ff6b6b;
|
| 132 |
+
|
| 133 |
+
--shadow: rgba(255, 255, 255, 0.05);
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
/* Monocolor UI theme: black/white background, all text/borders single blue */
|
| 137 |
+
:root[data-ui="monocolor"] {
|
| 138 |
+
--mono-color: #0a66ff;
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
:root[data-ui="monocolor"][data-theme="light"] {
|
| 142 |
+
--bg-primary: #ffffff;
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
:root[data-ui="monocolor"][data-theme="dark"] {
|
| 146 |
+
--bg-primary: #000000;
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
:root[data-ui="monocolor"] {
|
| 150 |
+
--bg-secondary: var(--bg-primary);
|
| 151 |
+
--bg-tertiary: var(--bg-primary);
|
| 152 |
+
--bg-code: var(--bg-primary);
|
| 153 |
+
--bg-error: var(--bg-primary);
|
| 154 |
+
--bg-artifact: var(--bg-primary);
|
| 155 |
+
--bg-artifact-hover: var(--bg-primary);
|
| 156 |
+
|
| 157 |
+
--text-primary: var(--mono-color);
|
| 158 |
+
--text-secondary: var(--mono-color);
|
| 159 |
+
--text-error: var(--mono-color);
|
| 160 |
+
--text-link: var(--mono-color);
|
| 161 |
+
|
| 162 |
+
--border-primary: var(--mono-color);
|
| 163 |
+
--border-error: var(--mono-color);
|
| 164 |
+
--border-cell-failed: var(--mono-color);
|
| 165 |
+
|
| 166 |
+
--shadow: none;
|
| 167 |
+
}
|
| 168 |
+
|
| 169 |
+
:root[data-ui="monocolor"] a {
|
| 170 |
+
color: var(--mono-color);
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
:root[data-ui="monocolor"] .menu-button,
|
| 174 |
+
:root[data-ui="monocolor"] .theme-toggle,
|
| 175 |
+
:root[data-ui="monocolor"] .reset-toggle,
|
| 176 |
+
:root[data-ui="monocolor"] .back-button {
|
| 177 |
+
background: var(--bg-primary);
|
| 178 |
+
color: var(--mono-color);
|
| 179 |
+
border-color: var(--mono-color);
|
| 180 |
+
}
|
| 181 |
+
|
| 182 |
+
:root[data-ui="monocolor"] .menu-button:hover,
|
| 183 |
+
:root[data-ui="monocolor"] .theme-toggle:hover,
|
| 184 |
+
:root[data-ui="monocolor"] .reset-toggle:hover,
|
| 185 |
+
:root[data-ui="monocolor"] .back-button:hover {
|
| 186 |
+
background: var(--bg-primary);
|
| 187 |
+
color: var(--mono-color);
|
| 188 |
+
border-color: var(--mono-color);
|
| 189 |
+
}
|
| 190 |
+
|
| 191 |
+
:root[data-ui="monocolor"] .menu-dropdown {
|
| 192 |
+
background: var(--bg-primary);
|
| 193 |
+
border-color: var(--mono-color);
|
| 194 |
+
box-shadow: none;
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
:root[data-ui="monocolor"] .menu-item {
|
| 198 |
+
color: var(--mono-color);
|
| 199 |
+
border-bottom-color: var(--mono-color);
|
| 200 |
+
}
|
| 201 |
+
|
| 202 |
+
:root[data-ui="monocolor"] .system-info {
|
| 203 |
+
background: var(--bg-primary);
|
| 204 |
+
border-color: var(--mono-color);
|
| 205 |
+
}
|
| 206 |
+
|
| 207 |
+
:root[data-ui="monocolor"] .cell {
|
| 208 |
+
border-color: var(--mono-color);
|
| 209 |
+
background: var(--bg-primary);
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
:root[data-ui="monocolor"] .cell-header {
|
| 213 |
+
background: var(--bg-primary);
|
| 214 |
+
border-bottom-color: var(--mono-color);
|
| 215 |
+
}
|
| 216 |
+
|
| 217 |
+
:root[data-ui="monocolor"] .artifact {
|
| 218 |
+
background: var(--bg-primary);
|
| 219 |
+
border-color: var(--mono-color);
|
| 220 |
+
color: var(--mono-color);
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
:root[data-ui="monocolor"] .artifact:hover {
|
| 224 |
+
background: var(--bg-primary);
|
| 225 |
+
}
|
| 226 |
+
|
| 227 |
+
:root[data-ui="monocolor"] .artifact-preview img,
|
| 228 |
+
:root[data-ui="monocolor"] .artifact-preview svg {
|
| 229 |
+
border-color: var(--mono-color);
|
| 230 |
+
}
|
| 231 |
+
|
| 232 |
+
:root[data-ui="monocolor"] .status-widget {
|
| 233 |
+
background: var(--bg-primary);
|
| 234 |
+
border-color: var(--mono-color);
|
| 235 |
+
color: var(--mono-color);
|
| 236 |
+
}
|
| 237 |
+
|
| 238 |
+
:root[data-ui="monocolor"] .minimap,
|
| 239 |
+
:root[data-ui="monocolor"] .file-explorer,
|
| 240 |
+
:root[data-ui="monocolor"] .tools-widget {
|
| 241 |
+
background: var(--bg-primary);
|
| 242 |
+
border-color: var(--mono-color);
|
| 243 |
+
color: var(--mono-color);
|
| 244 |
+
}
|
| 245 |
+
|
| 246 |
+
:root[data-ui="monocolor"] .cell-code {
|
| 247 |
+
background: var(--bg-primary);
|
| 248 |
+
border-bottom-color: var(--mono-color);
|
| 249 |
+
}
|
| 250 |
+
|
| 251 |
+
:root[data-ui="monocolor"] .tools-title,
|
| 252 |
+
:root[data-ui="monocolor"] .file-explorer-section-title,
|
| 253 |
+
:root[data-ui="monocolor"] .minimap-title {
|
| 254 |
+
color: var(--mono-color);
|
| 255 |
+
border-bottom-color: var(--mono-color);
|
| 256 |
+
}
|
| 257 |
+
|
| 258 |
+
:root[data-ui="monocolor"] .tool-button {
|
| 259 |
+
background: var(--bg-primary);
|
| 260 |
+
border-color: var(--mono-color);
|
| 261 |
+
color: var(--mono-color);
|
| 262 |
+
}
|
| 263 |
+
|
| 264 |
+
:root[data-ui="monocolor"] .tool-button.active {
|
| 265 |
+
border-color: var(--mono-color);
|
| 266 |
+
}
|
| 267 |
+
|
| 268 |
+
:root[data-ui="monocolor"] .file-explorer-item,
|
| 269 |
+
:root[data-ui="monocolor"] .minimap-item {
|
| 270 |
+
color: var(--mono-color);
|
| 271 |
+
}
|
| 272 |
+
|
| 273 |
+
/* Force Pygments code to mono blue on mono bg */
|
| 274 |
+
:root[data-ui="monocolor"] .highlight {
|
| 275 |
+
background: var(--bg-primary) !important;
|
| 276 |
+
color: var(--mono-color) !important;
|
| 277 |
+
}
|
| 278 |
+
|
| 279 |
+
:root[data-ui="monocolor"] .highlight *,
|
| 280 |
+
:root[data-ui="monocolor"] .highlight .hll {
|
| 281 |
+
color: var(--mono-color) !important;
|
| 282 |
+
background: transparent !important;
|
| 283 |
+
border-color: var(--mono-color) !important;
|
| 284 |
+
}
|
| 285 |
+
|
| 286 |
+
/* Default code font + metrics (overridable via frontmatter) */
|
| 287 |
+
:root {
|
| 288 |
+
--code-font-size: 0.95rem;
|
| 289 |
+
--code-line-height: 1.5;
|
| 290 |
+
--code-pad-y: 0.75rem;
|
| 291 |
+
}
|
| 292 |
+
|
| 293 |
+
/* Minimal UI theme overrides base variables for a flatter, 90s look */
|
| 294 |
+
:root[data-ui="none"] {
|
| 295 |
+
--bg-primary: #ffffff;
|
| 296 |
+
--bg-secondary: transparent;
|
| 297 |
+
--bg-tertiary: transparent;
|
| 298 |
+
--bg-code: #f9f9f9;
|
| 299 |
+
--bg-error: #fff0f0;
|
| 300 |
+
--bg-artifact: #f0f7ff;
|
| 301 |
+
--bg-artifact-hover: #e5f1ff;
|
| 302 |
+
|
| 303 |
+
--text-primary: #000000;
|
| 304 |
+
--text-secondary: #222222;
|
| 305 |
+
--text-error: #a00000;
|
| 306 |
+
--text-link: #0000ee;
|
| 307 |
+
|
| 308 |
+
--border-primary: #cccccc;
|
| 309 |
+
--border-error: #cc0000;
|
| 310 |
+
--border-cell-failed: #cc0000;
|
| 311 |
+
|
| 312 |
+
--shadow: none;
|
| 313 |
+
}
|
| 314 |
+
|
| 315 |
+
html {
|
| 316 |
+
overscroll-behavior: none;
|
| 317 |
+
}
|
| 318 |
+
|
| 319 |
+
body {
|
| 320 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace;
|
| 321 |
+
line-height: 1.4;
|
| 322 |
+
max-width: 1000px;
|
| 323 |
+
margin: 0 auto;
|
| 324 |
+
padding: 15px;
|
| 325 |
+
color: var(--text-primary);
|
| 326 |
+
background: var(--bg-primary);
|
| 327 |
+
transition: background-color 0.2s ease, color 0.2s ease;
|
| 328 |
+
overscroll-behavior: none;
|
| 329 |
+
}
|
| 330 |
+
|
| 331 |
+
/* Minimal "none" UI theme overrides */
|
| 332 |
+
:root[data-ui="none"] body {
|
| 333 |
+
font-family: 'Times New Roman', Times, serif;
|
| 334 |
+
line-height: 1.5;
|
| 335 |
+
max-width: 860px;
|
| 336 |
+
padding: 12px;
|
| 337 |
+
background: #ffffff;
|
| 338 |
+
color: #000000;
|
| 339 |
+
transition: none;
|
| 340 |
+
}
|
| 341 |
+
|
| 342 |
+
/* Two panel layout removed */
|
| 343 |
+
|
| 344 |
+
.controls {
|
| 345 |
+
position: fixed;
|
| 346 |
+
top: 20px;
|
| 347 |
+
right: 20px;
|
| 348 |
+
display: flex;
|
| 349 |
+
flex-direction: column;
|
| 350 |
+
align-items: flex-end;
|
| 351 |
+
gap: 0.25rem;
|
| 352 |
+
z-index: 1000;
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
.controls-buttons {
|
| 356 |
+
display: flex;
|
| 357 |
+
gap: 0.5rem;
|
| 358 |
+
}
|
| 359 |
+
|
| 360 |
+
.menu-button {
|
| 361 |
+
position: relative;
|
| 362 |
+
background: var(--bg-secondary);
|
| 363 |
+
border: 1px solid var(--border-primary);
|
| 364 |
+
padding: 8px 12px;
|
| 365 |
+
border-radius: 2px;
|
| 366 |
+
color: var(--text-secondary);
|
| 367 |
+
cursor: pointer;
|
| 368 |
+
font-family: inherit;
|
| 369 |
+
font-size: 0.9rem;
|
| 370 |
+
user-select: none;
|
| 371 |
+
}
|
| 372 |
+
|
| 373 |
+
/* Keep default control styling when widgets are enabled, even in minimal UI */
|
| 374 |
+
:root[data-ui="none"][data-widgets="on"] .menu-button,
|
| 375 |
+
:root[data-ui="none"][data-widgets="on"] .theme-toggle,
|
| 376 |
+
:root[data-ui="none"][data-widgets="on"] .reset-toggle,
|
| 377 |
+
:root[data-ui="none"][data-widgets="on"] .back-button {
|
| 378 |
+
background: #f6f6f6;
|
| 379 |
+
border: 1px solid #cccccc;
|
| 380 |
+
color: #222222;
|
| 381 |
+
}
|
| 382 |
+
|
| 383 |
+
.menu-button:hover {
|
| 384 |
+
color: var(--text-primary);
|
| 385 |
+
background: var(--bg-tertiary);
|
| 386 |
+
}
|
| 387 |
+
|
| 388 |
+
/* Controls state indicator (top-right) */
|
| 389 |
+
/* Status widget (bottom-right) */
|
| 390 |
+
.status-widget {
|
| 391 |
+
position: fixed;
|
| 392 |
+
right: 20px;
|
| 393 |
+
bottom: 20px;
|
| 394 |
+
width: auto;
|
| 395 |
+
max-width: 260px;
|
| 396 |
+
background: var(--bg-secondary);
|
| 397 |
+
border: 1px solid var(--border-primary);
|
| 398 |
+
border-radius: 2px;
|
| 399 |
+
padding: 6px 8px;
|
| 400 |
+
font-size: 0.8rem;
|
| 401 |
+
color: var(--text-secondary);
|
| 402 |
+
z-index: 100;
|
| 403 |
+
}
|
| 404 |
+
|
| 405 |
+
.status-widget strong {
|
| 406 |
+
color: var(--text-primary);
|
| 407 |
+
}
|
| 408 |
+
|
| 409 |
+
:root[data-ui="none"][data-widgets="on"] .status-widget {
|
| 410 |
+
background: #f6f6f6;
|
| 411 |
+
border-color: #ccc;
|
| 412 |
+
color: #222;
|
| 413 |
+
}
|
| 414 |
+
|
| 415 |
+
:root[data-ui="none"][data-widgets="on"] .menu-button:hover,
|
| 416 |
+
:root[data-ui="none"][data-widgets="on"] .theme-toggle:hover,
|
| 417 |
+
:root[data-ui="none"][data-widgets="on"] .reset-toggle:hover,
|
| 418 |
+
:root[data-ui="none"][data-widgets="on"] .back-button:hover {
|
| 419 |
+
background: #ededed;
|
| 420 |
+
border-color: #bbbbbb;
|
| 421 |
+
color: #000000;
|
| 422 |
+
}
|
| 423 |
+
|
| 424 |
+
.menu-dropdown {
|
| 425 |
+
position: absolute;
|
| 426 |
+
top: 100%;
|
| 427 |
+
right: 0;
|
| 428 |
+
background: var(--bg-secondary);
|
| 429 |
+
border: 1px solid var(--border-primary);
|
| 430 |
+
border-radius: 4px;
|
| 431 |
+
box-shadow: 0 4px 12px var(--shadow);
|
| 432 |
+
min-width: 160px;
|
| 433 |
+
opacity: 0;
|
| 434 |
+
visibility: hidden;
|
| 435 |
+
transform: translateY(-8px);
|
| 436 |
+
transition: all 0.2s ease;
|
| 437 |
+
z-index: 1001;
|
| 438 |
+
margin-top: 4px;
|
| 439 |
+
}
|
| 440 |
+
|
| 441 |
+
:root[data-ui="none"][data-widgets="on"] .menu-dropdown {
|
| 442 |
+
background: #ffffff;
|
| 443 |
+
border: 1px solid #cccccc;
|
| 444 |
+
box-shadow: none;
|
| 445 |
+
}
|
| 446 |
+
|
| 447 |
+
.menu-button.active .menu-dropdown {
|
| 448 |
+
opacity: 1;
|
| 449 |
+
visibility: visible;
|
| 450 |
+
transform: translateY(0);
|
| 451 |
+
}
|
| 452 |
+
|
| 453 |
+
.menu-item {
|
| 454 |
+
display: block;
|
| 455 |
+
padding: 8px 12px;
|
| 456 |
+
color: var(--text-secondary);
|
| 457 |
+
text-decoration: none;
|
| 458 |
+
font-size: 0.85rem;
|
| 459 |
+
border-bottom: 1px solid var(--border-primary);
|
| 460 |
+
cursor: pointer;
|
| 461 |
+
}
|
| 462 |
+
|
| 463 |
+
:root[data-ui="none"] .menu-item {
|
| 464 |
+
color: #000;
|
| 465 |
+
border-bottom: 1px solid #eee;
|
| 466 |
+
}
|
| 467 |
+
|
| 468 |
+
.menu-item:last-child {
|
| 469 |
+
border-bottom: none;
|
| 470 |
+
}
|
| 471 |
+
|
| 472 |
+
.menu-item:hover {
|
| 473 |
+
background: var(--bg-tertiary);
|
| 474 |
+
color: var(--text-primary);
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
+
.menu-checkbox {
|
| 478 |
+
display: inline-block;
|
| 479 |
+
width: 16px;
|
| 480 |
+
font-family: monospace;
|
| 481 |
+
color: var(--text-link);
|
| 482 |
+
}
|
| 483 |
+
|
| 484 |
+
.theme-toggle,
|
| 485 |
+
.reset-toggle,
|
| 486 |
+
.back-button {
|
| 487 |
+
background: var(--bg-secondary);
|
| 488 |
+
border: 1px solid var(--border-primary);
|
| 489 |
+
padding: 8px 12px;
|
| 490 |
+
border-radius: 4px;
|
| 491 |
+
color: var(--text-secondary);
|
| 492 |
+
cursor: pointer;
|
| 493 |
+
font-family: inherit;
|
| 494 |
+
font-size: 0.9rem;
|
| 495 |
+
user-select: none;
|
| 496 |
+
}
|
| 497 |
+
|
| 498 |
+
.back-button {
|
| 499 |
+
text-decoration: none;
|
| 500 |
+
display: inline-block;
|
| 501 |
+
}
|
| 502 |
+
|
| 503 |
+
.theme-toggle:hover,
|
| 504 |
+
.reset-toggle:hover,
|
| 505 |
+
.back-button:hover {
|
| 506 |
+
color: var(--text-primary);
|
| 507 |
+
background: var(--bg-tertiary);
|
| 508 |
+
}
|
| 509 |
+
|
| 510 |
+
.system-info {
|
| 511 |
+
background: var(--bg-secondary);
|
| 512 |
+
border: 1px solid var(--border-primary);
|
| 513 |
+
border-radius: 4px;
|
| 514 |
+
padding: 8px 12px;
|
| 515 |
+
margin-bottom: 16px;
|
| 516 |
+
font-size: 0.85em;
|
| 517 |
+
color: var(--text-secondary);
|
| 518 |
+
}
|
| 519 |
+
|
| 520 |
+
.system-info-header {
|
| 521 |
+
font-weight: 600;
|
| 522 |
+
color: var(--text-primary);
|
| 523 |
+
margin-bottom: 2px;
|
| 524 |
+
}
|
| 525 |
+
|
| 526 |
+
.system-info-content {
|
| 527 |
+
font-family: monospace;
|
| 528 |
+
}
|
| 529 |
+
|
| 530 |
+
.theme-toggle,
|
| 531 |
+
.reset-toggle {
|
| 532 |
+
background: var(--bg-secondary);
|
| 533 |
+
border: 1px solid var(--border-primary);
|
| 534 |
+
border-radius: 2px;
|
| 535 |
+
/* padding: 0.4rem 0.6rem; */
|
| 536 |
+
cursor: pointer;
|
| 537 |
+
font-family: inherit;
|
| 538 |
+
font-size: 0.8rem;
|
| 539 |
+
color: var(--text-secondary);
|
| 540 |
+
user-select: none;
|
| 541 |
+
transition: all 0.2s ease;
|
| 542 |
+
text-transform: lowercase;
|
| 543 |
+
letter-spacing: 0;
|
| 544 |
+
}
|
| 545 |
+
|
| 546 |
+
.theme-toggle:hover,
|
| 547 |
+
.reset-toggle:hover {
|
| 548 |
+
background: var(--bg-tertiary);
|
| 549 |
+
border-color: var(--text-secondary);
|
| 550 |
+
color: var(--text-primary);
|
| 551 |
+
}
|
| 552 |
+
|
| 553 |
+
.minimap {
|
| 554 |
+
position: fixed;
|
| 555 |
+
bottom: 20px;
|
| 556 |
+
right: 20px;
|
| 557 |
+
width: 220px;
|
| 558 |
+
max-height: 400px;
|
| 559 |
+
background: var(--bg-secondary);
|
| 560 |
+
border: 1px solid var(--border-primary);
|
| 561 |
+
border-radius: 2px;
|
| 562 |
+
padding: 0.5rem;
|
| 563 |
+
font-size: 0.7rem;
|
| 564 |
+
overflow-y: auto;
|
| 565 |
+
z-index: 100;
|
| 566 |
+
opacity: 0.9;
|
| 567 |
+
transition: opacity 0.2s ease;
|
| 568 |
+
}
|
| 569 |
+
|
| 570 |
+
/* Hide widgets and controls when disabled via frontmatter */
|
| 571 |
+
:root[data-widgets="off"] .controls,
|
| 572 |
+
:root[data-widgets="off"] .minimap,
|
| 573 |
+
:root[data-widgets="off"] .file-explorer,
|
| 574 |
+
:root[data-widgets="off"] .tools-widget,
|
| 575 |
+
:root[data-widgets="off"] .status-widget {
|
| 576 |
+
display: none !important;
|
| 577 |
+
}
|
| 578 |
+
|
| 579 |
+
.file-explorer {
|
| 580 |
+
position: fixed;
|
| 581 |
+
bottom: 20px;
|
| 582 |
+
/* default; JS will stack */
|
| 583 |
+
right: 20px;
|
| 584 |
+
left: auto;
|
| 585 |
+
top: auto;
|
| 586 |
+
width: 220px;
|
| 587 |
+
max-height: 400px;
|
| 588 |
+
background: var(--bg-secondary);
|
| 589 |
+
border: 1px solid var(--border-primary);
|
| 590 |
+
border-radius: 2px;
|
| 591 |
+
padding: 0.5rem;
|
| 592 |
+
font-size: 0.7rem;
|
| 593 |
+
overflow-y: auto;
|
| 594 |
+
z-index: 100;
|
| 595 |
+
opacity: 0.9;
|
| 596 |
+
transition: opacity 0.2s ease;
|
| 597 |
+
}
|
| 598 |
+
|
| 599 |
+
/* Drawing overlay */
|
| 600 |
+
.draw-overlay {
|
| 601 |
+
position: fixed;
|
| 602 |
+
top: 0;
|
| 603 |
+
left: 0;
|
| 604 |
+
width: 100vw;
|
| 605 |
+
height: 100vh;
|
| 606 |
+
z-index: 80;
|
| 607 |
+
/* under widgets (100) and controls (1000) */
|
| 608 |
+
display: block;
|
| 609 |
+
pointer-events: none;
|
| 610 |
+
/* enabled only when a tool is active */
|
| 611 |
+
}
|
| 612 |
+
|
| 613 |
+
/* Tools widget */
|
| 614 |
+
.tools-widget {
|
| 615 |
+
position: fixed;
|
| 616 |
+
bottom: 20px;
|
| 617 |
+
/* default; JS will stack */
|
| 618 |
+
right: 20px;
|
| 619 |
+
left: auto;
|
| 620 |
+
top: auto;
|
| 621 |
+
width: 220px;
|
| 622 |
+
background: var(--bg-secondary);
|
| 623 |
+
border: 1px solid var(--border-primary);
|
| 624 |
+
border-radius: 2px;
|
| 625 |
+
padding: 0.5rem;
|
| 626 |
+
font-size: 0.7rem;
|
| 627 |
+
z-index: 100;
|
| 628 |
+
opacity: 0.95;
|
| 629 |
+
}
|
| 630 |
+
|
| 631 |
+
.tools-title {
|
| 632 |
+
font-weight: bold;
|
| 633 |
+
color: var(--text-secondary);
|
| 634 |
+
margin-bottom: 0.5rem;
|
| 635 |
+
padding-bottom: 0.25rem;
|
| 636 |
+
border-bottom: 1px solid var(--border-primary);
|
| 637 |
+
cursor: grab;
|
| 638 |
+
user-select: none;
|
| 639 |
+
}
|
| 640 |
+
|
| 641 |
+
.tools-row {
|
| 642 |
+
display: flex;
|
| 643 |
+
gap: 0.4rem;
|
| 644 |
+
flex-wrap: wrap;
|
| 645 |
+
}
|
| 646 |
+
|
| 647 |
+
.tool-button {
|
| 648 |
+
background: var(--bg-tertiary);
|
| 649 |
+
border: 1px solid var(--border-primary);
|
| 650 |
+
border-radius: 2px;
|
| 651 |
+
padding: 0.25rem 0.4rem;
|
| 652 |
+
cursor: pointer;
|
| 653 |
+
color: var(--text-secondary);
|
| 654 |
+
font-family: inherit;
|
| 655 |
+
font-size: 0.75rem;
|
| 656 |
+
user-select: none;
|
| 657 |
+
}
|
| 658 |
+
|
| 659 |
+
.tool-button:hover {
|
| 660 |
+
color: var(--text-primary);
|
| 661 |
+
}
|
| 662 |
+
|
| 663 |
+
.tool-button.active {
|
| 664 |
+
color: var(--text-primary);
|
| 665 |
+
border-color: var(--text-secondary);
|
| 666 |
+
background: var(--bg-secondary);
|
| 667 |
+
}
|
| 668 |
+
|
| 669 |
+
.minimap:hover,
|
| 670 |
+
.file-explorer:hover {
|
| 671 |
+
opacity: 1;
|
| 672 |
+
}
|
| 673 |
+
|
| 674 |
+
.minimap-title {
|
| 675 |
+
font-weight: bold;
|
| 676 |
+
color: var(--text-secondary);
|
| 677 |
+
margin-bottom: 0.5rem;
|
| 678 |
+
padding-bottom: 0.25rem;
|
| 679 |
+
border-bottom: 1px solid var(--border-primary);
|
| 680 |
+
cursor: grab;
|
| 681 |
+
/* drag handle */
|
| 682 |
+
user-select: none;
|
| 683 |
+
}
|
| 684 |
+
|
| 685 |
+
.minimap-item {
|
| 686 |
+
display: block;
|
| 687 |
+
color: var(--text-secondary);
|
| 688 |
+
text-decoration: none;
|
| 689 |
+
padding: 0.15rem 0;
|
| 690 |
+
border-left: 2px solid transparent;
|
| 691 |
+
padding-left: 0.5rem;
|
| 692 |
+
transition: all 0.2s ease;
|
| 693 |
+
cursor: pointer;
|
| 694 |
+
}
|
| 695 |
+
|
| 696 |
+
.minimap-item:hover {
|
| 697 |
+
color: var(--text-primary);
|
| 698 |
+
border-left-color: var(--text-secondary);
|
| 699 |
+
}
|
| 700 |
+
|
| 701 |
+
.minimap-item.active {
|
| 702 |
+
color: var(--text-primary);
|
| 703 |
+
border-left-color: var(--text-link);
|
| 704 |
+
}
|
| 705 |
+
|
| 706 |
+
.minimap-heading {
|
| 707 |
+
font-weight: normal;
|
| 708 |
+
}
|
| 709 |
+
|
| 710 |
+
.minimap-heading.h1 {
|
| 711 |
+
padding-left: 0.5rem;
|
| 712 |
+
}
|
| 713 |
+
|
| 714 |
+
.minimap-heading.h2 {
|
| 715 |
+
padding-left: 1rem;
|
| 716 |
+
}
|
| 717 |
+
|
| 718 |
+
.minimap-heading.h3 {
|
| 719 |
+
padding-left: 1.5rem;
|
| 720 |
+
}
|
| 721 |
+
|
| 722 |
+
.minimap-heading.h4 {
|
| 723 |
+
padding-left: 2rem;
|
| 724 |
+
}
|
| 725 |
+
|
| 726 |
+
.minimap-heading.h5 {
|
| 727 |
+
padding-left: 2.5rem;
|
| 728 |
+
}
|
| 729 |
+
|
| 730 |
+
.minimap-heading.h6 {
|
| 731 |
+
padding-left: 3rem;
|
| 732 |
+
}
|
| 733 |
+
|
| 734 |
+
.minimap-cell {
|
| 735 |
+
color: var(--text-link);
|
| 736 |
+
opacity: 0.8;
|
| 737 |
+
font-style: italic;
|
| 738 |
+
}
|
| 739 |
+
|
| 740 |
+
.minimap-cell:hover {
|
| 741 |
+
opacity: 1;
|
| 742 |
+
}
|
| 743 |
+
|
| 744 |
+
.file-explorer-title {
|
| 745 |
+
font-weight: bold;
|
| 746 |
+
color: var(--text-secondary);
|
| 747 |
+
margin-bottom: 0.5rem;
|
| 748 |
+
padding-bottom: 0.25rem;
|
| 749 |
+
border-bottom: 1px solid var(--border-primary);
|
| 750 |
+
cursor: grab;
|
| 751 |
+
/* drag handle */
|
| 752 |
+
user-select: none;
|
| 753 |
+
}
|
| 754 |
+
|
| 755 |
+
.file-explorer-section {
|
| 756 |
+
margin-bottom: 0.75rem;
|
| 757 |
+
}
|
| 758 |
+
|
| 759 |
+
.file-explorer-section-title {
|
| 760 |
+
font-weight: bold;
|
| 761 |
+
color: var(--text-secondary);
|
| 762 |
+
font-size: 0.65rem;
|
| 763 |
+
margin-bottom: 0.25rem;
|
| 764 |
+
text-transform: uppercase;
|
| 765 |
+
letter-spacing: 0.5px;
|
| 766 |
+
}
|
| 767 |
+
|
| 768 |
+
.file-explorer-item {
|
| 769 |
+
display: block;
|
| 770 |
+
color: var(--text-secondary);
|
| 771 |
+
text-decoration: none;
|
| 772 |
+
padding: 0.1rem 0;
|
| 773 |
+
margin-left: 0.5rem;
|
| 774 |
+
transition: color 0.2s ease;
|
| 775 |
+
cursor: pointer;
|
| 776 |
+
font-family: monospace;
|
| 777 |
+
}
|
| 778 |
+
|
| 779 |
+
.file-explorer-item:hover {
|
| 780 |
+
color: var(--text-primary);
|
| 781 |
+
}
|
| 782 |
+
|
| 783 |
+
.file-explorer-item.script {
|
| 784 |
+
color: var(--text-link);
|
| 785 |
+
}
|
| 786 |
+
|
| 787 |
+
.file-explorer-item.artifact {
|
| 788 |
+
color: var(--text-secondary);
|
| 789 |
+
opacity: 0.8;
|
| 790 |
+
}
|
| 791 |
+
|
| 792 |
+
|
| 793 |
+
/* Hide widgets on smaller screens */
|
| 794 |
+
@media (max-width: 768px) {
|
| 795 |
+
|
| 796 |
+
.minimap,
|
| 797 |
+
.file-explorer,
|
| 798 |
+
.tools-widget {
|
| 799 |
+
display: none;
|
| 800 |
+
}
|
| 801 |
+
}
|
| 802 |
+
|
| 803 |
+
.cell {
|
| 804 |
+
margin: 1rem 0;
|
| 805 |
+
border: 1px solid var(--border-primary);
|
| 806 |
+
border-radius: 2px;
|
| 807 |
+
overflow: hidden;
|
| 808 |
+
background: var(--bg-secondary);
|
| 809 |
+
}
|
| 810 |
+
|
| 811 |
+
:root[data-ui="none"] .cell {
|
| 812 |
+
margin: 1em 0;
|
| 813 |
+
border: none;
|
| 814 |
+
background: transparent;
|
| 815 |
+
}
|
| 816 |
+
|
| 817 |
+
.cell-header {
|
| 818 |
+
background: var(--bg-secondary);
|
| 819 |
+
padding: 0.5rem 1rem;
|
| 820 |
+
border-bottom: 1px solid var(--border-primary);
|
| 821 |
+
font-family: inherit;
|
| 822 |
+
font-size: 0.85rem;
|
| 823 |
+
}
|
| 824 |
+
|
| 825 |
+
:root[data-ui="none"] .cell-header {
|
| 826 |
+
background: transparent;
|
| 827 |
+
border: none;
|
| 828 |
+
padding: 0;
|
| 829 |
+
font-weight: bold;
|
| 830 |
+
}
|
| 831 |
+
|
| 832 |
+
:root[data-ui="none"] .cell-content {
|
| 833 |
+
padding: 0;
|
| 834 |
+
}
|
| 835 |
+
|
| 836 |
+
:root[data-ui="none"] .copy-button,
|
| 837 |
+
:root[data-ui="none"] .collapse-indicators,
|
| 838 |
+
:root[data-ui="none"] .cell-meta,
|
| 839 |
+
:root[data-ui="none"] .cell-outputs-header {
|
| 840 |
+
display: none !important;
|
| 841 |
+
}
|
| 842 |
+
|
| 843 |
+
:root[data-ui="none"] pre,
|
| 844 |
+
:root[data-ui="none"] code {
|
| 845 |
+
font-family: Menlo, Monaco, 'Courier New', monospace;
|
| 846 |
+
}
|
| 847 |
+
|
| 848 |
+
:root[data-ui="none"] .code-content pre {
|
| 849 |
+
background: #f9f9f9;
|
| 850 |
+
border: 1px solid #ddd;
|
| 851 |
+
padding: 8px;
|
| 852 |
+
}
|
| 853 |
+
|
| 854 |
+
:root[data-ui="none"] .output {
|
| 855 |
+
background: transparent;
|
| 856 |
+
border: none;
|
| 857 |
+
padding: 0.25em 0;
|
| 858 |
+
}
|
| 859 |
+
|
| 860 |
+
color: var(--text-secondary);
|
| 861 |
+
cursor: pointer;
|
| 862 |
+
user-select: none;
|
| 863 |
+
transition: background-color 0.2s ease;
|
| 864 |
+
}
|
| 865 |
+
|
| 866 |
+
.cell-header:hover {
|
| 867 |
+
background: var(--bg-tertiary);
|
| 868 |
+
}
|
| 869 |
+
|
| 870 |
+
.collapse-indicators {
|
| 871 |
+
color: var(--text-secondary);
|
| 872 |
+
font-size: 0.8rem;
|
| 873 |
+
opacity: 0.7;
|
| 874 |
+
}
|
| 875 |
+
|
| 876 |
+
.collapse-indicators span:hover {
|
| 877 |
+
color: var(--text-primary);
|
| 878 |
+
opacity: 1;
|
| 879 |
+
}
|
| 880 |
+
|
| 881 |
+
.cell-code {
|
| 882 |
+
display: block;
|
| 883 |
+
background: var(--bg-code);
|
| 884 |
+
}
|
| 885 |
+
|
| 886 |
+
.cell-code.collapsed {
|
| 887 |
+
display: none;
|
| 888 |
+
}
|
| 889 |
+
|
| 890 |
+
.cell-code pre {
|
| 891 |
+
margin: 0;
|
| 892 |
+
padding: 0.75rem;
|
| 893 |
+
background: var(--bg-code);
|
| 894 |
+
overflow-x: auto;
|
| 895 |
+
color: var(--text-primary);
|
| 896 |
+
}
|
| 897 |
+
|
| 898 |
+
.cell-output {
|
| 899 |
+
padding: 0.75rem;
|
| 900 |
+
/* background: var(--bg-primary); */
|
| 901 |
+
background: var(--bg-secondary);
|
| 902 |
+
}
|
| 903 |
+
|
| 904 |
+
.cell-output.collapsed {
|
| 905 |
+
display: none;
|
| 906 |
+
}
|
| 907 |
+
|
| 908 |
+
.cell-stdout {
|
| 909 |
+
background: var(--bg-tertiary);
|
| 910 |
+
padding: 0.75rem;
|
| 911 |
+
border-radius: 1px;
|
| 912 |
+
/* margin: 0.25rem 0; */
|
| 913 |
+
font-family: inherit;
|
| 914 |
+
font-size: 0.9rem;
|
| 915 |
+
white-space: pre-wrap;
|
| 916 |
+
color: var(--text-primary);
|
| 917 |
+
}
|
| 918 |
+
|
| 919 |
+
.cell-stdout {
|
| 920 |
+
background: var(--bg-tertiary);
|
| 921 |
+
padding: 0.75rem;
|
| 922 |
+
border-radius: 1px;
|
| 923 |
+
font-family: inherit;
|
| 924 |
+
font-size: 0.9rem;
|
| 925 |
+
color: var(--text-primary);
|
| 926 |
+
|
| 927 |
+
/* key bits */
|
| 928 |
+
overflow: auto;
|
| 929 |
+
/* show scrollbars when needed */
|
| 930 |
+
max-width: 100%;
|
| 931 |
+
/* respects whatever layout width you give it */
|
| 932 |
+
}
|
| 933 |
+
|
| 934 |
+
.cell-stdout .stdout-text {
|
| 935 |
+
margin: 0;
|
| 936 |
+
/* reset pre default margin */
|
| 937 |
+
white-space: pre;
|
| 938 |
+
/* keep line breaks, NO wrapping */
|
| 939 |
+
display: inline-block;
|
| 940 |
+
/* shrink-to-content */
|
| 941 |
+
min-width: max-content;
|
| 942 |
+
/* allow very long lines to define intrinsic width */
|
| 943 |
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
| 944 |
+
tab-size: 2;
|
| 945 |
+
}
|
| 946 |
+
|
| 947 |
+
.cell-stderr {
|
| 948 |
+
background: var(--bg-error);
|
| 949 |
+
border-left: 2px solid var(--border-error);
|
| 950 |
+
padding: 1rem;
|
| 951 |
+
margin: 0.5rem 0;
|
| 952 |
+
font-family: inherit;
|
| 953 |
+
font-size: 0.9rem;
|
| 954 |
+
color: var(--text-error);
|
| 955 |
+
white-space: pre-wrap;
|
| 956 |
+
}
|
| 957 |
+
|
| 958 |
+
.uv-install-logs {
|
| 959 |
+
margin: 0.5rem 0;
|
| 960 |
+
}
|
| 961 |
+
|
| 962 |
+
.uv-logs-header {
|
| 963 |
+
cursor: pointer;
|
| 964 |
+
padding: 0.75rem;
|
| 965 |
+
border-left: 3px solid var(--border-color);
|
| 966 |
+
font-family: inherit;
|
| 967 |
+
font-size: 0.85rem;
|
| 968 |
+
color: var(--text-secondary);
|
| 969 |
+
user-select: none;
|
| 970 |
+
}
|
| 971 |
+
|
| 972 |
+
.uv-logs-content {
|
| 973 |
+
background: var(--bg-secondary);
|
| 974 |
+
padding: 1rem;
|
| 975 |
+
border-left: 3px solid var(--border-color);
|
| 976 |
+
white-space: pre-wrap;
|
| 977 |
+
font-family: monospace;
|
| 978 |
+
font-size: 0.85rem;
|
| 979 |
+
color: var(--text-secondary);
|
| 980 |
+
overflow-x: auto;
|
| 981 |
+
}
|
| 982 |
+
|
| 983 |
+
.cell-artifacts {
|
| 984 |
+
margin: 1rem 0;
|
| 985 |
+
}
|
| 986 |
+
|
| 987 |
+
.cell-artifacts h4 {
|
| 988 |
+
margin: 0 0 0.5rem 0;
|
| 989 |
+
color: var(--text-secondary);
|
| 990 |
+
font-size: 0.9rem;
|
| 991 |
+
}
|
| 992 |
+
|
| 993 |
+
.artifact {
|
| 994 |
+
display: inline-block;
|
| 995 |
+
background: var(--bg-artifact);
|
| 996 |
+
padding: 0.25rem 0.5rem;
|
| 997 |
+
border-radius: 1px;
|
| 998 |
+
margin: 0.25rem 0.5rem 0.25rem 0;
|
| 999 |
+
font-family: inherit;
|
| 1000 |
+
font-size: 0.8rem;
|
| 1001 |
+
color: var(--text-link);
|
| 1002 |
+
text-decoration: none;
|
| 1003 |
+
transition: background-color 0.2s ease;
|
| 1004 |
+
border: 1px solid var(--border-primary);
|
| 1005 |
+
}
|
| 1006 |
+
|
| 1007 |
+
.artifact:hover {
|
| 1008 |
+
background: var(--bg-artifact-hover);
|
| 1009 |
+
}
|
| 1010 |
+
|
| 1011 |
+
.artifact-preview {
|
| 1012 |
+
margin-top: 1rem;
|
| 1013 |
+
}
|
| 1014 |
+
|
| 1015 |
+
.artifact-preview img {
|
| 1016 |
+
max-width: 100%;
|
| 1017 |
+
height: auto;
|
| 1018 |
+
border: 1px solid var(--border-primary);
|
| 1019 |
+
border-radius: 1px;
|
| 1020 |
+
}
|
| 1021 |
+
|
| 1022 |
+
.artifact-preview svg {
|
| 1023 |
+
max-width: 100%;
|
| 1024 |
+
height: auto;
|
| 1025 |
+
border: 1px solid var(--border-primary);
|
| 1026 |
+
border-radius: 1px;
|
| 1027 |
+
display: block;
|
| 1028 |
+
}
|
| 1029 |
+
|
| 1030 |
+
/* Style SVG text elements */
|
| 1031 |
+
.artifact-preview svg g {
|
| 1032 |
+
fill: var(--text-primary) !important;
|
| 1033 |
+
}
|
| 1034 |
+
|
| 1035 |
+
/* Auto-theme SVG elements */
|
| 1036 |
+
.artifact-preview svg {
|
| 1037 |
+
background: transparent;
|
| 1038 |
+
}
|
| 1039 |
+
|
| 1040 |
+
/* Invert SVG images in dark mode */
|
| 1041 |
+
:root[data-theme="dark"] .artifact-preview img[src$=".svg"] {
|
| 1042 |
+
filter: invert(0.9) hue-rotate(180deg);
|
| 1043 |
+
}
|
| 1044 |
+
|
| 1045 |
+
/* Keep SVG images readable in monocolor mode */
|
| 1046 |
+
:root[data-ui="monocolor"] .artifact-preview img[src$=".svg"] {
|
| 1047 |
+
filter: none;
|
| 1048 |
+
}
|
| 1049 |
+
|
| 1050 |
+
/* CSV table styling */
|
| 1051 |
+
.artifact-csv {
|
| 1052 |
+
margin-top: 1rem;
|
| 1053 |
+
overflow-x: auto;
|
| 1054 |
+
}
|
| 1055 |
+
|
| 1056 |
+
.csv-table {
|
| 1057 |
+
width: 100%;
|
| 1058 |
+
border-collapse: collapse;
|
| 1059 |
+
font-size: 0.9rem;
|
| 1060 |
+
background: var(--bg-secondary);
|
| 1061 |
+
border: 1px solid var(--border-primary);
|
| 1062 |
+
border-radius: 1px;
|
| 1063 |
+
}
|
| 1064 |
+
|
| 1065 |
+
.csv-table th,
|
| 1066 |
+
.csv-table td {
|
| 1067 |
+
padding: 0.5rem 0.75rem;
|
| 1068 |
+
text-align: left;
|
| 1069 |
+
border: 1px solid var(--border-primary);
|
| 1070 |
+
}
|
| 1071 |
+
|
| 1072 |
+
.csv-table th {
|
| 1073 |
+
background: var(--bg-tertiary);
|
| 1074 |
+
font-weight: 600;
|
| 1075 |
+
color: var(--text-primary);
|
| 1076 |
+
}
|
| 1077 |
+
|
| 1078 |
+
.csv-table tbody tr:hover {
|
| 1079 |
+
background: var(--bg-artifact-hover);
|
| 1080 |
+
}
|
| 1081 |
+
|
| 1082 |
+
.artifact-csv-error {
|
| 1083 |
+
margin-top: 1rem;
|
| 1084 |
+
padding: 1rem;
|
| 1085 |
+
background: var(--bg-error);
|
| 1086 |
+
color: var(--text-error);
|
| 1087 |
+
border: 1px solid var(--border-error);
|
| 1088 |
+
border-radius: 1px;
|
| 1089 |
+
}
|
| 1090 |
+
|
| 1091 |
+
.cell-failed {
|
| 1092 |
+
border-color: var(--border-cell-failed);
|
| 1093 |
+
}
|
| 1094 |
+
|
| 1095 |
+
.cell-failed .cell-header {
|
| 1096 |
+
background: var(--bg-error);
|
| 1097 |
+
color: var(--text-error);
|
| 1098 |
+
}
|
| 1099 |
+
|
| 1100 |
+
.cell-commented {
|
| 1101 |
+
opacity: 0.6;
|
| 1102 |
+
border-style: dashed;
|
| 1103 |
+
}
|
| 1104 |
+
|
| 1105 |
+
.cell-commented .cell-header {
|
| 1106 |
+
background: var(--bg-secondary);
|
| 1107 |
+
color: var(--text-secondary);
|
| 1108 |
+
font-style: italic;
|
| 1109 |
+
}
|
| 1110 |
+
|
| 1111 |
+
.run-btn {
|
| 1112 |
+
background: var(--bg-tertiary);
|
| 1113 |
+
border: 1px solid var(--border-primary);
|
| 1114 |
+
padding: 2px 6px;
|
| 1115 |
+
border-radius: 2px;
|
| 1116 |
+
color: var(--text-secondary);
|
| 1117 |
+
cursor: pointer;
|
| 1118 |
+
font-size: 0.75em;
|
| 1119 |
+
font-family: inherit;
|
| 1120 |
+
margin-left: 4px;
|
| 1121 |
+
}
|
| 1122 |
+
|
| 1123 |
+
.run-btn:hover {
|
| 1124 |
+
color: var(--text-primary);
|
| 1125 |
+
background: var(--bg-primary);
|
| 1126 |
+
}
|
| 1127 |
+
|
| 1128 |
+
.run-btn:disabled {
|
| 1129 |
+
opacity: 0.6;
|
| 1130 |
+
cursor: not-allowed;
|
| 1131 |
+
}
|
| 1132 |
+
|
| 1133 |
+
.copy-btn {
|
| 1134 |
+
background: var(--bg-tertiary);
|
| 1135 |
+
border: 1px solid var(--border-primary);
|
| 1136 |
+
padding: 2px 6px;
|
| 1137 |
+
border-radius: 2px;
|
| 1138 |
+
color: var(--text-secondary);
|
| 1139 |
+
cursor: pointer;
|
| 1140 |
+
font-size: 0.75em;
|
| 1141 |
+
font-family: inherit;
|
| 1142 |
+
margin-left: 4px;
|
| 1143 |
+
}
|
| 1144 |
+
|
| 1145 |
+
.copy-btn:hover {
|
| 1146 |
+
color: var(--text-primary);
|
| 1147 |
+
background: var(--bg-primary);
|
| 1148 |
+
}
|
| 1149 |
+
|
| 1150 |
+
.copy-btn:disabled {
|
| 1151 |
+
opacity: 0.6;
|
| 1152 |
+
cursor: not-allowed;
|
| 1153 |
+
}
|
| 1154 |
+
|
| 1155 |
+
.copy-btn.copied {
|
| 1156 |
+
color: #4caf50;
|
| 1157 |
+
background: var(--bg-primary);
|
| 1158 |
+
border-color: #4caf50;
|
| 1159 |
+
transition: all 0.2s ease;
|
| 1160 |
+
}
|
| 1161 |
+
|
| 1162 |
+
.raw-btn {
|
| 1163 |
+
background: var(--bg-tertiary);
|
| 1164 |
+
border: 1px solid var(--border-primary);
|
| 1165 |
+
padding: 2px 6px;
|
| 1166 |
+
border-radius: 2px;
|
| 1167 |
+
color: var(--text-secondary);
|
| 1168 |
+
cursor: pointer;
|
| 1169 |
+
font-size: 0.75em;
|
| 1170 |
+
font-family: inherit;
|
| 1171 |
+
margin-left: 4px;
|
| 1172 |
+
text-decoration: none;
|
| 1173 |
+
display: inline-block;
|
| 1174 |
+
}
|
| 1175 |
+
|
| 1176 |
+
.raw-btn:hover {
|
| 1177 |
+
color: var(--text-primary);
|
| 1178 |
+
background: var(--bg-primary);
|
| 1179 |
+
text-decoration: none;
|
| 1180 |
+
}
|
| 1181 |
+
|
| 1182 |
+
.github-btn {
|
| 1183 |
+
background: var(--bg-tertiary);
|
| 1184 |
+
border: 1px solid var(--border-primary);
|
| 1185 |
+
padding: 2px 6px;
|
| 1186 |
+
border-radius: 2px;
|
| 1187 |
+
color: var(--text-secondary);
|
| 1188 |
+
cursor: pointer;
|
| 1189 |
+
font-size: 0.75em;
|
| 1190 |
+
font-family: inherit;
|
| 1191 |
+
margin-left: 4px;
|
| 1192 |
+
text-decoration: none;
|
| 1193 |
+
display: inline-block;
|
| 1194 |
+
}
|
| 1195 |
+
|
| 1196 |
+
.github-btn:hover {
|
| 1197 |
+
color: var(--text-primary);
|
| 1198 |
+
background: var(--bg-primary);
|
| 1199 |
+
text-decoration: none;
|
| 1200 |
+
}
|
| 1201 |
+
|
| 1202 |
+
.hf-btn {
|
| 1203 |
+
background: var(--bg-tertiary);
|
| 1204 |
+
border: 1px solid var(--border-primary);
|
| 1205 |
+
padding: 2px 6px;
|
| 1206 |
+
border-radius: 2px;
|
| 1207 |
+
color: var(--text-secondary);
|
| 1208 |
+
cursor: pointer;
|
| 1209 |
+
font-size: 0.75em;
|
| 1210 |
+
font-family: inherit;
|
| 1211 |
+
margin-left: 4px;
|
| 1212 |
+
text-decoration: none;
|
| 1213 |
+
display: inline-block;
|
| 1214 |
+
}
|
| 1215 |
+
|
| 1216 |
+
.hf-btn:hover {
|
| 1217 |
+
color: var(--text-primary);
|
| 1218 |
+
background: var(--bg-primary);
|
| 1219 |
+
text-decoration: none;
|
| 1220 |
+
}
|
| 1221 |
+
|
| 1222 |
+
.output-stale {
|
| 1223 |
+
opacity: 0.5;
|
| 1224 |
+
position: relative;
|
| 1225 |
+
}
|
| 1226 |
+
|
| 1227 |
+
.output-stale::after {
|
| 1228 |
+
content: '⏳ updating...';
|
| 1229 |
+
position: absolute;
|
| 1230 |
+
top: 8px;
|
| 1231 |
+
right: 8px;
|
| 1232 |
+
background: var(--bg-secondary);
|
| 1233 |
+
padding: 4px 8px;
|
| 1234 |
+
border-radius: 2px;
|
| 1235 |
+
font-size: 0.75em;
|
| 1236 |
+
color: var(--text-secondary);
|
| 1237 |
+
border: 1px solid var(--border-primary);
|
| 1238 |
+
}
|
| 1239 |
+
|
| 1240 |
+
h1,
|
| 1241 |
+
h2,
|
| 1242 |
+
h3,
|
| 1243 |
+
h4,
|
| 1244 |
+
h5,
|
| 1245 |
+
h6 {
|
| 1246 |
+
margin-top: 1.5rem;
|
| 1247 |
+
margin-bottom: 0.75rem;
|
| 1248 |
+
color: var(--text-primary);
|
| 1249 |
+
}
|
| 1250 |
+
|
| 1251 |
+
h1 {
|
| 1252 |
+
margin-top: 0;
|
| 1253 |
+
margin-bottom: 1rem;
|
| 1254 |
+
}
|
| 1255 |
+
|
| 1256 |
+
p {
|
| 1257 |
+
margin: 0.75rem 0;
|
| 1258 |
+
color: var(--text-primary);
|
| 1259 |
+
}
|
| 1260 |
+
|
| 1261 |
+
a {
|
| 1262 |
+
color: var(--text-link);
|
| 1263 |
+
}
|
| 1264 |
+
|
| 1265 |
+
img {
|
| 1266 |
+
max-width: 100%;
|
| 1267 |
+
height: auto;
|
| 1268 |
+
border-radius: 1px;
|
| 1269 |
+
box-shadow: none;
|
| 1270 |
+
}
|
| 1271 |
+
|
| 1272 |
+
pre,
|
| 1273 |
+
code {
|
| 1274 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace;
|
| 1275 |
+
font-size: var(--code-font-size);
|
| 1276 |
+
}
|
| 1277 |
+
|
| 1278 |
+
.code-wrap {
|
| 1279 |
+
position: relative;
|
| 1280 |
+
}
|
| 1281 |
+
|
| 1282 |
+
.code-line-highlight {
|
| 1283 |
+
display: none;
|
| 1284 |
+
position: absolute;
|
| 1285 |
+
left: 0;
|
| 1286 |
+
right: 0;
|
| 1287 |
+
height: 1.5em;
|
| 1288 |
+
background: rgba(255, 235, 170, 0.35);
|
| 1289 |
+
pointer-events: none;
|
| 1290 |
+
border-left: 3px solid #f4c542;
|
| 1291 |
+
}
|
| 1292 |
+
|
| 1293 |
+
.line-number {
|
| 1294 |
+
cursor: pointer;
|
| 1295 |
+
text-decoration: none;
|
| 1296 |
+
color: var(--text-secondary);
|
| 1297 |
+
padding: 0 0.25rem;
|
| 1298 |
+
}
|
| 1299 |
+
|
| 1300 |
+
.line-number.selected {
|
| 1301 |
+
background: rgba(255, 235, 170, 0.4);
|
| 1302 |
+
color: var(--text-primary);
|
| 1303 |
+
}
|
| 1304 |
+
|
| 1305 |
+
/* Line numbers */
|
| 1306 |
+
.highlight-with-lines {
|
| 1307 |
+
display: flex;
|
| 1308 |
+
}
|
| 1309 |
+
|
| 1310 |
+
.line-numbers {
|
| 1311 |
+
background: var(--bg-tertiary);
|
| 1312 |
+
padding: var(--code-pad-y) 0.5rem;
|
| 1313 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace;
|
| 1314 |
+
font-size: var(--code-font-size);
|
| 1315 |
+
line-height: var(--code-line-height);
|
| 1316 |
+
color: var(--text-secondary);
|
| 1317 |
+
user-select: none;
|
| 1318 |
+
text-align: right;
|
| 1319 |
+
border-right: 1px solid var(--border-primary);
|
| 1320 |
+
}
|
| 1321 |
+
|
| 1322 |
+
.line-numbers .line-number {
|
| 1323 |
+
display: block;
|
| 1324 |
+
line-height: var(--code-line-height);
|
| 1325 |
+
}
|
| 1326 |
+
|
| 1327 |
+
.highlight-with-lines .highlight {
|
| 1328 |
+
flex: 1;
|
| 1329 |
+
}
|
| 1330 |
+
|
| 1331 |
+
.highlight .hll {
|
| 1332 |
+
background-color: transparent;
|
| 1333 |
+
}
|
| 1334 |
+
|
| 1335 |
+
/* don't conflict with our highlight */
|
| 1336 |
+
.highlight pre {
|
| 1337 |
+
white-space: pre;
|
| 1338 |
+
margin: 0;
|
| 1339 |
+
padding: var(--code-pad-y) 0.75rem;
|
| 1340 |
+
line-height: var(--code-line-height);
|
| 1341 |
+
}
|
| 1342 |
+
|
| 1343 |
+
/* Collapsed code styling */
|
| 1344 |
+
.cell-code.collapsed {
|
| 1345 |
+
display: none;
|
| 1346 |
+
}
|
| 1347 |
+
|
| 1348 |
+
.cell-code.expanded {
|
| 1349 |
+
display: block;
|
| 1350 |
+
}
|
| 1351 |
+
|
| 1352 |
+
{
|
| 1353 |
+
% if config.collapse_code %
|
| 1354 |
+
}
|
| 1355 |
+
|
| 1356 |
+
.cell-code {
|
| 1357 |
+
display: none;
|
| 1358 |
+
}
|
| 1359 |
+
|
| 1360 |
+
{
|
| 1361 |
+
% else %
|
| 1362 |
+
}
|
| 1363 |
+
|
| 1364 |
+
.cell-code {
|
| 1365 |
+
display: block;
|
| 1366 |
+
border-bottom: 1px solid var(--border-primary);
|
| 1367 |
+
}
|
| 1368 |
+
|
| 1369 |
+
{
|
| 1370 |
+
% endif %
|
| 1371 |
+
}
|
| 1372 |
+
|
| 1373 |
+
{
|
| 1374 |
+
{
|
| 1375 |
+
pygments_css
|
| 1376 |
+
}
|
| 1377 |
+
}
|
| 1378 |
+
|
| 1379 |
+
/* Ensure our code metrics override Pygments defaults */
|
| 1380 |
+
.highlight pre {
|
| 1381 |
+
white-space: pre;
|
| 1382 |
+
margin: 0;
|
| 1383 |
+
padding: var(--code-pad-y) 0.75rem !important;
|
| 1384 |
+
line-height: var(--code-line-height) !important;
|
| 1385 |
+
font-size: var(--code-font-size) !important;
|
| 1386 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace !important;
|
| 1387 |
+
border: none;
|
| 1388 |
+
}
|
| 1389 |
+
|
| 1390 |
+
.line-numbers {
|
| 1391 |
+
line-height: var(--code-line-height) !important;
|
| 1392 |
+
}
|
| 1393 |
+
|
| 1394 |
+
.line-numbers .line-number {
|
| 1395 |
+
line-height: var(--code-line-height) !important;
|
| 1396 |
+
}
|
| 1397 |
+
|
| 1398 |
+
/* Custom CSS from frontmatter */
|
| 1399 |
+
{
|
| 1400 |
+
{
|
| 1401 |
+
config.custom_css
|
| 1402 |
+
}
|
| 1403 |
+
}
|
| 1404 |
+
|
| 1405 |
+
{
|
| 1406 |
+
# Override code font size from frontmatter (accept number as px) #
|
| 1407 |
+
}
|
| 1408 |
+
|
| 1409 |
+
{
|
| 1410 |
+
% if config.code_font_size is not none %
|
| 1411 |
+
}
|
| 1412 |
+
|
| 1413 |
+
{
|
| 1414 |
+
% if config.code_font_size is string %
|
| 1415 |
+
}
|
| 1416 |
+
|
| 1417 |
+
:root {
|
| 1418 |
+
--code-font-size: {
|
| 1419 |
+
{
|
| 1420 |
+
config.code_font_size
|
| 1421 |
+
}
|
| 1422 |
+
}
|
| 1423 |
+
|
| 1424 |
+
;
|
| 1425 |
+
}
|
| 1426 |
+
|
| 1427 |
+
{
|
| 1428 |
+
% else %
|
| 1429 |
+
}
|
| 1430 |
+
|
| 1431 |
+
:root {
|
| 1432 |
+
--code-font-size: {
|
| 1433 |
+
{
|
| 1434 |
+
config.code_font_size
|
| 1435 |
+
}
|
| 1436 |
+
}
|
| 1437 |
+
|
| 1438 |
+
px;
|
| 1439 |
+
}
|
| 1440 |
+
|
| 1441 |
+
{
|
| 1442 |
+
% endif %
|
| 1443 |
+
}
|
| 1444 |
+
|
| 1445 |
+
{
|
| 1446 |
+
% endif %
|
| 1447 |
+
}
|
| 1448 |
+
|
| 1449 |
+
/* Cursor for tools */
|
| 1450 |
+
body[data-tool="arrow"] .main-content {
|
| 1451 |
+
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%23e53935" stroke-width="2"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>') 12 12, crosshair;
|
| 1452 |
+
}
|
| 1453 |
+
|
| 1454 |
+
body[data-tool="pen"] .main-content {
|
| 1455 |
+
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%23e53935" stroke-width="2"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><circle cx="4" cy="20" r="2" fill="%23e53935"/></svg>') 4 20, pointer;
|
| 1456 |
+
}
|
| 1457 |
+
|
| 1458 |
+
body[data-tool="eraser"] .main-content {
|
| 1459 |
+
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%23e53935" stroke-width="2"><path d="M20 20H7l-7-7 7-7h13v14z"/><path d="M13 13l7-7"/><path d="M13 13L9 9"/></svg>') 12 12, auto;
|
| 1460 |
+
}
|
| 1461 |
+
|
| 1462 |
+
/* Color picker styles */
|
| 1463 |
+
.tools-section-title {
|
| 1464 |
+
font-weight: bold;
|
| 1465 |
+
color: var(--text-secondary);
|
| 1466 |
+
font-size: 0.65rem;
|
| 1467 |
+
margin: 0.75rem 0 0.5rem 0;
|
| 1468 |
+
text-transform: uppercase;
|
| 1469 |
+
letter-spacing: 0.5px;
|
| 1470 |
+
}
|
| 1471 |
+
|
| 1472 |
+
.color-row {
|
| 1473 |
+
display: grid;
|
| 1474 |
+
grid-template-columns: repeat(6, 1fr);
|
| 1475 |
+
gap: 0.25rem;
|
| 1476 |
+
margin-bottom: 0.5rem;
|
| 1477 |
+
}
|
| 1478 |
+
|
| 1479 |
+
.color-swatch {
|
| 1480 |
+
width: 18px;
|
| 1481 |
+
height: 18px;
|
| 1482 |
+
border: 2px solid var(--border-primary);
|
| 1483 |
+
border-radius: 3px;
|
| 1484 |
+
cursor: pointer;
|
| 1485 |
+
transition: all 0.2s ease;
|
| 1486 |
+
position: relative;
|
| 1487 |
+
}
|
| 1488 |
+
|
| 1489 |
+
.color-swatch:hover {
|
| 1490 |
+
transform: scale(1.1);
|
| 1491 |
+
border-color: var(--text-secondary);
|
| 1492 |
+
}
|
| 1493 |
+
|
| 1494 |
+
.color-swatch.selected {
|
| 1495 |
+
border-color: var(--text-primary);
|
| 1496 |
+
box-shadow: 0 0 0 2px var(--text-link);
|
| 1497 |
+
}
|
| 1498 |
+
|
| 1499 |
+
.color-swatch.selected::after {
|
| 1500 |
+
content: '✓';
|
| 1501 |
+
position: absolute;
|
| 1502 |
+
top: 50%;
|
| 1503 |
+
left: 50%;
|
| 1504 |
+
transform: translate(-50%, -50%);
|
| 1505 |
+
color: white;
|
| 1506 |
+
font-size: 10px;
|
| 1507 |
+
font-weight: bold;
|
| 1508 |
+
text-shadow: 1px 1px 1px black;
|
| 1509 |
+
}
|
| 1510 |
+
|
| 1511 |
+
.color-input {
|
| 1512 |
+
width: 24px;
|
| 1513 |
+
height: 24px;
|
| 1514 |
+
border: 2px solid var(--border-primary);
|
| 1515 |
+
border-radius: 3px;
|
| 1516 |
+
cursor: pointer;
|
| 1517 |
+
background: none;
|
| 1518 |
+
padding: 0;
|
| 1519 |
+
grid-column: span 2;
|
| 1520 |
+
justify-self: center;
|
| 1521 |
+
}
|
| 1522 |
+
|
| 1523 |
+
.color-input:hover {
|
| 1524 |
+
border-color: var(--text-secondary);
|
| 1525 |
+
}
|
| 1526 |
+
|
| 1527 |
+
/* Thickness slider styles */
|
| 1528 |
+
.thickness-row {
|
| 1529 |
+
display: flex;
|
| 1530 |
+
align-items: center;
|
| 1531 |
+
gap: 0.5rem;
|
| 1532 |
+
margin-top: 0.75rem;
|
| 1533 |
+
}
|
| 1534 |
+
|
| 1535 |
+
.thickness-slider {
|
| 1536 |
+
flex: 1;
|
| 1537 |
+
-webkit-appearance: none;
|
| 1538 |
+
appearance: none;
|
| 1539 |
+
height: 4px;
|
| 1540 |
+
background: var(--border-primary);
|
| 1541 |
+
border-radius: 2px;
|
| 1542 |
+
outline: none;
|
| 1543 |
+
opacity: 0.7;
|
| 1544 |
+
transition: opacity 0.2s;
|
| 1545 |
+
}
|
| 1546 |
+
|
| 1547 |
+
.thickness-slider:hover {
|
| 1548 |
+
opacity: 1;
|
| 1549 |
+
}
|
| 1550 |
+
|
| 1551 |
+
.thickness-slider::-webkit-slider-thumb {
|
| 1552 |
+
-webkit-appearance: none;
|
| 1553 |
+
appearance: none;
|
| 1554 |
+
width: 12px;
|
| 1555 |
+
height: 12px;
|
| 1556 |
+
background: var(--text-link);
|
| 1557 |
+
border-radius: 50%;
|
| 1558 |
+
cursor: pointer;
|
| 1559 |
+
}
|
| 1560 |
+
|
| 1561 |
+
.thickness-slider::-moz-range-thumb {
|
| 1562 |
+
width: 12px;
|
| 1563 |
+
height: 12px;
|
| 1564 |
+
background: var(--text-link);
|
| 1565 |
+
border-radius: 50%;
|
| 1566 |
+
cursor: pointer;
|
| 1567 |
+
border: none;
|
| 1568 |
+
}
|
| 1569 |
+
|
| 1570 |
+
.thickness-value {
|
| 1571 |
+
font-size: 0.7rem;
|
| 1572 |
+
color: var(--text-secondary);
|
| 1573 |
+
min-width: 20px;
|
| 1574 |
+
text-align: right;
|
| 1575 |
+
}
|
| 1576 |
+
|
| 1577 |
+
.highlight {
|
| 1578 |
+
background: none !important;
|
| 1579 |
+
}
|
| 1580 |
+
|
| 1581 |
+
/* Loading animations */
|
| 1582 |
+
.loading-spinner {
|
| 1583 |
+
display: inline-block;
|
| 1584 |
+
width: 16px;
|
| 1585 |
+
height: 16px;
|
| 1586 |
+
border: 2px solid var(--border-primary);
|
| 1587 |
+
border-radius: 50%;
|
| 1588 |
+
border-top-color: var(--text-link);
|
| 1589 |
+
animation: spin 1s linear infinite;
|
| 1590 |
+
margin-right: 8px;
|
| 1591 |
+
vertical-align: middle;
|
| 1592 |
+
}
|
| 1593 |
+
|
| 1594 |
+
@keyframes spin {
|
| 1595 |
+
to {
|
| 1596 |
+
transform: rotate(360deg);
|
| 1597 |
+
}
|
| 1598 |
+
}
|
| 1599 |
+
|
| 1600 |
+
.loading-skeleton {
|
| 1601 |
+
display: inline-block;
|
| 1602 |
+
background: var(--bg-tertiary);
|
| 1603 |
+
background: linear-gradient(90deg,
|
| 1604 |
+
var(--bg-tertiary) 25%,
|
| 1605 |
+
var(--bg-secondary) 50%,
|
| 1606 |
+
var(--bg-tertiary) 75%);
|
| 1607 |
+
background-size: 200% 100%;
|
| 1608 |
+
animation: loading-shimmer 2s ease-in-out infinite;
|
| 1609 |
+
border-radius: 2px;
|
| 1610 |
+
height: 1em;
|
| 1611 |
+
width: 80px;
|
| 1612 |
+
vertical-align: middle;
|
| 1613 |
+
}
|
| 1614 |
+
|
| 1615 |
+
@keyframes loading-shimmer {
|
| 1616 |
+
0% {
|
| 1617 |
+
background-position: -200% 0;
|
| 1618 |
+
}
|
| 1619 |
+
|
| 1620 |
+
100% {
|
| 1621 |
+
background-position: 200% 0;
|
| 1622 |
+
}
|
| 1623 |
+
}
|
| 1624 |
+
|
| 1625 |
+
/* Loading state for cell output */
|
| 1626 |
+
.cell-output:has(.loading-spinner) {
|
| 1627 |
+
opacity: 0.7;
|
| 1628 |
+
background: var(--bg-secondary);
|
| 1629 |
+
/* border-left: 3px solid var(--text-link); */
|
| 1630 |
+
}
|
| 1631 |
</style>
|
| 1632 |
<script>
|
| 1633 |
// --- Drag utilities ---
|
|
|
|
| 4106 |
<span onclick="toggleOutput('benchmark')" style="cursor: pointer;">▼ output</span>
|
| 4107 |
<span id="uv-indicator-benchmark" style="cursor: default; opacity: 0.3;">▶ uv-logs</span>
|
| 4108 |
</span> |
|
| 4109 |
+
Cell: benchmark | 4.12s
|
| 4110 |
| <button class="run-btn" onclick="runCell('benchmark')">▶ run</button>
|
| 4111 |
<button class="copy-btn" onclick="copyCell('benchmark')">Copy</button>
|
| 4112 |
<a href="cells/benchmark.py" target="_blank" class="raw-btn">Raw</a>
|
|
|
|
| 4155 |
<div class="cell-stdout"><pre class="stdout-text">Running attention benchmark on cuda with 6 workloads.
|
| 4156 |
impl wl p50(ms) ok
|
| 4157 |
sage_int8_fp16 cuda_attn_L128_bfloat16 FAIL False
|
| 4158 |
+
Error: module 'sage_attention_cb34d81dafacbad9' has no attribute 'fwd'
|
| 4159 |
sage_int8_fp16 cuda_attn_L256_bfloat16 FAIL False
|
| 4160 |
+
Error: module 'sage_attention_cb34d81dafacbad9' has no attribute 'fwd'
|
| 4161 |
sage_int8_fp16 cuda_attn_L320_bfloat16 FAIL False
|
| 4162 |
+
Error: module 'sage_attention_cb34d81dafacbad9' has no attribute 'fwd'
|
| 4163 |
sage_int8_fp16 cuda_attn_L384_bfloat16 FAIL False
|
| 4164 |
+
Error: module 'sage_attention_cb34d81dafacbad9' has no attribute 'fwd'
|
| 4165 |
sage_int8_fp16 cuda_attn_L448_bfloat16 FAIL False
|
| 4166 |
+
Error: module 'sage_attention_cb34d81dafacbad9' has no attribute 'fwd'
|
| 4167 |
sage_int8_fp16 cuda_attn_L512_bfloat16 FAIL False
|
| 4168 |
+
Error: module 'sage_attention_cb34d81dafacbad9' has no attribute 'fwd'
|
| 4169 |
</pre></div>
|
| 4170 |
<div class="cell-stderr">
|
| 4171 |
Fetching 11 files: 0%| | 0/11 [00:00<?, ?it/s]
|
| 4172 |
+
Fetching 11 files: 18%|█▊ | 2/11 [00:00<00:00, 17.35it/s]
|
| 4173 |
+
Fetching 11 files: 73%|███████▎ | 8/11 [00:00<00:00, 15.18it/s]
|
| 4174 |
+
Fetching 11 files: 100%|██████████| 11/11 [00:00<00:00, 21.06it/s]
|
| 4175 |
</div>
|
| 4176 |
<div class="cell-artifacts">
|
| 4177 |
<h4>Artifacts:</h4>
|
flash_attn/impls/xformers.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
flash_attn/results/artifacts/combine/latency.svg
CHANGED
|
|
Git LFS Details
|
|
|
Git LFS Details
|
flash_attn/results/combined_results.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
index.html
CHANGED
|
@@ -4,6 +4,11 @@
|
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
<title>index</title>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
<script>
|
| 8 |
// Iframe-friendly navigation router
|
| 9 |
(function() {
|
|
@@ -87,1320 +92,1542 @@
|
|
| 87 |
</script>
|
| 88 |
<style>
|
| 89 |
:root[data-theme="light"] {
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 343 |
-
|
| 344 |
-
|
| 345 |
-
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
| 354 |
-
|
| 355 |
-
|
| 356 |
-
|
| 357 |
-
|
| 358 |
-
|
| 359 |
-
|
| 360 |
-
|
| 361 |
-
|
| 362 |
-
|
| 363 |
-
|
| 364 |
-
|
| 365 |
-
|
| 366 |
-
|
| 367 |
-
|
| 368 |
-
|
| 369 |
-
|
| 370 |
-
|
| 371 |
-
|
| 372 |
-
|
| 373 |
-
|
| 374 |
-
|
| 375 |
-
|
| 376 |
-
|
| 377 |
-
|
| 378 |
-
|
| 379 |
-
|
| 380 |
-
|
| 381 |
-
|
| 382 |
-
|
| 383 |
-
|
| 384 |
-
|
| 385 |
-
|
| 386 |
-
|
| 387 |
-
|
| 388 |
-
|
| 389 |
-
|
| 390 |
-
|
| 391 |
-
|
| 392 |
-
|
| 393 |
-
|
| 394 |
-
|
| 395 |
-
|
| 396 |
-
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
|
| 405 |
-
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
|
| 419 |
-
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
|
| 430 |
-
|
| 431 |
-
|
| 432 |
-
|
| 433 |
-
|
| 434 |
-
|
| 435 |
-
|
| 436 |
-
|
| 437 |
-
|
| 438 |
-
|
| 439 |
-
|
| 440 |
-
|
| 441 |
-
|
| 442 |
-
|
| 443 |
-
|
| 444 |
-
|
| 445 |
-
|
| 446 |
-
|
| 447 |
-
|
| 448 |
-
|
| 449 |
-
|
| 450 |
-
|
| 451 |
-
|
| 452 |
-
|
| 453 |
-
|
| 454 |
-
|
| 455 |
-
|
| 456 |
-
|
| 457 |
-
|
| 458 |
-
|
| 459 |
-
|
| 460 |
-
|
| 461 |
-
|
| 462 |
-
|
| 463 |
-
|
| 464 |
-
|
| 465 |
-
|
| 466 |
-
|
| 467 |
-
|
| 468 |
-
|
| 469 |
-
|
| 470 |
-
|
| 471 |
-
|
| 472 |
-
|
| 473 |
-
|
| 474 |
-
|
| 475 |
-
|
| 476 |
-
|
| 477 |
-
|
| 478 |
-
|
| 479 |
-
|
| 480 |
-
|
| 481 |
-
|
| 482 |
-
|
| 483 |
-
|
| 484 |
-
|
| 485 |
-
|
| 486 |
-
|
| 487 |
-
|
| 488 |
-
|
| 489 |
-
|
| 490 |
-
|
| 491 |
-
|
| 492 |
-
|
| 493 |
-
|
| 494 |
-
|
| 495 |
-
|
| 496 |
-
|
| 497 |
-
|
| 498 |
-
|
| 499 |
-
|
| 500 |
-
|
| 501 |
-
|
| 502 |
-
|
| 503 |
-
|
| 504 |
-
|
| 505 |
-
|
| 506 |
-
|
| 507 |
-
|
| 508 |
-
|
| 509 |
-
|
| 510 |
-
|
| 511 |
-
|
| 512 |
-
|
| 513 |
-
|
| 514 |
-
|
| 515 |
-
|
| 516 |
-
|
| 517 |
-
|
| 518 |
-
|
| 519 |
-
|
| 520 |
-
|
| 521 |
-
|
| 522 |
-
|
| 523 |
-
|
| 524 |
-
|
| 525 |
-
|
| 526 |
-
|
| 527 |
-
|
| 528 |
-
|
| 529 |
-
|
| 530 |
-
|
| 531 |
-
|
| 532 |
-
|
| 533 |
-
|
| 534 |
-
|
| 535 |
-
|
| 536 |
-
|
| 537 |
-
|
| 538 |
-
|
| 539 |
-
|
| 540 |
-
|
| 541 |
-
|
| 542 |
-
|
| 543 |
-
|
| 544 |
-
|
| 545 |
-
|
| 546 |
-
|
| 547 |
-
|
| 548 |
-
|
| 549 |
-
|
| 550 |
-
|
| 551 |
-
|
| 552 |
-
|
| 553 |
-
|
| 554 |
-
|
| 555 |
-
|
| 556 |
-
|
| 557 |
-
|
| 558 |
-
|
| 559 |
-
|
| 560 |
-
|
| 561 |
-
|
| 562 |
-
|
| 563 |
-
|
| 564 |
-
|
| 565 |
-
|
| 566 |
-
|
| 567 |
-
|
| 568 |
-
|
| 569 |
-
|
| 570 |
-
|
| 571 |
-
|
| 572 |
-
|
| 573 |
-
|
| 574 |
-
|
| 575 |
-
|
| 576 |
-
|
| 577 |
-
|
| 578 |
-
|
| 579 |
-
|
| 580 |
-
|
| 581 |
-
|
| 582 |
-
|
| 583 |
-
|
| 584 |
-
|
| 585 |
-
|
| 586 |
-
|
| 587 |
-
|
| 588 |
-
|
| 589 |
-
|
| 590 |
-
|
| 591 |
-
|
| 592 |
-
|
| 593 |
-
|
| 594 |
-
|
| 595 |
-
|
| 596 |
-
|
| 597 |
-
|
| 598 |
-
|
| 599 |
-
|
| 600 |
-
|
| 601 |
-
|
| 602 |
-
|
| 603 |
-
|
| 604 |
-
|
| 605 |
-
|
| 606 |
-
|
| 607 |
-
|
| 608 |
-
|
| 609 |
-
|
| 610 |
-
|
| 611 |
-
|
| 612 |
-
|
| 613 |
-
|
| 614 |
-
|
| 615 |
-
|
| 616 |
-
|
| 617 |
-
|
| 618 |
-
|
| 619 |
-
|
| 620 |
-
|
| 621 |
-
|
| 622 |
-
|
| 623 |
-
|
| 624 |
-
|
| 625 |
-
|
| 626 |
-
|
| 627 |
-
|
| 628 |
-
|
| 629 |
-
|
| 630 |
-
|
| 631 |
-
|
| 632 |
-
|
| 633 |
-
|
| 634 |
-
|
| 635 |
-
|
| 636 |
-
|
| 637 |
-
|
| 638 |
-
|
| 639 |
-
|
| 640 |
-
|
| 641 |
-
|
| 642 |
-
|
| 643 |
-
|
| 644 |
-
|
| 645 |
-
|
| 646 |
-
|
| 647 |
-
|
| 648 |
-
|
| 649 |
-
|
| 650 |
-
|
| 651 |
-
|
| 652 |
-
|
| 653 |
-
|
| 654 |
-
|
| 655 |
-
|
| 656 |
-
|
| 657 |
-
|
| 658 |
-
|
| 659 |
-
|
| 660 |
-
|
| 661 |
-
|
| 662 |
-
|
| 663 |
-
|
| 664 |
-
|
| 665 |
-
|
| 666 |
-
|
| 667 |
-
|
| 668 |
-
|
| 669 |
-
|
| 670 |
-
|
| 671 |
-
|
| 672 |
-
|
| 673 |
-
|
| 674 |
-
|
| 675 |
-
|
| 676 |
-
|
| 677 |
-
|
| 678 |
-
|
| 679 |
-
|
| 680 |
-
|
| 681 |
-
|
| 682 |
-
|
| 683 |
-
|
| 684 |
-
|
| 685 |
-
|
| 686 |
-
|
| 687 |
-
|
| 688 |
-
|
| 689 |
-
|
| 690 |
-
|
| 691 |
-
|
| 692 |
-
|
| 693 |
-
|
| 694 |
-
|
| 695 |
-
|
| 696 |
-
|
| 697 |
-
|
| 698 |
-
|
| 699 |
-
|
| 700 |
-
|
| 701 |
-
|
| 702 |
-
|
| 703 |
-
|
| 704 |
-
|
| 705 |
-
|
| 706 |
-
|
| 707 |
-
|
| 708 |
-
|
| 709 |
-
|
| 710 |
-
|
| 711 |
-
|
| 712 |
-
|
| 713 |
-
|
| 714 |
-
|
| 715 |
-
|
| 716 |
-
|
| 717 |
-
|
| 718 |
-
|
| 719 |
-
|
| 720 |
-
|
| 721 |
-
|
| 722 |
-
|
| 723 |
-
|
| 724 |
-
|
| 725 |
-
|
| 726 |
-
|
| 727 |
-
|
| 728 |
-
|
| 729 |
-
|
| 730 |
-
|
| 731 |
-
|
| 732 |
-
|
| 733 |
-
|
| 734 |
-
|
| 735 |
-
|
| 736 |
-
|
| 737 |
-
|
| 738 |
-
|
| 739 |
-
|
| 740 |
-
|
| 741 |
-
|
| 742 |
-
|
| 743 |
-
|
| 744 |
-
|
| 745 |
-
|
| 746 |
-
|
| 747 |
-
|
| 748 |
-
|
| 749 |
-
|
| 750 |
-
|
| 751 |
-
|
| 752 |
-
|
| 753 |
-
|
| 754 |
-
|
| 755 |
-
|
| 756 |
-
|
| 757 |
-
|
| 758 |
-
|
| 759 |
-
|
| 760 |
-
|
| 761 |
-
|
| 762 |
-
|
| 763 |
-
|
| 764 |
-
|
| 765 |
-
|
| 766 |
-
|
| 767 |
-
|
| 768 |
-
|
| 769 |
-
|
| 770 |
-
|
| 771 |
-
|
| 772 |
-
|
| 773 |
-
|
| 774 |
-
|
| 775 |
-
|
| 776 |
-
|
| 777 |
-
|
| 778 |
-
|
| 779 |
-
|
| 780 |
-
|
| 781 |
-
|
| 782 |
-
|
| 783 |
-
|
| 784 |
-
|
| 785 |
-
|
| 786 |
-
|
| 787 |
-
|
| 788 |
-
|
| 789 |
-
|
| 790 |
-
|
| 791 |
-
|
| 792 |
-
|
| 793 |
-
|
| 794 |
-
|
| 795 |
-
|
| 796 |
-
|
| 797 |
-
|
| 798 |
-
|
| 799 |
-
|
| 800 |
-
|
| 801 |
-
|
| 802 |
-
|
| 803 |
-
|
| 804 |
-
|
| 805 |
-
|
| 806 |
-
|
| 807 |
-
|
| 808 |
-
|
| 809 |
-
|
| 810 |
-
|
| 811 |
-
|
| 812 |
-
|
| 813 |
-
|
| 814 |
-
|
| 815 |
-
|
| 816 |
-
|
| 817 |
-
|
| 818 |
-
|
| 819 |
-
|
| 820 |
-
|
| 821 |
-
|
| 822 |
-
|
| 823 |
-
|
| 824 |
-
|
| 825 |
-
|
| 826 |
-
|
| 827 |
-
|
| 828 |
-
|
| 829 |
-
|
| 830 |
-
|
| 831 |
-
|
| 832 |
-
|
| 833 |
-
|
| 834 |
-
|
| 835 |
-
|
| 836 |
-
|
| 837 |
-
|
| 838 |
-
|
| 839 |
-
|
| 840 |
-
|
| 841 |
-
|
| 842 |
-
|
| 843 |
-
|
| 844 |
-
|
| 845 |
-
|
| 846 |
-
|
| 847 |
-
|
| 848 |
-
|
| 849 |
-
|
| 850 |
-
|
| 851 |
-
|
| 852 |
-
|
| 853 |
-
|
| 854 |
-
|
| 855 |
-
|
| 856 |
-
|
| 857 |
-
|
| 858 |
-
|
| 859 |
-
|
| 860 |
-
|
| 861 |
-
|
| 862 |
-
|
| 863 |
-
|
| 864 |
-
|
| 865 |
-
|
| 866 |
-
|
| 867 |
-
|
| 868 |
-
|
| 869 |
-
|
| 870 |
-
|
| 871 |
-
|
| 872 |
-
|
| 873 |
-
|
| 874 |
-
|
| 875 |
-
|
| 876 |
-
|
| 877 |
-
|
| 878 |
-
|
| 879 |
-
|
| 880 |
-
|
| 881 |
-
|
| 882 |
-
|
| 883 |
-
|
| 884 |
-
|
| 885 |
-
|
| 886 |
-
|
| 887 |
-
|
| 888 |
-
|
| 889 |
-
|
| 890 |
-
|
| 891 |
-
|
| 892 |
-
|
| 893 |
-
|
| 894 |
-
|
| 895 |
-
|
| 896 |
-
|
| 897 |
-
|
| 898 |
-
|
| 899 |
-
|
| 900 |
-
|
| 901 |
-
|
| 902 |
-
|
| 903 |
-
|
| 904 |
-
|
| 905 |
-
|
| 906 |
-
|
| 907 |
-
|
| 908 |
-
|
| 909 |
-
|
| 910 |
-
|
| 911 |
-
|
| 912 |
-
|
| 913 |
-
|
| 914 |
-
|
| 915 |
-
|
| 916 |
-
|
| 917 |
-
|
| 918 |
-
|
| 919 |
-
|
| 920 |
-
|
| 921 |
-
|
| 922 |
-
|
| 923 |
-
|
| 924 |
-
|
| 925 |
-
|
| 926 |
-
|
| 927 |
-
|
| 928 |
-
|
| 929 |
-
|
| 930 |
-
|
| 931 |
-
|
| 932 |
-
|
| 933 |
-
|
| 934 |
-
|
| 935 |
-
|
| 936 |
-
|
| 937 |
-
|
| 938 |
-
|
| 939 |
-
|
| 940 |
-
|
| 941 |
-
|
| 942 |
-
|
| 943 |
-
|
| 944 |
-
|
| 945 |
-
|
| 946 |
-
|
| 947 |
-
|
| 948 |
-
|
| 949 |
-
|
| 950 |
-
|
| 951 |
-
|
| 952 |
-
|
| 953 |
-
|
| 954 |
-
|
| 955 |
-
|
| 956 |
-
|
| 957 |
-
|
| 958 |
-
|
| 959 |
-
|
| 960 |
-
|
| 961 |
-
|
| 962 |
-
|
| 963 |
-
|
| 964 |
-
|
| 965 |
-
|
| 966 |
-
|
| 967 |
-
|
| 968 |
-
|
| 969 |
-
|
| 970 |
-
|
| 971 |
-
|
| 972 |
-
|
| 973 |
-
|
| 974 |
-
|
| 975 |
-
|
| 976 |
-
|
| 977 |
-
|
| 978 |
-
|
| 979 |
-
|
| 980 |
-
|
| 981 |
-
|
| 982 |
-
|
| 983 |
-
|
| 984 |
-
|
| 985 |
-
|
| 986 |
-
|
| 987 |
-
|
| 988 |
-
|
| 989 |
-
|
| 990 |
-
|
| 991 |
-
|
| 992 |
-
|
| 993 |
-
|
| 994 |
-
|
| 995 |
-
|
| 996 |
-
|
| 997 |
-
|
| 998 |
-
|
| 999 |
-
|
| 1000 |
-
|
| 1001 |
-
|
| 1002 |
-
|
| 1003 |
-
|
| 1004 |
-
|
| 1005 |
-
|
| 1006 |
-
|
| 1007 |
-
|
| 1008 |
-
|
| 1009 |
-
|
| 1010 |
-
|
| 1011 |
-
|
| 1012 |
-
|
| 1013 |
-
|
| 1014 |
-
|
| 1015 |
-
|
| 1016 |
-
|
| 1017 |
-
|
| 1018 |
-
|
| 1019 |
-
|
| 1020 |
-
|
| 1021 |
-
|
| 1022 |
-
|
| 1023 |
-
|
| 1024 |
-
|
| 1025 |
-
|
| 1026 |
-
|
| 1027 |
-
|
| 1028 |
-
|
| 1029 |
-
|
| 1030 |
-
|
| 1031 |
-
|
| 1032 |
-
|
| 1033 |
-
|
| 1034 |
-
|
| 1035 |
-
|
| 1036 |
-
|
| 1037 |
-
|
| 1038 |
-
|
| 1039 |
-
|
| 1040 |
-
|
| 1041 |
-
|
| 1042 |
-
|
| 1043 |
-
|
| 1044 |
-
|
| 1045 |
-
|
| 1046 |
-
|
| 1047 |
-
|
| 1048 |
-
|
| 1049 |
-
|
| 1050 |
-
|
| 1051 |
-
|
| 1052 |
-
|
| 1053 |
-
|
| 1054 |
-
|
| 1055 |
-
|
| 1056 |
-
|
| 1057 |
-
|
| 1058 |
-
|
| 1059 |
-
|
| 1060 |
-
|
| 1061 |
-
|
| 1062 |
-
|
| 1063 |
-
|
| 1064 |
-
|
| 1065 |
-
|
| 1066 |
-
|
| 1067 |
-
|
| 1068 |
-
|
| 1069 |
-
|
| 1070 |
-
|
| 1071 |
-
|
| 1072 |
-
|
| 1073 |
-
|
| 1074 |
-
|
| 1075 |
-
|
| 1076 |
-
|
| 1077 |
-
|
| 1078 |
-
|
| 1079 |
-
|
| 1080 |
-
|
| 1081 |
-
|
| 1082 |
-
|
| 1083 |
-
|
| 1084 |
-
|
| 1085 |
-
|
| 1086 |
-
|
| 1087 |
-
|
| 1088 |
-
|
| 1089 |
-
|
| 1090 |
-
|
| 1091 |
-
|
| 1092 |
-
|
| 1093 |
-
|
| 1094 |
-
|
| 1095 |
-
|
| 1096 |
-
|
| 1097 |
-
|
| 1098 |
-
|
| 1099 |
-
|
| 1100 |
-
|
| 1101 |
-
|
| 1102 |
-
|
| 1103 |
-
|
| 1104 |
-
|
| 1105 |
-
|
| 1106 |
-
|
| 1107 |
-
|
| 1108 |
-
|
| 1109 |
-
|
| 1110 |
-
|
| 1111 |
-
|
| 1112 |
-
|
| 1113 |
-
|
| 1114 |
-
|
| 1115 |
-
|
| 1116 |
-
|
| 1117 |
-
|
| 1118 |
-
|
| 1119 |
-
|
| 1120 |
-
|
| 1121 |
-
|
| 1122 |
-
|
| 1123 |
-
|
| 1124 |
-
|
| 1125 |
-
|
| 1126 |
-
|
| 1127 |
-
|
| 1128 |
-
|
| 1129 |
-
|
| 1130 |
-
|
| 1131 |
-
|
| 1132 |
-
|
| 1133 |
-
|
| 1134 |
-
|
| 1135 |
-
|
| 1136 |
-
|
| 1137 |
-
|
| 1138 |
-
|
| 1139 |
-
|
| 1140 |
-
|
| 1141 |
-
|
| 1142 |
-
|
| 1143 |
-
|
| 1144 |
-
|
| 1145 |
-
|
| 1146 |
-
|
| 1147 |
-
|
| 1148 |
-
|
| 1149 |
-
|
| 1150 |
-
|
| 1151 |
-
|
| 1152 |
-
|
| 1153 |
-
|
| 1154 |
-
|
| 1155 |
-
|
| 1156 |
-
|
| 1157 |
-
|
| 1158 |
-
|
| 1159 |
-
|
| 1160 |
-
|
| 1161 |
-
|
| 1162 |
-
|
| 1163 |
-
|
| 1164 |
-
|
| 1165 |
-
|
| 1166 |
-
|
| 1167 |
-
|
| 1168 |
-
|
| 1169 |
-
|
| 1170 |
-
|
| 1171 |
-
|
| 1172 |
-
|
| 1173 |
-
|
| 1174 |
-
|
| 1175 |
-
|
| 1176 |
-
|
| 1177 |
-
|
| 1178 |
-
|
| 1179 |
-
|
| 1180 |
-
|
| 1181 |
-
|
| 1182 |
-
|
| 1183 |
-
|
| 1184 |
-
|
| 1185 |
-
|
| 1186 |
-
|
| 1187 |
-
|
| 1188 |
-
|
| 1189 |
-
|
| 1190 |
-
|
| 1191 |
-
|
| 1192 |
-
|
| 1193 |
-
|
| 1194 |
-
|
| 1195 |
-
|
| 1196 |
-
|
| 1197 |
-
|
| 1198 |
-
|
| 1199 |
-
|
| 1200 |
-
|
| 1201 |
-
|
| 1202 |
-
|
| 1203 |
-
|
| 1204 |
-
|
| 1205 |
-
|
| 1206 |
-
|
| 1207 |
-
|
| 1208 |
-
|
| 1209 |
-
|
| 1210 |
-
|
| 1211 |
-
|
| 1212 |
-
|
| 1213 |
-
|
| 1214 |
-
|
| 1215 |
-
|
| 1216 |
-
|
| 1217 |
-
|
| 1218 |
-
|
| 1219 |
-
|
| 1220 |
-
|
| 1221 |
-
|
| 1222 |
-
|
| 1223 |
-
|
| 1224 |
-
|
| 1225 |
-
|
| 1226 |
-
|
| 1227 |
-
|
| 1228 |
-
|
| 1229 |
-
|
| 1230 |
-
|
| 1231 |
-
|
| 1232 |
-
|
| 1233 |
-
|
| 1234 |
-
|
| 1235 |
-
|
| 1236 |
-
|
| 1237 |
-
|
| 1238 |
-
|
| 1239 |
-
|
| 1240 |
-
|
| 1241 |
-
|
| 1242 |
-
|
| 1243 |
-
|
| 1244 |
-
|
| 1245 |
-
|
| 1246 |
-
|
| 1247 |
-
|
| 1248 |
-
|
| 1249 |
-
|
| 1250 |
-
|
| 1251 |
-
|
| 1252 |
-
|
| 1253 |
-
|
| 1254 |
-
|
| 1255 |
-
|
| 1256 |
-
|
| 1257 |
-
|
| 1258 |
-
|
| 1259 |
-
|
| 1260 |
-
|
| 1261 |
-
|
| 1262 |
-
|
| 1263 |
-
|
| 1264 |
-
|
| 1265 |
-
|
| 1266 |
-
|
| 1267 |
-
|
| 1268 |
-
|
| 1269 |
-
|
| 1270 |
-
|
| 1271 |
-
|
| 1272 |
-
|
| 1273 |
-
|
| 1274 |
-
|
| 1275 |
-
|
| 1276 |
-
|
| 1277 |
-
|
| 1278 |
-
|
| 1279 |
-
|
| 1280 |
-
|
| 1281 |
-
|
| 1282 |
-
|
| 1283 |
-
|
| 1284 |
-
|
| 1285 |
-
|
| 1286 |
-
|
| 1287 |
-
|
| 1288 |
-
|
| 1289 |
-
|
| 1290 |
-
|
| 1291 |
-
|
| 1292 |
-
|
| 1293 |
-
|
| 1294 |
-
|
| 1295 |
-
|
| 1296 |
-
|
| 1297 |
-
|
| 1298 |
-
|
| 1299 |
-
|
| 1300 |
-
|
| 1301 |
-
|
| 1302 |
-
|
| 1303 |
-
|
| 1304 |
-
|
| 1305 |
-
|
| 1306 |
-
|
| 1307 |
-
|
| 1308 |
-
|
| 1309 |
-
|
| 1310 |
-
|
| 1311 |
-
|
| 1312 |
-
|
| 1313 |
-
|
| 1314 |
-
|
| 1315 |
-
|
| 1316 |
-
|
| 1317 |
-
|
| 1318 |
-
|
| 1319 |
-
|
| 1320 |
-
|
| 1321 |
-
|
| 1322 |
-
|
| 1323 |
-
|
| 1324 |
-
|
| 1325 |
-
|
| 1326 |
-
|
| 1327 |
-
|
| 1328 |
-
|
| 1329 |
-
|
| 1330 |
-
|
| 1331 |
-
|
| 1332 |
-
|
| 1333 |
-
|
| 1334 |
-
|
| 1335 |
-
|
| 1336 |
-
|
| 1337 |
-
|
| 1338 |
-
|
| 1339 |
-
|
| 1340 |
-
|
| 1341 |
-
|
| 1342 |
-
|
| 1343 |
-
|
| 1344 |
-
|
| 1345 |
-
|
| 1346 |
-
|
| 1347 |
-
|
| 1348 |
-
|
| 1349 |
-
|
| 1350 |
-
|
| 1351 |
-
|
| 1352 |
-
|
| 1353 |
-
|
| 1354 |
-
|
| 1355 |
-
|
| 1356 |
-
|
| 1357 |
-
|
| 1358 |
-
|
| 1359 |
-
|
| 1360 |
-
|
| 1361 |
-
|
| 1362 |
-
|
| 1363 |
-
|
| 1364 |
-
|
| 1365 |
-
|
| 1366 |
-
|
| 1367 |
-
|
| 1368 |
-
|
| 1369 |
-
|
| 1370 |
-
|
| 1371 |
-
|
| 1372 |
-
|
| 1373 |
-
|
| 1374 |
-
|
| 1375 |
-
|
| 1376 |
-
|
| 1377 |
-
|
| 1378 |
-
|
| 1379 |
-
|
| 1380 |
-
|
| 1381 |
-
|
| 1382 |
-
|
| 1383 |
-
|
| 1384 |
-
|
| 1385 |
-
|
| 1386 |
-
|
| 1387 |
-
|
| 1388 |
-
|
| 1389 |
-
|
| 1390 |
-
|
| 1391 |
-
|
| 1392 |
-
|
| 1393 |
-
|
| 1394 |
-
|
| 1395 |
-
|
| 1396 |
-
|
| 1397 |
-
|
| 1398 |
-
|
| 1399 |
-
|
| 1400 |
-
|
| 1401 |
-
|
| 1402 |
-
|
| 1403 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1404 |
</style>
|
| 1405 |
<script>
|
| 1406 |
// --- Drag utilities ---
|
|
@@ -3870,10 +4097,35 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
|
|
| 3870 |
</div>
|
| 3871 |
|
| 3872 |
<div class="main-content">
|
| 3873 |
-
<h1>
|
| 3874 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3875 |
<div class="artifact-preview">
|
| 3876 |
-
<img src="layer_norm/results/artifacts/combine/latency.svg" alt="Layer Norm Latency" width="800">
|
| 3877 |
</div>
|
| 3878 |
|
| 3879 |
<table>
|
|
@@ -3885,18 +4137,28 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
|
|
| 3885 |
</thead>
|
| 3886 |
<tbody>
|
| 3887 |
<tr>
|
| 3888 |
-
<td
|
| 3889 |
<td>HuggingFace kernels implementation</td>
|
| 3890 |
</tr>
|
| 3891 |
<tr>
|
| 3892 |
-
<td
|
| 3893 |
<td>PyTorch native implementation</td>
|
| 3894 |
</tr>
|
| 3895 |
</tbody>
|
| 3896 |
</table>
|
| 3897 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3898 |
<div class="artifact-preview">
|
| 3899 |
-
<img src="rotary/results/artifacts/combine/latency.svg" alt="Rotary Position Embeddings Latency" width="800">
|
| 3900 |
</div>
|
| 3901 |
|
| 3902 |
<table>
|
|
@@ -3908,18 +4170,27 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
|
|
| 3908 |
</thead>
|
| 3909 |
<tbody>
|
| 3910 |
<tr>
|
| 3911 |
-
<td
|
| 3912 |
<td>HuggingFace kernels implementation</td>
|
| 3913 |
</tr>
|
| 3914 |
<tr>
|
| 3915 |
-
<td
|
| 3916 |
<td>PyTorch native implementation</td>
|
| 3917 |
</tr>
|
| 3918 |
</tbody>
|
| 3919 |
</table>
|
| 3920 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3921 |
<div class="artifact-preview">
|
| 3922 |
-
<img src="flash_attn/results/artifacts/combine/latency.svg" alt="Flash Attention Latency" width="800">
|
| 3923 |
</div>
|
| 3924 |
|
| 3925 |
<table>
|
|
@@ -3931,34 +4202,43 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
|
|
| 3931 |
</thead>
|
| 3932 |
<tbody>
|
| 3933 |
<tr>
|
| 3934 |
-
<td
|
| 3935 |
<td>Flash Attention implementation</td>
|
| 3936 |
</tr>
|
| 3937 |
<tr>
|
| 3938 |
-
<td
|
| 3939 |
<td>HuggingFace kernels Flash Attention</td>
|
| 3940 |
</tr>
|
| 3941 |
<tr>
|
| 3942 |
-
<td
|
| 3943 |
<td>HuggingFace kernels Flash Attention 3</td>
|
| 3944 |
</tr>
|
| 3945 |
<tr>
|
| 3946 |
-
<td
|
| 3947 |
<td>Memory efficient attention implementation</td>
|
| 3948 |
</tr>
|
| 3949 |
<tr>
|
| 3950 |
-
<td
|
| 3951 |
<td>Sage attention implementation</td>
|
| 3952 |
</tr>
|
| 3953 |
<tr>
|
| 3954 |
-
<td
|
| 3955 |
<td>xFormers attention implementation</td>
|
| 3956 |
</tr>
|
| 3957 |
</tbody>
|
| 3958 |
</table>
|
| 3959 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3960 |
<div class="artifact-preview">
|
| 3961 |
-
<img src="causal_conv1d/results/artifacts/combine/latency.svg" alt="Causal Conv1D Latency" width="800">
|
| 3962 |
</div>
|
| 3963 |
|
| 3964 |
<table>
|
|
@@ -3970,18 +4250,27 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
|
|
| 3970 |
</thead>
|
| 3971 |
<tbody>
|
| 3972 |
<tr>
|
| 3973 |
-
<td
|
| 3974 |
<td>HuggingFace kernels implementation</td>
|
| 3975 |
</tr>
|
| 3976 |
<tr>
|
| 3977 |
-
<td
|
| 3978 |
<td>PyTorch native implementation</td>
|
| 3979 |
</tr>
|
| 3980 |
</tbody>
|
| 3981 |
</table>
|
| 3982 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3983 |
<div class="artifact-preview">
|
| 3984 |
-
<img src="activation/results/artifacts/combine/latency.svg" alt="Activation Latency" width="800">
|
| 3985 |
</div>
|
| 3986 |
|
| 3987 |
<table>
|
|
@@ -3993,38 +4282,77 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
|
|
| 3993 |
</thead>
|
| 3994 |
<tbody>
|
| 3995 |
<tr>
|
| 3996 |
-
<td
|
| 3997 |
<td>HuggingFace kernels SwiGLU implementation</td>
|
| 3998 |
</tr>
|
| 3999 |
<tr>
|
| 4000 |
-
<td
|
| 4001 |
<td>PyTorch native SwiGLU implementation</td>
|
| 4002 |
</tr>
|
| 4003 |
</tbody>
|
| 4004 |
</table>
|
| 4005 |
-
<
|
| 4006 |
-
<
|
| 4007 |
-
|
| 4008 |
-
|
| 4009 |
-
|
| 4010 |
-
|
| 4011 |
-
|
| 4012 |
-
|
| 4013 |
-
<
|
| 4014 |
-
<
|
| 4015 |
-
|
| 4016 |
-
|
| 4017 |
-
|
| 4018 |
-
|
| 4019 |
-
|
| 4020 |
-
|
| 4021 |
-
|
| 4022 |
-
|
| 4023 |
-
|
| 4024 |
-
|
| 4025 |
-
|
| 4026 |
-
|
| 4027 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4028 |
</div>
|
| 4029 |
|
| 4030 |
</body>
|
|
|
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
<title>index</title>
|
| 7 |
+
|
| 8 |
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 9 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
|
| 11 |
+
|
| 12 |
<script>
|
| 13 |
// Iframe-friendly navigation router
|
| 14 |
(function() {
|
|
|
|
| 92 |
</script>
|
| 93 |
<style>
|
| 94 |
:root[data-theme="light"] {
|
| 95 |
+
--bg-primary: #ffffff;
|
| 96 |
+
--bg-secondary: #f6f8fa;
|
| 97 |
+
--bg-tertiary: #f8f9fa;
|
| 98 |
+
--bg-code: #f8f9fa;
|
| 99 |
+
--bg-error: #fdf2f2;
|
| 100 |
+
--bg-artifact: #e6f3ff;
|
| 101 |
+
--bg-artifact-hover: #d0e7ff;
|
| 102 |
+
|
| 103 |
+
--text-primary: #333;
|
| 104 |
+
--text-secondary: #656d76;
|
| 105 |
+
--text-error: #c53030;
|
| 106 |
+
--text-link: #0969da;
|
| 107 |
+
|
| 108 |
+
--border-primary: #e1e5e9;
|
| 109 |
+
--border-error: #e53e3e;
|
| 110 |
+
--border-cell-failed: #d73a49;
|
| 111 |
+
|
| 112 |
+
--shadow: rgba(0, 0, 0, 0.1);
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
:root[data-theme="dark"] {
|
| 116 |
+
--bg-primary: #0a0a0a;
|
| 117 |
+
--bg-secondary: #121212;
|
| 118 |
+
--bg-tertiary: #181818;
|
| 119 |
+
--bg-code: #0d0d0d;
|
| 120 |
+
--bg-error: #1a0f0f;
|
| 121 |
+
--bg-artifact: #151515;
|
| 122 |
+
--bg-artifact-hover: #1a1a1a;
|
| 123 |
+
|
| 124 |
+
--text-primary: #e0e0e0;
|
| 125 |
+
--text-secondary: #888888;
|
| 126 |
+
--text-error: #ff6b6b;
|
| 127 |
+
--text-link: #64b5f6;
|
| 128 |
+
|
| 129 |
+
--border-primary: #2a2a2a;
|
| 130 |
+
--border-error: #ff6b6b;
|
| 131 |
+
--border-cell-failed: #ff6b6b;
|
| 132 |
+
|
| 133 |
+
--shadow: rgba(255, 255, 255, 0.05);
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
/* Monocolor UI theme: black/white background, all text/borders single blue */
|
| 137 |
+
:root[data-ui="monocolor"] {
|
| 138 |
+
--mono-color: #0a66ff;
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
:root[data-ui="monocolor"][data-theme="light"] {
|
| 142 |
+
--bg-primary: #ffffff;
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
:root[data-ui="monocolor"][data-theme="dark"] {
|
| 146 |
+
--bg-primary: #000000;
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
:root[data-ui="monocolor"] {
|
| 150 |
+
--bg-secondary: var(--bg-primary);
|
| 151 |
+
--bg-tertiary: var(--bg-primary);
|
| 152 |
+
--bg-code: var(--bg-primary);
|
| 153 |
+
--bg-error: var(--bg-primary);
|
| 154 |
+
--bg-artifact: var(--bg-primary);
|
| 155 |
+
--bg-artifact-hover: var(--bg-primary);
|
| 156 |
+
|
| 157 |
+
--text-primary: var(--mono-color);
|
| 158 |
+
--text-secondary: var(--mono-color);
|
| 159 |
+
--text-error: var(--mono-color);
|
| 160 |
+
--text-link: var(--mono-color);
|
| 161 |
+
|
| 162 |
+
--border-primary: var(--mono-color);
|
| 163 |
+
--border-error: var(--mono-color);
|
| 164 |
+
--border-cell-failed: var(--mono-color);
|
| 165 |
+
|
| 166 |
+
--shadow: none;
|
| 167 |
+
}
|
| 168 |
+
|
| 169 |
+
:root[data-ui="monocolor"] a {
|
| 170 |
+
color: var(--mono-color);
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
:root[data-ui="monocolor"] .menu-button,
|
| 174 |
+
:root[data-ui="monocolor"] .theme-toggle,
|
| 175 |
+
:root[data-ui="monocolor"] .reset-toggle,
|
| 176 |
+
:root[data-ui="monocolor"] .back-button {
|
| 177 |
+
background: var(--bg-primary);
|
| 178 |
+
color: var(--mono-color);
|
| 179 |
+
border-color: var(--mono-color);
|
| 180 |
+
}
|
| 181 |
+
|
| 182 |
+
:root[data-ui="monocolor"] .menu-button:hover,
|
| 183 |
+
:root[data-ui="monocolor"] .theme-toggle:hover,
|
| 184 |
+
:root[data-ui="monocolor"] .reset-toggle:hover,
|
| 185 |
+
:root[data-ui="monocolor"] .back-button:hover {
|
| 186 |
+
background: var(--bg-primary);
|
| 187 |
+
color: var(--mono-color);
|
| 188 |
+
border-color: var(--mono-color);
|
| 189 |
+
}
|
| 190 |
+
|
| 191 |
+
:root[data-ui="monocolor"] .menu-dropdown {
|
| 192 |
+
background: var(--bg-primary);
|
| 193 |
+
border-color: var(--mono-color);
|
| 194 |
+
box-shadow: none;
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
:root[data-ui="monocolor"] .menu-item {
|
| 198 |
+
color: var(--mono-color);
|
| 199 |
+
border-bottom-color: var(--mono-color);
|
| 200 |
+
}
|
| 201 |
+
|
| 202 |
+
:root[data-ui="monocolor"] .system-info {
|
| 203 |
+
background: var(--bg-primary);
|
| 204 |
+
border-color: var(--mono-color);
|
| 205 |
+
}
|
| 206 |
+
|
| 207 |
+
:root[data-ui="monocolor"] .cell {
|
| 208 |
+
border-color: var(--mono-color);
|
| 209 |
+
background: var(--bg-primary);
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
:root[data-ui="monocolor"] .cell-header {
|
| 213 |
+
background: var(--bg-primary);
|
| 214 |
+
border-bottom-color: var(--mono-color);
|
| 215 |
+
}
|
| 216 |
+
|
| 217 |
+
:root[data-ui="monocolor"] .artifact {
|
| 218 |
+
background: var(--bg-primary);
|
| 219 |
+
border-color: var(--mono-color);
|
| 220 |
+
color: var(--mono-color);
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
:root[data-ui="monocolor"] .artifact:hover {
|
| 224 |
+
background: var(--bg-primary);
|
| 225 |
+
}
|
| 226 |
+
|
| 227 |
+
:root[data-ui="monocolor"] .artifact-preview img,
|
| 228 |
+
:root[data-ui="monocolor"] .artifact-preview svg {
|
| 229 |
+
border-color: var(--mono-color);
|
| 230 |
+
}
|
| 231 |
+
|
| 232 |
+
:root[data-ui="monocolor"] .status-widget {
|
| 233 |
+
background: var(--bg-primary);
|
| 234 |
+
border-color: var(--mono-color);
|
| 235 |
+
color: var(--mono-color);
|
| 236 |
+
}
|
| 237 |
+
|
| 238 |
+
:root[data-ui="monocolor"] .minimap,
|
| 239 |
+
:root[data-ui="monocolor"] .file-explorer,
|
| 240 |
+
:root[data-ui="monocolor"] .tools-widget {
|
| 241 |
+
background: var(--bg-primary);
|
| 242 |
+
border-color: var(--mono-color);
|
| 243 |
+
color: var(--mono-color);
|
| 244 |
+
}
|
| 245 |
+
|
| 246 |
+
:root[data-ui="monocolor"] .cell-code {
|
| 247 |
+
background: var(--bg-primary);
|
| 248 |
+
border-bottom-color: var(--mono-color);
|
| 249 |
+
}
|
| 250 |
+
|
| 251 |
+
:root[data-ui="monocolor"] .tools-title,
|
| 252 |
+
:root[data-ui="monocolor"] .file-explorer-section-title,
|
| 253 |
+
:root[data-ui="monocolor"] .minimap-title {
|
| 254 |
+
color: var(--mono-color);
|
| 255 |
+
border-bottom-color: var(--mono-color);
|
| 256 |
+
}
|
| 257 |
+
|
| 258 |
+
:root[data-ui="monocolor"] .tool-button {
|
| 259 |
+
background: var(--bg-primary);
|
| 260 |
+
border-color: var(--mono-color);
|
| 261 |
+
color: var(--mono-color);
|
| 262 |
+
}
|
| 263 |
+
|
| 264 |
+
:root[data-ui="monocolor"] .tool-button.active {
|
| 265 |
+
border-color: var(--mono-color);
|
| 266 |
+
}
|
| 267 |
+
|
| 268 |
+
:root[data-ui="monocolor"] .file-explorer-item,
|
| 269 |
+
:root[data-ui="monocolor"] .minimap-item {
|
| 270 |
+
color: var(--mono-color);
|
| 271 |
+
}
|
| 272 |
+
|
| 273 |
+
/* Force Pygments code to mono blue on mono bg */
|
| 274 |
+
:root[data-ui="monocolor"] .highlight {
|
| 275 |
+
background: var(--bg-primary) !important;
|
| 276 |
+
color: var(--mono-color) !important;
|
| 277 |
+
}
|
| 278 |
+
|
| 279 |
+
:root[data-ui="monocolor"] .highlight *,
|
| 280 |
+
:root[data-ui="monocolor"] .highlight .hll {
|
| 281 |
+
color: var(--mono-color) !important;
|
| 282 |
+
background: transparent !important;
|
| 283 |
+
border-color: var(--mono-color) !important;
|
| 284 |
+
}
|
| 285 |
+
|
| 286 |
+
/* Default code font + metrics (overridable via frontmatter) */
|
| 287 |
+
:root {
|
| 288 |
+
--code-font-size: 0.95rem;
|
| 289 |
+
--code-line-height: 1.5;
|
| 290 |
+
--code-pad-y: 0.75rem;
|
| 291 |
+
}
|
| 292 |
+
|
| 293 |
+
/* Minimal UI theme overrides base variables for a flatter, 90s look */
|
| 294 |
+
:root[data-ui="none"] {
|
| 295 |
+
--bg-primary: #ffffff;
|
| 296 |
+
--bg-secondary: transparent;
|
| 297 |
+
--bg-tertiary: transparent;
|
| 298 |
+
--bg-code: #f9f9f9;
|
| 299 |
+
--bg-error: #fff0f0;
|
| 300 |
+
--bg-artifact: #f0f7ff;
|
| 301 |
+
--bg-artifact-hover: #e5f1ff;
|
| 302 |
+
|
| 303 |
+
--text-primary: #000000;
|
| 304 |
+
--text-secondary: #222222;
|
| 305 |
+
--text-error: #a00000;
|
| 306 |
+
--text-link: #0000ee;
|
| 307 |
+
|
| 308 |
+
--border-primary: #cccccc;
|
| 309 |
+
--border-error: #cc0000;
|
| 310 |
+
--border-cell-failed: #cc0000;
|
| 311 |
+
|
| 312 |
+
--shadow: none;
|
| 313 |
+
}
|
| 314 |
+
|
| 315 |
+
html {
|
| 316 |
+
overscroll-behavior: none;
|
| 317 |
+
}
|
| 318 |
+
|
| 319 |
+
body {
|
| 320 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace;
|
| 321 |
+
line-height: 1.4;
|
| 322 |
+
max-width: 1000px;
|
| 323 |
+
margin: 0 auto;
|
| 324 |
+
padding: 15px;
|
| 325 |
+
color: var(--text-primary);
|
| 326 |
+
background: var(--bg-primary);
|
| 327 |
+
transition: background-color 0.2s ease, color 0.2s ease;
|
| 328 |
+
overscroll-behavior: none;
|
| 329 |
+
}
|
| 330 |
+
|
| 331 |
+
/* Minimal "none" UI theme overrides */
|
| 332 |
+
:root[data-ui="none"] body {
|
| 333 |
+
font-family: 'Times New Roman', Times, serif;
|
| 334 |
+
line-height: 1.5;
|
| 335 |
+
max-width: 860px;
|
| 336 |
+
padding: 12px;
|
| 337 |
+
background: #ffffff;
|
| 338 |
+
color: #000000;
|
| 339 |
+
transition: none;
|
| 340 |
+
}
|
| 341 |
+
|
| 342 |
+
/* Two panel layout removed */
|
| 343 |
+
|
| 344 |
+
.controls {
|
| 345 |
+
position: fixed;
|
| 346 |
+
top: 20px;
|
| 347 |
+
right: 20px;
|
| 348 |
+
display: flex;
|
| 349 |
+
flex-direction: column;
|
| 350 |
+
align-items: flex-end;
|
| 351 |
+
gap: 0.25rem;
|
| 352 |
+
z-index: 1000;
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
.controls-buttons {
|
| 356 |
+
display: flex;
|
| 357 |
+
gap: 0.5rem;
|
| 358 |
+
}
|
| 359 |
+
|
| 360 |
+
.menu-button {
|
| 361 |
+
position: relative;
|
| 362 |
+
background: var(--bg-secondary);
|
| 363 |
+
border: 1px solid var(--border-primary);
|
| 364 |
+
padding: 8px 12px;
|
| 365 |
+
border-radius: 2px;
|
| 366 |
+
color: var(--text-secondary);
|
| 367 |
+
cursor: pointer;
|
| 368 |
+
font-family: inherit;
|
| 369 |
+
font-size: 0.9rem;
|
| 370 |
+
user-select: none;
|
| 371 |
+
}
|
| 372 |
+
|
| 373 |
+
/* Keep default control styling when widgets are enabled, even in minimal UI */
|
| 374 |
+
:root[data-ui="none"][data-widgets="on"] .menu-button,
|
| 375 |
+
:root[data-ui="none"][data-widgets="on"] .theme-toggle,
|
| 376 |
+
:root[data-ui="none"][data-widgets="on"] .reset-toggle,
|
| 377 |
+
:root[data-ui="none"][data-widgets="on"] .back-button {
|
| 378 |
+
background: #f6f6f6;
|
| 379 |
+
border: 1px solid #cccccc;
|
| 380 |
+
color: #222222;
|
| 381 |
+
}
|
| 382 |
+
|
| 383 |
+
.menu-button:hover {
|
| 384 |
+
color: var(--text-primary);
|
| 385 |
+
background: var(--bg-tertiary);
|
| 386 |
+
}
|
| 387 |
+
|
| 388 |
+
/* Controls state indicator (top-right) */
|
| 389 |
+
/* Status widget (bottom-right) */
|
| 390 |
+
.status-widget {
|
| 391 |
+
position: fixed;
|
| 392 |
+
right: 20px;
|
| 393 |
+
bottom: 20px;
|
| 394 |
+
width: auto;
|
| 395 |
+
max-width: 260px;
|
| 396 |
+
background: var(--bg-secondary);
|
| 397 |
+
border: 1px solid var(--border-primary);
|
| 398 |
+
border-radius: 2px;
|
| 399 |
+
padding: 6px 8px;
|
| 400 |
+
font-size: 0.8rem;
|
| 401 |
+
color: var(--text-secondary);
|
| 402 |
+
z-index: 100;
|
| 403 |
+
}
|
| 404 |
+
|
| 405 |
+
.status-widget strong {
|
| 406 |
+
color: var(--text-primary);
|
| 407 |
+
}
|
| 408 |
+
|
| 409 |
+
:root[data-ui="none"][data-widgets="on"] .status-widget {
|
| 410 |
+
background: #f6f6f6;
|
| 411 |
+
border-color: #ccc;
|
| 412 |
+
color: #222;
|
| 413 |
+
}
|
| 414 |
+
|
| 415 |
+
:root[data-ui="none"][data-widgets="on"] .menu-button:hover,
|
| 416 |
+
:root[data-ui="none"][data-widgets="on"] .theme-toggle:hover,
|
| 417 |
+
:root[data-ui="none"][data-widgets="on"] .reset-toggle:hover,
|
| 418 |
+
:root[data-ui="none"][data-widgets="on"] .back-button:hover {
|
| 419 |
+
background: #ededed;
|
| 420 |
+
border-color: #bbbbbb;
|
| 421 |
+
color: #000000;
|
| 422 |
+
}
|
| 423 |
+
|
| 424 |
+
.menu-dropdown {
|
| 425 |
+
position: absolute;
|
| 426 |
+
top: 100%;
|
| 427 |
+
right: 0;
|
| 428 |
+
background: var(--bg-secondary);
|
| 429 |
+
border: 1px solid var(--border-primary);
|
| 430 |
+
border-radius: 4px;
|
| 431 |
+
box-shadow: 0 4px 12px var(--shadow);
|
| 432 |
+
min-width: 160px;
|
| 433 |
+
opacity: 0;
|
| 434 |
+
visibility: hidden;
|
| 435 |
+
transform: translateY(-8px);
|
| 436 |
+
transition: all 0.2s ease;
|
| 437 |
+
z-index: 1001;
|
| 438 |
+
margin-top: 4px;
|
| 439 |
+
}
|
| 440 |
+
|
| 441 |
+
:root[data-ui="none"][data-widgets="on"] .menu-dropdown {
|
| 442 |
+
background: #ffffff;
|
| 443 |
+
border: 1px solid #cccccc;
|
| 444 |
+
box-shadow: none;
|
| 445 |
+
}
|
| 446 |
+
|
| 447 |
+
.menu-button.active .menu-dropdown {
|
| 448 |
+
opacity: 1;
|
| 449 |
+
visibility: visible;
|
| 450 |
+
transform: translateY(0);
|
| 451 |
+
}
|
| 452 |
+
|
| 453 |
+
.menu-item {
|
| 454 |
+
display: block;
|
| 455 |
+
padding: 8px 12px;
|
| 456 |
+
color: var(--text-secondary);
|
| 457 |
+
text-decoration: none;
|
| 458 |
+
font-size: 0.85rem;
|
| 459 |
+
border-bottom: 1px solid var(--border-primary);
|
| 460 |
+
cursor: pointer;
|
| 461 |
+
}
|
| 462 |
+
|
| 463 |
+
:root[data-ui="none"] .menu-item {
|
| 464 |
+
color: #000;
|
| 465 |
+
border-bottom: 1px solid #eee;
|
| 466 |
+
}
|
| 467 |
+
|
| 468 |
+
.menu-item:last-child {
|
| 469 |
+
border-bottom: none;
|
| 470 |
+
}
|
| 471 |
+
|
| 472 |
+
.menu-item:hover {
|
| 473 |
+
background: var(--bg-tertiary);
|
| 474 |
+
color: var(--text-primary);
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
+
.menu-checkbox {
|
| 478 |
+
display: inline-block;
|
| 479 |
+
width: 16px;
|
| 480 |
+
font-family: monospace;
|
| 481 |
+
color: var(--text-link);
|
| 482 |
+
}
|
| 483 |
+
|
| 484 |
+
.theme-toggle,
|
| 485 |
+
.reset-toggle,
|
| 486 |
+
.back-button {
|
| 487 |
+
background: var(--bg-secondary);
|
| 488 |
+
border: 1px solid var(--border-primary);
|
| 489 |
+
padding: 8px 12px;
|
| 490 |
+
border-radius: 4px;
|
| 491 |
+
color: var(--text-secondary);
|
| 492 |
+
cursor: pointer;
|
| 493 |
+
font-family: inherit;
|
| 494 |
+
font-size: 0.9rem;
|
| 495 |
+
user-select: none;
|
| 496 |
+
}
|
| 497 |
+
|
| 498 |
+
.back-button {
|
| 499 |
+
text-decoration: none;
|
| 500 |
+
display: inline-block;
|
| 501 |
+
}
|
| 502 |
+
|
| 503 |
+
.theme-toggle:hover,
|
| 504 |
+
.reset-toggle:hover,
|
| 505 |
+
.back-button:hover {
|
| 506 |
+
color: var(--text-primary);
|
| 507 |
+
background: var(--bg-tertiary);
|
| 508 |
+
}
|
| 509 |
+
|
| 510 |
+
.system-info {
|
| 511 |
+
background: var(--bg-secondary);
|
| 512 |
+
border: 1px solid var(--border-primary);
|
| 513 |
+
border-radius: 4px;
|
| 514 |
+
padding: 8px 12px;
|
| 515 |
+
margin-bottom: 16px;
|
| 516 |
+
font-size: 0.85em;
|
| 517 |
+
color: var(--text-secondary);
|
| 518 |
+
}
|
| 519 |
+
|
| 520 |
+
.system-info-header {
|
| 521 |
+
font-weight: 600;
|
| 522 |
+
color: var(--text-primary);
|
| 523 |
+
margin-bottom: 2px;
|
| 524 |
+
}
|
| 525 |
+
|
| 526 |
+
.system-info-content {
|
| 527 |
+
font-family: monospace;
|
| 528 |
+
}
|
| 529 |
+
|
| 530 |
+
.theme-toggle,
|
| 531 |
+
.reset-toggle {
|
| 532 |
+
background: var(--bg-secondary);
|
| 533 |
+
border: 1px solid var(--border-primary);
|
| 534 |
+
border-radius: 2px;
|
| 535 |
+
/* padding: 0.4rem 0.6rem; */
|
| 536 |
+
cursor: pointer;
|
| 537 |
+
font-family: inherit;
|
| 538 |
+
font-size: 0.8rem;
|
| 539 |
+
color: var(--text-secondary);
|
| 540 |
+
user-select: none;
|
| 541 |
+
transition: all 0.2s ease;
|
| 542 |
+
text-transform: lowercase;
|
| 543 |
+
letter-spacing: 0;
|
| 544 |
+
}
|
| 545 |
+
|
| 546 |
+
.theme-toggle:hover,
|
| 547 |
+
.reset-toggle:hover {
|
| 548 |
+
background: var(--bg-tertiary);
|
| 549 |
+
border-color: var(--text-secondary);
|
| 550 |
+
color: var(--text-primary);
|
| 551 |
+
}
|
| 552 |
+
|
| 553 |
+
.minimap {
|
| 554 |
+
position: fixed;
|
| 555 |
+
bottom: 20px;
|
| 556 |
+
right: 20px;
|
| 557 |
+
width: 220px;
|
| 558 |
+
max-height: 400px;
|
| 559 |
+
background: var(--bg-secondary);
|
| 560 |
+
border: 1px solid var(--border-primary);
|
| 561 |
+
border-radius: 2px;
|
| 562 |
+
padding: 0.5rem;
|
| 563 |
+
font-size: 0.7rem;
|
| 564 |
+
overflow-y: auto;
|
| 565 |
+
z-index: 100;
|
| 566 |
+
opacity: 0.9;
|
| 567 |
+
transition: opacity 0.2s ease;
|
| 568 |
+
}
|
| 569 |
+
|
| 570 |
+
/* Hide widgets and controls when disabled via frontmatter */
|
| 571 |
+
:root[data-widgets="off"] .controls,
|
| 572 |
+
:root[data-widgets="off"] .minimap,
|
| 573 |
+
:root[data-widgets="off"] .file-explorer,
|
| 574 |
+
:root[data-widgets="off"] .tools-widget,
|
| 575 |
+
:root[data-widgets="off"] .status-widget {
|
| 576 |
+
display: none !important;
|
| 577 |
+
}
|
| 578 |
+
|
| 579 |
+
.file-explorer {
|
| 580 |
+
position: fixed;
|
| 581 |
+
bottom: 20px;
|
| 582 |
+
/* default; JS will stack */
|
| 583 |
+
right: 20px;
|
| 584 |
+
left: auto;
|
| 585 |
+
top: auto;
|
| 586 |
+
width: 220px;
|
| 587 |
+
max-height: 400px;
|
| 588 |
+
background: var(--bg-secondary);
|
| 589 |
+
border: 1px solid var(--border-primary);
|
| 590 |
+
border-radius: 2px;
|
| 591 |
+
padding: 0.5rem;
|
| 592 |
+
font-size: 0.7rem;
|
| 593 |
+
overflow-y: auto;
|
| 594 |
+
z-index: 100;
|
| 595 |
+
opacity: 0.9;
|
| 596 |
+
transition: opacity 0.2s ease;
|
| 597 |
+
}
|
| 598 |
+
|
| 599 |
+
/* Drawing overlay */
|
| 600 |
+
.draw-overlay {
|
| 601 |
+
position: fixed;
|
| 602 |
+
top: 0;
|
| 603 |
+
left: 0;
|
| 604 |
+
width: 100vw;
|
| 605 |
+
height: 100vh;
|
| 606 |
+
z-index: 80;
|
| 607 |
+
/* under widgets (100) and controls (1000) */
|
| 608 |
+
display: block;
|
| 609 |
+
pointer-events: none;
|
| 610 |
+
/* enabled only when a tool is active */
|
| 611 |
+
}
|
| 612 |
+
|
| 613 |
+
/* Tools widget */
|
| 614 |
+
.tools-widget {
|
| 615 |
+
position: fixed;
|
| 616 |
+
bottom: 20px;
|
| 617 |
+
/* default; JS will stack */
|
| 618 |
+
right: 20px;
|
| 619 |
+
left: auto;
|
| 620 |
+
top: auto;
|
| 621 |
+
width: 220px;
|
| 622 |
+
background: var(--bg-secondary);
|
| 623 |
+
border: 1px solid var(--border-primary);
|
| 624 |
+
border-radius: 2px;
|
| 625 |
+
padding: 0.5rem;
|
| 626 |
+
font-size: 0.7rem;
|
| 627 |
+
z-index: 100;
|
| 628 |
+
opacity: 0.95;
|
| 629 |
+
}
|
| 630 |
+
|
| 631 |
+
.tools-title {
|
| 632 |
+
font-weight: bold;
|
| 633 |
+
color: var(--text-secondary);
|
| 634 |
+
margin-bottom: 0.5rem;
|
| 635 |
+
padding-bottom: 0.25rem;
|
| 636 |
+
border-bottom: 1px solid var(--border-primary);
|
| 637 |
+
cursor: grab;
|
| 638 |
+
user-select: none;
|
| 639 |
+
}
|
| 640 |
+
|
| 641 |
+
.tools-row {
|
| 642 |
+
display: flex;
|
| 643 |
+
gap: 0.4rem;
|
| 644 |
+
flex-wrap: wrap;
|
| 645 |
+
}
|
| 646 |
+
|
| 647 |
+
.tool-button {
|
| 648 |
+
background: var(--bg-tertiary);
|
| 649 |
+
border: 1px solid var(--border-primary);
|
| 650 |
+
border-radius: 2px;
|
| 651 |
+
padding: 0.25rem 0.4rem;
|
| 652 |
+
cursor: pointer;
|
| 653 |
+
color: var(--text-secondary);
|
| 654 |
+
font-family: inherit;
|
| 655 |
+
font-size: 0.75rem;
|
| 656 |
+
user-select: none;
|
| 657 |
+
}
|
| 658 |
+
|
| 659 |
+
.tool-button:hover {
|
| 660 |
+
color: var(--text-primary);
|
| 661 |
+
}
|
| 662 |
+
|
| 663 |
+
.tool-button.active {
|
| 664 |
+
color: var(--text-primary);
|
| 665 |
+
border-color: var(--text-secondary);
|
| 666 |
+
background: var(--bg-secondary);
|
| 667 |
+
}
|
| 668 |
+
|
| 669 |
+
.minimap:hover,
|
| 670 |
+
.file-explorer:hover {
|
| 671 |
+
opacity: 1;
|
| 672 |
+
}
|
| 673 |
+
|
| 674 |
+
.minimap-title {
|
| 675 |
+
font-weight: bold;
|
| 676 |
+
color: var(--text-secondary);
|
| 677 |
+
margin-bottom: 0.5rem;
|
| 678 |
+
padding-bottom: 0.25rem;
|
| 679 |
+
border-bottom: 1px solid var(--border-primary);
|
| 680 |
+
cursor: grab;
|
| 681 |
+
/* drag handle */
|
| 682 |
+
user-select: none;
|
| 683 |
+
}
|
| 684 |
+
|
| 685 |
+
.minimap-item {
|
| 686 |
+
display: block;
|
| 687 |
+
color: var(--text-secondary);
|
| 688 |
+
text-decoration: none;
|
| 689 |
+
padding: 0.15rem 0;
|
| 690 |
+
border-left: 2px solid transparent;
|
| 691 |
+
padding-left: 0.5rem;
|
| 692 |
+
transition: all 0.2s ease;
|
| 693 |
+
cursor: pointer;
|
| 694 |
+
}
|
| 695 |
+
|
| 696 |
+
.minimap-item:hover {
|
| 697 |
+
color: var(--text-primary);
|
| 698 |
+
border-left-color: var(--text-secondary);
|
| 699 |
+
}
|
| 700 |
+
|
| 701 |
+
.minimap-item.active {
|
| 702 |
+
color: var(--text-primary);
|
| 703 |
+
border-left-color: var(--text-link);
|
| 704 |
+
}
|
| 705 |
+
|
| 706 |
+
.minimap-heading {
|
| 707 |
+
font-weight: normal;
|
| 708 |
+
}
|
| 709 |
+
|
| 710 |
+
.minimap-heading.h1 {
|
| 711 |
+
padding-left: 0.5rem;
|
| 712 |
+
}
|
| 713 |
+
|
| 714 |
+
.minimap-heading.h2 {
|
| 715 |
+
padding-left: 1rem;
|
| 716 |
+
}
|
| 717 |
+
|
| 718 |
+
.minimap-heading.h3 {
|
| 719 |
+
padding-left: 1.5rem;
|
| 720 |
+
}
|
| 721 |
+
|
| 722 |
+
.minimap-heading.h4 {
|
| 723 |
+
padding-left: 2rem;
|
| 724 |
+
}
|
| 725 |
+
|
| 726 |
+
.minimap-heading.h5 {
|
| 727 |
+
padding-left: 2.5rem;
|
| 728 |
+
}
|
| 729 |
+
|
| 730 |
+
.minimap-heading.h6 {
|
| 731 |
+
padding-left: 3rem;
|
| 732 |
+
}
|
| 733 |
+
|
| 734 |
+
.minimap-cell {
|
| 735 |
+
color: var(--text-link);
|
| 736 |
+
opacity: 0.8;
|
| 737 |
+
font-style: italic;
|
| 738 |
+
}
|
| 739 |
+
|
| 740 |
+
.minimap-cell:hover {
|
| 741 |
+
opacity: 1;
|
| 742 |
+
}
|
| 743 |
+
|
| 744 |
+
.file-explorer-title {
|
| 745 |
+
font-weight: bold;
|
| 746 |
+
color: var(--text-secondary);
|
| 747 |
+
margin-bottom: 0.5rem;
|
| 748 |
+
padding-bottom: 0.25rem;
|
| 749 |
+
border-bottom: 1px solid var(--border-primary);
|
| 750 |
+
cursor: grab;
|
| 751 |
+
/* drag handle */
|
| 752 |
+
user-select: none;
|
| 753 |
+
}
|
| 754 |
+
|
| 755 |
+
.file-explorer-section {
|
| 756 |
+
margin-bottom: 0.75rem;
|
| 757 |
+
}
|
| 758 |
+
|
| 759 |
+
.file-explorer-section-title {
|
| 760 |
+
font-weight: bold;
|
| 761 |
+
color: var(--text-secondary);
|
| 762 |
+
font-size: 0.65rem;
|
| 763 |
+
margin-bottom: 0.25rem;
|
| 764 |
+
text-transform: uppercase;
|
| 765 |
+
letter-spacing: 0.5px;
|
| 766 |
+
}
|
| 767 |
+
|
| 768 |
+
.file-explorer-item {
|
| 769 |
+
display: block;
|
| 770 |
+
color: var(--text-secondary);
|
| 771 |
+
text-decoration: none;
|
| 772 |
+
padding: 0.1rem 0;
|
| 773 |
+
margin-left: 0.5rem;
|
| 774 |
+
transition: color 0.2s ease;
|
| 775 |
+
cursor: pointer;
|
| 776 |
+
font-family: monospace;
|
| 777 |
+
}
|
| 778 |
+
|
| 779 |
+
.file-explorer-item:hover {
|
| 780 |
+
color: var(--text-primary);
|
| 781 |
+
}
|
| 782 |
+
|
| 783 |
+
.file-explorer-item.script {
|
| 784 |
+
color: var(--text-link);
|
| 785 |
+
}
|
| 786 |
+
|
| 787 |
+
.file-explorer-item.artifact {
|
| 788 |
+
color: var(--text-secondary);
|
| 789 |
+
opacity: 0.8;
|
| 790 |
+
}
|
| 791 |
+
|
| 792 |
+
|
| 793 |
+
/* Hide widgets on smaller screens */
|
| 794 |
+
@media (max-width: 768px) {
|
| 795 |
+
|
| 796 |
+
.minimap,
|
| 797 |
+
.file-explorer,
|
| 798 |
+
.tools-widget {
|
| 799 |
+
display: none;
|
| 800 |
+
}
|
| 801 |
+
}
|
| 802 |
+
|
| 803 |
+
.cell {
|
| 804 |
+
margin: 1rem 0;
|
| 805 |
+
border: 1px solid var(--border-primary);
|
| 806 |
+
border-radius: 2px;
|
| 807 |
+
overflow: hidden;
|
| 808 |
+
background: var(--bg-secondary);
|
| 809 |
+
}
|
| 810 |
+
|
| 811 |
+
:root[data-ui="none"] .cell {
|
| 812 |
+
margin: 1em 0;
|
| 813 |
+
border: none;
|
| 814 |
+
background: transparent;
|
| 815 |
+
}
|
| 816 |
+
|
| 817 |
+
.cell-header {
|
| 818 |
+
background: var(--bg-secondary);
|
| 819 |
+
padding: 0.5rem 1rem;
|
| 820 |
+
border-bottom: 1px solid var(--border-primary);
|
| 821 |
+
font-family: inherit;
|
| 822 |
+
font-size: 0.85rem;
|
| 823 |
+
}
|
| 824 |
+
|
| 825 |
+
:root[data-ui="none"] .cell-header {
|
| 826 |
+
background: transparent;
|
| 827 |
+
border: none;
|
| 828 |
+
padding: 0;
|
| 829 |
+
font-weight: bold;
|
| 830 |
+
}
|
| 831 |
+
|
| 832 |
+
:root[data-ui="none"] .cell-content {
|
| 833 |
+
padding: 0;
|
| 834 |
+
}
|
| 835 |
+
|
| 836 |
+
:root[data-ui="none"] .copy-button,
|
| 837 |
+
:root[data-ui="none"] .collapse-indicators,
|
| 838 |
+
:root[data-ui="none"] .cell-meta,
|
| 839 |
+
:root[data-ui="none"] .cell-outputs-header {
|
| 840 |
+
display: none !important;
|
| 841 |
+
}
|
| 842 |
+
|
| 843 |
+
:root[data-ui="none"] pre,
|
| 844 |
+
:root[data-ui="none"] code {
|
| 845 |
+
font-family: Menlo, Monaco, 'Courier New', monospace;
|
| 846 |
+
}
|
| 847 |
+
|
| 848 |
+
:root[data-ui="none"] .code-content pre {
|
| 849 |
+
background: #f9f9f9;
|
| 850 |
+
border: 1px solid #ddd;
|
| 851 |
+
padding: 8px;
|
| 852 |
+
}
|
| 853 |
+
|
| 854 |
+
:root[data-ui="none"] .output {
|
| 855 |
+
background: transparent;
|
| 856 |
+
border: none;
|
| 857 |
+
padding: 0.25em 0;
|
| 858 |
+
}
|
| 859 |
+
|
| 860 |
+
color: var(--text-secondary);
|
| 861 |
+
cursor: pointer;
|
| 862 |
+
user-select: none;
|
| 863 |
+
transition: background-color 0.2s ease;
|
| 864 |
+
}
|
| 865 |
+
|
| 866 |
+
.cell-header:hover {
|
| 867 |
+
background: var(--bg-tertiary);
|
| 868 |
+
}
|
| 869 |
+
|
| 870 |
+
.collapse-indicators {
|
| 871 |
+
color: var(--text-secondary);
|
| 872 |
+
font-size: 0.8rem;
|
| 873 |
+
opacity: 0.7;
|
| 874 |
+
}
|
| 875 |
+
|
| 876 |
+
.collapse-indicators span:hover {
|
| 877 |
+
color: var(--text-primary);
|
| 878 |
+
opacity: 1;
|
| 879 |
+
}
|
| 880 |
+
|
| 881 |
+
.cell-code {
|
| 882 |
+
display: block;
|
| 883 |
+
background: var(--bg-code);
|
| 884 |
+
}
|
| 885 |
+
|
| 886 |
+
.cell-code.collapsed {
|
| 887 |
+
display: none;
|
| 888 |
+
}
|
| 889 |
+
|
| 890 |
+
.cell-code pre {
|
| 891 |
+
margin: 0;
|
| 892 |
+
padding: 0.75rem;
|
| 893 |
+
background: var(--bg-code);
|
| 894 |
+
overflow-x: auto;
|
| 895 |
+
color: var(--text-primary);
|
| 896 |
+
}
|
| 897 |
+
|
| 898 |
+
.cell-output {
|
| 899 |
+
padding: 0.75rem;
|
| 900 |
+
/* background: var(--bg-primary); */
|
| 901 |
+
background: var(--bg-secondary);
|
| 902 |
+
}
|
| 903 |
+
|
| 904 |
+
.cell-output.collapsed {
|
| 905 |
+
display: none;
|
| 906 |
+
}
|
| 907 |
+
|
| 908 |
+
.cell-stdout {
|
| 909 |
+
background: var(--bg-tertiary);
|
| 910 |
+
padding: 0.75rem;
|
| 911 |
+
border-radius: 1px;
|
| 912 |
+
/* margin: 0.25rem 0; */
|
| 913 |
+
font-family: inherit;
|
| 914 |
+
font-size: 0.9rem;
|
| 915 |
+
white-space: pre-wrap;
|
| 916 |
+
color: var(--text-primary);
|
| 917 |
+
}
|
| 918 |
+
|
| 919 |
+
.cell-stdout {
|
| 920 |
+
background: var(--bg-tertiary);
|
| 921 |
+
padding: 0.75rem;
|
| 922 |
+
border-radius: 1px;
|
| 923 |
+
font-family: inherit;
|
| 924 |
+
font-size: 0.9rem;
|
| 925 |
+
color: var(--text-primary);
|
| 926 |
+
|
| 927 |
+
/* key bits */
|
| 928 |
+
overflow: auto;
|
| 929 |
+
/* show scrollbars when needed */
|
| 930 |
+
max-width: 100%;
|
| 931 |
+
/* respects whatever layout width you give it */
|
| 932 |
+
}
|
| 933 |
+
|
| 934 |
+
.cell-stdout .stdout-text {
|
| 935 |
+
margin: 0;
|
| 936 |
+
/* reset pre default margin */
|
| 937 |
+
white-space: pre;
|
| 938 |
+
/* keep line breaks, NO wrapping */
|
| 939 |
+
display: inline-block;
|
| 940 |
+
/* shrink-to-content */
|
| 941 |
+
min-width: max-content;
|
| 942 |
+
/* allow very long lines to define intrinsic width */
|
| 943 |
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
| 944 |
+
tab-size: 2;
|
| 945 |
+
}
|
| 946 |
+
|
| 947 |
+
.cell-stderr {
|
| 948 |
+
background: var(--bg-error);
|
| 949 |
+
border-left: 2px solid var(--border-error);
|
| 950 |
+
padding: 1rem;
|
| 951 |
+
margin: 0.5rem 0;
|
| 952 |
+
font-family: inherit;
|
| 953 |
+
font-size: 0.9rem;
|
| 954 |
+
color: var(--text-error);
|
| 955 |
+
white-space: pre-wrap;
|
| 956 |
+
}
|
| 957 |
+
|
| 958 |
+
.uv-install-logs {
|
| 959 |
+
margin: 0.5rem 0;
|
| 960 |
+
}
|
| 961 |
+
|
| 962 |
+
.uv-logs-header {
|
| 963 |
+
cursor: pointer;
|
| 964 |
+
padding: 0.75rem;
|
| 965 |
+
border-left: 3px solid var(--border-color);
|
| 966 |
+
font-family: inherit;
|
| 967 |
+
font-size: 0.85rem;
|
| 968 |
+
color: var(--text-secondary);
|
| 969 |
+
user-select: none;
|
| 970 |
+
}
|
| 971 |
+
|
| 972 |
+
.uv-logs-content {
|
| 973 |
+
background: var(--bg-secondary);
|
| 974 |
+
padding: 1rem;
|
| 975 |
+
border-left: 3px solid var(--border-color);
|
| 976 |
+
white-space: pre-wrap;
|
| 977 |
+
font-family: monospace;
|
| 978 |
+
font-size: 0.85rem;
|
| 979 |
+
color: var(--text-secondary);
|
| 980 |
+
overflow-x: auto;
|
| 981 |
+
}
|
| 982 |
+
|
| 983 |
+
.cell-artifacts {
|
| 984 |
+
margin: 1rem 0;
|
| 985 |
+
}
|
| 986 |
+
|
| 987 |
+
.cell-artifacts h4 {
|
| 988 |
+
margin: 0 0 0.5rem 0;
|
| 989 |
+
color: var(--text-secondary);
|
| 990 |
+
font-size: 0.9rem;
|
| 991 |
+
}
|
| 992 |
+
|
| 993 |
+
.artifact {
|
| 994 |
+
display: inline-block;
|
| 995 |
+
background: var(--bg-artifact);
|
| 996 |
+
padding: 0.25rem 0.5rem;
|
| 997 |
+
border-radius: 1px;
|
| 998 |
+
margin: 0.25rem 0.5rem 0.25rem 0;
|
| 999 |
+
font-family: inherit;
|
| 1000 |
+
font-size: 0.8rem;
|
| 1001 |
+
color: var(--text-link);
|
| 1002 |
+
text-decoration: none;
|
| 1003 |
+
transition: background-color 0.2s ease;
|
| 1004 |
+
border: 1px solid var(--border-primary);
|
| 1005 |
+
}
|
| 1006 |
+
|
| 1007 |
+
.artifact:hover {
|
| 1008 |
+
background: var(--bg-artifact-hover);
|
| 1009 |
+
}
|
| 1010 |
+
|
| 1011 |
+
.artifact-preview {
|
| 1012 |
+
margin-top: 1rem;
|
| 1013 |
+
}
|
| 1014 |
+
|
| 1015 |
+
.artifact-preview img {
|
| 1016 |
+
max-width: 100%;
|
| 1017 |
+
height: auto;
|
| 1018 |
+
border: 1px solid var(--border-primary);
|
| 1019 |
+
border-radius: 1px;
|
| 1020 |
+
}
|
| 1021 |
+
|
| 1022 |
+
.artifact-preview svg {
|
| 1023 |
+
max-width: 100%;
|
| 1024 |
+
height: auto;
|
| 1025 |
+
border: 1px solid var(--border-primary);
|
| 1026 |
+
border-radius: 1px;
|
| 1027 |
+
display: block;
|
| 1028 |
+
}
|
| 1029 |
+
|
| 1030 |
+
/* Style SVG text elements */
|
| 1031 |
+
.artifact-preview svg g {
|
| 1032 |
+
fill: var(--text-primary) !important;
|
| 1033 |
+
}
|
| 1034 |
+
|
| 1035 |
+
/* Auto-theme SVG elements */
|
| 1036 |
+
.artifact-preview svg {
|
| 1037 |
+
background: transparent;
|
| 1038 |
+
}
|
| 1039 |
+
|
| 1040 |
+
/* Invert SVG images in dark mode */
|
| 1041 |
+
:root[data-theme="dark"] .artifact-preview img[src$=".svg"] {
|
| 1042 |
+
filter: invert(0.9) hue-rotate(180deg);
|
| 1043 |
+
}
|
| 1044 |
+
|
| 1045 |
+
/* Keep SVG images readable in monocolor mode */
|
| 1046 |
+
:root[data-ui="monocolor"] .artifact-preview img[src$=".svg"] {
|
| 1047 |
+
filter: none;
|
| 1048 |
+
}
|
| 1049 |
+
|
| 1050 |
+
/* CSV table styling */
|
| 1051 |
+
.artifact-csv {
|
| 1052 |
+
margin-top: 1rem;
|
| 1053 |
+
overflow-x: auto;
|
| 1054 |
+
}
|
| 1055 |
+
|
| 1056 |
+
.csv-table {
|
| 1057 |
+
width: 100%;
|
| 1058 |
+
border-collapse: collapse;
|
| 1059 |
+
font-size: 0.9rem;
|
| 1060 |
+
background: var(--bg-secondary);
|
| 1061 |
+
border: 1px solid var(--border-primary);
|
| 1062 |
+
border-radius: 1px;
|
| 1063 |
+
}
|
| 1064 |
+
|
| 1065 |
+
.csv-table th,
|
| 1066 |
+
.csv-table td {
|
| 1067 |
+
padding: 0.5rem 0.75rem;
|
| 1068 |
+
text-align: left;
|
| 1069 |
+
border: 1px solid var(--border-primary);
|
| 1070 |
+
}
|
| 1071 |
+
|
| 1072 |
+
.csv-table th {
|
| 1073 |
+
background: var(--bg-tertiary);
|
| 1074 |
+
font-weight: 600;
|
| 1075 |
+
color: var(--text-primary);
|
| 1076 |
+
}
|
| 1077 |
+
|
| 1078 |
+
.csv-table tbody tr:hover {
|
| 1079 |
+
background: var(--bg-artifact-hover);
|
| 1080 |
+
}
|
| 1081 |
+
|
| 1082 |
+
.artifact-csv-error {
|
| 1083 |
+
margin-top: 1rem;
|
| 1084 |
+
padding: 1rem;
|
| 1085 |
+
background: var(--bg-error);
|
| 1086 |
+
color: var(--text-error);
|
| 1087 |
+
border: 1px solid var(--border-error);
|
| 1088 |
+
border-radius: 1px;
|
| 1089 |
+
}
|
| 1090 |
+
|
| 1091 |
+
.cell-failed {
|
| 1092 |
+
border-color: var(--border-cell-failed);
|
| 1093 |
+
}
|
| 1094 |
+
|
| 1095 |
+
.cell-failed .cell-header {
|
| 1096 |
+
background: var(--bg-error);
|
| 1097 |
+
color: var(--text-error);
|
| 1098 |
+
}
|
| 1099 |
+
|
| 1100 |
+
.cell-commented {
|
| 1101 |
+
opacity: 0.6;
|
| 1102 |
+
border-style: dashed;
|
| 1103 |
+
}
|
| 1104 |
+
|
| 1105 |
+
.cell-commented .cell-header {
|
| 1106 |
+
background: var(--bg-secondary);
|
| 1107 |
+
color: var(--text-secondary);
|
| 1108 |
+
font-style: italic;
|
| 1109 |
+
}
|
| 1110 |
+
|
| 1111 |
+
.run-btn {
|
| 1112 |
+
background: var(--bg-tertiary);
|
| 1113 |
+
border: 1px solid var(--border-primary);
|
| 1114 |
+
padding: 2px 6px;
|
| 1115 |
+
border-radius: 2px;
|
| 1116 |
+
color: var(--text-secondary);
|
| 1117 |
+
cursor: pointer;
|
| 1118 |
+
font-size: 0.75em;
|
| 1119 |
+
font-family: inherit;
|
| 1120 |
+
margin-left: 4px;
|
| 1121 |
+
}
|
| 1122 |
+
|
| 1123 |
+
.run-btn:hover {
|
| 1124 |
+
color: var(--text-primary);
|
| 1125 |
+
background: var(--bg-primary);
|
| 1126 |
+
}
|
| 1127 |
+
|
| 1128 |
+
.run-btn:disabled {
|
| 1129 |
+
opacity: 0.6;
|
| 1130 |
+
cursor: not-allowed;
|
| 1131 |
+
}
|
| 1132 |
+
|
| 1133 |
+
.copy-btn {
|
| 1134 |
+
background: var(--bg-tertiary);
|
| 1135 |
+
border: 1px solid var(--border-primary);
|
| 1136 |
+
padding: 2px 6px;
|
| 1137 |
+
border-radius: 2px;
|
| 1138 |
+
color: var(--text-secondary);
|
| 1139 |
+
cursor: pointer;
|
| 1140 |
+
font-size: 0.75em;
|
| 1141 |
+
font-family: inherit;
|
| 1142 |
+
margin-left: 4px;
|
| 1143 |
+
}
|
| 1144 |
+
|
| 1145 |
+
.copy-btn:hover {
|
| 1146 |
+
color: var(--text-primary);
|
| 1147 |
+
background: var(--bg-primary);
|
| 1148 |
+
}
|
| 1149 |
+
|
| 1150 |
+
.copy-btn:disabled {
|
| 1151 |
+
opacity: 0.6;
|
| 1152 |
+
cursor: not-allowed;
|
| 1153 |
+
}
|
| 1154 |
+
|
| 1155 |
+
.copy-btn.copied {
|
| 1156 |
+
color: #4caf50;
|
| 1157 |
+
background: var(--bg-primary);
|
| 1158 |
+
border-color: #4caf50;
|
| 1159 |
+
transition: all 0.2s ease;
|
| 1160 |
+
}
|
| 1161 |
+
|
| 1162 |
+
.raw-btn {
|
| 1163 |
+
background: var(--bg-tertiary);
|
| 1164 |
+
border: 1px solid var(--border-primary);
|
| 1165 |
+
padding: 2px 6px;
|
| 1166 |
+
border-radius: 2px;
|
| 1167 |
+
color: var(--text-secondary);
|
| 1168 |
+
cursor: pointer;
|
| 1169 |
+
font-size: 0.75em;
|
| 1170 |
+
font-family: inherit;
|
| 1171 |
+
margin-left: 4px;
|
| 1172 |
+
text-decoration: none;
|
| 1173 |
+
display: inline-block;
|
| 1174 |
+
}
|
| 1175 |
+
|
| 1176 |
+
.raw-btn:hover {
|
| 1177 |
+
color: var(--text-primary);
|
| 1178 |
+
background: var(--bg-primary);
|
| 1179 |
+
text-decoration: none;
|
| 1180 |
+
}
|
| 1181 |
+
|
| 1182 |
+
.github-btn {
|
| 1183 |
+
background: var(--bg-tertiary);
|
| 1184 |
+
border: 1px solid var(--border-primary);
|
| 1185 |
+
padding: 2px 6px;
|
| 1186 |
+
border-radius: 2px;
|
| 1187 |
+
color: var(--text-secondary);
|
| 1188 |
+
cursor: pointer;
|
| 1189 |
+
font-size: 0.75em;
|
| 1190 |
+
font-family: inherit;
|
| 1191 |
+
margin-left: 4px;
|
| 1192 |
+
text-decoration: none;
|
| 1193 |
+
display: inline-block;
|
| 1194 |
+
}
|
| 1195 |
+
|
| 1196 |
+
.github-btn:hover {
|
| 1197 |
+
color: var(--text-primary);
|
| 1198 |
+
background: var(--bg-primary);
|
| 1199 |
+
text-decoration: none;
|
| 1200 |
+
}
|
| 1201 |
+
|
| 1202 |
+
.hf-btn {
|
| 1203 |
+
background: var(--bg-tertiary);
|
| 1204 |
+
border: 1px solid var(--border-primary);
|
| 1205 |
+
padding: 2px 6px;
|
| 1206 |
+
border-radius: 2px;
|
| 1207 |
+
color: var(--text-secondary);
|
| 1208 |
+
cursor: pointer;
|
| 1209 |
+
font-size: 0.75em;
|
| 1210 |
+
font-family: inherit;
|
| 1211 |
+
margin-left: 4px;
|
| 1212 |
+
text-decoration: none;
|
| 1213 |
+
display: inline-block;
|
| 1214 |
+
}
|
| 1215 |
+
|
| 1216 |
+
.hf-btn:hover {
|
| 1217 |
+
color: var(--text-primary);
|
| 1218 |
+
background: var(--bg-primary);
|
| 1219 |
+
text-decoration: none;
|
| 1220 |
+
}
|
| 1221 |
+
|
| 1222 |
+
.output-stale {
|
| 1223 |
+
opacity: 0.5;
|
| 1224 |
+
position: relative;
|
| 1225 |
+
}
|
| 1226 |
+
|
| 1227 |
+
.output-stale::after {
|
| 1228 |
+
content: '⏳ updating...';
|
| 1229 |
+
position: absolute;
|
| 1230 |
+
top: 8px;
|
| 1231 |
+
right: 8px;
|
| 1232 |
+
background: var(--bg-secondary);
|
| 1233 |
+
padding: 4px 8px;
|
| 1234 |
+
border-radius: 2px;
|
| 1235 |
+
font-size: 0.75em;
|
| 1236 |
+
color: var(--text-secondary);
|
| 1237 |
+
border: 1px solid var(--border-primary);
|
| 1238 |
+
}
|
| 1239 |
+
|
| 1240 |
+
h1,
|
| 1241 |
+
h2,
|
| 1242 |
+
h3,
|
| 1243 |
+
h4,
|
| 1244 |
+
h5,
|
| 1245 |
+
h6 {
|
| 1246 |
+
margin-top: 1.5rem;
|
| 1247 |
+
margin-bottom: 0.75rem;
|
| 1248 |
+
color: var(--text-primary);
|
| 1249 |
+
}
|
| 1250 |
+
|
| 1251 |
+
h1 {
|
| 1252 |
+
margin-top: 0;
|
| 1253 |
+
margin-bottom: 1rem;
|
| 1254 |
+
}
|
| 1255 |
+
|
| 1256 |
+
p {
|
| 1257 |
+
margin: 0.75rem 0;
|
| 1258 |
+
color: var(--text-primary);
|
| 1259 |
+
}
|
| 1260 |
+
|
| 1261 |
+
a {
|
| 1262 |
+
color: var(--text-link);
|
| 1263 |
+
}
|
| 1264 |
+
|
| 1265 |
+
img {
|
| 1266 |
+
max-width: 100%;
|
| 1267 |
+
height: auto;
|
| 1268 |
+
border-radius: 1px;
|
| 1269 |
+
box-shadow: none;
|
| 1270 |
+
}
|
| 1271 |
+
|
| 1272 |
+
pre,
|
| 1273 |
+
code {
|
| 1274 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace;
|
| 1275 |
+
font-size: var(--code-font-size);
|
| 1276 |
+
}
|
| 1277 |
+
|
| 1278 |
+
.code-wrap {
|
| 1279 |
+
position: relative;
|
| 1280 |
+
}
|
| 1281 |
+
|
| 1282 |
+
.code-line-highlight {
|
| 1283 |
+
display: none;
|
| 1284 |
+
position: absolute;
|
| 1285 |
+
left: 0;
|
| 1286 |
+
right: 0;
|
| 1287 |
+
height: 1.5em;
|
| 1288 |
+
background: rgba(255, 235, 170, 0.35);
|
| 1289 |
+
pointer-events: none;
|
| 1290 |
+
border-left: 3px solid #f4c542;
|
| 1291 |
+
}
|
| 1292 |
+
|
| 1293 |
+
.line-number {
|
| 1294 |
+
cursor: pointer;
|
| 1295 |
+
text-decoration: none;
|
| 1296 |
+
color: var(--text-secondary);
|
| 1297 |
+
padding: 0 0.25rem;
|
| 1298 |
+
}
|
| 1299 |
+
|
| 1300 |
+
.line-number.selected {
|
| 1301 |
+
background: rgba(255, 235, 170, 0.4);
|
| 1302 |
+
color: var(--text-primary);
|
| 1303 |
+
}
|
| 1304 |
+
|
| 1305 |
+
/* Line numbers */
|
| 1306 |
+
.highlight-with-lines {
|
| 1307 |
+
display: flex;
|
| 1308 |
+
}
|
| 1309 |
+
|
| 1310 |
+
.line-numbers {
|
| 1311 |
+
background: var(--bg-tertiary);
|
| 1312 |
+
padding: var(--code-pad-y) 0.5rem;
|
| 1313 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace;
|
| 1314 |
+
font-size: var(--code-font-size);
|
| 1315 |
+
line-height: var(--code-line-height);
|
| 1316 |
+
color: var(--text-secondary);
|
| 1317 |
+
user-select: none;
|
| 1318 |
+
text-align: right;
|
| 1319 |
+
border-right: 1px solid var(--border-primary);
|
| 1320 |
+
}
|
| 1321 |
+
|
| 1322 |
+
.line-numbers .line-number {
|
| 1323 |
+
display: block;
|
| 1324 |
+
line-height: var(--code-line-height);
|
| 1325 |
+
}
|
| 1326 |
+
|
| 1327 |
+
.highlight-with-lines .highlight {
|
| 1328 |
+
flex: 1;
|
| 1329 |
+
}
|
| 1330 |
+
|
| 1331 |
+
.highlight .hll {
|
| 1332 |
+
background-color: transparent;
|
| 1333 |
+
}
|
| 1334 |
+
|
| 1335 |
+
/* don't conflict with our highlight */
|
| 1336 |
+
.highlight pre {
|
| 1337 |
+
white-space: pre;
|
| 1338 |
+
margin: 0;
|
| 1339 |
+
padding: var(--code-pad-y) 0.75rem;
|
| 1340 |
+
line-height: var(--code-line-height);
|
| 1341 |
+
}
|
| 1342 |
+
|
| 1343 |
+
/* Collapsed code styling */
|
| 1344 |
+
.cell-code.collapsed {
|
| 1345 |
+
display: none;
|
| 1346 |
+
}
|
| 1347 |
+
|
| 1348 |
+
.cell-code.expanded {
|
| 1349 |
+
display: block;
|
| 1350 |
+
}
|
| 1351 |
+
|
| 1352 |
+
{
|
| 1353 |
+
% if config.collapse_code %
|
| 1354 |
+
}
|
| 1355 |
+
|
| 1356 |
+
.cell-code {
|
| 1357 |
+
display: none;
|
| 1358 |
+
}
|
| 1359 |
+
|
| 1360 |
+
{
|
| 1361 |
+
% else %
|
| 1362 |
+
}
|
| 1363 |
+
|
| 1364 |
+
.cell-code {
|
| 1365 |
+
display: block;
|
| 1366 |
+
border-bottom: 1px solid var(--border-primary);
|
| 1367 |
+
}
|
| 1368 |
+
|
| 1369 |
+
{
|
| 1370 |
+
% endif %
|
| 1371 |
+
}
|
| 1372 |
+
|
| 1373 |
+
{
|
| 1374 |
+
{
|
| 1375 |
+
pygments_css
|
| 1376 |
+
}
|
| 1377 |
+
}
|
| 1378 |
+
|
| 1379 |
+
/* Ensure our code metrics override Pygments defaults */
|
| 1380 |
+
.highlight pre {
|
| 1381 |
+
white-space: pre;
|
| 1382 |
+
margin: 0;
|
| 1383 |
+
padding: var(--code-pad-y) 0.75rem !important;
|
| 1384 |
+
line-height: var(--code-line-height) !important;
|
| 1385 |
+
font-size: var(--code-font-size) !important;
|
| 1386 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace !important;
|
| 1387 |
+
border: none;
|
| 1388 |
+
}
|
| 1389 |
+
|
| 1390 |
+
.line-numbers {
|
| 1391 |
+
line-height: var(--code-line-height) !important;
|
| 1392 |
+
}
|
| 1393 |
+
|
| 1394 |
+
.line-numbers .line-number {
|
| 1395 |
+
line-height: var(--code-line-height) !important;
|
| 1396 |
+
}
|
| 1397 |
+
|
| 1398 |
+
/* Custom CSS from frontmatter */
|
| 1399 |
+
{
|
| 1400 |
+
{
|
| 1401 |
+
config.custom_css
|
| 1402 |
+
}
|
| 1403 |
+
}
|
| 1404 |
+
|
| 1405 |
+
{
|
| 1406 |
+
# Override code font size from frontmatter (accept number as px) #
|
| 1407 |
+
}
|
| 1408 |
+
|
| 1409 |
+
{
|
| 1410 |
+
% if config.code_font_size is not none %
|
| 1411 |
+
}
|
| 1412 |
+
|
| 1413 |
+
{
|
| 1414 |
+
% if config.code_font_size is string %
|
| 1415 |
+
}
|
| 1416 |
+
|
| 1417 |
+
:root {
|
| 1418 |
+
--code-font-size: {
|
| 1419 |
+
{
|
| 1420 |
+
config.code_font_size
|
| 1421 |
+
}
|
| 1422 |
+
}
|
| 1423 |
+
|
| 1424 |
+
;
|
| 1425 |
+
}
|
| 1426 |
+
|
| 1427 |
+
{
|
| 1428 |
+
% else %
|
| 1429 |
+
}
|
| 1430 |
+
|
| 1431 |
+
:root {
|
| 1432 |
+
--code-font-size: {
|
| 1433 |
+
{
|
| 1434 |
+
config.code_font_size
|
| 1435 |
+
}
|
| 1436 |
+
}
|
| 1437 |
+
|
| 1438 |
+
px;
|
| 1439 |
+
}
|
| 1440 |
+
|
| 1441 |
+
{
|
| 1442 |
+
% endif %
|
| 1443 |
+
}
|
| 1444 |
+
|
| 1445 |
+
{
|
| 1446 |
+
% endif %
|
| 1447 |
+
}
|
| 1448 |
+
|
| 1449 |
+
/* Cursor for tools */
|
| 1450 |
+
body[data-tool="arrow"] .main-content {
|
| 1451 |
+
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%23e53935" stroke-width="2"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>') 12 12, crosshair;
|
| 1452 |
+
}
|
| 1453 |
+
|
| 1454 |
+
body[data-tool="pen"] .main-content {
|
| 1455 |
+
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%23e53935" stroke-width="2"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><circle cx="4" cy="20" r="2" fill="%23e53935"/></svg>') 4 20, pointer;
|
| 1456 |
+
}
|
| 1457 |
+
|
| 1458 |
+
body[data-tool="eraser"] .main-content {
|
| 1459 |
+
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%23e53935" stroke-width="2"><path d="M20 20H7l-7-7 7-7h13v14z"/><path d="M13 13l7-7"/><path d="M13 13L9 9"/></svg>') 12 12, auto;
|
| 1460 |
+
}
|
| 1461 |
+
|
| 1462 |
+
/* Color picker styles */
|
| 1463 |
+
.tools-section-title {
|
| 1464 |
+
font-weight: bold;
|
| 1465 |
+
color: var(--text-secondary);
|
| 1466 |
+
font-size: 0.65rem;
|
| 1467 |
+
margin: 0.75rem 0 0.5rem 0;
|
| 1468 |
+
text-transform: uppercase;
|
| 1469 |
+
letter-spacing: 0.5px;
|
| 1470 |
+
}
|
| 1471 |
+
|
| 1472 |
+
.color-row {
|
| 1473 |
+
display: grid;
|
| 1474 |
+
grid-template-columns: repeat(6, 1fr);
|
| 1475 |
+
gap: 0.25rem;
|
| 1476 |
+
margin-bottom: 0.5rem;
|
| 1477 |
+
}
|
| 1478 |
+
|
| 1479 |
+
.color-swatch {
|
| 1480 |
+
width: 18px;
|
| 1481 |
+
height: 18px;
|
| 1482 |
+
border: 2px solid var(--border-primary);
|
| 1483 |
+
border-radius: 3px;
|
| 1484 |
+
cursor: pointer;
|
| 1485 |
+
transition: all 0.2s ease;
|
| 1486 |
+
position: relative;
|
| 1487 |
+
}
|
| 1488 |
+
|
| 1489 |
+
.color-swatch:hover {
|
| 1490 |
+
transform: scale(1.1);
|
| 1491 |
+
border-color: var(--text-secondary);
|
| 1492 |
+
}
|
| 1493 |
+
|
| 1494 |
+
.color-swatch.selected {
|
| 1495 |
+
border-color: var(--text-primary);
|
| 1496 |
+
box-shadow: 0 0 0 2px var(--text-link);
|
| 1497 |
+
}
|
| 1498 |
+
|
| 1499 |
+
.color-swatch.selected::after {
|
| 1500 |
+
content: '✓';
|
| 1501 |
+
position: absolute;
|
| 1502 |
+
top: 50%;
|
| 1503 |
+
left: 50%;
|
| 1504 |
+
transform: translate(-50%, -50%);
|
| 1505 |
+
color: white;
|
| 1506 |
+
font-size: 10px;
|
| 1507 |
+
font-weight: bold;
|
| 1508 |
+
text-shadow: 1px 1px 1px black;
|
| 1509 |
+
}
|
| 1510 |
+
|
| 1511 |
+
.color-input {
|
| 1512 |
+
width: 24px;
|
| 1513 |
+
height: 24px;
|
| 1514 |
+
border: 2px solid var(--border-primary);
|
| 1515 |
+
border-radius: 3px;
|
| 1516 |
+
cursor: pointer;
|
| 1517 |
+
background: none;
|
| 1518 |
+
padding: 0;
|
| 1519 |
+
grid-column: span 2;
|
| 1520 |
+
justify-self: center;
|
| 1521 |
+
}
|
| 1522 |
+
|
| 1523 |
+
.color-input:hover {
|
| 1524 |
+
border-color: var(--text-secondary);
|
| 1525 |
+
}
|
| 1526 |
+
|
| 1527 |
+
/* Thickness slider styles */
|
| 1528 |
+
.thickness-row {
|
| 1529 |
+
display: flex;
|
| 1530 |
+
align-items: center;
|
| 1531 |
+
gap: 0.5rem;
|
| 1532 |
+
margin-top: 0.75rem;
|
| 1533 |
+
}
|
| 1534 |
+
|
| 1535 |
+
.thickness-slider {
|
| 1536 |
+
flex: 1;
|
| 1537 |
+
-webkit-appearance: none;
|
| 1538 |
+
appearance: none;
|
| 1539 |
+
height: 4px;
|
| 1540 |
+
background: var(--border-primary);
|
| 1541 |
+
border-radius: 2px;
|
| 1542 |
+
outline: none;
|
| 1543 |
+
opacity: 0.7;
|
| 1544 |
+
transition: opacity 0.2s;
|
| 1545 |
+
}
|
| 1546 |
+
|
| 1547 |
+
.thickness-slider:hover {
|
| 1548 |
+
opacity: 1;
|
| 1549 |
+
}
|
| 1550 |
+
|
| 1551 |
+
.thickness-slider::-webkit-slider-thumb {
|
| 1552 |
+
-webkit-appearance: none;
|
| 1553 |
+
appearance: none;
|
| 1554 |
+
width: 12px;
|
| 1555 |
+
height: 12px;
|
| 1556 |
+
background: var(--text-link);
|
| 1557 |
+
border-radius: 50%;
|
| 1558 |
+
cursor: pointer;
|
| 1559 |
+
}
|
| 1560 |
+
|
| 1561 |
+
.thickness-slider::-moz-range-thumb {
|
| 1562 |
+
width: 12px;
|
| 1563 |
+
height: 12px;
|
| 1564 |
+
background: var(--text-link);
|
| 1565 |
+
border-radius: 50%;
|
| 1566 |
+
cursor: pointer;
|
| 1567 |
+
border: none;
|
| 1568 |
+
}
|
| 1569 |
+
|
| 1570 |
+
.thickness-value {
|
| 1571 |
+
font-size: 0.7rem;
|
| 1572 |
+
color: var(--text-secondary);
|
| 1573 |
+
min-width: 20px;
|
| 1574 |
+
text-align: right;
|
| 1575 |
+
}
|
| 1576 |
+
|
| 1577 |
+
.highlight {
|
| 1578 |
+
background: none !important;
|
| 1579 |
+
}
|
| 1580 |
+
|
| 1581 |
+
/* Loading animations */
|
| 1582 |
+
.loading-spinner {
|
| 1583 |
+
display: inline-block;
|
| 1584 |
+
width: 16px;
|
| 1585 |
+
height: 16px;
|
| 1586 |
+
border: 2px solid var(--border-primary);
|
| 1587 |
+
border-radius: 50%;
|
| 1588 |
+
border-top-color: var(--text-link);
|
| 1589 |
+
animation: spin 1s linear infinite;
|
| 1590 |
+
margin-right: 8px;
|
| 1591 |
+
vertical-align: middle;
|
| 1592 |
+
}
|
| 1593 |
+
|
| 1594 |
+
@keyframes spin {
|
| 1595 |
+
to {
|
| 1596 |
+
transform: rotate(360deg);
|
| 1597 |
+
}
|
| 1598 |
+
}
|
| 1599 |
+
|
| 1600 |
+
.loading-skeleton {
|
| 1601 |
+
display: inline-block;
|
| 1602 |
+
background: var(--bg-tertiary);
|
| 1603 |
+
background: linear-gradient(90deg,
|
| 1604 |
+
var(--bg-tertiary) 25%,
|
| 1605 |
+
var(--bg-secondary) 50%,
|
| 1606 |
+
var(--bg-tertiary) 75%);
|
| 1607 |
+
background-size: 200% 100%;
|
| 1608 |
+
animation: loading-shimmer 2s ease-in-out infinite;
|
| 1609 |
+
border-radius: 2px;
|
| 1610 |
+
height: 1em;
|
| 1611 |
+
width: 80px;
|
| 1612 |
+
vertical-align: middle;
|
| 1613 |
+
}
|
| 1614 |
+
|
| 1615 |
+
@keyframes loading-shimmer {
|
| 1616 |
+
0% {
|
| 1617 |
+
background-position: -200% 0;
|
| 1618 |
+
}
|
| 1619 |
+
|
| 1620 |
+
100% {
|
| 1621 |
+
background-position: 200% 0;
|
| 1622 |
+
}
|
| 1623 |
+
}
|
| 1624 |
+
|
| 1625 |
+
/* Loading state for cell output */
|
| 1626 |
+
.cell-output:has(.loading-spinner) {
|
| 1627 |
+
opacity: 0.7;
|
| 1628 |
+
background: var(--bg-secondary);
|
| 1629 |
+
/* border-left: 3px solid var(--text-link); */
|
| 1630 |
+
}
|
| 1631 |
</style>
|
| 1632 |
<script>
|
| 1633 |
// --- Drag utilities ---
|
|
|
|
| 4097 |
</div>
|
| 4098 |
|
| 4099 |
<div class="main-content">
|
| 4100 |
+
<h1>KERNELS COMMUNITY BENCHMARKS</h1>
|
| 4101 |
+
<p>This report aggregates latency and performance benchmarks across core model components.<br />
|
| 4102 |
+
Each section includes:<br />
|
| 4103 |
+
- A latency visualization<br />
|
| 4104 |
+
- Links to detailed implementation benchmarks </p>
|
| 4105 |
+
<h2>TABLE OF CONTENTS</h2>
|
| 4106 |
+
<ul>
|
| 4107 |
+
<li><a href="#methodology">METHODOLOGY</a></li>
|
| 4108 |
+
<li><a href="#layer-normalization">LAYER NORMALIZATION</a></li>
|
| 4109 |
+
<li><a href="#rotary-position-embeddings">ROTARY POSITION EMBEDDINGS</a></li>
|
| 4110 |
+
<li><a href="#flash-attention">FLASH ATTENTION</a></li>
|
| 4111 |
+
<li><a href="#causal-conv1d">CAUSAL CONV1D</a></li>
|
| 4112 |
+
<li><a href="#activation-functions">ACTIVATION FUNCTIONS</a></li>
|
| 4113 |
+
<li><a href="#notes">NOTES</a></li>
|
| 4114 |
+
</ul>
|
| 4115 |
+
<h2>METHODOLOGY</h2>
|
| 4116 |
+
<p>Each benchmark is run with the <a href="https://github.com/huggingface/kernels-benchmarks">Kernels Benchmarking Framework</a> and follows these principles:<br />
|
| 4117 |
+
- a reference implementation (usually PyTorch native) is included for baseline comparison<br />
|
| 4118 |
+
- multiple input sizes and batch sizes are tested to reflect real-world usage<br />
|
| 4119 |
+
- runs are repeatable via python virtual environments and documented dependencies<br />
|
| 4120 |
+
- results are collected and visualized using standardized scripts </p>
|
| 4121 |
+
<hr />
|
| 4122 |
+
<div class="alert">
|
| 4123 |
+
<strong>Note:</strong> Latency values are measured in milliseconds (ms). Lower values indicate better performance.
|
| 4124 |
+
</div>
|
| 4125 |
+
|
| 4126 |
+
<h2>LAYER NORMALIZATION</h2>
|
| 4127 |
<div class="artifact-preview">
|
| 4128 |
+
<img src="layer_norm/results/artifacts/combine/latency.svg" alt="Layer Norm Latency" width="800">
|
| 4129 |
</div>
|
| 4130 |
|
| 4131 |
<table>
|
|
|
|
| 4137 |
</thead>
|
| 4138 |
<tbody>
|
| 4139 |
<tr>
|
| 4140 |
+
<td>HF Kernels Layer Norm</td>
|
| 4141 |
<td>HuggingFace kernels implementation</td>
|
| 4142 |
</tr>
|
| 4143 |
<tr>
|
| 4144 |
+
<td>PyTorch Layer Norm</td>
|
| 4145 |
<td>PyTorch native implementation</td>
|
| 4146 |
</tr>
|
| 4147 |
</tbody>
|
| 4148 |
</table>
|
| 4149 |
+
<p align="center">
|
| 4150 |
+
<!-- <button onclick="window.location.href='layer_norm/'" style="margin-left: 20px; padding: 10px 20px; background-color: #007bff; color: white; border: none; border-radius: 5px; cursor: pointer;"> -->
|
| 4151 |
+
<button
|
| 4152 |
+
onclick="window.location.href='layer_norm/'"
|
| 4153 |
+
class="btn">
|
| 4154 |
+
Explore Full Bench
|
| 4155 |
+
</button>
|
| 4156 |
+
</p>
|
| 4157 |
+
|
| 4158 |
+
<hr />
|
| 4159 |
+
<h2>ROTARY POSITION EMBEDDINGS</h2>
|
| 4160 |
<div class="artifact-preview">
|
| 4161 |
+
<img src="rotary/results/artifacts/combine/latency.svg" alt="Rotary Position Embeddings Latency" width="800">
|
| 4162 |
</div>
|
| 4163 |
|
| 4164 |
<table>
|
|
|
|
| 4170 |
</thead>
|
| 4171 |
<tbody>
|
| 4172 |
<tr>
|
| 4173 |
+
<td>HF Kernels Rotary</td>
|
| 4174 |
<td>HuggingFace kernels implementation</td>
|
| 4175 |
</tr>
|
| 4176 |
<tr>
|
| 4177 |
+
<td>PyTorch Rotary</td>
|
| 4178 |
<td>PyTorch native implementation</td>
|
| 4179 |
</tr>
|
| 4180 |
</tbody>
|
| 4181 |
</table>
|
| 4182 |
+
<p align="center">
|
| 4183 |
+
<button
|
| 4184 |
+
onclick="window.location.href='rotary/'"
|
| 4185 |
+
class="btn">
|
| 4186 |
+
Explore Full Bench
|
| 4187 |
+
</button>
|
| 4188 |
+
</p>
|
| 4189 |
+
|
| 4190 |
+
<hr />
|
| 4191 |
+
<h2>FLASH ATTENTION</h2>
|
| 4192 |
<div class="artifact-preview">
|
| 4193 |
+
<img src="flash_attn/results/artifacts/combine/latency.svg" alt="Flash Attention Latency" width="800">
|
| 4194 |
</div>
|
| 4195 |
|
| 4196 |
<table>
|
|
|
|
| 4202 |
</thead>
|
| 4203 |
<tbody>
|
| 4204 |
<tr>
|
| 4205 |
+
<td>Flash Attention</td>
|
| 4206 |
<td>Flash Attention implementation</td>
|
| 4207 |
</tr>
|
| 4208 |
<tr>
|
| 4209 |
+
<td>HF Kernels Flash Attention</td>
|
| 4210 |
<td>HuggingFace kernels Flash Attention</td>
|
| 4211 |
</tr>
|
| 4212 |
<tr>
|
| 4213 |
+
<td>HF Kernels Flash Attention 3</td>
|
| 4214 |
<td>HuggingFace kernels Flash Attention 3</td>
|
| 4215 |
</tr>
|
| 4216 |
<tr>
|
| 4217 |
+
<td>Memory Efficient Attention</td>
|
| 4218 |
<td>Memory efficient attention implementation</td>
|
| 4219 |
</tr>
|
| 4220 |
<tr>
|
| 4221 |
+
<td>Sage Attention</td>
|
| 4222 |
<td>Sage attention implementation</td>
|
| 4223 |
</tr>
|
| 4224 |
<tr>
|
| 4225 |
+
<td>xFormers</td>
|
| 4226 |
<td>xFormers attention implementation</td>
|
| 4227 |
</tr>
|
| 4228 |
</tbody>
|
| 4229 |
</table>
|
| 4230 |
+
<p align="center">
|
| 4231 |
+
<button
|
| 4232 |
+
onclick="window.location.href='flash_attn/'"
|
| 4233 |
+
class="btn">
|
| 4234 |
+
Explore Full Bench
|
| 4235 |
+
</button>
|
| 4236 |
+
</p>
|
| 4237 |
+
|
| 4238 |
+
<hr />
|
| 4239 |
+
<h2>CAUSAL CONV1D</h2>
|
| 4240 |
<div class="artifact-preview">
|
| 4241 |
+
<img src="causal_conv1d/results/artifacts/combine/latency.svg" alt="Causal Conv1D Latency" width="800">
|
| 4242 |
</div>
|
| 4243 |
|
| 4244 |
<table>
|
|
|
|
| 4250 |
</thead>
|
| 4251 |
<tbody>
|
| 4252 |
<tr>
|
| 4253 |
+
<td>HF Kernels Causal Conv1D</td>
|
| 4254 |
<td>HuggingFace kernels implementation</td>
|
| 4255 |
</tr>
|
| 4256 |
<tr>
|
| 4257 |
+
<td>PyTorch Causal Conv1D</td>
|
| 4258 |
<td>PyTorch native implementation</td>
|
| 4259 |
</tr>
|
| 4260 |
</tbody>
|
| 4261 |
</table>
|
| 4262 |
+
<p align="center">
|
| 4263 |
+
<button
|
| 4264 |
+
onclick="window.location.href='causal_conv1d/'"
|
| 4265 |
+
class="btn">
|
| 4266 |
+
Explore Full Bench
|
| 4267 |
+
</button>
|
| 4268 |
+
</p>
|
| 4269 |
+
|
| 4270 |
+
<hr />
|
| 4271 |
+
<h2>ACTIVATION FUNCTIONS</h2>
|
| 4272 |
<div class="artifact-preview">
|
| 4273 |
+
<img src="activation/results/artifacts/combine/latency.svg" alt="Activation Latency" width="800">
|
| 4274 |
</div>
|
| 4275 |
|
| 4276 |
<table>
|
|
|
|
| 4282 |
</thead>
|
| 4283 |
<tbody>
|
| 4284 |
<tr>
|
| 4285 |
+
<td>HF Kernels SwiGLU</td>
|
| 4286 |
<td>HuggingFace kernels SwiGLU implementation</td>
|
| 4287 |
</tr>
|
| 4288 |
<tr>
|
| 4289 |
+
<td>PyTorch SwiGLU</td>
|
| 4290 |
<td>PyTorch native SwiGLU implementation</td>
|
| 4291 |
</tr>
|
| 4292 |
</tbody>
|
| 4293 |
</table>
|
| 4294 |
+
<p align="center">
|
| 4295 |
+
<button
|
| 4296 |
+
onclick="window.location.href='activation/'"
|
| 4297 |
+
class="btn">
|
| 4298 |
+
Explore Full Bench
|
| 4299 |
+
</button>
|
| 4300 |
+
</p>
|
| 4301 |
+
|
| 4302 |
+
<hr />
|
| 4303 |
+
<style>
|
| 4304 |
+
.controls {
|
| 4305 |
+
display: none !important;
|
| 4306 |
+
}
|
| 4307 |
+
.status-widget {
|
| 4308 |
+
display: none !important;
|
| 4309 |
+
}
|
| 4310 |
+
table {
|
| 4311 |
+
width: 100%;
|
| 4312 |
+
border-collapse: collapse;
|
| 4313 |
+
font-size: 0.9rem;
|
| 4314 |
+
background: var(--bg-secondary);
|
| 4315 |
+
border: 1px solid var(--border-primary);
|
| 4316 |
+
border-radius: 1px;
|
| 4317 |
+
}
|
| 4318 |
+
table th,
|
| 4319 |
+
table td {
|
| 4320 |
+
padding: 0.5rem 0.75rem;
|
| 4321 |
+
text-align: left;
|
| 4322 |
+
border: 1px solid var(--border-primary);
|
| 4323 |
+
}
|
| 4324 |
+
table th {
|
| 4325 |
+
background: var(--bg-tertiary);
|
| 4326 |
+
font-weight: 600;
|
| 4327 |
+
color: var(--text-primary);
|
| 4328 |
+
}
|
| 4329 |
+
table tbody tr:hover {
|
| 4330 |
+
background: var(--bg-artifact-hover);
|
| 4331 |
+
}
|
| 4332 |
+
.btn {
|
| 4333 |
+
margin: 10px 0;
|
| 4334 |
+
padding: 10px 20px;
|
| 4335 |
+
background-color: transparent;
|
| 4336 |
+
color: inherit;
|
| 4337 |
+
border: 1px solid var(--text-primary);
|
| 4338 |
+
border-radius: 5px;
|
| 4339 |
+
cursor: pointer;
|
| 4340 |
+
}
|
| 4341 |
+
.btn:hover {
|
| 4342 |
+
background-color: var(--bg-artifact-hover);
|
| 4343 |
+
}
|
| 4344 |
+
:root {
|
| 4345 |
+
--bg-alert: #0069cbff;
|
| 4346 |
+
--border-alert: #001628ff;
|
| 4347 |
+
}
|
| 4348 |
+
.alert {
|
| 4349 |
+
padding: 5px;
|
| 4350 |
+
background-color: var(--bg-alert);
|
| 4351 |
+
border-left: 6px solid var(--border-alert);
|
| 4352 |
+
margin-bottom: 10px;
|
| 4353 |
+
border-radius: 6px;
|
| 4354 |
+
}
|
| 4355 |
+
</style>
|
| 4356 |
</div>
|
| 4357 |
|
| 4358 |
</body>
|
layer_norm/impls/artifacts/benchmark/layer_norm.jsonl
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
{"ts": "2025-10-
|
| 2 |
-
{"ts": "2025-10-
|
| 3 |
-
{"ts": "2025-10-
|
| 4 |
-
{"ts": "2025-10-
|
|
|
|
| 1 |
+
{"ts": "2025-10-30T15:53:20Z", "run": "43d96fd4ebe14ca496dc9089d5327f41", "impl": "hf_kernels_layer_norm", "tags": {"family": "hf-kernels", "repo": "kernels-community/layer-norm", "op": "layer_norm"}, "wl": {"name": "LN_B16_S2048_D4096", "batch": 16, "seq_len": 2048, "hidden_dim": 4096, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.8346939999910319, "p50": 0.8380950000059784, "p90": 0.838174000023173, "mean": 0.8376522000048681, "iqr": 0.0016900000332498166, "raw_times": [0.8346939999910319, 0.8364839999899232, 0.8408140000142339, 0.838174000023173, 0.8380950000059784], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.8434949999696073, "peak_bytes": 2415935488, "ok": true, "absmax": 0.03125, "corr": {"ok": true, "rtol": 0.001, "atol": 0.03125, "absmax": 0.03125, "mae": 0.0015411376953125, "mse": 1.1205673217773438e-05, "ref": "layer_norm_ref"}, "err": null}
|
| 2 |
+
{"ts": "2025-10-30T15:53:20Z", "run": "43d96fd4ebe14ca496dc9089d5327f41", "impl": "hf_kernels_layer_norm", "tags": {"family": "hf-kernels", "repo": "kernels-community/layer-norm", "op": "layer_norm"}, "wl": {"name": "LN_B16_S2048_D8192", "batch": 16, "seq_len": 2048, "hidden_dim": 8192, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 1.6432289999670502, "p50": 1.649038999971708, "p90": 1.6514490000076876, "mean": 1.6484529999956976, "iqr": 0.006049999967672193, "raw_times": [1.649038999971708, 1.6531489999920268, 1.6453990000400154, 1.6432289999670502, 1.6514490000076876], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 1.660748999995576, "peak_bytes": 4831870976, "ok": true, "absmax": 0.03125, "corr": {"ok": true, "rtol": 0.001, "atol": 0.03125, "absmax": 0.03125, "mae": 0.0015106201171875, "mse": 1.1086463928222656e-05, "ref": "layer_norm_ref"}, "err": null}
|
| 3 |
+
{"ts": "2025-10-30T15:53:20Z", "run": "43d96fd4ebe14ca496dc9089d5327f41", "impl": "hf_kernels_layer_norm", "tags": {"family": "hf-kernels", "repo": "kernels-community/layer-norm", "op": "layer_norm"}, "wl": {"name": "LN_B16_S4096_D4096", "batch": 16, "seq_len": 4096, "hidden_dim": 4096, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 1.639337999961299, "p50": 1.64666899996746, "p90": 1.647079000008489, "mean": 1.645640799983994, "iqr": 0.0004199999921183917, "raw_times": [1.64666899996746, 1.6484589999663513, 1.639337999961299, 1.647079000008489, 1.6466590000163706], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 1.6403390000050422, "peak_bytes": 4831854592, "ok": true, "absmax": 0.03125, "corr": {"ok": true, "rtol": 0.001, "atol": 0.03125, "absmax": 0.03125, "mae": 0.0015411376953125, "mse": 1.1205673217773438e-05, "ref": "layer_norm_ref"}, "err": null}
|
| 4 |
+
{"ts": "2025-10-30T15:53:21Z", "run": "43d96fd4ebe14ca496dc9089d5327f41", "impl": "hf_kernels_layer_norm", "tags": {"family": "hf-kernels", "repo": "kernels-community/layer-norm", "op": "layer_norm"}, "wl": {"name": "LN_B16_S4096_D8192", "batch": 16, "seq_len": 4096, "hidden_dim": 8192, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 3.2456669999874066, "p50": 3.2605380000063633, "p90": 3.2625569999709114, "mean": 3.2589550000011513, "iqr": 0.014490999944882788, "raw_times": [3.2456669999874066, 3.2625569999709114, 3.2605380000063633, 3.277947000015047, 3.2480660000260286], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 3.260236999949484, "peak_bytes": 9663709184, "ok": true, "absmax": 0.03125, "corr": {"ok": true, "rtol": 0.001, "atol": 0.03125, "absmax": 0.03125, "mae": 0.0015106201171875, "mse": 1.1026859283447266e-05, "ref": "layer_norm_ref"}, "err": null}
|
layer_norm/impls/cells/benchmark.py
CHANGED
|
@@ -3,6 +3,7 @@
|
|
| 3 |
# dependencies = [
|
| 4 |
# "numpy",
|
| 5 |
# "torch==2.8.0",
|
|
|
|
| 6 |
# "kernels-benchmark-tools",
|
| 7 |
# ]
|
| 8 |
#
|
|
@@ -12,15 +13,37 @@
|
|
| 12 |
import torch
|
| 13 |
import sys
|
| 14 |
from kernels_benchmark_tools import KernelTypeEnum, run_benchmark
|
|
|
|
| 15 |
|
|
|
|
|
|
|
| 16 |
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
|
| 21 |
run_benchmark(
|
| 22 |
kernel_type=KernelTypeEnum.LAYER_NORM,
|
| 23 |
-
impl_name="
|
| 24 |
-
impl_tags={"family": "
|
| 25 |
-
impl_func=
|
| 26 |
)
|
|
|
|
| 3 |
# dependencies = [
|
| 4 |
# "numpy",
|
| 5 |
# "torch==2.8.0",
|
| 6 |
+
# "kernels",
|
| 7 |
# "kernels-benchmark-tools",
|
| 8 |
# ]
|
| 9 |
#
|
|
|
|
| 13 |
import torch
|
| 14 |
import sys
|
| 15 |
from kernels_benchmark_tools import KernelTypeEnum, run_benchmark
|
| 16 |
+
from kernels import get_kernel
|
| 17 |
|
| 18 |
+
# Load the layer norm kernel
|
| 19 |
+
layer_norm_kernel = get_kernel("kernels-community/layer-norm")
|
| 20 |
|
| 21 |
+
|
| 22 |
+
def hf_kernels_layer_norm(x, weight, bias, eps: float = 1e-5):
|
| 23 |
+
B, S, D = x.shape
|
| 24 |
+
# The kernel expects [N, D] input; support beta (bias) if provided.
|
| 25 |
+
out = layer_norm_kernel.dropout_add_ln_fwd(
|
| 26 |
+
input=x.view(-1, D),
|
| 27 |
+
gamma=weight,
|
| 28 |
+
beta=bias,
|
| 29 |
+
rowscale=None,
|
| 30 |
+
colscale=None,
|
| 31 |
+
x0_subset=None,
|
| 32 |
+
z_subset=None,
|
| 33 |
+
dropout_p=0.0,
|
| 34 |
+
epsilon=eps,
|
| 35 |
+
rowscale_const=1.0,
|
| 36 |
+
z_numrows=S,
|
| 37 |
+
gen=None,
|
| 38 |
+
residual_in_fp32=False,
|
| 39 |
+
is_rms_norm=False,
|
| 40 |
+
)[0].view(B, S, D)
|
| 41 |
+
return out
|
| 42 |
|
| 43 |
|
| 44 |
run_benchmark(
|
| 45 |
kernel_type=KernelTypeEnum.LAYER_NORM,
|
| 46 |
+
impl_name="hf_kernels_layer_norm",
|
| 47 |
+
impl_tags={"family": "hf-kernels", "repo": "kernels-community/layer-norm", "op": "layer_norm"},
|
| 48 |
+
impl_func=hf_kernels_layer_norm,
|
| 49 |
)
|
layer_norm/impls/hf_kernels_layer_norm.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
layer_norm/impls/torch_layer_norm.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
layer_norm/results/artifacts/combine/latency.svg
CHANGED
|
|
Git LFS Details
|
|
|
Git LFS Details
|
layer_norm/results/combined_results.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
rotary/impls/artifacts/benchmark/rotary.jsonl
CHANGED
|
@@ -1,24 +1,24 @@
|
|
| 1 |
-
{"ts": "2025-10-
|
| 2 |
-
{"ts": "2025-10-
|
| 3 |
-
{"ts": "2025-10-
|
| 4 |
-
{"ts": "2025-10-
|
| 5 |
-
{"ts": "2025-10-
|
| 6 |
-
{"ts": "2025-10-
|
| 7 |
-
{"ts": "2025-10-
|
| 8 |
-
{"ts": "2025-10-
|
| 9 |
-
{"ts": "2025-10-
|
| 10 |
-
{"ts": "2025-10-
|
| 11 |
-
{"ts": "2025-10-
|
| 12 |
-
{"ts": "2025-10-
|
| 13 |
-
{"ts": "2025-10-
|
| 14 |
-
{"ts": "2025-10-
|
| 15 |
-
{"ts": "2025-10-
|
| 16 |
-
{"ts": "2025-10-
|
| 17 |
-
{"ts": "2025-10-
|
| 18 |
-
{"ts": "2025-10-
|
| 19 |
-
{"ts": "2025-10-
|
| 20 |
-
{"ts": "2025-10-
|
| 21 |
-
{"ts": "2025-10-
|
| 22 |
-
{"ts": "2025-10-
|
| 23 |
-
{"ts": "2025-10-
|
| 24 |
-
{"ts": "2025-10-
|
|
|
|
| 1 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S128_H8_D64_R32", "batch": 1, "seqlen": 128, "num_heads": 8, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.17100299999128765, "p50": 0.1746739999930469, "p90": 0.1748229999520845, "mean": 0.17718919998515048, "iqr": 0.0008499999921696144, "raw_times": [0.1739729999599149, 0.19147300002941847, 0.17100299999128765, 0.1748229999520845, 0.1746739999930469], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.1834729999927731, "peak_bytes": 1720320, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 2 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S128_H8_D128_R64", "batch": 1, "seqlen": 128, "num_heads": 8, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.2229240000133359, "p50": 0.22586399995816464, "p90": 0.2263739999648351, "mean": 0.2256739999893398, "iqr": 0.0011099999710495467, "raw_times": [0.2229240000133359, 0.22586399995816464, 0.2263739999648351, 0.22526399999378555, 0.22794400001657777], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22923400001673144, "peak_bytes": 3440640, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 3 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S128_H32_D64_R32", "batch": 1, "seqlen": 128, "num_heads": 32, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22077400001307979, "p50": 0.2269739999860576, "p90": 0.2270040000098561, "mean": 0.2274739999961639, "iqr": 0.0016900000332498166, "raw_times": [0.22531399997660628, 0.2269739999860576, 0.23730399999521978, 0.22077400001307979, 0.2270040000098561], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.23222400000122434, "peak_bytes": 6832128, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 4 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S128_H32_D128_R64", "batch": 1, "seqlen": 128, "num_heads": 32, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.21741400001928923, "p50": 0.2200139999786188, "p90": 0.22255300001461364, "mean": 0.22600780001766907, "iqr": 0.0031789999752618314, "raw_times": [0.2200139999786188, 0.21741400001928923, 0.22255300001461364, 0.2193740000393518, 0.25068400003647184], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22356400000944632, "peak_bytes": 13664256, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 5 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S512_H8_D64_R32", "batch": 1, "seqlen": 512, "num_heads": 8, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22311399999352943, "p50": 0.22467400003733928, "p90": 0.22555399999646397, "mean": 0.22520960002339052, "iqr": 0.0019609999526437605, "raw_times": [0.22555399999646397, 0.22467400003733928, 0.2291130000457997, 0.22311399999352943, 0.2235930000438202], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.23042399999440022, "peak_bytes": 6881280, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 6 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S512_H8_D128_R64", "batch": 1, "seqlen": 512, "num_heads": 8, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.21832400000221241, "p50": 0.21977400001560454, "p90": 0.22210299999869676, "mean": 0.22257580001223687, "iqr": 0.002768999991076271, "raw_times": [0.21832400000221241, 0.22210299999869676, 0.23334400003705014, 0.2193340000076205, 0.21977400001560454], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.23037299996531146, "peak_bytes": 13762560, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 7 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S512_H32_D64_R32", "batch": 1, "seqlen": 512, "num_heads": 32, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.21834399996123466, "p50": 0.22027399995749875, "p90": 0.22137399997745888, "mean": 0.22062599997525467, "iqr": 0.00113999999484804, "raw_times": [0.22290399999747024, 0.22027399995749875, 0.22137399997745888, 0.22023399998261084, 0.21834399996123466], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22569399999383677, "peak_bytes": 27328512, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 8 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S512_H32_D128_R64", "batch": 1, "seqlen": 512, "num_heads": 32, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22165399997220447, "p50": 0.22276400000009744, "p90": 0.2233839999803422, "mean": 0.22286399999984496, "iqr": 0.0009499999578110874, "raw_times": [0.2224340000225311, 0.22165399997220447, 0.2233839999803422, 0.22276400000009744, 0.2240840000240496], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.2297839999982898, "peak_bytes": 54657024, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 9 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S2048_H8_D64_R32", "batch": 1, "seqlen": 2048, "num_heads": 8, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22094399997740766, "p50": 0.22392400001081114, "p90": 0.226194999981999, "mean": 0.22451620000083494, "iqr": 0.003770999967400712, "raw_times": [0.22094399997740766, 0.22392400001081114, 0.22909400001935865, 0.226194999981999, 0.22242400001459828], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22784399999409288, "peak_bytes": 27525120, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 10 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S2048_H8_D128_R64", "batch": 1, "seqlen": 2048, "num_heads": 8, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22157400002242866, "p50": 0.22411399999100468, "p90": 0.22636400001374568, "mean": 0.22692980001011165, "iqr": 0.0029010000162088545, "raw_times": [0.22346299999753683, 0.22636400001374568, 0.2391340000258424, 0.22157400002242866, 0.22411399999100468], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22614400000975365, "peak_bytes": 55050240, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 11 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S2048_H32_D64_R32", "batch": 1, "seqlen": 2048, "num_heads": 32, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22298400000408947, "p50": 0.2238440000041919, "p90": 0.225143999955435, "mean": 0.22477019999769254, "iqr": 0.0013799999578623101, "raw_times": [0.22376399999757268, 0.22298400000408947, 0.22811500002717366, 0.225143999955435, 0.2238440000041919], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22483399999373432, "peak_bytes": 109314048, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 12 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B1_S2048_H32_D128_R64", "batch": 1, "seqlen": 2048, "num_heads": 32, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22621400000844005, "p50": 0.22858399995584477, "p90": 0.22970399999167057, "mean": 0.22850999999945998, "iqr": 0.003459999959432025, "raw_times": [0.22624400003223855, 0.22858399995584477, 0.22621400000844005, 0.23180400000910595, 0.22970399999167057], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22907400000349298, "peak_bytes": 218628096, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 13 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S128_H8_D64_R32", "batch": 2, "seqlen": 128, "num_heads": 8, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22101400003293747, "p50": 0.224504000016168, "p90": 0.22463400000560796, "mean": 0.22994020000624005, "iqr": 0.0010800000040944724, "raw_times": [0.22101400003293747, 0.22463400000560796, 0.2559949999749733, 0.224504000016168, 0.2235540000015135], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.2261639999687759, "peak_bytes": 68698112, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 14 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S128_H8_D128_R64", "batch": 2, "seqlen": 128, "num_heads": 8, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22005400001035014, "p50": 0.22374300004912584, "p90": 0.22502399997392786, "mean": 0.2236157999959687, "iqr": 0.0018200000226897828, "raw_times": [0.22374300004912584, 0.2260539999952016, 0.22320399995123807, 0.22502399997392786, 0.22005400001035014], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.2302039999904082, "peak_bytes": 6848512, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 15 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S128_H32_D64_R32", "batch": 2, "seqlen": 128, "num_heads": 32, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22128399996290682, "p50": 0.22392400001081114, "p90": 0.22476399999504793, "mean": 0.22437599998283986, "iqr": 0.0009500000146545062, "raw_times": [0.22381399998039342, 0.22809399996503998, 0.22476399999504793, 0.22392400001081114, 0.22128399996290682], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.23023399995736327, "peak_bytes": 13647872, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 16 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S128_H32_D128_R64", "batch": 2, "seqlen": 128, "num_heads": 32, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.21981399999049245, "p50": 0.22491400000035355, "p90": 0.2271139999834304, "mean": 0.2256657999851086, "iqr": 0.0057999999967250915, "raw_times": [0.2213139999867053, 0.2351729999645613, 0.21981399999049245, 0.22491400000035355, 0.2271139999834304], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22896399997307526, "peak_bytes": 27295744, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 17 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S512_H8_D64_R32", "batch": 2, "seqlen": 512, "num_heads": 8, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.2212340000369295, "p50": 0.22300300003053053, "p90": 0.22370400000681911, "mean": 0.2228398000170273, "iqr": 0.0018700000055105193, "raw_times": [0.22300300003053053, 0.22370400000681911, 0.22442400000954876, 0.2212340000369295, 0.2218340000013086], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.24375499998541272, "peak_bytes": 13697024, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 18 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S512_H8_D128_R64", "batch": 2, "seqlen": 512, "num_heads": 8, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.21925400000100126, "p50": 0.22213400001191985, "p90": 0.2221839999947406, "mean": 0.22427599999446102, "iqr": 0.0003700000092976552, "raw_times": [0.22181399998544293, 0.23599399997920045, 0.21925400000100126, 0.22213400001191985, 0.2221839999947406], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.255094999999983, "peak_bytes": 27394048, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 19 |
+
{"ts": "2025-10-30T15:53:24Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S512_H32_D64_R32", "batch": 2, "seqlen": 512, "num_heads": 32, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22207399996432287, "p50": 0.22611399998595516, "p90": 0.22614400000975365, "mean": 0.22540399997978966, "iqr": 0.0004800000397153781, "raw_times": [0.22611399998595516, 0.22207399996432287, 0.22702399996887834, 0.22614400000975365, 0.22566399997003828], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.24224399999184243, "peak_bytes": 54591488, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 20 |
+
{"ts": "2025-10-30T15:53:25Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S512_H32_D128_R64", "batch": 2, "seqlen": 512, "num_heads": 32, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.21955500000103711, "p50": 0.2238039999724606, "p90": 0.22417399998175824, "mean": 0.229038399993442, "iqr": 0.0011799999697359453, "raw_times": [0.2238039999724606, 0.22417399998175824, 0.25466499999993175, 0.2229940000120223, 0.21955500000103711], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.23440400002527895, "peak_bytes": 109182976, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 21 |
+
{"ts": "2025-10-30T15:53:25Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S2048_H8_D64_R32", "batch": 2, "seqlen": 2048, "num_heads": 8, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.2215840000303615, "p50": 0.22219400000267342, "p90": 0.22536399995942702, "mean": 0.22351999999727923, "iqr": 0.0037099999303791265, "raw_times": [0.2215840000303615, 0.22219400000267342, 0.22680399996488632, 0.22536399995942702, 0.2216540000290479], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22727300000724426, "peak_bytes": 54788096, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 22 |
+
{"ts": "2025-10-30T15:53:25Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S2048_H8_D128_R64", "batch": 2, "seqlen": 2048, "num_heads": 8, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.22125399999595174, "p50": 0.22540399999115834, "p90": 0.23793399998339737, "mean": 0.23205199998983517, "iqr": 0.012690000005477486, "raw_times": [0.2504240000007485, 0.22524399997791988, 0.22125399999595174, 0.23793399998339737, 0.22540399999115834], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22909400001935865, "peak_bytes": 109576192, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 23 |
+
{"ts": "2025-10-30T15:53:25Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S2048_H32_D64_R32", "batch": 2, "seqlen": 2048, "num_heads": 32, "head_dim": 64, "rotary_dim": 32, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.2288640000074338, "p50": 0.2294729999903211, "p90": 0.22959400001809627, "mean": 0.2293698000016775, "iqr": 0.0005100000066704524, "raw_times": [0.22959400001809627, 0.2294729999903211, 0.22983399998111054, 0.2288640000074338, 0.22908400001142581], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.22990399997979694, "peak_bytes": 218365952, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
| 24 |
+
{"ts": "2025-10-30T15:53:25Z", "run": "2249f950b26b464fbf028ad8f9536606", "impl": "torch_eager", "tags": {"family": "pytorch", "backend": "eager"}, "wl": {"name": "cuda_B2_S2048_H32_D128_R64", "batch": 2, "seqlen": 2048, "num_heads": 32, "head_dim": 128, "rotary_dim": 64, "dtype": "bfloat16", "device": "cuda", "seed": 0}, "env": {"torch": "2.8.0+cu128", "cuda": "12.8", "gpu": "NVIDIA L40S", "sm": "8.9", "py": "3.11.14", "plat": "Linux-5.10.244-240.970.amzn2.x86_64-x86_64-with-glibc2.35"}, "lat_ms": {"p10": 0.6347010000240516, "p50": 0.6367309999859572, "p90": 0.6407210000247687, "mean": 0.6405370000038602, "iqr": 0.004560000036235579, "raw_times": [0.6543709999959901, 0.6347010000240516, 0.6407210000247687, 0.6367309999859572, 0.6361609999885331], "has_warnings": false, "reps": 5, "warmup": 2}, "compile_ms": 0.6394609999915701, "peak_bytes": 436731904, "ok": true, "absmax": null, "corr": {"ok": true, "rtol": 0.003, "atol": 0.005, "absmax_q": 0.0, "absmax_k": 0.0, "mae_q": 0.0, "mae_k": 0.0, "mse_q": 0.0, "mse_k": 0.0, "ref": "rotary_torch"}, "err": null}
|
rotary/impls/cells/benchmark.py
CHANGED
|
@@ -4,7 +4,6 @@
|
|
| 4 |
# "numpy",
|
| 5 |
# "torch==2.8.0",
|
| 6 |
# "kernels-benchmark-tools",
|
| 7 |
-
# "kernels",
|
| 8 |
# ]
|
| 9 |
#
|
| 10 |
# [tool.uv.sources]
|
|
@@ -13,36 +12,46 @@
|
|
| 13 |
import torch
|
| 14 |
import sys
|
| 15 |
from kernels_benchmark_tools import KernelTypeEnum, run_benchmark
|
| 16 |
-
from kernels import get_kernel
|
| 17 |
|
| 18 |
-
# Load the rotary kernel
|
| 19 |
-
rotary = get_kernel("kernels-community/rotary")
|
| 20 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
-
|
|
|
|
| 23 |
rotary_dim = cos.shape[-1]
|
| 24 |
|
| 25 |
-
# Clone to avoid modifying
|
| 26 |
q_out = query.clone()
|
| 27 |
k_out = key.clone()
|
| 28 |
|
| 29 |
# Apply rotation to query
|
| 30 |
q1 = q_out[..., :rotary_dim]
|
| 31 |
q2 = q_out[..., rotary_dim : 2 * rotary_dim]
|
| 32 |
-
|
|
|
|
|
|
|
| 33 |
|
| 34 |
# Apply rotation to key
|
| 35 |
k1 = k_out[..., :rotary_dim]
|
| 36 |
k2 = k_out[..., rotary_dim : 2 * rotary_dim]
|
| 37 |
-
|
|
|
|
|
|
|
| 38 |
|
| 39 |
return q_out, k_out
|
| 40 |
|
| 41 |
|
| 42 |
run_benchmark(
|
| 43 |
kernel_type=KernelTypeEnum.ROTARY,
|
| 44 |
-
impl_name="
|
| 45 |
-
impl_tags={"family": "
|
| 46 |
-
impl_func=
|
| 47 |
-
dtype="float32",
|
| 48 |
)
|
|
|
|
| 4 |
# "numpy",
|
| 5 |
# "torch==2.8.0",
|
| 6 |
# "kernels-benchmark-tools",
|
|
|
|
| 7 |
# ]
|
| 8 |
#
|
| 9 |
# [tool.uv.sources]
|
|
|
|
| 12 |
import torch
|
| 13 |
import sys
|
| 14 |
from kernels_benchmark_tools import KernelTypeEnum, run_benchmark
|
|
|
|
| 15 |
|
|
|
|
|
|
|
| 16 |
|
| 17 |
+
def apply_rotary_torch(x1, x2, cos, sin, conj=False):
|
| 18 |
+
"""Reference rotary implementation."""
|
| 19 |
+
if not conj:
|
| 20 |
+
out1 = x1 * cos - x2 * sin
|
| 21 |
+
out2 = x1 * sin + x2 * cos
|
| 22 |
+
else:
|
| 23 |
+
out1 = x1 * cos + x2 * sin
|
| 24 |
+
out2 = -x1 * sin + x2 * cos
|
| 25 |
+
return out1, out2
|
| 26 |
|
| 27 |
+
|
| 28 |
+
def torch_rotary(query, key, cos, sin, conj=False):
|
| 29 |
rotary_dim = cos.shape[-1]
|
| 30 |
|
| 31 |
+
# Clone inputs to avoid modifying them
|
| 32 |
q_out = query.clone()
|
| 33 |
k_out = key.clone()
|
| 34 |
|
| 35 |
# Apply rotation to query
|
| 36 |
q1 = q_out[..., :rotary_dim]
|
| 37 |
q2 = q_out[..., rotary_dim : 2 * rotary_dim]
|
| 38 |
+
q_out_1, q_out_2 = apply_rotary_torch(q1, q2, cos, sin, conj)
|
| 39 |
+
q_out[..., :rotary_dim] = q_out_1
|
| 40 |
+
q_out[..., rotary_dim : 2 * rotary_dim] = q_out_2
|
| 41 |
|
| 42 |
# Apply rotation to key
|
| 43 |
k1 = k_out[..., :rotary_dim]
|
| 44 |
k2 = k_out[..., rotary_dim : 2 * rotary_dim]
|
| 45 |
+
k_out_1, k_out_2 = apply_rotary_torch(k1, k2, cos, sin, conj)
|
| 46 |
+
k_out[..., :rotary_dim] = k_out_1
|
| 47 |
+
k_out[..., rotary_dim : 2 * rotary_dim] = k_out_2
|
| 48 |
|
| 49 |
return q_out, k_out
|
| 50 |
|
| 51 |
|
| 52 |
run_benchmark(
|
| 53 |
kernel_type=KernelTypeEnum.ROTARY,
|
| 54 |
+
impl_name="torch_eager",
|
| 55 |
+
impl_tags={"family": "pytorch", "backend": "eager"},
|
| 56 |
+
impl_func=torch_rotary,
|
|
|
|
| 57 |
)
|
rotary/impls/hf_kernels_rotary.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
rotary/impls/torch_rotary.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
rotary/index.html
CHANGED
|
@@ -4,6 +4,11 @@
|
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
<title>index</title>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
<script>
|
| 8 |
// Iframe-friendly navigation router
|
| 9 |
(function() {
|
|
@@ -87,1320 +92,1542 @@
|
|
| 87 |
</script>
|
| 88 |
<style>
|
| 89 |
:root[data-theme="light"] {
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 343 |
-
|
| 344 |
-
|
| 345 |
-
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
| 354 |
-
|
| 355 |
-
|
| 356 |
-
|
| 357 |
-
|
| 358 |
-
|
| 359 |
-
|
| 360 |
-
|
| 361 |
-
|
| 362 |
-
|
| 363 |
-
|
| 364 |
-
|
| 365 |
-
|
| 366 |
-
|
| 367 |
-
|
| 368 |
-
|
| 369 |
-
|
| 370 |
-
|
| 371 |
-
|
| 372 |
-
|
| 373 |
-
|
| 374 |
-
|
| 375 |
-
|
| 376 |
-
|
| 377 |
-
|
| 378 |
-
|
| 379 |
-
|
| 380 |
-
|
| 381 |
-
|
| 382 |
-
|
| 383 |
-
|
| 384 |
-
|
| 385 |
-
|
| 386 |
-
|
| 387 |
-
|
| 388 |
-
|
| 389 |
-
|
| 390 |
-
|
| 391 |
-
|
| 392 |
-
|
| 393 |
-
|
| 394 |
-
|
| 395 |
-
|
| 396 |
-
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
|
| 405 |
-
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
|
| 419 |
-
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
|
| 430 |
-
|
| 431 |
-
|
| 432 |
-
|
| 433 |
-
|
| 434 |
-
|
| 435 |
-
|
| 436 |
-
|
| 437 |
-
|
| 438 |
-
|
| 439 |
-
|
| 440 |
-
|
| 441 |
-
|
| 442 |
-
|
| 443 |
-
|
| 444 |
-
|
| 445 |
-
|
| 446 |
-
|
| 447 |
-
|
| 448 |
-
|
| 449 |
-
|
| 450 |
-
|
| 451 |
-
|
| 452 |
-
|
| 453 |
-
|
| 454 |
-
|
| 455 |
-
|
| 456 |
-
|
| 457 |
-
|
| 458 |
-
|
| 459 |
-
|
| 460 |
-
|
| 461 |
-
|
| 462 |
-
|
| 463 |
-
|
| 464 |
-
|
| 465 |
-
|
| 466 |
-
|
| 467 |
-
|
| 468 |
-
|
| 469 |
-
|
| 470 |
-
|
| 471 |
-
|
| 472 |
-
|
| 473 |
-
|
| 474 |
-
|
| 475 |
-
|
| 476 |
-
|
| 477 |
-
|
| 478 |
-
|
| 479 |
-
|
| 480 |
-
|
| 481 |
-
|
| 482 |
-
|
| 483 |
-
|
| 484 |
-
|
| 485 |
-
|
| 486 |
-
|
| 487 |
-
|
| 488 |
-
|
| 489 |
-
|
| 490 |
-
|
| 491 |
-
|
| 492 |
-
|
| 493 |
-
|
| 494 |
-
|
| 495 |
-
|
| 496 |
-
|
| 497 |
-
|
| 498 |
-
|
| 499 |
-
|
| 500 |
-
|
| 501 |
-
|
| 502 |
-
|
| 503 |
-
|
| 504 |
-
|
| 505 |
-
|
| 506 |
-
|
| 507 |
-
|
| 508 |
-
|
| 509 |
-
|
| 510 |
-
|
| 511 |
-
|
| 512 |
-
|
| 513 |
-
|
| 514 |
-
|
| 515 |
-
|
| 516 |
-
|
| 517 |
-
|
| 518 |
-
|
| 519 |
-
|
| 520 |
-
|
| 521 |
-
|
| 522 |
-
|
| 523 |
-
|
| 524 |
-
|
| 525 |
-
|
| 526 |
-
|
| 527 |
-
|
| 528 |
-
|
| 529 |
-
|
| 530 |
-
|
| 531 |
-
|
| 532 |
-
|
| 533 |
-
|
| 534 |
-
|
| 535 |
-
|
| 536 |
-
|
| 537 |
-
|
| 538 |
-
|
| 539 |
-
|
| 540 |
-
|
| 541 |
-
|
| 542 |
-
|
| 543 |
-
|
| 544 |
-
|
| 545 |
-
|
| 546 |
-
|
| 547 |
-
|
| 548 |
-
|
| 549 |
-
|
| 550 |
-
|
| 551 |
-
|
| 552 |
-
|
| 553 |
-
|
| 554 |
-
|
| 555 |
-
|
| 556 |
-
|
| 557 |
-
|
| 558 |
-
|
| 559 |
-
|
| 560 |
-
|
| 561 |
-
|
| 562 |
-
|
| 563 |
-
|
| 564 |
-
|
| 565 |
-
|
| 566 |
-
|
| 567 |
-
|
| 568 |
-
|
| 569 |
-
|
| 570 |
-
|
| 571 |
-
|
| 572 |
-
|
| 573 |
-
|
| 574 |
-
|
| 575 |
-
|
| 576 |
-
|
| 577 |
-
|
| 578 |
-
|
| 579 |
-
|
| 580 |
-
|
| 581 |
-
|
| 582 |
-
|
| 583 |
-
|
| 584 |
-
|
| 585 |
-
|
| 586 |
-
|
| 587 |
-
|
| 588 |
-
|
| 589 |
-
|
| 590 |
-
|
| 591 |
-
|
| 592 |
-
|
| 593 |
-
|
| 594 |
-
|
| 595 |
-
|
| 596 |
-
|
| 597 |
-
|
| 598 |
-
|
| 599 |
-
|
| 600 |
-
|
| 601 |
-
|
| 602 |
-
|
| 603 |
-
|
| 604 |
-
|
| 605 |
-
|
| 606 |
-
|
| 607 |
-
|
| 608 |
-
|
| 609 |
-
|
| 610 |
-
|
| 611 |
-
|
| 612 |
-
|
| 613 |
-
|
| 614 |
-
|
| 615 |
-
|
| 616 |
-
|
| 617 |
-
|
| 618 |
-
|
| 619 |
-
|
| 620 |
-
|
| 621 |
-
|
| 622 |
-
|
| 623 |
-
|
| 624 |
-
|
| 625 |
-
|
| 626 |
-
|
| 627 |
-
|
| 628 |
-
|
| 629 |
-
|
| 630 |
-
|
| 631 |
-
|
| 632 |
-
|
| 633 |
-
|
| 634 |
-
|
| 635 |
-
|
| 636 |
-
|
| 637 |
-
|
| 638 |
-
|
| 639 |
-
|
| 640 |
-
|
| 641 |
-
|
| 642 |
-
|
| 643 |
-
|
| 644 |
-
|
| 645 |
-
|
| 646 |
-
|
| 647 |
-
|
| 648 |
-
|
| 649 |
-
|
| 650 |
-
|
| 651 |
-
|
| 652 |
-
|
| 653 |
-
|
| 654 |
-
|
| 655 |
-
|
| 656 |
-
|
| 657 |
-
|
| 658 |
-
|
| 659 |
-
|
| 660 |
-
|
| 661 |
-
|
| 662 |
-
|
| 663 |
-
|
| 664 |
-
|
| 665 |
-
|
| 666 |
-
|
| 667 |
-
|
| 668 |
-
|
| 669 |
-
|
| 670 |
-
|
| 671 |
-
|
| 672 |
-
|
| 673 |
-
|
| 674 |
-
|
| 675 |
-
|
| 676 |
-
|
| 677 |
-
|
| 678 |
-
|
| 679 |
-
|
| 680 |
-
|
| 681 |
-
|
| 682 |
-
|
| 683 |
-
|
| 684 |
-
|
| 685 |
-
|
| 686 |
-
|
| 687 |
-
|
| 688 |
-
|
| 689 |
-
|
| 690 |
-
|
| 691 |
-
|
| 692 |
-
|
| 693 |
-
|
| 694 |
-
|
| 695 |
-
|
| 696 |
-
|
| 697 |
-
|
| 698 |
-
|
| 699 |
-
|
| 700 |
-
|
| 701 |
-
|
| 702 |
-
|
| 703 |
-
|
| 704 |
-
|
| 705 |
-
|
| 706 |
-
|
| 707 |
-
|
| 708 |
-
|
| 709 |
-
|
| 710 |
-
|
| 711 |
-
|
| 712 |
-
|
| 713 |
-
|
| 714 |
-
|
| 715 |
-
|
| 716 |
-
|
| 717 |
-
|
| 718 |
-
|
| 719 |
-
|
| 720 |
-
|
| 721 |
-
|
| 722 |
-
|
| 723 |
-
|
| 724 |
-
|
| 725 |
-
|
| 726 |
-
|
| 727 |
-
|
| 728 |
-
|
| 729 |
-
|
| 730 |
-
|
| 731 |
-
|
| 732 |
-
|
| 733 |
-
|
| 734 |
-
|
| 735 |
-
|
| 736 |
-
|
| 737 |
-
|
| 738 |
-
|
| 739 |
-
|
| 740 |
-
|
| 741 |
-
|
| 742 |
-
|
| 743 |
-
|
| 744 |
-
|
| 745 |
-
|
| 746 |
-
|
| 747 |
-
|
| 748 |
-
|
| 749 |
-
|
| 750 |
-
|
| 751 |
-
|
| 752 |
-
|
| 753 |
-
|
| 754 |
-
|
| 755 |
-
|
| 756 |
-
|
| 757 |
-
|
| 758 |
-
|
| 759 |
-
|
| 760 |
-
|
| 761 |
-
|
| 762 |
-
|
| 763 |
-
|
| 764 |
-
|
| 765 |
-
|
| 766 |
-
|
| 767 |
-
|
| 768 |
-
|
| 769 |
-
|
| 770 |
-
|
| 771 |
-
|
| 772 |
-
|
| 773 |
-
|
| 774 |
-
|
| 775 |
-
|
| 776 |
-
|
| 777 |
-
|
| 778 |
-
|
| 779 |
-
|
| 780 |
-
|
| 781 |
-
|
| 782 |
-
|
| 783 |
-
|
| 784 |
-
|
| 785 |
-
|
| 786 |
-
|
| 787 |
-
|
| 788 |
-
|
| 789 |
-
|
| 790 |
-
|
| 791 |
-
|
| 792 |
-
|
| 793 |
-
|
| 794 |
-
|
| 795 |
-
|
| 796 |
-
|
| 797 |
-
|
| 798 |
-
|
| 799 |
-
|
| 800 |
-
|
| 801 |
-
|
| 802 |
-
|
| 803 |
-
|
| 804 |
-
|
| 805 |
-
|
| 806 |
-
|
| 807 |
-
|
| 808 |
-
|
| 809 |
-
|
| 810 |
-
|
| 811 |
-
|
| 812 |
-
|
| 813 |
-
|
| 814 |
-
|
| 815 |
-
|
| 816 |
-
|
| 817 |
-
|
| 818 |
-
|
| 819 |
-
|
| 820 |
-
|
| 821 |
-
|
| 822 |
-
|
| 823 |
-
|
| 824 |
-
|
| 825 |
-
|
| 826 |
-
|
| 827 |
-
|
| 828 |
-
|
| 829 |
-
|
| 830 |
-
|
| 831 |
-
|
| 832 |
-
|
| 833 |
-
|
| 834 |
-
|
| 835 |
-
|
| 836 |
-
|
| 837 |
-
|
| 838 |
-
|
| 839 |
-
|
| 840 |
-
|
| 841 |
-
|
| 842 |
-
|
| 843 |
-
|
| 844 |
-
|
| 845 |
-
|
| 846 |
-
|
| 847 |
-
|
| 848 |
-
|
| 849 |
-
|
| 850 |
-
|
| 851 |
-
|
| 852 |
-
|
| 853 |
-
|
| 854 |
-
|
| 855 |
-
|
| 856 |
-
|
| 857 |
-
|
| 858 |
-
|
| 859 |
-
|
| 860 |
-
|
| 861 |
-
|
| 862 |
-
|
| 863 |
-
|
| 864 |
-
|
| 865 |
-
|
| 866 |
-
|
| 867 |
-
|
| 868 |
-
|
| 869 |
-
|
| 870 |
-
|
| 871 |
-
|
| 872 |
-
|
| 873 |
-
|
| 874 |
-
|
| 875 |
-
|
| 876 |
-
|
| 877 |
-
|
| 878 |
-
|
| 879 |
-
|
| 880 |
-
|
| 881 |
-
|
| 882 |
-
|
| 883 |
-
|
| 884 |
-
|
| 885 |
-
|
| 886 |
-
|
| 887 |
-
|
| 888 |
-
|
| 889 |
-
|
| 890 |
-
|
| 891 |
-
|
| 892 |
-
|
| 893 |
-
|
| 894 |
-
|
| 895 |
-
|
| 896 |
-
|
| 897 |
-
|
| 898 |
-
|
| 899 |
-
|
| 900 |
-
|
| 901 |
-
|
| 902 |
-
|
| 903 |
-
|
| 904 |
-
|
| 905 |
-
|
| 906 |
-
|
| 907 |
-
|
| 908 |
-
|
| 909 |
-
|
| 910 |
-
|
| 911 |
-
|
| 912 |
-
|
| 913 |
-
|
| 914 |
-
|
| 915 |
-
|
| 916 |
-
|
| 917 |
-
|
| 918 |
-
|
| 919 |
-
|
| 920 |
-
|
| 921 |
-
|
| 922 |
-
|
| 923 |
-
|
| 924 |
-
|
| 925 |
-
|
| 926 |
-
|
| 927 |
-
|
| 928 |
-
|
| 929 |
-
|
| 930 |
-
|
| 931 |
-
|
| 932 |
-
|
| 933 |
-
|
| 934 |
-
|
| 935 |
-
|
| 936 |
-
|
| 937 |
-
|
| 938 |
-
|
| 939 |
-
|
| 940 |
-
|
| 941 |
-
|
| 942 |
-
|
| 943 |
-
|
| 944 |
-
|
| 945 |
-
|
| 946 |
-
|
| 947 |
-
|
| 948 |
-
|
| 949 |
-
|
| 950 |
-
|
| 951 |
-
|
| 952 |
-
|
| 953 |
-
|
| 954 |
-
|
| 955 |
-
|
| 956 |
-
|
| 957 |
-
|
| 958 |
-
|
| 959 |
-
|
| 960 |
-
|
| 961 |
-
|
| 962 |
-
|
| 963 |
-
|
| 964 |
-
|
| 965 |
-
|
| 966 |
-
|
| 967 |
-
|
| 968 |
-
|
| 969 |
-
|
| 970 |
-
|
| 971 |
-
|
| 972 |
-
|
| 973 |
-
|
| 974 |
-
|
| 975 |
-
|
| 976 |
-
|
| 977 |
-
|
| 978 |
-
|
| 979 |
-
|
| 980 |
-
|
| 981 |
-
|
| 982 |
-
|
| 983 |
-
|
| 984 |
-
|
| 985 |
-
|
| 986 |
-
|
| 987 |
-
|
| 988 |
-
|
| 989 |
-
|
| 990 |
-
|
| 991 |
-
|
| 992 |
-
|
| 993 |
-
|
| 994 |
-
|
| 995 |
-
|
| 996 |
-
|
| 997 |
-
|
| 998 |
-
|
| 999 |
-
|
| 1000 |
-
|
| 1001 |
-
|
| 1002 |
-
|
| 1003 |
-
|
| 1004 |
-
|
| 1005 |
-
|
| 1006 |
-
|
| 1007 |
-
|
| 1008 |
-
|
| 1009 |
-
|
| 1010 |
-
|
| 1011 |
-
|
| 1012 |
-
|
| 1013 |
-
|
| 1014 |
-
|
| 1015 |
-
|
| 1016 |
-
|
| 1017 |
-
|
| 1018 |
-
|
| 1019 |
-
|
| 1020 |
-
|
| 1021 |
-
|
| 1022 |
-
|
| 1023 |
-
|
| 1024 |
-
|
| 1025 |
-
|
| 1026 |
-
|
| 1027 |
-
|
| 1028 |
-
|
| 1029 |
-
|
| 1030 |
-
|
| 1031 |
-
|
| 1032 |
-
|
| 1033 |
-
|
| 1034 |
-
|
| 1035 |
-
|
| 1036 |
-
|
| 1037 |
-
|
| 1038 |
-
|
| 1039 |
-
|
| 1040 |
-
|
| 1041 |
-
|
| 1042 |
-
|
| 1043 |
-
|
| 1044 |
-
|
| 1045 |
-
|
| 1046 |
-
|
| 1047 |
-
|
| 1048 |
-
|
| 1049 |
-
|
| 1050 |
-
|
| 1051 |
-
|
| 1052 |
-
|
| 1053 |
-
|
| 1054 |
-
|
| 1055 |
-
|
| 1056 |
-
|
| 1057 |
-
|
| 1058 |
-
|
| 1059 |
-
|
| 1060 |
-
|
| 1061 |
-
|
| 1062 |
-
|
| 1063 |
-
|
| 1064 |
-
|
| 1065 |
-
|
| 1066 |
-
|
| 1067 |
-
|
| 1068 |
-
|
| 1069 |
-
|
| 1070 |
-
|
| 1071 |
-
|
| 1072 |
-
|
| 1073 |
-
|
| 1074 |
-
|
| 1075 |
-
|
| 1076 |
-
|
| 1077 |
-
|
| 1078 |
-
|
| 1079 |
-
|
| 1080 |
-
|
| 1081 |
-
|
| 1082 |
-
|
| 1083 |
-
|
| 1084 |
-
|
| 1085 |
-
|
| 1086 |
-
|
| 1087 |
-
|
| 1088 |
-
|
| 1089 |
-
|
| 1090 |
-
|
| 1091 |
-
|
| 1092 |
-
|
| 1093 |
-
|
| 1094 |
-
|
| 1095 |
-
|
| 1096 |
-
|
| 1097 |
-
|
| 1098 |
-
|
| 1099 |
-
|
| 1100 |
-
|
| 1101 |
-
|
| 1102 |
-
|
| 1103 |
-
|
| 1104 |
-
|
| 1105 |
-
|
| 1106 |
-
|
| 1107 |
-
|
| 1108 |
-
|
| 1109 |
-
|
| 1110 |
-
|
| 1111 |
-
|
| 1112 |
-
|
| 1113 |
-
|
| 1114 |
-
|
| 1115 |
-
|
| 1116 |
-
|
| 1117 |
-
|
| 1118 |
-
|
| 1119 |
-
|
| 1120 |
-
|
| 1121 |
-
|
| 1122 |
-
|
| 1123 |
-
|
| 1124 |
-
|
| 1125 |
-
|
| 1126 |
-
|
| 1127 |
-
|
| 1128 |
-
|
| 1129 |
-
|
| 1130 |
-
|
| 1131 |
-
|
| 1132 |
-
|
| 1133 |
-
|
| 1134 |
-
|
| 1135 |
-
|
| 1136 |
-
|
| 1137 |
-
|
| 1138 |
-
|
| 1139 |
-
|
| 1140 |
-
|
| 1141 |
-
|
| 1142 |
-
|
| 1143 |
-
|
| 1144 |
-
|
| 1145 |
-
|
| 1146 |
-
|
| 1147 |
-
|
| 1148 |
-
|
| 1149 |
-
|
| 1150 |
-
|
| 1151 |
-
|
| 1152 |
-
|
| 1153 |
-
|
| 1154 |
-
|
| 1155 |
-
|
| 1156 |
-
|
| 1157 |
-
|
| 1158 |
-
|
| 1159 |
-
|
| 1160 |
-
|
| 1161 |
-
|
| 1162 |
-
|
| 1163 |
-
|
| 1164 |
-
|
| 1165 |
-
|
| 1166 |
-
|
| 1167 |
-
|
| 1168 |
-
|
| 1169 |
-
|
| 1170 |
-
|
| 1171 |
-
|
| 1172 |
-
|
| 1173 |
-
|
| 1174 |
-
|
| 1175 |
-
|
| 1176 |
-
|
| 1177 |
-
|
| 1178 |
-
|
| 1179 |
-
|
| 1180 |
-
|
| 1181 |
-
|
| 1182 |
-
|
| 1183 |
-
|
| 1184 |
-
|
| 1185 |
-
|
| 1186 |
-
|
| 1187 |
-
|
| 1188 |
-
|
| 1189 |
-
|
| 1190 |
-
|
| 1191 |
-
|
| 1192 |
-
|
| 1193 |
-
|
| 1194 |
-
|
| 1195 |
-
|
| 1196 |
-
|
| 1197 |
-
|
| 1198 |
-
|
| 1199 |
-
|
| 1200 |
-
|
| 1201 |
-
|
| 1202 |
-
|
| 1203 |
-
|
| 1204 |
-
|
| 1205 |
-
|
| 1206 |
-
|
| 1207 |
-
|
| 1208 |
-
|
| 1209 |
-
|
| 1210 |
-
|
| 1211 |
-
|
| 1212 |
-
|
| 1213 |
-
|
| 1214 |
-
|
| 1215 |
-
|
| 1216 |
-
|
| 1217 |
-
|
| 1218 |
-
|
| 1219 |
-
|
| 1220 |
-
|
| 1221 |
-
|
| 1222 |
-
|
| 1223 |
-
|
| 1224 |
-
|
| 1225 |
-
|
| 1226 |
-
|
| 1227 |
-
|
| 1228 |
-
|
| 1229 |
-
|
| 1230 |
-
|
| 1231 |
-
|
| 1232 |
-
|
| 1233 |
-
|
| 1234 |
-
|
| 1235 |
-
|
| 1236 |
-
|
| 1237 |
-
|
| 1238 |
-
|
| 1239 |
-
|
| 1240 |
-
|
| 1241 |
-
|
| 1242 |
-
|
| 1243 |
-
|
| 1244 |
-
|
| 1245 |
-
|
| 1246 |
-
|
| 1247 |
-
|
| 1248 |
-
|
| 1249 |
-
|
| 1250 |
-
|
| 1251 |
-
|
| 1252 |
-
|
| 1253 |
-
|
| 1254 |
-
|
| 1255 |
-
|
| 1256 |
-
|
| 1257 |
-
|
| 1258 |
-
|
| 1259 |
-
|
| 1260 |
-
|
| 1261 |
-
|
| 1262 |
-
|
| 1263 |
-
|
| 1264 |
-
|
| 1265 |
-
|
| 1266 |
-
|
| 1267 |
-
|
| 1268 |
-
|
| 1269 |
-
|
| 1270 |
-
|
| 1271 |
-
|
| 1272 |
-
|
| 1273 |
-
|
| 1274 |
-
|
| 1275 |
-
|
| 1276 |
-
|
| 1277 |
-
|
| 1278 |
-
|
| 1279 |
-
|
| 1280 |
-
|
| 1281 |
-
|
| 1282 |
-
|
| 1283 |
-
|
| 1284 |
-
|
| 1285 |
-
|
| 1286 |
-
|
| 1287 |
-
|
| 1288 |
-
|
| 1289 |
-
|
| 1290 |
-
|
| 1291 |
-
|
| 1292 |
-
|
| 1293 |
-
|
| 1294 |
-
|
| 1295 |
-
|
| 1296 |
-
|
| 1297 |
-
|
| 1298 |
-
|
| 1299 |
-
|
| 1300 |
-
|
| 1301 |
-
|
| 1302 |
-
|
| 1303 |
-
|
| 1304 |
-
|
| 1305 |
-
|
| 1306 |
-
|
| 1307 |
-
|
| 1308 |
-
|
| 1309 |
-
|
| 1310 |
-
|
| 1311 |
-
|
| 1312 |
-
|
| 1313 |
-
|
| 1314 |
-
|
| 1315 |
-
|
| 1316 |
-
|
| 1317 |
-
|
| 1318 |
-
|
| 1319 |
-
|
| 1320 |
-
|
| 1321 |
-
|
| 1322 |
-
|
| 1323 |
-
|
| 1324 |
-
|
| 1325 |
-
|
| 1326 |
-
|
| 1327 |
-
|
| 1328 |
-
|
| 1329 |
-
|
| 1330 |
-
|
| 1331 |
-
|
| 1332 |
-
|
| 1333 |
-
|
| 1334 |
-
|
| 1335 |
-
|
| 1336 |
-
|
| 1337 |
-
|
| 1338 |
-
|
| 1339 |
-
|
| 1340 |
-
|
| 1341 |
-
|
| 1342 |
-
|
| 1343 |
-
|
| 1344 |
-
|
| 1345 |
-
|
| 1346 |
-
|
| 1347 |
-
|
| 1348 |
-
|
| 1349 |
-
|
| 1350 |
-
|
| 1351 |
-
|
| 1352 |
-
|
| 1353 |
-
|
| 1354 |
-
|
| 1355 |
-
|
| 1356 |
-
|
| 1357 |
-
|
| 1358 |
-
|
| 1359 |
-
|
| 1360 |
-
|
| 1361 |
-
|
| 1362 |
-
|
| 1363 |
-
|
| 1364 |
-
|
| 1365 |
-
|
| 1366 |
-
|
| 1367 |
-
|
| 1368 |
-
|
| 1369 |
-
|
| 1370 |
-
|
| 1371 |
-
|
| 1372 |
-
|
| 1373 |
-
|
| 1374 |
-
|
| 1375 |
-
|
| 1376 |
-
|
| 1377 |
-
|
| 1378 |
-
|
| 1379 |
-
|
| 1380 |
-
|
| 1381 |
-
|
| 1382 |
-
|
| 1383 |
-
|
| 1384 |
-
|
| 1385 |
-
|
| 1386 |
-
|
| 1387 |
-
|
| 1388 |
-
|
| 1389 |
-
|
| 1390 |
-
|
| 1391 |
-
|
| 1392 |
-
|
| 1393 |
-
|
| 1394 |
-
|
| 1395 |
-
|
| 1396 |
-
|
| 1397 |
-
|
| 1398 |
-
|
| 1399 |
-
|
| 1400 |
-
|
| 1401 |
-
|
| 1402 |
-
|
| 1403 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1404 |
</style>
|
| 1405 |
<script>
|
| 1406 |
// --- Drag utilities ---
|
|
|
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
<title>index</title>
|
| 7 |
+
|
| 8 |
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 9 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
|
| 11 |
+
|
| 12 |
<script>
|
| 13 |
// Iframe-friendly navigation router
|
| 14 |
(function() {
|
|
|
|
| 92 |
</script>
|
| 93 |
<style>
|
| 94 |
:root[data-theme="light"] {
|
| 95 |
+
--bg-primary: #ffffff;
|
| 96 |
+
--bg-secondary: #f6f8fa;
|
| 97 |
+
--bg-tertiary: #f8f9fa;
|
| 98 |
+
--bg-code: #f8f9fa;
|
| 99 |
+
--bg-error: #fdf2f2;
|
| 100 |
+
--bg-artifact: #e6f3ff;
|
| 101 |
+
--bg-artifact-hover: #d0e7ff;
|
| 102 |
+
|
| 103 |
+
--text-primary: #333;
|
| 104 |
+
--text-secondary: #656d76;
|
| 105 |
+
--text-error: #c53030;
|
| 106 |
+
--text-link: #0969da;
|
| 107 |
+
|
| 108 |
+
--border-primary: #e1e5e9;
|
| 109 |
+
--border-error: #e53e3e;
|
| 110 |
+
--border-cell-failed: #d73a49;
|
| 111 |
+
|
| 112 |
+
--shadow: rgba(0, 0, 0, 0.1);
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
:root[data-theme="dark"] {
|
| 116 |
+
--bg-primary: #0a0a0a;
|
| 117 |
+
--bg-secondary: #121212;
|
| 118 |
+
--bg-tertiary: #181818;
|
| 119 |
+
--bg-code: #0d0d0d;
|
| 120 |
+
--bg-error: #1a0f0f;
|
| 121 |
+
--bg-artifact: #151515;
|
| 122 |
+
--bg-artifact-hover: #1a1a1a;
|
| 123 |
+
|
| 124 |
+
--text-primary: #e0e0e0;
|
| 125 |
+
--text-secondary: #888888;
|
| 126 |
+
--text-error: #ff6b6b;
|
| 127 |
+
--text-link: #64b5f6;
|
| 128 |
+
|
| 129 |
+
--border-primary: #2a2a2a;
|
| 130 |
+
--border-error: #ff6b6b;
|
| 131 |
+
--border-cell-failed: #ff6b6b;
|
| 132 |
+
|
| 133 |
+
--shadow: rgba(255, 255, 255, 0.05);
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
/* Monocolor UI theme: black/white background, all text/borders single blue */
|
| 137 |
+
:root[data-ui="monocolor"] {
|
| 138 |
+
--mono-color: #0a66ff;
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
:root[data-ui="monocolor"][data-theme="light"] {
|
| 142 |
+
--bg-primary: #ffffff;
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
:root[data-ui="monocolor"][data-theme="dark"] {
|
| 146 |
+
--bg-primary: #000000;
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
:root[data-ui="monocolor"] {
|
| 150 |
+
--bg-secondary: var(--bg-primary);
|
| 151 |
+
--bg-tertiary: var(--bg-primary);
|
| 152 |
+
--bg-code: var(--bg-primary);
|
| 153 |
+
--bg-error: var(--bg-primary);
|
| 154 |
+
--bg-artifact: var(--bg-primary);
|
| 155 |
+
--bg-artifact-hover: var(--bg-primary);
|
| 156 |
+
|
| 157 |
+
--text-primary: var(--mono-color);
|
| 158 |
+
--text-secondary: var(--mono-color);
|
| 159 |
+
--text-error: var(--mono-color);
|
| 160 |
+
--text-link: var(--mono-color);
|
| 161 |
+
|
| 162 |
+
--border-primary: var(--mono-color);
|
| 163 |
+
--border-error: var(--mono-color);
|
| 164 |
+
--border-cell-failed: var(--mono-color);
|
| 165 |
+
|
| 166 |
+
--shadow: none;
|
| 167 |
+
}
|
| 168 |
+
|
| 169 |
+
:root[data-ui="monocolor"] a {
|
| 170 |
+
color: var(--mono-color);
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
:root[data-ui="monocolor"] .menu-button,
|
| 174 |
+
:root[data-ui="monocolor"] .theme-toggle,
|
| 175 |
+
:root[data-ui="monocolor"] .reset-toggle,
|
| 176 |
+
:root[data-ui="monocolor"] .back-button {
|
| 177 |
+
background: var(--bg-primary);
|
| 178 |
+
color: var(--mono-color);
|
| 179 |
+
border-color: var(--mono-color);
|
| 180 |
+
}
|
| 181 |
+
|
| 182 |
+
:root[data-ui="monocolor"] .menu-button:hover,
|
| 183 |
+
:root[data-ui="monocolor"] .theme-toggle:hover,
|
| 184 |
+
:root[data-ui="monocolor"] .reset-toggle:hover,
|
| 185 |
+
:root[data-ui="monocolor"] .back-button:hover {
|
| 186 |
+
background: var(--bg-primary);
|
| 187 |
+
color: var(--mono-color);
|
| 188 |
+
border-color: var(--mono-color);
|
| 189 |
+
}
|
| 190 |
+
|
| 191 |
+
:root[data-ui="monocolor"] .menu-dropdown {
|
| 192 |
+
background: var(--bg-primary);
|
| 193 |
+
border-color: var(--mono-color);
|
| 194 |
+
box-shadow: none;
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
:root[data-ui="monocolor"] .menu-item {
|
| 198 |
+
color: var(--mono-color);
|
| 199 |
+
border-bottom-color: var(--mono-color);
|
| 200 |
+
}
|
| 201 |
+
|
| 202 |
+
:root[data-ui="monocolor"] .system-info {
|
| 203 |
+
background: var(--bg-primary);
|
| 204 |
+
border-color: var(--mono-color);
|
| 205 |
+
}
|
| 206 |
+
|
| 207 |
+
:root[data-ui="monocolor"] .cell {
|
| 208 |
+
border-color: var(--mono-color);
|
| 209 |
+
background: var(--bg-primary);
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
:root[data-ui="monocolor"] .cell-header {
|
| 213 |
+
background: var(--bg-primary);
|
| 214 |
+
border-bottom-color: var(--mono-color);
|
| 215 |
+
}
|
| 216 |
+
|
| 217 |
+
:root[data-ui="monocolor"] .artifact {
|
| 218 |
+
background: var(--bg-primary);
|
| 219 |
+
border-color: var(--mono-color);
|
| 220 |
+
color: var(--mono-color);
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
:root[data-ui="monocolor"] .artifact:hover {
|
| 224 |
+
background: var(--bg-primary);
|
| 225 |
+
}
|
| 226 |
+
|
| 227 |
+
:root[data-ui="monocolor"] .artifact-preview img,
|
| 228 |
+
:root[data-ui="monocolor"] .artifact-preview svg {
|
| 229 |
+
border-color: var(--mono-color);
|
| 230 |
+
}
|
| 231 |
+
|
| 232 |
+
:root[data-ui="monocolor"] .status-widget {
|
| 233 |
+
background: var(--bg-primary);
|
| 234 |
+
border-color: var(--mono-color);
|
| 235 |
+
color: var(--mono-color);
|
| 236 |
+
}
|
| 237 |
+
|
| 238 |
+
:root[data-ui="monocolor"] .minimap,
|
| 239 |
+
:root[data-ui="monocolor"] .file-explorer,
|
| 240 |
+
:root[data-ui="monocolor"] .tools-widget {
|
| 241 |
+
background: var(--bg-primary);
|
| 242 |
+
border-color: var(--mono-color);
|
| 243 |
+
color: var(--mono-color);
|
| 244 |
+
}
|
| 245 |
+
|
| 246 |
+
:root[data-ui="monocolor"] .cell-code {
|
| 247 |
+
background: var(--bg-primary);
|
| 248 |
+
border-bottom-color: var(--mono-color);
|
| 249 |
+
}
|
| 250 |
+
|
| 251 |
+
:root[data-ui="monocolor"] .tools-title,
|
| 252 |
+
:root[data-ui="monocolor"] .file-explorer-section-title,
|
| 253 |
+
:root[data-ui="monocolor"] .minimap-title {
|
| 254 |
+
color: var(--mono-color);
|
| 255 |
+
border-bottom-color: var(--mono-color);
|
| 256 |
+
}
|
| 257 |
+
|
| 258 |
+
:root[data-ui="monocolor"] .tool-button {
|
| 259 |
+
background: var(--bg-primary);
|
| 260 |
+
border-color: var(--mono-color);
|
| 261 |
+
color: var(--mono-color);
|
| 262 |
+
}
|
| 263 |
+
|
| 264 |
+
:root[data-ui="monocolor"] .tool-button.active {
|
| 265 |
+
border-color: var(--mono-color);
|
| 266 |
+
}
|
| 267 |
+
|
| 268 |
+
:root[data-ui="monocolor"] .file-explorer-item,
|
| 269 |
+
:root[data-ui="monocolor"] .minimap-item {
|
| 270 |
+
color: var(--mono-color);
|
| 271 |
+
}
|
| 272 |
+
|
| 273 |
+
/* Force Pygments code to mono blue on mono bg */
|
| 274 |
+
:root[data-ui="monocolor"] .highlight {
|
| 275 |
+
background: var(--bg-primary) !important;
|
| 276 |
+
color: var(--mono-color) !important;
|
| 277 |
+
}
|
| 278 |
+
|
| 279 |
+
:root[data-ui="monocolor"] .highlight *,
|
| 280 |
+
:root[data-ui="monocolor"] .highlight .hll {
|
| 281 |
+
color: var(--mono-color) !important;
|
| 282 |
+
background: transparent !important;
|
| 283 |
+
border-color: var(--mono-color) !important;
|
| 284 |
+
}
|
| 285 |
+
|
| 286 |
+
/* Default code font + metrics (overridable via frontmatter) */
|
| 287 |
+
:root {
|
| 288 |
+
--code-font-size: 0.95rem;
|
| 289 |
+
--code-line-height: 1.5;
|
| 290 |
+
--code-pad-y: 0.75rem;
|
| 291 |
+
}
|
| 292 |
+
|
| 293 |
+
/* Minimal UI theme overrides base variables for a flatter, 90s look */
|
| 294 |
+
:root[data-ui="none"] {
|
| 295 |
+
--bg-primary: #ffffff;
|
| 296 |
+
--bg-secondary: transparent;
|
| 297 |
+
--bg-tertiary: transparent;
|
| 298 |
+
--bg-code: #f9f9f9;
|
| 299 |
+
--bg-error: #fff0f0;
|
| 300 |
+
--bg-artifact: #f0f7ff;
|
| 301 |
+
--bg-artifact-hover: #e5f1ff;
|
| 302 |
+
|
| 303 |
+
--text-primary: #000000;
|
| 304 |
+
--text-secondary: #222222;
|
| 305 |
+
--text-error: #a00000;
|
| 306 |
+
--text-link: #0000ee;
|
| 307 |
+
|
| 308 |
+
--border-primary: #cccccc;
|
| 309 |
+
--border-error: #cc0000;
|
| 310 |
+
--border-cell-failed: #cc0000;
|
| 311 |
+
|
| 312 |
+
--shadow: none;
|
| 313 |
+
}
|
| 314 |
+
|
| 315 |
+
html {
|
| 316 |
+
overscroll-behavior: none;
|
| 317 |
+
}
|
| 318 |
+
|
| 319 |
+
body {
|
| 320 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace;
|
| 321 |
+
line-height: 1.4;
|
| 322 |
+
max-width: 1000px;
|
| 323 |
+
margin: 0 auto;
|
| 324 |
+
padding: 15px;
|
| 325 |
+
color: var(--text-primary);
|
| 326 |
+
background: var(--bg-primary);
|
| 327 |
+
transition: background-color 0.2s ease, color 0.2s ease;
|
| 328 |
+
overscroll-behavior: none;
|
| 329 |
+
}
|
| 330 |
+
|
| 331 |
+
/* Minimal "none" UI theme overrides */
|
| 332 |
+
:root[data-ui="none"] body {
|
| 333 |
+
font-family: 'Times New Roman', Times, serif;
|
| 334 |
+
line-height: 1.5;
|
| 335 |
+
max-width: 860px;
|
| 336 |
+
padding: 12px;
|
| 337 |
+
background: #ffffff;
|
| 338 |
+
color: #000000;
|
| 339 |
+
transition: none;
|
| 340 |
+
}
|
| 341 |
+
|
| 342 |
+
/* Two panel layout removed */
|
| 343 |
+
|
| 344 |
+
.controls {
|
| 345 |
+
position: fixed;
|
| 346 |
+
top: 20px;
|
| 347 |
+
right: 20px;
|
| 348 |
+
display: flex;
|
| 349 |
+
flex-direction: column;
|
| 350 |
+
align-items: flex-end;
|
| 351 |
+
gap: 0.25rem;
|
| 352 |
+
z-index: 1000;
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
.controls-buttons {
|
| 356 |
+
display: flex;
|
| 357 |
+
gap: 0.5rem;
|
| 358 |
+
}
|
| 359 |
+
|
| 360 |
+
.menu-button {
|
| 361 |
+
position: relative;
|
| 362 |
+
background: var(--bg-secondary);
|
| 363 |
+
border: 1px solid var(--border-primary);
|
| 364 |
+
padding: 8px 12px;
|
| 365 |
+
border-radius: 2px;
|
| 366 |
+
color: var(--text-secondary);
|
| 367 |
+
cursor: pointer;
|
| 368 |
+
font-family: inherit;
|
| 369 |
+
font-size: 0.9rem;
|
| 370 |
+
user-select: none;
|
| 371 |
+
}
|
| 372 |
+
|
| 373 |
+
/* Keep default control styling when widgets are enabled, even in minimal UI */
|
| 374 |
+
:root[data-ui="none"][data-widgets="on"] .menu-button,
|
| 375 |
+
:root[data-ui="none"][data-widgets="on"] .theme-toggle,
|
| 376 |
+
:root[data-ui="none"][data-widgets="on"] .reset-toggle,
|
| 377 |
+
:root[data-ui="none"][data-widgets="on"] .back-button {
|
| 378 |
+
background: #f6f6f6;
|
| 379 |
+
border: 1px solid #cccccc;
|
| 380 |
+
color: #222222;
|
| 381 |
+
}
|
| 382 |
+
|
| 383 |
+
.menu-button:hover {
|
| 384 |
+
color: var(--text-primary);
|
| 385 |
+
background: var(--bg-tertiary);
|
| 386 |
+
}
|
| 387 |
+
|
| 388 |
+
/* Controls state indicator (top-right) */
|
| 389 |
+
/* Status widget (bottom-right) */
|
| 390 |
+
.status-widget {
|
| 391 |
+
position: fixed;
|
| 392 |
+
right: 20px;
|
| 393 |
+
bottom: 20px;
|
| 394 |
+
width: auto;
|
| 395 |
+
max-width: 260px;
|
| 396 |
+
background: var(--bg-secondary);
|
| 397 |
+
border: 1px solid var(--border-primary);
|
| 398 |
+
border-radius: 2px;
|
| 399 |
+
padding: 6px 8px;
|
| 400 |
+
font-size: 0.8rem;
|
| 401 |
+
color: var(--text-secondary);
|
| 402 |
+
z-index: 100;
|
| 403 |
+
}
|
| 404 |
+
|
| 405 |
+
.status-widget strong {
|
| 406 |
+
color: var(--text-primary);
|
| 407 |
+
}
|
| 408 |
+
|
| 409 |
+
:root[data-ui="none"][data-widgets="on"] .status-widget {
|
| 410 |
+
background: #f6f6f6;
|
| 411 |
+
border-color: #ccc;
|
| 412 |
+
color: #222;
|
| 413 |
+
}
|
| 414 |
+
|
| 415 |
+
:root[data-ui="none"][data-widgets="on"] .menu-button:hover,
|
| 416 |
+
:root[data-ui="none"][data-widgets="on"] .theme-toggle:hover,
|
| 417 |
+
:root[data-ui="none"][data-widgets="on"] .reset-toggle:hover,
|
| 418 |
+
:root[data-ui="none"][data-widgets="on"] .back-button:hover {
|
| 419 |
+
background: #ededed;
|
| 420 |
+
border-color: #bbbbbb;
|
| 421 |
+
color: #000000;
|
| 422 |
+
}
|
| 423 |
+
|
| 424 |
+
.menu-dropdown {
|
| 425 |
+
position: absolute;
|
| 426 |
+
top: 100%;
|
| 427 |
+
right: 0;
|
| 428 |
+
background: var(--bg-secondary);
|
| 429 |
+
border: 1px solid var(--border-primary);
|
| 430 |
+
border-radius: 4px;
|
| 431 |
+
box-shadow: 0 4px 12px var(--shadow);
|
| 432 |
+
min-width: 160px;
|
| 433 |
+
opacity: 0;
|
| 434 |
+
visibility: hidden;
|
| 435 |
+
transform: translateY(-8px);
|
| 436 |
+
transition: all 0.2s ease;
|
| 437 |
+
z-index: 1001;
|
| 438 |
+
margin-top: 4px;
|
| 439 |
+
}
|
| 440 |
+
|
| 441 |
+
:root[data-ui="none"][data-widgets="on"] .menu-dropdown {
|
| 442 |
+
background: #ffffff;
|
| 443 |
+
border: 1px solid #cccccc;
|
| 444 |
+
box-shadow: none;
|
| 445 |
+
}
|
| 446 |
+
|
| 447 |
+
.menu-button.active .menu-dropdown {
|
| 448 |
+
opacity: 1;
|
| 449 |
+
visibility: visible;
|
| 450 |
+
transform: translateY(0);
|
| 451 |
+
}
|
| 452 |
+
|
| 453 |
+
.menu-item {
|
| 454 |
+
display: block;
|
| 455 |
+
padding: 8px 12px;
|
| 456 |
+
color: var(--text-secondary);
|
| 457 |
+
text-decoration: none;
|
| 458 |
+
font-size: 0.85rem;
|
| 459 |
+
border-bottom: 1px solid var(--border-primary);
|
| 460 |
+
cursor: pointer;
|
| 461 |
+
}
|
| 462 |
+
|
| 463 |
+
:root[data-ui="none"] .menu-item {
|
| 464 |
+
color: #000;
|
| 465 |
+
border-bottom: 1px solid #eee;
|
| 466 |
+
}
|
| 467 |
+
|
| 468 |
+
.menu-item:last-child {
|
| 469 |
+
border-bottom: none;
|
| 470 |
+
}
|
| 471 |
+
|
| 472 |
+
.menu-item:hover {
|
| 473 |
+
background: var(--bg-tertiary);
|
| 474 |
+
color: var(--text-primary);
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
+
.menu-checkbox {
|
| 478 |
+
display: inline-block;
|
| 479 |
+
width: 16px;
|
| 480 |
+
font-family: monospace;
|
| 481 |
+
color: var(--text-link);
|
| 482 |
+
}
|
| 483 |
+
|
| 484 |
+
.theme-toggle,
|
| 485 |
+
.reset-toggle,
|
| 486 |
+
.back-button {
|
| 487 |
+
background: var(--bg-secondary);
|
| 488 |
+
border: 1px solid var(--border-primary);
|
| 489 |
+
padding: 8px 12px;
|
| 490 |
+
border-radius: 4px;
|
| 491 |
+
color: var(--text-secondary);
|
| 492 |
+
cursor: pointer;
|
| 493 |
+
font-family: inherit;
|
| 494 |
+
font-size: 0.9rem;
|
| 495 |
+
user-select: none;
|
| 496 |
+
}
|
| 497 |
+
|
| 498 |
+
.back-button {
|
| 499 |
+
text-decoration: none;
|
| 500 |
+
display: inline-block;
|
| 501 |
+
}
|
| 502 |
+
|
| 503 |
+
.theme-toggle:hover,
|
| 504 |
+
.reset-toggle:hover,
|
| 505 |
+
.back-button:hover {
|
| 506 |
+
color: var(--text-primary);
|
| 507 |
+
background: var(--bg-tertiary);
|
| 508 |
+
}
|
| 509 |
+
|
| 510 |
+
.system-info {
|
| 511 |
+
background: var(--bg-secondary);
|
| 512 |
+
border: 1px solid var(--border-primary);
|
| 513 |
+
border-radius: 4px;
|
| 514 |
+
padding: 8px 12px;
|
| 515 |
+
margin-bottom: 16px;
|
| 516 |
+
font-size: 0.85em;
|
| 517 |
+
color: var(--text-secondary);
|
| 518 |
+
}
|
| 519 |
+
|
| 520 |
+
.system-info-header {
|
| 521 |
+
font-weight: 600;
|
| 522 |
+
color: var(--text-primary);
|
| 523 |
+
margin-bottom: 2px;
|
| 524 |
+
}
|
| 525 |
+
|
| 526 |
+
.system-info-content {
|
| 527 |
+
font-family: monospace;
|
| 528 |
+
}
|
| 529 |
+
|
| 530 |
+
.theme-toggle,
|
| 531 |
+
.reset-toggle {
|
| 532 |
+
background: var(--bg-secondary);
|
| 533 |
+
border: 1px solid var(--border-primary);
|
| 534 |
+
border-radius: 2px;
|
| 535 |
+
/* padding: 0.4rem 0.6rem; */
|
| 536 |
+
cursor: pointer;
|
| 537 |
+
font-family: inherit;
|
| 538 |
+
font-size: 0.8rem;
|
| 539 |
+
color: var(--text-secondary);
|
| 540 |
+
user-select: none;
|
| 541 |
+
transition: all 0.2s ease;
|
| 542 |
+
text-transform: lowercase;
|
| 543 |
+
letter-spacing: 0;
|
| 544 |
+
}
|
| 545 |
+
|
| 546 |
+
.theme-toggle:hover,
|
| 547 |
+
.reset-toggle:hover {
|
| 548 |
+
background: var(--bg-tertiary);
|
| 549 |
+
border-color: var(--text-secondary);
|
| 550 |
+
color: var(--text-primary);
|
| 551 |
+
}
|
| 552 |
+
|
| 553 |
+
.minimap {
|
| 554 |
+
position: fixed;
|
| 555 |
+
bottom: 20px;
|
| 556 |
+
right: 20px;
|
| 557 |
+
width: 220px;
|
| 558 |
+
max-height: 400px;
|
| 559 |
+
background: var(--bg-secondary);
|
| 560 |
+
border: 1px solid var(--border-primary);
|
| 561 |
+
border-radius: 2px;
|
| 562 |
+
padding: 0.5rem;
|
| 563 |
+
font-size: 0.7rem;
|
| 564 |
+
overflow-y: auto;
|
| 565 |
+
z-index: 100;
|
| 566 |
+
opacity: 0.9;
|
| 567 |
+
transition: opacity 0.2s ease;
|
| 568 |
+
}
|
| 569 |
+
|
| 570 |
+
/* Hide widgets and controls when disabled via frontmatter */
|
| 571 |
+
:root[data-widgets="off"] .controls,
|
| 572 |
+
:root[data-widgets="off"] .minimap,
|
| 573 |
+
:root[data-widgets="off"] .file-explorer,
|
| 574 |
+
:root[data-widgets="off"] .tools-widget,
|
| 575 |
+
:root[data-widgets="off"] .status-widget {
|
| 576 |
+
display: none !important;
|
| 577 |
+
}
|
| 578 |
+
|
| 579 |
+
.file-explorer {
|
| 580 |
+
position: fixed;
|
| 581 |
+
bottom: 20px;
|
| 582 |
+
/* default; JS will stack */
|
| 583 |
+
right: 20px;
|
| 584 |
+
left: auto;
|
| 585 |
+
top: auto;
|
| 586 |
+
width: 220px;
|
| 587 |
+
max-height: 400px;
|
| 588 |
+
background: var(--bg-secondary);
|
| 589 |
+
border: 1px solid var(--border-primary);
|
| 590 |
+
border-radius: 2px;
|
| 591 |
+
padding: 0.5rem;
|
| 592 |
+
font-size: 0.7rem;
|
| 593 |
+
overflow-y: auto;
|
| 594 |
+
z-index: 100;
|
| 595 |
+
opacity: 0.9;
|
| 596 |
+
transition: opacity 0.2s ease;
|
| 597 |
+
}
|
| 598 |
+
|
| 599 |
+
/* Drawing overlay */
|
| 600 |
+
.draw-overlay {
|
| 601 |
+
position: fixed;
|
| 602 |
+
top: 0;
|
| 603 |
+
left: 0;
|
| 604 |
+
width: 100vw;
|
| 605 |
+
height: 100vh;
|
| 606 |
+
z-index: 80;
|
| 607 |
+
/* under widgets (100) and controls (1000) */
|
| 608 |
+
display: block;
|
| 609 |
+
pointer-events: none;
|
| 610 |
+
/* enabled only when a tool is active */
|
| 611 |
+
}
|
| 612 |
+
|
| 613 |
+
/* Tools widget */
|
| 614 |
+
.tools-widget {
|
| 615 |
+
position: fixed;
|
| 616 |
+
bottom: 20px;
|
| 617 |
+
/* default; JS will stack */
|
| 618 |
+
right: 20px;
|
| 619 |
+
left: auto;
|
| 620 |
+
top: auto;
|
| 621 |
+
width: 220px;
|
| 622 |
+
background: var(--bg-secondary);
|
| 623 |
+
border: 1px solid var(--border-primary);
|
| 624 |
+
border-radius: 2px;
|
| 625 |
+
padding: 0.5rem;
|
| 626 |
+
font-size: 0.7rem;
|
| 627 |
+
z-index: 100;
|
| 628 |
+
opacity: 0.95;
|
| 629 |
+
}
|
| 630 |
+
|
| 631 |
+
.tools-title {
|
| 632 |
+
font-weight: bold;
|
| 633 |
+
color: var(--text-secondary);
|
| 634 |
+
margin-bottom: 0.5rem;
|
| 635 |
+
padding-bottom: 0.25rem;
|
| 636 |
+
border-bottom: 1px solid var(--border-primary);
|
| 637 |
+
cursor: grab;
|
| 638 |
+
user-select: none;
|
| 639 |
+
}
|
| 640 |
+
|
| 641 |
+
.tools-row {
|
| 642 |
+
display: flex;
|
| 643 |
+
gap: 0.4rem;
|
| 644 |
+
flex-wrap: wrap;
|
| 645 |
+
}
|
| 646 |
+
|
| 647 |
+
.tool-button {
|
| 648 |
+
background: var(--bg-tertiary);
|
| 649 |
+
border: 1px solid var(--border-primary);
|
| 650 |
+
border-radius: 2px;
|
| 651 |
+
padding: 0.25rem 0.4rem;
|
| 652 |
+
cursor: pointer;
|
| 653 |
+
color: var(--text-secondary);
|
| 654 |
+
font-family: inherit;
|
| 655 |
+
font-size: 0.75rem;
|
| 656 |
+
user-select: none;
|
| 657 |
+
}
|
| 658 |
+
|
| 659 |
+
.tool-button:hover {
|
| 660 |
+
color: var(--text-primary);
|
| 661 |
+
}
|
| 662 |
+
|
| 663 |
+
.tool-button.active {
|
| 664 |
+
color: var(--text-primary);
|
| 665 |
+
border-color: var(--text-secondary);
|
| 666 |
+
background: var(--bg-secondary);
|
| 667 |
+
}
|
| 668 |
+
|
| 669 |
+
.minimap:hover,
|
| 670 |
+
.file-explorer:hover {
|
| 671 |
+
opacity: 1;
|
| 672 |
+
}
|
| 673 |
+
|
| 674 |
+
.minimap-title {
|
| 675 |
+
font-weight: bold;
|
| 676 |
+
color: var(--text-secondary);
|
| 677 |
+
margin-bottom: 0.5rem;
|
| 678 |
+
padding-bottom: 0.25rem;
|
| 679 |
+
border-bottom: 1px solid var(--border-primary);
|
| 680 |
+
cursor: grab;
|
| 681 |
+
/* drag handle */
|
| 682 |
+
user-select: none;
|
| 683 |
+
}
|
| 684 |
+
|
| 685 |
+
.minimap-item {
|
| 686 |
+
display: block;
|
| 687 |
+
color: var(--text-secondary);
|
| 688 |
+
text-decoration: none;
|
| 689 |
+
padding: 0.15rem 0;
|
| 690 |
+
border-left: 2px solid transparent;
|
| 691 |
+
padding-left: 0.5rem;
|
| 692 |
+
transition: all 0.2s ease;
|
| 693 |
+
cursor: pointer;
|
| 694 |
+
}
|
| 695 |
+
|
| 696 |
+
.minimap-item:hover {
|
| 697 |
+
color: var(--text-primary);
|
| 698 |
+
border-left-color: var(--text-secondary);
|
| 699 |
+
}
|
| 700 |
+
|
| 701 |
+
.minimap-item.active {
|
| 702 |
+
color: var(--text-primary);
|
| 703 |
+
border-left-color: var(--text-link);
|
| 704 |
+
}
|
| 705 |
+
|
| 706 |
+
.minimap-heading {
|
| 707 |
+
font-weight: normal;
|
| 708 |
+
}
|
| 709 |
+
|
| 710 |
+
.minimap-heading.h1 {
|
| 711 |
+
padding-left: 0.5rem;
|
| 712 |
+
}
|
| 713 |
+
|
| 714 |
+
.minimap-heading.h2 {
|
| 715 |
+
padding-left: 1rem;
|
| 716 |
+
}
|
| 717 |
+
|
| 718 |
+
.minimap-heading.h3 {
|
| 719 |
+
padding-left: 1.5rem;
|
| 720 |
+
}
|
| 721 |
+
|
| 722 |
+
.minimap-heading.h4 {
|
| 723 |
+
padding-left: 2rem;
|
| 724 |
+
}
|
| 725 |
+
|
| 726 |
+
.minimap-heading.h5 {
|
| 727 |
+
padding-left: 2.5rem;
|
| 728 |
+
}
|
| 729 |
+
|
| 730 |
+
.minimap-heading.h6 {
|
| 731 |
+
padding-left: 3rem;
|
| 732 |
+
}
|
| 733 |
+
|
| 734 |
+
.minimap-cell {
|
| 735 |
+
color: var(--text-link);
|
| 736 |
+
opacity: 0.8;
|
| 737 |
+
font-style: italic;
|
| 738 |
+
}
|
| 739 |
+
|
| 740 |
+
.minimap-cell:hover {
|
| 741 |
+
opacity: 1;
|
| 742 |
+
}
|
| 743 |
+
|
| 744 |
+
.file-explorer-title {
|
| 745 |
+
font-weight: bold;
|
| 746 |
+
color: var(--text-secondary);
|
| 747 |
+
margin-bottom: 0.5rem;
|
| 748 |
+
padding-bottom: 0.25rem;
|
| 749 |
+
border-bottom: 1px solid var(--border-primary);
|
| 750 |
+
cursor: grab;
|
| 751 |
+
/* drag handle */
|
| 752 |
+
user-select: none;
|
| 753 |
+
}
|
| 754 |
+
|
| 755 |
+
.file-explorer-section {
|
| 756 |
+
margin-bottom: 0.75rem;
|
| 757 |
+
}
|
| 758 |
+
|
| 759 |
+
.file-explorer-section-title {
|
| 760 |
+
font-weight: bold;
|
| 761 |
+
color: var(--text-secondary);
|
| 762 |
+
font-size: 0.65rem;
|
| 763 |
+
margin-bottom: 0.25rem;
|
| 764 |
+
text-transform: uppercase;
|
| 765 |
+
letter-spacing: 0.5px;
|
| 766 |
+
}
|
| 767 |
+
|
| 768 |
+
.file-explorer-item {
|
| 769 |
+
display: block;
|
| 770 |
+
color: var(--text-secondary);
|
| 771 |
+
text-decoration: none;
|
| 772 |
+
padding: 0.1rem 0;
|
| 773 |
+
margin-left: 0.5rem;
|
| 774 |
+
transition: color 0.2s ease;
|
| 775 |
+
cursor: pointer;
|
| 776 |
+
font-family: monospace;
|
| 777 |
+
}
|
| 778 |
+
|
| 779 |
+
.file-explorer-item:hover {
|
| 780 |
+
color: var(--text-primary);
|
| 781 |
+
}
|
| 782 |
+
|
| 783 |
+
.file-explorer-item.script {
|
| 784 |
+
color: var(--text-link);
|
| 785 |
+
}
|
| 786 |
+
|
| 787 |
+
.file-explorer-item.artifact {
|
| 788 |
+
color: var(--text-secondary);
|
| 789 |
+
opacity: 0.8;
|
| 790 |
+
}
|
| 791 |
+
|
| 792 |
+
|
| 793 |
+
/* Hide widgets on smaller screens */
|
| 794 |
+
@media (max-width: 768px) {
|
| 795 |
+
|
| 796 |
+
.minimap,
|
| 797 |
+
.file-explorer,
|
| 798 |
+
.tools-widget {
|
| 799 |
+
display: none;
|
| 800 |
+
}
|
| 801 |
+
}
|
| 802 |
+
|
| 803 |
+
.cell {
|
| 804 |
+
margin: 1rem 0;
|
| 805 |
+
border: 1px solid var(--border-primary);
|
| 806 |
+
border-radius: 2px;
|
| 807 |
+
overflow: hidden;
|
| 808 |
+
background: var(--bg-secondary);
|
| 809 |
+
}
|
| 810 |
+
|
| 811 |
+
:root[data-ui="none"] .cell {
|
| 812 |
+
margin: 1em 0;
|
| 813 |
+
border: none;
|
| 814 |
+
background: transparent;
|
| 815 |
+
}
|
| 816 |
+
|
| 817 |
+
.cell-header {
|
| 818 |
+
background: var(--bg-secondary);
|
| 819 |
+
padding: 0.5rem 1rem;
|
| 820 |
+
border-bottom: 1px solid var(--border-primary);
|
| 821 |
+
font-family: inherit;
|
| 822 |
+
font-size: 0.85rem;
|
| 823 |
+
}
|
| 824 |
+
|
| 825 |
+
:root[data-ui="none"] .cell-header {
|
| 826 |
+
background: transparent;
|
| 827 |
+
border: none;
|
| 828 |
+
padding: 0;
|
| 829 |
+
font-weight: bold;
|
| 830 |
+
}
|
| 831 |
+
|
| 832 |
+
:root[data-ui="none"] .cell-content {
|
| 833 |
+
padding: 0;
|
| 834 |
+
}
|
| 835 |
+
|
| 836 |
+
:root[data-ui="none"] .copy-button,
|
| 837 |
+
:root[data-ui="none"] .collapse-indicators,
|
| 838 |
+
:root[data-ui="none"] .cell-meta,
|
| 839 |
+
:root[data-ui="none"] .cell-outputs-header {
|
| 840 |
+
display: none !important;
|
| 841 |
+
}
|
| 842 |
+
|
| 843 |
+
:root[data-ui="none"] pre,
|
| 844 |
+
:root[data-ui="none"] code {
|
| 845 |
+
font-family: Menlo, Monaco, 'Courier New', monospace;
|
| 846 |
+
}
|
| 847 |
+
|
| 848 |
+
:root[data-ui="none"] .code-content pre {
|
| 849 |
+
background: #f9f9f9;
|
| 850 |
+
border: 1px solid #ddd;
|
| 851 |
+
padding: 8px;
|
| 852 |
+
}
|
| 853 |
+
|
| 854 |
+
:root[data-ui="none"] .output {
|
| 855 |
+
background: transparent;
|
| 856 |
+
border: none;
|
| 857 |
+
padding: 0.25em 0;
|
| 858 |
+
}
|
| 859 |
+
|
| 860 |
+
color: var(--text-secondary);
|
| 861 |
+
cursor: pointer;
|
| 862 |
+
user-select: none;
|
| 863 |
+
transition: background-color 0.2s ease;
|
| 864 |
+
}
|
| 865 |
+
|
| 866 |
+
.cell-header:hover {
|
| 867 |
+
background: var(--bg-tertiary);
|
| 868 |
+
}
|
| 869 |
+
|
| 870 |
+
.collapse-indicators {
|
| 871 |
+
color: var(--text-secondary);
|
| 872 |
+
font-size: 0.8rem;
|
| 873 |
+
opacity: 0.7;
|
| 874 |
+
}
|
| 875 |
+
|
| 876 |
+
.collapse-indicators span:hover {
|
| 877 |
+
color: var(--text-primary);
|
| 878 |
+
opacity: 1;
|
| 879 |
+
}
|
| 880 |
+
|
| 881 |
+
.cell-code {
|
| 882 |
+
display: block;
|
| 883 |
+
background: var(--bg-code);
|
| 884 |
+
}
|
| 885 |
+
|
| 886 |
+
.cell-code.collapsed {
|
| 887 |
+
display: none;
|
| 888 |
+
}
|
| 889 |
+
|
| 890 |
+
.cell-code pre {
|
| 891 |
+
margin: 0;
|
| 892 |
+
padding: 0.75rem;
|
| 893 |
+
background: var(--bg-code);
|
| 894 |
+
overflow-x: auto;
|
| 895 |
+
color: var(--text-primary);
|
| 896 |
+
}
|
| 897 |
+
|
| 898 |
+
.cell-output {
|
| 899 |
+
padding: 0.75rem;
|
| 900 |
+
/* background: var(--bg-primary); */
|
| 901 |
+
background: var(--bg-secondary);
|
| 902 |
+
}
|
| 903 |
+
|
| 904 |
+
.cell-output.collapsed {
|
| 905 |
+
display: none;
|
| 906 |
+
}
|
| 907 |
+
|
| 908 |
+
.cell-stdout {
|
| 909 |
+
background: var(--bg-tertiary);
|
| 910 |
+
padding: 0.75rem;
|
| 911 |
+
border-radius: 1px;
|
| 912 |
+
/* margin: 0.25rem 0; */
|
| 913 |
+
font-family: inherit;
|
| 914 |
+
font-size: 0.9rem;
|
| 915 |
+
white-space: pre-wrap;
|
| 916 |
+
color: var(--text-primary);
|
| 917 |
+
}
|
| 918 |
+
|
| 919 |
+
.cell-stdout {
|
| 920 |
+
background: var(--bg-tertiary);
|
| 921 |
+
padding: 0.75rem;
|
| 922 |
+
border-radius: 1px;
|
| 923 |
+
font-family: inherit;
|
| 924 |
+
font-size: 0.9rem;
|
| 925 |
+
color: var(--text-primary);
|
| 926 |
+
|
| 927 |
+
/* key bits */
|
| 928 |
+
overflow: auto;
|
| 929 |
+
/* show scrollbars when needed */
|
| 930 |
+
max-width: 100%;
|
| 931 |
+
/* respects whatever layout width you give it */
|
| 932 |
+
}
|
| 933 |
+
|
| 934 |
+
.cell-stdout .stdout-text {
|
| 935 |
+
margin: 0;
|
| 936 |
+
/* reset pre default margin */
|
| 937 |
+
white-space: pre;
|
| 938 |
+
/* keep line breaks, NO wrapping */
|
| 939 |
+
display: inline-block;
|
| 940 |
+
/* shrink-to-content */
|
| 941 |
+
min-width: max-content;
|
| 942 |
+
/* allow very long lines to define intrinsic width */
|
| 943 |
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
| 944 |
+
tab-size: 2;
|
| 945 |
+
}
|
| 946 |
+
|
| 947 |
+
.cell-stderr {
|
| 948 |
+
background: var(--bg-error);
|
| 949 |
+
border-left: 2px solid var(--border-error);
|
| 950 |
+
padding: 1rem;
|
| 951 |
+
margin: 0.5rem 0;
|
| 952 |
+
font-family: inherit;
|
| 953 |
+
font-size: 0.9rem;
|
| 954 |
+
color: var(--text-error);
|
| 955 |
+
white-space: pre-wrap;
|
| 956 |
+
}
|
| 957 |
+
|
| 958 |
+
.uv-install-logs {
|
| 959 |
+
margin: 0.5rem 0;
|
| 960 |
+
}
|
| 961 |
+
|
| 962 |
+
.uv-logs-header {
|
| 963 |
+
cursor: pointer;
|
| 964 |
+
padding: 0.75rem;
|
| 965 |
+
border-left: 3px solid var(--border-color);
|
| 966 |
+
font-family: inherit;
|
| 967 |
+
font-size: 0.85rem;
|
| 968 |
+
color: var(--text-secondary);
|
| 969 |
+
user-select: none;
|
| 970 |
+
}
|
| 971 |
+
|
| 972 |
+
.uv-logs-content {
|
| 973 |
+
background: var(--bg-secondary);
|
| 974 |
+
padding: 1rem;
|
| 975 |
+
border-left: 3px solid var(--border-color);
|
| 976 |
+
white-space: pre-wrap;
|
| 977 |
+
font-family: monospace;
|
| 978 |
+
font-size: 0.85rem;
|
| 979 |
+
color: var(--text-secondary);
|
| 980 |
+
overflow-x: auto;
|
| 981 |
+
}
|
| 982 |
+
|
| 983 |
+
.cell-artifacts {
|
| 984 |
+
margin: 1rem 0;
|
| 985 |
+
}
|
| 986 |
+
|
| 987 |
+
.cell-artifacts h4 {
|
| 988 |
+
margin: 0 0 0.5rem 0;
|
| 989 |
+
color: var(--text-secondary);
|
| 990 |
+
font-size: 0.9rem;
|
| 991 |
+
}
|
| 992 |
+
|
| 993 |
+
.artifact {
|
| 994 |
+
display: inline-block;
|
| 995 |
+
background: var(--bg-artifact);
|
| 996 |
+
padding: 0.25rem 0.5rem;
|
| 997 |
+
border-radius: 1px;
|
| 998 |
+
margin: 0.25rem 0.5rem 0.25rem 0;
|
| 999 |
+
font-family: inherit;
|
| 1000 |
+
font-size: 0.8rem;
|
| 1001 |
+
color: var(--text-link);
|
| 1002 |
+
text-decoration: none;
|
| 1003 |
+
transition: background-color 0.2s ease;
|
| 1004 |
+
border: 1px solid var(--border-primary);
|
| 1005 |
+
}
|
| 1006 |
+
|
| 1007 |
+
.artifact:hover {
|
| 1008 |
+
background: var(--bg-artifact-hover);
|
| 1009 |
+
}
|
| 1010 |
+
|
| 1011 |
+
.artifact-preview {
|
| 1012 |
+
margin-top: 1rem;
|
| 1013 |
+
}
|
| 1014 |
+
|
| 1015 |
+
.artifact-preview img {
|
| 1016 |
+
max-width: 100%;
|
| 1017 |
+
height: auto;
|
| 1018 |
+
border: 1px solid var(--border-primary);
|
| 1019 |
+
border-radius: 1px;
|
| 1020 |
+
}
|
| 1021 |
+
|
| 1022 |
+
.artifact-preview svg {
|
| 1023 |
+
max-width: 100%;
|
| 1024 |
+
height: auto;
|
| 1025 |
+
border: 1px solid var(--border-primary);
|
| 1026 |
+
border-radius: 1px;
|
| 1027 |
+
display: block;
|
| 1028 |
+
}
|
| 1029 |
+
|
| 1030 |
+
/* Style SVG text elements */
|
| 1031 |
+
.artifact-preview svg g {
|
| 1032 |
+
fill: var(--text-primary) !important;
|
| 1033 |
+
}
|
| 1034 |
+
|
| 1035 |
+
/* Auto-theme SVG elements */
|
| 1036 |
+
.artifact-preview svg {
|
| 1037 |
+
background: transparent;
|
| 1038 |
+
}
|
| 1039 |
+
|
| 1040 |
+
/* Invert SVG images in dark mode */
|
| 1041 |
+
:root[data-theme="dark"] .artifact-preview img[src$=".svg"] {
|
| 1042 |
+
filter: invert(0.9) hue-rotate(180deg);
|
| 1043 |
+
}
|
| 1044 |
+
|
| 1045 |
+
/* Keep SVG images readable in monocolor mode */
|
| 1046 |
+
:root[data-ui="monocolor"] .artifact-preview img[src$=".svg"] {
|
| 1047 |
+
filter: none;
|
| 1048 |
+
}
|
| 1049 |
+
|
| 1050 |
+
/* CSV table styling */
|
| 1051 |
+
.artifact-csv {
|
| 1052 |
+
margin-top: 1rem;
|
| 1053 |
+
overflow-x: auto;
|
| 1054 |
+
}
|
| 1055 |
+
|
| 1056 |
+
.csv-table {
|
| 1057 |
+
width: 100%;
|
| 1058 |
+
border-collapse: collapse;
|
| 1059 |
+
font-size: 0.9rem;
|
| 1060 |
+
background: var(--bg-secondary);
|
| 1061 |
+
border: 1px solid var(--border-primary);
|
| 1062 |
+
border-radius: 1px;
|
| 1063 |
+
}
|
| 1064 |
+
|
| 1065 |
+
.csv-table th,
|
| 1066 |
+
.csv-table td {
|
| 1067 |
+
padding: 0.5rem 0.75rem;
|
| 1068 |
+
text-align: left;
|
| 1069 |
+
border: 1px solid var(--border-primary);
|
| 1070 |
+
}
|
| 1071 |
+
|
| 1072 |
+
.csv-table th {
|
| 1073 |
+
background: var(--bg-tertiary);
|
| 1074 |
+
font-weight: 600;
|
| 1075 |
+
color: var(--text-primary);
|
| 1076 |
+
}
|
| 1077 |
+
|
| 1078 |
+
.csv-table tbody tr:hover {
|
| 1079 |
+
background: var(--bg-artifact-hover);
|
| 1080 |
+
}
|
| 1081 |
+
|
| 1082 |
+
.artifact-csv-error {
|
| 1083 |
+
margin-top: 1rem;
|
| 1084 |
+
padding: 1rem;
|
| 1085 |
+
background: var(--bg-error);
|
| 1086 |
+
color: var(--text-error);
|
| 1087 |
+
border: 1px solid var(--border-error);
|
| 1088 |
+
border-radius: 1px;
|
| 1089 |
+
}
|
| 1090 |
+
|
| 1091 |
+
.cell-failed {
|
| 1092 |
+
border-color: var(--border-cell-failed);
|
| 1093 |
+
}
|
| 1094 |
+
|
| 1095 |
+
.cell-failed .cell-header {
|
| 1096 |
+
background: var(--bg-error);
|
| 1097 |
+
color: var(--text-error);
|
| 1098 |
+
}
|
| 1099 |
+
|
| 1100 |
+
.cell-commented {
|
| 1101 |
+
opacity: 0.6;
|
| 1102 |
+
border-style: dashed;
|
| 1103 |
+
}
|
| 1104 |
+
|
| 1105 |
+
.cell-commented .cell-header {
|
| 1106 |
+
background: var(--bg-secondary);
|
| 1107 |
+
color: var(--text-secondary);
|
| 1108 |
+
font-style: italic;
|
| 1109 |
+
}
|
| 1110 |
+
|
| 1111 |
+
.run-btn {
|
| 1112 |
+
background: var(--bg-tertiary);
|
| 1113 |
+
border: 1px solid var(--border-primary);
|
| 1114 |
+
padding: 2px 6px;
|
| 1115 |
+
border-radius: 2px;
|
| 1116 |
+
color: var(--text-secondary);
|
| 1117 |
+
cursor: pointer;
|
| 1118 |
+
font-size: 0.75em;
|
| 1119 |
+
font-family: inherit;
|
| 1120 |
+
margin-left: 4px;
|
| 1121 |
+
}
|
| 1122 |
+
|
| 1123 |
+
.run-btn:hover {
|
| 1124 |
+
color: var(--text-primary);
|
| 1125 |
+
background: var(--bg-primary);
|
| 1126 |
+
}
|
| 1127 |
+
|
| 1128 |
+
.run-btn:disabled {
|
| 1129 |
+
opacity: 0.6;
|
| 1130 |
+
cursor: not-allowed;
|
| 1131 |
+
}
|
| 1132 |
+
|
| 1133 |
+
.copy-btn {
|
| 1134 |
+
background: var(--bg-tertiary);
|
| 1135 |
+
border: 1px solid var(--border-primary);
|
| 1136 |
+
padding: 2px 6px;
|
| 1137 |
+
border-radius: 2px;
|
| 1138 |
+
color: var(--text-secondary);
|
| 1139 |
+
cursor: pointer;
|
| 1140 |
+
font-size: 0.75em;
|
| 1141 |
+
font-family: inherit;
|
| 1142 |
+
margin-left: 4px;
|
| 1143 |
+
}
|
| 1144 |
+
|
| 1145 |
+
.copy-btn:hover {
|
| 1146 |
+
color: var(--text-primary);
|
| 1147 |
+
background: var(--bg-primary);
|
| 1148 |
+
}
|
| 1149 |
+
|
| 1150 |
+
.copy-btn:disabled {
|
| 1151 |
+
opacity: 0.6;
|
| 1152 |
+
cursor: not-allowed;
|
| 1153 |
+
}
|
| 1154 |
+
|
| 1155 |
+
.copy-btn.copied {
|
| 1156 |
+
color: #4caf50;
|
| 1157 |
+
background: var(--bg-primary);
|
| 1158 |
+
border-color: #4caf50;
|
| 1159 |
+
transition: all 0.2s ease;
|
| 1160 |
+
}
|
| 1161 |
+
|
| 1162 |
+
.raw-btn {
|
| 1163 |
+
background: var(--bg-tertiary);
|
| 1164 |
+
border: 1px solid var(--border-primary);
|
| 1165 |
+
padding: 2px 6px;
|
| 1166 |
+
border-radius: 2px;
|
| 1167 |
+
color: var(--text-secondary);
|
| 1168 |
+
cursor: pointer;
|
| 1169 |
+
font-size: 0.75em;
|
| 1170 |
+
font-family: inherit;
|
| 1171 |
+
margin-left: 4px;
|
| 1172 |
+
text-decoration: none;
|
| 1173 |
+
display: inline-block;
|
| 1174 |
+
}
|
| 1175 |
+
|
| 1176 |
+
.raw-btn:hover {
|
| 1177 |
+
color: var(--text-primary);
|
| 1178 |
+
background: var(--bg-primary);
|
| 1179 |
+
text-decoration: none;
|
| 1180 |
+
}
|
| 1181 |
+
|
| 1182 |
+
.github-btn {
|
| 1183 |
+
background: var(--bg-tertiary);
|
| 1184 |
+
border: 1px solid var(--border-primary);
|
| 1185 |
+
padding: 2px 6px;
|
| 1186 |
+
border-radius: 2px;
|
| 1187 |
+
color: var(--text-secondary);
|
| 1188 |
+
cursor: pointer;
|
| 1189 |
+
font-size: 0.75em;
|
| 1190 |
+
font-family: inherit;
|
| 1191 |
+
margin-left: 4px;
|
| 1192 |
+
text-decoration: none;
|
| 1193 |
+
display: inline-block;
|
| 1194 |
+
}
|
| 1195 |
+
|
| 1196 |
+
.github-btn:hover {
|
| 1197 |
+
color: var(--text-primary);
|
| 1198 |
+
background: var(--bg-primary);
|
| 1199 |
+
text-decoration: none;
|
| 1200 |
+
}
|
| 1201 |
+
|
| 1202 |
+
.hf-btn {
|
| 1203 |
+
background: var(--bg-tertiary);
|
| 1204 |
+
border: 1px solid var(--border-primary);
|
| 1205 |
+
padding: 2px 6px;
|
| 1206 |
+
border-radius: 2px;
|
| 1207 |
+
color: var(--text-secondary);
|
| 1208 |
+
cursor: pointer;
|
| 1209 |
+
font-size: 0.75em;
|
| 1210 |
+
font-family: inherit;
|
| 1211 |
+
margin-left: 4px;
|
| 1212 |
+
text-decoration: none;
|
| 1213 |
+
display: inline-block;
|
| 1214 |
+
}
|
| 1215 |
+
|
| 1216 |
+
.hf-btn:hover {
|
| 1217 |
+
color: var(--text-primary);
|
| 1218 |
+
background: var(--bg-primary);
|
| 1219 |
+
text-decoration: none;
|
| 1220 |
+
}
|
| 1221 |
+
|
| 1222 |
+
.output-stale {
|
| 1223 |
+
opacity: 0.5;
|
| 1224 |
+
position: relative;
|
| 1225 |
+
}
|
| 1226 |
+
|
| 1227 |
+
.output-stale::after {
|
| 1228 |
+
content: '⏳ updating...';
|
| 1229 |
+
position: absolute;
|
| 1230 |
+
top: 8px;
|
| 1231 |
+
right: 8px;
|
| 1232 |
+
background: var(--bg-secondary);
|
| 1233 |
+
padding: 4px 8px;
|
| 1234 |
+
border-radius: 2px;
|
| 1235 |
+
font-size: 0.75em;
|
| 1236 |
+
color: var(--text-secondary);
|
| 1237 |
+
border: 1px solid var(--border-primary);
|
| 1238 |
+
}
|
| 1239 |
+
|
| 1240 |
+
h1,
|
| 1241 |
+
h2,
|
| 1242 |
+
h3,
|
| 1243 |
+
h4,
|
| 1244 |
+
h5,
|
| 1245 |
+
h6 {
|
| 1246 |
+
margin-top: 1.5rem;
|
| 1247 |
+
margin-bottom: 0.75rem;
|
| 1248 |
+
color: var(--text-primary);
|
| 1249 |
+
}
|
| 1250 |
+
|
| 1251 |
+
h1 {
|
| 1252 |
+
margin-top: 0;
|
| 1253 |
+
margin-bottom: 1rem;
|
| 1254 |
+
}
|
| 1255 |
+
|
| 1256 |
+
p {
|
| 1257 |
+
margin: 0.75rem 0;
|
| 1258 |
+
color: var(--text-primary);
|
| 1259 |
+
}
|
| 1260 |
+
|
| 1261 |
+
a {
|
| 1262 |
+
color: var(--text-link);
|
| 1263 |
+
}
|
| 1264 |
+
|
| 1265 |
+
img {
|
| 1266 |
+
max-width: 100%;
|
| 1267 |
+
height: auto;
|
| 1268 |
+
border-radius: 1px;
|
| 1269 |
+
box-shadow: none;
|
| 1270 |
+
}
|
| 1271 |
+
|
| 1272 |
+
pre,
|
| 1273 |
+
code {
|
| 1274 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace;
|
| 1275 |
+
font-size: var(--code-font-size);
|
| 1276 |
+
}
|
| 1277 |
+
|
| 1278 |
+
.code-wrap {
|
| 1279 |
+
position: relative;
|
| 1280 |
+
}
|
| 1281 |
+
|
| 1282 |
+
.code-line-highlight {
|
| 1283 |
+
display: none;
|
| 1284 |
+
position: absolute;
|
| 1285 |
+
left: 0;
|
| 1286 |
+
right: 0;
|
| 1287 |
+
height: 1.5em;
|
| 1288 |
+
background: rgba(255, 235, 170, 0.35);
|
| 1289 |
+
pointer-events: none;
|
| 1290 |
+
border-left: 3px solid #f4c542;
|
| 1291 |
+
}
|
| 1292 |
+
|
| 1293 |
+
.line-number {
|
| 1294 |
+
cursor: pointer;
|
| 1295 |
+
text-decoration: none;
|
| 1296 |
+
color: var(--text-secondary);
|
| 1297 |
+
padding: 0 0.25rem;
|
| 1298 |
+
}
|
| 1299 |
+
|
| 1300 |
+
.line-number.selected {
|
| 1301 |
+
background: rgba(255, 235, 170, 0.4);
|
| 1302 |
+
color: var(--text-primary);
|
| 1303 |
+
}
|
| 1304 |
+
|
| 1305 |
+
/* Line numbers */
|
| 1306 |
+
.highlight-with-lines {
|
| 1307 |
+
display: flex;
|
| 1308 |
+
}
|
| 1309 |
+
|
| 1310 |
+
.line-numbers {
|
| 1311 |
+
background: var(--bg-tertiary);
|
| 1312 |
+
padding: var(--code-pad-y) 0.5rem;
|
| 1313 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace;
|
| 1314 |
+
font-size: var(--code-font-size);
|
| 1315 |
+
line-height: var(--code-line-height);
|
| 1316 |
+
color: var(--text-secondary);
|
| 1317 |
+
user-select: none;
|
| 1318 |
+
text-align: right;
|
| 1319 |
+
border-right: 1px solid var(--border-primary);
|
| 1320 |
+
}
|
| 1321 |
+
|
| 1322 |
+
.line-numbers .line-number {
|
| 1323 |
+
display: block;
|
| 1324 |
+
line-height: var(--code-line-height);
|
| 1325 |
+
}
|
| 1326 |
+
|
| 1327 |
+
.highlight-with-lines .highlight {
|
| 1328 |
+
flex: 1;
|
| 1329 |
+
}
|
| 1330 |
+
|
| 1331 |
+
.highlight .hll {
|
| 1332 |
+
background-color: transparent;
|
| 1333 |
+
}
|
| 1334 |
+
|
| 1335 |
+
/* don't conflict with our highlight */
|
| 1336 |
+
.highlight pre {
|
| 1337 |
+
white-space: pre;
|
| 1338 |
+
margin: 0;
|
| 1339 |
+
padding: var(--code-pad-y) 0.75rem;
|
| 1340 |
+
line-height: var(--code-line-height);
|
| 1341 |
+
}
|
| 1342 |
+
|
| 1343 |
+
/* Collapsed code styling */
|
| 1344 |
+
.cell-code.collapsed {
|
| 1345 |
+
display: none;
|
| 1346 |
+
}
|
| 1347 |
+
|
| 1348 |
+
.cell-code.expanded {
|
| 1349 |
+
display: block;
|
| 1350 |
+
}
|
| 1351 |
+
|
| 1352 |
+
{
|
| 1353 |
+
% if config.collapse_code %
|
| 1354 |
+
}
|
| 1355 |
+
|
| 1356 |
+
.cell-code {
|
| 1357 |
+
display: none;
|
| 1358 |
+
}
|
| 1359 |
+
|
| 1360 |
+
{
|
| 1361 |
+
% else %
|
| 1362 |
+
}
|
| 1363 |
+
|
| 1364 |
+
.cell-code {
|
| 1365 |
+
display: block;
|
| 1366 |
+
border-bottom: 1px solid var(--border-primary);
|
| 1367 |
+
}
|
| 1368 |
+
|
| 1369 |
+
{
|
| 1370 |
+
% endif %
|
| 1371 |
+
}
|
| 1372 |
+
|
| 1373 |
+
{
|
| 1374 |
+
{
|
| 1375 |
+
pygments_css
|
| 1376 |
+
}
|
| 1377 |
+
}
|
| 1378 |
+
|
| 1379 |
+
/* Ensure our code metrics override Pygments defaults */
|
| 1380 |
+
.highlight pre {
|
| 1381 |
+
white-space: pre;
|
| 1382 |
+
margin: 0;
|
| 1383 |
+
padding: var(--code-pad-y) 0.75rem !important;
|
| 1384 |
+
line-height: var(--code-line-height) !important;
|
| 1385 |
+
font-size: var(--code-font-size) !important;
|
| 1386 |
+
font-family: 'Cascadia Mono', 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Monaco, 'Consolas', monospace !important;
|
| 1387 |
+
border: none;
|
| 1388 |
+
}
|
| 1389 |
+
|
| 1390 |
+
.line-numbers {
|
| 1391 |
+
line-height: var(--code-line-height) !important;
|
| 1392 |
+
}
|
| 1393 |
+
|
| 1394 |
+
.line-numbers .line-number {
|
| 1395 |
+
line-height: var(--code-line-height) !important;
|
| 1396 |
+
}
|
| 1397 |
+
|
| 1398 |
+
/* Custom CSS from frontmatter */
|
| 1399 |
+
{
|
| 1400 |
+
{
|
| 1401 |
+
config.custom_css
|
| 1402 |
+
}
|
| 1403 |
+
}
|
| 1404 |
+
|
| 1405 |
+
{
|
| 1406 |
+
# Override code font size from frontmatter (accept number as px) #
|
| 1407 |
+
}
|
| 1408 |
+
|
| 1409 |
+
{
|
| 1410 |
+
% if config.code_font_size is not none %
|
| 1411 |
+
}
|
| 1412 |
+
|
| 1413 |
+
{
|
| 1414 |
+
% if config.code_font_size is string %
|
| 1415 |
+
}
|
| 1416 |
+
|
| 1417 |
+
:root {
|
| 1418 |
+
--code-font-size: {
|
| 1419 |
+
{
|
| 1420 |
+
config.code_font_size
|
| 1421 |
+
}
|
| 1422 |
+
}
|
| 1423 |
+
|
| 1424 |
+
;
|
| 1425 |
+
}
|
| 1426 |
+
|
| 1427 |
+
{
|
| 1428 |
+
% else %
|
| 1429 |
+
}
|
| 1430 |
+
|
| 1431 |
+
:root {
|
| 1432 |
+
--code-font-size: {
|
| 1433 |
+
{
|
| 1434 |
+
config.code_font_size
|
| 1435 |
+
}
|
| 1436 |
+
}
|
| 1437 |
+
|
| 1438 |
+
px;
|
| 1439 |
+
}
|
| 1440 |
+
|
| 1441 |
+
{
|
| 1442 |
+
% endif %
|
| 1443 |
+
}
|
| 1444 |
+
|
| 1445 |
+
{
|
| 1446 |
+
% endif %
|
| 1447 |
+
}
|
| 1448 |
+
|
| 1449 |
+
/* Cursor for tools */
|
| 1450 |
+
body[data-tool="arrow"] .main-content {
|
| 1451 |
+
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%23e53935" stroke-width="2"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>') 12 12, crosshair;
|
| 1452 |
+
}
|
| 1453 |
+
|
| 1454 |
+
body[data-tool="pen"] .main-content {
|
| 1455 |
+
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%23e53935" stroke-width="2"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><circle cx="4" cy="20" r="2" fill="%23e53935"/></svg>') 4 20, pointer;
|
| 1456 |
+
}
|
| 1457 |
+
|
| 1458 |
+
body[data-tool="eraser"] .main-content {
|
| 1459 |
+
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%23e53935" stroke-width="2"><path d="M20 20H7l-7-7 7-7h13v14z"/><path d="M13 13l7-7"/><path d="M13 13L9 9"/></svg>') 12 12, auto;
|
| 1460 |
+
}
|
| 1461 |
+
|
| 1462 |
+
/* Color picker styles */
|
| 1463 |
+
.tools-section-title {
|
| 1464 |
+
font-weight: bold;
|
| 1465 |
+
color: var(--text-secondary);
|
| 1466 |
+
font-size: 0.65rem;
|
| 1467 |
+
margin: 0.75rem 0 0.5rem 0;
|
| 1468 |
+
text-transform: uppercase;
|
| 1469 |
+
letter-spacing: 0.5px;
|
| 1470 |
+
}
|
| 1471 |
+
|
| 1472 |
+
.color-row {
|
| 1473 |
+
display: grid;
|
| 1474 |
+
grid-template-columns: repeat(6, 1fr);
|
| 1475 |
+
gap: 0.25rem;
|
| 1476 |
+
margin-bottom: 0.5rem;
|
| 1477 |
+
}
|
| 1478 |
+
|
| 1479 |
+
.color-swatch {
|
| 1480 |
+
width: 18px;
|
| 1481 |
+
height: 18px;
|
| 1482 |
+
border: 2px solid var(--border-primary);
|
| 1483 |
+
border-radius: 3px;
|
| 1484 |
+
cursor: pointer;
|
| 1485 |
+
transition: all 0.2s ease;
|
| 1486 |
+
position: relative;
|
| 1487 |
+
}
|
| 1488 |
+
|
| 1489 |
+
.color-swatch:hover {
|
| 1490 |
+
transform: scale(1.1);
|
| 1491 |
+
border-color: var(--text-secondary);
|
| 1492 |
+
}
|
| 1493 |
+
|
| 1494 |
+
.color-swatch.selected {
|
| 1495 |
+
border-color: var(--text-primary);
|
| 1496 |
+
box-shadow: 0 0 0 2px var(--text-link);
|
| 1497 |
+
}
|
| 1498 |
+
|
| 1499 |
+
.color-swatch.selected::after {
|
| 1500 |
+
content: '✓';
|
| 1501 |
+
position: absolute;
|
| 1502 |
+
top: 50%;
|
| 1503 |
+
left: 50%;
|
| 1504 |
+
transform: translate(-50%, -50%);
|
| 1505 |
+
color: white;
|
| 1506 |
+
font-size: 10px;
|
| 1507 |
+
font-weight: bold;
|
| 1508 |
+
text-shadow: 1px 1px 1px black;
|
| 1509 |
+
}
|
| 1510 |
+
|
| 1511 |
+
.color-input {
|
| 1512 |
+
width: 24px;
|
| 1513 |
+
height: 24px;
|
| 1514 |
+
border: 2px solid var(--border-primary);
|
| 1515 |
+
border-radius: 3px;
|
| 1516 |
+
cursor: pointer;
|
| 1517 |
+
background: none;
|
| 1518 |
+
padding: 0;
|
| 1519 |
+
grid-column: span 2;
|
| 1520 |
+
justify-self: center;
|
| 1521 |
+
}
|
| 1522 |
+
|
| 1523 |
+
.color-input:hover {
|
| 1524 |
+
border-color: var(--text-secondary);
|
| 1525 |
+
}
|
| 1526 |
+
|
| 1527 |
+
/* Thickness slider styles */
|
| 1528 |
+
.thickness-row {
|
| 1529 |
+
display: flex;
|
| 1530 |
+
align-items: center;
|
| 1531 |
+
gap: 0.5rem;
|
| 1532 |
+
margin-top: 0.75rem;
|
| 1533 |
+
}
|
| 1534 |
+
|
| 1535 |
+
.thickness-slider {
|
| 1536 |
+
flex: 1;
|
| 1537 |
+
-webkit-appearance: none;
|
| 1538 |
+
appearance: none;
|
| 1539 |
+
height: 4px;
|
| 1540 |
+
background: var(--border-primary);
|
| 1541 |
+
border-radius: 2px;
|
| 1542 |
+
outline: none;
|
| 1543 |
+
opacity: 0.7;
|
| 1544 |
+
transition: opacity 0.2s;
|
| 1545 |
+
}
|
| 1546 |
+
|
| 1547 |
+
.thickness-slider:hover {
|
| 1548 |
+
opacity: 1;
|
| 1549 |
+
}
|
| 1550 |
+
|
| 1551 |
+
.thickness-slider::-webkit-slider-thumb {
|
| 1552 |
+
-webkit-appearance: none;
|
| 1553 |
+
appearance: none;
|
| 1554 |
+
width: 12px;
|
| 1555 |
+
height: 12px;
|
| 1556 |
+
background: var(--text-link);
|
| 1557 |
+
border-radius: 50%;
|
| 1558 |
+
cursor: pointer;
|
| 1559 |
+
}
|
| 1560 |
+
|
| 1561 |
+
.thickness-slider::-moz-range-thumb {
|
| 1562 |
+
width: 12px;
|
| 1563 |
+
height: 12px;
|
| 1564 |
+
background: var(--text-link);
|
| 1565 |
+
border-radius: 50%;
|
| 1566 |
+
cursor: pointer;
|
| 1567 |
+
border: none;
|
| 1568 |
+
}
|
| 1569 |
+
|
| 1570 |
+
.thickness-value {
|
| 1571 |
+
font-size: 0.7rem;
|
| 1572 |
+
color: var(--text-secondary);
|
| 1573 |
+
min-width: 20px;
|
| 1574 |
+
text-align: right;
|
| 1575 |
+
}
|
| 1576 |
+
|
| 1577 |
+
.highlight {
|
| 1578 |
+
background: none !important;
|
| 1579 |
+
}
|
| 1580 |
+
|
| 1581 |
+
/* Loading animations */
|
| 1582 |
+
.loading-spinner {
|
| 1583 |
+
display: inline-block;
|
| 1584 |
+
width: 16px;
|
| 1585 |
+
height: 16px;
|
| 1586 |
+
border: 2px solid var(--border-primary);
|
| 1587 |
+
border-radius: 50%;
|
| 1588 |
+
border-top-color: var(--text-link);
|
| 1589 |
+
animation: spin 1s linear infinite;
|
| 1590 |
+
margin-right: 8px;
|
| 1591 |
+
vertical-align: middle;
|
| 1592 |
+
}
|
| 1593 |
+
|
| 1594 |
+
@keyframes spin {
|
| 1595 |
+
to {
|
| 1596 |
+
transform: rotate(360deg);
|
| 1597 |
+
}
|
| 1598 |
+
}
|
| 1599 |
+
|
| 1600 |
+
.loading-skeleton {
|
| 1601 |
+
display: inline-block;
|
| 1602 |
+
background: var(--bg-tertiary);
|
| 1603 |
+
background: linear-gradient(90deg,
|
| 1604 |
+
var(--bg-tertiary) 25%,
|
| 1605 |
+
var(--bg-secondary) 50%,
|
| 1606 |
+
var(--bg-tertiary) 75%);
|
| 1607 |
+
background-size: 200% 100%;
|
| 1608 |
+
animation: loading-shimmer 2s ease-in-out infinite;
|
| 1609 |
+
border-radius: 2px;
|
| 1610 |
+
height: 1em;
|
| 1611 |
+
width: 80px;
|
| 1612 |
+
vertical-align: middle;
|
| 1613 |
+
}
|
| 1614 |
+
|
| 1615 |
+
@keyframes loading-shimmer {
|
| 1616 |
+
0% {
|
| 1617 |
+
background-position: -200% 0;
|
| 1618 |
+
}
|
| 1619 |
+
|
| 1620 |
+
100% {
|
| 1621 |
+
background-position: 200% 0;
|
| 1622 |
+
}
|
| 1623 |
+
}
|
| 1624 |
+
|
| 1625 |
+
/* Loading state for cell output */
|
| 1626 |
+
.cell-output:has(.loading-spinner) {
|
| 1627 |
+
opacity: 0.7;
|
| 1628 |
+
background: var(--bg-secondary);
|
| 1629 |
+
/* border-left: 3px solid var(--text-link); */
|
| 1630 |
+
}
|
| 1631 |
</style>
|
| 1632 |
<script>
|
| 1633 |
// --- Drag utilities ---
|
rotary/results/artifacts/combine/latency.svg
CHANGED
|
|
Git LFS Details
|
|
|
Git LFS Details
|
rotary/results/combined_results.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|