feat: use new theme for the website
Signed-off-by: Avinal Kumar <avinal.xlvii@gmail.com> rh-pre-commit.version: 2.3.2 rh-pre-commit.check-secrets: ENABLED
@@ -11,3 +11,4 @@
|
||||
/blog/node_modules
|
||||
.idea
|
||||
.vscode
|
||||
public
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "themes/box-box"]
|
||||
path = themes/box-box
|
||||
url = https://github.com/avinal/box-box.git
|
||||
@@ -1,27 +0,0 @@
|
||||
# build everything for production
|
||||
all: css build
|
||||
@echo "--- production build finished"
|
||||
|
||||
# build only css for production
|
||||
css:
|
||||
@echo "--- building tailwind css"
|
||||
npx tailwindcss -i ./src/input.css -o ./static/main.css --minify
|
||||
|
||||
# compile only elm for production
|
||||
build:
|
||||
@echo "--- compiling elm land project"
|
||||
npx elm-land build
|
||||
hugo --source blog --destination ../dist --minify
|
||||
|
||||
# compile and watch for dev
|
||||
elm-serve:
|
||||
npx elm-land server
|
||||
|
||||
# build css and watch
|
||||
css-serve:
|
||||
npx tailwindcss -i ./src/input.css -o ./static/main.css --watch
|
||||
|
||||
# clean
|
||||
clean:
|
||||
rm -rf dist
|
||||
rm -rf blog/public
|
||||
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 Avinal Kumar
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,5 +0,0 @@
|
||||
+++
|
||||
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
|
||||
date = {{ .Date }}
|
||||
draft = true
|
||||
+++
|
||||
@@ -1,541 +0,0 @@
|
||||
/*
|
||||
! tailwindcss v3.3.6 | MIT License | https://tailwindcss.com
|
||||
*/
|
||||
|
||||
/*
|
||||
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
|
||||
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
|
||||
*/
|
||||
|
||||
*,
|
||||
::before,
|
||||
::after {
|
||||
box-sizing: border-box;
|
||||
/* 1 */
|
||||
border-width: 0;
|
||||
/* 2 */
|
||||
border-style: solid;
|
||||
/* 2 */
|
||||
border-color: #e5e7eb;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
::before,
|
||||
::after {
|
||||
--tw-content: '';
|
||||
}
|
||||
|
||||
/*
|
||||
1. Use a consistent sensible line-height in all browsers.
|
||||
2. Prevent adjustments of font size after orientation changes in iOS.
|
||||
3. Use a more readable tab size.
|
||||
4. Use the user's configured `sans` font-family by default.
|
||||
5. Use the user's configured `sans` font-feature-settings by default.
|
||||
6. Use the user's configured `sans` font-variation-settings by default.
|
||||
*/
|
||||
|
||||
html {
|
||||
line-height: 1.5;
|
||||
/* 1 */
|
||||
-webkit-text-size-adjust: 100%;
|
||||
/* 2 */
|
||||
-moz-tab-size: 4;
|
||||
/* 3 */
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
/* 3 */
|
||||
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
/* 4 */
|
||||
font-feature-settings: normal;
|
||||
/* 5 */
|
||||
font-variation-settings: normal;
|
||||
/* 6 */
|
||||
}
|
||||
|
||||
/*
|
||||
1. Remove the margin in all browsers.
|
||||
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
|
||||
*/
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
/* 1 */
|
||||
line-height: inherit;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
1. Add the correct height in Firefox.
|
||||
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
|
||||
3. Ensure horizontal rules are visible by default.
|
||||
*/
|
||||
|
||||
hr {
|
||||
height: 0;
|
||||
/* 1 */
|
||||
color: inherit;
|
||||
/* 2 */
|
||||
border-top-width: 1px;
|
||||
/* 3 */
|
||||
}
|
||||
|
||||
/*
|
||||
Add the correct text decoration in Chrome, Edge, and Safari.
|
||||
*/
|
||||
|
||||
abbr:where([title]) {
|
||||
-webkit-text-decoration: underline dotted;
|
||||
text-decoration: underline dotted;
|
||||
}
|
||||
|
||||
/*
|
||||
Remove the default font size and weight for headings.
|
||||
*/
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-size: inherit;
|
||||
font-weight: inherit;
|
||||
}
|
||||
|
||||
/*
|
||||
Reset links to optimize for opt-in styling instead of opt-out.
|
||||
*/
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
|
||||
/*
|
||||
Add the correct font weight in Edge and Safari.
|
||||
*/
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Use the user's configured `mono` font-family by default.
|
||||
2. Use the user's configured `mono` font-feature-settings by default.
|
||||
3. Use the user's configured `mono` font-variation-settings by default.
|
||||
4. Correct the odd `em` font sizing in all browsers.
|
||||
*/
|
||||
|
||||
code,
|
||||
kbd,
|
||||
samp,
|
||||
pre {
|
||||
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
/* 1 */
|
||||
font-feature-settings: normal;
|
||||
/* 2 */
|
||||
font-variation-settings: normal;
|
||||
/* 3 */
|
||||
font-size: 1em;
|
||||
/* 4 */
|
||||
}
|
||||
|
||||
/*
|
||||
Add the correct font size in all browsers.
|
||||
*/
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/*
|
||||
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
|
||||
*/
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
|
||||
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
|
||||
3. Remove gaps between table borders by default.
|
||||
*/
|
||||
|
||||
table {
|
||||
text-indent: 0;
|
||||
/* 1 */
|
||||
border-color: inherit;
|
||||
/* 2 */
|
||||
border-collapse: collapse;
|
||||
/* 3 */
|
||||
}
|
||||
|
||||
/*
|
||||
1. Change the font styles in all browsers.
|
||||
2. Remove the margin in Firefox and Safari.
|
||||
3. Remove default padding in all browsers.
|
||||
*/
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
font-family: inherit;
|
||||
/* 1 */
|
||||
font-feature-settings: inherit;
|
||||
/* 1 */
|
||||
font-variation-settings: inherit;
|
||||
/* 1 */
|
||||
font-size: 100%;
|
||||
/* 1 */
|
||||
font-weight: inherit;
|
||||
/* 1 */
|
||||
line-height: inherit;
|
||||
/* 1 */
|
||||
color: inherit;
|
||||
/* 1 */
|
||||
margin: 0;
|
||||
/* 2 */
|
||||
padding: 0;
|
||||
/* 3 */
|
||||
}
|
||||
|
||||
/*
|
||||
Remove the inheritance of text transform in Edge and Firefox.
|
||||
*/
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Correct the inability to style clickable types in iOS and Safari.
|
||||
2. Remove default button styles.
|
||||
*/
|
||||
|
||||
button,
|
||||
[type='button'],
|
||||
[type='reset'],
|
||||
[type='submit'] {
|
||||
-webkit-appearance: button;
|
||||
/* 1 */
|
||||
background-color: transparent;
|
||||
/* 2 */
|
||||
background-image: none;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
Use the modern Firefox focus style for all focusable elements.
|
||||
*/
|
||||
|
||||
:-moz-focusring {
|
||||
outline: auto;
|
||||
}
|
||||
|
||||
/*
|
||||
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
|
||||
*/
|
||||
|
||||
:-moz-ui-invalid {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
/*
|
||||
Add the correct vertical alignment in Chrome and Firefox.
|
||||
*/
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
/*
|
||||
Correct the cursor style of increment and decrement buttons in Safari.
|
||||
*/
|
||||
|
||||
::-webkit-inner-spin-button,
|
||||
::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Correct the odd appearance in Chrome and Safari.
|
||||
2. Correct the outline style in Safari.
|
||||
*/
|
||||
|
||||
[type='search'] {
|
||||
-webkit-appearance: textfield;
|
||||
/* 1 */
|
||||
outline-offset: -2px;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
Remove the inner padding in Chrome and Safari on macOS.
|
||||
*/
|
||||
|
||||
::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Correct the inability to style clickable types in iOS and Safari.
|
||||
2. Change font properties to `inherit` in Safari.
|
||||
*/
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
-webkit-appearance: button;
|
||||
/* 1 */
|
||||
font: inherit;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
Add the correct display in Chrome and Safari.
|
||||
*/
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
/*
|
||||
Removes the default spacing and border for appropriate elements.
|
||||
*/
|
||||
|
||||
blockquote,
|
||||
dl,
|
||||
dd,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
hr,
|
||||
figure,
|
||||
p,
|
||||
pre {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
menu {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Reset default styling for dialogs.
|
||||
*/
|
||||
|
||||
dialog {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Prevent resizing textareas horizontally by default.
|
||||
*/
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
|
||||
2. Set the default placeholder color to the user's configured gray 400 color.
|
||||
*/
|
||||
|
||||
input::-moz-placeholder, textarea::-moz-placeholder {
|
||||
opacity: 1;
|
||||
/* 1 */
|
||||
color: #9ca3af;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
input::placeholder,
|
||||
textarea::placeholder {
|
||||
opacity: 1;
|
||||
/* 1 */
|
||||
color: #9ca3af;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
Set the default cursor for buttons.
|
||||
*/
|
||||
|
||||
button,
|
||||
[role="button"] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/*
|
||||
Make sure disabled buttons don't get the pointer cursor.
|
||||
*/
|
||||
|
||||
:disabled {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
|
||||
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
|
||||
This can trigger a poorly considered lint error in some tools but is included by design.
|
||||
*/
|
||||
|
||||
img,
|
||||
svg,
|
||||
video,
|
||||
canvas,
|
||||
audio,
|
||||
iframe,
|
||||
embed,
|
||||
object {
|
||||
display: block;
|
||||
/* 1 */
|
||||
vertical-align: middle;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
|
||||
*/
|
||||
|
||||
img,
|
||||
video {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/* Make elements with the HTML hidden attribute stay hidden by default */
|
||||
|
||||
[hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
*, ::before, ::after {
|
||||
--tw-border-spacing-x: 0;
|
||||
--tw-border-spacing-y: 0;
|
||||
--tw-translate-x: 0;
|
||||
--tw-translate-y: 0;
|
||||
--tw-rotate: 0;
|
||||
--tw-skew-x: 0;
|
||||
--tw-skew-y: 0;
|
||||
--tw-scale-x: 1;
|
||||
--tw-scale-y: 1;
|
||||
--tw-pan-x: ;
|
||||
--tw-pan-y: ;
|
||||
--tw-pinch-zoom: ;
|
||||
--tw-scroll-snap-strictness: proximity;
|
||||
--tw-gradient-from-position: ;
|
||||
--tw-gradient-via-position: ;
|
||||
--tw-gradient-to-position: ;
|
||||
--tw-ordinal: ;
|
||||
--tw-slashed-zero: ;
|
||||
--tw-numeric-figure: ;
|
||||
--tw-numeric-spacing: ;
|
||||
--tw-numeric-fraction: ;
|
||||
--tw-ring-inset: ;
|
||||
--tw-ring-offset-width: 0px;
|
||||
--tw-ring-offset-color: #fff;
|
||||
--tw-ring-color: rgb(59 130 246 / 0.5);
|
||||
--tw-ring-offset-shadow: 0 0 #0000;
|
||||
--tw-ring-shadow: 0 0 #0000;
|
||||
--tw-shadow: 0 0 #0000;
|
||||
--tw-shadow-colored: 0 0 #0000;
|
||||
--tw-blur: ;
|
||||
--tw-brightness: ;
|
||||
--tw-contrast: ;
|
||||
--tw-grayscale: ;
|
||||
--tw-hue-rotate: ;
|
||||
--tw-invert: ;
|
||||
--tw-saturate: ;
|
||||
--tw-sepia: ;
|
||||
--tw-drop-shadow: ;
|
||||
--tw-backdrop-blur: ;
|
||||
--tw-backdrop-brightness: ;
|
||||
--tw-backdrop-contrast: ;
|
||||
--tw-backdrop-grayscale: ;
|
||||
--tw-backdrop-hue-rotate: ;
|
||||
--tw-backdrop-invert: ;
|
||||
--tw-backdrop-opacity: ;
|
||||
--tw-backdrop-saturate: ;
|
||||
--tw-backdrop-sepia: ;
|
||||
}
|
||||
|
||||
::backdrop {
|
||||
--tw-border-spacing-x: 0;
|
||||
--tw-border-spacing-y: 0;
|
||||
--tw-translate-x: 0;
|
||||
--tw-translate-y: 0;
|
||||
--tw-rotate: 0;
|
||||
--tw-skew-x: 0;
|
||||
--tw-skew-y: 0;
|
||||
--tw-scale-x: 1;
|
||||
--tw-scale-y: 1;
|
||||
--tw-pan-x: ;
|
||||
--tw-pan-y: ;
|
||||
--tw-pinch-zoom: ;
|
||||
--tw-scroll-snap-strictness: proximity;
|
||||
--tw-gradient-from-position: ;
|
||||
--tw-gradient-via-position: ;
|
||||
--tw-gradient-to-position: ;
|
||||
--tw-ordinal: ;
|
||||
--tw-slashed-zero: ;
|
||||
--tw-numeric-figure: ;
|
||||
--tw-numeric-spacing: ;
|
||||
--tw-numeric-fraction: ;
|
||||
--tw-ring-inset: ;
|
||||
--tw-ring-offset-width: 0px;
|
||||
--tw-ring-offset-color: #fff;
|
||||
--tw-ring-color: rgb(59 130 246 / 0.5);
|
||||
--tw-ring-offset-shadow: 0 0 #0000;
|
||||
--tw-ring-shadow: 0 0 #0000;
|
||||
--tw-shadow: 0 0 #0000;
|
||||
--tw-shadow-colored: 0 0 #0000;
|
||||
--tw-blur: ;
|
||||
--tw-brightness: ;
|
||||
--tw-contrast: ;
|
||||
--tw-grayscale: ;
|
||||
--tw-hue-rotate: ;
|
||||
--tw-invert: ;
|
||||
--tw-saturate: ;
|
||||
--tw-sepia: ;
|
||||
--tw-drop-shadow: ;
|
||||
--tw-backdrop-blur: ;
|
||||
--tw-backdrop-brightness: ;
|
||||
--tw-backdrop-contrast: ;
|
||||
--tw-backdrop-grayscale: ;
|
||||
--tw-backdrop-hue-rotate: ;
|
||||
--tw-backdrop-invert: ;
|
||||
--tw-backdrop-opacity: ;
|
||||
--tw-backdrop-saturate: ;
|
||||
--tw-backdrop-sepia: ;
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
window.remark_config = {
|
||||
host: "https://remark42.avinal.space",
|
||||
site_id: "remark",
|
||||
show_rss_subscription: false,
|
||||
theme: 'dark',
|
||||
no_footer: true,
|
||||
};
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
date: "2023-01-01T08:00:00-07:00"
|
||||
draft: false
|
||||
title: Home
|
||||
---
|
||||
@@ -1,60 +0,0 @@
|
||||
baseURL: 'https://avinal.space/'
|
||||
languageCode: en-us
|
||||
title: Fedoraemon
|
||||
menus:
|
||||
main:
|
||||
- name: Home
|
||||
pageRef: /
|
||||
weight: 10
|
||||
- name: Posts
|
||||
pageRef: /posts
|
||||
weight: 20
|
||||
- name: Tags
|
||||
pageRef: /tags
|
||||
weight: 30
|
||||
module:
|
||||
hugoVersion:
|
||||
extended: false
|
||||
min: 0.116.0
|
||||
|
||||
params:
|
||||
showWordCount: true
|
||||
showReadingTime: true
|
||||
toc: true
|
||||
numberedSubtitles: true
|
||||
navs:
|
||||
- name: Home
|
||||
link: https://avinal.space
|
||||
- name: About
|
||||
link: https://avinal.space/pages/about-me
|
||||
- name: Blog
|
||||
link: https://avinal.space/posts
|
||||
- name: Projects
|
||||
link: https://avinal.space/pages/projects
|
||||
- name: GitHub
|
||||
link: https://github.com/avinal
|
||||
|
||||
disableKinds: ["home", "taxonomy"]
|
||||
|
||||
taxonomies:
|
||||
category: category
|
||||
tag: tags
|
||||
|
||||
permalinks:
|
||||
tags: "/posts/tags/:slug"
|
||||
category: "/posts/category/:slug"
|
||||
|
||||
markup:
|
||||
highlight:
|
||||
anchorLineNos: false
|
||||
# codeFences: true
|
||||
guessSyntax: false
|
||||
lineNoStart: 1
|
||||
# lineNos: true
|
||||
# lineNumbersInTable: true
|
||||
noClasses: true
|
||||
noHl: false
|
||||
style: base16-snazzy
|
||||
goldmark:
|
||||
renderer:
|
||||
unsafe: true
|
||||
@@ -1,3 +0,0 @@
|
||||
<h{{ .Level }} id="{{ .Anchor | safeURL }}">{{ .Text | safeHTML }}
|
||||
<a href="#{{ .Anchor | safeURL }}">#</a>
|
||||
</h{{ .Level }}>
|
||||
@@ -1,18 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ or site.Language.LanguageCode site.Language.Lang }}"
|
||||
dir="{{ or site.Language.LanguageDirection `ltr` }}">
|
||||
|
||||
<head>
|
||||
{{ partial "head.html" . }}
|
||||
</head>
|
||||
|
||||
<body class="bg-neutral-800">
|
||||
<main class="container mx-auto">
|
||||
{{ block "main" . }}{{ end }}
|
||||
<footer>
|
||||
{{ partial "footer.html" . }}
|
||||
</footer>
|
||||
</main>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,7 +0,0 @@
|
||||
{{ define "main" }}
|
||||
{{ .Content }}
|
||||
{{ range site.RegularPages }}
|
||||
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
|
||||
{{ .Summary }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
@@ -1,78 +0,0 @@
|
||||
{{ define "main" }}
|
||||
<div
|
||||
class="prose prose-invert mx-auto prose-lg prose-a:decoration-cyan-500 hover:prose-a:decoration-pink-500 text-white">
|
||||
<div class="md:-mx-8 lg:-mx-16 px-8 py-1">
|
||||
<h1 class="text-5xl font-bold mb-6 mt-12 text-center">{{ .Title }}</h1>
|
||||
|
||||
{{ .Content }}
|
||||
</div>
|
||||
</div>
|
||||
<section class="text-gray-100">
|
||||
<div class="max-w-6xl p-6 mx-auto space-y-6 sm:space-y-12 mb-16">
|
||||
{{ range first 1 .Pages }}
|
||||
<div
|
||||
class="block max-x-sm gap-3 mx-auto sm:max-w-full group hover:no-underline focus:no-underline lg:grid lg:grid-cols-12 bg-neutral-900">
|
||||
<a class="lg:col-span-7" href="{{ .RelPermalink }}">
|
||||
<img class="object-cover w-full h-64 rounded sm:h-96 lg:col-span-7" src="{{ .Params.Image | absURL }}"
|
||||
alt="{{ .LinkTitle }}">
|
||||
</a>
|
||||
<div class="p-6 space-y-2 lg:col-span-5">
|
||||
<a href="{{ .RelPermalink }}">
|
||||
<h3 class="text-2xl font-semibold sm:text-4xl group-hover:underline group-focus:underline">{{ .LinkTitle }}
|
||||
</h3>
|
||||
{{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }}
|
||||
{{ $dateHuman := .Date | time.Format ":date_long" }}
|
||||
<time datetime="{{ $dateMachine }}" class="text-gray-400">{{ $dateHuman }}</time>
|
||||
{{ if gt .ReadingTime 1 }}
|
||||
{{ .Scratch.Set "timeUnit" "mins" }}
|
||||
{{ else }}
|
||||
{{ .Scratch.Set "timeUnit" "min" }}
|
||||
{{ end }}
|
||||
|
||||
{{ if .Site.Params.showReadingTime }}
|
||||
<span class="text-gray-400"> | ~{{.ReadingTime}} {{ .Scratch.Get "timeUnit" }}</span>
|
||||
{{ end }}
|
||||
<p> {{ .Summary | truncate 250 }}</p>
|
||||
</a>
|
||||
<span class="flex flex-wrap py-6 space-x-2">
|
||||
<a class="px-3 py-1 m-1 rounded-sm hover:underline bg-pink-400 text-gray-900 font-bold" href="/posts/category/{{ .Params.Category }}">
|
||||
{{ .Params.Category }}</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
<div class="grid justify-center grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
||||
{{ range after 1 .Pages }}
|
||||
<div class="max-w-sm mx-auto group hover:no-underline focus:no-underline bg-neutral-900">
|
||||
<a href="{{ .RelPermalink }}">
|
||||
<img class="object-cover w-full h-44 rounded" src="{{ .Params.Image | absURL }}" alt="{{ .LinkTitle }}">
|
||||
</a>
|
||||
<div class="p-6 space-y-2">
|
||||
<a href="{{ .RelPermalink }}">
|
||||
<h3 class="text-2xl font-semibold group-hover:underline group-focus:underline">{{ .LinkTitle }}</h3>
|
||||
{{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }}
|
||||
{{ $dateHuman := .Date | time.Format ":date_long" }}
|
||||
<time datetime="{{ $dateMachine }}" class="text-gray-400">{{ $dateHuman }}</time>
|
||||
{{ if gt .ReadingTime 1 }}
|
||||
{{ .Scratch.Set "timeUnit" "mins" }}
|
||||
{{ else }}
|
||||
{{ .Scratch.Set "timeUnit" "min" }}
|
||||
{{ end }}
|
||||
|
||||
{{ if .Site.Params.showReadingTime }}
|
||||
<span class="text-gray-400"> | ~{{.ReadingTime}} {{ .Scratch.Get "timeUnit" }}</span>
|
||||
{{ end }}
|
||||
<p> {{ .Summary | truncate 150 }}</p>
|
||||
|
||||
</a>
|
||||
<span class="flex flex-wrap py-6 space-x-2">
|
||||
<a class="px-3 py-1 m-1 rounded-sm hover:underline bg-pink-400 text-gray-900 font-bold" href="/posts/category/{{ .Params.Category }}">
|
||||
{{ .Params.Category }}</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
||||
@@ -1,32 +0,0 @@
|
||||
{{ define "main" }}
|
||||
<div class="min-h-screen flex flex-col justify-center relative overflow-hidden">
|
||||
<div class="relative w-full bg-neutral md:max-w-3xl md:mx-auto lg:max-w-4xl lg:pb-28">
|
||||
|
||||
<div class="prose prose-invert mx-auto prose-lg prose-a:decoration-cyan-500 hover:prose-a:decoration-pink-500">
|
||||
<div class="bg-neutral-900 md:-mx-8 lg:-mx-16 px-8 py-1">
|
||||
|
||||
{{ partial "header.html" . }}
|
||||
|
||||
<article>
|
||||
{{ if cond (ne .Params.toc nil) .Params.toc .Site.Params.toc }}
|
||||
{{ if ne .TableOfContents "<nav id=\"TableOfContents\"></nav>" }}
|
||||
<details class="open:bg-neutral-800 open:border open:rounded open:border-cyan-700 ">
|
||||
<summary>
|
||||
<b>In this post, we'll take a look at:</b>
|
||||
</summary>
|
||||
<div class="toc {{ if .Site.Params.numberedSubtitles }}numbered-subtitles{{ end }} ">{{ .TableOfContents }}
|
||||
</div>
|
||||
</details>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ .Content }}
|
||||
</article>
|
||||
|
||||
{{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
|
||||
</div>
|
||||
</div>
|
||||
{{ partial "comments.html" . (dict "taxonomy" "tags" "page" .) }}
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
@@ -1,18 +0,0 @@
|
||||
<script>
|
||||
!(function (e, n) {
|
||||
for (var o = 0; o < e.length; o++) {
|
||||
var r = n.createElement("script"),
|
||||
c = ".js",
|
||||
d = n.head || n.body;
|
||||
"noModule" in r
|
||||
? ((r.type = "module"), (c = ".mjs"))
|
||||
: (r.async = !0),
|
||||
(r.defer = !0),
|
||||
(r.src = remark_config.host + "/web/" + e[o] + c),
|
||||
d.appendChild(r);
|
||||
}
|
||||
})(remark_config.components || ["embed"], document);
|
||||
</script>
|
||||
|
||||
<div id="remark42" class="md:p-4 mb-16"></div>
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<div class="fixed bottom-0 left-0 bg-neutral-900 p-3 w-full border-t border-cyan-500">
|
||||
<div class="mx-auto flex justify-center space-x-6 text-gray-400">
|
||||
{{ range .Site.Params.navs }}
|
||||
<a class="underline decoration-cyan-500 hover:decoration-pink-500 text-xl" href="{{ .link | safeURL }}">{{ .name
|
||||
}}</a>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,28 +0,0 @@
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title itemprop="name">{{ if .IsHome }}{{ site.Title }}{{ else }}{{ printf "%s | %s" .Title site.Title }}{{ end }}
|
||||
</title>
|
||||
{{ if eq .Section "posts" }}
|
||||
<meta property="og:title" content="{{ .Title }} | {{ .Site.Title }}" />
|
||||
<meta name="twitter:title" content="{{ .Title }} | {{ .Site.Title }}" />
|
||||
<meta itemprop="name" content="{{ .Title }} | {{ .Site.Title }}" />
|
||||
<meta name="application-name" content="{{ .Title }} | {{ .Site.Title }}" />
|
||||
<meta property="og:site_name" content="{{ .Site.Params.sitename }}" />
|
||||
<meta name="description" content="{{ .Params.description }}" />
|
||||
<meta itemprop="description" content="{{ .Params.description }}" />
|
||||
<meta property="og:description" content="{{ .Params.description }}" />
|
||||
<meta name="twitter:description" content="{{ .Params.description }}" />
|
||||
{{ with .Params.image }}
|
||||
<meta itemprop="image" content="{{ . | absURL }}" />
|
||||
<meta property="og:image" content="{{ . | absURL }}" />
|
||||
<meta name="twitter:image" content="{{ . | absURL }}" />
|
||||
<meta name="twitter:image:src" content="{{ . | absURL }}" />
|
||||
{{ else }}
|
||||
<meta itemprop="image" content="{{ .Site.Params.ogimage | absURL }}" />
|
||||
<meta property="og:image" content="{{ .Site.Params.ogimage | absURL }}" />
|
||||
<meta name="twitter:image" content="{{ .Site.Params.ogimage | absURL }}" />
|
||||
<meta name="twitter:image:src" content="{{ .Site.Params.ogimage | absURL }}" />
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ partialCached "head/css.html" . }}
|
||||
{{ partialCached "head/js.html" . }}
|
||||
@@ -1,9 +0,0 @@
|
||||
{{- with resources.Get "css/main.css" }}
|
||||
{{- if eq hugo.Environment "development" }}
|
||||
<link rel="stylesheet" href="{{ .RelPermalink }}">
|
||||
{{- else }}
|
||||
{{- with . | minify | fingerprint }}
|
||||
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -1,12 +0,0 @@
|
||||
{{- with resources.Get "js/main.js" }}
|
||||
{{- if eq hugo.Environment "development" }}
|
||||
{{- with . | js.Build }}
|
||||
<script src="{{ .RelPermalink }}"></script>
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- $opts := dict "minify" true }}
|
||||
{{- with . | js.Build $opts | fingerprint }}
|
||||
<script src="{{ .RelPermalink }}" integrity="{{- .Data.Integrity }}" crossorigin="anonymous"></script>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -1,25 +0,0 @@
|
||||
<header class="relative">
|
||||
<img class="object-cover w-full h-60 sm:h-96 brightness-50" src="{{ .Params.Image | absURL }}" alt="{{ .Title }}">
|
||||
<h1 class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-center w-full text-white">{{ .Title }}</h1>
|
||||
|
||||
<span class="absolute bottom-1/4 left-1/2 -translate-x-1/2 text-base font-sans oldstyle-nums text-center w-full">
|
||||
<a class="font-bold no-underline hover:text-pink-500" href="/">Avinal Kumar</a>
|
||||
|
|
||||
{{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }}
|
||||
{{ $dateHuman := .Date | time.Format ":date_long" }}
|
||||
<time datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
|
||||
{{ if .Site.Params.showWordCount }}
|
||||
<span>| {{ .WordCount }} words</span>
|
||||
{{ end }}
|
||||
|
||||
{{ if gt .ReadingTime 1 }}
|
||||
{{ .Scratch.Set "timeUnit" "mins" }}
|
||||
{{ else }}
|
||||
{{ .Scratch.Set "timeUnit" "min" }}
|
||||
{{ end }}
|
||||
|
||||
{{ if .Site.Params.showReadingTime }}
|
||||
<span>| ~{{.ReadingTime}} {{ .Scratch.Get "timeUnit" }}</span>
|
||||
{{ end }}
|
||||
</span>
|
||||
</header>
|
||||
@@ -1,51 +0,0 @@
|
||||
{{- /*
|
||||
Renders a menu for the given menu ID.
|
||||
|
||||
@context {page} page The current page.
|
||||
@context {string} menuID The menu ID.
|
||||
|
||||
@example: {{ partial "menu.html" (dict "menuID" "main" "page" .) }}
|
||||
*/}}
|
||||
|
||||
{{- $page := .page }}
|
||||
{{- $menuID := .menuID }}
|
||||
|
||||
{{- with index site.Menus $menuID }}
|
||||
<nav>
|
||||
<ul>
|
||||
{{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
|
||||
</ul>
|
||||
</nav>
|
||||
{{- end }}
|
||||
|
||||
{{- define "partials/inline/menu/walk.html" }}
|
||||
{{- $page := .page }}
|
||||
{{- range .menuEntries }}
|
||||
{{- $attrs := dict "href" .URL }}
|
||||
{{- if $page.IsMenuCurrent .Menu . }}
|
||||
{{- $attrs = merge $attrs (dict "class" "active" "aria-current" "page") }}
|
||||
{{- else if $page.HasMenuCurrent .Menu .}}
|
||||
{{- $attrs = merge $attrs (dict "class" "ancestor" "aria-current" "true") }}
|
||||
{{- end }}
|
||||
{{- $name := .Name }}
|
||||
{{- with .Identifier }}
|
||||
{{- with T . }}
|
||||
{{- $name = . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
<li>
|
||||
<a
|
||||
{{- range $k, $v := $attrs }}
|
||||
{{- with $v }}
|
||||
{{- printf " %s=%q" $k $v | safeHTMLAttr }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
>{{ $name }}</a>
|
||||
{{- with .Children }}
|
||||
<ul>
|
||||
{{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
|
||||
</ul>
|
||||
{{- end }}
|
||||
</li>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -1,22 +0,0 @@
|
||||
{{- /*
|
||||
For a given taxonomy, renders a list of terms assigned to the page.
|
||||
|
||||
@context {page} page The current page.
|
||||
@context {string} taxonomy The taxonony.
|
||||
|
||||
@example: {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
|
||||
*/}}
|
||||
|
||||
{{- $page := .page }}
|
||||
{{- $taxonomy := .taxonomy }}
|
||||
|
||||
{{- with $page.GetTerms $taxonomy }}
|
||||
{{- $label := (index . 0).Parent.LinkTitle }}
|
||||
<span class="flex flex-wrap py-6 space-x-2 border-t border-gray-500">
|
||||
<!-- <a class="px-3 py-1 m-1 rounded-sm hover:underline bg-pink-400 text-gray-900 font-bold" href="/category/"></a> -->
|
||||
{{- range . }}
|
||||
<a class="px-3 py-1 m-1 rounded-sm bg-cyan-500 text-gray-900" href="{{ .RelPermalink }}">#{{ .LinkTitle }}</a>
|
||||
{{- end }}
|
||||
</span>
|
||||
{{- end }}
|
||||
|
||||
@@ -1,545 +0,0 @@
|
||||
/*
|
||||
! tailwindcss v3.3.6 | MIT License | https://tailwindcss.com
|
||||
*/
|
||||
|
||||
/*
|
||||
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
|
||||
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
|
||||
*/
|
||||
|
||||
*,
|
||||
::before,
|
||||
::after {
|
||||
box-sizing: border-box;
|
||||
/* 1 */
|
||||
border-width: 0;
|
||||
/* 2 */
|
||||
border-style: solid;
|
||||
/* 2 */
|
||||
border-color: #e5e7eb;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
::before,
|
||||
::after {
|
||||
--tw-content: '';
|
||||
}
|
||||
|
||||
/*
|
||||
1. Use a consistent sensible line-height in all browsers.
|
||||
2. Prevent adjustments of font size after orientation changes in iOS.
|
||||
3. Use a more readable tab size.
|
||||
4. Use the user's configured `sans` font-family by default.
|
||||
5. Use the user's configured `sans` font-feature-settings by default.
|
||||
6. Use the user's configured `sans` font-variation-settings by default.
|
||||
*/
|
||||
|
||||
html {
|
||||
line-height: 1.5;
|
||||
/* 1 */
|
||||
-webkit-text-size-adjust: 100%;
|
||||
/* 2 */
|
||||
-moz-tab-size: 4;
|
||||
/* 3 */
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
/* 3 */
|
||||
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
/* 4 */
|
||||
font-feature-settings: normal;
|
||||
/* 5 */
|
||||
font-variation-settings: normal;
|
||||
/* 6 */
|
||||
}
|
||||
|
||||
/*
|
||||
1. Remove the margin in all browsers.
|
||||
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
|
||||
*/
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
/* 1 */
|
||||
line-height: inherit;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
1. Add the correct height in Firefox.
|
||||
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
|
||||
3. Ensure horizontal rules are visible by default.
|
||||
*/
|
||||
|
||||
hr {
|
||||
height: 0;
|
||||
/* 1 */
|
||||
color: inherit;
|
||||
/* 2 */
|
||||
border-top-width: 1px;
|
||||
/* 3 */
|
||||
}
|
||||
|
||||
/*
|
||||
Add the correct text decoration in Chrome, Edge, and Safari.
|
||||
*/
|
||||
|
||||
abbr:where([title]) {
|
||||
-webkit-text-decoration: underline dotted;
|
||||
text-decoration: underline dotted;
|
||||
}
|
||||
|
||||
/*
|
||||
Remove the default font size and weight for headings.
|
||||
*/
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-size: inherit;
|
||||
font-weight: inherit;
|
||||
}
|
||||
|
||||
/*
|
||||
Reset links to optimize for opt-in styling instead of opt-out.
|
||||
*/
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
|
||||
/*
|
||||
Add the correct font weight in Edge and Safari.
|
||||
*/
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Use the user's configured `mono` font-family by default.
|
||||
2. Use the user's configured `mono` font-feature-settings by default.
|
||||
3. Use the user's configured `mono` font-variation-settings by default.
|
||||
4. Correct the odd `em` font sizing in all browsers.
|
||||
*/
|
||||
|
||||
code,
|
||||
kbd,
|
||||
samp,
|
||||
pre {
|
||||
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
/* 1 */
|
||||
font-feature-settings: normal;
|
||||
/* 2 */
|
||||
font-variation-settings: normal;
|
||||
/* 3 */
|
||||
font-size: 1em;
|
||||
/* 4 */
|
||||
}
|
||||
|
||||
/*
|
||||
Add the correct font size in all browsers.
|
||||
*/
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/*
|
||||
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
|
||||
*/
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
|
||||
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
|
||||
3. Remove gaps between table borders by default.
|
||||
*/
|
||||
|
||||
table {
|
||||
text-indent: 0;
|
||||
/* 1 */
|
||||
border-color: inherit;
|
||||
/* 2 */
|
||||
border-collapse: collapse;
|
||||
/* 3 */
|
||||
}
|
||||
|
||||
/*
|
||||
1. Change the font styles in all browsers.
|
||||
2. Remove the margin in Firefox and Safari.
|
||||
3. Remove default padding in all browsers.
|
||||
*/
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
font-family: inherit;
|
||||
/* 1 */
|
||||
font-feature-settings: inherit;
|
||||
/* 1 */
|
||||
font-variation-settings: inherit;
|
||||
/* 1 */
|
||||
font-size: 100%;
|
||||
/* 1 */
|
||||
font-weight: inherit;
|
||||
/* 1 */
|
||||
line-height: inherit;
|
||||
/* 1 */
|
||||
color: inherit;
|
||||
/* 1 */
|
||||
margin: 0;
|
||||
/* 2 */
|
||||
padding: 0;
|
||||
/* 3 */
|
||||
}
|
||||
|
||||
/*
|
||||
Remove the inheritance of text transform in Edge and Firefox.
|
||||
*/
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Correct the inability to style clickable types in iOS and Safari.
|
||||
2. Remove default button styles.
|
||||
*/
|
||||
|
||||
button,
|
||||
[type='button'],
|
||||
[type='reset'],
|
||||
[type='submit'] {
|
||||
-webkit-appearance: button;
|
||||
/* 1 */
|
||||
background-color: transparent;
|
||||
/* 2 */
|
||||
background-image: none;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
Use the modern Firefox focus style for all focusable elements.
|
||||
*/
|
||||
|
||||
:-moz-focusring {
|
||||
outline: auto;
|
||||
}
|
||||
|
||||
/*
|
||||
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
|
||||
*/
|
||||
|
||||
:-moz-ui-invalid {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
/*
|
||||
Add the correct vertical alignment in Chrome and Firefox.
|
||||
*/
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
/*
|
||||
Correct the cursor style of increment and decrement buttons in Safari.
|
||||
*/
|
||||
|
||||
::-webkit-inner-spin-button,
|
||||
::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Correct the odd appearance in Chrome and Safari.
|
||||
2. Correct the outline style in Safari.
|
||||
*/
|
||||
|
||||
[type='search'] {
|
||||
-webkit-appearance: textfield;
|
||||
/* 1 */
|
||||
outline-offset: -2px;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
Remove the inner padding in Chrome and Safari on macOS.
|
||||
*/
|
||||
|
||||
::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Correct the inability to style clickable types in iOS and Safari.
|
||||
2. Change font properties to `inherit` in Safari.
|
||||
*/
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
-webkit-appearance: button;
|
||||
/* 1 */
|
||||
font: inherit;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
Add the correct display in Chrome and Safari.
|
||||
*/
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
/*
|
||||
Removes the default spacing and border for appropriate elements.
|
||||
*/
|
||||
|
||||
blockquote,
|
||||
dl,
|
||||
dd,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
hr,
|
||||
figure,
|
||||
p,
|
||||
pre {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
menu {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Reset default styling for dialogs.
|
||||
*/
|
||||
|
||||
dialog {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Prevent resizing textareas horizontally by default.
|
||||
*/
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
|
||||
2. Set the default placeholder color to the user's configured gray 400 color.
|
||||
*/
|
||||
|
||||
input::-moz-placeholder, textarea::-moz-placeholder {
|
||||
opacity: 1;
|
||||
/* 1 */
|
||||
color: #9ca3af;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
input::placeholder,
|
||||
textarea::placeholder {
|
||||
opacity: 1;
|
||||
/* 1 */
|
||||
color: #9ca3af;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
Set the default cursor for buttons.
|
||||
*/
|
||||
|
||||
button,
|
||||
[role="button"] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/*
|
||||
Make sure disabled buttons don't get the pointer cursor.
|
||||
*/
|
||||
|
||||
:disabled {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/*
|
||||
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
|
||||
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
|
||||
This can trigger a poorly considered lint error in some tools but is included by design.
|
||||
*/
|
||||
|
||||
img,
|
||||
svg,
|
||||
video,
|
||||
canvas,
|
||||
audio,
|
||||
iframe,
|
||||
embed,
|
||||
object {
|
||||
display: block;
|
||||
/* 1 */
|
||||
vertical-align: middle;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/*
|
||||
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
|
||||
*/
|
||||
|
||||
img,
|
||||
video {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/* Make elements with the HTML hidden attribute stay hidden by default */
|
||||
|
||||
[hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
*, ::before, ::after {
|
||||
--tw-border-spacing-x: 0;
|
||||
--tw-border-spacing-y: 0;
|
||||
--tw-translate-x: 0;
|
||||
--tw-translate-y: 0;
|
||||
--tw-rotate: 0;
|
||||
--tw-skew-x: 0;
|
||||
--tw-skew-y: 0;
|
||||
--tw-scale-x: 1;
|
||||
--tw-scale-y: 1;
|
||||
--tw-pan-x: ;
|
||||
--tw-pan-y: ;
|
||||
--tw-pinch-zoom: ;
|
||||
--tw-scroll-snap-strictness: proximity;
|
||||
--tw-gradient-from-position: ;
|
||||
--tw-gradient-via-position: ;
|
||||
--tw-gradient-to-position: ;
|
||||
--tw-ordinal: ;
|
||||
--tw-slashed-zero: ;
|
||||
--tw-numeric-figure: ;
|
||||
--tw-numeric-spacing: ;
|
||||
--tw-numeric-fraction: ;
|
||||
--tw-ring-inset: ;
|
||||
--tw-ring-offset-width: 0px;
|
||||
--tw-ring-offset-color: #fff;
|
||||
--tw-ring-color: rgb(59 130 246 / 0.5);
|
||||
--tw-ring-offset-shadow: 0 0 #0000;
|
||||
--tw-ring-shadow: 0 0 #0000;
|
||||
--tw-shadow: 0 0 #0000;
|
||||
--tw-shadow-colored: 0 0 #0000;
|
||||
--tw-blur: ;
|
||||
--tw-brightness: ;
|
||||
--tw-contrast: ;
|
||||
--tw-grayscale: ;
|
||||
--tw-hue-rotate: ;
|
||||
--tw-invert: ;
|
||||
--tw-saturate: ;
|
||||
--tw-sepia: ;
|
||||
--tw-drop-shadow: ;
|
||||
--tw-backdrop-blur: ;
|
||||
--tw-backdrop-brightness: ;
|
||||
--tw-backdrop-contrast: ;
|
||||
--tw-backdrop-grayscale: ;
|
||||
--tw-backdrop-hue-rotate: ;
|
||||
--tw-backdrop-invert: ;
|
||||
--tw-backdrop-opacity: ;
|
||||
--tw-backdrop-saturate: ;
|
||||
--tw-backdrop-sepia: ;
|
||||
}
|
||||
|
||||
::backdrop {
|
||||
--tw-border-spacing-x: 0;
|
||||
--tw-border-spacing-y: 0;
|
||||
--tw-translate-x: 0;
|
||||
--tw-translate-y: 0;
|
||||
--tw-rotate: 0;
|
||||
--tw-skew-x: 0;
|
||||
--tw-skew-y: 0;
|
||||
--tw-scale-x: 1;
|
||||
--tw-scale-y: 1;
|
||||
--tw-pan-x: ;
|
||||
--tw-pan-y: ;
|
||||
--tw-pinch-zoom: ;
|
||||
--tw-scroll-snap-strictness: proximity;
|
||||
--tw-gradient-from-position: ;
|
||||
--tw-gradient-via-position: ;
|
||||
--tw-gradient-to-position: ;
|
||||
--tw-ordinal: ;
|
||||
--tw-slashed-zero: ;
|
||||
--tw-numeric-figure: ;
|
||||
--tw-numeric-spacing: ;
|
||||
--tw-numeric-fraction: ;
|
||||
--tw-ring-inset: ;
|
||||
--tw-ring-offset-width: 0px;
|
||||
--tw-ring-offset-color: #fff;
|
||||
--tw-ring-color: rgb(59 130 246 / 0.5);
|
||||
--tw-ring-offset-shadow: 0 0 #0000;
|
||||
--tw-ring-shadow: 0 0 #0000;
|
||||
--tw-shadow: 0 0 #0000;
|
||||
--tw-shadow-colored: 0 0 #0000;
|
||||
--tw-blur: ;
|
||||
--tw-brightness: ;
|
||||
--tw-contrast: ;
|
||||
--tw-grayscale: ;
|
||||
--tw-hue-rotate: ;
|
||||
--tw-invert: ;
|
||||
--tw-saturate: ;
|
||||
--tw-sepia: ;
|
||||
--tw-drop-shadow: ;
|
||||
--tw-backdrop-blur: ;
|
||||
--tw-backdrop-brightness: ;
|
||||
--tw-backdrop-contrast: ;
|
||||
--tw-backdrop-grayscale: ;
|
||||
--tw-backdrop-hue-rotate: ;
|
||||
--tw-backdrop-invert: ;
|
||||
--tw-backdrop-opacity: ;
|
||||
--tw-backdrop-saturate: ;
|
||||
--tw-backdrop-sepia: ;
|
||||
}
|
||||
|
||||
.block {
|
||||
display: block;
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
@@ -1,10 +0,0 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: ["../content/**/*.md", "../layouts/**/*.html"],
|
||||
theme: {
|
||||
extend: {},
|
||||
},
|
||||
// darkMode: 'class',
|
||||
plugins: [require("@tailwindcss/typography")],
|
||||
}
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
name: Space Bar
|
||||
license: MIT
|
||||
licenselink: 'https://github.com/owner/repo/LICENSE'
|
||||
description: Theme description
|
||||
homepage: 'https://github.com/owner/repo'
|
||||
demosite: 'https://owner.github.io/repo'
|
||||
tags:
|
||||
- blog
|
||||
- company
|
||||
features:
|
||||
- some
|
||||
- awesome
|
||||
- features
|
||||
author:
|
||||
name: Avinal Kumar
|
||||
homepage: 'https://avinal.space'
|
||||
original:
|
||||
author: Name of original author
|
||||
homepage: Website of original author
|
||||
repo: 'https://github.com/owner/repo'
|
||||
@@ -0,0 +1,12 @@
|
||||
---
|
||||
date: "2023-01-01T08:00:00-07:00"
|
||||
draft: false
|
||||
title: Home
|
||||
---
|
||||
|
||||
I am a Software Engineer II at Red Hat, specializing in hybrid cloud engineering.
|
||||
I have been involved with Google's Summer of Code and Google Season of Docs
|
||||
programs as a mentor and contributor to Open Source for many years. For fun,
|
||||
I like to play around with cutting-edge areas of computer science; at the
|
||||
moment, I'm learning about Elm. GNU/Linux and free/open-source software are
|
||||
two of my favorite things
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
category: article
|
||||
date: 2024-10-10T03:47:00
|
||||
description: The Big Red Ants
|
||||
image: /images/ants.webp
|
||||
tags:
|
||||
- ants
|
||||
- sav
|
||||
title: Ephemeral Lament in Temporal Decay
|
||||
---
|
||||
|
||||
There is about 3 hours left until I can see my first morning twilight in the new revolution. There is little sound of wind blowing but it is faint like if I ask them to stop, they will. If you are not careful enough this silence can be very noisy.
|
||||
|
||||
Lament is an elusive specter, a whisper of sorrow that slips through our fingers like sand. It is neither a crescendo nor a silence; instead, it weaves itself into the fabric of our existence, intertwining with the threads of fleeting joy and lingering regret. As time unfurls, it morphs, presenting a kaleidoscope of emotions that dance in and out of focus, challenging the very essence of memory and feeling.
|
||||
|
||||
Faces once familar now contribute to the darkness all around me. The screen, once alight with messages, now lies dormant, a graveyard of unspoken words. In these voids, nostalgia and anguish intertwine, creating a tapestry of emotions that suffocates and sustains simultaneously. Each reminder of their absence stirs a deep yearning, a longing for what was, yet it compels me to confront the stark reality of isolation.
|
||||
|
||||
Within this tempest of thought, an internal monologue unfolds, an endless loop of contemplation that spirals into itself. I grapple with the contradictions that paint my existence: the flicker of hope buried beneath layers of despair, the fleeting joy that dances just out of reach. Like shadows flickering in candlelight, these emotions tease my consciousness, merging and separating in a chaotic ballet. It is a relentless struggle, the mind ensnared in a web of unarticulated feelings, each thread woven tighter by the weight of unexpressed sorrow.
|
||||
|
||||
Time, in its capriciousness, warps and distorts, leaving me adrift in an ocean of temporal confusion. Seconds stretch into hours, a torturous dragging of moments that cling like cobwebs to my psyche, while other hours flash by unnoticed, a blur of mundane existence. I am haunted by the imagery of decay—the crumbling walls of memory, the fading echoes of laughter. Each recollection erodes like sandcastles washed away by relentless tides, yet the remnants remain, forming the contours of my fractured emotional landscape.
|
||||
|
||||
In the maelstrom, glimpses of clarity emerge, ethereal and brief, like sunlight piercing through a stormy sky. For an instant, I grasp a sense of purpose, a flicker of motivation igniting within me, only to be enveloped again by the shadows of my thoughts. These fleeting moments serve as reminders of what could be, yet they dissipate too quickly, leaving behind a more profound ache in their wake. The contrasts are stark; the euphoria of realization juxtaposed with the heaviness of returning emotions, a reminder that solace is ephemeral.
|
||||
|
||||
|
||||
@@ -52,7 +52,6 @@ them—a promise waiting to be fulfilled.
|
||||
Planting them is an act of faith and surrender, a quiet conversation between the gardener and the
|
||||
earth. Each bulb is placed with care, its position a deliberate choice. It is not enough to bury
|
||||
them; they must be cradled, surrounded by soil that is ready to nurture them.
|
||||
|
||||
And then comes the waiting. Beneath the surface, where no eyes can see, the bulbs begin their secret
|
||||
work. It is a reminder that growth often begins in the darkness, in spaces where no light reaches.
|
||||
|
||||
@@ -65,7 +64,6 @@ bear. But you do it anyway, knowing that without this care, the lilies cannot th
|
||||
The sunlight is capricious. Some days, it floods the garden, bathing it in warmth. Other days, it
|
||||
hides behind thick clouds, forcing the lilies to stretch toward a light they cannot see. But they
|
||||
adapt. Lilies have a way of finding what they need, even in the absence of abundance.
|
||||
|
||||
This daily ritual of watering and watching is its own form of prayer. Each drop of water, each
|
||||
fleeting moment of sunlight, whispers to the lilies: *Grow, even if it feels impossible. Grow, even
|
||||
when no one is watching.*
|
||||
@@ -90,7 +88,6 @@ not grow in safety. They grow in resilience.
|
||||
The garden is never free from trials. Storms roll in, their winds threatening to uproot what little
|
||||
has begun to grow. Pests arrive uninvited, gnawing at leaves and stems as though testing your
|
||||
resolve. The sun beats down mercilessly one day, only to disappear for weeks on end.
|
||||
|
||||
It is in these moments that you are tempted to despair, to abandon the garden and declare it a
|
||||
failure. But lilies teach you that resilience is not about avoiding hardship; it is about enduring
|
||||
it. When the storm passes, you clear the debris. When pests arrive, you remove them. When the
|
||||
@@ -119,10 +116,8 @@ The most dangerous thing about me is that *I don't know how to give up*.
|
||||
When the storms tore through, I stayed. When the roots clung to the earth like they had a right to
|
||||
its emptiness, I dug deeper. Even when the soil screamed that nothing could ever grow here, I
|
||||
refused to listen.
|
||||
|
||||
It's not resilience—it's defiance. A stubbornness that borders on recklessness. I don't know when to
|
||||
stop, even when the odds mock me. Even when it hurts.
|
||||
|
||||
Maybe it's toxic. Maybe it's foolish. But here I am, hands in the dirt, refusing to abandon what
|
||||
could still bloom.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Installing Fedora with automatic and custom partioning
|
||||
date: 2023-01-19 23:02
|
||||
date: 2023-01-19T23:02:00
|
||||
category: blog
|
||||
tags: [fedora, partioning]
|
||||
image: ""
|
||||
@@ -5,7 +5,7 @@ description: The project was to Create the VLC User Documentation for Android Mo
|
||||
Port which was previously hosted on VLC wiki pages. The major portion of this was
|
||||
to start everything from scratch including chapter separation, section organization.
|
||||
image: /images/day-of-cone.webp
|
||||
modified: 2020-12-31 23:19
|
||||
modified: 2020-12-31T23:19:00
|
||||
tags:
|
||||
- vlc
|
||||
- gsod
|
||||
@@ -7,7 +7,7 @@ description: This blog is a descreptive account of the development of Minimal Te
|
||||
blog]("https://avinal.space/posts/development/i-am-loving-it-redhat.html") to know
|
||||
about these topics.
|
||||
image: /images/development.webp
|
||||
modified: 2022-03-07 22:47
|
||||
modified: 2022-03-07T22:47:00
|
||||
tags:
|
||||
- tekton
|
||||
- go
|
||||
@@ -217,4 +217,4 @@ type SpaceTimeList struct {
|
||||
### Attribution
|
||||
|
||||
- Photo by [Luca Bravo](https://unsplash.com/@lucabravo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/photos/XJXWbfSo2f0?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText).
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ I will be listing the applications in the decreasing order of my priority.
|
||||
### Immich
|
||||
|
||||
| Website | Source | Category | Platforms | Similar |
|
||||
|-------------------------------|------------------------------------------------|--------------------------|-------------------|---------------|
|
||||
| ----------------------------- | ---------------------------------------------- | ------------------------ | ----------------- | ------------- |
|
||||
| [Immich](https://immich.app/) | [GitHub](https://github.com/immich-app/immich) | Photos and Videos Backup | Web, Android, iOS | Google Photos |
|
||||
|
||||
Immich is the best open source and feature rich replacement to Google Photos. For starters the installation is very
|
||||
@@ -65,7 +65,7 @@ alternatives [here](https://meichthys.github.io/foss_photo_libraries/).
|
||||
### Paisa
|
||||
|
||||
| Website | Source | Category | Platforms | Similar |
|
||||
|-----------------------------|---------------------------------------------------|----------------------------|-----------|------------------|
|
||||
| --------------------------- | ------------------------------------------------- | -------------------------- | --------- | ---------------- |
|
||||
| [Paisa](https://paisa.fyi/) | [GitHub](https://github.com/ananthakumaran/paisa) | Finance and Budget Manager | Web | Beancount,ledger |
|
||||
|
||||
It is really hard to keep track of all expenses from multiple accounts and credit cards. There are great solutions and
|
||||
@@ -82,7 +82,7 @@ well. But the current web UI is more than enough.
|
||||
### Vikunja
|
||||
|
||||
| Website | Source | Category | Platforms | Similar |
|
||||
|--------------------------------|-----------------------------------------------|--------------|-----------|-----------------------|
|
||||
| ------------------------------ | --------------------------------------------- | ------------ | --------- | --------------------- |
|
||||
| [Vikunja](https://vikunja.io/) | [Gitea](https://kolaente.dev/vikunja/vikunja) | Todo, Kanban | Web | Google Tasks, Todoist |
|
||||
|
||||
There are many great open source todo and kanban applications, I have tested many of them and settled for Vikunja. For
|
||||
@@ -94,7 +94,7 @@ different projects.
|
||||
### Atuin
|
||||
|
||||
| Website | Source | Category | Platforms | Similar |
|
||||
|----------------------------|--------------------------------------------|--------------------|-----------------------|------------|
|
||||
| -------------------------- | ------------------------------------------ | ------------------ | --------------------- | ---------- |
|
||||
| [Atuin](https://atuin.sh/) | [GitHub](https://github.com/atuinsh/atuin) | Shell History sync | Linux, MacOS, Android | zsh-histdb |
|
||||
|
||||
I have 4 servers and many devices, it is not often easy to get the similar commands on different machines. That is where
|
||||
@@ -105,7 +105,7 @@ via an Atuin server.
|
||||
### Gitea
|
||||
|
||||
| Website | Source | Category | Platforms | Similar |
|
||||
|-----------------------------------|---------------------------------------------|------------------|-----------|---------------------------|
|
||||
| --------------------------------- | ------------------------------------------- | ---------------- | --------- | ------------------------- |
|
||||
| [Gitea](https://about.gitea.com/) | [GitHub](https://github.com/go-gitea/gitea) | Git hosting, VCS | Web | GitHub, BitBucket, GitLab |
|
||||
|
||||
Gitea is a GitHub replacement written in Go. It includes a lot of features from GitHub including package registry,
|
||||
@@ -114,7 +114,7 @@ CI/CD, team collaboration etc. I have not been actively using it. But I plan to
|
||||
### Paperless-ngx
|
||||
|
||||
| Website | Source | Category | Platforms | Similar |
|
||||
|--------------------------------------------------|----------------------------------------------------------|----------------------------|--------------|----------|
|
||||
| ------------------------------------------------ | -------------------------------------------------------- | -------------------------- | ------------ | -------- |
|
||||
| [Paperless-ngx](https://docs.paperless-ngx.com/) | [GitHub](https://github.com/paperless-ngx/paperless-ngx) | Document Management System | Web, Android | Docspell |
|
||||
|
||||
This is a document management application where I can store my PDF/text documents (not ebooks). It has built in OCR and
|
||||
@@ -123,7 +123,7 @@ other useful feature to organise and search through your documents.
|
||||
### Shiori
|
||||
|
||||
| Website | Source | Category | Platforms | Similar |
|
||||
|---------|-----------------------------------------------|------------------|----------------------------|--------------------|
|
||||
| ------- | --------------------------------------------- | ---------------- | -------------------------- | ------------------ |
|
||||
| - | [GitHub](https://github.com/go-shiori/shiori) | Bookmark Manager | Web, Linux, MacOS, Windows | LinkWarden, Pocket |
|
||||
|
||||
Shiori is a simple bookmarks manager written in the Go language. Intended as a simple clone of Pocket. You can use it as
|
||||
@@ -1,140 +0,0 @@
|
||||
{
|
||||
"app": {
|
||||
"elm": {
|
||||
"development": {
|
||||
"debugger": true
|
||||
},
|
||||
"production": {
|
||||
"debugger": false
|
||||
}
|
||||
},
|
||||
"env": [],
|
||||
"html": {
|
||||
"attributes": {
|
||||
"html": {
|
||||
"lang": "en",
|
||||
"class": "bg-neutral-800"
|
||||
},
|
||||
"head": {},
|
||||
"body": {}
|
||||
},
|
||||
"title": "Avinal Kumar | Personal Website",
|
||||
"meta": [
|
||||
{
|
||||
"charset": "UTF-8"
|
||||
},
|
||||
{
|
||||
"http-equiv": "X-UA-Compatible",
|
||||
"content": "IE=edge"
|
||||
},
|
||||
{
|
||||
"name": "viewport",
|
||||
"content": "width=device-width, initial-scale=1.0"
|
||||
},
|
||||
{
|
||||
"name": "msapplication-TileColor",
|
||||
"content": "#da532c"
|
||||
},
|
||||
{
|
||||
"name": "theme-color",
|
||||
"content": "#ffffff"
|
||||
},
|
||||
{
|
||||
"name": "title",
|
||||
"content": "Avinal Kumar | Personal Website"
|
||||
},
|
||||
{
|
||||
"name": "description",
|
||||
"content": "I am a Software Engineer Associate at Red Hat, specialising in hybrid cloud engineering. I have been involved with Google's Summer of Code and Google Season of Docs programmes as a mentor and contributor to Open Source for many years. For fun, I like to play around with cutting-edge areas of computer science; at the moment, I'm learning about Elm. GNU/Linux and free/open-source software are two of my favourite things."
|
||||
},
|
||||
{
|
||||
"property": "og:type",
|
||||
"content": "website"
|
||||
},
|
||||
{
|
||||
"property": "og:url",
|
||||
"content": "https://avinal.space/"
|
||||
},
|
||||
{
|
||||
"property": "og:title",
|
||||
"content": "Avinal Kumar | Personal Website"
|
||||
},
|
||||
{
|
||||
"property": "og:description",
|
||||
"content": "I am a Software Engineer Associate at Red Hat, specialising in hybrid cloud engineering. I have been involved with Google's Summer of Code and Google Season of Docs programmes as a mentor and contributor to Open Source for many years. For fun, I like to play around with cutting-edge areas of computer science; at the moment, I'm learning about Elm. GNU/Linux and free/open-source software are two of my favourite things"
|
||||
},
|
||||
{
|
||||
"property": "og:image",
|
||||
"content": "https://avinal.space/images/avinal-meta.png"
|
||||
},
|
||||
{
|
||||
"property": "twitter:card",
|
||||
"content": "summary_large_image"
|
||||
},
|
||||
{
|
||||
"property": "twitter:url",
|
||||
"content": "https://avinal.space/"
|
||||
},
|
||||
{
|
||||
"property": "twitter:title",
|
||||
"content": "Avinal Kumar | Personal Website"
|
||||
},
|
||||
{
|
||||
"property": "twitter:description",
|
||||
"content": "I am a Software Engineer Associate at Red Hat, specialising in hybrid cloud engineering. I have been involved with Google's Summer of Code and Google Season of Docs programmes as a mentor and contributor to Open Source for many years. For fun, I like to play around with cutting-edge areas of computer science; at the moment, I'm learning about Elm. GNU/Linux and free/open-source software are two of my favourite things"
|
||||
},
|
||||
{
|
||||
"property": "twitter:image",
|
||||
"content": "https://avinal.space/images/avinal-meta.png"
|
||||
}
|
||||
],
|
||||
"link": [
|
||||
{
|
||||
"defer rel": "stylesheet",
|
||||
"href": "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css",
|
||||
"integrity": "sha512-MV7K8+y+gLIBoVD59lQIYicR65iaqukzvf/nwasF0nqhPay5w/9lJmVM2hMDcnK1OnMGCdVK+iQrJ7lzPJQd1w==",
|
||||
"crossorigin": "anonymous",
|
||||
"referrerpolicy": "no-referrer"
|
||||
},
|
||||
{
|
||||
"rel": "stylesheet",
|
||||
"href": "/main.css"
|
||||
},
|
||||
{
|
||||
"rel": "apple-touch-icon",
|
||||
"sizes": "180x180",
|
||||
"href": "/apple-touch-icon.png"
|
||||
},
|
||||
{
|
||||
"rel": "icon",
|
||||
"type": "image/png",
|
||||
"sizes": "32x32",
|
||||
"href": "/favicon-32x32.png"
|
||||
},
|
||||
{
|
||||
"rel": "icon",
|
||||
"type": "image/png",
|
||||
"sizes": "16x16",
|
||||
"href": "/favicon-16x16.png"
|
||||
},
|
||||
{
|
||||
"rel": "manifest",
|
||||
"href": "/site.webmanifest"
|
||||
},
|
||||
{
|
||||
"rel": "mask-icon",
|
||||
"href": "/safari-pinned-tab.svg",
|
||||
"color": "#5bbad5"
|
||||
},
|
||||
{
|
||||
"rel": "canonical",
|
||||
"href": "https://avinal.space"
|
||||
}
|
||||
],
|
||||
"script": []
|
||||
},
|
||||
"router": {
|
||||
"useHashRouting": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"type": "application",
|
||||
"source-directories": [
|
||||
"src",
|
||||
".elm-land/src"
|
||||
],
|
||||
"elm-version": "0.19.1",
|
||||
"dependencies": {
|
||||
"direct": {
|
||||
"MaybeJustJames/yaml": "2.1.2",
|
||||
"NoRedInk/elm-json-decode-pipeline": "1.0.1",
|
||||
"elm/browser": "1.0.2",
|
||||
"elm/core": "1.0.5",
|
||||
"elm/html": "1.0.0",
|
||||
"elm/http": "2.0.0",
|
||||
"elm/json": "1.1.3",
|
||||
"elm/parser": "1.1.0",
|
||||
"elm/svg": "1.0.1",
|
||||
"elm/time": "1.0.0",
|
||||
"elm/url": "1.0.0"
|
||||
},
|
||||
"indirect": {
|
||||
"elm/bytes": "1.0.8",
|
||||
"elm/file": "1.0.5",
|
||||
"elm/regex": "1.0.0",
|
||||
"elm/virtual-dom": "1.0.3"
|
||||
}
|
||||
},
|
||||
"test-dependencies": {
|
||||
"direct": {},
|
||||
"indirect": {}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
baseURL: 'https://avinal.space/'
|
||||
languageCode: 'en-us'
|
||||
title: "Avinal's Website"
|
||||
theme: 'box-box'
|
||||
|
||||
menus:
|
||||
main:
|
||||
- name: Home
|
||||
pageRef: /
|
||||
weight: 10
|
||||
- name: Posts
|
||||
pageRef: /posts
|
||||
weight: 20
|
||||
|
||||
disableKinds: ["taxonomy"]
|
||||
|
||||
taxonomies:
|
||||
category: category
|
||||
|
||||
permalinks:
|
||||
category: "/posts/category/:slug"
|
||||
|
||||
ignoreLogs: 'warning-goldmark-raw-html'
|
||||
@@ -1,16 +1,6 @@
|
||||
[build]
|
||||
command = "make all"
|
||||
publish = "dist"
|
||||
command = "hugo"
|
||||
publish = "public"
|
||||
|
||||
[[redirects]]
|
||||
from = "/*"
|
||||
to = "/index.html"
|
||||
status = 200
|
||||
|
||||
# [[redirects]]
|
||||
# from = "/posts/*"
|
||||
# to = ""
|
||||
# status = 200
|
||||
|
||||
[build.environment]
|
||||
HUGO_VERSION = "0.134.3"
|
||||
HUGO_VERSION = "0.140.1"
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"devDependencies": {
|
||||
"@tailwindcss/typography": "^0.5.8",
|
||||
"elm-land": "^0.20.1",
|
||||
"tailwindcss": "^3.2.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"npm": "^10.6.0"
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
# My personal website
|
||||
|
||||
**description will be updated soon.**
|
||||
|
||||
## Resources
|
||||
|
||||
- <https://mambaui.com/>
|
||||
- <https://codebeautify.org/jsonminifier>
|
||||
- <https://codeshack.io/json-sorter/>
|
||||
- <https://prismjs.com/index.html>
|
||||
- <https://elm.land>
|
||||
- <https://max.hn/thoughts/using-tailwind-css-in-elm-and-vscode>
|
||||
- <https://tailwindcss.com/>
|
||||
- <https://tailwind-elements.com/>
|
||||
- <https://github.com/annaghi/elm-github-pages>
|
||||
- <https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements>
|
||||
- <https://elm-lang.org/>
|
||||
- <https://tailblocks.cc/>
|
||||
- <https://wickedblocks.dev/>
|
||||
- <https://merakiui.com/>
|
||||
|
||||
- https://www.pexels.com/photo/photo-of-person-typing-on-computer-keyboard-735911/
|
||||
- https://www.pexels.com/photo/black-flat-screen-computer-monitor-1714208/
|
||||
- https://wallpapercave.com/w/Bi9gfmV
|
||||
- https://www.pexels.com/photo/close-up-photo-of-gaming-keyboard-2115257/
|
||||
- https://www.pexels.com/photo/numbers-projected-on-face-5952651/
|
||||
- https://www.pexels.com/photo/close-up-photo-of-plugged-cables-1624895/
|
||||
- <a href="https://www.freepik.com/free-photo/hands-digital-universe-background_13301552.htm#query=technology%20wallpaper&position=17&from_view=keyword">Image by rawpixel.com</a> on Freepik
|
||||
|
||||
<a href="https://www.flaticon.com/free-icons/projectile" title="projectile icons">Projectile icons created by Eucalyp - Flaticon</a>
|
||||
@@ -1,59 +0,0 @@
|
||||
module Components.Footer exposing (..)
|
||||
|
||||
import Html exposing (Html)
|
||||
import Html.Attributes exposing (class, href, src, target)
|
||||
import Utils.Constants exposing (IconLink, Link, footerLinks)
|
||||
import Html.Attributes exposing (rel)
|
||||
|
||||
|
||||
singleLink : Link -> Html msg
|
||||
singleLink link =
|
||||
Html.a
|
||||
[ href link.url
|
||||
, class "underline decoration-cyan-500 hover:decoration-pink-500 text-xl"
|
||||
, target "_blank"
|
||||
, rel "noopener noreferrer"
|
||||
]
|
||||
[ Html.text link.text ]
|
||||
|
||||
iconedLink : IconLink -> Html msg
|
||||
iconedLink iconLink =
|
||||
Html.a [ href iconLink.url, class "hover:text-pink-500 inline-flex text-2xl p-3 no-underline" ]
|
||||
[ Html.i [ class iconLink.icon ] []
|
||||
]
|
||||
|
||||
|
||||
footerLinksToSide : Html msg
|
||||
footerLinksToSide =
|
||||
Html.div [ class "fixed bottom-0 left-0 bg-neutral-900 p-4 w-full border-t border-cyan-500" ]
|
||||
[ Html.div [ class "mx-auto flex justify-center space-x-6 text-gray-400" ]
|
||||
(List.map singleLink <|
|
||||
{ text = "Home", url = "/" }
|
||||
:: footerLinks
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
iconLinkToCenter : Html msg
|
||||
iconLinkToCenter =
|
||||
Html.div [ class "flex justify-center flex-wrap" ] (List.map iconedLink Utils.Constants.iconLinks)
|
||||
|
||||
|
||||
avatarAndLinks : Html msg
|
||||
avatarAndLinks =
|
||||
Html.div []
|
||||
[ Html.div [ class "flex flex-col md:space-y-0 md:space-x-6 md:flex-row border-t border-neutral-700" ]
|
||||
[ Html.img
|
||||
[ class "self-center flex-shrink-0 w-24 h-24 border rounded-full md:justify-self-start"
|
||||
, src "https://github.com/avinal.png"
|
||||
]
|
||||
[]
|
||||
, Html.div [ class "flex flex-col self-center" ]
|
||||
[ Html.h4 [ class "text-xl font-semibold sm:justify-self-start" ] [ Html.text "Avinal Kumar" ]
|
||||
, Html.p [ class "text-gray-400" ]
|
||||
[ Html.text "I am a Associate Software Engineer at Red Hat and I work for Hybrid Cloud Engineering. I contribute to Open Source projects and write blogs in tech and literature."
|
||||
]
|
||||
]
|
||||
]
|
||||
, Html.div [ class "flex justify-center align-center text-neutral-700 text-xl" ] (List.map iconedLink Utils.Constants.iconLinks)
|
||||
]
|
||||
@@ -1,93 +0,0 @@
|
||||
module Layouts.Home exposing (Model, Msg, Props, layout)
|
||||
|
||||
import Components.Footer exposing (iconLinkToCenter)
|
||||
import Effect exposing (Effect)
|
||||
import Html exposing (Html)
|
||||
import Html.Attributes exposing (class, href, target, rel)
|
||||
import Layout exposing (Layout)
|
||||
import Route exposing (Route)
|
||||
import Shared
|
||||
import Utils.Constants exposing (..)
|
||||
import View exposing (View)
|
||||
import Html.Attributes exposing (target)
|
||||
|
||||
|
||||
type alias Props =
|
||||
{}
|
||||
|
||||
|
||||
layout : Props -> Shared.Model -> Route () -> Layout () Model Msg contentMsg
|
||||
layout props shared route =
|
||||
Layout.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, view = view
|
||||
, subscriptions = subscriptions
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- MODEL
|
||||
|
||||
|
||||
type alias Model =
|
||||
{}
|
||||
|
||||
|
||||
init : () -> ( Model, Effect Msg )
|
||||
init _ =
|
||||
( {}
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- UPDATE
|
||||
|
||||
|
||||
type Msg
|
||||
= ReplaceMe
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Effect Msg )
|
||||
update msg model =
|
||||
case msg of
|
||||
ReplaceMe ->
|
||||
( model
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions model =
|
||||
Sub.none
|
||||
|
||||
|
||||
|
||||
-- VIEW
|
||||
|
||||
|
||||
view : { toContentMsg : Msg -> contentMsg, content : View contentMsg, model : Model } -> View contentMsg
|
||||
view { toContentMsg, model, content } =
|
||||
let
|
||||
footerLinkToCenter : Link -> Html msg
|
||||
footerLinkToCenter link =
|
||||
Html.a
|
||||
[ href link.url
|
||||
, class "underline decoration-cyan-500 hover:decoration-pink-500 inline-flex text-xl p-3"
|
||||
, target "_blank"
|
||||
, rel "noopener noreferrer"
|
||||
]
|
||||
[ Html.text link.text ]
|
||||
in
|
||||
{ title = content.title
|
||||
, body =
|
||||
[ Html.section [ class "flex items-center justify-center flex-col h-screen text-gray-400" ]
|
||||
[ Html.header [ class "object-cover object-center p-8" ] content.body
|
||||
, iconLinkToCenter
|
||||
, Html.div [ class "text-center text-xl p-2" ] [ Html.text "Avinal Kumar, Software Engineer II at Red Hat, Open Sourcerer" ]
|
||||
, Html.footer [ class "flex justify-center flex-wrap" ]
|
||||
(List.map footerLinkToCenter Utils.Constants.footerLinks)
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -1,317 +0,0 @@
|
||||
module Pages.Home_ exposing (Model, Msg, page)
|
||||
|
||||
import Array exposing (Array)
|
||||
import Effect exposing (Effect)
|
||||
import Html exposing (Html)
|
||||
import Html.Events exposing (onClick, onMouseLeave)
|
||||
import Layouts
|
||||
import Page exposing (Page)
|
||||
import Route exposing (Route)
|
||||
import Shared
|
||||
import Svg exposing (..)
|
||||
import Svg.Attributes as SA
|
||||
import Svg.Events as SE
|
||||
import Time
|
||||
import Utils.Constants exposing (nameMatrix)
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
page : Shared.Model -> Route () -> Page Model Msg
|
||||
page _ _ =
|
||||
Page.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, subscriptions = subscriptions
|
||||
, view = view
|
||||
}
|
||||
|> Page.withLayout layout
|
||||
|
||||
|
||||
|
||||
-- LAYOUT
|
||||
|
||||
|
||||
layout : Model -> Layouts.Layout Msg
|
||||
layout _ =
|
||||
Layouts.Home
|
||||
{}
|
||||
|
||||
|
||||
|
||||
-- INIT
|
||||
|
||||
|
||||
type Cell
|
||||
= Alive
|
||||
| Dead
|
||||
|
||||
|
||||
type alias Universe a =
|
||||
{ space : Array a
|
||||
, width : Int
|
||||
, height : Int
|
||||
}
|
||||
|
||||
|
||||
type alias Model =
|
||||
{ universe : Universe Cell
|
||||
, generations : Int
|
||||
, generating : Bool
|
||||
}
|
||||
|
||||
|
||||
cellSize : Int
|
||||
cellSize =
|
||||
10
|
||||
|
||||
|
||||
init : () -> ( Model, Effect Msg )
|
||||
init () =
|
||||
( { universe = bigBang 30 30 Dead
|
||||
, generating = False
|
||||
, generations = 0
|
||||
}
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- UPDATE
|
||||
|
||||
|
||||
type Msg
|
||||
= Ressurect Int Int
|
||||
| NextGeneration
|
||||
| LiveLife
|
||||
| Apocalypse
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Effect Msg )
|
||||
update msg model =
|
||||
case msg of
|
||||
Ressurect x y ->
|
||||
( { model
|
||||
| universe =
|
||||
buildRelationship model.universe
|
||||
x
|
||||
y
|
||||
invertLife
|
||||
}
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
NextGeneration ->
|
||||
let
|
||||
universe =
|
||||
nextGeneration model.universe
|
||||
|
||||
generations =
|
||||
model.generations + 1
|
||||
|
||||
generating =
|
||||
model.generating && universe /= model.universe
|
||||
in
|
||||
( { model
|
||||
| universe = universe
|
||||
, generations = generations
|
||||
, generating = generating
|
||||
}
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
LiveLife ->
|
||||
( { model | generating = not model.generating }
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
Apocalypse ->
|
||||
( { model | generating = False }
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- SUBSCRIPTIONS
|
||||
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions model =
|
||||
if model.generating then
|
||||
Time.every 500 (always NextGeneration)
|
||||
|
||||
else
|
||||
Sub.none
|
||||
|
||||
|
||||
|
||||
-- VIEW
|
||||
|
||||
|
||||
view : Model -> View Msg
|
||||
view model =
|
||||
{ title = "Welcome to my website"
|
||||
, body = [ Html.div [ onClick LiveLife, onMouseLeave LiveLife ] [ universeSvg model ] ]
|
||||
}
|
||||
|
||||
|
||||
cellToSvg : Int -> Int -> Cell -> Svg Msg
|
||||
cellToSvg x y cell =
|
||||
let
|
||||
isName =
|
||||
if Array.get ((y - 12) * 24 + x - 3) nameMatrix == Just 1 && x >= 3 && x < 27 then
|
||||
True
|
||||
|
||||
else
|
||||
False
|
||||
|
||||
color =
|
||||
case cell of
|
||||
Alive ->
|
||||
if isName then
|
||||
"fill-cyan-500"
|
||||
|
||||
else
|
||||
"fill-pink-500"
|
||||
|
||||
Dead ->
|
||||
"fill-neutral-800"
|
||||
in
|
||||
rect
|
||||
[ SA.x (String.fromInt (x * cellSize))
|
||||
, SA.y (String.fromInt (y * cellSize))
|
||||
, SA.width (String.fromInt cellSize)
|
||||
, SA.height (String.fromInt cellSize)
|
||||
, SA.class color
|
||||
, SE.onMouseOver (Ressurect x y)
|
||||
]
|
||||
[]
|
||||
|
||||
|
||||
universeSvg : Model -> Html Msg
|
||||
universeSvg model =
|
||||
let
|
||||
svgWidth =
|
||||
String.fromInt (model.universe.width * cellSize)
|
||||
|
||||
svgHeight =
|
||||
String.fromInt (model.universe.height * cellSize)
|
||||
in
|
||||
svg
|
||||
[ SA.width "150"
|
||||
, SA.height "150"
|
||||
, SA.viewBox ("0 0 " ++ svgWidth ++ " " ++ svgHeight)
|
||||
, SA.class "stroke-0"
|
||||
]
|
||||
(stretchUniverseThin cellToSvg model.universe)
|
||||
|
||||
|
||||
|
||||
-- UTIL
|
||||
|
||||
|
||||
bigBang : Int -> Int -> a -> Universe a
|
||||
bigBang width height value =
|
||||
{ space = Array.repeat (width * height) value
|
||||
, width = width
|
||||
, height = height
|
||||
}
|
||||
|
||||
|
||||
stretchUniverseThin : (Int -> Int -> a -> b) -> Universe a -> List b
|
||||
stretchUniverseThin f universe =
|
||||
Array.toIndexedList universe.space
|
||||
|> List.map (\( i, cell ) -> f (modBy universe.width i) (i // universe.width) cell)
|
||||
|
||||
|
||||
nextGeneration : Universe Cell -> Universe Cell
|
||||
nextGeneration universe =
|
||||
{ universe
|
||||
| space =
|
||||
Array.indexedMap
|
||||
(decideFateOf universe)
|
||||
universe.space
|
||||
}
|
||||
|
||||
|
||||
decideFateOf : Universe Cell -> Int -> Cell -> Cell
|
||||
decideFateOf u i today =
|
||||
let
|
||||
aliveAtoms =
|
||||
countLiveAtoms i u
|
||||
in
|
||||
case today of
|
||||
Alive ->
|
||||
if aliveAtoms < 2 || aliveAtoms > 3 then
|
||||
Dead
|
||||
|
||||
else
|
||||
Alive
|
||||
|
||||
Dead ->
|
||||
if aliveAtoms == 3 then
|
||||
Alive
|
||||
|
||||
else
|
||||
Dead
|
||||
|
||||
|
||||
buildRelationship : Universe a -> Int -> Int -> (a -> a) -> Universe a
|
||||
buildRelationship universe x y fn =
|
||||
case getUniverseAt x y universe of
|
||||
Just cell ->
|
||||
setUniverseAt x y (fn cell) universe
|
||||
|
||||
Nothing ->
|
||||
universe
|
||||
|
||||
|
||||
getUniverseAt : Int -> Int -> Universe a -> Maybe a
|
||||
getUniverseAt x y u =
|
||||
Array.get (y * u.width + x) u.space
|
||||
|
||||
|
||||
setUniverseAt : Int -> Int -> a -> Universe a -> Universe a
|
||||
setUniverseAt x y value u =
|
||||
{ u | space = Array.set (y * u.width + x) value u.space }
|
||||
|
||||
|
||||
countLiveAtoms : Int -> Universe Cell -> Int
|
||||
countLiveAtoms i universe =
|
||||
let
|
||||
above =
|
||||
i - universe.width
|
||||
|
||||
below =
|
||||
i + universe.width
|
||||
|
||||
coordinate =
|
||||
[ above - 1
|
||||
, above
|
||||
, above + 1
|
||||
, i - 1
|
||||
, i + 1
|
||||
, below - 1
|
||||
, below
|
||||
, below + 1
|
||||
]
|
||||
in
|
||||
coordinate
|
||||
|> List.filter
|
||||
(\n ->
|
||||
abs
|
||||
(modBy universe.width n - modBy universe.width i)
|
||||
<= 1
|
||||
)
|
||||
|> List.map (\c -> universe.space |> Array.get c)
|
||||
|> List.filter (\c -> c == Just Alive)
|
||||
|> List.length
|
||||
|
||||
|
||||
invertLife : Cell -> Cell
|
||||
invertLife cell =
|
||||
case cell of
|
||||
Alive ->
|
||||
Dead
|
||||
|
||||
Dead ->
|
||||
Alive
|
||||
@@ -1,19 +0,0 @@
|
||||
module Pages.Meet exposing (page)
|
||||
|
||||
import Components.Footer exposing (footerLinksToSide)
|
||||
import Html
|
||||
import Html.Attributes exposing (class, id)
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
page : View msg
|
||||
page =
|
||||
{ title = "Schedule a meet with me"
|
||||
, body =
|
||||
[ Html.div [ class "flex items-center justify-center flex-col h-screen m-2" ]
|
||||
[ Html.node "cal-com" [ id "calcom-widget", class "w-full p-2" ] []
|
||||
]
|
||||
, Html.div [ class "py-16" ] []
|
||||
, footerLinksToSide
|
||||
]
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
module Pages.NotFound_ exposing (page)
|
||||
|
||||
import Html exposing (Html)
|
||||
import Html.Attributes exposing (class, href)
|
||||
import Utils.Utils exposing (errorView)
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
page : View msg
|
||||
page =
|
||||
{ title = "Not Found"
|
||||
, body =
|
||||
[ Html.div [ class "min-h-screen flex flex-col justify-center relative overflow-hidden" ]
|
||||
[ Html.div [ class "relative w-full bg-neutral md:max-w-3xl md:mx-auto lg:max-w-4xl lg:pb-28 space-2" ]
|
||||
[ errorView "Couldn't find what you are looking for. Please check back later"
|
||||
, Html.a [ class "float-right bg-transparent mr-auto hover:bg-pink-600 text-cyan-500 hover:text-white rounded border py-2 px-4 border-cyan-500 mt-2", href "/" ] [ Html.text "Return to Home!" ]
|
||||
]
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -1,172 +0,0 @@
|
||||
module Pages.Pages.AboutMe exposing (Model, Msg, page)
|
||||
|
||||
import Components.Footer exposing (footerLinksToSide)
|
||||
import Effect exposing (Effect)
|
||||
import Html exposing (Html)
|
||||
import Html.Attributes exposing (class, datetime, href, src)
|
||||
import Http
|
||||
import Page exposing (Page)
|
||||
import Route exposing (Route)
|
||||
import Shared
|
||||
import Utils.JsonResume exposing (Education, Resume, Work, resumeDecoder)
|
||||
import Utils.Utils exposing (getFormattedDate)
|
||||
import View exposing (View)
|
||||
import Components.Footer exposing (iconLinkToCenter)
|
||||
|
||||
|
||||
page : Shared.Model -> Route () -> Page Model Msg
|
||||
page _ _ =
|
||||
Page.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, view = view
|
||||
, subscriptions = subscriptions
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- INIT
|
||||
|
||||
|
||||
type alias Model =
|
||||
{ resume : Maybe Resume
|
||||
, error : Maybe String
|
||||
}
|
||||
|
||||
|
||||
init : () -> ( Model, Effect Msg )
|
||||
init () =
|
||||
let
|
||||
cmd : Cmd Msg
|
||||
cmd =
|
||||
Http.get
|
||||
{ url = "/resume/resume.json"
|
||||
, expect = Http.expectJson GotResume resumeDecoder
|
||||
}
|
||||
in
|
||||
( { resume = Nothing, error = Nothing }, Effect.sendCmd cmd )
|
||||
|
||||
|
||||
|
||||
-- UPDATE
|
||||
|
||||
|
||||
type Msg
|
||||
= GotResume (Result Http.Error Resume)
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Effect Msg )
|
||||
update msg model =
|
||||
case msg of
|
||||
GotResume (Ok resume) ->
|
||||
( { model | resume = Just resume }, Effect.none )
|
||||
|
||||
GotResume (Err err) ->
|
||||
( { model | error = Just (Utils.Utils.errorToString err) }, Effect.none )
|
||||
|
||||
|
||||
|
||||
-- SUBSCRIPTIONS
|
||||
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions model =
|
||||
Sub.none
|
||||
|
||||
|
||||
|
||||
-- VIEW
|
||||
|
||||
|
||||
view : Model -> View msg
|
||||
view model =
|
||||
{ title = "About Me"
|
||||
, body =
|
||||
let
|
||||
experience : List Work -> Html msg
|
||||
experience workList =
|
||||
Html.ol [ class "relative border-l border-cyan-700" ]
|
||||
(List.map
|
||||
(\work ->
|
||||
Html.li [ class "mb-10 ml-6 " ]
|
||||
[ Html.span [ class "absolute flex items-center justify-center w-6 h-6 bg-pink-600 ring-pink-900 rounded-full -left-3 ring-8" ]
|
||||
[ Html.text <| String.left 1 work.name ]
|
||||
, Html.h3 [ class "flex items-center mb-1 text-xl font-semibold" ] [ Html.text <| work.position ++ " at " ++ work.name ]
|
||||
, Html.time [ class "block mb-2 text font-normal leading-none text-gray-500", datetime work.startDate ]
|
||||
[ Html.text <| getFormattedDate work.startDate False ++ " - " ++ getFormattedDate work.endDate False ]
|
||||
, Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text work.summary ]
|
||||
, Html.p [ class "mb-4 text-lg font-normal text-gray-300" ] [ Html.text work.description ]
|
||||
, Html.p [ class "mb-4 text-lg font-normal text-gray-300 ml-8" ] [ listThings work.highlights ]
|
||||
]
|
||||
)
|
||||
workList
|
||||
)
|
||||
|
||||
education : List Education -> Html msg
|
||||
education eduList =
|
||||
Html.ol [ class "relative border-l border-cyan-700" ]
|
||||
(List.map
|
||||
(\edu ->
|
||||
Html.li [ class "mb-10 ml-6" ]
|
||||
[ Html.span [ class "absolute flex items-center justify-center w-6 h-6 bg-pink-600 ring-pink-900 rounded-full -left-3 ring-8" ]
|
||||
[ Html.text <| String.left 1 edu.institution ]
|
||||
, Html.h3 [ class "flex items-center mb-1 text-xl font-semibold" ] [ Html.text <| edu.studyType ++ " at " ++ edu.institution ]
|
||||
, Html.time [ class "block mb-2 text font-normal leading-none text-gray-500", datetime edu.startDate ]
|
||||
[ Html.text <| getFormattedDate edu.startDate False ++ " - " ++ getFormattedDate edu.endDate False ]
|
||||
, Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text edu.area ]
|
||||
]
|
||||
)
|
||||
eduList
|
||||
)
|
||||
in
|
||||
case model.resume of
|
||||
Just resume ->
|
||||
[ Html.section []
|
||||
[ Html.div [ class "text-white" ]
|
||||
[ Html.div [ class "container mx-auto flex flex-col items-start xl:flex-row my-12 xl:my-24" ]
|
||||
[ Html.div [ class "flex flex-col w-full sticky xl:top-36 xl:w-2/3 mt-2 xl:mt-12 px-8" ]
|
||||
[ Html.img [ class "w-full h-80 object-cover mx-auto mb-4", src resume.basics.image ] []
|
||||
, Html.p [ class "text-5xl lg:text-6xl 2xl:text-7xl leading-normal md:leading-relaxed" ] [ Html.text resume.basics.name ]
|
||||
, Html.p [ class "lg:text-xl md:text-md text-base text-cyan-500 uppercase tracking-lppse mb-2" ] [ Html.text resume.basics.label ]
|
||||
, Html.p [ class "md:text-base text-gray-50 mb-4 lg:text-xl" ] [ Html.text resume.basics.summary ]
|
||||
, iconLinkToCenter
|
||||
]
|
||||
, Html.div [ class "flex-row" ]
|
||||
[ Html.div [ class "ml-0 md:ml-12 lg:w-3/3 sticky" ]
|
||||
[ Html.div [ class "container mx-auto w-full h-full" ]
|
||||
[ Html.div [ class "relative wrap overflow-hidden p-10 h-full" ]
|
||||
[ experience resume.work ]
|
||||
]
|
||||
]
|
||||
, Html.div [ class "ml-0 md:ml-12 lg:w-3/3 sticky" ]
|
||||
[ Html.div [ class "container mx-auto w-full h-full" ]
|
||||
[ Html.h2 [ class "text-xl ml-2 text-cyan-500" ] [ Html.text "Education" ]
|
||||
, Html.div [ class "relative wrap overflow-hidden p-10 h-full" ]
|
||||
[ education resume.education ]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
, footerLinksToSide
|
||||
]
|
||||
|
||||
Nothing ->
|
||||
[]
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- simply list things
|
||||
|
||||
|
||||
listThings : List String -> Html msg
|
||||
listThings things =
|
||||
Html.ul []
|
||||
(List.map
|
||||
(\thing ->
|
||||
Html.li [ class "list-disc" ] [ Html.text thing ]
|
||||
)
|
||||
things
|
||||
)
|
||||
@@ -1,95 +0,0 @@
|
||||
module Pages.Pages.Projects exposing (Model, Msg, page)
|
||||
|
||||
import Dict exposing (Dict)
|
||||
import Effect exposing (Effect)
|
||||
import Html exposing (div, img, section)
|
||||
import Html.Attributes exposing (class, src)
|
||||
import Page exposing (Page)
|
||||
import Route exposing (Route)
|
||||
import Route.Path
|
||||
import Shared
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
page : Shared.Model -> Route () -> Page Model Msg
|
||||
page _ _ =
|
||||
Page.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, subscriptions = subscriptions
|
||||
, view = view
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- INIT
|
||||
|
||||
|
||||
type alias Model =
|
||||
{}
|
||||
|
||||
|
||||
init : () -> ( Model, Effect Msg )
|
||||
init () =
|
||||
( {}
|
||||
, Effect.replaceRoute { path = Route.Path.NotFound_, query = Dict.empty, hash = Nothing }
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- UPDATE
|
||||
|
||||
|
||||
type Msg
|
||||
= ExampleMsgReplaceMe
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Effect Msg )
|
||||
update msg model =
|
||||
case msg of
|
||||
ExampleMsgReplaceMe ->
|
||||
( model
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- SUBSCRIPTIONS
|
||||
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions _ =
|
||||
Sub.none
|
||||
|
||||
|
||||
|
||||
-- VIEW
|
||||
|
||||
|
||||
view : Model -> View Msg
|
||||
view _ =
|
||||
{ title = "My Projects"
|
||||
, body =
|
||||
[ section [ class "overflow-hidden" ]
|
||||
[ div
|
||||
[ class "px-5 py-2 mx-auto lg:pt-24 lg:px-32" ]
|
||||
[ div [ class "flex flex-wrap -m-1 md:-m-2" ]
|
||||
(List.repeat 8
|
||||
(div [ class "flex flex-wrap w-1/2" ]
|
||||
(List.repeat 2
|
||||
(div
|
||||
[ class "w-full p-1 md:p-2" ]
|
||||
[ img
|
||||
[ src "https://opengraph.githubassets.com/string/avinal/blowfish"
|
||||
, class "block object-cover object-center w-full h-full rounded-lg"
|
||||
]
|
||||
[]
|
||||
]
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
]
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -1,212 +0,0 @@
|
||||
module Utils.Constants exposing (..)
|
||||
|
||||
import Array exposing (Array)
|
||||
import Html exposing (Html)
|
||||
|
||||
|
||||
type alias Link =
|
||||
{ url : String
|
||||
, text : String
|
||||
}
|
||||
|
||||
|
||||
type alias IconLink =
|
||||
{ url : String
|
||||
, icon : String
|
||||
}
|
||||
|
||||
|
||||
type alias Job msg =
|
||||
{ title : String
|
||||
, company : String
|
||||
, from : String
|
||||
, to : String
|
||||
, body : Html msg
|
||||
}
|
||||
|
||||
|
||||
footerLinks : List Link
|
||||
footerLinks =
|
||||
[ { text = "About", url = "/pages/about-me" }
|
||||
, { text = "Blog", url = "https://avinal.space/posts" }
|
||||
, { text = "Projects", url = "/pages/projects" }
|
||||
, { text = "GSoC", url = "https://avinal.space/posts/category/gsoc" }
|
||||
]
|
||||
|
||||
|
||||
iconLinks : List IconLink
|
||||
iconLinks =
|
||||
[ { url = "https://github.com/avinal", icon = "fa-brands fa-github" }
|
||||
, { url = "https://www.linkedin.com/in/avinal", icon = "fa-brands fa-linkedin" }
|
||||
, { url = "https://twitter.com/Avinal_", icon = "fa-brands fa-twitter" }
|
||||
, { url = "mailto:ripple@avinal.space", icon = "fa-solid fa-envelope" }
|
||||
, { url = "/meet", icon = "fa-solid fa-video" }
|
||||
]
|
||||
|
||||
|
||||
months : Array String
|
||||
months =
|
||||
Array.fromList
|
||||
[ "January"
|
||||
, "February"
|
||||
, "March"
|
||||
, "April"
|
||||
, "May"
|
||||
, "June"
|
||||
, "July"
|
||||
, "August"
|
||||
, "September"
|
||||
, "October"
|
||||
, "November"
|
||||
, "December"
|
||||
]
|
||||
|
||||
|
||||
nameMatrix : Array Int
|
||||
nameMatrix =
|
||||
Array.fromList
|
||||
[ 0
|
||||
, 1
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 1
|
||||
, 1
|
||||
, 1
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 1
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 1
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
, 1
|
||||
, 1
|
||||
, 1
|
||||
, 0
|
||||
, 1
|
||||
]
|
||||
@@ -1,435 +0,0 @@
|
||||
module Utils.JsonResume exposing (..)
|
||||
|
||||
import Json.Decode as Decode exposing (Decoder)
|
||||
import Json.Decode.Pipeline exposing (optional, required)
|
||||
|
||||
|
||||
|
||||
-- Main Resume type
|
||||
|
||||
|
||||
type alias Resume =
|
||||
{ basics : Basics
|
||||
, work : List Work
|
||||
, volunteer : List Volunteer
|
||||
, education : List Education
|
||||
, awards : List Award
|
||||
, certificates : List Certificate
|
||||
, publications : List Publication
|
||||
, skills : List Skill
|
||||
, languages : List Language
|
||||
, interests : List Interest
|
||||
, references : List Reference
|
||||
, projects : List Project
|
||||
, meta : Meta
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Basics
|
||||
|
||||
|
||||
type alias Basics =
|
||||
{ name : String
|
||||
, label : String
|
||||
, image : String
|
||||
, email : String
|
||||
, phone : String
|
||||
, url : String
|
||||
, summary : String
|
||||
, location : Location
|
||||
, profiles : List Profile
|
||||
}
|
||||
|
||||
|
||||
type alias Location =
|
||||
{ address : String
|
||||
, postalCode : String
|
||||
, city : String
|
||||
, countryCode : String
|
||||
, region : String
|
||||
}
|
||||
|
||||
|
||||
type alias Profile =
|
||||
{ network : String
|
||||
, username : String
|
||||
, url : String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Work
|
||||
|
||||
|
||||
type alias Work =
|
||||
{ name : String
|
||||
, location : String
|
||||
, description : String
|
||||
, position : String
|
||||
, url : String
|
||||
, startDate : String
|
||||
, endDate : String
|
||||
, summary : String
|
||||
, highlights : List String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Volunteer
|
||||
|
||||
|
||||
type alias Volunteer =
|
||||
{ organization : String
|
||||
, position : String
|
||||
, url : String
|
||||
, startDate : String
|
||||
, endDate : String
|
||||
, summary : String
|
||||
, highlights : List String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Education
|
||||
|
||||
|
||||
type alias Education =
|
||||
{ institution : String
|
||||
, url : String
|
||||
, area : String
|
||||
, studyType : String
|
||||
, startDate : String
|
||||
, endDate : String
|
||||
, score : String
|
||||
, courses : List String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Awards
|
||||
|
||||
|
||||
type alias Award =
|
||||
{ title : String
|
||||
, date : String
|
||||
, awarder : String
|
||||
, summary : String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Certificates
|
||||
|
||||
|
||||
type alias Certificate =
|
||||
{ name : String
|
||||
, date : String
|
||||
, url : String
|
||||
, issuer : String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Publications
|
||||
|
||||
|
||||
type alias Publication =
|
||||
{ name : String
|
||||
, publisher : String
|
||||
, releaseDate : String
|
||||
, url : String
|
||||
, summary : String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Skills
|
||||
|
||||
|
||||
type alias Skill =
|
||||
{ name : String
|
||||
, level : String
|
||||
, keywords : List String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Languages
|
||||
|
||||
|
||||
type alias Language =
|
||||
{ language : String
|
||||
, fluency : String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Interests
|
||||
|
||||
|
||||
type alias Interest =
|
||||
{ name : String
|
||||
, keywords : List String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- References
|
||||
|
||||
|
||||
type alias Reference =
|
||||
{ name : String
|
||||
, reference : String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Projects
|
||||
|
||||
|
||||
type alias Project =
|
||||
{ name : String
|
||||
, description : String
|
||||
, highlights : List String
|
||||
, keywords : List String
|
||||
, startDate : String
|
||||
, endDate : String
|
||||
, url : String
|
||||
, roles : List String
|
||||
, entity : String
|
||||
, type_ : String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- Meta
|
||||
|
||||
|
||||
type alias Meta =
|
||||
{ canonical : String
|
||||
, version : String
|
||||
, lastModified : String
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- JSON Decoders
|
||||
-- Resume Decoder
|
||||
|
||||
|
||||
resumeDecoder : Decoder Resume
|
||||
resumeDecoder =
|
||||
Decode.succeed Resume
|
||||
|> required "basics" basicsDecoder
|
||||
|> required "work" (Decode.list workDecoder)
|
||||
|> optional "volunteer" (Decode.list volunteerDecoder) []
|
||||
|> required "education" (Decode.list educationDecoder)
|
||||
|> optional "awards" (Decode.list awardDecoder) []
|
||||
|> optional "certificates" (Decode.list certificateDecoder) []
|
||||
|> optional "publications" (Decode.list publicationDecoder) []
|
||||
|> optional "skills" (Decode.list skillDecoder) []
|
||||
|> optional "languages" (Decode.list languageDecoder) []
|
||||
|> optional "interests" (Decode.list interestDecoder) []
|
||||
|> optional "references" (Decode.list referenceDecoder) []
|
||||
|> optional "projects" (Decode.list projectDecoder) []
|
||||
|> optional "meta" metaDecoder (Meta "" "" "")
|
||||
|
||||
|
||||
|
||||
-- Basics Decoder
|
||||
|
||||
|
||||
basicsDecoder : Decoder Basics
|
||||
basicsDecoder =
|
||||
Decode.succeed Basics
|
||||
|> required "name" Decode.string
|
||||
|> required "label" Decode.string
|
||||
|> optional "image" Decode.string ""
|
||||
|> required "email" Decode.string
|
||||
|> optional "phone" Decode.string ""
|
||||
|> required "url" Decode.string
|
||||
|> required "summary" Decode.string
|
||||
|> optional "location" locationDecoder (Location "" "" "" "" "")
|
||||
|> optional "profiles" (Decode.list profileDecoder) []
|
||||
|
||||
|
||||
locationDecoder : Decoder Location
|
||||
locationDecoder =
|
||||
Decode.succeed Location
|
||||
|> optional "address" Decode.string ""
|
||||
|> optional "postalCode" Decode.string ""
|
||||
|> required "city" Decode.string
|
||||
|> required "countryCode" Decode.string
|
||||
|> optional "region" Decode.string ""
|
||||
|
||||
|
||||
profileDecoder : Decoder Profile
|
||||
profileDecoder =
|
||||
Decode.succeed Profile
|
||||
|> required "network" Decode.string
|
||||
|> required "username" Decode.string
|
||||
|> required "url" Decode.string
|
||||
|
||||
|
||||
workDecoder : Decoder Work
|
||||
workDecoder =
|
||||
Decode.succeed Work
|
||||
|> required "name" Decode.string
|
||||
|> optional "location" Decode.string ""
|
||||
|> optional "description" Decode.string ""
|
||||
|> required "position" Decode.string
|
||||
|> optional "url" Decode.string ""
|
||||
|> required "startDate" Decode.string
|
||||
|> required "endDate" Decode.string
|
||||
|> required "summary" Decode.string
|
||||
|> optional "highlights" (Decode.list Decode.string) []
|
||||
|
||||
|
||||
|
||||
-- Volunteer Decoder
|
||||
|
||||
|
||||
volunteerDecoder : Decoder Volunteer
|
||||
volunteerDecoder =
|
||||
Decode.succeed Volunteer
|
||||
|> required "organization" Decode.string
|
||||
|> required "position" Decode.string
|
||||
|> required "url" Decode.string
|
||||
|> required "startDate" Decode.string
|
||||
|> required "endDate" Decode.string
|
||||
|> required "summary" Decode.string
|
||||
|> optional "highlights" (Decode.list Decode.string) []
|
||||
|
||||
|
||||
|
||||
-- Education Decoder
|
||||
|
||||
|
||||
educationDecoder : Decoder Education
|
||||
educationDecoder =
|
||||
Decode.succeed Education
|
||||
|> required "institution" Decode.string
|
||||
|> optional "url" Decode.string ""
|
||||
|> required "area" Decode.string
|
||||
|> required "studyType" Decode.string
|
||||
|> required "startDate" Decode.string
|
||||
|> required "endDate" Decode.string
|
||||
|> optional "score" Decode.string ""
|
||||
|> optional "courses" (Decode.list Decode.string) []
|
||||
|
||||
|
||||
|
||||
-- Award Decoder
|
||||
|
||||
|
||||
awardDecoder : Decoder Award
|
||||
awardDecoder =
|
||||
Decode.succeed Award
|
||||
|> required "title" Decode.string
|
||||
|> required "date" Decode.string
|
||||
|> required "awarder" Decode.string
|
||||
|> required "summary" Decode.string
|
||||
|
||||
|
||||
|
||||
-- Certificate Decoder
|
||||
|
||||
|
||||
certificateDecoder : Decoder Certificate
|
||||
certificateDecoder =
|
||||
Decode.succeed Certificate
|
||||
|> required "name" Decode.string
|
||||
|> required "date" Decode.string
|
||||
|> required "url" Decode.string
|
||||
|> required "issuer" Decode.string
|
||||
|
||||
|
||||
|
||||
-- Publication Decoder
|
||||
|
||||
|
||||
publicationDecoder : Decoder Publication
|
||||
publicationDecoder =
|
||||
Decode.succeed Publication
|
||||
|> required "name" Decode.string
|
||||
|> required "publisher" Decode.string
|
||||
|> required "releaseDate" Decode.string
|
||||
|> required "url" Decode.string
|
||||
|> required "summary" Decode.string
|
||||
|
||||
|
||||
|
||||
-- Skill Decoder
|
||||
|
||||
|
||||
skillDecoder : Decoder Skill
|
||||
skillDecoder =
|
||||
Decode.succeed Skill
|
||||
|> required "name" Decode.string
|
||||
|> optional "level" Decode.string ""
|
||||
|> optional "keywords" (Decode.list Decode.string) []
|
||||
|
||||
|
||||
|
||||
-- Language Decoder
|
||||
|
||||
|
||||
languageDecoder : Decoder Language
|
||||
languageDecoder =
|
||||
Decode.succeed Language
|
||||
|> required "language" Decode.string
|
||||
|> required "fluency" Decode.string
|
||||
|
||||
|
||||
|
||||
-- Interest Decoder
|
||||
|
||||
|
||||
interestDecoder : Decoder Interest
|
||||
interestDecoder =
|
||||
Decode.succeed Interest
|
||||
|> required "name" Decode.string
|
||||
|> required "keywords" (Decode.list Decode.string)
|
||||
|
||||
|
||||
|
||||
-- Reference Decoder
|
||||
|
||||
|
||||
referenceDecoder : Decoder Reference
|
||||
referenceDecoder =
|
||||
Decode.succeed Reference
|
||||
|> required "name" Decode.string
|
||||
|> required "reference" Decode.string
|
||||
|
||||
|
||||
|
||||
-- Project Decoder
|
||||
|
||||
|
||||
projectDecoder : Decoder Project
|
||||
projectDecoder =
|
||||
Decode.succeed Project
|
||||
|> required "name" Decode.string
|
||||
|> required "description" Decode.string
|
||||
|> optional "highlights" (Decode.list Decode.string) []
|
||||
|> optional "keywords" (Decode.list Decode.string) []
|
||||
|> required "startDate" Decode.string
|
||||
|> optional "endDate" Decode.string ""
|
||||
|> required "url" Decode.string
|
||||
|> optional "roles" (Decode.list Decode.string) []
|
||||
|> optional "entity" Decode.string ""
|
||||
|> optional "type_" Decode.string ""
|
||||
|
||||
|
||||
|
||||
-- Meta Decoder
|
||||
|
||||
|
||||
metaDecoder : Decoder Meta
|
||||
metaDecoder =
|
||||
Decode.succeed Meta
|
||||
|> required "canonical" Decode.string
|
||||
|> required "version" Decode.string
|
||||
|> required "lastModified" Decode.string
|
||||
@@ -1,154 +0,0 @@
|
||||
module Utils.Utils exposing (..)
|
||||
|
||||
import Array
|
||||
import Html exposing (Html)
|
||||
import Html.Attributes exposing (class, href, target)
|
||||
import Http exposing (Error(..))
|
||||
import Parser exposing (..)
|
||||
import Utils.Constants exposing (..)
|
||||
|
||||
|
||||
type alias DateTime =
|
||||
{ year : Int
|
||||
, month : Int
|
||||
, day : Int
|
||||
, hour : Int
|
||||
, minute : Int
|
||||
}
|
||||
|
||||
|
||||
getFormattedDate : String -> Bool -> String
|
||||
getFormattedDate dateString time =
|
||||
case Parser.run dateParser dateString of
|
||||
Ok date ->
|
||||
(Maybe.withDefault "Month" <| Array.get (date.month - 1) months)
|
||||
++ " "
|
||||
++ String.fromInt date.day
|
||||
++ ", "
|
||||
++ String.fromInt date.year
|
||||
++ (if time then
|
||||
", "
|
||||
++ String.fromInt date.hour
|
||||
++ ":"
|
||||
++ String.fromInt date.minute
|
||||
++ " IST"
|
||||
|
||||
else
|
||||
""
|
||||
)
|
||||
|
||||
Err _ ->
|
||||
if time then
|
||||
"Invalid date!!"
|
||||
|
||||
else
|
||||
"Today"
|
||||
|
||||
|
||||
dateParser : Parser DateTime
|
||||
dateParser =
|
||||
oneOf
|
||||
[ succeed Tuple.pair
|
||||
|= datePart
|
||||
|= optional timePart
|
||||
]
|
||||
|> map toDateTime
|
||||
|
||||
|
||||
datePart : Parser ( Int, Int, Int )
|
||||
datePart =
|
||||
succeed (\y m d -> ( y, m, d ))
|
||||
|= int
|
||||
|. token "-"
|
||||
|. chompWhile (\c -> c == '0')
|
||||
|= int
|
||||
|. token "-"
|
||||
|. chompWhile (\c -> c == '0')
|
||||
|= int
|
||||
|
||||
|
||||
timePart : Parser ( Int, Int )
|
||||
timePart =
|
||||
succeed (\h m -> ( h, m ))
|
||||
|. token "T"
|
||||
|. chompWhile (\c -> c == '0')
|
||||
|= int
|
||||
|. token ":"
|
||||
|. chompWhile (\c -> c == '0')
|
||||
|= int
|
||||
|. chompUntilEndOr "\n"
|
||||
|. end
|
||||
|
||||
|
||||
toDateTime : ( ( Int, Int, Int ), Maybe ( Int, Int ) ) -> DateTime
|
||||
toDateTime ( ( y, m, d ), maybeTime ) =
|
||||
case maybeTime of
|
||||
Just ( h, min ) ->
|
||||
DateTime y m d h min
|
||||
|
||||
Nothing ->
|
||||
DateTime y m d 0 0
|
||||
|
||||
|
||||
optional : Parser a -> Parser (Maybe a)
|
||||
optional parser =
|
||||
oneOf
|
||||
[ succeed Just |= parser
|
||||
, succeed Nothing
|
||||
]
|
||||
|
||||
|
||||
categoryNtags : String -> List String -> Html msg
|
||||
categoryNtags category tags =
|
||||
Html.span [ class "flex flex-wrap py-6 space-x-2" ]
|
||||
(Html.a [ class "px-3 py-1 m-1 rounded-sm hover:underline bg-pink-400 text-gray-900 font-bold", href <| "/posts/" ++ category, target "_blank" ]
|
||||
[ Html.text category
|
||||
]
|
||||
:: List.map
|
||||
(\tag ->
|
||||
Html.i [ class "px-3 py-1 m-1 rounded-sm hover:underline bg-cyan-500 text-gray-900" ]
|
||||
[ Html.text <| "#" ++ tag
|
||||
]
|
||||
)
|
||||
tags
|
||||
)
|
||||
|
||||
|
||||
contentUrl : { category : String, post : String } -> String
|
||||
contentUrl { category, post } =
|
||||
"/content/posts/" ++ category ++ "/" ++ post ++ ".md"
|
||||
|
||||
|
||||
errorToString : Http.Error -> String
|
||||
errorToString error =
|
||||
case error of
|
||||
BadUrl url ->
|
||||
"The URL " ++ url ++ " was invalid"
|
||||
|
||||
Timeout ->
|
||||
"Unable to reach the server, try again"
|
||||
|
||||
NetworkError ->
|
||||
"Unable to reach the server, check your network connection"
|
||||
|
||||
BadStatus 500 ->
|
||||
"The server had a problem, try again later"
|
||||
|
||||
BadStatus 400 ->
|
||||
"Verify your information and try again"
|
||||
|
||||
BadStatus _ ->
|
||||
"The content can't be found, please check your url"
|
||||
|
||||
BadBody errorMessage ->
|
||||
errorMessage
|
||||
|
||||
|
||||
errorView : String -> Html msg
|
||||
errorView error =
|
||||
Html.div
|
||||
[ class "border border-red-400 text-red-700 px-4 py-3 rounded relative" ]
|
||||
[ Html.strong [ class "text-red-400" ] [ Html.text "Something bad has happened!" ]
|
||||
, Html.br [] []
|
||||
, Html.text ("Error: " ++ error)
|
||||
]
|
||||
@@ -1,76 +0,0 @@
|
||||
module View exposing
|
||||
( View, map
|
||||
, none, fromString
|
||||
, toBrowserDocument
|
||||
)
|
||||
|
||||
{-|
|
||||
|
||||
@docs View, map
|
||||
@docs none, fromString
|
||||
@docs toBrowserDocument
|
||||
|
||||
-}
|
||||
|
||||
import Browser
|
||||
import Html exposing (Html)
|
||||
import Html.Attributes exposing (class)
|
||||
import Route exposing (Route)
|
||||
import Shared.Model
|
||||
|
||||
|
||||
type alias View msg =
|
||||
{ title : String
|
||||
, body : List (Html msg)
|
||||
}
|
||||
|
||||
|
||||
{-| Used internally by Elm Land to create your application
|
||||
so it works with Elm's expected `Browser.Document msg` type.
|
||||
-}
|
||||
toBrowserDocument :
|
||||
{ shared : Shared.Model.Model
|
||||
, route : Route ()
|
||||
, view : View msg
|
||||
}
|
||||
-> Browser.Document msg
|
||||
toBrowserDocument { view } =
|
||||
{ title = view.title ++ " | Avinal's personal website"
|
||||
, body =
|
||||
[ Html.main_ [ class "container mx-auto bg-neutral-800" ]
|
||||
view.body
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
{-| Used internally by Elm Land to connect your pages together.
|
||||
-}
|
||||
map : (msg1 -> msg2) -> View msg1 -> View msg2
|
||||
map fn view =
|
||||
{ title = view.title
|
||||
, body = List.map (Html.map fn) view.body
|
||||
}
|
||||
|
||||
|
||||
{-| Used internally by Elm Land whenever transitioning between
|
||||
authenticated pages.
|
||||
-}
|
||||
none : View msg
|
||||
none =
|
||||
{ title = "Avinal Kumar | Personal Website"
|
||||
, body = []
|
||||
}
|
||||
|
||||
|
||||
{-| If you customize the `View` module, anytime you run `elm-land add page`,
|
||||
the generated page will use this when adding your `view` function.
|
||||
|
||||
That way your app will compile after adding new pages, and you can see
|
||||
the new page working in the web browser!
|
||||
|
||||
-}
|
||||
fromString : String -> View msg
|
||||
fromString moduleName =
|
||||
{ title = moduleName
|
||||
, body = []
|
||||
}
|
||||
@@ -1,270 +0,0 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
/* PrismJS 1.29.0
|
||||
https://prismjs.com/download.html#themes=prism-okaidia&languages=markup+css+clike+javascript+bash+basic+brainfuck+c+cpp+cmake+diff+docker+elm+git+go+go-module+graphql+haskell+http+java+json+json5+jsonp+makefile+markdown+matlab+mermaid+powershell+protobuf+python+rest+rust+shell-session+sql+toml+typescript+vim+wasm+yaml&plugins=line-numbers+toolbar+match-braces+diff-highlight */
|
||||
code[class*=language-],
|
||||
pre[class*=language-] {
|
||||
color: #f8f8f2;
|
||||
background: 0 0;
|
||||
text-shadow: 0 1px rgba(0, 0, 0, .3);
|
||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||
font-size: 1em;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
word-wrap: normal;
|
||||
line-height: 1.5;
|
||||
-moz-tab-size: 4;
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
-webkit-hyphens: none;
|
||||
-moz-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none
|
||||
}
|
||||
|
||||
pre[class*=language-] {
|
||||
padding: 1em;
|
||||
margin: .5em 0;
|
||||
overflow: auto;
|
||||
border-radius: .3em
|
||||
}
|
||||
|
||||
:not(pre)>code[class*=language-],
|
||||
pre[class*=language-] {
|
||||
background: #0b0b0b
|
||||
}
|
||||
|
||||
:not(pre)>code[class*=language-] {
|
||||
padding: .1em;
|
||||
border-radius: .3em;
|
||||
white-space: normal
|
||||
}
|
||||
|
||||
.token.cdata,
|
||||
.token.comment,
|
||||
.token.doctype,
|
||||
.token.prolog {
|
||||
color: #8292a2
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
color: #f8f8f2
|
||||
}
|
||||
|
||||
.token.namespace {
|
||||
opacity: .7
|
||||
}
|
||||
|
||||
.token.constant,
|
||||
.token.deleted,
|
||||
.token.property,
|
||||
.token.symbol,
|
||||
.token.tag {
|
||||
color: #f92672
|
||||
}
|
||||
|
||||
.token.boolean,
|
||||
.token.number {
|
||||
color: #ae81ff
|
||||
}
|
||||
|
||||
.token.attr-name,
|
||||
.token.builtin,
|
||||
.token.char,
|
||||
.token.inserted,
|
||||
.token.selector,
|
||||
.token.string {
|
||||
color: #a6e22e
|
||||
}
|
||||
|
||||
.language-css .token.string,
|
||||
.style .token.string,
|
||||
.token.entity,
|
||||
.token.operator,
|
||||
.token.url,
|
||||
.token.variable {
|
||||
color: #f8f8f2
|
||||
}
|
||||
|
||||
.token.atrule,
|
||||
.token.attr-value,
|
||||
.token.class-name,
|
||||
.token.function {
|
||||
color: #e6db74
|
||||
}
|
||||
|
||||
.token.keyword {
|
||||
color: #66d9ef
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.regex {
|
||||
color: #fd971f
|
||||
}
|
||||
|
||||
.token.bold,
|
||||
.token.important {
|
||||
font-weight: 700
|
||||
}
|
||||
|
||||
.token.italic {
|
||||
font-style: italic
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
cursor: help
|
||||
}
|
||||
|
||||
pre[class*=language-].line-numbers {
|
||||
position: relative;
|
||||
padding-left: 3.8em;
|
||||
counter-reset: linenumber
|
||||
}
|
||||
|
||||
pre[class*=language-].line-numbers>code {
|
||||
position: relative;
|
||||
white-space: inherit
|
||||
}
|
||||
|
||||
.line-numbers .line-numbers-rows {
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
top: 0;
|
||||
font-size: 100%;
|
||||
left: -3.8em;
|
||||
width: 3em;
|
||||
letter-spacing: -1px;
|
||||
border-right: 1px solid #999;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none
|
||||
}
|
||||
|
||||
.line-numbers-rows>span {
|
||||
display: block;
|
||||
counter-increment: linenumber
|
||||
}
|
||||
|
||||
.line-numbers-rows>span:before {
|
||||
content: counter(linenumber);
|
||||
color: #999;
|
||||
display: block;
|
||||
padding-right: .8em;
|
||||
text-align: right
|
||||
}
|
||||
|
||||
div.code-toolbar {
|
||||
position: relative
|
||||
}
|
||||
|
||||
div.code-toolbar>.toolbar {
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
top: .3em;
|
||||
right: .2em;
|
||||
transition: opacity .3s ease-in-out;
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
div.code-toolbar:hover>.toolbar {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
div.code-toolbar:focus-within>.toolbar {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
div.code-toolbar>.toolbar>.toolbar-item {
|
||||
display: inline-block
|
||||
}
|
||||
|
||||
div.code-toolbar>.toolbar>.toolbar-item>a {
|
||||
cursor: pointer
|
||||
}
|
||||
|
||||
div.code-toolbar>.toolbar>.toolbar-item>button {
|
||||
background: 0 0;
|
||||
border: 0;
|
||||
color: inherit;
|
||||
font: inherit;
|
||||
line-height: normal;
|
||||
overflow: visible;
|
||||
padding: 0;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none
|
||||
}
|
||||
|
||||
div.code-toolbar>.toolbar>.toolbar-item>a,
|
||||
div.code-toolbar>.toolbar>.toolbar-item>button,
|
||||
div.code-toolbar>.toolbar>.toolbar-item>span {
|
||||
color: #bbb;
|
||||
font-size: .8em;
|
||||
padding: 0 .5em;
|
||||
background: #f5f2f0;
|
||||
background: rgba(224, 224, 224, .2);
|
||||
box-shadow: 0 2px 0 0 rgba(0, 0, 0, .2);
|
||||
border-radius: .5em
|
||||
}
|
||||
|
||||
div.code-toolbar>.toolbar>.toolbar-item>a:focus,
|
||||
div.code-toolbar>.toolbar>.toolbar-item>a:hover,
|
||||
div.code-toolbar>.toolbar>.toolbar-item>button:focus,
|
||||
div.code-toolbar>.toolbar>.toolbar-item>button:hover,
|
||||
div.code-toolbar>.toolbar>.toolbar-item>span:focus,
|
||||
div.code-toolbar>.toolbar>.toolbar-item>span:hover {
|
||||
color: inherit;
|
||||
text-decoration: none
|
||||
}
|
||||
|
||||
.token.punctuation.brace-hover,
|
||||
.token.punctuation.brace-selected {
|
||||
outline: solid 1px
|
||||
}
|
||||
|
||||
.rainbow-braces .token.punctuation.brace-level-1,
|
||||
.rainbow-braces .token.punctuation.brace-level-5,
|
||||
.rainbow-braces .token.punctuation.brace-level-9 {
|
||||
color: #e50;
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
.rainbow-braces .token.punctuation.brace-level-10,
|
||||
.rainbow-braces .token.punctuation.brace-level-2,
|
||||
.rainbow-braces .token.punctuation.brace-level-6 {
|
||||
color: #0b3;
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
.rainbow-braces .token.punctuation.brace-level-11,
|
||||
.rainbow-braces .token.punctuation.brace-level-3,
|
||||
.rainbow-braces .token.punctuation.brace-level-7 {
|
||||
color: #26f;
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
.rainbow-braces .token.punctuation.brace-level-12,
|
||||
.rainbow-braces .token.punctuation.brace-level-4,
|
||||
.rainbow-braces .token.punctuation.brace-level-8 {
|
||||
color: #e0e;
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
pre.diff-highlight>code .token.deleted:not(.prefix),
|
||||
pre>code.diff-highlight .token.deleted:not(.prefix) {
|
||||
background-color: rgba(255, 0, 0, .1);
|
||||
color: inherit;
|
||||
display: block
|
||||
}
|
||||
|
||||
pre.diff-highlight>code .token.inserted:not(.prefix),
|
||||
pre>code.diff-highlight .token.inserted:not(.prefix) {
|
||||
background-color: rgba(0, 255, 128, .1);
|
||||
color: inherit;
|
||||
display: block
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
import "./web-components/Calcom.js";
|
||||
|
||||
export const onReady = ({ app, env }) => { };
|
||||
@@ -1,55 +0,0 @@
|
||||
customElements.define(
|
||||
"cal-com",
|
||||
class extends HTMLElement {
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
(function (C, A, L) {
|
||||
let p = function (a, ar) {
|
||||
a.q.push(ar);
|
||||
};
|
||||
let d = C.document;
|
||||
C.Cal =
|
||||
C.Cal ||
|
||||
function () {
|
||||
let cal = C.Cal;
|
||||
let ar = arguments;
|
||||
if (!cal.loaded) {
|
||||
cal.ns = {};
|
||||
cal.q = cal.q || [];
|
||||
d.head.appendChild(d.createElement("script")).src = A;
|
||||
cal.loaded = true;
|
||||
}
|
||||
if (ar[0] === L) {
|
||||
const api = function () {
|
||||
p(api, arguments);
|
||||
};
|
||||
const namespace = ar[1];
|
||||
api.q = api.q || [];
|
||||
typeof namespace === "string"
|
||||
? (cal.ns[namespace] = api) && p(api, ar)
|
||||
: p(cal, ar);
|
||||
return;
|
||||
}
|
||||
p(cal, ar);
|
||||
};
|
||||
})(window, "https://app.cal.com/embed/embed.js", "init");
|
||||
Cal("init", { origin: "https://app.cal.com" });
|
||||
|
||||
Cal("inline", {
|
||||
elementOrSelector: "#calcom-widget",
|
||||
calLink: "avinal",
|
||||
});
|
||||
Cal("ui", {
|
||||
theme: "dark",
|
||||
styles: {
|
||||
branding: { brandColor: "#009fb1" },
|
||||
},
|
||||
hideEventTypeDetails: false,
|
||||
});
|
||||
console.log("These errors are not produced by the Elm app :)");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 938 KiB After Width: | Height: | Size: 938 KiB |
|
Before Width: | Height: | Size: 6.6 MiB After Width: | Height: | Size: 6.6 MiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 721 KiB After Width: | Height: | Size: 721 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 170 KiB After Width: | Height: | Size: 170 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 521 KiB After Width: | Height: | Size: 521 KiB |