diff --git a/deps.edn b/deps.edn index 3ac9784..7318d97 100644 --- a/deps.edn +++ b/deps.edn @@ -1,6 +1,14 @@ -{:aliases {:dev {:extra-paths ["development/src"] +{:paths ["development/src"] + :aliases {:dev {:extra-paths ["development/src" ] :extra-deps {org.clojure/clojure {:mvn/version "1.10.3"} - org.clojure/tools.deps.alpha {:mvn/version "0.12.1003"}}} + org.clojure/tools.deps.alpha {:mvn/version "0.12.1003"} + + ;; dev libraries + thheller/shadow-cljs {:mvn/version "2.25.2"} + refactor-nrepl/refactor-nrepl {:mvn/version "3.9.0"} + cider/cider-nrepl {:mvn/version "0.41.0"} + no.cjohansen/portfolio {:mvn/version "2023.07.15"} + djblue/portal {:mvn/version "0.48.0"}}} :test {:extra-paths []} diff --git a/development/resources/public/cljs-out/.keep b/development/resources/public/cljs-out/.keep new file mode 100644 index 0000000..e69de29 diff --git a/development/resources/public/css/styles.css b/development/resources/public/css/styles.css new file mode 100644 index 0000000..042e781 --- /dev/null +++ b/development/resources/public/css/styles.css @@ -0,0 +1,910 @@ +/* +! tailwindcss v3.3.5 | 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. 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-size: 1em; + /* 2 */ +} + +/* +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: ; +} + +@tailwind forms; + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.visible { + visibility: visible; +} + +.collapse { + visibility: collapse; +} + +.static { + position: static; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.clear-both { + clear: both; +} + +.m-2 { + margin: 0.5rem; +} + +.m-4 { + margin: 1rem; +} + +.m-8 { + margin: 2rem; +} + +.mb-12 { + margin-bottom: 3rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.ml-4 { + margin-left: 1rem; +} + +.ml-8 { + margin-left: 2rem; +} + +.mr-4 { + margin-right: 1rem; +} + +.mr-8 { + margin-right: 2rem; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.contents { + display: contents; +} + +.hidden { + display: none; +} + +.h-24 { + height: 6rem; +} + +.h-52 { + height: 13rem; +} + +.w-1\/2 { + width: 50%; +} + +.w-24 { + width: 6rem; +} + +.w-full { + width: 100%; +} + +.flex-shrink { + flex-shrink: 1; +} + +.flex-grow { + flex-grow: 1; +} + +.grow { + flex-grow: 1; +} + +.skew-x-12 { + --tw-skew-x: 12deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.\!transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important; +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.resize { + resize: both; +} + +.grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.flex-row { + flex-direction: row; +} + +.gap-8 { + gap: 2rem; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.border { + border-width: 1px; +} + +.border-t-4 { + border-top-width: 4px; +} + +.border-slate-900 { + --tw-border-opacity: 1; + border-color: rgb(15 23 42 / var(--tw-border-opacity)); +} + +.bg-slate-200 { + --tw-bg-opacity: 1; + background-color: rgb(226 232 240 / var(--tw-bg-opacity)); +} + +.bg-slate-400 { + --tw-bg-opacity: 1; + background-color: rgb(148 163 184 / var(--tw-bg-opacity)); +} + +.p-4 { + padding: 1rem; +} + +.p-8 { + padding: 2rem; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.align-middle { + vertical-align: middle; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.font-medium { + font-weight: 500; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.capitalize { + text-transform: capitalize; +} + +.ordinal { + --tw-ordinal: ordinal; + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); +} + +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + +.text-gray-900 { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.underline { + text-decoration-line: underline; +} + +.opacity-50 { + opacity: 0.5; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.ring { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.blur { + --tw-blur: blur(8px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.ease-in { + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); +} + +.ease-out { + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +@media (prefers-color-scheme: dark) { + .dark\:text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); + } + + .dark\:text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); + } +} + +@media (min-width: 640px) { + .sm\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .sm\:gap-6 { + gap: 1.5rem; + } +} diff --git a/development/resources/public/css/tailwind-styles.css b/development/resources/public/css/tailwind-styles.css new file mode 100644 index 0000000..596bbad --- /dev/null +++ b/development/resources/public/css/tailwind-styles.css @@ -0,0 +1,4 @@ +@tailwind base; +@tailwind forms; +@tailwind components; +@tailwind utilities; diff --git a/development/resources/public/img/dev-01.png b/development/resources/public/img/dev-01.png new file mode 100644 index 0000000..81fc9cd Binary files /dev/null and b/development/resources/public/img/dev-01.png differ diff --git a/development/resources/public/index.html b/development/resources/public/index.html new file mode 100644 index 0000000..a743e5e --- /dev/null +++ b/development/resources/public/index.html @@ -0,0 +1,31 @@ + + + + + Static Sites development + + + + + + + + + + + + + + + + + + + + +
+ + + + + diff --git a/development/src/design.cljs b/development/src/design.cljs new file mode 100644 index 0000000..642d4f1 --- /dev/null +++ b/development/src/design.cljs @@ -0,0 +1,153 @@ +(ns design + (:require [portfolio.ui :as ui] + [portfolio.dumdom :as d] + [portfolio.dom :as r])) + + +(defn left-bar [] + [:div.m-4.p-4.text-2xl + [:h1.mb-8 [:i.fa-solid.fa-gear.ml-4] "Oliver Marks - Software Engineer"] + [:p.m-8 "Example projects"]]) + +(defn right-bar [] + [:div + [:div.skew-x-12.bg-slate-400.m-4 + [:ul.flex [:li.m-2 "item 1"] [:li.m-2 "item 2"] [:li.m-2 "item 3"]]]]) + +(defn split-bar [] + [:div.w-full.p-8 + [:div.p-4.border-t-4.border-slate-900.w-full]]) + +(defn page-header [] + [:header.flex.mb-12 + (left-bar) + [:div.grow] + (right-bar)]) + + +(defn tile [{:keys [title direction image description]}] + [:div.rounded-lg.mb-8.h-52.w-full + [:img.rounded-lg.h-24.w-24.ml-4.mr-4 + {:src "https://img.theplantscape.com/api/image/missing.jpg?p=medium" + :align (if (= direction "right") "right" "left")}] + [:h3.text-xl title] + + [:p description]]) + +(defn skills-list [title skills] + [:div.mb-8 + [:h3.m-4.text-2xl title] + (into [:ul] + (mapv (fn skill-item [{:keys [direction icon skill]}] + (if (= direction "right") + [:li.m-2.text-xl [:span [:i.mr-4 {:class (str "devicon-" icon "-plain")}] skill]] + [:li.m-2.text-xl [:span skill [:i.ml-4 {:class (str "devicon-" icon "-plain")}]]])) + skills))]) + +(defn shaped-circle [direction w h] + (if (= direction "right") +[:div.clear-both.ml-8.opacity-50 {:style {:float "right" :right "0px" + :width (str w "px") :height (str h "px") + :background-color "#666666" + :border-radius (str w "px 0px 0px " w "px") + :shape-outside (str "circle(" w "px at " w "px " w "px)") }}] + [:div.clear-both.mr-8.opacity-50 {:style {:float "left" + :width (str w "px") :height (str h "px") + :background-color "#666666" + :border-radius (str "0px " w "px " w "px 0px") + :shape-outside (str "circle(" w "px at 0px " w "px)") }}]) + ) + +(defn dual-column-circle [] + [:section.w-full.flex {:style {:background-image "url(/img/dev-01.png)" + :background-repeat "no-repeat" + :background-position "center top" + :background-size "800px 800px"}} + [:div.align-middle.relative.text-right {:class "w-1/2" :style {:width "50%"}} + #_[:div.ml-8.opacity-50 {:style {:float "right" :right "0px" :width "200px" :height "400px" :background-color "#666666" + :border-radius "200px 0px 0px 200px" + :shape-outside "circle(200px at 200px 200px)"}}] + (shaped-circle "right" "150" "300") + (shaped-circle "right" "250" "500") + (skills-list "Operations" + [{:icon "googlecloud" :skill "Google Cloud"} + {:icon "digitalocean" :skill "Digitalocean"} + {:icon "docker" :skill "Docker"} + {:icon "kubernetes" :skill "Kubernetes"}]) + (tile {:title "GASP Air quality sensor" + :direction "right" + :image "https://img.theplantscape.com/api/image/missing.jpg?p=medium" + :description "Single page site, which display's data relayed via mqtt from a physical device."}) + (tile {:title "Image scaling & resizing" + :direction "right" + :image "https://img.theplantscape.com/api/image/missing.jpg?p=medium" + :description "API to upload image's and handle scaling to different sizes"}) + (tile {:title "Image scaling & resizing" + :direction "right" + + :image "https://img.theplantscape.com/api/image/missing.jpg?p=medium" + :description "API to upload image's and handle scaling to different sizes"}) + + ] + [:div.align-middle.relative.text-left {:class "w-1/2" :style {:width "50%"}} + (shaped-circle "left" "150" "300") + (shaped-circle "left" "250" "500") + + #_[:div.mr-8.opacity-50 {:style {:float "left" :width "200px" :height "400px" :background-color "#666666" + :border-radius "0px 200px 200px 0px" + :shape-outside "circle(220px at 0px 200px)"}}] + (skills-list + "Development" + [{:direction "right" :icon "clojure" :skill "Clojure"} + {:direction "right" :icon "javascript" :skill "Javascript"} + {:direction "right" :icon "python" :skill "Python"} + {:direction "right" :icon "c" :skill "C / Arduino"}]) + (tile {:title "GASP Air quality sensor" + :image "https://img.theplantscape.com/api/image/missing.jpg?p=medium" + :description "Single page site, which display's data relayed via mqtt from a physical device."}) + (tile {:title "theplantscape" + :image "https://img.theplantscape.com/api/image/missing.jpg?p=medium" + :description "Site for designing and planning gardens"})]]) + +(d/defscene circle + dual-column-circle + ) + +(defn footer-blocks [blocks] + (into [:div.m-8.grid.grid-cols-2.gap-8.sm:gap-6.sm:grid-cols-3] + (mapv (fn footer-block [{:keys [title children]}] + [:div [:h2.mb-6.text-sm.font-semibold.text-gray-900.uppercase.dark:text-white title] + (into [:ul.text-gray-500.dark:text-gray-400.font-medium] + (mapv (fn footer-link [{:keys [title link]}] + [:li.mb-4 [:a.hover:underline {:href link} title]]) children))]) + blocks))) + +(defn page-footer [] + [:section.m-8.flex.flex-row + [:img.rounded-full {:src "https://img.theplantscape.com/api/image/missing.jpg?p=medium"}] + (footer-blocks [{:title "Social / Contact Me" + :children [{:link "https://matrix.to/#/#theplantscape.com:matrix.org" :title "Chat"} + {:link "https://fo.llow.social/u/olymk2@mastodon.social" :title "Masterdon"}]}])]) + +(d/defscene header + page-header) + +(d/defscene footer + page-footer) + + +(d/defscene page + [:div.bg-slate-200 + [:div {:class "m-4/5"} + (page-header) + (dual-column-circle) + (split-bar) + (page-footer)]]) + + +(defn launch [] + (ui/start! + {:config {:css-paths ["/css/styles.css" + "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css" + "https://cdn.jsdelivr.net/gh/devicons/devicon@v2.15.1/devicon.min.css"]}})) + diff --git a/package.json b/package.json new file mode 100644 index 0000000..a44a0ab --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "static-sites", + "version": "1.0.0", + "description": "", + "main": "main.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "shadow-cljs": "^2.25.9", + "tailwindcss": "^3.3.3", + "webpack": "^5.88.2", + "webpack-cli": "^4.10.0" + }, + "dependencies": { + "@js-joda/core": "^3.2.0", + "@js-joda/locale_en-us": "^3.2.2", + "@js-joda/timezone": "^2.18.0", + "@sentry/browser": "^6.18.1", + "@sentry/react": "^6.19.7", + "@sentry/tracing": "^6.19.7", + "axe-core": "4.7.0", + "react": "^17.0.2", + "react-dom": "^17.0.2" + } +} diff --git a/readme.org b/readme.org new file mode 100644 index 0000000..3d24d42 --- /dev/null +++ b/readme.org @@ -0,0 +1,5 @@ +npx shadow-cljs server + +npx tailwindcss -i ./development/resources/public/css/tailwind-styles.css -o ./development/resources/public/css/styles.css --watch + +clj -Mshadow-cljs watch app diff --git a/shadow-cljs.edn b/shadow-cljs.edn new file mode 100644 index 0000000..9d43655 --- /dev/null +++ b/shadow-cljs.edn @@ -0,0 +1,21 @@ +{:deps {:aliases [:dev]} + :dev-http {8080 ["development/resources/public/" "classpath:public"]} + ;:nrepl {:middleware [refactor-nrepl.middleware/wrap-refactor]} + :nrepl {:middleware [refactor-nrepl.middleware/wrap-refactor]} + :source ["devlopment/src"] ;;"src" + ;; "../../components/web-ui/src" + ;; "../../components/web-api/src" + ;; "../../components/polyculture/src" + ;; "../../components/svg-generation/src" + ;; "../../components/local-store/src"] + :builds {:app {:output-dir "development/resources/public/cljs-out" + :asset-path "cljs-out" + :target :browser + :compiler-options {:infer-externs :auto :output-feature-set :es6} + :modules {:base {:entries [#_design]} + :portfolio {:init-fn design/launch + :depends-on #{:base}} + } + :devtools {:after-load app.main/reload!} + } + }} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..8794d31 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,18 @@ +module.exports = { + content: ['./development/resources/public/**/*.{html,js}'], + theme: { + extend: { + colors: { + 'tps-text': '#000000', + background: '#f7f7f7', + 'tps-background': '#f7f7f7', + 'tps-primary': '#7ebc72', + primary: '#7ebc72', + 'tps-secondary': '#e0e0e0', + secondary: '#e0e0e0', + 'tps-accent': '#7a7a7a', + }, + }, + }, + plugins: [], +}