bump
This commit is contained in:
		
							
								
								
									
										1
									
								
								form.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								form.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"Elements":[{"Name":"email","Label":"Email Address","LabelClasses":"","InputClasses":"","Type":"text","Hint":"","Required":false,"Classes":"","Validator":"email","FailMessage":"","Value":"","Order":1,"Choices":null},{"Name":"oldpassword","Label":"Old Password","LabelClasses":"","InputClasses":"","Type":"password","Hint":"","Required":false,"Classes":"","Validator":"","FailMessage":"","Value":"","Order":2,"Choices":null},{"Name":"newpassword","Label":"New Password","LabelClasses":"","InputClasses":"","Type":"password","Hint":"","Required":false,"Classes":"","Validator":"minlength=8;haslowercase;hasuppercase;hasdigit","FailMessage":"","Value":"","Order":3,"Choices":null},{"Name":"confirmpassword","Label":"Confirm Password","LabelClasses":"","InputClasses":"","Type":"password","Hint":"","Required":false,"Classes":"","Validator":"mustmatch=newpassword","FailMessage":"","Value":"","Order":4,"Choices":null},{"Name":"","Label":"Change Password","LabelClasses":"","InputClasses":"flex w-full justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600","Type":"submit","Hint":"","Required":false,"Classes":"","Validator":"","FailMessage":"","Value":"","Order":5,"Choices":null}],"Route":"/changepassword","Classes":"w-full px-1 py-2","LabelClasses":"block text-sm font-medium leading-6 text-gray-900","InputClasses":"block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6","ErrorClasses":"text-red-600 text-right font-bold text-xl","ContainerClasses":"w-full bg-gray-100  justify-center py-6 rounded-lg shadow flex","Editable":true}
 | 
			
		||||
							
								
								
									
										11
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
module git.teamworkapps.com/shortcut/docker-mailserver-passwords
 | 
			
		||||
 | 
			
		||||
go 1.22.0
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	git.teamworkapps.com/shortcut/forms v0.0.0-20240202203738-c42dc9446449 // indirect
 | 
			
		||||
	github.com/emersion/go-message v0.18.0 // indirect
 | 
			
		||||
	github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 // indirect
 | 
			
		||||
	github.com/knadh/go-pop3 v0.3.0 // indirect
 | 
			
		||||
	github.com/shopspring/decimal v1.3.1 // indirect
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										43
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
git.teamworkapps.com/shortcut/forms v0.0.0-20240202203738-c42dc9446449 h1:frCZ9C7Z6qovkVHVRIGNv6q1Nm/bRxqxe38i4nj3Ag8=
 | 
			
		||||
git.teamworkapps.com/shortcut/forms v0.0.0-20240202203738-c42dc9446449/go.mod h1:1ElXS6rlK/NaNDQoqfCALVVKnwaSYAg2pNF8Ksvoc3Y=
 | 
			
		||||
github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4=
 | 
			
		||||
github.com/emersion/go-message v0.18.0 h1:7LxAXHRpSeoO/Wom3ZApVZYG7c3d17yCScYce8WiXA8=
 | 
			
		||||
github.com/emersion/go-message v0.18.0/go.mod h1:Zi69ACvzaoV/MBnrxfVBPV3xWEuCmC2nEN39oJF4B8A=
 | 
			
		||||
github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 h1:IbFBtwoTQyw0fIM5xv1HF+Y+3ZijDR839WMulgxCcUY=
 | 
			
		||||
github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
 | 
			
		||||
github.com/knadh/go-pop3 v0.3.0 h1:h6wh28lyT/vUBMSiSwDDUXZjHH6zL8CM8WYCPbETM4Y=
 | 
			
		||||
github.com/knadh/go-pop3 v0.3.0/go.mod h1:a5kUJzrBB6kec+tNJl+3Z64ROgByKBdcyub+mhZMAfI=
 | 
			
		||||
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
 | 
			
		||||
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
 | 
			
		||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 | 
			
		||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 | 
			
		||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 | 
			
		||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 | 
			
		||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 | 
			
		||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 | 
			
		||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
							
								
								
									
										115
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,115 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
	"text/template"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"git.teamworkapps.com/shortcut/forms"
 | 
			
		||||
	"github.com/knadh/go-pop3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// We use my forms package to create a password change form which on success executes a docker call to change the password
 | 
			
		||||
 | 
			
		||||
type tplData struct {
 | 
			
		||||
	Time int64
 | 
			
		||||
	Body string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
 | 
			
		||||
	forms.GlobalStyles.ContainerClasses = "w-full bg-gray-100  justify-center py-6 rounded-lg shadow flex"
 | 
			
		||||
	forms.GlobalStyles.ItemClasses = "w-full px-1 py-2"
 | 
			
		||||
	forms.GlobalStyles.ErrorClasses = "text-red-600 text-right font-bold text-xl"
 | 
			
		||||
	forms.GlobalStyles.LabelClasses = "block text-sm font-medium leading-6 text-gray-900"
 | 
			
		||||
	forms.GlobalStyles.InputClasses = "block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"
 | 
			
		||||
	f := forms.NewForm()
 | 
			
		||||
	e := forms.NewElement()
 | 
			
		||||
	e.Label = "Email Address"
 | 
			
		||||
	e.Type = "text"
 | 
			
		||||
	e.Validator = "email"
 | 
			
		||||
	e.Name = "email"
 | 
			
		||||
	f.Add(e)
 | 
			
		||||
 | 
			
		||||
	e = forms.NewElement()
 | 
			
		||||
	e.Label = "Old Password"
 | 
			
		||||
	e.Type = "password"
 | 
			
		||||
	e.Validator = ""
 | 
			
		||||
	e.Name = "oldpassword"
 | 
			
		||||
	f.Add(e)
 | 
			
		||||
 | 
			
		||||
	e = forms.NewElement()
 | 
			
		||||
	e.Label = "New Password"
 | 
			
		||||
	e.Type = "password"
 | 
			
		||||
	e.Validator = "minlength=8;haslowercase;hasuppercase;hasdigit"
 | 
			
		||||
	e.Name = "newpassword"
 | 
			
		||||
	f.Add(e)
 | 
			
		||||
 | 
			
		||||
	e = forms.NewElement()
 | 
			
		||||
	e.Label = "Confirm Password"
 | 
			
		||||
	e.Type = "password"
 | 
			
		||||
	e.Validator = "mustmatch=newpassword"
 | 
			
		||||
	e.Name = "confirmpassword"
 | 
			
		||||
	f.Add(e)
 | 
			
		||||
 | 
			
		||||
	e = forms.NewElement()
 | 
			
		||||
	e.Label = "Change Password"
 | 
			
		||||
	e.Type = "submit"
 | 
			
		||||
	e.InputClasses = "flex w-full justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
 | 
			
		||||
	f.Add(e)
 | 
			
		||||
 | 
			
		||||
	f.Route = "/changepassword"
 | 
			
		||||
	out, err := f.ToJSON()
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		os.WriteFile("form.json", out, 0644)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tmpFile := "template.html"
 | 
			
		||||
	tmpl, err := template.New(path.Base(tmpFile)).ParseFiles(tmpFile)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	var d tplData
 | 
			
		||||
 | 
			
		||||
	s := http.NewServeMux()
 | 
			
		||||
	s.HandleFunc("/style.css", http.FileServer(http.Dir("./")).ServeHTTP)
 | 
			
		||||
	s.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		d.Body = f.Render(true)
 | 
			
		||||
		tmpl.Execute(w, d)
 | 
			
		||||
	})
 | 
			
		||||
	s.HandleFunc("/changepassword", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		if f.Validate(r) != nil {
 | 
			
		||||
			d.Body = f.Render(true)
 | 
			
		||||
			tmpl.Execute(w, d)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		// Test if the given username ans password can authenticate via pop3
 | 
			
		||||
		// If so, change the password
 | 
			
		||||
 | 
			
		||||
		p := pop3.New(pop3.Opt{Host: "localhost", Port: 995, TLSEnabled: true})
 | 
			
		||||
 | 
			
		||||
		c, err := p.NewConn()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			d.Body="Internal error"
 | 
			
		||||
			tmpl.Execute(w, d)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		defer c.Quit()
 | 
			
		||||
 | 
			
		||||
		// Authenticate.
 | 
			
		||||
		if err := c.Auth(f.GetValue("email"), f.GetValue("oldpassword")); err != nil {
 | 
			
		||||
			f.MakeInvalid("oldpassword", "Invalid password")
 | 
			
		||||
			d.Body = f.Render(true)
 | 
			
		||||
			tmpl.Execute(w, d)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		w.Write([]byte("I want to change the password"))
 | 
			
		||||
	})
 | 
			
		||||
	d.Time = time.Now().Unix()
 | 
			
		||||
	d.Body = f.Render(true)
 | 
			
		||||
	tmpl.Execute(os.Stdout, d)
 | 
			
		||||
	http.ListenAndServe(":8910", s)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										912
									
								
								style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										912
									
								
								style.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,912 @@
 | 
			
		||||
/*
 | 
			
		||||
! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
 | 
			
		||||
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
*,
 | 
			
		||||
::before,
 | 
			
		||||
::after {
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  border-width: 0;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
  border-style: solid;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
  border-color: #e5e7eb;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
::before,
 | 
			
		||||
::after {
 | 
			
		||||
  --tw-content: '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Use a consistent sensible line-height in all browsers.
 | 
			
		||||
2. Prevent adjustments of font size after orientation changes in iOS.
 | 
			
		||||
3. Use a more readable tab size.
 | 
			
		||||
4. Use the user's configured `sans` font-family by default.
 | 
			
		||||
5. Use the user's configured `sans` font-feature-settings by default.
 | 
			
		||||
6. Use the user's configured `sans` font-variation-settings by default.
 | 
			
		||||
7. Disable tap highlights on iOS
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
html,
 | 
			
		||||
:host {
 | 
			
		||||
  line-height: 1.5;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  -webkit-text-size-adjust: 100%;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
  -moz-tab-size: 4;
 | 
			
		||||
  /* 3 */
 | 
			
		||||
  -o-tab-size: 4;
 | 
			
		||||
     tab-size: 4;
 | 
			
		||||
  /* 3 */
 | 
			
		||||
  font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
 | 
			
		||||
  /* 4 */
 | 
			
		||||
  font-feature-settings: normal;
 | 
			
		||||
  /* 5 */
 | 
			
		||||
  font-variation-settings: normal;
 | 
			
		||||
  /* 6 */
 | 
			
		||||
  -webkit-tap-highlight-color: transparent;
 | 
			
		||||
  /* 7 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Remove the margin in all browsers.
 | 
			
		||||
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  line-height: inherit;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Add the correct height in Firefox.
 | 
			
		||||
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
 | 
			
		||||
3. Ensure horizontal rules are visible by default.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
hr {
 | 
			
		||||
  height: 0;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  color: inherit;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
  border-top-width: 1px;
 | 
			
		||||
  /* 3 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Add the correct text decoration in Chrome, Edge, and Safari.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
abbr:where([title]) {
 | 
			
		||||
  -webkit-text-decoration: underline dotted;
 | 
			
		||||
          text-decoration: underline dotted;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Remove the default font size and weight for headings.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
h1,
 | 
			
		||||
h2,
 | 
			
		||||
h3,
 | 
			
		||||
h4,
 | 
			
		||||
h5,
 | 
			
		||||
h6 {
 | 
			
		||||
  font-size: inherit;
 | 
			
		||||
  font-weight: inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Reset links to optimize for opt-in styling instead of opt-out.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
a {
 | 
			
		||||
  color: inherit;
 | 
			
		||||
  text-decoration: inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Add the correct font weight in Edge and Safari.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
b,
 | 
			
		||||
strong {
 | 
			
		||||
  font-weight: bolder;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Use the user's configured `mono` font-family by default.
 | 
			
		||||
2. Use the user's configured `mono` font-feature-settings by default.
 | 
			
		||||
3. Use the user's configured `mono` font-variation-settings by default.
 | 
			
		||||
4. Correct the odd `em` font sizing in all browsers.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
code,
 | 
			
		||||
kbd,
 | 
			
		||||
samp,
 | 
			
		||||
pre {
 | 
			
		||||
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  font-feature-settings: normal;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
  font-variation-settings: normal;
 | 
			
		||||
  /* 3 */
 | 
			
		||||
  font-size: 1em;
 | 
			
		||||
  /* 4 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Add the correct font size in all browsers.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
small {
 | 
			
		||||
  font-size: 80%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
sub,
 | 
			
		||||
sup {
 | 
			
		||||
  font-size: 75%;
 | 
			
		||||
  line-height: 0;
 | 
			
		||||
  position: relative;
 | 
			
		||||
  vertical-align: baseline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub {
 | 
			
		||||
  bottom: -0.25em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sup {
 | 
			
		||||
  top: -0.5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
 | 
			
		||||
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
 | 
			
		||||
3. Remove gaps between table borders by default.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
table {
 | 
			
		||||
  text-indent: 0;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  border-color: inherit;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
  border-collapse: collapse;
 | 
			
		||||
  /* 3 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Change the font styles in all browsers.
 | 
			
		||||
2. Remove the margin in Firefox and Safari.
 | 
			
		||||
3. Remove default padding in all browsers.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
input,
 | 
			
		||||
optgroup,
 | 
			
		||||
select,
 | 
			
		||||
textarea {
 | 
			
		||||
  font-family: inherit;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  font-feature-settings: inherit;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  font-variation-settings: inherit;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  font-size: 100%;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  font-weight: inherit;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  line-height: inherit;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  color: inherit;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  /* 3 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Remove the inheritance of text transform in Edge and Firefox.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
select {
 | 
			
		||||
  text-transform: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Correct the inability to style clickable types in iOS and Safari.
 | 
			
		||||
2. Remove default button styles.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
[type='button'],
 | 
			
		||||
[type='reset'],
 | 
			
		||||
[type='submit'] {
 | 
			
		||||
  -webkit-appearance: button;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  background-color: transparent;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
  background-image: none;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Use the modern Firefox focus style for all focusable elements.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
:-moz-focusring {
 | 
			
		||||
  outline: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
:-moz-ui-invalid {
 | 
			
		||||
  box-shadow: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Add the correct vertical alignment in Chrome and Firefox.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
progress {
 | 
			
		||||
  vertical-align: baseline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Correct the cursor style of increment and decrement buttons in Safari.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
::-webkit-inner-spin-button,
 | 
			
		||||
::-webkit-outer-spin-button {
 | 
			
		||||
  height: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Correct the odd appearance in Chrome and Safari.
 | 
			
		||||
2. Correct the outline style in Safari.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
[type='search'] {
 | 
			
		||||
  -webkit-appearance: textfield;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  outline-offset: -2px;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Remove the inner padding in Chrome and Safari on macOS.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
::-webkit-search-decoration {
 | 
			
		||||
  -webkit-appearance: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Correct the inability to style clickable types in iOS and Safari.
 | 
			
		||||
2. Change font properties to `inherit` in Safari.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
::-webkit-file-upload-button {
 | 
			
		||||
  -webkit-appearance: button;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  font: inherit;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Add the correct display in Chrome and Safari.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
summary {
 | 
			
		||||
  display: list-item;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Removes the default spacing and border for appropriate elements.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
blockquote,
 | 
			
		||||
dl,
 | 
			
		||||
dd,
 | 
			
		||||
h1,
 | 
			
		||||
h2,
 | 
			
		||||
h3,
 | 
			
		||||
h4,
 | 
			
		||||
h5,
 | 
			
		||||
h6,
 | 
			
		||||
hr,
 | 
			
		||||
figure,
 | 
			
		||||
p,
 | 
			
		||||
pre {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fieldset {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
legend {
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ol,
 | 
			
		||||
ul,
 | 
			
		||||
menu {
 | 
			
		||||
  list-style: none;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Reset default styling for dialogs.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
dialog {
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Prevent resizing textareas horizontally by default.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
textarea {
 | 
			
		||||
  resize: vertical;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
 | 
			
		||||
2. Set the default placeholder color to the user's configured gray 400 color.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
input::-moz-placeholder, textarea::-moz-placeholder {
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  color: #9ca3af;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input::placeholder,
 | 
			
		||||
textarea::placeholder {
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  color: #9ca3af;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Set the default cursor for buttons.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
[role="button"] {
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Make sure disabled buttons don't get the pointer cursor.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
:disabled {
 | 
			
		||||
  cursor: default;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
 | 
			
		||||
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
 | 
			
		||||
   This can trigger a poorly considered lint error in some tools but is included by design.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
img,
 | 
			
		||||
svg,
 | 
			
		||||
video,
 | 
			
		||||
canvas,
 | 
			
		||||
audio,
 | 
			
		||||
iframe,
 | 
			
		||||
embed,
 | 
			
		||||
object {
 | 
			
		||||
  display: block;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  vertical-align: middle;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
img,
 | 
			
		||||
video {
 | 
			
		||||
  max-width: 100%;
 | 
			
		||||
  height: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Make elements with the HTML hidden attribute stay hidden by default */
 | 
			
		||||
 | 
			
		||||
[hidden] {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {
 | 
			
		||||
  -webkit-appearance: none;
 | 
			
		||||
     -moz-appearance: none;
 | 
			
		||||
          appearance: none;
 | 
			
		||||
  background-color: #fff;
 | 
			
		||||
  border-color: #6b7280;
 | 
			
		||||
  border-width: 1px;
 | 
			
		||||
  border-radius: 0px;
 | 
			
		||||
  padding-top: 0.5rem;
 | 
			
		||||
  padding-right: 0.75rem;
 | 
			
		||||
  padding-bottom: 0.5rem;
 | 
			
		||||
  padding-left: 0.75rem;
 | 
			
		||||
  font-size: 1rem;
 | 
			
		||||
  line-height: 1.5rem;
 | 
			
		||||
  --tw-shadow: 0 0 #0000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {
 | 
			
		||||
  outline: 2px solid transparent;
 | 
			
		||||
  outline-offset: 2px;
 | 
			
		||||
  --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
 | 
			
		||||
  --tw-ring-offset-width: 0px;
 | 
			
		||||
  --tw-ring-offset-color: #fff;
 | 
			
		||||
  --tw-ring-color: #2563eb;
 | 
			
		||||
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
 | 
			
		||||
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
 | 
			
		||||
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
 | 
			
		||||
  border-color: #2563eb;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input::-moz-placeholder, textarea::-moz-placeholder {
 | 
			
		||||
  color: #6b7280;
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input::placeholder,textarea::placeholder {
 | 
			
		||||
  color: #6b7280;
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
::-webkit-datetime-edit-fields-wrapper {
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
::-webkit-date-and-time-value {
 | 
			
		||||
  min-height: 1.5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field {
 | 
			
		||||
  padding-top: 0;
 | 
			
		||||
  padding-bottom: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
select {
 | 
			
		||||
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
 | 
			
		||||
  background-position: right 0.5rem center;
 | 
			
		||||
  background-repeat: no-repeat;
 | 
			
		||||
  background-size: 1.5em 1.5em;
 | 
			
		||||
  padding-right: 2.5rem;
 | 
			
		||||
  -webkit-print-color-adjust: exact;
 | 
			
		||||
          print-color-adjust: exact;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[multiple] {
 | 
			
		||||
  background-image: initial;
 | 
			
		||||
  background-position: initial;
 | 
			
		||||
  background-repeat: unset;
 | 
			
		||||
  background-size: initial;
 | 
			
		||||
  padding-right: 0.75rem;
 | 
			
		||||
  -webkit-print-color-adjust: unset;
 | 
			
		||||
          print-color-adjust: unset;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='checkbox'],[type='radio'] {
 | 
			
		||||
  -webkit-appearance: none;
 | 
			
		||||
     -moz-appearance: none;
 | 
			
		||||
          appearance: none;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  -webkit-print-color-adjust: exact;
 | 
			
		||||
          print-color-adjust: exact;
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  vertical-align: middle;
 | 
			
		||||
  background-origin: border-box;
 | 
			
		||||
  -webkit-user-select: none;
 | 
			
		||||
     -moz-user-select: none;
 | 
			
		||||
          user-select: none;
 | 
			
		||||
  flex-shrink: 0;
 | 
			
		||||
  height: 1rem;
 | 
			
		||||
  width: 1rem;
 | 
			
		||||
  color: #2563eb;
 | 
			
		||||
  background-color: #fff;
 | 
			
		||||
  border-color: #6b7280;
 | 
			
		||||
  border-width: 1px;
 | 
			
		||||
  --tw-shadow: 0 0 #0000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='checkbox'] {
 | 
			
		||||
  border-radius: 0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='radio'] {
 | 
			
		||||
  border-radius: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='checkbox']:focus,[type='radio']:focus {
 | 
			
		||||
  outline: 2px solid transparent;
 | 
			
		||||
  outline-offset: 2px;
 | 
			
		||||
  --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
 | 
			
		||||
  --tw-ring-offset-width: 2px;
 | 
			
		||||
  --tw-ring-offset-color: #fff;
 | 
			
		||||
  --tw-ring-color: #2563eb;
 | 
			
		||||
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
 | 
			
		||||
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
 | 
			
		||||
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='checkbox']:checked,[type='radio']:checked {
 | 
			
		||||
  border-color: transparent;
 | 
			
		||||
  background-color: currentColor;
 | 
			
		||||
  background-size: 100% 100%;
 | 
			
		||||
  background-position: center;
 | 
			
		||||
  background-repeat: no-repeat;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='checkbox']:checked {
 | 
			
		||||
  background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='radio']:checked {
 | 
			
		||||
  background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {
 | 
			
		||||
  border-color: transparent;
 | 
			
		||||
  background-color: currentColor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='checkbox']:indeterminate {
 | 
			
		||||
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");
 | 
			
		||||
  border-color: transparent;
 | 
			
		||||
  background-color: currentColor;
 | 
			
		||||
  background-size: 100% 100%;
 | 
			
		||||
  background-position: center;
 | 
			
		||||
  background-repeat: no-repeat;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {
 | 
			
		||||
  border-color: transparent;
 | 
			
		||||
  background-color: currentColor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='file'] {
 | 
			
		||||
  background: unset;
 | 
			
		||||
  border-color: inherit;
 | 
			
		||||
  border-width: 0;
 | 
			
		||||
  border-radius: 0;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  font-size: unset;
 | 
			
		||||
  line-height: inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type='file']:focus {
 | 
			
		||||
  outline: 1px solid ButtonText;
 | 
			
		||||
  outline: 1px auto -webkit-focus-ring-color;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
*, ::before, ::after {
 | 
			
		||||
  --tw-border-spacing-x: 0;
 | 
			
		||||
  --tw-border-spacing-y: 0;
 | 
			
		||||
  --tw-translate-x: 0;
 | 
			
		||||
  --tw-translate-y: 0;
 | 
			
		||||
  --tw-rotate: 0;
 | 
			
		||||
  --tw-skew-x: 0;
 | 
			
		||||
  --tw-skew-y: 0;
 | 
			
		||||
  --tw-scale-x: 1;
 | 
			
		||||
  --tw-scale-y: 1;
 | 
			
		||||
  --tw-pan-x:  ;
 | 
			
		||||
  --tw-pan-y:  ;
 | 
			
		||||
  --tw-pinch-zoom:  ;
 | 
			
		||||
  --tw-scroll-snap-strictness: proximity;
 | 
			
		||||
  --tw-gradient-from-position:  ;
 | 
			
		||||
  --tw-gradient-via-position:  ;
 | 
			
		||||
  --tw-gradient-to-position:  ;
 | 
			
		||||
  --tw-ordinal:  ;
 | 
			
		||||
  --tw-slashed-zero:  ;
 | 
			
		||||
  --tw-numeric-figure:  ;
 | 
			
		||||
  --tw-numeric-spacing:  ;
 | 
			
		||||
  --tw-numeric-fraction:  ;
 | 
			
		||||
  --tw-ring-inset:  ;
 | 
			
		||||
  --tw-ring-offset-width: 0px;
 | 
			
		||||
  --tw-ring-offset-color: #fff;
 | 
			
		||||
  --tw-ring-color: rgb(59 130 246 / 0.5);
 | 
			
		||||
  --tw-ring-offset-shadow: 0 0 #0000;
 | 
			
		||||
  --tw-ring-shadow: 0 0 #0000;
 | 
			
		||||
  --tw-shadow: 0 0 #0000;
 | 
			
		||||
  --tw-shadow-colored: 0 0 #0000;
 | 
			
		||||
  --tw-blur:  ;
 | 
			
		||||
  --tw-brightness:  ;
 | 
			
		||||
  --tw-contrast:  ;
 | 
			
		||||
  --tw-grayscale:  ;
 | 
			
		||||
  --tw-hue-rotate:  ;
 | 
			
		||||
  --tw-invert:  ;
 | 
			
		||||
  --tw-saturate:  ;
 | 
			
		||||
  --tw-sepia:  ;
 | 
			
		||||
  --tw-drop-shadow:  ;
 | 
			
		||||
  --tw-backdrop-blur:  ;
 | 
			
		||||
  --tw-backdrop-brightness:  ;
 | 
			
		||||
  --tw-backdrop-contrast:  ;
 | 
			
		||||
  --tw-backdrop-grayscale:  ;
 | 
			
		||||
  --tw-backdrop-hue-rotate:  ;
 | 
			
		||||
  --tw-backdrop-invert:  ;
 | 
			
		||||
  --tw-backdrop-opacity:  ;
 | 
			
		||||
  --tw-backdrop-saturate:  ;
 | 
			
		||||
  --tw-backdrop-sepia:  ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
::backdrop {
 | 
			
		||||
  --tw-border-spacing-x: 0;
 | 
			
		||||
  --tw-border-spacing-y: 0;
 | 
			
		||||
  --tw-translate-x: 0;
 | 
			
		||||
  --tw-translate-y: 0;
 | 
			
		||||
  --tw-rotate: 0;
 | 
			
		||||
  --tw-skew-x: 0;
 | 
			
		||||
  --tw-skew-y: 0;
 | 
			
		||||
  --tw-scale-x: 1;
 | 
			
		||||
  --tw-scale-y: 1;
 | 
			
		||||
  --tw-pan-x:  ;
 | 
			
		||||
  --tw-pan-y:  ;
 | 
			
		||||
  --tw-pinch-zoom:  ;
 | 
			
		||||
  --tw-scroll-snap-strictness: proximity;
 | 
			
		||||
  --tw-gradient-from-position:  ;
 | 
			
		||||
  --tw-gradient-via-position:  ;
 | 
			
		||||
  --tw-gradient-to-position:  ;
 | 
			
		||||
  --tw-ordinal:  ;
 | 
			
		||||
  --tw-slashed-zero:  ;
 | 
			
		||||
  --tw-numeric-figure:  ;
 | 
			
		||||
  --tw-numeric-spacing:  ;
 | 
			
		||||
  --tw-numeric-fraction:  ;
 | 
			
		||||
  --tw-ring-inset:  ;
 | 
			
		||||
  --tw-ring-offset-width: 0px;
 | 
			
		||||
  --tw-ring-offset-color: #fff;
 | 
			
		||||
  --tw-ring-color: rgb(59 130 246 / 0.5);
 | 
			
		||||
  --tw-ring-offset-shadow: 0 0 #0000;
 | 
			
		||||
  --tw-ring-shadow: 0 0 #0000;
 | 
			
		||||
  --tw-shadow: 0 0 #0000;
 | 
			
		||||
  --tw-shadow-colored: 0 0 #0000;
 | 
			
		||||
  --tw-blur:  ;
 | 
			
		||||
  --tw-brightness:  ;
 | 
			
		||||
  --tw-contrast:  ;
 | 
			
		||||
  --tw-grayscale:  ;
 | 
			
		||||
  --tw-hue-rotate:  ;
 | 
			
		||||
  --tw-invert:  ;
 | 
			
		||||
  --tw-saturate:  ;
 | 
			
		||||
  --tw-sepia:  ;
 | 
			
		||||
  --tw-drop-shadow:  ;
 | 
			
		||||
  --tw-backdrop-blur:  ;
 | 
			
		||||
  --tw-backdrop-brightness:  ;
 | 
			
		||||
  --tw-backdrop-contrast:  ;
 | 
			
		||||
  --tw-backdrop-grayscale:  ;
 | 
			
		||||
  --tw-backdrop-hue-rotate:  ;
 | 
			
		||||
  --tw-backdrop-invert:  ;
 | 
			
		||||
  --tw-backdrop-opacity:  ;
 | 
			
		||||
  --tw-backdrop-saturate:  ;
 | 
			
		||||
  --tw-backdrop-sepia:  ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.block {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.flex {
 | 
			
		||||
  display: flex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.h-full {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.w-full {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.justify-center {
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.rounded-lg {
 | 
			
		||||
  border-radius: 0.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.rounded-md {
 | 
			
		||||
  border-radius: 0.375rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.border-0 {
 | 
			
		||||
  border-width: 0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.bg-gray-100 {
 | 
			
		||||
  --tw-bg-opacity: 1;
 | 
			
		||||
  background-color: rgb(243 244 246 / var(--tw-bg-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.bg-indigo-600 {
 | 
			
		||||
  --tw-bg-opacity: 1;
 | 
			
		||||
  background-color: rgb(79 70 229 / var(--tw-bg-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.px-1 {
 | 
			
		||||
  padding-left: 0.25rem;
 | 
			
		||||
  padding-right: 0.25rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.px-3 {
 | 
			
		||||
  padding-left: 0.75rem;
 | 
			
		||||
  padding-right: 0.75rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.py-1 {
 | 
			
		||||
  padding-top: 0.25rem;
 | 
			
		||||
  padding-bottom: 0.25rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.py-1\.5 {
 | 
			
		||||
  padding-top: 0.375rem;
 | 
			
		||||
  padding-bottom: 0.375rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.py-2 {
 | 
			
		||||
  padding-top: 0.5rem;
 | 
			
		||||
  padding-bottom: 0.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.py-6 {
 | 
			
		||||
  padding-top: 1.5rem;
 | 
			
		||||
  padding-bottom: 1.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.text-right {
 | 
			
		||||
  text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.text-sm {
 | 
			
		||||
  font-size: 0.875rem;
 | 
			
		||||
  line-height: 1.25rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.text-xl {
 | 
			
		||||
  font-size: 1.25rem;
 | 
			
		||||
  line-height: 1.75rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.font-bold {
 | 
			
		||||
  font-weight: 700;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.font-medium {
 | 
			
		||||
  font-weight: 500;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.font-semibold {
 | 
			
		||||
  font-weight: 600;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.leading-6 {
 | 
			
		||||
  line-height: 1.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.text-gray-900 {
 | 
			
		||||
  --tw-text-opacity: 1;
 | 
			
		||||
  color: rgb(17 24 39 / var(--tw-text-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.text-red-600 {
 | 
			
		||||
  --tw-text-opacity: 1;
 | 
			
		||||
  color: rgb(220 38 38 / var(--tw-text-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.text-white {
 | 
			
		||||
  --tw-text-opacity: 1;
 | 
			
		||||
  color: rgb(255 255 255 / var(--tw-text-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.shadow {
 | 
			
		||||
  --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
 | 
			
		||||
  --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
 | 
			
		||||
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.shadow-sm {
 | 
			
		||||
  --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
 | 
			
		||||
  --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
 | 
			
		||||
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ring-1 {
 | 
			
		||||
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
 | 
			
		||||
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
 | 
			
		||||
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ring-inset {
 | 
			
		||||
  --tw-ring-inset: inset;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ring-gray-300 {
 | 
			
		||||
  --tw-ring-opacity: 1;
 | 
			
		||||
  --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.placeholder\:text-gray-400::-moz-placeholder {
 | 
			
		||||
  --tw-text-opacity: 1;
 | 
			
		||||
  color: rgb(156 163 175 / var(--tw-text-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.placeholder\:text-gray-400::placeholder {
 | 
			
		||||
  --tw-text-opacity: 1;
 | 
			
		||||
  color: rgb(156 163 175 / var(--tw-text-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.hover\:bg-indigo-500:hover {
 | 
			
		||||
  --tw-bg-opacity: 1;
 | 
			
		||||
  background-color: rgb(99 102 241 / var(--tw-bg-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus\:ring-2:focus {
 | 
			
		||||
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
 | 
			
		||||
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
 | 
			
		||||
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus\:ring-inset:focus {
 | 
			
		||||
  --tw-ring-inset: inset;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus\:ring-indigo-600:focus {
 | 
			
		||||
  --tw-ring-opacity: 1;
 | 
			
		||||
  --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus-visible\:outline:focus-visible {
 | 
			
		||||
  outline-style: solid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus-visible\:outline-2:focus-visible {
 | 
			
		||||
  outline-width: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus-visible\:outline-offset-2:focus-visible {
 | 
			
		||||
  outline-offset: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.focus-visible\:outline-indigo-600:focus-visible {
 | 
			
		||||
  outline-color: #4f46e5;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media (min-width: 640px) {
 | 
			
		||||
  .sm\:text-sm {
 | 
			
		||||
    font-size: 0.875rem;
 | 
			
		||||
    line-height: 1.25rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .sm\:leading-6 {
 | 
			
		||||
    line-height: 1.5rem;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								tailwind.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								tailwind.config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
/** @type {import('tailwindcss').Config} */
 | 
			
		||||
module.exports = {
 | 
			
		||||
  content: ["test.html"],
 | 
			
		||||
  theme: {
 | 
			
		||||
    extend: {},
 | 
			
		||||
  },
 | 
			
		||||
  plugins: [require("@tailwindcss/forms")],
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										6
									
								
								template.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								template.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
<head>
 | 
			
		||||
  <link href="/style.css" rel="stylesheet" />
 | 
			
		||||
</head>
 | 
			
		||||
<body class="h-full">
 | 
			
		||||
  {{.Body}}
 | 
			
		||||
</body>
 | 
			
		||||
							
								
								
									
										24
									
								
								test.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								test.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
<head>
 | 
			
		||||
  <link href="/style.css" rel="stylesheet" />
 | 
			
		||||
</head>
 | 
			
		||||
<body class="h-full">
 | 
			
		||||
  <div class='w-full bg-gray-100  justify-center py-6 rounded-lg shadow flex'>
 | 
			
		||||
<div class='display-none text-red-600 text-right font-bold text-xl'></div>
 | 
			
		||||
<form  class='w-full px-1 py-2' action='/changepassword' method='post' enctype='multipart/form-data'>
 | 
			
		||||
<!-- element order 1  forms.element{Name:"email", Label:"Email Address", LabelClasses:"", InputClasses:"", Type:"text", Hint:"", Required:false, Classes:"", Validator:"email", vreg:(*regexp.Regexp)(nil), valid:false, FailMessage:"", Value:"", Order:1, Choices:[]forms.choice(nil)}-->
 | 
			
		||||
<div class='w-full px-1 py-2'><label for='email' class='block text-sm font-medium leading-6 text-gray-900'>Email Address</label><input type='text' name='email' class='block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6' value=''></div>
 | 
			
		||||
<div class='text-red-600 text-right font-bold text-xl' for='email'><span class='error'>Invalid entry.</span></div>
 | 
			
		||||
<!-- element order 2  forms.element{Name:"oldpassword", Label:"Old Password", LabelClasses:"", InputClasses:"", Type:"password", Hint:"", Required:false, Classes:"", Validator:"", vreg:(*regexp.Regexp)(nil), valid:false, FailMessage:"", Value:"", Order:2, Choices:[]forms.choice(nil)}-->
 | 
			
		||||
<div class='w-full px-1 py-2'><label for='oldpassword' class='block text-sm font-medium leading-6 text-gray-900'>Old Password</label><input type='password' name='oldpassword' class='block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6' value=''></div>
 | 
			
		||||
<div class='text-red-600 text-right font-bold text-xl' for='oldpassword'><span class='error'>Invalid entry.</span></div>
 | 
			
		||||
<!-- element order 3  forms.element{Name:"newpassword", Label:"New Password", LabelClasses:"", InputClasses:"", Type:"password", Hint:"", Required:false, Classes:"", Validator:"minlength=8;haslowercase;hasuppercase;hasnumber", vreg:(*regexp.Regexp)(nil), valid:false, FailMessage:"", Value:"", Order:3, Choices:[]forms.choice(nil)}-->
 | 
			
		||||
<div class='w-full px-1 py-2'><label for='newpassword' class='block text-sm font-medium leading-6 text-gray-900'>New Password</label><input type='password' name='newpassword' class='block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6' value=''></div>
 | 
			
		||||
<div class='text-red-600 text-right font-bold text-xl' for='newpassword'><span class='error'>Invalid entry.</span></div>
 | 
			
		||||
<!-- element order 4  forms.element{Name:"confirmpassword", Label:"Confirm Password", LabelClasses:"", InputClasses:"", Type:"password", Hint:"", Required:false, Classes:"", Validator:"matches=newpassword", vreg:(*regexp.Regexp)(nil), valid:false, FailMessage:"", Value:"", Order:4, Choices:[]forms.choice(nil)}-->
 | 
			
		||||
<div class='w-full px-1 py-2'><label for='confirmpassword' class='block text-sm font-medium leading-6 text-gray-900'>Confirm Password</label><input type='password' name='confirmpassword' class='block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6' value=''></div>
 | 
			
		||||
<div class='text-red-600 text-right font-bold text-xl' for='confirmpassword'><span class='error'>Invalid entry.</span></div>
 | 
			
		||||
<!-- element order 5  forms.element{Name:"", Label:"Change Password", LabelClasses:"", InputClasses:"flex w-full justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600", Type:"submit", Hint:"", Required:false, Classes:"", Validator:"", vreg:(*regexp.Regexp)(nil), valid:false, FailMessage:"", Value:"", Order:5, Choices:[]forms.choice(nil)}-->
 | 
			
		||||
<div class='w-full px-1 py-2'><button  type='submit' class='flex w-full justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600'><span class='block text-sm font-medium leading-6 text-gray-900'>Change Password</span></button></div>
 | 
			
		||||
<div class='text-red-600 text-right font-bold text-xl' for=''><span class='error'>Invalid entry.</span></div>
 | 
			
		||||
</form></div>
 | 
			
		||||
</body>
 | 
			
		||||
		Reference in New Issue
	
	Block a user