Git dashboard HTML / CSS refactoring
* Inline SVG icons * Page layout refactoring * Dark theme works * Minor improvements
|
@ -2,8 +2,10 @@
|
||||||
module HBS2.Git.Web.Assets where
|
module HBS2.Git.Web.Assets where
|
||||||
|
|
||||||
import Data.FileEmbed
|
import Data.FileEmbed
|
||||||
|
|
||||||
import Data.ByteString
|
import Data.ByteString
|
||||||
|
import Data.Text (Text)
|
||||||
|
import Text.InterpolatedString.Perl6 (qc)
|
||||||
|
import Lucid.Base
|
||||||
|
|
||||||
version :: Int
|
version :: Int
|
||||||
version = 3
|
version = 3
|
||||||
|
@ -11,4 +13,167 @@ version = 3
|
||||||
assetsDir :: [(FilePath, ByteString)]
|
assetsDir :: [(FilePath, ByteString)]
|
||||||
assetsDir = $(embedDir "hbs2-git-dashboard-assets/assets")
|
assetsDir = $(embedDir "hbs2-git-dashboard-assets/assets")
|
||||||
|
|
||||||
|
data IconType
|
||||||
|
= IconCopy
|
||||||
|
| IconCopyDone
|
||||||
|
| IconLockClosed
|
||||||
|
| IconGitCommit
|
||||||
|
| IconGitFork
|
||||||
|
| IconGitBranch
|
||||||
|
| IconTag
|
||||||
|
| IconFolderFilled
|
||||||
|
| IconHaskell
|
||||||
|
| IconMarkdown
|
||||||
|
| IconNix
|
||||||
|
| IconBash
|
||||||
|
| IconPython
|
||||||
|
| IconJavaScript
|
||||||
|
| IconSql
|
||||||
|
| IconSettingsFilled
|
||||||
|
| IconFileFilled
|
||||||
|
| IconRefresh
|
||||||
|
| IconArrowUturnLeft
|
||||||
|
| IconLicense
|
||||||
|
| IconPinned
|
||||||
|
|
||||||
|
svgIcon :: Monad m => IconType -> HtmlT m ()
|
||||||
|
svgIcon = toHtmlRaw . svgIconText
|
||||||
|
|
||||||
|
svgIconText :: IconType -> Text
|
||||||
|
|
||||||
|
svgIconText IconCopy = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copy" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z" />
|
||||||
|
<path d="M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconCopyDone = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copy-check" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z" />
|
||||||
|
<path d="M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1" />
|
||||||
|
<path d="M11 14l2 2l4 -4" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconLockClosed = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-lock" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6z" />
|
||||||
|
<path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0" />
|
||||||
|
<path d="M8 11v-4a4 4 0 1 1 8 0v4" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconGitCommit = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-git-commit" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M12 12m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" />
|
||||||
|
<path d="M12 3l0 6" />
|
||||||
|
<path d="M12 15l0 6" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconGitFork = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-git-fork" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M12 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
||||||
|
<path d="M7 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
||||||
|
<path d="M17 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
||||||
|
<path d="M7 8v2a2 2 0 0 0 2 2h6a2 2 0 0 0 2 -2v-2" />
|
||||||
|
<path d="M12 12l0 4" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconGitBranch = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-git-branch" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M7 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
||||||
|
<path d="M7 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
||||||
|
<path d="M17 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
||||||
|
<path d="M7 8l0 8" />
|
||||||
|
<path d="M9 18h6a2 2 0 0 0 2 -2v-5" />
|
||||||
|
<path d="M14 14l3 -3l3 3" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconTag = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-tag" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M7.5 7.5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" />
|
||||||
|
<path d="M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3z" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconFolderFilled = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-folder-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="#currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M9 3a1 1 0 0 1 .608 .206l.1 .087l2.706 2.707h6.586a3 3 0 0 1 2.995 2.824l.005 .176v8a3 3 0 0 1 -2.824 2.995l-.176 .005h-14a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-11a3 3 0 0 1 2.824 -2.995l.176 -.005h4z" stroke-width="0" fill="currentColor" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconHaskell = [qc|<svg role="img" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<title>Haskell</title>
|
||||||
|
<path d="M0 3.535L5.647 12 0 20.465h4.235L9.883 12 4.235 3.535zm5.647 0L11.294 12l-5.647 8.465h4.235l3.53-5.29 3.53 5.29h4.234L9.883 3.535zm8.941 4.938l1.883 2.822H24V8.473zm2.824 4.232l1.882 2.822H24v-2.822z"/>
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconMarkdown = [qc|<svg role="img" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<title>Markdown</title>
|
||||||
|
<path d="M22.27 19.385H1.73A1.73 1.73 0 010 17.655V6.345a1.73 1.73 0 011.73-1.73h20.54A1.73 1.73 0 0124 6.345v11.308a1.73 1.73 0 01-1.73 1.731zM5.769 15.923v-4.5l2.308 2.885 2.307-2.885v4.5h2.308V8.078h-2.308l-2.307 2.885-2.308-2.885H3.46v7.847zM21.232 12h-2.309V8.077h-2.307V12h-2.308l3.461 4.039z"/>
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconNix = [qc|<svg role="img" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<title>Nix</title>
|
||||||
|
<path d="M7.352 1.592l-1.364.002L5.32 2.75l1.557 2.713-3.137-.008-1.32 2.34H14.11l-1.353-2.332-3.192-.006-2.214-3.865zm6.175 0l-2.687.025 5.846 10.127 1.341-2.34-1.59-2.765 2.24-3.85-.683-1.182h-1.336l-1.57 2.705-1.56-2.72zm6.887 4.195l-5.846 10.125 2.696-.008 1.601-2.76 4.453.016.682-1.183-.666-1.157-3.13-.008L21.778 8.1l-1.365-2.313zM9.432 8.086l-2.696.008-1.601 2.76-4.453-.016L0 12.02l.666 1.157 3.13.008-1.575 2.71 1.365 2.315L9.432 8.086zM7.33 12.25l-.006.01-.002-.004-1.342 2.34 1.59 2.765-2.24 3.85.684 1.182H7.35l.004-.006h.001l1.567-2.698 1.558 2.72 2.688-.026-.004-.006h.01L7.33 12.25zm2.55 3.93l1.354 2.332 3.192.006 2.215 3.865 1.363-.002.668-1.156-1.557-2.713 3.137.008 1.32-2.34H9.881Z"/>
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconBash = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-terminal-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M8 9l3 3l-3 3" />
|
||||||
|
<path d="M13 15l3 0" />
|
||||||
|
<path d="M3 4m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconPython = [qc|<svg role="img" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<title>Python</title>
|
||||||
|
<path d="M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.17l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05-.05-1.23.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02 1.27.05zm-6.3 1.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09zm13.09 3.95l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14 1.04.05 1.23-.06 1.23-.16 1.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01 2.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01zm-6.47 14.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08z"/>
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconJavaScript = [qc|<svg role="img" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<title>JavaScript</title>
|
||||||
|
<path d="M0 0h24v24H0V0zm22.034 18.276c-.175-1.095-.888-2.015-3.003-2.873-.736-.345-1.554-.585-1.797-1.14-.091-.33-.105-.51-.046-.705.15-.646.915-.84 1.515-.66.39.12.75.42.976.9 1.034-.676 1.034-.676 1.755-1.125-.27-.42-.404-.601-.586-.78-.63-.705-1.469-1.065-2.834-1.034l-.705.089c-.676.165-1.32.525-1.71 1.005-1.14 1.291-.811 3.541.569 4.471 1.365 1.02 3.361 1.244 3.616 2.205.24 1.17-.87 1.545-1.966 1.41-.811-.18-1.26-.586-1.755-1.336l-1.83 1.051c.21.48.45.689.81 1.109 1.74 1.756 6.09 1.666 6.871-1.004.029-.09.24-.705.074-1.65l.046.067zm-8.983-7.245h-2.248c0 1.938-.009 3.864-.009 5.805 0 1.232.063 2.363-.138 2.711-.33.689-1.18.601-1.566.48-.396-.196-.597-.466-.83-.855-.063-.105-.11-.196-.127-.196l-1.825 1.125c.305.63.75 1.172 1.324 1.517.855.51 2.004.675 3.207.405.783-.226 1.458-.691 1.811-1.411.51-.93.402-2.07.397-3.346.012-2.054 0-4.109 0-6.179l.004-.056z"/>
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconSql = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-file-type-sql" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M14 3v4a1 1 0 0 0 1 1h4" />
|
||||||
|
<path d="M14 3v4a1 1 0 0 0 1 1h4" />
|
||||||
|
<path d="M5 20.25c0 .414 .336 .75 .75 .75h1.25a1 1 0 0 0 1 -1v-1a1 1 0 0 0 -1 -1h-1a1 1 0 0 1 -1 -1v-1a1 1 0 0 1 1 -1h1.25a.75 .75 0 0 1 .75 .75" />
|
||||||
|
<path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4" />
|
||||||
|
<path d="M18 15v6h2" />
|
||||||
|
<path d="M13 15a2 2 0 0 1 2 2v2a2 2 0 1 1 -4 0v-2a2 2 0 0 1 2 -2z" />
|
||||||
|
<path d="M14 20l1.5 1.5" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconSettingsFilled = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-settings-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M14.647 4.081a.724 .724 0 0 0 1.08 .448c2.439 -1.485 5.23 1.305 3.745 3.744a.724 .724 0 0 0 .447 1.08c2.775 .673 2.775 4.62 0 5.294a.724 .724 0 0 0 -.448 1.08c1.485 2.439 -1.305 5.23 -3.744 3.745a.724 .724 0 0 0 -1.08 .447c-.673 2.775 -4.62 2.775 -5.294 0a.724 .724 0 0 0 -1.08 -.448c-2.439 1.485 -5.23 -1.305 -3.745 -3.744a.724 .724 0 0 0 -.447 -1.08c-2.775 -.673 -2.775 -4.62 0 -5.294a.724 .724 0 0 0 .448 -1.08c-1.485 -2.439 1.305 -5.23 3.744 -3.745a.722 .722 0 0 0 1.08 -.447c.673 -2.775 4.62 -2.775 5.294 0zm-2.647 4.919a3 3 0 1 0 0 6a3 3 0 0 0 0 -6z" stroke-width="0" fill="currentColor" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconFileFilled = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-file-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M12 2l.117 .007a1 1 0 0 1 .876 .876l.007 .117v4l.005 .15a2 2 0 0 0 1.838 1.844l.157 .006h4l.117 .007a1 1 0 0 1 .876 .876l.007 .117v9a3 3 0 0 1 -2.824 2.995l-.176 .005h-10a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-14a3 3 0 0 1 2.824 -2.995l.176 -.005h5z" stroke-width="0" fill="currentColor" />
|
||||||
|
<path d="M19 7h-4l-.001 -4.001z" stroke-width="0" fill="currentColor" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconRefresh = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-refresh" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4" />
|
||||||
|
<path d="M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconArrowUturnLeft = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-arrow-uturn-left" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M9 14l-4 -4l4 -4" />
|
||||||
|
<path d="M5 10h11a4 4 0 1 1 0 8h-1" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconLicense = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-license" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M15 21h-9a3 3 0 0 1 -3 -3v-1h10v2a2 2 0 0 0 4 0v-14a2 2 0 1 1 2 2h-2m2 -4h-11a3 3 0 0 0 -3 3v11" />
|
||||||
|
<path d="M9 7l4 0" />
|
||||||
|
<path d="M9 11l4 0" />
|
||||||
|
</svg>|]
|
||||||
|
|
||||||
|
svgIconText IconPinned = [qc|<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-pinned" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M9 4v6l-2 4v2h10v-2l-2 -4v-6" />
|
||||||
|
<path d="M12 16l0 5" />
|
||||||
|
<path d="M8 4l8 0" />
|
||||||
|
</svg>|]
|
||||||
|
|
|
@ -1,337 +1,146 @@
|
||||||
input, button {
|
/* fastpok CSS start */
|
||||||
font-size: var(--form-element-font-size);
|
|
||||||
height: 2.5rem;
|
:root {
|
||||||
padding: 0.25rem 0.5rem;
|
--pico-form-element-spacing-vertical: .5rem;
|
||||||
border-radius: 0.25rem;
|
--pico-form-element-spacing-horizontal: .625rem;
|
||||||
border: 1px solid #ccc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="search"] {
|
[type=search] {
|
||||||
font-size: var(--form-element-font-size);
|
--pico-border-radius: inherit;
|
||||||
height: 2.5rem;
|
|
||||||
padding: 0.25rem 0.5rem;
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
button.search {
|
[role=search] {
|
||||||
background: url('/icon/refresh.svg') no-repeat center center;
|
--pico-border-radius: inherit;
|
||||||
background-size: 24px 24px;
|
|
||||||
min-width: 32px;
|
|
||||||
height: 2.5rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
button.search svg {
|
[role=search]>:first-child {
|
||||||
|
border-top-left-radius: var(--pico-border-radius);
|
||||||
|
border-bottom-left-radius: var(--pico-border-radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
body, html {
|
[role=search]>:last-child {
|
||||||
margin: 0;
|
border-top-right-radius: var(--pico-border-radius);
|
||||||
height: 100%;
|
border-bottom-right-radius: var(--pico-border-radius);
|
||||||
font-size: 18px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body>footer, body>header, body>main {
|
||||||
|
padding-block: 0;
|
||||||
|
}
|
||||||
|
|
||||||
header {
|
header>nav {
|
||||||
width: 100%;
|
border-bottom: var(--pico-border-width) solid var(--pico-muted-border-color);
|
||||||
|
}
|
||||||
font-size: 20px;
|
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
padding: 8px;
|
|
||||||
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 100;
|
|
||||||
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* height: 64px; */
|
.sidebar {
|
||||||
|
width: 20rem;
|
||||||
header h1 {
|
flex-shrink: 0;
|
||||||
font-size: 20px;
|
padding-top: var(--pico-block-spacing-vertical);
|
||||||
margin: 0 0 0 2.21rem;
|
padding-right: var(--pico-block-spacing-horizontal);
|
||||||
font-weight: 500;
|
padding-bottom: var(--pico-block-spacing-vertical);
|
||||||
}
|
border-right: var(--pico-border-width) solid var(--pico-muted-border-color);
|
||||||
|
|
||||||
.header-title {
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-links {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-left: 10em;
|
|
||||||
gap: 2rem;
|
|
||||||
background: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
header a {
|
|
||||||
/* display: inline; */
|
|
||||||
height: 1rem;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-actions {
|
|
||||||
margin-left: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav.left {
|
|
||||||
flex: 0 0 20rem;
|
|
||||||
padding: 4rem 0rem 0 1rem;
|
|
||||||
font-size: 20px;
|
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: normal;
|
|
||||||
background: #FAFAFA;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nav.left .info-block {
|
.content {
|
||||||
margin-bottom: 1.5rem;
|
padding-top: var(--pico-block-spacing-vertical);
|
||||||
padding-left: 0.85rem;
|
padding-bottom: var(--pico-block-spacing-vertical);
|
||||||
padding-right: 0.85rem;
|
padding-left: var(--pico-block-spacing-horizontal);
|
||||||
}
|
}
|
||||||
|
|
||||||
section#repo-data {
|
article {
|
||||||
margin-top: 1.5rem;
|
border: var(--pico-border-width) solid var(--pico-card-border-color);
|
||||||
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
section#repo-data> h1::after,
|
.repo-list-item {
|
||||||
section#repo-data> h2::after,
|
|
||||||
section#repo-data> h3::after,
|
|
||||||
section#repo-data> h4::after
|
|
||||||
{
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
margin: 8px 0;
|
|
||||||
height: 1px;
|
|
||||||
background-color: #ccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* height: calc(100vh - 64px); */
|
|
||||||
|
|
||||||
section {
|
|
||||||
margin-top: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
main {
|
|
||||||
flex-grow: 1;
|
|
||||||
padding: 2rem 0 0 4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.main {
|
|
||||||
display: flex;
|
|
||||||
padding: 4px 0 0 0;
|
|
||||||
margin: 0;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
main h1 {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
main h2 {
|
|
||||||
font-size: 1.45rem;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
|
|
||||||
div .repo-list-item {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: flex-start;
|
gap: var(--pico-block-spacing-horizontal);
|
||||||
|
|
||||||
|
|
||||||
background: #FAFAFA;
|
|
||||||
padding: 0.75rem;
|
|
||||||
margin-top: 1.75rem;
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
border: 1px solid #BFC7D9;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.channel-list-item {
|
.repo-list-item-link-wrapper {
|
||||||
display: block;
|
|
||||||
|
|
||||||
background: #FAFAFA;
|
|
||||||
padding: 1.45rem;
|
|
||||||
margin-top: 2rem;
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
border: 1px solid #BFC7D9;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.repo-info, .repo-info-misc {
|
|
||||||
flex: 1;
|
|
||||||
padding: 1.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.repo-info h2 a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.repo-info h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.repo-info h2 a:hover {
|
|
||||||
text-decoration: underline dotted;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.repo-info-misc {
|
|
||||||
text-align: right;
|
|
||||||
font-size: 0.85rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.attr {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
gap: 1rem;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
padding-right: 1rem;
|
|
||||||
font-size: 0.85rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.attrname, {
|
|
||||||
flex: 1;
|
|
||||||
margin-right: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.attrname a img {
|
|
||||||
margin-right: 0.15rem;
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.attrval {
|
|
||||||
text-align: right;
|
|
||||||
flex-basis: 8rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.onleft {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon {
|
|
||||||
flex-basis: 90%;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-block .attrname {
|
|
||||||
font-size: 0.85rem;
|
|
||||||
font-weight: bolder;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-block .attrval {
|
|
||||||
font-size: 0.85rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-block a {
|
|
||||||
font-size: inherit;
|
|
||||||
color: inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-block a:hover {
|
|
||||||
text-decoration: underline dotted 2px black;
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
form.search {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
align-items: flex-start;
|
margin-bottom: var(--pico-typography-spacing-vertical);
|
||||||
gap: 0.5em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
form.search input[type="search"] {
|
.copy-button {
|
||||||
align: center;
|
margin-left: calc(var(--pico-spacing) * .5);
|
||||||
flex-grow: 1;
|
background-color: transparent;
|
||||||
margin-right: 0.5em;
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
color: var(--pico-secondary);
|
||||||
|
transition: color var(--pico-transition);
|
||||||
}
|
}
|
||||||
|
|
||||||
form.search button {
|
.copy-button:hover {
|
||||||
align: center;
|
color: var(--pico-secondary-hover);
|
||||||
min-width: 4rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.xclip::after {
|
.copy-button .icon {
|
||||||
|
width: 1.125rem;
|
||||||
|
height: 1.125rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inline-icon-wrapper {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
content: url('/icon/xclip.svg');
|
}
|
||||||
|
|
||||||
|
.inline-icon-wrapper .icon {
|
||||||
|
margin-right: calc(var(--pico-spacing) * .25);
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
width: 24px;
|
|
||||||
height: 24px;
|
|
||||||
opacity: 0;
|
|
||||||
transition: opacity 0.2s;
|
|
||||||
left: 16px;
|
|
||||||
position: relative;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.xclip:hover::after {
|
.info-block {
|
||||||
left: 16px;
|
margin-bottom: var(--pico-block-spacing-vertical);
|
||||||
position: relative;
|
|
||||||
content: url('/icon/xclip.svg');
|
|
||||||
vertical-align: middle;
|
|
||||||
height: 24x;
|
|
||||||
width: 24x;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.xclip {
|
.mb-0 {
|
||||||
/*position: relative;*/
|
margin-bottom: 0;
|
||||||
text-decoration: underline dotted;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.xclip:hover {
|
.py-0 {
|
||||||
text-decoration: underline dotted;
|
padding-top: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.clicked:hover::after {
|
.text-nowrap {
|
||||||
content: url('/icon/xclipdone.svg');
|
text-wrap: nowrap;
|
||||||
vertical-align: middle;
|
|
||||||
right: 16px;
|
|
||||||
height: 24x;
|
|
||||||
width: 24x;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nav[role="tab-control"] {
|
.repo-menu {
|
||||||
min-height: 24px;
|
--pico-nav-breadcrumb-divider: '|';
|
||||||
font-size: 18px;
|
|
||||||
/* border: 1px solid black; */
|
|
||||||
display: block;
|
|
||||||
margin-bottom: 4rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nav[role="tab-control"] li {
|
.repo-menu li.active {
|
||||||
display: block;
|
color: var(--pico-primary);
|
||||||
padding: 0 0 0 0;
|
|
||||||
padding-right: 2rem;
|
|
||||||
margin-right: 2rem;
|
|
||||||
border-right: 2px solid gray;
|
|
||||||
font-weight: bolder;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nav[role="tab-control"] li a {
|
aside li {
|
||||||
color: inherit;
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
aside ul {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
aside li :where(a,[role=link]):not(:hover) {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav[role="tab-control"] li.active {
|
.sidebar-title {
|
||||||
display: block;
|
margin-bottom: calc(var(--pico-typography-spacing-vertical) * .25);
|
||||||
color: #0089D1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* fastpok CSS end */
|
||||||
|
|
||||||
nav.secondary[role="tab-control"] li {
|
|
||||||
border-right: none;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.misc-menu {
|
ul.misc-menu {
|
||||||
margin: 0 0 0 0;
|
margin: 0 0 0 0;
|
||||||
|
@ -423,8 +232,6 @@ pre.numberSource code > span > a:first-child::before
|
||||||
color: #aaaaaa;
|
color: #aaaaaa;
|
||||||
}
|
}
|
||||||
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
|
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
|
||||||
div.sourceCode
|
|
||||||
{ background-color: #f8f8f8; }
|
|
||||||
@media screen {
|
@media screen {
|
||||||
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
|
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg"
|
|
||||||
class="icon icon-tabler icon-tabler-file-filled"
|
|
||||||
width="20" height="20"
|
|
||||||
viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M12 2l.117 .007a1 1 0 0 1 .876 .876l.007 .117v4l.005 .15a2 2 0 0 0 1.838 1.844l.157 .006h4l.117 .007a1 1 0 0 1 .876 .876l.007 .117v9a3 3 0 0 1 -2.824 2.995l-.176 .005h-10a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-14a3 3 0 0 1 2.824 -2.995l.176 -.005h5z" stroke-width="0" fill="currentColor" />
|
|
||||||
<path d="M19 7h-4l-.001 -4.001z" stroke-width="0" fill="currentColor" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 679 B |
|
@ -1,16 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg"
|
|
||||||
class="icon icon-tabler icon-tabler-file-alert"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#2c3e50"
|
|
||||||
fill="none"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round">
|
|
||||||
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M14 3v4a1 1 0 0 0 1 1h4" />
|
|
||||||
<path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" />
|
|
||||||
<!-- <path d="M12 11l0 3" /> -->
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 465 B |
|
@ -1,8 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg"
|
|
||||||
class="icon icon-tabler icon-tabler-settings-filled"
|
|
||||||
width="20" height="20"
|
|
||||||
viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M14.647 4.081a.724 .724 0 0 0 1.08 .448c2.439 -1.485 5.23 1.305 3.745 3.744a.724 .724 0 0 0 .447 1.08c2.775 .673 2.775 4.62 0 5.294a.724 .724 0 0 0 -.448 1.08c1.485 2.439 -1.305 5.23 -3.744 3.745a.724 .724 0 0 0 -1.08 .447c-.673 2.775 -4.62 2.775 -5.294 0a.724 .724 0 0 0 -1.08 -.448c-2.439 1.485 -5.23 -1.305 -3.745 -3.744a.724 .724 0 0 0 -.447 -1.08c-2.775 -.673 -2.775 -4.62 0 -5.294a.724 .724 0 0 0 .448 -1.08c-1.485 -2.439 1.305 -5.23 3.744 -3.745a.722 .722 0 0 0 1.08 -.447c.673 -2.775 4.62 -2.775 5.294 0zm-2.647 4.919a3 3 0 1 0 0 6a3 3 0 0 0 0 -6z" stroke-width="0" fill="currentColor" />
|
|
||||||
</svg>
|
|
||||||
|
|
Before Width: | Height: | Size: 908 B |
|
@ -1,9 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-git-branch" width="20" height="20" viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M7 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
|
||||||
<path d="M7 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
|
||||||
<path d="M17 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
|
||||||
<path d="M7 8l0 8" />
|
|
||||||
<path d="M9 18h6a2 2 0 0 0 2 -2v-5" />
|
|
||||||
<path d="M14 14l3 -3l3 3" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 548 B |
|
@ -1,6 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-git-commit" width="20" height="20" viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M12 12m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" />
|
|
||||||
<path d="M12 3l0 6" />
|
|
||||||
<path d="M12 15l0 6" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 395 B |
|
@ -1,8 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-git-fork" width="20" height="20" viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M12 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
|
||||||
<path d="M7 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
|
||||||
<path d="M17 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
|
|
||||||
<path d="M7 8v2a2 2 0 0 0 2 2h6a2 2 0 0 0 2 -2v-2" />
|
|
||||||
<path d="M12 12l0 4" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 533 B |
|
@ -1,5 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-tag" width="20" height="20" viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M7.5 7.5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" />
|
|
||||||
<path d="M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3z" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 516 B |
|
@ -1,3 +0,0 @@
|
||||||
<svg role="img" withd="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<title>Haskell</title>
|
|
||||||
<path d="M0 3.535L5.647 12 0 20.465h4.235L9.883 12 4.235 3.535zm5.647 0L11.294 12l-5.647 8.465h4.235l3.53-5.29 3.53 5.29h4.234L9.883 3.535zm8.941 4.938l1.883 2.822H24V8.473zm2.824 4.232l1.882 2.822H24v-2.822z"/></svg>
|
|
Before Width: | Height: | Size: 336 B |
|
@ -1,8 +0,0 @@
|
||||||
<svg role="img"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="20"
|
|
||||||
height="20"
|
|
||||||
xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<title>JavaScript</title>
|
|
||||||
<path d="M0 0h24v24H0V0zm22.034 18.276c-.175-1.095-.888-2.015-3.003-2.873-.736-.345-1.554-.585-1.797-1.14-.091-.33-.105-.51-.046-.705.15-.646.915-.84 1.515-.66.39.12.75.42.976.9 1.034-.676 1.034-.676 1.755-1.125-.27-.42-.404-.601-.586-.78-.63-.705-1.469-1.065-2.834-1.034l-.705.089c-.676.165-1.32.525-1.71 1.005-1.14 1.291-.811 3.541.569 4.471 1.365 1.02 3.361 1.244 3.616 2.205.24 1.17-.87 1.545-1.966 1.41-.811-.18-1.26-.586-1.755-1.336l-1.83 1.051c.21.48.45.689.81 1.109 1.74 1.756 6.09 1.666 6.871-1.004.029-.09.24-.705.074-1.65l.046.067zm-8.983-7.245h-2.248c0 1.938-.009 3.864-.009 5.805 0 1.232.063 2.363-.138 2.711-.33.689-1.18.601-1.566.48-.396-.196-.597-.466-.83-.855-.063-.105-.11-.196-.127-.196l-1.825 1.125c.305.63.75 1.172 1.324 1.517.855.51 2.004.675 3.207.405.783-.226 1.458-.691 1.811-1.411.51-.93.402-2.07.397-3.346.012-2.054 0-4.109 0-6.179l.004-.056z"/>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1021 B |
|
@ -1,6 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-license" width="20" height="20" viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M15 21h-9a3 3 0 0 1 -3 -3v-1h10v2a2 2 0 0 0 4 0v-14a2 2 0 1 1 2 2h-2m2 -4h-11a3 3 0 0 0 -3 3v11" />
|
|
||||||
<path d="M9 7l4 0" />
|
|
||||||
<path d="M9 11l4 0" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 445 B |
|
@ -1,7 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-lock" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="#2c3e50" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6z" />
|
|
||||||
<path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0" />
|
|
||||||
<path d="M8 11v-4a4 4 0 1 1 8 0v4" />
|
|
||||||
</svg>
|
|
||||||
|
|
Before Width: | Height: | Size: 468 B |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 28 KiB |
|
@ -1,7 +0,0 @@
|
||||||
<svg role="img"
|
|
||||||
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"
|
|
||||||
height="20"
|
|
||||||
withd="20"
|
|
||||||
>
|
|
||||||
<title>Markdown</title>
|
|
||||||
<path d="M22.27 19.385H1.73A1.73 1.73 0 010 17.655V6.345a1.73 1.73 0 011.73-1.73h20.54A1.73 1.73 0 0124 6.345v11.308a1.73 1.73 0 01-1.73 1.731zM5.769 15.923v-4.5l2.308 2.885 2.307-2.885v4.5h2.308V8.078h-2.308l-2.307 2.885-2.308-2.885H3.46v7.847zM21.232 12h-2.309V8.077h-2.307V12h-2.308l3.461 4.039z"/></svg>
|
|
Before Width: | Height: | Size: 448 B |
|
@ -1,8 +0,0 @@
|
||||||
<svg
|
|
||||||
role="img"
|
|
||||||
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"
|
|
||||||
height="20"
|
|
||||||
width="20"
|
|
||||||
>
|
|
||||||
<title>NixOS</title>
|
|
||||||
<path d="M7.352 1.592l-1.364.002L5.32 2.75l1.557 2.713-3.137-.008-1.32 2.34H14.11l-1.353-2.332-3.192-.006-2.214-3.865zm6.175 0l-2.687.025 5.846 10.127 1.341-2.34-1.59-2.765 2.24-3.85-.683-1.182h-1.336l-1.57 2.705-1.56-2.72zm6.887 4.195l-5.846 10.125 2.696-.008 1.601-2.76 4.453.016.682-1.183-.666-1.157-3.13-.008L21.778 8.1l-1.365-2.313zM9.432 8.086l-2.696.008-1.601 2.76-4.453-.016L0 12.02l.666 1.157 3.13.008-1.575 2.71 1.365 2.315L9.432 8.086zM7.33 12.25l-.006.01-.002-.004-1.342 2.34 1.59 2.765-2.24 3.85.684 1.182H7.35l.004-.006h.001l1.567-2.698 1.558 2.72 2.688-.026-.004-.006h.01L7.33 12.25zm2.55 3.93l1.354 2.332 3.192.006 2.215 3.865 1.363-.002.668-1.156-1.557-2.713 3.137.008 1.32-2.34H9.881Z"/></svg>
|
|
Before Width: | Height: | Size: 843 B |
|
@ -1,6 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-pinned" width="20" height="20" viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M9 4v6l-2 4v2h10v-2l-2 -4v-6" />
|
|
||||||
<path d="M12 16l0 5" />
|
|
||||||
<path d="M8 4l8 0" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 378 B |
|
@ -1,4 +0,0 @@
|
||||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"
|
|
||||||
width="20" height="20">
|
|
||||||
<title>Python</title>
|
|
||||||
<path d="M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.17l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05-.05-1.23.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02 1.27.05zm-6.3 1.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09zm13.09 3.95l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14 1.04.05 1.23-.06 1.23-.16 1.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01 2.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01zm-6.47 14.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08z"/></svg>
|
|
Before Width: | Height: | Size: 1.5 KiB |
|
@ -1,13 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke-width="2"
|
|
||||||
stroke="currentColor"
|
|
||||||
fill="none"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4" />
|
|
||||||
<path d="M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 384 B |
|
@ -1,10 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-file-type-sql" width="20" height="20" viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M14 3v4a1 1 0 0 0 1 1h4" />
|
|
||||||
<path d="M14 3v4a1 1 0 0 0 1 1h4" />
|
|
||||||
<path d="M5 20.25c0 .414 .336 .75 .75 .75h1.25a1 1 0 0 0 1 -1v-1a1 1 0 0 0 -1 -1h-1a1 1 0 0 1 -1 -1v-1a1 1 0 0 1 1 -1h1.25a.75 .75 0 0 1 .75 .75" />
|
|
||||||
<path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4" />
|
|
||||||
<path d="M18 15v6h2" />
|
|
||||||
<path d="M13 15a2 2 0 0 1 2 2v2a2 2 0 1 1 -4 0v-2a2 2 0 0 1 2 -2z" />
|
|
||||||
<path d="M14 20l1.5 1.5" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 695 B |
|
@ -1,9 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg"
|
|
||||||
class="icon icon-tabler icon-tabler-terminal-2"
|
|
||||||
width="20" height="20" viewBox="0 0 24 24"
|
|
||||||
stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M8 9l3 3l-3 3" />
|
|
||||||
<path d="M13 15l3 0" />
|
|
||||||
<path d="M3 4m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 444 B |
|
@ -1,15 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg"
|
|
||||||
class="icon icon-tabler icon-tabler-arrow-back-up"
|
|
||||||
width="20"
|
|
||||||
height="20"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke-width="2"
|
|
||||||
stroke="#000000"
|
|
||||||
fill="none"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M9 14l-4 -4l4 -4" />
|
|
||||||
<path d="M5 10h11a4 4 0 1 1 0 8h-1" />
|
|
||||||
</svg>
|
|
||||||
|
|
Before Width: | Height: | Size: 399 B |
|
@ -1,5 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-folder-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="#00abfb" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M9 3a1 1 0 0 1 .608 .206l.1 .087l2.706 2.707h6.586a3 3 0 0 1 2.995 2.824l.005 .176v8a3 3 0 0 1 -2.824 2.995l-.176 .005h-14a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-11a3 3 0 0 1 2.824 -2.995l.176 -.005h4z"
|
|
||||||
stroke-width="0" fill="#00abfb" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 546 B |
|
@ -1,6 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copy" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="#2c3e50" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z" />
|
|
||||||
<path d="M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1" />
|
|
||||||
</svg>
|
|
||||||
|
|
Before Width: | Height: | Size: 564 B |
|
@ -1,6 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copy-check" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="#2c3e50" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
|
||||||
<path d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z" />
|
|
||||||
<path d="M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1" />
|
|
||||||
<path d="M11 14l2 2l4 -4" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 600 B |
|
@ -1,7 +0,0 @@
|
||||||
<svg role="img"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
height="20"
|
|
||||||
withd="20" >
|
|
||||||
<title>YAML</title>
|
|
||||||
<path d="m0 .97 4.111 6.453v4.09h2.638v-4.09L11.053.969H8.214L5.58 5.125 2.965.969Zm12.093.024-4.47 10.544h2.114l.97-2.345h4.775l.804 2.345h2.26L14.255.994Zm1.133 2.225 1.463 3.87h-3.096zm3.06 9.475v10.29H24v-2.199h-5.454v-8.091zm-12.175.002v10.335h2.217v-7.129l2.32 4.792h1.746l2.4-4.96v7.295h2.127V12.696h-2.904L9.44 17.37l-2.455-4.674Z"/></svg>
|
|
Before Width: | Height: | Size: 484 B |
|
@ -13,6 +13,7 @@ import HBS2.OrDie
|
||||||
|
|
||||||
import HBS2.Git.Data.Tx.Git
|
import HBS2.Git.Data.Tx.Git
|
||||||
import HBS2.Git.Data.RepoHead
|
import HBS2.Git.Data.RepoHead
|
||||||
|
import HBS2.Git.Web.Assets
|
||||||
|
|
||||||
-- import Data.Text.Fuzzy.Tokenize as Fuzz
|
-- import Data.Text.Fuzzy.Tokenize as Fuzz
|
||||||
|
|
||||||
|
@ -265,10 +266,18 @@ myCss = do
|
||||||
hyper_ :: Text -> Attribute
|
hyper_ :: Text -> Attribute
|
||||||
hyper_ = makeAttribute "_"
|
hyper_ = makeAttribute "_"
|
||||||
|
|
||||||
|
ariaLabel_ :: Text -> Attribute
|
||||||
|
ariaLabel_ = makeAttribute "aria-label"
|
||||||
|
|
||||||
onClickCopy :: Text -> Attribute
|
onClickCopy :: Text -> Attribute
|
||||||
onClickCopy s =
|
onClickCopy s =
|
||||||
hyper_ [qc|on click writeText('{s}') into the navigator's clipboard add .clicked to me wait 2s remove .clicked from me|]
|
hyper_ [qc|on click writeText('{s}') into the navigator's clipboard
|
||||||
|
set my innerHTML to '{svgIconText IconCopyDone}'
|
||||||
|
set @data-tooltip to 'Copied!'
|
||||||
|
wait 2s
|
||||||
|
set my innerHTML to '{svgIconText IconCopy}'
|
||||||
|
set @data-tooltip to 'Copy'
|
||||||
|
|]
|
||||||
|
|
||||||
markdownToHtml :: Text -> Either PandocError String
|
markdownToHtml :: Text -> Either PandocError String
|
||||||
markdownToHtml markdown = runPure $ do
|
markdownToHtml markdown = runPure $ do
|
||||||
|
@ -318,10 +327,10 @@ rootPage content = do
|
||||||
myCss
|
myCss
|
||||||
|
|
||||||
body_ do
|
body_ do
|
||||||
header_ do
|
|
||||||
div_ [class_ "header-title"] $ h1_ [] $ do
|
|
||||||
a_ [href_ (toURL RepoListPage)] "hbs2-peer dashboard"
|
|
||||||
|
|
||||||
|
header_ [class_ "container-fluid"] do
|
||||||
|
nav_ do
|
||||||
|
ul_ $ li_ $ a_ [href_ (toURL RepoListPage)] $ strong_ "hbs2-peer dashboard"
|
||||||
|
|
||||||
content
|
content
|
||||||
|
|
||||||
|
@ -333,80 +342,73 @@ dashboardRootPage = rootPage do
|
||||||
|
|
||||||
now <- liftIO getPOSIXTime <&> fromIntegral . round
|
now <- liftIO getPOSIXTime <&> fromIntegral . round
|
||||||
|
|
||||||
div_ [class_ "container main"] $ do
|
main_ [class_ "container-fluid"] $ do
|
||||||
nav_ [class_ "left"] $ do
|
div_ [class_ "wrapper"] $ do
|
||||||
div_ [class_ "info-block"] "Всякая разная рандомная информация хрен знает, что тут пока выводить"
|
aside_ [class_ "sidebar"] $ do
|
||||||
div_ [class_ "info-block"] "Всякая разная рандомная информация хрен знает, что тут пока выводить"
|
div_ [class_ "info-block"] $ small_ "Всякая разная рандомная информация хрен знает, что тут пока выводить"
|
||||||
|
div_ [class_ "info-block"] $ small_ "Всякая разная рандомная информация хрен знает, что тут пока выводить"
|
||||||
|
|
||||||
main_ do
|
div_ [class_ "content"] do
|
||||||
|
|
||||||
|
section_ do
|
||||||
|
h2_ "Git repositories"
|
||||||
|
form_ [role_ "search"] do
|
||||||
|
input_ [name_ "search", type_ "search"]
|
||||||
|
input_ [type_ "submit", value_ "Search"]
|
||||||
|
|
||||||
|
section_ do
|
||||||
|
|
||||||
section_ do
|
for_ items $ \it@RepoListItem{..} -> do
|
||||||
h1_ "Git repositories"
|
|
||||||
form_ [class_ "search"] do
|
|
||||||
input_ [type_ "search", id_ "search"]
|
|
||||||
button_ [class_ "search"] mempty
|
|
||||||
|
|
||||||
|
let locked = isJust $ coerce @_ @(Maybe HashRef) rlRepoGK0
|
||||||
|
|
||||||
section_ [id_ "repo-search-results"] do
|
let url = toURL (RepoPage (CommitsTab Nothing) (coerce @_ @(LWWRefKey 'HBS2Basic) rlRepoLww))
|
||||||
|
-- path ["repo", Text.unpack $ view rlRepoLwwAsText it]
|
||||||
|
let t = fromIntegral $ coerce @_ @Word64 rlRepoSeq
|
||||||
|
|
||||||
for_ items $ \it@RepoListItem{..} -> do
|
let updated = agePure t now
|
||||||
|
|
||||||
let locked = isJust $ coerce @_ @(Maybe HashRef) rlRepoGK0
|
article_ [class_ "repo-list-item"] do
|
||||||
|
div_ do
|
||||||
|
|
||||||
let url = toURL (RepoPage (CommitsTab Nothing) (coerce @_ @(LWWRefKey 'HBS2Basic) rlRepoLww))
|
h5_ do
|
||||||
-- path ["repo", Text.unpack $ view rlRepoLwwAsText it]
|
toHtml rlRepoName
|
||||||
let t = fromIntegral $ coerce @_ @Word64 rlRepoSeq
|
|
||||||
|
|
||||||
let updated = agePure t now
|
div_ [class_ "repo-list-item-link-wrapper"] $ do
|
||||||
|
a_ [href_ url] (toHtml $ view rlRepoLwwAsText it)
|
||||||
|
button_ [class_ "copy-button", onClickCopy (view rlRepoLwwAsText it), data_ "tooltip" "Copy"] do
|
||||||
|
svgIcon IconCopy
|
||||||
|
|
||||||
div_ [class_ "repo-list-item"] do
|
toHtml rlRepoBrief
|
||||||
div_ [class_ "repo-info", style_ "flex: 1; flex-basis: 70%;"] do
|
|
||||||
|
|
||||||
h2_ [class_ "xclip", onClickCopy (view rlRepoLwwAsText it)] do
|
div_ do
|
||||||
toHtml rlRepoName
|
|
||||||
-- when locked $ img_ [src_ "/icon/lock-closed.svg"]
|
|
||||||
|
|
||||||
p_ $ a_ [href_ url] (toHtml $ view rlRepoLwwAsText it)
|
div_ [class_ "text-nowrap"] do
|
||||||
|
small_ $ "Updated " <> toHtml updated
|
||||||
|
|
||||||
toHtml rlRepoBrief
|
when locked do
|
||||||
|
div_ do
|
||||||
|
small_ do
|
||||||
|
span_ [class_ "inline-icon-wrapper"] $ svgIcon IconLockClosed
|
||||||
|
"Encrypted"
|
||||||
|
|
||||||
div_ [ ] do
|
div_ do
|
||||||
|
small_ do
|
||||||
|
span_ [class_ "inline-icon-wrapper"] $ svgIcon IconGitCommit
|
||||||
|
strong_ $ toHtml $ show rlRepoCommits
|
||||||
|
" commits"
|
||||||
|
|
||||||
div_ [ class_ "attr" ] do
|
div_ do
|
||||||
div_ [ class_ "attrname"] ""
|
small_ do
|
||||||
div_ [ class_ "attrval"] (toHtml updated)
|
span_ [class_ "inline-icon-wrapper"] $ svgIcon IconGitFork
|
||||||
|
strong_ $ toHtml $ show rlRepoForks
|
||||||
when locked do
|
" forks"
|
||||||
div_ [ class_ "attr" ] do
|
|
||||||
div_ [ class_ "attrname"] "encrypted"
|
|
||||||
div_ [ class_ "attrval"] do
|
|
||||||
img_ [src_ "/icon/lock-closed.svg"]
|
|
||||||
|
|
||||||
div_ [ class_ "attr" ] do
|
|
||||||
div_ [ class_ "attrname"] "commits"
|
|
||||||
div_ [ class_ "attrval"] $ toHtml (show rlRepoCommits)
|
|
||||||
|
|
||||||
div_ [ class_ "attr" ] do
|
|
||||||
div_ [ class_ "attrname"] "forks"
|
|
||||||
div_ [ class_ "attrval"] $ toHtml (show rlRepoForks)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
tabClick :: Attribute
|
tabClick :: Attribute
|
||||||
tabClick =
|
tabClick =
|
||||||
hyper_ "on click take .active from .tab for event's target"
|
hyper_ "on click take .contrast from .tab for event's target"
|
||||||
|
|
||||||
-- repoMenu :: Monad m => HtmlT m () -> HtmlT m ()
|
|
||||||
repoMenu :: Term [Attribute] (t1 -> t2) => t1 -> t2
|
|
||||||
repoMenu = ul_ []
|
|
||||||
|
|
||||||
|
|
||||||
repoMenuItem0 :: Term [Attribute] (t1 -> t2) => [Attribute] -> t1 -> t2
|
|
||||||
repoMenuItem0 misc name = li_ ([class_ "tab active"] <> misc <> [tabClick]) name
|
|
||||||
|
|
||||||
repoMenuItem :: Term [Attribute] (t1 -> t2) => [Attribute] -> t1 -> t2
|
|
||||||
repoMenuItem misc name = li_ ([class_ "tab"] <> misc <> [tabClick]) name
|
|
||||||
|
|
||||||
|
|
||||||
parsedManifest :: (DashBoardPerks m, MonadReader DashBoardEnv m) => RepoListItem -> m ([Syntax C], Text)
|
parsedManifest :: (DashBoardPerks m, MonadReader DashBoardEnv m) => RepoListItem -> m ([Syntax C], Text)
|
||||||
parsedManifest RepoListItem{..} = do
|
parsedManifest RepoListItem{..} = do
|
||||||
|
@ -459,9 +461,9 @@ repoRefs lww = do
|
||||||
td_ do
|
td_ do
|
||||||
|
|
||||||
if | Text.isPrefixOf "refs/heads" r_ -> do
|
if | Text.isPrefixOf "refs/heads" r_ -> do
|
||||||
img_ [src_ "/icon/git-branch.svg"]
|
svgIcon IconGitBranch
|
||||||
| Text.isPrefixOf "refs/tags" r_ -> do
|
| Text.isPrefixOf "refs/tags" r_ -> do
|
||||||
img_ [src_ "/icon/git-tag.svg"]
|
svgIcon IconTag
|
||||||
| otherwise -> mempty
|
| otherwise -> mempty
|
||||||
|
|
||||||
td_ (toHtml r_)
|
td_ (toHtml r_)
|
||||||
|
@ -564,7 +566,7 @@ repoTree_ embed lww co root = do
|
||||||
|
|
||||||
for_ back' $ \r -> do
|
for_ back' $ \r -> do
|
||||||
let rootLink = toURL (RepoTree lww co (coerce @_ @GitHash r))
|
let rootLink = toURL (RepoTree lww co (coerce @_ @GitHash r))
|
||||||
td_ $ img_ [src_ "/icon/tree-up.svg"]
|
td_ $ svgIcon IconArrowUturnLeft
|
||||||
td_ ".."
|
td_ ".."
|
||||||
td_ do a_ [ href_ "#"
|
td_ do a_ [ href_ "#"
|
||||||
, hxGet_ rootLink
|
, hxGet_ rootLink
|
||||||
|
@ -578,25 +580,25 @@ repoTree_ embed lww co root = do
|
||||||
tr_ mempty do
|
tr_ mempty do
|
||||||
td_ $ case tp of
|
td_ $ case tp of
|
||||||
Commit -> mempty
|
Commit -> mempty
|
||||||
Tree -> img_ [src_ "/icon/tree.svg"]
|
Tree -> svgIcon IconFolderFilled
|
||||||
Blob -> do
|
Blob -> do
|
||||||
let syn = Sky.syntaxesByFilename syntaxMap (Text.unpack name)
|
let syn = Sky.syntaxesByFilename syntaxMap (Text.unpack name)
|
||||||
& headMay
|
& headMay
|
||||||
<&> Text.toLower . Sky.sName
|
<&> Text.toLower . Sky.sName
|
||||||
|
|
||||||
let icon = case syn of
|
let icon = case syn of
|
||||||
Just "haskell" -> [src_ "/icon/haskell.svg"]
|
Just "haskell" -> IconHaskell
|
||||||
Just "markdown" -> [src_ "/icon/markdown.svg"]
|
Just "markdown" -> IconMarkdown
|
||||||
Just "nix" -> [src_ "/icon/nixos.svg"]
|
Just "nix" -> IconNix
|
||||||
Just "bash" -> [src_ "/icon/terminal.svg"]
|
Just "bash" -> IconBash
|
||||||
Just "python" -> [src_ "/icon/python.svg"]
|
Just "python" -> IconPython
|
||||||
Just "javascript" -> [src_ "/icon/javascript.svg"]
|
Just "javascript" -> IconJavaScript
|
||||||
Just "sql" -> [src_ "/icon/sql.svg"]
|
Just "sql" -> IconSql
|
||||||
Just s | s `elem` ["cabal","makefile","toml","ini","yaml"]
|
Just s | s `elem` ["cabal","makefile","toml","ini","yaml"]
|
||||||
-> [src_ "/icon/gear.svg"]
|
-> IconSettingsFilled
|
||||||
_ -> [src_ "/icon/blob-filled.svg"]
|
_ -> IconFileFilled
|
||||||
|
|
||||||
img_ ([alt_ (fromMaybe "blob" syn)] <> icon)
|
svgIcon icon
|
||||||
|
|
||||||
-- debug $ red "PUSH URL" <+> pretty (path ["back", wtf])
|
-- debug $ red "PUSH URL" <+> pretty (path ["back", wtf])
|
||||||
|
|
||||||
|
@ -719,7 +721,7 @@ repoForks lww = do
|
||||||
for_ forks $ \it@RepoListItem{..} -> do
|
for_ forks $ \it@RepoListItem{..} -> do
|
||||||
let lwwTo = coerce @_ @(LWWRefKey 'HBS2Basic) rlRepoLww
|
let lwwTo = coerce @_ @(LWWRefKey 'HBS2Basic) rlRepoLww
|
||||||
tr_ [class_ "commit-brief-title"] do
|
tr_ [class_ "commit-brief-title"] do
|
||||||
td_ $ img_ [src_ "/icon/git-fork.svg"]
|
td_ $ svgIcon IconGitFork
|
||||||
td_ [class_ "mono"] $
|
td_ [class_ "mono"] $
|
||||||
a_ [ href_ (toURL (RepoPage (CommitsTab Nothing) lwwTo))
|
a_ [ href_ (toURL (RepoPage (CommitsTab Nothing) lwwTo))
|
||||||
] do
|
] do
|
||||||
|
@ -754,7 +756,7 @@ repoCommits lww predicate' = do
|
||||||
for_ co $ \case
|
for_ co $ \case
|
||||||
CommitListItemBrief{..} -> do
|
CommitListItemBrief{..} -> do
|
||||||
tr_ [class_ "commit-brief-title"] do
|
tr_ [class_ "commit-brief-title"] do
|
||||||
td_ [class_ "commit-icon"] $ img_ [src_ "/icon/git-commit.svg"]
|
td_ [class_ "commit-icon"] $ svgIcon IconGitCommit
|
||||||
|
|
||||||
td_ [class_ "commit-hash mono"] do
|
td_ [class_ "commit-hash mono"] do
|
||||||
let hash = coerce @_ @GitHash commitListHash
|
let hash = coerce @_ @GitHash commitListHash
|
||||||
|
@ -937,137 +939,137 @@ repoPage tab lww params = rootPage do
|
||||||
|
|
||||||
debug $ red "META" <+> pretty meta
|
debug $ red "META" <+> pretty meta
|
||||||
|
|
||||||
div_ [class_ "container main"] $ do
|
main_ [class_ "container-fluid"] do
|
||||||
nav_ [class_ "left"] $ do
|
div_ [class_ "wrapper"] do
|
||||||
|
aside_ [class_ "sidebar"] do
|
||||||
|
|
||||||
div_ [class_ "info-block" ] do
|
div_ [class_ "info-block" ] do
|
||||||
div_ [ class_ "attr" ] do
|
toHtml (ShortRef lww)
|
||||||
a_ [href_ (toURL (RepoPage (CommitsTab Nothing) lww))] $ toHtml (ShortRef lww)
|
|
||||||
|
|
||||||
div_ [class_ "info-block" ] do
|
-- div_ [class_ "info-block" ] do
|
||||||
div_ [ class_ "attr" ] do
|
-- a_ [ href_ "/"] do
|
||||||
img_ [src_ "/icon/tree-up.svg"]
|
-- span_ [class_ "inline-icon-wrapper"] $ svgIcon IconArrowUturnLeft
|
||||||
a_ [ href_ "/"] "back to projects"
|
-- "back to projects"
|
||||||
|
|
||||||
div_ [class_ "info-block" ] do
|
div_ [class_ "info-block" ] do
|
||||||
for_ author $ \a -> do
|
|
||||||
div_ [ class_ "attr" ] do
|
|
||||||
div_ [ class_ "attrname"] "author:"
|
|
||||||
div_ [ class_ "attrval"] $ toHtml a
|
|
||||||
|
|
||||||
for_ public $ \p -> do
|
summary_ [class_ "sidebar-title"] $ small_ $ strong_ "About"
|
||||||
div_ [ class_ "attr" ] do
|
ul_ [class_ "mb-0"] do
|
||||||
div_ [ class_ "attrname"] "public:"
|
for_ author $ \a -> do
|
||||||
div_ [ class_ "attrval"] $ toHtml p
|
li_ $ small_ do
|
||||||
|
"Author: "
|
||||||
|
toHtml a
|
||||||
|
|
||||||
div_ [class_ "info-block" ] do
|
for_ public $ \p -> do
|
||||||
|
li_ $ small_ do
|
||||||
|
"Public: "
|
||||||
|
toHtml p
|
||||||
|
|
||||||
when (Text.length manifest > 100) do
|
when (Text.length manifest > 100) do
|
||||||
div_ [ class_ "attr" ] do
|
li_ $ small_ do
|
||||||
div_ [ class_ "attrname"] do
|
a_ [class_ "secondary", href_ (toURL (RepoPage ManifestTab lww))] do
|
||||||
a_ [ href_ (toURL (RepoPage ManifestTab lww))] do
|
span_ [class_ "inline-icon-wrapper"] $ svgIcon IconLicense
|
||||||
img_ [src_ "/icon/license.svg"]
|
|
||||||
"Manifest"
|
"Manifest"
|
||||||
|
|
||||||
when (rlRepoForks > 0) do
|
when (rlRepoForks > 0) do
|
||||||
div_ [ class_ "attr" ] do
|
li_ $ small_ do
|
||||||
div_ [ class_ "attrname"] do
|
a_ [class_ "secondary"
|
||||||
a_ [ hxGet_ (toURL (RepoForksHtmx lww))
|
, href_ "#"
|
||||||
, hxTarget_ "#repo-tab-data"
|
, hxGet_ (toURL (RepoForksHtmx lww))
|
||||||
] do
|
, hxTarget_ "#repo-tab-data"
|
||||||
img_ [src_ "/icon/git-fork.svg"]
|
] do
|
||||||
"Forks"
|
span_ [class_ "inline-icon-wrapper"] $ svgIcon IconGitFork
|
||||||
|
toHtml $ show rlRepoForks
|
||||||
|
" forks"
|
||||||
|
|
||||||
div_ [ class_ "attrval"] $ toHtml (show $ rlRepoForks)
|
li_ $ small_ do
|
||||||
|
a_ [class_ "secondary"
|
||||||
|
, href_ (toURL (RepoPage (CommitsTab Nothing) lww))
|
||||||
|
] do
|
||||||
|
span_ [class_ "inline-icon-wrapper"] $ svgIcon IconGitCommit
|
||||||
|
toHtml $ show rlRepoCommits
|
||||||
|
" commits"
|
||||||
|
|
||||||
div_ [ class_ "attr" ] do
|
for_ pinned $ \(_,ref) -> do
|
||||||
div_ [ class_ "attrname"] do
|
|
||||||
a_ [ href_ (toURL (RepoPage (CommitsTab Nothing) lww))] do
|
|
||||||
img_ [src_ "/icon/git-commit.svg"]
|
|
||||||
"Commits"
|
|
||||||
|
|
||||||
div_ [ class_ "attrval"] $ toHtml (show $ rlRepoCommits)
|
|
||||||
|
|
||||||
for_ pinned $ \(_,ref) -> do
|
|
||||||
div_ [ class_ "attr" ] do
|
|
||||||
case ref of
|
case ref of
|
||||||
PinnedRefBlob s n hash -> do
|
PinnedRefBlob s n hash -> small_ do
|
||||||
div_ [ class_ "attrname"] $ do
|
li_ $ a_ [class_ "secondary"
|
||||||
a_ [ href_ "#"
|
, href_ "#"
|
||||||
, hxGet_ (toURL (RepoSomeBlob lww s hash))
|
, hxGet_ (toURL (RepoSomeBlob lww s hash))
|
||||||
, hxTarget_ "#repo-tab-data"
|
|
||||||
] do
|
|
||||||
img_ [src_ "/icon/pinned-light.svg"]
|
|
||||||
toHtml (Text.take 12 n)
|
|
||||||
|
|
||||||
div_ [ class_ "attrval"] $ toHtml $ ShortRef hash
|
|
||||||
|
|
||||||
for_ mbHead $ \rh -> do
|
|
||||||
|
|
||||||
let theHead = headMay [ v | (GitRef "HEAD", v) <- view repoHeadRefs rh ]
|
|
||||||
|
|
||||||
let checkHead v what | v == theHead = strong_ what
|
|
||||||
| otherwise = what
|
|
||||||
|
|
||||||
div_ [class_ "info-block" ] do
|
|
||||||
strong_ [] "heads"
|
|
||||||
for_ (view repoHeadHeads rh) $ \(branch,v) -> do
|
|
||||||
div_ [ class_ "attrval onleft"] do
|
|
||||||
a_ [ href_ (toURL (RepoPage (CommitsTab (Just v)) lww ))
|
|
||||||
] do checkHead (Just v)
|
|
||||||
$ toHtml branch
|
|
||||||
|
|
||||||
div_ [class_ "info-block" ] do
|
|
||||||
strong_ [] "tags"
|
|
||||||
for_ (view repoHeadTags rh) $ \(tag,v) -> do
|
|
||||||
div_ [ class_ "attrval onleft"] do
|
|
||||||
a_ [href_ (toURL (RepoPage (CommitsTab (Just v)) lww ))]
|
|
||||||
do checkHead (Just v) $
|
|
||||||
toHtml tag
|
|
||||||
|
|
||||||
main_ do
|
|
||||||
|
|
||||||
nav_ [ role_ "tab-control" ] do
|
|
||||||
repoMenu do
|
|
||||||
|
|
||||||
let menu t = if isActiveTab tab t then repoMenuItem0 else repoMenuItem
|
|
||||||
|
|
||||||
menu (CommitsTab Nothing)
|
|
||||||
[ hxGet_ (toURL (RepoCommits lww))
|
|
||||||
, hxTarget_ "#repo-tab-data"
|
|
||||||
] "commits"
|
|
||||||
|
|
||||||
|
|
||||||
menu (TreeTab Nothing)
|
|
||||||
[ hxGet_ (toURL (RepoRefs lww))
|
|
||||||
, hxTarget_ "#repo-tab-data"
|
, hxTarget_ "#repo-tab-data"
|
||||||
] "tree"
|
] do
|
||||||
|
span_ [class_ "inline-icon-wrapper"] $ svgIcon IconPinned
|
||||||
|
toHtml (Text.take 12 n)
|
||||||
|
" "
|
||||||
|
toHtml $ ShortRef hash
|
||||||
|
|
||||||
section_ [id_ "repo-data"] do
|
for_ mbHead $ \rh -> do
|
||||||
strong_ (toHtml $ rlRepoName)
|
|
||||||
|
|
||||||
div_ [id_ "repo-tab-data"] do
|
let theHead = headMay [ v | (GitRef "HEAD", v) <- view repoHeadRefs rh ]
|
||||||
|
|
||||||
case tab of
|
let checkHead v what | v == theHead = strong_ what
|
||||||
|
| otherwise = what
|
||||||
|
|
||||||
TreeTab{} -> do
|
div_ [class_ "info-block" ] do
|
||||||
|
summary_ [class_ "sidebar-title"] $ small_ $ strong_ "Heads"
|
||||||
|
ul_ [class_ "mb-0"] $ do
|
||||||
|
for_ (view repoHeadHeads rh) $ \(branch,v) -> do
|
||||||
|
li_ $ small_ do
|
||||||
|
a_ [class_ "secondary", href_ (toURL (RepoPage (CommitsTab (Just v)) lww ))] do
|
||||||
|
checkHead (Just v) $ toHtml branch
|
||||||
|
|
||||||
let tree = [ fromStringMay @GitHash (Text.unpack v)
|
div_ [class_ "info-block" ] do
|
||||||
| ("tree", v) <- params
|
summary_ [class_ "sidebar-title"] $ small_ $ strong_ "Tags"
|
||||||
] & catMaybes & headMay
|
ul_ [class_ "mb-0"] $ do
|
||||||
|
for_ (view repoHeadTags rh) $ \(tag,v) -> do
|
||||||
|
li_ $ small_ do
|
||||||
|
a_ [class_ "secondary", href_ (toURL (RepoPage (CommitsTab (Just v)) lww ))] do
|
||||||
|
checkHead (Just v) $ toHtml tag
|
||||||
|
|
||||||
maybe (repoRefs lww) (\t -> repoTree lww t t) tree
|
div_ [class_ "content"] $ do
|
||||||
|
|
||||||
ManifestTab -> do
|
article_ [class_ "py-0"] $ nav_ [ariaLabel_ "breadcrumb", class_ "repo-menu"] $ ul_ do
|
||||||
thisRepoManifest it
|
|
||||||
|
|
||||||
CommitsTab{} -> do
|
let menuTabClasses isActive = if isActive then "tab contrast" else "tab"
|
||||||
let predicate = Right (fromQueryParams params)
|
menuTab t misc name = li_ do
|
||||||
repoCommits lww predicate
|
a_ ([class_ $ menuTabClasses $ isActiveTab tab t] <> misc <> [tabClick]) do
|
||||||
|
name
|
||||||
|
|
||||||
ForksTab -> do
|
menuTab (CommitsTab Nothing)
|
||||||
repoForks lww
|
[ href_ "#"
|
||||||
|
, hxGet_ (toURL (RepoCommits lww))
|
||||||
|
, hxTarget_ "#repo-tab-data"
|
||||||
|
] "commits"
|
||||||
|
|
||||||
div_ [id_ "repo-tab-data-embedded"] mempty
|
menuTab (TreeTab Nothing)
|
||||||
|
[ href_ "#"
|
||||||
|
, hxGet_ (toURL (RepoRefs lww))
|
||||||
|
, hxTarget_ "#repo-tab-data"
|
||||||
|
] "tree"
|
||||||
|
|
||||||
|
section_ do
|
||||||
|
strong_ $ toHtml rlRepoName
|
||||||
|
|
||||||
|
div_ [id_ "repo-tab-data"] do
|
||||||
|
|
||||||
|
case tab of
|
||||||
|
|
||||||
|
TreeTab{} -> do
|
||||||
|
|
||||||
|
let tree = [ fromStringMay @GitHash (Text.unpack v)
|
||||||
|
| ("tree", v) <- params
|
||||||
|
] & catMaybes & headMay
|
||||||
|
|
||||||
|
maybe (repoRefs lww) (\t -> repoTree lww t t) tree
|
||||||
|
|
||||||
|
ManifestTab -> do
|
||||||
|
thisRepoManifest it
|
||||||
|
|
||||||
|
CommitsTab{} -> do
|
||||||
|
let predicate = Right (fromQueryParams params)
|
||||||
|
repoCommits lww predicate
|
||||||
|
|
||||||
|
ForksTab -> do
|
||||||
|
repoForks lww
|
||||||
|
|
||||||
|
div_ [id_ "repo-tab-data-embedded"] mempty
|
||||||
|
|
|
@ -129,7 +129,7 @@ library hbs2-git-dashboard-assets
|
||||||
import: shared-properties
|
import: shared-properties
|
||||||
|
|
||||||
build-depends:
|
build-depends:
|
||||||
base, file-embed
|
base, file-embed, lucid, text
|
||||||
|
|
||||||
exposed-modules:
|
exposed-modules:
|
||||||
HBS2.Git.Web.Assets
|
HBS2.Git.Web.Assets
|
||||||
|
|