diff --git a/.gitignore b/.gitignore index e1ad394..7258ec0 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,9 @@ local/backups /tmp *.exe .DS_Store + +# vim session saves +Session.vim + +# tags files +tags diff --git a/public/style.css b/public/style.css index 969a28b..6f628c4 100644 --- a/public/style.css +++ b/public/style.css @@ -540,7 +540,7 @@ input[type="url"], height: 100%; z-index: 100; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .aspect-ratio-ns { height: 0; position: relative; } @@ -576,7 +576,7 @@ input[type="url"], height: 100%; z-index: 100; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .aspect-ratio-m { height: 0; position: relative; } @@ -679,13 +679,13 @@ img, video { .contain { background-size: contain !important; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .cover-ns { background-size: cover !important; } .contain-ns { background-size: contain !important; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .cover-m { background-size: cover !important; } .contain-m { @@ -737,7 +737,7 @@ img, video { background-repeat: no-repeat; background-position: center left; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .bg-center-ns { background-repeat: no-repeat; background-position: center center; } @@ -754,7 +754,7 @@ img, video { background-repeat: no-repeat; background-position: center left; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .bg-center-m { background-repeat: no-repeat; background-position: center center; } @@ -807,7 +807,7 @@ img, video { .outline-0 { outline: 0; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .outline-ns { outline: 1px solid; } .outline-transparent-ns { @@ -815,7 +815,7 @@ img, video { .outline-0-ns { outline: 0; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .outline-m { outline: 1px solid; } .outline-transparent-m { @@ -877,7 +877,7 @@ img, video { border-style: none; border-width: 0; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .ba-ns { border-style: solid; border-width: 1px; } @@ -897,7 +897,7 @@ img, video { border-style: none; border-width: 0; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .ba-m { border-style: solid; border-width: 1px; } @@ -1204,7 +1204,7 @@ img, video { border-top-right-radius: 0; border-bottom-right-radius: 0; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .br0-ns { border-radius: 0; } .br1-ns { @@ -1232,7 +1232,7 @@ img, video { border-top-right-radius: 0; border-bottom-right-radius: 0; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .br0-m { border-radius: 0; } .br1-m { @@ -1322,7 +1322,7 @@ img, video { .b--none { border-style: none; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .b--dotted-ns { border-style: dotted; } .b--dashed-ns { @@ -1332,7 +1332,7 @@ img, video { .b--none-ns { border-style: none; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .b--dotted-m { border-style: dotted; } .b--dashed-m { @@ -1405,7 +1405,7 @@ img, video { .bl-0 { border-left-width: 0; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .bw0-ns { border-width: 0; } .bw1-ns { @@ -1427,7 +1427,7 @@ img, video { .bl-0-ns { border-left-width: 0; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .bw0-m { border-width: 0; } .bw1-m { @@ -1497,7 +1497,7 @@ img, video { .shadow-5 { box-shadow: 4px 4px 8px 0px rgba(0, 0, 0, 0.2); } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .shadow-1-ns { box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.2); } .shadow-2-ns { @@ -1509,7 +1509,7 @@ img, video { .shadow-5-ns { box-shadow: 4px 4px 8px 0px rgba(0, 0, 0, 0.2); } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .shadow-1-m { box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.2); } .shadow-2-m { @@ -1635,7 +1635,7 @@ img, video { bottom: 0; left: 0; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .top-0-ns { top: 0; } .left-0-ns { @@ -1682,7 +1682,7 @@ img, video { bottom: 0; left: 0; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .top-0-m { top: 0; } .left-0-m { @@ -1807,7 +1807,7 @@ img, video { .cn { clear: none; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .cl-ns { clear: left; } .cr-ns { @@ -1817,7 +1817,7 @@ img, video { .cn-ns { clear: none; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .cl-m { clear: left; } .cr-m { @@ -1903,7 +1903,7 @@ img, video { table-layout: fixed; width: 100%; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .dn-ns { display: none; } .di-ns { @@ -1930,7 +1930,7 @@ img, video { table-layout: fixed; width: 100%; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .dn-m { display: none; } .di-m { @@ -2138,7 +2138,7 @@ img, video { .flex-shrink-1 { flex-shrink: 1; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .flex-ns { display: flex; } .inline-flex-ns { @@ -2236,7 +2236,7 @@ img, video { .flex-shrink-1-ns { flex-shrink: 1; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .flex-m { display: flex; } .inline-flex-m { @@ -2468,7 +2468,7 @@ img, video { .fn { float: none; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .fl-ns { float: left; _display: inline; } @@ -2478,7 +2478,7 @@ img, video { .fn-ns { float: none; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .fl-m { float: left; _display: inline; } @@ -2570,13 +2570,13 @@ code, .code { .fs-normal { font-style: normal; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .i-ns { font-style: italic; } .fs-normal-ns { font-style: normal; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .i-m { font-style: italic; } .fs-normal-m { @@ -2646,7 +2646,7 @@ code, .code { .fw9 { font-weight: 900; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .normal-ns { font-weight: normal; } .b-ns { @@ -2670,7 +2670,7 @@ code, .code { .fw9-ns { font-weight: 900; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .normal-m { font-weight: normal; } .b-m { @@ -2819,7 +2819,7 @@ code, .code { .h-inherit { height: inherit; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .h1-ns { height: 1rem; } .h2-ns { @@ -2855,7 +2855,7 @@ code, .code { .h-inherit-ns { height: inherit; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .h1-m { height: 1rem; } .h2-m { @@ -2947,7 +2947,7 @@ code, .code { .tracked-mega { letter-spacing: 0.25em; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .tracked-ns { letter-spacing: 0.1em; } .tracked-tight-ns { @@ -2955,7 +2955,7 @@ code, .code { .tracked-mega-ns { letter-spacing: 0.25em; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .tracked-m { letter-spacing: 0.1em; } .tracked-tight-m { @@ -2991,7 +2991,7 @@ code, .code { .lh-copy { line-height: 1.5; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .lh-solid-ns { line-height: 1; } .lh-title-ns { @@ -2999,7 +2999,7 @@ code, .code { .lh-copy-ns { line-height: 1.5; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .lh-solid-m { line-height: 1; } .lh-title-m { @@ -3114,7 +3114,7 @@ code, .code { .mw-none { max-width: none; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .mw-100-ns { max-width: 100%; } .mw1-ns { @@ -3138,7 +3138,7 @@ code, .code { .mw-none-ns { max-width: none; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .mw-100-m { max-width: 100%; } .mw1-m { @@ -3303,7 +3303,7 @@ code, .code { .w-auto { width: auto; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .w1-ns { width: 1rem; } .w2-ns { @@ -3355,7 +3355,7 @@ code, .code { .w-auto-ns { width: auto; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .w1-m { width: 1rem; } .w2-m { @@ -3505,7 +3505,7 @@ code, .code { .overflow-y-auto { overflow-y: auto; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .overflow-visible-ns { overflow: visible; } .overflow-hidden-ns { @@ -3531,7 +3531,7 @@ code, .code { .overflow-y-auto-ns { overflow-y: auto; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .overflow-visible-m { overflow: visible; } .overflow-hidden-m { @@ -3606,7 +3606,7 @@ code, .code { .fixed { position: fixed; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .static-ns { position: static; } .relative-ns { @@ -3616,7 +3616,7 @@ code, .code { .fixed-ns { position: fixed; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .static-m { position: static; } .relative-m { @@ -3707,7 +3707,7 @@ code, .code { .rotate-315 { transform: rotate(315deg); } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .rotate-45-ns { transform: rotate(45deg); } .rotate-90-ns { @@ -3723,7 +3723,7 @@ code, .code { .rotate-315-ns { transform: rotate(315deg); } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .rotate-45-m { transform: rotate(45deg); } .rotate-90-m { @@ -4985,7 +4985,7 @@ input[type=submit]:not(.button-small), .notice { margin-left: 16rem; margin-right: 16rem; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .pa0-ns { padding: 0; } .pa1-ns { @@ -5247,7 +5247,7 @@ input[type=submit]:not(.button-small), .notice { margin-left: 16rem; margin-right: 16rem; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .pa0-m { padding: 0; } .pa1-m { @@ -5895,7 +5895,7 @@ input[type=submit]:not(.button-small), .notice { .nt7 { margin-top: -16rem; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .na1-ns { margin: -0.25rem; } .na2-ns { @@ -5967,7 +5967,7 @@ input[type=submit]:not(.button-small), .notice { .nt7-ns { margin-top: -16rem; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .na1-m { margin: -0.25rem; } .na2-m { @@ -6160,7 +6160,7 @@ input[type=submit]:not(.button-small), .notice { .no-underline { text-decoration: none; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .strike-ns { text-decoration: line-through; } .underline-ns { @@ -6168,7 +6168,7 @@ input[type=submit]:not(.button-small), .notice { .no-underline-ns { text-decoration: none; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .strike-m { text-decoration: line-through; } .underline-m { @@ -6216,7 +6216,7 @@ input[type=submit]:not(.button-small), .notice { .tj { text-align: justify; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .tl-ns { text-align: left; } .tr-ns, .edit-form .edit-form-row > :first-child { @@ -6226,7 +6226,7 @@ input[type=submit]:not(.button-small), .notice { .tj-ns { text-align: justify; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .tl-m { text-align: left; } .tr-m { @@ -6278,7 +6278,7 @@ input[type=submit]:not(.button-small), .notice { .ttn { text-transform: none; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .ttc-ns { text-transform: capitalize; } .ttl-ns { @@ -6288,7 +6288,7 @@ input[type=submit]:not(.button-small), .notice { .ttn-ns { text-transform: none; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .ttc-m { text-transform: capitalize; } .ttl-m { @@ -6365,7 +6365,7 @@ input[type=submit]:not(.button-small), .notice { .f7 { font-size: 0.75rem; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .f-6-ns, .f-headline-ns { font-size: 6rem; } @@ -6387,7 +6387,7 @@ input[type=submit]:not(.button-small), .notice { .f7-ns { font-size: 0.75rem; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .f-6-m, .f-headline-m { font-size: 6rem; } @@ -6469,7 +6469,7 @@ input[type=submit]:not(.button-small), .notice { overflow: hidden; text-overflow: ellipsis; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .measure-ns { max-width: 30em; } .measure-wide-ns { @@ -6487,7 +6487,7 @@ input[type=submit]:not(.button-small), .notice { overflow: hidden; text-overflow: ellipsis; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .measure-m { max-width: 30em; } .measure-wide-m { @@ -6547,7 +6547,7 @@ input[type=submit]:not(.button-small), .notice { .ml-auto { margin-left: auto; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .center-ns { margin-right: auto; margin-left: auto; } @@ -6556,7 +6556,7 @@ input[type=submit]:not(.button-small), .notice { .ml-auto-ns { margin-left: auto; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .center-m { margin-right: auto; margin-left: auto; } @@ -6595,7 +6595,7 @@ input[type=submit]:not(.button-small), .notice { /* IE6, IE7 */ clip: rect(1px, 1px, 1px, 1px); } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .clip-ns { position: fixed !important; _position: absolute !important; @@ -6603,7 +6603,7 @@ input[type=submit]:not(.button-small), .notice { /* IE6, IE7 */ clip: rect(1px, 1px, 1px, 1px); } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .clip-m { position: fixed !important; _position: absolute !important; @@ -6638,7 +6638,7 @@ input[type=submit]:not(.button-small), .notice { .pre { white-space: pre; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .ws-normal-ns { white-space: normal; } .nowrap-ns { @@ -6646,7 +6646,7 @@ input[type=submit]:not(.button-small), .notice { .pre-ns { white-space: pre; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .ws-normal-m { white-space: normal; } .nowrap-m { @@ -6684,7 +6684,7 @@ input[type=submit]:not(.button-small), .notice { .v-btm { vertical-align: bottom; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .v-base-ns { vertical-align: baseline; } .v-mid-ns { @@ -6694,7 +6694,7 @@ input[type=submit]:not(.button-small), .notice { .v-btm-ns { vertical-align: bottom; } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .v-base-m { vertical-align: baseline; } .v-mid-m { @@ -7357,7 +7357,7 @@ article code { flex-grow: 1; flex-shrink: 1; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .flex-fair-ns { flex-basis: 1px; flex-grow: 1; @@ -7556,7 +7556,7 @@ article code { .hide-if-empty:empty { display: none !important; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .bi-avoid-ns { break-inside: avoid; } .cc-auto-ns { @@ -7583,7 +7583,7 @@ article code { background-color: #f0f0f0; background-color: var(--dim-background); } } -@media screen and (min-width: 30em) and (max-width: 60em) { +@media screen and (min-width: 35em) and (max-width: 60em) { .bi-avoid-m { break-inside: avoid; } .cc-auto-m { @@ -7658,7 +7658,7 @@ article code { margin-right: auto; margin-left: auto; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { footer .list li:not(:last-child)::after { content: ' / '; } } @@ -7741,7 +7741,7 @@ article code { border-width: 0px; border-bottom-width: 1px; padding-bottom: 0.5rem; } - @media screen and (min-width: 30em) { + @media screen and (min-width: 35em) { .optionbar { flex-direction: row; text-align: left; @@ -7751,7 +7751,7 @@ article code { border-top-width: 1px; padding-bottom: 0; padding-top: 0.5rem; } - @media screen and (min-width: 30em) { + @media screen and (min-width: 35em) { .optionbar.bottom { padding-top: 0; } } .optionbar.center { @@ -7759,7 +7759,7 @@ article code { .optionbar .options { display: flex; flex-direction: column; } - @media screen and (min-width: 30em) { + @media screen and (min-width: 35em) { .optionbar .options { flex-direction: row; } } @@ -7869,6 +7869,28 @@ article code { --fade-color: #f8f8f8; --fade-color: var(--background-even-background); } +.sr-only, .sr-focusable { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + word-wrap: normal !important; + transition: 0.2s all; } + +.sr-focusable:focus { + padding: 15px 10px; + height: auto; + width: auto; + background: var(--content-background); + clip: initial; + clip-path: initial; + z-index: 99999; } + .userlist { text-align: center; width: 100%; @@ -8075,7 +8097,7 @@ figure { color: var(--dimmer-color); font-style: italic; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { #preview-container { max-height: calc(100vh - 20rem); overflow: auto; } } @@ -8083,7 +8105,7 @@ figure { .edit-form .edit-form-row > :first-child { font-weight: 500; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { .edit-form .edit-form-row .pt-input-ns { padding-top: 0.3rem; } } @@ -8827,10 +8849,10 @@ header .hmn-logo { align-items: center; justify-content: center; color: white !important; } - @media screen and (min-width: 30em) { + @media screen and (min-width: 35em) { header .hmn-logo.big { width: 11.25rem; } } - @media screen and (min-width: 30em) { + @media screen and (min-width: 35em) { header .hmn-logo.small { width: 3.75rem; padding: 0.8rem; @@ -8845,7 +8867,7 @@ header .hmn-logo { header .items { position: relative; } -@media screen and (min-width: 30em) { +@media screen and (min-width: 35em) { header .root-item { position: relative; height: 3.75rem; } } @@ -8882,7 +8904,7 @@ header .submenu { min-width: 10rem; border-top-style: solid; border-bottom-style: solid; } - @media screen and (min-width: 30em) { + @media screen and (min-width: 35em) { header .submenu { border-top-style: none; border-left-style: solid; @@ -8895,7 +8917,7 @@ header .submenu { z-index: 1; font-weight: bold; text-align: center; } - @media screen and (min-width: 30em) { + @media screen and (min-width: 35em) { header .submenu > a { text-align: left; } } @@ -8903,6 +8925,9 @@ header .menu-bar { width: 100%; z-index: 10; } +header #login-link { + cursor: pointer; } + header #login-popup { background-color: #fbfbfb; background-color: var(--login-popup-background); @@ -9452,7 +9477,7 @@ span.icon-rss::before { .timeline-item .avatar-icon.big { width: 3rem; height: 3rem; } - @media screen and (min-width: 30em) { + @media screen and (min-width: 35em) { .timeline-item .avatar-icon.big { width: 3.875rem; height: 3.875rem; } } @@ -9467,7 +9492,7 @@ span.icon-rss::before { .timeline-modal .container { max-height: 100vh; max-width: 100%; } - @media screen and (min-width: 30em) { + @media screen and (min-width: 35em) { .timeline-modal .container { width: auto; max-width: calc(100% - 2rem); diff --git a/public/visualjam2023/favicon-16x16.png b/public/visualjam2023/favicon-16x16.png new file mode 100644 index 0000000..41346af Binary files /dev/null and b/public/visualjam2023/favicon-16x16.png differ diff --git a/public/visualjam2023/favicon-32x32.png b/public/visualjam2023/favicon-32x32.png new file mode 100644 index 0000000..d3d57bf Binary files /dev/null and b/public/visualjam2023/favicon-32x32.png differ diff --git a/public/visualjam2023/logo.svg b/public/visualjam2023/logo.svg new file mode 100644 index 0000000..740e1a5 --- /dev/null +++ b/public/visualjam2023/logo.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/visualjam2023/opengraph.png b/public/visualjam2023/opengraph.png new file mode 100644 index 0000000..0442d06 Binary files /dev/null and b/public/visualjam2023/opengraph.png differ diff --git a/src/config/config.go.example b/src/config/config.go.example index 15a4c71..5b2fd79 100644 --- a/src/config/config.go.example +++ b/src/config/config.go.example @@ -14,6 +14,7 @@ var Config = HMNConfig{ BaseUrl: "http://handmade.local:9001", LogLevel: zerolog.TraceLevel, // InfoLevel is recommended for production Postgres: PostgresConfig{ + // the "db seed" command depends on this user existing in Postgres, so you'll want to make sure it exists when running locally. User: "hmn", Password: "password", Hostname: "localhost", diff --git a/src/hmndata/jams.go b/src/hmndata/jams.go index c8a717b..63d12bc 100644 --- a/src/hmndata/jams.go +++ b/src/hmndata/jams.go @@ -39,6 +39,15 @@ var WRJ2022 = Jam{ Slug: "WRJ2022", } +var VJ2023 = Jam{ + Event: Event{ + StartTime: time.Date(2023, 4, 14, 0, 0, 0, 0, utils.Must1(time.LoadLocation("America/Los_Angeles"))), + EndTime: time.Date(2023, 4, 16, 8, 0, 0, 0, utils.Must1(time.LoadLocation("America/Los_Angeles"))), + }, + Name: "Visualization Jam 2023", + Slug: "VJ2023", +} + var HMS2022 = Event{ StartTime: time.Date(2022, 11, 16, 0, 0, 0, 0, utils.Must1(time.LoadLocation("America/Los_Angeles"))), EndTime: time.Date(2022, 11, 18, 0, 0, 0, 0, utils.Must1(time.LoadLocation("America/Los_Angeles"))), diff --git a/src/hmnurl/urls.go b/src/hmnurl/urls.go index 416053d..c8a550e 100644 --- a/src/hmnurl/urls.go +++ b/src/hmnurl/urls.go @@ -70,6 +70,13 @@ func BuildJamIndex2022() string { return Url("/jam/2022", nil) } +var RegexVisualizationJamIndex2023 = regexp.MustCompile("^/visualization-jam/2023$") + +func BuildVisualizationJamIndex2023() string { + defer CatchPanic() + return Url("/visualization-jam/2023", nil) +} + var RegexJamFeed2022 = regexp.MustCompile("^/jam/2022/feed$") func BuildJamFeed2022() string { diff --git a/src/rawdata/scss/_core.scss b/src/rawdata/scss/_core.scss index b66c5ac..69c8858 100644 --- a/src/rawdata/scss/_core.scss +++ b/src/rawdata/scss/_core.scss @@ -769,3 +769,31 @@ footer { @include usevar(background-color, background-even-background); @include usevar(--fade-color, background-even-background); } + +.sr-only { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + word-wrap: normal !important; + transition: 0.2s all; +} + +.sr-focusable { + @extend .sr-only; + + &:focus { + padding: 15px 10px; + height: auto; + width: auto; + background: var(--content-background); + clip: initial; + clip-path: initial; + z-index: 99999; + } +} diff --git a/src/rawdata/scss/_header.scss b/src/rawdata/scss/_header.scss index b407291..3a403e0 100644 --- a/src/rawdata/scss/_header.scss +++ b/src/rawdata/scss/_header.scss @@ -122,6 +122,10 @@ header { z-index: 10; } + #login-link{ + cursor: pointer; + } + #login-popup { @include usevar(background-color, login-popup-background); @include usevar(color, fg-font-color); diff --git a/src/rawdata/scss/tachyons/scss/_variables.scss b/src/rawdata/scss/tachyons/scss/_variables.scss index 339230a..575eacc 100644 --- a/src/rawdata/scss/tachyons/scss/_variables.scss +++ b/src/rawdata/scss/tachyons/scss/_variables.scss @@ -136,8 +136,8 @@ $washed-red: #ffdfdf !default; // Custom Media Query Variables -$breakpoint-not-small: 'screen and (min-width: 30em)' !default; -$breakpoint-medium: 'screen and (min-width: 30em) and (max-width: 60em)' !default; +$breakpoint-not-small: 'screen and (min-width: 35em)' !default; +$breakpoint-medium: 'screen and (min-width: 35em) and (max-width: 60em)' !default; $breakpoint-large: 'screen and (min-width: 60em)' !default; /* diff --git a/src/templates/src/include/header.html b/src/templates/src/include/header.html index c90668f..a88bb25 100644 --- a/src/templates/src/include/header.html +++ b/src/templates/src/include/header.html @@ -1,4 +1,5 @@ - +
+ + + + + + + + + + + + +
+
+ {{ template "header.html" . }} +
+ + {{ block "content" . }}{{ end }} + +
+ {{ template "footer.html" . }} +
+
+ + + diff --git a/src/templates/src/visualization_jam_2023.html b/src/templates/src/visualization_jam_2023.html new file mode 100644 index 0000000..bd6ea55 --- /dev/null +++ b/src/templates/src/visualization_jam_2023.html @@ -0,0 +1,447 @@ +{{ template "visualization_jam_2023_base.html" . }} {{ define "content" }} {{ +$discordInviteURL := "https://discord.gg/hmn" }} + + + +
+ +

Visualization Jam

+

April 14 - 16, 2O23

+
+ A jam to see things in a new way. {{ if gt .DaysUntilEnd 0 }} {{ if eq + .DaysUntilStart 0 }} + Happening now. + {{ else if eq .DaysUntilStart 1 }} + Starting tomorrow. + {{ else }} + In {{ .DaysUntilStart }} days. + {{ end }} {{ end }} +
+
+ {{ if gt .DaysUntilStart 0 }} + Find a project + {{ else if gt .DaysUntilEnd 0 }} {{ if .SubmittedProjectUrl }} + Share your progress + {{ else }} + Create your project + {{ end }} {{ else }} + See the results + {{ end }} + Join the Discord +
+
+ +
+

+ TODO: Needs copy -- guessing we'll use some of the images that Ben has + marked as TODO TODO TODO in the copy doc. +

+
+ +{{ if eq .DaysUntilEnd 0 }} +
+
+

Submitted projects

+
+ {{ range .JamProjects }} {{ template "project_card.html" projectcarddata . + "" }} {{ end }} +
+ +
+
+{{ else if and (eq .DaysUntilStart 0) (not (eq .ShowcaseJson "[]")) }} +
+
+ {{ if gt .DaysUntilEnd 0 }} +

Recent updates

+

+ These screenshots and videos were shared by jam participants in + #project-showcase on our + Discord. Join us and + share what you're working on! + See all ➜ +

+ {{ else }} +

Community showcase

+

+ These screenshots and videos were shared by jam participants in + #project-showcase on our + Discord during the + jam. Join us and chat about your favorites! +

+ {{ end }} +
+
+ See all +
+
+
+ +{{ template "showcase_templates.html" }} + + +{{ end }} + +
+
+

How to participate

+

+ The jam takes place from Friday, April 14 through Sunday, April 16. Here's + how you can participate: +

+ +
+

Pick a project and form a team.

+

+ Pick something to visualize! Maybe it’s some weird data structure you + want to debug. Maybe it’s a map of your codebase. Maybe it’s your sleep + schedule. Whatever it is, make a Handmade Network project for it +

+
+ +
+

Jam.

+

+ {{ if and (eq .DaysUntilStart 0) (not .SubmittedProjectUrl) }} + Create a Handmade Network project + {{ else }} After the jam starts, create a Handmade Network project {{ + end }} to track your work. Then, build your program! Share your work in + progress in #project-showcase on + Discord, or + directly from your project page. Chat with other jammers in #jam too. +

+
+ +
+

Submit your work!

+

+ Your Handmade Network project is your submission. Fill out the + project description, making sure to explain the goals of the project and + how it improves on what came before. Also consider posting an update + with video of your program in action! +

+ {{ if and (eq .DaysUntilStart 0) (gt .DaysUntilEnd 0) }} +

+ Submissions close + . +

+ {{ else if eq .DaysUntilEnd 0 }} +

+ Submissions are now closed. +

+ {{ end }} +
+
+
+ +
+
+

Rules

+ +

+ There are no explicit winners, but we will be selecting a few of our + favorite projects to highlight in a recap stream following the jam. +

+ +

Submission rules

+

+ {{ with .SubmittedProjectUrl }} + Your Handmade Network project + {{ else }} Your Handmade Network project {{ end }} is your + submission. + We will be looking at the project's description and any extra updates you + share toward the end of the jam. +

+ +
+
+ +
+
+
+

Make it by hand.

+

+ The Handmade ethos and Handmade community are software development + superpowers. Don't be afraid to question your foundations and rebuild + what needs rebuilding. The community is here to help you take on those + challenges and do what others might consider impossible. +

+

+ Of course, this is a jam, so focus on what matters to your project. + There are many excellent libraries in the community that can save you + time and help you focus on your core ideas. Don't be afraid to use them. + But don't be afraid to do your own thing if they're holding you back. +

+
+
+

Don't just rebuild. Reinvent.

+

+ This is a chance to build something truly new. Learn from + previous work, but don't settle for “the same, but better”. It would be + a huge shame to spend a week building nothing more than a clone of the + same broken software we use today. +

+

+ This is where working with a team can really help. Bounce ideas off each + other, do some research, and brainstorm before the jam starts. The + software you end up building might be pretty different from your + original ideas. +

+

In the end, this is a jam. Get weird and try something different.

+
+
+
+ + + + +{{ end }} diff --git a/src/website/routes.go b/src/website/routes.go index 11f0e13..f5e5424 100644 --- a/src/website/routes.go +++ b/src/website/routes.go @@ -59,6 +59,7 @@ func NewWebsiteRoutes(conn *pgxpool.Pool) http.Handler { hmnOnly.GET(hmnurl.RegexJamIndex2021, JamIndex2021) hmnOnly.GET(hmnurl.RegexJamIndex2022, JamIndex2022) hmnOnly.GET(hmnurl.RegexJamFeed2022, JamFeed2022) + hmnOnly.GET(hmnurl.RegexVisualizationJamIndex2023, VisualizationIndex2023) hmnOnly.GET(hmnurl.RegexStaffRolesIndex, StaffRolesIndex) hmnOnly.GET(hmnurl.RegexStaffRole, StaffRole) diff --git a/src/website/visualization-jam.go b/src/website/visualization-jam.go new file mode 100644 index 0000000..9d04221 --- /dev/null +++ b/src/website/visualization-jam.go @@ -0,0 +1,118 @@ +package website + +import ( + "net/http" + // "time" + + "git.handmade.network/hmn/hmn/src/hmndata" + "git.handmade.network/hmn/hmn/src/hmnurl" + "git.handmade.network/hmn/hmn/src/oops" + "git.handmade.network/hmn/hmn/src/templates" + // "git.handmade.network/hmn/hmn/src/utils" +) + +func VisualizationIndex2023(c *RequestContext) ResponseData { + var res ResponseData + + daysUntilStart := daysUntil(hmndata.VJ2023.StartTime) + daysUntilEnd := daysUntil(hmndata.VJ2023.EndTime) + + baseData := getBaseDataAutocrumb(c, hmndata.VJ2023.Name) + baseData.OpenGraphItems = []templates.OpenGraphItem{ + {Property: "og:site_name", Value: "Handmade.Network"}, + {Property: "og:type", Value: "website"}, + // TODO: + {Property: "og:image", Value: hmnurl.BuildPublic("visualjam2023/opengraph.png", true)}, + {Property: "og:description", Value: "See things in a new way. April 14 - 16."}, + {Property: "og:url", Value: hmnurl.BuildJamIndex()}, + } + + type JamPageData struct { + templates.BaseData + DaysUntilStart, DaysUntilEnd int + StartTimeUnix, EndTimeUnix int64 + + SubmittedProjectUrl string + ProjectSubmissionUrl string + ShowcaseFeedUrl string + ShowcaseJson string + + JamProjects []templates.Project + } + + var showcaseItems []templates.TimelineItem + submittedProjectUrl := "" + + if c.CurrentUser != nil { + projects, err := hmndata.FetchProjects(c, c.Conn, c.CurrentUser, hmndata.ProjectsQuery{ + OwnerIDs: []int{c.CurrentUser.ID}, + JamSlugs: []string{hmndata.VJ2023.Slug}, + Limit: 1, + }) + if err != nil { + return c.ErrorResponse(http.StatusInternalServerError, oops.New(err, "failed to fetch jam projects for current user")) + } + if len(projects) > 0 { + urlContext := hmndata.UrlContextForProject(&projects[0].Project) + submittedProjectUrl = urlContext.BuildHomepage() + } + } + + jamProjects, err := hmndata.FetchProjects(c, c.Conn, c.CurrentUser, hmndata.ProjectsQuery{ + JamSlugs: []string{hmndata.VJ2023.Slug}, + }) + if err != nil { + return c.ErrorResponse(http.StatusInternalServerError, oops.New(err, "failed to fetch jam projects for current user")) + } + + pageProjects := make([]templates.Project, 0, len(jamProjects)) + for _, p := range jamProjects { + pageProjects = append(pageProjects, templates.ProjectAndStuffToTemplate(&p, hmndata.UrlContextForProject(&p.Project).BuildHomepage(), c.Theme)) + } + + projectIds := make([]int, 0, len(jamProjects)) + for _, jp := range jamProjects { + projectIds = append(projectIds, jp.Project.ID) + } + + if len(projectIds) > 0 { + snippets, err := hmndata.FetchSnippets(c, c.Conn, c.CurrentUser, hmndata.SnippetQuery{ + ProjectIDs: projectIds, + Limit: 12, + }) + if err != nil { + return c.ErrorResponse(http.StatusInternalServerError, oops.New(err, "failed to fetch snippets for jam showcase")) + } + showcaseItems = make([]templates.TimelineItem, 0, len(snippets)) + for _, s := range snippets { + timelineItem := SnippetToTimelineItem(&s.Snippet, s.Asset, s.DiscordMessage, s.Projects, s.Owner, c.Theme, false) + if timelineItem.CanShowcase { + showcaseItems = append(showcaseItems, timelineItem) + } + } + } + + showcaseJson := templates.TimelineItemsToJSON(showcaseItems) + + res.MustWriteTemplate("visualization_jam_2023.html", JamPageData{ + BaseData: baseData, + DaysUntilStart: daysUntilStart, + DaysUntilEnd: daysUntilEnd, + StartTimeUnix: hmndata.VJ2023.StartTime.Unix(), + EndTimeUnix: hmndata.VJ2023.EndTime.Unix(), + ProjectSubmissionUrl: hmnurl.BuildProjectNewJam(), + SubmittedProjectUrl: submittedProjectUrl, + ShowcaseFeedUrl: hmnurl.BuildJamFeed2022(), + ShowcaseJson: showcaseJson, + JamProjects: pageProjects, + }, c.Perf) + return res +} + +// func daysUntil(t time.Time) int { +// d := t.Sub(time.Now()) +// if d < 0 { +// d = 0 +// } +// return int(utils.DurationRoundUp(d, 24*time.Hour) / (24 * time.Hour)) +// }