From 0ba7eed42fd7acd761186309b3d5ac20c56b4364 Mon Sep 17 00:00:00 2001 From: Jo Vandeginste Date: Tue, 11 Feb 2025 13:33:10 +0100 Subject: [PATCH] Add forms and API to manage daily measurements Signed-off-by: Jo Vandeginste --- assets/output.css | 2 +- docs/docs.go | 169 ++++++ docs/swagger.json | 169 ++++++ docs/swagger.yaml | 106 ++++ go.mod | 2 + go.sum | 5 + main.css | 35 +- pkg/app/api_handlers.go | 102 ++++ pkg/app/handlers.go | 52 ++ pkg/app/routes.go | 2 + pkg/database/measurement.go | 43 +- pkg/database/profile.go | 4 + pkg/database/user.go | 37 +- translations/en.yaml | 4 + vendor/github.com/stackus/hxgo/.gitignore | 2 + vendor/github.com/stackus/hxgo/LICENSE | 19 + vendor/github.com/stackus/hxgo/README.md | 363 +++++++++++ .../stackus/hxgo/golangish-htmxish-logo.png | Bin 0 -> 129498 bytes .../github.com/stackus/hxgo/hxecho/request.go | 77 +++ .../stackus/hxgo/hxecho/response.go | 40 ++ .../stackus/hxgo/location_options.go | 110 ++++ vendor/github.com/stackus/hxgo/request.go | 127 ++++ vendor/github.com/stackus/hxgo/response.go | 139 +++++ .../stackus/hxgo/response_options.go | 96 +++ .../github.com/stackus/hxgo/reswap_options.go | 149 +++++ .../stackus/hxgo/trigger_options.go | 104 ++++ vendor/github.com/stackus/hxgo/types.go | 84 +++ vendor/gorm.io/datatypes/License | 21 + vendor/gorm.io/datatypes/README.md | 328 ++++++++++ vendor/gorm.io/datatypes/binuuid.go | 125 ++++ vendor/gorm.io/datatypes/date.go | 42 ++ vendor/gorm.io/datatypes/json.go | 562 ++++++++++++++++++ vendor/gorm.io/datatypes/json_map.go | 100 ++++ vendor/gorm.io/datatypes/json_type.go | 148 +++++ vendor/gorm.io/datatypes/null.go | 417 +++++++++++++ vendor/gorm.io/datatypes/test_all.sh | 10 + vendor/gorm.io/datatypes/time.go | 123 ++++ vendor/gorm.io/datatypes/url.go | 66 ++ vendor/gorm.io/datatypes/uuid.go | 94 +++ vendor/modules.txt | 7 + views/helpers/icons.go | 1 + views/user/daily.templ | 124 +++- views/user/daily_templ.go | 389 ++++++++++-- 43 files changed, 4524 insertions(+), 75 deletions(-) create mode 100644 vendor/github.com/stackus/hxgo/.gitignore create mode 100644 vendor/github.com/stackus/hxgo/LICENSE create mode 100644 vendor/github.com/stackus/hxgo/README.md create mode 100644 vendor/github.com/stackus/hxgo/golangish-htmxish-logo.png create mode 100644 vendor/github.com/stackus/hxgo/hxecho/request.go create mode 100644 vendor/github.com/stackus/hxgo/hxecho/response.go create mode 100644 vendor/github.com/stackus/hxgo/location_options.go create mode 100644 vendor/github.com/stackus/hxgo/request.go create mode 100644 vendor/github.com/stackus/hxgo/response.go create mode 100644 vendor/github.com/stackus/hxgo/response_options.go create mode 100644 vendor/github.com/stackus/hxgo/reswap_options.go create mode 100644 vendor/github.com/stackus/hxgo/trigger_options.go create mode 100644 vendor/github.com/stackus/hxgo/types.go create mode 100644 vendor/gorm.io/datatypes/License create mode 100644 vendor/gorm.io/datatypes/README.md create mode 100644 vendor/gorm.io/datatypes/binuuid.go create mode 100644 vendor/gorm.io/datatypes/date.go create mode 100644 vendor/gorm.io/datatypes/json.go create mode 100644 vendor/gorm.io/datatypes/json_map.go create mode 100644 vendor/gorm.io/datatypes/json_type.go create mode 100644 vendor/gorm.io/datatypes/null.go create mode 100644 vendor/gorm.io/datatypes/test_all.sh create mode 100644 vendor/gorm.io/datatypes/time.go create mode 100644 vendor/gorm.io/datatypes/url.go create mode 100644 vendor/gorm.io/datatypes/uuid.go diff --git a/assets/output.css b/assets/output.css index acca0c69..eab49f27 100644 --- a/assets/output.css +++ b/assets/output.css @@ -1 +1 @@ -*,:after,:before{--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:rgba(59,130,246,.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: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::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:rgba(59,130,246,.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: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}@media print{.pagebreak{clear:both;page-break-after:always}}.icon-decoration{margin-right:.5rem;vertical-align:baseline}.full-size{height:100dvh;flex-basis:100%}.small-size{flex-basis:50%}@media (min-width:1536px){.small-size{flex-basis:33.333333%}}.leaflet-control:where(.dark,.dark *),.leaflet-tooltip:where(.dark,.dark *),.map-tiles:where(.dark,.dark *){--tw-brightness:brightness(0.85);--tw-contrast:contrast(0.80);--tw-invert:invert(100%);--tw-saturate:saturate(0);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}.leaflet-popup-content-wrapper:where(.dark,.dark *),.leaflet-popup-tip:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}@media (min-width:768px){body{padding-left:5rem;padding-right:5rem}}body{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}body:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}ol{list-style-type:decimal}ol,ul{margin-top:1.25rem;margin-bottom:1.25rem;list-style-position:inside}ul{list-style-type:disc}.dirty{margin:.25rem;display:inline-block;min-width:150px;border-radius:9999px;border-width:1px;padding:.5rem 1.25rem;text-align:center}.dirty:hover{--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.dirty{border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}.dirty:where(.dark,.dark *){border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}.dirty{font-size:.875rem;line-height:1.25rem;--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity,1));--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.dirty:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1));--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}input,select,textarea{border-radius:.75rem;border-width:1px;padding:.5rem 1.5rem;--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity,1))}input::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}input::placeholder,select::placeholder,textarea::placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}input:where(.dark,.dark *),select:where(.dark,.dark *),textarea:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}input:where(.dark,.dark *)::-moz-placeholder,select:where(.dark,.dark *)::-moz-placeholder,textarea:where(.dark,.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}input:where(.dark,.dark *)::placeholder,select:where(.dark,.dark *)::placeholder,textarea:where(.dark,.dark *)::placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}input:focus,input:hover,select:focus,select:hover,textarea:focus,textarea:hover{--tw-brightness:brightness(1.25);--tw-contrast:contrast(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}button.edit,button.share{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity,1))}button.edit:where(.dark,.dark *),button.share:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}button.dangerous{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity,1))}button.dangerous:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity,1))}button{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}button:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}button{margin-left:.5rem;margin-right:.5rem;border-radius:.75rem;border-width:1px;padding:.5rem 1.5rem;font-weight:700}button:focus,button:hover{--tw-brightness:brightness(1.25);--tw-contrast:contrast(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}h2{margin-left:.5rem;margin-right:.5rem;margin-bottom:1.25rem;padding-left:.5rem;padding-right:.5rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){h2{font-size:1.5rem;line-height:2rem}}h2{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity,1))}h2:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}h3{margin-bottom:1.25rem;font-size:1rem;line-height:1.5rem}@media (min-width:768px){h3{font-size:1.25rem;line-height:1.75rem}}h3{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity,1))}h3:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}a:hover{--tw-brightness:brightness(1.25);--tw-contrast:contrast(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}form{margin-top:1.25rem;margin-bottom:1.25rem;tr{margin-bottom:.5rem;gap:1rem}tr{label{display:block;padding-top:.25rem;padding-bottom:.25rem;text-align:right}}label{padding-left:.5rem;padding-right:.5rem}}.note{border-left-width:2px;--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity,1));padding:.25rem .25rem .25rem .75rem;font-size:.75rem;line-height:1rem;--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.note:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.footer{display:flex;justify-content:center;gap:2.5rem}.content a,.footer a{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.content a:where(.dark,.dark *),.footer a:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity,1))}.footer,.menu{align-items:baseline;padding:.75rem 1.5rem;--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.footer:where(.dark,.dark *),.menu:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.footer,.menu{@media print{>div{display:none}}}.footer{margin-top:.5rem;border-top-left-radius:.75rem;border-top-right-radius:.75rem}.menu{margin-bottom:.5rem;border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem;a{margin-top:1.25rem;margin-right:1.25rem}a{span.autohide{display:none}@media (min-width:768px){span.autohide{display:contents}}}h1{margin-bottom:.75rem;border-bottom-width:2px;padding-bottom:.75rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){h1{margin-bottom:0;border-bottom-width:0;padding-bottom:0;font-size:1.875rem;line-height:2.25rem}}h1{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1));--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}h1:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}}.actions{float:right;display:flex;align-items:baseline;gap:.75rem}@media print{.actions{display:none}}.actions{>button,>form{margin-top:0;margin-bottom:0}>button,>form{>button{margin-left:0;margin-right:0;border-radius:.375rem;padding-left:.5rem;padding-right:.5rem;padding-top:.25rem;padding-bottom:.25rem}>button{a,a:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}a:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}a:hover:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}a{text-align:center}}}}.content{border-radius:.75rem;padding:1.25rem .25rem}@media (min-width:768px){.content{padding-left:2.5rem;padding-right:2.5rem}}.content{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}.content:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}.inner-form{margin:.5rem;border-radius:.75rem;border-width:1px;padding:.5rem}@media (min-width:768px){.inner-form{padding:1.25rem}}@media print{.inner-form{border-width:0}}.inner-form{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity,1))}.inner-form:hover{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}.inner-form:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity,1))}.inner-form:hover:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}.version-notice{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity,1))}.version-notice:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity,1))}.notice{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.notice:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.alert{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.alert:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.alert,.notice,.version-notice{border-width:1px;position:relative;margin:1.25rem;border-radius:.375rem;padding:.75rem 1rem;a{text-decoration-line:underline}}.workouts_list_details div{width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.recent-activity .workouts_list_details div{width:auto;min-width:100px;max-width:150px}table{width:100%;table-layout:auto;border-width:1px;text-align:left;font-size:.875rem;line-height:1.25rem;--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}table:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}table{tfoot,thead{font-weight:700;text-transform:uppercase;--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}tfoot:where(.dark,.dark *),thead:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}tfoot:where(.dark,.dark *),thead:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}tfoot,thead{tr{border-width:1px;--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}tr:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}}td,th{padding:.5rem}@media print{td,th{padding:0}}td,th{vertical-align:top}th{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}th:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}tbody{tr:nth-child(odd){--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity,1))}tr:nth-child(2n){background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}tr:hover,tr:nth-child(2n){--tw-bg-opacity:1}tr:hover{background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}tr:nth-child(odd):where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity,1))}tr:nth-child(2n):where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}tr:hover:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity,1))}}}.workout-info{td,th{padding-left:.5rem;padding-right:.5rem}tr{margin-bottom:.5rem}}.modal{position:fixed;inset:0;z-index:3000;display:none;height:100%;width:100%;overflow-y:auto;padding-left:1rem;padding-right:1rem;background-color:rgb(243 244 246/var(--tw-bg-opacity,1));--tw-bg-opacity:0.8}.modal:where(.dark,.dark *){background-color:rgb(17 24 39/var(--tw-bg-opacity,1));--tw-bg-opacity:0.6}.modal{.window{position:relative;top:10rem;margin-left:auto;margin-right:auto;max-width:28rem;border-radius:1.5rem;--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1))}.window:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity,1))}.window{button.close-modal{a{margin-left:auto;display:inline-flex;border-radius:.5rem;background-color:transparent;padding:.375rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}a:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}a:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}a:hover:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}a:hover:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}}.modal-content{padding:1.5rem;padding-top:0;text-align:center}.modal-content{h3{margin-top:.75rem;margin-bottom:2.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:400;--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}h3:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}button{display:inline-flex;align-items:center;border-radius:.5rem;padding-left:.75rem;padding-right:.75rem;padding-top:.625rem;padding-bottom:.625rem;text-align:center;font-size:1rem;line-height:1.5rem;font-weight:500}button: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(4px + 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)}button.confirm{margin-right:.5rem;--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}button.confirm:hover{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity,1))}button.confirm:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity,1))}button.confirm:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}button.confirm:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}button.confirm:hover:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}button.confirm:focus:where(.dark,.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(185 28 28/var(--tw-ring-opacity,1))}button.cancel{border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}button.cancel:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}button.cancel:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(165 243 252/var(--tw-ring-opacity,1))}button.cancel:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity,1))}button.cancel:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}button.cancel:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}button.cancel:hover:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}button.cancel:focus:where(.dark,.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(21 94 117/var(--tw-ring-opacity,1))}}}}.user-pill{margin:.25rem;display:inline-block;min-width:150px;border-radius:9999px;border-width:1px;padding:.5rem 1.25rem;text-align:center}.user-pill:hover{--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.user-pill{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}.user-pill:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}.selectable-pill{margin:.25rem;display:inline-block;min-width:150px;border-radius:9999px;border-width:1px;padding:.5rem 1.25rem;text-align:center}.selectable-pill:hover{--tw-brightness:brightness(1.1)}.selectable-pill{border-color:rgb(115 115 115/var(--tw-border-opacity,1));background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}.selectable-pill:where(.dark,.dark *){border-color:rgb(115 115 115/var(--tw-border-opacity,1));background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}.selectable-pill{cursor:pointer}.selectable-pill:hover{--tw-brightness:brightness(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.selectable-pill{background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}.peer:checked~.selectable-pill,.selectable-pill{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1));--tw-bg-opacity:1}.peer:checked~.selectable-pill{background-color:rgb(74 222 128/var(--tw-bg-opacity,1))}.selectable-pill:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity,1))}.peer:checked~.selectable-pill:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity,1))}.workout-item{min-height:150px;border-radius:.75rem;border-width:1px;padding:.5rem 1.25rem}.workout-item:hover{--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.workout-item{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}.workout-item:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}.workout-item{.meta{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity,1))}.meta:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity,1))}}.vanish{margin-top:0;margin-bottom:0;max-height:0;border-width:0;padding-top:0;padding-bottom:0;opacity:0;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:1s}.input-ellipsis{width:100%;max-width:-moz-max-content;max-width:max-content;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.icon-\[fa-solid--check\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E")}.icon-\[fa-solid--check\],.icon-\[fa-solid--times\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa-solid--times\]{width:.69em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='352' height='512'%3E%3Cpath d='m242.72 256 100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48z'/%3E%3C/svg%3E")}.icon-\[fa-solid--user-circle\]{width:.97em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='496' height='512'%3E%3Cpath d='M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8m0 96c48.6 0 88 39.4 88 88s-39.4 88-88 88-88-39.4-88-88 39.4-88 88-88m0 344c-58.7 0-111.3-26.6-146.5-68.2 18.8-35.4 55.6-59.8 98.5-59.8 2.4 0 4.8.4 7.1 1.1 13 4.2 26.6 6.9 40.9 6.9s28-2.7 40.9-6.9c2.3-.7 4.7-1.1 7.1-1.1 42.9 0 79.7 24.4 98.5 59.8C359.3 421.4 306.7 448 248 448'/%3E%3C/svg%3E")}.icon-\[fa-solid--user-circle\],.icon-\[fa6-regular--calendar\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-regular--calendar\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M152 24c0-13.3-10.7-24-24-24s-24 10.7-24 24v40H64C28.7 64 0 92.7 0 128v320c0 35.3 28.7 64 64 64h320c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64h-40V24c0-13.3-10.7-24-24-24s-24 10.7-24 24v40H152zM48 192h352v256c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16z'/%3E%3C/svg%3E")}.icon-\[fa6-regular--clock\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M464 256a208 208 0 1 1-416 0 208 208 0 1 1 416 0M0 256a256 256 0 1 0 512 0 256 256 0 1 0-512 0m232-136v136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2V120c0-13.3-10.7-24-24-24s-24 10.7-24 24'/%3E%3C/svg%3E")}.icon-\[fa6-regular--clock\],.icon-\[fa6-regular--hourglass\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-regular--hourglass\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M24 0C10.7 0 0 10.7 0 24s10.7 24 24 24h8v19c0 40.3 16 79 44.5 107.5l81.6 81.5-81.6 81.5C48 366 32 404.7 32 445v19h-8c-13.3 0-24 10.7-24 24s10.7 24 24 24h336c13.3 0 24-10.7 24-24s-10.7-24-24-24h-8v-19c0-40.3-16-79-44.5-107.5L225.9 256l81.5-81.5C336 146 352 107.3 352 67V48h8c13.3 0 24-10.7 24-24S373.3 0 360 0zm168 289.9 81.5 81.5C293 391 304 417.4 304 445v19H80v-19c0-27.6 11-54 30.5-73.5zm0-67.9-81.5-81.5C91 121 80 94.6 80 67V48h224v19c0 27.6-11 54-30.5 73.5L192 222.1z'/%3E%3C/svg%3E")}.icon-\[fa6-regular--rectangle-list\]{width:1.13em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M64 80c-8.8 0-16 7.2-16 16v320c0 8.8 7.2 16 16 16h448c8.8 0 16-7.2 16-16V96c0-8.8-7.2-16-16-16zM0 96c0-35.3 28.7-64 64-64h448c35.3 0 64 28.7 64 64v320c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64zm96 64a32 32 0 1 1 64 0 32 32 0 1 1-64 0m104 0c0-13.3 10.7-24 24-24h224c13.3 0 24 10.7 24 24s-10.7 24-24 24H224c-13.3 0-24-10.7-24-24m0 96c0-13.3 10.7-24 24-24h224c13.3 0 24 10.7 24 24s-10.7 24-24 24H224c-13.3 0-24-10.7-24-24m0 96c0-13.3 10.7-24 24-24h224c13.3 0 24 10.7 24 24s-10.7 24-24 24H224c-13.3 0-24-10.7-24-24m-72-64a32 32 0 1 1 0-64 32 32 0 1 1 0 64m-32 64a32 32 0 1 1 64 0 32 32 0 1 1-64 0'/%3E%3C/svg%3E")}.icon-\[fa6-regular--rectangle-list\],.icon-\[fa6-solid--arrow-down-long\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--arrow-down-long\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M169.4 502.6c12.5 12.5 32.8 12.5 45.3 0l128-128c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 402.7V32c0-17.7-14.3-32-32-32s-32 14.3-32 32v370.7l-73.4-73.3c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l128 128z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--arrow-right-arrow-left\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M438.6 150.6c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.7 96H32c-17.7 0-32 14.3-32 32s14.3 32 32 32h306.7l-41.4 41.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96zm-333.3 352c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 416H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H109.3l41.4-41.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--arrow-right-arrow-left\],.icon-\[fa6-solid--arrow-up-long\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--arrow-up-long\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M214.6 9.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l73.4-73.4V480c0 17.7 14.3 32 32 32s32-14.3 32-32V109.3l73.4 73.4c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-128-128z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--arrows-left-right\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='m406.6 374.6 96-96c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l41.4 41.4H109.2l41.4-41.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 288h293.5l-41.4 41.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--arrows-left-right\],.icon-\[fa6-solid--arrows-rotate\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--arrows-rotate\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M105.1 202.6c7.7-21.8 20.2-42.3 37.8-59.8 62.5-62.5 163.8-62.5 226.3 0l17.1 17.2H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h111.9c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v35.2l-17.5-17.6c-87.5-87.5-229.3-87.5-316.8 0-24.4 24.4-42 53.1-52.8 83.8-5.9 16.7 2.9 34.9 19.5 40.8s34.9-2.9 40.8-19.5zM39 289.3c-5 1.5-9.8 4.2-13.7 8.2-4 4-6.7 8.8-8.1 14-.3 1.2-.6 2.5-.8 3.8-.3 1.7-.4 3.4-.4 5.1V432c0 17.7 14.3 32 32 32s32-14.3 32-32v-35.1l17.6 17.5c87.5 87.4 229.3 87.4 316.7 0 24.4-24.4 42.1-53.1 52.9-83.8 5.9-16.7-2.9-34.9-19.5-40.8s-34.9 2.9-40.8 19.5c-7.7 21.8-20.2 42.3-37.8 59.8-62.5 62.5-163.8 62.5-226.3 0l-.1-.1-17.1-17H160c17.7 0 32-14.3 32-32s-14.3-32-32-32H48.4q-2.4 0-4.8.3c-2.4.3-3.1.5-4.6 1'/%3E%3C/svg%3E")}.icon-\[fa6-solid--bicycle\]{display:inline-block;width:1.25em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M312 32c-13.3 0-24 10.7-24 24s10.7 24 24 24h25.7l34.6 64H222.9l-27.4-38c-4.5-6.3-11.8-10-19.5-10h-56c-13.3 0-24 10.7-24 24s10.7 24 24 24h43.7l22.1 30.7-26.6 53.1c-10-2.5-20.5-3.8-31.2-3.8C57.3 224 0 281.3 0 352s57.3 128 128 128c65.3 0 119.1-48.9 127-112h49c8.5 0 16.3-4.5 20.7-11.8l84.8-143.5 21.7 40.1C402.4 276.3 384 312 384 352c0 70.7 57.3 128 128 128s128-57.3 128-128-57.3-128-128-128c-13.5 0-26.5 2.1-38.7 6L375.4 48.8C369.8 38.4 359 32 347.2 32zm146.6 271.7 32.3 59.7c6.3 11.7 20.9 16 32.5 9.7s16-20.9 9.7-32.5l-32.3-59.7c3.6-.6 7.4-.9 11.2-.9 39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72c0-18.6 7-35.5 18.6-48.3M133.2 368h65c-7.3 32.1-36 56-70.2 56-39.8 0-72-32.2-72-72s32.2-72 72-72c1.7 0 3.4.1 5.1.2l-24.2 48.5c-9 18.1 4.1 39.4 24.3 39.4zm33.7-48 50.7-101.3 72.9 101.2-.1.1zm90.6-128H366l-49 82.8-59.6-82.8z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--bookmark\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M0 48v439.7C0 501.1 10.9 512 24.3 512c5 0 9.9-1.5 14-4.4L192 400l153.7 107.6c4.1 2.9 9 4.4 14 4.4 13.4 0 24.3-10.9 24.3-24.3V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48'/%3E%3C/svg%3E")}.icon-\[fa6-solid--bookmark\],.icon-\[fa6-solid--calculator\]{display:inline-block;width:.75em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--calculator\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M64 0C28.7 0 0 28.7 0 64v384c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zm32 64h192c17.7 0 32 14.3 32 32v32c0 17.7-14.3 32-32 32H96c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32m32 160a32 32 0 1 1-64 0 32 32 0 1 1 64 0M96 352a32 32 0 1 1 0-64 32 32 0 1 1 0 64m-32 64c0-17.7 14.3-32 32-32h96c17.7 0 32 14.3 32 32s-14.3 32-32 32H96c-17.7 0-32-14.3-32-32m128-160a32 32 0 1 1 0-64 32 32 0 1 1 0 64m32 64a32 32 0 1 1-64 0 32 32 0 1 1 64 0m64-64a32 32 0 1 1 0-64 32 32 0 1 1 0 64m32 64a32 32 0 1 1-64 0 32 32 0 1 1 64 0m-32 128a32 32 0 1 1 0-64 32 32 0 1 1 0 64'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chart-line\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M64 64c0-17.7-14.3-32-32-32S0 46.3 0 64v336c0 44.2 35.8 80 80 80h400c17.7 0 32-14.3 32-32s-14.3-32-32-32H80c-8.8 0-16-7.2-16-16zm406.6 86.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L320 210.7l-57.4-57.4c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l89.4-89.3 57.4 57.4c12.5 12.5 32.8 12.5 45.3 0l128-128z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chart-line\],.icon-\[fa6-solid--chart-simple\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--chart-simple\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M160 80c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48zM0 272c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v160c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48zM368 96h32c26.5 0 48 21.5 48 48v288c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48V144c0-26.5 21.5-48 48-48'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chevron-down\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chevron-down\],.icon-\[fa6-solid--chevron-right\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--chevron-right\]{width:.63em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='512'%3E%3Cpath d='M310.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L242.7 256 73.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chevron-up\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M233.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L256 173.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chevron-up\],.icon-\[fa6-solid--circle-exclamation\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--circle-exclamation\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M256 512a256 256 0 1 0 0-512 256 256 0 1 0 0 512m0-384c13.3 0 24 10.7 24 24v112c0 13.3-10.7 24-24 24s-24-10.7-24-24V152c0-13.3 10.7-24 24-24m-32 224a32 32 0 1 1 64 0 32 32 0 1 1-64 0'/%3E%3C/svg%3E")}.icon-\[fa6-solid--circle-notch\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M222.7 32.1c5 16.9-4.6 34.8-21.5 39.8C121.8 95.6 64 169.1 64 256c0 106 86 192 192 192s192-86 192-192c0-86.9-57.8-160.4-137.1-184.1-16.9-5-26.6-22.9-21.5-39.8s22.9-26.6 39.8-21.5C434.9 42.1 512 140 512 256c0 141.4-114.6 256-256 256S0 397.4 0 256C0 140 77.1 42.1 182.9 10.6c16.9-5 34.8 4.6 39.8 21.5'/%3E%3C/svg%3E")}.icon-\[fa6-solid--circle-notch\],.icon-\[fa6-solid--circle-plus\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--circle-plus\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M256 512a256 256 0 1 0 0-512 256 256 0 1 0 0 512m-24-168v-64h-64c-13.3 0-24-10.7-24-24s10.7-24 24-24h64v-64c0-13.3 10.7-24 24-24s24 10.7 24 24v64h64c13.3 0 24 10.7 24 24s-10.7 24-24 24h-64v64c0 13.3-10.7 24-24 24s-24-10.7-24-24'/%3E%3C/svg%3E")}.icon-\[fa6-solid--clipboard\]{display:inline-block;width:.75em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M192 0c-41.8 0-77.4 26.7-90.5 64H64C28.7 64 0 92.7 0 128v320c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64h-37.5C269.4 26.7 233.8 0 192 0m0 64a32 32 0 1 1 0 64 32 32 0 1 1 0-64m-80 128h160c8.8 0 16 7.2 16 16s-7.2 16-16 16H112c-8.8 0-16-7.2-16-16s7.2-16 16-16'/%3E%3C/svg%3E")}.icon-\[fa6-solid--compass\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M256 512a256 256 0 1 0 0-512 256 256 0 1 0 0 512m50.7-186.9-144.3 55.5c-19.4 7.5-38.5-11.6-31-31l55.5-144.3c3.3-8.5 9.9-15.1 18.4-18.4l144.3-55.5c19.4-7.5 38.5 11.6 31 31l-55.5 144.3c-3.2 8.5-9.9 15.1-18.4 18.4M288 256a32 32 0 1 0-64 0 32 32 0 1 0 64 0'/%3E%3C/svg%3E")}.icon-\[fa6-solid--compass\],.icon-\[fa6-solid--crosshairs\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--crosshairs\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M256 0c17.7 0 32 14.3 32 32v10.4c93.7 13.9 167.7 88 181.6 181.6H480c17.7 0 32 14.3 32 32s-14.3 32-32 32h-10.4c-13.9 93.7-88 167.7-181.6 181.6V480c0 17.7-14.3 32-32 32s-32-14.3-32-32v-10.4C130.3 455.7 56.3 381.7 42.4 288H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h10.4C56.3 130.3 130.3 56.3 224 42.4V32c0-17.7 14.3-32 32-32M107.4 288c12.5 58.3 58.4 104.1 116.6 116.6V384c0-17.7 14.3-32 32-32s32 14.3 32 32v20.6c58.3-12.5 104.1-58.4 116.6-116.6H384c-17.7 0-32-14.3-32-32s14.3-32 32-32h20.6c-12.5-58.3-58.3-104.1-116.6-116.6V128c0 17.7-14.3 32-32 32s-32-14.3-32-32v-20.6c-58.3 12.5-104.1 58.3-116.6 116.6H128c17.7 0 32 14.3 32 32s-14.3 32-32 32zM256 224a32 32 0 1 1 0 64 32 32 0 1 1 0-64'/%3E%3C/svg%3E")}.icon-\[fa6-solid--download\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M288 32c0-17.7-14.3-32-32-32s-32 14.3-32 32v242.7l-73.4-73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l128 128c12.5 12.5 32.8 12.5 45.3 0l128-128c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L288 274.7zM64 352c-35.3 0-64 28.7-64 64v32c0 35.3 28.7 64 64 64h384c35.3 0 64-28.7 64-64v-32c0-35.3-28.7-64-64-64H346.5l-45.3 45.3c-25 25-65.5 25-90.5 0L165.5 352zm368 56a24 24 0 1 1 0 48 24 24 0 1 1 0-48'/%3E%3C/svg%3E")}.icon-\[fa6-solid--dumbbell\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M96 64c0-17.7 14.3-32 32-32h32c17.7 0 32 14.3 32 32v384c0 17.7-14.3 32-32 32h-32c-17.7 0-32-14.3-32-32v-64H64c-17.7 0-32-14.3-32-32v-64c-17.7 0-32-14.3-32-32s14.3-32 32-32v-64c0-17.7 14.3-32 32-32h32zm448 0v64h32c17.7 0 32 14.3 32 32v64c17.7 0 32 14.3 32 32s-14.3 32-32 32v64c0 17.7-14.3 32-32 32h-32v64c0 17.7-14.3 32-32 32h-32c-17.7 0-32-14.3-32-32V64c0-17.7 14.3-32 32-32h32c17.7 0 32 14.3 32 32M416 224v64H224v-64z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--dumbbell\],.icon-\[fa6-solid--eye-slash\]{display:inline-block;width:1.25em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--eye-slash\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2s-6.3 25.5 4.1 33.7l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7l-105.2-82.4c39.6-40.6 66.4-86.1 79.9-118.4 3.3-7.9 3.3-16.7 0-24.6-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8zm184.3 144.4c25.5-23.3 59.6-37.5 96.9-37.5 79.5 0 144 64.5 144 144 0 24.9-6.3 48.3-17.4 68.7L408 294.5c8.4-19.3 10.6-41.4 4.8-63.3-11.1-41.5-47.8-69.4-88.6-71.1-5.8-.2-9.2 6.1-7.4 11.7 2.1 6.4 3.3 13.2 3.3 20.3 0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zM373 389.9c-16.4 6.5-34.3 10.1-53 10.1-79.5 0-144-64.5-144-144 0-6.9.5-13.6 1.4-20.2l-94.3-74.3c-22.8 29.7-39.1 59.3-48.6 82.2-3.3 7.9-3.3 16.7 0 24.6 14.9 35.7 46.2 87.7 93 131.1 47 43.8 111.7 80.6 192.5 80.6 47.8 0 89.9-12.9 126.2-32.5z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--eye\]{width:1.13em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4 142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1 3.3-7.9 3.3-16.7 0-24.6-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32M144 256a144 144 0 1 1 288 0 144 144 0 1 1-288 0m144-64c0 35.3-28.7 64-64 64-7.1 0-13.9-1.2-20.3-3.3-5.5-1.8-11.9 1.6-11.7 7.4.3 6.9 1.3 13.8 3.2 20.7 13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-11.1-41.5-47.8-69.4-88.6-71.1-5.8-.2-9.2 6.1-7.4 11.7 2.1 6.4 3.3 13.2 3.3 20.3'/%3E%3C/svg%3E")}.icon-\[fa6-solid--eye\],.icon-\[fa6-solid--file\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--file\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M0 64C0 28.7 28.7 0 64 0h160v128c0 17.7 14.3 32 32 32h128v288c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64zm384 64H256V0z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--fire\]{display:inline-block;width:.88em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M159.3 5.4c7.8-7.3 19.9-7.2 27.7.1 27.6 25.9 53.5 53.8 77.7 84 11-14.4 23.5-30.1 37-42.9 7.9-7.4 20.1-7.4 28 .1 34.6 33 63.9 76.6 84.5 118 20.3 40.8 33.8 82.5 33.8 111.9C448 404.2 348.2 512 224 512 98.4 512 0 404.1 0 276.5c0-38.4 17.8-85.3 45.4-131.7C73.3 97.7 112.7 48.6 159.3 5.4M225.7 416c25.3 0 47.7-7 68.8-21 42.1-29.4 53.4-88.2 28.1-134.4-4.5-9-16-9.6-22.5-2l-25.2 29.3c-6.6 7.6-18.5 7.4-24.7-.5-16.5-21-46-58.5-62.8-79.8-6.3-8-18.3-8.1-24.7-.1-33.8 42.5-50.8 69.3-50.8 99.4.1 68.5 50.7 109.1 113.8 109.1'/%3E%3C/svg%3E")}.icon-\[fa6-solid--gauge-high\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M0 256a256 256 0 1 1 512 0 256 256 0 1 1-512 0M288 96a32 32 0 1 0-64 0 32 32 0 1 0 64 0m-32 320c35.3 0 64-28.7 64-64 0-17.4-6.9-33.1-18.1-44.6L366 161.7c5.3-12.1-.2-26.3-12.3-31.6s-26.3.2-31.6 12.3L257.9 288H256c-35.3 0-64 28.7-64 64s28.7 64 64 64m-80-272a32 32 0 1 0-64 0 32 32 0 1 0 64 0M96 288a32 32 0 1 0 0-64 32 32 0 1 0 0 64m352-32a32 32 0 1 0-64 0 32 32 0 1 0 64 0'/%3E%3C/svg%3E")}.icon-\[fa6-solid--gauge-high\],.icon-\[fa6-solid--gauge\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--gauge\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M0 256a256 256 0 1 1 512 0 256 256 0 1 1-512 0m320 96c0-26.9-16.5-49.9-40-59.3V88c0-13.3-10.7-24-24-24s-24 10.7-24 24v204.7c-23.5 9.5-40 32.5-40 59.3 0 35.3 28.7 64 64 64s64-28.7 64-64M144 176a32 32 0 1 0 0-64 32 32 0 1 0 0 64m-16 80a32 32 0 1 0-64 0 32 32 0 1 0 64 0m288 32a32 32 0 1 0 0-64 32 32 0 1 0 0 64m-16-144a32 32 0 1 0-64 0 32 32 0 1 0 64 0'/%3E%3C/svg%3E")}.icon-\[fa6-solid--gear\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M495.9 166.6c3.2 8.7.5 18.4-6.4 24.6l-43.3 39.4c1.1 8.3 1.7 16.8 1.7 25.4s-.6 17.1-1.7 25.4l43.3 39.4c6.9 6.2 9.6 15.9 6.4 24.6-4.4 11.9-9.7 23.3-15.8 34.3l-4.7 8.1c-6.6 11-14 21.4-22.1 31.2-5.9 7.2-15.7 9.6-24.5 6.8l-55.7-17.7c-13.4 10.3-28.2 18.9-44 25.4l-12.5 57.1c-2 9.1-9 16.3-18.2 17.8-13.8 2.3-28 3.5-42.5 3.5s-28.7-1.2-42.5-3.5c-9.2-1.5-16.2-8.7-18.2-17.8l-12.5-57.1c-15.8-6.5-30.6-15.1-44-25.4l-55.6 17.8c-8.8 2.8-18.6.3-24.5-6.8-8.1-9.8-15.5-20.2-22.1-31.2l-4.7-8.1c-6.1-11-11.4-22.4-15.8-34.3-3.2-8.7-.5-18.4 6.4-24.6l43.3-39.4c-1.1-8.4-1.7-16.9-1.7-25.5s.6-17.1 1.7-25.4l-43.3-39.4c-6.9-6.2-9.6-15.9-6.4-24.6 4.4-11.9 9.7-23.3 15.8-34.3l4.7-8.1c6.6-11 14-21.4 22.1-31.2 5.9-7.2 15.7-9.6 24.5-6.8l55.7 17.7c13.4-10.3 28.2-18.9 44-25.4l12.5-57.1c2-9.1 9-16.3 18.2-17.8C227.3 1.2 241.5 0 256 0s28.7 1.2 42.5 3.5c9.2 1.5 16.2 8.7 18.2 17.8l12.5 57.1c15.8 6.5 30.6 15.1 44 25.4l55.7-17.7c8.8-2.8 18.6-.3 24.5 6.8 8.1 9.8 15.5 20.2 22.1 31.2l4.7 8.1c6.1 11 11.4 22.4 15.8 34.3zM256 336a80 80 0 1 0 0-160 80 80 0 1 0 0 160'/%3E%3C/svg%3E")}.icon-\[fa6-solid--gear\],.icon-\[fa6-solid--golf-ball-tee\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--golf-ball-tee\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M384 192c0 66.8-34.1 125.6-85.8 160H85.8C34.1 317.6 0 258.8 0 192 0 86 86 0 192 0s192 86 192 192m-141.9 64.6c0 18.5-15 33.5-33.5 33.5-4.9 0-9.1 5.1-5.4 8.4 5.9 5.2 13.7 8.4 22.1 8.4 18.5 0 33.5-15 33.5-33.5 0-8.5-3.2-16.2-8.4-22.1-3.3-3.7-8.4.5-8.4 5.4zm-52.3-49.3c-4.9 0-9.1 5.1-5.4 8.4 5.9 5.2 13.7 8.4 22.1 8.4 18.5 0 33.5-15 33.5-33.5 0-8.5-3.2-16.2-8.4-22.1-3.3-3.7-8.4.5-8.4 5.4 0 18.5-15 33.5-33.5 33.5zm113.5-17.5c0 18.5-15 33.5-33.5 33.5-4.9 0-9.1 5.1-5.4 8.4 5.9 5.2 13.7 8.4 22.1 8.4 18.5 0 33.5-15 33.5-33.5 0-8.5-3.2-16.2-8.4-22.1-3.3-3.7-8.4.5-8.4 5.4zM96 416c0-17.7 14.3-32 32-32h128c17.7 0 32 14.3 32 32s-14.3 32-32 32h-16c-8.8 0-16 7.2-16 16v16c0 17.7-14.3 32-32 32s-32-14.3-32-32v-16c0-8.8-7.2-16-16-16h-16c-17.7 0-32-14.3-32-32'/%3E%3C/svg%3E")}.icon-\[fa6-solid--heart-pulse\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M228.3 469.1 47.6 300.4c-4.2-3.9-8.2-8.1-11.9-12.4h87c22.6 0 43-13.6 51.7-34.5l10.5-25.2 49.3 109.5c3.8 8.5 12.1 14 21.4 14.1s17.8-5 22-13.3l42.4-84.9 1.7 3.4c9.5 19 28.9 31 50.1 31h104.5c-3.7 4.3-7.7 8.5-11.9 12.4L283.7 469.1c-7.5 7-17.4 10.9-27.7 10.9s-20.2-3.9-27.7-10.9M503.7 240h-132c-3 0-5.8-1.7-7.2-4.4l-23.2-46.3c-4.1-8.1-12.4-13.3-21.5-13.3s-17.4 5.1-21.5 13.3l-41.4 82.8-51-113.9c-3.9-8.7-12.7-14.3-22.2-14.1s-18.1 5.9-21.8 14.8l-31.8 76.3c-1.2 3-4.2 4.9-7.4 4.9L16 240c-2.6 0-5 .4-7.3 1.1C3 225.2 0 208.2 0 190.9v-5.8c0-69.9 50.5-129.5 119.4-141 45.6-7.6 92 7.3 124.6 39.9l12 12 12-12c32.6-32.6 79-47.5 124.6-39.9 68.9 11.5 119.4 71.1 119.4 141v5.8c0 16.9-2.8 33.5-8.3 49.1'/%3E%3C/svg%3E")}.icon-\[fa6-solid--heart-pulse\],.icon-\[fa6-solid--language\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--language\]{width:1.25em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M0 128c0-35.3 28.7-64 64-64h512c35.3 0 64 28.7 64 64v256c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64zm320 0v256h256V128zm-141.7 47.9c-3.2-7.2-10.4-11.9-18.3-11.9s-15.1 4.7-18.3 11.9l-64 144c-4.5 10.1.1 21.9 10.2 26.4s21.9-.1 26.4-10.2l8.9-20.1h73.6l8.9 20.1c4.5 10.1 16.3 14.6 26.4 10.2s14.6-16.3 10.2-26.4zM160 233.2l19 42.8h-38zM448 164c11 0 20 9 20 20v4h60c11 0 20 9 20 20s-9 20-20 20h-2l-1.6 4.5c-8.9 24.4-22.4 46.6-39.6 65.4.9.6 1.8 1.1 2.7 1.6l18.9 11.3c9.5 5.7 12.5 18 6.9 27.4s-18 12.5-27.4 6.9L467 333.8c-4.5-2.7-8.8-5.5-13.1-8.5-10.6 7.5-21.9 14-34 19.4l-3.6 1.6c-10.1 4.5-21.9-.1-26.4-10.2s.1-21.9 10.2-26.4l3.6-1.6c6.4-2.9 12.6-6.1 18.5-9.8L410 286.1c-7.8-7.8-7.8-20.5 0-28.3s20.5-7.8 28.3 0l14.6 14.6.5.5c12.4-13.1 22.5-28.3 29.8-45l-35.2.1h-72c-11 0-20-9-20-20s9-20 20-20h52v-4c0-11 9-20 20-20'/%3E%3C/svg%3E")}.icon-\[fa6-solid--map-location-dot\]{display:inline-block;width:1.13em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M408 120c0 54.6-73.1 151.9-105.2 192-7.7 9.6-22 9.6-29.6 0C241.1 271.9 168 174.6 168 120 168 53.7 221.7 0 288 0s120 53.7 120 120m8 80.4c3.5-6.9 6.7-13.8 9.6-20.6.5-1.2 1-2.5 1.5-3.7l116-46.4c15.8-6.3 32.9 5.3 32.9 22.3v270.8c0 9.8-6 18.6-15.1 22.3L416 503zm-278.4-62.1c2.4 14.1 7.2 28.3 12.8 41.5 2.9 6.8 6.1 13.7 9.6 20.6v251.4L32.9 502.7C17.1 509 0 497.4 0 480.4V209.6c0-9.8 6-18.6 15.1-22.3l122.6-49zM327.8 332c13.9-17.4 35.7-45.7 56.2-77v249.3l-192-54.9V255c20.5 31.3 42.3 59.6 56.2 77 20.5 25.6 59.1 25.6 79.6 0M288 152a40 40 0 1 0 0-80 40 40 0 1 0 0 80'/%3E%3C/svg%3E")}.icon-\[fa6-solid--mountain\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M256 32c12.5 0 24.1 6.4 30.8 17l216.6 345.4c5.6 8.9 8.6 19.2 8.6 29.7 0 30.9-25 55.9-55.9 55.9H55.9C25 480 0 455 0 424.1c0-10.5 3-20.8 8.6-29.7L225.2 49c6.6-10.6 18.3-17 30.8-17m65 192-65-103.6-79.1 126.1 18.3 24.4c6.4 8.5 19.2 8.5 25.6 0l25.6-34.1c6-8.1 15.5-12.8 25.6-12.8z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--mountain\],.icon-\[fa6-solid--pen-to-square\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--pen-to-square\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0l-30.1 30 97.9 97.9 30.1-30.1c21.9-21.9 21.9-57.3 0-79.2zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5l167.3-167.4-98-98zM96 64c-53 0-96 43-96 96v256c0 53 43 96 96 96h256c53 0 96-43 96-96v-96c0-17.7-14.3-32-32-32s-32 14.3-32 32v96c0 17.7-14.3 32-32 32H96c-17.7 0-32-14.3-32-32V160c0-17.7 14.3-32 32-32h96c17.7 0 32-14.3 32-32s-14.3-32-32-32z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-hiking\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M192 48a48 48 0 1 1 96 0 48 48 0 1 1-96 0m51.3 182.7L224.2 307l49.7 49.7c9 9 14.1 21.2 14.1 33.9V480c0 17.7-14.3 32-32 32s-32-14.3-32-32v-82.7l-73.9-73.9c-15.8-15.8-22.2-38.6-16.9-60.3l20.4-84c8.3-34.1 42.7-54.9 76.7-46.4 19 4.8 35.6 16.4 46.4 32.7l28.4 42.6H336v-24c0-13.3 10.7-24 24-24s24 10.7 24 24v304c0 13.3-10.7 24-24 24s-24-10.7-24-24V272h-39.4c-16 0-31-8-39.9-21.4l-13.3-20zM81.1 471.9 117.3 334c3 4.2 6.4 8.2 10.1 11.9l41.9 41.9-26.4 100.3c-4.5 17.1-22 27.3-39.1 22.8s-27.3-22-22.8-39.1zm55.5-346-35.2 140.6c-3 12.1-14.9 19.9-27.2 17.9l-47.9-8c-14-2.3-22.9-16.3-19.2-30L31.9 155c9.5-34.8 41.1-59 77.2-59h4.2c15.6 0 27.1 14.7 23.3 29.8z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-hiking\],.icon-\[fa6-solid--person-running\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--person-running\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M320 48a48 48 0 1 0-96 0 48 48 0 1 0 96 0M125.7 175.5c9.9-9.9 23.4-15.5 37.5-15.5 1.9 0 3.8.1 5.6.3L137.6 254c-9.3 28 1.7 58.8 26.8 74.5l86.2 53.9-25.4 88.8c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l28.7-100.4c5.9-20.6-2.6-42.6-20.7-53.9L238 299l30.9-82.4 5.1 12.3c15 35.8 49.9 59.1 88.7 59.1H384c17.7 0 32-14.3 32-32s-14.3-32-32-32h-21.3c-12.9 0-24.6-7.8-29.5-19.7l-6.3-15c-14.6-35.1-44.1-61.9-80.5-73.1l-48.7-15C186.6 97.8 175 96 163.3 96c-31 0-60.8 12.3-82.7 34.3l-23.2 23.1c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l23.1-23.1zM91.2 352H32c-17.7 0-32 14.3-32 32s14.3 32 32 32h69.6c19 0 36.2-11.2 43.9-28.5l11.5-25.9-9.5-6a95.4 95.4 0 0 1-37.9-44.9z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-skiing\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M380.7 48a48 48 0 1 1 96 0 48 48 0 1 1-96 0M2.7 268.9c6.1-11.8 20.6-16.3 32.4-10.2l197.6 102.6 46.2-69.2-75.1-75.1c-14.6-14.6-20.4-33.9-18.4-52.1l108.8 52 39.3 39.3c16.2 16.2 18.7 41.5 6 60.6L289.8 391l128.7 66.8c13.6 7.1 29.8 7.2 43.6.3l15.2-7.6c11.9-5.9 26.3-1.1 32.2 10.7s1.1 26.3-10.7 32.2l-15.2 7.6c-27.5 13.7-59.9 13.5-87.2-.7l-383.5-199c-11.7-6.1-16.3-20.6-10.2-32.4M118.9 65.6l18.1 8.6 8.7-17.4c4-7.9 13.6-11.1 21.5-7.2s11.1 13.6 7.2 21.5L165.9 88l54.7 26.2c1.5-.7 3.1-1.4 4.7-2.1l83.4-33.4c34.2-13.7 72.8 4.2 84.5 39.2l17.1 51.2 52.1 26.1c15.8 7.9 22.2 27.1 14.3 42.9s-27.1 22.2-42.9 14.3l-58.1-29c-11.4-5.7-20-15.7-24.1-27.8l-5.8-17.3-27.3 12.1-6.8 3-6.7-3.2-153.5-73.5-9.2 18.4c-4 7.9-13.6 11.1-21.5 7.2s-11.1-13.6-7.2-21.5l9-18-17.6-8.4c-8-3.8-11.3-13.4-7.5-21.3s13.4-11.3 21.3-7.5z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-skiing\],.icon-\[fa6-solid--person-snowboarding\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--person-snowboarding\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M209.7 3.4c15.8-7.9 35-1.5 42.9 14.3l25 50 42.4 8.5c19.5 3.9 37.8 12.3 53.5 24.5l126.1 98.1c14 10.9 16.5 31 5.6 44.9s-31 16.5-44.9 5.6l-72.1-56.1-71.5 31.8 33.1 27.6c23.2 19.3 33.5 50 26.7 79.4l-17.4 75.2c-2.2 9.4-8.2 16.8-16.1 21l86.5 33.1c4.6 1.8 9.4 2.6 14.3 2.6H472c13.3 0 24 10.7 24 24s-10.7 24-24 24h-28.2c-10.8 0-21.4-2-31.5-5.8L60.1 371.3c-11.5-4.4-22-11.2-30.8-20L7 329c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.4 22.4c4 4 8.7 7.1 14 9.1l22.4 8.6c-.8-1.6-1.5-3.2-2.1-4.9-5.6-16.8 3.5-34.9 20.2-40.5l74.2-24.9v-53.2c0-24.2 13.7-46.4 35.4-57.2l45.2-22.6-7.5-1.5c-19.4-3.9-35.9-16.5-44.7-34.1l-25-50c-7.9-15.8-1.5-35 14.3-42.9M139 350.1 298 411c-2.1-5.6-2.6-11.9-1.1-18.2l17.4-75.2c1.4-5.9-.7-12-5.3-15.9l-52.8-44v18.8c0 20.7-13.2 39-32.8 45.5zM432 0a48 48 0 1 1 0 96 48 48 0 1 1 0-96'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-swimming\]{display:inline-block;width:1.13em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='m309.5 178.4 138.4 118.7c-1.6.9-3.2 2-4.8 3-18 12.4-40.1 20.3-59.2 20.3-19.6 0-40.8-7.7-59.2-20.3-22.1-15.5-51.6-15.5-73.7 0-17.1 11.8-38 20.3-59.2 20.3-10.1 0-21.1-2.2-31.9-6.2C163.1 193.2 262.2 96 384 96h64c17.7 0 32 14.3 32 32s-14.3 32-32 32h-64c-26.9 0-52.3 6.6-74.5 18.4M160 160a64 64 0 1 1-128 0 64 64 0 1 1 128 0m146.5 165.9c22.5 15.5 50 26.1 77.5 26.1 26.9 0 55.4-10.8 77.4-26.1 11.9-8.5 28.1-7.8 39.2 1.7 14.4 11.9 32.5 21 50.6 25.2 17.2 4 27.9 21.2 23.9 38.4s-21.2 27.9-38.4 23.9c-24.5-5.7-44.9-16.5-58.2-25-29 15.6-61.5 25.9-94.5 25.9-31.9 0-60.6-9.9-80.4-18.9-5.8-2.7-11.1-5.3-15.6-7.7-4.5 2.4-9.7 5.1-15.6 7.7-19.8 9-48.5 18.9-80.4 18.9-33 0-65.5-10.3-94.5-25.8-13.4 8.4-33.7 19.3-58.2 25-17.2 4-34.4-6.7-38.4-23.9s6.7-34.4 23.9-38.4c18.1-4.2 36.2-13.3 50.6-25.2 11.1-9.4 27.3-10.1 39.2-1.7 22.1 15.2 50.5 26 77.4 26 27.5 0 55-10.6 77.5-26.1 11.1-7.9 25.9-7.9 37 0'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-walking\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='512'%3E%3Cpath d='M160 48a48 48 0 1 1 96 0 48 48 0 1 1-96 0m-33.5 151.3c-1 .4-1.9.8-2.9 1.2l-8 3.5c-16.4 7.3-29 21.2-34.7 38.2l-2.6 7.8c-5.6 16.8-23.7 25.8-40.5 20.2S12 246.5 17.6 229.7l2.6-7.8c11.4-34.1 36.6-61.9 69.4-76.5l8-3.5c20.8-9.2 43.3-14 66.1-14 44.6 0 84.8 26.8 101.9 67.9l15.4 36.9 21.4 10.7c15.8 7.9 22.2 27.1 14.3 42.9s-27.1 22.2-42.9 14.3L247 287.3c-10.3-5.2-18.4-13.8-22.8-24.5l-9.6-23-19.3 65.5 49.5 54c5.4 5.9 9.2 13 11.2 20.8l23 92.1c4.3 17.1-6.1 34.5-23.3 38.8s-34.5-6.1-38.8-23.3l-22-88.1-70.7-77.1c-14.8-16.1-20.3-38.6-14.7-59.7l16.9-63.5zM68.7 398l25-62.4c2.1 3 4.5 5.8 7 8.6l40.7 44.4-14.5 36.2c-2.4 6-6 11.5-10.6 16.1l-61.7 61.7c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-walking\],.icon-\[fa6-solid--question\]{display:inline-block;width:.63em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--question\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='512'%3E%3Cpath d='M80 160c0-35.3 28.7-64 64-64h32c35.3 0 64 28.7 64 64v3.6c0 21.8-11.1 42.1-29.4 53.8l-42.2 27.1a87.98 87.98 0 0 0-40.4 74v1.4c0 17.7 14.3 32 32 32s32-14.3 32-32v-1.4c0-8.2 4.2-15.8 11-20.2l42.2-27.1c36.6-23.6 58.8-64.1 58.8-107.7v-3.6c0-70.7-57.3-128-128-128h-32C73.3 32 16 89.3 16 160c0 17.7 14.3 32 32 32s32-14.3 32-32m80 320a40 40 0 1 0 0-80 40 40 0 1 0 0 80'/%3E%3C/svg%3E")}.icon-\[fa6-solid--quote-left\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M0 216C0 149.7 53.7 96 120 96h8c17.7 0 32 14.3 32 32s-14.3 32-32 32h-8c-30.9 0-56 25.1-56 56v8h64c35.3 0 64 28.7 64 64v64c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64zm256 0c0-66.3 53.7-120 120-120h8c17.7 0 32 14.3 32 32s-14.3 32-32 32h-8c-30.9 0-56 25.1-56 56v8h64c35.3 0 64 28.7 64 64v64c0 35.3-28.7 64-64 64h-64c-35.3 0-64-28.7-64-64z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--quote-left\],.icon-\[fa6-solid--retweet\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--retweet\]{width:1.13em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M272 416c17.7 0 32-14.3 32-32s-14.3-32-32-32H160c-17.7 0-32-14.3-32-32V192h32c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-64-64c-12.5-12.5-32.8-12.5-45.3 0l-64 64c-9.2 9.2-11.9 22.9-6.9 34.9S19.1 192 32.1 192h32v128c0 53 43 96 96 96h112zm32-320c-17.7 0-32 14.3-32 32s14.3 32 32 32h112c17.7 0 32 14.3 32 32v128h-32c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l64 64c12.5 12.5 32.8 12.5 45.3 0l64-64c9.2-9.2 11.9-22.9 6.9-34.9S556.9 320 543.9 320h-32V192c0-53-43-96-96-96z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--right-from-bracket\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='m377.9 105.9 122.8 122.8c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L377.9 406.1c-6.4 6.4-15 9.9-24 9.9-18.7 0-33.9-15.2-33.9-33.9V320H192c-17.7 0-32-14.3-32-32v-64c0-17.7 14.3-32 32-32h128v-62.1c0-18.7 15.2-33.9 33.9-33.9 9 0 17.6 3.6 24 9.9M160 96H96c-17.7 0-32 14.3-32 32v256c0 17.7 14.3 32 32 32h64c17.7 0 32 14.3 32 32s-14.3 32-32 32H96c-53 0-96-43-96-96V128c0-53 43-96 96-96h64c17.7 0 32 14.3 32 32s-14.3 32-32 32'/%3E%3C/svg%3E")}.icon-\[fa6-solid--right-from-bracket\],.icon-\[fa6-solid--right-to-bracket\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--right-to-bracket\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='m217.9 105.9 122.8 122.8c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L217.9 406.1c-6.4 6.4-15 9.9-24 9.9-18.7 0-33.9-15.2-33.9-33.9V320H32c-17.7 0-32-14.3-32-32v-64c0-17.7 14.3-32 32-32h128v-62.1c0-18.7 15.2-33.9 33.9-33.9 9 0 17.6 3.6 24 9.9M352 416h64c17.7 0 32-14.3 32-32V128c0-17.7-14.3-32-32-32h-64c-17.7 0-32-14.3-32-32s14.3-32 32-32h64c53 0 96 43 96 96v256c0 53-43 96-96 96h-64c-17.7 0-32-14.3-32-32s14.3-32 32-32'/%3E%3C/svg%3E")}.icon-\[fa6-solid--road\]{display:inline-block;width:1.13em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M256 32h-74.8c-27.1 0-51.3 17.1-60.3 42.6L3.1 407.2c-2 5.8-3.1 12-3.1 18.2C0 455.5 24.5 480 54.6 480H256v-64c0-17.7 14.3-32 32-32s32 14.3 32 32v64h201.4c30.2 0 54.6-24.5 54.6-54.6 0-6.2-1.1-12.4-3.1-18.2L455.1 74.6C446 49.1 421.9 32 394.8 32H320v64c0 17.7-14.3 32-32 32s-32-14.3-32-32zm64 192v64c0 17.7-14.3 32-32 32s-32-14.3-32-32v-64c0-17.7 14.3-32 32-32s32 14.3 32 32'/%3E%3C/svg%3E")}.icon-\[fa6-solid--route\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M512 96c0 50.2-59.1 125.1-84.6 155-3.8 4.4-9.4 6.1-14.5 5H320c-17.7 0-32 14.3-32 32s14.3 32 32 32h96c53 0 96 43 96 96s-43 96-96 96H139.6c8.7-9.9 19.3-22.6 30-36.8 6.3-8.4 12.8-17.6 19-27.2H416c17.7 0 32-14.3 32-32s-14.3-32-32-32h-96c-53 0-96-43-96-96s43-96 96-96h39.8c-21-31.5-39.8-67.7-39.8-96 0-53 43-96 96-96s96 43 96 96M117.1 489.1c-3.8 4.3-7.2 8.1-10.1 11.3l-1.8 2-.2-.2c-6 4.6-14.6 4-20-1.8C59.8 473 0 402.5 0 352c0-53 43-96 96-96s96 43 96 96c0 30-21.1 67-43.5 97.9-10.7 14.7-21.7 28-30.8 38.5zM128 352a32 32 0 1 0-64 0 32 32 0 1 0 64 0m288-224a32 32 0 1 0 0-64 32 32 0 1 0 0 64'/%3E%3C/svg%3E")}.icon-\[fa6-solid--route\],.icon-\[fa6-solid--ruler\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--ruler\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M177.9 494.1c-18.7 18.7-49.1 18.7-67.9 0l-92.1-92.2c-18.7-18.7-18.7-49.1 0-67.9l50.7-50.7 48 48c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6l-48-48 41.4-41.4 48 48c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6l-48-48 41.4-41.4 48 48c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6l-48-48 41.4-41.4 48 48c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6l-48-48L333.9 18C352.6-.7 383-.7 401.8 18l92.1 92.1c18.7 18.7 18.7 49.1 0 67.9z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--sailboat\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M256 16c0-7 4.5-13.2 11.2-15.3s13.9.4 17.9 6.1l224 320c3.4 4.9 3.8 11.3 1.1 16.6S502 352 496 352H272c-8.8 0-16-7.2-16-16zm-43.9 80.5c7 1.9 11.9 8.2 11.9 15.5v224c0 8.8-7.2 16-16 16H80c-5.7 0-11-3-13.8-8s-2.9-11-.1-16l128-224c3.6-6.3 11-9.4 18-7.5M5.7 404.3C2.8 394.1 10.5 384 21.1 384h533.8c10.6 0 18.3 10.1 15.4 20.3l-4 14.3C550.7 473.9 500.4 512 443 512H133c-57.4 0-107.7-38.1-123.3-93.3l-4-14.3z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--sailboat\],.icon-\[fa6-solid--share-from-square\]{display:inline-block;width:1.13em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--share-from-square\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M352 224h-46.5c-45 0-81.5 36.5-81.5 81.5 0 22.3 10.3 34.3 19.2 40.5 6.8 4.7 12.8 12 12.8 20.3 0 9.8-8 17.8-17.8 17.8h-2.5c-2.4 0-4.8-.4-7.1-1.4C210.8 374.8 128 333.4 128 240c0-79.5 64.5-144 144-144h80V34.7C352 15.5 367.5 0 386.7 0c8.6 0 16.8 3.2 23.2 8.9l138.2 124.4c7.6 6.8 11.9 16.5 11.9 26.7s-4.3 19.9-11.9 26.7l-139 125.1c-5.9 5.3-13.5 8.2-21.4 8.2H384c-17.7 0-32-14.3-32-32zM80 96c-8.8 0-16 7.2-16 16v320c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16v-48c0-17.7 14.3-32 32-32s32 14.3 32 32v48c0 44.2-35.8 80-80 80H80c-44.2 0-80-35.8-80-80V112c0-44.2 35.8-80 80-80h48c17.7 0 32 14.3 32 32s-14.3 32-32 32z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--square-check\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M64 32C28.7 32 0 60.7 0 96v320c0 35.3 28.7 64 64 64h320c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64zm273 177L209 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L303 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--square-check\],.icon-\[fa6-solid--stopwatch\]{display:inline-block;width:.88em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--stopwatch\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M176 0c-17.7 0-32 14.3-32 32s14.3 32 32 32h16v34.4C92.3 113.8 16 200 16 304c0 114.9 93.1 208 208 208s208-93.1 208-208c0-41.8-12.3-80.7-33.5-113.2l24.1-24.1c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L355.7 143c-28.1-23-62.2-38.8-99.7-44.6V64h16c17.7 0 32-14.3 32-32S289.7 0 272 0zm72 192v128c0 13.3-10.7 24-24 24s-24-10.7-24-24V192c0-13.3 10.7-24 24-24s24 10.7 24 24'/%3E%3C/svg%3E")}.icon-\[fa6-solid--tag\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M0 80v149.5c0 17 6.7 33.3 18.7 45.3l176 176c25 25 65.5 25 90.5 0l133.5-133.5c25-25 25-65.5 0-90.5l-176-176c-12-12-28.3-18.7-45.3-18.7L48 32C21.5 32 0 53.5 0 80m112 32a32 32 0 1 1 0 64 32 32 0 1 1 0-64'/%3E%3C/svg%3E")}.icon-\[fa6-solid--tag\],.icon-\[fa6-solid--trash\]{display:inline-block;width:.88em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--trash\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M135.2 17.7 128 32H32C14.3 32 0 46.3 0 64s14.3 32 32 32h384c17.7 0 32-14.3 32-32s-14.3-32-32-32h-96l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7M416 128H32l21.2 339c1.6 25.3 22.6 45 47.9 45h245.8c25.3 0 46.3-19.7 47.9-45z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--user-plus\]{width:1.25em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M96 128a128 128 0 1 1 256 0 128 128 0 1 1-256 0M0 482.3C0 383.8 79.8 304 178.3 304h91.4c98.5 0 178.3 79.8 178.3 178.3 0 16.4-13.3 29.7-29.7 29.7H29.7C13.3 512 0 498.7 0 482.3M504 312v-64h-64c-13.3 0-24-10.7-24-24s10.7-24 24-24h64v-64c0-13.3 10.7-24 24-24s24 10.7 24 24v64h64c13.3 0 24 10.7 24 24s-10.7 24-24 24h-64v64c0 13.3-10.7 24-24 24s-24-10.7-24-24'/%3E%3C/svg%3E")}.icon-\[fa6-solid--user-plus\],.icon-\[fa6-solid--user\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--user\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M224 256a128 128 0 1 0 0-256 128 128 0 1 0 0 256m-45.7 48C79.8 304 0 383.8 0 482.3 0 498.7 13.3 512 29.7 512h388.6c16.4 0 29.7-13.3 29.7-29.7 0-98.5-79.8-178.3-178.3-178.3z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--users\]{width:1.25em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M144 0a80 80 0 1 1 0 160 80 80 0 1 1 0-160m368 0a80 80 0 1 1 0 160 80 80 0 1 1 0-160M0 298.7C0 239.8 47.8 192 106.7 192h42.7c15.9 0 31 3.5 44.6 9.7-1.3 7.2-1.9 14.7-1.9 22.3 0 38.2 16.8 72.5 43.3 96H21.3C9.6 320 0 310.4 0 298.7M405.3 320h-.7c26.6-23.5 43.3-57.8 43.3-96 0-7.6-.7-15-1.9-22.3 13.6-6.3 28.7-9.7 44.6-9.7h42.7c58.9 0 106.7 47.8 106.7 106.7 0 11.8-9.6 21.3-21.3 21.3H405.4zM224 224a96 96 0 1 1 192 0 96 96 0 1 1-192 0m-96 261.3c0-73.6 59.7-133.3 133.3-133.3h117.3c73.7 0 133.4 59.7 133.4 133.3 0 14.7-11.9 26.7-26.7 26.7H154.6c-14.7 0-26.7-11.9-26.7-26.7z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--users\],.icon-\[fa6-solid--weight-hanging\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--weight-hanging\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M224 96a32 32 0 1 1 64 0 32 32 0 1 1-64 0m122.5 32c3.5-10 5.5-20.8 5.5-32 0-53-43-96-96-96s-96 43-96 96c0 11.2 1.9 22 5.5 32H120c-22 0-41.2 15-46.6 36.4l-72 288c-3.6 14.3-.4 29.5 8.7 41.2S33.2 512 48 512h416c14.8 0 28.7-6.8 37.8-18.5s12.3-26.8 8.7-41.2l-72-288C433.2 143 414 128 392 128z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--xmark\]{display:inline-block;width:.75em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3l105.4 105.3c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256z'/%3E%3C/svg%3E")}.icon-\[ion--footsteps\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M133.83 361.27c-22.61 0-41-8.17-54.79-24.39s-22.84-40.29-28.11-75.31c-7.76-51.61-.06-95.11 21.68-122.48 12.8-16.12 29.6-25.44 48.58-26.94 16.25-1.3 40.54 5.29 64 44 14.69 24.24 25.86 56.44 30.65 88.34 5.79 38.51 1.48 66.86-13.18 86.65-11.64 15.72-29.54 25.46-53.21 29a106.5 106.5 0 0 1-15.62 1.13M173 496c-13.21 0-26.6-4.23-38.66-12.36a79.8 79.8 0 0 1-33.52-50.6c-2.85-14.66-1.14-26.31 5.22-35.64 10.33-15.15 28.87-18.56 48.49-22.18 2.07-.38 4.17-.76 6.3-1.17 4.52-.86 9.14-2 13.62-3.11 16.78-4.14 34.14-8.43 48.47 1.75 9.59 6.8 15 18.36 16.62 35.32 1.84 19.57-2.36 39.1-11.83 55-10.19 17.11-25.47 28.42-43 31.86A61 61 0 0 1 173 496m205.17-230.73a107 107 0 0 1-15.6-1.2c-23.66-3.5-41.56-13.25-53.2-29-14.66-19.79-19-48.13-13.18-86.65 4.79-31.93 15.93-64.1 30.55-88.25 23.34-38.57 47.66-45.26 64-44.08 18.92 1.38 35.69 10.57 48.51 26.6 21.89 27.37 29.65 71 21.86 122.84-5.27 35-14.2 58.95-28.11 75.31s-32.22 24.43-54.83 24.43M339 400a61 61 0 0 1-11.68-1.13c-17.56-3.44-32.84-14.75-43-31.86-9.47-15.9-13.67-35.43-11.83-55 1.6-17 7-28.52 16.62-35.33 14.33-10.17 31.69-5.89 48.47-1.74 4.48 1.1 9.1 2.24 13.62 3.11l6.29 1.17c19.63 3.61 38.17 7 48.5 22.17 6.36 9.33 8.07 21 5.22 35.64a79.78 79.78 0 0 1-33.52 50.61C365.56 395.78 352.17 400 339 400'/%3E%3C/svg%3E")}.icon-\[ion--footsteps\],.icon-\[ion--scale\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[ion--scale\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M368 32H144A112.12 112.12 0 0 0 32 144v224a112.12 112.12 0 0 0 112 112h224a112.12 112.12 0 0 0 112-112V144A112.12 112.12 0 0 0 368 32m36.21 178-33.32 39.21A41.76 41.76 0 0 1 339 264.05a42.3 42.3 0 0 1-22.29-6.38c-14.22-8.78-36.3-19.25-60.69-19.25s-46.47 10.47-60.69 19.25a41.86 41.86 0 0 1-54.2-8.46L107.79 210a50.48 50.48 0 0 1 4.49-70.27c27.84-25.35 75.37-55.57 143.72-55.57s115.88 30.22 143.72 55.57a50.48 50.48 0 0 1 4.49 70.27'/%3E%3C/svg%3E")}.icon-\[material-symbols--electric-bike-outline\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M5 17q-2.125 0-3.562-1.437T0 12t1.463-3.562T5 7q1.925 0 3.238 1.15T9.9 11h.65l-1.8-5H7V4h5v2h-1.1l.35 1h4.8L14.6 3H12V1h2.6q.65 0 1.163.35t.737.95l1.7 4.65h.8q2.075 0 3.538 1.463T24 11.95q0 2.1-1.45 3.575T19 17q-1.8 0-3.162-1.125T14.1 13H9.9q-.35 1.725-1.7 2.863T5 17m0-2q1.025 0 1.763-.562T7.8 13H5v-2h2.8q-.3-.9-1.037-1.45T5 9q-1.275 0-2.137.863T2 12q0 1.25.863 2.125T5 15m7.7-4h1.4q.125-.575.338-1.075T15 9h-3.05zm6.3 4q1.275 0 2.138-.875T22 12q0-1.275-.862-2.137T19 9h-.1l1 2.65-1.9.7-.95-2.65q-.5.425-.775 1T16 12q0 1.25.863 2.125T19 15m-6 8-6-3h4v-2l6 3h-4zm6-11'/%3E%3C/svg%3E")}.icon-\[material-symbols--electric-bike-outline\],.icon-\[material-symbols--map\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[material-symbols--map\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='m15 21-6-2.1-4.65 1.8q-.5.2-.925-.112T3 19.75v-14q0-.325.188-.575T3.7 4.8L9 3l6 2.1 4.65-1.8q.5-.2.925.113T21 4.25v14q0 .325-.187.575t-.513.375zm-1-2.45V6.85l-4-1.4v11.7z'/%3E%3C/svg%3E")}.icon-\[material-symbols--pedal-bike-outline\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M5 20q-2.125 0-3.562-1.437T0 15t1.463-3.562T5 10q1.925 0 3.238 1.15T9.9 14h.65l-1.8-5H7V7h5v2h-1.1l.35 1h4.8L14.6 6H12V4h2.6q.65 0 1.163.35t.737.95l1.7 4.65h.8q2.075 0 3.538 1.463T24 14.95q0 2.1-1.45 3.575T19 20q-1.8 0-3.162-1.125T14.1 16H9.9q-.35 1.725-1.7 2.863T5 20m0-2q1.025 0 1.763-.562T7.8 16H5v-2h2.8q-.3-.9-1.037-1.45T5 12q-1.275 0-2.137.863T2 15q0 1.25.863 2.125T5 18m7.7-4h1.4q.125-.575.338-1.075T15 12h-3.05zm6.3 4q1.275 0 2.138-.875T22 15q0-1.275-.862-2.137T19 12h-.1l1 2.65-1.9.7-.95-2.65q-.5.425-.775 1T16 15q0 1.25.863 2.125T19 18m0-3'/%3E%3C/svg%3E")}.icon-\[material-symbols--pedal-bike-outline\],.icon-\[mdi--clipboard-check\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[mdi--clipboard-check\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='m10 17-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9m-6-6a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1s-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2'/%3E%3C/svg%3E")}.icon-\[octicon--mark-github-16\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cpath d='M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8'/%3E%3C/svg%3E")}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.end-1{inset-inline-end:.25rem}.col-span-2{grid-column:span 2/span 2}.float-right{float:right}.-mr-5{margin-right:-1.25rem}.mb-2{margin-bottom:.5rem}.mr-2{margin-right:.5rem}.mt-3{margin-top:.75rem}.block{display:block}.inline{display:inline}.flex{display:flex}.table{display:table}.table-cell{display:table-cell}.grid{display:grid}.list-item{display:list-item}.hidden{display:none}.h-1{height:.25rem}.h-6{height:1.5rem}.h-\[300px\]{height:300px}.h-\[600px\]{height:600px}.max-h-48{max-height:12rem}.min-h-\[450px\]{min-height:450px}.w-1{width:.25rem}.w-1\/2{width:50%}.w-96{width:24rem}.max-w-\[0px\]{max-width:0}.shrink{flex-shrink:1}.grow{flex-grow:1}.basis-1\/2{flex-basis:50%}.basis-1\/4{flex-basis:25%}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-t-2{border-top-width:2px}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.border-neutral-500{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}.p-1{padding:.25rem}.p-2{padding:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.pt-3{padding-top:.75rem}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.text-green-500\/0{color:rgba(34,197,94,0)}.text-green-500\/10{color:rgba(34,197,94,.1)}.text-green-500\/100{color:#22c55e}.text-green-500\/15{color:rgba(34,197,94,.15)}.text-green-500\/20{color:rgba(34,197,94,.2)}.text-green-500\/25{color:rgba(34,197,94,.25)}.text-green-500\/30{color:rgba(34,197,94,.3)}.text-green-500\/35{color:rgba(34,197,94,.35)}.text-green-500\/40{color:rgba(34,197,94,.4)}.text-green-500\/45{color:rgba(34,197,94,.45)}.text-green-500\/5{color:rgba(34,197,94,.05)}.text-green-500\/50{color:rgba(34,197,94,.5)}.text-green-500\/55{color:rgba(34,197,94,.55)}.text-green-500\/60{color:rgba(34,197,94,.6)}.text-green-500\/65{color:rgba(34,197,94,.65)}.text-green-500\/70{color:rgba(34,197,94,.7)}.text-green-500\/75{color:rgba(34,197,94,.75)}.text-green-500\/80{color:rgba(34,197,94,.8)}.text-green-500\/85{color:rgba(34,197,94,.85)}.text-green-500\/90{color:rgba(34,197,94,.9)}.text-green-500\/95{color:rgba(34,197,94,.95)}.text-neutral-600{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity,1))}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity,1))}.text-rose-500\/0{color:rgba(244,63,94,0)}.text-rose-500\/10{color:rgba(244,63,94,.1)}.text-rose-500\/100{color:#f43f5e}.text-rose-500\/15{color:rgba(244,63,94,.15)}.text-rose-500\/20{color:rgba(244,63,94,.2)}.text-rose-500\/25{color:rgba(244,63,94,.25)}.text-rose-500\/30{color:rgba(244,63,94,.3)}.text-rose-500\/35{color:rgba(244,63,94,.35)}.text-rose-500\/40{color:rgba(244,63,94,.4)}.text-rose-500\/45{color:rgba(244,63,94,.45)}.text-rose-500\/5{color:rgba(244,63,94,.05)}.text-rose-500\/50{color:rgba(244,63,94,.5)}.text-rose-500\/55{color:rgba(244,63,94,.55)}.text-rose-500\/60{color:rgba(244,63,94,.6)}.text-rose-500\/65{color:rgba(244,63,94,.65)}.text-rose-500\/70{color:rgba(244,63,94,.7)}.text-rose-500\/75{color:rgba(244,63,94,.75)}.text-rose-500\/80{color:rgba(244,63,94,.8)}.text-rose-500\/85{color:rgba(244,63,94,.85)}.text-rose-500\/90{color:rgba(244,63,94,.9)}.text-rose-500\/95{color:rgba(244,63,94,.95)}.underline{text-decoration-line:underline}.overline{text-decoration-line:overline}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(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)}.ring{--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(3px + 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)}.blur{--tw-blur:blur(8px)}.blur,.grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale:grayscale(100%)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\[a-zA-Z\:\\-\\\.\]{a-z-a--z:\-\.}@media (min-width:640px){.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:table-cell{display:table-cell}.sm\:h-\[400px\]{height:400px}.sm\:w-\[300px\]{width:300px}.sm\:table-auto{table-layout:auto}.sm\:table-fixed{table-layout:fixed}.sm\:flex-wrap{flex-wrap:wrap}}@media (min-width:768px){.md\:mt-0{margin-top:0}.md\:flex{display:flex}.md\:h-8{height:2rem}.md\:h-\[500px\]{height:500px}.md\:h-\[600px\]{height:600px}.md\:h-\[800px\]{height:800px}.md\:min-w-\[400px\]{min-width:400px}.md\:grow{flex-grow:1}.md\:basis-1\/2{flex-basis:50%}.md\:flex-wrap{flex-wrap:wrap}.md\:justify-start{justify-content:flex-start}.md\:border-t-0{border-top-width:0}.md\:pt-0{padding-top:0}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-5xl{font-size:3rem;line-height:1}}@media (min-width:1024px){.lg\:flex{display:flex}.lg\:table-cell{display:table-cell}.lg\:hidden{display:none}.lg\:basis-1\/4{flex-basis:25%}.lg\:flex-wrap{flex-wrap:wrap}}@media (min-width:1280px){.xl\:inline{display:inline}.xl\:table-cell{display:table-cell}.xl\:hidden{display:none}.xl\:w-1\/3{width:33.333333%}}@media (min-width:1536px){.\32xl\:inline{display:inline}.\32xl\:w-1\/4{width:25%}.\32xl\:basis-1\/3{flex-basis:33.333333%}}.dark\:text-neutral-400:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity,1))}@media print{.print\:block{display:block}.print\:hidden{display:none}.print\:h-\[600px\]{height:600px}.print\:h-\[800px\]{height:800px}.print\:w-full{width:100%}}.\[\&\>\*\]\:basis-1\/2>*{flex-basis:50%}@media (min-width:1024px){.\[\&\>\*\]\:lg\:basis-1\/2>*{flex-basis:50%}}@media (min-width:1536px){.\[\&\>\*\]\:2xl\:basis-1\/3>*{flex-basis:33.333333%}} \ No newline at end of file +*,:after,:before{--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:rgba(59,130,246,.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: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::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:rgba(59,130,246,.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: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}@media print{.pagebreak{clear:both;page-break-after:always}}.icon-decoration{margin-right:.5rem;vertical-align:baseline}.full-size{height:100dvh;flex-basis:100%}.small-size{flex-basis:50%}@media (min-width:1536px){.small-size{flex-basis:33.333333%}}.leaflet-control:where(.dark,.dark *),.leaflet-tooltip:where(.dark,.dark *),.map-tiles:where(.dark,.dark *){--tw-brightness:brightness(0.85);--tw-contrast:contrast(0.80);--tw-invert:invert(100%);--tw-saturate:saturate(0);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}.leaflet-popup-content-wrapper:where(.dark,.dark *),.leaflet-popup-tip:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}@media (min-width:768px){body{padding-left:5rem;padding-right:5rem}}body{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}body:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}ol{list-style-type:decimal}ol,ul{margin-top:1.25rem;margin-bottom:1.25rem;list-style-position:inside}ul{list-style-type:disc}.dirty{margin:.25rem;display:inline-block;min-width:150px;border-radius:9999px;border-width:1px;padding:.5rem 1.25rem;text-align:center}.dirty:hover{--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.dirty{border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}.dirty:where(.dark,.dark *){border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}.dirty{font-size:.875rem;line-height:1.25rem;--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity,1));--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.dirty:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1));--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}input,select,textarea{border-radius:.75rem;border-width:1px;padding:.5rem 1.5rem;--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity,1))}input::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}input::placeholder,select::placeholder,textarea::placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}input:where(.dark,.dark *),select:where(.dark,.dark *),textarea:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}input:where(.dark,.dark *)::-moz-placeholder,select:where(.dark,.dark *)::-moz-placeholder,textarea:where(.dark,.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}input:where(.dark,.dark *)::placeholder,select:where(.dark,.dark *)::placeholder,textarea:where(.dark,.dark *)::placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}input:focus,input:hover,select:focus,select:hover,textarea:focus,textarea:hover{--tw-brightness:brightness(1.25);--tw-contrast:contrast(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}button{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}button:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}button{margin-left:.5rem;margin-right:.5rem;border-radius:.75rem;border-width:1px;padding:.5rem 1.5rem;font-weight:700}button:focus,button:hover{--tw-brightness:brightness(1.25);--tw-contrast:contrast(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}a.button{margin:.5rem;border-radius:.75rem;border-width:1px;padding:.25rem .25rem .25rem .75rem;font-weight:700}a.button:focus,a.button:hover{--tw-brightness:brightness(1.25);--tw-contrast:contrast(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}a.button{cursor:pointer;--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}a.button:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}a.action,button.edit,button.share{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity,1))}a.action:where(.dark,.dark *),button.edit:where(.dark,.dark *),button.share:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}a.dangerous,button.dangerous{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity,1))}a.dangerous:where(.dark,.dark *),button.dangerous:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity,1))}h2{margin-left:.5rem;margin-right:.5rem;margin-bottom:1.25rem;padding-left:.5rem;padding-right:.5rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){h2{font-size:1.5rem;line-height:2rem}}h2{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity,1))}h2:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}h3{margin-bottom:1.25rem;font-size:1rem;line-height:1.5rem}@media (min-width:768px){h3{font-size:1.25rem;line-height:1.75rem}}h3{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity,1))}h3:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}a:hover{--tw-brightness:brightness(1.25);--tw-contrast:contrast(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}form{margin-top:1.25rem;margin-bottom:1.25rem;tr{margin-bottom:.5rem;gap:1rem}tr{label{display:block;padding-top:.25rem;padding-bottom:.25rem;text-align:right}}label{padding-left:.5rem;padding-right:.5rem}}.note{border-left-width:2px;--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity,1));padding:.25rem .25rem .25rem .75rem;font-size:.75rem;line-height:1rem;--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.note:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.footer{display:flex;justify-content:center;gap:2.5rem}.content a,.footer a{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.content a:where(.dark,.dark *),.footer a:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity,1))}.footer,.menu{align-items:baseline;padding:.75rem 1.5rem;--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.footer:where(.dark,.dark *),.menu:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.footer,.menu{@media print{>div{display:none}}}.footer{margin-top:.5rem;border-top-left-radius:.75rem;border-top-right-radius:.75rem}.menu{margin-bottom:.5rem;border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem;a{margin-top:1.25rem;margin-right:1.25rem}a{span.autohide{display:none}@media (min-width:768px){span.autohide{display:contents}}}h1{margin-bottom:.75rem;border-bottom-width:2px;padding-bottom:.75rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){h1{margin-bottom:0;border-bottom-width:0;padding-bottom:0;font-size:1.875rem;line-height:2.25rem}}h1{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1));--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}h1:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}}.actions{float:right;display:flex;align-items:baseline;gap:.75rem}@media print{.actions{display:none}}.actions{>button,>form{margin-top:0;margin-bottom:0}>button,>form{>button{margin-left:0;margin-right:0;border-radius:.375rem;padding-left:.5rem;padding-right:.5rem;padding-top:.25rem;padding-bottom:.25rem}>button{a,a:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}a:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}a:hover:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}a{text-align:center}}}}.content{border-radius:.75rem;padding:1.25rem .25rem}@media (min-width:768px){.content{padding-left:2.5rem;padding-right:2.5rem}}.content{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}.content:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}.inner-form{margin:.5rem;border-radius:.75rem;border-width:1px;padding:.5rem}@media (min-width:768px){.inner-form{padding:1.25rem}}@media print{.inner-form{border-width:0}}.inner-form{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity,1))}.inner-form:hover{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}.inner-form:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity,1))}.inner-form:hover:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}.version-notice{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity,1))}.version-notice:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity,1))}.notice{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.notice:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.alert{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.alert:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.alert,.notice,.version-notice{border-width:1px;position:relative;margin:1.25rem;border-radius:.375rem;padding:.75rem 1rem;a{text-decoration-line:underline}}.workouts_list_details div{width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.recent-activity .workouts_list_details div{width:auto;min-width:100px;max-width:150px}table{width:100%;table-layout:auto;border-width:1px;text-align:left;font-size:.875rem;line-height:1.25rem;--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}table:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}table{tfoot,thead{font-weight:700;text-transform:uppercase;--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}tfoot:where(.dark,.dark *),thead:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}tfoot:where(.dark,.dark *),thead:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}tfoot,thead{tr{border-width:1px;--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}tr:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}}td,th{padding:.5rem}@media print{td,th{padding:0}}td,th{vertical-align:top}th{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}th:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}tbody{tr:nth-child(odd){--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity,1))}tr:nth-child(2n){background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}tr:hover,tr:nth-child(2n){--tw-bg-opacity:1}tr:hover{background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}tr:nth-child(odd):where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity,1))}tr:nth-child(2n):where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}tr:hover:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity,1))}}}.workout-info{td,th{padding-left:.5rem;padding-right:.5rem}tr{margin-bottom:.5rem}}.modal{position:fixed;inset:0;z-index:3000;display:none;height:100%;width:100%;overflow-y:auto;padding-left:1rem;padding-right:1rem;background-color:rgb(243 244 246/var(--tw-bg-opacity,1));--tw-bg-opacity:0.8}.modal:where(.dark,.dark *){background-color:rgb(17 24 39/var(--tw-bg-opacity,1));--tw-bg-opacity:0.6}.modal{.window{position:relative;top:10rem;margin-left:auto;margin-right:auto;max-width:28rem;border-radius:1.5rem;--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1))}.window:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity,1))}.window{button.close-modal{a{margin-left:auto;display:inline-flex;border-radius:.5rem;background-color:transparent;padding:.375rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}a:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}a:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}a:hover:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}a:hover:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}}.modal-content{padding:1.5rem;padding-top:0;text-align:center}.modal-content{h3{margin-top:.75rem;margin-bottom:2.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:400;--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}h3:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}button{display:inline-flex;align-items:center;border-radius:.5rem;padding-left:.75rem;padding-right:.75rem;padding-top:.625rem;padding-bottom:.625rem;text-align:center;font-size:1rem;line-height:1.5rem;font-weight:500}button: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(4px + 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)}button.confirm{margin-right:.5rem;--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}button.confirm:hover{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity,1))}button.confirm:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity,1))}button.confirm:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}button.confirm:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}button.confirm:hover:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}button.confirm:focus:where(.dark,.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(185 28 28/var(--tw-ring-opacity,1))}button.cancel{border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}button.cancel:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}button.cancel:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(165 243 252/var(--tw-ring-opacity,1))}button.cancel:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity,1))}button.cancel:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}button.cancel:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}button.cancel:hover:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}button.cancel:focus:where(.dark,.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(21 94 117/var(--tw-ring-opacity,1))}}}}.user-pill{margin:.25rem;display:inline-block;min-width:150px;border-radius:9999px;border-width:1px;padding:.5rem 1.25rem;text-align:center}.user-pill:hover{--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.user-pill{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}.user-pill:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}.selectable-pill{margin:.25rem;display:inline-block;min-width:150px;border-radius:9999px;border-width:1px;padding:.5rem 1.25rem;text-align:center}.selectable-pill:hover{--tw-brightness:brightness(1.1)}.selectable-pill{border-color:rgb(115 115 115/var(--tw-border-opacity,1));background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}.selectable-pill:where(.dark,.dark *){border-color:rgb(115 115 115/var(--tw-border-opacity,1));background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}.selectable-pill{cursor:pointer}.selectable-pill:hover{--tw-brightness:brightness(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.selectable-pill{background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}.peer:checked~.selectable-pill,.selectable-pill{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1));--tw-bg-opacity:1}.peer:checked~.selectable-pill{background-color:rgb(74 222 128/var(--tw-bg-opacity,1))}.selectable-pill:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity,1))}.peer:checked~.selectable-pill:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity,1))}.workout-item{min-height:150px;border-radius:.75rem;border-width:1px;padding:.5rem 1.25rem}.workout-item:hover{--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.workout-item{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity,1))}.workout-item:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity,1))}.workout-item{.meta{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity,1))}.meta:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity,1))}}.vanish{margin-top:0;margin-bottom:0;max-height:0;border-width:0;padding-top:0;padding-bottom:0;opacity:0;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:1s}.input-ellipsis{width:100%;max-width:-moz-max-content;max-width:max-content;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.icon-\[fa-solid--check\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E")}.icon-\[fa-solid--check\],.icon-\[fa-solid--times\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa-solid--times\]{width:.69em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='352' height='512'%3E%3Cpath d='m242.72 256 100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48z'/%3E%3C/svg%3E")}.icon-\[fa-solid--user-circle\]{width:.97em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='496' height='512'%3E%3Cpath d='M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8m0 96c48.6 0 88 39.4 88 88s-39.4 88-88 88-88-39.4-88-88 39.4-88 88-88m0 344c-58.7 0-111.3-26.6-146.5-68.2 18.8-35.4 55.6-59.8 98.5-59.8 2.4 0 4.8.4 7.1 1.1 13 4.2 26.6 6.9 40.9 6.9s28-2.7 40.9-6.9c2.3-.7 4.7-1.1 7.1-1.1 42.9 0 79.7 24.4 98.5 59.8C359.3 421.4 306.7 448 248 448'/%3E%3C/svg%3E")}.icon-\[fa-solid--user-circle\],.icon-\[fa6-regular--calendar\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-regular--calendar\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M152 24c0-13.3-10.7-24-24-24s-24 10.7-24 24v40H64C28.7 64 0 92.7 0 128v320c0 35.3 28.7 64 64 64h320c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64h-40V24c0-13.3-10.7-24-24-24s-24 10.7-24 24v40H152zM48 192h352v256c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16z'/%3E%3C/svg%3E")}.icon-\[fa6-regular--clock\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M464 256a208 208 0 1 1-416 0 208 208 0 1 1 416 0M0 256a256 256 0 1 0 512 0 256 256 0 1 0-512 0m232-136v136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2V120c0-13.3-10.7-24-24-24s-24 10.7-24 24'/%3E%3C/svg%3E")}.icon-\[fa6-regular--clock\],.icon-\[fa6-regular--hourglass\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-regular--hourglass\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M24 0C10.7 0 0 10.7 0 24s10.7 24 24 24h8v19c0 40.3 16 79 44.5 107.5l81.6 81.5-81.6 81.5C48 366 32 404.7 32 445v19h-8c-13.3 0-24 10.7-24 24s10.7 24 24 24h336c13.3 0 24-10.7 24-24s-10.7-24-24-24h-8v-19c0-40.3-16-79-44.5-107.5L225.9 256l81.5-81.5C336 146 352 107.3 352 67V48h8c13.3 0 24-10.7 24-24S373.3 0 360 0zm168 289.9 81.5 81.5C293 391 304 417.4 304 445v19H80v-19c0-27.6 11-54 30.5-73.5zm0-67.9-81.5-81.5C91 121 80 94.6 80 67V48h224v19c0 27.6-11 54-30.5 73.5L192 222.1z'/%3E%3C/svg%3E")}.icon-\[fa6-regular--rectangle-list\]{width:1.13em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M64 80c-8.8 0-16 7.2-16 16v320c0 8.8 7.2 16 16 16h448c8.8 0 16-7.2 16-16V96c0-8.8-7.2-16-16-16zM0 96c0-35.3 28.7-64 64-64h448c35.3 0 64 28.7 64 64v320c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64zm96 64a32 32 0 1 1 64 0 32 32 0 1 1-64 0m104 0c0-13.3 10.7-24 24-24h224c13.3 0 24 10.7 24 24s-10.7 24-24 24H224c-13.3 0-24-10.7-24-24m0 96c0-13.3 10.7-24 24-24h224c13.3 0 24 10.7 24 24s-10.7 24-24 24H224c-13.3 0-24-10.7-24-24m0 96c0-13.3 10.7-24 24-24h224c13.3 0 24 10.7 24 24s-10.7 24-24 24H224c-13.3 0-24-10.7-24-24m-72-64a32 32 0 1 1 0-64 32 32 0 1 1 0 64m-32 64a32 32 0 1 1 64 0 32 32 0 1 1-64 0'/%3E%3C/svg%3E")}.icon-\[fa6-regular--rectangle-list\],.icon-\[fa6-solid--arrow-down-long\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--arrow-down-long\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M169.4 502.6c12.5 12.5 32.8 12.5 45.3 0l128-128c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 402.7V32c0-17.7-14.3-32-32-32s-32 14.3-32 32v370.7l-73.4-73.3c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l128 128z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--arrow-right-arrow-left\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M438.6 150.6c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.7 96H32c-17.7 0-32 14.3-32 32s14.3 32 32 32h306.7l-41.4 41.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96zm-333.3 352c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 416H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H109.3l41.4-41.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--arrow-right-arrow-left\],.icon-\[fa6-solid--arrow-up-long\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--arrow-up-long\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M214.6 9.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l73.4-73.4V480c0 17.7 14.3 32 32 32s32-14.3 32-32V109.3l73.4 73.4c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-128-128z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--arrows-left-right\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='m406.6 374.6 96-96c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l41.4 41.4H109.2l41.4-41.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 288h293.5l-41.4 41.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--arrows-left-right\],.icon-\[fa6-solid--arrows-rotate\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--arrows-rotate\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M105.1 202.6c7.7-21.8 20.2-42.3 37.8-59.8 62.5-62.5 163.8-62.5 226.3 0l17.1 17.2H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h111.9c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v35.2l-17.5-17.6c-87.5-87.5-229.3-87.5-316.8 0-24.4 24.4-42 53.1-52.8 83.8-5.9 16.7 2.9 34.9 19.5 40.8s34.9-2.9 40.8-19.5zM39 289.3c-5 1.5-9.8 4.2-13.7 8.2-4 4-6.7 8.8-8.1 14-.3 1.2-.6 2.5-.8 3.8-.3 1.7-.4 3.4-.4 5.1V432c0 17.7 14.3 32 32 32s32-14.3 32-32v-35.1l17.6 17.5c87.5 87.4 229.3 87.4 316.7 0 24.4-24.4 42.1-53.1 52.9-83.8 5.9-16.7-2.9-34.9-19.5-40.8s-34.9 2.9-40.8 19.5c-7.7 21.8-20.2 42.3-37.8 59.8-62.5 62.5-163.8 62.5-226.3 0l-.1-.1-17.1-17H160c17.7 0 32-14.3 32-32s-14.3-32-32-32H48.4q-2.4 0-4.8.3c-2.4.3-3.1.5-4.6 1'/%3E%3C/svg%3E")}.icon-\[fa6-solid--bicycle\]{display:inline-block;width:1.25em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M312 32c-13.3 0-24 10.7-24 24s10.7 24 24 24h25.7l34.6 64H222.9l-27.4-38c-4.5-6.3-11.8-10-19.5-10h-56c-13.3 0-24 10.7-24 24s10.7 24 24 24h43.7l22.1 30.7-26.6 53.1c-10-2.5-20.5-3.8-31.2-3.8C57.3 224 0 281.3 0 352s57.3 128 128 128c65.3 0 119.1-48.9 127-112h49c8.5 0 16.3-4.5 20.7-11.8l84.8-143.5 21.7 40.1C402.4 276.3 384 312 384 352c0 70.7 57.3 128 128 128s128-57.3 128-128-57.3-128-128-128c-13.5 0-26.5 2.1-38.7 6L375.4 48.8C369.8 38.4 359 32 347.2 32zm146.6 271.7 32.3 59.7c6.3 11.7 20.9 16 32.5 9.7s16-20.9 9.7-32.5l-32.3-59.7c3.6-.6 7.4-.9 11.2-.9 39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72c0-18.6 7-35.5 18.6-48.3M133.2 368h65c-7.3 32.1-36 56-70.2 56-39.8 0-72-32.2-72-72s32.2-72 72-72c1.7 0 3.4.1 5.1.2l-24.2 48.5c-9 18.1 4.1 39.4 24.3 39.4zm33.7-48 50.7-101.3 72.9 101.2-.1.1zm90.6-128H366l-49 82.8-59.6-82.8z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--bookmark\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M0 48v439.7C0 501.1 10.9 512 24.3 512c5 0 9.9-1.5 14-4.4L192 400l153.7 107.6c4.1 2.9 9 4.4 14 4.4 13.4 0 24.3-10.9 24.3-24.3V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48'/%3E%3C/svg%3E")}.icon-\[fa6-solid--bookmark\],.icon-\[fa6-solid--calculator\]{display:inline-block;width:.75em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--calculator\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M64 0C28.7 0 0 28.7 0 64v384c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zm32 64h192c17.7 0 32 14.3 32 32v32c0 17.7-14.3 32-32 32H96c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32m32 160a32 32 0 1 1-64 0 32 32 0 1 1 64 0M96 352a32 32 0 1 1 0-64 32 32 0 1 1 0 64m-32 64c0-17.7 14.3-32 32-32h96c17.7 0 32 14.3 32 32s-14.3 32-32 32H96c-17.7 0-32-14.3-32-32m128-160a32 32 0 1 1 0-64 32 32 0 1 1 0 64m32 64a32 32 0 1 1-64 0 32 32 0 1 1 64 0m64-64a32 32 0 1 1 0-64 32 32 0 1 1 0 64m32 64a32 32 0 1 1-64 0 32 32 0 1 1 64 0m-32 128a32 32 0 1 1 0-64 32 32 0 1 1 0 64'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chart-line\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M64 64c0-17.7-14.3-32-32-32S0 46.3 0 64v336c0 44.2 35.8 80 80 80h400c17.7 0 32-14.3 32-32s-14.3-32-32-32H80c-8.8 0-16-7.2-16-16zm406.6 86.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L320 210.7l-57.4-57.4c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l89.4-89.3 57.4 57.4c12.5 12.5 32.8 12.5 45.3 0l128-128z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chart-line\],.icon-\[fa6-solid--chart-simple\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--chart-simple\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M160 80c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48zM0 272c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v160c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48zM368 96h32c26.5 0 48 21.5 48 48v288c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48V144c0-26.5 21.5-48 48-48'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chevron-down\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chevron-down\],.icon-\[fa6-solid--chevron-right\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--chevron-right\]{width:.63em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='512'%3E%3Cpath d='M310.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L242.7 256 73.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chevron-up\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M233.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L256 173.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--chevron-up\],.icon-\[fa6-solid--circle-exclamation\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--circle-exclamation\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M256 512a256 256 0 1 0 0-512 256 256 0 1 0 0 512m0-384c13.3 0 24 10.7 24 24v112c0 13.3-10.7 24-24 24s-24-10.7-24-24V152c0-13.3 10.7-24 24-24m-32 224a32 32 0 1 1 64 0 32 32 0 1 1-64 0'/%3E%3C/svg%3E")}.icon-\[fa6-solid--circle-notch\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M222.7 32.1c5 16.9-4.6 34.8-21.5 39.8C121.8 95.6 64 169.1 64 256c0 106 86 192 192 192s192-86 192-192c0-86.9-57.8-160.4-137.1-184.1-16.9-5-26.6-22.9-21.5-39.8s22.9-26.6 39.8-21.5C434.9 42.1 512 140 512 256c0 141.4-114.6 256-256 256S0 397.4 0 256C0 140 77.1 42.1 182.9 10.6c16.9-5 34.8 4.6 39.8 21.5'/%3E%3C/svg%3E")}.icon-\[fa6-solid--circle-notch\],.icon-\[fa6-solid--circle-plus\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--circle-plus\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M256 512a256 256 0 1 0 0-512 256 256 0 1 0 0 512m-24-168v-64h-64c-13.3 0-24-10.7-24-24s10.7-24 24-24h64v-64c0-13.3 10.7-24 24-24s24 10.7 24 24v64h64c13.3 0 24 10.7 24 24s-10.7 24-24 24h-64v64c0 13.3-10.7 24-24 24s-24-10.7-24-24'/%3E%3C/svg%3E")}.icon-\[fa6-solid--clipboard\]{display:inline-block;width:.75em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M192 0c-41.8 0-77.4 26.7-90.5 64H64C28.7 64 0 92.7 0 128v320c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64h-37.5C269.4 26.7 233.8 0 192 0m0 64a32 32 0 1 1 0 64 32 32 0 1 1 0-64m-80 128h160c8.8 0 16 7.2 16 16s-7.2 16-16 16H112c-8.8 0-16-7.2-16-16s7.2-16 16-16'/%3E%3C/svg%3E")}.icon-\[fa6-solid--compass\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M256 512a256 256 0 1 0 0-512 256 256 0 1 0 0 512m50.7-186.9-144.3 55.5c-19.4 7.5-38.5-11.6-31-31l55.5-144.3c3.3-8.5 9.9-15.1 18.4-18.4l144.3-55.5c19.4-7.5 38.5 11.6 31 31l-55.5 144.3c-3.2 8.5-9.9 15.1-18.4 18.4M288 256a32 32 0 1 0-64 0 32 32 0 1 0 64 0'/%3E%3C/svg%3E")}.icon-\[fa6-solid--compass\],.icon-\[fa6-solid--crosshairs\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--crosshairs\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M256 0c17.7 0 32 14.3 32 32v10.4c93.7 13.9 167.7 88 181.6 181.6H480c17.7 0 32 14.3 32 32s-14.3 32-32 32h-10.4c-13.9 93.7-88 167.7-181.6 181.6V480c0 17.7-14.3 32-32 32s-32-14.3-32-32v-10.4C130.3 455.7 56.3 381.7 42.4 288H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h10.4C56.3 130.3 130.3 56.3 224 42.4V32c0-17.7 14.3-32 32-32M107.4 288c12.5 58.3 58.4 104.1 116.6 116.6V384c0-17.7 14.3-32 32-32s32 14.3 32 32v20.6c58.3-12.5 104.1-58.4 116.6-116.6H384c-17.7 0-32-14.3-32-32s14.3-32 32-32h20.6c-12.5-58.3-58.3-104.1-116.6-116.6V128c0 17.7-14.3 32-32 32s-32-14.3-32-32v-20.6c-58.3 12.5-104.1 58.3-116.6 116.6H128c17.7 0 32 14.3 32 32s-14.3 32-32 32zM256 224a32 32 0 1 1 0 64 32 32 0 1 1 0-64'/%3E%3C/svg%3E")}.icon-\[fa6-solid--download\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M288 32c0-17.7-14.3-32-32-32s-32 14.3-32 32v242.7l-73.4-73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l128 128c12.5 12.5 32.8 12.5 45.3 0l128-128c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L288 274.7zM64 352c-35.3 0-64 28.7-64 64v32c0 35.3 28.7 64 64 64h384c35.3 0 64-28.7 64-64v-32c0-35.3-28.7-64-64-64H346.5l-45.3 45.3c-25 25-65.5 25-90.5 0L165.5 352zm368 56a24 24 0 1 1 0 48 24 24 0 1 1 0-48'/%3E%3C/svg%3E")}.icon-\[fa6-solid--dumbbell\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M96 64c0-17.7 14.3-32 32-32h32c17.7 0 32 14.3 32 32v384c0 17.7-14.3 32-32 32h-32c-17.7 0-32-14.3-32-32v-64H64c-17.7 0-32-14.3-32-32v-64c-17.7 0-32-14.3-32-32s14.3-32 32-32v-64c0-17.7 14.3-32 32-32h32zm448 0v64h32c17.7 0 32 14.3 32 32v64c17.7 0 32 14.3 32 32s-14.3 32-32 32v64c0 17.7-14.3 32-32 32h-32v64c0 17.7-14.3 32-32 32h-32c-17.7 0-32-14.3-32-32V64c0-17.7 14.3-32 32-32h32c17.7 0 32 14.3 32 32M416 224v64H224v-64z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--dumbbell\],.icon-\[fa6-solid--eye-slash\]{display:inline-block;width:1.25em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--eye-slash\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2s-6.3 25.5 4.1 33.7l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7l-105.2-82.4c39.6-40.6 66.4-86.1 79.9-118.4 3.3-7.9 3.3-16.7 0-24.6-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8zm184.3 144.4c25.5-23.3 59.6-37.5 96.9-37.5 79.5 0 144 64.5 144 144 0 24.9-6.3 48.3-17.4 68.7L408 294.5c8.4-19.3 10.6-41.4 4.8-63.3-11.1-41.5-47.8-69.4-88.6-71.1-5.8-.2-9.2 6.1-7.4 11.7 2.1 6.4 3.3 13.2 3.3 20.3 0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zM373 389.9c-16.4 6.5-34.3 10.1-53 10.1-79.5 0-144-64.5-144-144 0-6.9.5-13.6 1.4-20.2l-94.3-74.3c-22.8 29.7-39.1 59.3-48.6 82.2-3.3 7.9-3.3 16.7 0 24.6 14.9 35.7 46.2 87.7 93 131.1 47 43.8 111.7 80.6 192.5 80.6 47.8 0 89.9-12.9 126.2-32.5z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--eye\]{width:1.13em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4 142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1 3.3-7.9 3.3-16.7 0-24.6-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32M144 256a144 144 0 1 1 288 0 144 144 0 1 1-288 0m144-64c0 35.3-28.7 64-64 64-7.1 0-13.9-1.2-20.3-3.3-5.5-1.8-11.9 1.6-11.7 7.4.3 6.9 1.3 13.8 3.2 20.7 13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-11.1-41.5-47.8-69.4-88.6-71.1-5.8-.2-9.2 6.1-7.4 11.7 2.1 6.4 3.3 13.2 3.3 20.3'/%3E%3C/svg%3E")}.icon-\[fa6-solid--eye\],.icon-\[fa6-solid--file\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--file\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M0 64C0 28.7 28.7 0 64 0h160v128c0 17.7 14.3 32 32 32h128v288c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64zm384 64H256V0z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--fire\]{display:inline-block;width:.88em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M159.3 5.4c7.8-7.3 19.9-7.2 27.7.1 27.6 25.9 53.5 53.8 77.7 84 11-14.4 23.5-30.1 37-42.9 7.9-7.4 20.1-7.4 28 .1 34.6 33 63.9 76.6 84.5 118 20.3 40.8 33.8 82.5 33.8 111.9C448 404.2 348.2 512 224 512 98.4 512 0 404.1 0 276.5c0-38.4 17.8-85.3 45.4-131.7C73.3 97.7 112.7 48.6 159.3 5.4M225.7 416c25.3 0 47.7-7 68.8-21 42.1-29.4 53.4-88.2 28.1-134.4-4.5-9-16-9.6-22.5-2l-25.2 29.3c-6.6 7.6-18.5 7.4-24.7-.5-16.5-21-46-58.5-62.8-79.8-6.3-8-18.3-8.1-24.7-.1-33.8 42.5-50.8 69.3-50.8 99.4.1 68.5 50.7 109.1 113.8 109.1'/%3E%3C/svg%3E")}.icon-\[fa6-solid--gauge-high\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M0 256a256 256 0 1 1 512 0 256 256 0 1 1-512 0M288 96a32 32 0 1 0-64 0 32 32 0 1 0 64 0m-32 320c35.3 0 64-28.7 64-64 0-17.4-6.9-33.1-18.1-44.6L366 161.7c5.3-12.1-.2-26.3-12.3-31.6s-26.3.2-31.6 12.3L257.9 288H256c-35.3 0-64 28.7-64 64s28.7 64 64 64m-80-272a32 32 0 1 0-64 0 32 32 0 1 0 64 0M96 288a32 32 0 1 0 0-64 32 32 0 1 0 0 64m352-32a32 32 0 1 0-64 0 32 32 0 1 0 64 0'/%3E%3C/svg%3E")}.icon-\[fa6-solid--gauge-high\],.icon-\[fa6-solid--gauge\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--gauge\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M0 256a256 256 0 1 1 512 0 256 256 0 1 1-512 0m320 96c0-26.9-16.5-49.9-40-59.3V88c0-13.3-10.7-24-24-24s-24 10.7-24 24v204.7c-23.5 9.5-40 32.5-40 59.3 0 35.3 28.7 64 64 64s64-28.7 64-64M144 176a32 32 0 1 0 0-64 32 32 0 1 0 0 64m-16 80a32 32 0 1 0-64 0 32 32 0 1 0 64 0m288 32a32 32 0 1 0 0-64 32 32 0 1 0 0 64m-16-144a32 32 0 1 0-64 0 32 32 0 1 0 64 0'/%3E%3C/svg%3E")}.icon-\[fa6-solid--gear\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M495.9 166.6c3.2 8.7.5 18.4-6.4 24.6l-43.3 39.4c1.1 8.3 1.7 16.8 1.7 25.4s-.6 17.1-1.7 25.4l43.3 39.4c6.9 6.2 9.6 15.9 6.4 24.6-4.4 11.9-9.7 23.3-15.8 34.3l-4.7 8.1c-6.6 11-14 21.4-22.1 31.2-5.9 7.2-15.7 9.6-24.5 6.8l-55.7-17.7c-13.4 10.3-28.2 18.9-44 25.4l-12.5 57.1c-2 9.1-9 16.3-18.2 17.8-13.8 2.3-28 3.5-42.5 3.5s-28.7-1.2-42.5-3.5c-9.2-1.5-16.2-8.7-18.2-17.8l-12.5-57.1c-15.8-6.5-30.6-15.1-44-25.4l-55.6 17.8c-8.8 2.8-18.6.3-24.5-6.8-8.1-9.8-15.5-20.2-22.1-31.2l-4.7-8.1c-6.1-11-11.4-22.4-15.8-34.3-3.2-8.7-.5-18.4 6.4-24.6l43.3-39.4c-1.1-8.4-1.7-16.9-1.7-25.5s.6-17.1 1.7-25.4l-43.3-39.4c-6.9-6.2-9.6-15.9-6.4-24.6 4.4-11.9 9.7-23.3 15.8-34.3l4.7-8.1c6.6-11 14-21.4 22.1-31.2 5.9-7.2 15.7-9.6 24.5-6.8l55.7 17.7c13.4-10.3 28.2-18.9 44-25.4l12.5-57.1c2-9.1 9-16.3 18.2-17.8C227.3 1.2 241.5 0 256 0s28.7 1.2 42.5 3.5c9.2 1.5 16.2 8.7 18.2 17.8l12.5 57.1c15.8 6.5 30.6 15.1 44 25.4l55.7-17.7c8.8-2.8 18.6-.3 24.5 6.8 8.1 9.8 15.5 20.2 22.1 31.2l4.7 8.1c6.1 11 11.4 22.4 15.8 34.3zM256 336a80 80 0 1 0 0-160 80 80 0 1 0 0 160'/%3E%3C/svg%3E")}.icon-\[fa6-solid--gear\],.icon-\[fa6-solid--golf-ball-tee\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--golf-ball-tee\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M384 192c0 66.8-34.1 125.6-85.8 160H85.8C34.1 317.6 0 258.8 0 192 0 86 86 0 192 0s192 86 192 192m-141.9 64.6c0 18.5-15 33.5-33.5 33.5-4.9 0-9.1 5.1-5.4 8.4 5.9 5.2 13.7 8.4 22.1 8.4 18.5 0 33.5-15 33.5-33.5 0-8.5-3.2-16.2-8.4-22.1-3.3-3.7-8.4.5-8.4 5.4zm-52.3-49.3c-4.9 0-9.1 5.1-5.4 8.4 5.9 5.2 13.7 8.4 22.1 8.4 18.5 0 33.5-15 33.5-33.5 0-8.5-3.2-16.2-8.4-22.1-3.3-3.7-8.4.5-8.4 5.4 0 18.5-15 33.5-33.5 33.5zm113.5-17.5c0 18.5-15 33.5-33.5 33.5-4.9 0-9.1 5.1-5.4 8.4 5.9 5.2 13.7 8.4 22.1 8.4 18.5 0 33.5-15 33.5-33.5 0-8.5-3.2-16.2-8.4-22.1-3.3-3.7-8.4.5-8.4 5.4zM96 416c0-17.7 14.3-32 32-32h128c17.7 0 32 14.3 32 32s-14.3 32-32 32h-16c-8.8 0-16 7.2-16 16v16c0 17.7-14.3 32-32 32s-32-14.3-32-32v-16c0-8.8-7.2-16-16-16h-16c-17.7 0-32-14.3-32-32'/%3E%3C/svg%3E")}.icon-\[fa6-solid--heart-pulse\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M228.3 469.1 47.6 300.4c-4.2-3.9-8.2-8.1-11.9-12.4h87c22.6 0 43-13.6 51.7-34.5l10.5-25.2 49.3 109.5c3.8 8.5 12.1 14 21.4 14.1s17.8-5 22-13.3l42.4-84.9 1.7 3.4c9.5 19 28.9 31 50.1 31h104.5c-3.7 4.3-7.7 8.5-11.9 12.4L283.7 469.1c-7.5 7-17.4 10.9-27.7 10.9s-20.2-3.9-27.7-10.9M503.7 240h-132c-3 0-5.8-1.7-7.2-4.4l-23.2-46.3c-4.1-8.1-12.4-13.3-21.5-13.3s-17.4 5.1-21.5 13.3l-41.4 82.8-51-113.9c-3.9-8.7-12.7-14.3-22.2-14.1s-18.1 5.9-21.8 14.8l-31.8 76.3c-1.2 3-4.2 4.9-7.4 4.9L16 240c-2.6 0-5 .4-7.3 1.1C3 225.2 0 208.2 0 190.9v-5.8c0-69.9 50.5-129.5 119.4-141 45.6-7.6 92 7.3 124.6 39.9l12 12 12-12c32.6-32.6 79-47.5 124.6-39.9 68.9 11.5 119.4 71.1 119.4 141v5.8c0 16.9-2.8 33.5-8.3 49.1'/%3E%3C/svg%3E")}.icon-\[fa6-solid--heart-pulse\],.icon-\[fa6-solid--language\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--language\]{width:1.25em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M0 128c0-35.3 28.7-64 64-64h512c35.3 0 64 28.7 64 64v256c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64zm320 0v256h256V128zm-141.7 47.9c-3.2-7.2-10.4-11.9-18.3-11.9s-15.1 4.7-18.3 11.9l-64 144c-4.5 10.1.1 21.9 10.2 26.4s21.9-.1 26.4-10.2l8.9-20.1h73.6l8.9 20.1c4.5 10.1 16.3 14.6 26.4 10.2s14.6-16.3 10.2-26.4zM160 233.2l19 42.8h-38zM448 164c11 0 20 9 20 20v4h60c11 0 20 9 20 20s-9 20-20 20h-2l-1.6 4.5c-8.9 24.4-22.4 46.6-39.6 65.4.9.6 1.8 1.1 2.7 1.6l18.9 11.3c9.5 5.7 12.5 18 6.9 27.4s-18 12.5-27.4 6.9L467 333.8c-4.5-2.7-8.8-5.5-13.1-8.5-10.6 7.5-21.9 14-34 19.4l-3.6 1.6c-10.1 4.5-21.9-.1-26.4-10.2s.1-21.9 10.2-26.4l3.6-1.6c6.4-2.9 12.6-6.1 18.5-9.8L410 286.1c-7.8-7.8-7.8-20.5 0-28.3s20.5-7.8 28.3 0l14.6 14.6.5.5c12.4-13.1 22.5-28.3 29.8-45l-35.2.1h-72c-11 0-20-9-20-20s9-20 20-20h52v-4c0-11 9-20 20-20'/%3E%3C/svg%3E")}.icon-\[fa6-solid--map-location-dot\]{display:inline-block;width:1.13em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M408 120c0 54.6-73.1 151.9-105.2 192-7.7 9.6-22 9.6-29.6 0C241.1 271.9 168 174.6 168 120 168 53.7 221.7 0 288 0s120 53.7 120 120m8 80.4c3.5-6.9 6.7-13.8 9.6-20.6.5-1.2 1-2.5 1.5-3.7l116-46.4c15.8-6.3 32.9 5.3 32.9 22.3v270.8c0 9.8-6 18.6-15.1 22.3L416 503zm-278.4-62.1c2.4 14.1 7.2 28.3 12.8 41.5 2.9 6.8 6.1 13.7 9.6 20.6v251.4L32.9 502.7C17.1 509 0 497.4 0 480.4V209.6c0-9.8 6-18.6 15.1-22.3l122.6-49zM327.8 332c13.9-17.4 35.7-45.7 56.2-77v249.3l-192-54.9V255c20.5 31.3 42.3 59.6 56.2 77 20.5 25.6 59.1 25.6 79.6 0M288 152a40 40 0 1 0 0-80 40 40 0 1 0 0 80'/%3E%3C/svg%3E")}.icon-\[fa6-solid--mountain\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M256 32c12.5 0 24.1 6.4 30.8 17l216.6 345.4c5.6 8.9 8.6 19.2 8.6 29.7 0 30.9-25 55.9-55.9 55.9H55.9C25 480 0 455 0 424.1c0-10.5 3-20.8 8.6-29.7L225.2 49c6.6-10.6 18.3-17 30.8-17m65 192-65-103.6-79.1 126.1 18.3 24.4c6.4 8.5 19.2 8.5 25.6 0l25.6-34.1c6-8.1 15.5-12.8 25.6-12.8z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--mountain\],.icon-\[fa6-solid--pen-to-square\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--pen-to-square\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0l-30.1 30 97.9 97.9 30.1-30.1c21.9-21.9 21.9-57.3 0-79.2zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5l167.3-167.4-98-98zM96 64c-53 0-96 43-96 96v256c0 53 43 96 96 96h256c53 0 96-43 96-96v-96c0-17.7-14.3-32-32-32s-32 14.3-32 32v96c0 17.7-14.3 32-32 32H96c-17.7 0-32-14.3-32-32V160c0-17.7 14.3-32 32-32h96c17.7 0 32-14.3 32-32s-14.3-32-32-32z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-hiking\]{width:.75em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M192 48a48 48 0 1 1 96 0 48 48 0 1 1-96 0m51.3 182.7L224.2 307l49.7 49.7c9 9 14.1 21.2 14.1 33.9V480c0 17.7-14.3 32-32 32s-32-14.3-32-32v-82.7l-73.9-73.9c-15.8-15.8-22.2-38.6-16.9-60.3l20.4-84c8.3-34.1 42.7-54.9 76.7-46.4 19 4.8 35.6 16.4 46.4 32.7l28.4 42.6H336v-24c0-13.3 10.7-24 24-24s24 10.7 24 24v304c0 13.3-10.7 24-24 24s-24-10.7-24-24V272h-39.4c-16 0-31-8-39.9-21.4l-13.3-20zM81.1 471.9 117.3 334c3 4.2 6.4 8.2 10.1 11.9l41.9 41.9-26.4 100.3c-4.5 17.1-22 27.3-39.1 22.8s-27.3-22-22.8-39.1zm55.5-346-35.2 140.6c-3 12.1-14.9 19.9-27.2 17.9l-47.9-8c-14-2.3-22.9-16.3-19.2-30L31.9 155c9.5-34.8 41.1-59 77.2-59h4.2c15.6 0 27.1 14.7 23.3 29.8z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-hiking\],.icon-\[fa6-solid--person-running\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--person-running\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M320 48a48 48 0 1 0-96 0 48 48 0 1 0 96 0M125.7 175.5c9.9-9.9 23.4-15.5 37.5-15.5 1.9 0 3.8.1 5.6.3L137.6 254c-9.3 28 1.7 58.8 26.8 74.5l86.2 53.9-25.4 88.8c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l28.7-100.4c5.9-20.6-2.6-42.6-20.7-53.9L238 299l30.9-82.4 5.1 12.3c15 35.8 49.9 59.1 88.7 59.1H384c17.7 0 32-14.3 32-32s-14.3-32-32-32h-21.3c-12.9 0-24.6-7.8-29.5-19.7l-6.3-15c-14.6-35.1-44.1-61.9-80.5-73.1l-48.7-15C186.6 97.8 175 96 163.3 96c-31 0-60.8 12.3-82.7 34.3l-23.2 23.1c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l23.1-23.1zM91.2 352H32c-17.7 0-32 14.3-32 32s14.3 32 32 32h69.6c19 0 36.2-11.2 43.9-28.5l11.5-25.9-9.5-6a95.4 95.4 0 0 1-37.9-44.9z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-skiing\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M380.7 48a48 48 0 1 1 96 0 48 48 0 1 1-96 0M2.7 268.9c6.1-11.8 20.6-16.3 32.4-10.2l197.6 102.6 46.2-69.2-75.1-75.1c-14.6-14.6-20.4-33.9-18.4-52.1l108.8 52 39.3 39.3c16.2 16.2 18.7 41.5 6 60.6L289.8 391l128.7 66.8c13.6 7.1 29.8 7.2 43.6.3l15.2-7.6c11.9-5.9 26.3-1.1 32.2 10.7s1.1 26.3-10.7 32.2l-15.2 7.6c-27.5 13.7-59.9 13.5-87.2-.7l-383.5-199c-11.7-6.1-16.3-20.6-10.2-32.4M118.9 65.6l18.1 8.6 8.7-17.4c4-7.9 13.6-11.1 21.5-7.2s11.1 13.6 7.2 21.5L165.9 88l54.7 26.2c1.5-.7 3.1-1.4 4.7-2.1l83.4-33.4c34.2-13.7 72.8 4.2 84.5 39.2l17.1 51.2 52.1 26.1c15.8 7.9 22.2 27.1 14.3 42.9s-27.1 22.2-42.9 14.3l-58.1-29c-11.4-5.7-20-15.7-24.1-27.8l-5.8-17.3-27.3 12.1-6.8 3-6.7-3.2-153.5-73.5-9.2 18.4c-4 7.9-13.6 11.1-21.5 7.2s-11.1-13.6-7.2-21.5l9-18-17.6-8.4c-8-3.8-11.3-13.4-7.5-21.3s13.4-11.3 21.3-7.5z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-skiing\],.icon-\[fa6-solid--person-snowboarding\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--person-snowboarding\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M209.7 3.4c15.8-7.9 35-1.5 42.9 14.3l25 50 42.4 8.5c19.5 3.9 37.8 12.3 53.5 24.5l126.1 98.1c14 10.9 16.5 31 5.6 44.9s-31 16.5-44.9 5.6l-72.1-56.1-71.5 31.8 33.1 27.6c23.2 19.3 33.5 50 26.7 79.4l-17.4 75.2c-2.2 9.4-8.2 16.8-16.1 21l86.5 33.1c4.6 1.8 9.4 2.6 14.3 2.6H472c13.3 0 24 10.7 24 24s-10.7 24-24 24h-28.2c-10.8 0-21.4-2-31.5-5.8L60.1 371.3c-11.5-4.4-22-11.2-30.8-20L7 329c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.4 22.4c4 4 8.7 7.1 14 9.1l22.4 8.6c-.8-1.6-1.5-3.2-2.1-4.9-5.6-16.8 3.5-34.9 20.2-40.5l74.2-24.9v-53.2c0-24.2 13.7-46.4 35.4-57.2l45.2-22.6-7.5-1.5c-19.4-3.9-35.9-16.5-44.7-34.1l-25-50c-7.9-15.8-1.5-35 14.3-42.9M139 350.1 298 411c-2.1-5.6-2.6-11.9-1.1-18.2l17.4-75.2c1.4-5.9-.7-12-5.3-15.9l-52.8-44v18.8c0 20.7-13.2 39-32.8 45.5zM432 0a48 48 0 1 1 0 96 48 48 0 1 1 0-96'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-swimming\]{display:inline-block;width:1.13em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='m309.5 178.4 138.4 118.7c-1.6.9-3.2 2-4.8 3-18 12.4-40.1 20.3-59.2 20.3-19.6 0-40.8-7.7-59.2-20.3-22.1-15.5-51.6-15.5-73.7 0-17.1 11.8-38 20.3-59.2 20.3-10.1 0-21.1-2.2-31.9-6.2C163.1 193.2 262.2 96 384 96h64c17.7 0 32 14.3 32 32s-14.3 32-32 32h-64c-26.9 0-52.3 6.6-74.5 18.4M160 160a64 64 0 1 1-128 0 64 64 0 1 1 128 0m146.5 165.9c22.5 15.5 50 26.1 77.5 26.1 26.9 0 55.4-10.8 77.4-26.1 11.9-8.5 28.1-7.8 39.2 1.7 14.4 11.9 32.5 21 50.6 25.2 17.2 4 27.9 21.2 23.9 38.4s-21.2 27.9-38.4 23.9c-24.5-5.7-44.9-16.5-58.2-25-29 15.6-61.5 25.9-94.5 25.9-31.9 0-60.6-9.9-80.4-18.9-5.8-2.7-11.1-5.3-15.6-7.7-4.5 2.4-9.7 5.1-15.6 7.7-19.8 9-48.5 18.9-80.4 18.9-33 0-65.5-10.3-94.5-25.8-13.4 8.4-33.7 19.3-58.2 25-17.2 4-34.4-6.7-38.4-23.9s6.7-34.4 23.9-38.4c18.1-4.2 36.2-13.3 50.6-25.2 11.1-9.4 27.3-10.1 39.2-1.7 22.1 15.2 50.5 26 77.4 26 27.5 0 55-10.6 77.5-26.1 11.1-7.9 25.9-7.9 37 0'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-walking\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='512'%3E%3Cpath d='M160 48a48 48 0 1 1 96 0 48 48 0 1 1-96 0m-33.5 151.3c-1 .4-1.9.8-2.9 1.2l-8 3.5c-16.4 7.3-29 21.2-34.7 38.2l-2.6 7.8c-5.6 16.8-23.7 25.8-40.5 20.2S12 246.5 17.6 229.7l2.6-7.8c11.4-34.1 36.6-61.9 69.4-76.5l8-3.5c20.8-9.2 43.3-14 66.1-14 44.6 0 84.8 26.8 101.9 67.9l15.4 36.9 21.4 10.7c15.8 7.9 22.2 27.1 14.3 42.9s-27.1 22.2-42.9 14.3L247 287.3c-10.3-5.2-18.4-13.8-22.8-24.5l-9.6-23-19.3 65.5 49.5 54c5.4 5.9 9.2 13 11.2 20.8l23 92.1c4.3 17.1-6.1 34.5-23.3 38.8s-34.5-6.1-38.8-23.3l-22-88.1-70.7-77.1c-14.8-16.1-20.3-38.6-14.7-59.7l16.9-63.5zM68.7 398l25-62.4c2.1 3 4.5 5.8 7 8.6l40.7 44.4-14.5 36.2c-2.4 6-6 11.5-10.6 16.1l-61.7 61.7c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--person-walking\],.icon-\[fa6-solid--question\]{display:inline-block;width:.63em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--question\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='512'%3E%3Cpath d='M80 160c0-35.3 28.7-64 64-64h32c35.3 0 64 28.7 64 64v3.6c0 21.8-11.1 42.1-29.4 53.8l-42.2 27.1a87.98 87.98 0 0 0-40.4 74v1.4c0 17.7 14.3 32 32 32s32-14.3 32-32v-1.4c0-8.2 4.2-15.8 11-20.2l42.2-27.1c36.6-23.6 58.8-64.1 58.8-107.7v-3.6c0-70.7-57.3-128-128-128h-32C73.3 32 16 89.3 16 160c0 17.7 14.3 32 32 32s32-14.3 32-32m80 320a40 40 0 1 0 0-80 40 40 0 1 0 0 80'/%3E%3C/svg%3E")}.icon-\[fa6-solid--quote-left\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M0 216C0 149.7 53.7 96 120 96h8c17.7 0 32 14.3 32 32s-14.3 32-32 32h-8c-30.9 0-56 25.1-56 56v8h64c35.3 0 64 28.7 64 64v64c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64zm256 0c0-66.3 53.7-120 120-120h8c17.7 0 32 14.3 32 32s-14.3 32-32 32h-8c-30.9 0-56 25.1-56 56v8h64c35.3 0 64 28.7 64 64v64c0 35.3-28.7 64-64 64h-64c-35.3 0-64-28.7-64-64z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--quote-left\],.icon-\[fa6-solid--retweet\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--retweet\]{width:1.13em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M272 416c17.7 0 32-14.3 32-32s-14.3-32-32-32H160c-17.7 0-32-14.3-32-32V192h32c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-64-64c-12.5-12.5-32.8-12.5-45.3 0l-64 64c-9.2 9.2-11.9 22.9-6.9 34.9S19.1 192 32.1 192h32v128c0 53 43 96 96 96h112zm32-320c-17.7 0-32 14.3-32 32s14.3 32 32 32h112c17.7 0 32 14.3 32 32v128h-32c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l64 64c12.5 12.5 32.8 12.5 45.3 0l64-64c9.2-9.2 11.9-22.9 6.9-34.9S556.9 320 543.9 320h-32V192c0-53-43-96-96-96z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--right-from-bracket\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='m377.9 105.9 122.8 122.8c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L377.9 406.1c-6.4 6.4-15 9.9-24 9.9-18.7 0-33.9-15.2-33.9-33.9V320H192c-17.7 0-32-14.3-32-32v-64c0-17.7 14.3-32 32-32h128v-62.1c0-18.7 15.2-33.9 33.9-33.9 9 0 17.6 3.6 24 9.9M160 96H96c-17.7 0-32 14.3-32 32v256c0 17.7 14.3 32 32 32h64c17.7 0 32 14.3 32 32s-14.3 32-32 32H96c-53 0-96-43-96-96V128c0-53 43-96 96-96h64c17.7 0 32 14.3 32 32s-14.3 32-32 32'/%3E%3C/svg%3E")}.icon-\[fa6-solid--right-from-bracket\],.icon-\[fa6-solid--right-to-bracket\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--right-to-bracket\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='m217.9 105.9 122.8 122.8c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L217.9 406.1c-6.4 6.4-15 9.9-24 9.9-18.7 0-33.9-15.2-33.9-33.9V320H32c-17.7 0-32-14.3-32-32v-64c0-17.7 14.3-32 32-32h128v-62.1c0-18.7 15.2-33.9 33.9-33.9 9 0 17.6 3.6 24 9.9M352 416h64c17.7 0 32-14.3 32-32V128c0-17.7-14.3-32-32-32h-64c-17.7 0-32-14.3-32-32s14.3-32 32-32h64c53 0 96 43 96 96v256c0 53-43 96-96 96h-64c-17.7 0-32-14.3-32-32s14.3-32 32-32'/%3E%3C/svg%3E")}.icon-\[fa6-solid--road\]{display:inline-block;width:1.13em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M256 32h-74.8c-27.1 0-51.3 17.1-60.3 42.6L3.1 407.2c-2 5.8-3.1 12-3.1 18.2C0 455.5 24.5 480 54.6 480H256v-64c0-17.7 14.3-32 32-32s32 14.3 32 32v64h201.4c30.2 0 54.6-24.5 54.6-54.6 0-6.2-1.1-12.4-3.1-18.2L455.1 74.6C446 49.1 421.9 32 394.8 32H320v64c0 17.7-14.3 32-32 32s-32-14.3-32-32zm64 192v64c0 17.7-14.3 32-32 32s-32-14.3-32-32v-64c0-17.7 14.3-32 32-32s32 14.3 32 32'/%3E%3C/svg%3E")}.icon-\[fa6-solid--route\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M512 96c0 50.2-59.1 125.1-84.6 155-3.8 4.4-9.4 6.1-14.5 5H320c-17.7 0-32 14.3-32 32s14.3 32 32 32h96c53 0 96 43 96 96s-43 96-96 96H139.6c8.7-9.9 19.3-22.6 30-36.8 6.3-8.4 12.8-17.6 19-27.2H416c17.7 0 32-14.3 32-32s-14.3-32-32-32h-96c-53 0-96-43-96-96s43-96 96-96h39.8c-21-31.5-39.8-67.7-39.8-96 0-53 43-96 96-96s96 43 96 96M117.1 489.1c-3.8 4.3-7.2 8.1-10.1 11.3l-1.8 2-.2-.2c-6 4.6-14.6 4-20-1.8C59.8 473 0 402.5 0 352c0-53 43-96 96-96s96 43 96 96c0 30-21.1 67-43.5 97.9-10.7 14.7-21.7 28-30.8 38.5zM128 352a32 32 0 1 0-64 0 32 32 0 1 0 64 0m288-224a32 32 0 1 0 0-64 32 32 0 1 0 0 64'/%3E%3C/svg%3E")}.icon-\[fa6-solid--route\],.icon-\[fa6-solid--ruler\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--ruler\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M177.9 494.1c-18.7 18.7-49.1 18.7-67.9 0l-92.1-92.2c-18.7-18.7-18.7-49.1 0-67.9l50.7-50.7 48 48c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6l-48-48 41.4-41.4 48 48c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6l-48-48 41.4-41.4 48 48c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6l-48-48 41.4-41.4 48 48c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6l-48-48L333.9 18C352.6-.7 383-.7 401.8 18l92.1 92.1c18.7 18.7 18.7 49.1 0 67.9z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--sailboat\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M256 16c0-7 4.5-13.2 11.2-15.3s13.9.4 17.9 6.1l224 320c3.4 4.9 3.8 11.3 1.1 16.6S502 352 496 352H272c-8.8 0-16-7.2-16-16zm-43.9 80.5c7 1.9 11.9 8.2 11.9 15.5v224c0 8.8-7.2 16-16 16H80c-5.7 0-11-3-13.8-8s-2.9-11-.1-16l128-224c3.6-6.3 11-9.4 18-7.5M5.7 404.3C2.8 394.1 10.5 384 21.1 384h533.8c10.6 0 18.3 10.1 15.4 20.3l-4 14.3C550.7 473.9 500.4 512 443 512H133c-57.4 0-107.7-38.1-123.3-93.3l-4-14.3z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--sailboat\],.icon-\[fa6-solid--share-from-square\]{display:inline-block;width:1.13em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--share-from-square\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='576' height='512'%3E%3Cpath d='M352 224h-46.5c-45 0-81.5 36.5-81.5 81.5 0 22.3 10.3 34.3 19.2 40.5 6.8 4.7 12.8 12 12.8 20.3 0 9.8-8 17.8-17.8 17.8h-2.5c-2.4 0-4.8-.4-7.1-1.4C210.8 374.8 128 333.4 128 240c0-79.5 64.5-144 144-144h80V34.7C352 15.5 367.5 0 386.7 0c8.6 0 16.8 3.2 23.2 8.9l138.2 124.4c7.6 6.8 11.9 16.5 11.9 26.7s-4.3 19.9-11.9 26.7l-139 125.1c-5.9 5.3-13.5 8.2-21.4 8.2H384c-17.7 0-32-14.3-32-32zM80 96c-8.8 0-16 7.2-16 16v320c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16v-48c0-17.7 14.3-32 32-32s32 14.3 32 32v48c0 44.2-35.8 80-80 80H80c-44.2 0-80-35.8-80-80V112c0-44.2 35.8-80 80-80h48c17.7 0 32 14.3 32 32s-14.3 32-32 32z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--square-check\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M64 32C28.7 32 0 60.7 0 96v320c0 35.3 28.7 64 64 64h320c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64zm273 177L209 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L303 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--square-check\],.icon-\[fa6-solid--stopwatch\]{display:inline-block;width:.88em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--stopwatch\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M176 0c-17.7 0-32 14.3-32 32s14.3 32 32 32h16v34.4C92.3 113.8 16 200 16 304c0 114.9 93.1 208 208 208s208-93.1 208-208c0-41.8-12.3-80.7-33.5-113.2l24.1-24.1c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L355.7 143c-28.1-23-62.2-38.8-99.7-44.6V64h16c17.7 0 32-14.3 32-32S289.7 0 272 0zm72 192v128c0 13.3-10.7 24-24 24s-24-10.7-24-24V192c0-13.3 10.7-24 24-24s24 10.7 24 24'/%3E%3C/svg%3E")}.icon-\[fa6-solid--tag\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M0 80v149.5c0 17 6.7 33.3 18.7 45.3l176 176c25 25 65.5 25 90.5 0l133.5-133.5c25-25 25-65.5 0-90.5l-176-176c-12-12-28.3-18.7-45.3-18.7L48 32C21.5 32 0 53.5 0 80m112 32a32 32 0 1 1 0 64 32 32 0 1 1 0-64'/%3E%3C/svg%3E")}.icon-\[fa6-solid--tag\],.icon-\[fa6-solid--trash\]{display:inline-block;width:.88em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--trash\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M135.2 17.7 128 32H32C14.3 32 0 46.3 0 64s14.3 32 32 32h384c17.7 0 32-14.3 32-32s-14.3-32-32-32h-96l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7M416 128H32l21.2 339c1.6 25.3 22.6 45 47.9 45h245.8c25.3 0 46.3-19.7 47.9-45z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--user-plus\]{width:1.25em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M96 128a128 128 0 1 1 256 0 128 128 0 1 1-256 0M0 482.3C0 383.8 79.8 304 178.3 304h91.4c98.5 0 178.3 79.8 178.3 178.3 0 16.4-13.3 29.7-29.7 29.7H29.7C13.3 512 0 498.7 0 482.3M504 312v-64h-64c-13.3 0-24-10.7-24-24s10.7-24 24-24h64v-64c0-13.3 10.7-24 24-24s24 10.7 24 24v64h64c13.3 0 24 10.7 24 24s-10.7 24-24 24h-64v64c0 13.3-10.7 24-24 24s-24-10.7-24-24'/%3E%3C/svg%3E")}.icon-\[fa6-solid--user-plus\],.icon-\[fa6-solid--user\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--user\]{width:.88em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='448' height='512'%3E%3Cpath d='M224 256a128 128 0 1 0 0-256 128 128 0 1 0 0 256m-45.7 48C79.8 304 0 383.8 0 482.3 0 498.7 13.3 512 29.7 512h388.6c16.4 0 29.7-13.3 29.7-29.7 0-98.5-79.8-178.3-178.3-178.3z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--users\]{width:1.25em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='512'%3E%3Cpath d='M144 0a80 80 0 1 1 0 160 80 80 0 1 1 0-160m368 0a80 80 0 1 1 0 160 80 80 0 1 1 0-160M0 298.7C0 239.8 47.8 192 106.7 192h42.7c15.9 0 31 3.5 44.6 9.7-1.3 7.2-1.9 14.7-1.9 22.3 0 38.2 16.8 72.5 43.3 96H21.3C9.6 320 0 310.4 0 298.7M405.3 320h-.7c26.6-23.5 43.3-57.8 43.3-96 0-7.6-.7-15-1.9-22.3 13.6-6.3 28.7-9.7 44.6-9.7h42.7c58.9 0 106.7 47.8 106.7 106.7 0 11.8-9.6 21.3-21.3 21.3H405.4zM224 224a96 96 0 1 1 192 0 96 96 0 1 1-192 0m-96 261.3c0-73.6 59.7-133.3 133.3-133.3h117.3c73.7 0 133.4 59.7 133.4 133.3 0 14.7-11.9 26.7-26.7 26.7H154.6c-14.7 0-26.7-11.9-26.7-26.7z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--users\],.icon-\[fa6-solid--weight-hanging\]{display:inline-block;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[fa6-solid--weight-hanging\]{width:1em;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M224 96a32 32 0 1 1 64 0 32 32 0 1 1-64 0m122.5 32c3.5-10 5.5-20.8 5.5-32 0-53-43-96-96-96s-96 43-96 96c0 11.2 1.9 22 5.5 32H120c-22 0-41.2 15-46.6 36.4l-72 288c-3.6 14.3-.4 29.5 8.7 41.2S33.2 512 48 512h416c14.8 0 28.7-6.8 37.8-18.5s12.3-26.8 8.7-41.2l-72-288C433.2 143 414 128 392 128z'/%3E%3C/svg%3E")}.icon-\[fa6-solid--xmark\]{display:inline-block;width:.75em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='384' height='512'%3E%3Cpath d='M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3l105.4 105.3c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256z'/%3E%3C/svg%3E")}.icon-\[ion--footsteps\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M133.83 361.27c-22.61 0-41-8.17-54.79-24.39s-22.84-40.29-28.11-75.31c-7.76-51.61-.06-95.11 21.68-122.48 12.8-16.12 29.6-25.44 48.58-26.94 16.25-1.3 40.54 5.29 64 44 14.69 24.24 25.86 56.44 30.65 88.34 5.79 38.51 1.48 66.86-13.18 86.65-11.64 15.72-29.54 25.46-53.21 29a106.5 106.5 0 0 1-15.62 1.13M173 496c-13.21 0-26.6-4.23-38.66-12.36a79.8 79.8 0 0 1-33.52-50.6c-2.85-14.66-1.14-26.31 5.22-35.64 10.33-15.15 28.87-18.56 48.49-22.18 2.07-.38 4.17-.76 6.3-1.17 4.52-.86 9.14-2 13.62-3.11 16.78-4.14 34.14-8.43 48.47 1.75 9.59 6.8 15 18.36 16.62 35.32 1.84 19.57-2.36 39.1-11.83 55-10.19 17.11-25.47 28.42-43 31.86A61 61 0 0 1 173 496m205.17-230.73a107 107 0 0 1-15.6-1.2c-23.66-3.5-41.56-13.25-53.2-29-14.66-19.79-19-48.13-13.18-86.65 4.79-31.93 15.93-64.1 30.55-88.25 23.34-38.57 47.66-45.26 64-44.08 18.92 1.38 35.69 10.57 48.51 26.6 21.89 27.37 29.65 71 21.86 122.84-5.27 35-14.2 58.95-28.11 75.31s-32.22 24.43-54.83 24.43M339 400a61 61 0 0 1-11.68-1.13c-17.56-3.44-32.84-14.75-43-31.86-9.47-15.9-13.67-35.43-11.83-55 1.6-17 7-28.52 16.62-35.33 14.33-10.17 31.69-5.89 48.47-1.74 4.48 1.1 9.1 2.24 13.62 3.11l6.29 1.17c19.63 3.61 38.17 7 48.5 22.17 6.36 9.33 8.07 21 5.22 35.64a79.78 79.78 0 0 1-33.52 50.61C365.56 395.78 352.17 400 339 400'/%3E%3C/svg%3E")}.icon-\[ion--footsteps\],.icon-\[ion--scale\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[ion--scale\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512'%3E%3Cpath d='M368 32H144A112.12 112.12 0 0 0 32 144v224a112.12 112.12 0 0 0 112 112h224a112.12 112.12 0 0 0 112-112V144A112.12 112.12 0 0 0 368 32m36.21 178-33.32 39.21A41.76 41.76 0 0 1 339 264.05a42.3 42.3 0 0 1-22.29-6.38c-14.22-8.78-36.3-19.25-60.69-19.25s-46.47 10.47-60.69 19.25a41.86 41.86 0 0 1-54.2-8.46L107.79 210a50.48 50.48 0 0 1 4.49-70.27c27.84-25.35 75.37-55.57 143.72-55.57s115.88 30.22 143.72 55.57a50.48 50.48 0 0 1 4.49 70.27'/%3E%3C/svg%3E")}.icon-\[material-symbols--electric-bike-outline\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M5 17q-2.125 0-3.562-1.437T0 12t1.463-3.562T5 7q1.925 0 3.238 1.15T9.9 11h.65l-1.8-5H7V4h5v2h-1.1l.35 1h4.8L14.6 3H12V1h2.6q.65 0 1.163.35t.737.95l1.7 4.65h.8q2.075 0 3.538 1.463T24 11.95q0 2.1-1.45 3.575T19 17q-1.8 0-3.162-1.125T14.1 13H9.9q-.35 1.725-1.7 2.863T5 17m0-2q1.025 0 1.763-.562T7.8 13H5v-2h2.8q-.3-.9-1.037-1.45T5 9q-1.275 0-2.137.863T2 12q0 1.25.863 2.125T5 15m7.7-4h1.4q.125-.575.338-1.075T15 9h-3.05zm6.3 4q1.275 0 2.138-.875T22 12q0-1.275-.862-2.137T19 9h-.1l1 2.65-1.9.7-.95-2.65q-.5.425-.775 1T16 12q0 1.25.863 2.125T19 15m-6 8-6-3h4v-2l6 3h-4zm6-11'/%3E%3C/svg%3E")}.icon-\[material-symbols--electric-bike-outline\],.icon-\[material-symbols--map\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[material-symbols--map\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='m15 21-6-2.1-4.65 1.8q-.5.2-.925-.112T3 19.75v-14q0-.325.188-.575T3.7 4.8L9 3l6 2.1 4.65-1.8q.5-.2.925.113T21 4.25v14q0 .325-.187.575t-.513.375zm-1-2.45V6.85l-4-1.4v11.7z'/%3E%3C/svg%3E")}.icon-\[material-symbols--pedal-bike-outline\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M5 20q-2.125 0-3.562-1.437T0 15t1.463-3.562T5 10q1.925 0 3.238 1.15T9.9 14h.65l-1.8-5H7V7h5v2h-1.1l.35 1h4.8L14.6 6H12V4h2.6q.65 0 1.163.35t.737.95l1.7 4.65h.8q2.075 0 3.538 1.463T24 14.95q0 2.1-1.45 3.575T19 20q-1.8 0-3.162-1.125T14.1 16H9.9q-.35 1.725-1.7 2.863T5 20m0-2q1.025 0 1.763-.562T7.8 16H5v-2h2.8q-.3-.9-1.037-1.45T5 12q-1.275 0-2.137.863T2 15q0 1.25.863 2.125T5 18m7.7-4h1.4q.125-.575.338-1.075T15 12h-3.05zm6.3 4q1.275 0 2.138-.875T22 15q0-1.275-.862-2.137T19 12h-.1l1 2.65-1.9.7-.95-2.65q-.5.425-.775 1T16 15q0 1.25.863 2.125T19 18m0-3'/%3E%3C/svg%3E")}.icon-\[material-symbols--pedal-bike-outline\],.icon-\[mdi--clipboard-check\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[mdi--clipboard-check\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='m10 17-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9m-6-6a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1s-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2'/%3E%3C/svg%3E")}.icon-\[octicon--mark-github-16\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cpath d='M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8'/%3E%3C/svg%3E")}.icon-\[mdi--human-male-height\],.icon-\[octicon--mark-github-16\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.icon-\[mdi--human-male-height\]{--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M7 2c1.78 0 2.67 2.16 1.42 3.42C7.16 6.67 5 5.78 5 4a2 2 0 0 1 2-2M5.5 7h3a2 2 0 0 1 2 2v5.5H9V22H5v-7.5H3.5V9a2 2 0 0 1 2-2M21 8h-6v2h6m0 1h-3v2h3m0-11h-6v2h6m0 1h-3v2h3m0 7h-6v2h6m0 4h-6v2h6m0-5h-3v2h3'/%3E%3C/svg%3E")}.icon-\[material-symbols--height-rounded\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M11 17.175V6.825l-.9.9Q9.825 8 9.413 8T8.7 7.7q-.275-.275-.275-.7t.275-.7l2.6-2.6q.15-.15.325-.213T12 3.426t.375.063.325.212l2.6 2.6q.275.275.275.688T15.3 7.7q-.3.3-.712.3t-.713-.3L13 6.825v10.35l.9-.9q.275-.275.688-.275t.712.3q.275.275.275.7t-.275.7l-2.6 2.6q-.15.15-.325.213t-.375.062-.375-.062-.325-.213l-2.6-2.6q-.275-.275-.287-.687T8.7 16.3q.275-.275.7-.275t.7.275z'/%3E%3C/svg%3E")}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.end-1{inset-inline-end:.25rem}.col-span-2{grid-column:span 2/span 2}.float-right{float:right}.-mr-5{margin-right:-1.25rem}.mb-2{margin-bottom:.5rem}.mr-2{margin-right:.5rem}.mt-3{margin-top:.75rem}.block{display:block}.inline{display:inline}.flex{display:flex}.table{display:table}.table-cell{display:table-cell}.grid{display:grid}.list-item{display:list-item}.hidden{display:none}.h-1{height:.25rem}.h-6{height:1.5rem}.h-\[300px\]{height:300px}.h-\[600px\]{height:600px}.max-h-48{max-height:12rem}.min-h-\[450px\]{min-height:450px}.w-1{width:.25rem}.w-1\/2{width:50%}.w-96{width:24rem}.max-w-\[0px\]{max-width:0}.shrink{flex-shrink:1}.grow{flex-grow:1}.basis-1\/2{flex-basis:50%}.basis-1\/4{flex-basis:25%}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-t-2{border-top-width:2px}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.border-neutral-500{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity,1))}.p-1{padding:.25rem}.p-2{padding:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.pt-3{padding-top:.75rem}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.text-green-500\/0{color:rgba(34,197,94,0)}.text-green-500\/10{color:rgba(34,197,94,.1)}.text-green-500\/100{color:#22c55e}.text-green-500\/15{color:rgba(34,197,94,.15)}.text-green-500\/20{color:rgba(34,197,94,.2)}.text-green-500\/25{color:rgba(34,197,94,.25)}.text-green-500\/30{color:rgba(34,197,94,.3)}.text-green-500\/35{color:rgba(34,197,94,.35)}.text-green-500\/40{color:rgba(34,197,94,.4)}.text-green-500\/45{color:rgba(34,197,94,.45)}.text-green-500\/5{color:rgba(34,197,94,.05)}.text-green-500\/50{color:rgba(34,197,94,.5)}.text-green-500\/55{color:rgba(34,197,94,.55)}.text-green-500\/60{color:rgba(34,197,94,.6)}.text-green-500\/65{color:rgba(34,197,94,.65)}.text-green-500\/70{color:rgba(34,197,94,.7)}.text-green-500\/75{color:rgba(34,197,94,.75)}.text-green-500\/80{color:rgba(34,197,94,.8)}.text-green-500\/85{color:rgba(34,197,94,.85)}.text-green-500\/90{color:rgba(34,197,94,.9)}.text-green-500\/95{color:rgba(34,197,94,.95)}.text-neutral-600{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity,1))}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity,1))}.text-rose-500\/0{color:rgba(244,63,94,0)}.text-rose-500\/10{color:rgba(244,63,94,.1)}.text-rose-500\/100{color:#f43f5e}.text-rose-500\/15{color:rgba(244,63,94,.15)}.text-rose-500\/20{color:rgba(244,63,94,.2)}.text-rose-500\/25{color:rgba(244,63,94,.25)}.text-rose-500\/30{color:rgba(244,63,94,.3)}.text-rose-500\/35{color:rgba(244,63,94,.35)}.text-rose-500\/40{color:rgba(244,63,94,.4)}.text-rose-500\/45{color:rgba(244,63,94,.45)}.text-rose-500\/5{color:rgba(244,63,94,.05)}.text-rose-500\/50{color:rgba(244,63,94,.5)}.text-rose-500\/55{color:rgba(244,63,94,.55)}.text-rose-500\/60{color:rgba(244,63,94,.6)}.text-rose-500\/65{color:rgba(244,63,94,.65)}.text-rose-500\/70{color:rgba(244,63,94,.7)}.text-rose-500\/75{color:rgba(244,63,94,.75)}.text-rose-500\/80{color:rgba(244,63,94,.8)}.text-rose-500\/85{color:rgba(244,63,94,.85)}.text-rose-500\/90{color:rgba(244,63,94,.9)}.text-rose-500\/95{color:rgba(244,63,94,.95)}.underline{text-decoration-line:underline}.overline{text-decoration-line:overline}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(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)}.ring{--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(3px + 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)}.blur{--tw-blur:blur(8px)}.blur,.grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale:grayscale(100%)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\[a-zA-Z\:\\-\\\.\]{a-z-a--z:\-\.}@media (min-width:640px){.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:table-cell{display:table-cell}.sm\:h-\[400px\]{height:400px}.sm\:w-\[300px\]{width:300px}.sm\:table-auto{table-layout:auto}.sm\:table-fixed{table-layout:fixed}.sm\:flex-wrap{flex-wrap:wrap}}@media (min-width:768px){.md\:mt-0{margin-top:0}.md\:flex{display:flex}.md\:h-8{height:2rem}.md\:h-\[500px\]{height:500px}.md\:h-\[600px\]{height:600px}.md\:h-\[800px\]{height:800px}.md\:min-w-\[400px\]{min-width:400px}.md\:grow{flex-grow:1}.md\:basis-1\/2{flex-basis:50%}.md\:flex-wrap{flex-wrap:wrap}.md\:justify-start{justify-content:flex-start}.md\:border-t-0{border-top-width:0}.md\:pt-0{padding-top:0}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-5xl{font-size:3rem;line-height:1}}@media (min-width:1024px){.lg\:flex{display:flex}.lg\:table-cell{display:table-cell}.lg\:hidden{display:none}.lg\:basis-1\/4{flex-basis:25%}.lg\:flex-wrap{flex-wrap:wrap}}@media (min-width:1280px){.xl\:inline{display:inline}.xl\:table-cell{display:table-cell}.xl\:hidden{display:none}.xl\:w-1\/3{width:33.333333%}}@media (min-width:1536px){.\32xl\:inline{display:inline}.\32xl\:w-1\/4{width:25%}.\32xl\:basis-1\/3{flex-basis:33.333333%}}.dark\:text-neutral-400:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity,1))}@media print{.print\:block{display:block}.print\:hidden{display:none}.print\:h-\[600px\]{height:600px}.print\:h-\[800px\]{height:800px}.print\:w-full{width:100%}}.\[\&\>\*\]\:basis-1\/2>*{flex-basis:50%}@media (min-width:1024px){.\[\&\>\*\]\:lg\:basis-1\/2>*{flex-basis:50%}}@media (min-width:1536px){.\[\&\>\*\]\:2xl\:basis-1\/3>*{flex-basis:33.333333%}} \ No newline at end of file diff --git a/docs/docs.go b/docs/docs.go index dc3991f6..bc0e8ef3 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -21,6 +21,121 @@ const docTemplate = `{ "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { + "/daily": { + "get": { + "produces": [ + "application/json" + ], + "summary": "List the daily measurements of the current user", + "parameters": [ + { + "type": "integer", + "description": "Number of measurements to return; default 50; -1 is no limit", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/app.APIResponse" + }, + { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/database.Measurement" + } + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Update the daily measurement of the current user", + "parameters": [ + { + "description": "Measurement data", + "name": "measurement", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/app.Measurement" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/app.APIResponse" + }, + { + "type": "object", + "properties": { + "results": { + "$ref": "#/definitions/database.Measurement" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + } + } + } + }, "/import/{program}": { "post": { "produces": [ @@ -354,6 +469,9 @@ const docTemplate = `{ }, "/workouts/": { "post": { + "consumes": [ + "application/json" + ], "produces": [ "application/json" ], @@ -669,6 +787,23 @@ const docTemplate = `{ } } }, + "app.Measurement": { + "type": "object", + "properties": { + "date": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "steps": { + "type": "integer" + }, + "weight": { + "type": "number" + } + } + }, "database.BreakdownItem": { "type": "object", "properties": { @@ -1166,6 +1301,40 @@ const docTemplate = `{ } } }, + "database.Measurement": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "date": { + "description": "The date of the measurement", + "type": "string" + }, + "height": { + "description": "The height of the user, in centimeter", + "type": "integer" + }, + "id": { + "type": "integer" + }, + "steps": { + "description": "The number of steps taken", + "type": "integer" + }, + "updatedAt": { + "type": "string" + }, + "userID": { + "description": "The ID of the user who owns the workout", + "type": "integer" + }, + "weight": { + "description": "The weight of the user, in kilograms", + "type": "number" + } + } + }, "database.Profile": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index 0c9ba937..c06c6c12 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -14,6 +14,121 @@ }, "basePath": "/api/v1", "paths": { + "/daily": { + "get": { + "produces": [ + "application/json" + ], + "summary": "List the daily measurements of the current user", + "parameters": [ + { + "type": "integer", + "description": "Number of measurements to return; default 50; -1 is no limit", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/app.APIResponse" + }, + { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/database.Measurement" + } + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Update the daily measurement of the current user", + "parameters": [ + { + "description": "Measurement data", + "name": "measurement", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/app.Measurement" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/app.APIResponse" + }, + { + "type": "object", + "properties": { + "results": { + "$ref": "#/definitions/database.Measurement" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.APIResponse" + } + } + } + } + }, "/import/{program}": { "post": { "produces": [ @@ -347,6 +462,9 @@ }, "/workouts/": { "post": { + "consumes": [ + "application/json" + ], "produces": [ "application/json" ], @@ -662,6 +780,23 @@ } } }, + "app.Measurement": { + "type": "object", + "properties": { + "date": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "steps": { + "type": "integer" + }, + "weight": { + "type": "number" + } + } + }, "database.BreakdownItem": { "type": "object", "properties": { @@ -1159,6 +1294,40 @@ } } }, + "database.Measurement": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "date": { + "description": "The date of the measurement", + "type": "string" + }, + "height": { + "description": "The height of the user, in centimeter", + "type": "integer" + }, + "id": { + "type": "integer" + }, + "steps": { + "description": "The number of steps taken", + "type": "integer" + }, + "updatedAt": { + "type": "string" + }, + "userID": { + "description": "The ID of the user who owns the workout", + "type": "integer" + }, + "weight": { + "description": "The weight of the user, in kilograms", + "type": "number" + } + } + }, "database.Profile": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 8c416a3f..447799e3 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -44,6 +44,17 @@ definitions: weight: type: number type: object + app.Measurement: + properties: + date: + type: string + height: + type: integer + steps: + type: integer + weight: + type: number + type: object database.BreakdownItem: properties: counter: @@ -388,6 +399,30 @@ definitions: description: The total duration of the workout up to this point type: integer type: object + database.Measurement: + properties: + createdAt: + type: string + date: + description: The date of the measurement + type: string + height: + description: The height of the user, in centimeter + type: integer + id: + type: integer + steps: + description: The number of steps taken + type: integer + updatedAt: + type: string + userID: + description: The ID of the user who owns the workout + type: integer + weight: + description: The weight of the user, in kilograms + type: number + type: object database.Profile: properties: api_active: @@ -784,6 +819,75 @@ info: title: Workout Tracker version: "1.0" paths: + /daily: + get: + parameters: + - description: Number of measurements to return; default 50; -1 is no limit + in: query + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + allOf: + - $ref: '#/definitions/app.APIResponse' + - properties: + results: + items: + $ref: '#/definitions/database.Measurement' + type: array + type: object + "400": + description: Bad Request + schema: + $ref: '#/definitions/app.APIResponse' + "404": + description: Not Found + schema: + $ref: '#/definitions/app.APIResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/app.APIResponse' + summary: List the daily measurements of the current user + post: + consumes: + - application/json + parameters: + - description: Measurement data + in: body + name: measurement + required: true + schema: + $ref: '#/definitions/app.Measurement' + produces: + - application/json + responses: + "200": + description: OK + schema: + allOf: + - $ref: '#/definitions/app.APIResponse' + - properties: + results: + $ref: '#/definitions/database.Measurement' + type: object + "400": + description: Bad Request + schema: + $ref: '#/definitions/app.APIResponse' + "404": + description: Not Found + schema: + $ref: '#/definitions/app.APIResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/app.APIResponse' + summary: Update the daily measurement of the current user /import/{program}: post: parameters: @@ -984,6 +1088,8 @@ paths: summary: List all workouts of the current user /workouts/: post: + consumes: + - application/json parameters: - description: Workout data in: body diff --git a/go.mod b/go.mod index a614ed0a..178ac9ab 100644 --- a/go.mod +++ b/go.mod @@ -91,6 +91,7 @@ require ( github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/spf13/pflag v1.0.6 // indirect + github.com/stackus/hxgo v0.3.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/tidwall/geoindex v1.7.0 // indirect github.com/tidwall/geojson v1.4.5 // indirect @@ -112,6 +113,7 @@ require ( google.golang.org/protobuf v1.36.5 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/datatypes v1.2.5 // indirect modernc.org/libc v1.61.11 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.8.2 // indirect diff --git a/go.sum b/go.sum index 731bf722..913f6a7c 100644 --- a/go.sum +++ b/go.sum @@ -267,6 +267,8 @@ github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/stackus/hxgo v0.3.0 h1:IDEXEUiyX3vCrnWBePS4f0EndzL+029PCAh2eu17ewg= +github.com/stackus/hxgo v0.3.0/go.mod h1:mvcS/vMspvy//9bpV1TijK49uj4ik65lOvoCzM+8nME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -452,6 +454,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/datatypes v1.2.5 h1:9UogU3jkydFVW1bIVVeoYsTpLRgwDVW3rHfJG6/Ek9I= +gorm.io/datatypes v1.2.5/go.mod h1:I5FUdlKpLb5PMqeMQhm30CQ6jXP8Rj89xkTeCSAaAD4= gorm.io/driver/mysql v1.2.0/go.mod h1:4RQmTg4okPghdt+kbe6e1bTXIQp7Ny1NnBn/3Z6ghjk= gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= @@ -462,6 +466,7 @@ gorm.io/driver/sqlite v1.2.6 h1:SStaH/b+280M7C8vXeZLz/zo9cLQmIGwwj3cSj7p6l4= gorm.io/driver/sqlite v1.2.6/go.mod h1:gyoX0vHiiwi0g49tv+x2E7l8ksauLK0U/gShcdUsjWY= gorm.io/driver/sqlserver v1.2.1 h1:KhGOjvPX7JZ5hPyQICTJfMuTz88zgJ2lk9bWiHVNHd8= gorm.io/driver/sqlserver v1.2.1/go.mod h1:nixq0OB3iLXZDiPv6JSOjWuPgpyaRpOIIevYtA4Ulb4= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gorm.io/gorm v1.22.3/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= diff --git a/main.css b/main.css index e313ca06..2f899ba9 100644 --- a/main.css +++ b/main.css @@ -58,17 +58,6 @@ @apply hover:brightness-125 hover:contrast-125; @apply focus:brightness-125 focus:contrast-125; } - button.edit, - button.share { - @apply border-amber-400; - @apply bg-amber-300; - @apply dark:bg-amber-500; - } - button.dangerous { - @apply border-rose-600; - @apply bg-rose-500; - @apply dark:bg-rose-700; - } button { @apply border-green-600; @apply text-white bg-green-500; @@ -79,6 +68,30 @@ @apply focus:brightness-125 focus:contrast-125; } + a.button { + @apply rounded-xl m-2 py-1 pr-1 pl-3 border font-bold; + @apply hover:brightness-125 hover:contrast-125; + @apply focus:brightness-125 focus:contrast-125; + @apply cursor-pointer; + + @apply border-green-600; + @apply text-white bg-green-500; + @apply dark:text-white dark:bg-green-700; + } + button.edit, + button.share, + a.action { + @apply border-amber-400; + @apply bg-amber-300; + @apply dark:bg-amber-500; + } + button.dangerous, + a.dangerous { + @apply border-rose-600; + @apply bg-rose-500; + @apply dark:bg-rose-700; + } + h2 { @apply text-xl md:text-2xl mb-5 mx-2 px-2; @apply text-zinc-800; diff --git a/pkg/app/api_handlers.go b/pkg/app/api_handlers.go index 210d1cf5..38baa2e1 100644 --- a/pkg/app/api_handlers.go +++ b/pkg/app/api_handlers.go @@ -90,6 +90,8 @@ func (a *App) apiRoutes(e *echo.Group) { })) apiGroup.GET("/whoami", a.apiWhoamiHandler).Name = "api-whoami" + apiGroup.GET("/daily", a.apiDailyHandler).Name = "api-daily" + apiGroup.POST("/daily", a.apiDailyUpdateHandler).Name = "api-daily-update" apiGroup.GET("/workouts", a.apiWorkoutsHandler).Name = "api-workouts" apiGroup.POST("/workouts", a.apiWorkoutAddHandler).Name = "api-workout-add" apiGroup.GET("/workouts/:id", a.apiWorkoutHandler).Name = "api-workout" @@ -361,6 +363,7 @@ func (a *App) apiWorkoutBreakdownHandler(c echo.Context) error { // apiWorkoutAddHandler creates a new workout // @Summary Create a new workout +// @Accept json // @Param workout body ManualWorkout true "Workout data" // @Produce json // @Success 200 {object} APIResponse{results=ManualWorkout} @@ -554,3 +557,102 @@ func (a *App) fillGeoJSONProperties(c echo.Context, w *database.Workout, f *geoj f.Properties["details"] = d } + +// apiDailyHandler returns the daily measurements for the user +// @Summary List the daily measurements of the current user +// @Param limit query int false "Number of measurements to return; default 50; -1 is no limit" +// @Produce json +// @Success 200 {object} APIResponse{results=[]database.Measurement} +// @Failure 400 {object} APIResponse +// @Failure 404 {object} APIResponse +// @Failure 500 {object} APIResponse +// @Router /daily [get] +func (a *App) apiDailyHandler(c echo.Context) error { + a.setContext(c) + + resp := APIResponse{} + u := a.getCurrentUser(c) + + limit := 50 + + if l := c.QueryParam("limit"); l != "" { + if nl, err := strconv.Atoi(l); err == nil { + limit = nl + } else { + return a.renderAPIError(c, resp, err) + } + } + + m, err := u.GetLatestMeasurements(limit) + if err != nil { + return a.renderAPIError(c, resp, err) + } + + resp.Results = m + + return c.JSON(http.StatusOK, resp) +} + +type Measurement struct { + Date *string `form:"date" json:"date"` + Weight *float64 `form:"weight" json:"weight"` + Height *uint64 `form:"height" json:"height"` + Steps *uint64 `form:"steps" json:"steps"` + + units *database.UserPreferredUnits +} + +func (m *Measurement) Time() time.Time { + if m.Date == nil { + return time.Now() + } + + d, err := time.Parse("2006-01-02", *m.Date) + if err != nil { + return time.Now() + } + + return d +} + +func (m *Measurement) Update(measurement *database.Measurement) { + setIfNotNil(&measurement.Weight, m.Weight) + setIfNotNil(&measurement.Height, m.Height) + setIfNotNil(&measurement.Steps, m.Steps) +} + +// apiDailyUpdateHandler updates the daily measurement for the user +// @Summary Update the daily measurement of the current user +// @Accept json +// @Param measurement body Measurement true "Measurement data" +// @Produce json +// @Success 200 {object} APIResponse{results=database.Measurement} +// @Failure 400 {object} APIResponse +// @Failure 404 {object} APIResponse +// @Failure 500 {object} APIResponse +// @Router /daily [post] +func (a *App) apiDailyUpdateHandler(c echo.Context) error { + a.setContext(c) + + resp := APIResponse{} + + d := &Measurement{units: a.getCurrentUser(c).PreferredUnits()} + if err := json.NewDecoder(c.Request().Body).Decode(d); err != nil { + return a.renderAPIError(c, resp, err) + } + + m, err := a.getCurrentUser(c).GetMeasurementForDate(d.Time()) + if err != nil { + return a.renderAPIError(c, resp, err) + } + + d.Update(m) + + if err := m.Save(a.db); err != nil { + return a.renderAPIError(c, resp, err) + } + + resp.Results = m + + return c.JSON(http.StatusOK, resp) +} diff --git a/pkg/app/handlers.go b/pkg/app/handlers.go index 39dc3ff0..0792f3c9 100644 --- a/pkg/app/handlers.go +++ b/pkg/app/handlers.go @@ -3,6 +3,7 @@ package app import ( "errors" "net/http" + "time" "github.com/a-h/templ" "github.com/jovandeginste/workout-tracker/v2/pkg/database" @@ -10,6 +11,7 @@ import ( "github.com/jovandeginste/workout-tracker/v2/views/partials" "github.com/jovandeginste/workout-tracker/v2/views/user" "github.com/labstack/echo/v4" + "github.com/stackus/hxgo/hxecho" ) var ErrUserNotFound = errors.New("user not found") @@ -45,6 +47,56 @@ func (a *App) statisticsHandler(c echo.Context) error { return Render(c, http.StatusOK, user.Statistics(u, statisticsParams.Since, statisticsParams.Per)) } +func (a *App) dailyDeleteHandler(c echo.Context) error { + a.setContext(c) + + u := a.getCurrentUser(c) + d := c.Param("date") + + t, err := time.Parse("2006-01-02", d) + if err != nil { + return a.redirectWithError(c, a.echo.Reverse("daily"), err) + } + + m, err := u.GetMeasurementForDate(t) + if err != nil { + return a.redirectWithError(c, a.echo.Reverse("daily"), err) + } + + if err := m.Delete(a.db); err != nil { + return a.redirectWithError(c, a.echo.Reverse("daily"), err) + } + + if hxecho.IsHtmx(c) { + c.Response().Header().Set("Hx-Redirect", a.echo.Reverse("daily")) + return c.String(http.StatusFound, "ok") + } + + return c.Redirect(http.StatusFound, a.echo.Reverse("daily")) +} + +func (a *App) dailyUpdateHandler(c echo.Context) error { + a.setContext(c) + + d := &Measurement{units: a.getCurrentUser(c).PreferredUnits()} + if err := c.Bind(d); err != nil { + return a.redirectWithError(c, a.echo.Reverse("daily"), err) + } + + m, err := a.getCurrentUser(c).GetMeasurementForDate(d.Time()) + if err != nil { + return a.redirectWithError(c, a.echo.Reverse("daily"), err) + } + + d.Update(m) + + if err := m.Save(a.db); err != nil { + return a.redirectWithError(c, a.echo.Reverse("daily"), err) + } + + return c.Redirect(http.StatusFound, a.echo.Reverse("daily")) +} + func (a *App) dailyHandler(c echo.Context) error { a.setContext(c) diff --git a/pkg/app/routes.go b/pkg/app/routes.go index 0fa09a8d..542d5b3a 100644 --- a/pkg/app/routes.go +++ b/pkg/app/routes.go @@ -120,6 +120,8 @@ func (a *App) addRoutesSecure(e *echo.Group) *echo.Group { secureGroup.GET("/", a.dashboardHandler).Name = "dashboard" secureGroup.GET("/daily", a.dailyHandler).Name = "daily" + secureGroup.POST("/daily", a.dailyUpdateHandler).Name = "daily-update" + secureGroup.DELETE("/daily/:date", a.dailyDeleteHandler).Name = "daily-delete" secureGroup.GET("/statistics", a.statisticsHandler).Name = "statistics" secureGroup.GET("/heatmap", a.heatmapHandler).Name = "heatmap" secureGroup.POST("/lookup-address", a.lookupAddressHandler).Name = "lookup-address" diff --git a/pkg/database/measurement.go b/pkg/database/measurement.go index daa065bc..6dcec273 100644 --- a/pkg/database/measurement.go +++ b/pkg/database/measurement.go @@ -1,12 +1,43 @@ package database -import "time" +import ( + "time" + + "gorm.io/datatypes" + "gorm.io/gorm" +) type Measurement struct { Model - User *User `gorm:"foreignKey:UserID"` // The user who owns the workout - Date *time.Time `json:"date" gorm:"not null;index;uniqueIndex:idx_user_date"` // The date of the measurement - Weight float64 `json:"weight"` // The weight of the user, in kilograms - Steps uint64 `json:"steps"` // The number of steps taken - UserID uint64 `gorm:"not null;index;uniqueIndex:idx_user_date"` // The ID of the user who owns the workout + User *User `json:"-" gorm:"foreignKey:UserID"` // The user who owns the workout + Date datatypes.Date `form:"date" json:"date" gorm:"not null;index;uniqueIndex:idx_user_date"` // The date of the measurement + Weight float64 `form:"weight" json:"weight"` // The weight of the user, in kilograms + Height uint64 `form:"height" json:"height"` // The height of the user, in centimeter + Steps uint64 `form:"steps" json:"steps"` // The number of steps taken + UserID uint64 `gorm:"not null;index;uniqueIndex:idx_user_date"` // The ID of the user who owns the workout +} + +func (u *User) NewMeasurement(d time.Time) *Measurement { + return &Measurement{ + User: u, + UserID: u.ID, + Date: datatypes.Date(d.UTC()), + } +} + +func (m *Measurement) Save(db *gorm.DB) error { + return db.Save(m).Error +} + +func (m *Measurement) Time() *time.Time { + t := time.Time(m.Date) + return &t +} + +func (m *Measurement) Delete(db *gorm.DB) error { + return db.Delete(m).Error +} + +func (m *Measurement) DateString() string { + return m.Time().Format("2006-01-02") } diff --git a/pkg/database/profile.go b/pkg/database/profile.go index 38fe5fb3..13562df1 100644 --- a/pkg/database/profile.go +++ b/pkg/database/profile.go @@ -41,6 +41,10 @@ func (u UserPreferredUnits) HeartRate() string { return "bpm" } +func (u UserPreferredUnits) Height() string { + return "cm" +} + func (u UserPreferredUnits) Cadence() string { return "spm" } diff --git a/pkg/database/user.go b/pkg/database/user.go index cd3a7c75..09fef870 100644 --- a/pkg/database/user.go +++ b/pkg/database/user.go @@ -11,6 +11,7 @@ import ( "github.com/invopop/ctxi18n" "github.com/invopop/ctxi18n/i18n" "golang.org/x/crypto/bcrypt" + "gorm.io/datatypes" "gorm.io/gorm" "gorm.io/gorm/clause" ) @@ -277,10 +278,28 @@ func (u *User) Delete(db *gorm.DB) error { return db.Select(clause.Associations).Delete(u).Error } +func (u *User) GetMeasurementForDate(date time.Time) (*Measurement, error) { + var m *Measurement + + if err := u.db.Where(&Measurement{UserID: u.ID}).Where("date = ?", datatypes.Date(date.UTC())).First(&m).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return u.NewMeasurement(date), nil + } + + return nil, err + } + + return m, nil +} + func (u *User) GetLatestMeasurementForDate(date time.Time) (*Measurement, error) { var m *Measurement - if err := u.db.Where(&Measurement{UserID: u.ID}).Where("date <= ?", date).Order("date DESC").First(&m).Error; err != nil { + if err := u.db.Where(&Measurement{UserID: u.ID}).Where("date <= ?", datatypes.Date(date)).Order("date DESC").First(&m).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return u.NewMeasurement(date), nil + } + return nil, err } @@ -297,6 +316,22 @@ func (u *User) GetLatestMeasurements(c int) ([]*Measurement, error) { return m, nil } +func (u *User) GetCurrentMeasurement() (*Measurement, error) { + var m *Measurement + + d := time.Now().UTC() + + if err := u.db.Where(&Measurement{UserID: u.ID}).Where("date = ?", datatypes.Date(d)).First(&m).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return u.NewMeasurement(d), nil + } + + return nil, err + } + + return m, nil +} + func (u *User) GetLatestMeasurement() (*Measurement, error) { return u.GetLatestMeasurementForDate(time.Now()) } diff --git a/translations/en.yaml b/translations/en.yaml index 75290494..57cba094 100644 --- a/translations/en.yaml +++ b/translations/en.yaml @@ -214,3 +214,7 @@ en: "Added %d new route segment(s): %s - we search for matches in the background": "Added %d new route segment(s): %s - we search for matches in the background." "The route segment '%s' has been updated": "The route segment '%s' has been updated." "Start searching in the background for matching workouts for route segment '%s'": "Start searching in the background for matching workouts for route segment '%s'." + No measurements found: No measurements found + Update: Update + Height: Height + Are you sure?: Are you sure? diff --git a/vendor/github.com/stackus/hxgo/.gitignore b/vendor/github.com/stackus/hxgo/.gitignore new file mode 100644 index 00000000..d999b25c --- /dev/null +++ b/vendor/github.com/stackus/hxgo/.gitignore @@ -0,0 +1,2 @@ +# JetBrains IDEs +.idea diff --git a/vendor/github.com/stackus/hxgo/LICENSE b/vendor/github.com/stackus/hxgo/LICENSE new file mode 100644 index 00000000..1c0bc0db --- /dev/null +++ b/vendor/github.com/stackus/hxgo/LICENSE @@ -0,0 +1,19 @@ +Copyright 2023 Michael Stack + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/stackus/hxgo/README.md b/vendor/github.com/stackus/hxgo/README.md new file mode 100644 index 00000000..c2ad028e --- /dev/null +++ b/vendor/github.com/stackus/hxgo/README.md @@ -0,0 +1,363 @@ +![golangish-htmxish-logo.png](golangish-htmxish-logo.png) + +# HTMX library for Go +[![GoDoc](https://godoc.org/github.com/stackus/hxgo?status.svg)](https://godoc.org/github.com/stackus/hxgo) + +This comprehensive library offers an array of functions and types specifically designed to streamline the handling of [HTMX](https://htmx.org/) requests and the construction of responses in the Go applications. + +> README.md logo image courtesy of ChatGPT. + +## Features +- Request and Response header helpers +- Easy APIs to build complex HTMX responses for Locations, Reswaps, and Triggers + +```go +import ( + "net/http" + + "github.com/stackus/hxgo" +) + +func myHandler(w http.ResponseWriter, r *http.Request) { + if hx.IsHtmx(r) { + // do something + + // load up on HTMX headers and set the status code to send back to the client + err := hx.Response(w, + hx.Location("/new-location", + hx.Target("#my-target"), + hx.Swap(hx.SwapInnerHtml.IgnoreTitle()), + hx.Values(map[string]string{"key": "value"}), + ), + hx.StatusStopPolling, + hx.Trigger( + hx.Event("my-event"), + hx.Event("my-other-event", "my-other-event-value"), + hx.Event("my-complex-event", map[string]any{ + "foo": "bar", + "baz": 123, + } + ), + ) + if err != nil { + // handle error + } + } +} +``` + +## Installation +The minimum version of Go required is **1.18**. Generics have been used to make some types and options easier to work with. + +Install using `go get`: +```bash +go get github.com/stackus/hxgo +``` + +Then import the package into your project: +```go +import "github.com/stackus/hxgo" +``` + +You'll then use `hx.*` to access the functions and types. + +## Working with Requests +To determine if a request is an HTMX request, use the `IsHtmx` function: + +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + if hx.IsHtmx(r) { + // do something + } +} +``` + +Helpers exist for each of the [HTMX request headers](https://htmx.org/reference/#request_headers): + +- `HX-Boosted`: Use the `IsBoosted` function to determine if the request is a boosted request +- `HX-Current-URL`: Use the `GetCurrentUrl` function to get the current URL of the request +- `HX-History-Restore-Request`: Use the `IsHistoryRestoreRequest` function to determine if the request is a history restore request +- `HX-Prompt`: Use the `GetPrompt` function to get the prompt value of the request +- `HX-Request`: Use the `IsRequest` or `IsHTMX` functions to determine if the request is an HTMX request +- `HX-Target`: Use the `GetTarget` function to get the target value of the request +- `HX-Trigger-Name`: Use the `GetTriggerName` function to get the trigger name of the request +- `HX-Trigger`: Use the `GetTrigger` function to get the trigger value of the request + +`Is*` functions return a boolean while `Get*` functions return a string. The absence of the corresponding HTMX header will return false or an empty string respectively. + +## Working with Responses +Use the `Response` function to modify the `http.ResponseWriter` to return an HTMX response: + +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + err := hx.Response(w, hx.Retarget("/new-location")) + if err != nil { + // handle error + } +} +``` + +Each of the [HTMX response headers](https://htmx.org/reference/#response_headers) has a corresponding option to set the header: + +- `HX-Location`: Use the `Location` option with a variable number of properties to set the location header. See the [Location](#location) section for more details. +- `HX-Push-Url`: Use the `PushURL` option to push a new URL into the browser history +- `HX-Redirect`: Use the `Redirect` option to redirect the browser to a new URL +- `HX-Refresh`: Use the `Refresh` option to refresh the browser +- `HX-Replace-Url`: Use the `ReplaceUrl` option to replace the current URL in the browser history +- `HX-Reswap`: Use the `Reswap` option or one of the `Swap*` constants to specify how the response will be swapped. See the [Reswap](#reswap) section for more details. +- `HX-Retarget`: Use the `Retarget` option with a CSS selector to redirect the response to a new element +- `HX-Reselect`: Use the `Reselect` option with a CSS selector to designate a different element in the response to be used +- `HX-Trigger`: Use the `Trigger` option to trigger client-side events. See the [Trigger](#trigger) section for more details. +- `HX-Trigger-After-Settle`: Use the `TriggerAfterSettle` option to trigger client-side events after the response has settled. See the [Trigger](#trigger) section for more details. +- `HX-Trigger-After-Swap`: Use the `TriggerAfterSwap` option to trigger client-side events after the response has been swapped. See the [Trigger](#trigger) section for more details. + +### Location +The `Location` option is used to set the [HX-Location Response Header](https://htmx.org/headers/hx-location/). It takes a path string and then an optional number of properties. The following properties are supported: + +- `Source`: The `Source` property is used to set the source element of the location header. +- `Event`: The `EventName` property is used to set the name of the event of the location header. + > Note: This property is called `EventName` so that it does not conflict with the `Event` property used by the `Trigger` option. +- `Handler`: The `Handler` property is used to set the handler of the location header. +- `Target`: The `Target` property is used to set the target of the location header. +- `Swap`: The `Swap` property is used to set the swap of the location header. The value may be a string or any of the `Swap*` constants. +- `Values`: The `Values` property is used to set the values of the location header. The value may be anything, but it is recommended to use a `map[string]any` or struct with JSON tags. +- `Headers`: The `Headers` property is used to set the headers of the location header. The value needs to be a `map[string]string`. +- `Select`: The `Select` property is used to set the select of the location header. + +Setting just the path: +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + hx.Response(w, hx.Location("/new-location")) + // Hx-Location: /new-location +} +``` +Setting multiple properties: +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + hx.Response(w, hx.Location("/new-location", + hx.Target("#my-target"), + hx.Swap(hx.SwapInnerHtml.IgnoreTitle()), + hx.Values(map[string]string{"key": "value"}), + )) + // Hx-Location: {"path":"/new-location","target":"#my-target","swap":"innerHTML ignoreTitle:true","values":{"key":"value"}} +} +``` + +### Reswap +The `Reswap` option is used to set the HX-Reswap response header. Using the `Reswap` option directly is possible, but it is recommended to use one of the `Swap*` constants instead. The following constants are supported: + +- `SwapInnerHtml`: Sets the HX-Reswap response header to `innerHTML` +- `SwapOuterHtml`: Sets the HX-Reswap response header to `outerHTML` +- `SwapBeforeBegin`: Sets the HX-Reswap response header to `beforebegin` +- `SwapAfterBegin`: Sets the HX-Reswap response header to `afterbegin` +- `SwapBeforeEnd`: Sets the HX-Reswap response header to `beforeend` +- `SwapAfterEnd`: Sets the HX-Reswap response header to `afterend` +- `SwapDelete`: Sets the HX-Reswap response header to `delete` +- `SwapNone`: Sets the HX-Reswap response header to `none` + +The result from `Reswap` and each constant can be chained with modifiers to configure the header even further. The following modifiers are supported: + +- `Transition`: Adds `transition:true` to enable the use of the View Transition API +- `Swap`: Used with a `time.Duration` to set the swap delay +- `Settle`: Used with a `time.Duration` to set the settle delay +- `IgnoreTitle`: Adds `ignoreTitle:true` to ignore the title of the response +- `Scroll`: Used with a CSS selector to scroll to the element after swapping +- `Show`: Used with a CSS selector to show the element after swapping +- `FocusScroll`: Used with a boolean to set the focus scroll behavior + +Setting just the reswap header two ways: +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + hx.Response(w, hx.Reswap("innerHTML")) + // Hx-Reswap: innerHTML + hx.Response(w, hx.SwapInnerHtml) + // Hx-Reswap: innerHTML +} +``` + +Setting the reswap header with modifiers: +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + hx.Response(w, hx.SwapInnerHtml.IgnoreTitle().Transition()) + // Hx-Reswap: innerHTML ignoreTitle:true transition:true +} +``` + +### Trigger +The `Trigger` option is used to set the [HX-Trigger Response Header](https://htmx.org/headers/hx-trigger/). It takes a variable number of events to trigger on the client. + +Events are created using `hx.Event` and can be either simple names or complex objects. The supported events include: + +Setting a simple event: +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + hx.Response(w, hx.Trigger(hx.Event("my-event"))) + // Hx-Trigger: {"my-event":null} +} +``` + +Setting a complex event: +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + myEvent := map[string]any{ + "foo": "bar", + "baz": 123, + } + + hx.Response(w, hx.Trigger(hx.Event("my-event", myEvent))) + // Hx-Trigger: {"my-event":{"foo":"bar","baz":123}} +} +``` + +Setting multiple events: +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + hx.Response(w, hx.Trigger( + hx.Event("my-event"), + hx.Event("my-other-event", "my-other-event-value"), + )) + // Hx-Trigger: {"my-event":null,"my-other-event":"my-other-event-value"} +} +``` + +The `data`, which is the second parameter of the `Event`, is variadic. If more than one data value is passed, the event is set to an array of those values. The following events demonstrate this equivalence: + +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + hx.Response(w, hx.Trigger( + hx.Event("my-event-1", "foo", "bar"), + hx.Event("my-event-2", []string{"foo", "bar"}), + )) + // Hx-Trigger: {"my-event-1":["foo","bar"], "my-event-2":["foo","bar"]} +} +``` + +Both `TriggerAfterSettle` and `TriggerAfterSwap` are available to trigger events after the response has settled or been swapped respectively. They take the same event arguments as `Trigger`. + +### Status +The `Status` option is used to set the HTTP status code of the response. There is only one status constant available: + +- `StatusStopPolling`: Sets the HTTP status code to 286 which is used by HTMX to halt polling requests + +Setting the status code: +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + hx.Response(w, hx.StatusStopPolling) + // HTTP/1.1 286 +} +``` + +The `Status` option can be used to set any HTTP status code and is not limited to the constants provided by this library. + +```go +func MyHandler(w http.ResponseWriter, r *http.Request) { + hx.Response(w, hx.Status(http.StatusGone)) + // HTTP/1.1 410 +} +``` + +## Usage with different HTTP frameworks +With the standard library, and other frameworks that adhere to its `http.ResponseWriter` interface, the `Response` function can be used directly to modify the response. + +### Standard Library (and some like Chi) +```go +package main + +import ( + "fmt" + "log" + "net/http" + + "github.com/stackus/hxgo" +) + +func helloWorldHandler(w http.ResponseWriter, r *http.Request) { + // Add HTMX headers and a status code to the response + err := hx.Response(w, + hx.Location("/foo"), + hx.StatusStopPolling, + ) + if err != nil { + log.Fatal(err) + } + + // Write the response body + _, _ = fmt.Fprintf(w, "Hello World") +} + +func main() { + http.HandleFunc("/", helloWorldHandler) + + fmt.Println("Server starting on port 8080...") + if err := http.ListenAndServe(":8080", nil); err != nil { + log.Fatal(err) + } +} +``` + +### Echo, Fiber, and other frameworks +For frameworks that do not use the standard library's `http.ResponseWriter` interface, there are request and response helpers available to make it easier to work with HTMX. + +For example, with [Echo](https://echo.labstack.com/): + +```go +package main + +import ( + "github.com/labstack/echo/v4" + + "github.com/stackus/hxgo" + "github.com/stackus/hxgo/hxecho" +) + +func main() { + // Create a new instance of Echo + e := echo.New() + + // Define a route for "/" + e.GET("/", func(c echo.Context) error { + // use hxecho.IsHtmx to determine if the request is an HTMX request + if hxecho.IsHtmx(c) { + // do something + // Adds HTMX headers but does not set the Status Code + r, err := hxecho.Response(c, + // Continue to use the base htmx types and options + hx.Location("/foo"), + hx.StatusStopPolling, + ) + if err != nil { + return err + } + + // Set the HTMX status code here and response body + return c.String(r.StatusCode(), "Hello Echo") + } + }) + + // Start the server on port 8080 + e.Logger.Fatal(e.Start(":8080")) +} +``` + +You will find request and response helpers for the following frameworks: +- Echo: [hxecho](./hxecho) +- Fiber: [hxfiber](./hxfiber) +- Gin: [hxgin](./hxgin) + +The `Response` function for each library will return a default status of 200 if no status is set. +If you need to set a status code, you can use the `Status` option. + +### Contributions +Contributions are welcome! Please open an issue or submit a pull request. If at all possible, please provide an example with your bug reports and tests with your pull requests. + +#### Reporting Bugs +- If you find a bug, please open an issue. +- Include a clear description of the bug, steps to reproduce it, and any relevant logs or screenshots. +- Before creating a new issue, please check if it has already been reported to avoid duplicates. + +#### Suggesting Enhancements +- We're always looking to improve our library. If you have ideas for new features or enhancements, feel free to open an issue to discuss it. +- Clearly explain your suggestion and its potential benefits. + +### License +This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. diff --git a/vendor/github.com/stackus/hxgo/golangish-htmxish-logo.png b/vendor/github.com/stackus/hxgo/golangish-htmxish-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0163d5a99c1621cbb6617246be08f13137319d68 GIT binary patch literal 129498 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ⅇ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

-f97LqEl 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/stackus/hxgo/hxecho/request.go b/vendor/github.com/stackus/hxgo/hxecho/request.go new file mode 100644 index 00000000..7c6c2af3 --- /dev/null +++ b/vendor/github.com/stackus/hxgo/hxecho/request.go @@ -0,0 +1,77 @@ +package hxecho + +import ( + "github.com/labstack/echo/v4" + + "github.com/stackus/hxgo" +) + +// IsBoosted checks the HX-Boosted header +// +// Returns true if the request is a boosted request +func IsBoosted(ctx echo.Context) bool { + return ctx.Request().Header.Get(hx.HxBoosted) == "true" +} + +// GetCurrentUrl extracts the HX-Current-URL header from an HTTP request. +// +// It returns the current URL of the browser if the header exists. +// If the header is not present, it returns an empty string. +func GetCurrentUrl(ctx echo.Context) string { + return ctx.Request().Header.Get(hx.HxCurrentUrl) +} + +// IsHistoryRestoreRequest determines if an HTTP request is a history restore request. +// +// It checks the presence of the HX-History-Restore-Request header in the request. +// Returns true if the header is present, otherwise returns false. +func IsHistoryRestoreRequest(ctx echo.Context) bool { + return ctx.Request().Header.Get(hx.HxHistoryRestoreRequest) != "" +} + +// GetPrompt extracts the HX-Prompt header from an HTTP request. +// +// It returns the user response to an Hx-Prompt if the header exists. +// If the header is not present, it returns an empty string. +func GetPrompt(ctx echo.Context) string { + return ctx.Request().Header.Get(hx.HxPrompt) +} + +// IsRequest determines if an HTTP request is an HTMX request. +// +// It checks the presence of the HX-Request header in the request. +// Returns true if the header is present, otherwise returns false. +func IsRequest(ctx echo.Context) bool { + return ctx.Request().Header.Get(hx.HxRequest) != "" +} + +// IsHtmx determines if an HTTP request is an HTMX request. +// +// Does the same thing as IsRequest, only with a more user-friendly name. +func IsHtmx(ctx echo.Context) bool { + return IsRequest(ctx) +} + +// GetTarget extracts the HX-Target header from an HTTP request. +// +// It returns the ID of the target element if the header exists. +// If the header is not present, it returns an empty string. +func GetTarget(ctx echo.Context) string { + return ctx.Request().Header.Get(hx.HxTarget) +} + +// GetTriggerName extracts the HX-Trigger-Name header from an HTTP request. +// +// It returns the name of the triggered element if the header exists. +// If the header is not present, it returns an empty string. +func GetTriggerName(ctx echo.Context) string { + return ctx.Request().Header.Get(hx.HxTriggerName) +} + +// GetTrigger extracts the HX-Trigger header from an HTTP request. +// +// It returns the ID of the trigger element if the header exists. +// If the header is not present, it returns an empty string. +func GetTrigger(ctx echo.Context) string { + return ctx.Request().Header.Get(hx.HxTrigger) +} diff --git a/vendor/github.com/stackus/hxgo/hxecho/response.go b/vendor/github.com/stackus/hxgo/hxecho/response.go new file mode 100644 index 00000000..dd3f6939 --- /dev/null +++ b/vendor/github.com/stackus/hxgo/hxecho/response.go @@ -0,0 +1,40 @@ +package hxecho + +import ( + "github.com/labstack/echo/v4" + + "github.com/stackus/hxgo" +) + +// Response modifies the echo.Context to add HTMX headers and status codes. +// +// This will set the HTMX headers but will not set the Status Code. Use the +// returned response to set the Status Code later with `response.StatusCode()`. +// +// The following options are available: +// - Status(int) | StatusStopPolling: Sets the HTTP status code of the HTMX response. +// - Location(path, ...properties): Enables client-side redirection without a full page reload. +// - PushUrl(string): Pushes a new URL into the history stack. +// - Redirect(string): Performs a client-side redirect with a full page reload. +// - Refresh(bool): If set to "true", triggers a full refresh of the client-side page. +// - ReplaceUrl(string): Replaces the current URL in the location bar. +// - Reswap(string) | {Swap constants}: Specifies how the response will be swapped. +// - Retarget(string): A CSS selector to update the target of the content update to a different page element. +// - Reselect(string): A CSS selector to select a part of the response to be swapped in, overriding existing hx-select on the triggering element. +// - Trigger(...events): Triggers client-side events. +// - TriggerAfterSettle(...events): Triggers client-side events after the settle step. +// - TriggerAfterSwap(...events): Triggers client-side events after the swap step. +func Response(ctx echo.Context, options ...hx.ResponseOption) (*hx.HtmxResponse, error) { + r, err := hx.BuildResponse(options...) + if err != nil { + return nil, err + } + + for k, v := range r.Headers() { + ctx.Response().Header().Set(k, v) + } + + // Skip setting the Status Code for Echo to avoid superfluous write errors + + return r, nil +} diff --git a/vendor/github.com/stackus/hxgo/location_options.go b/vendor/github.com/stackus/hxgo/location_options.go new file mode 100644 index 00000000..ad545b36 --- /dev/null +++ b/vendor/github.com/stackus/hxgo/location_options.go @@ -0,0 +1,110 @@ +package hx + +import ( + "encoding/json" + "fmt" +) + +// Location sets the HX-Location header. +// +// This header is used for client-side redirection without a full page reload. +// Additional properties like Target can be specified for more complex behaviors. +// +// For more details, see: https://htmx.org/headers/hx-location +// +// Simple redirection example: +// +// hx.Response(w, hx.Location("/test")) +// // Sets HX-Location header to "/test" +// +// Redirection with additional target example: +// +// hx.Response(w, hx.Location("/test", +// hx.Target("#testdiv"), +// )) +// // Sets HX-Location header to a JSON object: {"path":"/test","target":"#testdiv"} +func Location(path string, properties ...property) responseOptionFunc { + return func(o *HtmxResponse) { + loc := location{ + Path: path, + } + + if len(properties) == 0 { + o.headers[HxLocation] = loc.Path + return + } + + for _, property := range properties { + property.apply(&loc) + } + + value, err := json.Marshal(loc) + if err != nil { + panic(fmt.Errorf("unable to marshal HX-Location header: %w", err)) + } + + o.headers[HxLocation] = string(value) + } +} + +// Source sets the 'source' property of the HX-Location header. +// +// More details: https://htmx.org/headers/hx-location +type Source string + +func (l Source) apply(o *location) { o.Source = string(l) } + +// EventName sets the 'event' property of the HX-Location header. +// +// More details: https://htmx.org/headers/hx-location +type EventName string + +func (l EventName) apply(o *location) { o.Event = string(l) } + +// Handler sets the 'handler' property of the HX-Location header. +// +// More details: https://htmx.org/headers/hx-location +type Handler string + +func (l Handler) apply(o *location) { o.Handler = string(l) } + +// Target sets the 'target' property of the HX-Location header. +// +// More details: https://htmx.org/headers/hx-location +type Target string + +func (l Target) apply(o *location) { o.Target = string(l) } + +// Swap sets the 'swap' property of the HX-Location header. +// +// Either a string or a Reswap constant can be used. +// +// More details: https://htmx.org/headers/hx-location +func Swap[T string | Reswap](swap T) propertyFunc { + return func(o *location) { o.Swap = string(swap) } +} + +// Values sets the 'values' property of the HX-Location header. +// +// Accepts any type, but a map[string]any or a struct with JSON tags is recommended. +// +// More details: https://htmx.org/headers/hx-location +func Values(values any) propertyFunc { + return func(o *location) { o.Values = values } +} + +// Headers sets the 'headers' property of the HX-Location header. +// +// Accepts a map[string]string. +// +// More details: https://htmx.org/headers/hx-location +type Headers map[string]string + +func (l Headers) apply(o *location) { o.Headers = l } + +// Select sets the 'select' property of the HX-Location header. +// +// More details: https://htmx.org/headers/hx-location +type Select string + +func (l Select) apply(o *location) { o.Select = string(l) } diff --git a/vendor/github.com/stackus/hxgo/request.go b/vendor/github.com/stackus/hxgo/request.go new file mode 100644 index 00000000..7d92c03a --- /dev/null +++ b/vendor/github.com/stackus/hxgo/request.go @@ -0,0 +1,127 @@ +package hx + +import ( + "net/http" +) + +// Request Headers +const ( + // HxBoosted indicates that the request is a boosted request. + // + // See https://htmx.org/reference/#request_headers for more details. + // + // Use the IsBoosted() function to check this header in the request. + HxBoosted = "Hx-Boosted" + + // HxCurrentUrl represents the current URL of the browser. + // + // See https://htmx.org/reference/#request_headers for more details. + // + // Use the GetCurrentUrl() function to fetch this header from the request. + HxCurrentUrl = "Hx-Current-Url" + + // HxHistoryRestoreRequest is "true" if the request is for history restoration after a miss in the local history cache. + // + // See https://htmx.org/reference/#request_headers for more details. + // + // Use the IsHistoryRestoreRequest() function to check this header in the request. + HxHistoryRestoreRequest = "Hx-History-Restore-Request" + + // HxPrompt captures the user's response to an HX-Prompt. + // + // See https://htmx.org/reference/#request_headers for more details. + // + // Use the GetPrompt() function to fetch this header from the request. + HxPrompt = "Hx-Prompt" + + // HxRequest is always "true" if the request is an HTMX request. + // + // See https://htmx.org/reference/#request_headers for more details. + // + // Use the IsRequest() function to check this header in the request. + HxRequest = "Hx-Request" + + // HxTarget identifies the ID of the target element, if it exists. + // + // See https://htmx.org/reference/#request_headers for more details. + // + // Use the GetTarget() function to fetch this header from the request. + HxTarget = "Hx-Target" + + // HxTriggerName denotes the name of the triggered element, if it exists. + // + // See https://htmx.org/reference/#request_headers for more details. + // + // Use the GetTriggerName() function to fetch this header from the request. + HxTriggerName = "Hx-Trigger-Name" +) + +// IsBoosted checks the HX-Boosted header +// +// Returns true if the request is a boosted request +func IsBoosted(r *http.Request) bool { + return r.Header.Get(HxBoosted) != "" +} + +// GetCurrentUrl extracts the HX-Current-URL header from an HTTP request. +// +// It returns the current URL of the browser if the header exists. +// If the header is not present, it returns an empty string. +func GetCurrentUrl(r *http.Request) string { + return r.Header.Get(HxCurrentUrl) +} + +// IsHistoryRestoreRequest determines if an HTTP request is a history restore request. +// +// It checks the presence of the HX-History-Restore-Request header in the request. +// Returns true if the header is present, otherwise returns false. +func IsHistoryRestoreRequest(r *http.Request) bool { + return r.Header.Get(HxHistoryRestoreRequest) != "" +} + +// GetPrompt extracts the HX-Prompt header from an HTTP request. +// +// It returns the user response to an hx-prompt if the header exists. +// If the header is not present, it returns an empty string. +func GetPrompt(r *http.Request) string { + return r.Header.Get(HxPrompt) +} + +// IsRequest determines if an HTTP request is an HTMX request. +// +// It checks the presence of the HX-Request header in the request. +// Returns true if the header is present, otherwise returns false. +func IsRequest(r *http.Request) bool { + return r.Header.Get(HxRequest) != "" +} + +// IsHtmx determines if an HTTP request is an HTMX request. +// +// Does the same thing as IsRequest, only with a more user-friendly name. +func IsHtmx(r *http.Request) bool { + return IsRequest(r) +} + +// GetTarget extracts the HX-Target header from an HTTP request. +// +// It returns the ID of the target element if the header exists. +// If the header is not present, it returns an empty string. +func GetTarget(r *http.Request) string { + return r.Header.Get(HxTarget) +} + +// GetTriggerName extracts the HX-Trigger-Name header from an HTTP request. +// +// It returns the name of the triggered element if the header exists. +// If the header is not present, it returns an empty string. +func GetTriggerName(r *http.Request) string { + return r.Header.Get(HxTriggerName) +} + +// GetTrigger extracts the HX-Trigger header from an HTTP request. +// +// It returns the ID of the trigger element if the header exists. +// If the header is not present, it returns an empty string. +func GetTrigger(r *http.Request) string { + return r.Header.Get(HxTrigger) +} diff --git a/vendor/github.com/stackus/hxgo/response.go b/vendor/github.com/stackus/hxgo/response.go new file mode 100644 index 00000000..30827331 --- /dev/null +++ b/vendor/github.com/stackus/hxgo/response.go @@ -0,0 +1,139 @@ +package hx + +import ( + "net/http" +) + +// Response Headers +const ( + // HxLocation allows for client-side redirects without a full page reload. + // + // See https://htmx.org/reference/#response_headers for more details. + // + // Use the Location() option to set this header in the response. + HxLocation = "Hx-Location" + + // HxPushUrl pushes a new URL into the history stack. + // + // See https://htmx.org/reference/#response_headers for more details. + // + // Use the PushUrl() option to set this header in the response. + HxPushUrl = "Hx-Push-Url" + + // HxRedirect can be used for client-side redirects that require a full page reload. + // + // See https://htmx.org/reference/#response_headers for more details. + // + // Use the Redirect() option to set this header in the response. + HxRedirect = "Hx-Redirect" + + // HxRefresh when set to "true", triggers a full refresh of the client-side page. + // + // See https://htmx.org/reference/#response_headers for more details. + // + // Use the Refresh() option to set this header in the response. + HxRefresh = "Hx-Refresh" + + // HxReplaceUrl replaces the current URL in the location bar. + // + // See https://htmx.org/reference/#response_headers for more details. + // + // Use the ReplaceUrl() option to set this header in the response. + HxReplaceUrl = "Hx-Replace-Url" + + // HxReswap specifies how the response will be swapped. + // + // See https://htmx.org/reference/#response_headers for more details. + // + // Use the Reswap() option to set this header in the response. + HxReswap = "Hx-Reswap" + + // HxRetarget updates the target of the content update to a different element on the page using a CSS selector. + // + // See https://htmx.org/reference/#response_headers for more details. + // + // Use the Retarget() option to set this header in the response. + HxRetarget = "Hx-Retarget" + + // HxReselect allows selection of a specific part of the response to be swapped in, using a CSS selector. It overrides any existing hx-select on the triggering element. + // + // See https://htmx.org/reference/#response_headers for more details. + // + // Use the Reselect() option to set this header. + HxReselect = "Hx-Reselect" + + // HxTriggerAfterSettle triggers client-side events after the settle step. + // + // See https://htmx.org/reference/#response_headers for more details. + // + // Use the TriggerAfterSettle() option to set this header in the response. + HxTriggerAfterSettle = "Hx-Trigger-After-Settle" + + // HxTriggerAfterSwap triggers client-side events after the swap step. + // + // See https://htmx.org/reference/#response_headers for more details. + // + // Use the TriggerAfterSwap() option to set this header in the response. + HxTriggerAfterSwap = "Hx-Trigger-After-Reswap" +) + +// Response modifies the http.ResponseWriter to add HTMX headers and status codes. +// +// The following options are available: +// - Status(int) | StatusStopPolling: Sets the HTTP status code of the HTMX response. +// - Location(path, ...properties): Enables client-side redirection without a full page reload. +// - PushUrl(string): Pushes a new URL into the history stack. +// - Redirect(string): Performs a client-side redirect with a full page reload. +// - Refresh(bool): If set to "true", triggers a full refresh of the client-side page. +// - ReplaceUrl(string): Replaces the current URL in the location bar. +// - Reswap(string) | {Swap constants}: Specifies how the response will be swapped. +// - Retarget(string): A CSS selector to update the target of the content update to a different page element. +// - Reselect(string): A CSS selector to select a part of the response to be swapped in, overriding existing hx-select on the triggering element. +// - Trigger(...events): Triggers client-side events. +// - TriggerAfterSettle(...events): Triggers client-side events after the settle step. +// - TriggerAfterSwap(...events): Triggers client-side events after the swap step. +func Response(w http.ResponseWriter, options ...ResponseOption) error { + o, err := BuildResponse(options...) + if err != nil { + return err + } + + if len(o.headers) > 0 { + for k, v := range o.headers { + w.Header().Set(k, v) + } + } + + // Support setting the stop polling status code. + if o.status != 0 { + w.WriteHeader(o.status) + } + + return nil +} + +// BuildResponse creates a new HtmxResponse from the provided options. +// +// It can be used to create a response helper for your own HTTP library. +// +// Several libraries have already been implemented: +// - Echo: import github.com/stackus/hxgo/hxecho +// - Fiber: import github.com/stackus/hxgo/hxfiber +// - Gin: import github.com/stackus/hxgo/hxgin +func BuildResponse(options ...ResponseOption) (response *HtmxResponse, err error) { + // Recover from any panics that might happen during the processing of the options. + defer func() { + if r := recover(); r != nil { + err = r.(error) + } + }() + + o := &HtmxResponse{ + headers: make(map[string]string), + } + for _, option := range options { + option.apply(o) + } + + return o, nil +} diff --git a/vendor/github.com/stackus/hxgo/response_options.go b/vendor/github.com/stackus/hxgo/response_options.go new file mode 100644 index 00000000..7d292dd8 --- /dev/null +++ b/vendor/github.com/stackus/hxgo/response_options.go @@ -0,0 +1,96 @@ +package hx + +// Status is used to set the HTTP status code of the HTMX response. +// +// Example usage: +// +// hx.Response(w, hx.Status(http.StatusGone)) +// // Sets the HTTP status code to 410. +type Status int + +func (s Status) apply(o *HtmxResponse) { o.status = int(s) } + +// HTMX status codes. +const ( + // StatusStopPolling sends HTTP status code 286 to the client to stop polling. + // + // Example usage: + // hx.Response(w, hx.StatusStopPolling) + // // Sets the HTTP status code to 286. + StatusStopPolling Status = 286 +) + +// PushUrl sets the HX-Push-Url header. +// +// It pushes a new URL into the history stack. +// +// Example usage: +// +// hx.Response(w, hx.PushUrl("/new-url-location")) +// // Sets the HX-Push-Url header to "/new-url-location". +type PushUrl string + +func (p PushUrl) apply(o *HtmxResponse) { o.headers[HxPushUrl] = string(p) } + +// Redirect sets the HX-Redirect header. +// +// It is used for client-side redirects that require a full page reload. +// +// Example usage: +// +// hx.Response(w, hx.Redirect("/new-url-location")) +// // Sets the HX-Redirect header to "/new-url-location". +type Redirect string + +func (r Redirect) apply(o *HtmxResponse) { o.headers[HxRedirect] = string(r) } + +// Refresh sets the HX-Refresh header. +// +// When set to "true", it triggers a full refresh of the client-side page. +// Note: This function always sets it to "true". +// +// Example usage: +// +// hx.Response(w, hx.Refresh()) +// // Sets the HX-Refresh header to "true". +func Refresh() responseOptionFunc { + return func(o *HtmxResponse) { + o.headers[HxRefresh] = "true" + } +} + +// ReplaceUrl sets the HX-Replace-Url header. +// +// It replaces the current URL in the location bar. +// +// Example usage: +// +// hx.Response(w, hx.ReplaceUrl("/new-url-location")) +// // Sets the HX-Replace-Url header to "/new-url-location". +type ReplaceUrl string + +func (r ReplaceUrl) apply(o *HtmxResponse) { o.headers[HxReplaceUrl] = string(r) } + +// Retarget sets the HX-Retarget header. +// +// This option specifies a new CSS selector to redirect the content update to a different element on the page. +// +// Example usage: +// +// hx.Response(w, hx.Retarget("#new-target")) +// // Sets the HX-Retarget header to "#new-target". +type Retarget string + +func (t Retarget) apply(o *HtmxResponse) { o.headers[HxRetarget] = string(t) } + +// Reselect sets the HX-Reselect header. +// +// This option designates a CSS selector to determine which part of the response should be used for swapping in, effectively overriding any existing hx-select on the triggering element. +// +// Example usage: +// +// hx.Response(w, hx.Reselect("#new-target")) +// // Sets the HX-Reselect header to "#new-target". +type Reselect string + +func (s Reselect) apply(o *HtmxResponse) { o.headers[HxReselect] = string(s) } diff --git a/vendor/github.com/stackus/hxgo/reswap_options.go b/vendor/github.com/stackus/hxgo/reswap_options.go new file mode 100644 index 00000000..23819527 --- /dev/null +++ b/vendor/github.com/stackus/hxgo/reswap_options.go @@ -0,0 +1,149 @@ +package hx + +import ( + "fmt" + "time" +) + +// Reswap specifies how the response will be swapped in an HTMX request. +// +// Use the Reswap() directly to set this header in the response, or choose +// from the constants below for common swap styles. +// +// The constants correspond to the different swap styles: +// - SwapInnerHtml: Replaces the inner HTML of the target element. +// - SwapOuterHtml: Replaces the entire target element with the response. +// - SwapBeforeBegin: Inserts the response before the target element. +// - SwapAfterBegin: Inserts the response before the first child of the target element. +// - SwapBeforeEnd: Inserts the response after the last child of the target element. +// - SwapAfterEnd: Inserts the response after the target element. +// - SwapDelete: Deletes the target element, regardless of the response. +// - SwapNone: Does not append content from the response (out-of-band items will still be processed). +// +// For more details, see: https://htmx.org/attributes/hx-swap +// +// Simple usage: +// +// hx.Response(w, hx.Reswap("innerHTML")) +// // Sets HX-Reswap header to "innerHTML" +// +// Constant usage example (same as above): +// +// hx.Response(w, hx.SwapInnerHtml) +// // Also sets HX-Reswap header to "innerHTML" +// +// Constant usage example (with modifiers): +// +// hx.Response(w, hx.SwapInnerHtml.Swap(1*time.Second).Settle(2*time.Second)) +// // Sets HX-Reswap header to "innerHTML swap:1s settle:2s" +type Reswap string + +func (s Reswap) apply(o *HtmxResponse) { o.headers[HxReswap] = string(s) } + +// Reswap constants +const ( + // SwapInnerHtml replace the inner HTML of the target element + SwapInnerHtml Reswap = "innerHTML" + // SwapOuterHtml replace the entire target element with the response + SwapOuterHtml Reswap = "outerHTML" + // SwapAfterBegin insert the response before the target element + SwapBeforeBegin Reswap = "beforebegin" + // SwapAfterBegin insert the response before the first child of the target element + SwapAfterBegin Reswap = "afterbegin" + // SwapBeforeEnd insert the response after the last child of the target element + SwapBeforeEnd Reswap = "beforeend" + // SwapAfterEnd insert the response after the target element + SwapAfterEnd Reswap = "afterend" + // SwapDelete deletes the target element regardless of the response + SwapDelete Reswap = "delete" + // SwapNone does not append content from response (out of band items will still be processed) + SwapNone Reswap = "none" +) + +// Transition (reswap header modifier) allows you to specify the use of the View Transition API when a swap occurs +// +// More details: https://htmx.org/attributes/hx-swap/#transition-transition +// +// Example usage: +// +// hx.Response(w, hx.SwapInnerHtml.Transition()) +// // Sets HX-Reswap header to "innerHTML transition:true" +func (s Reswap) Transition() Reswap { + return Reswap(string(s) + " transition:true") +} + +// Swap (reswap header modifier) is used to set a time wait after receiving a response before swapping the content +// +// More details: https://htmx.org/attributes/hx-swap/#timing-swap-settle +// +// Example usage: +// +// hx.Response(w, hx.SwapInnerHtml.Swap(1*time.Second)) +// // Sets HX-Reswap header to "innerHTML swap:1s" +func (s Reswap) Swap(dur time.Duration) Reswap { + return Reswap(fmt.Sprintf("%s swap:%s", s, dur)) +} + +// Settle (reswap header modifier) is used to set a time to wait after swapping before triggering the settle step +// +// More details: https://htmx.org/attributes/hx-swap/#timing-swap-settle +// +// Example usage: +// +// hx.Response(w, hx.SwapInnerHtml.Settle(1*time.Second)) +// // Sets HX-Reswap header to "innerHTML settle:1s" +func (s Reswap) Settle(dur time.Duration) Reswap { + return Reswap(fmt.Sprintf("%s settle:%s", s, dur)) +} + +// IgnoreTitle (reswap header modifier) is used to ignore any tags in the response +// +// More details: https://htmx.org/attributes/hx-swap/#ignore-title +// +// Example usage: +// +// hx.Response(w, hx.SwapInnerHtml.IgnoreTitle()) +// // Sets HX-Reswap header to "innerHTML ignoreTitle:true" +func (s Reswap) IgnoreTitle() Reswap { + return Reswap(string(s) + " ignoreTitle:true") +} + +// Scroll (reswap header modifier) is used to scroll to the "top", "bottom", a specific element after swapping +// +// More details: https://htmx.org/attributes/hx-swap/#scrolling-scroll-show +// +// Example usage: +// +// hx.Response(w, hx.SwapInnerHtml.Scroll("top")) +// // Sets HX-Reswap header to "innerHTML scroll:top" +// hx.Response(w, hx.SwapInnerHtml.Scroll("#another-div:top")) +// // Sets HX-Reswap header to "innerHTML scroll:#another-div:top" +func (s Reswap) Scroll(target string) Reswap { + return Reswap(fmt.Sprintf("%s scroll:%s", s, target)) +} + +// Show (reswap header modifier) is used to show the "top", "bottom", or a specific element after swapping +// +// More details: https://htmx.org/attributes/hx-swap/#scrolling-scroll-show +// +// Example usage: +// +// hx.Response(w, hx.SwapInnerHtml.Show("top")) +// // Sets HX-Reswap header to "innerHTML show:top" +// hx.Response(w, hx.SwapInnerHtml.Show("#another-div:top")) +// // Sets HX-Reswap header to "innerHTML show:#another-div:top" +func (s Reswap) Show(target string) Reswap { + return Reswap(fmt.Sprintf("%s show:%s", s, target)) +} + +// FocusScroll (reswap header modifier) can be used to enable to disable scrolling to the element after swapping +// +// More details: https://htmx.org/attributes/hx-swap/#focus-scroll +// +// Example usage: +// +// hx.Response(w, hx.SwapInnerHtml.FocusScroll(true)) +// // Sets HX-Reswap header to "innerHTML focus-scroll:true" +func (s Reswap) FocusScroll(focus bool) Reswap { + return Reswap(fmt.Sprintf("%s focus-scroll:%t", s, focus)) +} diff --git a/vendor/github.com/stackus/hxgo/trigger_options.go b/vendor/github.com/stackus/hxgo/trigger_options.go new file mode 100644 index 00000000..c1433f72 --- /dev/null +++ b/vendor/github.com/stackus/hxgo/trigger_options.go @@ -0,0 +1,104 @@ +package hx + +// Request & Response Headers +const ( + // HxTrigger + // (in request) the id of the trigger element if it exists + // (in response) allows you to trigger events on the client + // + // More details: https://htmx.org/reference/#request_headers and https://htmx.org/reference/#response_headers + // + // - Use the GetTrigger() function to fetch this header from the request + // - Use the Trigger(...events) option to set this header on the response + HxTrigger = "HX-Trigger" +) + +// Trigger allows you to trigger events on the client +// +// More details: https://htmx.org/reference/#response_headers +// +// Use Event to create events to pass to this option. +// +// Simple example: +// +// hx.Response(w, hx.Trigger(hx.Event("myEvent"))) +// // Sets HX-Trigger header to {"myEvent":null} +// +// Example with data: +// +// hx.Response(w, hx.Trigger(hx.Event("myEvent", "myData"))) +// // Sets HX-Trigger header to {"myEvent":"myData"} +// +// Example with multiple events: +// +// hx.Response(w, hx.Trigger( +// hx.Event("myEvent", "myData"), +// hx.Event("myOtherEvent", "myOtherData"), +// )) +// // Sets HX-Trigger header to {"myEvent":"myData","myOtherEvent":"myOtherData"} +// +// See also: TriggerAfterSettle and TriggerAfterSwap +func Trigger(events ...event) responseOptionFunc { + return func(o *HtmxResponse) { + data := triggeredEvents(events) + o.headers[HxTrigger] = string(data) + } +} + +// TriggerAfterSettle triggers client-side events after the settle step. +// +// More details: https://htmx.org/reference/#response_headers +// +// For more details, see: Trigger +func TriggerAfterSettle(events ...event) responseOptionFunc { + return func(o *HtmxResponse) { + data := triggeredEvents(events) + o.headers[HxTriggerAfterSettle] = string(data) + } +} + +// TriggerAfterSwap triggers client-side events after the swap step. +// +// More details: https://htmx.org/reference/#response_headers +// +// For more details, see: Trigger +func TriggerAfterSwap(events ...event) responseOptionFunc { + return func(o *HtmxResponse) { + data := triggeredEvents(events) + o.headers[HxTriggerAfterSwap] = string(data) + } +} + +// Event creates an event to pass to one of the Trigger options. +// +// Simple named event: +// +// hx.Event("myEvent") +// // Returns {"myEvent":null} +// +// Named event with string data: +// +// hx.Event("myEvent", "myData") +// // Returns {"myEvent":"myData"} +// +// Named event with multiple data items (treated like an array): +// +// hx.Event("myEvent", "myData1", "myData2") +// // Returns {"myEvent":["myData1","myData2"]} +// +// Named event with a struct or map (treated like an object): +// +// hx.Event("myEvent", map[string]string{"myKey": "myValue"}) +// // Returns {"myEvent":{"myKey":"myValue"}} +func Event(name string, data ...any) event { + return func() map[string]any { + switch len(data) { + case 0: + return map[string]any{name: nil} + case 1: + return map[string]any{name: data[0]} + default: + return map[string]any{name: data} + } + } +} diff --git a/vendor/github.com/stackus/hxgo/types.go b/vendor/github.com/stackus/hxgo/types.go new file mode 100644 index 00000000..f1ed6653 --- /dev/null +++ b/vendor/github.com/stackus/hxgo/types.go @@ -0,0 +1,84 @@ +package hx + +import ( + "encoding/json" + "fmt" + "net/http" +) + +// internal types related to Location + +type property interface { + apply(*location) +} + +type propertyFunc func(*location) + +func (f propertyFunc) apply(o *location) { f(o) } + +type location struct { + Path string `json:"path"` + Source string `json:"source,omitempty"` + Event string `json:"event,omitempty"` + Handler string `json:"handler,omitempty"` + Target string `json:"target,omitempty"` + Swap string `json:"swap,omitempty"` + Values any `json:"values,omitempty"` + Headers map[string]string `json:"headers,omitempty"` + Select string `json:"select,omitempty"` +} + +// TODO Can you return a complete event in the HX-Location event property? If so uncomment this +// func (e event) apply(o *location) { +// data, err := json.Marshal(e) +// if err != nil { +// panic(fmt.Errorf("unable to marshal event: %w", err)) +// } +// o.Event = string(data) +// } + +// internal types related to the response + +// HtmxResponse is a struct that contains the headers and status code to be returned to the client +// +// This is helpful for using HTMX with a framework that doesn't implement the stdlib http.ResponseWriter +type HtmxResponse struct { + headers map[string]string + status int +} + +func (r HtmxResponse) Headers() map[string]string { return r.headers } +func (r HtmxResponse) StatusCode() int { + if r.status == 0 { + return http.StatusOK + } + return r.status +} + +// ResponseOption is an interface that can be used to set the headers and status code of the response +type ResponseOption interface { + apply(*HtmxResponse) +} + +type responseOptionFunc func(*HtmxResponse) + +func (f responseOptionFunc) apply(o *HtmxResponse) { f(o) } + +// internal types related to triggering events + +type event func() map[string]any + +func triggeredEvents(events []event) []byte { + m := make(map[string]any) + for _, event := range events { + for k, v := range event() { + m[k] = v + } + } + data, err := json.Marshal(m) + if err != nil { + panic(fmt.Errorf("unable to marshal all events: %w", err)) + } + + return data +} diff --git a/vendor/gorm.io/datatypes/License b/vendor/gorm.io/datatypes/License new file mode 100644 index 00000000..037e1653 --- /dev/null +++ b/vendor/gorm.io/datatypes/License @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-NOW Jinzhu <wosmvp@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/gorm.io/datatypes/README.md b/vendor/gorm.io/datatypes/README.md new file mode 100644 index 00000000..6c4faecc --- /dev/null +++ b/vendor/gorm.io/datatypes/README.md @@ -0,0 +1,328 @@ +# GORM Data Types + +## JSON + +sqlite, mysql, postgres supported + +```go +import "gorm.io/datatypes" + +type UserWithJSON struct { + gorm.Model + Name string + Attributes datatypes.JSON +} + +DB.Create(&UserWithJSON{ + Name: "json-1", + Attributes: datatypes.JSON([]byte(`{"name": "jinzhu", "age": 18, "tags": ["tag1", "tag2"], "orgs": {"orga": "orga"}}`)), +} + +// Check JSON has keys +datatypes.JSONQuery("attributes").HasKey(value, keys...) + +db.Find(&user, datatypes.JSONQuery("attributes").HasKey("role")) +db.Find(&user, datatypes.JSONQuery("attributes").HasKey("orgs", "orga")) +// MySQL +// SELECT * FROM `users` WHERE JSON_EXTRACT(`attributes`, '$.role') IS NOT NULL +// SELECT * FROM `users` WHERE JSON_EXTRACT(`attributes`, '$.orgs.orga') IS NOT NULL + +// PostgreSQL +// SELECT * FROM "user" WHERE "attributes"::jsonb ? 'role' +// SELECT * FROM "user" WHERE "attributes"::jsonb -> 'orgs' ? 'orga' + + +// Check JSON extract value from keys equal to value +datatypes.JSONQuery("attributes").Equals(value, keys...) + +DB.First(&user, datatypes.JSONQuery("attributes").Equals("jinzhu", "name")) +DB.First(&user, datatypes.JSONQuery("attributes").Equals("orgb", "orgs", "orgb")) +// MySQL +// SELECT * FROM `user` WHERE JSON_EXTRACT(`attributes`, '$.name') = "jinzhu" +// SELECT * FROM `user` WHERE JSON_EXTRACT(`attributes`, '$.orgs.orgb') = "orgb" + +// PostgreSQL +// SELECT * FROM "user" WHERE json_extract_path_text("attributes"::json,'name') = 'jinzhu' +// SELECT * FROM "user" WHERE json_extract_path_text("attributes"::json,'orgs','orgb') = 'orgb' +``` + +NOTE: SQlite need to build with `json1` tag, e.g: `go build --tags json1`, refer https://github.com/mattn/go-sqlite3#usage + +## Date + +```go +import "gorm.io/datatypes" + +type UserWithDate struct { + gorm.Model + Name string + Date datatypes.Date +} + +user := UserWithDate{Name: "jinzhu", Date: datatypes.Date(time.Now())} +DB.Create(&user) +// INSERT INTO `user_with_dates` (`name`,`date`) VALUES ("jinzhu","2020-07-17 00:00:00") + +DB.First(&result, "name = ? AND date = ?", "jinzhu", datatypes.Date(curTime)) +// SELECT * FROM user_with_dates WHERE name = "jinzhu" AND date = "2020-07-17 00:00:00" ORDER BY `user_with_dates`.`id` LIMIT 1 +``` + +## Time + +MySQL, PostgreSQL, SQLite, SQLServer are supported. + +Time with nanoseconds is supported for some databases which support for time with fractional second scale. + +```go +import "gorm.io/datatypes" + +type UserWithTime struct { + gorm.Model + Name string + Time datatypes.Time +} + +user := UserWithTime{Name: "jinzhu", Time: datatypes.NewTime(1, 2, 3, 0)} +DB.Create(&user) +// INSERT INTO `user_with_times` (`name`,`time`) VALUES ("jinzhu","01:02:03") + +DB.First(&result, "name = ? AND time = ?", "jinzhu", datatypes.NewTime(1, 2, 3, 0)) +// SELECT * FROM user_with_times WHERE name = "jinzhu" AND time = "01:02:03" ORDER BY `user_with_times`.`id` LIMIT 1 +``` + +NOTE: If the current using database is SQLite, the field column type is defined as `TEXT` type +when GORM AutoMigrate because SQLite doesn't have time type. + +## JSON_SET + +sqlite, mysql, postgres supported + +```go +import ( + "gorm.io/datatypes" + "gorm.io/gorm" +) + +type UserWithJSON struct { + gorm.Model + Name string + Attributes datatypes.JSON +} + +DB.Create(&UserWithJSON{ + Name: "json-1", + Attributes: datatypes.JSON([]byte(`{"name": "json-1", "age": 18, "tags": ["tag1", "tag2"], "orgs": {"orga": "orga"}}`)), +}) + +type User struct { + Name string + Age int +} + +friend := User{ + Name: "Bob", + Age: 21, +} + +// Set fields of JSON column +datatypes.JSONSet("attributes").Set("age", 20).Set("tags[0]", "tag2").Set("orgs.orga", "orgb") + +DB.Model(&UserWithJSON{}).Where("name = ?", "json-1").UpdateColumn("attributes", datatypes.JSONSet("attributes").Set("age", 20).Set("tags[0]", "tag3").Set("orgs.orga", "orgb")) +DB.Model(&UserWithJSON{}).Where("name = ?", "json-1").UpdateColumn("attributes", datatypes.JSONSet("attributes").Set("phones", []string{"10085", "10086"})) +DB.Model(&UserWithJSON{}).Where("name = ?", "json-1").UpdateColumn("attributes", datatypes.JSONSet("attributes").Set("phones", gorm.Expr("CAST(? AS JSON)", `["10085", "10086"]`))) +DB.Model(&UserWithJSON{}).Where("name = ?", "json-1").UpdateColumn("attributes", datatypes.JSONSet("attributes").Set("friend", friend)) +// MySQL +// UPDATE `user_with_jsons` SET `attributes` = JSON_SET(`attributes`, '$.tags[0]', 'tag3', '$.orgs.orga', 'orgb', '$.age', 20) WHERE name = 'json-1' +// UPDATE `user_with_jsons` SET `attributes` = JSON_SET(`attributes`, '$.phones', CAST('["10085", "10086"]' AS JSON)) WHERE name = 'json-1' +// UPDATE `user_with_jsons` SET `attributes` = JSON_SET(`attributes`, '$.phones', CAST('["10085", "10086"]' AS JSON)) WHERE name = 'json-1' +// UPDATE `user_with_jsons` SET `attributes` = JSON_SET(`attributes`, '$.friend', CAST('{"Name": "Bob", "Age": 21}' AS JSON)) WHERE name = 'json-1' +``` +NOTE: MariaDB does not support CAST(? AS JSON). + +NOTE: Path in PostgreSQL is different. + +```go +// Set fields of JSON column +datatypes.JSONSet("attributes").Set("{age}", 20).Set("{tags, 0}", "tag2").Set("{orgs, orga}", "orgb") + +DB.Model(&UserWithJSON{}).Where("name = ?", "json-1").UpdateColumn("attributes", datatypes.JSONSet("attributes").Set("{age}", 20).Set("{tags, 0}", "tag2").Set("{orgs, orga}", "orgb")) +DB.Model(&UserWithJSON{}).Where("name = ?", "json-1").UpdateColumn("attributes", datatypes.JSONSet("attributes").Set("{phones}", []string{"10085", "10086"})) +DB.Model(&UserWithJSON{}).Where("name = ?", "json-1").UpdateColumn("attributes", datatypes.JSONSet("attributes").Set("{phones}", gorm.Expr("?::jsonb", `["10085", "10086"]`))) +DB.Model(&UserWithJSON{}).Where("name = ?", "json-1").UpdateColumn("attributes", datatypes.JSONSet("attributes").Set("{friend}", friend)) +// PostgreSQL +// UPDATE "user_with_jsons" SET "attributes" = JSONB_SET(JSONB_SET(JSONB_SET("attributes", '{age}', '20'), '{tags, 0}', '"tag2"'), '{orgs, orga}', '"orgb"') WHERE name = 'json-1' +// UPDATE "user_with_jsons" SET "attributes" = JSONB_SET("attributes", '{phones}', '["10085","10086"]') WHERE name = 'json-1' +// UPDATE "user_with_jsons" SET "attributes" = JSONB_SET("attributes", '{phones}', '["10085","10086"]'::jsonb) WHERE name = 'json-1' +// UPDATE "user_with_jsons" SET "attributes" = JSONB_SET("attributes", '{friend}', '{"Name": "Bob", "Age": 21}') WHERE name = 'json-1' +``` + +## JSONType[T] + +sqlite, mysql, postgres supported + +```go +import "gorm.io/datatypes" + +type Attribute struct { + Sex int + Age int + Orgs map[string]string + Tags []string + Admin bool + Role string +} + +type UserWithJSON struct { + gorm.Model + Name string + Attributes datatypes.JSONType[Attribute] +} + +var user = UserWithJSON{ + Name: "hello", + Attributes: datatypes.NewJSONType(Attribute{ + Age: 18, + Sex: 1, + Orgs: map[string]string{"orga": "orga"}, + Tags: []string{"tag1", "tag2", "tag3"}, + }), +} + +// Create +DB.Create(&user) + +// First +var result UserWithJSON +DB.First(&result, user.ID) + +// Update +jsonMap = UserWithJSON{ + Attributes: datatypes.NewJSONType(Attribute{ + Age: 18, + Sex: 1, + Orgs: map[string]string{"orga": "orga"}, + Tags: []string{"tag1", "tag2", "tag3"}, + }), +} + +DB.Model(&user).Updates(jsonMap) +``` + +NOTE: it's not support json query + +## JSONSlice[T] + +sqlite, mysql, postgres supported + +```go +import "gorm.io/datatypes" + +type Tag struct { + Name string + Score float64 +} + +type UserWithJSON struct { + gorm.Model + Name string + Tags datatypes.JSONSlice[Tag] +} + +var tags = []Tag{{Name: "tag1", Score: 0.1}, {Name: "tag2", Score: 0.2}} +var user = UserWithJSON{ + Name: "hello", + Tags: datatypes.NewJSONSlice(tags), +} + +// Create +DB.Create(&user) + +// First +var result UserWithJSON +DB.First(&result, user.ID) + +// Update +var tags2 = []Tag{{Name: "tag3", Score: 10.1}, {Name: "tag4", Score: 10.2}} +jsonMap = UserWithJSON{ + Tags: datatypes.NewJSONSlice(tags2), +} + +DB.Model(&user).Updates(jsonMap) +``` + +NOTE: it's not support json query and `db.Pluck` method + +## JSONArray + +mysql supported + +```go +import "gorm.io/datatypes" + +type Param struct { + ID int + Letters string + Config datatypes.JSON +} + +//Create +DB.Create(&Param{ + Letters: "JSONArray-1", + Config: datatypes.JSON("[\"a\", \"b\"]"), +}) + +DB.Create(&Param{ + Letters: "JSONArray-2", + Config: datatypes.JSON("[\"a\", \"c\"]"), +}) + +//Query +var retMultiple []Param +DB.Where(datatypes.JSONArrayQuery("config").Contains("c")).Find(&retMultiple) +} +``` + +## UUID + +MySQL, PostgreSQL, SQLServer and SQLite are supported. + +```go +import "gorm.io/datatypes" + +type UserWithUUID struct { + gorm.Model + Name string + UserUUID datatypes.UUID +} + +// Generate a new random UUID (version 4). +userUUID := datatypes.NewUUIDv4() + +user := UserWithUUID{Name: "jinzhu", UserUUID: userUUID} +DB.Create(&user) +// INSERT INTO `user_with_uuids` (`name`,`user_uuid`) VALUES ("jinzhu","ca95a578-816c-4812-babd-a7602b042460") + +var result UserWithUUID +DB.First(&result, "name = ? AND user_uuid = ?", "jinzhu", userUUID) +// SELECT * FROM user_with_uuids WHERE name = "jinzhu" AND user_uuid = "ca95a578-816c-4812-babd-a7602b042460" ORDER BY `user_with_uuids`.`id` LIMIT 1 + +// Use the datatype's Equals() to compare the UUIDs. +if userCreate.UserUUID.Equals(userFound.UserUUID) { + fmt.Println("User UUIDs match as expected.") +} else { + fmt.Println("User UUIDs do not match. Something is wrong.") +} + +// Use the datatype's String() function to get the UUID as a string type. +fmt.Printf("User UUID is %s", userFound.UserUUID.String()) + +// Check the UUID value with datatype's IsNil() and IsEmpty() functions. +if userFound.UserUUID.IsNil() { + fmt.Println("User UUID is a nil UUID (i.e. all bits are zero)") +} +if userFound.UserUUID.IsEmpty() { + fmt.Println( + "User UUID is empty (i.e. either a nil UUID or a zero length string)", + ) +} +``` diff --git a/vendor/gorm.io/datatypes/binuuid.go b/vendor/gorm.io/datatypes/binuuid.go new file mode 100644 index 00000000..349da000 --- /dev/null +++ b/vendor/gorm.io/datatypes/binuuid.go @@ -0,0 +1,125 @@ +package datatypes + +import ( + "bytes" + "database/sql/driver" + "errors" + + "github.com/google/uuid" + "gorm.io/gorm" + "gorm.io/gorm/schema" +) + +// This datatype is similar to datatypes.UUID, major difference being that +// this datatype stores the uuid in the database as a binary (byte) array +// instead of a string. Developers may use either as per their preference. +type BinUUID uuid.UUID + +// NewBinUUIDv1 generates a uuid version 1, panics on generation failure. +func NewBinUUIDv1() BinUUID { + return BinUUID(uuid.Must(uuid.NewUUID())) +} + +// NewBinUUIDv4 generates a uuid version 4, panics on generation failure. +func NewBinUUIDv4() BinUUID { + return BinUUID(uuid.Must(uuid.NewRandom())) +} + +// NewNilBinUUID generates a nil uuid. +func NewNilBinUUID() BinUUID { + return BinUUID(uuid.Nil) +} + +// BinUUIDFromString returns the BinUUID representation of the specified uuidStr. +func BinUUIDFromString(uuidStr string) BinUUID { + return BinUUID(uuid.MustParse(uuidStr)) +} + +// GormDataType gorm common data type. +func (BinUUID) GormDataType() string { + return "BINARY(16)" +} + +// GormDBDataType gorm db data type. +func (BinUUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "mysql": + return "BINARY(16)" + case "postgres": + return "BYTEA" + case "sqlserver": + return "BINARY(16)" + case "sqlite": + return "BLOB" + default: + return "" + } +} + +// Scan is the scanner function for this datatype. +func (u *BinUUID) Scan(value interface{}) error { + valueBytes, ok := value.([]byte) + if !ok { + return errors.New("unable to convert value to bytes") + } + valueUUID, err := uuid.FromBytes(valueBytes) + if err != nil { + return err + } + *u = BinUUID(valueUUID) + return nil +} + +// Value is the valuer function for this datatype. +func (u BinUUID) Value() (driver.Value, error) { + return uuid.UUID(u).MarshalBinary() +} + +// String returns the string form of the UUID. +func (u BinUUID) Bytes() []byte { + bytes, err := uuid.UUID(u).MarshalBinary() + if err != nil { + return nil + } + return bytes +} + +// String returns the string form of the UUID. +func (u BinUUID) String() string { + return uuid.UUID(u).String() +} + +// Equals returns true if bytes form of BinUUID matches other, false otherwise. +func (u BinUUID) Equals(other BinUUID) bool { + return bytes.Equal(u.Bytes(), other.Bytes()) +} + +// Length returns the number of characters in string form of UUID. +func (u BinUUID) LengthBytes() int { + return len(u.Bytes()) +} + +// Length returns the number of characters in string form of UUID. +func (u BinUUID) Length() int { + return len(u.String()) +} + +// IsNil returns true if the BinUUID is nil uuid (all zeroes), false otherwise. +func (u BinUUID) IsNil() bool { + return uuid.UUID(u) == uuid.Nil +} + +// IsEmpty returns true if BinUUID is nil uuid or of zero length, false otherwise. +func (u BinUUID) IsEmpty() bool { + return u.IsNil() || u.Length() == 0 +} + +// IsNilPtr returns true if caller BinUUID ptr is nil, false otherwise. +func (u *BinUUID) IsNilPtr() bool { + return u == nil +} + +// IsEmptyPtr returns true if caller BinUUID ptr is nil or it's value is empty. +func (u *BinUUID) IsEmptyPtr() bool { + return u.IsNilPtr() || u.IsEmpty() +} diff --git a/vendor/gorm.io/datatypes/date.go b/vendor/gorm.io/datatypes/date.go new file mode 100644 index 00000000..f0e7c51e --- /dev/null +++ b/vendor/gorm.io/datatypes/date.go @@ -0,0 +1,42 @@ +package datatypes + +import ( + "database/sql" + "database/sql/driver" + "time" +) + +type Date time.Time + +func (date *Date) Scan(value interface{}) (err error) { + nullTime := &sql.NullTime{} + err = nullTime.Scan(value) + *date = Date(nullTime.Time) + return +} + +func (date Date) Value() (driver.Value, error) { + y, m, d := time.Time(date).Date() + return time.Date(y, m, d, 0, 0, 0, 0, time.Time(date).Location()), nil +} + +// GormDataType gorm common data type +func (date Date) GormDataType() string { + return "date" +} + +func (date Date) GobEncode() ([]byte, error) { + return time.Time(date).GobEncode() +} + +func (date *Date) GobDecode(b []byte) error { + return (*time.Time)(date).GobDecode(b) +} + +func (date Date) MarshalJSON() ([]byte, error) { + return time.Time(date).MarshalJSON() +} + +func (date *Date) UnmarshalJSON(b []byte) error { + return (*time.Time)(date).UnmarshalJSON(b) +} diff --git a/vendor/gorm.io/datatypes/json.go b/vendor/gorm.io/datatypes/json.go new file mode 100644 index 00000000..79476781 --- /dev/null +++ b/vendor/gorm.io/datatypes/json.go @@ -0,0 +1,562 @@ +package datatypes + +import ( + "context" + "database/sql/driver" + "encoding/json" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" +) + +// JSON defined JSON data type, need to implements driver.Valuer, sql.Scanner interface +type JSON json.RawMessage + +// Value return json value, implement driver.Valuer interface +func (j JSON) Value() (driver.Value, error) { + if len(j) == 0 { + return nil, nil + } + return string(j), nil +} + +// Scan scan value into Jsonb, implements sql.Scanner interface +func (j *JSON) Scan(value interface{}) error { + if value == nil { + *j = JSON("null") + return nil + } + var bytes []byte + switch v := value.(type) { + case []byte: + if len(v) > 0 { + bytes = make([]byte, len(v)) + copy(bytes, v) + } + case string: + bytes = []byte(v) + default: + return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value)) + } + + result := json.RawMessage(bytes) + *j = JSON(result) + return nil +} + +// MarshalJSON to output non base64 encoded []byte +func (j JSON) MarshalJSON() ([]byte, error) { + return json.RawMessage(j).MarshalJSON() +} + +// UnmarshalJSON to deserialize []byte +func (j *JSON) UnmarshalJSON(b []byte) error { + result := json.RawMessage{} + err := result.UnmarshalJSON(b) + *j = JSON(result) + return err +} + +func (j JSON) String() string { + return string(j) +} + +// GormDataType gorm common data type +func (JSON) GormDataType() string { + return "json" +} + +// GormDBDataType gorm db data type +func (JSON) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "sqlite": + return "JSON" + case "mysql": + return "JSON" + case "postgres": + return "JSONB" + } + return "" +} + +func (js JSON) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { + if len(js) == 0 { + return gorm.Expr("NULL") + } + + data, _ := js.MarshalJSON() + + switch db.Dialector.Name() { + case "mysql": + if v, ok := db.Dialector.(*mysql.Dialector); ok && !strings.Contains(v.ServerVersion, "MariaDB") { + return gorm.Expr("CAST(? AS JSON)", string(data)) + } + } + + return gorm.Expr("?", string(data)) +} + +// JSONQueryExpression json query expression, implements clause.Expression interface to use as querier +type JSONQueryExpression struct { + column string + keys []string + hasKeys bool + equals bool + likes bool + equalsValue interface{} + extract bool + path string +} + +// JSONQuery query column as json +func JSONQuery(column string) *JSONQueryExpression { + return &JSONQueryExpression{column: column} +} + +// Extract extract json with path +func (jsonQuery *JSONQueryExpression) Extract(path string) *JSONQueryExpression { + jsonQuery.extract = true + jsonQuery.path = path + return jsonQuery +} + +// HasKey returns clause.Expression +func (jsonQuery *JSONQueryExpression) HasKey(keys ...string) *JSONQueryExpression { + jsonQuery.keys = keys + jsonQuery.hasKeys = true + return jsonQuery +} + +// Keys returns clause.Expression +func (jsonQuery *JSONQueryExpression) Equals(value interface{}, keys ...string) *JSONQueryExpression { + jsonQuery.keys = keys + jsonQuery.equals = true + jsonQuery.equalsValue = value + return jsonQuery +} + +// Likes return clause.Expression +func (jsonQuery *JSONQueryExpression) Likes(value interface{}, keys ...string) *JSONQueryExpression { + jsonQuery.keys = keys + jsonQuery.likes = true + jsonQuery.equalsValue = value + return jsonQuery +} + +// Build implements clause.Expression +func (jsonQuery *JSONQueryExpression) Build(builder clause.Builder) { + if stmt, ok := builder.(*gorm.Statement); ok { + switch stmt.Dialector.Name() { + case "mysql", "sqlite": + switch { + case jsonQuery.extract: + builder.WriteString("JSON_EXTRACT(") + builder.WriteQuoted(jsonQuery.column) + builder.WriteByte(',') + builder.AddVar(stmt, prefix+jsonQuery.path) + builder.WriteString(")") + case jsonQuery.hasKeys: + if len(jsonQuery.keys) > 0 { + builder.WriteString("JSON_EXTRACT(") + builder.WriteQuoted(jsonQuery.column) + builder.WriteByte(',') + builder.AddVar(stmt, jsonQueryJoin(jsonQuery.keys)) + builder.WriteString(") IS NOT NULL") + } + case jsonQuery.equals: + if len(jsonQuery.keys) > 0 { + builder.WriteString("JSON_EXTRACT(") + builder.WriteQuoted(jsonQuery.column) + builder.WriteByte(',') + builder.AddVar(stmt, jsonQueryJoin(jsonQuery.keys)) + builder.WriteString(") = ") + if value, ok := jsonQuery.equalsValue.(bool); ok { + builder.WriteString(strconv.FormatBool(value)) + } else { + stmt.AddVar(builder, jsonQuery.equalsValue) + } + } + case jsonQuery.likes: + if len(jsonQuery.keys) > 0 { + builder.WriteString("JSON_EXTRACT(") + builder.WriteQuoted(jsonQuery.column) + builder.WriteByte(',') + builder.AddVar(stmt, jsonQueryJoin(jsonQuery.keys)) + builder.WriteString(") LIKE ") + if value, ok := jsonQuery.equalsValue.(bool); ok { + builder.WriteString(strconv.FormatBool(value)) + } else { + stmt.AddVar(builder, jsonQuery.equalsValue) + } + } + } + case "postgres": + switch { + case jsonQuery.extract: + builder.WriteString(fmt.Sprintf("json_extract_path_text(%v::json,", stmt.Quote(jsonQuery.column))) + stmt.AddVar(builder, jsonQuery.path) + builder.WriteByte(')') + case jsonQuery.hasKeys: + if len(jsonQuery.keys) > 0 { + stmt.WriteQuoted(jsonQuery.column) + stmt.WriteString("::jsonb") + for _, key := range jsonQuery.keys[0 : len(jsonQuery.keys)-1] { + stmt.WriteString(" -> ") + stmt.AddVar(builder, key) + } + + stmt.WriteString(" ? ") + stmt.AddVar(builder, jsonQuery.keys[len(jsonQuery.keys)-1]) + } + case jsonQuery.equals: + if len(jsonQuery.keys) > 0 { + builder.WriteString(fmt.Sprintf("json_extract_path_text(%v::json,", stmt.Quote(jsonQuery.column))) + + for idx, key := range jsonQuery.keys { + if idx > 0 { + builder.WriteByte(',') + } + stmt.AddVar(builder, key) + } + builder.WriteString(") = ") + + if _, ok := jsonQuery.equalsValue.(string); ok { + stmt.AddVar(builder, jsonQuery.equalsValue) + } else { + stmt.AddVar(builder, fmt.Sprint(jsonQuery.equalsValue)) + } + } + case jsonQuery.likes: + if len(jsonQuery.keys) > 0 { + builder.WriteString(fmt.Sprintf("json_extract_path_text(%v::json,", stmt.Quote(jsonQuery.column))) + + for idx, key := range jsonQuery.keys { + if idx > 0 { + builder.WriteByte(',') + } + stmt.AddVar(builder, key) + } + builder.WriteString(") LIKE ") + + if _, ok := jsonQuery.equalsValue.(string); ok { + stmt.AddVar(builder, jsonQuery.equalsValue) + } else { + stmt.AddVar(builder, fmt.Sprint(jsonQuery.equalsValue)) + } + } + } + } + } +} + +// JSONOverlapsExpression JSON_OVERLAPS expression, implements clause.Expression interface to use as querier +type JSONOverlapsExpression struct { + column clause.Expression + val string +} + +// JSONOverlaps query column as json +func JSONOverlaps(column clause.Expression, value string) *JSONOverlapsExpression { + return &JSONOverlapsExpression{ + column: column, + val: value, + } +} + +// Build implements clause.Expression +// only mysql support JSON_OVERLAPS +func (json *JSONOverlapsExpression) Build(builder clause.Builder) { + if stmt, ok := builder.(*gorm.Statement); ok { + switch stmt.Dialector.Name() { + case "mysql": + builder.WriteString("JSON_OVERLAPS(") + json.column.Build(builder) + builder.WriteString(",") + builder.AddVar(stmt, json.val) + builder.WriteString(")") + } + } +} + +type columnExpression string + +func Column(col string) columnExpression { + return columnExpression(col) +} + +func (col columnExpression) Build(builder clause.Builder) { + if stmt, ok := builder.(*gorm.Statement); ok { + switch stmt.Dialector.Name() { + case "mysql", "sqlite", "postgres": + builder.WriteString(stmt.Quote(string(col))) + } + } +} + +const prefix = "$." + +func jsonQueryJoin(keys []string) string { + if len(keys) == 1 { + return prefix + keys[0] + } + + n := len(prefix) + n += len(keys) - 1 + for i := 0; i < len(keys); i++ { + n += len(keys[i]) + } + + var b strings.Builder + b.Grow(n) + b.WriteString(prefix) + b.WriteString(keys[0]) + for _, key := range keys[1:] { + b.WriteString(".") + b.WriteString(key) + } + return b.String() +} + +// JSONSetExpression json set expression, implements clause.Expression interface to use as updater +type JSONSetExpression struct { + column string + path2value map[string]interface{} + mutex sync.RWMutex +} + +// JSONSet update fields of json column +func JSONSet(column string) *JSONSetExpression { + return &JSONSetExpression{column: column, path2value: make(map[string]interface{})} +} + +// Set return clause.Expression. +// +// { +// "age": 20, +// "name": "json-1", +// "orgs": {"orga": "orgv"}, +// "tags": ["tag1", "tag2"] +// } +// +// // In MySQL/SQLite, path is `age`, `name`, `orgs.orga`, `tags[0]`, `tags[1]`. +// DB.UpdateColumn("attr", JSONSet("attr").Set("orgs.orga", 42)) +// +// // In PostgreSQL, path is `{age}`, `{name}`, `{orgs,orga}`, `{tags, 0}`, `{tags, 1}`. +// DB.UpdateColumn("attr", JSONSet("attr").Set("{orgs, orga}", "bar")) +func (jsonSet *JSONSetExpression) Set(path string, value interface{}) *JSONSetExpression { + jsonSet.mutex.Lock() + jsonSet.path2value[path] = value + jsonSet.mutex.Unlock() + return jsonSet +} + +// Build implements clause.Expression +// support mysql, sqlite and postgres +func (jsonSet *JSONSetExpression) Build(builder clause.Builder) { + if stmt, ok := builder.(*gorm.Statement); ok { + switch stmt.Dialector.Name() { + case "mysql": + + var isMariaDB bool + if v, ok := stmt.Dialector.(*mysql.Dialector); ok { + isMariaDB = strings.Contains(v.ServerVersion, "MariaDB") + } + + builder.WriteString("JSON_SET(") + builder.WriteQuoted(jsonSet.column) + for path, value := range jsonSet.path2value { + builder.WriteByte(',') + builder.AddVar(stmt, prefix+path) + builder.WriteByte(',') + + if _, ok := value.(clause.Expression); ok { + stmt.AddVar(builder, value) + continue + } + + rv := reflect.ValueOf(value) + if rv.Kind() == reflect.Ptr { + rv = rv.Elem() + } + switch rv.Kind() { + case reflect.Slice, reflect.Array, reflect.Struct, reflect.Map: + b, _ := json.Marshal(value) + if isMariaDB { + stmt.AddVar(builder, string(b)) + break + } + stmt.AddVar(builder, gorm.Expr("CAST(? AS JSON)", string(b))) + default: + stmt.AddVar(builder, value) + } + } + builder.WriteString(")") + + case "sqlite": + builder.WriteString("JSON_SET(") + builder.WriteQuoted(jsonSet.column) + for path, value := range jsonSet.path2value { + builder.WriteByte(',') + builder.AddVar(stmt, prefix+path) + builder.WriteByte(',') + + if _, ok := value.(clause.Expression); ok { + stmt.AddVar(builder, value) + continue + } + + rv := reflect.ValueOf(value) + if rv.Kind() == reflect.Ptr { + rv = rv.Elem() + } + switch rv.Kind() { + case reflect.Slice, reflect.Array, reflect.Struct, reflect.Map: + b, _ := json.Marshal(value) + stmt.AddVar(builder, gorm.Expr("JSON(?)", string(b))) + default: + stmt.AddVar(builder, value) + } + } + builder.WriteString(")") + + case "postgres": + var expr clause.Expression = columnExpression(jsonSet.column) + for path, value := range jsonSet.path2value { + if _, ok = value.(clause.Expression); ok { + expr = gorm.Expr("JSONB_SET(?,?,?)", expr, path, value) + continue + } else { + b, _ := json.Marshal(value) + expr = gorm.Expr("JSONB_SET(?,?,?)", expr, path, string(b)) + } + } + stmt.AddVar(builder, expr) + } + } +} + +func JSONArrayQuery(column string) *JSONArrayExpression { + return &JSONArrayExpression{ + column: column, + } +} + +type JSONArrayExpression struct { + contains bool + in bool + column string + keys []string + equalsValue interface{} +} + +// Contains checks if column[keys] contains the value given. The keys parameter is only supported for MySQL and SQLite. +func (json *JSONArrayExpression) Contains(value interface{}, keys ...string) *JSONArrayExpression { + json.contains = true + json.equalsValue = value + json.keys = keys + return json +} + +// In checks if columns[keys] is in the array value given. This method is only supported for MySQL and SQLite. +func (json *JSONArrayExpression) In(value interface{}, keys ...string) *JSONArrayExpression { + json.in = true + json.keys = keys + json.equalsValue = value + return json +} + +// Build implements clause.Expression +func (json *JSONArrayExpression) Build(builder clause.Builder) { + if stmt, ok := builder.(*gorm.Statement); ok { + switch stmt.Dialector.Name() { + case "mysql": + switch { + case json.contains: + builder.WriteString("JSON_CONTAINS(" + stmt.Quote(json.column) + ",JSON_ARRAY(") + builder.AddVar(stmt, json.equalsValue) + builder.WriteByte(')') + if len(json.keys) > 0 { + builder.WriteByte(',') + builder.AddVar(stmt, jsonQueryJoin(json.keys)) + } + builder.WriteByte(')') + case json.in: + builder.WriteString("JSON_CONTAINS(JSON_ARRAY") + builder.AddVar(stmt, json.equalsValue) + builder.WriteByte(',') + if len(json.keys) > 0 { + builder.WriteString("JSON_EXTRACT(") + } + builder.WriteQuoted(json.column) + if len(json.keys) > 0 { + builder.WriteByte(',') + builder.AddVar(stmt, jsonQueryJoin(json.keys)) + builder.WriteByte(')') + } + builder.WriteByte(')') + } + case "sqlite": + switch { + case json.contains: + builder.WriteString("EXISTS(SELECT 1 FROM json_each(") + builder.WriteQuoted(json.column) + if len(json.keys) > 0 { + builder.WriteByte(',') + builder.AddVar(stmt, jsonQueryJoin(json.keys)) + } + builder.WriteString(") WHERE value = ") + builder.AddVar(stmt, json.equalsValue) + builder.WriteString(") AND json_array_length(") + builder.WriteQuoted(json.column) + if len(json.keys) > 0 { + builder.WriteByte(',') + builder.AddVar(stmt, jsonQueryJoin(json.keys)) + } + builder.WriteString(") > 0") + case json.in: + builder.WriteString("CASE WHEN json_type(") + builder.WriteQuoted(json.column) + if len(json.keys) > 0 { + builder.WriteByte(',') + builder.AddVar(stmt, jsonQueryJoin(json.keys)) + } + builder.WriteString(") = 'array' THEN NOT EXISTS(SELECT 1 FROM json_each(") + builder.WriteQuoted(json.column) + if len(json.keys) > 0 { + builder.WriteByte(',') + builder.AddVar(stmt, jsonQueryJoin(json.keys)) + } + builder.WriteString(") WHERE value NOT IN ") + builder.AddVar(stmt, json.equalsValue) + builder.WriteString(") ELSE ") + if len(json.keys) > 0 { + builder.WriteString("json_extract(") + } + builder.WriteQuoted(json.column) + if len(json.keys) > 0 { + builder.WriteByte(',') + builder.AddVar(stmt, jsonQueryJoin(json.keys)) + builder.WriteByte(')') + } + builder.WriteString(" IN ") + builder.AddVar(stmt, json.equalsValue) + builder.WriteString(" END") + } + case "postgres": + switch { + case json.contains: + builder.WriteString(stmt.Quote(json.column)) + builder.WriteString(" ? ") + builder.AddVar(stmt, json.equalsValue) + } + } + } +} diff --git a/vendor/gorm.io/datatypes/json_map.go b/vendor/gorm.io/datatypes/json_map.go new file mode 100644 index 00000000..cc6a022b --- /dev/null +++ b/vendor/gorm.io/datatypes/json_map.go @@ -0,0 +1,100 @@ +package datatypes + +import ( + "bytes" + "context" + "database/sql/driver" + "encoding/json" + "errors" + "fmt" + "strings" + + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" +) + +// JSONMap defined JSON data type, need to implements driver.Valuer, sql.Scanner interface +type JSONMap map[string]interface{} + +// Value return json value, implement driver.Valuer interface +func (m JSONMap) Value() (driver.Value, error) { + if m == nil { + return nil, nil + } + ba, err := m.MarshalJSON() + return string(ba), err +} + +// Scan scan value into Jsonb, implements sql.Scanner interface +func (m *JSONMap) Scan(val interface{}) error { + if val == nil { + *m = make(JSONMap) + return nil + } + var ba []byte + switch v := val.(type) { + case []byte: + ba = v + case string: + ba = []byte(v) + default: + return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", val)) + } + t := map[string]interface{}{} + rd := bytes.NewReader(ba) + decoder := json.NewDecoder(rd) + decoder.UseNumber() + err := decoder.Decode(&t) + *m = t + return err +} + +// MarshalJSON to output non base64 encoded []byte +func (m JSONMap) MarshalJSON() ([]byte, error) { + if m == nil { + return []byte("null"), nil + } + t := (map[string]interface{})(m) + return json.Marshal(t) +} + +// UnmarshalJSON to deserialize []byte +func (m *JSONMap) UnmarshalJSON(b []byte) error { + t := map[string]interface{}{} + err := json.Unmarshal(b, &t) + *m = JSONMap(t) + return err +} + +// GormDataType gorm common data type +func (m JSONMap) GormDataType() string { + return "jsonmap" +} + +// GormDBDataType gorm db data type +func (JSONMap) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "sqlite": + return "JSON" + case "mysql": + return "JSON" + case "postgres": + return "JSONB" + case "sqlserver": + return "NVARCHAR(MAX)" + } + return "" +} + +func (jm JSONMap) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { + data, _ := jm.MarshalJSON() + switch db.Dialector.Name() { + case "mysql": + if v, ok := db.Dialector.(*mysql.Dialector); ok && !strings.Contains(v.ServerVersion, "MariaDB") { + return gorm.Expr("CAST(? AS JSON)", string(data)) + } + } + return gorm.Expr("?", string(data)) +} diff --git a/vendor/gorm.io/datatypes/json_type.go b/vendor/gorm.io/datatypes/json_type.go new file mode 100644 index 00000000..72729bff --- /dev/null +++ b/vendor/gorm.io/datatypes/json_type.go @@ -0,0 +1,148 @@ +package datatypes + +import ( + "context" + "database/sql/driver" + "encoding/json" + "errors" + "fmt" + "strings" + + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" +) + +// JSONType give a generic data type for json encoded data. +type JSONType[T any] struct { + data T +} + +func NewJSONType[T any](data T) JSONType[T] { + return JSONType[T]{ + data: data, + } +} + +// Data return data with generic Type T +func (j JSONType[T]) Data() T { + return j.data +} + +// Value return json value, implement driver.Valuer interface +func (j JSONType[T]) Value() (driver.Value, error) { + return json.Marshal(j.data) +} + +// Scan scan value into JSONType[T], implements sql.Scanner interface +func (j *JSONType[T]) Scan(value interface{}) error { + var bytes []byte + switch v := value.(type) { + case []byte: + bytes = v + case string: + bytes = []byte(v) + default: + return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value)) + } + return json.Unmarshal(bytes, &j.data) +} + +// MarshalJSON to output non base64 encoded []byte +func (j JSONType[T]) MarshalJSON() ([]byte, error) { + return json.Marshal(j.data) +} + +// UnmarshalJSON to deserialize []byte +func (j *JSONType[T]) UnmarshalJSON(b []byte) error { + return json.Unmarshal(b, &j.data) +} + +// GormDataType gorm common data type +func (JSONType[T]) GormDataType() string { + return "json" +} + +// GormDBDataType gorm db data type +func (JSONType[T]) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "sqlite": + return "JSON" + case "mysql": + return "JSON" + case "postgres": + return "JSONB" + } + return "" +} + +func (js JSONType[T]) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { + data, _ := js.MarshalJSON() + + switch db.Dialector.Name() { + case "mysql": + if v, ok := db.Dialector.(*mysql.Dialector); ok && !strings.Contains(v.ServerVersion, "MariaDB") { + return gorm.Expr("CAST(? AS JSON)", string(data)) + } + } + + return gorm.Expr("?", string(data)) +} + +// JSONSlice give a generic data type for json encoded slice data. +type JSONSlice[T any] []T + +func NewJSONSlice[T any](s []T) JSONSlice[T] { + return JSONSlice[T](s) +} + +// Value return json value, implement driver.Valuer interface +func (j JSONSlice[T]) Value() (driver.Value, error) { + return json.Marshal(j) +} + +// Scan scan value into JSONType[T], implements sql.Scanner interface +func (j *JSONSlice[T]) Scan(value interface{}) error { + var bytes []byte + switch v := value.(type) { + case []byte: + bytes = v + case string: + bytes = []byte(v) + default: + return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value)) + } + return json.Unmarshal(bytes, &j) +} + +// GormDataType gorm common data type +func (JSONSlice[T]) GormDataType() string { + return "json" +} + +// GormDBDataType gorm db data type +func (JSONSlice[T]) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "sqlite": + return "JSON" + case "mysql": + return "JSON" + case "postgres": + return "JSONB" + } + return "" +} + +func (j JSONSlice[T]) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { + data, _ := json.Marshal(j) + + switch db.Dialector.Name() { + case "mysql": + if v, ok := db.Dialector.(*mysql.Dialector); ok && !strings.Contains(v.ServerVersion, "MariaDB") { + return gorm.Expr("CAST(? AS JSON)", string(data)) + } + } + + return gorm.Expr("?", string(data)) +} diff --git a/vendor/gorm.io/datatypes/null.go b/vendor/gorm.io/datatypes/null.go new file mode 100644 index 00000000..5c407edc --- /dev/null +++ b/vendor/gorm.io/datatypes/null.go @@ -0,0 +1,417 @@ +package datatypes + +import ( + "database/sql" + "database/sql/driver" + "errors" + "fmt" + "reflect" + "strconv" + "time" +) + +// NullString represents a string that may be null. +// NullString implements the [Scanner] interface so +// it can be used as a scan destination: +// +// var s NullString +// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s) +// ... +// if s.Valid { +// // use s.String +// } else { +// // NULL value +// } +type NullString = Null[string] + +// NullInt64 represents an int64 that may be null. +// NullInt64 implements the [Scanner] interface so +// it can be used as a scan destination, similar to [NullString]. +type NullInt64 = Null[int64] + +// NullInt32 represents an int32 that may be null. +// NullInt32 implements the [Scanner] interface so +// it can be used as a scan destination, similar to [NullString]. +type NullInt32 = Null[int32] + +// NullInt16 represents an int16 that may be null. +// NullInt16 implements the [Scanner] interface so +// it can be used as a scan destination, similar to [NullString]. +type NullInt16 = Null[int16] + +// NullByte represents a byte that may be null. +// NullByte implements the [Scanner] interface so +// it can be used as a scan destination, similar to [NullString]. +type NullByte = Null[byte] + +// NullFloat64 represents a float64 that may be null. +// NullFloat64 implements the [Scanner] interface so +// it can be used as a scan destination, similar to [NullString]. +type NullFloat64 = Null[float64] + +// NullBool represents a bool that may be null. +// NullBool implements the [Scanner] interface so +// it can be used as a scan destination, similar to [NullString]. +type NullBool = Null[bool] + +// NullTime represents a [time.Time] that may be null. +// NullTime implements the [Scanner] interface so +// it can be used as a scan destination, similar to [NullString]. +type NullTime = Null[time.Time] + +// Null represents a value that may be null. +// Null implements the [Scanner] interface so +// it can be used as a scan destination: +// +// var s Null[string] +// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s) +// ... +// if s.Valid { +// // use s.V +// } else { +// // NULL value +// } +type Null[T any] struct { + V T + Valid bool +} + +func (n *Null[T]) Scan(value any) error { + if value == nil { + n.V, n.Valid = *new(T), false + return nil + } + n.Valid = true + return convertAssign(&n.V, value) +} + +func (n Null[T]) Value() (driver.Value, error) { + if !n.Valid { + return nil, nil + } + return n.V, nil +} + +// NewNull returns a new, non-null Null. +func NewNull[T any](v T) Null[T] { + return Null[T]{V: v, Valid: true} +} + +var errNilPtr = errors.New("destination pointer is nil") // embedded in descriptive error + +// convertAssign is the same as convertAssignRows, but without the optional +// rows argument. +func convertAssign(dest, src any) error { + return convertAssignRows(dest, src, nil) +} + +// convertAssignRows copies to dest the value in src, converting it if possible. +// An error is returned if the copy would result in loss of information. +// dest should be a pointer type. If rows is passed in, the rows will +// be used as the parent for any cursor values converted from a +// driver.Rows to a *Rows. +func convertAssignRows(dest, src any, rows *sql.Rows) error { + // Common cases, without reflect. + switch s := src.(type) { + case string: + switch d := dest.(type) { + case *string: + if d == nil { + return errNilPtr + } + *d = s + return nil + case *[]byte: + if d == nil { + return errNilPtr + } + *d = []byte(s) + return nil + case *sql.RawBytes: + if d == nil { + return errNilPtr + } + *d = append((*d)[:0], s...) + return nil + } + case []byte: + switch d := dest.(type) { + case *string: + if d == nil { + return errNilPtr + } + *d = string(s) + return nil + case *any: + if d == nil { + return errNilPtr + } + *d = cloneBytes(s) + return nil + case *[]byte: + if d == nil { + return errNilPtr + } + *d = cloneBytes(s) + return nil + case *sql.RawBytes: + if d == nil { + return errNilPtr + } + *d = s + return nil + } + case time.Time: + switch d := dest.(type) { + case *time.Time: + *d = s + return nil + case *string: + *d = s.Format(time.RFC3339Nano) + return nil + case *[]byte: + if d == nil { + return errNilPtr + } + *d = []byte(s.Format(time.RFC3339Nano)) + return nil + case *sql.RawBytes: + if d == nil { + return errNilPtr + } + *d = s.AppendFormat((*d)[:0], time.RFC3339Nano) + return nil + } + case decimalDecompose: + switch d := dest.(type) { + case decimalCompose: + return d.Compose(s.Decompose(nil)) + } + case nil: + switch d := dest.(type) { + case *any: + if d == nil { + return errNilPtr + } + *d = nil + return nil + case *[]byte: + if d == nil { + return errNilPtr + } + *d = nil + return nil + case *sql.RawBytes: + if d == nil { + return errNilPtr + } + *d = nil + return nil + } + } + + var sv reflect.Value + + switch d := dest.(type) { + case *string: + sv = reflect.ValueOf(src) + switch sv.Kind() { + case reflect.Bool, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: + *d = asString(src) + return nil + } + case *[]byte: + sv = reflect.ValueOf(src) + if b, ok := asBytes(nil, sv); ok { + *d = b + return nil + } + case *sql.RawBytes: + sv = reflect.ValueOf(src) + if b, ok := asBytes([]byte(*d)[:0], sv); ok { + *d = sql.RawBytes(b) + return nil + } + case *bool: + bv, err := driver.Bool.ConvertValue(src) + if err == nil { + *d = bv.(bool) + } + return err + case *any: + *d = src + return nil + } + + if scanner, ok := dest.(sql.Scanner); ok { + return scanner.Scan(src) + } + + dpv := reflect.ValueOf(dest) + if dpv.Kind() != reflect.Pointer { + return errors.New("destination not a pointer") + } + if dpv.IsNil() { + return errNilPtr + } + + if !sv.IsValid() { + sv = reflect.ValueOf(src) + } + + dv := reflect.Indirect(dpv) + if sv.IsValid() && sv.Type().AssignableTo(dv.Type()) { + switch b := src.(type) { + case []byte: + dv.Set(reflect.ValueOf(cloneBytes(b))) + default: + dv.Set(sv) + } + return nil + } + + if dv.Kind() == sv.Kind() && sv.Type().ConvertibleTo(dv.Type()) { + dv.Set(sv.Convert(dv.Type())) + return nil + } + + // The following conversions use a string value as an intermediate representation + // to convert between various numeric types. + // + // This also allows scanning into user defined types such as "type Int int64". + // For symmetry, also check for string destination types. + switch dv.Kind() { + case reflect.Pointer: + if src == nil { + dv.Set(reflect.Zero(dv.Type())) + return nil + } + dv.Set(reflect.New(dv.Type().Elem())) + return convertAssignRows(dv.Interface(), src, rows) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if src == nil { + return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) + } + s := asString(src) + i64, err := strconv.ParseInt(s, 10, dv.Type().Bits()) + if err != nil { + err = strconvErr(err) + return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err) + } + dv.SetInt(i64) + return nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + if src == nil { + return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) + } + s := asString(src) + u64, err := strconv.ParseUint(s, 10, dv.Type().Bits()) + if err != nil { + err = strconvErr(err) + return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err) + } + dv.SetUint(u64) + return nil + case reflect.Float32, reflect.Float64: + if src == nil { + return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) + } + s := asString(src) + f64, err := strconv.ParseFloat(s, dv.Type().Bits()) + if err != nil { + err = strconvErr(err) + return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err) + } + dv.SetFloat(f64) + return nil + case reflect.String: + if src == nil { + return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) + } + switch v := src.(type) { + case string: + dv.SetString(v) + return nil + case []byte: + dv.SetString(string(v)) + return nil + } + } + + return fmt.Errorf("unsupported Scan, storing driver.Value type %T into type %T", src, dest) +} + +func strconvErr(err error) error { + if ne, ok := err.(*strconv.NumError); ok { + return ne.Err + } + return err +} + +func asString(src any) string { + switch v := src.(type) { + case string: + return v + case []byte: + return string(v) + } + rv := reflect.ValueOf(src) + switch rv.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return strconv.FormatInt(rv.Int(), 10) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return strconv.FormatUint(rv.Uint(), 10) + case reflect.Float64: + return strconv.FormatFloat(rv.Float(), 'g', -1, 64) + case reflect.Float32: + return strconv.FormatFloat(rv.Float(), 'g', -1, 32) + case reflect.Bool: + return strconv.FormatBool(rv.Bool()) + } + return fmt.Sprintf("%v", src) +} + +func asBytes(buf []byte, rv reflect.Value) (b []byte, ok bool) { + switch rv.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return strconv.AppendInt(buf, rv.Int(), 10), true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return strconv.AppendUint(buf, rv.Uint(), 10), true + case reflect.Float32: + return strconv.AppendFloat(buf, rv.Float(), 'g', -1, 32), true + case reflect.Float64: + return strconv.AppendFloat(buf, rv.Float(), 'g', -1, 64), true + case reflect.Bool: + return strconv.AppendBool(buf, rv.Bool()), true + case reflect.String: + s := rv.String() + return append(buf, s...), true + } + return +} + +type decimalDecompose interface { + // Decompose returns the internal decimal state in parts. + // If the provided buf has sufficient capacity, buf may be returned as the coefficient with + // the value set and length set as appropriate. + Decompose(buf []byte) (form byte, negative bool, coefficient []byte, exponent int32) +} + +type decimalCompose interface { + // Compose sets the internal decimal value from parts. If the value cannot be + // represented then an error should be returned. + Compose(form byte, negative bool, coefficient []byte, exponent int32) error +} + +// cloneBytes returns a copy of b[:len(b)]. +// The result may have additional unused capacity. +// cloneBytes(nil) returns nil. +func cloneBytes(b []byte) []byte { + if b == nil { + return nil + } + return append([]byte{}, b...) +} diff --git a/vendor/gorm.io/datatypes/test_all.sh b/vendor/gorm.io/datatypes/test_all.sh new file mode 100644 index 00000000..ad4bcc10 --- /dev/null +++ b/vendor/gorm.io/datatypes/test_all.sh @@ -0,0 +1,10 @@ +#!/bin/bash -e + +dialects=("postgres" "postgres_simple" "mysql" "sqlserver" "sqlite") + +for dialect in "${dialects[@]}" ; do + if [ "$GORM_DIALECT" = "" ] || [ "$GORM_DIALECT" = "${dialect}" ] + then + GORM_DIALECT=${dialect} go test --tags "json1" + fi +done diff --git a/vendor/gorm.io/datatypes/time.go b/vendor/gorm.io/datatypes/time.go new file mode 100644 index 00000000..4cd0a058 --- /dev/null +++ b/vendor/gorm.io/datatypes/time.go @@ -0,0 +1,123 @@ +package datatypes + +import ( + "database/sql/driver" + "encoding/json" + "errors" + "fmt" + "strings" + "time" + + "gorm.io/gorm" + "gorm.io/gorm/schema" +) + +// Time is time data type. +type Time time.Duration + +// NewTime is a constructor for Time and returns new Time. +func NewTime(hour, min, sec, nsec int) Time { + return newTime(hour, min, sec, nsec) +} + +func newTime(hour, min, sec, nsec int) Time { + return Time( + time.Duration(hour)*time.Hour + + time.Duration(min)*time.Minute + + time.Duration(sec)*time.Second + + time.Duration(nsec)*time.Nanosecond, + ) +} + +// GormDataType returns gorm common data type. This type is used for the field's column type. +func (Time) GormDataType() string { + return "time" +} + +// GormDBDataType returns gorm DB data type based on the current using database. +func (Time) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "mysql": + return "TIME" + case "postgres": + return "TIME" + case "sqlserver": + return "TIME" + case "sqlite": + return "TEXT" + default: + return "" + } +} + +// Scan implements sql.Scanner interface and scans value into Time, +func (t *Time) Scan(src interface{}) error { + switch v := src.(type) { + case []byte: + t.setFromString(string(v)) + case string: + t.setFromString(v) + case time.Time: + t.setFromTime(v) + default: + return errors.New(fmt.Sprintf("failed to scan value: %v", v)) + } + + return nil +} + +func (t *Time) setFromString(str string) { + var h, m, s, n int + fmt.Sscanf(str, "%02d:%02d:%02d.%09d", &h, &m, &s, &n) + *t = newTime(h, m, s, n) +} + +func (t *Time) setFromTime(src time.Time) { + *t = newTime(src.Hour(), src.Minute(), src.Second(), src.Nanosecond()) +} + +// Value implements driver.Valuer interface and returns string format of Time. +func (t Time) Value() (driver.Value, error) { + return t.String(), nil +} + +// String implements fmt.Stringer interface. +func (t Time) String() string { + if nsec := t.nanoseconds(); nsec > 0 { + return fmt.Sprintf("%02d:%02d:%02d.%09d", t.hours(), t.minutes(), t.seconds(), nsec) + } else { + // omit nanoseconds unless any value is specified + return fmt.Sprintf("%02d:%02d:%02d", t.hours(), t.minutes(), t.seconds()) + } +} + +func (t Time) hours() int { + return int(time.Duration(t).Truncate(time.Hour).Hours()) +} + +func (t Time) minutes() int { + return int((time.Duration(t) % time.Hour).Truncate(time.Minute).Minutes()) +} + +func (t Time) seconds() int { + return int((time.Duration(t) % time.Minute).Truncate(time.Second).Seconds()) +} + +func (t Time) nanoseconds() int { + return int((time.Duration(t) % time.Second).Nanoseconds()) +} + +// MarshalJSON implements json.Marshaler to convert Time to json serialization. +func (t Time) MarshalJSON() ([]byte, error) { + return json.Marshal(t.String()) +} + +// UnmarshalJSON implements json.Unmarshaler to deserialize json data. +func (t *Time) UnmarshalJSON(data []byte) error { + // ignore null + if string(data) == "null" { + return nil + } + t.setFromString(strings.Trim(string(data), `"`)) + return nil +} diff --git a/vendor/gorm.io/datatypes/url.go b/vendor/gorm.io/datatypes/url.go new file mode 100644 index 00000000..c58a8955 --- /dev/null +++ b/vendor/gorm.io/datatypes/url.go @@ -0,0 +1,66 @@ +package datatypes + +import ( + "database/sql/driver" + "encoding/json" + "errors" + "fmt" + "net/url" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/schema" +) + +type URL url.URL + +func (u URL) Value() (driver.Value, error) { + return u.String(), nil +} + +func (u *URL) Scan(value interface{}) error { + var us string + switch v := value.(type) { + case []byte: + us = string(v) + case string: + us = v + default: + return errors.New(fmt.Sprint("Failed to parse URL:", value)) + } + uu, err := url.Parse(us) + if err != nil { + return err + } + *u = URL(*uu) + return nil +} + +func (URL) GormDataType() string { + return "url" +} + +func (URL) GormDBDataType(db *gorm.DB, field *schema.Field) string { + return "TEXT" +} + +func (u *URL) String() string { + return (*url.URL)(u).String() +} + +func (u URL) MarshalJSON() ([]byte, error) { + return json.Marshal(u.String()) +} + +func (u *URL) UnmarshalJSON(data []byte) error { + // ignore null + if string(data) == "null" { + return nil + } + uu, err := url.Parse(strings.Trim(string(data), `"'`)) + if err != nil { + return err + } + *u = URL(*uu) + return nil +} diff --git a/vendor/gorm.io/datatypes/uuid.go b/vendor/gorm.io/datatypes/uuid.go new file mode 100644 index 00000000..deafaace --- /dev/null +++ b/vendor/gorm.io/datatypes/uuid.go @@ -0,0 +1,94 @@ +package datatypes + +import ( + "database/sql/driver" + + "github.com/google/uuid" + "gorm.io/gorm" + "gorm.io/gorm/schema" +) + +// This datatype stores the uuid in the database as a string. To store the uuid +// in the database as a binary (byte) array, please refer to datatypes.BinUUID. +type UUID uuid.UUID + +// NewUUIDv1 generates a UUID version 1, panics on generation failure. +func NewUUIDv1() UUID { + return UUID(uuid.Must(uuid.NewUUID())) +} + +// NewUUIDv4 generates a UUID version 4, panics on generation failure. +func NewUUIDv4() UUID { + return UUID(uuid.Must(uuid.NewRandom())) +} + +// GormDataType gorm common data type. +func (UUID) GormDataType() string { + return "string" +} + +// GormDBDataType gorm db data type. +func (UUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "mysql": + return "LONGTEXT" + case "postgres": + return "UUID" + case "sqlserver": + return "NVARCHAR(128)" + case "sqlite": + return "TEXT" + default: + return "" + } +} + +// Scan is the scanner function for this datatype. +func (u *UUID) Scan(value interface{}) error { + var result uuid.UUID + if err := result.Scan(value); err != nil { + return err + } + *u = UUID(result) + return nil +} + +// Value is the valuer function for this datatype. +func (u UUID) Value() (driver.Value, error) { + return uuid.UUID(u).Value() +} + +// String returns the string form of the UUID. +func (u UUID) String() string { + return uuid.UUID(u).String() +} + +// Equals returns true if string form of UUID matches other, false otherwise. +func (u UUID) Equals(other UUID) bool { + return u.String() == other.String() +} + +// Length returns the number of characters in string form of UUID. +func (u UUID) Length() int { + return len(u.String()) +} + +// IsNil returns true if the UUID is a nil UUID (all zeroes), false otherwise. +func (u UUID) IsNil() bool { + return uuid.UUID(u) == uuid.Nil +} + +// IsEmpty returns true if UUID is nil UUID or of zero length, false otherwise. +func (u UUID) IsEmpty() bool { + return u.IsNil() || u.Length() == 0 +} + +// IsNilPtr returns true if caller UUID ptr is nil, false otherwise. +func (u *UUID) IsNilPtr() bool { + return u == nil +} + +// IsEmptyPtr returns true if caller UUID ptr is nil or it's value is empty. +func (u *UUID) IsEmptyPtr() bool { + return u.IsNilPtr() || u.IsEmpty() +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 6dd499c4..cfec694c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -303,6 +303,10 @@ github.com/spf13/viper/internal/encoding/json github.com/spf13/viper/internal/encoding/toml github.com/spf13/viper/internal/encoding/yaml github.com/spf13/viper/internal/features +# github.com/stackus/hxgo v0.3.0 +## explicit; go 1.21 +github.com/stackus/hxgo +github.com/stackus/hxgo/hxecho # github.com/stretchr/testify v1.10.0 ## explicit; go 1.17 github.com/stretchr/testify/assert @@ -468,6 +472,9 @@ gopkg.in/ini.v1 # gopkg.in/yaml.v3 v3.0.1 ## explicit gopkg.in/yaml.v3 +# gorm.io/datatypes v1.2.5 +## explicit; go 1.19 +gorm.io/datatypes # gorm.io/driver/mysql v1.5.7 ## explicit; go 1.14 gorm.io/driver/mysql diff --git a/views/helpers/icons.go b/views/helpers/icons.go index 6b49d835..a3431601 100644 --- a/views/helpers/icons.go +++ b/views/helpers/icons.go @@ -25,6 +25,7 @@ var iconMap = map[string]string{ "calories": "icon-[fa6-solid--fire]", "steps": "icon-[ion--footsteps]", "scale": "icon-[ion--scale]", + "height": "icon-[mdi--human-male-height]", // Misc Icons "welcome": "icon-[fa6-solid--chevron-right]", diff --git a/views/user/daily.templ b/views/user/daily.templ index 30564188..13e098ea 100644 --- a/views/user/daily.templ +++ b/views/user/daily.templ @@ -14,6 +14,7 @@ templ Daily(u *database.User) { @helpers.IconFor("scale") { i18n.T(ctx, "Latest measurements:") } </h3> + @latestMeasurementForm(u) @Measurements(u) </div> } @@ -21,33 +22,118 @@ templ Daily(u *database.User) { templ Measurements(u *database.User) { if ms, err := u.GetLatestMeasurements(10); err == nil && len(ms) > 0 { - for _, m := range ms { - @measurement(m) - } + <table> + <thead> + <tr> + <th> + @helpers.IconFor("date") + { i18n.T(ctx, "Date") } + </th> + <th> + @helpers.IconFor("height") + { i18n.T(ctx, "Height") } + </th> + <th> + @helpers.IconFor("scale") + { i18n.T(ctx, "Weight") } + </th> + <th> + @helpers.IconFor("steps") + { i18n.T(ctx, "Steps") } + </th> + <th> </th> + </tr> + </thead> + <tbody> + for _, m := range ms { + <tr> + <td> + { m.DateString() } + </td> + <td> + { helpers.A2S(m.Height) } + { m.User.PreferredUnits().Height() } + </td> + <td> + { helpers.A2S(m.Weight) } + { m.User.PreferredUnits().Weight() } + </td> + <td> + { helpers.A2S(m.Steps) } + </td> + <td> + <a + class="button dangerous" + hx-delete={ helpers.RouteFor(ctx, "daily-delete", m.DateString()) } + hx-confirm={ i18n.T(ctx, "Are you sure?") } + > + @helpers.IconFor("delete") + </a> + </td> + </tr> + } + </tbody> + </table> } else { { i18n.T(ctx, "No measurements found") } } } -templ measurement(m *database.Measurement) { - <table> - <tbody> +templ latestMeasurementForm(u *database.User) { + if l,err := u.GetCurrentMeasurement(); err == nil { + @measurementForm(l) + } else { + { i18n.T(ctx, "No measurements found") } + } +} + +templ measurementForm(m *database.Measurement) { + <form method="post" action={ templ.SafeURL(helpers.RouteFor(ctx, "daily-update")) }> + <table> <tr> - <th> + <th class="w-1/2"> @helpers.IconFor("date") { i18n.T(ctx, "Date") } </th> <td> - @partials.SnippetDate(m.Date) + <input + type="date" + name="date" + id="date" + value={ m.DateString() } + required + /> + </td> + </tr> + <tr> + <th> + @helpers.IconFor("height") + { i18n.T(ctx, "Height") } + </th> + <td> + <input + type="number" + name="height" + id="height" + value={ helpers.A2S(m.Height) } + required + /> + { m.User.PreferredUnits().Height() } </td> </tr> <tr> <th> - @helpers.IconFor("weight") + @helpers.IconFor("scale") { i18n.T(ctx, "Weight") } </th> <td> - { helpers.A2S(m.Weight) } + <input + type="number" + name="weight" + id="weight" + value={ helpers.A2S(m.Weight) } + required + /> { m.User.PreferredUnits().Weight() } </td> </tr> @@ -57,9 +143,21 @@ templ measurement(m *database.Measurement) { { i18n.T(ctx, "Steps") } </th> <td> - { helpers.A2S(m.Steps) } + <input + type="number" + name="steps" + id="steps" + value={ helpers.A2S(m.Steps) } + required + /> + </td> + </tr> + <tr> + <th></th> + <td> + <button type="submit" value="Submit">{ i18n.T(ctx, "Update") }</button> </td> </tr> - </tbody> - </table> + </table> + </form> } diff --git a/views/user/daily_templ.go b/views/user/daily_templ.go index 7ddeb408..04a06f6e 100644 --- a/views/user/daily_templ.go +++ b/views/user/daily_templ.go @@ -69,6 +69,10 @@ func Daily(u *database.User) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } + templ_7745c5c3_Err = latestMeasurementForm(u).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } templ_7745c5c3_Err = Measurements(u).Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err @@ -109,19 +113,207 @@ func Measurements(u *database.User) templ.Component { } ctx = templ.ClearChildren(ctx) if ms, err := u.GetLatestMeasurements(10); err == nil && len(ms) > 0 { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<table><thead><tr><th>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = helpers.IconFor("date").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var5 string + templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Date")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 30, Col: 27} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "</th><th>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = helpers.IconFor("height").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var6 string + templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Height")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 34, Col: 29} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "</th><th>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = helpers.IconFor("scale").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var7 string + templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Weight")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 38, Col: 29} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</th><th>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = helpers.IconFor("steps").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var8 string + templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Steps")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 42, Col: 28} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "</th><th> </th></tr></thead> <tbody>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } for _, m := range ms { - templ_7745c5c3_Err = measurement(m).Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "<tr><td>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var9 string + templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(m.DateString()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 51, Col: 23} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "</td><td>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var10 string + templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(helpers.A2S(m.Height)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 54, Col: 30} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var11 string + templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(m.User.PreferredUnits().Height()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 55, 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 = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "</td><td>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var12 string + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(helpers.A2S(m.Weight)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 58, Col: 30} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var13 string + templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(m.User.PreferredUnits().Weight()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 59, 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 = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "</td><td>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var14 string + templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(helpers.A2S(m.Steps)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 62, Col: 29} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "</td><td><a class=\"button dangerous\" hx-delete=\"") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } + var templ_7745c5c3_Var15 string + templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(helpers.RouteFor(ctx, "daily-delete", m.DateString())) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 67, Col: 73} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "\" hx-confirm=\"") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var16 string + templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Are you sure?")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 68, Col: 49} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "\">") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = helpers.IconFor("delete").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</a></td></tr>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</tbody></table>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err } } else { - var templ_7745c5c3_Var5 string - templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "No measurements found")) + var templ_7745c5c3_Var17 string + templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "No measurements found")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 28, Col: 40} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 78, Col: 40} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -130,7 +322,7 @@ func Measurements(u *database.User) templ.Component { }) } -func measurement(m *database.Measurement) templ.Component { +func latestMeasurementForm(u *database.User) templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { @@ -146,12 +338,62 @@ func measurement(m *database.Measurement) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var6 := templ.GetChildren(ctx) - if templ_7745c5c3_Var6 == nil { - templ_7745c5c3_Var6 = templ.NopComponent + templ_7745c5c3_Var18 := templ.GetChildren(ctx) + if templ_7745c5c3_Var18 == nil { + templ_7745c5c3_Var18 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<table><tbody><tr><th>") + if l, err := u.GetCurrentMeasurement(); err == nil { + templ_7745c5c3_Err = measurementForm(l).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } else { + var templ_7745c5c3_Var19 string + templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "No measurements found")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 86, Col: 40} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + return nil + }) +} + +func measurementForm(m *database.Measurement) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var20 := templ.GetChildren(ctx) + if templ_7745c5c3_Var20 == nil { + templ_7745c5c3_Var20 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<form method=\"post\" action=\"") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var21 templ.SafeURL = templ.SafeURL(helpers.RouteFor(ctx, "daily-update")) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var21))) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "\"><table><tr><th class=\"w-1/2\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -159,67 +401,115 @@ func measurement(m *database.Measurement) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var7 string - templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Date")) + var templ_7745c5c3_Var22 string + templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Date")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 96, Col: 26} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "</th><td><input type=\"date\" name=\"date\" id=\"date\" value=\"") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var23 string + templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(m.DateString()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 103, Col: 28} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "\" required></td></tr><tr><th>") if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 38, Col: 26} + return templ_7745c5c3_Err } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) + templ_7745c5c3_Err = helpers.IconFor("height").Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "</th><td>") + var templ_7745c5c3_Var24 string + templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Height")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 111, Col: 28} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = partials.SnippetDate(m.Date).Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "</th><td><input type=\"number\" name=\"height\" id=\"height\" value=\"") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "</td></tr><tr><th>") + var templ_7745c5c3_Var25 string + templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(helpers.A2S(m.Height)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 118, Col: 35} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = helpers.IconFor("weight").Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "\" required> ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var8 string - templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Weight")) + var templ_7745c5c3_Var26 string + templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(m.User.PreferredUnits().Height()) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 47, Col: 28} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 121, Col: 39} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</th><td>") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</td></tr><tr><th>") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var9 string - templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(helpers.A2S(m.Weight)) + templ_7745c5c3_Err = helpers.IconFor("scale").Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 50, Col: 28} + return templ_7745c5c3_Err } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) + var templ_7745c5c3_Var27 string + templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Weight")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 127, Col: 28} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "</th><td><input type=\"number\" name=\"weight\" id=\"weight\" value=\"") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var10 string - templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(m.User.PreferredUnits().Weight()) + var templ_7745c5c3_Var28 string + templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(helpers.A2S(m.Weight)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 51, Col: 39} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 134, Col: 35} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "</td></tr><tr><th>") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "\" required> ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var29 string + templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(m.User.PreferredUnits().Weight()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 137, Col: 39} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</td></tr><tr><th>") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -227,29 +517,42 @@ func measurement(m *database.Measurement) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var11 string - templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Steps")) + var templ_7745c5c3_Var30 string + templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Steps")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 143, Col: 27} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "</th><td><input type=\"number\" name=\"steps\" id=\"steps\" value=\"") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var31 string + templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(helpers.A2S(m.Steps)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 57, Col: 27} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 150, Col: 34} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "</th><td>") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "\" required></td></tr><tr><th></th><td><button type=\"submit\" value=\"Submit\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var12 string - templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(helpers.A2S(m.Steps)) + var templ_7745c5c3_Var32 string + templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(i18n.T(ctx, "Update")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 60, Col: 27} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views/user/daily.templ`, Line: 158, Col: 65} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "</td></tr></tbody></table>") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "</button></td></tr></table></form>") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err }