app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 16a7bee0a03a4f67c1178f290342c7d4602314d2
parent d1138a402022193a2381eb5e08701032f4104592
Author: triesap <triesap@radroots.dev>
Date:   Thu, 22 Jan 2026 16:09:17 +0000

app: port legacy static stylesheets

- copy refs/pwa static stylesheets into app/stylesheets
- import app-level sheets in app/app.css after theme css
- keep list component styles layered after global sheets
- preserve tailwind v4 @source directives for css scan

Diffstat:
Mapp/app.css | 4++++
Aapp/stylesheets/apps-base.css | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapp/stylesheets/apps-ui.css | 350+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapp/stylesheets/styles-maplibre-gl.css | 12++++++++++++
Aapp/stylesheets/styles-superellipse.css | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 495 insertions(+), 0 deletions(-)

diff --git a/app/app.css b/app/app.css @@ -4,6 +4,10 @@ @import "../crates/ui-tokens/assets/themes/layout.css"; @import "../crates/ui-tokens/assets/themes/screens.css"; @import "../crates/ui-tokens/assets/themes/theme_os.css"; +@import "./stylesheets/apps-base.css"; +@import "./stylesheets/apps-ui.css"; +@import "./stylesheets/styles-maplibre-gl.css"; +@import "./stylesheets/styles-superellipse.css"; @import "../crates/ui-components/assets/list.css"; @source "./index.html"; diff --git a/app/stylesheets/apps-base.css b/app/stylesheets/apps-base.css @@ -0,0 +1,70 @@ +:root { + background-color: #000000; +} + +html { + @apply select-none cursor-none; +} + +select:focus { + outline: none; +} + +button:focus { + outline: none; +} + +select { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + background: transparent; + background-image: none; +} + +select::-ms-expand { + display: none; +} + +div:focus { + outline: 4px solid transparent; +} + +.scroll-hide::-webkit-scrollbar { + display: none; +} + +.scroll-hide { + -ms-overflow-style: none; + scrollbar-width: none; +} + +@keyframes fade-in { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +.fade-in { + opacity: 0; + animation: fade-in 250ms ease-in-out forwards; +} + +.fade-in-long { + opacity: 0; + animation: fade-in 350ms ease-in-out forwards; +} + +.pre-wrap-text { + white-space: pre-wrap; +} + +.flex-fluid { + width: 100%; + height: 100%; + flex: 1 0 100%; +} diff --git a/app/stylesheets/apps-ui.css b/app/stylesheets/apps-ui.css @@ -0,0 +1,350 @@ +.carousel-container { + display: flex; + flex-grow: 1; + overflow-x: hidden; + scroll-snap-type: x mandatory; + list-style: none; + scroll-behavior: smooth; + -webkit-overflow-scrolling: touch; +} + +.carousel-item { + scroll-snap-align: start; +} + +@utility carousel-container-trellis { + @apply flex flex-grow h-full w-full; +} + +@utility carousel-item-trellis { + @apply flex flex-col w-fit px-4 gap-4 justify-start items-center; +} + +@utility button-base { + @apply flex flex-row justify-center items-center font-mono text-sm lowercase transition-all select-none cursor-none; +} + +@utility button-simple { + @apply button-base h-line_button w-fit bg-ly1 text-ly2-gl; +} + +@utility button-submit { + @apply button-base h-line_button min-w-[82px] w-fit rounded-2xl active:bg-ly1-a bg-ly1 text-ly2-gl; +} + +@utility entry-line-fluid { + @apply h-full w-full rounded-2xl; +} + +@utility entry-textarea-wrap { + @apply flex flex-row w-full items-center rounded-touch; +} + +@utility entry-line-wrap { + @apply flex flex-row w-full px-2 items-center; +} + +@utility el-textarea { + @apply w-full p-0 pl-2 py-3 rounded-touch; +} + +.el-textarea-ly1:focus { + border-color: hsl(var(--ly1-focus)); +} + +.el-textarea { + width: 100%; + height: max-content; + outline: none; + border-radius: 1rem; + text-wrap: wrap; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +@utility el-input { + @apply input w-full p-0; +} + +@utility el-input { + @apply flex flex-row w-full p-0 justify-center items-center border-0 focus:border-0 outline-0 focus:outline-0 bg-transparent disabled:bg-transparent font-sans font-[400] placeholder:font-[400] text-form_base; +} + +@utility el-select { + @apply flex flex-row w-full p-0 justify-center items-center border-0 focus:border-0 outline-0 focus:outline-0 bg-transparent disabled:bg-transparent font-sans font-[400] placeholder:font-[400] text-form_base; +} + +@utility el-textarea { + @apply flex flex-row w-full p-0 justify-center items-center border-0 focus:border-0 outline-0 focus:outline-0 bg-transparent disabled:bg-transparent font-sans font-[400] placeholder:font-[400] text-form_base; +} + +@utility el-select-centered { + @apply text-center [text-align-last:center]; +} + +@utility el-re { + @apply ease-in-out transition-all; +} + +@utility opacity-active { + @apply active:opacity-80 group-active:opacity-80; +} + +@utility ly1-apply-active { + @apply bg-ly1-focus; +} + +@utility ly1-ring-apply { + @apply ring-[0.3rem] ring-ly1-edge; +} + +@utility ly1-raise-apply { + @apply scale-[102%]; +} + +@utility ly1-raise-apply-less { + @apply scale-[101%]; +} + +@utility ly1-active-gl { + @apply active:text-ly1-gl-a group-active:text-ly1-gl-a; +} + +@utility ly1-active-surface { + @apply active:bg-ly1-focus group-active:bg-ly1-focus; +} + +@utility ly1-active-raise { + @apply active:scale-[102%] group-active:scale-[102%]; +} + +@utility ly1-active-raise-less { + @apply active:scale-[101%] group-active:scale-[101%]; +} + +@utility ly1-active-ring { + @apply ring-ly2/60 active:ring-[0.3rem] group-active:ring-[0.3rem] delay-[75ms] duration-[350ms]; +} + +@utility ly1-active-ring-less { + @apply ring-ly2/60 active:ring-[0.25rem] group-active:ring-[0.25rem] delay-[50ms] duration-[350ms]; +} + +@utility ly1-focus-surface { + @apply focus:bg-ly1-focus group-focus:bg-ly1-focus; +} + +@utility ly1-focus-raise { + @apply focus:scale-[102%] group-focus:scale-[102%]; +} + +@utility ly1-focus-raise-less { + @apply focus:scale-[101%] group-focus:scale-[101%]; +} + +@utility ly1-focus-ring { + @apply ring-ly2/60 focus:ring-[0.3rem] group-focus:ring-[0.3rem] delay-[75ms] duration-[350ms]; +} + +@utility ly1-focus-ring-less { + @apply ring-ly2/60 focus:ring-[0.25rem] group-focus:ring-[0.25rem] delay-[50ms] duration-[350ms]; +} + +@keyframes spinner-fade-white { + 0% { + background-color: white; + } + 100% { + background-color: transparent; + } +} + +@keyframes spinner-fade-base { + 0% { + background-color: hsl(var(--ly2-gl)); + } + 100% { + background-color: transparent; + } +} + +.spinner8 { + position: relative; + display: inline-block; + width: 1em; + height: 1em; +} + +.spinner8.center { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: auto; +} + +.spinner8 .spinner8-blade { + position: absolute; + left: 0.4629em; + bottom: 0; + width: 0.1em; + height: 0.2777em; + border-radius: 0.0555em; + background-color: transparent; + transform-origin: center -0.2222em; + animation: spinner-fade-base 1s infinite linear; +} + +.spinner8-white .spinner8-blade-white { + position: absolute; + left: 0.4629em; + bottom: 0; + width: 0.1em; + height: 0.2777em; + border-radius: 0.0555em; + background-color: transparent; + transform-origin: center -0.2222em; + animation: spinner-fade-white 1s infinite linear; +} + +.spinner8 .spinner8-blade:nth-child(1) { + animation-delay: 0s; + transform: rotate(0deg); +} + +.spinner8 .spinner8-blade:nth-child(2) { + animation-delay: 0.125s; + transform: rotate(45deg); +} + +.spinner8 .spinner8-blade:nth-child(3) { + animation-delay: 0.25s; + transform: rotate(90deg); +} + +.spinner8 .spinner8-blade:nth-child(4) { + animation-delay: 0.375s; + transform: rotate(135deg); +} + +.spinner8 .spinner8-blade:nth-child(5) { + animation-delay: 0.5s; + transform: rotate(180deg); +} + +.spinner8 .spinner8-blade:nth-child(6) { + animation-delay: 0.625s; + transform: rotate(225deg); +} + +.spinner8 .spinner8-blade:nth-child(7) { + animation-delay: 0.75s; + transform: rotate(270deg); +} + +.spinner8 .spinner8-blade:nth-child(8) { + animation-delay: 0.875s; + transform: rotate(315deg); +} + +.spinner12 { + position: relative; + display: inline-block; + width: 1em; + height: 1em; +} + +.spinner12.center { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: auto; +} + +.spinner12 .spinner12-blade { + position: absolute; + left: 0.4629em; + bottom: 0; + width: 0.074em; + height: 0.2777em; + border-radius: 0.0555em; + background-color: transparent; + transform-origin: center -0.2222em; + animation: spinner-fade-base 1s infinite linear; +} + +.spinner12-white .spinner12-blade-white { + position: absolute; + left: 0.4629em; + bottom: 0; + width: 0.074em; + height: 0.2777em; + border-radius: 0.0555em; + background-color: transparent; + transform-origin: center -0.2222em; + animation: spinner-fade-white 1s infinite linear; +} + +.spinner12 .spinner12-blade:nth-child(1) { + animation-delay: 0s; + transform: rotate(0deg); +} + +.spinner12 .spinner12-blade:nth-child(2) { + animation-delay: 0.083s; + transform: rotate(30deg); +} + +.spinner12 .spinner12-blade:nth-child(3) { + animation-delay: 0.166s; + transform: rotate(60deg); +} + +.spinner12 .spinner12-blade:nth-child(4) { + animation-delay: 0.249s; + transform: rotate(90deg); +} + +.spinner12 .spinner12-blade:nth-child(5) { + animation-delay: 0.332s; + transform: rotate(120deg); +} + +.spinner12 .spinner12-blade:nth-child(6) { + animation-delay: 0.415s; + transform: rotate(150deg); +} + +.spinner12 .spinner12-blade:nth-child(7) { + animation-delay: 0.498s; + transform: rotate(180deg); +} + +.spinner12 .spinner12-blade:nth-child(8) { + animation-delay: 0.581s; + transform: rotate(210deg); +} + +.spinner12 .spinner12-blade:nth-child(9) { + animation-delay: 0.664s; + transform: rotate(240deg); +} + +.spinner12 .spinner12-blade:nth-child(10) { + animation-delay: 0.747s; + transform: rotate(270deg); +} + +.spinner12 .spinner12-blade:nth-child(11) { + animation-delay: 0.83s; + transform: rotate(300deg); +} + +.spinner12 .spinner12-blade:nth-child(12) { + animation-delay: 0.913s; + transform: rotate(330deg); +} diff --git a/app/stylesheets/styles-maplibre-gl.css b/app/stylesheets/styles-maplibre-gl.css @@ -0,0 +1,12 @@ +.maplibregl-popup-tip { + display: none !important; +} + +.maplibregl-popup-content { + background: hsl(var(--ly1)) !important; + border-radius: 16px !important; + box-shadow: 0 4px 8px rgba(0,0,0,.2) !important; + padding: 0px !important; + transition: background-color 250ms ease-in-out !important; +} + diff --git a/app/stylesheets/styles-superellipse.css b/app/stylesheets/styles-superellipse.css @@ -0,0 +1,59 @@ +.round-8 { + mask-image: paint(squircle); + --squircle-smooth: 0.6; + --squircle-radius: 8px; +} + +.round-12 { + mask-image: paint(squircle); + --squircle-smooth: 0.6; + --squircle-radius: 12px; +} + +.round-16 { + mask-image: paint(squircle); + --squircle-smooth: 0.6; + --squircle-radius: 16px; +} + +.round-20 { + mask-image: paint(squircle); + --squircle-smooth: 0.6; + --squircle-radius: 20px; +} + +.round-24 { + mask-image: paint(squircle); + --squircle-smooth: 0.6; + --squircle-radius: 24px; +} + +.round-32 { + mask-image: paint(squircle); + --squircle-smooth: 0.6; + --squircle-radius: 32px; +} + +.round-36 { + mask-image: paint(squircle); + --squircle-smooth: 0.6; + --squircle-radius: 36px; +} + +.round-40 { + mask-image: paint(squircle); + --squircle-smooth: 0.6; + --squircle-radius: 40px; +} + +.round-44 { + mask-image: paint(squircle); + --squircle-smooth: 0.6; + --squircle-radius: 44px; +} + +.round-48 { + mask-image: paint(squircle); + --squircle-smooth: 0.6; + --squircle-radius: 48px; +}