commit 52202eeb6ffd7e2fc465c1bff3a158bf8060c6bb
Author: Joey Eamigh <55670930+JoeyEamigh@users.noreply.github.com>
Date: Fri Sep 20 20:10:37 2024 -0400
assignment 1
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a6409ba
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+.out
+.DS_Store
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1 @@
+node_modules
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 0000000..c559de3
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1,24 @@
+/** @type {import("prettier").Config} */
+export default {
+ bracketSpacing: true,
+ bracketSameLine: true,
+ singleQuote: true,
+ trailingComma: 'all',
+ arrowParens: 'avoid',
+ semi: true,
+ // plugins: ['prettier-plugin-organize-imports', 'prettier-plugin-tailwindcss'],
+ overrides: [
+ {
+ files: ['*.ts', '*.js', '*.tsx', '*.jsx', '*.cjs', '*.mjs', '*.astro'],
+ options: {
+ printWidth: 120,
+ },
+ },
+ {
+ files: ['*.html'],
+ options: {
+ printWidth: 100,
+ },
+ },
+ ],
+};
\ No newline at end of file
diff --git a/Justfile b/Justfile
new file mode 100644
index 0000000..da38545
--- /dev/null
+++ b/Justfile
@@ -0,0 +1,29 @@
+build:
+ just clean
+ just compile
+ just zip
+
+compile:
+ just shared
+ bun index.ts
+
+clean:
+ rm -rf .out
+
+new type name:
+ zsh ./scripts/new.sh $type $name
+
+link:
+ zsh ./scripts/link.sh
+
+zip:
+ zsh ./scripts/zip.sh
+
+shared:
+ #!/bin/bash
+ mkdir -p shared
+ rm -f shared/common.css
+ bunx tailwindcss -o shared/common.css
+ bunx lightningcss-cli shared/common.css -o shared/common.css
+ bunx prettier --write shared/common.css
+ just link
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d2b19b6
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# comp126
diff --git a/assignments/a1/css/common.css b/assignments/a1/css/common.css
new file mode 100644
index 0000000..4dd1e35
--- /dev/null
+++ b/assignments/a1/css/common.css
@@ -0,0 +1,673 @@
+*,
+:before,
+:after {
+ box-sizing: border-box;
+ border: 0 solid #e5e7eb;
+}
+
+:before,
+:after {
+ --tw-content: '';
+}
+
+html,
+:host {
+ -webkit-text-size-adjust: 100%;
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ -webkit-tap-highlight-color: transparent;
+ font-family:
+ ui-sans-serif,
+ system-ui,
+ sans-serif,
+ Apple Color Emoji,
+ Segoe UI Emoji,
+ Segoe UI Symbol,
+ Noto Color Emoji;
+ line-height: 1.5;
+}
+
+body {
+ line-height: inherit;
+ margin: 0;
+}
+
+hr {
+ color: inherit;
+ border-top-width: 1px;
+ height: 0;
+}
+
+abbr:where([title]) {
+ text-decoration: underline dotted;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+code,
+kbd,
+samp,
+pre {
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ font-family:
+ ui-monospace,
+ SFMono-Regular,
+ Menlo,
+ Monaco,
+ Consolas,
+ Liberation Mono,
+ Courier New,
+ monospace;
+ font-size: 1em;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ vertical-align: baseline;
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+table {
+ text-indent: 0;
+ border-color: inherit;
+ border-collapse: collapse;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-feature-settings: inherit;
+ font-variation-settings: inherit;
+ font-family: inherit;
+ font-size: 100%;
+ font-weight: inherit;
+ line-height: inherit;
+ letter-spacing: inherit;
+ color: inherit;
+ margin: 0;
+ padding: 0;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+input:where([type='button']),
+input:where([type='reset']),
+input:where([type='submit']) {
+ -webkit-appearance: button;
+ background-color: #0000;
+ background-image: none;
+}
+
+:-moz-focusring {
+ outline: auto;
+}
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ outline-offset: -2px;
+}
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ font: inherit;
+}
+
+summary {
+ display: list-item;
+}
+
+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 {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+dialog {
+ padding: 0;
+}
+
+textarea {
+ resize: vertical;
+}
+
+input::-moz-placeholder,
+textarea::-moz-placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+button,
+[role='button'] {
+ cursor: pointer;
+}
+
+:disabled {
+ cursor: default;
+}
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ vertical-align: middle;
+ display: block;
+}
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+[hidden] {
+ display: none;
+}
+
+*,
+:before,
+:after,
+::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: #3b82f680;
+ --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: ;
+ --tw-contain-size: ;
+ --tw-contain-layout: ;
+ --tw-contain-paint: ;
+ --tw-contain-style: ;
+}
+
+:root {
+ --color-inherit: inherit;
+ --color-current: currentColor;
+ --color-transparent: transparent;
+ --color-black: #000;
+ --color-white: #fff;
+ --color-slate-50: #f8fafc;
+ --color-slate-100: #f1f5f9;
+ --color-slate-200: #e2e8f0;
+ --color-slate-300: #cbd5e1;
+ --color-slate-400: #94a3b8;
+ --color-slate-500: #64748b;
+ --color-slate-600: #475569;
+ --color-slate-700: #334155;
+ --color-slate-800: #1e293b;
+ --color-slate-900: #0f172a;
+ --color-slate-950: #020617;
+ --color-gray-50: #f9fafb;
+ --color-gray-100: #f3f4f6;
+ --color-gray-200: #e5e7eb;
+ --color-gray-300: #d1d5db;
+ --color-gray-400: #9ca3af;
+ --color-gray-500: #6b7280;
+ --color-gray-600: #4b5563;
+ --color-gray-700: #374151;
+ --color-gray-800: #1f2937;
+ --color-gray-900: #111827;
+ --color-gray-950: #030712;
+ --color-zinc-50: #fafafa;
+ --color-zinc-100: #f4f4f5;
+ --color-zinc-200: #e4e4e7;
+ --color-zinc-300: #d4d4d8;
+ --color-zinc-400: #a1a1aa;
+ --color-zinc-500: #71717a;
+ --color-zinc-600: #52525b;
+ --color-zinc-700: #3f3f46;
+ --color-zinc-800: #27272a;
+ --color-zinc-900: #18181b;
+ --color-zinc-950: #09090b;
+ --color-neutral-50: #fafafa;
+ --color-neutral-100: #f5f5f5;
+ --color-neutral-200: #e5e5e5;
+ --color-neutral-300: #d4d4d4;
+ --color-neutral-400: #a3a3a3;
+ --color-neutral-500: #737373;
+ --color-neutral-600: #525252;
+ --color-neutral-700: #404040;
+ --color-neutral-800: #262626;
+ --color-neutral-900: #171717;
+ --color-neutral-950: #0a0a0a;
+ --color-stone-50: #fafaf9;
+ --color-stone-100: #f5f5f4;
+ --color-stone-200: #e7e5e4;
+ --color-stone-300: #d6d3d1;
+ --color-stone-400: #a8a29e;
+ --color-stone-500: #78716c;
+ --color-stone-600: #57534e;
+ --color-stone-700: #44403c;
+ --color-stone-800: #292524;
+ --color-stone-900: #1c1917;
+ --color-stone-950: #0c0a09;
+ --color-red-50: #fef2f2;
+ --color-red-100: #fee2e2;
+ --color-red-200: #fecaca;
+ --color-red-300: #fca5a5;
+ --color-red-400: #f87171;
+ --color-red-500: #ef4444;
+ --color-red-600: #dc2626;
+ --color-red-700: #b91c1c;
+ --color-red-800: #991b1b;
+ --color-red-900: #7f1d1d;
+ --color-red-950: #450a0a;
+ --color-orange-50: #fff7ed;
+ --color-orange-100: #ffedd5;
+ --color-orange-200: #fed7aa;
+ --color-orange-300: #fdba74;
+ --color-orange-400: #fb923c;
+ --color-orange-500: #f97316;
+ --color-orange-600: #ea580c;
+ --color-orange-700: #c2410c;
+ --color-orange-800: #9a3412;
+ --color-orange-900: #7c2d12;
+ --color-orange-950: #431407;
+ --color-amber-50: #fffbeb;
+ --color-amber-100: #fef3c7;
+ --color-amber-200: #fde68a;
+ --color-amber-300: #fcd34d;
+ --color-amber-400: #fbbf24;
+ --color-amber-500: #f59e0b;
+ --color-amber-600: #d97706;
+ --color-amber-700: #b45309;
+ --color-amber-800: #92400e;
+ --color-amber-900: #78350f;
+ --color-amber-950: #451a03;
+ --color-yellow-50: #fefce8;
+ --color-yellow-100: #fef9c3;
+ --color-yellow-200: #fef08a;
+ --color-yellow-300: #fde047;
+ --color-yellow-400: #facc15;
+ --color-yellow-500: #eab308;
+ --color-yellow-600: #ca8a04;
+ --color-yellow-700: #a16207;
+ --color-yellow-800: #854d0e;
+ --color-yellow-900: #713f12;
+ --color-yellow-950: #422006;
+ --color-lime-50: #f7fee7;
+ --color-lime-100: #ecfccb;
+ --color-lime-200: #d9f99d;
+ --color-lime-300: #bef264;
+ --color-lime-400: #a3e635;
+ --color-lime-500: #84cc16;
+ --color-lime-600: #65a30d;
+ --color-lime-700: #4d7c0f;
+ --color-lime-800: #3f6212;
+ --color-lime-900: #365314;
+ --color-lime-950: #1a2e05;
+ --color-green-50: #f0fdf4;
+ --color-green-100: #dcfce7;
+ --color-green-200: #bbf7d0;
+ --color-green-300: #86efac;
+ --color-green-400: #4ade80;
+ --color-green-500: #22c55e;
+ --color-green-600: #16a34a;
+ --color-green-700: #15803d;
+ --color-green-800: #166534;
+ --color-green-900: #14532d;
+ --color-green-950: #052e16;
+ --color-emerald-50: #ecfdf5;
+ --color-emerald-100: #d1fae5;
+ --color-emerald-200: #a7f3d0;
+ --color-emerald-300: #6ee7b7;
+ --color-emerald-400: #34d399;
+ --color-emerald-500: #10b981;
+ --color-emerald-600: #059669;
+ --color-emerald-700: #047857;
+ --color-emerald-800: #065f46;
+ --color-emerald-900: #064e3b;
+ --color-emerald-950: #022c22;
+ --color-teal-50: #f0fdfa;
+ --color-teal-100: #ccfbf1;
+ --color-teal-200: #99f6e4;
+ --color-teal-300: #5eead4;
+ --color-teal-400: #2dd4bf;
+ --color-teal-500: #14b8a6;
+ --color-teal-600: #0d9488;
+ --color-teal-700: #0f766e;
+ --color-teal-800: #115e59;
+ --color-teal-900: #134e4a;
+ --color-teal-950: #042f2e;
+ --color-cyan-50: #ecfeff;
+ --color-cyan-100: #cffafe;
+ --color-cyan-200: #a5f3fc;
+ --color-cyan-300: #67e8f9;
+ --color-cyan-400: #22d3ee;
+ --color-cyan-500: #06b6d4;
+ --color-cyan-600: #0891b2;
+ --color-cyan-700: #0e7490;
+ --color-cyan-800: #155e75;
+ --color-cyan-900: #164e63;
+ --color-cyan-950: #083344;
+ --color-sky-50: #f0f9ff;
+ --color-sky-100: #e0f2fe;
+ --color-sky-200: #bae6fd;
+ --color-sky-300: #7dd3fc;
+ --color-sky-400: #38bdf8;
+ --color-sky-500: #0ea5e9;
+ --color-sky-600: #0284c7;
+ --color-sky-700: #0369a1;
+ --color-sky-800: #075985;
+ --color-sky-900: #0c4a6e;
+ --color-sky-950: #082f49;
+ --color-blue-50: #eff6ff;
+ --color-blue-100: #dbeafe;
+ --color-blue-200: #bfdbfe;
+ --color-blue-300: #93c5fd;
+ --color-blue-400: #60a5fa;
+ --color-blue-500: #3b82f6;
+ --color-blue-600: #2563eb;
+ --color-blue-700: #1d4ed8;
+ --color-blue-800: #1e40af;
+ --color-blue-900: #1e3a8a;
+ --color-blue-950: #172554;
+ --color-indigo-50: #eef2ff;
+ --color-indigo-100: #e0e7ff;
+ --color-indigo-200: #c7d2fe;
+ --color-indigo-300: #a5b4fc;
+ --color-indigo-400: #818cf8;
+ --color-indigo-500: #6366f1;
+ --color-indigo-600: #4f46e5;
+ --color-indigo-700: #4338ca;
+ --color-indigo-800: #3730a3;
+ --color-indigo-900: #312e81;
+ --color-indigo-950: #1e1b4b;
+ --color-violet-50: #f5f3ff;
+ --color-violet-100: #ede9fe;
+ --color-violet-200: #ddd6fe;
+ --color-violet-300: #c4b5fd;
+ --color-violet-400: #a78bfa;
+ --color-violet-500: #8b5cf6;
+ --color-violet-600: #7c3aed;
+ --color-violet-700: #6d28d9;
+ --color-violet-800: #5b21b6;
+ --color-violet-900: #4c1d95;
+ --color-violet-950: #2e1065;
+ --color-purple-50: #faf5ff;
+ --color-purple-100: #f3e8ff;
+ --color-purple-200: #e9d5ff;
+ --color-purple-300: #d8b4fe;
+ --color-purple-400: #c084fc;
+ --color-purple-500: #a855f7;
+ --color-purple-600: #9333ea;
+ --color-purple-700: #7e22ce;
+ --color-purple-800: #6b21a8;
+ --color-purple-900: #581c87;
+ --color-purple-950: #3b0764;
+ --color-fuchsia-50: #fdf4ff;
+ --color-fuchsia-100: #fae8ff;
+ --color-fuchsia-200: #f5d0fe;
+ --color-fuchsia-300: #f0abfc;
+ --color-fuchsia-400: #e879f9;
+ --color-fuchsia-500: #d946ef;
+ --color-fuchsia-600: #c026d3;
+ --color-fuchsia-700: #a21caf;
+ --color-fuchsia-800: #86198f;
+ --color-fuchsia-900: #701a75;
+ --color-fuchsia-950: #4a044e;
+ --color-pink-50: #fdf2f8;
+ --color-pink-100: #fce7f3;
+ --color-pink-200: #fbcfe8;
+ --color-pink-300: #f9a8d4;
+ --color-pink-400: #f472b6;
+ --color-pink-500: #ec4899;
+ --color-pink-600: #db2777;
+ --color-pink-700: #be185d;
+ --color-pink-800: #9d174d;
+ --color-pink-900: #831843;
+ --color-pink-950: #500724;
+ --color-rose-50: #fff1f2;
+ --color-rose-100: #ffe4e6;
+ --color-rose-200: #fecdd3;
+ --color-rose-300: #fda4af;
+ --color-rose-400: #fb7185;
+ --color-rose-500: #f43f5e;
+ --color-rose-600: #e11d48;
+ --color-rose-700: #be123c;
+ --color-rose-800: #9f1239;
+ --color-rose-900: #881337;
+ --color-rose-950: #4c0519;
+ --shadow-sm: 0 1px 2px 0 #0000000d;
+ --shadow: 0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;
+ --shadow-md: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
+ --shadow-lg: 0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;
+ --shadow-xl: 0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;
+ --shadow-2xl: 0 25px 50px -12px #00000040;
+ --shadow-inner: inset 0 2px 4px 0 #0000000d;
+ --shadow-none: none;
+ --space-0: 0px;
+ --space-1: 0.25rem;
+ --space-2: 0.5rem;
+ --space-3: 0.75rem;
+ --space-4: 1rem;
+ --space-5: 1.25rem;
+ --space-6: 1.5rem;
+ --space-7: 1.75rem;
+ --space-8: 2rem;
+ --space-9: 2.25rem;
+ --space-10: 2.5rem;
+ --space-11: 2.75rem;
+ --space-12: 3rem;
+ --space-14: 3.5rem;
+ --space-16: 4rem;
+ --space-20: 5rem;
+ --space-24: 6rem;
+ --space-28: 7rem;
+ --space-32: 8rem;
+ --space-36: 9rem;
+ --space-40: 10rem;
+ --space-44: 11rem;
+ --space-48: 12rem;
+ --space-52: 13rem;
+ --space-56: 14rem;
+ --space-60: 15rem;
+ --space-64: 16rem;
+ --space-72: 18rem;
+ --space-80: 20rem;
+ --space-96: 24rem;
+ --space-px: 1px;
+ --screen-sm: 640px;
+ --screen-md: 768px;
+ --screen-lg: 1024px;
+ --screen-xl: 1280px;
+ --screen-2xl: 1536px;
+ --w-0: 0px;
+ --w-1: 0.25rem;
+ --w-2: 0.5rem;
+ --w-3: 0.75rem;
+ --w-4: 1rem;
+ --w-5: 1.25rem;
+ --w-6: 1.5rem;
+ --w-7: 1.75rem;
+ --w-8: 2rem;
+ --w-9: 2.25rem;
+ --w-10: 2.5rem;
+ --w-11: 2.75rem;
+ --w-12: 3rem;
+ --w-14: 3.5rem;
+ --w-16: 4rem;
+ --w-20: 5rem;
+ --w-24: 6rem;
+ --w-28: 7rem;
+ --w-32: 8rem;
+ --w-36: 9rem;
+ --w-40: 10rem;
+ --w-44: 11rem;
+ --w-48: 12rem;
+ --w-52: 13rem;
+ --w-56: 14rem;
+ --w-60: 15rem;
+ --w-64: 16rem;
+ --w-72: 18rem;
+ --w-80: 20rem;
+ --w-96: 24rem;
+ --w-px: 1px;
+ --w-none: none;
+ --w-xs: 20rem;
+ --w-sm: 24rem;
+ --w-md: 28rem;
+ --w-lg: 32rem;
+ --w-xl: 36rem;
+ --w-2xl: 42rem;
+ --w-3xl: 48rem;
+ --w-4xl: 56rem;
+ --w-5xl: 64rem;
+ --w-6xl: 72rem;
+ --w-7xl: 80rem;
+ --w-full: 100%;
+ --w-min: min-content;
+ --w-max: max-content;
+ --w-fit: fit-content;
+ --w-prose: 65ch;
+ --w-screen-sm: 640px;
+ --w-screen-md: 768px;
+ --w-screen-lg: 1024px;
+ --w-screen-xl: 1280px;
+ --w-screen-2xl: 1536px;
+ --rounded-none: 0px;
+ --rounded-sm: 0.125rem;
+ --rounded: 0.25rem;
+ --rounded-md: 0.375rem;
+ --rounded-lg: 0.5rem;
+ --rounded-xl: 0.75rem;
+ --rounded-2xl: 1rem;
+ --rounded-3xl: 1.5rem;
+ --rounded-full: 9999px;
+}
diff --git a/assignments/a1/css/gallery.css b/assignments/a1/css/gallery.css
new file mode 100644
index 0000000..c1342c7
--- /dev/null
+++ b/assignments/a1/css/gallery.css
@@ -0,0 +1,36 @@
+@import 'shared.css';
+
+#gallery {
+ max-width: var(--w-5xl);
+ margin: 0 auto;
+ padding: var(--space-16) 1rem;
+
+ display: grid;
+
+ gap: 1rem;
+ grid-template-columns: 1fr;
+
+ @media (min-width: 768px) {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ @media (min-width: 1024px) {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ & > img {
+ border-radius: var(--rounded-md);
+ box-shadow:
+ 0 4px 6px -1px #ffffff9a,
+ 0 2px 4px -2px #ffffff9a;
+
+ &:hover {
+ transform: scale(1.01);
+ transition: transform 300ms;
+
+ box-shadow:
+ 0 8px 10px -1px #ffffff9a,
+ 0 4px 6px -2px #ffffff9a;
+ }
+ }
+}
diff --git a/assignments/a1/css/index.css b/assignments/a1/css/index.css
new file mode 100644
index 0000000..28a45b8
--- /dev/null
+++ b/assignments/a1/css/index.css
@@ -0,0 +1,46 @@
+@import 'shared.css';
+
+.about {
+ max-width: var(--w-3xl);
+ margin: var(--space-16) auto;
+ padding-bottom: var(--space-32);
+
+ .column {
+ & > h3 {
+ font-size: 1.5rem;
+ margin-bottom: 0.5rem;
+ text-align: center;
+ }
+
+ &:first-of-type {
+ float: left;
+ width: 50%;
+ padding-right: 1rem;
+ }
+
+ &:last-of-type {
+ float: right;
+ width: 50%;
+ padding-left: 1rem;
+ }
+ }
+
+ & > img {
+ border-radius: var(--rounded-md);
+ box-shadow:
+ 0 4px 6px -1px #ffffff9a,
+ 0 2px 4px -2px #ffffff9a;
+
+ max-width: var(--w-sm);
+ margin: var(--space-16) auto;
+
+ &:hover {
+ transform: scale(1.01);
+ transition: transform 300ms;
+
+ box-shadow:
+ 0 8px 10px -1px #ffffff9a,
+ 0 4px 6px -2px #ffffff9a;
+ }
+ }
+}
diff --git a/assignments/a1/css/shared.css b/assignments/a1/css/shared.css
new file mode 100644
index 0000000..22cf4cf
--- /dev/null
+++ b/assignments/a1/css/shared.css
@@ -0,0 +1,77 @@
+@import 'common.css';
+
+html,
+body {
+ height: 100%;
+ background-color: var(--color-gray-800);
+ color: var(--color-white);
+ font-family: InterVariable, Arial, Helvetica, sans-serif;
+}
+
+body {
+ display: flex;
+ flex-direction: column;
+
+ & > main {
+ flex: 1;
+ }
+}
+
+header {
+ padding: 1rem;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ background-color: var(--color-gray-700);
+ border-bottom: 1px solid var(--color-gray-500);
+
+ & > p {
+ font-size: 1.5rem;
+ }
+
+ & > nav {
+ padding: 1rem, 0;
+
+ ul {
+ display: flex;
+ gap: 1rem;
+ }
+
+ a {
+ color: var(--color-white);
+ text-decoration: underline 1px var(--color-white);
+ text-underline-offset: 2px;
+ transition:
+ text-decoration-color 300ms,
+ text-underline-offset 300ms,
+ font-size 300ms;
+
+ &:hover {
+ color: var(--color-gray-200);
+ text-decoration-color: var(--color-gray-200);
+ text-underline-offset: 4px;
+ font-size: 1.1rem;
+ }
+ }
+ }
+}
+
+footer {
+ padding: 1rem;
+ background-color: var(--color-gray-700);
+ border-top: 1px solid var(--color-gray-500);
+ text-align: center;
+}
+
+.title {
+ margin-top: 2rem;
+ text-align: center;
+
+ & > h1 {
+ font-size: 2.5rem;
+ }
+
+ & > h2 {
+ font-size: 1.25rem;
+ }
+}
diff --git a/assignments/a1/gallery.html b/assignments/a1/gallery.html
new file mode 100644
index 0000000..b7dc71a
--- /dev/null
+++ b/assignments/a1/gallery.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+ Gallery | Churro Box
+
+
+
+
+
+
+
+
+ Gallery of Churro Box
+ Churro Box is the bestest doggo!
+
+
+
+
+
+
+
+
+
diff --git a/assignments/a1/img/churro0.jpg b/assignments/a1/img/churro0.jpg
new file mode 100755
index 0000000..504d68f
Binary files /dev/null and b/assignments/a1/img/churro0.jpg differ
diff --git a/assignments/a1/img/churro1.jpg b/assignments/a1/img/churro1.jpg
new file mode 100644
index 0000000..7ba3230
Binary files /dev/null and b/assignments/a1/img/churro1.jpg differ
diff --git a/assignments/a1/img/churro2.jpg b/assignments/a1/img/churro2.jpg
new file mode 100755
index 0000000..25bf9f0
Binary files /dev/null and b/assignments/a1/img/churro2.jpg differ
diff --git a/assignments/a1/img/churro3.jpg b/assignments/a1/img/churro3.jpg
new file mode 100644
index 0000000..591f7b6
Binary files /dev/null and b/assignments/a1/img/churro3.jpg differ
diff --git a/assignments/a1/img/churro4.jpg b/assignments/a1/img/churro4.jpg
new file mode 100644
index 0000000..0393ea4
Binary files /dev/null and b/assignments/a1/img/churro4.jpg differ
diff --git a/assignments/a1/img/churro5.jpg b/assignments/a1/img/churro5.jpg
new file mode 100644
index 0000000..e307efa
Binary files /dev/null and b/assignments/a1/img/churro5.jpg differ
diff --git a/assignments/a1/index.html b/assignments/a1/index.html
new file mode 100644
index 0000000..0afe3a1
--- /dev/null
+++ b/assignments/a1/index.html
@@ -0,0 +1,74 @@
+
+
+
+
+
+ Churro Box
+
+
+
+
+
+
+
+
+
+ About Churro Box
+ Churro Box is the bestest doggo!
+
+
+
+
+
+
+
Who is Churro?
+
+ Churro Box is year old black labrador. She enjoys napping,
+ walking, and eating.
+
+
+
+
+
Why is she great?
+
She loves cuddles and is always happy to see you. She is the bestest doggo!
+
+
+
+
+
+
+
+
diff --git a/bun.lockb b/bun.lockb
new file mode 100755
index 0000000..a21dc99
Binary files /dev/null and b/bun.lockb differ
diff --git a/index.ts b/index.ts
new file mode 100644
index 0000000..cf763b0
--- /dev/null
+++ b/index.ts
@@ -0,0 +1,64 @@
+import browserslist from 'browserslist';
+import { transform, browserslistToTargets, Features } from 'lightningcss';
+import { readdir, rmdir, copyFile, mkdir, exists } from 'node:fs/promises';
+import { type Dirent } from 'node:fs';
+
+const assignmentDir = './assignments';
+const outDir = './.out';
+const ENABLE_TRANSPILE = false;
+
+const targets = browserslistToTargets(browserslist('last 2 versions, > 0.1%'));
+
+const handleAssignment = async (project: Dirent) => {
+ console.log(`transpiling project ${project.name}`);
+ if (!ENABLE_TRANSPILE) console.warn('WARNING: transpilation is disabled!!');
+
+ await mkdir(`${outDir}/assignments/${project.name}`, { recursive: true });
+
+ const files = await readdir(`${assignmentDir}/${project.name}`, { withFileTypes: true, recursive: true }).then(n =>
+ n.filter(f => f.isFile()).map(f => (f.name.endsWith('.css') ? transpileCss(f) : copy(f))),
+ );
+
+ await Promise.all(files);
+ console.log(`transpiled project ${project.name}`);
+};
+
+const copy = async ({ name, parentPath }: { name: string; parentPath: string }) => {
+ console.log(`copying file ${name}`);
+ if (!(await exists(`${outDir}/${parentPath}}`))) await mkdir(`${outDir}/${parentPath}`, { recursive: true });
+ await copyFile(`./${parentPath}/${name}`, `${outDir}/${parentPath}/${name}`);
+};
+
+const transpileCss = async ({ name, parentPath }: { name: string; parentPath: string }) => {
+ if (!ENABLE_TRANSPILE) return copy({ name, parentPath });
+
+ console.log(`transpiling css file ${name}`);
+ const content = await Bun.file(`./${parentPath}/${name}`).arrayBuffer();
+ const { code, map } = transform({
+ filename: name,
+ code: Buffer.from(content),
+ minify: false,
+ sourceMap: false,
+ exclude: Features.Nesting,
+ targets,
+ });
+
+ await Bun.write(`${outDir}/${parentPath}/${name}`, code);
+ if (map) await Bun.write(`${outDir}/${parentPath}/${name}.map`, map);
+};
+
+await rmdir(outDir, { recursive: true });
+
+const ignores = await Bun.file('.gitignore')
+ .text()
+ .then(n =>
+ n
+ .split('\n')
+ .filter(Boolean)
+ .filter(n => !n.startsWith('#')),
+ );
+const assignments = await readdir(assignmentDir, { withFileTypes: true }).then(n =>
+ n.filter(f => f.isDirectory() && !f.name.startsWith('.') && !ignores.includes(f.name)).map(handleAssignment),
+);
+
+await Promise.all(assignments);
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..9dfb653
--- /dev/null
+++ b/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "comp126",
+ "module": "index.ts",
+ "type": "module",
+ "scripts": {
+ "bundle": "bun index.ts"
+ },
+ "devDependencies": {
+ "@types/bun": "latest",
+ "browserslist": "^4.23.3",
+ "lightningcss": "^1.26.0",
+ "prettier": "^3.3.3",
+ "tailwindcss": "^3.4.10"
+ },
+ "peerDependencies": {
+ "typescript": "^5.0.0"
+ }
+}
\ No newline at end of file
diff --git a/practices/24-8-29/css/common.css b/practices/24-8-29/css/common.css
new file mode 100644
index 0000000..4dd1e35
--- /dev/null
+++ b/practices/24-8-29/css/common.css
@@ -0,0 +1,673 @@
+*,
+:before,
+:after {
+ box-sizing: border-box;
+ border: 0 solid #e5e7eb;
+}
+
+:before,
+:after {
+ --tw-content: '';
+}
+
+html,
+:host {
+ -webkit-text-size-adjust: 100%;
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ -webkit-tap-highlight-color: transparent;
+ font-family:
+ ui-sans-serif,
+ system-ui,
+ sans-serif,
+ Apple Color Emoji,
+ Segoe UI Emoji,
+ Segoe UI Symbol,
+ Noto Color Emoji;
+ line-height: 1.5;
+}
+
+body {
+ line-height: inherit;
+ margin: 0;
+}
+
+hr {
+ color: inherit;
+ border-top-width: 1px;
+ height: 0;
+}
+
+abbr:where([title]) {
+ text-decoration: underline dotted;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+code,
+kbd,
+samp,
+pre {
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ font-family:
+ ui-monospace,
+ SFMono-Regular,
+ Menlo,
+ Monaco,
+ Consolas,
+ Liberation Mono,
+ Courier New,
+ monospace;
+ font-size: 1em;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ vertical-align: baseline;
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+table {
+ text-indent: 0;
+ border-color: inherit;
+ border-collapse: collapse;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-feature-settings: inherit;
+ font-variation-settings: inherit;
+ font-family: inherit;
+ font-size: 100%;
+ font-weight: inherit;
+ line-height: inherit;
+ letter-spacing: inherit;
+ color: inherit;
+ margin: 0;
+ padding: 0;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+input:where([type='button']),
+input:where([type='reset']),
+input:where([type='submit']) {
+ -webkit-appearance: button;
+ background-color: #0000;
+ background-image: none;
+}
+
+:-moz-focusring {
+ outline: auto;
+}
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ outline-offset: -2px;
+}
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ font: inherit;
+}
+
+summary {
+ display: list-item;
+}
+
+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 {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+dialog {
+ padding: 0;
+}
+
+textarea {
+ resize: vertical;
+}
+
+input::-moz-placeholder,
+textarea::-moz-placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+button,
+[role='button'] {
+ cursor: pointer;
+}
+
+:disabled {
+ cursor: default;
+}
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ vertical-align: middle;
+ display: block;
+}
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+[hidden] {
+ display: none;
+}
+
+*,
+:before,
+:after,
+::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: #3b82f680;
+ --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: ;
+ --tw-contain-size: ;
+ --tw-contain-layout: ;
+ --tw-contain-paint: ;
+ --tw-contain-style: ;
+}
+
+:root {
+ --color-inherit: inherit;
+ --color-current: currentColor;
+ --color-transparent: transparent;
+ --color-black: #000;
+ --color-white: #fff;
+ --color-slate-50: #f8fafc;
+ --color-slate-100: #f1f5f9;
+ --color-slate-200: #e2e8f0;
+ --color-slate-300: #cbd5e1;
+ --color-slate-400: #94a3b8;
+ --color-slate-500: #64748b;
+ --color-slate-600: #475569;
+ --color-slate-700: #334155;
+ --color-slate-800: #1e293b;
+ --color-slate-900: #0f172a;
+ --color-slate-950: #020617;
+ --color-gray-50: #f9fafb;
+ --color-gray-100: #f3f4f6;
+ --color-gray-200: #e5e7eb;
+ --color-gray-300: #d1d5db;
+ --color-gray-400: #9ca3af;
+ --color-gray-500: #6b7280;
+ --color-gray-600: #4b5563;
+ --color-gray-700: #374151;
+ --color-gray-800: #1f2937;
+ --color-gray-900: #111827;
+ --color-gray-950: #030712;
+ --color-zinc-50: #fafafa;
+ --color-zinc-100: #f4f4f5;
+ --color-zinc-200: #e4e4e7;
+ --color-zinc-300: #d4d4d8;
+ --color-zinc-400: #a1a1aa;
+ --color-zinc-500: #71717a;
+ --color-zinc-600: #52525b;
+ --color-zinc-700: #3f3f46;
+ --color-zinc-800: #27272a;
+ --color-zinc-900: #18181b;
+ --color-zinc-950: #09090b;
+ --color-neutral-50: #fafafa;
+ --color-neutral-100: #f5f5f5;
+ --color-neutral-200: #e5e5e5;
+ --color-neutral-300: #d4d4d4;
+ --color-neutral-400: #a3a3a3;
+ --color-neutral-500: #737373;
+ --color-neutral-600: #525252;
+ --color-neutral-700: #404040;
+ --color-neutral-800: #262626;
+ --color-neutral-900: #171717;
+ --color-neutral-950: #0a0a0a;
+ --color-stone-50: #fafaf9;
+ --color-stone-100: #f5f5f4;
+ --color-stone-200: #e7e5e4;
+ --color-stone-300: #d6d3d1;
+ --color-stone-400: #a8a29e;
+ --color-stone-500: #78716c;
+ --color-stone-600: #57534e;
+ --color-stone-700: #44403c;
+ --color-stone-800: #292524;
+ --color-stone-900: #1c1917;
+ --color-stone-950: #0c0a09;
+ --color-red-50: #fef2f2;
+ --color-red-100: #fee2e2;
+ --color-red-200: #fecaca;
+ --color-red-300: #fca5a5;
+ --color-red-400: #f87171;
+ --color-red-500: #ef4444;
+ --color-red-600: #dc2626;
+ --color-red-700: #b91c1c;
+ --color-red-800: #991b1b;
+ --color-red-900: #7f1d1d;
+ --color-red-950: #450a0a;
+ --color-orange-50: #fff7ed;
+ --color-orange-100: #ffedd5;
+ --color-orange-200: #fed7aa;
+ --color-orange-300: #fdba74;
+ --color-orange-400: #fb923c;
+ --color-orange-500: #f97316;
+ --color-orange-600: #ea580c;
+ --color-orange-700: #c2410c;
+ --color-orange-800: #9a3412;
+ --color-orange-900: #7c2d12;
+ --color-orange-950: #431407;
+ --color-amber-50: #fffbeb;
+ --color-amber-100: #fef3c7;
+ --color-amber-200: #fde68a;
+ --color-amber-300: #fcd34d;
+ --color-amber-400: #fbbf24;
+ --color-amber-500: #f59e0b;
+ --color-amber-600: #d97706;
+ --color-amber-700: #b45309;
+ --color-amber-800: #92400e;
+ --color-amber-900: #78350f;
+ --color-amber-950: #451a03;
+ --color-yellow-50: #fefce8;
+ --color-yellow-100: #fef9c3;
+ --color-yellow-200: #fef08a;
+ --color-yellow-300: #fde047;
+ --color-yellow-400: #facc15;
+ --color-yellow-500: #eab308;
+ --color-yellow-600: #ca8a04;
+ --color-yellow-700: #a16207;
+ --color-yellow-800: #854d0e;
+ --color-yellow-900: #713f12;
+ --color-yellow-950: #422006;
+ --color-lime-50: #f7fee7;
+ --color-lime-100: #ecfccb;
+ --color-lime-200: #d9f99d;
+ --color-lime-300: #bef264;
+ --color-lime-400: #a3e635;
+ --color-lime-500: #84cc16;
+ --color-lime-600: #65a30d;
+ --color-lime-700: #4d7c0f;
+ --color-lime-800: #3f6212;
+ --color-lime-900: #365314;
+ --color-lime-950: #1a2e05;
+ --color-green-50: #f0fdf4;
+ --color-green-100: #dcfce7;
+ --color-green-200: #bbf7d0;
+ --color-green-300: #86efac;
+ --color-green-400: #4ade80;
+ --color-green-500: #22c55e;
+ --color-green-600: #16a34a;
+ --color-green-700: #15803d;
+ --color-green-800: #166534;
+ --color-green-900: #14532d;
+ --color-green-950: #052e16;
+ --color-emerald-50: #ecfdf5;
+ --color-emerald-100: #d1fae5;
+ --color-emerald-200: #a7f3d0;
+ --color-emerald-300: #6ee7b7;
+ --color-emerald-400: #34d399;
+ --color-emerald-500: #10b981;
+ --color-emerald-600: #059669;
+ --color-emerald-700: #047857;
+ --color-emerald-800: #065f46;
+ --color-emerald-900: #064e3b;
+ --color-emerald-950: #022c22;
+ --color-teal-50: #f0fdfa;
+ --color-teal-100: #ccfbf1;
+ --color-teal-200: #99f6e4;
+ --color-teal-300: #5eead4;
+ --color-teal-400: #2dd4bf;
+ --color-teal-500: #14b8a6;
+ --color-teal-600: #0d9488;
+ --color-teal-700: #0f766e;
+ --color-teal-800: #115e59;
+ --color-teal-900: #134e4a;
+ --color-teal-950: #042f2e;
+ --color-cyan-50: #ecfeff;
+ --color-cyan-100: #cffafe;
+ --color-cyan-200: #a5f3fc;
+ --color-cyan-300: #67e8f9;
+ --color-cyan-400: #22d3ee;
+ --color-cyan-500: #06b6d4;
+ --color-cyan-600: #0891b2;
+ --color-cyan-700: #0e7490;
+ --color-cyan-800: #155e75;
+ --color-cyan-900: #164e63;
+ --color-cyan-950: #083344;
+ --color-sky-50: #f0f9ff;
+ --color-sky-100: #e0f2fe;
+ --color-sky-200: #bae6fd;
+ --color-sky-300: #7dd3fc;
+ --color-sky-400: #38bdf8;
+ --color-sky-500: #0ea5e9;
+ --color-sky-600: #0284c7;
+ --color-sky-700: #0369a1;
+ --color-sky-800: #075985;
+ --color-sky-900: #0c4a6e;
+ --color-sky-950: #082f49;
+ --color-blue-50: #eff6ff;
+ --color-blue-100: #dbeafe;
+ --color-blue-200: #bfdbfe;
+ --color-blue-300: #93c5fd;
+ --color-blue-400: #60a5fa;
+ --color-blue-500: #3b82f6;
+ --color-blue-600: #2563eb;
+ --color-blue-700: #1d4ed8;
+ --color-blue-800: #1e40af;
+ --color-blue-900: #1e3a8a;
+ --color-blue-950: #172554;
+ --color-indigo-50: #eef2ff;
+ --color-indigo-100: #e0e7ff;
+ --color-indigo-200: #c7d2fe;
+ --color-indigo-300: #a5b4fc;
+ --color-indigo-400: #818cf8;
+ --color-indigo-500: #6366f1;
+ --color-indigo-600: #4f46e5;
+ --color-indigo-700: #4338ca;
+ --color-indigo-800: #3730a3;
+ --color-indigo-900: #312e81;
+ --color-indigo-950: #1e1b4b;
+ --color-violet-50: #f5f3ff;
+ --color-violet-100: #ede9fe;
+ --color-violet-200: #ddd6fe;
+ --color-violet-300: #c4b5fd;
+ --color-violet-400: #a78bfa;
+ --color-violet-500: #8b5cf6;
+ --color-violet-600: #7c3aed;
+ --color-violet-700: #6d28d9;
+ --color-violet-800: #5b21b6;
+ --color-violet-900: #4c1d95;
+ --color-violet-950: #2e1065;
+ --color-purple-50: #faf5ff;
+ --color-purple-100: #f3e8ff;
+ --color-purple-200: #e9d5ff;
+ --color-purple-300: #d8b4fe;
+ --color-purple-400: #c084fc;
+ --color-purple-500: #a855f7;
+ --color-purple-600: #9333ea;
+ --color-purple-700: #7e22ce;
+ --color-purple-800: #6b21a8;
+ --color-purple-900: #581c87;
+ --color-purple-950: #3b0764;
+ --color-fuchsia-50: #fdf4ff;
+ --color-fuchsia-100: #fae8ff;
+ --color-fuchsia-200: #f5d0fe;
+ --color-fuchsia-300: #f0abfc;
+ --color-fuchsia-400: #e879f9;
+ --color-fuchsia-500: #d946ef;
+ --color-fuchsia-600: #c026d3;
+ --color-fuchsia-700: #a21caf;
+ --color-fuchsia-800: #86198f;
+ --color-fuchsia-900: #701a75;
+ --color-fuchsia-950: #4a044e;
+ --color-pink-50: #fdf2f8;
+ --color-pink-100: #fce7f3;
+ --color-pink-200: #fbcfe8;
+ --color-pink-300: #f9a8d4;
+ --color-pink-400: #f472b6;
+ --color-pink-500: #ec4899;
+ --color-pink-600: #db2777;
+ --color-pink-700: #be185d;
+ --color-pink-800: #9d174d;
+ --color-pink-900: #831843;
+ --color-pink-950: #500724;
+ --color-rose-50: #fff1f2;
+ --color-rose-100: #ffe4e6;
+ --color-rose-200: #fecdd3;
+ --color-rose-300: #fda4af;
+ --color-rose-400: #fb7185;
+ --color-rose-500: #f43f5e;
+ --color-rose-600: #e11d48;
+ --color-rose-700: #be123c;
+ --color-rose-800: #9f1239;
+ --color-rose-900: #881337;
+ --color-rose-950: #4c0519;
+ --shadow-sm: 0 1px 2px 0 #0000000d;
+ --shadow: 0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;
+ --shadow-md: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
+ --shadow-lg: 0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;
+ --shadow-xl: 0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;
+ --shadow-2xl: 0 25px 50px -12px #00000040;
+ --shadow-inner: inset 0 2px 4px 0 #0000000d;
+ --shadow-none: none;
+ --space-0: 0px;
+ --space-1: 0.25rem;
+ --space-2: 0.5rem;
+ --space-3: 0.75rem;
+ --space-4: 1rem;
+ --space-5: 1.25rem;
+ --space-6: 1.5rem;
+ --space-7: 1.75rem;
+ --space-8: 2rem;
+ --space-9: 2.25rem;
+ --space-10: 2.5rem;
+ --space-11: 2.75rem;
+ --space-12: 3rem;
+ --space-14: 3.5rem;
+ --space-16: 4rem;
+ --space-20: 5rem;
+ --space-24: 6rem;
+ --space-28: 7rem;
+ --space-32: 8rem;
+ --space-36: 9rem;
+ --space-40: 10rem;
+ --space-44: 11rem;
+ --space-48: 12rem;
+ --space-52: 13rem;
+ --space-56: 14rem;
+ --space-60: 15rem;
+ --space-64: 16rem;
+ --space-72: 18rem;
+ --space-80: 20rem;
+ --space-96: 24rem;
+ --space-px: 1px;
+ --screen-sm: 640px;
+ --screen-md: 768px;
+ --screen-lg: 1024px;
+ --screen-xl: 1280px;
+ --screen-2xl: 1536px;
+ --w-0: 0px;
+ --w-1: 0.25rem;
+ --w-2: 0.5rem;
+ --w-3: 0.75rem;
+ --w-4: 1rem;
+ --w-5: 1.25rem;
+ --w-6: 1.5rem;
+ --w-7: 1.75rem;
+ --w-8: 2rem;
+ --w-9: 2.25rem;
+ --w-10: 2.5rem;
+ --w-11: 2.75rem;
+ --w-12: 3rem;
+ --w-14: 3.5rem;
+ --w-16: 4rem;
+ --w-20: 5rem;
+ --w-24: 6rem;
+ --w-28: 7rem;
+ --w-32: 8rem;
+ --w-36: 9rem;
+ --w-40: 10rem;
+ --w-44: 11rem;
+ --w-48: 12rem;
+ --w-52: 13rem;
+ --w-56: 14rem;
+ --w-60: 15rem;
+ --w-64: 16rem;
+ --w-72: 18rem;
+ --w-80: 20rem;
+ --w-96: 24rem;
+ --w-px: 1px;
+ --w-none: none;
+ --w-xs: 20rem;
+ --w-sm: 24rem;
+ --w-md: 28rem;
+ --w-lg: 32rem;
+ --w-xl: 36rem;
+ --w-2xl: 42rem;
+ --w-3xl: 48rem;
+ --w-4xl: 56rem;
+ --w-5xl: 64rem;
+ --w-6xl: 72rem;
+ --w-7xl: 80rem;
+ --w-full: 100%;
+ --w-min: min-content;
+ --w-max: max-content;
+ --w-fit: fit-content;
+ --w-prose: 65ch;
+ --w-screen-sm: 640px;
+ --w-screen-md: 768px;
+ --w-screen-lg: 1024px;
+ --w-screen-xl: 1280px;
+ --w-screen-2xl: 1536px;
+ --rounded-none: 0px;
+ --rounded-sm: 0.125rem;
+ --rounded: 0.25rem;
+ --rounded-md: 0.375rem;
+ --rounded-lg: 0.5rem;
+ --rounded-xl: 0.75rem;
+ --rounded-2xl: 1rem;
+ --rounded-3xl: 1.5rem;
+ --rounded-full: 9999px;
+}
diff --git a/practices/24-8-29/css/index.css b/practices/24-8-29/css/index.css
new file mode 100644
index 0000000..873bc54
--- /dev/null
+++ b/practices/24-8-29/css/index.css
@@ -0,0 +1,5 @@
+img {
+ width: 33%;
+ margin-left: auto;
+ margin-right: auto;
+}
diff --git a/practices/24-8-29/img/egg.png b/practices/24-8-29/img/egg.png
new file mode 100644
index 0000000..92d5556
Binary files /dev/null and b/practices/24-8-29/img/egg.png differ
diff --git a/practices/24-8-29/index.html b/practices/24-8-29/index.html
new file mode 100644
index 0000000..53cee79
--- /dev/null
+++ b/practices/24-8-29/index.html
@@ -0,0 +1,18 @@
+
+
+
+
+
+ 24-8-29 in class
+
+
+
+
+ this is the first in-class assignment
+
+ this is a photo of an egg
+
+
+ the egg is very nice i suppose
+
+
diff --git a/practices/24-9-10/css/common.css b/practices/24-9-10/css/common.css
new file mode 100644
index 0000000..4dd1e35
--- /dev/null
+++ b/practices/24-9-10/css/common.css
@@ -0,0 +1,673 @@
+*,
+:before,
+:after {
+ box-sizing: border-box;
+ border: 0 solid #e5e7eb;
+}
+
+:before,
+:after {
+ --tw-content: '';
+}
+
+html,
+:host {
+ -webkit-text-size-adjust: 100%;
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ -webkit-tap-highlight-color: transparent;
+ font-family:
+ ui-sans-serif,
+ system-ui,
+ sans-serif,
+ Apple Color Emoji,
+ Segoe UI Emoji,
+ Segoe UI Symbol,
+ Noto Color Emoji;
+ line-height: 1.5;
+}
+
+body {
+ line-height: inherit;
+ margin: 0;
+}
+
+hr {
+ color: inherit;
+ border-top-width: 1px;
+ height: 0;
+}
+
+abbr:where([title]) {
+ text-decoration: underline dotted;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+code,
+kbd,
+samp,
+pre {
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ font-family:
+ ui-monospace,
+ SFMono-Regular,
+ Menlo,
+ Monaco,
+ Consolas,
+ Liberation Mono,
+ Courier New,
+ monospace;
+ font-size: 1em;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ vertical-align: baseline;
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+table {
+ text-indent: 0;
+ border-color: inherit;
+ border-collapse: collapse;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-feature-settings: inherit;
+ font-variation-settings: inherit;
+ font-family: inherit;
+ font-size: 100%;
+ font-weight: inherit;
+ line-height: inherit;
+ letter-spacing: inherit;
+ color: inherit;
+ margin: 0;
+ padding: 0;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+input:where([type='button']),
+input:where([type='reset']),
+input:where([type='submit']) {
+ -webkit-appearance: button;
+ background-color: #0000;
+ background-image: none;
+}
+
+:-moz-focusring {
+ outline: auto;
+}
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ outline-offset: -2px;
+}
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ font: inherit;
+}
+
+summary {
+ display: list-item;
+}
+
+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 {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+dialog {
+ padding: 0;
+}
+
+textarea {
+ resize: vertical;
+}
+
+input::-moz-placeholder,
+textarea::-moz-placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+button,
+[role='button'] {
+ cursor: pointer;
+}
+
+:disabled {
+ cursor: default;
+}
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ vertical-align: middle;
+ display: block;
+}
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+[hidden] {
+ display: none;
+}
+
+*,
+:before,
+:after,
+::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: #3b82f680;
+ --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: ;
+ --tw-contain-size: ;
+ --tw-contain-layout: ;
+ --tw-contain-paint: ;
+ --tw-contain-style: ;
+}
+
+:root {
+ --color-inherit: inherit;
+ --color-current: currentColor;
+ --color-transparent: transparent;
+ --color-black: #000;
+ --color-white: #fff;
+ --color-slate-50: #f8fafc;
+ --color-slate-100: #f1f5f9;
+ --color-slate-200: #e2e8f0;
+ --color-slate-300: #cbd5e1;
+ --color-slate-400: #94a3b8;
+ --color-slate-500: #64748b;
+ --color-slate-600: #475569;
+ --color-slate-700: #334155;
+ --color-slate-800: #1e293b;
+ --color-slate-900: #0f172a;
+ --color-slate-950: #020617;
+ --color-gray-50: #f9fafb;
+ --color-gray-100: #f3f4f6;
+ --color-gray-200: #e5e7eb;
+ --color-gray-300: #d1d5db;
+ --color-gray-400: #9ca3af;
+ --color-gray-500: #6b7280;
+ --color-gray-600: #4b5563;
+ --color-gray-700: #374151;
+ --color-gray-800: #1f2937;
+ --color-gray-900: #111827;
+ --color-gray-950: #030712;
+ --color-zinc-50: #fafafa;
+ --color-zinc-100: #f4f4f5;
+ --color-zinc-200: #e4e4e7;
+ --color-zinc-300: #d4d4d8;
+ --color-zinc-400: #a1a1aa;
+ --color-zinc-500: #71717a;
+ --color-zinc-600: #52525b;
+ --color-zinc-700: #3f3f46;
+ --color-zinc-800: #27272a;
+ --color-zinc-900: #18181b;
+ --color-zinc-950: #09090b;
+ --color-neutral-50: #fafafa;
+ --color-neutral-100: #f5f5f5;
+ --color-neutral-200: #e5e5e5;
+ --color-neutral-300: #d4d4d4;
+ --color-neutral-400: #a3a3a3;
+ --color-neutral-500: #737373;
+ --color-neutral-600: #525252;
+ --color-neutral-700: #404040;
+ --color-neutral-800: #262626;
+ --color-neutral-900: #171717;
+ --color-neutral-950: #0a0a0a;
+ --color-stone-50: #fafaf9;
+ --color-stone-100: #f5f5f4;
+ --color-stone-200: #e7e5e4;
+ --color-stone-300: #d6d3d1;
+ --color-stone-400: #a8a29e;
+ --color-stone-500: #78716c;
+ --color-stone-600: #57534e;
+ --color-stone-700: #44403c;
+ --color-stone-800: #292524;
+ --color-stone-900: #1c1917;
+ --color-stone-950: #0c0a09;
+ --color-red-50: #fef2f2;
+ --color-red-100: #fee2e2;
+ --color-red-200: #fecaca;
+ --color-red-300: #fca5a5;
+ --color-red-400: #f87171;
+ --color-red-500: #ef4444;
+ --color-red-600: #dc2626;
+ --color-red-700: #b91c1c;
+ --color-red-800: #991b1b;
+ --color-red-900: #7f1d1d;
+ --color-red-950: #450a0a;
+ --color-orange-50: #fff7ed;
+ --color-orange-100: #ffedd5;
+ --color-orange-200: #fed7aa;
+ --color-orange-300: #fdba74;
+ --color-orange-400: #fb923c;
+ --color-orange-500: #f97316;
+ --color-orange-600: #ea580c;
+ --color-orange-700: #c2410c;
+ --color-orange-800: #9a3412;
+ --color-orange-900: #7c2d12;
+ --color-orange-950: #431407;
+ --color-amber-50: #fffbeb;
+ --color-amber-100: #fef3c7;
+ --color-amber-200: #fde68a;
+ --color-amber-300: #fcd34d;
+ --color-amber-400: #fbbf24;
+ --color-amber-500: #f59e0b;
+ --color-amber-600: #d97706;
+ --color-amber-700: #b45309;
+ --color-amber-800: #92400e;
+ --color-amber-900: #78350f;
+ --color-amber-950: #451a03;
+ --color-yellow-50: #fefce8;
+ --color-yellow-100: #fef9c3;
+ --color-yellow-200: #fef08a;
+ --color-yellow-300: #fde047;
+ --color-yellow-400: #facc15;
+ --color-yellow-500: #eab308;
+ --color-yellow-600: #ca8a04;
+ --color-yellow-700: #a16207;
+ --color-yellow-800: #854d0e;
+ --color-yellow-900: #713f12;
+ --color-yellow-950: #422006;
+ --color-lime-50: #f7fee7;
+ --color-lime-100: #ecfccb;
+ --color-lime-200: #d9f99d;
+ --color-lime-300: #bef264;
+ --color-lime-400: #a3e635;
+ --color-lime-500: #84cc16;
+ --color-lime-600: #65a30d;
+ --color-lime-700: #4d7c0f;
+ --color-lime-800: #3f6212;
+ --color-lime-900: #365314;
+ --color-lime-950: #1a2e05;
+ --color-green-50: #f0fdf4;
+ --color-green-100: #dcfce7;
+ --color-green-200: #bbf7d0;
+ --color-green-300: #86efac;
+ --color-green-400: #4ade80;
+ --color-green-500: #22c55e;
+ --color-green-600: #16a34a;
+ --color-green-700: #15803d;
+ --color-green-800: #166534;
+ --color-green-900: #14532d;
+ --color-green-950: #052e16;
+ --color-emerald-50: #ecfdf5;
+ --color-emerald-100: #d1fae5;
+ --color-emerald-200: #a7f3d0;
+ --color-emerald-300: #6ee7b7;
+ --color-emerald-400: #34d399;
+ --color-emerald-500: #10b981;
+ --color-emerald-600: #059669;
+ --color-emerald-700: #047857;
+ --color-emerald-800: #065f46;
+ --color-emerald-900: #064e3b;
+ --color-emerald-950: #022c22;
+ --color-teal-50: #f0fdfa;
+ --color-teal-100: #ccfbf1;
+ --color-teal-200: #99f6e4;
+ --color-teal-300: #5eead4;
+ --color-teal-400: #2dd4bf;
+ --color-teal-500: #14b8a6;
+ --color-teal-600: #0d9488;
+ --color-teal-700: #0f766e;
+ --color-teal-800: #115e59;
+ --color-teal-900: #134e4a;
+ --color-teal-950: #042f2e;
+ --color-cyan-50: #ecfeff;
+ --color-cyan-100: #cffafe;
+ --color-cyan-200: #a5f3fc;
+ --color-cyan-300: #67e8f9;
+ --color-cyan-400: #22d3ee;
+ --color-cyan-500: #06b6d4;
+ --color-cyan-600: #0891b2;
+ --color-cyan-700: #0e7490;
+ --color-cyan-800: #155e75;
+ --color-cyan-900: #164e63;
+ --color-cyan-950: #083344;
+ --color-sky-50: #f0f9ff;
+ --color-sky-100: #e0f2fe;
+ --color-sky-200: #bae6fd;
+ --color-sky-300: #7dd3fc;
+ --color-sky-400: #38bdf8;
+ --color-sky-500: #0ea5e9;
+ --color-sky-600: #0284c7;
+ --color-sky-700: #0369a1;
+ --color-sky-800: #075985;
+ --color-sky-900: #0c4a6e;
+ --color-sky-950: #082f49;
+ --color-blue-50: #eff6ff;
+ --color-blue-100: #dbeafe;
+ --color-blue-200: #bfdbfe;
+ --color-blue-300: #93c5fd;
+ --color-blue-400: #60a5fa;
+ --color-blue-500: #3b82f6;
+ --color-blue-600: #2563eb;
+ --color-blue-700: #1d4ed8;
+ --color-blue-800: #1e40af;
+ --color-blue-900: #1e3a8a;
+ --color-blue-950: #172554;
+ --color-indigo-50: #eef2ff;
+ --color-indigo-100: #e0e7ff;
+ --color-indigo-200: #c7d2fe;
+ --color-indigo-300: #a5b4fc;
+ --color-indigo-400: #818cf8;
+ --color-indigo-500: #6366f1;
+ --color-indigo-600: #4f46e5;
+ --color-indigo-700: #4338ca;
+ --color-indigo-800: #3730a3;
+ --color-indigo-900: #312e81;
+ --color-indigo-950: #1e1b4b;
+ --color-violet-50: #f5f3ff;
+ --color-violet-100: #ede9fe;
+ --color-violet-200: #ddd6fe;
+ --color-violet-300: #c4b5fd;
+ --color-violet-400: #a78bfa;
+ --color-violet-500: #8b5cf6;
+ --color-violet-600: #7c3aed;
+ --color-violet-700: #6d28d9;
+ --color-violet-800: #5b21b6;
+ --color-violet-900: #4c1d95;
+ --color-violet-950: #2e1065;
+ --color-purple-50: #faf5ff;
+ --color-purple-100: #f3e8ff;
+ --color-purple-200: #e9d5ff;
+ --color-purple-300: #d8b4fe;
+ --color-purple-400: #c084fc;
+ --color-purple-500: #a855f7;
+ --color-purple-600: #9333ea;
+ --color-purple-700: #7e22ce;
+ --color-purple-800: #6b21a8;
+ --color-purple-900: #581c87;
+ --color-purple-950: #3b0764;
+ --color-fuchsia-50: #fdf4ff;
+ --color-fuchsia-100: #fae8ff;
+ --color-fuchsia-200: #f5d0fe;
+ --color-fuchsia-300: #f0abfc;
+ --color-fuchsia-400: #e879f9;
+ --color-fuchsia-500: #d946ef;
+ --color-fuchsia-600: #c026d3;
+ --color-fuchsia-700: #a21caf;
+ --color-fuchsia-800: #86198f;
+ --color-fuchsia-900: #701a75;
+ --color-fuchsia-950: #4a044e;
+ --color-pink-50: #fdf2f8;
+ --color-pink-100: #fce7f3;
+ --color-pink-200: #fbcfe8;
+ --color-pink-300: #f9a8d4;
+ --color-pink-400: #f472b6;
+ --color-pink-500: #ec4899;
+ --color-pink-600: #db2777;
+ --color-pink-700: #be185d;
+ --color-pink-800: #9d174d;
+ --color-pink-900: #831843;
+ --color-pink-950: #500724;
+ --color-rose-50: #fff1f2;
+ --color-rose-100: #ffe4e6;
+ --color-rose-200: #fecdd3;
+ --color-rose-300: #fda4af;
+ --color-rose-400: #fb7185;
+ --color-rose-500: #f43f5e;
+ --color-rose-600: #e11d48;
+ --color-rose-700: #be123c;
+ --color-rose-800: #9f1239;
+ --color-rose-900: #881337;
+ --color-rose-950: #4c0519;
+ --shadow-sm: 0 1px 2px 0 #0000000d;
+ --shadow: 0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;
+ --shadow-md: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
+ --shadow-lg: 0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;
+ --shadow-xl: 0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;
+ --shadow-2xl: 0 25px 50px -12px #00000040;
+ --shadow-inner: inset 0 2px 4px 0 #0000000d;
+ --shadow-none: none;
+ --space-0: 0px;
+ --space-1: 0.25rem;
+ --space-2: 0.5rem;
+ --space-3: 0.75rem;
+ --space-4: 1rem;
+ --space-5: 1.25rem;
+ --space-6: 1.5rem;
+ --space-7: 1.75rem;
+ --space-8: 2rem;
+ --space-9: 2.25rem;
+ --space-10: 2.5rem;
+ --space-11: 2.75rem;
+ --space-12: 3rem;
+ --space-14: 3.5rem;
+ --space-16: 4rem;
+ --space-20: 5rem;
+ --space-24: 6rem;
+ --space-28: 7rem;
+ --space-32: 8rem;
+ --space-36: 9rem;
+ --space-40: 10rem;
+ --space-44: 11rem;
+ --space-48: 12rem;
+ --space-52: 13rem;
+ --space-56: 14rem;
+ --space-60: 15rem;
+ --space-64: 16rem;
+ --space-72: 18rem;
+ --space-80: 20rem;
+ --space-96: 24rem;
+ --space-px: 1px;
+ --screen-sm: 640px;
+ --screen-md: 768px;
+ --screen-lg: 1024px;
+ --screen-xl: 1280px;
+ --screen-2xl: 1536px;
+ --w-0: 0px;
+ --w-1: 0.25rem;
+ --w-2: 0.5rem;
+ --w-3: 0.75rem;
+ --w-4: 1rem;
+ --w-5: 1.25rem;
+ --w-6: 1.5rem;
+ --w-7: 1.75rem;
+ --w-8: 2rem;
+ --w-9: 2.25rem;
+ --w-10: 2.5rem;
+ --w-11: 2.75rem;
+ --w-12: 3rem;
+ --w-14: 3.5rem;
+ --w-16: 4rem;
+ --w-20: 5rem;
+ --w-24: 6rem;
+ --w-28: 7rem;
+ --w-32: 8rem;
+ --w-36: 9rem;
+ --w-40: 10rem;
+ --w-44: 11rem;
+ --w-48: 12rem;
+ --w-52: 13rem;
+ --w-56: 14rem;
+ --w-60: 15rem;
+ --w-64: 16rem;
+ --w-72: 18rem;
+ --w-80: 20rem;
+ --w-96: 24rem;
+ --w-px: 1px;
+ --w-none: none;
+ --w-xs: 20rem;
+ --w-sm: 24rem;
+ --w-md: 28rem;
+ --w-lg: 32rem;
+ --w-xl: 36rem;
+ --w-2xl: 42rem;
+ --w-3xl: 48rem;
+ --w-4xl: 56rem;
+ --w-5xl: 64rem;
+ --w-6xl: 72rem;
+ --w-7xl: 80rem;
+ --w-full: 100%;
+ --w-min: min-content;
+ --w-max: max-content;
+ --w-fit: fit-content;
+ --w-prose: 65ch;
+ --w-screen-sm: 640px;
+ --w-screen-md: 768px;
+ --w-screen-lg: 1024px;
+ --w-screen-xl: 1280px;
+ --w-screen-2xl: 1536px;
+ --rounded-none: 0px;
+ --rounded-sm: 0.125rem;
+ --rounded: 0.25rem;
+ --rounded-md: 0.375rem;
+ --rounded-lg: 0.5rem;
+ --rounded-xl: 0.75rem;
+ --rounded-2xl: 1rem;
+ --rounded-3xl: 1.5rem;
+ --rounded-full: 9999px;
+}
diff --git a/practices/24-9-10/css/index.css b/practices/24-9-10/css/index.css
new file mode 100644
index 0000000..50bd906
--- /dev/null
+++ b/practices/24-9-10/css/index.css
@@ -0,0 +1,26 @@
+@import 'common.css';
+
+header {
+ background-color: var(--color-purple-500);
+ display: flex;
+ gap: 1rem;
+ align-items: center;
+
+ & > img {
+ width: 64px;
+ }
+}
+
+main {
+ background-color: var(--color-amber-500);
+}
+
+footer {
+ background-color: var(--color-emerald-500);
+}
+
+body {
+ & > * {
+ padding: 6rem 1rem;
+ }
+}
diff --git a/practices/24-9-10/img/egg.png b/practices/24-9-10/img/egg.png
new file mode 100644
index 0000000..92d5556
Binary files /dev/null and b/practices/24-9-10/img/egg.png differ
diff --git a/practices/24-9-10/index.html b/practices/24-9-10/index.html
new file mode 100644
index 0000000..40111a6
--- /dev/null
+++ b/practices/24-9-10/index.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+ 24-9-10 in class
+
+
+
+
+
+
+ header
+
+
+ main
+
+
+
+
diff --git a/practices/24-9-12/css/common.css b/practices/24-9-12/css/common.css
new file mode 100644
index 0000000..4dd1e35
--- /dev/null
+++ b/practices/24-9-12/css/common.css
@@ -0,0 +1,673 @@
+*,
+:before,
+:after {
+ box-sizing: border-box;
+ border: 0 solid #e5e7eb;
+}
+
+:before,
+:after {
+ --tw-content: '';
+}
+
+html,
+:host {
+ -webkit-text-size-adjust: 100%;
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ -webkit-tap-highlight-color: transparent;
+ font-family:
+ ui-sans-serif,
+ system-ui,
+ sans-serif,
+ Apple Color Emoji,
+ Segoe UI Emoji,
+ Segoe UI Symbol,
+ Noto Color Emoji;
+ line-height: 1.5;
+}
+
+body {
+ line-height: inherit;
+ margin: 0;
+}
+
+hr {
+ color: inherit;
+ border-top-width: 1px;
+ height: 0;
+}
+
+abbr:where([title]) {
+ text-decoration: underline dotted;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+code,
+kbd,
+samp,
+pre {
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ font-family:
+ ui-monospace,
+ SFMono-Regular,
+ Menlo,
+ Monaco,
+ Consolas,
+ Liberation Mono,
+ Courier New,
+ monospace;
+ font-size: 1em;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ vertical-align: baseline;
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+table {
+ text-indent: 0;
+ border-color: inherit;
+ border-collapse: collapse;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-feature-settings: inherit;
+ font-variation-settings: inherit;
+ font-family: inherit;
+ font-size: 100%;
+ font-weight: inherit;
+ line-height: inherit;
+ letter-spacing: inherit;
+ color: inherit;
+ margin: 0;
+ padding: 0;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+input:where([type='button']),
+input:where([type='reset']),
+input:where([type='submit']) {
+ -webkit-appearance: button;
+ background-color: #0000;
+ background-image: none;
+}
+
+:-moz-focusring {
+ outline: auto;
+}
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ outline-offset: -2px;
+}
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ font: inherit;
+}
+
+summary {
+ display: list-item;
+}
+
+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 {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+dialog {
+ padding: 0;
+}
+
+textarea {
+ resize: vertical;
+}
+
+input::-moz-placeholder,
+textarea::-moz-placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+button,
+[role='button'] {
+ cursor: pointer;
+}
+
+:disabled {
+ cursor: default;
+}
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ vertical-align: middle;
+ display: block;
+}
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+[hidden] {
+ display: none;
+}
+
+*,
+:before,
+:after,
+::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: #3b82f680;
+ --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: ;
+ --tw-contain-size: ;
+ --tw-contain-layout: ;
+ --tw-contain-paint: ;
+ --tw-contain-style: ;
+}
+
+:root {
+ --color-inherit: inherit;
+ --color-current: currentColor;
+ --color-transparent: transparent;
+ --color-black: #000;
+ --color-white: #fff;
+ --color-slate-50: #f8fafc;
+ --color-slate-100: #f1f5f9;
+ --color-slate-200: #e2e8f0;
+ --color-slate-300: #cbd5e1;
+ --color-slate-400: #94a3b8;
+ --color-slate-500: #64748b;
+ --color-slate-600: #475569;
+ --color-slate-700: #334155;
+ --color-slate-800: #1e293b;
+ --color-slate-900: #0f172a;
+ --color-slate-950: #020617;
+ --color-gray-50: #f9fafb;
+ --color-gray-100: #f3f4f6;
+ --color-gray-200: #e5e7eb;
+ --color-gray-300: #d1d5db;
+ --color-gray-400: #9ca3af;
+ --color-gray-500: #6b7280;
+ --color-gray-600: #4b5563;
+ --color-gray-700: #374151;
+ --color-gray-800: #1f2937;
+ --color-gray-900: #111827;
+ --color-gray-950: #030712;
+ --color-zinc-50: #fafafa;
+ --color-zinc-100: #f4f4f5;
+ --color-zinc-200: #e4e4e7;
+ --color-zinc-300: #d4d4d8;
+ --color-zinc-400: #a1a1aa;
+ --color-zinc-500: #71717a;
+ --color-zinc-600: #52525b;
+ --color-zinc-700: #3f3f46;
+ --color-zinc-800: #27272a;
+ --color-zinc-900: #18181b;
+ --color-zinc-950: #09090b;
+ --color-neutral-50: #fafafa;
+ --color-neutral-100: #f5f5f5;
+ --color-neutral-200: #e5e5e5;
+ --color-neutral-300: #d4d4d4;
+ --color-neutral-400: #a3a3a3;
+ --color-neutral-500: #737373;
+ --color-neutral-600: #525252;
+ --color-neutral-700: #404040;
+ --color-neutral-800: #262626;
+ --color-neutral-900: #171717;
+ --color-neutral-950: #0a0a0a;
+ --color-stone-50: #fafaf9;
+ --color-stone-100: #f5f5f4;
+ --color-stone-200: #e7e5e4;
+ --color-stone-300: #d6d3d1;
+ --color-stone-400: #a8a29e;
+ --color-stone-500: #78716c;
+ --color-stone-600: #57534e;
+ --color-stone-700: #44403c;
+ --color-stone-800: #292524;
+ --color-stone-900: #1c1917;
+ --color-stone-950: #0c0a09;
+ --color-red-50: #fef2f2;
+ --color-red-100: #fee2e2;
+ --color-red-200: #fecaca;
+ --color-red-300: #fca5a5;
+ --color-red-400: #f87171;
+ --color-red-500: #ef4444;
+ --color-red-600: #dc2626;
+ --color-red-700: #b91c1c;
+ --color-red-800: #991b1b;
+ --color-red-900: #7f1d1d;
+ --color-red-950: #450a0a;
+ --color-orange-50: #fff7ed;
+ --color-orange-100: #ffedd5;
+ --color-orange-200: #fed7aa;
+ --color-orange-300: #fdba74;
+ --color-orange-400: #fb923c;
+ --color-orange-500: #f97316;
+ --color-orange-600: #ea580c;
+ --color-orange-700: #c2410c;
+ --color-orange-800: #9a3412;
+ --color-orange-900: #7c2d12;
+ --color-orange-950: #431407;
+ --color-amber-50: #fffbeb;
+ --color-amber-100: #fef3c7;
+ --color-amber-200: #fde68a;
+ --color-amber-300: #fcd34d;
+ --color-amber-400: #fbbf24;
+ --color-amber-500: #f59e0b;
+ --color-amber-600: #d97706;
+ --color-amber-700: #b45309;
+ --color-amber-800: #92400e;
+ --color-amber-900: #78350f;
+ --color-amber-950: #451a03;
+ --color-yellow-50: #fefce8;
+ --color-yellow-100: #fef9c3;
+ --color-yellow-200: #fef08a;
+ --color-yellow-300: #fde047;
+ --color-yellow-400: #facc15;
+ --color-yellow-500: #eab308;
+ --color-yellow-600: #ca8a04;
+ --color-yellow-700: #a16207;
+ --color-yellow-800: #854d0e;
+ --color-yellow-900: #713f12;
+ --color-yellow-950: #422006;
+ --color-lime-50: #f7fee7;
+ --color-lime-100: #ecfccb;
+ --color-lime-200: #d9f99d;
+ --color-lime-300: #bef264;
+ --color-lime-400: #a3e635;
+ --color-lime-500: #84cc16;
+ --color-lime-600: #65a30d;
+ --color-lime-700: #4d7c0f;
+ --color-lime-800: #3f6212;
+ --color-lime-900: #365314;
+ --color-lime-950: #1a2e05;
+ --color-green-50: #f0fdf4;
+ --color-green-100: #dcfce7;
+ --color-green-200: #bbf7d0;
+ --color-green-300: #86efac;
+ --color-green-400: #4ade80;
+ --color-green-500: #22c55e;
+ --color-green-600: #16a34a;
+ --color-green-700: #15803d;
+ --color-green-800: #166534;
+ --color-green-900: #14532d;
+ --color-green-950: #052e16;
+ --color-emerald-50: #ecfdf5;
+ --color-emerald-100: #d1fae5;
+ --color-emerald-200: #a7f3d0;
+ --color-emerald-300: #6ee7b7;
+ --color-emerald-400: #34d399;
+ --color-emerald-500: #10b981;
+ --color-emerald-600: #059669;
+ --color-emerald-700: #047857;
+ --color-emerald-800: #065f46;
+ --color-emerald-900: #064e3b;
+ --color-emerald-950: #022c22;
+ --color-teal-50: #f0fdfa;
+ --color-teal-100: #ccfbf1;
+ --color-teal-200: #99f6e4;
+ --color-teal-300: #5eead4;
+ --color-teal-400: #2dd4bf;
+ --color-teal-500: #14b8a6;
+ --color-teal-600: #0d9488;
+ --color-teal-700: #0f766e;
+ --color-teal-800: #115e59;
+ --color-teal-900: #134e4a;
+ --color-teal-950: #042f2e;
+ --color-cyan-50: #ecfeff;
+ --color-cyan-100: #cffafe;
+ --color-cyan-200: #a5f3fc;
+ --color-cyan-300: #67e8f9;
+ --color-cyan-400: #22d3ee;
+ --color-cyan-500: #06b6d4;
+ --color-cyan-600: #0891b2;
+ --color-cyan-700: #0e7490;
+ --color-cyan-800: #155e75;
+ --color-cyan-900: #164e63;
+ --color-cyan-950: #083344;
+ --color-sky-50: #f0f9ff;
+ --color-sky-100: #e0f2fe;
+ --color-sky-200: #bae6fd;
+ --color-sky-300: #7dd3fc;
+ --color-sky-400: #38bdf8;
+ --color-sky-500: #0ea5e9;
+ --color-sky-600: #0284c7;
+ --color-sky-700: #0369a1;
+ --color-sky-800: #075985;
+ --color-sky-900: #0c4a6e;
+ --color-sky-950: #082f49;
+ --color-blue-50: #eff6ff;
+ --color-blue-100: #dbeafe;
+ --color-blue-200: #bfdbfe;
+ --color-blue-300: #93c5fd;
+ --color-blue-400: #60a5fa;
+ --color-blue-500: #3b82f6;
+ --color-blue-600: #2563eb;
+ --color-blue-700: #1d4ed8;
+ --color-blue-800: #1e40af;
+ --color-blue-900: #1e3a8a;
+ --color-blue-950: #172554;
+ --color-indigo-50: #eef2ff;
+ --color-indigo-100: #e0e7ff;
+ --color-indigo-200: #c7d2fe;
+ --color-indigo-300: #a5b4fc;
+ --color-indigo-400: #818cf8;
+ --color-indigo-500: #6366f1;
+ --color-indigo-600: #4f46e5;
+ --color-indigo-700: #4338ca;
+ --color-indigo-800: #3730a3;
+ --color-indigo-900: #312e81;
+ --color-indigo-950: #1e1b4b;
+ --color-violet-50: #f5f3ff;
+ --color-violet-100: #ede9fe;
+ --color-violet-200: #ddd6fe;
+ --color-violet-300: #c4b5fd;
+ --color-violet-400: #a78bfa;
+ --color-violet-500: #8b5cf6;
+ --color-violet-600: #7c3aed;
+ --color-violet-700: #6d28d9;
+ --color-violet-800: #5b21b6;
+ --color-violet-900: #4c1d95;
+ --color-violet-950: #2e1065;
+ --color-purple-50: #faf5ff;
+ --color-purple-100: #f3e8ff;
+ --color-purple-200: #e9d5ff;
+ --color-purple-300: #d8b4fe;
+ --color-purple-400: #c084fc;
+ --color-purple-500: #a855f7;
+ --color-purple-600: #9333ea;
+ --color-purple-700: #7e22ce;
+ --color-purple-800: #6b21a8;
+ --color-purple-900: #581c87;
+ --color-purple-950: #3b0764;
+ --color-fuchsia-50: #fdf4ff;
+ --color-fuchsia-100: #fae8ff;
+ --color-fuchsia-200: #f5d0fe;
+ --color-fuchsia-300: #f0abfc;
+ --color-fuchsia-400: #e879f9;
+ --color-fuchsia-500: #d946ef;
+ --color-fuchsia-600: #c026d3;
+ --color-fuchsia-700: #a21caf;
+ --color-fuchsia-800: #86198f;
+ --color-fuchsia-900: #701a75;
+ --color-fuchsia-950: #4a044e;
+ --color-pink-50: #fdf2f8;
+ --color-pink-100: #fce7f3;
+ --color-pink-200: #fbcfe8;
+ --color-pink-300: #f9a8d4;
+ --color-pink-400: #f472b6;
+ --color-pink-500: #ec4899;
+ --color-pink-600: #db2777;
+ --color-pink-700: #be185d;
+ --color-pink-800: #9d174d;
+ --color-pink-900: #831843;
+ --color-pink-950: #500724;
+ --color-rose-50: #fff1f2;
+ --color-rose-100: #ffe4e6;
+ --color-rose-200: #fecdd3;
+ --color-rose-300: #fda4af;
+ --color-rose-400: #fb7185;
+ --color-rose-500: #f43f5e;
+ --color-rose-600: #e11d48;
+ --color-rose-700: #be123c;
+ --color-rose-800: #9f1239;
+ --color-rose-900: #881337;
+ --color-rose-950: #4c0519;
+ --shadow-sm: 0 1px 2px 0 #0000000d;
+ --shadow: 0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;
+ --shadow-md: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
+ --shadow-lg: 0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;
+ --shadow-xl: 0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;
+ --shadow-2xl: 0 25px 50px -12px #00000040;
+ --shadow-inner: inset 0 2px 4px 0 #0000000d;
+ --shadow-none: none;
+ --space-0: 0px;
+ --space-1: 0.25rem;
+ --space-2: 0.5rem;
+ --space-3: 0.75rem;
+ --space-4: 1rem;
+ --space-5: 1.25rem;
+ --space-6: 1.5rem;
+ --space-7: 1.75rem;
+ --space-8: 2rem;
+ --space-9: 2.25rem;
+ --space-10: 2.5rem;
+ --space-11: 2.75rem;
+ --space-12: 3rem;
+ --space-14: 3.5rem;
+ --space-16: 4rem;
+ --space-20: 5rem;
+ --space-24: 6rem;
+ --space-28: 7rem;
+ --space-32: 8rem;
+ --space-36: 9rem;
+ --space-40: 10rem;
+ --space-44: 11rem;
+ --space-48: 12rem;
+ --space-52: 13rem;
+ --space-56: 14rem;
+ --space-60: 15rem;
+ --space-64: 16rem;
+ --space-72: 18rem;
+ --space-80: 20rem;
+ --space-96: 24rem;
+ --space-px: 1px;
+ --screen-sm: 640px;
+ --screen-md: 768px;
+ --screen-lg: 1024px;
+ --screen-xl: 1280px;
+ --screen-2xl: 1536px;
+ --w-0: 0px;
+ --w-1: 0.25rem;
+ --w-2: 0.5rem;
+ --w-3: 0.75rem;
+ --w-4: 1rem;
+ --w-5: 1.25rem;
+ --w-6: 1.5rem;
+ --w-7: 1.75rem;
+ --w-8: 2rem;
+ --w-9: 2.25rem;
+ --w-10: 2.5rem;
+ --w-11: 2.75rem;
+ --w-12: 3rem;
+ --w-14: 3.5rem;
+ --w-16: 4rem;
+ --w-20: 5rem;
+ --w-24: 6rem;
+ --w-28: 7rem;
+ --w-32: 8rem;
+ --w-36: 9rem;
+ --w-40: 10rem;
+ --w-44: 11rem;
+ --w-48: 12rem;
+ --w-52: 13rem;
+ --w-56: 14rem;
+ --w-60: 15rem;
+ --w-64: 16rem;
+ --w-72: 18rem;
+ --w-80: 20rem;
+ --w-96: 24rem;
+ --w-px: 1px;
+ --w-none: none;
+ --w-xs: 20rem;
+ --w-sm: 24rem;
+ --w-md: 28rem;
+ --w-lg: 32rem;
+ --w-xl: 36rem;
+ --w-2xl: 42rem;
+ --w-3xl: 48rem;
+ --w-4xl: 56rem;
+ --w-5xl: 64rem;
+ --w-6xl: 72rem;
+ --w-7xl: 80rem;
+ --w-full: 100%;
+ --w-min: min-content;
+ --w-max: max-content;
+ --w-fit: fit-content;
+ --w-prose: 65ch;
+ --w-screen-sm: 640px;
+ --w-screen-md: 768px;
+ --w-screen-lg: 1024px;
+ --w-screen-xl: 1280px;
+ --w-screen-2xl: 1536px;
+ --rounded-none: 0px;
+ --rounded-sm: 0.125rem;
+ --rounded: 0.25rem;
+ --rounded-md: 0.375rem;
+ --rounded-lg: 0.5rem;
+ --rounded-xl: 0.75rem;
+ --rounded-2xl: 1rem;
+ --rounded-3xl: 1.5rem;
+ --rounded-full: 9999px;
+}
diff --git a/practices/24-9-12/css/index.css b/practices/24-9-12/css/index.css
new file mode 100644
index 0000000..d0aec68
--- /dev/null
+++ b/practices/24-9-12/css/index.css
@@ -0,0 +1,52 @@
+@import 'common.css';
+
+/* fonts */
+@import url('https://fonts.googleapis.com/css2?family=Playpen+Sans:wght@100..800&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=Exo+2:ital,wght@0,100..900;1,100..900&family=Playpen+Sans:wght@100..800&display=swap');
+
+header {
+ background-color: var(--color-emerald-500);
+ display: flex;
+ gap: 1rem;
+ align-items: center;
+ font-family: 'Playpen Sans', sans-serif;
+ font-size: 2rem;
+
+ & > img {
+ width: 64px;
+ padding: 1rem;
+ border: 2px solid black;
+ background-color: white;
+ }
+}
+
+body {
+ & > * {
+ padding: 2rem 1rem;
+ }
+}
+
+main {
+ padding: 2rem 4rem;
+ display: grid;
+ gap: 2rem;
+ grid-template-columns: 2fr 1fr;
+ font-family: 'Exo 2', sans-serif;
+
+ p {
+ font-size: 1.25rem;
+ padding: 4rem 2rem;
+ text-align: center;
+ background-color: var(--color-amber-200);
+ }
+}
+
+footer {
+ background-color: var(--color-gray-800);
+ color: white;
+
+ p {
+ font-family: 'Playpen Sans', sans-serif;
+ font-size: 1.5rem;
+ }
+}
diff --git a/practices/24-9-12/img/egg.png b/practices/24-9-12/img/egg.png
new file mode 100644
index 0000000..92d5556
Binary files /dev/null and b/practices/24-9-12/img/egg.png differ
diff --git a/practices/24-9-12/index.html b/practices/24-9-12/index.html
new file mode 100644
index 0000000..a7a23fc
--- /dev/null
+++ b/practices/24-9-12/index.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 24-9-12 in class
+
+
+
+
+
+
+ i am a google font h1 element
+
+
+ i am a google font p element
+ i am too
+
+
+
+
diff --git a/practices/24-9-19/css/common.css b/practices/24-9-19/css/common.css
new file mode 100644
index 0000000..4dd1e35
--- /dev/null
+++ b/practices/24-9-19/css/common.css
@@ -0,0 +1,673 @@
+*,
+:before,
+:after {
+ box-sizing: border-box;
+ border: 0 solid #e5e7eb;
+}
+
+:before,
+:after {
+ --tw-content: '';
+}
+
+html,
+:host {
+ -webkit-text-size-adjust: 100%;
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ -webkit-tap-highlight-color: transparent;
+ font-family:
+ ui-sans-serif,
+ system-ui,
+ sans-serif,
+ Apple Color Emoji,
+ Segoe UI Emoji,
+ Segoe UI Symbol,
+ Noto Color Emoji;
+ line-height: 1.5;
+}
+
+body {
+ line-height: inherit;
+ margin: 0;
+}
+
+hr {
+ color: inherit;
+ border-top-width: 1px;
+ height: 0;
+}
+
+abbr:where([title]) {
+ text-decoration: underline dotted;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+code,
+kbd,
+samp,
+pre {
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ font-family:
+ ui-monospace,
+ SFMono-Regular,
+ Menlo,
+ Monaco,
+ Consolas,
+ Liberation Mono,
+ Courier New,
+ monospace;
+ font-size: 1em;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ vertical-align: baseline;
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+table {
+ text-indent: 0;
+ border-color: inherit;
+ border-collapse: collapse;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-feature-settings: inherit;
+ font-variation-settings: inherit;
+ font-family: inherit;
+ font-size: 100%;
+ font-weight: inherit;
+ line-height: inherit;
+ letter-spacing: inherit;
+ color: inherit;
+ margin: 0;
+ padding: 0;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+input:where([type='button']),
+input:where([type='reset']),
+input:where([type='submit']) {
+ -webkit-appearance: button;
+ background-color: #0000;
+ background-image: none;
+}
+
+:-moz-focusring {
+ outline: auto;
+}
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ outline-offset: -2px;
+}
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ font: inherit;
+}
+
+summary {
+ display: list-item;
+}
+
+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 {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+dialog {
+ padding: 0;
+}
+
+textarea {
+ resize: vertical;
+}
+
+input::-moz-placeholder,
+textarea::-moz-placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+button,
+[role='button'] {
+ cursor: pointer;
+}
+
+:disabled {
+ cursor: default;
+}
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ vertical-align: middle;
+ display: block;
+}
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+[hidden] {
+ display: none;
+}
+
+*,
+:before,
+:after,
+::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: #3b82f680;
+ --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: ;
+ --tw-contain-size: ;
+ --tw-contain-layout: ;
+ --tw-contain-paint: ;
+ --tw-contain-style: ;
+}
+
+:root {
+ --color-inherit: inherit;
+ --color-current: currentColor;
+ --color-transparent: transparent;
+ --color-black: #000;
+ --color-white: #fff;
+ --color-slate-50: #f8fafc;
+ --color-slate-100: #f1f5f9;
+ --color-slate-200: #e2e8f0;
+ --color-slate-300: #cbd5e1;
+ --color-slate-400: #94a3b8;
+ --color-slate-500: #64748b;
+ --color-slate-600: #475569;
+ --color-slate-700: #334155;
+ --color-slate-800: #1e293b;
+ --color-slate-900: #0f172a;
+ --color-slate-950: #020617;
+ --color-gray-50: #f9fafb;
+ --color-gray-100: #f3f4f6;
+ --color-gray-200: #e5e7eb;
+ --color-gray-300: #d1d5db;
+ --color-gray-400: #9ca3af;
+ --color-gray-500: #6b7280;
+ --color-gray-600: #4b5563;
+ --color-gray-700: #374151;
+ --color-gray-800: #1f2937;
+ --color-gray-900: #111827;
+ --color-gray-950: #030712;
+ --color-zinc-50: #fafafa;
+ --color-zinc-100: #f4f4f5;
+ --color-zinc-200: #e4e4e7;
+ --color-zinc-300: #d4d4d8;
+ --color-zinc-400: #a1a1aa;
+ --color-zinc-500: #71717a;
+ --color-zinc-600: #52525b;
+ --color-zinc-700: #3f3f46;
+ --color-zinc-800: #27272a;
+ --color-zinc-900: #18181b;
+ --color-zinc-950: #09090b;
+ --color-neutral-50: #fafafa;
+ --color-neutral-100: #f5f5f5;
+ --color-neutral-200: #e5e5e5;
+ --color-neutral-300: #d4d4d4;
+ --color-neutral-400: #a3a3a3;
+ --color-neutral-500: #737373;
+ --color-neutral-600: #525252;
+ --color-neutral-700: #404040;
+ --color-neutral-800: #262626;
+ --color-neutral-900: #171717;
+ --color-neutral-950: #0a0a0a;
+ --color-stone-50: #fafaf9;
+ --color-stone-100: #f5f5f4;
+ --color-stone-200: #e7e5e4;
+ --color-stone-300: #d6d3d1;
+ --color-stone-400: #a8a29e;
+ --color-stone-500: #78716c;
+ --color-stone-600: #57534e;
+ --color-stone-700: #44403c;
+ --color-stone-800: #292524;
+ --color-stone-900: #1c1917;
+ --color-stone-950: #0c0a09;
+ --color-red-50: #fef2f2;
+ --color-red-100: #fee2e2;
+ --color-red-200: #fecaca;
+ --color-red-300: #fca5a5;
+ --color-red-400: #f87171;
+ --color-red-500: #ef4444;
+ --color-red-600: #dc2626;
+ --color-red-700: #b91c1c;
+ --color-red-800: #991b1b;
+ --color-red-900: #7f1d1d;
+ --color-red-950: #450a0a;
+ --color-orange-50: #fff7ed;
+ --color-orange-100: #ffedd5;
+ --color-orange-200: #fed7aa;
+ --color-orange-300: #fdba74;
+ --color-orange-400: #fb923c;
+ --color-orange-500: #f97316;
+ --color-orange-600: #ea580c;
+ --color-orange-700: #c2410c;
+ --color-orange-800: #9a3412;
+ --color-orange-900: #7c2d12;
+ --color-orange-950: #431407;
+ --color-amber-50: #fffbeb;
+ --color-amber-100: #fef3c7;
+ --color-amber-200: #fde68a;
+ --color-amber-300: #fcd34d;
+ --color-amber-400: #fbbf24;
+ --color-amber-500: #f59e0b;
+ --color-amber-600: #d97706;
+ --color-amber-700: #b45309;
+ --color-amber-800: #92400e;
+ --color-amber-900: #78350f;
+ --color-amber-950: #451a03;
+ --color-yellow-50: #fefce8;
+ --color-yellow-100: #fef9c3;
+ --color-yellow-200: #fef08a;
+ --color-yellow-300: #fde047;
+ --color-yellow-400: #facc15;
+ --color-yellow-500: #eab308;
+ --color-yellow-600: #ca8a04;
+ --color-yellow-700: #a16207;
+ --color-yellow-800: #854d0e;
+ --color-yellow-900: #713f12;
+ --color-yellow-950: #422006;
+ --color-lime-50: #f7fee7;
+ --color-lime-100: #ecfccb;
+ --color-lime-200: #d9f99d;
+ --color-lime-300: #bef264;
+ --color-lime-400: #a3e635;
+ --color-lime-500: #84cc16;
+ --color-lime-600: #65a30d;
+ --color-lime-700: #4d7c0f;
+ --color-lime-800: #3f6212;
+ --color-lime-900: #365314;
+ --color-lime-950: #1a2e05;
+ --color-green-50: #f0fdf4;
+ --color-green-100: #dcfce7;
+ --color-green-200: #bbf7d0;
+ --color-green-300: #86efac;
+ --color-green-400: #4ade80;
+ --color-green-500: #22c55e;
+ --color-green-600: #16a34a;
+ --color-green-700: #15803d;
+ --color-green-800: #166534;
+ --color-green-900: #14532d;
+ --color-green-950: #052e16;
+ --color-emerald-50: #ecfdf5;
+ --color-emerald-100: #d1fae5;
+ --color-emerald-200: #a7f3d0;
+ --color-emerald-300: #6ee7b7;
+ --color-emerald-400: #34d399;
+ --color-emerald-500: #10b981;
+ --color-emerald-600: #059669;
+ --color-emerald-700: #047857;
+ --color-emerald-800: #065f46;
+ --color-emerald-900: #064e3b;
+ --color-emerald-950: #022c22;
+ --color-teal-50: #f0fdfa;
+ --color-teal-100: #ccfbf1;
+ --color-teal-200: #99f6e4;
+ --color-teal-300: #5eead4;
+ --color-teal-400: #2dd4bf;
+ --color-teal-500: #14b8a6;
+ --color-teal-600: #0d9488;
+ --color-teal-700: #0f766e;
+ --color-teal-800: #115e59;
+ --color-teal-900: #134e4a;
+ --color-teal-950: #042f2e;
+ --color-cyan-50: #ecfeff;
+ --color-cyan-100: #cffafe;
+ --color-cyan-200: #a5f3fc;
+ --color-cyan-300: #67e8f9;
+ --color-cyan-400: #22d3ee;
+ --color-cyan-500: #06b6d4;
+ --color-cyan-600: #0891b2;
+ --color-cyan-700: #0e7490;
+ --color-cyan-800: #155e75;
+ --color-cyan-900: #164e63;
+ --color-cyan-950: #083344;
+ --color-sky-50: #f0f9ff;
+ --color-sky-100: #e0f2fe;
+ --color-sky-200: #bae6fd;
+ --color-sky-300: #7dd3fc;
+ --color-sky-400: #38bdf8;
+ --color-sky-500: #0ea5e9;
+ --color-sky-600: #0284c7;
+ --color-sky-700: #0369a1;
+ --color-sky-800: #075985;
+ --color-sky-900: #0c4a6e;
+ --color-sky-950: #082f49;
+ --color-blue-50: #eff6ff;
+ --color-blue-100: #dbeafe;
+ --color-blue-200: #bfdbfe;
+ --color-blue-300: #93c5fd;
+ --color-blue-400: #60a5fa;
+ --color-blue-500: #3b82f6;
+ --color-blue-600: #2563eb;
+ --color-blue-700: #1d4ed8;
+ --color-blue-800: #1e40af;
+ --color-blue-900: #1e3a8a;
+ --color-blue-950: #172554;
+ --color-indigo-50: #eef2ff;
+ --color-indigo-100: #e0e7ff;
+ --color-indigo-200: #c7d2fe;
+ --color-indigo-300: #a5b4fc;
+ --color-indigo-400: #818cf8;
+ --color-indigo-500: #6366f1;
+ --color-indigo-600: #4f46e5;
+ --color-indigo-700: #4338ca;
+ --color-indigo-800: #3730a3;
+ --color-indigo-900: #312e81;
+ --color-indigo-950: #1e1b4b;
+ --color-violet-50: #f5f3ff;
+ --color-violet-100: #ede9fe;
+ --color-violet-200: #ddd6fe;
+ --color-violet-300: #c4b5fd;
+ --color-violet-400: #a78bfa;
+ --color-violet-500: #8b5cf6;
+ --color-violet-600: #7c3aed;
+ --color-violet-700: #6d28d9;
+ --color-violet-800: #5b21b6;
+ --color-violet-900: #4c1d95;
+ --color-violet-950: #2e1065;
+ --color-purple-50: #faf5ff;
+ --color-purple-100: #f3e8ff;
+ --color-purple-200: #e9d5ff;
+ --color-purple-300: #d8b4fe;
+ --color-purple-400: #c084fc;
+ --color-purple-500: #a855f7;
+ --color-purple-600: #9333ea;
+ --color-purple-700: #7e22ce;
+ --color-purple-800: #6b21a8;
+ --color-purple-900: #581c87;
+ --color-purple-950: #3b0764;
+ --color-fuchsia-50: #fdf4ff;
+ --color-fuchsia-100: #fae8ff;
+ --color-fuchsia-200: #f5d0fe;
+ --color-fuchsia-300: #f0abfc;
+ --color-fuchsia-400: #e879f9;
+ --color-fuchsia-500: #d946ef;
+ --color-fuchsia-600: #c026d3;
+ --color-fuchsia-700: #a21caf;
+ --color-fuchsia-800: #86198f;
+ --color-fuchsia-900: #701a75;
+ --color-fuchsia-950: #4a044e;
+ --color-pink-50: #fdf2f8;
+ --color-pink-100: #fce7f3;
+ --color-pink-200: #fbcfe8;
+ --color-pink-300: #f9a8d4;
+ --color-pink-400: #f472b6;
+ --color-pink-500: #ec4899;
+ --color-pink-600: #db2777;
+ --color-pink-700: #be185d;
+ --color-pink-800: #9d174d;
+ --color-pink-900: #831843;
+ --color-pink-950: #500724;
+ --color-rose-50: #fff1f2;
+ --color-rose-100: #ffe4e6;
+ --color-rose-200: #fecdd3;
+ --color-rose-300: #fda4af;
+ --color-rose-400: #fb7185;
+ --color-rose-500: #f43f5e;
+ --color-rose-600: #e11d48;
+ --color-rose-700: #be123c;
+ --color-rose-800: #9f1239;
+ --color-rose-900: #881337;
+ --color-rose-950: #4c0519;
+ --shadow-sm: 0 1px 2px 0 #0000000d;
+ --shadow: 0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;
+ --shadow-md: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
+ --shadow-lg: 0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;
+ --shadow-xl: 0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;
+ --shadow-2xl: 0 25px 50px -12px #00000040;
+ --shadow-inner: inset 0 2px 4px 0 #0000000d;
+ --shadow-none: none;
+ --space-0: 0px;
+ --space-1: 0.25rem;
+ --space-2: 0.5rem;
+ --space-3: 0.75rem;
+ --space-4: 1rem;
+ --space-5: 1.25rem;
+ --space-6: 1.5rem;
+ --space-7: 1.75rem;
+ --space-8: 2rem;
+ --space-9: 2.25rem;
+ --space-10: 2.5rem;
+ --space-11: 2.75rem;
+ --space-12: 3rem;
+ --space-14: 3.5rem;
+ --space-16: 4rem;
+ --space-20: 5rem;
+ --space-24: 6rem;
+ --space-28: 7rem;
+ --space-32: 8rem;
+ --space-36: 9rem;
+ --space-40: 10rem;
+ --space-44: 11rem;
+ --space-48: 12rem;
+ --space-52: 13rem;
+ --space-56: 14rem;
+ --space-60: 15rem;
+ --space-64: 16rem;
+ --space-72: 18rem;
+ --space-80: 20rem;
+ --space-96: 24rem;
+ --space-px: 1px;
+ --screen-sm: 640px;
+ --screen-md: 768px;
+ --screen-lg: 1024px;
+ --screen-xl: 1280px;
+ --screen-2xl: 1536px;
+ --w-0: 0px;
+ --w-1: 0.25rem;
+ --w-2: 0.5rem;
+ --w-3: 0.75rem;
+ --w-4: 1rem;
+ --w-5: 1.25rem;
+ --w-6: 1.5rem;
+ --w-7: 1.75rem;
+ --w-8: 2rem;
+ --w-9: 2.25rem;
+ --w-10: 2.5rem;
+ --w-11: 2.75rem;
+ --w-12: 3rem;
+ --w-14: 3.5rem;
+ --w-16: 4rem;
+ --w-20: 5rem;
+ --w-24: 6rem;
+ --w-28: 7rem;
+ --w-32: 8rem;
+ --w-36: 9rem;
+ --w-40: 10rem;
+ --w-44: 11rem;
+ --w-48: 12rem;
+ --w-52: 13rem;
+ --w-56: 14rem;
+ --w-60: 15rem;
+ --w-64: 16rem;
+ --w-72: 18rem;
+ --w-80: 20rem;
+ --w-96: 24rem;
+ --w-px: 1px;
+ --w-none: none;
+ --w-xs: 20rem;
+ --w-sm: 24rem;
+ --w-md: 28rem;
+ --w-lg: 32rem;
+ --w-xl: 36rem;
+ --w-2xl: 42rem;
+ --w-3xl: 48rem;
+ --w-4xl: 56rem;
+ --w-5xl: 64rem;
+ --w-6xl: 72rem;
+ --w-7xl: 80rem;
+ --w-full: 100%;
+ --w-min: min-content;
+ --w-max: max-content;
+ --w-fit: fit-content;
+ --w-prose: 65ch;
+ --w-screen-sm: 640px;
+ --w-screen-md: 768px;
+ --w-screen-lg: 1024px;
+ --w-screen-xl: 1280px;
+ --w-screen-2xl: 1536px;
+ --rounded-none: 0px;
+ --rounded-sm: 0.125rem;
+ --rounded: 0.25rem;
+ --rounded-md: 0.375rem;
+ --rounded-lg: 0.5rem;
+ --rounded-xl: 0.75rem;
+ --rounded-2xl: 1rem;
+ --rounded-3xl: 1.5rem;
+ --rounded-full: 9999px;
+}
diff --git a/practices/24-9-19/css/index.css b/practices/24-9-19/css/index.css
new file mode 100644
index 0000000..653ae98
--- /dev/null
+++ b/practices/24-9-19/css/index.css
@@ -0,0 +1,50 @@
+@import 'common.css';
+
+header {
+ color: white;
+ background-color: var(--color-gray-800);
+ display: flex;
+ gap: 1rem;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 1rem;
+ position: relative;
+
+ .links {
+ display: flex;
+
+ a {
+ padding: 1rem;
+ cursor: pointer;
+
+ &:hover {
+ background-color: var(--color-gray-900);
+ }
+ }
+ }
+
+ .dropdown {
+ display: none;
+ background-color: var(--color-gray-800);
+ padding: 1rem;
+ border-radius: 1rem;
+ position: absolute;
+ right: 1rem;
+ top: calc(100% + 0.5rem);
+ flex-direction: column;
+
+ a {
+ padding: 0.5rem;
+ border-radius: 0.5rem;
+ cursor: pointer;
+
+ &:hover {
+ background-color: var(--color-gray-900);
+ }
+ }
+ }
+
+ a:hover + .dropdown {
+ display: flex;
+ }
+}
diff --git a/practices/24-9-19/index.html b/practices/24-9-19/index.html
new file mode 100644
index 0000000..c52045a
--- /dev/null
+++ b/practices/24-9-19/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ 24-9-12 in class
+
+
+
+
+
+
+
diff --git a/scripts/common.sh b/scripts/common.sh
new file mode 100644
index 0000000..b3bc355
--- /dev/null
+++ b/scripts/common.sh
@@ -0,0 +1,9 @@
+#!/bin/zsh
+
+export ROOT=$(git rev-parse --show-toplevel)
+export ASSIGNMENT_DIR="$ROOT/assignments"
+export PRACTICES_DIR="$ROOT/practices"
+export SHARED_DIR="$ROOT/shared"
+export OUT_DIR="$ROOT/.out"
+export ZIP_DIR="$ROOT/.out/zip"
+export SCRIPTS_DIR="$ROOT/scripts"
diff --git a/scripts/link.sh b/scripts/link.sh
new file mode 100644
index 0000000..902f71a
--- /dev/null
+++ b/scripts/link.sh
@@ -0,0 +1,17 @@
+#!/bin/zsh
+
+source scripts/common.sh
+
+assignments=($(ls -d $ASSIGNMENT_DIR/*/))
+practices=($(ls -d $PRACTICES_DIR/*/))
+projects=($assignments $practices)
+
+for project in ${projects[@]}; do
+ cd $project || exit 1
+
+ name=${project%/}
+ name=${name##*/}
+
+ echo "linking shared/common.css to $name"
+ cp $SHARED_DIR/common.css css/common.css
+done
diff --git a/scripts/new.sh b/scripts/new.sh
new file mode 100644
index 0000000..ce72c96
--- /dev/null
+++ b/scripts/new.sh
@@ -0,0 +1,30 @@
+#!/bin/zsh
+
+source scripts/common.sh
+
+if [ -z "$1" ] || [ -z "$2" ]; then
+ echo "Usage: $0 "
+ exit 1
+fi
+
+if [ "$1" = "assignment" ]; then
+ DIR=$ASSIGNMENT_DIR
+elif [ "$1" = "practice" ]; then
+ DIR=$PRACTICES_DIR
+else
+ echo "Usage: $0 "
+ exit 1
+fi
+
+cd $DIR
+mkdir -p $2
+cd $2
+
+touch index.html
+
+mkdir -p css
+cd css
+
+cp $SHARED_DIR/common.css .
+echo "@import 'common.css';" >shared.css
+echo "@import 'shared.css';" >index.css
diff --git a/scripts/zip.sh b/scripts/zip.sh
new file mode 100755
index 0000000..d2dd836
--- /dev/null
+++ b/scripts/zip.sh
@@ -0,0 +1,21 @@
+#!/bin/zsh
+
+source scripts/common.sh
+
+rm -rf $ZIP_DIR
+mkdir -p $ZIP_DIR
+
+projects=($(ls -d $OUT_DIR/assignments/*/))
+
+for project in ${projects[@]}; do
+ assignment_name=${project%/}
+ assignment_name=${assignment_name##*/}
+
+ cd "$OUT_DIR/assignments/$assignment_name" || exit 1
+ echo "zipping assignment $assignment_name"
+
+ project_name="EamighJ${assignment_name:u}"
+
+ zip -r $ZIP_DIR/$project_name.zip . &>/dev/null
+ echo "zipped $assignment_name to $ZIP_DIR/$project_name.zip"
+done
diff --git a/shared/common.css b/shared/common.css
new file mode 100644
index 0000000..4dd1e35
--- /dev/null
+++ b/shared/common.css
@@ -0,0 +1,673 @@
+*,
+:before,
+:after {
+ box-sizing: border-box;
+ border: 0 solid #e5e7eb;
+}
+
+:before,
+:after {
+ --tw-content: '';
+}
+
+html,
+:host {
+ -webkit-text-size-adjust: 100%;
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ -webkit-tap-highlight-color: transparent;
+ font-family:
+ ui-sans-serif,
+ system-ui,
+ sans-serif,
+ Apple Color Emoji,
+ Segoe UI Emoji,
+ Segoe UI Symbol,
+ Noto Color Emoji;
+ line-height: 1.5;
+}
+
+body {
+ line-height: inherit;
+ margin: 0;
+}
+
+hr {
+ color: inherit;
+ border-top-width: 1px;
+ height: 0;
+}
+
+abbr:where([title]) {
+ text-decoration: underline dotted;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+code,
+kbd,
+samp,
+pre {
+ font-feature-settings: normal;
+ font-variation-settings: normal;
+ font-family:
+ ui-monospace,
+ SFMono-Regular,
+ Menlo,
+ Monaco,
+ Consolas,
+ Liberation Mono,
+ Courier New,
+ monospace;
+ font-size: 1em;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ vertical-align: baseline;
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+table {
+ text-indent: 0;
+ border-color: inherit;
+ border-collapse: collapse;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-feature-settings: inherit;
+ font-variation-settings: inherit;
+ font-family: inherit;
+ font-size: 100%;
+ font-weight: inherit;
+ line-height: inherit;
+ letter-spacing: inherit;
+ color: inherit;
+ margin: 0;
+ padding: 0;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+input:where([type='button']),
+input:where([type='reset']),
+input:where([type='submit']) {
+ -webkit-appearance: button;
+ background-color: #0000;
+ background-image: none;
+}
+
+:-moz-focusring {
+ outline: auto;
+}
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ outline-offset: -2px;
+}
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ font: inherit;
+}
+
+summary {
+ display: list-item;
+}
+
+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 {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+dialog {
+ padding: 0;
+}
+
+textarea {
+ resize: vertical;
+}
+
+input::-moz-placeholder,
+textarea::-moz-placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ color: #9ca3af;
+}
+
+button,
+[role='button'] {
+ cursor: pointer;
+}
+
+:disabled {
+ cursor: default;
+}
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ vertical-align: middle;
+ display: block;
+}
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+[hidden] {
+ display: none;
+}
+
+*,
+:before,
+:after,
+::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: #3b82f680;
+ --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: ;
+ --tw-contain-size: ;
+ --tw-contain-layout: ;
+ --tw-contain-paint: ;
+ --tw-contain-style: ;
+}
+
+:root {
+ --color-inherit: inherit;
+ --color-current: currentColor;
+ --color-transparent: transparent;
+ --color-black: #000;
+ --color-white: #fff;
+ --color-slate-50: #f8fafc;
+ --color-slate-100: #f1f5f9;
+ --color-slate-200: #e2e8f0;
+ --color-slate-300: #cbd5e1;
+ --color-slate-400: #94a3b8;
+ --color-slate-500: #64748b;
+ --color-slate-600: #475569;
+ --color-slate-700: #334155;
+ --color-slate-800: #1e293b;
+ --color-slate-900: #0f172a;
+ --color-slate-950: #020617;
+ --color-gray-50: #f9fafb;
+ --color-gray-100: #f3f4f6;
+ --color-gray-200: #e5e7eb;
+ --color-gray-300: #d1d5db;
+ --color-gray-400: #9ca3af;
+ --color-gray-500: #6b7280;
+ --color-gray-600: #4b5563;
+ --color-gray-700: #374151;
+ --color-gray-800: #1f2937;
+ --color-gray-900: #111827;
+ --color-gray-950: #030712;
+ --color-zinc-50: #fafafa;
+ --color-zinc-100: #f4f4f5;
+ --color-zinc-200: #e4e4e7;
+ --color-zinc-300: #d4d4d8;
+ --color-zinc-400: #a1a1aa;
+ --color-zinc-500: #71717a;
+ --color-zinc-600: #52525b;
+ --color-zinc-700: #3f3f46;
+ --color-zinc-800: #27272a;
+ --color-zinc-900: #18181b;
+ --color-zinc-950: #09090b;
+ --color-neutral-50: #fafafa;
+ --color-neutral-100: #f5f5f5;
+ --color-neutral-200: #e5e5e5;
+ --color-neutral-300: #d4d4d4;
+ --color-neutral-400: #a3a3a3;
+ --color-neutral-500: #737373;
+ --color-neutral-600: #525252;
+ --color-neutral-700: #404040;
+ --color-neutral-800: #262626;
+ --color-neutral-900: #171717;
+ --color-neutral-950: #0a0a0a;
+ --color-stone-50: #fafaf9;
+ --color-stone-100: #f5f5f4;
+ --color-stone-200: #e7e5e4;
+ --color-stone-300: #d6d3d1;
+ --color-stone-400: #a8a29e;
+ --color-stone-500: #78716c;
+ --color-stone-600: #57534e;
+ --color-stone-700: #44403c;
+ --color-stone-800: #292524;
+ --color-stone-900: #1c1917;
+ --color-stone-950: #0c0a09;
+ --color-red-50: #fef2f2;
+ --color-red-100: #fee2e2;
+ --color-red-200: #fecaca;
+ --color-red-300: #fca5a5;
+ --color-red-400: #f87171;
+ --color-red-500: #ef4444;
+ --color-red-600: #dc2626;
+ --color-red-700: #b91c1c;
+ --color-red-800: #991b1b;
+ --color-red-900: #7f1d1d;
+ --color-red-950: #450a0a;
+ --color-orange-50: #fff7ed;
+ --color-orange-100: #ffedd5;
+ --color-orange-200: #fed7aa;
+ --color-orange-300: #fdba74;
+ --color-orange-400: #fb923c;
+ --color-orange-500: #f97316;
+ --color-orange-600: #ea580c;
+ --color-orange-700: #c2410c;
+ --color-orange-800: #9a3412;
+ --color-orange-900: #7c2d12;
+ --color-orange-950: #431407;
+ --color-amber-50: #fffbeb;
+ --color-amber-100: #fef3c7;
+ --color-amber-200: #fde68a;
+ --color-amber-300: #fcd34d;
+ --color-amber-400: #fbbf24;
+ --color-amber-500: #f59e0b;
+ --color-amber-600: #d97706;
+ --color-amber-700: #b45309;
+ --color-amber-800: #92400e;
+ --color-amber-900: #78350f;
+ --color-amber-950: #451a03;
+ --color-yellow-50: #fefce8;
+ --color-yellow-100: #fef9c3;
+ --color-yellow-200: #fef08a;
+ --color-yellow-300: #fde047;
+ --color-yellow-400: #facc15;
+ --color-yellow-500: #eab308;
+ --color-yellow-600: #ca8a04;
+ --color-yellow-700: #a16207;
+ --color-yellow-800: #854d0e;
+ --color-yellow-900: #713f12;
+ --color-yellow-950: #422006;
+ --color-lime-50: #f7fee7;
+ --color-lime-100: #ecfccb;
+ --color-lime-200: #d9f99d;
+ --color-lime-300: #bef264;
+ --color-lime-400: #a3e635;
+ --color-lime-500: #84cc16;
+ --color-lime-600: #65a30d;
+ --color-lime-700: #4d7c0f;
+ --color-lime-800: #3f6212;
+ --color-lime-900: #365314;
+ --color-lime-950: #1a2e05;
+ --color-green-50: #f0fdf4;
+ --color-green-100: #dcfce7;
+ --color-green-200: #bbf7d0;
+ --color-green-300: #86efac;
+ --color-green-400: #4ade80;
+ --color-green-500: #22c55e;
+ --color-green-600: #16a34a;
+ --color-green-700: #15803d;
+ --color-green-800: #166534;
+ --color-green-900: #14532d;
+ --color-green-950: #052e16;
+ --color-emerald-50: #ecfdf5;
+ --color-emerald-100: #d1fae5;
+ --color-emerald-200: #a7f3d0;
+ --color-emerald-300: #6ee7b7;
+ --color-emerald-400: #34d399;
+ --color-emerald-500: #10b981;
+ --color-emerald-600: #059669;
+ --color-emerald-700: #047857;
+ --color-emerald-800: #065f46;
+ --color-emerald-900: #064e3b;
+ --color-emerald-950: #022c22;
+ --color-teal-50: #f0fdfa;
+ --color-teal-100: #ccfbf1;
+ --color-teal-200: #99f6e4;
+ --color-teal-300: #5eead4;
+ --color-teal-400: #2dd4bf;
+ --color-teal-500: #14b8a6;
+ --color-teal-600: #0d9488;
+ --color-teal-700: #0f766e;
+ --color-teal-800: #115e59;
+ --color-teal-900: #134e4a;
+ --color-teal-950: #042f2e;
+ --color-cyan-50: #ecfeff;
+ --color-cyan-100: #cffafe;
+ --color-cyan-200: #a5f3fc;
+ --color-cyan-300: #67e8f9;
+ --color-cyan-400: #22d3ee;
+ --color-cyan-500: #06b6d4;
+ --color-cyan-600: #0891b2;
+ --color-cyan-700: #0e7490;
+ --color-cyan-800: #155e75;
+ --color-cyan-900: #164e63;
+ --color-cyan-950: #083344;
+ --color-sky-50: #f0f9ff;
+ --color-sky-100: #e0f2fe;
+ --color-sky-200: #bae6fd;
+ --color-sky-300: #7dd3fc;
+ --color-sky-400: #38bdf8;
+ --color-sky-500: #0ea5e9;
+ --color-sky-600: #0284c7;
+ --color-sky-700: #0369a1;
+ --color-sky-800: #075985;
+ --color-sky-900: #0c4a6e;
+ --color-sky-950: #082f49;
+ --color-blue-50: #eff6ff;
+ --color-blue-100: #dbeafe;
+ --color-blue-200: #bfdbfe;
+ --color-blue-300: #93c5fd;
+ --color-blue-400: #60a5fa;
+ --color-blue-500: #3b82f6;
+ --color-blue-600: #2563eb;
+ --color-blue-700: #1d4ed8;
+ --color-blue-800: #1e40af;
+ --color-blue-900: #1e3a8a;
+ --color-blue-950: #172554;
+ --color-indigo-50: #eef2ff;
+ --color-indigo-100: #e0e7ff;
+ --color-indigo-200: #c7d2fe;
+ --color-indigo-300: #a5b4fc;
+ --color-indigo-400: #818cf8;
+ --color-indigo-500: #6366f1;
+ --color-indigo-600: #4f46e5;
+ --color-indigo-700: #4338ca;
+ --color-indigo-800: #3730a3;
+ --color-indigo-900: #312e81;
+ --color-indigo-950: #1e1b4b;
+ --color-violet-50: #f5f3ff;
+ --color-violet-100: #ede9fe;
+ --color-violet-200: #ddd6fe;
+ --color-violet-300: #c4b5fd;
+ --color-violet-400: #a78bfa;
+ --color-violet-500: #8b5cf6;
+ --color-violet-600: #7c3aed;
+ --color-violet-700: #6d28d9;
+ --color-violet-800: #5b21b6;
+ --color-violet-900: #4c1d95;
+ --color-violet-950: #2e1065;
+ --color-purple-50: #faf5ff;
+ --color-purple-100: #f3e8ff;
+ --color-purple-200: #e9d5ff;
+ --color-purple-300: #d8b4fe;
+ --color-purple-400: #c084fc;
+ --color-purple-500: #a855f7;
+ --color-purple-600: #9333ea;
+ --color-purple-700: #7e22ce;
+ --color-purple-800: #6b21a8;
+ --color-purple-900: #581c87;
+ --color-purple-950: #3b0764;
+ --color-fuchsia-50: #fdf4ff;
+ --color-fuchsia-100: #fae8ff;
+ --color-fuchsia-200: #f5d0fe;
+ --color-fuchsia-300: #f0abfc;
+ --color-fuchsia-400: #e879f9;
+ --color-fuchsia-500: #d946ef;
+ --color-fuchsia-600: #c026d3;
+ --color-fuchsia-700: #a21caf;
+ --color-fuchsia-800: #86198f;
+ --color-fuchsia-900: #701a75;
+ --color-fuchsia-950: #4a044e;
+ --color-pink-50: #fdf2f8;
+ --color-pink-100: #fce7f3;
+ --color-pink-200: #fbcfe8;
+ --color-pink-300: #f9a8d4;
+ --color-pink-400: #f472b6;
+ --color-pink-500: #ec4899;
+ --color-pink-600: #db2777;
+ --color-pink-700: #be185d;
+ --color-pink-800: #9d174d;
+ --color-pink-900: #831843;
+ --color-pink-950: #500724;
+ --color-rose-50: #fff1f2;
+ --color-rose-100: #ffe4e6;
+ --color-rose-200: #fecdd3;
+ --color-rose-300: #fda4af;
+ --color-rose-400: #fb7185;
+ --color-rose-500: #f43f5e;
+ --color-rose-600: #e11d48;
+ --color-rose-700: #be123c;
+ --color-rose-800: #9f1239;
+ --color-rose-900: #881337;
+ --color-rose-950: #4c0519;
+ --shadow-sm: 0 1px 2px 0 #0000000d;
+ --shadow: 0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;
+ --shadow-md: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
+ --shadow-lg: 0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;
+ --shadow-xl: 0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;
+ --shadow-2xl: 0 25px 50px -12px #00000040;
+ --shadow-inner: inset 0 2px 4px 0 #0000000d;
+ --shadow-none: none;
+ --space-0: 0px;
+ --space-1: 0.25rem;
+ --space-2: 0.5rem;
+ --space-3: 0.75rem;
+ --space-4: 1rem;
+ --space-5: 1.25rem;
+ --space-6: 1.5rem;
+ --space-7: 1.75rem;
+ --space-8: 2rem;
+ --space-9: 2.25rem;
+ --space-10: 2.5rem;
+ --space-11: 2.75rem;
+ --space-12: 3rem;
+ --space-14: 3.5rem;
+ --space-16: 4rem;
+ --space-20: 5rem;
+ --space-24: 6rem;
+ --space-28: 7rem;
+ --space-32: 8rem;
+ --space-36: 9rem;
+ --space-40: 10rem;
+ --space-44: 11rem;
+ --space-48: 12rem;
+ --space-52: 13rem;
+ --space-56: 14rem;
+ --space-60: 15rem;
+ --space-64: 16rem;
+ --space-72: 18rem;
+ --space-80: 20rem;
+ --space-96: 24rem;
+ --space-px: 1px;
+ --screen-sm: 640px;
+ --screen-md: 768px;
+ --screen-lg: 1024px;
+ --screen-xl: 1280px;
+ --screen-2xl: 1536px;
+ --w-0: 0px;
+ --w-1: 0.25rem;
+ --w-2: 0.5rem;
+ --w-3: 0.75rem;
+ --w-4: 1rem;
+ --w-5: 1.25rem;
+ --w-6: 1.5rem;
+ --w-7: 1.75rem;
+ --w-8: 2rem;
+ --w-9: 2.25rem;
+ --w-10: 2.5rem;
+ --w-11: 2.75rem;
+ --w-12: 3rem;
+ --w-14: 3.5rem;
+ --w-16: 4rem;
+ --w-20: 5rem;
+ --w-24: 6rem;
+ --w-28: 7rem;
+ --w-32: 8rem;
+ --w-36: 9rem;
+ --w-40: 10rem;
+ --w-44: 11rem;
+ --w-48: 12rem;
+ --w-52: 13rem;
+ --w-56: 14rem;
+ --w-60: 15rem;
+ --w-64: 16rem;
+ --w-72: 18rem;
+ --w-80: 20rem;
+ --w-96: 24rem;
+ --w-px: 1px;
+ --w-none: none;
+ --w-xs: 20rem;
+ --w-sm: 24rem;
+ --w-md: 28rem;
+ --w-lg: 32rem;
+ --w-xl: 36rem;
+ --w-2xl: 42rem;
+ --w-3xl: 48rem;
+ --w-4xl: 56rem;
+ --w-5xl: 64rem;
+ --w-6xl: 72rem;
+ --w-7xl: 80rem;
+ --w-full: 100%;
+ --w-min: min-content;
+ --w-max: max-content;
+ --w-fit: fit-content;
+ --w-prose: 65ch;
+ --w-screen-sm: 640px;
+ --w-screen-md: 768px;
+ --w-screen-lg: 1024px;
+ --w-screen-xl: 1280px;
+ --w-screen-2xl: 1536px;
+ --rounded-none: 0px;
+ --rounded-sm: 0.125rem;
+ --rounded: 0.25rem;
+ --rounded-md: 0.375rem;
+ --rounded-lg: 0.5rem;
+ --rounded-xl: 0.75rem;
+ --rounded-2xl: 1rem;
+ --rounded-3xl: 1.5rem;
+ --rounded-full: 9999px;
+}
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..f1d349d
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,41 @@
+import { spacing } from 'tailwindcss/defaultTheme';
+
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: [],
+ theme: {
+ extend: {},
+ spacing: {
+ ...spacing,
+ 0.5: undefined,
+ 1.5: undefined,
+ 2.5: undefined,
+ 3.5: undefined,
+ },
+ },
+ plugins: [
+ function ({ addUtilities, theme }) {
+ function extractVars(obj, group = '', prefix) {
+ return Object.keys(obj).reduce((vars, key) => {
+ const value = obj[key];
+ if (!value || typeof value === 'boolean') return vars;
+ const cssVariable = key === 'DEFAULT' ? `--${prefix}${group}` : `--${prefix}${group}-${key}`;
+ const newVars = typeof value === 'string' ? { [cssVariable]: value } : extractVars(value, `-${key}`, prefix);
+
+ return { ...vars, ...newVars };
+ }, {});
+ }
+
+ addUtilities({
+ ':root': {
+ ...extractVars(theme('colors'), '', 'color'),
+ ...extractVars(theme('boxShadow'), '', 'shadow'),
+ ...extractVars(theme('spacing'), '', 'space'),
+ ...extractVars(theme('screens'), '', 'screen'),
+ ...extractVars(theme('maxWidth'), '', 'w'),
+ ...extractVars(theme('borderRadius'), '', 'rounded'),
+ },
+ });
+ },
+ ],
+};
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..238655f
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ // Enable latest features
+ "lib": ["ESNext", "DOM"],
+ "target": "ESNext",
+ "module": "ESNext",
+ "moduleDetection": "force",
+ "jsx": "react-jsx",
+ "allowJs": true,
+
+ // Bundler mode
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "noEmit": true,
+
+ // Best practices
+ "strict": true,
+ "skipLibCheck": true,
+ "noFallthroughCasesInSwitch": true,
+
+ // Some stricter flags (disabled by default)
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noPropertyAccessFromIndexSignature": false
+ }
+}