style: cozy!
This commit is contained in:
parent
4f7311d02b
commit
19010d2d72
5 changed files with 203 additions and 30 deletions
56
src/components/address-bar.astro
Normal file
56
src/components/address-bar.astro
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
---
|
||||||
|
import Form, { FormGroup } from "@astro-reactive/form";
|
||||||
|
import { Validators } from "@astro-reactive/validator";
|
||||||
|
|
||||||
|
export interface Props {
|
||||||
|
url: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { url } = Astro.props;
|
||||||
|
const form = new FormGroup([
|
||||||
|
{
|
||||||
|
name: "url",
|
||||||
|
value: url,
|
||||||
|
placeholder: "Put the URL here",
|
||||||
|
validators: [Validators.required, Validators.minLength(11)],
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
---
|
||||||
|
|
||||||
|
<div class="address-bar">
|
||||||
|
<Form
|
||||||
|
formGroups={form}
|
||||||
|
showValidationHints
|
||||||
|
submitControl={{
|
||||||
|
type: "submit",
|
||||||
|
name: "submit",
|
||||||
|
value: "Get cozy!",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style is:inline>
|
||||||
|
.address-bar {
|
||||||
|
background-color: orange;
|
||||||
|
text-align: center;
|
||||||
|
padding: 0.5em;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
input {
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
border: 0px;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 0.5rem;
|
||||||
|
}
|
||||||
|
input[type="text"] {
|
||||||
|
border: 2px solid brown;
|
||||||
|
}
|
||||||
|
input[type="submit"] {
|
||||||
|
width: 150px;
|
||||||
|
margin-top: 0.5em;
|
||||||
|
background-color: brown;
|
||||||
|
color: white;
|
||||||
|
font-weight: bolder;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,23 +1,55 @@
|
||||||
---
|
---
|
||||||
import { ArticleData } from "@extractus/article-extractor";
|
import { ArticleData } from "@extractus/article-extractor";
|
||||||
|
import CSS from "./post.module.scss";
|
||||||
|
|
||||||
const article = Astro.props.article;
|
const article = Astro.props.article;
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
article: ArticleData;
|
article: ArticleData;
|
||||||
}
|
}
|
||||||
|
const datePublished =
|
||||||
|
article.published && new Date(article.published).toDateString();
|
||||||
---
|
---
|
||||||
|
|
||||||
{
|
{
|
||||||
article ? (
|
article && (
|
||||||
<article>
|
<div class="post">
|
||||||
<h1>{article.title}</h1>
|
{article.title && <h1 class="title">{article.title}</h1>}
|
||||||
<p>
|
{(article.author || datePublished) && (
|
||||||
by <em>{article.author}</em>
|
<ul class="publish-info">
|
||||||
</p>
|
{article.author && <li>️{article.author} </li>}
|
||||||
|
{datePublished && <li>️{datePublished}</li>}
|
||||||
|
</ul>
|
||||||
|
)}
|
||||||
<content set:html={article.content} />
|
<content set:html={article.content} />
|
||||||
</article>
|
</div>
|
||||||
) : (
|
|
||||||
""
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<style is:inline>
|
||||||
|
div.post {
|
||||||
|
max-width: 550px;
|
||||||
|
margin: 1em auto;
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
@counter-style publish-icons {
|
||||||
|
system: cyclic;
|
||||||
|
symbols: "️✍️" "🗓️";
|
||||||
|
suffix: " ";
|
||||||
|
}
|
||||||
|
ul.publish-info {
|
||||||
|
margin: 1em -1em;
|
||||||
|
list-style: publish-icons;
|
||||||
|
}
|
||||||
|
h1.title {
|
||||||
|
font-size: xx-large;
|
||||||
|
}
|
||||||
|
p,
|
||||||
|
img {
|
||||||
|
margin: 1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
31
src/layouts/layout.astro
Normal file
31
src/layouts/layout.astro
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
import "./reset.css";
|
||||||
|
export interface Props {
|
||||||
|
title?: string;
|
||||||
|
}
|
||||||
|
const appTitle = "Cozy Reader";
|
||||||
|
const { title = "" } = Astro.props;
|
||||||
|
---
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>{appTitle} {title ? `| ${title}` : ""}</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<slot />
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
<style is:global>
|
||||||
|
:root {
|
||||||
|
--system-ui: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif,
|
||||||
|
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||||
|
}
|
||||||
|
html * {
|
||||||
|
font-family: var(--system-ui);
|
||||||
|
}
|
||||||
|
</style>
|
69
src/layouts/reset.css
Normal file
69
src/layouts/reset.css
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
1. Use a more-intuitive box-sizing model.
|
||||||
|
*/
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
2. Remove default margin
|
||||||
|
*/
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
3. Allow percentage-based heights in the application
|
||||||
|
*/
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Typographic tweaks!
|
||||||
|
4. Add accessible line-height
|
||||||
|
5. Improve text rendering
|
||||||
|
*/
|
||||||
|
body {
|
||||||
|
line-height: 1.5;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
6. Improve media defaults
|
||||||
|
*/
|
||||||
|
img,
|
||||||
|
picture,
|
||||||
|
video,
|
||||||
|
canvas,
|
||||||
|
svg {
|
||||||
|
display: block;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
7. Remove built-in form typography styles
|
||||||
|
*/
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
textarea,
|
||||||
|
select {
|
||||||
|
font: inherit;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
8. Avoid text overflows
|
||||||
|
*/
|
||||||
|
p,
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
9. Create a root stacking context
|
||||||
|
*/
|
||||||
|
#root,
|
||||||
|
#__next {
|
||||||
|
isolation: isolate;
|
||||||
|
}
|
|
@ -3,31 +3,16 @@ import Form, { FormGroup } from "@astro-reactive/form";
|
||||||
import { Validators } from "@astro-reactive/validator";
|
import { Validators } from "@astro-reactive/validator";
|
||||||
import { extract } from "@extractus/article-extractor";
|
import { extract } from "@extractus/article-extractor";
|
||||||
import { getParams, isURL } from "../utils";
|
import { getParams, isURL } from "../utils";
|
||||||
|
import AddressBar from "../components/address-bar.astro";
|
||||||
import Post from "../components/post.astro";
|
import Post from "../components/post.astro";
|
||||||
|
import Layout from "../layouts/layout.astro";
|
||||||
|
|
||||||
const params = getParams(Astro.url);
|
const params = getParams(Astro.url);
|
||||||
const url: string = params?.url || "";
|
const url: string = params?.url || "";
|
||||||
const article = isURL(url) && (await extract(url));
|
const article = isURL(url) && (await extract(url));
|
||||||
|
|
||||||
const form = new FormGroup([
|
|
||||||
{
|
|
||||||
name: "url",
|
|
||||||
value: url,
|
|
||||||
placeholder: "Put the URL here",
|
|
||||||
validators: [Validators.required, Validators.minLength(11)],
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<Form
|
<Layout title={article?.title}>
|
||||||
formGroups={form}
|
<AddressBar url={url} />
|
||||||
showValidationHints
|
|
||||||
submitControl={{
|
|
||||||
type: "submit",
|
|
||||||
name: "submit",
|
|
||||||
value: "Get cozy!",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<a href="https://github.com/ayoayco/cozy-reader" target="_blank">Source code</a>
|
|
||||||
|
|
||||||
<Post article={article} />
|
<Post article={article} />
|
||||||
|
</Layout>
|
||||||
|
|
Loading…
Reference in a new issue