moved website content to root

This commit is contained in:
2026-01-11 15:53:42 -07:00
parent 23f527b769
commit 4e10921fd8
40 changed files with 92 additions and 5 deletions
Binary file not shown.
Binary file not shown.
-10
View File
@@ -1,10 +0,0 @@
@layer component {
header,
footer {
background-color: var(--sidebar);
}
a.selected {
background-color: var(--sidebar-accent);
}
}
-42
View File
@@ -1,42 +0,0 @@
@theme inline {
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
}
:root {
--border-thin: 1px;
--border-medium: 2px;
}
@layer base {
header,
footer {
border-color: var(--sidebar-border);
}
header {
border-bottom-width: 1px
}
footer {
border-top-width: 1px;
}
select {
border-width: var(--border-medium);
border-color: var(--border);
border-radius: var(--radius-lg);
}
.border-thin {
border-width: var(--border-thin);
}
.border-medium {
border-width: var(--border-medium);
}
.border-button {
border-width: var(--border-medium);
border-radius: var(--radius-lg);
}
}
-76
View File
@@ -1,76 +0,0 @@
@layer components {
table {
display: block; /* fixes scrolling when in a flexbox */
border-collapse: collapse;
thead {
border-color: var(--table-border);
border-width: var(--border-thin) var(--border-thin) 0 var(--border-thin);
& > tr {
border-color: var(--table-body-border);
& > :is(th, td) {
border-color: var(--table-body-border);
background-color: var(--table-thead);
}
}
& + tbody {
border-top-width: var(--border-thin);
}
}
tbody {
border-color: var(--table-body-border) var(--table-border);
border-left-width: var(--border-thin);
border-right-width: var(--border-thin);
border-bottom-width: 0;
& > tr {
border-color: var(--table-border);
& > :is(th, td) {
border-color: var(--table-border);
background-color: var(--table-tbody);
}
}
&:has(+ tfoot) {
border-bottom-width: var(--border-thin);
}
}
tfoot {
border-color: var(--table-border);
border-width: 0 var(--border-thin) var(--border-thin) var(--border-thin);
& > tr {
border-color: var(--table-body-border);
& > :is(th, td) {
border-color: var(--table-body-border);
background-color: var(--table-tfoot);
}
}
}
th,
td {
padding: 0.5em;
}
tr {
border-width: 0 0 var(--border-thin) 0;
&:last-child {
border: none;
}
}
th, td {
border-width: 0 var(--border-thin) 0 0;
&:last-child {
border: none;
}
}
}
}
View File
View File
-665
View File
@@ -1,665 +0,0 @@
/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
@layer properties;
@layer theme, base, components, utilities;
@layer theme {
:root, :host {
--font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
"Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace;
--color-black: #000;
--color-white: #fff;
--text-lg: 1.125rem;
--text-lg--line-height: calc(1.75 / 1.125);
--text-xl: 1.25rem;
--text-xl--line-height: calc(1.75 / 1.25);
--text-3xl: 1.875rem;
--text-5xl: 3rem;
--text-8xl: 6rem;
--font-weight-semibold: 600;
--font-weight-bold: 700;
--radius-lg: var(--radius);
--default-font-family: var(--font-sans);
--default-mono-font-family: var(--font-mono);
--font-display: var(--display-family);
--font-text: var(--text-family);
}
}
@layer base {
*, ::after, ::before, ::backdrop, ::file-selector-button {
box-sizing: border-box;
margin: 0;
padding: 0;
border: 0 solid;
}
html, :host {
line-height: 1.5;
-webkit-text-size-adjust: 100%;
tab-size: 4;
font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
font-feature-settings: var(--default-font-feature-settings, normal);
font-variation-settings: var(--default-font-variation-settings, normal);
-webkit-tap-highlight-color: transparent;
}
hr {
height: 0;
color: inherit;
border-top-width: 1px;
}
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
h1, h2, h3, h4, h5, h6 {
font-size: inherit;
font-weight: inherit;
}
a {
color: inherit;
-webkit-text-decoration: inherit;
text-decoration: inherit;
}
b, strong {
font-weight: bolder;
}
code, kbd, samp, pre {
font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
font-feature-settings: var(--default-mono-font-feature-settings, normal);
font-variation-settings: var(--default-mono-font-variation-settings, normal);
font-size: 1em;
}
small {
font-size: 80%;
}
sub, sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
table {
text-indent: 0;
border-color: inherit;
border-collapse: collapse;
}
:-moz-focusring {
outline: auto;
}
progress {
vertical-align: baseline;
}
summary {
display: list-item;
}
ol, ul, menu {
list-style: none;
}
img, svg, video, canvas, audio, iframe, embed, object {
display: block;
vertical-align: middle;
}
img, video {
max-width: 100%;
height: auto;
}
button, input, select, optgroup, textarea, ::file-selector-button {
font: inherit;
font-feature-settings: inherit;
font-variation-settings: inherit;
letter-spacing: inherit;
color: inherit;
border-radius: 0;
background-color: transparent;
opacity: 1;
}
:where(select:is([multiple], [size])) optgroup {
font-weight: bolder;
}
:where(select:is([multiple], [size])) optgroup option {
padding-inline-start: 20px;
}
::file-selector-button {
margin-inline-end: 4px;
}
::placeholder {
opacity: 1;
}
@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
::placeholder {
color: currentcolor;
@supports (color: color-mix(in lab, red, red)) {
color: color-mix(in oklab, currentcolor 50%, transparent);
}
}
}
textarea {
resize: vertical;
}
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-date-and-time-value {
min-height: 1lh;
text-align: inherit;
}
::-webkit-datetime-edit {
display: inline-flex;
}
::-webkit-datetime-edit-fields-wrapper {
padding: 0;
}
::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
padding-block: 0;
}
::-webkit-calendar-picker-indicator {
line-height: 1;
}
:-moz-ui-invalid {
box-shadow: none;
}
button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button {
appearance: button;
}
::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
height: auto;
}
[hidden]:where(:not([hidden="until-found"])) {
display: none !important;
}
}
@layer utilities {
.mt-\[1em\] {
margin-top: 1em;
}
.mt-\[3em\] {
margin-top: 3em;
}
.mb-\[0\.5em\] {
margin-bottom: 0.5em;
}
.mb-\[1em\] {
margin-bottom: 1em;
}
.mb-\[3em\] {
margin-bottom: 3em;
}
.block {
display: block;
}
.flex {
display: flex;
}
.table {
display: table;
}
.min-h-full {
min-height: 100%;
}
.w-full {
width: 100%;
}
.max-w-\[50\%\] {
max-width: 50%;
}
.max-w-full {
max-width: 100%;
}
.min-w-fit {
min-width: fit-content;
}
.grow {
flex-grow: 1;
}
.basis-full {
flex-basis: 100%;
}
.cursor-pointer {
cursor: pointer;
}
.flex-col {
flex-direction: column;
}
.items-center {
align-items: center;
}
.items-stretch {
align-items: stretch;
}
.justify-center {
justify-content: center;
}
.gap-y-\[2em\] {
row-gap: 2em;
}
.overflow-x-auto {
overflow-x: auto;
}
.overflow-x-scroll {
overflow-x: scroll;
}
.overflow-y-hidden {
overflow-y: hidden;
}
.rounded-lg {
border-radius: var(--radius);
}
.rounded-sm {
border-radius: calc(var(--radius) - 4px);
}
.border-\[1px\] {
border-style: var(--tw-border-style);
border-width: 1px;
}
.border-sidebar-border {
border-color: var(--sidebar-border);
}
.bg-background {
background-color: var(--background);
}
.bg-card {
background-color: var(--card);
}
.p-\[0\.5em\] {
padding: 0.5em;
}
.p-\[1em\] {
padding: 1em;
}
.p-\[2em\] {
padding: 2em;
}
.pt-\[1em\] {
padding-top: 1em;
}
.pb-\[1em\] {
padding-bottom: 1em;
}
.text-center {
text-align: center;
}
.text-lg {
font-size: var(--text-lg);
line-height: var(--tw-leading, var(--text-lg--line-height));
}
.text-xl {
font-size: var(--text-xl);
line-height: var(--tw-leading, var(--text-xl--line-height));
}
.font-bold {
--tw-font-weight: var(--font-weight-bold);
font-weight: var(--font-weight-bold);
}
.font-semibold {
--tw-font-weight: var(--font-weight-semibold);
font-weight: var(--font-weight-semibold);
}
.text-nowrap {
text-wrap: nowrap;
}
.underline {
text-decoration-line: underline;
}
.hover\:bg-accent {
&:hover {
@media (hover: hover) {
background-color: var(--accent);
}
}
}
.hover\:underline {
&:hover {
@media (hover: hover) {
text-decoration-line: underline;
}
}
}
.disabled\:cursor-not-allowed {
&:disabled {
cursor: not-allowed;
}
}
.disabled\:bg-accent-secondary {
&:disabled {
background-color: var(--accent-secondary);
}
}
.disabled\:no-underline {
&:disabled {
text-decoration-line: none;
}
}
}
@layer base {
select {
padding: 0.5em;
}
}
@import url('https://fonts.googleapis.com/css2?family=Geist:wght@600&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Alexandria:wght@300&display=swap');
:root {
--display-family: "Geist", "sans-serif";
--display-weight: 600;
--text-family: "Alexandria", "sans-serif";
--text-weight: 300;
--base-50: oklch(0.9869 0.0042 280.57);
--base-100: oklch(0.9703 0.0084 281.74);
--base-200: oklch(0.9309 0.0168 282.31);
--base-300: oklch(0.8708 0.0252 283.4);
--base-400: oklch(0.7052 0.0378 286.14);
--base-500: oklch(0.5544 0.0504 286.81);
--base-600: oklch(0.4463 0.0483 286.39);
--base-700: oklch(0.3722 0.0441 286.47);
--base-800: oklch(0.2638 0.0399 288.01);
--base-900: oklch(0.2083 0.0347 289.9);
--base-950: oklch(0.1292 0.0315 290.68);
--base-1000: oklch(0.0781 0.0294 290.82);
--primary-50: oklch(0.9866 0.0288 120.05);
--primary-100: oklch(0.9676 0.0628 121.5);
--primary-200: oklch(0.9384 0.1189 123.4);
--primary-300: oklch(0.8719 0.1829 125.59);
--primary-400: oklch(0.8416 0.2214 127.63);
--primary-500: oklch(0.7692 0.2165 129.47);
--primary-600: oklch(0.6495 0.1859 130.24);
--primary-700: oklch(0.5331 0.1462 130.1);
--primary-800: oklch(0.4542 0.1157 129.41);
--primary-900: oklch(0.406 0.0943 129.43);
--primary-950: oklch(0.2748 0.0672 130.42);
--primary-1000: oklch(0.1896 0.0494 131.02);
--secondary-50: oklch(0.9792 0.0142 56.84);
--secondary-100: oklch(0.9531 0.0338 55.36);
--secondary-200: oklch(0.9004 0.0676 53.94);
--secondary-300: oklch(0.8362 0.114 51.61);
--secondary-400: oklch(0.7489 0.1635 49.36);
--secondary-500: oklch(0.7164 0.1906 47.14);
--secondary-600: oklch(0.6445 0.1986 44.75);
--secondary-700: oklch(0.5519 0.1744 42.09);
--secondary-800: oklch(0.4693 0.1405 40.02);
--secondary-900: oklch(0.4076 0.1102 38.89);
--secondary-950: oklch(0.2656 0.0708 38);
--secondary-1000: oklch(0.1738 0.0448 36.79);
--background: var(--base-50);
--foreground: var(--base-800);
--card: var(--color-white);
--card-foreground: var(--base-800);
--popover: var(--color-white);
--popover-foreground: var(--base-800);
--primary: var(--primary-300);
--primary-foreground: var(--color-black);
--secondary: var(--secondary-500);
--secondary-foreground: var(--color-black);
--muted: var(--base-100);
--muted-foreground: var(--base-600);
--accent: var(--base-100);
--accent-secondary: var(--base-300);
--accent-foreground: var(--base-800);
--destructive: oklch(0.577 0.245 27.325);
--border: var(--base-200);
--input: var(--base-300);
--ring: var(--primary-300);
--chart-1: var(--primary-300);
--chart-2: var(--secondary-500);
--chart-3: var(--primary-400);
--chart-4: var(--secondary-300);
--chart-5: var(--primary-300);
--radius: 0.5rem;
--sidebar: var(--color-white);
--sidebar-foreground: var(--base-800);
--sidebar-primary: var(--primary-300);
--sidebar-primary-foreground: var(--color-black);
--sidebar-accent: var(--base-50);
--sidebar-accent-foreground: var(--base-800);
--sidebar-border: var(--base-200);
--sidebar-ring: var(--primary-300);
--table-thead: var(--base-400);
--table-tbody: var(--base-200);
--table-tfoot: var(--base-400);
--table-border: var(--base-300);
--table-body-border: var(--base-500);
--table-inner-border: var(--base-300);
--display-color: var(--foreground);
--text-color: var(--foreground);
@media (prefers-color-scheme: dark) {
--background: var(--base-950);
--foreground: var(--base-200);
--card: var(--base-900);
--card-foreground: var(--base-200);
--popover: var(--base-900);
--popover-foreground: var(--base-200);
--primary: var(--primary-300);
--primary-foreground: var(--color-black);
--secondary: var(--secondary-500);
--secondary-foreground: var(--color-black);
--muted: var(--base-800);
--muted-foreground: var(--base-300);
--accent: var(--base-800);
--accent-secondary: var(--base-600);
--accent-foreground: var(--base-200);
--destructive: oklch(0.704 0.191 22.216);
--border: var(--base-800);
--input: var(--base-700);
--ring: var(--primary-300);
--chart-1: var(--primary-300);
--chart-2: var(--secondary-500);
--chart-3: var(--primary-400);
--chart-4: var(--secondary-300);
--chart-5: var(--primary-300);
--sidebar: var(--base-900);
--sidebar-foreground: var(--base-200);
--sidebar-primary: var(--primary-300);
--sidebar-primary-foreground: var(--color-black);
--sidebar-accent: var(--base-800);
--sidebar-accent-foreground: var(--base-200);
--sidebar-border: var(--base-800);
--sidebar-ring: var(--primary-300);
--table-thead: var(--base-600);
--table-tbody: var(--base-800);
--table-tfoot: var(--base-600);
--table-border: var(--base-700);
--table-body-border: var(--base-500);
--table-inner-border: var(--base-700);
}
}
@layer theme {
* {
color: var(--foreground);
}
}
.dark {
--background: var(--base-950);
--foreground: var(--base-200);
--card: var(--base-900);
--card-foreground: var(--base-200);
--popover: var(--base-900);
--popover-foreground: var(--base-200);
--primary: var(--primary-300);
--primary-foreground: var(--color-black);
--secondary: var(--secondary-500);
--secondary-foreground: var(--color-black);
--muted: var(--base-800);
--muted-foreground: var(--base-300);
--accent: var(--base-800);
--accent-secondary: var(--base-600);
--accent-foreground: var(--base-200);
--destructive: oklch(0.704 0.191 22.216);
--border: var(--base-800);
--input: var(--base-700);
--ring: var(--primary-300);
--chart-1: var(--primary-300);
--chart-2: var(--secondary-500);
--chart-3: var(--primary-400);
--chart-4: var(--secondary-300);
--chart-5: var(--primary-300);
--sidebar: var(--base-900);
--sidebar-foreground: var(--base-200);
--sidebar-primary: var(--primary-300);
--sidebar-primary-foreground: var(--color-black);
--sidebar-accent: var(--base-800);
--sidebar-accent-foreground: var(--base-200);
--sidebar-border: var(--base-800);
--sidebar-ring: var(--primary-300);
}
@layer base {
* {
font-family: var(--font-text);
font-weight: var(--text-weight);
}
h1, h2, h3, h4, h5, h6, label {
font-family: var(--font-display);
font-weight: var(--display-weight);
}
h1 {
font-size: var(--text-8xl);
}
h2 {
font-size: var(--text-5xl);
}
h3 {
font-size: var(--text-3xl);
}
h4 {
font-size: var(--text-xl);
}
h5 {
font-size: var(--text-lg);
}
h6 {
font-size: var(--text-md);
}
ul, ol {
list-style: none;
}
a:hover {
text-decoration: underline;
}
.font-display {
font-family: var(--font-display);
font-weight: var(--display-weight);
}
.font-text {
font-family: var(--font-text);
font-weight: var(--text-weight);
}
}
@layer component {
header, footer {
background-color: var(--sidebar);
}
a.selected {
background-color: var(--sidebar-accent);
}
}
:root {
--border-thin: 1px;
--border-medium: 2px;
}
@layer base {
header, footer {
border-color: var(--sidebar-border);
}
header {
border-bottom-width: 1px;
}
footer {
border-top-width: 1px;
}
select {
border-width: var(--border-medium);
border-color: var(--border);
border-radius: var(--radius-lg);
}
.border-thin {
border-width: var(--border-thin);
}
.border-medium {
border-width: var(--border-medium);
}
.border-button {
border-width: var(--border-medium);
border-radius: var(--radius-lg);
}
}
@layer components {
table {
display: block;
border-collapse: collapse;
thead {
border-color: var(--table-border);
border-width: var(--border-thin) var(--border-thin) 0 var(--border-thin);
& > tr {
border-color: var(--table-body-border);
& > :is(th, td) {
border-color: var(--table-body-border);
background-color: var(--table-thead);
}
}
& + tbody {
border-top-width: var(--border-thin);
}
}
tbody {
border-color: var(--table-body-border) var(--table-border);
border-left-width: var(--border-thin);
border-right-width: var(--border-thin);
border-bottom-width: 0;
& > tr {
border-color: var(--table-border);
& > :is(th, td) {
border-color: var(--table-border);
background-color: var(--table-tbody);
}
}
&:has(+ tfoot) {
border-bottom-width: var(--border-thin);
}
}
tfoot {
border-color: var(--table-border);
border-width: 0 var(--border-thin) var(--border-thin) var(--border-thin);
& > tr {
border-color: var(--table-body-border);
& > :is(th, td) {
border-color: var(--table-body-border);
background-color: var(--table-tfoot);
}
}
}
th, td {
padding: 0.5em;
}
tr {
border-width: 0 0 var(--border-thin) 0;
&:last-child {
border: none;
}
}
th, td {
border-width: 0 var(--border-thin) 0 0;
&:last-child {
border: none;
}
}
}
}
@property --tw-border-style {
syntax: "*";
inherits: false;
initial-value: solid;
}
@property --tw-font-weight {
syntax: "*";
inherits: false;
}
@layer properties {
@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
*, ::before, ::after, ::backdrop {
--tw-border-style: solid;
--tw-font-weight: initial;
}
}
}
View File
View File
-17
View File
@@ -1,17 +0,0 @@
@import "tailwindcss";
@import "./layout.css";
@import "./flexbox-and-grid.css";
@import "./spacing.css";
@import "./sizing.css";
@import "./typography.css";
@import "./backgrounds.css";
@import "./borders.css";
@import "./effects.css";
@import "./filters.css";
@import "./tables.css";
@import "./transitions-and-animations.css";
@import "./transforms.css";
@import "./interactivity.css";
@import "./svg.css";
@import "./accessibility.css";
@import "./components.css";
-5
View File
@@ -1,5 +0,0 @@
@layer base {
select {
padding: 0.5em;
}
}
View File
View File
-312
View File
@@ -1,312 +0,0 @@
@import url('https://fonts.googleapis.com/css2?family=Geist:wght@600&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Alexandria:wght@300&display=swap');
:root {
--display-family: "Geist", "sans-serif";
--display-weight: 600;
--text-family: "Alexandria", "sans-serif";
--text-weight: 300;
--base-50: oklch(0.9869 0.0042 280.57);
--base-100: oklch(0.9703 0.0084 281.74);
--base-200: oklch(0.9309 0.0168 282.31);
--base-300: oklch(0.8708 0.0252 283.4);
--base-400: oklch(0.7052 0.0378 286.14);
--base-500: oklch(0.5544 0.0504 286.81);
--base-600: oklch(0.4463 0.0483 286.39);
--base-700: oklch(0.3722 0.0441 286.47);
--base-800: oklch(0.2638 0.0399 288.01);
--base-900: oklch(0.2083 0.0347 289.9);
--base-950: oklch(0.1292 0.0315 290.68);
--base-1000: oklch(0.0781 0.0294 290.82);
--primary-50: oklch(0.9866 0.0288 120.05);
--primary-100: oklch(0.9676 0.0628 121.5);
--primary-200: oklch(0.9384 0.1189 123.4);
--primary-300: oklch(0.8719 0.1829 125.59);
--primary-400: oklch(0.8416 0.2214 127.63);
--primary-500: oklch(0.7692 0.2165 129.47);
--primary-600: oklch(0.6495 0.1859 130.24);
--primary-700: oklch(0.5331 0.1462 130.1);
--primary-800: oklch(0.4542 0.1157 129.41);
--primary-900: oklch(0.406 0.0943 129.43);
--primary-950: oklch(0.2748 0.0672 130.42);
--primary-1000: oklch(0.1896 0.0494 131.02);
--secondary-50: oklch(0.9792 0.0142 56.84);
--secondary-100: oklch(0.9531 0.0338 55.36);
--secondary-200: oklch(0.9004 0.0676 53.94);
--secondary-300: oklch(0.8362 0.114 51.61);
--secondary-400: oklch(0.7489 0.1635 49.36);
--secondary-500: oklch(0.7164 0.1906 47.14);
--secondary-600: oklch(0.6445 0.1986 44.75);
--secondary-700: oklch(0.5519 0.1744 42.09);
--secondary-800: oklch(0.4693 0.1405 40.02);
--secondary-900: oklch(0.4076 0.1102 38.89);
--secondary-950: oklch(0.2656 0.0708 38);
--secondary-1000: oklch(0.1738 0.0448 36.79);
--background: var(--base-50);
--foreground: var(--base-800);
--card: var(--color-white);
--card-foreground: var(--base-800);
--popover: var(--color-white);
--popover-foreground: var(--base-800);
--primary: var(--primary-300);
--primary-foreground: var(--color-black);
--secondary: var(--secondary-500);
--secondary-foreground: var(--color-black);
--muted: var(--base-100);
--muted-foreground: var(--base-600);
--accent: var(--base-100);
--accent-secondary: var(--base-300);
--accent-foreground: var(--base-800);
--destructive: oklch(0.577 0.245 27.325);
--border: var(--base-200);
--input: var(--base-300);
--ring: var(--primary-300);
--chart-1: var(--primary-300);
--chart-2: var(--secondary-500);
--chart-3: var(--primary-400);
--chart-4: var(--secondary-300);
--chart-5: var(--primary-300);
--radius: 0.5rem;
--sidebar: var(--color-white);
--sidebar-foreground: var(--base-800);
--sidebar-primary: var(--primary-300);
--sidebar-primary-foreground: var(--color-black);
--sidebar-accent: var(--base-50);
--sidebar-accent-foreground: var(--base-800);
--sidebar-border: var(--base-200);
--sidebar-ring: var(--primary-300);
--table-thead: var(--base-400);
--table-tbody: var(--base-200);
--table-tfoot: var(--base-400);
--table-border: var(--base-300);
--table-body-border: var(--base-500);
--table-inner-border: var(--base-300);
--display-color: var(--foreground);
--text-color: var(--foreground);
@media (prefers-color-scheme: dark) {
--background: var(--base-950);
--foreground: var(--base-200);
--card: var(--base-900);
--card-foreground: var(--base-200);
--popover: var(--base-900);
--popover-foreground: var(--base-200);
--primary: var(--primary-300);
--primary-foreground: var(--color-black);
--secondary: var(--secondary-500);
--secondary-foreground: var(--color-black);
--muted: var(--base-800);
--muted-foreground: var(--base-300);
--accent: var(--base-800);
--accent-secondary: var(--base-600);
--accent-foreground: var(--base-200);
--destructive: oklch(0.704 0.191 22.216);
--border: var(--base-800);
--input: var(--base-700);
--ring: var(--primary-300);
--chart-1: var(--primary-300);
--chart-2: var(--secondary-500);
--chart-3: var(--primary-400);
--chart-4: var(--secondary-300);
--chart-5: var(--primary-300);
--sidebar: var(--base-900);
--sidebar-foreground: var(--base-200);
--sidebar-primary: var(--primary-300);
--sidebar-primary-foreground: var(--color-black);
--sidebar-accent: var(--base-800);
--sidebar-accent-foreground: var(--base-200);
--sidebar-border: var(--base-800);
--sidebar-ring: var(--primary-300);
--table-thead: var(--base-600);
--table-tbody: var(--base-800);
--table-tfoot: var(--base-600);
--table-border: var(--base-700);
--table-body-border: var(--base-500);
--table-inner-border: var(--base-700);
}
}
@layer theme {
* {
color: var(--foreground);
}
}
.dark {
--background: var(--base-950);
--foreground: var(--base-200);
--card: var(--base-900);
--card-foreground: var(--base-200);
--popover: var(--base-900);
--popover-foreground: var(--base-200);
--primary: var(--primary-300);
--primary-foreground: var(--color-black);
--secondary: var(--secondary-500);
--secondary-foreground: var(--color-black);
--muted: var(--base-800);
--muted-foreground: var(--base-300);
--accent: var(--base-800);
--accent-secondary: var(--base-600);
--accent-foreground: var(--base-200);
--destructive: oklch(0.704 0.191 22.216);
--border: var(--base-800);
--input: var(--base-700);
--ring: var(--primary-300);
--chart-1: var(--primary-300);
--chart-2: var(--secondary-500);
--chart-3: var(--primary-400);
--chart-4: var(--secondary-300);
--chart-5: var(--primary-300);
--sidebar: var(--base-900);
--sidebar-foreground: var(--base-200);
--sidebar-primary: var(--primary-300);
--sidebar-primary-foreground: var(--color-black);
--sidebar-accent: var(--base-800);
--sidebar-accent-foreground: var(--base-200);
--sidebar-border: var(--base-800);
--sidebar-ring: var(--primary-300);
}
@theme inline {
--font-display: var(--display-family);
--font-text: var(--text-family);
--color-base-50: var(--base-50);
--color-base-100: var(--base-100);
--color-base-200: var(--base-200);
--color-base-300: var(--base-300);
--color-base-400: var(--base-400);
--color-base-500: var(--base-500);
--color-base-600: var(--base-600);
--color-base-700: var(--base-700);
--color-base-800: var(--base-800);
--color-base-900: var(--base-900);
--color-base-950: var(--base-950);
--color-base-1000: var(--base-1000);
--color-primary-50: var(--primary-50);
--color-primary-100: var(--primary-100);
--color-primary-200: var(--primary-200);
--color-primary-300: var(--primary-300);
--color-primary-400: var(--primary-400);
--color-primary-500: var(--primary-500);
--color-primary-600: var(--primary-600);
--color-primary-700: var(--primary-700);
--color-primary-800: var(--primary-800);
--color-primary-900: var(--primary-900);
--color-primary-950: var(--primary-950);
--color-primary-1000: var(--primary-1000);
--color-secondary-50: var(--secondary-50);
--color-secondary-100: var(--secondary-100);
--color-secondary-200: var(--secondary-200);
--color-secondary-300: var(--secondary-300);
--color-secondary-400: var(--secondary-400);
--color-secondary-500: var(--secondary-500);
--color-secondary-600: var(--secondary-600);
--color-secondary-700: var(--secondary-700);
--color-secondary-800: var(--secondary-800);
--color-secondary-900: var(--secondary-900);
--color-secondary-950: var(--secondary-950);
--color-secondary-1000: var(--secondary-1000);
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-sidebar-ring: var(--sidebar-ring);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar: var(--sidebar);
--color-chart-5: var(--chart-5);
--color-chart-4: var(--chart-4);
--color-chart-3: var(--chart-3);
--color-chart-2: var(--chart-2);
--color-chart-1: var(--chart-1);
--color-ring: var(--ring);
--color-input: var(--input);
--color-border: var(--border);
--color-destructive: var(--destructive);
--color-accent-foreground: var(--accent-foreground);
--color-accent-secondary: var(--accent-secondary);
--color-accent: var(--accent);
--color-muted-foreground: var(--muted-foreground);
--color-muted: var(--muted);
--color-secondary-foreground: var(--secondary-foreground);
--color-secondary: var(--secondary);
--color-primary-foreground: var(--primary-foreground);
--color-primary: var(--primary);
--color-popover-foreground: var(--popover-foreground);
--color-popover: var(--popover);
--color-card-foreground: var(--card-foreground);
--color-card: var(--card);
}
@layer base {
* {
font-family: var(--font-text);
font-weight: var(--text-weight);
}
h1,
h2,
h3,
h4,
h5,
h6,
label {
font-family: var(--font-display);
font-weight: var(--display-weight);
}
h1 {
font-size: var(--text-8xl);
}
h2 {
font-size: var(--text-5xl);
}
h3 {
font-size: var(--text-3xl);
}
h4 {
font-size: var(--text-xl);
}
h5 {
font-size: var(--text-lg);
}
h6 {
font-size: var(--text-md);
}
ul, ol {
list-style: none;
}
a:hover {
text-decoration: underline;
}
select {
}
.font-display {
font-family: var(--font-display);
font-weight: var(--display-weight);
}
.font-text {
font-family: var(--font-text);
font-weight: var(--text-weight);
}
}
+3 -2
View File
@@ -18,7 +18,7 @@ import (
// GET /
// compiles the page template or component template matching the url
func (s *Server) serveTemplates(r *http.Request) (response.Response, error) {
name, args := s.getTemplateNameAndArgs(r, "internal/site/templates/component_bodies")
name, args := s.getTemplateNameAndArgs(r, s.contentDir+"/templates/component_bodies")
b, err := s.templater.ExecuteComponentBody(name, args...)
if err == nil {
@@ -29,7 +29,7 @@ func (s *Server) serveTemplates(r *http.Request) (response.Response, error) {
return s.handleTemplateError(err, args...)
}
name, args = s.getTemplateNameAndArgs(r, "internal/site/templates/page_bodies")
name, args = s.getTemplateNameAndArgs(r, s.contentDir+"/templates/page_bodies")
if b, err = s.templater.ExecutePage(name, args...); err == nil {
return response.HTML(b), nil
@@ -79,6 +79,7 @@ func (s *Server) getTemplateNameAndArgs(r *http.Request, templateDir string) (na
// getComponentTemplateNameForURL eliminate any trailing .html or /, and checks for any
// file with path parameters in the name, eg '{abc}.html.tmpl', prefering exact filename matches.
func getTemplateNameForURL(u *url.URL, templateDir string) (name string, params map[string]string) {
templateDir = path.Clean(templateDir)
fp := strings.TrimPrefix(strings.TrimSuffix(strings.TrimSuffix(u.Path, ".html"), "/"), "/")
if fp == "" {
// "/" maps to "/index"
@@ -1,126 +0,0 @@
{{/* TODO: make the save button disabled based on an api call */}}
{{/* .Identity.Account.AccountID, .Accounts */}}
{{- $dot := or .dot . -}}
{{- $acctID := $dot.Identity.Account.AccountID }}
{{- $orderIndex := or $dot.OrderIndex (parseInt $dot.PathParams.orderIndex) -}}
{{- $entry := $dot.Accounts.GetSyncGroupListingDraft $acctID $orderIndex }}
{{- $selectedShopPlatform := $entry.Platform }}
{{- $selectedShopID := $entry.ShopID }}
{{- $selectedListingID := $entry.ListingID }}
<tr _="
init
set @data-filled-out to false
def setFilledOut(val)
set @data-filled-out to val
send rowUpdated() to closest <tbody/>
end
on setListing(listing)
call setFilledOut(true)
on resetListing
call setFilledOut(false)
"
>
<td>
{{- $shops := $dot.Accounts.GetShops $acctID -}}
<select
class="min-w-fit cursor-pointer"
hx-put="/accounts/{{$acctID}}/inventory/sync-groups/draft/listings/{{$orderIndex}}/shop"
hx-vals='js:{
platform: event.target.value.replace(/-[^ ]*/, ""),
"shop-id": event.target.value.replace(/[^ ]*-/, "")
}'
hx-target="closest tr"
hx-swap="outerHTML"
_="
on change
send resetListing() to closest <tr/>
"
>
<option disabled {{- if not $selectedShopID }}selected{{- end }}>- Shops -</option>
{{- range $shop := $shops }}
{{- $isSelectedShop := and
(eq $selectedShopPlatform $shop.Platform)
(eq $selectedShopID $shop.ShopID)
}}
<option
value="{{$shop.Platform}}-{{$shop.ShopID}}"
{{- if $isSelectedShop }}selected{{- end }}
>
{{ $shop.Name }} - {{$shop.Platform}} - {{$shop.ShopID}}
</option>
{{- end }}
</select>
</td>
<td>
{{- $selectedListing := "" }}
{{- if $selectedShopID }}
{{- $listings := $dot.Accounts.GetListingsForShop $acctID $selectedShopPlatform $selectedShopID }}
{{- if $listings }}
<select
class="min-w-fit cursor-pointer"
hx-put="/accounts/{{$acctID}}/inventory/sync-groups/draft/listings/{{$orderIndex}}/listing"
hx-vals='js:{
"listing-id": event.target.value,
}'
hx-target="closest tr"
hx-swap="outerHTML"
_="
on input
set dataset to (my selectedOptions)[0].dataset
send setListing(listing: dataset) to the closest <tr/>
"
>
<option disabled {{if not $selectedListingID}}selected{{end}}>- Listings -</option>
{{- range $i, $listing := $listings }}
{{- if eq $selectedListingID $listing.ListingID }}
{{ $selectedListing = $listing }}
{{- end }}
<option
value="{{$listing.ListingID}}"
{{if eq $selectedListingID $listing.ListingID}}selected{{end}}
data-name="{{ $listing.Name }}"
data-sku="{{ $listing.SKU }}"
data-description="{{ $listing.Description }}"
data-count="{{ $listing.Count }}"
>
{{ $listing.Name }}
</option>
{{- end }}
</select>
{{- else }}
no listings found
{{- end }}
{{- else }}
-
{{- end }}
</td>
<td data-id="sku">
{{if $selectedListing}}{{$selectedListing.SKU}}{{else}}-{{end}}
</td>
<td data-id="description">
{{if $selectedListing}}{{$selectedListing.Description}}{{else}}-{{end}}
</td>
<td data-id="remove">
{{ componentBody "button-dev"
"HXDelete" (printf "/accounts/%d/inventory/sync-groups/draft/listings/%d" $acctID $orderIndex)
"HXTarget" "closest tr"
"HXSwap" "outerHTML"
"Text" "Remove"
}}
</td>
</tr>
@@ -1,88 +0,0 @@
{{- $dot := or .dot . }}
{{- .Auth.ByMatchingAccountID 2 }}
{{- $acctID := 0 }}
{{- if $dot.Identity }}
{{- $acctID = $dot.Identity.Account.AccountID }}
{{- else if .PathParams }}
{{- $acctID = $dot.PathParams.acctID | parseInt64 }}
{{- else }}
{{- $acctID = $dot.AccountID }}
{{- end }}
{{- $stores := $dot.Accounts.GetShops $acctID -}}
<table id="inventory-table-2" class="max-w-full overflow-x-auto">
<thead>
<tr>
<th>
Shop
</th>
<th>
Listing
</th>
<th>
SKU
</th>
<th>
Description
</th>
<th>
</th>
</tr>
</thead>
<tbody
_="
init
set element allRowsFilledOut to false
set element numRows to 0
def checkIfAllRowsAreFilledOut()
set rows to my children
set element allRowsFilledOut to true
set element numRows to rows.length
for row in rows
set filledOut to row.dataset.filledOut is 'true'
if not filledOut then
set element allRowsFilledOut to false
break
end
end
end
on rowUpdated
checkIfAllRowsAreFilledOut()
send setDisabled(disabled: not allRowsFilledOut or numRows < 2) to #create-sync-group-button
"
>
{{- $listings := $dot.Accounts.GetSyncGroupListingDrafts $acctID }}
{{- range $i, $listing := $listings }}
{{- componentBody "accounts/{acctID}/inventory/sync-groups/draft/listings/{orderIndex}"
"dot" ($dot | addPathParam "orderIndex" $i)
}}
{{- end }}
</tbody>
<tfoot>
<tr>
<th>
Shop
</th>
<th>
Listing
</th>
<th>
SKU
</th>
<th>
Description
</th>
<th>
</th>
</tr>
</tfoot>
</table>
@@ -1,46 +0,0 @@
{{- $dot := or .dot . }}
{{- $dot.Auth.ByMatchingAccountID 2 }}
{{- $acctID := $dot.Identity.Account.AccountID }}
{{- $stores := $dot.Accounts.GetShops $acctID -}}
<table id="inventory-table" class="max-w-full overflow-x-scroll">
<thead>
<tr>
{{- range $store := $stores }}
<th class="text-nowrap">
{{ $store.Platform }}: {{ $store.Name }}
</th>
<th class="text-nowrap">
Count
</th>
{{- end }}
<th>
</th>
</tr>
</thead>
<tbody>
{{- componentBody "accounts/{acctID}/inventory/sync-table/new-row" "dot" $dot }}
</tbody>
<tfoot>
<tr>
{{- range $store := $stores }}
<th class="text-nowrap">
{{ $store.Platform }}: {{ $store.Name }}
</th>
<th class="text-nowrap">
Count
</th>
{{- end }}
<th>
</th>
</tr>
</tfoot>
</table>
@@ -1,55 +0,0 @@
{{/* TODO: delete when done with the newer draft */}}
{{- $dot := or .dot .}}
{{- $dot.Auth.ByMatchingAccountID 2 }}
{{- $acctID := $dot.Identity.Account.AccountID }}
{{- $shops := $dot.Accounts.GetShops $acctID -}}
<tr>
{{- range $shop := $shops }}
<td>
<select
class="min-w-fit cursor-pointer"
_="
on change
set dataset to the dataset of the first of my selectedOptions
set listingShowcase to the <#listing-showcase/>
if <#listing-showcase/> then
send displayListing(
id: dataset.id,
name: dataset.name,
description: dataset.description,
count: dataset.count
) to listingShowcase
end
set the innerHTML of the next <td/> to the dataset.count
"
>
<option disabled selected>- Listings -</option>
{{/*- $listings := $dot.Accounts.GetListingsForShop $acctID $shop.ShopID }}
{{- range $listing := $listings }}
<option
value="{{$listing.ListingID}}"
data-id="{{$listing.ListingID}}"
data-name="{{$listing.Name}}"
data-description="{{$listing.Description}}"
data-count="{{$listing.Count}}"
>
{{ $listing.Name }}
</option>
{{- end */}}
</select>
</td>
<td>
</td>
{{- end }}
<td>
<button class="cursor-pointer underline w-full">
Save
</button>
</td>
</tr>
@@ -1,40 +0,0 @@
<table class="max-w-full"
id="listing-showcase"
_="
on displayListing(id, name, description, count)
set innerHTML of <#listing-showcase-id/> to id
set innerHTML of <#listing-showcase-name/> to name
set innerHTML of <#listing-showcase-description/> to description
set innerHTML of <#listing-showcase-count/> to count
"
>
<thead>
<th>
ID
</th>
<th>
Name
</th>
<th>
Description
</th>
<th>
Count
</th>
</thead>
<tbody>
<th id="listing-showcase-id">
-
</th>
<th id="listing-showcase-name">
-
</th>
<th id="listing-showcase-description">
-
</th>
<th id="listing-showcase-count">
-
</th>
</tbody>
</table>
@@ -1,45 +0,0 @@
{{/* .HXGet | .HXPost | .HXDelete, .HXTarget, .HXSwap, .HXVals, ._, .Text, .ID, .Class, .Disabled */}}
<button
class="
border-thin
bg-card
rounded-sm
p-[0.5em]
font-semibold
cursor-pointer
hover:underline
hover:bg-accent
disabled:bg-accent-secondary
disabled:cursor-not-allowed
disabled:no-underline
{{.Class}}
"
{{- if .ID }}
id="{{.ID}}"
{{- end }}
{{- if .HXGet }}
hx-get="{{.HXGet}}"
{{- else if .HXPost }}
hx-post="{{.HXPost}}"
{{- else if .HXDelete }}
hx-delete="{{.HXDelete}}"
{{- end }}
{{- if .HXTarget }}
hx-target="{{.HXTarget}}"
{{- end }}
{{- if .HXSwap }}
hx-swap="{{.HXSwap}}"
{{- end }}
{{- if .HXVals }}
hx-vals="{{.HXVals}}"
{{- end }}
{{- if .Disabled}}
disabled
{{- end}}
{{- if ._ }}
_="{{ ._ }}"
{{- end }}
>
{{.Text}}
</button>
@@ -1,70 +0,0 @@
{{/* TODO: delete, once not needed */}}
{{/* "dot" . */}}
<nav
style="
margin: 0;
padding: 1em;
background-color: #bdf;
font-size: 1.25em;
display: flex;
flex-direction: column;
align-items: center;
"
>
<ul>
<li>
<a href="/">
Home
</a>
</li>
{{/* */}}
{{- $userID := .dot.Identity.User.UserID }}
{{- $acct := .dot.Identity.Account }}
{{- $acctID := 0 }}
{{- if $acct }}
{{- $acctID = $acct.AccountID }}
{{- end }}
{{- if not $userID }}
<li>
<a href="/login">
Log In / Sign Up
</a>
</li>
{{- else if $acctID }}
<li>
<a href="/accounts/{{$acctID}}">
Account
</a>
</li>
<li>
<a href="/accounts/{{$acctID}}/reports">
Reports
</a>
</li>
<li>
<a href="/accounts/{{$acctID}}/inventory">
Inventory
</a>
</li>
<li>
<a href="/logout">
Log Out
</a>
</li>
{{- end }}
</ul>
</nav>
@@ -1,91 +0,0 @@
<!DOCTYPE html>
<html class="min-h-full flex flex-col items-stretch">
<head>
<title>
{{ block "title" . }} Inventory++ {{ end }}
</title>
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<link rel="stylesheet" href="/styles/index.css">
<script src="/scripts/htmx.min.js.gz"></script>
<script src="/scripts/_hyperscript.min.js.gz"></script>
<script src="https://unpkg.com/htmx-ext-path-params@2.0.0/path-params.js"></script>
{{/* This is where the page_head template will be inserted into the page */}}
{{- block "head" . }}{{ end }}
</head>
<body class="basis-full grow bg-background flex flex-col items-stretch" hx-ext="path-params">
<header>
<nav class="flex flex-col items-center text-xl overflow-x-scroll overflow-y-hidden ">
{{- $path := or .Request.URL.Path "/" }}
<ul class="flex text-nowrap overflow-x-scroll overflow-y-hidden">
<li class="pt-[1em] pb-[1em]">
<a href="/" class="p-[1em] font-bold {{ if eq $path "/" }}selected{{ end }}">
Home
</a>
</li>
{{/* */}}
{{- $userID := .Identity.User.UserID }}
{{- $acct := .Identity.Account }}
{{- $acctID := 0 }}
{{- if $acct }}
{{- $acctID = $acct.AccountID }}
{{- end }}
{{- if not $userID }}
<li class="pt-[1em] pb-[1em]">
<a href="/login" class="p-[1em] font-bold {{ if eq $path "/login" }}selected{{ end }}">
Log In / Sign Up
</a>
</li>
{{- else if $acctID }}
<li class="pt-[1em] pb-[1em]">
<a href="/accounts/{{$acctID}}" class="p-[1em] font-bold {{ if eq $path (printf "/accounts/%d" $acctID) }}selected{{ end }}">
Account
</a>
</li>
<li class="pt-[1em] pb-[1em]">
<a href="/accounts/{{$acctID}}/inventory" class="p-[1em] font-bold {{ if eq $path (printf "/accounts/%d/inventory" $acctID) }}selected{{ end }}">
Inventory
</a>
</li>
<li class="pt-[1em] pb-[1em]">
<a href="/accounts/{{$acctID}}/reports" class="p-[1em] font-bold {{ if eq $path (printf "/accounts/%d/reports" $acctID) }}selected{{ end }}">
Reports
</a>
</li>
<li class="pt-[1em] pb-[1em]">
<a href="/logout" class="p-[1em] font-bold">
Log Out
</a>
</li>
{{- end }}
</ul>
</nav>
</header>
<main class="basis-full grow p-[1em] max-w-full">
{{/* This is where the page_body template will be inserted into the page */}}
{{- block "body" . }}{{ end }}
</main>
<footer class="flex flex-col items-center">
<address class="flex items-center">
<a href="mailto:contact-us@inventory-plus-plus.com" class="p-[1em] font-bold">Contact Us</a>
<a href="mailto:support@inventory-plus-plus.com" class="p-[1em] font-bold">Support</a>
</address>
</footer>
</body>
</html>
@@ -1,14 +0,0 @@
{{- define "title" }} Inventory++ Create an Account {{ end }}
{{/* TODO: will need to verify the email address */}}
<section style="margin-top: 2em;">
<form method="post" action="/accounts">
<label>
Email:
<input type="email" required name="email" />
</label>
<input type="submit" value="Create Account" />
</form>
</section>
@@ -1,20 +0,0 @@
{{- .Auth.ByMatchingAccountID 2 }}
{{- define "title" }} Inventory++ Account {{ end }}
{{- $acctID := .Identity.Account }}
<h1>Account: {{ $acctID.Email }}</h1>
{{- $etsyUser := .Etsy.GetUserPointerByAccountID $acctID.AccountID }}
{{- if $etsyUser }}
<h3>Etsy User: {{ $etsyUser.UserID }}; Shop ID: {{ $etsyUser.ShopID }}</h3>
{{- else }}
<h3>
{{/* TODO: create this link dynamically, not EVERYTIME THE PAGE IS LOADED */}}
<a href="{{ printf "/webhooks/etsy/%d/new-account-link" $acctID.AccountID }}">
Link Your Etsy Store!
</a>
</h3>
{{- end }}
<h2><a href="/accounts/{{$acctID.AccountID}}/reports">View Reports</a></h2>
@@ -1,74 +0,0 @@
{{- .Auth.ByMatchingAccountID 2 }}
{{- $acctID := .Identity.Account.AccountID }}
{{- $stores := .Accounts.GetShops $acctID -}}
{{- define "title" }} Inventory++ {{ end }}
<h1 class="text-center mb-[0.5em]">Inventory</h1>
<h2 class="text-center mb-[0.5em]">Synced Listings</h2>
<section class="w-full flex flex-col items-center">
<h3>
Create a Sync Group
</h3>
<h4>
(Draft 2)
</h4>
{{ componentBody "accounts/{acctID}/inventory/sync-table-v2" "dot" . }}
<div>
{{ componentBody "button-dev"
"HXPost" (printf "/accounts/%d/inventory/sync-groups/draft/listings" $acctID)
"HXTarget" "previous table > tbody"
"HXSwap" "beforeend"
"Class" "mt-[1em] mb-[1em]"
"Text" "Add Listing"
"_" `
on click
send rowUpdated to the first <tbody/> in #inventory-table-2
`
}}
{{/* TODO: enable the button when all listings are filled and there are at least two listings */}}
{{/* TODO: save the listings as a sync group on click */}}
{{ componentBody "button-dev"
"ID" "create-sync-group-button"
"HXPost" (printf "/accounts/%d/sync-groups" $acctID)
"Class" "mt-[1em] mb-[1em]"
"Text" "Save Sync Group"
"Disabled" true
"_" `
on setDisabled(disabled)
if disabled then
add @disabled to me
else
remove @disabled from me
end
`
}}
</div>
</section>
<section class="w-full flex flex-col items-center">
<h3>
Draft 1
</h3>
{{ componentBody "accounts/{acctID}/inventory/sync-table" "dot" . }}
</section>
<section class="flex justify-center mt-[1em]">
{{ componentBody "accounts/{acctID}/inventory/sync-table/showcase-table" "dot" . }}
</section>
<section class="w-full flex justify-center mt-[1em]">
{{ componentBody "button-dev"
"HXGet" (printf "/accounts/%d/inventory/sync-table/new-row" $acctID)
"HXTarget" "#inventory-table > tbody"
"HXSwap" "beforeend"
"Class" "mt-[1em] mb-[1em]"
"Text" "Add Row"
}}
</section>
@@ -1,91 +0,0 @@
{{- .Auth.ByMatchingAccountID 2 }}
{{- define "title" }} Inventory++ Reports {{ end }}
{{ $storeID := .Request.URL.Query.Get "store-id" }}
<h1>Reports</h1>
<main>
<select
_='
on change
make a URL from window.location.href called currentURL
set currentQuery to searchParams of currentURL
set storeID to event.target.value
js(currentQuery, storeID) currentQuery.set("store-id", storeID) end
set search of currentURL to currentQuery.toString()
set window.location to currentURL
'
>
{{ if not $storeID }}
<option selected disabled>
choose a store
</option>
{{ end }}
<option {{ if eq $storeID "test-store-1" }}selected{{ end }} >
test-store-1
</option>
<option {{ if eq $storeID "test-store-2" }}selected{{ end }} >
test-store-2
</option>
<option {{ if eq $storeID "test-store-3" }}selected{{ end }} >
test-store-3
</option>
</select>
{{- if $storeID }}
<section
style="
display: grid;
grid-template-columns: auto auto auto 1fr;
column-gap: 1em;
row-gap: 0.5em;
margin: 1em 0;
"
>
<div style="border-bottom: solid black 1px;">
Date
</div>
<div style="border-bottom: solid black 1px;">
Time
</div>
<div style="border-bottom: solid black 1px;">
ID
</div>
<div style="border-bottom: solid black 1px;">
Payload
</div>
{{ $events := .RawEvents.LoadEventsForStore "etsy" $storeID }}
{{ range $e := $events }}
<div>
{{ printf "%d/%02d/%02d" $e.EventTimestamp.Year $e.EventTimestamp.Month $e.EventTimestamp.Day }}
</div>
<div>
{{ $suffix := "am" }}
{{ $ts := $e.EventTimestamp }}
{{- $hr := $ts.Hour }}
{{- if eq $hr 0 }}
{{- $hr = 12 }}
{{- else if eq $hr 12 }}
{{- $suffix = "pm" }}
{{- else if gt $hr 12 }}
{{- $hr = subInt $hr 12 }}
{{- $suffix = "pm" }}
{{- end }}
{{- $hrColorHex := multInt $hr 10 | subInt (subInt 256 128) | printf "%02x" }}
{{- $minColorHex := multInt $ts.Minute 2 | subInt (subInt 256 128) | printf "%02x" }}
{{- $secColorHex := multInt $ts.Second 2 | subInt (subInt 256 128) | printf "%02x" }}
<span style="color: #{{ $hrColorHex }}{{ $hrColorHex }}{{ $hrColorHex }};">{{ printf "%02d" $hr }}</span>:<span style="color: #{{ $minColorHex }}{{ $minColorHex }}{{ $minColorHex }};">{{ printf "%02d" $ts.Minute }}</span>:<span style="color: #{{ $secColorHex }}{{ $secColorHex }}{{ $secColorHex }};">{{ printf "%02d" $ts.Second }}</span>{{ printf " %s" $suffix }}
</div>
<div>
{{ $e.EventID }}
</div>
<div>
{{ prettyPrintJSON $e.Payload }}
</div>
{{ end }}
</section>
{{- end }}
</main>
@@ -1,11 +0,0 @@
{{- define "title" }} Inventory++ Invalid Link {{ end }}
<section>
Invalid Link: {{ .Request.URL.Path }}
</section>
<section>
<a href="/">Return Home</a>
</section>
@@ -1,27 +0,0 @@
<section class="flex justify-center max-w-full mt-[3em] mb-[3em]">
<h1 class="bg-card max-w-full p-[2em] border-[1px] border-sidebar-border rounded-lg text-nowrap">
Inventory++
</h1>
</section>
{{- if and .Identity.User.UserID (not .Identity.Account) }}
{{/* TODO: make account creation automatic as part of the user creation process */}}
<h2><a href="/account-creation">New Account</a></h2>
{{- end }}
<section class="flex flex-col items-center max-w-full mt-[1em] mb-[1em] gap-y-[2em]">
<p class="text-lg text-center max-w-[50%]">
Synchronize inventory automatically!
</p>
<div class="border-button border-sidebar-border bg-card text-lg text-center max-w-[50%]">
<a href="/login" class="block p-[1em] font-bold">
Create an Account
</a>
</div>
<p class="text-lg text-center max-w-[50%]">
...and start syncing your shops today!
</p>
</section>
@@ -1,11 +0,0 @@
{{/* TODO: delete this page, when certain it's not wanted anymore */}}
<h1>Log In</h1>
<form action="login" method="post">
<label>
Email:
<input type="text" required name="email" />
</label>
<input type="submit" value="login" />
</form>
@@ -1,11 +0,0 @@
{{- define "title" }} Inventory++ Page Not Found {{ end }}
<section>
Page Not Found: {{ .Request.URL.Path }}
</section>
<section>
<a href="/">Return Home</a>
</section>
@@ -1,11 +0,0 @@
{{/* TODO: not used - read for deletion */}}
<h1>Sign Up</h1>
<form action="accounts" method="post">
<label>
Email:
<input type="text" required name="email" />
</label>
<input type="submit" value="Submit" />
</form>