| | |
| | | import { canonicalizeServer, pathToRoot } from "../path" |
| | | import { QuartzComponentConstructor, QuartzComponentProps } from "./types" |
| | | import { slug as slugAnchor } from 'github-slugger' |
| | | import { FullSlug, resolveRelative } from "../util/path" |
| | | import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" |
| | | import { classNames } from "../util/lang" |
| | | |
| | | function TagList({ fileData }: QuartzComponentProps) { |
| | | const TagList: QuartzComponent = ({ fileData, displayClass }: QuartzComponentProps) => { |
| | | const tags = fileData.frontmatter?.tags |
| | | const slug = canonicalizeServer(fileData.slug!) |
| | | const baseDir = pathToRoot(slug) |
| | | if (tags && tags.length > 0) { |
| | | return <ul class="tags">{tags.map(tag => { |
| | | const display = `#${tag}` |
| | | const linkDest = baseDir + `/tags/${slugAnchor(tag)}` |
| | | return <li> |
| | | <a href={linkDest} class="internal">{display}</a> |
| | | </li> |
| | | })}</ul> |
| | | return ( |
| | | <ul class={classNames(displayClass, "tags")}> |
| | | {tags.map((tag) => { |
| | | const linkDest = resolveRelative(fileData.slug!, `tags/${tag}` as FullSlug) |
| | | return ( |
| | | <li> |
| | | <a href={linkDest} class="internal tag-link"> |
| | | {tag} |
| | | </a> |
| | | </li> |
| | | ) |
| | | })} |
| | | </ul> |
| | | ) |
| | | } else { |
| | | return null |
| | | } |
| | |
| | | display: flex; |
| | | padding-left: 0; |
| | | gap: 0.4rem; |
| | | margin: 1rem 0; |
| | | flex-wrap: wrap; |
| | | } |
| | | |
| | | .section-li > .section > .tags { |
| | | justify-content: flex-end; |
| | | } |
| | | |
| | | .tags > li { |
| | |
| | | overflow-wrap: normal; |
| | | } |
| | | |
| | | .tags > li > a { |
| | | a.internal.tag-link { |
| | | border-radius: 8px; |
| | | background-color: var(--highlight); |
| | | padding: 0.2rem 0.5rem; |
| | | padding: 0.2rem 0.4rem; |
| | | margin: 0 0.1rem; |
| | | } |
| | | ` |
| | | |