Expand Jerboa repository atlas
ober
0e7981debdd65b32aa12756600a9ade80cfd1a9d
--- a/secure-site.ss +++ b/secure-site.ss @@ -9,7 +9,7 @@ "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAyNCIgaGVpZ2h0PSIxMDI0IiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHJvbGU9ImltZyIgYXJpYS1sYWJlbGxlZGJ5PSJ0aXRsZSBkZXNjIj4KICA8dGl0bGUgaWQ9InRpdGxlIj5KZXJib2EgbGFuZ3VhZ2UgbG9nbzwvdGl0bGU+CiAgPGRlc2MgaWQ9ImRlc2MiPkEgY2FydG9vbiBqZXJib2EgbWFzY290IHdpdGggbGFyZ2UgZWFycywgbG9uZyBoaW5kIGxlZ3MsIGEgY3VydmVkIHRhaWwsIGEgbGFtYmRhIGJhZGdlLCBhbmQgdGhlIEplcmJvYSB3b3JkbWFyay48L2Rlc2M+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImZ1ck1haW4iIHgxPSIzMDIiIHkxPSIyNDgiIHgyPSI3MjAiIHkyPSI3NTQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZGZmNGZmIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMC40OCIgc3RvcC1jb2xvcj0iIzhiYjlkNiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM1MjcxOGYiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImZ1ckRhcmsiIHgxPSI1MDgiIHkxPSIyMTQiIHgyPSI3NTIiIHkyPSI3MTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNmY5ZWMyIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzJmNGM2NSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYmVsbHkiIHgxPSIzOTIiIHkxPSI0MjEiIHgyPSI2MDAiIHkyPSI3MjkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZjRmYmZmIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2M2ZTNmMyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZWFySW5uZXIiIHgxPSIzNDQiIHkxPSIxMTEiIHgyPSI2ODAiIHkyPSIzNTUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZGNlY2ZmIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhjYWFkMiIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxmaWx0ZXIgaWQ9InNvZnRTaGFkb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgIDxmZURyb3BTaGFkb3cgZHg9IjAiIGR5PSIxOCIgc3RkRGV2aWF0aW9uPSIxOCIgZmxvb2QtY29sb3I9IiMwYjFkMmMiIGZsb29kLW9wYWNpdHk9IjAuMiIvPgogICAgPC9maWx0ZXI+CiAgICA8c3R5bGU+CiAgICAgIC5vdXRsaW5lIHsgc3Ryb2tlOiAjMTMyMzM0OyBzdHJva2Utd2lkdGg6IDE4OyBzdHJva2UtbGluZWNhcDogcm91bmQ7IHN0cm9rZS1saW5lam9pbjogcm91bmQ7IH0KICAgICAgLmRldGFpbCB7IHN0cm9rZTogIzEzMjMzNDsgc3Ryb2tlLXdpZHRoOiAxMjsgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOyBzdHJva2UtbGluZWpvaW46IHJvdW5kOyB9CiAgICAgIC5maW5lIHsgc3Ryb2tlOiAjMTMyMzM0OyBzdHJva2Utd2lkdGg6IDg7IHN0cm9rZS1saW5lY2FwOiByb3VuZDsgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsgfQogICAgPC9zdHlsZT4KICA8L2RlZnM+CgogIDxwYXRoIGQ9Ik0xOTkgODc1YzcyLTMzIDU1MC0zMyA2MjIgMCIgY2xhc3M9ImRldGFpbCIgb3BhY2l0eT0iMC4xNiIvPgoKICA8ZyBmaWx0ZXI9InVybCgjc29mdFNoYWRvdykiPgogICAgPHBhdGggZD0iTTcwOCA1NzVjNTcgMjIgMTExIDMyIDE1OSAyMSA2My0xNCA5MC01OCA3Ni0xMDAtMTItMzctNTUtNDktOTItMjgtMjUgMTQtNDMgNDMtMzUgNzIgNiAyMiAyNiAzNCA1MCAzMyIgY2xhc3M9ImRldGFpbCIgc3Ryb2tlPSIjMTMyMzM0Ii8+CiAgICA8cGF0aCBkPSJNNzA5IDU3NGM2MyAzMSAxMTkgNDMgMTY0IDI4IDU0LTE4IDc1LTYwIDYzLTk2LTEwLTI5LTQ1LTM4LTc0LTIyLTIwIDExLTMzIDM0LTI4IDUzIDQgMTcgMTkgMjQgMzYgMjMiIHN0cm9rZT0iI2M4ZTZmNiIgc3Ryb2tlLXdpZHRoPSIzMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CgogICAgPHBhdGggZD0iTTU0OCAxOTFjMjItNzMgNzctMTI5IDEyMy0xMjcgNDEgMiA1NyA1MSAzNCAxMTItMjAgNTQtNzEgMTExLTEyOSAxNDMiIGZpbGw9InVybCgjZnVyTWFpbikiIGNsYXNzPSJvdXRsaW5lIi8+CiAgICA8cGF0aCBkPSJNNTgyIDIwM2MxOC00NSA1Mi04MiA3OS04NiAyMi0zIDMwIDIwIDE4IDU1LTEyIDM1LTQ3IDc0LTg0IDk4IiBmaWxsPSJ1cmwoI2VhcklubmVyKSIgY2xhc3M9ImZpbmUiLz4KCiAgICA8cGF0aCBkPSJNNDMwIDIwNWMtMzItNzEtODgtMTE4LTEzMS0xMTAtNDAgNy00OCA1OC0xOCAxMTUgMjYgNTEgODMgMTAxIDE0NSAxMjQiIGZpbGw9InVybCgjZnVyTWFpbikiIGNsYXNzPSJvdXRsaW5lIi8+CiAgICA8cGF0aCBkPSJNMzk3IDIxOWMtMjMtNDMtNjEtNzQtODgtNzQtMjIgMS0yNyAyNS0xMSA1NyAxNiAzMyA1NSA2NyA5NSA4NSIgZmlsbD0idXJsKCNlYXJJbm5lcikiIGNsYXNzPSJmaW5lIi8+CgogICAgPHBhdGggZD0iTTYxNiA2NjljNTAgNDUgMTAyIDc2IDE2MiA3NSA0Mi0xIDY4IDE5IDY4IDQ3IDAgMzUtNDMgNTctOTcgNDUtNjgtMTUtMTIwLTU4LTE2Mi0xMjYiIGZpbGw9InVybCgjZnVyTWFpbikiIGNsYXNzPSJvdXRsaW5lIi8+CiAgICA8cGF0aCBkPSJNNjU1IDcyNGMzMyAyNiA2OCA0MCAxMDUgMzkgMjgtMSA0NiA5IDQ3IDI1IDEgMjAtMjggMzAtNjYgMjEtNDAtOS03OC0zOC0xMTMtODUiIGZpbGw9IiNkOWVmZmEiIGNsYXNzPSJmaW5lIi8+CgogICAgPHBhdGggZD0iTTM3NCA2NDFjLTYxIDM3LTEwOSA4Ni0xMzUgMTUxLTE4IDQ2LTU1IDU4LTgzIDM2LTM1LTI3LTIyLTgzIDI5LTEyMSA1NC00MSAxMDktNzQgMTY0LTk5IiBmaWxsPSJ1cmwoI2Z1ck1haW4pIiBjbGFzcz0ib3V0bGluZSIvPgogICAgPHBhdGggZD0iTTMxNyA2ODNjLTM2IDI4LTYzIDYzLTgxIDEwNS0xMCAyNC0yOCAzMi00MiAyMi0xOS0xNC0xMC00MyAyMi02OCAzNi0yNyA3Mi00OSAxMDgtNjYiIGZpbGw9IiNkOWVmZmEiIGNsYXNzPSJmaW5lIi8+CgogICAgPHBhdGggZD0iTTU3NSAzNjVjODQgNDAgMTQxIDEyNCAxMzkgMjE4LTQgMTM1LTkzIDIyMy0yMjEgMjE5LTEyNi01LTIxNy05OC0yMTEtMjI1IDQtOTIgNjEtMTc0IDE0NS0yMTIiIGZpbGw9InVybCgjZnVyTWFpbikiIGNsYXNzPSJvdXRsaW5lIi8+CiAgICA8cGF0aCBkPSJNNDEwIDQ2OWMtNTAgNTEtNzAgMTQyLTM5IDIxMSAyOCA2MiA3NiA5NSAxMzMgOTcgNjEgMiAxMTMtMzAgMTQzLTkyIDMyLTY5IDgtMTY0LTQxLTIxNi0yMiA3MS02MyAxMDktMTAwIDEwOS0zNiAwLTc0LTM3LTk2LTEwOVoiIGZpbGw9InVybCgjYmVsbHkpIiBjbGFzcz0iZGV0YWlsIi8+CgogICAgPHBhdGggZD0iTTUxMyAxODljMTAwIDAgMTc0IDcyIDE3NCAxNzQgMCAxMDQtNzYgMTg0LTE3NyAxODQtMTA2IDAtMTg0LTc2LTE4NC0xODEgMC0xMDUgNzgtMTc3IDE4Ny0xNzdaIiBmaWxsPSJ1cmwoI2Z1ck1haW4pIiBjbGFzcz0ib3V0bGluZSIvPgogICAgPHBhdGggZD0iTTQ0OCA0MTRjMjEgMzkgMTA5IDQxIDEzMiAxIDMgNTEtMjEgODgtNjUgODktNDUgMS03Mi0zNi02Ny05MFoiIGZpbGw9IiNmNmZiZmYiIGNsYXNzPSJmaW5lIi8+CiAgICA8cGF0aCBkPSJNNTEyIDM4NmMxOCAwIDM0IDkgMzQgMjIgMCAxNC0xNyAzMC0zNCAzMC0xOCAwLTM0LTE2LTM0LTMwIDAtMTMgMTYtMjIgMzQtMjJaIiBmaWxsPSIjMTMyMzM0Ii8+CiAgICA8cGF0aCBkPSJNNTAzIDQzNWMtMTQgMTgtMzEgMjYtNTEgMjYiIGNsYXNzPSJmaW5lIi8+CiAgICA8cGF0aCBkPSJNNTIyIDQzNWMxNSAxOCAzMiAyNiA1MiAyNiIgY2xhc3M9ImZpbmUiLz4KCiAgICA8Y2lyY2xlIGN4PSI0MzgiIGN5PSIzMzUiIHI9IjI0IiBmaWxsPSIjMTMyMzM0Ii8+CiAgICA8Y2lyY2xlIGN4PSI1ODUiIGN5PSIzMzUiIHI9IjI0IiBmaWxsPSIjMTMyMzM0Ii8+CiAgICA8Y2lyY2xlIGN4PSI0NDciIGN5PSIzMjYiIHI9IjciIGZpbGw9IiNmOGZjZmYiLz4KICAgIDxjaXJjbGUgY3g9IjU5NCIgY3k9IjMyNiIgcj0iNyIgZmlsbD0iI2Y4ZmNmZiIvPgogICAgPHBhdGggZD0iTTM0OSAzNzFjLTM4LTE1LTc1LTEzLTExMSA0IiBjbGFzcz0iZmluZSIvPgogICAgPHBhdGggZD0iTTM1MCA0MDdjLTQzIDAtNzkgMTEtMTEwIDM1IiBjbGFzcz0iZmluZSIvPgogICAgPHBhdGggZD0iTTY3NSAzNjljMzgtMTYgNzUtMTYgMTEyIDAiIGNsYXNzPSJmaW5lIi8+CiAgICA8cGF0aCBkPSJNNjc2IDQwNWM0NC0yIDgxIDggMTEzIDMxIiBjbGFzcz0iZmluZSIvPgoKICAgIDxwYXRoIGQ9Ik0zOTkgNTYwYy01MCA1LTg0IDM0LTEwNyA3NyIgY2xhc3M9ImRldGFpbCIvPgogICAgPHBhdGggZD0iTTYyNiA1NjBjNDkgNSA4MiAzMyAxMDQgNzQiIGNsYXNzPSJkZXRhaWwiLz4KICAgIDxwYXRoIGQ9Ik0zNjcgNTc1Yy0xOCAyMi0yOSA0NS0zMyA3MCIgY2xhc3M9ImZpbmUiLz4KICAgIDxwYXRoIGQ9Ik02NTkgNTc1YzE4IDIyIDI5IDQ1IDMzIDcwIiBjbGFzcz0iZmluZSIvPgoKICAgIDxwYXRoIGQ9Ik0zMTUgNDg5Yy0zNi0yLTU4IDE1LTY3IDUwIDI1LTE0IDUwLTE4IDc1LTkiIGZpbGw9InVybCgjZnVyTWFpbikiIGNsYXNzPSJvdXRsaW5lIi8+CiAgICA8cGF0aCBkPSJNNzA4IDQ4OWMzNi0yIDU4IDE1IDY3IDUwLTI1LTE0LTUwLTE4LTc1LTkiIGZpbGw9InVybCgjZnVyTWFpbikiIGNsYXNzPSJvdXRsaW5lIi8+CgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjE5IDYyNykgcm90YXRlKC0xMykiPgogICAgICA8Y2lyY2xlIGN4PSIwIiBjeT0iMCIgcj0iNzAiIGZpbGw9IiNlZWY4ZmYiIGNsYXNzPSJkZXRhaWwiLz4KICAgICAgPHRleHQgeD0iMCIgeT0iMzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJHZW9yZ2lhLCBUaW1lcyBOZXcgUm9tYW4sIHNlcmlmIiBmb250LXNpemU9IjExMiIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzEzMjMzNCIgc3Ryb2tlPSIjMTMyMzM0IiBzdHJva2Utd2lkdGg9IjIiPiYjOTU1OzwvdGV4dD4KICAgIDwvZz4KICA8L2c+CgogIDxnIGFyaWEtbGFiZWw9IkplcmJvYSI+CiAgICA8dGV4dCB4PSI1MTIiIHk9Ijk1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkF2ZW5pciBOZXh0LCBUcmVidWNoZXQgTVMsIEFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzNiIgZm9udC13ZWlnaHQ9IjkwMCIgbGV0dGVyLXNwYWNpbmc9IjAiIGZpbGw9IiMxMzIzMzQiIHN0cm9rZT0iI2U5ZjZmZiIgc3Ryb2tlLXdpZHRoPSIxMiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgcGFpbnQtb3JkZXI9InN0cm9rZSBmaWxsIj5KZXJib2E8L3RleHQ+CiAgPC9nPgogIDxwYXRoIGQ9Ik0yMzUgNzg0Yy00OCAyNi03NSA1OC03NSA5NiAwIDQ2IDQwIDgzIDExMiAxMTAiIGNsYXNzPSJkZXRhaWwiIG9wYWNpdHk9IjAuMzgiLz4KICA8cGF0aCBkPSJNNzg5IDc4NGM0OCAyNiA3NSA1OCA3NSA5NiAwIDQ2LTQwIDgzLTExMiAxMTAiIGNsYXNzPSJkZXRhaWwiIG9wYWNpdHk9IjAuMzgiLz4KPC9zdmc+Cg==") (define site-css - "html{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;color:#2c3e50;background:#fff}body{margin:0;font-size:16px;line-height:1.7}a{color:#2f8f68;text-decoration:none}a:hover{text-decoration:underline}.navbar{position:sticky;top:0;z-index:10;height:3.6rem;background:#fff;border-bottom:1px solid #eaecef;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;box-sizing:border-box}.brand{display:flex;align-items:center;color:#2c3e50;font-size:1.3rem;font-weight:650}.brand-mark{width:2.25rem;height:2.25rem;margin-right:.7rem}.nav{display:flex;gap:1.1rem;align-items:center;font-size:.95rem}.nav-link{color:#3a5169}.nav-link.active{color:#2f8f68;font-weight:650}.repo-link{border:1px solid #d4dde6;border-radius:6px;padding:.25rem .65rem;color:#3a5169}.home{max-width:980px;margin:0 auto;padding:0 2rem}.hero{text-align:center;padding:2.1rem 0 1rem}.hero img{display:block;max-width:270px;width:54vw;max-height:270px;margin:0 auto 1.1rem}.hero h1{font-size:3.25rem;line-height:1.08;margin:.7rem 0;color:#1f2d3a;letter-spacing:0}.description{max-width:43rem;margin:1rem auto 1.5rem;font-size:1.45rem;line-height:1.35;color:#5e7891}.actions{display:flex;gap:.8rem;justify-content:center;flex-wrap:wrap}.action-button{display:inline-block;background:#2f9f74;color:#fff;padding:.72rem 1.35rem;border-radius:4px;border-bottom:1px solid #267e5d;font-size:1.08rem}.action-button:hover{background:#37ad80;text-decoration:none}.secondary-button{display:inline-block;color:#3a5169;border:1px solid #cfd8e3;padding:.72rem 1.1rem;border-radius:4px}.secondary-button:hover{text-decoration:none;border-color:#91a4b7}.features{border-top:1px solid #eaecef;margin-top:2.3rem;padding:1.4rem 0 0;display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between}.feature{flex:1 1 30%;max-width:30%;padding-bottom:1.4rem}.feature h2{font-size:1.35rem;font-weight:560;color:#3a5169;margin:.75rem 0 .25rem}.feature p,.feature li{color:#4e6e8e}.feature ul{padding-left:1.2rem;margin:.45rem 0 0}.content{border-top:1px solid #eaecef;margin-top:2.2rem;padding:2rem 0 3rem}.content h1{font-size:2.3rem;line-height:1.16;color:#1f2d3a;margin:0 0 1rem}.content h2{font-size:1.45rem;color:#3a5169;margin:2rem 0 .45rem}.lead{font-size:1.25rem;color:#5e7891;max-width:48rem}.columns{display:grid;grid-template-columns:repeat(3,1fr);gap:1.1rem;margin-top:1.3rem}.panel{border:1px solid #e1e7ee;border-radius:6px;padding:1rem;background:#fff}.panel h3{margin:.1rem 0 .4rem;color:#2c3e50}.panel p{margin:.35rem 0;color:#4e6e8e}.panel ul{margin:.35rem 0;padding-left:1.15rem;color:#4e6e8e}.code{background:#282c34;color:#f8f8f2;border-radius:6px;padding:1rem 1.2rem;overflow:auto;line-height:1.45;font-family:\"SFMono-Regular\",Consolas,monospace;font-size:.92rem}.muted{color:#6f8194}.footer{border-top:1px solid #eaecef;color:#6f8194;text-align:center;padding:2rem;margin-top:1.2rem}.route-list{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}.label{font-size:.78rem;text-transform:uppercase;color:#7b8da0;letter-spacing:.05em}.badges{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.65rem}.badge{border:1px solid #d7e0e9;border-radius:999px;padding:.15rem .55rem;color:#4e6e8e;font-size:.86rem}@media(max-width:760px){.navbar{height:auto;min-height:3.6rem;align-items:flex-start;gap:.5rem;flex-direction:column;padding:.7rem 1rem}.nav{width:100%;overflow:auto;padding-bottom:.2rem}.home{padding:0 1.1rem}.hero{padding-top:1.3rem}.hero h1{font-size:2.35rem}.description{font-size:1.15rem}.features{display:block}.feature{max-width:100%}.columns,.route-list{grid-template-columns:1fr}.content h1{font-size:1.9rem}}") + "html{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;color:#2c3e50;background:#fff}body{margin:0;font-size:16px;line-height:1.7}a{color:#2f8f68;text-decoration:none}a:hover{text-decoration:underline}.navbar{position:sticky;top:0;z-index:10;height:3.6rem;background:#fff;border-bottom:1px solid #eaecef;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;box-sizing:border-box}.brand{display:flex;align-items:center;color:#2c3e50;font-size:1.3rem;font-weight:650}.brand-mark{width:2.25rem;height:2.25rem;margin-right:.7rem}.nav{display:flex;gap:1.1rem;align-items:center;font-size:.95rem}.nav-link{color:#3a5169}.nav-link.active{color:#2f8f68;font-weight:650}.repo-link{border:1px solid #d4dde6;border-radius:6px;padding:.25rem .65rem;color:#3a5169}.home{max-width:1080px;margin:0 auto;padding:0 2rem}.hero{text-align:center;padding:2.1rem 0 1rem}.hero img{display:block;max-width:270px;width:54vw;max-height:270px;margin:0 auto 1.1rem}.hero h1{font-size:3.25rem;line-height:1.08;margin:.7rem 0;color:#1f2d3a;letter-spacing:0}.description{max-width:43rem;margin:1rem auto 1.5rem;font-size:1.45rem;line-height:1.35;color:#5e7891}.actions{display:flex;gap:.8rem;justify-content:center;flex-wrap:wrap}.action-button{display:inline-block;background:#2f9f74;color:#fff;padding:.72rem 1.35rem;border-radius:4px;border-bottom:1px solid #267e5d;font-size:1.08rem}.action-button:hover{background:#37ad80;text-decoration:none}.secondary-button{display:inline-block;color:#3a5169;border:1px solid #cfd8e3;padding:.72rem 1.1rem;border-radius:4px}.secondary-button:hover{text-decoration:none;border-color:#91a4b7}.features{border-top:1px solid #eaecef;margin-top:2.3rem;padding:1.4rem 0 0;display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between}.feature{flex:1 1 30%;max-width:30%;padding-bottom:1.4rem}.feature h2{font-size:1.35rem;font-weight:560;color:#3a5169;margin:.75rem 0 .25rem}.feature p,.feature li{color:#4e6e8e}.feature ul{padding-left:1.2rem;margin:.45rem 0 0}.content{border-top:1px solid #eaecef;margin-top:2.2rem;padding:2rem 0 3rem}.content h1{font-size:2.3rem;line-height:1.16;color:#1f2d3a;margin:0 0 1rem}.content h2{font-size:1.45rem;color:#3a5169;margin:2rem 0 .45rem}.lead{font-size:1.25rem;color:#5e7891;max-width:56rem}.columns{display:grid;grid-template-columns:repeat(3,1fr);gap:1.1rem;margin-top:1.3rem}.panel{border:1px solid #e1e7ee;border-radius:6px;padding:1rem;background:#fff}.panel h3{margin:.1rem 0 .4rem;color:#2c3e50}.panel p{margin:.35rem 0;color:#4e6e8e}.panel ul{margin:.35rem 0;padding-left:1.15rem;color:#4e6e8e}.code{background:#282c34;color:#f8f8f2;border-radius:6px;padding:1rem 1.2rem;overflow:auto;line-height:1.45;font-family:\"SFMono-Regular\",Consolas,monospace;font-size:.92rem}.muted{color:#6f8194}.footer{border-top:1px solid #eaecef;color:#6f8194;text-align:center;padding:2rem;margin-top:1.2rem}.route-list{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}.repo-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.9rem;margin-top:1rem}.repo-card{border:1px solid #e1e7ee;border-radius:6px;padding:.9rem;background:#fff;min-height:10.5rem;display:flex;flex-direction:column}.repo-card h3{font-size:1.05rem;margin:.2rem 0 .35rem;color:#223344;overflow-wrap:anywhere}.repo-card p{margin:.2rem 0 .7rem;color:#4e6e8e;line-height:1.45}.repo-card a,.repo-card .muted{margin-top:auto;font-size:.9rem}.repo-count{display:flex;gap:.6rem;flex-wrap:wrap;margin:1.2rem 0}.repo-count span{border:1px solid #d7e0e9;border-radius:6px;padding:.3rem .65rem;color:#3a5169;background:#fbfdff}.label{font-size:.78rem;text-transform:uppercase;color:#7b8da0;letter-spacing:.05em}.badges{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.65rem}.badge{border:1px solid #d7e0e9;border-radius:999px;padding:.15rem .55rem;color:#4e6e8e;font-size:.86rem}@media(max-width:900px){.repo-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:760px){.navbar{height:auto;min-height:3.6rem;align-items:flex-start;gap:.5rem;flex-direction:column;padding:.7rem 1rem}.nav{width:100%;overflow:auto;padding-bottom:.2rem}.home{padding:0 1.1rem}.hero{padding-top:1.3rem}.hero h1{font-size:2.35rem}.description{font-size:1.15rem}.features{display:block}.feature{max-width:100%}.columns,.route-list,.repo-grid{grid-template-columns:1fr}.content h1{font-size:1.9rem}}") (define site-security-headers (list @@ -122,21 +122,126 @@ "<div class=\"panel\"><h3>Curated Ecosystem</h3><p>Core packages live beside Jerboa projects for web, DNS, shell, editor, crypto, database, and network tools.</p></div></div>" "</section>"))) +(define (sourcehut-repo name) + (string-append "https://git.sr.ht/~lisp/" name)) + +(define (repo-card item) + (let ((name (list-ref item 0)) + (label (list-ref item 1)) + (description (list-ref item 2)) + (href (list-ref item 3))) + (string-append + "<div class=\"repo-card\"><span class=\"label\">" label "</span>" + "<h3>" name "</h3><p>" description "</p>" + (if (string=? href "") + "<span class=\"muted\">Local incubator; no public remote configured.</span>" + (string-append "<a href=\"" href "\">Source</a>")) + "</div>"))) + +(define (repo-section title intro items) + (string-append + "<h2>" title "</h2><p class=\"muted\">" intro "</p><div class=\"repo-grid\">" + (apply string-append (map repo-card items)) + "</div>")) + +(define core-repositories + (list + (list "jerboa" "Language" "Core language, runtime, standard library, native Rust backend, package manager, MCP server, docs, and tests." (sourcehut-repo "jerboa")) + (list "jerboa-compat" "Runtime" "Compatibility layer for portability work and migration helpers." (sourcehut-repo "jerboa-compat")) + (list "jerboa-gerbil" "Interop" "Gerbil-oriented bridge work for code and package migration." (sourcehut-repo "jerboa-gerbil")) + (list "jerboa-site" "Docs" "This production website, served by jerboa-sinatra and Jerboa HTTPSD." (sourcehut-repo "jerboa-site")))) + +(define tool-repositories + (list + (list "jerboa-code" "Tooling" "Terminal coding environment, providers, verified edit workflow, and local model integrations." (sourcehut-repo "jerboa-code")) + (list "jerboa-emacs" "Editor" "Emacs integration, modes, build helpers, and editor workflow support." (sourcehut-repo "jerboa-emacs")) + (list "jerboa-ts-mode" "Editor" "Tree-sitter backed editor mode support." (sourcehut-repo "jerboa-ts-mode")) + (list "jerboa-lsp.retired" "Retired" "Retired LSP implementation kept for historical reference." (sourcehut-repo "jerboa-lsp")) + (list "jerboa-treesitter" "Parser" "Tree-sitter grammar and parser tooling for Jerboa syntax." (sourcehut-repo "jerboa-treesitter")) + (list "jerboa-search" "Search" "Local search and web extraction workbench." "") + (list "jerboa-gitlab" "DevOps" "GitLab integration and issue workflow tooling." (sourcehut-repo "jerboa-gitlab")) + (list "jerboa-gitsafe" "Git" "Git safety tooling and repository guardrails." (sourcehut-repo "jerboa-gitsafe")))) + +(define systems-repositories + (list + (list "jerboa-shell" "Shell" "Jerboa shell and systems command environment." (sourcehut-repo "jerboa-shell")) + (list "jerboa-shell-extras" "Shell" "Optional shell feature modules and static integration helpers." (sourcehut-repo "jerboa-shell-extras")) + (list "jerboa-coreutils" "CLI" "Core command-line utilities implemented in Jerboa." (sourcehut-repo "jerboa-coreutils")) + (list "jerboa-awk" "CLI" "AWK-compatible text-processing work in Jerboa." (sourcehut-repo "jerboa-awk")) + (list "jerboa-sed" "CLI" "Stream editing utilities and parser work." (sourcehut-repo "jerboa-sed")) + (list "jerboa-top" "CLI" "Process and system monitor experiments." (sourcehut-repo "jerboa-top")) + (list "jerboa-asm" "Systems" "Assembler and low-level code generation work." (sourcehut-repo "jerboa-asm")) + (list "jerboa-fuse" "Filesystem" "FUSE integration and filesystem tooling." (sourcehut-repo "jerboa-fuse")) + (list "jerboa-inotify" "Filesystem" "File notification bindings and watchers." (sourcehut-repo "jerboa-inotify")))) + +(define network-repositories + (list + (list "jerboa-dns" "Network" "DNS service work with a narrow WASM-sandboxed parsing model." (sourcehut-repo "jerboa-dns")) + (list "jerboa-https" "Network" "HTTPS client/server components and TLS-facing utilities." (sourcehut-repo "jerboa-https")) + (list "jerboa-sinatra" "Web" "Sinatra-style web framework used by this site." (sourcehut-repo "jerboa-sinatra")) + (list "jerboa-smtp" "Mail" "SMTP service and mail transport components." (sourcehut-repo "jerboa-smtp")) + (list "jerboa-mail" "Mail" "Mail parsing, delivery, and mailbox-oriented utilities." (sourcehut-repo "jerboa-mail")) + (list "jerboa-ssh" "SSH" "SSH client and protocol work." (sourcehut-repo "jerboa-ssh")) + (list "jerboa-sshd" "SSH" "SSH server experiments and daemon integration." (sourcehut-repo "jerboa-sshd")) + (list "jerboa-ssl" "TLS" "SSL/TLS compatibility and certificate tooling." (sourcehut-repo "jerboa-ssl")) + (list "jerboa-wormhole" "Network" "Magic Wormhole style transfer and rendezvous tooling." (sourcehut-repo "jerboa-wormhole")) + (list "jerboa-webex" "Web" "Web extraction, browser-facing, and endpoint integration work." (sourcehut-repo "jerboa-webex")) + (list "jerboa-websearch" "Web" "Search, fetch, and extraction services." (sourcehut-repo "jerboa-websearch")) + (list "jerboa-browser" "Web" "Browser-facing experiments and web UI integration." (sourcehut-repo "jerboa-browser")))) + +(define data-security-repositories + (list + (list "jerboa-db" "Data" "Database engine and storage work." (sourcehut-repo "jerboa-db")) + (list "jerboa-sqlite" "Data" "SQLite-oriented package work and integration." (sourcehut-repo "jerboa-sqlite")) + (list "jerboa-pcre2" "Regex" "PCRE2 binding and regular expression support." (sourcehut-repo "jerboa-pcre2")) + (list "jerboa-crypto" "Crypto" "Cryptographic primitives and native boundary work." (sourcehut-repo "jerboa-crypto")) + (list "jerboa-pgp" "Crypto" "OpenPGP workflows and package support." (sourcehut-repo "jerboa-pgp")) + (list "jerboa-yubikey" "Hardware" "YubiKey and hardware-backed auth integrations." (sourcehut-repo "jerboa-yubikey")) + (list "jerboa-secmon" "Security" "Security monitoring application work." (sourcehut-repo "jerboa-secmon")) + (list "jerboa-secmonlib" "Security" "Reusable monitoring and security library code." (sourcehut-repo "jerboa-secmonlib")) + (list "jerboa-semgrep" "Security" "Semgrep-compatible analysis and rule-engine experiments." (sourcehut-repo "jerboa-semgrep")) + (list "jerboa-signal" "Security" "Signal and secure messaging integration work." (sourcehut-repo "jerboa-signal")) + (list "jerboa-virus" "Security" "Malware analysis and detection experiments." (sourcehut-repo "jerboa-virus")))) + +(define platform-repositories + (list + (list "jerboa-android" "Platform" "Android build, packaging, and mobile runtime work." (sourcehut-repo "jerboa-android")) + (list "jerboa-aws" "Cloud" "AWS service clients, deployment helpers, and cloud integration." (sourcehut-repo "jerboa-aws")) + (list "jerboa-drive" "Storage" "Drive and storage service integration." (sourcehut-repo "jerboa-drive")) + (list "jerboa-edge" "Edge" "Edge deployment and constrained runtime experiments." (sourcehut-repo "jerboa-edge")) + (list "jerboa-image" "Media" "Image processing and media utility work." (sourcehut-repo "jerboa-image")) + (list "jerboa-imagesite" "Media" "Image-site publishing tools." (sourcehut-repo "jerboa-imagesite")) + (list "jerboa-lora" "ML" "LoRA and local-model workflow experiments." (sourcehut-repo "jerboa-lora")) + (list "jerboa-pdf" "Docs" "PDF processing and document tooling." (sourcehut-repo "jerboa-pdf")) + (list "jerboa-proton-bridge" "Integration" "Proton Bridge integration work." (sourcehut-repo "jerboa-proton-bridge")) + (list "jerboa-protonmail" "Integration" "Proton Mail service integration." (sourcehut-repo "jerboa-protonmail")) + (list "jerboa-qt" "GUI" "Qt bindings and desktop application work." (sourcehut-repo "jerboa-qt")) + (list "jerboa-scintilla" "GUI" "Scintilla editor component bindings." (sourcehut-repo "jerboa-scintilla")) + (list "jerboa-ssd-recognizer" "Vision" "SSD recognition and vision pipeline experiments." (sourcehut-repo "jerboa-ssd-recognizer")) + (list "jerboa-vision" "Vision" "Computer vision packages and examples." (sourcehut-repo "jerboa-vision")) + (list "jerboa-wafter" "Build" "Build and workflow automation experiments." (sourcehut-repo "jerboa-wafter")))) + +(define related-repositories + (list + (list "jsqlite" "Database" "SQLite-compatible database implementation and file-format work in the Jerboa ecosystem." (sourcehut-repo "jsqlite")) + (list "kratistos" "Benchmark" "Agent benchmark harnesses and reproducible task runners used to harden Jerboa tooling." (sourcehut-repo "kratistos")))) + (define repos-page (layout "Repos" "repos" (string-append - "<section class=\"content\"><h1>Repositories</h1>" - "<p class=\"lead\">The core repository is joined by focused Jerboa projects for services, tools, and integrations.</p>" - "<div class=\"route-list\">" - "<div class=\"panel\"><h3>jerboa</h3><p>Core language, runtime, standard library, native Rust backend, package manager, docs, and tests.</p><a href=\"https://git.sr.ht/~lisp/jerboa\">git.sr.ht/~lisp/jerboa</a></div>" - "<div class=\"panel\"><h3>jerboa-sinatra</h3><p>Sinatra-style web framework used by this site.</p><a href=\"https://git.sr.ht/~lisp/jerboa-sinatra\">git.sr.ht/~lisp/jerboa-sinatra</a></div>" - "<div class=\"panel\"><h3>jerboa-dns</h3><p>DNS service work with a narrow WASM-sandboxed parsing model.</p><a href=\"https://git.sr.ht/~lisp/jerboa-dns\">git.sr.ht/~lisp/jerboa-dns</a></div>" - "<div class=\"panel\"><h3>jerboa-shell</h3><p>Jerboa shell and systems tooling.</p><a href=\"https://git.sr.ht/~lisp/jerboa-shell\">git.sr.ht/~lisp/jerboa-shell</a></div>" - "<div class=\"panel\"><h3>jerboa-code</h3><p>Editor and coding-agent oriented tooling.</p><a href=\"https://git.sr.ht/~lisp/jerboa-code\">git.sr.ht/~lisp/jerboa-code</a></div>" - "<div class=\"panel\"><h3>jerboa-emacs</h3><p>Editor integration and language workflow support.</p><a href=\"https://git.sr.ht/~lisp/jerboa-emacs\">git.sr.ht/~lisp/jerboa-emacs</a></div>" - "</div></section>"))) + "<section class=\"content\"><h1>Repository Atlas</h1>" + "<p class=\"lead\">Jerboa is not a single repository; it is a language, runtime, package set, service stack, editor environment, and security research platform. This catalog lists the public Jerboa repositories in this checkout and related projects that show the scope of software being written with it.</p>" + "<div class=\"repo-count\"><span>59 Jerboa repositories</span><span>7 project areas</span><span>No secret repositories listed</span></div>" + (repo-section "Core Language" "The language, runtime, website, and compatibility surface." core-repositories) + (repo-section "Tools and Editors" "Developer tools, editor integrations, parser support, and repository workflow utilities." tool-repositories) + (repo-section "Systems and Command Line" "Shell, core utilities, file systems, text processing, and low-level systems packages." systems-repositories) + (repo-section "Network and Web" "HTTP, DNS, mail, SSH, web extraction, browser-facing, and transport projects." network-repositories) + (repo-section "Data, Crypto, and Security" "Database, regex, crypto, secure messaging, analysis, and monitoring packages." data-security-repositories) + (repo-section "Platforms and Integrations" "Mobile, cloud, GUI, media, ML, document, and third-party service integrations." platform-repositories) + (repo-section "Related Jerboa Ecosystem Projects" "Non-jerboa-prefixed projects that are part of the active Jerboa workbench." related-repositories) + "</section>"))) (define security-page (layout