A website inspired by Last.fm that will keep track of your listening statistics
lastfm music statistics
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

replaced golang template frontend with svelte and inertia.

oscar345 7da85e14 4c18a99d

+535 -2959
+3 -1
cmd/bridge/main.go
··· 6 6 "fmt" 7 7 "os" 8 8 9 + "github.com/oscar345/keeptrack/internal/config" 10 + "github.com/oscar345/keeptrack/internal/services" 9 11 "github.com/oscar345/keeptrack/internal/web/router" 10 12 "github.com/oscar345/keeptrack/pkg/bridge" 11 13 ) ··· 34 36 return errors.New("path is required") 35 37 } 36 38 37 - router := router.Server{} 39 + router := router.New(services.ArtistService{}, services.UserService{}, nil, &config.Config{}) 38 40 bridge.CreateRoutes(router.Router(), c.path) 39 41 40 42 return nil
-24
cmd/template/main.go
··· 1 - package main 2 - 3 - import ( 4 - "fmt" 5 - "html/template" 6 - "os" 7 - 8 - "github.com/oscar345/keeptrack/resources" 9 - ) 10 - 11 - func main() { 12 - templates, err := template.ParseFS(resources.TemplatesFS, "views/*.html", "views/**/*.html") 13 - 14 - if err != nil { 15 - panic(err) 16 - } 17 - 18 - for _, t := range templates.Templates() { 19 - fmt.Println(t.Name()) 20 - } 21 - 22 - w := os.Stdout 23 - fmt.Println(templates.ExecuteTemplate(w, "index.html", nil)) 24 - }
-63
internal/web/pages/pages.go
··· 1 - package pages 2 - 3 - import ( 4 - "html/template" 5 - "io/fs" 6 - "log" 7 - "path/filepath" 8 - 9 - "github.com/oscar345/keeptrack/resources" 10 - ) 11 - 12 - var ( 13 - Index = parse("index.html") 14 - About = parse("about.html") 15 - LibraryIndex = parse("library/index.html") 16 - LibraryArtists = parse("library/artists.html") 17 - ) 18 - 19 - type ParseOptions struct { 20 - layout string 21 - } 22 - 23 - type ParseOption func(*ParseOptions) 24 - 25 - func WithLayout(layout string) ParseOption { 26 - return func(opts *ParseOptions) { 27 - opts.layout = layout 28 - } 29 - } 30 - 31 - func parse(name string, opts ...ParseOption) *template.Template { 32 - options := ParseOptions{ 33 - layout: "layouts/base.html", 34 - } 35 - 36 - for _, opt := range opts { 37 - opt(&options) 38 - } 39 - 40 - fs, err := fs.Sub(resources.TemplatesFS, "views") 41 - if err != nil { 42 - log.Fatal(err) 43 - } 44 - 45 - return template.Must(template. 46 - New(filepath.Base(options.layout)). 47 - Funcs(funcs). 48 - ParseFS(fs, options.layout, name, "partials/**/*.html", "partials/*.html"), 49 - ) 50 - } 51 - 52 - var funcs = template.FuncMap{ 53 - "dict": func(values ...any) map[string]any { 54 - m := make(map[string]any) 55 - for i := 0; i < len(values); i += 2 { 56 - m[values[i].(string)] = values[i+1] 57 - } 58 - return m 59 - }, 60 - "slice": func(items ...any) []any { 61 - return items 62 - }, 63 - }
+4 -13
internal/web/router/router.go
··· 11 11 "github.com/oscar345/keeptrack/internal/filters" 12 12 "github.com/oscar345/keeptrack/internal/services" 13 13 "github.com/oscar345/keeptrack/internal/web/handlers" 14 - "github.com/oscar345/keeptrack/internal/web/pages" 15 14 "github.com/oscar345/keeptrack/internal/web/requests" 16 15 "github.com/oscar345/keeptrack/internal/web/responses" 17 16 "github.com/oscar345/keeptrack/pkg/enum" ··· 76 75 }) 77 76 }) 78 77 79 - r.Get("/about", func(w http.ResponseWriter, r *http.Request) { 80 - pages.About.Execute(w, nil) 81 - }) 82 - 83 78 r.Get("/library", func(w http.ResponseWriter, r *http.Request) { 84 - pages.LibraryIndex.Execute(w, map[string]any{}) 79 + s.inertia.Render(w, r, "library/Index", inertia.Props{}) 85 80 }) 86 81 87 82 r.Get("/library/artists", func(w http.ResponseWriter, r *http.Request) { ··· 92 87 return 93 88 } 94 89 95 - pages.LibraryArtists.Execute(w, map[string]any{ 96 - "artists": responses.Paginate(page, enum.Map(artists, responses.NewArtistFromModel)), 90 + s.inertia.Render(w, r, "library/Artists", inertia.Props{ 91 + "artists": inertia.Always(responses.Paginate(page, enum.Map(artists, responses.NewArtistFromModel))), 97 92 }) 98 93 }) 99 94 100 - r.Get("/dashboard", func(w http.ResponseWriter, r *http.Request) { 101 - w.Write([]byte("dashboard")) 102 - }) 103 - 104 95 r.Get("/friends", func(w http.ResponseWriter, r *http.Request) { 105 - w.Write([]byte("friends")) 96 + s.inertia.Render(w, r, "friends/Index", inertia.Props{}) 106 97 }) 107 98 108 99 r.With(httpin.NewInput(requests.Count{})).Get("/artists/{id}", handler.Index)
+4 -3
pkg/bridge/schemas.go
··· 109 109 110 110 const typescript = ` 111 111 export type {{ .name }}{{ if .generics }}<{{ range $index, $value := .generics }}{{ if ne $index 0 }}, {{ end }}{{ $value }}{{ end }}> {{ end }} = { 112 - {{ range .fields }} 112 + {{- range .fields }} 113 113 {{ .Name }}: {{ .Type }}{{ if .Optional }} | null{{ end }}; 114 - {{ end }} 115 - }` 114 + {{- end }} 115 + } 116 + ` 116 117 117 118 template, err := template.New("typescript").Parse(typescript) 118 119 if err != nil {
+2 -2
pkg/inertia/response.go
··· 55 55 56 56 if ctx.isInertiaRequest { 57 57 renderJSON(w, page) 58 + } else { 59 + renderHTML(in, w, page) 58 60 } 59 - 60 - renderHTML(in, w, page) 61 61 } 62 62 63 63 func renderHTML(in *Inertia, w http.ResponseWriter, page Page) error {
-100
resources/css/components/button.css
··· 1 - .button { 2 - font-size: var(--text-sm); 3 - font-weight: var(--font-weight-medium); 4 - display: inline-flex; 5 - align-items: center; 6 - justify-content: center; 7 - text-align: center; 8 - } 9 - 10 - .button.variant-default { 11 - gap: var(--spacing-1); 12 - line-height: var(--text-sm--line-height); 13 - height: var(--spacing-9); 14 - 15 - padding-inline: var(--padding-inline); 16 - border-radius: var(--border-radius); 17 - 18 - background-color: var(--bg-color); 19 - color: var(--text-color); 20 - 21 - &:hover:not(:where(:disabled, .state-disabled)) { 22 - background-color: color-mix(in srgb, var(--bg-color), var(--mixin-bg)); 23 - } 24 - 25 - &:active { 26 - color: color-mix(in srgb, var(--text-color), var(--mixin-text)); 27 - } 28 - 29 - &:disabled, 30 - &.state-disabled { 31 - pointer-events: none; 32 - color: color-mix( 33 - in srgb, 34 - var(--text-color), 35 - var(--mixin-text-disabled) 36 - ); 37 - background-color: color-mix( 38 - in srgb, 39 - var(--bg-color), 40 - var(--mixin-bg-disabled) 41 - ); 42 - 43 - &:hover { 44 - cursor: not-allowed; 45 - } 46 - } 47 - 48 - &.with-icon > .icon { 49 - width: var(--spacing-5); 50 - height: var(--spacing-5); 51 - } 52 - } 53 - 54 - .button.variant-text { 55 - gap: var(--spacing-0_5); 56 - line-height: var(--leading-tight); 57 - height: var(--spacing-4); 58 - } 59 - 60 - .button.variant-text > .icon { 61 - margin-bottom: -2px; 62 - } 63 - 64 - .button.shape-square { 65 - --border-radius: var(--radius-md); 66 - --padding-inline: var(--spacing-3); 67 - } 68 - 69 - .button.shape-rounded { 70 - --border-radius: 9999px; 71 - --padding-inline: var(--spacing-3_5); 72 - } 73 - 74 - .button.shape-circle { 75 - --border-radius: 9999px; 76 - --padding-inline: var(--spacing-1); 77 - aspect-ratio: 1 / 1; 78 - width: var(--spacing-9); 79 - } 80 - 81 - .button.scheme-default { 82 - --bg-color: var(--color-secondary); 83 - --text-color: var(--color-secondary-contrast); 84 - 85 - --mixin-text: var(--mixin-color-light-200); 86 - --mixin-bg: var(--mixin-color-light-100); 87 - 88 - --mixin-text-disabled: var(--mixin-color-light-200); 89 - --mixin-bg-disabled: var(--mixin-color-light-100); 90 - } 91 - 92 - .button.scheme-primary { 93 - --bg-color: var(--color-primary); 94 - --text-color: var(--color-primary-contrast); 95 - 96 - --mixin-text: var(--mixin-color-dark-100); 97 - --mixin-bg: var(--mixin-color-light-100); 98 - 99 - --mixin-text-disabled: var(--mixin-color-dark-200); 100 - }
-55
resources/css/components/catalog.css
··· 1 - @scope (.artist-list-item) { 2 - :scope { 3 - display: grid; 4 - grid-template-columns: var(--spacing-10) 1fr max-content; 5 - min-height: var(--spacing-10); 6 - gap: var(--spacing-2); 7 - } 8 - 9 - img { 10 - grid-column: 1 / 2; 11 - width: 100%; 12 - aspect-ratio: 1 / 1; 13 - border-radius: 9999px; 14 - } 15 - 16 - .name { 17 - align-self: center; 18 - grid-column-start: 1; 19 - grid-column-end: 4; 20 - font-size: var(--text-sm); 21 - line-height: var(--text-sm--line-height); 22 - font-weight: var(--font-weight-medium); 23 - max-width: 100%; 24 - width: max-content; 25 - } 26 - 27 - .name:hover { 28 - text-decoration: underline; 29 - } 30 - 31 - img + .name { 32 - grid-column-start: 2; 33 - } 34 - 35 - :scope:has(> .scrobbles) > .name { 36 - grid-column-end: 3; 37 - } 38 - 39 - .scrobbles { 40 - grid-column: 3 / 4; 41 - align-self: center; 42 - } 43 - } 44 - 45 - @scope (.scrobbles) { 46 - :scope { 47 - background-color: var(--color-secondary); 48 - color: var(--color-secondary-contrast); 49 - padding: var(--spacing-1) var(--spacing-2); 50 - border-radius: var(--border-radius-sm); 51 - font-size: var(--text-xs); 52 - font-weight: var(--font-weight-medium); 53 - border-radius: 9999px; 54 - } 55 - }
-76
resources/css/components/navigation.css
··· 1 - @scope (.navigation.main) { 2 - :scope { 3 - display: grid; 4 - grid-template-columns: 1fr max-content 1fr; 5 - height: 100%; 6 - align-items: center; 7 - } 8 - 9 - .list { 10 - width: 100%; 11 - display: flex; 12 - justify-content: center; 13 - align-items: center; 14 - gap: var(--spacing-2); 15 - } 16 - 17 - .item > a { 18 - color: var(--color-primary); 19 - padding: var(--spacing-2) var(--spacing-1_5); 20 - border-radius: var(--radius-md); 21 - font-size: var(--text-sm); 22 - line-height: var(--text-sm--line-height); 23 - font-weight: var(--font-weight-medium); 24 - } 25 - 26 - .item > a[aria-current="page"] { 27 - background-color: var(--color-base-200); 28 - } 29 - 30 - .item > a:hover { 31 - background-color: var(--color-muted-100); 32 - } 33 - } 34 - 35 - @scope (.navigation.aside) { 36 - :scope { 37 - display: flex; 38 - flex-direction: column; 39 - gap: var(--spacing-2); 40 - } 41 - 42 - .list { 43 - width: 100%; 44 - display: flex; 45 - flex-direction: column; 46 - gap: var(--spacing-1); 47 - } 48 - 49 - .item > a { 50 - color: var(--color-primary); 51 - padding-block: var(--spacing-0_5); 52 - border-radius: var(--radius-md); 53 - font-size: var(--text-sm); 54 - line-height: var(--text-sm--line-height); 55 - font-weight: var(--font-weight-medium); 56 - width: 100%; 57 - display: inline-flex; 58 - align-items: center; 59 - gap: var(--spacing-1); 60 - transition: 61 - background-color 100ms ease, 62 - padding-inline 100ms ease; 63 - } 64 - 65 - .item > a:where([aria-current="page"], :hover) { 66 - padding-inline: var(--spacing-2); 67 - } 68 - 69 - .item > a[aria-current="page"] { 70 - background-color: var(--color-base-200); 71 - } 72 - 73 - .item > a:hover { 74 - background-color: var(--color-muted-100); 75 - } 76 - }
-34
resources/css/components/typography.css
··· 1 - .h1 { 2 - font-size: var(--text-2xl); 3 - line-height: var(--leading-normal); 4 - font-weight: var(--font-weight-medium); 5 - color: var(--color-content-100); 6 - } 7 - 8 - .h2 { 9 - font-size: var(--text-lg); 10 - line-height: var(--leading-snug); 11 - font-weight: var(--font-weight-medium); 12 - color: var(--color-content-100); 13 - } 14 - 15 - .h3 { 16 - font-size: var(--text-sm); 17 - line-height: var(--leading-tight); 18 - font-weight: var(--font-weight-semibold); 19 - color: var(--color-content-100); 20 - text-transform: uppercase; 21 - } 22 - 23 - .subtitle { 24 - font-size: var(--text-sm); 25 - line-height: var(--text-sm--line-height); 26 - font-weight: var(--font-weight-normal); 27 - color: var(--color-content-300); 28 - } 29 - 30 - /* Automatically add spacing between hgroup children, unless the hgroup has the class no-hgroup */ 31 - hgroup:not(.no-hgroup) { 32 - display: flex; 33 - flex-direction: column; 34 - }
-33
resources/css/layouts/base.css
··· 1 - .container { 2 - width: 100%; 3 - padding-inline: var(--spacing-4); 4 - 5 - @media (--md) { 6 - padding-inline: var(--spacing-8); 7 - } 8 - 9 - @media (--lg) { 10 - padding-inline: var(--spacing-16); 11 - } 12 - } 13 - 14 - @scope (.base.layout) { 15 - :scope { 16 - display: grid; 17 - grid-template-columns: 1fr; 18 - grid-template-rows: var(--spacing-16) 1fr auto; 19 - min-height: 100vh; 20 - } 21 - 22 - > header { 23 - border-bottom: var(--theme-default-border); 24 - background-color: var(--color-base-300); 25 - position: sticky; 26 - top: 0; 27 - z-index: 100; 28 - } 29 - 30 - > .content { 31 - padding-block: var(--spacing-6); 32 - } 33 - }
-24
resources/css/layouts/library.css
··· 1 - @scope (#content:has(.library)) { 2 - :scope { 3 - display: grid; 4 - grid-template-columns: 1fr 4fr; 5 - column-gap: var(--spacing-8); 6 - } 7 - 8 - .library { 9 - display: flex; 10 - flex-direction: column; 11 - gap: var(--spacing-4); 12 - } 13 - 14 - .artists { 15 - display: flex; 16 - flex-direction: column; 17 - gap: var(--spacing-2); 18 - } 19 - 20 - aside > nav { 21 - position: sticky; 22 - top: calc(var(--spacing-16) + var(--spacing-6) + 1px); 23 - } 24 - }
-146
resources/css/main.css
··· 1 - @layer theme, base, components, layers; 2 - 3 - @import "tailwindcss/theme.css" layer(theme); 4 - @import "tailwindcss/preflight.css" layer(base); 5 - @import "tailwindcss/utilities.css" layer(utilities); 6 - 7 - @import "./layouts/base.css" layer(components); 8 - @import "./layouts/library.css" layer(components); 9 - @import "./components/button.css" layer(components); 10 - @import "./components/navigation.css" layer(components); 11 - @import "./components/typography.css" layer(components); 12 - @import "./components/catalog.css" layer(components); 13 - 14 - body { 15 - background-color: var(--color-base-100); 16 - min-height: 100dvh; 17 - } 18 - 19 - @theme inline { 20 - --color-base-100: var(--theme-color-base-100); 21 - --color-base-200: var(--theme-color-base-200); 22 - --color-base-300: var(--theme-color-base-300); 23 - --color-content-100: var(--theme-color-content-100); 24 - --color-content-200: var(--theme-color-content-200); 25 - --color-content-300: var(--theme-color-content-300); 26 - --color-muted-100: var(--theme-color-muted-100); 27 - --color-muted-200: var(--theme-color-muted-200); 28 - --color-muted-300: var(--theme-color-muted-300); 29 - --color-primary: var(--theme-color-primary); 30 - --color-primary-contrast: var(--theme-color-primary-contrast); 31 - --color-secondary: var(--theme-color-secondary); 32 - --color-secondary-contrast: var(--theme-color-secondary-contrast); 33 - --color-success: var(--theme-color-success); 34 - --color-success-contrast: var(--theme-color-success-contrast); 35 - --color-warning: var(--theme-color-warning); 36 - --color-warning-contrast: var(--theme-color-warning-contrast); 37 - --color-danger: var(--theme-color-danger); 38 - --color-danger-contrast: var(--theme-color-danger-contrast); 39 - } 40 - 41 - @theme { 42 - /* Spacing */ 43 - --spacing-px: 1px; 44 - --spacing-0: 0px; 45 - --spacing-0_5: 0.125rem; 46 - --spacing-1: 0.25rem; 47 - --spacing-1_5: 0.375rem; 48 - --spacing-2: 0.5rem; 49 - --spacing-2_5: 0.625rem; 50 - --spacing-3: 0.75rem; 51 - --spacing-3_5: 0.875rem; 52 - --spacing-4: 1rem; 53 - --spacing-4_5: 1.125rem; 54 - --spacing-5: 1.25rem; 55 - --spacing-6: 1.5rem; 56 - --spacing-7: 1.75rem; 57 - --spacing-8: 2rem; 58 - --spacing-9: 2.25rem; 59 - --spacing-10: 2.5rem; 60 - --spacing-11: 2.75rem; 61 - --spacing-12: 3rem; 62 - --spacing-14: 3.5rem; 63 - --spacing-16: 4rem; 64 - --spacing-18: 4.5rem; 65 - --spacing-20: 5rem; 66 - --spacing-22: 5.5rem; 67 - --spacing-24: 6rem; 68 - --spacing-28: 7rem; 69 - --spacing-32: 8rem; 70 - --spacing-36: 9rem; 71 - --spacing-40: 10rem; 72 - --spacing-44: 11rem; 73 - --spacing-48: 12rem; 74 - --spacing-52: 13rem; 75 - --spacing-56: 14rem; 76 - --spacing-60: 15rem; 77 - --spacing-64: 16rem; 78 - --spacing-72: 18rem; 79 - --spacing-80: 20rem; 80 - --spacing-96: 24rem; 81 - 82 - /* Widths */ 83 - --width-3xs: 16rem; 84 - --width-2xs: 18rem; 85 - --width-xs: 20rem; 86 - --width-sm: 24rem; 87 - --width-md: 28rem; 88 - --width-lg: 32rem; 89 - --width-xl: 36rem; 90 - --width-2xl: 42rem; 91 - --width-3xl: 48rem; 92 - --width-4xl: 56rem; 93 - --width-5xl: 64rem; 94 - --width-6xl: 72rem; 95 - --width-7xl: 80rem; 96 - --width-prose: 65ch; 97 - } 98 - 99 - @layer base { 100 - :root { 101 - --mixin-color-light-100: #fff 20%; 102 - --mixin-color-light-200: #fff 50%; 103 - --mixin-color-light-300: #fff 80%; 104 - 105 - --mixin-color-dark-100: #000 20%; 106 - --mixin-color-dark-200: #000 50%; 107 - --mixin-color-dark-300: #000 80%; 108 - 109 - --theme-color-base-100: var(--color-gray-50); 110 - --theme-color-base-200: var(--color-gray-100); 111 - --theme-color-base-300: #fff; 112 - 113 - --theme-color-content-100: var(--color-gray-950); 114 - --theme-color-content-200: var(--color-gray-800); 115 - --theme-color-content-300: var(--color-gray-600); 116 - 117 - --theme-color-muted-100: var(--color-gray-200); 118 - --theme-color-muted-200: var(--color-gray-300); 119 - --theme-color-muted-300: var(--color-gray-400); 120 - 121 - --theme-color-primary: var(--color-blue-600); 122 - --theme-color-primary-contrast: var(--color-blue-50); 123 - --theme-color-secondary: var(--color-blue-200); 124 - --theme-color-secondary-contrast: var(--color-blue-950); 125 - --theme-color-success: #00cc66; 126 - --theme-color-success-contrast: #fff; 127 - --theme-color-warning: #ff9900; 128 - --theme-color-warning-contrast: #fff; 129 - --theme-color-danger: #ff3333; 130 - --theme-color-danger-contrast: #fff; 131 - 132 - --theme-default-border: 1px solid var(--color-muted-200); 133 - } 134 - } 135 - 136 - @custom-media --md (width >= 48rem); 137 - @custom-media --lg (width >= 64rem); 138 - 139 - @utility container { 140 - max-width: unset; 141 - } 142 - 143 - .logo { 144 - font-weight: var(--font-weight-medium); 145 - color: var(--color-secondary-contrast); 146 - }
-10
resources/css/postcss.config.js
··· 1 - import autoprefixer from "autoprefixer"; 2 - import postcssCustomMedia from "postcss-custom-media"; 3 - import tailwindcss from "@tailwindcss/postcss"; 4 - 5 - /** @type {import('postcss-load-config').Config} */ 6 - const config = { 7 - plugins: [tailwindcss, autoprefixer, postcssCustomMedia], 8 - }; 9 - 10 - export default config;
-6
resources/embed.go
··· 1 - package resources 2 - 3 - import "embed" 4 - 5 - //go:embed views/* 6 - var TemplatesFS embed.FS
resources/js/main.js

This is a binary file and will not be displayed.

-2198
resources/package-lock.json
··· 1 - { 2 - "name": "resources", 3 - "lockfileVersion": 3, 4 - "requires": true, 5 - "packages": { 6 - "": { 7 - "dependencies": { 8 - "htmx.org": "^4.0.0-alpha6", 9 - "tailwindcss": "^4.1.18" 10 - }, 11 - "devDependencies": { 12 - "@tailwindcss/postcss": "^4.1.18", 13 - "autoprefixer": "^10.4.23", 14 - "esbuild": "0.27.2", 15 - "postcss": "^8.5.6", 16 - "postcss-cli": "^11.0.1", 17 - "postcss-custom-media": "^11.0.6" 18 - } 19 - }, 20 - "node_modules/@alloc/quick-lru": { 21 - "version": "5.2.0", 22 - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 23 - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 24 - "dev": true, 25 - "license": "MIT", 26 - "engines": { 27 - "node": ">=10" 28 - }, 29 - "funding": { 30 - "url": "https://github.com/sponsors/sindresorhus" 31 - } 32 - }, 33 - "node_modules/@csstools/cascade-layer-name-parser": { 34 - "version": "2.0.5", 35 - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", 36 - "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", 37 - "dev": true, 38 - "funding": [ 39 - { 40 - "type": "github", 41 - "url": "https://github.com/sponsors/csstools" 42 - }, 43 - { 44 - "type": "opencollective", 45 - "url": "https://opencollective.com/csstools" 46 - } 47 - ], 48 - "license": "MIT", 49 - "engines": { 50 - "node": ">=18" 51 - }, 52 - "peerDependencies": { 53 - "@csstools/css-parser-algorithms": "^3.0.5", 54 - "@csstools/css-tokenizer": "^3.0.4" 55 - } 56 - }, 57 - "node_modules/@csstools/css-parser-algorithms": { 58 - "version": "3.0.5", 59 - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", 60 - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", 61 - "dev": true, 62 - "funding": [ 63 - { 64 - "type": "github", 65 - "url": "https://github.com/sponsors/csstools" 66 - }, 67 - { 68 - "type": "opencollective", 69 - "url": "https://opencollective.com/csstools" 70 - } 71 - ], 72 - "license": "MIT", 73 - "engines": { 74 - "node": ">=18" 75 - }, 76 - "peerDependencies": { 77 - "@csstools/css-tokenizer": "^3.0.4" 78 - } 79 - }, 80 - "node_modules/@csstools/css-tokenizer": { 81 - "version": "3.0.4", 82 - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", 83 - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", 84 - "dev": true, 85 - "funding": [ 86 - { 87 - "type": "github", 88 - "url": "https://github.com/sponsors/csstools" 89 - }, 90 - { 91 - "type": "opencollective", 92 - "url": "https://opencollective.com/csstools" 93 - } 94 - ], 95 - "license": "MIT", 96 - "engines": { 97 - "node": ">=18" 98 - } 99 - }, 100 - "node_modules/@csstools/media-query-list-parser": { 101 - "version": "4.0.3", 102 - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", 103 - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", 104 - "dev": true, 105 - "funding": [ 106 - { 107 - "type": "github", 108 - "url": "https://github.com/sponsors/csstools" 109 - }, 110 - { 111 - "type": "opencollective", 112 - "url": "https://opencollective.com/csstools" 113 - } 114 - ], 115 - "license": "MIT", 116 - "engines": { 117 - "node": ">=18" 118 - }, 119 - "peerDependencies": { 120 - "@csstools/css-parser-algorithms": "^3.0.5", 121 - "@csstools/css-tokenizer": "^3.0.4" 122 - } 123 - }, 124 - "node_modules/@esbuild/aix-ppc64": { 125 - "version": "0.27.2", 126 - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", 127 - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", 128 - "cpu": [ 129 - "ppc64" 130 - ], 131 - "dev": true, 132 - "license": "MIT", 133 - "optional": true, 134 - "os": [ 135 - "aix" 136 - ], 137 - "engines": { 138 - "node": ">=18" 139 - } 140 - }, 141 - "node_modules/@esbuild/android-arm": { 142 - "version": "0.27.2", 143 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", 144 - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", 145 - "cpu": [ 146 - "arm" 147 - ], 148 - "dev": true, 149 - "license": "MIT", 150 - "optional": true, 151 - "os": [ 152 - "android" 153 - ], 154 - "engines": { 155 - "node": ">=18" 156 - } 157 - }, 158 - "node_modules/@esbuild/android-arm64": { 159 - "version": "0.27.2", 160 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", 161 - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", 162 - "cpu": [ 163 - "arm64" 164 - ], 165 - "dev": true, 166 - "license": "MIT", 167 - "optional": true, 168 - "os": [ 169 - "android" 170 - ], 171 - "engines": { 172 - "node": ">=18" 173 - } 174 - }, 175 - "node_modules/@esbuild/android-x64": { 176 - "version": "0.27.2", 177 - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", 178 - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", 179 - "cpu": [ 180 - "x64" 181 - ], 182 - "dev": true, 183 - "license": "MIT", 184 - "optional": true, 185 - "os": [ 186 - "android" 187 - ], 188 - "engines": { 189 - "node": ">=18" 190 - } 191 - }, 192 - "node_modules/@esbuild/darwin-arm64": { 193 - "version": "0.27.2", 194 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", 195 - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", 196 - "cpu": [ 197 - "arm64" 198 - ], 199 - "dev": true, 200 - "license": "MIT", 201 - "optional": true, 202 - "os": [ 203 - "darwin" 204 - ], 205 - "engines": { 206 - "node": ">=18" 207 - } 208 - }, 209 - "node_modules/@esbuild/darwin-x64": { 210 - "version": "0.27.2", 211 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", 212 - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", 213 - "cpu": [ 214 - "x64" 215 - ], 216 - "dev": true, 217 - "license": "MIT", 218 - "optional": true, 219 - "os": [ 220 - "darwin" 221 - ], 222 - "engines": { 223 - "node": ">=18" 224 - } 225 - }, 226 - "node_modules/@esbuild/freebsd-arm64": { 227 - "version": "0.27.2", 228 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", 229 - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", 230 - "cpu": [ 231 - "arm64" 232 - ], 233 - "dev": true, 234 - "license": "MIT", 235 - "optional": true, 236 - "os": [ 237 - "freebsd" 238 - ], 239 - "engines": { 240 - "node": ">=18" 241 - } 242 - }, 243 - "node_modules/@esbuild/freebsd-x64": { 244 - "version": "0.27.2", 245 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", 246 - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", 247 - "cpu": [ 248 - "x64" 249 - ], 250 - "dev": true, 251 - "license": "MIT", 252 - "optional": true, 253 - "os": [ 254 - "freebsd" 255 - ], 256 - "engines": { 257 - "node": ">=18" 258 - } 259 - }, 260 - "node_modules/@esbuild/linux-arm": { 261 - "version": "0.27.2", 262 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", 263 - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", 264 - "cpu": [ 265 - "arm" 266 - ], 267 - "dev": true, 268 - "license": "MIT", 269 - "optional": true, 270 - "os": [ 271 - "linux" 272 - ], 273 - "engines": { 274 - "node": ">=18" 275 - } 276 - }, 277 - "node_modules/@esbuild/linux-arm64": { 278 - "version": "0.27.2", 279 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", 280 - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", 281 - "cpu": [ 282 - "arm64" 283 - ], 284 - "dev": true, 285 - "license": "MIT", 286 - "optional": true, 287 - "os": [ 288 - "linux" 289 - ], 290 - "engines": { 291 - "node": ">=18" 292 - } 293 - }, 294 - "node_modules/@esbuild/linux-ia32": { 295 - "version": "0.27.2", 296 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", 297 - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", 298 - "cpu": [ 299 - "ia32" 300 - ], 301 - "dev": true, 302 - "license": "MIT", 303 - "optional": true, 304 - "os": [ 305 - "linux" 306 - ], 307 - "engines": { 308 - "node": ">=18" 309 - } 310 - }, 311 - "node_modules/@esbuild/linux-loong64": { 312 - "version": "0.27.2", 313 - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", 314 - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", 315 - "cpu": [ 316 - "loong64" 317 - ], 318 - "dev": true, 319 - "license": "MIT", 320 - "optional": true, 321 - "os": [ 322 - "linux" 323 - ], 324 - "engines": { 325 - "node": ">=18" 326 - } 327 - }, 328 - "node_modules/@esbuild/linux-mips64el": { 329 - "version": "0.27.2", 330 - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", 331 - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", 332 - "cpu": [ 333 - "mips64el" 334 - ], 335 - "dev": true, 336 - "license": "MIT", 337 - "optional": true, 338 - "os": [ 339 - "linux" 340 - ], 341 - "engines": { 342 - "node": ">=18" 343 - } 344 - }, 345 - "node_modules/@esbuild/linux-ppc64": { 346 - "version": "0.27.2", 347 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", 348 - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", 349 - "cpu": [ 350 - "ppc64" 351 - ], 352 - "dev": true, 353 - "license": "MIT", 354 - "optional": true, 355 - "os": [ 356 - "linux" 357 - ], 358 - "engines": { 359 - "node": ">=18" 360 - } 361 - }, 362 - "node_modules/@esbuild/linux-riscv64": { 363 - "version": "0.27.2", 364 - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", 365 - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", 366 - "cpu": [ 367 - "riscv64" 368 - ], 369 - "dev": true, 370 - "license": "MIT", 371 - "optional": true, 372 - "os": [ 373 - "linux" 374 - ], 375 - "engines": { 376 - "node": ">=18" 377 - } 378 - }, 379 - "node_modules/@esbuild/linux-s390x": { 380 - "version": "0.27.2", 381 - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", 382 - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", 383 - "cpu": [ 384 - "s390x" 385 - ], 386 - "dev": true, 387 - "license": "MIT", 388 - "optional": true, 389 - "os": [ 390 - "linux" 391 - ], 392 - "engines": { 393 - "node": ">=18" 394 - } 395 - }, 396 - "node_modules/@esbuild/linux-x64": { 397 - "version": "0.27.2", 398 - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", 399 - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", 400 - "cpu": [ 401 - "x64" 402 - ], 403 - "dev": true, 404 - "license": "MIT", 405 - "optional": true, 406 - "os": [ 407 - "linux" 408 - ], 409 - "engines": { 410 - "node": ">=18" 411 - } 412 - }, 413 - "node_modules/@esbuild/netbsd-arm64": { 414 - "version": "0.27.2", 415 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", 416 - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", 417 - "cpu": [ 418 - "arm64" 419 - ], 420 - "dev": true, 421 - "license": "MIT", 422 - "optional": true, 423 - "os": [ 424 - "netbsd" 425 - ], 426 - "engines": { 427 - "node": ">=18" 428 - } 429 - }, 430 - "node_modules/@esbuild/netbsd-x64": { 431 - "version": "0.27.2", 432 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", 433 - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", 434 - "cpu": [ 435 - "x64" 436 - ], 437 - "dev": true, 438 - "license": "MIT", 439 - "optional": true, 440 - "os": [ 441 - "netbsd" 442 - ], 443 - "engines": { 444 - "node": ">=18" 445 - } 446 - }, 447 - "node_modules/@esbuild/openbsd-arm64": { 448 - "version": "0.27.2", 449 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", 450 - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", 451 - "cpu": [ 452 - "arm64" 453 - ], 454 - "dev": true, 455 - "license": "MIT", 456 - "optional": true, 457 - "os": [ 458 - "openbsd" 459 - ], 460 - "engines": { 461 - "node": ">=18" 462 - } 463 - }, 464 - "node_modules/@esbuild/openbsd-x64": { 465 - "version": "0.27.2", 466 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", 467 - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", 468 - "cpu": [ 469 - "x64" 470 - ], 471 - "dev": true, 472 - "license": "MIT", 473 - "optional": true, 474 - "os": [ 475 - "openbsd" 476 - ], 477 - "engines": { 478 - "node": ">=18" 479 - } 480 - }, 481 - "node_modules/@esbuild/openharmony-arm64": { 482 - "version": "0.27.2", 483 - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", 484 - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", 485 - "cpu": [ 486 - "arm64" 487 - ], 488 - "dev": true, 489 - "license": "MIT", 490 - "optional": true, 491 - "os": [ 492 - "openharmony" 493 - ], 494 - "engines": { 495 - "node": ">=18" 496 - } 497 - }, 498 - "node_modules/@esbuild/sunos-x64": { 499 - "version": "0.27.2", 500 - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", 501 - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", 502 - "cpu": [ 503 - "x64" 504 - ], 505 - "dev": true, 506 - "license": "MIT", 507 - "optional": true, 508 - "os": [ 509 - "sunos" 510 - ], 511 - "engines": { 512 - "node": ">=18" 513 - } 514 - }, 515 - "node_modules/@esbuild/win32-arm64": { 516 - "version": "0.27.2", 517 - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", 518 - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", 519 - "cpu": [ 520 - "arm64" 521 - ], 522 - "dev": true, 523 - "license": "MIT", 524 - "optional": true, 525 - "os": [ 526 - "win32" 527 - ], 528 - "engines": { 529 - "node": ">=18" 530 - } 531 - }, 532 - "node_modules/@esbuild/win32-ia32": { 533 - "version": "0.27.2", 534 - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", 535 - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", 536 - "cpu": [ 537 - "ia32" 538 - ], 539 - "dev": true, 540 - "license": "MIT", 541 - "optional": true, 542 - "os": [ 543 - "win32" 544 - ], 545 - "engines": { 546 - "node": ">=18" 547 - } 548 - }, 549 - "node_modules/@esbuild/win32-x64": { 550 - "version": "0.27.2", 551 - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", 552 - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", 553 - "cpu": [ 554 - "x64" 555 - ], 556 - "dev": true, 557 - "license": "MIT", 558 - "optional": true, 559 - "os": [ 560 - "win32" 561 - ], 562 - "engines": { 563 - "node": ">=18" 564 - } 565 - }, 566 - "node_modules/@jridgewell/gen-mapping": { 567 - "version": "0.3.13", 568 - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 569 - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 570 - "dev": true, 571 - "license": "MIT", 572 - "dependencies": { 573 - "@jridgewell/sourcemap-codec": "^1.5.0", 574 - "@jridgewell/trace-mapping": "^0.3.24" 575 - } 576 - }, 577 - "node_modules/@jridgewell/remapping": { 578 - "version": "2.3.5", 579 - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", 580 - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", 581 - "dev": true, 582 - "license": "MIT", 583 - "dependencies": { 584 - "@jridgewell/gen-mapping": "^0.3.5", 585 - "@jridgewell/trace-mapping": "^0.3.24" 586 - } 587 - }, 588 - "node_modules/@jridgewell/resolve-uri": { 589 - "version": "3.1.2", 590 - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 591 - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 592 - "dev": true, 593 - "license": "MIT", 594 - "engines": { 595 - "node": ">=6.0.0" 596 - } 597 - }, 598 - "node_modules/@jridgewell/sourcemap-codec": { 599 - "version": "1.5.5", 600 - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 601 - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 602 - "dev": true, 603 - "license": "MIT" 604 - }, 605 - "node_modules/@jridgewell/trace-mapping": { 606 - "version": "0.3.31", 607 - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 608 - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 609 - "dev": true, 610 - "license": "MIT", 611 - "dependencies": { 612 - "@jridgewell/resolve-uri": "^3.1.0", 613 - "@jridgewell/sourcemap-codec": "^1.4.14" 614 - } 615 - }, 616 - "node_modules/@tailwindcss/node": { 617 - "version": "4.1.18", 618 - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", 619 - "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", 620 - "dev": true, 621 - "license": "MIT", 622 - "dependencies": { 623 - "@jridgewell/remapping": "^2.3.4", 624 - "enhanced-resolve": "^5.18.3", 625 - "jiti": "^2.6.1", 626 - "lightningcss": "1.30.2", 627 - "magic-string": "^0.30.21", 628 - "source-map-js": "^1.2.1", 629 - "tailwindcss": "4.1.18" 630 - } 631 - }, 632 - "node_modules/@tailwindcss/oxide": { 633 - "version": "4.1.18", 634 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", 635 - "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", 636 - "dev": true, 637 - "license": "MIT", 638 - "engines": { 639 - "node": ">= 10" 640 - }, 641 - "optionalDependencies": { 642 - "@tailwindcss/oxide-android-arm64": "4.1.18", 643 - "@tailwindcss/oxide-darwin-arm64": "4.1.18", 644 - "@tailwindcss/oxide-darwin-x64": "4.1.18", 645 - "@tailwindcss/oxide-freebsd-x64": "4.1.18", 646 - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", 647 - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", 648 - "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", 649 - "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", 650 - "@tailwindcss/oxide-linux-x64-musl": "4.1.18", 651 - "@tailwindcss/oxide-wasm32-wasi": "4.1.18", 652 - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", 653 - "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" 654 - } 655 - }, 656 - "node_modules/@tailwindcss/oxide-android-arm64": { 657 - "version": "4.1.18", 658 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", 659 - "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", 660 - "cpu": [ 661 - "arm64" 662 - ], 663 - "dev": true, 664 - "license": "MIT", 665 - "optional": true, 666 - "os": [ 667 - "android" 668 - ], 669 - "engines": { 670 - "node": ">= 10" 671 - } 672 - }, 673 - "node_modules/@tailwindcss/oxide-darwin-arm64": { 674 - "version": "4.1.18", 675 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", 676 - "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", 677 - "cpu": [ 678 - "arm64" 679 - ], 680 - "dev": true, 681 - "license": "MIT", 682 - "optional": true, 683 - "os": [ 684 - "darwin" 685 - ], 686 - "engines": { 687 - "node": ">= 10" 688 - } 689 - }, 690 - "node_modules/@tailwindcss/oxide-darwin-x64": { 691 - "version": "4.1.18", 692 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", 693 - "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", 694 - "cpu": [ 695 - "x64" 696 - ], 697 - "dev": true, 698 - "license": "MIT", 699 - "optional": true, 700 - "os": [ 701 - "darwin" 702 - ], 703 - "engines": { 704 - "node": ">= 10" 705 - } 706 - }, 707 - "node_modules/@tailwindcss/oxide-freebsd-x64": { 708 - "version": "4.1.18", 709 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", 710 - "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", 711 - "cpu": [ 712 - "x64" 713 - ], 714 - "dev": true, 715 - "license": "MIT", 716 - "optional": true, 717 - "os": [ 718 - "freebsd" 719 - ], 720 - "engines": { 721 - "node": ">= 10" 722 - } 723 - }, 724 - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { 725 - "version": "4.1.18", 726 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", 727 - "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", 728 - "cpu": [ 729 - "arm" 730 - ], 731 - "dev": true, 732 - "license": "MIT", 733 - "optional": true, 734 - "os": [ 735 - "linux" 736 - ], 737 - "engines": { 738 - "node": ">= 10" 739 - } 740 - }, 741 - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { 742 - "version": "4.1.18", 743 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", 744 - "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", 745 - "cpu": [ 746 - "arm64" 747 - ], 748 - "dev": true, 749 - "license": "MIT", 750 - "optional": true, 751 - "os": [ 752 - "linux" 753 - ], 754 - "engines": { 755 - "node": ">= 10" 756 - } 757 - }, 758 - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { 759 - "version": "4.1.18", 760 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", 761 - "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", 762 - "cpu": [ 763 - "arm64" 764 - ], 765 - "dev": true, 766 - "license": "MIT", 767 - "optional": true, 768 - "os": [ 769 - "linux" 770 - ], 771 - "engines": { 772 - "node": ">= 10" 773 - } 774 - }, 775 - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { 776 - "version": "4.1.18", 777 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", 778 - "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", 779 - "cpu": [ 780 - "x64" 781 - ], 782 - "dev": true, 783 - "license": "MIT", 784 - "optional": true, 785 - "os": [ 786 - "linux" 787 - ], 788 - "engines": { 789 - "node": ">= 10" 790 - } 791 - }, 792 - "node_modules/@tailwindcss/oxide-linux-x64-musl": { 793 - "version": "4.1.18", 794 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", 795 - "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", 796 - "cpu": [ 797 - "x64" 798 - ], 799 - "dev": true, 800 - "license": "MIT", 801 - "optional": true, 802 - "os": [ 803 - "linux" 804 - ], 805 - "engines": { 806 - "node": ">= 10" 807 - } 808 - }, 809 - "node_modules/@tailwindcss/oxide-wasm32-wasi": { 810 - "version": "4.1.18", 811 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", 812 - "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", 813 - "bundleDependencies": [ 814 - "@napi-rs/wasm-runtime", 815 - "@emnapi/core", 816 - "@emnapi/runtime", 817 - "@tybys/wasm-util", 818 - "@emnapi/wasi-threads", 819 - "tslib" 820 - ], 821 - "cpu": [ 822 - "wasm32" 823 - ], 824 - "dev": true, 825 - "license": "MIT", 826 - "optional": true, 827 - "dependencies": { 828 - "@emnapi/core": "^1.7.1", 829 - "@emnapi/runtime": "^1.7.1", 830 - "@emnapi/wasi-threads": "^1.1.0", 831 - "@napi-rs/wasm-runtime": "^1.1.0", 832 - "@tybys/wasm-util": "^0.10.1", 833 - "tslib": "^2.4.0" 834 - }, 835 - "engines": { 836 - "node": ">=14.0.0" 837 - } 838 - }, 839 - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { 840 - "version": "4.1.18", 841 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", 842 - "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", 843 - "cpu": [ 844 - "arm64" 845 - ], 846 - "dev": true, 847 - "license": "MIT", 848 - "optional": true, 849 - "os": [ 850 - "win32" 851 - ], 852 - "engines": { 853 - "node": ">= 10" 854 - } 855 - }, 856 - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { 857 - "version": "4.1.18", 858 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", 859 - "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", 860 - "cpu": [ 861 - "x64" 862 - ], 863 - "dev": true, 864 - "license": "MIT", 865 - "optional": true, 866 - "os": [ 867 - "win32" 868 - ], 869 - "engines": { 870 - "node": ">= 10" 871 - } 872 - }, 873 - "node_modules/@tailwindcss/postcss": { 874 - "version": "4.1.18", 875 - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", 876 - "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", 877 - "dev": true, 878 - "license": "MIT", 879 - "dependencies": { 880 - "@alloc/quick-lru": "^5.2.0", 881 - "@tailwindcss/node": "4.1.18", 882 - "@tailwindcss/oxide": "4.1.18", 883 - "postcss": "^8.4.41", 884 - "tailwindcss": "4.1.18" 885 - } 886 - }, 887 - "node_modules/ansi-regex": { 888 - "version": "5.0.1", 889 - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 890 - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 891 - "dev": true, 892 - "license": "MIT", 893 - "engines": { 894 - "node": ">=8" 895 - } 896 - }, 897 - "node_modules/ansi-styles": { 898 - "version": "4.3.0", 899 - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 900 - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 901 - "dev": true, 902 - "license": "MIT", 903 - "dependencies": { 904 - "color-convert": "^2.0.1" 905 - }, 906 - "engines": { 907 - "node": ">=8" 908 - }, 909 - "funding": { 910 - "url": "https://github.com/chalk/ansi-styles?sponsor=1" 911 - } 912 - }, 913 - "node_modules/anymatch": { 914 - "version": "3.1.3", 915 - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 916 - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 917 - "dev": true, 918 - "license": "ISC", 919 - "dependencies": { 920 - "normalize-path": "^3.0.0", 921 - "picomatch": "^2.0.4" 922 - }, 923 - "engines": { 924 - "node": ">= 8" 925 - } 926 - }, 927 - "node_modules/autoprefixer": { 928 - "version": "10.4.23", 929 - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", 930 - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", 931 - "dev": true, 932 - "funding": [ 933 - { 934 - "type": "opencollective", 935 - "url": "https://opencollective.com/postcss/" 936 - }, 937 - { 938 - "type": "tidelift", 939 - "url": "https://tidelift.com/funding/github/npm/autoprefixer" 940 - }, 941 - { 942 - "type": "github", 943 - "url": "https://github.com/sponsors/ai" 944 - } 945 - ], 946 - "license": "MIT", 947 - "dependencies": { 948 - "browserslist": "^4.28.1", 949 - "caniuse-lite": "^1.0.30001760", 950 - "fraction.js": "^5.3.4", 951 - "picocolors": "^1.1.1", 952 - "postcss-value-parser": "^4.2.0" 953 - }, 954 - "bin": { 955 - "autoprefixer": "bin/autoprefixer" 956 - }, 957 - "engines": { 958 - "node": "^10 || ^12 || >=14" 959 - }, 960 - "peerDependencies": { 961 - "postcss": "^8.1.0" 962 - } 963 - }, 964 - "node_modules/baseline-browser-mapping": { 965 - "version": "2.9.14", 966 - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", 967 - "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", 968 - "dev": true, 969 - "license": "Apache-2.0", 970 - "bin": { 971 - "baseline-browser-mapping": "dist/cli.js" 972 - } 973 - }, 974 - "node_modules/binary-extensions": { 975 - "version": "2.3.0", 976 - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 977 - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 978 - "dev": true, 979 - "license": "MIT", 980 - "engines": { 981 - "node": ">=8" 982 - }, 983 - "funding": { 984 - "url": "https://github.com/sponsors/sindresorhus" 985 - } 986 - }, 987 - "node_modules/braces": { 988 - "version": "3.0.3", 989 - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 990 - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 991 - "dev": true, 992 - "license": "MIT", 993 - "dependencies": { 994 - "fill-range": "^7.1.1" 995 - }, 996 - "engines": { 997 - "node": ">=8" 998 - } 999 - }, 1000 - "node_modules/browserslist": { 1001 - "version": "4.28.1", 1002 - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", 1003 - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", 1004 - "dev": true, 1005 - "funding": [ 1006 - { 1007 - "type": "opencollective", 1008 - "url": "https://opencollective.com/browserslist" 1009 - }, 1010 - { 1011 - "type": "tidelift", 1012 - "url": "https://tidelift.com/funding/github/npm/browserslist" 1013 - }, 1014 - { 1015 - "type": "github", 1016 - "url": "https://github.com/sponsors/ai" 1017 - } 1018 - ], 1019 - "license": "MIT", 1020 - "dependencies": { 1021 - "baseline-browser-mapping": "^2.9.0", 1022 - "caniuse-lite": "^1.0.30001759", 1023 - "electron-to-chromium": "^1.5.263", 1024 - "node-releases": "^2.0.27", 1025 - "update-browserslist-db": "^1.2.0" 1026 - }, 1027 - "bin": { 1028 - "browserslist": "cli.js" 1029 - }, 1030 - "engines": { 1031 - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1032 - } 1033 - }, 1034 - "node_modules/caniuse-lite": { 1035 - "version": "1.0.30001764", 1036 - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", 1037 - "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", 1038 - "dev": true, 1039 - "funding": [ 1040 - { 1041 - "type": "opencollective", 1042 - "url": "https://opencollective.com/browserslist" 1043 - }, 1044 - { 1045 - "type": "tidelift", 1046 - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1047 - }, 1048 - { 1049 - "type": "github", 1050 - "url": "https://github.com/sponsors/ai" 1051 - } 1052 - ], 1053 - "license": "CC-BY-4.0" 1054 - }, 1055 - "node_modules/chokidar": { 1056 - "version": "3.6.0", 1057 - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 1058 - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 1059 - "dev": true, 1060 - "license": "MIT", 1061 - "dependencies": { 1062 - "anymatch": "~3.1.2", 1063 - "braces": "~3.0.2", 1064 - "glob-parent": "~5.1.2", 1065 - "is-binary-path": "~2.1.0", 1066 - "is-glob": "~4.0.1", 1067 - "normalize-path": "~3.0.0", 1068 - "readdirp": "~3.6.0" 1069 - }, 1070 - "engines": { 1071 - "node": ">= 8.10.0" 1072 - }, 1073 - "funding": { 1074 - "url": "https://paulmillr.com/funding/" 1075 - }, 1076 - "optionalDependencies": { 1077 - "fsevents": "~2.3.2" 1078 - } 1079 - }, 1080 - "node_modules/cliui": { 1081 - "version": "8.0.1", 1082 - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 1083 - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 1084 - "dev": true, 1085 - "license": "ISC", 1086 - "dependencies": { 1087 - "string-width": "^4.2.0", 1088 - "strip-ansi": "^6.0.1", 1089 - "wrap-ansi": "^7.0.0" 1090 - }, 1091 - "engines": { 1092 - "node": ">=12" 1093 - } 1094 - }, 1095 - "node_modules/color-convert": { 1096 - "version": "2.0.1", 1097 - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1098 - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1099 - "dev": true, 1100 - "license": "MIT", 1101 - "dependencies": { 1102 - "color-name": "~1.1.4" 1103 - }, 1104 - "engines": { 1105 - "node": ">=7.0.0" 1106 - } 1107 - }, 1108 - "node_modules/color-name": { 1109 - "version": "1.1.4", 1110 - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1111 - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1112 - "dev": true, 1113 - "license": "MIT" 1114 - }, 1115 - "node_modules/dependency-graph": { 1116 - "version": "1.0.0", 1117 - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", 1118 - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", 1119 - "dev": true, 1120 - "license": "MIT", 1121 - "engines": { 1122 - "node": ">=4" 1123 - } 1124 - }, 1125 - "node_modules/detect-libc": { 1126 - "version": "2.1.2", 1127 - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", 1128 - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", 1129 - "dev": true, 1130 - "license": "Apache-2.0", 1131 - "engines": { 1132 - "node": ">=8" 1133 - } 1134 - }, 1135 - "node_modules/electron-to-chromium": { 1136 - "version": "1.5.267", 1137 - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", 1138 - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", 1139 - "dev": true, 1140 - "license": "ISC" 1141 - }, 1142 - "node_modules/emoji-regex": { 1143 - "version": "8.0.0", 1144 - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1145 - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1146 - "dev": true, 1147 - "license": "MIT" 1148 - }, 1149 - "node_modules/enhanced-resolve": { 1150 - "version": "5.18.4", 1151 - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", 1152 - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", 1153 - "dev": true, 1154 - "license": "MIT", 1155 - "dependencies": { 1156 - "graceful-fs": "^4.2.4", 1157 - "tapable": "^2.2.0" 1158 - }, 1159 - "engines": { 1160 - "node": ">=10.13.0" 1161 - } 1162 - }, 1163 - "node_modules/esbuild": { 1164 - "version": "0.27.2", 1165 - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", 1166 - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", 1167 - "dev": true, 1168 - "hasInstallScript": true, 1169 - "license": "MIT", 1170 - "bin": { 1171 - "esbuild": "bin/esbuild" 1172 - }, 1173 - "engines": { 1174 - "node": ">=18" 1175 - }, 1176 - "optionalDependencies": { 1177 - "@esbuild/aix-ppc64": "0.27.2", 1178 - "@esbuild/android-arm": "0.27.2", 1179 - "@esbuild/android-arm64": "0.27.2", 1180 - "@esbuild/android-x64": "0.27.2", 1181 - "@esbuild/darwin-arm64": "0.27.2", 1182 - "@esbuild/darwin-x64": "0.27.2", 1183 - "@esbuild/freebsd-arm64": "0.27.2", 1184 - "@esbuild/freebsd-x64": "0.27.2", 1185 - "@esbuild/linux-arm": "0.27.2", 1186 - "@esbuild/linux-arm64": "0.27.2", 1187 - "@esbuild/linux-ia32": "0.27.2", 1188 - "@esbuild/linux-loong64": "0.27.2", 1189 - "@esbuild/linux-mips64el": "0.27.2", 1190 - "@esbuild/linux-ppc64": "0.27.2", 1191 - "@esbuild/linux-riscv64": "0.27.2", 1192 - "@esbuild/linux-s390x": "0.27.2", 1193 - "@esbuild/linux-x64": "0.27.2", 1194 - "@esbuild/netbsd-arm64": "0.27.2", 1195 - "@esbuild/netbsd-x64": "0.27.2", 1196 - "@esbuild/openbsd-arm64": "0.27.2", 1197 - "@esbuild/openbsd-x64": "0.27.2", 1198 - "@esbuild/openharmony-arm64": "0.27.2", 1199 - "@esbuild/sunos-x64": "0.27.2", 1200 - "@esbuild/win32-arm64": "0.27.2", 1201 - "@esbuild/win32-ia32": "0.27.2", 1202 - "@esbuild/win32-x64": "0.27.2" 1203 - } 1204 - }, 1205 - "node_modules/escalade": { 1206 - "version": "3.2.0", 1207 - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1208 - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1209 - "dev": true, 1210 - "license": "MIT", 1211 - "engines": { 1212 - "node": ">=6" 1213 - } 1214 - }, 1215 - "node_modules/fill-range": { 1216 - "version": "7.1.1", 1217 - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1218 - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1219 - "dev": true, 1220 - "license": "MIT", 1221 - "dependencies": { 1222 - "to-regex-range": "^5.0.1" 1223 - }, 1224 - "engines": { 1225 - "node": ">=8" 1226 - } 1227 - }, 1228 - "node_modules/fraction.js": { 1229 - "version": "5.3.4", 1230 - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", 1231 - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", 1232 - "dev": true, 1233 - "license": "MIT", 1234 - "engines": { 1235 - "node": "*" 1236 - }, 1237 - "funding": { 1238 - "type": "github", 1239 - "url": "https://github.com/sponsors/rawify" 1240 - } 1241 - }, 1242 - "node_modules/fs-extra": { 1243 - "version": "11.3.3", 1244 - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", 1245 - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", 1246 - "dev": true, 1247 - "license": "MIT", 1248 - "dependencies": { 1249 - "graceful-fs": "^4.2.0", 1250 - "jsonfile": "^6.0.1", 1251 - "universalify": "^2.0.0" 1252 - }, 1253 - "engines": { 1254 - "node": ">=14.14" 1255 - } 1256 - }, 1257 - "node_modules/fsevents": { 1258 - "version": "2.3.3", 1259 - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1260 - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1261 - "dev": true, 1262 - "hasInstallScript": true, 1263 - "license": "MIT", 1264 - "optional": true, 1265 - "os": [ 1266 - "darwin" 1267 - ], 1268 - "engines": { 1269 - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1270 - } 1271 - }, 1272 - "node_modules/get-caller-file": { 1273 - "version": "2.0.5", 1274 - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1275 - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1276 - "dev": true, 1277 - "license": "ISC", 1278 - "engines": { 1279 - "node": "6.* || 8.* || >= 10.*" 1280 - } 1281 - }, 1282 - "node_modules/glob-parent": { 1283 - "version": "5.1.2", 1284 - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1285 - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1286 - "dev": true, 1287 - "license": "ISC", 1288 - "dependencies": { 1289 - "is-glob": "^4.0.1" 1290 - }, 1291 - "engines": { 1292 - "node": ">= 6" 1293 - } 1294 - }, 1295 - "node_modules/graceful-fs": { 1296 - "version": "4.2.11", 1297 - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1298 - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1299 - "dev": true, 1300 - "license": "ISC" 1301 - }, 1302 - "node_modules/htmx.org": { 1303 - "version": "4.0.0-alpha6", 1304 - "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-4.0.0-alpha6.tgz", 1305 - "integrity": "sha512-EEJkuX+divCVx4VfXTspB9dNs3EfXeHXbZNW9Y4kjjubzTqKAivoVQAE9LcQihCkrMD6ZSJU8BNdEbg5oHZOWA==", 1306 - "license": "BSD-0-Clause", 1307 - "workspaces": [ 1308 - "ext/*" 1309 - ] 1310 - }, 1311 - "node_modules/is-binary-path": { 1312 - "version": "2.1.0", 1313 - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1314 - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1315 - "dev": true, 1316 - "license": "MIT", 1317 - "dependencies": { 1318 - "binary-extensions": "^2.0.0" 1319 - }, 1320 - "engines": { 1321 - "node": ">=8" 1322 - } 1323 - }, 1324 - "node_modules/is-extglob": { 1325 - "version": "2.1.1", 1326 - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1327 - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1328 - "dev": true, 1329 - "license": "MIT", 1330 - "engines": { 1331 - "node": ">=0.10.0" 1332 - } 1333 - }, 1334 - "node_modules/is-fullwidth-code-point": { 1335 - "version": "3.0.0", 1336 - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1337 - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1338 - "dev": true, 1339 - "license": "MIT", 1340 - "engines": { 1341 - "node": ">=8" 1342 - } 1343 - }, 1344 - "node_modules/is-glob": { 1345 - "version": "4.0.3", 1346 - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1347 - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1348 - "dev": true, 1349 - "license": "MIT", 1350 - "dependencies": { 1351 - "is-extglob": "^2.1.1" 1352 - }, 1353 - "engines": { 1354 - "node": ">=0.10.0" 1355 - } 1356 - }, 1357 - "node_modules/is-number": { 1358 - "version": "7.0.0", 1359 - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1360 - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1361 - "dev": true, 1362 - "license": "MIT", 1363 - "engines": { 1364 - "node": ">=0.12.0" 1365 - } 1366 - }, 1367 - "node_modules/jiti": { 1368 - "version": "2.6.1", 1369 - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", 1370 - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", 1371 - "dev": true, 1372 - "license": "MIT", 1373 - "bin": { 1374 - "jiti": "lib/jiti-cli.mjs" 1375 - } 1376 - }, 1377 - "node_modules/jsonfile": { 1378 - "version": "6.2.0", 1379 - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", 1380 - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", 1381 - "dev": true, 1382 - "license": "MIT", 1383 - "dependencies": { 1384 - "universalify": "^2.0.0" 1385 - }, 1386 - "optionalDependencies": { 1387 - "graceful-fs": "^4.1.6" 1388 - } 1389 - }, 1390 - "node_modules/lightningcss": { 1391 - "version": "1.30.2", 1392 - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", 1393 - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", 1394 - "dev": true, 1395 - "license": "MPL-2.0", 1396 - "dependencies": { 1397 - "detect-libc": "^2.0.3" 1398 - }, 1399 - "engines": { 1400 - "node": ">= 12.0.0" 1401 - }, 1402 - "funding": { 1403 - "type": "opencollective", 1404 - "url": "https://opencollective.com/parcel" 1405 - }, 1406 - "optionalDependencies": { 1407 - "lightningcss-android-arm64": "1.30.2", 1408 - "lightningcss-darwin-arm64": "1.30.2", 1409 - "lightningcss-darwin-x64": "1.30.2", 1410 - "lightningcss-freebsd-x64": "1.30.2", 1411 - "lightningcss-linux-arm-gnueabihf": "1.30.2", 1412 - "lightningcss-linux-arm64-gnu": "1.30.2", 1413 - "lightningcss-linux-arm64-musl": "1.30.2", 1414 - "lightningcss-linux-x64-gnu": "1.30.2", 1415 - "lightningcss-linux-x64-musl": "1.30.2", 1416 - "lightningcss-win32-arm64-msvc": "1.30.2", 1417 - "lightningcss-win32-x64-msvc": "1.30.2" 1418 - } 1419 - }, 1420 - "node_modules/lightningcss-android-arm64": { 1421 - "version": "1.30.2", 1422 - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", 1423 - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", 1424 - "cpu": [ 1425 - "arm64" 1426 - ], 1427 - "dev": true, 1428 - "license": "MPL-2.0", 1429 - "optional": true, 1430 - "os": [ 1431 - "android" 1432 - ], 1433 - "engines": { 1434 - "node": ">= 12.0.0" 1435 - }, 1436 - "funding": { 1437 - "type": "opencollective", 1438 - "url": "https://opencollective.com/parcel" 1439 - } 1440 - }, 1441 - "node_modules/lightningcss-darwin-arm64": { 1442 - "version": "1.30.2", 1443 - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", 1444 - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", 1445 - "cpu": [ 1446 - "arm64" 1447 - ], 1448 - "dev": true, 1449 - "license": "MPL-2.0", 1450 - "optional": true, 1451 - "os": [ 1452 - "darwin" 1453 - ], 1454 - "engines": { 1455 - "node": ">= 12.0.0" 1456 - }, 1457 - "funding": { 1458 - "type": "opencollective", 1459 - "url": "https://opencollective.com/parcel" 1460 - } 1461 - }, 1462 - "node_modules/lightningcss-darwin-x64": { 1463 - "version": "1.30.2", 1464 - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", 1465 - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", 1466 - "cpu": [ 1467 - "x64" 1468 - ], 1469 - "dev": true, 1470 - "license": "MPL-2.0", 1471 - "optional": true, 1472 - "os": [ 1473 - "darwin" 1474 - ], 1475 - "engines": { 1476 - "node": ">= 12.0.0" 1477 - }, 1478 - "funding": { 1479 - "type": "opencollective", 1480 - "url": "https://opencollective.com/parcel" 1481 - } 1482 - }, 1483 - "node_modules/lightningcss-freebsd-x64": { 1484 - "version": "1.30.2", 1485 - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", 1486 - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", 1487 - "cpu": [ 1488 - "x64" 1489 - ], 1490 - "dev": true, 1491 - "license": "MPL-2.0", 1492 - "optional": true, 1493 - "os": [ 1494 - "freebsd" 1495 - ], 1496 - "engines": { 1497 - "node": ">= 12.0.0" 1498 - }, 1499 - "funding": { 1500 - "type": "opencollective", 1501 - "url": "https://opencollective.com/parcel" 1502 - } 1503 - }, 1504 - "node_modules/lightningcss-linux-arm-gnueabihf": { 1505 - "version": "1.30.2", 1506 - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", 1507 - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", 1508 - "cpu": [ 1509 - "arm" 1510 - ], 1511 - "dev": true, 1512 - "license": "MPL-2.0", 1513 - "optional": true, 1514 - "os": [ 1515 - "linux" 1516 - ], 1517 - "engines": { 1518 - "node": ">= 12.0.0" 1519 - }, 1520 - "funding": { 1521 - "type": "opencollective", 1522 - "url": "https://opencollective.com/parcel" 1523 - } 1524 - }, 1525 - "node_modules/lightningcss-linux-arm64-gnu": { 1526 - "version": "1.30.2", 1527 - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", 1528 - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", 1529 - "cpu": [ 1530 - "arm64" 1531 - ], 1532 - "dev": true, 1533 - "license": "MPL-2.0", 1534 - "optional": true, 1535 - "os": [ 1536 - "linux" 1537 - ], 1538 - "engines": { 1539 - "node": ">= 12.0.0" 1540 - }, 1541 - "funding": { 1542 - "type": "opencollective", 1543 - "url": "https://opencollective.com/parcel" 1544 - } 1545 - }, 1546 - "node_modules/lightningcss-linux-arm64-musl": { 1547 - "version": "1.30.2", 1548 - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", 1549 - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", 1550 - "cpu": [ 1551 - "arm64" 1552 - ], 1553 - "dev": true, 1554 - "license": "MPL-2.0", 1555 - "optional": true, 1556 - "os": [ 1557 - "linux" 1558 - ], 1559 - "engines": { 1560 - "node": ">= 12.0.0" 1561 - }, 1562 - "funding": { 1563 - "type": "opencollective", 1564 - "url": "https://opencollective.com/parcel" 1565 - } 1566 - }, 1567 - "node_modules/lightningcss-linux-x64-gnu": { 1568 - "version": "1.30.2", 1569 - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", 1570 - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", 1571 - "cpu": [ 1572 - "x64" 1573 - ], 1574 - "dev": true, 1575 - "license": "MPL-2.0", 1576 - "optional": true, 1577 - "os": [ 1578 - "linux" 1579 - ], 1580 - "engines": { 1581 - "node": ">= 12.0.0" 1582 - }, 1583 - "funding": { 1584 - "type": "opencollective", 1585 - "url": "https://opencollective.com/parcel" 1586 - } 1587 - }, 1588 - "node_modules/lightningcss-linux-x64-musl": { 1589 - "version": "1.30.2", 1590 - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", 1591 - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", 1592 - "cpu": [ 1593 - "x64" 1594 - ], 1595 - "dev": true, 1596 - "license": "MPL-2.0", 1597 - "optional": true, 1598 - "os": [ 1599 - "linux" 1600 - ], 1601 - "engines": { 1602 - "node": ">= 12.0.0" 1603 - }, 1604 - "funding": { 1605 - "type": "opencollective", 1606 - "url": "https://opencollective.com/parcel" 1607 - } 1608 - }, 1609 - "node_modules/lightningcss-win32-arm64-msvc": { 1610 - "version": "1.30.2", 1611 - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", 1612 - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", 1613 - "cpu": [ 1614 - "arm64" 1615 - ], 1616 - "dev": true, 1617 - "license": "MPL-2.0", 1618 - "optional": true, 1619 - "os": [ 1620 - "win32" 1621 - ], 1622 - "engines": { 1623 - "node": ">= 12.0.0" 1624 - }, 1625 - "funding": { 1626 - "type": "opencollective", 1627 - "url": "https://opencollective.com/parcel" 1628 - } 1629 - }, 1630 - "node_modules/lightningcss-win32-x64-msvc": { 1631 - "version": "1.30.2", 1632 - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", 1633 - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", 1634 - "cpu": [ 1635 - "x64" 1636 - ], 1637 - "dev": true, 1638 - "license": "MPL-2.0", 1639 - "optional": true, 1640 - "os": [ 1641 - "win32" 1642 - ], 1643 - "engines": { 1644 - "node": ">= 12.0.0" 1645 - }, 1646 - "funding": { 1647 - "type": "opencollective", 1648 - "url": "https://opencollective.com/parcel" 1649 - } 1650 - }, 1651 - "node_modules/lilconfig": { 1652 - "version": "3.1.3", 1653 - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", 1654 - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", 1655 - "dev": true, 1656 - "license": "MIT", 1657 - "engines": { 1658 - "node": ">=14" 1659 - }, 1660 - "funding": { 1661 - "url": "https://github.com/sponsors/antonk52" 1662 - } 1663 - }, 1664 - "node_modules/magic-string": { 1665 - "version": "0.30.21", 1666 - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", 1667 - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", 1668 - "dev": true, 1669 - "license": "MIT", 1670 - "dependencies": { 1671 - "@jridgewell/sourcemap-codec": "^1.5.5" 1672 - } 1673 - }, 1674 - "node_modules/nanoid": { 1675 - "version": "3.3.11", 1676 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 1677 - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1678 - "dev": true, 1679 - "funding": [ 1680 - { 1681 - "type": "github", 1682 - "url": "https://github.com/sponsors/ai" 1683 - } 1684 - ], 1685 - "license": "MIT", 1686 - "bin": { 1687 - "nanoid": "bin/nanoid.cjs" 1688 - }, 1689 - "engines": { 1690 - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1691 - } 1692 - }, 1693 - "node_modules/node-releases": { 1694 - "version": "2.0.27", 1695 - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", 1696 - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", 1697 - "dev": true, 1698 - "license": "MIT" 1699 - }, 1700 - "node_modules/normalize-path": { 1701 - "version": "3.0.0", 1702 - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1703 - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1704 - "dev": true, 1705 - "license": "MIT", 1706 - "engines": { 1707 - "node": ">=0.10.0" 1708 - } 1709 - }, 1710 - "node_modules/picocolors": { 1711 - "version": "1.1.1", 1712 - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1713 - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1714 - "dev": true, 1715 - "license": "ISC" 1716 - }, 1717 - "node_modules/picomatch": { 1718 - "version": "2.3.1", 1719 - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1720 - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1721 - "dev": true, 1722 - "license": "MIT", 1723 - "engines": { 1724 - "node": ">=8.6" 1725 - }, 1726 - "funding": { 1727 - "url": "https://github.com/sponsors/jonschlinkert" 1728 - } 1729 - }, 1730 - "node_modules/pify": { 1731 - "version": "2.3.0", 1732 - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1733 - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1734 - "dev": true, 1735 - "license": "MIT", 1736 - "engines": { 1737 - "node": ">=0.10.0" 1738 - } 1739 - }, 1740 - "node_modules/postcss": { 1741 - "version": "8.5.6", 1742 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 1743 - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 1744 - "dev": true, 1745 - "funding": [ 1746 - { 1747 - "type": "opencollective", 1748 - "url": "https://opencollective.com/postcss/" 1749 - }, 1750 - { 1751 - "type": "tidelift", 1752 - "url": "https://tidelift.com/funding/github/npm/postcss" 1753 - }, 1754 - { 1755 - "type": "github", 1756 - "url": "https://github.com/sponsors/ai" 1757 - } 1758 - ], 1759 - "license": "MIT", 1760 - "dependencies": { 1761 - "nanoid": "^3.3.11", 1762 - "picocolors": "^1.1.1", 1763 - "source-map-js": "^1.2.1" 1764 - }, 1765 - "engines": { 1766 - "node": "^10 || ^12 || >=14" 1767 - } 1768 - }, 1769 - "node_modules/postcss-cli": { 1770 - "version": "11.0.1", 1771 - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", 1772 - "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", 1773 - "dev": true, 1774 - "license": "MIT", 1775 - "dependencies": { 1776 - "chokidar": "^3.3.0", 1777 - "dependency-graph": "^1.0.0", 1778 - "fs-extra": "^11.0.0", 1779 - "picocolors": "^1.0.0", 1780 - "postcss-load-config": "^5.0.0", 1781 - "postcss-reporter": "^7.0.0", 1782 - "pretty-hrtime": "^1.0.3", 1783 - "read-cache": "^1.0.0", 1784 - "slash": "^5.0.0", 1785 - "tinyglobby": "^0.2.12", 1786 - "yargs": "^17.0.0" 1787 - }, 1788 - "bin": { 1789 - "postcss": "index.js" 1790 - }, 1791 - "engines": { 1792 - "node": ">=18" 1793 - }, 1794 - "peerDependencies": { 1795 - "postcss": "^8.0.0" 1796 - } 1797 - }, 1798 - "node_modules/postcss-custom-media": { 1799 - "version": "11.0.6", 1800 - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", 1801 - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", 1802 - "dev": true, 1803 - "funding": [ 1804 - { 1805 - "type": "github", 1806 - "url": "https://github.com/sponsors/csstools" 1807 - }, 1808 - { 1809 - "type": "opencollective", 1810 - "url": "https://opencollective.com/csstools" 1811 - } 1812 - ], 1813 - "license": "MIT", 1814 - "dependencies": { 1815 - "@csstools/cascade-layer-name-parser": "^2.0.5", 1816 - "@csstools/css-parser-algorithms": "^3.0.5", 1817 - "@csstools/css-tokenizer": "^3.0.4", 1818 - "@csstools/media-query-list-parser": "^4.0.3" 1819 - }, 1820 - "engines": { 1821 - "node": ">=18" 1822 - }, 1823 - "peerDependencies": { 1824 - "postcss": "^8.4" 1825 - } 1826 - }, 1827 - "node_modules/postcss-load-config": { 1828 - "version": "5.1.0", 1829 - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", 1830 - "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", 1831 - "dev": true, 1832 - "funding": [ 1833 - { 1834 - "type": "opencollective", 1835 - "url": "https://opencollective.com/postcss/" 1836 - }, 1837 - { 1838 - "type": "github", 1839 - "url": "https://github.com/sponsors/ai" 1840 - } 1841 - ], 1842 - "license": "MIT", 1843 - "dependencies": { 1844 - "lilconfig": "^3.1.1", 1845 - "yaml": "^2.4.2" 1846 - }, 1847 - "engines": { 1848 - "node": ">= 18" 1849 - }, 1850 - "peerDependencies": { 1851 - "jiti": ">=1.21.0", 1852 - "postcss": ">=8.0.9", 1853 - "tsx": "^4.8.1" 1854 - }, 1855 - "peerDependenciesMeta": { 1856 - "jiti": { 1857 - "optional": true 1858 - }, 1859 - "postcss": { 1860 - "optional": true 1861 - }, 1862 - "tsx": { 1863 - "optional": true 1864 - } 1865 - } 1866 - }, 1867 - "node_modules/postcss-reporter": { 1868 - "version": "7.1.0", 1869 - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", 1870 - "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", 1871 - "dev": true, 1872 - "funding": [ 1873 - { 1874 - "type": "opencollective", 1875 - "url": "https://opencollective.com/postcss/" 1876 - }, 1877 - { 1878 - "type": "github", 1879 - "url": "https://github.com/sponsors/ai" 1880 - } 1881 - ], 1882 - "license": "MIT", 1883 - "dependencies": { 1884 - "picocolors": "^1.0.0", 1885 - "thenby": "^1.3.4" 1886 - }, 1887 - "engines": { 1888 - "node": ">=10" 1889 - }, 1890 - "peerDependencies": { 1891 - "postcss": "^8.1.0" 1892 - } 1893 - }, 1894 - "node_modules/postcss-value-parser": { 1895 - "version": "4.2.0", 1896 - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1897 - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1898 - "dev": true, 1899 - "license": "MIT" 1900 - }, 1901 - "node_modules/pretty-hrtime": { 1902 - "version": "1.0.3", 1903 - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", 1904 - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", 1905 - "dev": true, 1906 - "license": "MIT", 1907 - "engines": { 1908 - "node": ">= 0.8" 1909 - } 1910 - }, 1911 - "node_modules/read-cache": { 1912 - "version": "1.0.0", 1913 - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 1914 - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 1915 - "dev": true, 1916 - "license": "MIT", 1917 - "dependencies": { 1918 - "pify": "^2.3.0" 1919 - } 1920 - }, 1921 - "node_modules/readdirp": { 1922 - "version": "3.6.0", 1923 - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1924 - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1925 - "dev": true, 1926 - "license": "MIT", 1927 - "dependencies": { 1928 - "picomatch": "^2.2.1" 1929 - }, 1930 - "engines": { 1931 - "node": ">=8.10.0" 1932 - } 1933 - }, 1934 - "node_modules/require-directory": { 1935 - "version": "2.1.1", 1936 - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1937 - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1938 - "dev": true, 1939 - "license": "MIT", 1940 - "engines": { 1941 - "node": ">=0.10.0" 1942 - } 1943 - }, 1944 - "node_modules/slash": { 1945 - "version": "5.1.0", 1946 - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", 1947 - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", 1948 - "dev": true, 1949 - "license": "MIT", 1950 - "engines": { 1951 - "node": ">=14.16" 1952 - }, 1953 - "funding": { 1954 - "url": "https://github.com/sponsors/sindresorhus" 1955 - } 1956 - }, 1957 - "node_modules/source-map-js": { 1958 - "version": "1.2.1", 1959 - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1960 - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1961 - "dev": true, 1962 - "license": "BSD-3-Clause", 1963 - "engines": { 1964 - "node": ">=0.10.0" 1965 - } 1966 - }, 1967 - "node_modules/string-width": { 1968 - "version": "4.2.3", 1969 - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1970 - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1971 - "dev": true, 1972 - "license": "MIT", 1973 - "dependencies": { 1974 - "emoji-regex": "^8.0.0", 1975 - "is-fullwidth-code-point": "^3.0.0", 1976 - "strip-ansi": "^6.0.1" 1977 - }, 1978 - "engines": { 1979 - "node": ">=8" 1980 - } 1981 - }, 1982 - "node_modules/strip-ansi": { 1983 - "version": "6.0.1", 1984 - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1985 - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1986 - "dev": true, 1987 - "license": "MIT", 1988 - "dependencies": { 1989 - "ansi-regex": "^5.0.1" 1990 - }, 1991 - "engines": { 1992 - "node": ">=8" 1993 - } 1994 - }, 1995 - "node_modules/tailwindcss": { 1996 - "version": "4.1.18", 1997 - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", 1998 - "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", 1999 - "license": "MIT" 2000 - }, 2001 - "node_modules/tapable": { 2002 - "version": "2.3.0", 2003 - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", 2004 - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", 2005 - "dev": true, 2006 - "license": "MIT", 2007 - "engines": { 2008 - "node": ">=6" 2009 - }, 2010 - "funding": { 2011 - "type": "opencollective", 2012 - "url": "https://opencollective.com/webpack" 2013 - } 2014 - }, 2015 - "node_modules/thenby": { 2016 - "version": "1.3.4", 2017 - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", 2018 - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", 2019 - "dev": true, 2020 - "license": "Apache-2.0" 2021 - }, 2022 - "node_modules/tinyglobby": { 2023 - "version": "0.2.15", 2024 - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", 2025 - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", 2026 - "dev": true, 2027 - "license": "MIT", 2028 - "dependencies": { 2029 - "fdir": "^6.5.0", 2030 - "picomatch": "^4.0.3" 2031 - }, 2032 - "engines": { 2033 - "node": ">=12.0.0" 2034 - }, 2035 - "funding": { 2036 - "url": "https://github.com/sponsors/SuperchupuDev" 2037 - } 2038 - }, 2039 - "node_modules/tinyglobby/node_modules/fdir": { 2040 - "version": "6.5.0", 2041 - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", 2042 - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 2043 - "dev": true, 2044 - "license": "MIT", 2045 - "engines": { 2046 - "node": ">=12.0.0" 2047 - }, 2048 - "peerDependencies": { 2049 - "picomatch": "^3 || ^4" 2050 - }, 2051 - "peerDependenciesMeta": { 2052 - "picomatch": { 2053 - "optional": true 2054 - } 2055 - } 2056 - }, 2057 - "node_modules/tinyglobby/node_modules/picomatch": { 2058 - "version": "4.0.3", 2059 - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 2060 - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 2061 - "dev": true, 2062 - "license": "MIT", 2063 - "engines": { 2064 - "node": ">=12" 2065 - }, 2066 - "funding": { 2067 - "url": "https://github.com/sponsors/jonschlinkert" 2068 - } 2069 - }, 2070 - "node_modules/to-regex-range": { 2071 - "version": "5.0.1", 2072 - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2073 - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2074 - "dev": true, 2075 - "license": "MIT", 2076 - "dependencies": { 2077 - "is-number": "^7.0.0" 2078 - }, 2079 - "engines": { 2080 - "node": ">=8.0" 2081 - } 2082 - }, 2083 - "node_modules/universalify": { 2084 - "version": "2.0.1", 2085 - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 2086 - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 2087 - "dev": true, 2088 - "license": "MIT", 2089 - "engines": { 2090 - "node": ">= 10.0.0" 2091 - } 2092 - }, 2093 - "node_modules/update-browserslist-db": { 2094 - "version": "1.2.3", 2095 - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", 2096 - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", 2097 - "dev": true, 2098 - "funding": [ 2099 - { 2100 - "type": "opencollective", 2101 - "url": "https://opencollective.com/browserslist" 2102 - }, 2103 - { 2104 - "type": "tidelift", 2105 - "url": "https://tidelift.com/funding/github/npm/browserslist" 2106 - }, 2107 - { 2108 - "type": "github", 2109 - "url": "https://github.com/sponsors/ai" 2110 - } 2111 - ], 2112 - "license": "MIT", 2113 - "dependencies": { 2114 - "escalade": "^3.2.0", 2115 - "picocolors": "^1.1.1" 2116 - }, 2117 - "bin": { 2118 - "update-browserslist-db": "cli.js" 2119 - }, 2120 - "peerDependencies": { 2121 - "browserslist": ">= 4.21.0" 2122 - } 2123 - }, 2124 - "node_modules/wrap-ansi": { 2125 - "version": "7.0.0", 2126 - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2127 - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2128 - "dev": true, 2129 - "license": "MIT", 2130 - "dependencies": { 2131 - "ansi-styles": "^4.0.0", 2132 - "string-width": "^4.1.0", 2133 - "strip-ansi": "^6.0.0" 2134 - }, 2135 - "engines": { 2136 - "node": ">=10" 2137 - }, 2138 - "funding": { 2139 - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2140 - } 2141 - }, 2142 - "node_modules/y18n": { 2143 - "version": "5.0.8", 2144 - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2145 - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2146 - "dev": true, 2147 - "license": "ISC", 2148 - "engines": { 2149 - "node": ">=10" 2150 - } 2151 - }, 2152 - "node_modules/yaml": { 2153 - "version": "2.8.2", 2154 - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", 2155 - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", 2156 - "dev": true, 2157 - "license": "ISC", 2158 - "bin": { 2159 - "yaml": "bin.mjs" 2160 - }, 2161 - "engines": { 2162 - "node": ">= 14.6" 2163 - }, 2164 - "funding": { 2165 - "url": "https://github.com/sponsors/eemeli" 2166 - } 2167 - }, 2168 - "node_modules/yargs": { 2169 - "version": "17.7.2", 2170 - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 2171 - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 2172 - "dev": true, 2173 - "license": "MIT", 2174 - "dependencies": { 2175 - "cliui": "^8.0.1", 2176 - "escalade": "^3.1.1", 2177 - "get-caller-file": "^2.0.5", 2178 - "require-directory": "^2.1.1", 2179 - "string-width": "^4.2.3", 2180 - "y18n": "^5.0.5", 2181 - "yargs-parser": "^21.1.1" 2182 - }, 2183 - "engines": { 2184 - "node": ">=12" 2185 - } 2186 - }, 2187 - "node_modules/yargs-parser": { 2188 - "version": "21.1.1", 2189 - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 2190 - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 2191 - "dev": true, 2192 - "license": "ISC", 2193 - "engines": { 2194 - "node": ">=12" 2195 - } 2196 - } 2197 - } 2198 - }
-15
resources/package.json
··· 1 - { 2 - "devDependencies": { 3 - "@tailwindcss/postcss": "^4.1.18", 4 - "autoprefixer": "^10.4.23", 5 - "esbuild": "0.27.2", 6 - "postcss": "^8.5.6", 7 - "postcss-cli": "^11.0.1", 8 - "postcss-custom-media": "^11.0.6" 9 - }, 10 - "dependencies": { 11 - "htmx.org": "^4.0.0-alpha6", 12 - "tailwindcss": "^4.1.18" 13 - }, 14 - "type": "module" 15 - }
-7
resources/views/about.html
··· 1 - {{ define "title" }}About{{ end }} 2 - 3 - {{ define "content"}} 4 - <h1>About</h1> 5 - 6 - <a href="/">Link</a> 7 - {{ end }}
-15
resources/views/index.html
··· 1 - {{ define "title" }} Hi {{ end }} 2 - 3 - {{ define "content" }} 4 - <h1>Hello World</h1> 5 - <p>This is a test</p> 6 - 7 - <a class="button variant-default shape-square scheme-default" href="/about">Link</a> 8 - 9 - 10 - <button type="button">Button</button> 11 - 12 - <p> 13 - Lorem ipsum, dolor sit amet consectetur adipisicing elit. Tenetur temporibus laborum iste aut veniam vitae ipsum quas dolore quasi enim tempora odit soluta qui assumenda, quae possimus, magni ad, sequi alias exercitationem suscipit aperiam. Eveniet omnis molestias, at eligendi illum similique excepturi facilis quidem mollitia doloribus rerum eius hic ea nulla natus, exercitationem laudantium fugiat corrupti quas rem minus! Vero accusantium quam maiores quae odit ratione fugit beatae nisi tempore distinctio labore soluta voluptatum iure ipsum aperiam blanditiis laborum quaerat, assumenda debitis expedita modi. Veniam voluptatum error labore nulla autem assumenda consequuntur asperiores illum exercitationem, quam quod obcaecati ratione facere quas? Quo cum corporis vel ipsa tempore maxime minus sapiente blanditiis dolore laborum modi architecto, consequatur voluptate sequi! Sunt consectetur, ipsam esse quae quia totam quod labore iste et vitae veniam nihil, reiciendis perferendis enim, facilis debitis officiis ipsa corrupti qui nesciunt sed placeat ad sequi. Vitae temporibus necessitatibus omnis amet, consequuntur iusto nulla asperiores delectus commodi, doloremque expedita ipsa nostrum doloribus tempore a modi distinctio aliquid eius placeat ipsam. Temporibus libero iusto possimus soluta inventore sit veniam voluptate hic, eum voluptas saepe quos aliquid dolores qui tenetur id provident assumenda. Iusto amet maxime vero fuga. Temporibus saepe praesentium sapiente facere adipisci. Quis excepturi minima obcaecati optio ad illum molestiae quas, explicabo exercitationem dolorem voluptatibus omnis. Hic, assumenda a, sit ratione tempora dolorum natus voluptate consequatur ipsa expedita cum in fugiat laudantium aut facilis est corrupti ipsum! Deleniti, nulla. Odit corporis atque aliquid ea, obcaecati sunt veniam, eius exercitationem iusto necessitatibus ratione? Molestias repudiandae debitis quae maiores vitae sapiente dolor sequi fugiat facere cupiditate, ut sit tenetur, hic eius, harum atque a eaque rem similique praesentium? Obcaecati ullam repudiandae porro quos quas nemo provident eum excepturi laboriosam fuga minima dolorem molestiae, ex deserunt ea quod tempora impedit reprehenderit eius. Eaque consequatur obcaecati blanditiis eius, hic aspernatur est voluptatem deserunt, eum qui optio aliquam laboriosam fugit nemo itaque minima? Ex saepe dignissimos ullam deserunt veritatis, officiis facere enim exercitationem. Harum eius necessitatibus ducimus aut eveniet facere quibusdam repellendus. Earum itaque sed aperiam placeat repellendus ex nam laboriosam saepe magni distinctio quia eveniet rem laborum dolorem quis explicabo, iste beatae excepturi nulla. Voluptatem quasi voluptatibus eligendi magni ducimus reiciendis blanditiis architecto. Iusto, dolorem placeat voluptatem reprehenderit quia, perferendis officia similique possimus obcaecati quod nisi ipsa. Iste rerum nulla atque dolor possimus facere minima adipisci ratione aut quae at nobis fuga, vitae eligendi quia dicta architecto sint vel omnis, totam ea numquam fugit laboriosam ducimus. Quisquam iure beatae autem, ipsum error in nulla necessitatibus alias totam voluptates vero quod, rerum dolore molestiae sint odio velit, recusandae similique aliquid impedit! Quo tenetur asperiores fuga corporis explicabo consequuntur obcaecati ipsum maxime dignissimos quasi voluptate temporibus repudiandae tempora dolore odit impedit, ad ex aliquam. Minima, iure incidunt necessitatibus aliquam officiis, veniam, assumenda porro itaque sed enim possimus quas aliquid! Temporibus molestias at mollitia blanditiis ea. Consectetur mollitia minus atque in officia adipisci! Dignissimos, exercitationem. Dolore vel vero quo eos eligendi at minus illum voluptas sint ducimus! 14 - </p> 15 - {{ end }}
-17
resources/views/layouts/base.html
··· 1 - <!doctype html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8" /> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 - <title>{{ block "title" . }}{{ end }}</title> 7 - <link rel="stylesheet" href="/assets/app.css" /> 8 - <script src="/assets/app.js" defer></script> 9 - </head> 10 - <body class="@container base layout"> 11 - {{ template "partials/header" . }} 12 - <div class="container content" id="content"> 13 - {{ block "content" . }}{{ end }} 14 - </div> 15 - {{ template "partials/footer" . }} 16 - </body> 17 - </html>
-30
resources/views/library/artists.html
··· 1 - {{ define "title" }}Artists{{ end }} 2 - 3 - {{ define "content"}} 4 - 5 - {{ template "partials/library/aside" (dict "current" "artists") }} 6 - 7 - <main class="library"> 8 - <header> 9 - <hgroup> 10 - <h1 class="h1">Artists</h1> 11 - <p class="subtitle"> 12 - Find your most played artists and see your artist listening trends 13 - </p> 14 - </hgroup> 15 - </header> 16 - 17 - <section class="artists"> 18 - {{ range .artists.Items }} 19 - <article class="artist-list-item"> 20 - {{ if .ImageURL }} 21 - <img src="{{ .ImageURL }}" alt="Logo"> 22 - {{ end }} 23 - <a href="/catalog/artists/{{ .MBID }}" class="name">{{ .Name }}</a> 24 - <p class="scrobbles">{{ .Count }}</p> 25 - </article> 26 - {{ end }} 27 - </section> 28 - </main> 29 - 30 - {{ end }}
-16
resources/views/library/index.html
··· 1 - {{ define "title" }}Library{{ end }} 2 - 3 - {{ define "content"}} 4 - 5 - {{ template "partials/library/aside" (dict "current" "overview") }} 6 - 7 - <main class="library"> 8 - <header> 9 - <hgroup> 10 - <h1 class="h1">Library</h1> 11 - <p class="subtitle">pfdjslkfjsdlk</p> 12 - </hgroup> 13 - </header> 14 - </main> 15 - 16 - {{ end }}
-7
resources/views/partials/footer.html
··· 1 - {{ define "partials/footer" }} 2 - <footer> 3 - <div class="container"> 4 - Keep Track 2026 5 - </div> 6 - </footer> 7 - {{ end }}
-31
resources/views/partials/header.html
··· 1 - {{ define "partials/header" }} 2 - 3 - {{ $items := (slice 4 - (dict "label" "Home" "href" "/" "name" "home") 5 - (dict "label" "Dashboard" "href" "/dashboard" "name" "dashboard") 6 - (dict "label" "Friends" "href" "/friends" "name" "friends") 7 - (dict "label" "Library" "href" "/library" "name" "library") 8 - ) }} 9 - 10 - <header> 11 - <nav class="container navigation main"> 12 - {{ template "partials/logo" . }} 13 - 14 - <ul class="list"> 15 - {{ range $index, $item := $items }} 16 - <li class="item"> 17 - <a 18 - {{ if eq .name "library" }} aria-current="page" {{ end }} 19 - href="{{ $item.href }}" 20 - >{{ $item.label }}</a> 21 - </li> 22 - {{ end }} 23 - </ul> 24 - 25 - <ul class="list"> 26 - 27 - </ul> 28 - </nav> 29 - </header> 30 - 31 - {{ end }}
-23
resources/views/partials/library/aside.html
··· 1 - {{ define "partials/library/aside" }} 2 - 3 - {{ $items := (slice 4 - (dict "label" "Overview" "href" "/library" "name" "overview") 5 - (dict "label" "Artists" "href" "/library/artists" "name" "artists") 6 - (dict "label" "Releases" "href" "/library/releases" "name" "releases") 7 - (dict "label" "Songs" "href" "/library/songs" "name" "songs") 8 - ) }} 9 - 10 - <aside> 11 - <nav class="navigation aside"> 12 - <ul class="list"> 13 - {{ $current := .current }} 14 - {{ range $i, $item := $items }} 15 - <li class="item"> 16 - <a {{ if eq $item.name $current }} aria-current="page" {{ end }} href="{{ $item.href }}">{{ $item.label }}</a> 17 - </li> 18 - {{ end }} 19 - </ul> 20 - </nav> 21 - </aside> 22 - 23 - {{ end }}
-3
resources/views/partials/logo.html
··· 1 - {{ define "partials/logo" }} 2 - <p class="logo">KeepTrack</p> 3 - {{ end }}
+3 -2
taskfile.yml
··· 109 109 silent: true 110 110 cmds: 111 111 - task: build:bridge 112 - - ./bin/bridge schema --package github.com/oscar345/keeptrack/internal/models --path web/src/lib/.gen/schemas.ts 112 + - ./bin/bridge schema --package github.com/oscar345/keeptrack/internal/web/responses --path web/lib/.gen/schemas/responses.ts 113 + - ./bin/bridge schema --package github.com/oscar345/keeptrack/internal/web/requests --path web/lib/.gen/schemas/requests.ts 113 114 114 115 generate:routes: 115 116 silent: true 116 117 cmds: 117 118 - task: build:bridge 118 - - ./bin/bridge route --path web/src/lib/.gen/routes.ts 119 + - ./bin/bridge route --path web/lib/.gen/routes.ts 119 120 120 121 serve: 121 122 watch: true
+13
web/components/brand/Logo.svelte
··· 1 + <script lang="ts"> 2 + type Props = {}; 3 + 4 + let {}: Props = $props(); 5 + </script> 6 + 7 + <p>KeepTrack</p> 8 + 9 + <style> 10 + p { 11 + color: var(--color-content-200); 12 + } 13 + </style>
+11
web/components/footer/web/Footer.svelte
··· 1 + <script lang="ts"> 2 + type Props = {}; 3 + 4 + let {}: Props = $props(); 5 + </script> 6 + 7 + <footer> 8 + <div class="container"> 9 + <p>© 2026 - Keep track</p> 10 + </div> 11 + </footer>
+25
web/components/layouts/library/Layout.svelte
··· 1 + <script lang="ts"> 2 + import Navigation from "$components/navigation/library/Navigation.svelte"; 3 + import type { Snippet } from "svelte"; 4 + 5 + type Props = { 6 + children: Snippet; 7 + }; 8 + 9 + let { children }: Props = $props(); 10 + </script> 11 + 12 + <div class="view"> 13 + <Navigation /> 14 + 15 + <main> 16 + {@render children()} 17 + </main> 18 + </div> 19 + 20 + <style> 21 + .view { 22 + display: grid; 23 + grid-template-columns: 1fr 3fr; 24 + } 25 + </style>
+21 -1
web/components/layouts/web/Layout.svelte
··· 1 1 <script lang="ts"> 2 + import Footer from "$components/footer/web/Footer.svelte"; 3 + import Navigation from "$components/navigation/web/Navigation.svelte"; 2 4 import type { Snippet } from "svelte"; 3 5 4 6 type Props = { ··· 8 10 let { children }: Props = $props(); 9 11 </script> 10 12 11 - {@render children()} 13 + <div class="layout"> 14 + <Navigation /> 15 + 16 + <div class="container"> 17 + {@render children()} 18 + </div> 19 + 20 + <Footer /> 21 + </div> 22 + 23 + <style> 24 + .layout { 25 + display: grid; 26 + grid-template-rows: var(--spacing-16) 1fr max-content; 27 + min-height: 100dvh; 28 + 29 + row-gap: var(--spacing-6); 30 + } 31 + </style>
+73
web/components/navigation/library/Navigation.svelte
··· 1 + <script lang="ts"> 2 + import type { NavigationItemProps } from "$lib/types"; 3 + import { Link, page } from "@inertiajs/svelte"; 4 + 5 + let items: NavigationItemProps[] = $state([ 6 + { label: "Overview", href: "/library", view: "overview" }, 7 + { label: "Artists", href: "/library/artists", view: "artists" }, 8 + { label: "Releases ", href: "/library/releases", view: "releases" }, 9 + { label: "Songs", href: "/library/songs", view: "songs" }, 10 + ]); 11 + </script> 12 + 13 + <aside> 14 + <nav> 15 + <ul> 16 + {#each items as item} 17 + <li> 18 + <Link 19 + aria-current={$page.component === item.view 20 + ? "page" 21 + : undefined} 22 + href={item.href} 23 + > 24 + {item.label} 25 + </Link> 26 + </li> 27 + {/each} 28 + </ul> 29 + </nav> 30 + </aside> 31 + 32 + <style> 33 + nav { 34 + display: flex; 35 + flex-direction: column; 36 + gap: var(--spacing-2); 37 + } 38 + 39 + ul { 40 + width: 100%; 41 + display: flex; 42 + flex-direction: column; 43 + gap: var(--spacing-1); 44 + } 45 + 46 + li > :global(a) { 47 + color: var(--color-primary); 48 + padding-block: var(--spacing-0_5); 49 + border-radius: var(--radius-md); 50 + font-size: var(--text-sm); 51 + line-height: var(--text-sm--line-height); 52 + font-weight: var(--font-weight-medium); 53 + width: 100%; 54 + display: inline-flex; 55 + align-items: center; 56 + gap: var(--spacing-1); 57 + transition: 58 + background-color 100ms ease, 59 + padding-inline 100ms ease; 60 + } 61 + 62 + li > :global(a:where([aria-current="page"], :hover)) { 63 + padding-inline: var(--spacing-2); 64 + } 65 + 66 + li > :global(a[aria-current="page"]) { 67 + background-color: var(--color-base-200); 68 + } 69 + 70 + li > :global(a:hover) { 71 + background-color: var(--color-muted-100); 72 + } 73 + </style>
+72
web/components/navigation/web/Navigation.svelte
··· 1 + <script lang="ts"> 2 + import Logo from "$components/brand/Logo.svelte"; 3 + import { GET_Index, GET_Library } from "$routes"; 4 + import type { NavigationItemProps } from "$lib/types"; 5 + import { Link, page } from "@inertiajs/svelte"; 6 + 7 + let items: NavigationItemProps[] = $state([ 8 + { href: GET_Index(), label: "Home", view: "Index" }, 9 + { href: GET_Library(), label: "Library", view: "library/Index" }, 10 + ]); 11 + </script> 12 + 13 + <header> 14 + <nav class="container"> 15 + <Link> 16 + <Logo /> 17 + </Link> 18 + <ul> 19 + {#each items as item} 20 + <li> 21 + <Link 22 + href={item.href} 23 + aria-current={$page.component === item.view 24 + ? "page" 25 + : undefined} 26 + > 27 + {item.label} 28 + </Link> 29 + </li> 30 + {/each} 31 + </ul> 32 + </nav> 33 + </header> 34 + 35 + <style> 36 + header { 37 + background-color: var(--color-base-300); 38 + border-bottom: var(--theme-default-border); 39 + } 40 + 41 + nav { 42 + display: grid; 43 + grid-template-columns: 1fr max-content 1fr; 44 + height: 100%; 45 + align-items: center; 46 + } 47 + 48 + ul { 49 + width: 100%; 50 + display: flex; 51 + justify-content: center; 52 + align-items: center; 53 + gap: var(--spacing-2); 54 + } 55 + 56 + li > :global(a) { 57 + color: var(--color-primary); 58 + padding: var(--spacing-2) var(--spacing-1_5); 59 + border-radius: var(--radius-md); 60 + font-size: var(--text-sm); 61 + line-height: var(--text-sm--line-height); 62 + font-weight: var(--font-weight-medium); 63 + } 64 + 65 + li > :global(a[aria-current="page"]) { 66 + background-color: var(--color-base-200); 67 + } 68 + 69 + li > :global(a:hover) { 70 + background-color: var(--color-muted-100); 71 + } 72 + </style>
+39
web/lib/.gen/routes.ts
··· 1 + import type { Method } from "$lib/types"; 2 + 3 + export function GET_Index(): { url: string; method: Method } { 4 + return { 5 + url: `/`, 6 + method: "get", 7 + }; 8 + } 9 + 10 + export function GET_ArtistsByID(id: string | number): { 11 + url: string; 12 + method: Method; 13 + } { 14 + return { 15 + url: `/artists/${id}`, 16 + method: "get", 17 + }; 18 + } 19 + 20 + export function GET_Friends(): { url: string; method: Method } { 21 + return { 22 + url: `/friends`, 23 + method: "get", 24 + }; 25 + } 26 + 27 + export function GET_Library(): { url: string; method: Method } { 28 + return { 29 + url: `/library`, 30 + method: "get", 31 + }; 32 + } 33 + 34 + export function GET_LibraryArtists(): { url: string; method: Method } { 35 + return { 36 + url: `/library/artists`, 37 + method: "get", 38 + }; 39 + }
+10
web/lib/.gen/schemas/requests.ts
··· 1 + 2 + export type Pagination = { 3 + page: number; 4 + size: number; 5 + } 6 + 7 + export type Count = { 8 + from: string; 9 + to: string; 10 + }
+24
web/lib/.gen/schemas/responses.ts
··· 1 + 2 + export type Artist = { 3 + mbid: string; 4 + name: string; 5 + count: number; 6 + image_url: string; 7 + } 8 + 9 + export type Recording = { 10 + mbid: string; 11 + name: string; 12 + } 13 + 14 + export type Release = { 15 + mbid: string; 16 + name: string; 17 + } 18 + 19 + export type Page<T> = { 20 + page: number; 21 + size: number; 22 + total: number; 23 + items: T[]; 24 + }
+12
web/lib/types.ts
··· 1 + export type NavigationItemProps = { 2 + label: string; 3 + href: string | MethodURL; 4 + view?: string; 5 + }; 6 + 7 + export type Method = "get" | "post" | "put" | "patch" | "delete"; 8 + 9 + export type MethodURL = { 10 + method: Method; 11 + url: string; 12 + };
+97 -1
web/styles/app.css
··· 4 4 @import "tailwindcss/preflight.css" layer(base); 5 5 @import "tailwindcss/utilities.css" layer(utilities); 6 6 7 + @import "./colors.css" layer(theme); 8 + 7 9 body { 8 - background-color: red; 10 + background-color: var(--color-base-100); 11 + } 12 + 13 + @source not inline('container'); 14 + 15 + .container { 16 + padding-inline: var(--spacing-4); 17 + 18 + @media (width >= 48rem) { 19 + padding-inline: var(--spacing-6); 20 + } 21 + 22 + @media (width >= 64rem) { 23 + padding-inline: var(--spacing-8); 24 + } 25 + } 26 + 27 + @theme { 28 + /* Spacing */ 29 + --spacing-px: 1px; 30 + --spacing-0: 0px; 31 + --spacing-0_5: 0.125rem; 32 + --spacing-1: 0.25rem; 33 + --spacing-1_5: 0.375rem; 34 + --spacing-2: 0.5rem; 35 + --spacing-2_5: 0.625rem; 36 + --spacing-3: 0.75rem; 37 + --spacing-3_5: 0.875rem; 38 + --spacing-4: 1rem; 39 + --spacing-4_5: 1.125rem; 40 + --spacing-5: 1.25rem; 41 + --spacing-6: 1.5rem; 42 + --spacing-7: 1.75rem; 43 + --spacing-8: 2rem; 44 + --spacing-9: 2.25rem; 45 + --spacing-10: 2.5rem; 46 + --spacing-11: 2.75rem; 47 + --spacing-12: 3rem; 48 + --spacing-14: 3.5rem; 49 + --spacing-16: 4rem; 50 + --spacing-18: 4.5rem; 51 + --spacing-20: 5rem; 52 + --spacing-22: 5.5rem; 53 + --spacing-24: 6rem; 54 + --spacing-28: 7rem; 55 + --spacing-32: 8rem; 56 + --spacing-36: 9rem; 57 + --spacing-40: 10rem; 58 + --spacing-44: 11rem; 59 + --spacing-48: 12rem; 60 + --spacing-52: 13rem; 61 + --spacing-56: 14rem; 62 + --spacing-60: 15rem; 63 + --spacing-64: 16rem; 64 + --spacing-72: 18rem; 65 + --spacing-80: 20rem; 66 + --spacing-96: 24rem; 67 + 68 + /* Widths */ 69 + --width-3xs: 16rem; 70 + --width-2xs: 18rem; 71 + --width-xs: 20rem; 72 + --width-sm: 24rem; 73 + --width-md: 28rem; 74 + --width-lg: 32rem; 75 + --width-xl: 36rem; 76 + --width-2xl: 42rem; 77 + --width-3xl: 48rem; 78 + --width-4xl: 56rem; 79 + --width-5xl: 64rem; 80 + --width-6xl: 72rem; 81 + --width-7xl: 80rem; 82 + --width-prose: 65ch; 83 + } 84 + 85 + @theme inline { 86 + --color-base-100: var(--theme-color-base-100); 87 + --color-base-200: var(--theme-color-base-200); 88 + --color-base-300: var(--theme-color-base-300); 89 + --color-content-100: var(--theme-color-content-100); 90 + --color-content-200: var(--theme-color-content-200); 91 + --color-content-300: var(--theme-color-content-300); 92 + --color-muted-100: var(--theme-color-muted-100); 93 + --color-muted-200: var(--theme-color-muted-200); 94 + --color-muted-300: var(--theme-color-muted-300); 95 + --color-primary: var(--theme-color-primary); 96 + --color-primary-contrast: var(--theme-color-primary-contrast); 97 + --color-secondary: var(--theme-color-secondary); 98 + --color-secondary-contrast: var(--theme-color-secondary-contrast); 99 + --color-success: var(--theme-color-success); 100 + --color-success-contrast: var(--theme-color-success-contrast); 101 + --color-warning: var(--theme-color-warning); 102 + --color-warning-contrast: var(--theme-color-warning-contrast); 103 + --color-danger: var(--theme-color-danger); 104 + --color-danger-contrast: var(--theme-color-danger-contrast); 9 105 }
+77
web/styles/colors.css
··· 1 + @layer theme { 2 + :root { 3 + --mixin-color-light-100: #fff 20%; 4 + --mixin-color-light-200: #fff 50%; 5 + --mixin-color-light-300: #fff 80%; 6 + 7 + --mixin-color-dark-100: #000 20%; 8 + --mixin-color-dark-200: #000 50%; 9 + --mixin-color-dark-300: #000 80%; 10 + 11 + --theme-color-base-100: var(--color-gray-50); 12 + --theme-color-base-200: var(--color-gray-100); 13 + --theme-color-base-300: #fff; 14 + 15 + --theme-color-content-100: var(--color-gray-950); 16 + --theme-color-content-200: var(--color-gray-800); 17 + --theme-color-content-300: var(--color-gray-600); 18 + 19 + --theme-color-muted-100: var(--color-gray-200); 20 + --theme-color-muted-200: var(--color-gray-300); 21 + --theme-color-muted-300: var(--color-gray-400); 22 + 23 + --theme-color-primary: var(--color-blue-600); 24 + --theme-color-primary-contrast: var(--color-blue-50); 25 + --theme-color-secondary: var(--color-blue-200); 26 + --theme-color-secondary-contrast: var(--color-blue-950); 27 + --theme-color-success: #00cc66; 28 + --theme-color-success-contrast: #fff; 29 + --theme-color-warning: #ff9900; 30 + --theme-color-warning-contrast: #fff; 31 + --theme-color-danger: #ff3333; 32 + --theme-color-danger-contrast: #fff; 33 + 34 + --theme-default-border: 1px solid var(--color-muted-200); 35 + } 36 + 37 + @media (prefers-color-scheme: dark) { 38 + :root { 39 + --mixin-color-light-100: #fff 20%; 40 + --mixin-color-light-200: #fff 50%; 41 + --mixin-color-light-300: #fff 80%; 42 + 43 + --mixin-color-dark-100: #000 20%; 44 + --mixin-color-dark-200: #000 50%; 45 + --mixin-color-dark-300: #000 80%; 46 + 47 + --theme-color-base-100: color-mix( 48 + in srgb, 49 + var(--color-zinc-900), 50 + var(--color-zinc-950) 51 + ); 52 + --theme-color-base-200: var(--color-zinc-900); 53 + --theme-color-base-300: var(--color-zinc-950); 54 + 55 + --theme-color-content-100: var(--color-zinc-50); 56 + --theme-color-content-200: var(--color-zinc-100); 57 + --theme-color-content-300: var(--color-zinc-400); 58 + 59 + --theme-color-muted-100: var(--color-zinc-800); 60 + --theme-color-muted-200: var(--color-zinc-700); 61 + --theme-color-muted-300: var(--color-zinc-500); 62 + 63 + --theme-color-primary: var(--color-blue-600); 64 + --theme-color-primary-contrast: var(--color-blue-50); 65 + --theme-color-secondary: var(--color-blue-200); 66 + --theme-color-secondary-contrast: var(--color-blue-950); 67 + --theme-color-success: #00cc66; 68 + --theme-color-success-contrast: #fff; 69 + --theme-color-warning: #ff9900; 70 + --theme-color-warning-contrast: #fff; 71 + --theme-color-danger: #ff3333; 72 + --theme-color-danger-contrast: #fff; 73 + 74 + --theme-default-border: 1px solid var(--color-muted-200); 75 + } 76 + } 77 + }
+10 -3
web/tsconfig.json
··· 9 9 "skipLibCheck": true, 10 10 "baseUrl": ".", 11 11 "paths": { 12 - "$lib/*": ["lib/*"], 12 + "$routes": ["lib/.gen/routes"], 13 + "$schemas/*": ["lib/.gen/schemas/*"], 13 14 "$components/*": ["./components/*"], 14 - "$routes/*": ["lib/.gen/routes/*"], 15 - "$schemas/*": ["lib/.gen/schemas/*"], 15 + "$lib/*": ["lib/*"], 16 16 }, 17 17 }, 18 18 "exclude": ["./node_modules/**"], 19 + "include": [ 20 + "lib", 21 + "lib/**/*.ts", 22 + "lib/.gen/**/*.ts", 23 + "**/*.svelte", 24 + "esbuild.config.ts", 25 + ], 19 26 }
+21
web/views/library/Artists.svelte
··· 1 + <script lang="ts" module> 2 + import { default as Base } from "$components/layouts/Layout.svelte"; 3 + import { default as Web } from "$components/layouts/web/Layout.svelte"; 4 + import Layout from "$components/layouts/library/Layout.svelte"; 5 + 6 + export const layout = [Base, Web, Layout]; 7 + </script> 8 + 9 + <script lang="ts"> 10 + import type { Page, Artist } from "$schemas/responses"; 11 + 12 + type Props = { 13 + artists: Page<Artist>; 14 + }; 15 + 16 + let { artists }: Props = $props(); 17 + </script> 18 + 19 + <header> 20 + <h1>Artists</h1> 21 + </header>
+14
web/views/library/Index.svelte
··· 1 + <script lang="ts" module> 2 + import { default as Base } from "$components/layouts/Layout.svelte"; 3 + import { default as Web } from "$components/layouts/web/Layout.svelte"; 4 + import Layout from "$components/layouts/library/Layout.svelte"; 5 + 6 + export const layout = [Base, Web, Layout]; 7 + </script> 8 + 9 + <script lang="ts"> 10 + </script> 11 + 12 + <header> 13 + <h1>Artists</h1> 14 + </header>