Delete assets

This commit is contained in:
Akira Tempaku 2024-06-15 16:42:44 +09:00
parent ee637da21c
commit 1d5a6c1d8a
21 changed files with 16 additions and 423 deletions

View file

@ -1,15 +0,0 @@
install: ## Install dependencies
@qlot install
dev: ## Run dev mode
@tailwindcss -i ./public/global.css -o ./public/dist.css --watch=always < /dev/null &
stop: ## Stop dev mode
@pkill -f tailwind
build: ## Build
@tailwindcss -i ./public/global.css -o ./public/dist.css
help: ## Show options
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

View file

@ -1,8 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
html {
font-family: "Noto Sans JP", sans-serif;
font-optical-sizing: auto;
}

Binary file not shown.

Before

(image error) Size: 334 KiB

View file

@ -1,9 +0,0 @@
document.addEventListener('alpine:init', () => {
Alpine.store('darkMode', {
on: Alpine.$persist(false).as('darkMode'),
toggle() {
this.on = ! this.on
}
})
})

View file

@ -1 +0,0 @@
(()=>{function k(u,l,o){Y();let g,h,y,B,O,E,v,T,_,A;function V(e={}){let n=a=>a.getAttribute("key"),d=()=>{};O=e.updating||d,E=e.updated||d,v=e.removing||d,T=e.removed||d,_=e.adding||d,A=e.added||d,y=e.key||n,B=e.lookahead||!1}function D(e,n){if(W(e,n))return q(e,n);let d=!1;if(!b(O,e,n,()=>d=!0)){if(e.nodeType===1&&window.Alpine&&window.Alpine.cloneNode(e,n),X(n)){$(e,n),E(e,n);return}d||G(e,n),E(e,n),L(e,n)}}function W(e,n){return e.nodeType!=n.nodeType||e.nodeName!=n.nodeName||x(e)!=x(n)}function q(e,n){if(b(v,e))return;let d=n.cloneNode(!0);b(_,d)||(e.replaceWith(d),T(e),A(d))}function $(e,n){let d=n.nodeValue;e.nodeValue!==d&&(e.nodeValue=d)}function G(e,n){if(e._x_transitioning||e._x_isShown&&!n._x_isShown||!e._x_isShown&&n._x_isShown)return;let d=Array.from(e.attributes),a=Array.from(n.attributes);for(let i=d.length-1;i>=0;i--){let t=d[i].name;n.hasAttribute(t)||e.removeAttribute(t)}for(let i=a.length-1;i>=0;i--){let t=a[i].name,m=a[i].value;e.getAttribute(t)!==m&&e.setAttribute(t,m)}}function L(e,n){e._x_teleport&&(e=e._x_teleport),n._x_teleport&&(n=n._x_teleport);let d=H(e.children),a={},i=I(n),t=I(e);for(;i;){Z(i,t);let s=x(i),p=x(t);if(!t)if(s&&a[s]){let r=a[s];e.appendChild(r),t=r}else{if(!b(_,i)){let r=i.cloneNode(!0);e.appendChild(r),A(r)}i=c(n,i);continue}let C=r=>r&&r.nodeType===8&&r.textContent==="[if BLOCK]><![endif]",S=r=>r&&r.nodeType===8&&r.textContent==="[if ENDBLOCK]><![endif]";if(C(i)&&C(t)){let r=0,N=t;for(;t;){let f=c(e,t);if(C(f))r++;else if(S(f)&&r>0)r--;else if(S(f)&&r===0){t=f;break}t=f}let R=t;r=0;let j=i;for(;i;){let f=c(n,i);if(C(f))r++;else if(S(f)&&r>0)r--;else if(S(f)&&r===0){i=f;break}i=f}let z=i,J=new w(N,R),Q=new w(j,z);L(J,Q);continue}if(t.nodeType===1&&B&&!t.isEqualNode(i)){let r=c(n,i),N=!1;for(;!N&&r;)r.nodeType===1&&t.isEqualNode(r)&&(N=!0,t=K(e,i,t),p=x(t)),r=c(n,r)}if(s!==p){if(!s&&p){a[p]=t,t=K(e,i,t),a[p].remove(),t=c(e,t),i=c(n,i);continue}if(s&&!p&&d[s]&&(t.replaceWith(d[s]),t=d[s]),s&&p){let r=d[s];if(r)a[p]=t,t.replaceWith(r),t=r;else{a[p]=t,t=K(e,i,t),a[p].remove(),t=c(e,t),i=c(n,i);continue}}}let P=t&&c(e,t);D(t,i),i=i&&c(n,i),t=P}let m=[];for(;t;)b(v,t)||m.push(t),t=c(e,t);for(;m.length;){let s=m.shift();s.remove(),T(s)}}function x(e){return e&&e.nodeType===1&&y(e)}function H(e){let n={};for(let d of e){let a=x(d);a&&(n[a]=d)}return n}function K(e,n,d){if(!b(_,n)){let a=n.cloneNode(!0);return e.insertBefore(a,d),A(a),a}return n}return V(o),g=u,h=typeof l=="string"?U(l):l,window.Alpine&&window.Alpine.closestDataStack&&!u._x_dataStack&&(h._x_dataStack=window.Alpine.closestDataStack(u),h._x_dataStack&&window.Alpine.cloneNode(u,h)),D(u,h),g=void 0,h=void 0,u}k.step=()=>{};k.log=()=>{};function b(u,...l){let o=!1;return u(...l,()=>o=!0),o}var F=!1;function U(u){let l=document.createElement("template");return l.innerHTML=u,l.content.firstElementChild}function X(u){return u.nodeType===3||u.nodeType===8}var w=class{constructor(l,o){this.startComment=l,this.endComment=o}get children(){let l=[],o=this.startComment.nextSibling;for(;o&&o!==this.endComment;)l.push(o),o=o.nextSibling;return l}appendChild(l){this.endComment.before(l)}get firstChild(){let l=this.startComment.nextSibling;if(l!==this.endComment)return l}nextNode(l){let o=l.nextSibling;if(o!==this.endComment)return o}insertBefore(l,o){return o.before(l),l}};function I(u){return u.firstChild}function c(u,l){let o;return u instanceof w?o=u.nextNode(l):o=l.nextSibling,o}function Y(){if(F)return;F=!0;let u=Element.prototype.setAttribute,l=document.createElement("div");Element.prototype.setAttribute=function(g,h){if(!g.includes("@"))return u.call(this,g,h);l.innerHTML=`<span ${g}="${h}"></span>`;let y=l.firstElementChild.getAttributeNode(g);l.firstElementChild.removeAttributeNode(y),this.setAttributeNode(y)}}function Z(u,l){let o=l&&l._x_bindings&&l._x_bindings.id;o&&(u.setAttribute("id",o),u.id=o)}function M(u){u.morph=k}document.addEventListener("alpine:init",()=>{window.Alpine.plugin(M)});})();

View file

@ -1 +0,0 @@
(()=>{function d(t){let n=()=>{let r,a;try{a=localStorage}catch(i){console.error(i),console.warn("Alpine: $persist is using temporary storage since localStorage is unavailable.");let e=new Map;a={getItem:e.get.bind(e),setItem:e.set.bind(e)}}return t.interceptor((i,e,l,s,f)=>{let o=r||`_x_${s}`,u=g(o,a)?p(o,a):i;return l(u),t.effect(()=>{let c=e();m(o,c,a),l(c)}),u},i=>{i.as=e=>(r=e,i),i.using=e=>(a=e,i)})};Object.defineProperty(t,"$persist",{get:()=>n()}),t.magic("persist",n),t.persist=(r,{get:a,set:i},e=localStorage)=>{let l=g(r,e)?p(r,e):a();i(l),t.effect(()=>{let s=a();m(r,s,e),i(s)})}}function g(t,n){return n.getItem(t)!==null}function p(t,n){let r=n.getItem(t,n);if(r!==void 0)return JSON.parse(r)}function m(t,n,r){r.setItem(t,JSON.stringify(n))}document.addEventListener("alpine:init",()=>{window.Alpine.plugin(d)});})();

File diff suppressed because one or more lines are too long

View file

@ -1,16 +0,0 @@
htmx.defineExtension('alpine-morph', {
isInlineSwap: function (swapStyle) {
return swapStyle === 'morph';
},
handleSwap: function (swapStyle, target, fragment) {
if (swapStyle === 'morph') {
if (fragment.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
Alpine.morph(target, fragment.firstElementChild);
return [target];
} else {
Alpine.morph(target, fragment.outerHTML);
return [target];
}
}
}
});

View file

@ -1,141 +0,0 @@
//==========================================================
// head-support.js
//
// An extension to htmx 1.0 to add head tag merging.
//==========================================================
(function(){
var api = null;
function log() {
//console.log(arguments);
}
function mergeHead(newContent, defaultMergeStrategy) {
if (newContent && newContent.indexOf('<head') > -1) {
const htmlDoc = document.createElement("html");
// remove svgs to avoid conflicts
var contentWithSvgsRemoved = newContent.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim, '');
// extract head tag
var headTag = contentWithSvgsRemoved.match(/(<head(\s[^>]*>|>)([\s\S]*?)<\/head>)/im);
// if the head tag exists...
if (headTag) {
var added = []
var removed = []
var preserved = []
var nodesToAppend = []
htmlDoc.innerHTML = headTag;
var newHeadTag = htmlDoc.querySelector("head");
var currentHead = document.head;
if (newHeadTag == null) {
return;
} else {
// put all new head elements into a Map, by their outerHTML
var srcToNewHeadNodes = new Map();
for (const newHeadChild of newHeadTag.children) {
srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild);
}
}
// determine merge strategy
var mergeStrategy = api.getAttributeValue(newHeadTag, "hx-head") || defaultMergeStrategy;
// get the current head
for (const currentHeadElt of currentHead.children) {
// If the current head element is in the map
var inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML);
var isReAppended = currentHeadElt.getAttribute("hx-head") === "re-eval";
var isPreserved = api.getAttributeValue(currentHeadElt, "hx-preserve") === "true";
if (inNewContent || isPreserved) {
if (isReAppended) {
// remove the current version and let the new version replace it and re-execute
removed.push(currentHeadElt);
} else {
// this element already exists and should not be re-appended, so remove it from
// the new content map, preserving it in the DOM
srcToNewHeadNodes.delete(currentHeadElt.outerHTML);
preserved.push(currentHeadElt);
}
} else {
if (mergeStrategy === "append") {
// we are appending and this existing element is not new content
// so if and only if it is marked for re-append do we do anything
if (isReAppended) {
removed.push(currentHeadElt);
nodesToAppend.push(currentHeadElt);
}
} else {
// if this is a merge, we remove this content since it is not in the new head
if (api.triggerEvent(document.body, "htmx:removingHeadElement", {headElement: currentHeadElt}) !== false) {
removed.push(currentHeadElt);
}
}
}
}
// Push the tremaining new head elements in the Map into the
// nodes to append to the head tag
nodesToAppend.push(...srcToNewHeadNodes.values());
log("to append: ", nodesToAppend);
for (const newNode of nodesToAppend) {
log("adding: ", newNode);
var newElt = document.createRange().createContextualFragment(newNode.outerHTML);
log(newElt);
if (api.triggerEvent(document.body, "htmx:addingHeadElement", {headElement: newElt}) !== false) {
currentHead.appendChild(newElt);
added.push(newElt);
}
}
// remove all removed elements, after we have appended the new elements to avoid
// additional network requests for things like style sheets
for (const removedElement of removed) {
if (api.triggerEvent(document.body, "htmx:removingHeadElement", {headElement: removedElement}) !== false) {
currentHead.removeChild(removedElement);
}
}
api.triggerEvent(document.body, "htmx:afterHeadMerge", {added: added, kept: preserved, removed: removed});
}
}
}
htmx.defineExtension("head-support", {
init: function(apiRef) {
// store a reference to the internal API.
api = apiRef;
htmx.on('htmx:afterSwap', function(evt){
var serverResponse = evt.detail.xhr.response;
if (api.triggerEvent(document.body, "htmx:beforeHeadMerge", evt.detail)) {
mergeHead(serverResponse, evt.detail.boosted ? "merge" : "append");
}
})
htmx.on('htmx:historyRestore', function(evt){
if (api.triggerEvent(document.body, "htmx:beforeHeadMerge", evt.detail)) {
if (evt.detail.cacheMiss) {
mergeHead(evt.detail.serverResponse, "merge");
} else {
mergeHead(evt.detail.item.head, "merge");
}
}
})
htmx.on('htmx:historyItemCreated', function(evt){
var historyItem = evt.detail.item;
historyItem.head = document.head.outerHTML;
})
}
});
})()

File diff suppressed because one or more lines are too long

View file

@ -14,13 +14,9 @@
:port cfg:*port*))
(defun start ()
(if (cfg:dev-mode-p)
(uiop:run-program "make dev"))
(jg:start *app*))
(defun stop ()
(if (cfg:dev-mode-p)
(uiop:run-program "make stop"))
(jg:stop *app*))
(defun setup ()

View file

@ -1,41 +1,14 @@
(defpackage #:hp/components/document
(:use #:cl
#:hsx)
(:import-from #:hp/view/asset
#:defasset)
(:export #:document))
(in-package #:hp/components/document)
(defasset *htmx* :vendor "htmx@1.9.12.js")
(defasset *htmx-exts* :htmx-ext
("alpine-morph@1.9.12.js"
"head-support@1.9.12.js"))
(defasset *alpine* :vendor "alpine@3.13.8.js")
(defasset *alpine-exts* :alpine-ext
("morph@3.13.8.js"
"persist@3.13.8.js"))
(defasset *alpine-store* :root "store.js")
(defasset *global-css* :root "global.css")
(defasset *dist-css* :root "dist.css")
(defcomp document (&key title description children)
(hsx
(html :lang "ja"
(head
(meta :charset "UTF-8")
(script :src *htmx*)
(mapcar (lambda (path) (script :src path))
*htmx-exts*)
(mapcar (lambda (path) (script :src path :defer t))
*alpine-exts*)
(script :src *alpine-store* :defer t)
(script :src *alpine* :defer t)
(style
"@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&display=swap');")
(link :rel "stylesheet" :type "text/css" :href *global-css*)
(link :rel "stylesheet" :type "text/css" :href *dist-css*)
(title (format nil "~@[~a - ~]skyizwhite.dev" title))
(meta
:name "description"

View file

@ -1,51 +1,13 @@
(uiop:define-package #:hp/components/layout
(:use #:cl)
(:mix #:parenscript
#:paren6
(:use #:cl
#:hsx)
(:import-from #:hp/config/asset
#:*hx-ext*)
(:import-from #:hp/view/asset
#:defasset)
(:export #:layout))
(in-package #:hp/components/layout)
(defparameter *header-nav-items*
'((:href "/" :label "Home")
(:href "/about" :label "About")
(:href "/work" :label "Work")))
(defcomp header-nav-item (&key href label)
(hsx
(li
:class "px-4 rounded-full"
:|:class| (ps* `(and (is-current-path ,href)
"font-bold bg-indigo-200 pointer-events-none shadow-sm"))
(a :href href
label))))
(defcomp layout-header ()
(hsx
(header :class "px-10 py-6 flex justify-between"
(h1 :class "font-bold text-xl"
"skyizwhite.dev")
(nav
:x-data (ps (create6
(current-path (@ window location pathname))
(defun is-current-path (path)
(eql (@ this current-path) path))))
:hx-boost "true"
(ul :class "h-full flex items-center gap-6 text-lg"
(mapcar (lambda (item) (header-nav-item item))
*header-nav-items*))))))
(defcomp layout (&key children)
(hsx
(body
:hx-ext *hx-ext*
:class "h-[100svh] flex flex-col bg-neutral-200"
(layout-header)
(main :class "flex-1"
(header)
(main
children)
; footer
(footer))))

View file

@ -1,15 +0,0 @@
(defpackage #:hp/config/asset
(:use #:cl)
(:export #:*asset-roots*
#:*hx-ext*))
(in-package #:hp/config/asset)
(defparameter *asset-roots*
'(:root "/"
:img "/img/"
:vendor "/vendor/"
:htmx-ext "/vendor/htmx-ext/"
:alpine-ext "/vendor/alpine-ext/"))
(defparameter *hx-ext*
"head-support,alpine-morph")

View file

@ -1,22 +1,20 @@
(defpackage #:hp/view/responser
(defpackage #:hp/response
(:use #:cl)
(:import-from #:hsx
#:render)
(:import-from #:hsx)
(:local-nicknames (#:jg #:jingle))
(:local-nicknames (#:cfg #:hp/config/env))
(:local-nicknames (#:cmp #:hp/components/*))
(:export #:response
#:partial-response))
(in-package #:hp/view/responser)
(in-package #:hp/response)
(defun response (page &key status metadata)
(jg:with-html-response
(if status (jg:set-response-status status))
(render (cmp:document :metadata metadata
(cmp:layout page))
:minify t)))
(hsx:render-to-string (cmp:document :metadata metadata
(cmp:layout page)))))
(defun partial-response (component &key status)
(jg:with-html-response
(if status (jg:set-response-status status))
(render component :minify t)))
(hsx:render-to-string component)))

View file

@ -1,18 +0,0 @@
(defpackage #:hp/routes/about
(:use #:cl
#:hsx)
(:import-from #:hp/view/*
#:response)
(:export #:handle-get))
(in-package #:hp/routes/about)
(defcomp page ()
(hsx
(div :class "h-full place-content-center"
(h1
:class "text-4xl text-center"
"Coming soon..."))))
(defun handle-get (params)
(declare (ignore params))
(response (page)))

View file

@ -1,64 +1,13 @@
(uiop:define-package #:hp/routes/index
(:use #:cl)
(:mix #:parenscript
#:paren6
#:hsx)
(:import-from #:hp/view/*
#:defasset
#:response)
(:use #:cl
#:hsx
#:hp/response)
(:export #:handle-get))
(in-package #:hp/routes/index)
(defasset *me-img* :img "me.jpg")
(defcomp page ()
(hsx
(div :class "h-full place-content-center"
(div :class "flex justify-center gap-x-20"
(div :class "flex justify-end"
(img
:src *me-img*
:alt "avatar of paku"
:class "w-full max-w-xs rounded-xl shadow-sm"))
(div :class "flex flex-col justify-center gap-10"
(h1 :class "text-4xl font-bold"
"paku")
(p :class "text-xl"
"Web developer")
(ul
(li
(span "GitHub:")
(a
:target "_blank"
:href "https://github.com/skyizwhite"
:class "text-indigo-500"
"@skyizwhite"))
(li
(span "Email: ")
(a
:x-data (ps (create6
(email (chain (list6 "paku" "skyizwhite.dev")
(join "@")))))
:x-text (ps email)
:|:href| (ps (chain (list6 "mailto:" email) (join "")))
:|:class| "'text-indigo-500'"
"(Please enable Javascript to show.)"))
(li
(span "Fediverse(main): ")
(a
:rel "me"
:target "_blank"
:href "https://post.skyizwhite.dev/@paku"
:class "text-indigo-500"
"@paku@post.skyizwhite.dev"))
(li
(span "Fediverse(sub): ")
(a
:rel "me"
:target "_blank"
:href "https://himagine.club/@skyizwhite"
:class "text-indigo-500"
"@skyizwhite@himagine.club"))))))))
(h1 "Hello, World!")))
(defun handle-get (params)
(declare (ignore params))

View file

@ -1,8 +1,7 @@
(defpackage #:hp/routes/not-found
(:use #:cl
#:hsx)
(:import-from #:hp/view/responser
#:response)
#:hsx
#:hp/response)
(:export #:handle-not-found))
(in-package #:hp/routes/not-found)
@ -12,10 +11,7 @@
(defcomp page ()
(hsx
(div :class "h-full place-content-center"
(h1
:class "text-rose-400 text-4xl text-center"
"404 Not Found"))))
(h1 "404 Not Found")))
(defun handle-not-found ()
(response (page)

View file

@ -1,18 +0,0 @@
(defpackage #:hp/routes/work
(:use #:cl
#:hsx)
(:import-from #:hp/view/*
#:response)
(:export #:handle-get))
(in-package #:hp/routes/work)
(defcomp page ()
(hsx
(div :class "h-full place-content-center"
(h1
:class "text-4xl text-center"
"Coming soon..."))))
(defun handle-get (params)
(declare (ignore params))
(response (page)))

View file

@ -1,22 +0,0 @@
(defpackage #:hp/view/asset
(:use #:cl)
(:local-nicknames (#:re #:cl-ppcre))
(:local-nicknames (#:cfg #:hp/config/asset))
(:export #:asset-root
#:defasset))
(in-package #:hp/view/asset)
(defun asset-root (kind)
(getf cfg:*asset-roots* kind))
(defun asset-path (kind path)
(concatenate 'string (asset-root kind) path))
(defun asset-path-under (kind)
(lambda (path)
(asset-path kind path)))
(defmacro defasset (name kind files)
`(defparameter ,name
(,(if (listp files) 'mapcar 'funcall)
(asset-path-under ,kind) ',files)))

View file

@ -1,11 +0,0 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./src/routes/**/*.lisp",
"./src/components/**/*.lisp"
],
theme: {
extend: {},
},
plugins: [],
}