7a339e4c51e414ae09b6aee1cb93b43fcbb45752

Author
TheEdgeOfRage <git@theedgeofrage.com>
Committer
TheEdgeOfRage <git@theedgeofrage.com>
Date

Message

Install templ as go tool

Diff

This diff is truncated to protect this page.

  1diff --git a/Makefile b/Makefile
  2index 7897d3525f103f895b4ecf332b1a01b72e425e1c..9a987c3b22333708877dbfc5ee7f789382ec664f 100644
  3--- a/Makefile
  4+++ b/Makefile
  5@@ -12,8 +12,6 @@ bin/migrate: bin
  6 	GOBIN=$(PWD)/bin go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@v4.19.1
  7 bin/air: bin
  8 	GOBIN=$(PWD)/bin go install github.com/air-verse/air@v1.65.1
  9-bin/templ: bin
 10-	GOBIN=$(PWD)/bin go install github.com/a-h/templ/cmd/templ@v0.3.1001
 11 bin/govulncheck: bin
 12 	GOBIN=$(PWD)/bin go install golang.org/x/vuln/cmd/govulncheck@v1.2.0
 13 
 14@@ -37,8 +35,8 @@ test:
 15 air: bin/air
 16 	@./bin/air -c .air.toml
 17 
 18-templ: bin/templ
 19-	bin/templ generate
 20+templ:
 21+	go tool templ generate
 22 
 23 build: templ
 24 	go build -o dist/ytrssil ./cmd/main.go
 25diff --git a/go.mod b/go.mod
 26index 6a0c24f911bb4ecd70031416f668ba16193c8897..47754b99002db5cf7ac18b755d27e089dacb67e4 100644
 27--- a/go.mod
 28+++ b/go.mod
 29@@ -17,12 +17,17 @@ require (
 30 
 31 require (
 32 	github.com/CAFxX/httpcompression v0.0.9 // indirect
 33+	github.com/a-h/parse v0.0.0-20250122154542-74294addb73e // indirect
 34 	github.com/andybalholm/brotli v1.2.0 // indirect
 35 	github.com/bytedance/gopkg v0.1.3 // indirect
 36 	github.com/bytedance/sonic v1.15.0 // indirect
 37 	github.com/bytedance/sonic/loader v0.5.0 // indirect
 38+	github.com/cenkalti/backoff/v4 v4.3.0 // indirect
 39+	github.com/cli/browser v1.3.0 // indirect
 40 	github.com/cloudwego/base64x v0.1.6 // indirect
 41 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 42+	github.com/fatih/color v1.16.0 // indirect
 43+	github.com/fsnotify/fsnotify v1.7.0 // indirect
 44 	github.com/gabriel-vasile/mimetype v1.4.12 // indirect
 45 	github.com/gin-contrib/sse v1.1.0 // indirect
 46 	github.com/go-playground/locales v0.14.1 // indirect
 47@@ -38,9 +43,11 @@ require (
 48 	github.com/klauspost/cpuid/v2 v2.3.0 // indirect
 49 	github.com/leodido/go-urn v1.4.0 // indirect
 50 	github.com/lib/pq v1.10.9 // indirect
 51+	github.com/mattn/go-colorable v0.1.13 // indirect
 52 	github.com/mattn/go-isatty v0.0.20 // indirect
 53 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 54 	github.com/modern-go/reflect2 v1.0.2 // indirect
 55+	github.com/natefinch/atomic v1.0.1 // indirect
 56 	github.com/pelletier/go-toml/v2 v2.2.4 // indirect
 57 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 58 	github.com/quic-go/qpack v0.6.0 // indirect
 59@@ -52,10 +59,14 @@ require (
 60 	go.mongodb.org/mongo-driver/v2 v2.5.0 // indirect
 61 	golang.org/x/arch v0.22.0 // indirect
 62 	golang.org/x/crypto v0.48.0 // indirect
 63+	golang.org/x/mod v0.32.0 // indirect
 64 	golang.org/x/net v0.51.0 // indirect
 65 	golang.org/x/sync v0.19.0 // indirect
 66 	golang.org/x/sys v0.41.0 // indirect
 67 	golang.org/x/text v0.34.0 // indirect
 68+	golang.org/x/tools v0.41.0 // indirect
 69 	google.golang.org/protobuf v1.36.10 // indirect
 70 	gopkg.in/yaml.v3 v3.0.1 // indirect
 71 )
 72+
 73+tool github.com/a-h/templ/cmd/templ
 74diff --git a/go.sum b/go.sum
 75index c32e71ef49710f9b060145c3df291b5ff93e26cb..edf6d20fbb1c4f7367b84f4093f843eaa055aa32 100644
 76--- a/go.sum
 77+++ b/go.sum
 78@@ -4,6 +4,8 @@ github.com/CAFxX/httpcompression v0.0.9 h1:0ue2X8dOLEpxTm8tt+OdHcgA+gbDge0OqFQWG
 79 github.com/CAFxX/httpcompression v0.0.9/go.mod h1:XX8oPZA+4IDcfZ0A71Hz0mZsv/YJOgYygkFhizVPilM=
 80 github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
 81 github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
 82+github.com/a-h/parse v0.0.0-20250122154542-74294addb73e h1:HjVbSQHy+dnlS6C3XajZ69NYAb5jbGNfHanvm1+iYlo=
 83+github.com/a-h/parse v0.0.0-20250122154542-74294addb73e/go.mod h1:3mnrkvGpurZ4ZrTDbYU84xhwXW2TjTKShSwjRi2ihfQ=
 84 github.com/a-h/templ v0.3.1020 h1:ypAT/L5ySWEnZ6Zft/5yfoWXYYkhFNvEFOeeqecg4tw=
 85 github.com/a-h/templ v0.3.1020/go.mod h1:A2DlK61v+K+NRoGnhmYbNYVmtYHcFO5/AisMvBdDxTM=
 86 github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
 87@@ -15,6 +17,10 @@ github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uS
 88 github.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k=
 89 github.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE=
 90 github.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo=
 91+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
 92+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 93+github.com/cli/browser v1.3.0 h1:LejqCrpWr+1pRqmEPDGnTZOjsMe7sehifLynZJuqJpo=
 94+github.com/cli/browser v1.3.0/go.mod h1:HH8s+fOAxjhQoBUAsKuPCbqUuxZDhQ2/aD+SzsEfBTk=
 95 github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
 96 github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
 97 github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
 98@@ -37,8 +43,12 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4
 99 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
100 github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
101 github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
102+github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
103+github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
104 github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
105 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
106+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
107+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
108 github.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw=
109 github.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
110 github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
111@@ -96,6 +106,9 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
112 github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
113 github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
114 github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
115+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
116+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
117+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
118 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
119 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
120 github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
121@@ -109,6 +122,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
122 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
123 github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
124 github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
125+github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A=
126+github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM=
127 github.com/oklog/ulid/v2 v2.1.1 h1:suPZ4ARWLOJLegGFiZZ1dFAkqzhMjL3J1TzI+5wHz8s=
128 github.com/oklog/ulid/v2 v2.1.1/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
129 github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
130@@ -176,15 +191,20 @@ golang.org/x/arch v0.22.0 h1:c/Zle32i5ttqRXjdLyyHZESLD/bB90DCU1g9l/0YBDI=
131 golang.org/x/arch v0.22.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=
132 golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
133 golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
134+golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
135+golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
136 golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=
137 golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=
138 golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
139 golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
140+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
141 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
142 golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
143 golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
144 golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
145 golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
146+golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
147+golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
148 google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
149 google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
150 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
151diff --git a/pages/add_video_modal_templ.go b/pages/add_video_modal_templ.go
152index 12cc8a0f10dce1bb4f9282d1b2d5332ea5b54b00..f4447d3cb9af9f3cb6dafc09eb7e66ba98c54960 100644
153--- a/pages/add_video_modal_templ.go
154+++ b/pages/add_video_modal_templ.go
155@@ -1,6 +1,6 @@
156 // Code generated by templ - DO NOT EDIT.
157 
158-// templ: version: v0.3.1001
159+// templ: version: v0.3.1020
160 
161 package pages
162 
163diff --git a/pages/auth_templ.go b/pages/auth_templ.go
164index d6a0b95605bd02f32287882f33ab75b6cfb805bf..5276033f6f414da7b6c2676ae76dbaca46961bdf 100644
165--- a/pages/auth_templ.go
166+++ b/pages/auth_templ.go
167@@ -1,6 +1,6 @@
168 // Code generated by templ - DO NOT EDIT.
169 
170-// templ: version: v0.3.1001
171+// templ: version: v0.3.1020
172 package pages
173 
174 //lint:file-ignore SA4006 This context is only used if a nested component is present.
175diff --git a/pages/channels_templ.go b/pages/channels_templ.go
176index 669da7c83ff798f20f9b8121b3396c3b103e46af..4f3f6357eb735ccd4d2905b2470693b2b50116c0 100644
177--- a/pages/channels_templ.go
178+++ b/pages/channels_templ.go
179@@ -1,6 +1,6 @@
180 // Code generated by templ - DO NOT EDIT.
181 
182-// templ: version: v0.3.1001
183+// templ: version: v0.3.1020
184 package pages
185 
186 //lint:file-ignore SA4006 This context is only used if a nested component is present.
187@@ -40,11 +40,11 @@ func unsubscribeModal(channelID string) templ.Component {
188 			return templ_7745c5c3_Err
189 		}
190 		var templ_7745c5c3_Var2 string
191-		templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("unsubscribe-modal-%s", channelID))
192+		templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("unsubscribe-modal-%s", channelID))
193 		if templ_7745c5c3_Err != nil {
194 			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/channels.templ`, Line: 10, Col: 76}
195 		}
196-		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
197+		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var2)
198 		if templ_7745c5c3_Err != nil {
199 			return templ_7745c5c3_Err
200 		}
201@@ -53,11 +53,11 @@ func unsubscribeModal(channelID string) templ.Component {
202 			return templ_7745c5c3_Err
203 		}
204 		var templ_7745c5c3_Var3 string
205-		templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("@post('/channels/%s/unsubscribe')", channelID))
206+		templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("@post('/channels/%s/unsubscribe')", channelID))
207 		if templ_7745c5c3_Err != nil {
208 			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/channels.templ`, Line: 26, Col: 81}
209 		}
210-		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
211+		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var3)
212 		if templ_7745c5c3_Err != nil {
213 			return templ_7745c5c3_Err
214 		}
215@@ -100,11 +100,11 @@ func shortsToggle(channel models.Channel) templ.Component {
216 			return templ_7745c5c3_Err
217 		}
218 		var templ_7745c5c3_Var6 string
219-		templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(templ.CSSClasses(templ_7745c5c3_Var5).String())
220+		templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var5).String())
221 		if templ_7745c5c3_Err != nil {
222 			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/channels.templ`, Line: 1, Col: 0}
223 		}
224-		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
225+		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var6)
226 		if templ_7745c5c3_Err != nil {
227 			return templ_7745c5c3_Err
228 		}
229@@ -113,11 +113,11 @@ func shortsToggle(channel models.Channel) templ.Component {
230 			return templ_7745c5c3_Err
231 		}
232 		var templ_7745c5c3_Var7 string
233-		templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("$enable = %t; @post('/channels/%s/toggle-shorts')", !channel.EnableShorts, channel.ID))
234+		templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("$enable = %t; @post('/channels/%s/toggle-shorts')", !channel.EnableShorts, channel.ID))
235 		if templ_7745c5c3_Err != nil {
236 			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/channels.templ`, Line: 40, Col: 117}
237 		}
238-		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
239+		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var7)
240 		if templ_7745c5c3_Err != nil {
241 			return templ_7745c5c3_Err
242 		}
243@@ -126,11 +126,11 @@ func shortsToggle(channel models.Channel) templ.Component {
244 			return templ_7745c5c3_Err
245 		}
246 		var templ_7745c5c3_Var8 string
247-		templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(toggleLabel(channel.EnableShorts))
248+		templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.ResolveAttributeValue(toggleLabel(channel.EnableShorts))
249 		if templ_7745c5c3_Err != nil {
250 			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/channels.templ`, Line: 41, Col: 43}
251 		}
252-		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
253+		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var8)
254 		if templ_7745c5c3_Err != nil {
255 			return templ_7745c5c3_Err
256 		}
257@@ -182,11 +182,11 @@ func ChannelCard(channel models.Channel) templ.Component {
258 			return templ_7745c5c3_Err
259 		}
260 		var templ_7745c5c3_Var10 string
261-		templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("channel-card-%s", channel.ID))
262+		templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("channel-card-%s", channel.ID))
263 		if templ_7745c5c3_Err != nil {
264 			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/channels.templ`, Line: 69, Col: 53}
265 		}
266-		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
267+		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var10)
268 		if templ_7745c5c3_Err != nil {
269 			return templ_7745c5c3_Err
270 		}
271@@ -208,11 +208,11 @@ func ChannelCard(channel models.Channel) templ.Component {
272 				return templ_7745c5c3_Err
273 			}
274 			var templ_7745c5c3_Var11 string
275-			templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(channel.ImageURL)
276+			templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.ResolveAttributeValue(channel.ImageURL)
277 			if templ_7745c5c3_Err != nil {
278 				return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/channels.templ`, Line: 75, Col: 28}
279diff --git a/pages/error_templ.go b/pages/error_templ.go
280index 5987f7d6b7862c6002c891fc8802260832db5c3a..0eaa53232f894e51be1345da4bcc8e261fdc57db 100644
281--- a/pages/error_templ.go
282+++ b/pages/error_templ.go
283@@ -1,6 +1,6 @@
284 // Code generated by templ - DO NOT EDIT.
285 
286-// templ: version: v0.3.1001
287+// templ: version: v0.3.1020
288 package pages
289 
290 //lint:file-ignore SA4006 This context is only used if a nested component is present.
291diff --git a/pages/main_templ.go b/pages/main_templ.go
292index f131e7ec632a6cd7541749c428618301642e1e96..78a45e6f85f4ec9f0e9061bbd91c5279f3849a32 100644
293--- a/pages/main_templ.go
294+++ b/pages/main_templ.go
295@@ -1,6 +1,6 @@
296 // Code generated by templ - DO NOT EDIT.
297 
298-// templ: version: v0.3.1001
299+// templ: version: v0.3.1020
300 package pages
301 
302 //lint:file-ignore SA4006 This context is only used if a nested component is present.
303diff --git a/pages/navbar.templ b/pages/navbar.templ
304index 6b590a3ccf8651a8bce5e5616da5ffa178b89109..e86314cdd3758de00e063803c8620d581c92e116 100644
305--- a/pages/navbar.templ
306+++ b/pages/navbar.templ
307@@ -32,7 +32,7 @@ templ navbar(route string) {
308 			</a>
309 			if route != "auth" {
310 				<ul id="nav-buttons" class="navbar-nav me-auto mb-0 flex-row">
311-					<li class="nav-item me-1 me-lg-2">
312+					<li class="nav-item me-1 me-lg-2 d-lg-none">
313 						<button
314 							type="button"
315 							class="btn btn-primary"
316diff --git a/pages/navbar_templ.go b/pages/navbar_templ.go
317index 60e329fa0659fcdf7e7de3e59036884bf3cca722..64950f5309795815f1cad00bacb1e610d9b5d494 100644
318--- a/pages/navbar_templ.go
319+++ b/pages/navbar_templ.go
320@@ -1,6 +1,6 @@
321 // Code generated by templ - DO NOT EDIT.
322 
323-// templ: version: v0.3.1001
324+// templ: version: v0.3.1020
325 package pages
326 
327 //lint:file-ignore SA4006 This context is only used if a nested component is present.
328@@ -58,7 +58,7 @@ func navbar(route string) templ.Component {
329 			return templ_7745c5c3_Err
330 		}
331 		if route != "auth" {
332diff --git a/pages/new_videos_templ.go b/pages/new_videos_templ.go
333index 0f60c5e7292e0e8332b0dded741bd3be6623c5f3..ba34ace8b0108f676c0b6ea08f4e0f8395317e29 100644
334--- a/pages/new_videos_templ.go
335+++ b/pages/new_videos_templ.go
336@@ -1,6 +1,6 @@
337 // Code generated by templ - DO NOT EDIT.
338 
339-// templ: version: v0.3.1001
340+// templ: version: v0.3.1020
341 package pages
342 
343 //lint:file-ignore SA4006 This context is only used if a nested component is present.
344@@ -41,11 +41,11 @@ func ProgressBar(video models.Video) templ.Component {
345 				return templ_7745c5c3_Err
346 			}
347 			var templ_7745c5c3_Var2 string
348-			templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("progress-%s", video.ID))
349+			templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("progress-%s", video.ID))
350 			if templ_7745c5c3_Err != nil {
351 				return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/new_videos.templ`, Line: 11, Col: 48}
352 			}
353-			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
354+			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var2)
355 			if templ_7745c5c3_Err != nil {
356 				return templ_7745c5c3_Err
357 			}
358@@ -72,11 +72,11 @@ func ProgressBar(video models.Video) templ.Component {
359 				return templ_7745c5c3_Err
360 			}
361 			var templ_7745c5c3_Var4 string
362-			templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("progress-%s", video.ID))
363+			templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("progress-%s", video.ID))
364 			if templ_7745c5c3_Err != nil {
365 				return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/new_videos.templ`, Line: 15, Col: 48}
366 			}
367-			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
368+			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var4)
369 			if templ_7745c5c3_Err != nil {
370 				return templ_7745c5c3_Err
371 			}
372@@ -143,11 +143,11 @@ func thumbnail(video models.Video) templ.Component {
373 				return templ_7745c5c3_Err
374 			}
375 			var templ_7745c5c3_Var7 string
376-			templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("https://img.youtube.com/vi/%s/0.jpg", video.ID))
377+			templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("https://img.youtube.com/vi/%s/0.jpg", video.ID))
378 			if templ_7745c5c3_Err != nil {
379 				return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/new_videos.templ`, Line: 30, Col: 70}
380 			}
381-			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
382+			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var7)
383 			if templ_7745c5c3_Err != nil {
384 				return templ_7745c5c3_Err
385 			}
386@@ -156,11 +156,11 @@ func thumbnail(video models.Video) templ.Component {
387 				return templ_7745c5c3_Err
388 			}
389 			var templ_7745c5c3_Var8 string
390-			templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(video.Title)
391+			templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.ResolveAttributeValue(video.Title)
392 			if templ_7745c5c3_Err != nil {
393 				return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/new_videos.templ`, Line: 32, Col: 21}
394 			}
395-			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
396+			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var8)
397 			if templ_7745c5c3_Err != nil {
398 				return templ_7745c5c3_Err
399 			}
400@@ -174,11 +174,11 @@ func thumbnail(video models.Video) templ.Component {
401 				return templ_7745c5c3_Err
402 			}
403 			var templ_7745c5c3_Var9 string
404-			templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("https://img.youtube.com/vi/%s/0.jpg", video.ID))
405+			templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("https://img.youtube.com/vi/%s/0.jpg", video.ID))
406 			if templ_7745c5c3_Err != nil {
407 				return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/new_videos.templ`, Line: 46, Col: 70}
408 			}
409-			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
410+			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var9)
411 			if templ_7745c5c3_Err != nil {
412 				return templ_7745c5c3_Err
413 			}
414@@ -187,11 +187,11 @@ func thumbnail(video models.Video) templ.Component {
415 				return templ_7745c5c3_Err
416 			}
417 			var templ_7745c5c3_Var10 string
418-			templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(video.Title)
419+			templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.ResolveAttributeValue(video.Title)
420 			if templ_7745c5c3_Err != nil {
421 				return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/new_videos.templ`, Line: 48, Col: 21}
422 			}
423-			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
424+			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var10)
425 			if templ_7745c5c3_Err != nil {
426 				return templ_7745c5c3_Err
427 			}
428@@ -262,11 +262,11 @@ func VideoCard(video models.Video) templ.Component {
429 			return templ_7745c5c3_Err
430 		}
431 		var templ_7745c5c3_Var13 string
432-		templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("video-card-%s", video.ID))
433+		templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("video-card-%s", video.ID))
434 		if templ_7745c5c3_Err != nil {
435 			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/new_videos.templ`, Line: 74, Col: 49}
436diff --git a/pages/resolution_modal_templ.go b/pages/resolution_modal_templ.go
437index de33504a0de42376c51695e125a13c55960cc16c..e40e1ecd5d203e828ab2d22c8b7b21348793b297 100644
438--- a/pages/resolution_modal_templ.go
439+++ b/pages/resolution_modal_templ.go
440@@ -1,6 +1,6 @@
441 // Code generated by templ - DO NOT EDIT.
442 
443-// templ: version: v0.3.1001
444+// templ: version: v0.3.1020
445 package pages
446 
447 //lint:file-ignore SA4006 This context is only used if a nested component is present.
448diff --git a/pages/subscription_templ.go b/pages/subscription_templ.go
449index 02178f6cd2e57f0f07a05697f79a609b7d1c11d0..b5bc76b94d91476e0661c938a9dcc83c7ab4cd5c 100644
450--- a/pages/subscription_templ.go
451+++ b/pages/subscription_templ.go
452@@ -1,6 +1,6 @@
453 // Code generated by templ - DO NOT EDIT.
454 
455-// templ: version: v0.3.1001
456+// templ: version: v0.3.1020
457 package pages
458 
459 //lint:file-ignore SA4006 This context is only used if a nested component is present.
460diff --git a/pages/watched_videos_templ.go b/pages/watched_videos_templ.go
461index a2b5e1af706cc4fa9272e7116e14aad26c8a7c49..fd224cf21fe66be0b42770df78e841476a8525d1 100644
462--- a/pages/watched_videos_templ.go
463+++ b/pages/watched_videos_templ.go
464@@ -1,6 +1,6 @@
465 // Code generated by templ - DO NOT EDIT.
466 
467-// templ: version: v0.3.1001
468+// templ: version: v0.3.1020
469 package pages
470 
471 //lint:file-ignore SA4006 This context is only used if a nested component is present.
472@@ -100,11 +100,11 @@ func watchedVideoCard(video models.Video) templ.Component {
473 			return templ_7745c5c3_Err
474 		}
475 		var templ_7745c5c3_Var6 string
476-		templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("@patch('/videos/%s/unwatch')", video.ID))
477+		templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("@patch('/videos/%s/unwatch')", video.ID))
478 		if templ_7745c5c3_Err != nil {
479 			return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/watched_videos.templ`, Line: 26, Col: 74}
480 		}
481-		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
482+		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var6)
483 		if templ_7745c5c3_Err != nil {
484 			return templ_7745c5c3_Err
485 		}
486@@ -159,11 +159,11 @@ func WatchedVideosPage(videos []models.Video, currentPage int) templ.Component {
487 					return templ_7745c5c3_Err
488 				}
489 				var templ_7745c5c3_Var9 string
490-				templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("video-card-%s", video.ID))
491+				templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.ResolveAttributeValue(fmt.Sprintf("video-card-%s", video.ID))
492 				if templ_7745c5c3_Err != nil {
493 					return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/watched_videos.templ`, Line: 40, Col: 52}
494 				}
495-				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
496+				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var9)
497 				if templ_7745c5c3_Err != nil {
498 					return templ_7745c5c3_Err
499 				}
500@@ -172,11 +172,11 @@ func WatchedVideosPage(videos []models.Video, currentPage int) templ.Component {
501 					return templ_7745c5c3_Err
502 				}
503 				var templ_7745c5c3_Var10 string
504-				templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(video.Title)
505+				templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.ResolveAttributeValue(video.Title)
506 				if templ_7745c5c3_Err != nil {
507 					return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/watched_videos.templ`, Line: 40, Col: 111}
508 				}
509-				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
510+				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var10)
511 				if templ_7745c5c3_Err != nil {
512 					return templ_7745c5c3_Err
513 				}
514@@ -185,11 +185,11 @@ func WatchedVideosPage(videos []models.Video, currentPage int) templ.Component {
515 					return templ_7745c5c3_Err
516 				}
517 				var templ_7745c5c3_Var11 string
518-				templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(video.ChannelName)
519+				templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.ResolveAttributeValue(video.ChannelName)
520 				if templ_7745c5c3_Err != nil {
521 					return templ.Error{Err: templ_7745c5c3_Err, FileName: `pages/watched_videos.templ`, Line: 40, Col: 151}
522 				}
523-				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
524+				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var11)
525 				if templ_7745c5c3_Err != nil {
526 					return templ_7745c5c3_Err
527 				}