Compare commits
	
		
			1 Commits
		
	
	
		
			3cf374ea2b
			...
			d70a506b82
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d70a506b82 | 
							
								
								
									
										3
									
								
								.prettierrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.prettierrc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "plugins": ["prettier-plugin-go-template"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -104,7 +104,7 @@ func (api *API) appDocumentReader(c *gin.Context) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (api *API) appGetDocuments(c *gin.Context) {
 | 
					func (api *API) appGetDocuments(c *gin.Context) {
 | 
				
			||||||
	settings, auth := api.getBaseTemplateVarsNew(common.RouteDocuments, c)
 | 
						templateVars, auth := api.getBaseTemplateVars("documents", c)
 | 
				
			||||||
	qParams := bindQueryParams(c, 9)
 | 
						qParams := bindQueryParams(c, 9)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var query *string
 | 
						var query *string
 | 
				
			||||||
@ -140,15 +140,18 @@ func (api *API) appGetDocuments(c *gin.Context) {
 | 
				
			|||||||
	nextPage := *qParams.Page + 1
 | 
						nextPage := *qParams.Page + 1
 | 
				
			||||||
	previousPage := *qParams.Page - 1
 | 
						previousPage := *qParams.Page - 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r := renderer.New(c.Request.Context(), http.StatusOK, pages.Documents(
 | 
						if nextPage <= totalPages {
 | 
				
			||||||
		settings,
 | 
							templateVars["NextPage"] = nextPage
 | 
				
			||||||
		documents,
 | 
						}
 | 
				
			||||||
		nextPage,
 | 
					
 | 
				
			||||||
		previousPage,
 | 
						if previousPage >= 0 {
 | 
				
			||||||
		totalPages,
 | 
							templateVars["PreviousPage"] = previousPage
 | 
				
			||||||
		*qParams.Limit,
 | 
						}
 | 
				
			||||||
	))
 | 
					
 | 
				
			||||||
	c.Render(http.StatusOK, r)
 | 
						templateVars["PageLimit"] = *qParams.Limit
 | 
				
			||||||
 | 
						templateVars["Data"] = documents
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						c.HTML(http.StatusOK, "page/documents", templateVars)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (api *API) appGetDocument(c *gin.Context) {
 | 
					func (api *API) appGetDocument(c *gin.Context) {
 | 
				
			||||||
@ -206,7 +209,7 @@ func (api *API) appGetProgress(c *gin.Context) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (api *API) appGetActivity(c *gin.Context) {
 | 
					func (api *API) appGetActivity(c *gin.Context) {
 | 
				
			||||||
	settings, auth := api.getBaseTemplateVarsNew(common.RouteActivity, c)
 | 
						templateVars, auth := api.getBaseTemplateVars("activity", c)
 | 
				
			||||||
	qParams := bindQueryParams(c, 15)
 | 
						qParams := bindQueryParams(c, 15)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	activityFilter := database.GetActivityParams{
 | 
						activityFilter := database.GetActivityParams{
 | 
				
			||||||
@ -227,11 +230,58 @@ func (api *API) appGetActivity(c *gin.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r := renderer.New(c.Request.Context(), http.StatusOK, pages.Activity(
 | 
						templateVars["Data"] = activity
 | 
				
			||||||
		settings,
 | 
					
 | 
				
			||||||
		activity,
 | 
						c.HTML(http.StatusOK, "page/activity", templateVars)
 | 
				
			||||||
	))
 | 
					}
 | 
				
			||||||
	c.Render(http.StatusOK, r)
 | 
					
 | 
				
			||||||
 | 
					func (api *API) appGetHomeOld(c *gin.Context) {
 | 
				
			||||||
 | 
						templateVars, auth := api.getBaseTemplateVars("home", c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						start := time.Now()
 | 
				
			||||||
 | 
						graphData, err := api.db.Queries.GetDailyReadStats(api.db.Ctx, auth.UserName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Error("GetDailyReadStats DB Error: ", err)
 | 
				
			||||||
 | 
							appErrorPage(c, http.StatusInternalServerError, fmt.Sprintf("GetDailyReadStats DB Error: %v", err))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						log.Debug("GetDailyReadStats DB Performance: ", time.Since(start))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						start = time.Now()
 | 
				
			||||||
 | 
						databaseInfo, err := api.db.Queries.GetDatabaseInfo(api.db.Ctx, auth.UserName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Error("GetDatabaseInfo DB Error: ", err)
 | 
				
			||||||
 | 
							appErrorPage(c, http.StatusInternalServerError, fmt.Sprintf("GetDatabaseInfo DB Error: %v", err))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						log.Debug("GetDatabaseInfo DB Performance: ", time.Since(start))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						start = time.Now()
 | 
				
			||||||
 | 
						streaks, err := api.db.Queries.GetUserStreaks(api.db.Ctx, auth.UserName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Error("GetUserStreaks DB Error: ", err)
 | 
				
			||||||
 | 
							appErrorPage(c, http.StatusInternalServerError, fmt.Sprintf("GetUserStreaks DB Error: %v", err))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						log.Debug("GetUserStreaks DB Performance: ", time.Since(start))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						start = time.Now()
 | 
				
			||||||
 | 
						userStatistics, err := api.db.Queries.GetUserStatistics(api.db.Ctx)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Error("GetUserStatistics DB Error: ", err)
 | 
				
			||||||
 | 
							appErrorPage(c, http.StatusInternalServerError, fmt.Sprintf("GetUserStatistics DB Error: %v", err))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						log.Debug("GetUserStatistics DB Performance: ", time.Since(start))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						templateVars["Data"] = gin.H{
 | 
				
			||||||
 | 
							"Streaks":        streaks,
 | 
				
			||||||
 | 
							"GraphData":      graphData,
 | 
				
			||||||
 | 
							"DatabaseInfo":   databaseInfo,
 | 
				
			||||||
 | 
							"UserStatistics": arrangeUserStatistics(userStatistics),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						c.HTML(http.StatusOK, "page/home", templateVars)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (api *API) appGetHome(c *gin.Context) {
 | 
					func (api *API) appGetHome(c *gin.Context) {
 | 
				
			||||||
@ -278,7 +328,7 @@ func (api *API) appGetHome(c *gin.Context) {
 | 
				
			|||||||
		getSVGGraphData(graphData, 800, 70),
 | 
							getSVGGraphData(graphData, 800, 70),
 | 
				
			||||||
		streaks,
 | 
							streaks,
 | 
				
			||||||
		arrangeUserStatistics(userStatistics),
 | 
							arrangeUserStatistics(userStatistics),
 | 
				
			||||||
		common.UserMetadata{
 | 
							pages.UserMetadata{
 | 
				
			||||||
			DocumentCount: int(databaseInfo.DocumentsSize),
 | 
								DocumentCount: int(databaseInfo.DocumentsSize),
 | 
				
			||||||
			ActivityCount: int(databaseInfo.ActivitySize),
 | 
								ActivityCount: int(databaseInfo.ActivitySize),
 | 
				
			||||||
			ProgressCount: int(databaseInfo.ProgressSize),
 | 
								ProgressCount: int(databaseInfo.ProgressSize),
 | 
				
			||||||
@ -1077,13 +1127,13 @@ func appErrorPage(c *gin.Context, errorCode int, errorMessage string) {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func arrangeUserStatistics(userStatistics []database.GetUserStatisticsRow) common.UserStatistics {
 | 
					func arrangeUserStatistics(userStatistics []database.GetUserStatisticsRow) pages.UserStatistics {
 | 
				
			||||||
	// Item Sorter
 | 
						// Item Sorter
 | 
				
			||||||
	sortItem := func(userStatistics []database.GetUserStatisticsRow, key string, less func(i int, j int) bool) []common.UserStatisticEntry {
 | 
						sortItem := func(userStatistics []database.GetUserStatisticsRow, key string, less func(i int, j int) bool) []pages.UserStatisticEntry {
 | 
				
			||||||
		sortedData := append([]database.GetUserStatisticsRow(nil), userStatistics...)
 | 
							sortedData := append([]database.GetUserStatisticsRow(nil), userStatistics...)
 | 
				
			||||||
		sort.SliceStable(sortedData, less)
 | 
							sort.SliceStable(sortedData, less)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		newData := make([]common.UserStatisticEntry, 0)
 | 
							newData := make([]pages.UserStatisticEntry, 0)
 | 
				
			||||||
		for _, item := range sortedData {
 | 
							for _, item := range sortedData {
 | 
				
			||||||
			v := reflect.Indirect(reflect.ValueOf(item))
 | 
								v := reflect.Indirect(reflect.ValueOf(item))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1099,7 +1149,7 @@ func arrangeUserStatistics(userStatistics []database.GetUserStatisticsRow) commo
 | 
				
			|||||||
				value = niceNumbers(rawVal)
 | 
									value = niceNumbers(rawVal)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			newData = append(newData, common.UserStatisticEntry{
 | 
								newData = append(newData, pages.UserStatisticEntry{
 | 
				
			||||||
				UserID: item.UserID,
 | 
									UserID: item.UserID,
 | 
				
			||||||
				Value:  value,
 | 
									Value:  value,
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
@ -1108,8 +1158,8 @@ func arrangeUserStatistics(userStatistics []database.GetUserStatisticsRow) commo
 | 
				
			|||||||
		return newData
 | 
							return newData
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return common.UserStatistics{
 | 
						return pages.UserStatistics{
 | 
				
			||||||
		WPM: map[string][]common.UserStatisticEntry{
 | 
							WPM: map[string][]pages.UserStatisticEntry{
 | 
				
			||||||
			"All": sortItem(userStatistics, "TotalWpm", func(i, j int) bool {
 | 
								"All": sortItem(userStatistics, "TotalWpm", func(i, j int) bool {
 | 
				
			||||||
				return userStatistics[i].TotalWpm > userStatistics[j].TotalWpm
 | 
									return userStatistics[i].TotalWpm > userStatistics[j].TotalWpm
 | 
				
			||||||
			}),
 | 
								}),
 | 
				
			||||||
@ -1123,7 +1173,7 @@ func arrangeUserStatistics(userStatistics []database.GetUserStatisticsRow) commo
 | 
				
			|||||||
				return userStatistics[i].WeeklyWpm > userStatistics[j].WeeklyWpm
 | 
									return userStatistics[i].WeeklyWpm > userStatistics[j].WeeklyWpm
 | 
				
			||||||
			}),
 | 
								}),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Duration: map[string][]common.UserStatisticEntry{
 | 
							Duration: map[string][]pages.UserStatisticEntry{
 | 
				
			||||||
			"All": sortItem(userStatistics, "TotalSeconds", func(i, j int) bool {
 | 
								"All": sortItem(userStatistics, "TotalSeconds", func(i, j int) bool {
 | 
				
			||||||
				return userStatistics[i].TotalSeconds > userStatistics[j].TotalSeconds
 | 
									return userStatistics[i].TotalSeconds > userStatistics[j].TotalSeconds
 | 
				
			||||||
			}),
 | 
								}),
 | 
				
			||||||
@ -1137,7 +1187,7 @@ func arrangeUserStatistics(userStatistics []database.GetUserStatisticsRow) commo
 | 
				
			|||||||
				return userStatistics[i].WeeklySeconds > userStatistics[j].WeeklySeconds
 | 
									return userStatistics[i].WeeklySeconds > userStatistics[j].WeeklySeconds
 | 
				
			||||||
			}),
 | 
								}),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Words: map[string][]common.UserStatisticEntry{
 | 
							Words: map[string][]pages.UserStatisticEntry{
 | 
				
			||||||
			"All": sortItem(userStatistics, "TotalWordsRead", func(i, j int) bool {
 | 
								"All": sortItem(userStatistics, "TotalWordsRead", func(i, j int) bool {
 | 
				
			||||||
				return userStatistics[i].TotalWordsRead > userStatistics[j].TotalWordsRead
 | 
									return userStatistics[i].TotalWordsRead > userStatistics[j].TotalWordsRead
 | 
				
			||||||
			}),
 | 
								}),
 | 
				
			||||||
 | 
				
			|||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -1,8 +1,6 @@
 | 
				
			|||||||
package common
 | 
					package common
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"math"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -41,111 +39,3 @@ type Settings struct {
 | 
				
			|||||||
	IsAdmin       bool
 | 
						IsAdmin       bool
 | 
				
			||||||
	SearchEnabled bool
 | 
						SearchEnabled bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
type UserMetadata struct {
 | 
					 | 
				
			||||||
	DocumentCount int
 | 
					 | 
				
			||||||
	ActivityCount int
 | 
					 | 
				
			||||||
	ProgressCount int
 | 
					 | 
				
			||||||
	DeviceCount   int
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type UserStatistics struct {
 | 
					 | 
				
			||||||
	WPM      map[string][]UserStatisticEntry
 | 
					 | 
				
			||||||
	Duration map[string][]UserStatisticEntry
 | 
					 | 
				
			||||||
	Words    map[string][]UserStatisticEntry
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type UserStatisticEntry struct {
 | 
					 | 
				
			||||||
	UserID string
 | 
					 | 
				
			||||||
	Value  string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// getTimeZones returns a string slice of IANA timezones.
 | 
					 | 
				
			||||||
func GetTimeZones() []string {
 | 
					 | 
				
			||||||
	return []string{
 | 
					 | 
				
			||||||
		"Africa/Cairo",
 | 
					 | 
				
			||||||
		"Africa/Johannesburg",
 | 
					 | 
				
			||||||
		"Africa/Lagos",
 | 
					 | 
				
			||||||
		"Africa/Nairobi",
 | 
					 | 
				
			||||||
		"America/Adak",
 | 
					 | 
				
			||||||
		"America/Anchorage",
 | 
					 | 
				
			||||||
		"America/Buenos_Aires",
 | 
					 | 
				
			||||||
		"America/Chicago",
 | 
					 | 
				
			||||||
		"America/Denver",
 | 
					 | 
				
			||||||
		"America/Los_Angeles",
 | 
					 | 
				
			||||||
		"America/Mexico_City",
 | 
					 | 
				
			||||||
		"America/New_York",
 | 
					 | 
				
			||||||
		"America/Nuuk",
 | 
					 | 
				
			||||||
		"America/Phoenix",
 | 
					 | 
				
			||||||
		"America/Puerto_Rico",
 | 
					 | 
				
			||||||
		"America/Sao_Paulo",
 | 
					 | 
				
			||||||
		"America/St_Johns",
 | 
					 | 
				
			||||||
		"America/Toronto",
 | 
					 | 
				
			||||||
		"Asia/Dubai",
 | 
					 | 
				
			||||||
		"Asia/Hong_Kong",
 | 
					 | 
				
			||||||
		"Asia/Kolkata",
 | 
					 | 
				
			||||||
		"Asia/Seoul",
 | 
					 | 
				
			||||||
		"Asia/Shanghai",
 | 
					 | 
				
			||||||
		"Asia/Singapore",
 | 
					 | 
				
			||||||
		"Asia/Tokyo",
 | 
					 | 
				
			||||||
		"Atlantic/Azores",
 | 
					 | 
				
			||||||
		"Australia/Melbourne",
 | 
					 | 
				
			||||||
		"Australia/Sydney",
 | 
					 | 
				
			||||||
		"Europe/Berlin",
 | 
					 | 
				
			||||||
		"Europe/London",
 | 
					 | 
				
			||||||
		"Europe/Moscow",
 | 
					 | 
				
			||||||
		"Europe/Paris",
 | 
					 | 
				
			||||||
		"Pacific/Auckland",
 | 
					 | 
				
			||||||
		"Pacific/Honolulu",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// niceSeconds takes in an int (in seconds) and returns a string readable
 | 
					 | 
				
			||||||
// representation. For example 1928371 -> "22d 7h 39m 31s".
 | 
					 | 
				
			||||||
func NiceSeconds(input int64) (result string) {
 | 
					 | 
				
			||||||
	if input == 0 {
 | 
					 | 
				
			||||||
		return "N/A"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	days := math.Floor(float64(input) / 60 / 60 / 24)
 | 
					 | 
				
			||||||
	seconds := input % (60 * 60 * 24)
 | 
					 | 
				
			||||||
	hours := math.Floor(float64(seconds) / 60 / 60)
 | 
					 | 
				
			||||||
	seconds = input % (60 * 60)
 | 
					 | 
				
			||||||
	minutes := math.Floor(float64(seconds) / 60)
 | 
					 | 
				
			||||||
	seconds = input % 60
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if days > 0 {
 | 
					 | 
				
			||||||
		result += fmt.Sprintf("%dd ", int(days))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if hours > 0 {
 | 
					 | 
				
			||||||
		result += fmt.Sprintf("%dh ", int(hours))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if minutes > 0 {
 | 
					 | 
				
			||||||
		result += fmt.Sprintf("%dm ", int(minutes))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if seconds > 0 {
 | 
					 | 
				
			||||||
		result += fmt.Sprintf("%ds", int(seconds))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// niceNumbers takes in an int and returns a string representation. For example
 | 
					 | 
				
			||||||
// 19823 -> "19.8k".
 | 
					 | 
				
			||||||
func NiceNumbers(input int64) string {
 | 
					 | 
				
			||||||
	if input == 0 {
 | 
					 | 
				
			||||||
		return "0"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	abbreviations := []string{"", "k", "M", "B", "T"}
 | 
					 | 
				
			||||||
	abbrevIndex := int(math.Log10(float64(input)) / 3)
 | 
					 | 
				
			||||||
	scaledNumber := float64(input) / math.Pow(10, float64(abbrevIndex*3))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if scaledNumber >= 100 {
 | 
					 | 
				
			||||||
		return fmt.Sprintf("%.0f%s", scaledNumber, abbreviations[abbrevIndex])
 | 
					 | 
				
			||||||
	} else if scaledNumber >= 10 {
 | 
					 | 
				
			||||||
		return fmt.Sprintf("%.1f%s", scaledNumber, abbreviations[abbrevIndex])
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		return fmt.Sprintf("%.2f%s", scaledNumber, abbreviations[abbrevIndex])
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1,48 +0,0 @@
 | 
				
			|||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type ButtonVariant string
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	ButtonVariantPrimary   ButtonVariant = "PRIMARY"
 | 
					 | 
				
			||||||
	ButtonVariantSecondary ButtonVariant = "SECONDAY"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	baseClass string = "transition duration-100 ease-in font-medium w-full h-full px-2 py-1 text-white"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (v ButtonVariant) getClass() string {
 | 
					 | 
				
			||||||
	variantClass, ok := variantClassMap[v]
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		variantClass = variantClassMap[ButtonVariantPrimary]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return fmt.Sprintf("%s %s", variantClass, baseClass)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var variantClassMap = map[ButtonVariant]string{
 | 
					 | 
				
			||||||
	ButtonVariantPrimary:   "bg-gray-500 dark:text-gray-800 hover:bg-gray-800 dark:hover:bg-gray-100",
 | 
					 | 
				
			||||||
	ButtonVariantSecondary: "bg-black shadow-md hover:text-black hover:bg-white",
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ ButtonForm(title, formName string, variant ButtonVariant) {
 | 
					 | 
				
			||||||
	<button
 | 
					 | 
				
			||||||
		class={ variant.getClass() }
 | 
					 | 
				
			||||||
		type="submit"
 | 
					 | 
				
			||||||
		if formName != "" {
 | 
					 | 
				
			||||||
			form={ formName }
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	>
 | 
					 | 
				
			||||||
		{ title }
 | 
					 | 
				
			||||||
	</button>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ Button(title string, variant ButtonVariant) {
 | 
					 | 
				
			||||||
	@ButtonForm(title, "", variant)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ ButtonLink(title, url string, variant ButtonVariant) {
 | 
					 | 
				
			||||||
	<a href={ templ.SafeURL(url) } class={ "text-center", variant.getClass() } type="submit">{ title }</a>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,204 +0,0 @@
 | 
				
			|||||||
// Code generated by templ - DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// templ: version: v0.2.696
 | 
					 | 
				
			||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//lint:file-ignore SA4006 This context is only used if a nested component is present.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "github.com/a-h/templ"
 | 
					 | 
				
			||||||
import "context"
 | 
					 | 
				
			||||||
import "io"
 | 
					 | 
				
			||||||
import "bytes"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type ButtonVariant string
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	ButtonVariantPrimary   ButtonVariant = "PRIMARY"
 | 
					 | 
				
			||||||
	ButtonVariantSecondary ButtonVariant = "SECONDAY"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	baseClass string = "transition duration-100 ease-in font-medium w-full h-full px-2 py-1 text-white"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (v ButtonVariant) getClass() string {
 | 
					 | 
				
			||||||
	variantClass, ok := variantClassMap[v]
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		variantClass = variantClassMap[ButtonVariantPrimary]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return fmt.Sprintf("%s %s", variantClass, baseClass)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var variantClassMap = map[ButtonVariant]string{
 | 
					 | 
				
			||||||
	ButtonVariantPrimary:   "bg-gray-500 dark:text-gray-800 hover:bg-gray-800 dark:hover:bg-gray-100",
 | 
					 | 
				
			||||||
	ButtonVariantSecondary: "bg-black shadow-md hover:text-black hover:bg-white",
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func ButtonForm(title, formName string, variant ButtonVariant) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var1 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var1 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var2 = []any{variant.getClass()}
 | 
					 | 
				
			||||||
		templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var2...)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<button class=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var3 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var2).String())
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/buttom.templ`, Line: 1, Col: 0}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" type=\"submit\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if formName != "" {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" form=\"")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var templ_7745c5c3_Var4 string
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(formName)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/buttom.templ`, Line: 35, Col: 18}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var5 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(title)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/buttom.templ`, Line: 38, Col: 9}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</button>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Button(title string, variant ButtonVariant) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var6 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var6 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var6 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Err = ButtonForm(title, "", variant).Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func ButtonLink(title, url string, variant ButtonVariant) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var7 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var7 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var7 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var8 = []any{"text-center", variant.getClass()}
 | 
					 | 
				
			||||||
		templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var8...)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<a href=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var9 templ.SafeURL = templ.SafeURL(url)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var9)))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var10 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var8).String())
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/buttom.templ`, Line: 1, Col: 0}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" type=\"submit\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var11 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(title)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/buttom.templ`, Line: 47, Col: 97}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</a>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,47 +0,0 @@
 | 
				
			|||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/graph"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ DailyReadChart(dailyReadSVG graph.SVGGraphData) {
 | 
					 | 
				
			||||||
	<div class="relative w-full bg-white shadow-lg dark:bg-gray-700 rounded">
 | 
					 | 
				
			||||||
		<p class="absolute top-3 left-5 text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500">
 | 
					 | 
				
			||||||
			Daily Read Totals
 | 
					 | 
				
			||||||
		</p>
 | 
					 | 
				
			||||||
		<div class="relative">
 | 
					 | 
				
			||||||
			<svg viewBox={ fmt.Sprintf("26 0 755 %d", dailyReadSVG.Height) } preserveAspectRatio="none" width="100%" height="6em">
 | 
					 | 
				
			||||||
				<!-- Bezier Line Graph -->
 | 
					 | 
				
			||||||
				<path
 | 
					 | 
				
			||||||
					fill="#316BBE"
 | 
					 | 
				
			||||||
					fill-opacity="0.5"
 | 
					 | 
				
			||||||
					stroke="none"
 | 
					 | 
				
			||||||
					d={ fmt.Sprintf("%s %s", dailyReadSVG.BezierPath, dailyReadSVG.BezierFill) }
 | 
					 | 
				
			||||||
				></path>
 | 
					 | 
				
			||||||
				<path fill="none" stroke="#316BBE" d={ dailyReadSVG.BezierPath }></path>
 | 
					 | 
				
			||||||
			</svg>
 | 
					 | 
				
			||||||
			<div
 | 
					 | 
				
			||||||
				class="flex absolute w-full h-full top-0"
 | 
					 | 
				
			||||||
				style="width: calc(100%*31/30); transform: translateX(-50%); left: 50%"
 | 
					 | 
				
			||||||
			>
 | 
					 | 
				
			||||||
				<!-- Required for iOS "Hover" Events (onclick) -->
 | 
					 | 
				
			||||||
				for _, item := range dailyReadSVG.LinePoints {
 | 
					 | 
				
			||||||
					<div
 | 
					 | 
				
			||||||
						onclick
 | 
					 | 
				
			||||||
						class="opacity-0 hover:opacity-100 w-full"
 | 
					 | 
				
			||||||
						style="background: linear-gradient(rgba(128, 128, 128, 0.5), rgba(128, 128, 128, 0.5)) no-repeat center/2px 100%"
 | 
					 | 
				
			||||||
					>
 | 
					 | 
				
			||||||
						<div
 | 
					 | 
				
			||||||
							class="flex flex-col items-center p-2 rounded absolute top-3 dark:text-white text-xs pointer-events-none"
 | 
					 | 
				
			||||||
							style="transform: translateX(-50%); background-color: rgba(128, 128, 128, 0.2); left: 50%"
 | 
					 | 
				
			||||||
						>
 | 
					 | 
				
			||||||
							<span>{ item.Data.Label }</span>
 | 
					 | 
				
			||||||
							<span>{ fmt.Sprint(item.Data.Value) } minutes</span>
 | 
					 | 
				
			||||||
						</div>
 | 
					 | 
				
			||||||
					</div>
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,115 +0,0 @@
 | 
				
			|||||||
// Code generated by templ - DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// templ: version: v0.2.696
 | 
					 | 
				
			||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//lint:file-ignore SA4006 This context is only used if a nested component is present.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "github.com/a-h/templ"
 | 
					 | 
				
			||||||
import "context"
 | 
					 | 
				
			||||||
import "io"
 | 
					 | 
				
			||||||
import "bytes"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/graph"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func DailyReadChart(dailyReadSVG graph.SVGGraphData) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var1 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var1 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"relative w-full bg-white shadow-lg dark:bg-gray-700 rounded\"><p class=\"absolute top-3 left-5 text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500\">Daily Read Totals</p><div class=\"relative\"><svg viewBox=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var2 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("26 0 755 %d", dailyReadSVG.Height))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/daily_read_card.templ`, Line: 14, Col: 65}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" preserveAspectRatio=\"none\" width=\"100%\" height=\"6em\"><!-- Bezier Line Graph --><path fill=\"#316BBE\" fill-opacity=\"0.5\" stroke=\"none\" d=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var3 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s %s", dailyReadSVG.BezierPath, dailyReadSVG.BezierFill))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/daily_read_card.templ`, Line: 20, Col: 79}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"></path> <path fill=\"none\" stroke=\"#316BBE\" d=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var4 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(dailyReadSVG.BezierPath)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/daily_read_card.templ`, Line: 22, Col: 66}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"></path></svg><div class=\"flex absolute w-full h-full top-0\" style=\"width: calc(100%*31/30); transform: translateX(-50%); left: 50%\"><!-- Required for iOS \"Hover\" Events (onclick) -->")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for _, item := range dailyReadSVG.LinePoints {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div onclick class=\"opacity-0 hover:opacity-100 w-full\" style=\"background: linear-gradient(rgba(128, 128, 128, 0.5), rgba(128, 128, 128, 0.5)) no-repeat center/2px 100%\"><div class=\"flex flex-col items-center p-2 rounded absolute top-3 dark:text-white text-xs pointer-events-none\" style=\"transform: translateX(-50%); background-color: rgba(128, 128, 128, 0.2); left: 50%\"><span>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var templ_7745c5c3_Var5 string
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(item.Data.Label)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/daily_read_card.templ`, Line: 39, Col: 30}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</span> <span>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var templ_7745c5c3_Var6 string
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprint(item.Data.Value))
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/daily_read_card.templ`, Line: 40, Col: 42}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" minutes</span></div></div>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div></div>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,81 +0,0 @@
 | 
				
			|||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/database"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/common"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func FirstNonZero[T comparable](all ...T) T {
 | 
					 | 
				
			||||||
	var zeroT T
 | 
					 | 
				
			||||||
	for _, item := range all {
 | 
					 | 
				
			||||||
		if item != zeroT {
 | 
					 | 
				
			||||||
			return item
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return zeroT
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func orUnknown(val *string) string {
 | 
					 | 
				
			||||||
	if val == nil {
 | 
					 | 
				
			||||||
		return "Unknown"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return *val
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ DocumentCard(document database.GetDocumentsWithStatsRow) {
 | 
					 | 
				
			||||||
	<div class="w-full relative">
 | 
					 | 
				
			||||||
		<div
 | 
					 | 
				
			||||||
			class="flex gap-4 w-full h-full p-4 shadow-lg bg-white dark:bg-gray-700 rounded"
 | 
					 | 
				
			||||||
		>
 | 
					 | 
				
			||||||
			<div class="min-w-fit my-auto h-48 relative">
 | 
					 | 
				
			||||||
				<a href={ templ.SafeURL(fmt.Sprintf("./documents/%s", document.ID)) }>
 | 
					 | 
				
			||||||
					<img
 | 
					 | 
				
			||||||
						class="rounded object-cover h-full"
 | 
					 | 
				
			||||||
						src={ fmt.Sprintf("./documents/%s/cover", document.ID) }
 | 
					 | 
				
			||||||
					/>
 | 
					 | 
				
			||||||
				</a>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
			<div class="flex flex-col justify-around dark:text-white w-full text-sm">
 | 
					 | 
				
			||||||
				<div class="inline-flex shrink-0 items-center">
 | 
					 | 
				
			||||||
					<div>
 | 
					 | 
				
			||||||
						<p class="text-gray-400">Title</p>
 | 
					 | 
				
			||||||
						<p class="font-medium">{ orUnknown(document.Title) }</p>
 | 
					 | 
				
			||||||
					</div>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
				<div class="inline-flex shrink-0 items-center">
 | 
					 | 
				
			||||||
					<div>
 | 
					 | 
				
			||||||
						<p class="text-gray-400">Author</p>
 | 
					 | 
				
			||||||
						<p class="font-medium">{ orUnknown(document.Author) }</p>
 | 
					 | 
				
			||||||
					</div>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
				<div class="inline-flex shrink-0 items-center">
 | 
					 | 
				
			||||||
					<div>
 | 
					 | 
				
			||||||
						<p class="text-gray-400">Progress</p>
 | 
					 | 
				
			||||||
						<p class="font-medium">{ fmt.Sprintf("%.2f%%", document.Percentage) }</p>
 | 
					 | 
				
			||||||
					</div>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
				<div class="inline-flex shrink-0 items-center">
 | 
					 | 
				
			||||||
					<div>
 | 
					 | 
				
			||||||
						<p class="text-gray-400">Time Read</p>
 | 
					 | 
				
			||||||
						<p class="font-medium">{ common.NiceSeconds(document.TotalTimeSeconds) }</p>
 | 
					 | 
				
			||||||
					</div>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
			<div
 | 
					 | 
				
			||||||
				class="absolute flex flex-col gap-2 right-4 bottom-4 text-gray-500 dark:text-gray-400"
 | 
					 | 
				
			||||||
			>
 | 
					 | 
				
			||||||
				<a href="./activity?document={{ .ID }}">
 | 
					 | 
				
			||||||
					@ActivitySVG("")
 | 
					 | 
				
			||||||
				</a>
 | 
					 | 
				
			||||||
				if document.Filepath != nil && *document.Filepath != "" {
 | 
					 | 
				
			||||||
					<a href={ templ.SafeURL(fmt.Sprintf("./documents/%s/file", document.ID)) }>
 | 
					 | 
				
			||||||
						@DownloadSVG("")
 | 
					 | 
				
			||||||
					</a>
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					@DownloadSVG("text-gray-200 dark:text-gray-600")
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,172 +0,0 @@
 | 
				
			|||||||
// Code generated by templ - DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// templ: version: v0.2.696
 | 
					 | 
				
			||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//lint:file-ignore SA4006 This context is only used if a nested component is present.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "github.com/a-h/templ"
 | 
					 | 
				
			||||||
import "context"
 | 
					 | 
				
			||||||
import "io"
 | 
					 | 
				
			||||||
import "bytes"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/database"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/common"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func FirstNonZero[T comparable](all ...T) T {
 | 
					 | 
				
			||||||
	var zeroT T
 | 
					 | 
				
			||||||
	for _, item := range all {
 | 
					 | 
				
			||||||
		if item != zeroT {
 | 
					 | 
				
			||||||
			return item
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return zeroT
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func orUnknown(val *string) string {
 | 
					 | 
				
			||||||
	if val == nil {
 | 
					 | 
				
			||||||
		return "Unknown"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return *val
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func DocumentCard(document database.GetDocumentsWithStatsRow) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var1 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var1 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"w-full relative\"><div class=\"flex gap-4 w-full h-full p-4 shadow-lg bg-white dark:bg-gray-700 rounded\"><div class=\"min-w-fit my-auto h-48 relative\"><a href=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var2 templ.SafeURL = templ.SafeURL(fmt.Sprintf("./documents/%s", document.ID))
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var2)))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><img class=\"rounded object-cover h-full\" src=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var3 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("./documents/%s/cover", document.ID))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/document_card.templ`, Line: 35, Col: 60}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"></a></div><div class=\"flex flex-col justify-around dark:text-white w-full text-sm\"><div class=\"inline-flex shrink-0 items-center\"><div><p class=\"text-gray-400\">Title</p><p class=\"font-medium\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var4 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(orUnknown(document.Title))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/document_card.templ`, Line: 43, Col: 56}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div></div><div class=\"inline-flex shrink-0 items-center\"><div><p class=\"text-gray-400\">Author</p><p class=\"font-medium\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var5 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(orUnknown(document.Author))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/document_card.templ`, Line: 49, Col: 57}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div></div><div class=\"inline-flex shrink-0 items-center\"><div><p class=\"text-gray-400\">Progress</p><p class=\"font-medium\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var6 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%.2f%%", document.Percentage))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/document_card.templ`, Line: 55, Col: 73}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div></div><div class=\"inline-flex shrink-0 items-center\"><div><p class=\"text-gray-400\">Time Read</p><p class=\"font-medium\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var7 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(common.NiceSeconds(document.TotalTimeSeconds))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/document_card.templ`, Line: 61, Col: 76}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div></div></div><div class=\"absolute flex flex-col gap-2 right-4 bottom-4 text-gray-500 dark:text-gray-400\"><a href=\"./activity?document={{ .ID }}\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		templ_7745c5c3_Err = ActivitySVG("").Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</a> ")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if document.Filepath != nil && *document.Filepath != "" {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<a href=\"")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var templ_7745c5c3_Var8 templ.SafeURL = templ.SafeURL(fmt.Sprintf("./documents/%s/file", document.ID))
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var8)))
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\">")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			templ_7745c5c3_Err = DownloadSVG("").Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</a>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Err = DownloadSVG("text-gray-200 dark:text-gray-600").Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div></div>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,26 +0,0 @@
 | 
				
			|||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ InfoCard(name string, metric int) {
 | 
					 | 
				
			||||||
	<div class="w-full">
 | 
					 | 
				
			||||||
		@infoCardInner(name, metric)
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ InfoCardLink(name string, metric int, link string) {
 | 
					 | 
				
			||||||
	<a href={ templ.SafeURL(link) } class="w-full">
 | 
					 | 
				
			||||||
		@infoCardInner(name, metric)
 | 
					 | 
				
			||||||
	</a>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ infoCardInner(name string, metric int) {
 | 
					 | 
				
			||||||
	<div class="flex gap-4 w-full p-4 bg-white shadow-lg dark:bg-gray-700 rounded">
 | 
					 | 
				
			||||||
		<div class="flex flex-col justify-around dark:text-white w-full text-sm">
 | 
					 | 
				
			||||||
			<p class="text-2xl font-bold text-black dark:text-white">{ fmt.Sprint(metric) }</p>
 | 
					 | 
				
			||||||
			<p class="text-sm text-gray-400">{ name }</p>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,138 +0,0 @@
 | 
				
			|||||||
// Code generated by templ - DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// templ: version: v0.2.696
 | 
					 | 
				
			||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//lint:file-ignore SA4006 This context is only used if a nested component is present.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "github.com/a-h/templ"
 | 
					 | 
				
			||||||
import "context"
 | 
					 | 
				
			||||||
import "io"
 | 
					 | 
				
			||||||
import "bytes"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func InfoCard(name string, metric int) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var1 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var1 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"w-full\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		templ_7745c5c3_Err = infoCardInner(name, metric).Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func InfoCardLink(name string, metric int, link string) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var2 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var2 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var2 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<a href=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var3 templ.SafeURL = templ.SafeURL(link)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var3)))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"w-full\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		templ_7745c5c3_Err = infoCardInner(name, metric).Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</a>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func infoCardInner(name string, metric int) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var4 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var4 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var4 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex gap-4 w-full p-4 bg-white shadow-lg dark:bg-gray-700 rounded\"><div class=\"flex flex-col justify-around dark:text-white w-full text-sm\"><p class=\"text-2xl font-bold text-black dark:text-white\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var5 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprint(metric))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/info_card.templ`, Line: 22, Col: 80}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p><p class=\"text-sm text-gray-400\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var6 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(name)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/info_card.templ`, Line: 23, Col: 42}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div></div>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,91 +0,0 @@
 | 
				
			|||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/common"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ LeaderboardCard(name string, stats map[string][]common.UserStatisticEntry) {
 | 
					 | 
				
			||||||
	<div class="w-full">
 | 
					 | 
				
			||||||
		<div class="flex flex-col justify-between h-full w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded">
 | 
					 | 
				
			||||||
			<div>
 | 
					 | 
				
			||||||
				<div class="flex justify-between">
 | 
					 | 
				
			||||||
					<p class="text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500">
 | 
					 | 
				
			||||||
						{ name } Leaderboard
 | 
					 | 
				
			||||||
					</p>
 | 
					 | 
				
			||||||
					<div class="flex gap-2 text-xs text-gray-400 items-center">
 | 
					 | 
				
			||||||
						<label
 | 
					 | 
				
			||||||
							for={ fmt.Sprintf("all-%s", name) }
 | 
					 | 
				
			||||||
							class="cursor-pointer hover:text-black dark:hover:text-white"
 | 
					 | 
				
			||||||
						>all</label>
 | 
					 | 
				
			||||||
						<label
 | 
					 | 
				
			||||||
							for={ fmt.Sprintf("year-%s", name) }
 | 
					 | 
				
			||||||
							class="cursor-pointer hover:text-black dark:hover:text-white"
 | 
					 | 
				
			||||||
						>year</label>
 | 
					 | 
				
			||||||
						<label
 | 
					 | 
				
			||||||
							for={ fmt.Sprintf("month-%s", name) }
 | 
					 | 
				
			||||||
							class="cursor-pointer hover:text-black dark:hover:text-white"
 | 
					 | 
				
			||||||
						>month</label>
 | 
					 | 
				
			||||||
						<label
 | 
					 | 
				
			||||||
							for={ fmt.Sprintf("week-%s", name) }
 | 
					 | 
				
			||||||
							class="cursor-pointer hover:text-black dark:hover:text-white"
 | 
					 | 
				
			||||||
						>week</label>
 | 
					 | 
				
			||||||
					</div>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
			<input
 | 
					 | 
				
			||||||
				type="radio"
 | 
					 | 
				
			||||||
				name={ fmt.Sprintf("options-%s", name) }
 | 
					 | 
				
			||||||
				id={ fmt.Sprintf("all-%s", name) }
 | 
					 | 
				
			||||||
				class="hidden peer/All"
 | 
					 | 
				
			||||||
				checked
 | 
					 | 
				
			||||||
			/>
 | 
					 | 
				
			||||||
			<input
 | 
					 | 
				
			||||||
				type="radio"
 | 
					 | 
				
			||||||
				name={ fmt.Sprintf("options-%s", name) }
 | 
					 | 
				
			||||||
				id={ fmt.Sprintf("year-%s", name) }
 | 
					 | 
				
			||||||
				class="hidden peer/Year"
 | 
					 | 
				
			||||||
			/>
 | 
					 | 
				
			||||||
			<input
 | 
					 | 
				
			||||||
				type="radio"
 | 
					 | 
				
			||||||
				name={ fmt.Sprintf("options-%s", name) }
 | 
					 | 
				
			||||||
				id={ fmt.Sprintf("month-%s", name) }
 | 
					 | 
				
			||||||
				class="hidden peer/Month"
 | 
					 | 
				
			||||||
			/>
 | 
					 | 
				
			||||||
			<input
 | 
					 | 
				
			||||||
				type="radio"
 | 
					 | 
				
			||||||
				name={ fmt.Sprintf("options-%s", name) }
 | 
					 | 
				
			||||||
				id={ fmt.Sprintf("week-%s", name) }
 | 
					 | 
				
			||||||
				class="hidden peer/Week"
 | 
					 | 
				
			||||||
			/>
 | 
					 | 
				
			||||||
			for name, data := range stats {
 | 
					 | 
				
			||||||
				<div class={ "flex items-end my-6 space-x-2 hidden", fmt.Sprintf("peer-checked/%s:block", name) }>
 | 
					 | 
				
			||||||
					if len(data) == 0 {
 | 
					 | 
				
			||||||
						<p class="text-5xl font-bold text-black dark:text-white">N/A</p>
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						<p class="text-5xl font-bold text-black dark:text-white">{ data[0].UserID }</p>
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
				<div class={ "hidden dark:text-white", fmt.Sprintf("peer-checked/%s:block", name) }>
 | 
					 | 
				
			||||||
					for idx, item := range data {
 | 
					 | 
				
			||||||
						if idx == 0 {
 | 
					 | 
				
			||||||
							<div class="flex items-center justify-between pt-2 pb-2 text-sm">
 | 
					 | 
				
			||||||
								<div>
 | 
					 | 
				
			||||||
									<p>{ item.UserID }</p>
 | 
					 | 
				
			||||||
								</div>
 | 
					 | 
				
			||||||
								<div class="flex items-end font-bold">{ item.Value }</div>
 | 
					 | 
				
			||||||
							</div>
 | 
					 | 
				
			||||||
						} else if idx < 3 {
 | 
					 | 
				
			||||||
							<div class="flex items-center justify-between pt-2 pb-2 text-sm border-t border-gray-200">
 | 
					 | 
				
			||||||
								<div>
 | 
					 | 
				
			||||||
									<p>{ item.UserID }</p>
 | 
					 | 
				
			||||||
								</div>
 | 
					 | 
				
			||||||
								<div class="flex items-end font-bold">{ item.Value }</div>
 | 
					 | 
				
			||||||
							</div>
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,356 +0,0 @@
 | 
				
			|||||||
// Code generated by templ - DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// templ: version: v0.2.696
 | 
					 | 
				
			||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//lint:file-ignore SA4006 This context is only used if a nested component is present.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "github.com/a-h/templ"
 | 
					 | 
				
			||||||
import "context"
 | 
					 | 
				
			||||||
import "io"
 | 
					 | 
				
			||||||
import "bytes"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/common"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func LeaderboardCard(name string, stats map[string][]common.UserStatisticEntry) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var1 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var1 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"w-full\"><div class=\"flex flex-col justify-between h-full w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded\"><div><div class=\"flex justify-between\"><p class=\"text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var2 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(name)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 14, Col: 12}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" Leaderboard</p><div class=\"flex gap-2 text-xs text-gray-400 items-center\"><label for=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var3 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("all-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 18, Col: 40}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"cursor-pointer hover:text-black dark:hover:text-white\">all</label> <label for=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var4 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("year-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 22, Col: 41}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"cursor-pointer hover:text-black dark:hover:text-white\">year</label> <label for=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var5 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("month-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 26, Col: 42}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"cursor-pointer hover:text-black dark:hover:text-white\">month</label> <label for=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var6 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("week-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 30, Col: 41}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"cursor-pointer hover:text-black dark:hover:text-white\">week</label></div></div></div><input type=\"radio\" name=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var7 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("options-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 38, Col: 42}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var8 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("all-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 39, Col: 36}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"hidden peer/All\" checked> <input type=\"radio\" name=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var9 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("options-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 45, Col: 42}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var10 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("year-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 46, Col: 37}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"hidden peer/Year\"> <input type=\"radio\" name=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var11 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("options-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 51, Col: 42}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var12 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("month-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 52, Col: 38}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"hidden peer/Month\"> <input type=\"radio\" name=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var13 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("options-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 57, Col: 42}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var14 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("week-%s", name))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 58, Col: 37}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"hidden peer/Week\"> ")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for name, data := range stats {
 | 
					 | 
				
			||||||
			var templ_7745c5c3_Var15 = []any{"flex items-end my-6 space-x-2 hidden", fmt.Sprintf("peer-checked/%s:block", name)}
 | 
					 | 
				
			||||||
			templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var15...)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var templ_7745c5c3_Var16 string
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var15).String())
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 1, Col: 0}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\">")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if len(data) == 0 {
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<p class=\"text-5xl font-bold text-black dark:text-white\">N/A</p>")
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<p class=\"text-5xl font-bold text-black dark:text-white\">")
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				var templ_7745c5c3_Var17 string
 | 
					 | 
				
			||||||
				templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(data[0].UserID)
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 66, Col: 79}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p>")
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var templ_7745c5c3_Var18 = []any{"hidden dark:text-white", fmt.Sprintf("peer-checked/%s:block", name)}
 | 
					 | 
				
			||||||
			templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var18...)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var templ_7745c5c3_Var19 string
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var18).String())
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 1, Col: 0}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\">")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			for idx, item := range data {
 | 
					 | 
				
			||||||
				if idx == 0 {
 | 
					 | 
				
			||||||
					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex items-center justify-between pt-2 pb-2 text-sm\"><div><p>")
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					var templ_7745c5c3_Var20 string
 | 
					 | 
				
			||||||
					templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(item.UserID)
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 74, Col: 25}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div><div class=\"flex items-end font-bold\">")
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					var templ_7745c5c3_Var21 string
 | 
					 | 
				
			||||||
					templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(item.Value)
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 76, Col: 58}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div>")
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if idx < 3 {
 | 
					 | 
				
			||||||
					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex items-center justify-between pt-2 pb-2 text-sm border-t border-gray-200\"><div><p>")
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					var templ_7745c5c3_Var22 string
 | 
					 | 
				
			||||||
					templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinStringErrs(item.UserID)
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 81, Col: 25}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22))
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div><div class=\"flex items-end font-bold\">")
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					var templ_7745c5c3_Var23 string
 | 
					 | 
				
			||||||
					templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(item.Value)
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/leaderboard_card.templ`, Line: 83, Col: 58}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div>")
 | 
					 | 
				
			||||||
					if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
						return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,57 +0,0 @@
 | 
				
			|||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/database"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ StreakCard(streak database.UserStreak) {
 | 
					 | 
				
			||||||
	<div class="w-full">
 | 
					 | 
				
			||||||
		<div class="relative w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded">
 | 
					 | 
				
			||||||
			<p class="text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500">
 | 
					 | 
				
			||||||
				if streak.Window == "WEEK" {
 | 
					 | 
				
			||||||
					Weekly Read Streak
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					Daily Read Streak
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			</p>
 | 
					 | 
				
			||||||
			<div class="flex items-end my-6 space-x-2">
 | 
					 | 
				
			||||||
				<p class="text-5xl font-bold text-black dark:text-white">
 | 
					 | 
				
			||||||
					{ fmt.Sprint(streak.CurrentStreak) }
 | 
					 | 
				
			||||||
				</p>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
			<div class="dark:text-white">
 | 
					 | 
				
			||||||
				<div class="flex items-center justify-between pb-2 mb-2 text-sm border-b border-gray-200">
 | 
					 | 
				
			||||||
					<div>
 | 
					 | 
				
			||||||
						<p>
 | 
					 | 
				
			||||||
							if streak.Window == "WEEK" {
 | 
					 | 
				
			||||||
								Current Read Streak
 | 
					 | 
				
			||||||
							} else {
 | 
					 | 
				
			||||||
								Current Read Streak
 | 
					 | 
				
			||||||
							}
 | 
					 | 
				
			||||||
						</p>
 | 
					 | 
				
			||||||
						<div class="flex items-end text-sm text-gray-400">
 | 
					 | 
				
			||||||
							{ streak.CurrentStreakStartDate } ➞ { streak.CurrentStreakEndDate }
 | 
					 | 
				
			||||||
						</div>
 | 
					 | 
				
			||||||
					</div>
 | 
					 | 
				
			||||||
					<div class="flex items-end font-bold">{ fmt.Sprint(streak.CurrentStreak) }</div>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
				<div class="flex items-center justify-between pb-2 mb-2 text-sm">
 | 
					 | 
				
			||||||
					<div>
 | 
					 | 
				
			||||||
						<p>
 | 
					 | 
				
			||||||
							if streak.Window == "WEEK" {
 | 
					 | 
				
			||||||
								Best Weekly Streak
 | 
					 | 
				
			||||||
							} else {
 | 
					 | 
				
			||||||
								Best Daily Streak
 | 
					 | 
				
			||||||
							}
 | 
					 | 
				
			||||||
						</p>
 | 
					 | 
				
			||||||
						<div class="flex items-end text-sm text-gray-400">
 | 
					 | 
				
			||||||
							{ streak.MaxStreakStartDate } ➞ { streak.MaxStreakEndDate }
 | 
					 | 
				
			||||||
						</div>
 | 
					 | 
				
			||||||
					</div>
 | 
					 | 
				
			||||||
					<div class="flex items-end font-bold">{ fmt.Sprint(streak.MaxStreak) }</div>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,176 +0,0 @@
 | 
				
			|||||||
// Code generated by templ - DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// templ: version: v0.2.696
 | 
					 | 
				
			||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//lint:file-ignore SA4006 This context is only used if a nested component is present.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "github.com/a-h/templ"
 | 
					 | 
				
			||||||
import "context"
 | 
					 | 
				
			||||||
import "io"
 | 
					 | 
				
			||||||
import "bytes"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/database"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func StreakCard(streak database.UserStreak) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var1 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var1 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"w-full\"><div class=\"relative w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded\"><p class=\"text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if streak.Window == "WEEK" {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Weekly Read Streak")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Daily Read Streak")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p><div class=\"flex items-end my-6 space-x-2\"><p class=\"text-5xl font-bold text-black dark:text-white\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var2 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprint(streak.CurrentStreak))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/streak_card.templ`, Line: 20, Col: 39}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div><div class=\"dark:text-white\"><div class=\"flex items-center justify-between pb-2 mb-2 text-sm border-b border-gray-200\"><div><p>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if streak.Window == "WEEK" {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Current Read Streak")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Current Read Streak")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p><div class=\"flex items-end text-sm text-gray-400\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var3 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(streak.CurrentStreakStartDate)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/streak_card.templ`, Line: 34, Col: 38}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ➞ ")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var4 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(streak.CurrentStreakEndDate)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/streak_card.templ`, Line: 34, Col: 74}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div><div class=\"flex items-end font-bold\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var5 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprint(streak.CurrentStreak))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/streak_card.templ`, Line: 37, Col: 77}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div><div class=\"flex items-center justify-between pb-2 mb-2 text-sm\"><div><p>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if streak.Window == "WEEK" {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Best Weekly Streak")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Best Daily Streak")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p><div class=\"flex items-end text-sm text-gray-400\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var6 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(streak.MaxStreakStartDate)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/streak_card.templ`, Line: 49, Col: 34}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ➞ ")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var7 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(streak.MaxStreakEndDate)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/streak_card.templ`, Line: 49, Col: 66}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div><div class=\"flex items-end font-bold\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var8 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprint(streak.MaxStreak))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/streak_card.templ`, Line: 52, Col: 73}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div></div></div></div>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -35,7 +35,7 @@ func ActivitySVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var3 string
 | 
							var templ_7745c5c3_Var3 string
 | 
				
			||||||
		templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var2).String())
 | 
							templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var2).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -77,7 +77,7 @@ func AddSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var6 string
 | 
							var templ_7745c5c3_Var6 string
 | 
				
			||||||
		templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var5).String())
 | 
							templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var5).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -119,7 +119,7 @@ func ClockSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var9 string
 | 
							var templ_7745c5c3_Var9 string
 | 
				
			||||||
		templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var8).String())
 | 
							templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var8).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -161,7 +161,7 @@ func DeleteSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var12 string
 | 
							var templ_7745c5c3_Var12 string
 | 
				
			||||||
		templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var11).String())
 | 
							templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var11).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -203,7 +203,7 @@ func DocumentSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var15 string
 | 
							var templ_7745c5c3_Var15 string
 | 
				
			||||||
		templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var14).String())
 | 
							templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var14).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -245,7 +245,7 @@ func DownloadSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var18 string
 | 
							var templ_7745c5c3_Var18 string
 | 
				
			||||||
		templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var17).String())
 | 
							templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var17).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -287,7 +287,7 @@ func DropdownSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var21 string
 | 
							var templ_7745c5c3_Var21 string
 | 
				
			||||||
		templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var20).String())
 | 
							templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var20).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -329,7 +329,7 @@ func EditSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var24 string
 | 
							var templ_7745c5c3_Var24 string
 | 
				
			||||||
		templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var23).String())
 | 
							templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var23).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -371,7 +371,7 @@ func GitSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var27 string
 | 
							var templ_7745c5c3_Var27 string
 | 
				
			||||||
		templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var26).String())
 | 
							templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var26).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -413,7 +413,7 @@ func HomeSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var30 string
 | 
							var templ_7745c5c3_Var30 string
 | 
				
			||||||
		templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var29).String())
 | 
							templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var29).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -455,7 +455,7 @@ func ImportSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var33 string
 | 
							var templ_7745c5c3_Var33 string
 | 
				
			||||||
		templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var32).String())
 | 
							templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var32).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -497,7 +497,7 @@ func InfoSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var36 string
 | 
							var templ_7745c5c3_Var36 string
 | 
				
			||||||
		templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var35).String())
 | 
							templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var35).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -539,7 +539,7 @@ func LoadingSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var39 string
 | 
							var templ_7745c5c3_Var39 string
 | 
				
			||||||
		templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var38).String())
 | 
							templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var38).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -581,7 +581,7 @@ func PasswordSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var42 string
 | 
							var templ_7745c5c3_Var42 string
 | 
				
			||||||
		templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var41).String())
 | 
							templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var41).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -623,7 +623,7 @@ func SearchSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var45 string
 | 
							var templ_7745c5c3_Var45 string
 | 
				
			||||||
		templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var44).String())
 | 
							templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var44).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -665,7 +665,7 @@ func Search2SVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var48 string
 | 
							var templ_7745c5c3_Var48 string
 | 
				
			||||||
		templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var47).String())
 | 
							templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var47).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -707,7 +707,7 @@ func SettingsSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var51 string
 | 
							var templ_7745c5c3_Var51 string
 | 
				
			||||||
		templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var50).String())
 | 
							templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var50).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -749,7 +749,7 @@ func UploadSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var54 string
 | 
							var templ_7745c5c3_Var54 string
 | 
				
			||||||
		templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var53).String())
 | 
							templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var53).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -791,7 +791,7 @@ func UserSVG(className string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var57 string
 | 
							var templ_7745c5c3_Var57 string
 | 
				
			||||||
		templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var56).String())
 | 
							templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var56).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/svgs.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `svgs.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,49 +0,0 @@
 | 
				
			|||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type TableCellFormatter[T any] func(data T) templ.Component
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type TableColumn[T any] struct {
 | 
					 | 
				
			||||||
	Name      string                // Column Name
 | 
					 | 
				
			||||||
	Getter    func(T) string        // Data Getter
 | 
					 | 
				
			||||||
	Formatter TableCellFormatter[T] // Data Formatter
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ (c *TableColumn[T]) getCell(d T) {
 | 
					 | 
				
			||||||
	if c.Formatter != nil {
 | 
					 | 
				
			||||||
		@c.Formatter(d)
 | 
					 | 
				
			||||||
	} else if c.Getter != nil {
 | 
					 | 
				
			||||||
		{ c.Getter(d) }
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		"Unknown"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ Table[T any](columns []TableColumn[T], rows []T) {
 | 
					 | 
				
			||||||
	<table class="min-w-full leading-normal bg-white dark:bg-gray-700 text-sm">
 | 
					 | 
				
			||||||
		<thead class="text-gray-800 dark:text-gray-400">
 | 
					 | 
				
			||||||
			<tr>
 | 
					 | 
				
			||||||
				for _, column := range columns {
 | 
					 | 
				
			||||||
					<th class="p-3 font-normal text-left uppercase border-b border-gray-200 dark:border-gray-800">
 | 
					 | 
				
			||||||
						{ column.Name }
 | 
					 | 
				
			||||||
					</th>
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			</tr>
 | 
					 | 
				
			||||||
		</thead>
 | 
					 | 
				
			||||||
		<tbody class="text-black dark:text-white">
 | 
					 | 
				
			||||||
			if len(rows) == 0 {
 | 
					 | 
				
			||||||
				<tr>
 | 
					 | 
				
			||||||
					<td class="text-center p-3" colspan="4">No Results</td>
 | 
					 | 
				
			||||||
				</tr>
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			for _, row := range rows {
 | 
					 | 
				
			||||||
				<tr>
 | 
					 | 
				
			||||||
					for _, column := range columns {
 | 
					 | 
				
			||||||
						<td class="p-3 border-b border-gray-200">
 | 
					 | 
				
			||||||
							@column.getCell(row)
 | 
					 | 
				
			||||||
						</td>
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				</tr>
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		</tbody>
 | 
					 | 
				
			||||||
	</table>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,141 +0,0 @@
 | 
				
			|||||||
// Code generated by templ - DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// templ: version: v0.2.696
 | 
					 | 
				
			||||||
package components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//lint:file-ignore SA4006 This context is only used if a nested component is present.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "github.com/a-h/templ"
 | 
					 | 
				
			||||||
import "context"
 | 
					 | 
				
			||||||
import "io"
 | 
					 | 
				
			||||||
import "bytes"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type TableCellFormatter[T any] func(data T) templ.Component
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type TableColumn[T any] struct {
 | 
					 | 
				
			||||||
	Name      string                // Column Name
 | 
					 | 
				
			||||||
	Getter    func(T) string        // Data Getter
 | 
					 | 
				
			||||||
	Formatter TableCellFormatter[T] // Data Formatter
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *TableColumn[T]) getCell(d T) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var1 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var1 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		if c.Formatter != nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Err = c.Formatter(d).Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else if c.Getter != nil {
 | 
					 | 
				
			||||||
			var templ_7745c5c3_Var2 string
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(c.Getter(d))
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/table.templ`, Line: 15, Col: 15}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"Unknown\"")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Table[T any](columns []TableColumn[T], rows []T) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var3 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var3 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var3 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<table class=\"min-w-full leading-normal bg-white dark:bg-gray-700 text-sm\"><thead class=\"text-gray-800 dark:text-gray-400\"><tr>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for _, column := range columns {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<th class=\"p-3 font-normal text-left uppercase border-b border-gray-200 dark:border-gray-800\">")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var templ_7745c5c3_Var4 string
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(column.Name)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/table.templ`, Line: 27, Col: 19}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</th>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</tr></thead> <tbody class=\"text-black dark:text-white\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if len(rows) == 0 {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<tr><td class=\"text-center p-3\" colspan=\"4\">No Results</td></tr>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for _, row := range rows {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<tr>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			for _, column := range columns {
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<td class=\"p-3 border-b border-gray-200\">")
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				templ_7745c5c3_Err = column.getCell(row).Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</td>")
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</tr>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</tbody></table>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,51 +0,0 @@
 | 
				
			|||||||
package pages
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/database"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/common"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/components"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var columns = []components.TableColumn[database.GetActivityRow]{
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Name:      "Document",
 | 
					 | 
				
			||||||
		Formatter: documentFormatter,
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Name: "Time",
 | 
					 | 
				
			||||||
		Getter: func(r database.GetActivityRow) string {
 | 
					 | 
				
			||||||
			return r.StartTime
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Name: "Duration",
 | 
					 | 
				
			||||||
		Getter: func(r database.GetActivityRow) string {
 | 
					 | 
				
			||||||
			return fmt.Sprint(r.Duration)
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Name:      "Percent",
 | 
					 | 
				
			||||||
		Formatter: percentageFormatter,
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ documentFormatter(row database.GetActivityRow) {
 | 
					 | 
				
			||||||
	<a href={ templ.SafeURL(fmt.Sprintf("./documents/%s", row.DocumentID)) }>
 | 
					 | 
				
			||||||
		{ fmt.Sprintf("%s - %s", *row.Author, *row.Title) }
 | 
					 | 
				
			||||||
	</a>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ percentageFormatter(row database.GetActivityRow) {
 | 
					 | 
				
			||||||
	{ fmt.Sprintf("%.2f%%", row.EndPercentage) }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ Activity(settings common.Settings, rows []database.GetActivityRow) {
 | 
					 | 
				
			||||||
	@layout(settings, "Activity") {
 | 
					 | 
				
			||||||
		<div class="overflow-x-auto">
 | 
					 | 
				
			||||||
			<div class="inline-block min-w-full overflow-hidden rounded shadow">
 | 
					 | 
				
			||||||
				@components.Table(columns, rows)
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,163 +0,0 @@
 | 
				
			|||||||
// Code generated by templ - DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// templ: version: v0.2.696
 | 
					 | 
				
			||||||
package pages
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//lint:file-ignore SA4006 This context is only used if a nested component is present.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "github.com/a-h/templ"
 | 
					 | 
				
			||||||
import "context"
 | 
					 | 
				
			||||||
import "io"
 | 
					 | 
				
			||||||
import "bytes"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/database"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/common"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/components"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var columns = []components.TableColumn[database.GetActivityRow]{
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Name:      "Document",
 | 
					 | 
				
			||||||
		Formatter: documentFormatter,
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Name: "Time",
 | 
					 | 
				
			||||||
		Getter: func(r database.GetActivityRow) string {
 | 
					 | 
				
			||||||
			return r.StartTime
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Name: "Duration",
 | 
					 | 
				
			||||||
		Getter: func(r database.GetActivityRow) string {
 | 
					 | 
				
			||||||
			return fmt.Sprint(r.Duration)
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Name:      "Percent",
 | 
					 | 
				
			||||||
		Formatter: percentageFormatter,
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func documentFormatter(row database.GetActivityRow) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var1 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var1 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<a href=\"")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var2 templ.SafeURL = templ.SafeURL(fmt.Sprintf("./documents/%s", row.DocumentID))
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var2)))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\">")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var3 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s - %s", *row.Author, *row.Title))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/activity.templ`, Line: 35, Col: 51}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</a>")
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func percentageFormatter(row database.GetActivityRow) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var4 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var4 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var4 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		var templ_7745c5c3_Var5 string
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%.2f%%", row.EndPercentage))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/activity.templ`, Line: 40, Col: 43}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Activity(settings common.Settings, rows []database.GetActivityRow) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var6 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var6 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var6 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var7 := templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
			if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
				templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
				defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"overflow-x-auto\"><div class=\"inline-block min-w-full overflow-hidden rounded shadow\">")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			templ_7745c5c3_Err = components.Table(columns, rows).Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = io.Copy(templ_7745c5c3_W, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
		templ_7745c5c3_Err = layout(settings, "Activity").Render(templ.WithChildren(ctx, templ_7745c5c3_Var7), templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,102 +0,0 @@
 | 
				
			|||||||
package pages
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/database"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/common"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/components"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ Documents(settings common.Settings, documents []database.GetDocumentsWithStatsRow, nextPage, previousPage, totalPages, pageLimit int64) {
 | 
					 | 
				
			||||||
	@layout(settings, "Activity") {
 | 
					 | 
				
			||||||
		<div
 | 
					 | 
				
			||||||
			class="flex flex-col gap-2 grow p-4 mb-4 rounded shadow-lg bg-white dark:bg-gray-700 text-gray-500 dark:text-white"
 | 
					 | 
				
			||||||
		>
 | 
					 | 
				
			||||||
			<form
 | 
					 | 
				
			||||||
				class="flex gap-4 flex-col lg:flex-row mb-0"
 | 
					 | 
				
			||||||
				action="./documents"
 | 
					 | 
				
			||||||
				method="GET"
 | 
					 | 
				
			||||||
			>
 | 
					 | 
				
			||||||
				<div class="flex flex-col w-full grow">
 | 
					 | 
				
			||||||
					<div class="flex relative">
 | 
					 | 
				
			||||||
						<span
 | 
					 | 
				
			||||||
							class="inline-flex items-center px-3 border-t bg-white border-l border-b border-gray-300 text-gray-500 shadow-sm text-sm"
 | 
					 | 
				
			||||||
						>
 | 
					 | 
				
			||||||
							@components.Search2SVG("size-4")
 | 
					 | 
				
			||||||
						</span>
 | 
					 | 
				
			||||||
						<input
 | 
					 | 
				
			||||||
							type="text"
 | 
					 | 
				
			||||||
							id="search"
 | 
					 | 
				
			||||||
							name="search"
 | 
					 | 
				
			||||||
							class="flex-1 appearance-none rounded-none border border-gray-300 w-full py-2 px-2 bg-white text-gray-700 placeholder-gray-400 shadow-sm text-base focus:outline-none focus:ring-2 focus:ring-purple-600 focus:border-transparent"
 | 
					 | 
				
			||||||
							placeholder="Search Author / Title"
 | 
					 | 
				
			||||||
						/>
 | 
					 | 
				
			||||||
					</div>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
				<div class="lg:w-60">
 | 
					 | 
				
			||||||
					@components.Button("Search", components.ButtonVariantSecondary)
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
			</form>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
		<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
 | 
					 | 
				
			||||||
			for _, doc := range documents {
 | 
					 | 
				
			||||||
				@components.DocumentCard(doc)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
		<div class="w-full flex gap-4 justify-center mt-4 text-black dark:text-white">
 | 
					 | 
				
			||||||
			if previousPage > 0 {
 | 
					 | 
				
			||||||
				<a
 | 
					 | 
				
			||||||
					href={ templ.SafeURL(fmt.Sprintf("./documents?page=%d&limit=%d", previousPage, pageLimit)) }
 | 
					 | 
				
			||||||
					class="bg-white shadow-lg dark:bg-gray-600 hover:bg-gray-400 font-medium rounded text-sm text-center p-2 w-24 dark:hover:bg-gray-700 focus:outline-none"
 | 
					 | 
				
			||||||
				>◄</a>
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if nextPage <= totalPages {
 | 
					 | 
				
			||||||
				<a
 | 
					 | 
				
			||||||
					href={ templ.SafeURL(fmt.Sprintf("./documents?page=%d&limit=%d", nextPage, pageLimit)) }
 | 
					 | 
				
			||||||
					class="bg-white shadow-lg dark:bg-gray-600 hover:bg-gray-400 font-medium rounded text-sm text-center p-2 w-24 dark:hover:bg-gray-700 focus:outline-none"
 | 
					 | 
				
			||||||
				>►</a>
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
		<div
 | 
					 | 
				
			||||||
			class="fixed bottom-6 right-6 rounded-full flex items-center justify-center"
 | 
					 | 
				
			||||||
		>
 | 
					 | 
				
			||||||
			<input type="checkbox" id="upload-file-button" class="hidden css-button"/>
 | 
					 | 
				
			||||||
			<div
 | 
					 | 
				
			||||||
				class="absolute right-0 z-10 bottom-0 rounded p-4 bg-gray-800 dark:bg-gray-200 text-white dark:text-black w-72 text-sm flex flex-col gap-2"
 | 
					 | 
				
			||||||
			>
 | 
					 | 
				
			||||||
				<form
 | 
					 | 
				
			||||||
					method="POST"
 | 
					 | 
				
			||||||
					enctype="multipart/form-data"
 | 
					 | 
				
			||||||
					action="./documents"
 | 
					 | 
				
			||||||
					class="flex flex-col gap-2 mb-0"
 | 
					 | 
				
			||||||
				>
 | 
					 | 
				
			||||||
					<input
 | 
					 | 
				
			||||||
						type="file"
 | 
					 | 
				
			||||||
						accept=".epub"
 | 
					 | 
				
			||||||
						id="document_file"
 | 
					 | 
				
			||||||
						name="document_file"
 | 
					 | 
				
			||||||
					/>
 | 
					 | 
				
			||||||
					<button
 | 
					 | 
				
			||||||
						class="font-medium px-2 py-1 text-gray-800 bg-gray-500 dark:text-white hover:bg-gray-100 dark:hover:bg-gray-800"
 | 
					 | 
				
			||||||
						type="submit"
 | 
					 | 
				
			||||||
					>
 | 
					 | 
				
			||||||
						Upload File
 | 
					 | 
				
			||||||
					</button>
 | 
					 | 
				
			||||||
				</form>
 | 
					 | 
				
			||||||
				<label for="upload-file-button">
 | 
					 | 
				
			||||||
					<div
 | 
					 | 
				
			||||||
						class="w-full text-center cursor-pointer font-medium mt-2 px-2 py-1 text-gray-800 bg-gray-500 dark:text-white hover:bg-gray-100 dark:hover:bg-gray-800"
 | 
					 | 
				
			||||||
					>
 | 
					 | 
				
			||||||
						Cancel Upload
 | 
					 | 
				
			||||||
					</div>
 | 
					 | 
				
			||||||
				</label>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
			<label
 | 
					 | 
				
			||||||
				class="w-16 h-16 bg-gray-800 dark:bg-gray-200 rounded-full flex items-center justify-center opacity-30 hover:opacity-100 transition-all duration-200 cursor-pointer"
 | 
					 | 
				
			||||||
				for="upload-file-button"
 | 
					 | 
				
			||||||
			>
 | 
					 | 
				
			||||||
				@components.UploadSVG("size-8")
 | 
					 | 
				
			||||||
			</label>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,125 +0,0 @@
 | 
				
			|||||||
// Code generated by templ - DO NOT EDIT.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// templ: version: v0.2.696
 | 
					 | 
				
			||||||
package pages
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//lint:file-ignore SA4006 This context is only used if a nested component is present.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "github.com/a-h/templ"
 | 
					 | 
				
			||||||
import "context"
 | 
					 | 
				
			||||||
import "io"
 | 
					 | 
				
			||||||
import "bytes"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/database"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/common"
 | 
					 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/components"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Documents(settings common.Settings, documents []database.GetDocumentsWithStatsRow, nextPage, previousPage, totalPages, pageLimit int64) templ.Component {
 | 
					 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
			defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.InitializeContext(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Var1 == nil {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Var1 = templ.NopComponent
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctx = templ.ClearChildren(ctx)
 | 
					 | 
				
			||||||
		templ_7745c5c3_Var2 := templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
					 | 
				
			||||||
			templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
					 | 
				
			||||||
			if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
				templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
					 | 
				
			||||||
				defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex flex-col gap-2 grow p-4 mb-4 rounded shadow-lg bg-white dark:bg-gray-700 text-gray-500 dark:text-white\"><form class=\"flex gap-4 flex-col lg:flex-row mb-0\" action=\"./documents\" method=\"GET\"><div class=\"flex flex-col w-full grow\"><div class=\"flex relative\"><span class=\"inline-flex items-center px-3 border-t bg-white border-l border-b border-gray-300 text-gray-500 shadow-sm text-sm\">")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			templ_7745c5c3_Err = components.Search2SVG("size-4").Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</span> <input type=\"text\" id=\"search\" name=\"search\" class=\"flex-1 appearance-none rounded-none border border-gray-300 w-full py-2 px-2 bg-white text-gray-700 placeholder-gray-400 shadow-sm text-base focus:outline-none focus:ring-2 focus:ring-purple-600 focus:border-transparent\" placeholder=\"Search Author / Title\"></div></div><div class=\"lg:w-60\">")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			templ_7745c5c3_Err = components.Button("Search", components.ButtonVariantSecondary).Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></form></div><div class=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			for _, doc := range documents {
 | 
					 | 
				
			||||||
				templ_7745c5c3_Err = components.DocumentCard(doc).Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div><div class=\"w-full flex gap-4 justify-center mt-4 text-black dark:text-white\">")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if previousPage > 0 {
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<a href=\"")
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				var templ_7745c5c3_Var3 templ.SafeURL = templ.SafeURL(fmt.Sprintf("./documents?page=%d&limit=%d", previousPage, pageLimit))
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var3)))
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"bg-white shadow-lg dark:bg-gray-600 hover:bg-gray-400 font-medium rounded text-sm text-center p-2 w-24 dark:hover:bg-gray-700 focus:outline-none\">◄</a> ")
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if nextPage <= totalPages {
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<a href=\"")
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				var templ_7745c5c3_Var4 templ.SafeURL = templ.SafeURL(fmt.Sprintf("./documents?page=%d&limit=%d", nextPage, pageLimit))
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var4)))
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"bg-white shadow-lg dark:bg-gray-600 hover:bg-gray-400 font-medium rounded text-sm text-center p-2 w-24 dark:hover:bg-gray-700 focus:outline-none\">►</a>")
 | 
					 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div><div class=\"fixed bottom-6 right-6 rounded-full flex items-center justify-center\"><input type=\"checkbox\" id=\"upload-file-button\" class=\"hidden css-button\"><div class=\"absolute right-0 z-10 bottom-0 rounded p-4 bg-gray-800 dark:bg-gray-200 text-white dark:text-black w-72 text-sm flex flex-col gap-2\"><form method=\"POST\" enctype=\"multipart/form-data\" action=\"./documents\" class=\"flex flex-col gap-2 mb-0\"><input type=\"file\" accept=\".epub\" id=\"document_file\" name=\"document_file\"> <button class=\"font-medium px-2 py-1 text-gray-800 bg-gray-500 dark:text-white hover:bg-gray-100 dark:hover:bg-gray-800\" type=\"submit\">Upload File</button></form><label for=\"upload-file-button\"><div class=\"w-full text-center cursor-pointer font-medium mt-2 px-2 py-1 text-gray-800 bg-gray-500 dark:text-white hover:bg-gray-100 dark:hover:bg-gray-800\">Cancel Upload</div></label></div><label class=\"w-16 h-16 bg-gray-800 dark:bg-gray-200 rounded-full flex items-center justify-center opacity-30 hover:opacity-100 transition-all duration-200 cursor-pointer\" for=\"upload-file-button\">")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			templ_7745c5c3_Err = components.UploadSVG("size-8").Render(ctx, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</label></div>")
 | 
					 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
				_, templ_7745c5c3_Err = io.Copy(templ_7745c5c3_W, templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
		templ_7745c5c3_Err = layout(settings, "Activity").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
 | 
					 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
					 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !templ_7745c5c3_IsBuffer {
 | 
					 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return templ_7745c5c3_Err
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,40 +1,256 @@
 | 
				
			|||||||
package pages
 | 
					package pages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"reichard.io/antholume/database"
 | 
						"reichard.io/antholume/database"
 | 
				
			||||||
	"reichard.io/antholume/graph"
 | 
						"reichard.io/antholume/graph"
 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/common"
 | 
						"reichard.io/antholume/ngtemplates/common"
 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/components"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserMetadata struct {
 | 
				
			||||||
 | 
						DocumentCount int
 | 
				
			||||||
 | 
						ActivityCount int
 | 
				
			||||||
 | 
						ProgressCount int
 | 
				
			||||||
 | 
						DeviceCount   int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserStatistics struct {
 | 
				
			||||||
 | 
						WPM      map[string][]UserStatisticEntry
 | 
				
			||||||
 | 
						Duration map[string][]UserStatisticEntry
 | 
				
			||||||
 | 
						Words    map[string][]UserStatisticEntry
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserStatisticEntry struct {
 | 
				
			||||||
 | 
						UserID string
 | 
				
			||||||
 | 
						Value  string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
templ Home(
 | 
					templ Home(
 | 
				
			||||||
	settings common.Settings,
 | 
						settings common.Settings,
 | 
				
			||||||
	dailyReadSVG graph.SVGGraphData,
 | 
						dailyReadSVG graph.SVGGraphData,
 | 
				
			||||||
	userStreaks []database.UserStreak,
 | 
						userStreaks []database.UserStreak,
 | 
				
			||||||
	userStatistics common.UserStatistics,
 | 
						userStatistics UserStatistics,
 | 
				
			||||||
	userMetadata common.UserMetadata,
 | 
						userMetadata UserMetadata,
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
	@layout(settings, "Home") {
 | 
						@layout(settings, "Home WAT") {
 | 
				
			||||||
		<div class="flex flex-col gap-4">
 | 
							<div class="flex flex-col gap-4">
 | 
				
			||||||
			<div class="w-full">
 | 
								<div class="w-full">
 | 
				
			||||||
				@components.DailyReadChart(dailyReadSVG)
 | 
									@DailyReadChart(dailyReadSVG)
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
			<div class="grid grid-cols-2 gap-4 md:grid-cols-4">
 | 
								<div class="grid grid-cols-2 gap-4 md:grid-cols-4">
 | 
				
			||||||
				@components.InfoCardLink("Documents", userMetadata.DocumentCount, "./documents")
 | 
									@InfoCard("Documents", userMetadata.DocumentCount, "./documents")
 | 
				
			||||||
				@components.InfoCardLink("Activity Records", userMetadata.ActivityCount, "./activity")
 | 
									@InfoCard("Activity Records", userMetadata.ActivityCount, "./activity")
 | 
				
			||||||
				@components.InfoCardLink("Progress Records", userMetadata.ProgressCount, "./progress")
 | 
									@InfoCard("Progress Records", userMetadata.ProgressCount, "./progress")
 | 
				
			||||||
				@components.InfoCard("Devices", userMetadata.DeviceCount)
 | 
									@InfoCard("Devices", userMetadata.DeviceCount, "")
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
			<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
 | 
								<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
 | 
				
			||||||
				for _, item := range userStreaks {
 | 
									for _, item := range userStreaks {
 | 
				
			||||||
					@components.StreakCard(item)
 | 
										@StreakCard(item)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
			<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
 | 
								<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
 | 
				
			||||||
				@components.LeaderboardCard("WPM", userStatistics.WPM)
 | 
									@LeaderboardCard("WPM", userStatistics.WPM)
 | 
				
			||||||
				@components.LeaderboardCard("Duration", userStatistics.Duration)
 | 
									@LeaderboardCard("Duration", userStatistics.Duration)
 | 
				
			||||||
				@components.LeaderboardCard("Words", userStatistics.Words)
 | 
									@LeaderboardCard("Words", userStatistics.Words)
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					templ infoCardInner(name string, metric int) {
 | 
				
			||||||
 | 
						<div class="flex gap-4 w-full p-4 bg-white shadow-lg dark:bg-gray-700 rounded">
 | 
				
			||||||
 | 
							<div class="flex flex-col justify-around dark:text-white w-full text-sm">
 | 
				
			||||||
 | 
								<p class="text-2xl font-bold text-black dark:text-white">{ fmt.Sprint(metric) }</p>
 | 
				
			||||||
 | 
								<p class="text-sm text-gray-400">{ name }</p>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					templ InfoCard(name string, metric int, link string) {
 | 
				
			||||||
 | 
						if link != "" {
 | 
				
			||||||
 | 
							<a href={ templ.SafeURL(link) } class="w-full">
 | 
				
			||||||
 | 
								@infoCardInner(name, metric)
 | 
				
			||||||
 | 
							</a>
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							<div class="w-full">
 | 
				
			||||||
 | 
								@infoCardInner(name, metric)
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					templ LeaderboardCard(name string, stats map[string][]UserStatisticEntry) {
 | 
				
			||||||
 | 
						<div class="w-full">
 | 
				
			||||||
 | 
							<div class="flex flex-col justify-between h-full w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded">
 | 
				
			||||||
 | 
								<div>
 | 
				
			||||||
 | 
									<div class="flex justify-between">
 | 
				
			||||||
 | 
										<p class="text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500">
 | 
				
			||||||
 | 
											{ name } Leaderboard
 | 
				
			||||||
 | 
										</p>
 | 
				
			||||||
 | 
										<div class="flex gap-2 text-xs text-gray-400 items-center">
 | 
				
			||||||
 | 
											<label
 | 
				
			||||||
 | 
												for={ fmt.Sprintf("all-%s", name) }
 | 
				
			||||||
 | 
												class="cursor-pointer hover:text-black dark:hover:text-white"
 | 
				
			||||||
 | 
											>all</label>
 | 
				
			||||||
 | 
											<label
 | 
				
			||||||
 | 
												for={ fmt.Sprintf("year-%s", name) }
 | 
				
			||||||
 | 
												class="cursor-pointer hover:text-black dark:hover:text-white"
 | 
				
			||||||
 | 
											>year</label>
 | 
				
			||||||
 | 
											<label
 | 
				
			||||||
 | 
												for={ fmt.Sprintf("month-%s", name) }
 | 
				
			||||||
 | 
												class="cursor-pointer hover:text-black dark:hover:text-white"
 | 
				
			||||||
 | 
											>month</label>
 | 
				
			||||||
 | 
											<label
 | 
				
			||||||
 | 
												for={ fmt.Sprintf("week-%s", name) }
 | 
				
			||||||
 | 
												class="cursor-pointer hover:text-black dark:hover:text-white"
 | 
				
			||||||
 | 
											>week</label>
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
								<input
 | 
				
			||||||
 | 
									type="radio"
 | 
				
			||||||
 | 
									name={ fmt.Sprintf("options-%s", name) }
 | 
				
			||||||
 | 
									id={ fmt.Sprintf("all-%s", name) }
 | 
				
			||||||
 | 
									class="hidden peer/All"
 | 
				
			||||||
 | 
									checked
 | 
				
			||||||
 | 
								/>
 | 
				
			||||||
 | 
								<input
 | 
				
			||||||
 | 
									type="radio"
 | 
				
			||||||
 | 
									name={ fmt.Sprintf("options-%s", name) }
 | 
				
			||||||
 | 
									id={ fmt.Sprintf("year-%s", name) }
 | 
				
			||||||
 | 
									class="hidden peer/Year"
 | 
				
			||||||
 | 
								/>
 | 
				
			||||||
 | 
								<input
 | 
				
			||||||
 | 
									type="radio"
 | 
				
			||||||
 | 
									name={ fmt.Sprintf("options-%s", name) }
 | 
				
			||||||
 | 
									id={ fmt.Sprintf("month-%s", name) }
 | 
				
			||||||
 | 
									class="hidden peer/Month"
 | 
				
			||||||
 | 
								/>
 | 
				
			||||||
 | 
								<input
 | 
				
			||||||
 | 
									type="radio"
 | 
				
			||||||
 | 
									name={ fmt.Sprintf("options-%s", name) }
 | 
				
			||||||
 | 
									id={ fmt.Sprintf("week-%s", name) }
 | 
				
			||||||
 | 
									class="hidden peer/Week"
 | 
				
			||||||
 | 
								/>
 | 
				
			||||||
 | 
								for name, data := range stats {
 | 
				
			||||||
 | 
									<div class={ "flex items-end my-6 space-x-2 hidden", fmt.Sprintf("peer-checked/%s:block", name) }>
 | 
				
			||||||
 | 
										if len(data) == 0 {
 | 
				
			||||||
 | 
											<p class="text-5xl font-bold text-black dark:text-white">N/A</p>
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											<p class="text-5xl font-bold text-black dark:text-white">{ data[0].UserID }</p>
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
									<div class={ "hidden dark:text-white", fmt.Sprintf("peer-checked/%s:block", name) }>
 | 
				
			||||||
 | 
										for idx, item := range data {
 | 
				
			||||||
 | 
											if idx == 0 {
 | 
				
			||||||
 | 
												<div class="flex items-center justify-between pt-2 pb-2 text-sm">
 | 
				
			||||||
 | 
													<div>
 | 
				
			||||||
 | 
														<p>{ item.UserID }</p>
 | 
				
			||||||
 | 
													</div>
 | 
				
			||||||
 | 
													<div class="flex items-end font-bold">{ item.Value }</div>
 | 
				
			||||||
 | 
												</div>
 | 
				
			||||||
 | 
											} else if idx < 3 {
 | 
				
			||||||
 | 
												<div class="flex items-center justify-between pt-2 pb-2 text-sm border-t border-gray-200">
 | 
				
			||||||
 | 
													<div>
 | 
				
			||||||
 | 
														<p>{ item.UserID }</p>
 | 
				
			||||||
 | 
													</div>
 | 
				
			||||||
 | 
													<div class="flex items-end font-bold">{ item.Value }</div>
 | 
				
			||||||
 | 
												</div>
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					templ StreakCard(streak database.UserStreak) {
 | 
				
			||||||
 | 
						<div class="w-full">
 | 
				
			||||||
 | 
							<div class="relative w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded">
 | 
				
			||||||
 | 
								<p class="text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500">
 | 
				
			||||||
 | 
									if streak.Window == "WEEK" {
 | 
				
			||||||
 | 
										Weekly Read Streak
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										Daily Read Streak
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								</p>
 | 
				
			||||||
 | 
								<div class="flex items-end my-6 space-x-2">
 | 
				
			||||||
 | 
									<p class="text-5xl font-bold text-black dark:text-white">
 | 
				
			||||||
 | 
										{ fmt.Sprint(streak.CurrentStreak) }
 | 
				
			||||||
 | 
									</p>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
								<div class="dark:text-white">
 | 
				
			||||||
 | 
									<div class="flex items-center justify-between pb-2 mb-2 text-sm border-b border-gray-200">
 | 
				
			||||||
 | 
										<div>
 | 
				
			||||||
 | 
											<p>
 | 
				
			||||||
 | 
												if streak.Window == "WEEK" {
 | 
				
			||||||
 | 
													Current Read Streak
 | 
				
			||||||
 | 
												} else {
 | 
				
			||||||
 | 
													Current Read Streak
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											</p>
 | 
				
			||||||
 | 
											<div class="flex items-end text-sm text-gray-400">
 | 
				
			||||||
 | 
												{ streak.CurrentStreakStartDate } ➞ { streak.CurrentStreakEndDate }
 | 
				
			||||||
 | 
											</div>
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
										<div class="flex items-end font-bold">{ fmt.Sprint(streak.CurrentStreak) }</div>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
									<div class="flex items-center justify-between pb-2 mb-2 text-sm">
 | 
				
			||||||
 | 
										<div>
 | 
				
			||||||
 | 
											<p>
 | 
				
			||||||
 | 
												if streak.Window == "WEEK" {
 | 
				
			||||||
 | 
													Best Weekly Streak
 | 
				
			||||||
 | 
												} else {
 | 
				
			||||||
 | 
													Best Daily Streak
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											</p>
 | 
				
			||||||
 | 
											<div class="flex items-end text-sm text-gray-400">
 | 
				
			||||||
 | 
												{ streak.MaxStreakStartDate } ➞ { streak.MaxStreakEndDate }
 | 
				
			||||||
 | 
											</div>
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
										<div class="flex items-end font-bold">{ fmt.Sprint(streak.MaxStreak) }</div>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					templ DailyReadChart(dailyReadSVG graph.SVGGraphData) {
 | 
				
			||||||
 | 
						<div class="relative w-full bg-white shadow-lg dark:bg-gray-700 rounded">
 | 
				
			||||||
 | 
							<p class="absolute top-3 left-5 text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500">
 | 
				
			||||||
 | 
								Daily Read Totals
 | 
				
			||||||
 | 
							</p>
 | 
				
			||||||
 | 
							<div class="relative">
 | 
				
			||||||
 | 
								<svg viewBox={ fmt.Sprintf("26 0 755 %d", dailyReadSVG.Height) } preserveAspectRatio="none" width="100%" height="6em">
 | 
				
			||||||
 | 
									<!-- Bezier Line Graph -->
 | 
				
			||||||
 | 
									<path
 | 
				
			||||||
 | 
										fill="#316BBE"
 | 
				
			||||||
 | 
										fill-opacity="0.5"
 | 
				
			||||||
 | 
										stroke="none"
 | 
				
			||||||
 | 
										d={ fmt.Sprintf("%s %s", dailyReadSVG.BezierPath, dailyReadSVG.BezierFill) }
 | 
				
			||||||
 | 
									></path>
 | 
				
			||||||
 | 
									<path fill="none" stroke="#316BBE" d={ dailyReadSVG.BezierPath }></path>
 | 
				
			||||||
 | 
								</svg>
 | 
				
			||||||
 | 
								<div
 | 
				
			||||||
 | 
									class="flex absolute w-full h-full top-0"
 | 
				
			||||||
 | 
									style="width: calc(100%*31/30); transform: translateX(-50%); left: 50%"
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
									<!-- Required for iOS "Hover" Events (onclick) -->
 | 
				
			||||||
 | 
									for _, item := range dailyReadSVG.LinePoints {
 | 
				
			||||||
 | 
										<div
 | 
				
			||||||
 | 
											onclick
 | 
				
			||||||
 | 
											class="opacity-0 hover:opacity-100 w-full"
 | 
				
			||||||
 | 
											style="background: linear-gradient(rgba(128, 128, 128, 0.5), rgba(128, 128, 128, 0.5)) no-repeat center/2px 100%"
 | 
				
			||||||
 | 
										>
 | 
				
			||||||
 | 
											<div
 | 
				
			||||||
 | 
												class="flex flex-col items-center p-2 rounded absolute top-3 dark:text-white text-xs pointer-events-none"
 | 
				
			||||||
 | 
												style="transform: translateX(-50%); background-color: rgba(128, 128, 128, 0.2); left: 50%"
 | 
				
			||||||
 | 
											>
 | 
				
			||||||
 | 
												<span>{ item.Data.Label }</span>
 | 
				
			||||||
 | 
												<span>{ fmt.Sprint(item.Data.Value) } minutes</span>
 | 
				
			||||||
 | 
											</div>
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -11,18 +11,36 @@ import "io"
 | 
				
			|||||||
import "bytes"
 | 
					import "bytes"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"reichard.io/antholume/database"
 | 
						"reichard.io/antholume/database"
 | 
				
			||||||
	"reichard.io/antholume/graph"
 | 
						"reichard.io/antholume/graph"
 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/common"
 | 
						"reichard.io/antholume/ngtemplates/common"
 | 
				
			||||||
	"reichard.io/antholume/ngtemplates/components"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserMetadata struct {
 | 
				
			||||||
 | 
						DocumentCount int
 | 
				
			||||||
 | 
						ActivityCount int
 | 
				
			||||||
 | 
						ProgressCount int
 | 
				
			||||||
 | 
						DeviceCount   int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserStatistics struct {
 | 
				
			||||||
 | 
						WPM      map[string][]UserStatisticEntry
 | 
				
			||||||
 | 
						Duration map[string][]UserStatisticEntry
 | 
				
			||||||
 | 
						Words    map[string][]UserStatisticEntry
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserStatisticEntry struct {
 | 
				
			||||||
 | 
						UserID string
 | 
				
			||||||
 | 
						Value  string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Home(
 | 
					func Home(
 | 
				
			||||||
	settings common.Settings,
 | 
						settings common.Settings,
 | 
				
			||||||
	dailyReadSVG graph.SVGGraphData,
 | 
						dailyReadSVG graph.SVGGraphData,
 | 
				
			||||||
	userStreaks []database.UserStreak,
 | 
						userStreaks []database.UserStreak,
 | 
				
			||||||
	userStatistics common.UserStatistics,
 | 
						userStatistics UserStatistics,
 | 
				
			||||||
	userMetadata common.UserMetadata,
 | 
						userMetadata UserMetadata,
 | 
				
			||||||
) templ.Component {
 | 
					) templ.Component {
 | 
				
			||||||
	return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
						return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
				
			||||||
		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
							templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
				
			||||||
@ -46,7 +64,7 @@ func Home(
 | 
				
			|||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			templ_7745c5c3_Err = components.DailyReadChart(dailyReadSVG).Render(ctx, templ_7745c5c3_Buffer)
 | 
								templ_7745c5c3_Err = DailyReadChart(dailyReadSVG).Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -54,19 +72,19 @@ func Home(
 | 
				
			|||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			templ_7745c5c3_Err = components.InfoCardLink("Documents", userMetadata.DocumentCount, "./documents").Render(ctx, templ_7745c5c3_Buffer)
 | 
								templ_7745c5c3_Err = InfoCard("Documents", userMetadata.DocumentCount, "./documents").Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			templ_7745c5c3_Err = components.InfoCardLink("Activity Records", userMetadata.ActivityCount, "./activity").Render(ctx, templ_7745c5c3_Buffer)
 | 
								templ_7745c5c3_Err = InfoCard("Activity Records", userMetadata.ActivityCount, "./activity").Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			templ_7745c5c3_Err = components.InfoCardLink("Progress Records", userMetadata.ProgressCount, "./progress").Render(ctx, templ_7745c5c3_Buffer)
 | 
								templ_7745c5c3_Err = InfoCard("Progress Records", userMetadata.ProgressCount, "./progress").Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			templ_7745c5c3_Err = components.InfoCard("Devices", userMetadata.DeviceCount).Render(ctx, templ_7745c5c3_Buffer)
 | 
								templ_7745c5c3_Err = InfoCard("Devices", userMetadata.DeviceCount, "").Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -75,7 +93,7 @@ func Home(
 | 
				
			|||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			for _, item := range userStreaks {
 | 
								for _, item := range userStreaks {
 | 
				
			||||||
				templ_7745c5c3_Err = components.StreakCard(item).Render(ctx, templ_7745c5c3_Buffer)
 | 
									templ_7745c5c3_Err = StreakCard(item).Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
					return templ_7745c5c3_Err
 | 
										return templ_7745c5c3_Err
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@ -84,15 +102,15 @@ func Home(
 | 
				
			|||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			templ_7745c5c3_Err = components.LeaderboardCard("WPM", userStatistics.WPM).Render(ctx, templ_7745c5c3_Buffer)
 | 
								templ_7745c5c3_Err = LeaderboardCard("WPM", userStatistics.WPM).Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			templ_7745c5c3_Err = components.LeaderboardCard("Duration", userStatistics.Duration).Render(ctx, templ_7745c5c3_Buffer)
 | 
								templ_7745c5c3_Err = LeaderboardCard("Duration", userStatistics.Duration).Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			templ_7745c5c3_Err = components.LeaderboardCard("Words", userStatistics.Words).Render(ctx, templ_7745c5c3_Buffer)
 | 
								templ_7745c5c3_Err = LeaderboardCard("Words", userStatistics.Words).Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ_7745c5c3_Err
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -105,7 +123,712 @@ func Home(
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		templ_7745c5c3_Err = layout(settings, "Home").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
 | 
							templ_7745c5c3_Err = layout(settings, "Home WAT").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !templ_7745c5c3_IsBuffer {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return templ_7745c5c3_Err
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func infoCardInner(name string, metric int) templ.Component {
 | 
				
			||||||
 | 
						return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
				
			||||||
 | 
							templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
				
			||||||
 | 
							if !templ_7745c5c3_IsBuffer {
 | 
				
			||||||
 | 
								templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
				
			||||||
 | 
								defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx = templ.InitializeContext(ctx)
 | 
				
			||||||
 | 
							templ_7745c5c3_Var3 := templ.GetChildren(ctx)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Var3 == nil {
 | 
				
			||||||
 | 
								templ_7745c5c3_Var3 = templ.NopComponent
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx = templ.ClearChildren(ctx)
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex gap-4 w-full p-4 bg-white shadow-lg dark:bg-gray-700 rounded\"><div class=\"flex flex-col justify-around dark:text-white w-full text-sm\"><p class=\"text-2xl font-bold text-black dark:text-white\">")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var4 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprint(metric))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 63, Col: 80}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p><p class=\"text-sm text-gray-400\">")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var5 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(name)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 64, Col: 42}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div></div>")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !templ_7745c5c3_IsBuffer {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return templ_7745c5c3_Err
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func InfoCard(name string, metric int, link string) templ.Component {
 | 
				
			||||||
 | 
						return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
				
			||||||
 | 
							templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
				
			||||||
 | 
							if !templ_7745c5c3_IsBuffer {
 | 
				
			||||||
 | 
								templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
				
			||||||
 | 
								defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx = templ.InitializeContext(ctx)
 | 
				
			||||||
 | 
							templ_7745c5c3_Var6 := templ.GetChildren(ctx)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Var6 == nil {
 | 
				
			||||||
 | 
								templ_7745c5c3_Var6 = templ.NopComponent
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx = templ.ClearChildren(ctx)
 | 
				
			||||||
 | 
							if link != "" {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<a href=\"")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								var templ_7745c5c3_Var7 templ.SafeURL = templ.SafeURL(link)
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var7)))
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"w-full\">")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								templ_7745c5c3_Err = infoCardInner(name, metric).Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</a>")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"w-full\">")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								templ_7745c5c3_Err = infoCardInner(name, metric).Render(ctx, templ_7745c5c3_Buffer)
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div>")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !templ_7745c5c3_IsBuffer {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return templ_7745c5c3_Err
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func LeaderboardCard(name string, stats map[string][]UserStatisticEntry) templ.Component {
 | 
				
			||||||
 | 
						return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
				
			||||||
 | 
							templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
				
			||||||
 | 
							if !templ_7745c5c3_IsBuffer {
 | 
				
			||||||
 | 
								templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
				
			||||||
 | 
								defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx = templ.InitializeContext(ctx)
 | 
				
			||||||
 | 
							templ_7745c5c3_Var8 := templ.GetChildren(ctx)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Var8 == nil {
 | 
				
			||||||
 | 
								templ_7745c5c3_Var8 = templ.NopComponent
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx = templ.ClearChildren(ctx)
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"w-full\"><div class=\"flex flex-col justify-between h-full w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded\"><div><div class=\"flex justify-between\"><p class=\"text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500\">")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var9 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(name)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 87, Col: 12}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" Leaderboard</p><div class=\"flex gap-2 text-xs text-gray-400 items-center\"><label for=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var10 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("all-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 91, Col: 40}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"cursor-pointer hover:text-black dark:hover:text-white\">all</label> <label for=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var11 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("year-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 95, Col: 41}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"cursor-pointer hover:text-black dark:hover:text-white\">year</label> <label for=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var12 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("month-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 99, Col: 42}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"cursor-pointer hover:text-black dark:hover:text-white\">month</label> <label for=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var13 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("week-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 103, Col: 41}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"cursor-pointer hover:text-black dark:hover:text-white\">week</label></div></div></div><input type=\"radio\" name=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var14 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("options-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 111, Col: 42}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var15 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("all-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 112, Col: 36}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"hidden peer/All\" checked> <input type=\"radio\" name=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var16 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("options-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 118, Col: 42}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var17 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("year-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 119, Col: 37}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"hidden peer/Year\"> <input type=\"radio\" name=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var18 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("options-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 124, Col: 42}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var19 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("month-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 125, Col: 38}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"hidden peer/Month\"> <input type=\"radio\" name=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var20 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("options-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 130, Col: 42}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var21 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("week-%s", name))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 131, Col: 37}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" class=\"hidden peer/Week\"> ")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for name, data := range stats {
 | 
				
			||||||
 | 
								var templ_7745c5c3_Var22 = []any{"flex items-end my-6 space-x-2 hidden", fmt.Sprintf("peer-checked/%s:block", name)}
 | 
				
			||||||
 | 
								templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var22...)
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								var templ_7745c5c3_Var23 string
 | 
				
			||||||
 | 
								templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var22).String())
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 1, Col: 0}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\">")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if len(data) == 0 {
 | 
				
			||||||
 | 
									_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<p class=\"text-5xl font-bold text-black dark:text-white\">N/A</p>")
 | 
				
			||||||
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
										return templ_7745c5c3_Err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<p class=\"text-5xl font-bold text-black dark:text-white\">")
 | 
				
			||||||
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
										return templ_7745c5c3_Err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									var templ_7745c5c3_Var24 string
 | 
				
			||||||
 | 
									templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(data[0].UserID)
 | 
				
			||||||
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
										return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 139, Col: 79}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
 | 
				
			||||||
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
										return templ_7745c5c3_Err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p>")
 | 
				
			||||||
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
										return templ_7745c5c3_Err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div>")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								var templ_7745c5c3_Var25 = []any{"hidden dark:text-white", fmt.Sprintf("peer-checked/%s:block", name)}
 | 
				
			||||||
 | 
								templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var25...)
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								var templ_7745c5c3_Var26 string
 | 
				
			||||||
 | 
								templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var25).String())
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 1, Col: 0}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\">")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								for idx, item := range data {
 | 
				
			||||||
 | 
									if idx == 0 {
 | 
				
			||||||
 | 
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex items-center justify-between pt-2 pb-2 text-sm\"><div><p>")
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ_7745c5c3_Err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										var templ_7745c5c3_Var27 string
 | 
				
			||||||
 | 
										templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(item.UserID)
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 147, Col: 25}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ_7745c5c3_Err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div><div class=\"flex items-end font-bold\">")
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ_7745c5c3_Err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										var templ_7745c5c3_Var28 string
 | 
				
			||||||
 | 
										templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(item.Value)
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 149, Col: 58}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ_7745c5c3_Err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div>")
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ_7745c5c3_Err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else if idx < 3 {
 | 
				
			||||||
 | 
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex items-center justify-between pt-2 pb-2 text-sm border-t border-gray-200\"><div><p>")
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ_7745c5c3_Err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										var templ_7745c5c3_Var29 string
 | 
				
			||||||
 | 
										templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(item.UserID)
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 154, Col: 25}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ_7745c5c3_Err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div><div class=\"flex items-end font-bold\">")
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ_7745c5c3_Err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										var templ_7745c5c3_Var30 string
 | 
				
			||||||
 | 
										templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(item.Value)
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 156, Col: 58}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ_7745c5c3_Err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div>")
 | 
				
			||||||
 | 
										if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
											return templ_7745c5c3_Err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div>")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div>")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !templ_7745c5c3_IsBuffer {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return templ_7745c5c3_Err
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func StreakCard(streak database.UserStreak) templ.Component {
 | 
				
			||||||
 | 
						return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
				
			||||||
 | 
							templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
				
			||||||
 | 
							if !templ_7745c5c3_IsBuffer {
 | 
				
			||||||
 | 
								templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
				
			||||||
 | 
								defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx = templ.InitializeContext(ctx)
 | 
				
			||||||
 | 
							templ_7745c5c3_Var31 := templ.GetChildren(ctx)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Var31 == nil {
 | 
				
			||||||
 | 
								templ_7745c5c3_Var31 = templ.NopComponent
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx = templ.ClearChildren(ctx)
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"w-full\"><div class=\"relative w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded\"><p class=\"text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500\">")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if streak.Window == "WEEK" {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Weekly Read Streak")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Daily Read Streak")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p><div class=\"flex items-end my-6 space-x-2\"><p class=\"text-5xl font-bold text-black dark:text-white\">")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var32 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprint(streak.CurrentStreak))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 178, Col: 39}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p></div><div class=\"dark:text-white\"><div class=\"flex items-center justify-between pb-2 mb-2 text-sm border-b border-gray-200\"><div><p>")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if streak.Window == "WEEK" {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Current Read Streak")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Current Read Streak")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p><div class=\"flex items-end text-sm text-gray-400\">")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var33 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(streak.CurrentStreakStartDate)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 192, Col: 38}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ➞ ")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var34 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(streak.CurrentStreakEndDate)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 192, Col: 74}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div><div class=\"flex items-end font-bold\">")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var35 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprint(streak.CurrentStreak))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 195, Col: 77}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div><div class=\"flex items-center justify-between pb-2 mb-2 text-sm\"><div><p>")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if streak.Window == "WEEK" {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Best Weekly Streak")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Best Daily Streak")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p><div class=\"flex items-end text-sm text-gray-400\">")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var36 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(streak.MaxStreakStartDate)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 207, Col: 34}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ➞ ")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var37 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(streak.MaxStreakEndDate)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 207, Col: 66}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div><div class=\"flex items-end font-bold\">")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var38 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprint(streak.MaxStreak))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 210, Col: 73}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div></div></div></div>")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !templ_7745c5c3_IsBuffer {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return templ_7745c5c3_Err
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func DailyReadChart(dailyReadSVG graph.SVGGraphData) templ.Component {
 | 
				
			||||||
 | 
						return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) {
 | 
				
			||||||
 | 
							templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer)
 | 
				
			||||||
 | 
							if !templ_7745c5c3_IsBuffer {
 | 
				
			||||||
 | 
								templ_7745c5c3_Buffer = templ.GetBuffer()
 | 
				
			||||||
 | 
								defer templ.ReleaseBuffer(templ_7745c5c3_Buffer)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx = templ.InitializeContext(ctx)
 | 
				
			||||||
 | 
							templ_7745c5c3_Var39 := templ.GetChildren(ctx)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Var39 == nil {
 | 
				
			||||||
 | 
								templ_7745c5c3_Var39 = templ.NopComponent
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx = templ.ClearChildren(ctx)
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"relative w-full bg-white shadow-lg dark:bg-gray-700 rounded\"><p class=\"absolute top-3 left-5 text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500\">Daily Read Totals</p><div class=\"relative\"><svg viewBox=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var40 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("26 0 755 %d", dailyReadSVG.Height))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 223, Col: 65}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" preserveAspectRatio=\"none\" width=\"100%\" height=\"6em\"><!-- Bezier Line Graph --><path fill=\"#316BBE\" fill-opacity=\"0.5\" stroke=\"none\" d=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var41 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s %s", dailyReadSVG.BezierPath, dailyReadSVG.BezierFill))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 229, Col: 79}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"></path> <path fill=\"none\" stroke=\"#316BBE\" d=\"")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var templ_7745c5c3_Var42 string
 | 
				
			||||||
 | 
							templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(dailyReadSVG.BezierPath)
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 231, Col: 66}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"></path></svg><div class=\"flex absolute w-full h-full top-0\" style=\"width: calc(100%*31/30); transform: translateX(-50%); left: 50%\"><!-- Required for iOS \"Hover\" Events (onclick) -->")
 | 
				
			||||||
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for _, item := range dailyReadSVG.LinePoints {
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div onclick class=\"opacity-0 hover:opacity-100 w-full\" style=\"background: linear-gradient(rgba(128, 128, 128, 0.5), rgba(128, 128, 128, 0.5)) no-repeat center/2px 100%\"><div class=\"flex flex-col items-center p-2 rounded absolute top-3 dark:text-white text-xs pointer-events-none\" style=\"transform: translateX(-50%); background-color: rgba(128, 128, 128, 0.2); left: 50%\"><span>")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								var templ_7745c5c3_Var43 string
 | 
				
			||||||
 | 
								templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(item.Data.Label)
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 248, Col: 30}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</span> <span>")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								var templ_7745c5c3_Var44 string
 | 
				
			||||||
 | 
								templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprint(item.Data.Value))
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ.Error{Err: templ_7745c5c3_Err, FileName: `home.templ`, Line: 249, Col: 42}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" minutes</span></div></div>")
 | 
				
			||||||
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
									return templ_7745c5c3_Err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div></div>")
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ_7745c5c3_Err
 | 
								return templ_7745c5c3_Err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -54,7 +54,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var3 string
 | 
							var templ_7745c5c3_Var3 string
 | 
				
			||||||
		templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var2).String())
 | 
							templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var2).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -84,7 +84,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var5 string
 | 
							var templ_7745c5c3_Var5 string
 | 
				
			||||||
		templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var4).String())
 | 
							templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var4).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -114,7 +114,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var7 string
 | 
							var templ_7745c5c3_Var7 string
 | 
				
			||||||
		templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var6).String())
 | 
							templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var6).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -144,7 +144,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var9 string
 | 
							var templ_7745c5c3_Var9 string
 | 
				
			||||||
		templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var8).String())
 | 
							templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var8).String())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -175,7 +175,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
			var templ_7745c5c3_Var11 string
 | 
								var templ_7745c5c3_Var11 string
 | 
				
			||||||
			templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var10).String())
 | 
								templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var10).String())
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
									return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -211,7 +211,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
			var templ_7745c5c3_Var13 string
 | 
								var templ_7745c5c3_Var13 string
 | 
				
			||||||
			templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var12).String())
 | 
								templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var12).String())
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
									return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -236,7 +236,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
			var templ_7745c5c3_Var15 string
 | 
								var templ_7745c5c3_Var15 string
 | 
				
			||||||
			templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var14).String())
 | 
								templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var14).String())
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
				return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
									return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
 | 
								_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
 | 
				
			||||||
			if templ_7745c5c3_Err != nil {
 | 
								if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -270,7 +270,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
				var templ_7745c5c3_Var17 string
 | 
									var templ_7745c5c3_Var17 string
 | 
				
			||||||
				templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var16).String())
 | 
									templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var16).String())
 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
					return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
										return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
 | 
									_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -295,7 +295,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
				var templ_7745c5c3_Var19 string
 | 
									var templ_7745c5c3_Var19 string
 | 
				
			||||||
				templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var18).String())
 | 
									templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var18).String())
 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
					return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
										return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
 | 
									_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -320,7 +320,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
				var templ_7745c5c3_Var21 string
 | 
									var templ_7745c5c3_Var21 string
 | 
				
			||||||
				templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var20).String())
 | 
									templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var20).String())
 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
					return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
										return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
 | 
									_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -345,7 +345,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
				var templ_7745c5c3_Var23 string
 | 
									var templ_7745c5c3_Var23 string
 | 
				
			||||||
				templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var22).String())
 | 
									templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var22).String())
 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
					return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 1, Col: 0}
 | 
										return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 1, Col: 0}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
 | 
									_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
 | 
				
			||||||
				if templ_7745c5c3_Err != nil {
 | 
									if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -376,7 +376,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var24 string
 | 
							var templ_7745c5c3_Var24 string
 | 
				
			||||||
		templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(settings.Version)
 | 
							templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(settings.Version)
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 135, Col: 45}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 135, Col: 45}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -389,7 +389,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var25 string
 | 
							var templ_7745c5c3_Var25 string
 | 
				
			||||||
		templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(settings.Route.Name())
 | 
							templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(settings.Route.Name())
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 140, Col: 26}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 140, Col: 26}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -410,7 +410,7 @@ func navigation(settings common.Settings) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var26 string
 | 
							var templ_7745c5c3_Var26 string
 | 
				
			||||||
		templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(settings.User)
 | 
							templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(settings.User)
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 194, Col: 26}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 194, Col: 26}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
@ -455,7 +455,7 @@ func layout(settings common.Settings, title string) templ.Component {
 | 
				
			|||||||
		var templ_7745c5c3_Var28 string
 | 
							var templ_7745c5c3_Var28 string
 | 
				
			||||||
		templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(title)
 | 
							templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(title)
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/layout.templ`, Line: 227, Col: 29}
 | 
								return templ.Error{Err: templ_7745c5c3_Err, FileName: `layout.templ`, Line: 227, Col: 29}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
 | 
							_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
 | 
				
			||||||
		if templ_7745c5c3_Err != nil {
 | 
							if templ_7745c5c3_Err != nil {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user