mirror of
				https://github.com/falsycat/ar.falsy.cat.git
				synced 2025-10-31 13:48:19 +00:00 
			
		
		
		
	popover implementation
This commit is contained in:
		| @@ -179,8 +179,7 @@ article { | |||||||
|     font-family: Source Sans Pro; |     font-family: Source Sans Pro; | ||||||
|     font-weight: 600; |     font-weight: 600; | ||||||
|  |  | ||||||
|     // internal link |     &.internal-link { | ||||||
|     &[href^="./"], &[href^="/"] { |  | ||||||
|       text-decoration: none; |       text-decoration: none; | ||||||
|       background-color: transparentize(#8f9fa9, 0.85); |       background-color: transparentize(#8f9fa9, 0.85); | ||||||
|       padding: 0 0.1em; |       padding: 0 0.1em; | ||||||
| @@ -464,3 +463,33 @@ header { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .popover { | ||||||
|  |   z-index: 999; | ||||||
|  |   position: absolute; | ||||||
|  |   width: 15em; | ||||||
|  |   display: inline; | ||||||
|  |   background-color: var(--light); | ||||||
|  |   padding: 1em; | ||||||
|  |   border: 1px solid var(--outlinegray); | ||||||
|  |   border-radius: 5px; | ||||||
|  |   transform: translate(-50%, 40%); | ||||||
|  |   opacity: 0; | ||||||
|  |   pointer-events: none; | ||||||
|  |   transition: opacity 0.2s ease, transform 0.2s ease; | ||||||
|  |   transition-delay: 0.3s; | ||||||
|  |  | ||||||
|  |   &.visible { | ||||||
|  |     opacity: 1; | ||||||
|  |     transform: translate(-50%, 20%); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   & > h3 { | ||||||
|  |     margin: 0.5em 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   & > p { | ||||||
|  |     margin: 0; | ||||||
|  |     font-weight: 400; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -4,7 +4,7 @@ description: | |||||||
|   Here is the page description. This is an example Quartz site that details installation, |   Here is the page description. This is an example Quartz site that details installation, | ||||||
|   setup, customization, and troubleshooting for Quartz itself. |   setup, customization, and troubleshooting for Quartz itself. | ||||||
| page_title: | page_title: | ||||||
|   "🪴 Quartz v3" |   "🪴 Quartz 3" | ||||||
| links: | links: | ||||||
|   - link_name: Twitter |   - link_name: Twitter | ||||||
|     link: https://twitter.com/_jzhao |     link: https://twitter.com/_jzhao | ||||||
|   | |||||||
| @@ -1,8 +1,9 @@ | |||||||
| {{$trimmed := strings.TrimSuffix ".md" (.Destination | safeURL)}} | {{$trimmed := strings.TrimSuffix ".md" (.Destination | safeURL)}} | ||||||
| {{$trimmed = replace $trimmed "%20" "-" }} | {{$trimmed = replace $trimmed "%20" "-" }} | ||||||
| {{$external := strings.HasPrefix $trimmed "http" }} | {{$external := strings.HasPrefix $trimmed "http" }} | ||||||
| {{ if $external }} | {{- if $external -}} | ||||||
| <a href="{{ $trimmed }}" rel="noopener">{{ .Text | safeHTML }}</a> | <a href="{{ $trimmed }}" rel="noopener">{{ .Text | safeHTML }}</a> | ||||||
| {{else}} | {{- else -}} | ||||||
| <a href="{{ if (hasPrefix $trimmed "/") }}{{ $trimmed | urlize }}{{ else }}{{ print "/" $trimmed | urlize }}{{ end }}" rel="noopener">{{ .Text | safeHTML }}</a> | {{$fixedUrl := (cond (hasPrefix $trimmed "/") $trimmed (print "/" $trimmed)) | urlize}} | ||||||
| {{end}} | <a href="{{$fixedUrl}}" rel="noopener" class="internal-link" data-src="{{$fixedUrl}}">{{ .Text | safeHTML }}</a> | ||||||
|  | {{- end -}} | ||||||
| @@ -17,7 +17,7 @@ | |||||||
|         <div class="tags"> |         <div class="tags"> | ||||||
|             {{ range .Site.Taxonomies.tags.ByCount }} |             {{ range .Site.Taxonomies.tags.ByCount }} | ||||||
|             <div class="meta"> |             <div class="meta"> | ||||||
|                 <h1><a href="{{ .Page.Permalink }}">{{ .Page.Title | humanize }}</a></h1> |                 <h1><a href="{{ .Page.Permalink }}">{{ .Page.Title }}</a></h1> | ||||||
|                 <p><b>{{ .Count }}</b> notes with this tag {{if gt .Count 2}}(showing first 2 results){{end}}</p> |                 <p><b>{{ .Count }}</b> notes with this tag {{if gt .Count 2}}(showing first 2 results){{end}}</p> | ||||||
|             </div> |             </div> | ||||||
|             {{ with ($.Site.GetPage (printf "/tags/%s" .Page.Title)) }} |             {{ with ($.Site.GetPage (printf "/tags/%s" .Page.Title)) }} | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ | |||||||
|         {{partial "darkmode.html" .}} |         {{partial "darkmode.html" .}} | ||||||
|     </header> |     </header> | ||||||
|     <article> |     <article> | ||||||
|         <h1>Category: {{.Title | humanize}}</h1> |         <h1>Tag: {{.Title | humanize}}</h1> | ||||||
|         {{partial "page-list.html" .Paginator.Pages}} |         {{partial "page-list.html" .Paginator.Pages}} | ||||||
|         {{ template "_internal/pagination.html" . }} |         {{ template "_internal/pagination.html" . }} | ||||||
|     </article> |     </article> | ||||||
|   | |||||||
| @@ -11,9 +11,6 @@ | |||||||
|     } |     } | ||||||
| </style> | </style> | ||||||
| <script> | <script> | ||||||
|   const index = {{$.Site.Data.linkIndex.index}} |  | ||||||
|   const links = {{$.Site.Data.linkIndex.links}} |  | ||||||
|   const content = {{$.Site.Data.contentIndex}} |  | ||||||
|   const curPage = {{ strings.TrimRight "/" .Page.RelPermalink }} |   const curPage = {{ strings.TrimRight "/" .Page.RelPermalink }} | ||||||
|   const pathColors = {{$.Site.Data.graphConfig.paths}} |   const pathColors = {{$.Site.Data.graphConfig.paths}} | ||||||
|   let depth = {{$.Site.Data.graphConfig.depth}} |   let depth = {{$.Site.Data.graphConfig.depth}} | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| <head> | <head> | ||||||
|     <!-- Meta tags --> |     <!-- Meta tags --> | ||||||
|     <meta charset="UTF-8"> |     <meta charset="UTF-8"> | ||||||
|     <meta name="description" content="{{$.Site.Data.config.description}}"> |     <meta name="description" content="{{if .IsHome}}{{$.Site.Data.config.description}}{{else}}{{.Summary}}{{end}}"> | ||||||
|     <title>{{ if .Title }}{{ .Title }}{{ else }}{{ $.Site.Data.config.page_title }}{{ end }}</title> |     <title>{{ if .Title }}{{ .Title }}{{ else }}{{ $.Site.Data.config.page_title }}{{ end }}</title> | ||||||
|     <meta name="viewport" content="width=device-width, initial-scale=1"> |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
|     <link rel="shortcut icon" type="image/png" href="/icon.png" /> |     <link rel="shortcut icon" type="image/png" href="/icon.png" /> | ||||||
| @@ -23,5 +23,13 @@ | |||||||
|       {{.Content | safeJS }} |       {{.Content | safeJS }} | ||||||
|     </script> |     </script> | ||||||
|     {{- end -}} |     {{- end -}} | ||||||
|  |  | ||||||
|  |     <!--  Preload page vars  --> | ||||||
|  |     <script> | ||||||
|  |     const content = {{$.Site.Data.contentIndex}} | ||||||
|  |     const index = {{$.Site.Data.linkIndex.index}} | ||||||
|  |     const links = {{$.Site.Data.linkIndex.links}} | ||||||
|  |     </script> | ||||||
| </head> | </head> | ||||||
| {{ template "_internal/google_analytics.html" . }} | {{ template "_internal/google_analytics.html" . }} | ||||||
|  | {{ partial "popover.html" .}} | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								layouts/partials/popover.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								layouts/partials/popover.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | <script> | ||||||
|  |   function htmlToElement(html) { | ||||||
|  |     const template = document.createElement('template') | ||||||
|  |     html = html.trim() | ||||||
|  |     template.innerHTML = html | ||||||
|  |     return template.content.firstChild | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   document.addEventListener("DOMContentLoaded", () => { | ||||||
|  |     [...document.getElementsByClassName("internal-link")] | ||||||
|  |       .forEach(li => { | ||||||
|  |         const linkDest = content[li.dataset.src] | ||||||
|  |         if (linkDest) { | ||||||
|  |           const popoverElement = `<div class="popover"> | ||||||
|  |     <h3>${linkDest.title}</h3> | ||||||
|  |     <p>${removeMarkdown(linkDest.content).split(" ", 15).join(" ")}...</p> | ||||||
|  | </div>` | ||||||
|  |           const el = htmlToElement(popoverElement) | ||||||
|  |           li.appendChild(el) | ||||||
|  |           li.addEventListener("mouseover", () => { | ||||||
|  |             el.classList.add("visible") | ||||||
|  |           }) | ||||||
|  |           li.addEventListener("mouseout", () => { | ||||||
|  |             el.classList.remove("visible") | ||||||
|  |           }) | ||||||
|  |         } | ||||||
|  |       }) | ||||||
|  |   }) | ||||||
|  | </script> | ||||||
| @@ -89,8 +89,7 @@ | |||||||
|         } |         } | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|     const scrapedContent = {{$.Site.Data.contentIndex}} |     for (const [key, value] of Object.entries(content)) { | ||||||
|     for (const [key, value] of Object.entries(scrapedContent)) { |  | ||||||
|         contentIndex.add({ |         contentIndex.add({ | ||||||
|             id: key, |             id: key, | ||||||
|             title: value.title, |             title: value.title, | ||||||
| @@ -151,8 +150,8 @@ | |||||||
|     const fetch = id => ({ |     const fetch = id => ({ | ||||||
|         id, |         id, | ||||||
|         url: id, |         url: id, | ||||||
|         title: scrapedContent[id].title, |         title: content[id].title, | ||||||
|         content: scrapedContent[id].content |         content: content[id].content | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|     const source = document.getElementById('search-bar') |     const source = document.getElementById('search-bar') | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user