commit efee85cf318416c97819eb9edd5629a96dc05db9 Author: Lukas Werner Date: Sat Aug 30 13:06:28 2025 -0700 feat: initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..27fb820 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*_templ.go +config.toml diff --git a/.templui.json b/.templui.json new file mode 100644 index 0000000..b3f3abb --- /dev/null +++ b/.templui.json @@ -0,0 +1,7 @@ +{ + "componentsDir": "components", + "utilsDir": "utils", + "moduleName": "git.hafen.run/lukas/timeshare", + "jsDir": "assets/js", + "jsPublicPath": "/assets/js" +} \ No newline at end of file diff --git a/assets/css/input.css b/assets/css/input.css new file mode 100644 index 0000000..afe301d --- /dev/null +++ b/assets/css/input.css @@ -0,0 +1,142 @@ +@import 'tailwindcss'; + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme inline { + --breakpoint-3xl: 1600px; + --breakpoint-4xl: 2000px; + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); + --color-surface: var(--surface); + --color-surface-foreground: var(--surface-foreground); + --color-code: var(--code); + --color-code-foreground: var(--code-foreground); + --color-code-highlight: var(--code-highlight); + --color-code-number: var(--code-number); + --color-selection: var(--selection); + --color-selection-foreground: var(--selection-foreground); +} + +/* Default theme - Neutral gray */ +:root { + --radius: 0.65rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); + --selection: oklch(0.145 0 0); + --selection-foreground: oklch(1 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); + --selection: oklch(0.922 0 0); + --selection-foreground: oklch(0.205 0 0); +} + +@layer base { + * { + @apply border-border; + } + ::selection { + @apply bg-selection text-selection-foreground; + } + + body { + @apply bg-background text-foreground; + font-feature-settings: + "rlig" 1, + "calt" 1; + } +} diff --git a/assets/css/output.css b/assets/css/output.css new file mode 100644 index 0000000..d7c7d7e --- /dev/null +++ b/assets/css/output.css @@ -0,0 +1,1393 @@ +/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */ +@layer properties; +@layer theme, base, components, utilities; +@layer theme { + :root, :host { + --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + --color-red-500: oklch(63.7% 0.237 25.331); + --color-yellow-500: oklch(79.5% 0.184 86.047); + --color-green-500: oklch(72.3% 0.219 149.579); + --color-blue-500: oklch(62.3% 0.214 259.815); + --color-gray-300: oklch(87.2% 0.01 258.338); + --color-gray-400: oklch(70.7% 0.022 261.325); + --color-gray-500: oklch(55.1% 0.027 264.364); + --spacing: 0.25rem; + --text-sm: 0.875rem; + --text-sm--line-height: calc(1.25 / 0.875); + --text-xl: 1.25rem; + --text-xl--line-height: calc(1.75 / 1.25); + --text-2xl: 1.5rem; + --text-2xl--line-height: calc(2 / 1.5); + --text-3xl: 1.875rem; + --text-3xl--line-height: calc(2.25 / 1.875); + --text-4xl: 2.25rem; + --text-4xl--line-height: calc(2.5 / 2.25); + --font-weight-medium: 500; + --font-weight-semibold: 600; + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --ease-out: cubic-bezier(0, 0, 0.2, 1); + --default-transition-duration: 150ms; + --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + --default-font-family: var(--font-sans); + --default-mono-font-family: var(--font-mono); + --breakpoint-3xl: 1600px; + --breakpoint-4xl: 2000px; + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); + --color-surface: var(--surface); + --color-surface-foreground: var(--surface-foreground); + --color-code: var(--code); + --color-code-foreground: var(--code-foreground); + --color-code-highlight: var(--code-highlight); + --color-code-number: var(--code-number); + --color-selection: var(--selection); + --color-selection-foreground: var(--selection-foreground); + } +} +@layer base { + *, ::after, ::before, ::backdrop, ::file-selector-button { + box-sizing: border-box; + margin: 0; + padding: 0; + border: 0 solid; + } + html, :host { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + tab-size: 4; + font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); + font-feature-settings: var(--default-font-feature-settings, normal); + font-variation-settings: var(--default-font-variation-settings, normal); + -webkit-tap-highlight-color: transparent; + } + hr { + height: 0; + color: inherit; + border-top-width: 1px; + } + abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + } + h1, h2, h3, h4, h5, h6 { + font-size: inherit; + font-weight: inherit; + } + a { + color: inherit; + -webkit-text-decoration: inherit; + text-decoration: inherit; + } + b, strong { + font-weight: bolder; + } + code, kbd, samp, pre { + font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace); + font-feature-settings: var(--default-mono-font-feature-settings, normal); + font-variation-settings: var(--default-mono-font-variation-settings, normal); + font-size: 1em; + } + small { + font-size: 80%; + } + sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + sub { + bottom: -0.25em; + } + sup { + top: -0.5em; + } + table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; + } + :-moz-focusring { + outline: auto; + } + progress { + vertical-align: baseline; + } + summary { + display: list-item; + } + ol, ul, menu { + list-style: none; + } + img, svg, video, canvas, audio, iframe, embed, object { + display: block; + vertical-align: middle; + } + img, video { + max-width: 100%; + height: auto; + } + button, input, select, optgroup, textarea, ::file-selector-button { + font: inherit; + font-feature-settings: inherit; + font-variation-settings: inherit; + letter-spacing: inherit; + color: inherit; + border-radius: 0; + background-color: transparent; + opacity: 1; + } + :where(select:is([multiple], [size])) optgroup { + font-weight: bolder; + } + :where(select:is([multiple], [size])) optgroup option { + padding-inline-start: 20px; + } + ::file-selector-button { + margin-inline-end: 4px; + } + ::placeholder { + opacity: 1; + } + @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) { + ::placeholder { + color: currentcolor; + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, currentcolor 50%, transparent); + } + } + } + textarea { + resize: vertical; + } + ::-webkit-search-decoration { + -webkit-appearance: none; + } + ::-webkit-date-and-time-value { + min-height: 1lh; + text-align: inherit; + } + ::-webkit-datetime-edit { + display: inline-flex; + } + ::-webkit-datetime-edit-fields-wrapper { + padding: 0; + } + ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { + padding-block: 0; + } + :-moz-ui-invalid { + box-shadow: none; + } + button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button { + appearance: button; + } + ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { + height: auto; + } + [hidden]:where(:not([hidden="until-found"])) { + display: none !important; + } +} +@layer utilities { + .pointer-events-auto { + pointer-events: auto; + } + .collapse { + visibility: collapse; + } + .absolute { + position: absolute; + } + .fixed { + position: fixed; + } + .relative { + position: relative; + } + .inset-0 { + inset: calc(var(--spacing) * 0); + } + .top-0 { + top: calc(var(--spacing) * 0); + } + .right-0 { + right: calc(var(--spacing) * 0); + } + .bottom-0 { + bottom: calc(var(--spacing) * 0); + } + .left-0 { + left: calc(var(--spacing) * 0); + } + .left-1 { + left: calc(var(--spacing) * 1); + } + .left-1\/2 { + left: calc(1/2 * 100%); + } + .z-50 { + z-index: 50; + } + .container { + width: 100%; + @media (width >= 1600px) { + max-width: 1600px; + } + @media (width >= 2000px) { + max-width: 2000px; + } + @media (width >= 40rem) { + max-width: 40rem; + } + @media (width >= 48rem) { + max-width: 48rem; + } + @media (width >= 64rem) { + max-width: 64rem; + } + @media (width >= 80rem) { + max-width: 80rem; + } + @media (width >= 96rem) { + max-width: 96rem; + } + } + .m-0 { + margin: calc(var(--spacing) * 0); + } + .mt-1 { + margin-top: calc(var(--spacing) * 1); + } + .mr-3 { + margin-right: calc(var(--spacing) * 3); + } + .block { + display: block; + } + .flex { + display: flex; + } + .hidden { + display: none; + } + .inline { + display: inline; + } + .inline-block { + display: inline-block; + } + .inline-flex { + display: inline-flex; + } + .table { + display: table; + } + .size-9 { + width: calc(var(--spacing) * 9); + height: calc(var(--spacing) * 9); + } + .h-1 { + height: calc(var(--spacing) * 1); + } + .h-4 { + height: calc(var(--spacing) * 4); + } + .h-8 { + height: calc(var(--spacing) * 8); + } + .h-9 { + height: calc(var(--spacing) * 9); + } + .h-10 { + height: calc(var(--spacing) * 10); + } + .h-full { + height: 100%; + } + .h-screen { + height: 100vh; + } + .w-4 { + width: calc(var(--spacing) * 4); + } + .w-7 { + width: calc(var(--spacing) * 7); + } + .w-\[39ch\] { + width: 39ch; + } + .w-full { + width: 100%; + } + .min-w-0 { + min-width: calc(var(--spacing) * 0); + } + .flex-1 { + flex: 1; + } + .flex-shrink { + flex-shrink: 1; + } + .flex-shrink-0 { + flex-shrink: 0; + } + .shrink { + flex-shrink: 1; + } + .shrink-0 { + flex-shrink: 0; + } + .flex-grow { + flex-grow: 1; + } + .grow { + flex-grow: 1; + } + .border-collapse { + border-collapse: collapse; + } + .origin-left { + transform-origin: left; + } + .-translate-x-1 { + --tw-translate-x: calc(var(--spacing) * -1); + translate: var(--tw-translate-x) var(--tw-translate-y); + } + .-translate-x-1\/2 { + --tw-translate-x: calc(calc(1/2 * 100%) * -1); + translate: var(--tw-translate-x) var(--tw-translate-y); + } + .-translate-y-4 { + --tw-translate-y: calc(var(--spacing) * -4); + translate: var(--tw-translate-x) var(--tw-translate-y); + } + .translate-y-4 { + --tw-translate-y: calc(var(--spacing) * 4); + translate: var(--tw-translate-x) var(--tw-translate-y); + } + .scale-3d { + scale: var(--tw-scale-x) var(--tw-scale-y) var(--tw-scale-z); + } + .transform { + transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); + } + .cursor-not-allowed { + cursor: not-allowed; + } + .cursor-pointer { + cursor: pointer; + } + .resize { + resize: both; + } + .appearance-none { + appearance: none; + } + .columns-2 { + columns: 2; + } + .columns-3 { + columns: 3; + } + .columns-4 { + columns: 4; + } + .flex-col { + flex-direction: column; + } + .items-center { + align-items: center; + } + .items-start { + align-items: flex-start; + } + .justify-center { + justify-content: center; + } + .gap-1 { + gap: calc(var(--spacing) * 1); + } + .gap-1\.5 { + gap: calc(var(--spacing) * 1.5); + } + .gap-2 { + gap: calc(var(--spacing) * 2); + } + .gap-3 { + gap: calc(var(--spacing) * 3); + } + .gap-6 { + gap: calc(var(--spacing) * 6); + } + .truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .overflow-hidden { + overflow: hidden; + } + .rounded-full { + border-radius: calc(infinity * 1px); + } + .rounded-lg { + border-radius: var(--radius); + } + .rounded-md { + border-radius: calc(var(--radius) - 2px); + } + .rounded-xl { + border-radius: calc(var(--radius) + 4px); + } + .border { + border-style: var(--tw-border-style); + border-width: 1px; + } + .border-2 { + border-style: var(--tw-border-style); + border-width: 2px; + } + .border-dashed { + --tw-border-style: dashed; + border-style: dashed; + } + .border-gray-400 { + border-color: var(--color-gray-400); + } + .border-primary { + border-color: var(--primary); + } + .bg-background { + background-color: var(--background); + } + .bg-blue-500 { + background-color: var(--color-blue-500); + } + .bg-destructive { + background-color: var(--destructive); + } + .bg-gray-300 { + background-color: var(--color-gray-300); + } + .bg-gray-500 { + background-color: var(--color-gray-500); + } + .bg-green-500 { + background-color: var(--color-green-500); + } + .bg-popover { + background-color: var(--popover); + } + .bg-primary { + background-color: var(--primary); + } + .bg-red-500 { + background-color: var(--color-red-500); + } + .bg-secondary { + background-color: var(--secondary); + } + .bg-selection { + background-color: var(--selection); + } + .bg-yellow-500 { + background-color: var(--color-yellow-500); + } + .p-0 { + padding: calc(var(--spacing) * 0); + } + .p-2 { + padding: calc(var(--spacing) * 2); + } + .p-3 { + padding: calc(var(--spacing) * 3); + } + .p-4 { + padding: calc(var(--spacing) * 4); + } + .p-7 { + padding: calc(var(--spacing) * 7); + } + .p-10 { + padding: calc(var(--spacing) * 10); + } + .px-3 { + padding-inline: calc(var(--spacing) * 3); + } + .px-4 { + padding-inline: calc(var(--spacing) * 4); + } + .px-6 { + padding-inline: calc(var(--spacing) * 6); + } + .py-2 { + padding-block: calc(var(--spacing) * 2); + } + .pt-5 { + padding-top: calc(var(--spacing) * 5); + } + .pb-4 { + padding-bottom: calc(var(--spacing) * 4); + } + .pl-2 { + padding-left: calc(var(--spacing) * 2); + } + .pl-4 { + padding-left: calc(var(--spacing) * 4); + } + .text-center { + text-align: center; + } + .text-2xl { + font-size: var(--text-2xl); + line-height: var(--tw-leading, var(--text-2xl--line-height)); + } + .text-3xl { + font-size: var(--text-3xl); + line-height: var(--tw-leading, var(--text-3xl--line-height)); + } + .text-4xl { + font-size: var(--text-4xl); + line-height: var(--tw-leading, var(--text-4xl--line-height)); + } + .text-sm { + font-size: var(--text-sm); + line-height: var(--tw-leading, var(--text-sm--line-height)); + } + .leading-none { + --tw-leading: 1; + line-height: 1; + } + .font-medium { + --tw-font-weight: var(--font-weight-medium); + font-weight: var(--font-weight-medium); + } + .font-semibold { + --tw-font-weight: var(--font-weight-semibold); + font-weight: var(--font-weight-semibold); + } + .whitespace-nowrap { + white-space: nowrap; + } + .text-blue-500 { + color: var(--color-blue-500); + } + .text-destructive { + color: var(--destructive); + } + .text-green-500 { + color: var(--color-green-500); + } + .text-popover-foreground { + color: var(--popover-foreground); + } + .text-primary { + color: var(--primary); + } + .text-primary-foreground { + color: var(--primary-foreground); + } + .text-red-500 { + color: var(--color-red-500); + } + .text-secondary-foreground { + color: var(--secondary-foreground); + } + .text-yellow-500 { + color: var(--color-yellow-500); + } + .italic { + font-style: italic; + } + .underline { + text-decoration-line: underline; + } + .underline-offset-4 { + text-underline-offset: 4px; + } + .opacity-0 { + opacity: 0%; + } + .opacity-50 { + opacity: 50%; + } + .opacity-75 { + opacity: 75%; + } + .opacity-90 { + opacity: 90%; + } + .shadow-xs { + --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .ring { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .outline { + outline-style: var(--tw-outline-style); + outline-width: 1px; + } + .transition { + transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } + .transition-all { + transition-property: all; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } + .transition-transform { + transition-property: transform, translate, scale, rotate; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } + .duration-300 { + --tw-duration: 300ms; + transition-duration: 300ms; + } + .ease-linear { + --tw-ease: linear; + transition-timing-function: linear; + } + .ease-out { + --tw-ease: var(--ease-out); + transition-timing-function: var(--ease-out); + } + .outline-none { + --tw-outline-style: none; + outline-style: none; + } + .before\:absolute { + &::before { + content: var(--tw-content); + position: absolute; + } + } + .before\:top-1\/2 { + &::before { + content: var(--tw-content); + top: calc(1/2 * 100%); + } + } + .before\:left-1\/2 { + &::before { + content: var(--tw-content); + left: calc(1/2 * 100%); + } + } + .before\:h-1\.5 { + &::before { + content: var(--tw-content); + height: calc(var(--spacing) * 1.5); + } + } + .before\:w-1\.5 { + &::before { + content: var(--tw-content); + width: calc(var(--spacing) * 1.5); + } + } + .before\:-translate-x-1\/2 { + &::before { + content: var(--tw-content); + --tw-translate-x: calc(calc(1/2 * 100%) * -1); + translate: var(--tw-translate-x) var(--tw-translate-y); + } + } + .before\:-translate-y-1\/2 { + &::before { + content: var(--tw-content); + --tw-translate-y: calc(calc(1/2 * 100%) * -1); + translate: var(--tw-translate-x) var(--tw-translate-y); + } + } + .before\:rounded-full { + &::before { + content: var(--tw-content); + border-radius: calc(infinity * 1px); + } + } + .before\:bg-background { + &::before { + content: var(--tw-content); + background-color: var(--background); + } + } + .checked\:border-primary { + &:checked { + border-color: var(--primary); + } + } + .checked\:bg-primary { + &:checked { + background-color: var(--primary); + } + } + .checked\:before\:visible { + &:checked { + &::before { + content: var(--tw-content); + visibility: visible; + } + } + } + .hover\:bg-accent { + &:hover { + @media (hover: hover) { + background-color: var(--accent); + } + } + } + .hover\:bg-blue-500 { + &:hover { + @media (hover: hover) { + background-color: var(--color-blue-500); + } + } + } + .hover\:bg-destructive\/90 { + &:hover { + @media (hover: hover) { + background-color: var(--destructive); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--destructive) 90%, transparent); + } + } + } + } + .hover\:bg-primary\/90 { + &:hover { + @media (hover: hover) { + background-color: var(--primary); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--primary) 90%, transparent); + } + } + } + } + .hover\:bg-secondary\/80 { + &:hover { + @media (hover: hover) { + background-color: var(--secondary); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--secondary) 80%, transparent); + } + } + } + } + .hover\:text-accent-foreground { + &:hover { + @media (hover: hover) { + color: var(--accent-foreground); + } + } + } + .hover\:underline { + &:hover { + @media (hover: hover) { + text-decoration-line: underline; + } + } + } + .hover\:opacity-100 { + &:hover { + @media (hover: hover) { + opacity: 100%; + } + } + } + .focus-visible\:border-ring { + &:focus-visible { + border-color: var(--ring); + } + } + .focus-visible\:ring-2 { + &:focus-visible { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + } + .focus-visible\:ring-\[3px\] { + &:focus-visible { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + } + .focus-visible\:ring-destructive\/20 { + &:focus-visible { + --tw-ring-color: var(--destructive); + @supports (color: color-mix(in lab, red, red)) { + --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent); + } + } + } + .focus-visible\:ring-ring { + &:focus-visible { + --tw-ring-color: var(--ring); + } + } + .focus-visible\:ring-ring\/50 { + &:focus-visible { + --tw-ring-color: var(--ring); + @supports (color: color-mix(in lab, red, red)) { + --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent); + } + } + } + .focus-visible\:ring-offset-2 { + &:focus-visible { + --tw-ring-offset-width: 2px; + --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + } + } + .focus-visible\:ring-offset-background { + &:focus-visible { + --tw-ring-offset-color: var(--background); + } + } + .focus-visible\:outline-hidden { + &:focus-visible { + --tw-outline-style: none; + outline-style: none; + @media (forced-colors: active) { + outline: 2px solid transparent; + outline-offset: 2px; + } + } + } + .disabled\:pointer-events-none { + &:disabled { + pointer-events: none; + } + } + .disabled\:cursor-not-allowed { + &:disabled { + cursor: not-allowed; + } + } + .disabled\:opacity-50 { + &:disabled { + opacity: 50%; + } + } + .has-\[\>svg\]\:px-2\.5 { + &:has(>svg) { + padding-inline: calc(var(--spacing) * 2.5); + } + } + .has-\[\>svg\]\:px-3 { + &:has(>svg) { + padding-inline: calc(var(--spacing) * 3); + } + } + .has-\[\>svg\]\:px-4 { + &:has(>svg) { + padding-inline: calc(var(--spacing) * 4); + } + } + .aria-invalid\:border-destructive { + &[aria-invalid="true"] { + border-color: var(--destructive); + } + } + .aria-invalid\:ring-destructive\/20 { + &[aria-invalid="true"] { + --tw-ring-color: var(--destructive); + @supports (color: color-mix(in lab, red, red)) { + --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent); + } + } + } + .data-\[position\=bottom-center\]\:bottom-0 { + &[data-position="bottom-center"] { + bottom: calc(var(--spacing) * 0); + } + } + .data-\[position\=bottom-center\]\:left-1\/2 { + &[data-position="bottom-center"] { + left: calc(1/2 * 100%); + } + } + .data-\[position\=bottom-center\]\:-translate-x-1\/2 { + &[data-position="bottom-center"] { + --tw-translate-x: calc(calc(1/2 * 100%) * -1); + translate: var(--tw-translate-x) var(--tw-translate-y); + } + } + .data-\[position\=bottom-left\]\:bottom-0 { + &[data-position="bottom-left"] { + bottom: calc(var(--spacing) * 0); + } + } + .data-\[position\=bottom-left\]\:left-0 { + &[data-position="bottom-left"] { + left: calc(var(--spacing) * 0); + } + } + .data-\[position\=bottom-right\]\:right-0 { + &[data-position="bottom-right"] { + right: calc(var(--spacing) * 0); + } + } + .data-\[position\=bottom-right\]\:bottom-0 { + &[data-position="bottom-right"] { + bottom: calc(var(--spacing) * 0); + } + } + .data-\[position\=top-center\]\:top-0 { + &[data-position="top-center"] { + top: calc(var(--spacing) * 0); + } + } + .data-\[position\=top-center\]\:left-1\/2 { + &[data-position="top-center"] { + left: calc(1/2 * 100%); + } + } + .data-\[position\=top-center\]\:-translate-x-1\/2 { + &[data-position="top-center"] { + --tw-translate-x: calc(calc(1/2 * 100%) * -1); + translate: var(--tw-translate-x) var(--tw-translate-y); + } + } + .data-\[position\=top-left\]\:top-0 { + &[data-position="top-left"] { + top: calc(var(--spacing) * 0); + } + } + .data-\[position\=top-left\]\:left-0 { + &[data-position="top-left"] { + left: calc(var(--spacing) * 0); + } + } + .data-\[position\=top-right\]\:top-0 { + &[data-position="top-right"] { + top: calc(var(--spacing) * 0); + } + } + .data-\[position\=top-right\]\:right-0 { + &[data-position="top-right"] { + right: calc(var(--spacing) * 0); + } + } + .data-\[variant\=default\]\:bg-gray-500 { + &[data-variant="default"] { + background-color: var(--color-gray-500); + } + } + .data-\[variant\=error\]\:bg-red-500 { + &[data-variant="error"] { + background-color: var(--color-red-500); + } + } + .data-\[variant\=info\]\:bg-blue-500 { + &[data-variant="info"] { + background-color: var(--color-blue-500); + } + } + .data-\[variant\=success\]\:bg-green-500 { + &[data-variant="success"] { + background-color: var(--color-green-500); + } + } + .data-\[variant\=warning\]\:bg-yellow-500 { + &[data-variant="warning"] { + background-color: var(--color-yellow-500); + } + } + .md\:max-w-\[420px\] { + @media (width >= 48rem) { + max-width: 420px; + } + } + .dark\:border-input { + &:where(.dark, .dark *) { + border-color: var(--input); + } + } + .dark\:bg-destructive\/60 { + &:where(.dark, .dark *) { + background-color: var(--destructive); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--destructive) 60%, transparent); + } + } + } + .dark\:bg-input\/30 { + &:where(.dark, .dark *) { + background-color: var(--input); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--input) 30%, transparent); + } + } + } + .dark\:hover\:bg-accent\/50 { + &:where(.dark, .dark *) { + &:hover { + @media (hover: hover) { + background-color: var(--accent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--accent) 50%, transparent); + } + } + } + } + } + .dark\:hover\:bg-input\/50 { + &:where(.dark, .dark *) { + &:hover { + @media (hover: hover) { + background-color: var(--input); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--input) 50%, transparent); + } + } + } + } + } + .dark\:focus-visible\:ring-destructive\/40 { + &:where(.dark, .dark *) { + &:focus-visible { + --tw-ring-color: var(--destructive); + @supports (color: color-mix(in lab, red, red)) { + --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent); + } + } + } + } + .dark\:aria-invalid\:ring-destructive\/40 { + &:where(.dark, .dark *) { + &[aria-invalid="true"] { + --tw-ring-color: var(--destructive); + @supports (color: color-mix(in lab, red, red)) { + --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent); + } + } + } + } + .\[\&_svg\]\:pointer-events-none { + & svg { + pointer-events: none; + } + } + .\[\&_svg\]\:shrink-0 { + & svg { + flex-shrink: 0; + } + } + .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 { + & svg:not([class*='size-']) { + width: calc(var(--spacing) * 4); + height: calc(var(--spacing) * 4); + } + } +} +:root { + --radius: 0.65rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); + --selection: oklch(0.145 0 0); + --selection-foreground: oklch(1 0 0); +} +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); + --selection: oklch(0.922 0 0); + --selection-foreground: oklch(0.205 0 0); +} +@layer base { + * { + border-color: var(--border); + } + ::selection { + background-color: var(--selection); + color: var(--selection-foreground); + } + body { + background-color: var(--background); + color: var(--foreground); + font-feature-settings: "rlig" 1, "calt" 1; + } +} +@property --tw-translate-x { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-translate-y { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-translate-z { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-scale-x { + syntax: "*"; + inherits: false; + initial-value: 1; +} +@property --tw-scale-y { + syntax: "*"; + inherits: false; + initial-value: 1; +} +@property --tw-scale-z { + syntax: "*"; + inherits: false; + initial-value: 1; +} +@property --tw-rotate-x { + syntax: "*"; + inherits: false; +} +@property --tw-rotate-y { + syntax: "*"; + inherits: false; +} +@property --tw-rotate-z { + syntax: "*"; + inherits: false; +} +@property --tw-skew-x { + syntax: "*"; + inherits: false; +} +@property --tw-skew-y { + syntax: "*"; + inherits: false; +} +@property --tw-border-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} +@property --tw-leading { + syntax: "*"; + inherits: false; +} +@property --tw-font-weight { + syntax: "*"; + inherits: false; +} +@property --tw-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-shadow-color { + syntax: "*"; + inherits: false; +} +@property --tw-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 100%; +} +@property --tw-inset-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-inset-shadow-color { + syntax: "*"; + inherits: false; +} +@property --tw-inset-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 100%; +} +@property --tw-ring-color { + syntax: "*"; + inherits: false; +} +@property --tw-ring-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-inset-ring-color { + syntax: "*"; + inherits: false; +} +@property --tw-inset-ring-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-ring-inset { + syntax: "*"; + inherits: false; +} +@property --tw-ring-offset-width { + syntax: ""; + inherits: false; + initial-value: 0px; +} +@property --tw-ring-offset-color { + syntax: "*"; + inherits: false; + initial-value: #fff; +} +@property --tw-ring-offset-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-outline-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} +@property --tw-duration { + syntax: "*"; + inherits: false; +} +@property --tw-ease { + syntax: "*"; + inherits: false; +} +@property --tw-content { + syntax: "*"; + initial-value: ""; + inherits: false; +} +@layer properties { + @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { + *, ::before, ::after, ::backdrop { + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-translate-z: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-scale-z: 1; + --tw-rotate-x: initial; + --tw-rotate-y: initial; + --tw-rotate-z: initial; + --tw-skew-x: initial; + --tw-skew-y: initial; + --tw-border-style: solid; + --tw-leading: initial; + --tw-font-weight: initial; + --tw-shadow: 0 0 #0000; + --tw-shadow-color: initial; + --tw-shadow-alpha: 100%; + --tw-inset-shadow: 0 0 #0000; + --tw-inset-shadow-color: initial; + --tw-inset-shadow-alpha: 100%; + --tw-ring-color: initial; + --tw-ring-shadow: 0 0 #0000; + --tw-inset-ring-color: initial; + --tw-inset-ring-shadow: 0 0 #0000; + --tw-ring-inset: initial; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-offset-shadow: 0 0 #0000; + --tw-outline-style: solid; + --tw-duration: initial; + --tw-ease: initial; + --tw-content: ""; + } + } +} diff --git a/assets/js/label.min.js b/assets/js/label.min.js new file mode 100644 index 0000000..2d3d6e2 --- /dev/null +++ b/assets/js/label.min.js @@ -0,0 +1 @@ +(()=>{(function(){"use strict";function a(t){let s=t.getAttribute("for"),d=s?document.getElementById(s):null,r=t.getAttribute("data-tui-label-disabled-style");if(!d||!r)return;let e=r.split(" ").filter(Boolean);d.disabled?t.classList.add(...e):t.classList.remove(...e)}document.addEventListener("DOMContentLoaded",()=>{let t=new Set;function s(){document.querySelectorAll("label[for][data-tui-label-disabled-style]").forEach(r=>{a(r);let e=r.getAttribute("for");e&&t.add(e)})}s(),new MutationObserver(r=>{r.forEach(e=>{e.type==="attributes"&&e.attributeName==="disabled"&&e.target.id&&t.has(e.target.id)&&document.querySelectorAll(`label[for="${e.target.id}"][data-tui-label-disabled-style]`).forEach(a)})}).observe(document.body,{attributes:!0,attributeFilter:["disabled"],subtree:!0}),new MutationObserver(()=>{s()}).observe(document.body,{childList:!0,subtree:!0})})})();})(); diff --git a/assets/js/toast.min.js b/assets/js/toast.min.js new file mode 100644 index 0000000..6b0128a --- /dev/null +++ b/assets/js/toast.min.js @@ -0,0 +1 @@ +(()=>{(function(){"use strict";let n=new Map;function o(t){let i=parseInt(t.dataset.tuiToastDuration||"3000"),e=t.querySelector(".toast-progress"),a={timer:null,startTime:Date.now(),remaining:i,paused:!1};n.set(t,a),e&&i>0&&(e.style.transitionDuration=i+"ms",requestAnimationFrame(()=>{e.style.transform="scaleX(0)"})),i>0&&(a.timer=setTimeout(()=>r(t),i)),t.addEventListener("mouseenter",()=>{let s=n.get(t);if(!(!s||s.paused)&&(clearTimeout(s.timer),s.remaining=s.remaining-(Date.now()-s.startTime),s.paused=!0,e)){let m=getComputedStyle(e);e.style.transitionDuration="0ms",e.style.transform=m.transform}}),t.addEventListener("mouseleave",()=>{let s=n.get(t);!s||!s.paused||s.remaining<=0||(s.startTime=Date.now(),s.paused=!1,s.timer=setTimeout(()=>r(t),s.remaining),e&&(e.style.transitionDuration=s.remaining+"ms",e.style.transform="scaleX(0)"))})}function r(t){n.delete(t),t.style.transition="opacity 300ms, transform 300ms",t.style.opacity="0",t.style.transform="translateY(1rem)",setTimeout(()=>t.remove(),300)}document.addEventListener("click",t=>{let i=t.target.closest("[data-tui-toast-dismiss]");if(i){let e=i.closest("[data-tui-toast]");e&&r(e)}}),new MutationObserver(t=>{t.forEach(i=>{i.addedNodes.forEach(e=>{e.nodeType===1&&e.matches?.("[data-tui-toast]")&&o(e)})})}).observe(document.body,{childList:!0,subtree:!0})})();})(); diff --git a/components/button/button.templ b/components/button/button.templ new file mode 100644 index 0000000..cc8871f --- /dev/null +++ b/components/button/button.templ @@ -0,0 +1,151 @@ +// templui component button - version: v0.93.0 installed by templui v0.93.0 +package button + +import ( + "git.hafen.run/lukas/timeshare/utils" + "strings" +) + +type Variant string +type Size string +type Type string + +const ( + VariantDefault Variant = "default" + VariantDestructive Variant = "destructive" + VariantOutline Variant = "outline" + VariantSecondary Variant = "secondary" + VariantGhost Variant = "ghost" + VariantLink Variant = "link" +) + +const ( + TypeButton Type = "button" + TypeReset Type = "reset" + TypeSubmit Type = "submit" +) + +const ( + SizeDefault Size = "default" + SizeSm Size = "sm" + SizeLg Size = "lg" + SizeIcon Size = "icon" +) + +type Props struct { + ID string + Class string + Attributes templ.Attributes + Variant Variant + Size Size + FullWidth bool + Href string + Target string + Disabled bool + Type Type + Form string +} + +templ Button(props ...Props) { + {{ var p Props }} + if len(props) > 0 { + {{ p = props[0] }} + } + if p.Type == "" { + {{ p.Type = TypeButton }} + } + if p.Href != "" && !p.Disabled { + + { children... } + + } else { + + } +} + +func (b Props) variantClasses() string { + switch b.Variant { + case VariantDestructive: + return "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60" + case VariantOutline: + return "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50" + case VariantSecondary: + return "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80" + case VariantGhost: + return "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50" + case VariantLink: + return "text-primary underline-offset-4 hover:underline" + default: + return "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90" + } +} + +func (b Props) sizeClasses() string { + switch b.Size { + case SizeSm: + return "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5" + case SizeLg: + return "h-10 rounded-md px-6 has-[>svg]:px-4" + case SizeIcon: + return "size-9" + default: // SizeDefault + return "h-9 px-4 py-2 has-[>svg]:px-3" + } +} + +func (b Props) modifierClasses() string { + classes := []string{} + if b.FullWidth { + classes = append(classes, "w-full") + } + return strings.Join(classes, " ") +} diff --git a/components/icon/icon.go b/components/icon/icon.go new file mode 100644 index 0000000..79b7f1c --- /dev/null +++ b/components/icon/icon.go @@ -0,0 +1,117 @@ +// templui component icon - version: v0.94.0 installed by templui v0.94.0 +package icon + +import ( + "context" + "fmt" + "io" + "sync" + + "github.com/a-h/templ" +) + +// iconContents caches the fully generated SVG strings for icons that have been used, +// keyed by a composite key of name and props to handle different stylings. +var ( + iconContents = make(map[string]string) + iconMutex sync.RWMutex +) + +// Props defines the properties that can be set for an icon. +type Props struct { + Size int + Color string + Fill string + Stroke string + StrokeWidth string // Stroke Width of Icon, Usage: "2.5" + Class string +} + +// Icon returns a function that generates a templ.Component for the specified icon name. +func Icon(name string) func(...Props) templ.Component { + return func(props ...Props) templ.Component { + var p Props + if len(props) > 0 { + p = props[0] + } + + // Create a unique key for the cache based on icon name and all relevant props. + // This ensures different stylings of the same icon are cached separately. + cacheKey := fmt.Sprintf("%s|s:%d|c:%s|f:%s|sk:%s|sw:%s|cl:%s", + name, p.Size, p.Color, p.Fill, p.Stroke, p.StrokeWidth, p.Class) + + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + iconMutex.RLock() + svg, cached := iconContents[cacheKey] + iconMutex.RUnlock() + + if cached { + _, err = w.Write([]byte(svg)) + return err + } + + // Not cached, generate it + // The actual generation now happens once and is cached. + generatedSvg, err := generateSVG(name, p) // p (Props) is passed to generateSVG + if err != nil { + // Provide more context in the error message + return fmt.Errorf("failed to generate svg for icon '%s' with props %+v: %w", name, p, err) + } + + iconMutex.Lock() + iconContents[cacheKey] = generatedSvg + iconMutex.Unlock() + + _, err = w.Write([]byte(generatedSvg)) + return err + }) + } +} + +// generateSVG creates an SVG string for the specified icon with the given properties. +// This function is called when an icon-prop combination is not yet in the cache. +func generateSVG(name string, props Props) (string, error) { + // Get the raw, inner SVG content for the icon name from our internal data map. + content, err := getIconContent(name) // This now reads from internalSvgData + if err != nil { + return "", err // Error from getIconContent already includes icon name + } + + size := props.Size + if size <= 0 { + size = 24 // Default size + } + + fill := props.Fill + if fill == "" { + fill = "none" // Default fill + } + + stroke := props.Stroke + if stroke == "" { + stroke = props.Color // Fallback to Color if Stroke is not set + } + if stroke == "" { + stroke = "currentColor" // Default stroke color + } + + strokeWidth := props.StrokeWidth + if strokeWidth == "" { + strokeWidth = "2" // Default stroke width + } + + // Construct the final SVG string. + // The data-lucide attribute helps identify these as Lucide icons if needed. + return fmt.Sprintf("%s", + size, size, fill, stroke, strokeWidth, props.Class, content), nil +} + +// getIconContent retrieves the raw inner SVG content for a given icon name. +// It reads from the pre-generated internalSvgData map from icon_data.go. +func getIconContent(name string) (string, error) { + content, exists := internalSvgData[name] + if !exists { + return "", fmt.Errorf("icon '%s' not found in internalSvgData map", name) + } + return content, nil +} diff --git a/components/icon/icondata.go b/components/icon/icondata.go new file mode 100644 index 0000000..edd1a34 --- /dev/null +++ b/components/icon/icondata.go @@ -0,0 +1,6289 @@ +// templui component icon - version: v0.94.0 installed by templui v0.94.0 +package icon + +// This file is auto generated +// Using Lucide icons version 0.507.0 + +const LucideVersion = "0.507.0" + +var internalSvgData = map[string]string{ + "layout-panel-left": ` + + `, + "arrow-big-left-dash": ` + `, + "banknote": ` + + `, + "chart-column-big": ` + + `, + "clover": ` + + `, + "corner-right-up": ` + `, + "drumstick": ` + `, + "alarm-clock-plus": ` + + + + + + `, + "align-end-vertical": ` + + `, + "badge-info": ` + + `, + "battery-full": ` + + + + `, + "file-chart-column": ` + + + + `, + "grip-vertical": ` + + + + + `, + "git-commit-horizontal": ` + + `, + "megaphone-off": ` + + + `, + "calculator": ` + + + + + + + + + `, + "between-horizontal-end": ` + + `, + "chevron-right": ``, + "creative-commons": ` + + `, + "heading-4": ` + + + + `, + "message-square-heart": ` + `, + "pencil": ` + `, + "power-off": ` + + + `, + "biceps-flexed": ` + + `, + "headphones": ``, + "funnel-plus": ` + + `, + "scroll-text": ` + + + `, + "swords": ` + + + + + + + `, + "list-todo": ` + + + + `, + "move-vertical": ` + + `, + "bandage": ` + + + + + + `, + "book-type": ` + + + `, + "circle-check": ` + `, + "drill": ` + + + + + `, + "file-plus-2": ` + + + `, + "inspection-panel": ` + + + + `, + "calendar-minus-2": ` + + + + `, + "dollar-sign": ` + `, + "memory-stick": ` + + + + + + + + `, + "octagon-alert": ` + + `, + "phone-missed": ` + + `, + "piggy-bank": ` + + `, + "scan-heart": ` + + + + `, + "square-arrow-down-left": ` + + `, + "align-vertical-distribute-center": ` + + + + + `, + "binoculars": ` + + + + + `, + "circle-fading-arrow-up": ` + + + + + + `, + "dice-1": ` + `, + "file-lock": ` + + `, + "hand-platter": ` + + + + + `, + "heart-handshake": ` + + + `, + "picture-in-picture": ` + + + + `, + "database-zap": ` + + + + `, + "download": ` + + `, + "file-pen-line": ` + + `, + "folder-check": ` + `, + "heading-3": ` + + + + `, + "frown": ` + + + `, + "lock-keyhole-open": ` + + `, + "map-pin-plus": ` + + + `, + "backpack": ` + + + + `, + "calendar-plus-2": ` + + + + + `, + "file-badge": ` + + + `, + "fuel": ` + + + `, + "piano": ` + + + + + `, + "receipt-japanese-yen": ` + + + + `, + "scan": ` + + + `, + "sword": ` + + + `, + "align-vertical-justify-center": ` + + `, + "chart-no-axes-gantt": ` + + `, + "chart-pie": ` + `, + "grid-2x2-plus": ` + + `, + "table-of-contents": ` + + + + + `, + "square-power": ` + + `, + "trash-2": ` + + + + `, + "file-badge-2": ` + + `, + "fish-off": ` + + `, + "gavel": ` + + + + `, + "list-checks": ` + + + + `, + "shield-ban": ` + `, + "square-minus": ` + `, + "university": ` + + + + + + `, + "book-audio": ` + + + `, + "bookmark-plus": ` + + `, + "chart-gantt": ` + + + `, + "leaf": ` + `, + "lock": ` + `, + "plus": ` + `, + "square-kanban": ` + + + `, + "square-pi": ` + + + `, + "calendar-search": ` + + + + + `, + "club": ` + `, + "flame-kindling": ` + + `, + "house": ` + `, + "square-round-corner": ` + `, + "book": ``, + "cloud-moon-rain": ` + + + `, + "flag-triangle-right": ``, + "location-edit": ` + + `, + "package": ` + + + `, + "microscope": ` + + + + + `, + "torus": ` + `, + "unplug": ` + + + + + `, + "bomb": ` + + `, + "file-diff": ` + + + `, + "house-wifi": ` + + + `, + "mic-off": ` + + + + + `, + "redo-2": ` + `, + "table-cells-split": ` + + + `, + "squircle": ``, + "user-round-cog": ` + + + + + + + + + + `, + "decimals-arrow-right": ` + + + + `, + "file-video-2": ` + + + `, + "minimize": ` + + + `, + "smile": ` + + + `, + "axe": ` + `, + "house-plug": ` + + + `, + "message-circle": ``, + "octagon-x": ` + + `, + "users-round": ` + + `, + "arrows-up-from-line": ` + + + + `, + "circle-dot-dashed": ` + + + + + + + + `, + "ear-off": ` + + + + `, + "layers-2": ` + `, + "map-pin-x": ` + + + `, + "message-square-quote": ` + + `, + "navigation": ``, + "minus": ``, + "list-check": ` + + + `, + "reply": ` + `, + "scroll": ` + `, + "search-slash": ` + + `, + "section": ` + `, + "unlink": ` + + + + + `, + "a-large-small": ` + + + `, + "earth-lock": ` + + + + + `, + "octagon-pause": ` + + `, + "square-arrow-up": ` + + `, + "cookie": ` + + + + + `, + "music": ` + + `, + "monitor-off": ` + + + + `, + "sun-medium": ` + + + + + + + + `, + "traffic-cone": ` + + + `, + "volume-off": ` + + + + `, + "cake": ` + + + + + + + + `, + "message-square-share": ` + + `, + "pound-sterling": ` + + + `, + "slack": ` + + + + + + + `, + "wifi-low": ` + `, + "activity": ``, + "ampersand": ` + `, + "badge-japanese-yen": ` + + + + `, + "book-check": ` + `, + "clock-5": ` + `, + "locate-off": ` + + + + + + `, + "log-in": ` + + `, + "octagon-minus": ` + `, + "alarm-clock": ` + + + + + `, + "archive-x": ` + + + `, + "circle-minus": ` + `, + "hop-off": ` + + + + + + + + `, + "ligature": ` + + + + `, + "map": ` + + `, + "search-code": ` + + + `, + "tv": ` + `, + "arrow-down-narrow-wide": ` + + + + `, + "hop": ` + + + + + + + `, + "paintbrush": ` + + `, + "signpost-big": ` + + + `, + "square-check": ` + `, + "circle-equal": ` + + `, + "egg": ``, + "file-check-2": ` + + `, + "flip-horizontal": ` + + + + + `, + "lasso": ` + + `, + "paint-roller": ` + + `, + "sigma": ``, + "align-vertical-justify-start": ` + + `, + "sprout": ` + + + `, + "wheat-off": ` + + + + + + + + + `, + "align-horizontal-justify-start": ` + + `, + "badge-dollar-sign": ` + + `, + "check": ``, + "circle-play": ` + `, + "message-square-plus": ` + + `, + "saudi-riyal": ` + + + `, + "signal": ` + + + + `, + "badge-percent": ` + + + `, + "file-question": ` + + `, + "file-video": ` + + `, + "tally-4": ` + + + `, + "rocket": ` + + + `, + "wine": ` + + + `, + "antenna": ` + + + + + `, + "circle-small": ``, + "git-fork": ` + + + + `, + "list-x": ` + + + + `, + "siren": ` + + + + + + + `, + "clock-3": ` + `, + "layers": ` + + `, + "spell-check-2": ` + + `, + "unfold-vertical": ` + + + + + + + `, + "calendar-arrow-down": ` + + + + + `, + "battery-medium": ` + + + `, + "brain-circuit": ` + + + + + + + + + + + + `, + "cloud-sun-rain": ` + + + + + + + `, + "redo": ` + `, + "table-columns-split": ` + + + + + + + + + + `, + "bot-off": ` + + + + + + `, + "codesandbox": ` + + + + + `, + "lock-keyhole": ` + + `, + "square-dashed-mouse-pointer": ` + + + + + + + + + `, + "utensils": ` + + `, + "brick-wall": ` + + + + + + + `, + "circle-slash": ` + `, + "file-type": ` + + + + `, + "folder-minus": ` + `, + "laptop": ` + `, + "party-popper": ` + + + + + + + + `, + "move-down": ` + `, + "wand-sparkles": ` + + + + + + + `, + "fish-symbol": ``, + "volume-2": ` + + `, + "pointer-off": ` + + + + + `, + "dice-2": ` + + `, + "door-closed": ` + + `, + "git-compare-arrows": ` + + + + + `, + "git-graph": ` + + + + + `, + "share": ` + + `, + "toggle-left": ` + `, + "webhook-off": ` + + + + + + `, + "eraser": ` + + `, + "monitor-cog": ` + + + + + + + + + + + `, + "move-down-left": ` + `, + "shell": ``, + "book-open": ` + `, + "pointer": ` + + + + `, + "shield-half": ` + `, + "thumbs-down": ` + `, + "square-parking": ` + `, + "cloud-rain": ` + + + `, + "ghost": ` + + `, + "image-play": ` + + + `, + "layout-panel-top": ` + + `, + "mouse": ` + `, + "square-dashed": ` + + + + + + + + + + + `, + "badge": ``, + "flag-off": ` + + + `, + "search-x": ` + + + `, + "square-chevron-left": ` + `, + "square-parking-off": ` + + + + `, + "align-start-vertical": ` + + `, + "calendar-x": ` + + + + + `, + "circuit-board": ` + + + + `, + "folder-symlink": ` + `, + "list": ` + + + + + `, + "picture-in-picture-2": ` + `, + "wand": ` + + + + + + + + `, + "arrow-big-right-dash": ` + `, + "file-output": ` + + + + `, + "hand-heart": ` + + + `, + "heading-1": ` + + + `, + "key": ` + + `, + "land-plot": ` + + + `, + "mail": ` + `, + "sun-dim": ` + + + + + + + + `, + "alarm-smoke": ` + + + + `, + "align-vertical-distribute-start": ` + + + `, + "arrow-up-1-0": ` + + + + `, + "calendar-cog": ` + + + + + + + + + + + + `, + "circle-arrow-out-down-right": ` + + `, + "clipboard-x": ` + + + `, + "list-video": ` + + + `, + "notebook": ` + + + + + `, + "book-minus": ` + `, + "battery-charging": ` + + + `, + "monitor-pause": ` + + + + `, + "quote": ` + `, + "rotate-cw-square": ` + + `, + "rows-3": ` + + `, + "tablet-smartphone": ` + + `, + "user-minus": ` + + `, + "circle-dollar-sign": ` + + `, + "ruler": ` + + + + `, + "user-round-plus": ` + + + `, + "podcast": ` + + + `, + "clipboard-list": ` + + + + + `, + "omega": ``, + "popcorn": ` + + + `, + "square-chevron-down": ` + `, + "ticket-check": ` + `, + "user-x": ` + + + `, + "wallet-minimal": ` + `, + "blocks": ` + `, + "hand-coins": ` + + + + `, + "maximize": ` + + + `, + "plug-zap": ` + + + + `, + "infinity": ``, + "lamp-ceiling": ` + + `, + "mail-question": ` + + + `, + "nut-off": ` + + + + `, + "package-x": ` + + + + `, + "radio-receiver": ` + + + `, + "rotate-ccw-square": ` + + `, + "table-cells-merge": ` + + + + `, + "archive-restore": ` + + + + `, + "chevrons-up-down": ` + `, + "hard-hat": ` + + + `, + "lamp-floor": ` + + `, + "logs": ` + + + + + + + + `, + "tangent": ` + + + `, + "upload": ` + + `, + "cloud-off": ` + + `, + "lamp-wall-down": ` + + `, + "message-circle-dashed": ` + + + + + + + `, + "sunrise": ` + + + + + + + `, + "between-vertical-end": ` + + `, + "chart-column": ` + + + `, + "decimals-arrow-left": ` + + + `, + "plug": ` + + + `, + "step-back": ` + `, + "align-left": ` + + `, + "book-up": ` + + `, + "battery-plus": ` + + + + `, + "clipboard-plus": ` + + + `, + "lightbulb": ` + + `, + "shield-minus": ` + `, + "volume-x": ` + + `, + "file-text": ` + + + + `, + "refrigerator": ` + + `, + "arrow-left-from-line": ` + + `, + "badge-indian-rupee": ` + + + `, + "bean-off": ` + + + `, + "circle-chevron-up": ` + `, + "concierge-bell": ` + + + `, + "focus": ` + + + + `, + "library-big": ` + + `, + "message-circle-x": ` + + `, + "arrow-down-z-a": ` + + + + `, + "fan": ` + `, + "move-down-right": ` + `, + "shrimp": ` + + + + `, + "spray-can": ` + + + + + + + + + `, + "refresh-cw-off": ` + + + + + + `, + "clock-arrow-up": ` + + + `, + "coins": ` + + + `, + "sandwich": ` + + + + `, + "shovel": ` + + `, + "shower-head": ` + + + + + + + + + `, + "square-bottom-dashed-scissors": ` + + + + + + + `, + "arrow-big-up-dash": ` + `, + "bell-ring": ` + + + `, + "dna": ` + + + + + + + + + + `, + "file-archive": ` + + + + + `, + "folder-closed": ` + `, + "funnel": ``, + "inbox": ` + `, + "star-off": ` + + `, + "bell-off": ` + + + `, + "clock-alert": ` + + + `, + "fingerprint": ` + + + + + + + + `, + "iteration-ccw": ` + `, + "ungroup": ` + `, + "ear": ` + `, + "file-audio-2": ` + + + + `, + "remove-formatting": ` + + + + `, + "square-arrow-out-up-left": ` + + `, + "smartphone": ` + `, + "folder-sync": ` + + + + `, + "signature": ` + `, + "spline-pointer": ` + + + `, + "trending-down": ` + `, + "user-round-minus": ` + + `, + "circle-chevron-down": ` + `, + "folder-search": ` + + `, + "lasso-select": ` + + + + `, + "skip-back": ` + `, + "square-code": ` + + `, + "banana": ` + `, + "clock-4": ` + `, + "copy-plus": ` + + + `, + "credit-card": ` + `, + "file-audio": ` + + `, + "music-2": ` + `, + "power": ` + `, + "sticky-note": ` + `, + "book-marked": ` + `, + "cloud-fog": ` + + `, + "message-circle-more": ` + + + `, + "syringe": ` + + + + + `, + "test-tubes": ` + + + + + `, + "align-right": ` + + `, + "circle-divide": ` + + + `, + "message-square-dashed": ` + + + + + + + + `, + "proportions": ` + + `, + "squares-subtract": ` + + + + + `, + "triangle": ``, + "cloud-rain-wind": ` + + + `, + "arrow-up-a-z": ` + + + + `, + "equal": ` + `, + "eye": ` + `, + "image-off": ` + + + + + `, + "text-select": ` + + + + + + + + + + + + + + `, + "square-library": ` + + + `, + "square-terminal": ` + + `, + "bell-electric": ` + + + + + `, + "swatch-book": ` + + + `, + "user-check": ` + + `, + "arrow-up-from-line": ` + + `, + "door-closed-locked": ` + + + + `, + "file-axis-3d": ` + + + `, + "ice-cream-bowl": ` + + `, + "signal-medium": ` + + `, + "unlink-2": ``, + "group": ` + + + + + `, + "instagram": ` + + `, + "separator-vertical": ` + + `, + "user": ` + `, + "archive": ` + + `, + "brain": ` + + + + + + + + `, + "clapperboard": ` + + + `, + "file-search": ` + + + `, + "history": ` + + `, + "loader": ` + + + + + + + `, + "link-2": ` + + `, + "moon": ``, + "axis-3d": ` + `, + "badge-x": ` + + `, + "candy-cane": ` + + + + `, + "dices": ` + + + + + `, + "git-pull-request-closed": ` + + + + + `, + "joystick": ` + + + `, + "lock-open": ` + `, + "panel-left-close": ` + + `, + "align-horizontal-distribute-end": ` + + + `, + "audio-lines": ` + + + + + `, + "chart-column-increasing": ` + + + `, + "chevrons-left": ` + `, + "cloud-moon": ` + `, + "phone-incoming": ` + + `, + "screen-share": ` + + + + `, + "thermometer-sun": ` + + + + + `, + "arrow-down-wide-narrow": ` + + + + `, + "chevrons-left-right-ellipsis": ` + + + + `, + "locate-fixed": ` + + + + + `, + "link-2-off": ` + + + `, + "monitor-dot": ` + + + `, + "settings": ` + `, + "tornado": ` + + + + `, + "wine-off": ` + + + + `, + "baseline": ` + + `, + "file-x-2": ` + + + `, + "printer": ` + + `, + "radius": ` + + + `, + "car": ` + + + `, + "eclipse": ` + `, + "mars-stroke": ` + + + `, + "merge": ` + + `, + "receipt-russian-ruble": ` + + `, + "satellite": ` + + + + `, + "scan-face": ` + + + + + + `, + "calendar-plus": ` + + + + + `, + "circle-x": ` + + `, + "cog": ` + + + + + + + + + + + + + `, + "square-play": ` + `, + "touchpad": ` + + `, + "dribbble": ` + + + `, + "parentheses": ` + `, + "pc-case": ` + + + `, + "puzzle": ``, + "smartphone-charging": ` + `, + "bring-to-front": ` + + `, + "circle-plus": ` + + `, + "scan-barcode": ` + + + + + + `, + "bold": ``, + "circle-arrow-out-up-left": ` + + `, + "drama": ` + + + + + + + `, + "hamburger": ` + + + `, + "folder-up": ` + + `, + "goal": ` + + `, + "map-pin-house": ` + + + `, + "shield-user": ` + + `, + "align-horizontal-space-between": ` + + + `, + "feather": ` + + `, + "save-off": ` + + + + + + `, + "square": ``, + "user-lock": ` + + + `, + "umbrella-off": ` + + + `, + "tv-minimal-play": ` + + `, + "air-vent": ` + + + `, + "calendar-check-2": ` + + + + `, + "bean": ` + `, + "camera-off": ` + + + `, + "navigation-2-off": ` + + `, + "speaker": ` + + + `, + "square-slash": ` + `, + "step-forward": ` + `, + "file-box": ` + + + + `, + "gem": ` + + `, + "lamp-desk": ` + + + `, + "phone-forwarded": ` + + `, + "printer-check": ` + + + `, + "receipt-indian-rupee": ` + + + `, + "shopping-basket": ` + + + + + + `, + "test-tube-diagonal": ` + + `, + "chart-no-axes-column-decreasing": ` + + `, + "receipt-swiss-franc": ` + + + `, + "text-quote": ` + + + `, + "theater": ` + + + + + + + + `, + "tree-deciduous": ` + `, + "bow-arrow": ` + + + + `, + "kanban": ` + + `, + "megaphone": ` + `, + "view": ` + + + `, + "arrow-right-from-line": ` + + `, + "loader-circle": ``, + "panel-top": ` + `, + "pin": ` + `, + "radical": ``, + "speech": ` + + `, + "book-up-2": ` + + + + `, + "clock": ` + `, + "handshake": ` + + + + `, + "gallery-thumbnails": ` + + + + `, + "trash": ` + + `, + "alarm-clock-check": ` + + + + + `, + "audio-waveform": ``, + "bug-off": ` + + + + + + + + `, + "circle-gauge": ` + + `, + "contact-round": ` + + + + `, + "disc-2": ` + + `, + "sun": ` + + + + + + + + `, + "video": ` + `, + "arrow-left-to-line": ` + + `, + "clock-10": ` + `, + "cuboid": ` + + `, + "pause": ` + `, + "mouse-pointer-ban": ` + + `, + "square-equal": ` + + `, + "trophy": ` + + + + + `, + "chart-bar": ` + + + `, + "chart-network": ` + + + + + + `, + "calendar": ` + + + `, + "figma": ` + + + + `, + "fullscreen": ` + + + + `, + "message-circle-off": ` + + `, + "switch-camera": ` + + + + `, + "circle-arrow-right": ` + + `, + "circle-dot": ` + `, + "dice-4": ` + + + + `, + "file-json-2": ` + + + `, + "file-x": ` + + + `, + "hard-drive-upload": ` + + + + `, + "non-binary": ` + + + `, + "bike": ` + + + `, + "heading-6": ` + + + + `, + "git-pull-request-draft": ` + + + + `, + "github": ` + `, + "square-user": ` + + `, + "arrow-down-right": ` + `, + "crosshair": ` + + + + `, + "flask-conical-off": ` + + + + + `, + "folder-heart": ` + `, + "image-down": ` + + + `, + "paintbrush-vertical": ` + + + `, + "reply-all": ` + + `, + "angry": ` + + + + + `, + "circle-help": ` + + `, + "forward": ` + `, + "cloud-lightning": ` + `, + "battery-low": ` + + `, + "castle": ` + + + + + + + + `, + "equal-approximately": ` + `, + "hard-drive": ` + + + `, + "heart-plus": ` + + `, + "lamp-wall-up": ` + + `, + "smartphone-nfc": ` + + + `, + "tally-2": ` + `, + "chart-candlestick": ` + + + + + + `, + "mail-warning": ` + + + `, + "replace-all": ` + + + + + + + + `, + "star": ``, + "stethoscope": ` + + + + `, + "user-round-search": ` + + + `, + "weight": ` + `, + "arrow-big-down": ``, + "database-backup": ` + + + + + `, + "locate": ` + + + + `, + "mouse-pointer": ` + `, + "arrow-right": ` + `, + "brain-cog": ` + + + + + + + + + + + + + + `, + "corner-down-left": ` + `, + "file-spreadsheet": ` + + + + + `, + "pizza": ` + + + + `, + "replace": ` + + + + + + `, + "tower-control": ` + + + + + + `, + "whole-word": ` + + + + `, + "arrow-big-up": ``, + "bird": ` + + + + + `, + "diamond-minus": ` + `, + "flame": ``, + "folder-code": ` + + `, + "import": ` + + `, + "luggage": ` + + + + `, + "microchip": ` + + + + + + + + + + `, + "at-sign": ` + `, + "anchor": ` + + `, + "arrow-big-down-dash": ` + `, + "book-a": ` + + `, + "meh": ` + + + `, + "package-check": ` + + + + `, + "rotate-cw": ` + `, + "russian-ruble": ` + `, + "bookmark": ``, + "dice-3": ` + + + `, + "hard-drive-download": ` + + + + `, + "ratio": ` + `, + "square-activity": ` + `, + "toy-brick": ` + + `, + "wrench": ``, + "rectangle-horizontal": ``, + "map-pin-check-inside": ` + `, + "monitor-play": ` + + + `, + "square-arrow-down-right": ` + + `, + "square-arrow-up-left": ` + + `, + "tram-front": ` + + + + + + `, + "venus": ` + + `, + "wind": ` + + `, + "baggage-claim": ` + + + + `, + "calendar-check": ` + + + + `, + "case-sensitive": ` + + + `, + "door-open": ` + + + + `, + "eye-closed": ` + + + + `, + "folder-archive": ` + + + `, + "mail-x": ` + + + `, + "align-justify": ` + + `, + "book-copy": ` + + `, + "blinds": ` + + + + + + `, + "panel-top-open": ` + + `, + "target": ` + + `, + "pocket": ` + `, + "cat": ` + + + `, + "copy-check": ` + + `, + "headphone-off": ` + + + + `, + "hexagon": ``, + "highlighter": ` + `, + "mouse-pointer-2": ``, + "scan-qr-code": ` + + + + + + + `, + "ship-wheel": ` + + + + + + + + + `, + "anvil": ` + + + + `, + "bath": ` + + + + `, + "menu": ` + + `, + "sliders-horizontal": ` + + + + + + + + `, + "sun-moon": ` + + + + + + + + `, + "tags": ` + + `, + "square-pen": ` + `, + "triangle-alert": ` + + `, + "ambulance": ` + + + + + + `, + "battery-warning": ` + + + + `, + "chart-column-stacked": ` + + + + `, + "gamepad": ` + + + + `, + "notebook-text": ` + + + + + + + `, + "philippine-peso": ` + + `, + "corner-right-down": ` + `, + "flip-horizontal-2": ` + + + + + `, + "scan-line": ` + + + + `, + "venus-and-mars": ` + + + + `, + "cloud-snow": ` + + + + + + `, + "columns-3": ` + + `, + "message-square-reply": ` + + `, + "tally-5": ` + + + + `, + "user-cog": ` + + + + + + + + + + `, + "brick-wall-fire": ` + + + + + + `, + "corner-left-down": ` + `, + "guitar": ` + + + `, + "forklift": ` + + + `, + "move-right": ` + `, + "paint-bucket": ` + + + `, + "panel-left-dashed": ` + + + + `, + "square-arrow-up-right": ` + + `, + "square-x": ` + + `, + "type": ` + + `, + "copyright": ` + `, + "popsicle": ` + `, + "repeat-1": ` + + + + `, + "recycle": ` + + + + + `, + "shuffle": ` + + + + `, + "square-dashed-bottom": ` + + `, + "worm": ` + + `, + "clipboard-paste": ` + + + + `, + "grab": ` + + + + `, + "square-dot": ` + `, + "zap": ``, + "egg-off": ` + + `, + "lightbulb-off": ` + + + + `, + "pickaxe": ` + + + `, + "mountain": ``, + "circle-check-big": ` + `, + "ethernet-port": ` + + + + `, + "fold-horizontal": ` + + + + + + + `, + "folder-kanban": ` + + + `, + "git-merge": ` + + `, + "signpost": ` + + `, + "wrap-text": ` + + + `, + "badge-cent": ` + + `, + "book-heart": ` + `, + "chart-bar-stacked": ` + + + + `, + "corner-up-left": ` + `, + "file-chart-pie": ` + + + `, + "indian-rupee": ` + + + + `, + "list-music": ` + + + + `, + "move-up-right": ` + `, + "amphora": ` + + + + + `, + "banknote-x": ` + + + + + `, + "cone": ` + `, + "tree-palm": ` + + + `, + "truck-electric": ` + + + + + + `, + "user-pen": ` + + `, + "bell-minus": ` + + `, + "bubbles": ` + + + `, + "cloud-download": ` + + `, + "diamond-percent": ` + + + `, + "file-chart-column-increasing": ` + + + + `, + "key-round": ` + `, + "ticket-slash": ` + `, + "wheat": ` + + + + + + + `, + "align-horizontal-space-around": ` + + `, + "file-scan": ` + + + + + `, + "images": ` + + + `, + "lectern": ` + + `, + "settings-2": ` + + + `, + "snail": ` + + + + `, + "wifi-off": ` + + + + + + `, + "underline": ` + `, + "ban": ` + `, + "car-front": ` + + + + + `, + "circle-ellipsis": ` + + + `, + "crop": ` + `, + "file-lock-2": ` + + + `, + "pin-off": ` + + + `, + "receipt-euro": ` + + `, + "screen-share-off": ` + + + + `, + "terminal": ` + `, + "square-pilcrow": ` + + + `, + "flashlight-off": ` + + + `, + "hammer": ` + + `, + "route": ` + + `, + "bookmark-check": ` + `, + "cassette-tape": ` + + + + `, + "file-search-2": ` + + + `, + "mars": ` + + `, + "thumbs-up": ` + `, + "webhook": ` + + `, + "x": ` + `, + "youtube": ` + `, + "apple": ` + `, + "braces": ` + `, + "grip-horizontal": ` + + + + + `, + "list-plus": ` + + + + `, + "move": ` + + + + + `, + "scan-search": ` + + + + + `, + "square-arrow-left": ` + + `, + "telescope": ` + + + + + + `, + "clock-2": ` + `, + "file-volume": ` + + + `, + "panel-right": ` + `, + "voicemail": ` + + `, + "codepen": ` + + + + `, + "badge-euro": ` + + `, + "martini": ` + + `, + "sticker": ` + + + + `, + "align-center": ` + + `, + "book-down": ` + + `, + "calendar-off": ` + + + + + `, + "case-lower": ` + + + `, + "contact": ` + + + + `, + "radio-tower": ` + + + + + + `, + "videotape": ` + + + + `, + "copy-x": ` + + + `, + "file-chart-line": ` + + `, + "japanese-yen": ` + + `, + "utility-pole": ` + + + + + + `, + "watch": ` + + + `, + "alarm-clock-off": ` + + + + + `, + "arrow-up-to-line": ` + + `, + "bug-play": ` + + + + + + + + `, + "copy-minus": ` + + `, + "grid-2x2": ` + + `, + "newspaper": ` + + + `, + "ticket-percent": ` + + + `, + "square-function": ` + + `, + "building": ` + + + + + + + + + + `, + "cable": ` + + + + `, + "info": ` + + `, + "music-4": ` + + + `, + "paw-print": ` + + + `, + "phone": ``, + "save": ` + + `, + "shredder": ` + + + + + + `, + "layout-dashboard": ` + + + `, + "circle-arrow-out-down-left": ` + + `, + "circle-off": ` + + `, + "file-image": ` + + + `, + "glass-water": ` + `, + "shopping-bag": ` + + `, + "waves": ` + + `, + "rotate-3d": ` + + `, + "clock-fading": ` + + + + + `, + "server": ` + + + `, + "split": ` + + + `, + "swiss-franc": ` + + `, + "stamp": ` + + `, + "image-minus": ` + + + `, + "layout-grid": ` + + + `, + "grid-3x3": ` + + + + `, + "id-card": ` + + + + `, + "save-all": ` + + + `, + "shield-ellipsis": ` + + + `, + "between-vertical-start": ` + + `, + "circle-stop": ` + `, + "clock-12": ` + `, + "code-xml": ` + + `, + "panel-bottom-close": ` + + `, + "triangle-right": ``, + "briefcase-medical": ` + + + + + `, + "heart-crack": ` + `, + "refresh-ccw": ` + + + `, + "strikethrough": ` + + `, + "vault": ` + + + + + + + + + `, + "waves-ladder": ` + + + + `, + "arrow-up-left": ` + `, + "chevron-left": ``, + "film": ` + + + + + + + `, + "git-pull-request-arrow": ` + + + + `, + "lamp": ` + + `, + "message-circle-question": ` + + `, + "notebook-tabs": ` + + + + + + + + `, + "wifi-high": ` + + `, + "arrow-up-from-dot": ` + + `, + "chart-bar-decreasing": ` + + + `, + "chart-no-axes-column": ` + + `, + "cloudy": ` + `, + "file-symlink": ` + + `, + "map-pin-plus-inside": ` + + `, + "message-circle-plus": ` + + `, + "shield-x": ` + + `, + "cable-car": ` + + + + + + + `, + "chart-no-axes-column-increasing": ` + + `, + "cigarette": ` + + + + `, + "code": ` + `, + "grid-2x2-check": ` + `, + "package-minus": ` + + + + `, + "thermometer-snowflake": ` + + + + + + + `, + "alarm-clock-minus": ` + + + + + `, + "brush-cleaning": ` + + + `, + "drum": ` + + + + + + `, + "heading": ` + + `, + "package-search": ` + + + + + `, + "panel-left-open": ` + + `, + "square-percent": ` + + + `, + "chart-line": ` + `, + "candy-off": ` + + + + + + `, + "clipboard-pen-line": ` + + + + `, + "diamond-plus": ` + + `, + "ruler-dimension-line": ` + + + + + + `, + "shield": ``, + "tree-pine": ` + `, + "file-minus-2": ` + + `, + "footprints": ` + + + `, + "panel-bottom-open": ` + + `, + "aperture": ` + + + + + + `, + "baby": ` + + + `, + "cake-slice": ` + + + `, + "corner-left-up": ` + `, + "ham": ` + + + `, + "heart-off": ` + + `, + "git-branch-plus": ` + + + + + `, + "grape": ` + + + + + + + + `, + "arrow-down-from-line": ` + + `, + "key-square": ` + + `, + "message-circle-heart": ` + `, + "pen-line": ` + `, + "clock-1": ` + `, + "superscript": ` + + `, + "tally-1": ``, + "umbrella": ` + + `, + "chart-spline": ` + `, + "clipboard-copy": ` + + + + `, + "file-music": ` + + + `, + "laptop-minimal": ` + `, + "monitor": ` + + `, + "redo-dot": ` + + `, + "align-vertical-space-between": ` + + + `, + "asterisk": ` + + `, + "calendar-clock": ` + + + + + `, + "flag-triangle-left": ``, + "list-start": ` + + + + `, + "message-square-dot": ` + `, + "message-square-warning": ` + + `, + "nfc": ` + + + `, + "accessibility": ` + + + + `, + "currency": ` + + + + `, + "disc": ` + `, + "flag": ` + `, + "ice-cream-cone": ` + + `, + "lollipop": ` + + `, + "skip-forward": ` + `, + "twitter": ``, + "align-horizontal-justify-end": ` + + `, + "captions": ` + `, + "clock-arrow-down": ` + + + `, + "droplet": ``, + "folder-input": ` + + `, + "mountain-snow": ` + `, + "toggle-right": ` + `, + "boom-box": ` + + + + + + `, + "badge-check": ` + `, + "clipboard": ` + `, + "layout-list": ` + + + + + `, + "rotate-ccw-key": ` + + + + `, + "table-2": ``, + "zoom-in": ` + + + `, + "arrow-down-up": ` + + + `, + "arrow-down": ` + `, + "bluetooth-searching": ` + + `, + "cloud-cog": ` + + + + + + + + `, + "disc-album": ` + + `, + "file-digit": ` + + + + `, + "folder": ``, + "gauge": ` + `, + "arrow-right-to-line": ` + + `, + "circle-percent": ` + + + `, + "message-square": ``, + "text-search": ` + + + + `, + "squares-unite": ``, + "trending-up": ` + `, + "clock-plus": ` + + + `, + "facebook": ``, + "folder-output": ` + + `, + "monitor-check": ` + + + `, + "undo": ` + `, + "video-off": ` + + `, + "book-open-check": ` + + `, + "circle-arrow-left": ` + + `, + "file-code-2": ` + + + `, + "folder-down": ` + + `, + "haze": ` + + + + + + + `, + "panel-left": ` + `, + "pentagon": ``, + "move-diagonal": ` + + `, + "file-code": ` + + + `, + "map-pin-minus": ` + + `, + "monitor-x": ` + + + + `, + "rows-4": ` + + + `, + "shapes": ` + + `, + "shopping-cart": ` + + `, + "square-chevron-right": ` + `, + "square-chevron-up": ` + `, + "file-heart": ` + + `, + "fire-extinguisher": ` + + + + + `, + "refresh-cw": ` + + + `, + "square-dashed-bottom-code": ` + + + + `, + "square-dashed-kanban": ` + + + + + + + + + + + + + + `, + "user-round-check": ` + + `, + "washing-machine": ` + + + + `, + "bed": ` + + + `, + "cup-soda": ` + + + `, + "dot": ``, + "file-up": ` + + + `, + "keyboard-music": ` + + + + + + + + `, + "palette": ` + + + + `, + "monitor-speaker": ` + + + + `, + "align-center-vertical": ` + + + + `, + "pilcrow-right": ` + + + + `, + "rabbit": ` + + + + `, + "train-front": ` + + + + + `, + "waypoints": ` + + + + + + `, + "heater": ` + + + + + + + + + `, + "bluetooth-connected": ` + + `, + "circle-slash-2": ` + `, + "flower": ` + + + + + + + + + `, + "file": ` + `, + "align-vertical-space-around": ` + + `, + "book-x": ` + + `, + "circle-arrow-out-up-right": ` + + `, + "droplet-off": ` + + `, + "thermometer": ``, + "bluetooth-off": ` + + `, + "cylinder": ` + `, + "file-volume-2": ` + + + + `, + "network": ` + + + + `, + "panel-right-dashed": ` + + + + `, + "squares-exclude": ` + `, + "align-horizontal-distribute-start": ` + + + `, + "building-2": ` + + + + + + `, + "cannabis": ` + `, + "octagon": ``, + "package-open": ` + + + `, + "shirt": ``, + "boxes": ` + + + + + + + + + + + `, + "maximize-2": ` + + + `, + "square-radical": ` + `, + "bus": ` + + + + + + `, + "biohazard": ` + + + + + + + + + `, + "cloud-hail": ` + + + + + + `, + "corner-up-right": ` + `, + "file-stack": ` + + + `, + "grip": ` + + + + + + + + `, + "git-pull-request": ` + + + `, + "graduation-cap": ` + + `, + "check-check": ` + `, + "circle-chevron-left": ` + `, + "cloud-upload": ` + + `, + "magnet": ` + + `, + "pilcrow-left": ` + + + + `, + "pencil-off": ` + + + `, + "minimize-2": ` + + + `, + "sunset": ` + + + + + + + `, + "compass": ` + `, + "file-key-2": ` + + + + `, + "heart-minus": ` + `, + "rectangle-ellipsis": ` + + + `, + "spade": ` + `, + "square-split-vertical": ` + + `, + "venetian-mask": ` + + `, + "vibrate-off": ` + + + + `, + "arrow-down-left": ` + `, + "linkedin": ` + + `, + "pipette": ` + + `, + "framer": ``, + "table-properties": ` + + + `, + "clipboard-minus": ` + + `, + "folder-search-2": ` + + `, + "square-arrow-out-down-right": ` + + `, + "timer-off": ` + + + + `, + "chevrons-down": ` + `, + "divide": ` + + `, + "navigation-2": ``, + "phone-call": ` + + `, + "plane-landing": ` + `, + "qr-code": ` + + + + + + + + + + + `, + "book-lock": ` + + + `, + "file-clock": ` + + + `, + "folder-open-dot": ` + `, + "message-square-more": ` + + + `, + "text-cursor-input": ` + + + + `, + "triangle-dashed": ` + + + + + + + + `, + "a-arrow-down": ` + + + `, + "calendar-heart": ` + + + `, + "bot": ` + + + + + `, + "cloud-drizzle": ` + + + + + + `, + "eye-off": ` + + + `, + "fast-forward": ` + `, + "globe": ` + + `, + "binary": ` + + + + + `, + "chevrons-left-right": ` + `, + "file-json": ` + + + `, + "heading-2": ` + + + `, + "gallery-horizontal": ` + + `, + "navigation-off": ` + + `, + "router": ` + + + + + `, + "scan-text": ` + + + + + + `, + "app-window-mac": ` + + + `, + "calendar-1": ` + + + + `, + "cloud-sun": ` + + + + + `, + "file-cog": ` + + + + + + + + + + `, + "notepad-text-dashed": ` + + + + + + + + + + + + `, + "panel-top-dashed": ` + + + + `, + "pen": ``, + "separator-horizontal": ` + + `, + "arrow-big-left": ``, + "bell-dot": ` + + `, + "calendar-range": ` + + + + + + + `, + "chart-area": ` + `, + "citrus": ` + + + `, + "delete": ` + + `, + "ellipsis": ` + + `, + "send-to-back": ` + + + `, + "arrow-down-1-0": ` + + + + `, + "signal-high": ` + + + `, + "square-arrow-out-up-right": ` + + `, + "ticket": ` + + + `, + "undo-2": ` + `, + "badge-pound-sterling": ` + + + `, + "bitcoin": ``, + "diamond": ``, + "file-check": ` + + `, + "folder-clock": ` + + `, + "folder-dot": ` + `, + "funnel-x": ` + + `, + "medal": ` + + + + + `, + "clock-8": ` + `, + "mailbox": ` + + + `, + "landmark": ` + + + + + `, + "mic-vocal": ` + + `, + "monitor-smartphone": ` + + + `, + "radio": ` + + + + `, + "scale-3d": ` + + + `, + "sun-snow": ` + + + + + + + + + + `, + "arrow-left": ` + `, + "atom": ` + + `, + "circle-alert": ` + + `, + "columns-4": ` + + + `, + "copy": ` + `, + "table": ` + + + `, + "text-cursor": ` + + `, + "train-track": ` + + + + + + `, + "circle": ``, + "dock": ` + + `, + "map-plus": ` + + + + `, + "person-standing": ` + + + `, + "store": ` + + + + `, + "transgender": ` + + + + + + + `, + "user-round-pen": ` + + `, + "utensils-crossed": ` + + + `, + "align-vertical-distribute-end": ` + + + `, + "arrow-up-narrow-wide": ` + + + + `, + "briefcase": ` + `, + "link": ` + `, + "nut": ` + + `, + "microwave": ` + + + + `, + "rectangle-vertical": ``, + "tablet": ` + `, + "book-dashed": ` + + + + + + + + + + `, + "brackets": ` + `, + "mic": ` + + `, + "tractor": ` + + + + + + + + `, + "list-restart": ` + + + + `, + "notebook-pen": ` + + + + + `, + "move-horizontal": ` + + `, + "tag": ` + `, + "user-round": ` + `, + "cross": ``, + "file-input": ` + + + `, + "languages": ` + + + + + `, + "library": ` + + + `, + "ticket-plus": ` + + `, + "wifi-zero": ``, + "type-outline": ``, + "circle-pause": ` + + `, + "cloud": ``, + "flip-vertical": ` + + + + + `, + "layout-template": ` + + `, + "panel-bottom-dashed": ` + + + + `, + "phone-off": ` + + `, + "plane-takeoff": ` + `, + "space": ``, + "construction": ` + + + + + + + `, + "gallery-horizontal-end": ` + + `, + "chevron-first": ` + `, + "vote": ` + + `, + "align-center-horizontal": ` + + + + `, + "box": ` + + `, + "case-upper": ` + + `, + "sparkle": ``, + "tally-3": ` + + `, + "train-front-tunnel": ` + + + + + + `, + "badge-minus": ` + `, + "circle-parking": ` + `, + "clipboard-check": ` + + `, + "monitor-up": ` + + + + `, + "rainbow": ` + + `, + "send": ` + `, + "table-rows-split": ` + + + + + + + + + + `, + "square-arrow-right": ` + + `, + "airplay": ` + `, + "computer": ` + + + `, + "image-upscale": ` + + + + + + + `, + "package-plus": ` + + + + + `, + "pencil-ruler": ` + + + + + `, + "rotate-ccw": ` + `, + "slash": ``, + "square-split-horizontal": ` + + `, + "armchair": ` + + + `, + "cast": ` + + + `, + "chart-no-axes-combined": ` + + + + + `, + "chevron-down": ``, + "chevron-up": ``, + "dice-5": ` + + + + + `, + "external-link": ` + + `, + "heart": ``, + "component": ` + + + `, + "hourglass": ` + + + `, + "squirrel": ` + + + `, + "book-plus": ` + + `, + "chart-bar-big": ` + + `, + "droplets": ` + `, + "glasses": ` + + + + `, + "list-filter-plus": ` + + + + `, + "server-crash": ` + + + + `, + "trees": ` + + + `, + "trending-up-down": ` + + + `, + "arrow-up-wide-narrow": ` + + + + `, + "banknote-arrow-up": ` + + + + + `, + "bot-message-square": ` + + + + + `, + "dessert": ` + + `, + "ferris-wheel": ` + + + + + + + + `, + "indent-decrease": ` + + + `, + "pen-tool": ` + + + `, + "signal-low": ` + `, + "calendar-x-2": ` + + + + + `, + "camera": ` + `, + "flip-vertical-2": ` + + + + + `, + "gift": ` + + + `, + "iteration-cw": ` + `, + "music-3": ` + `, + "panel-right-close": ` + + `, + "soap-dispenser-droplet": ` + + + `, + "between-horizontal-start": ` + + `, + "egg-fried": ` + `, + "equal-not": ` + + `, + "git-pull-request-create": ` + + + + `, + "origami": ` + + `, + "sheet": ` + + + + `, + "star-half": ``, + "user-round-x": ` + + + `, + "brush": ` + + `, + "clock-11": ` + `, + "dumbbell": ` + + + + `, + "file-terminal": ` + + + `, + "mail-minus": ` + + `, + "message-square-off": ` + + `, + "timer": ` + + `, + "regex": ` + + + `, + "command": ``, + "arrow-up-down": ` + + + `, + "bookmark-minus": ` + `, + "cherry": ` + + + `, + "circle-user": ` + + `, + "milk-off": ` + + + `, + "square-check-big": ` + `, + "tv-minimal": ` + `, + "calendar-days": ` + + + + + + + + + `, + "carrot": ` + + `, + "captions-off": ` + + + + + `, + "circle-power": ` + + `, + "map-pinned": ` + + `, + "message-square-diff": ` + + + `, + "package-2": ` + + `, + "moon-star": ` + + `, + "message-square-lock": ` + + `, + "presentation": ` + + `, + "square-sigma": ` + `, + "timer-reset": ` + + + `, + "car-taxi-front": ` + + + + + + `, + "file-plus": ` + + + `, + "square-plus": ` + + `, + "book-open-text": ` + + + + + `, + "briefcase-business": ` + + + `, + "circle-chevron-right": ` + `, + "clock-7": ` + `, + "file-pen": ` + + `, + "hand": ` + + + `, + "log-out": ` + + `, + "rewind": ` + `, + "badge-alert": ` + + `, + "cctv": ` + + + + `, + "earth": ` + + + `, + "mail-search": ` + + + + `, + "pen-off": ` + + `, + "monitor-stop": ` + + + `, + "refresh-ccw-dot": ` + + + + `, + "grid-2x2-x": ` + + `, + "list-collapse": ` + + + + `, + "shrub": ` + + `, + "variable": ` + + + `, + "align-vertical-justify-end": ` + + `, + "arrow-big-right": ``, + "badge-swiss-franc": ` + + + `, + "chrome": ` + + + + `, + "clock-9": ` + `, + "panel-right-open": ` + + `, + "tent": ` + + + `, + "rocking-chair": ` + + + `, + "bolt": ` + `, + "chevrons-up": ` + `, + "drafting-compass": ` + + + + `, + "file-type-2": ` + + + + `, + "gitlab": ``, + "message-square-x": ` + + `, + "paperclip": ` + `, + "pilcrow": ` + + `, + "bus-front": ` + + + + + + + + `, + "battery": ` + `, + "donut": ` + `, + "rat": ` + + + + `, + "tablets": ` + + + `, + "square-divide": ` + + + `, + "disc-3": ` + + + `, + "map-pin-minus-inside": ` + `, + "shrink": ` + + + `, + "wallet-cards": ` + + `, + "beer": ` + + + + `, + "git-commit-vertical": ` + + `, + "milestone": ` + + `, + "square-arrow-out-down-left": ` + + `, + "clipboard-pen": ` + + + `, + "folder-open": ``, + "letter-text": ` + + + + `, + "pill-bottle": ` + + `, + "mouse-off": ` + + + `, + "scissors": ` + + + + `, + "shield-alert": ` + + `, + "spell-check": ` + + `, + "book-user": ` + + `, + "circle-dashed": ` + + + + + + + `, + "file-key": ` + + + `, + "rectangle-goggles": ``, + "tickets-plane": ` + + + + + + `, + "align-start-horizontal": ` + + `, + "blend": ` + `, + "beef": ` + + `, + "corner-down-right": ` + `, + "database": ` + + `, + "flower-2": ` + + + + `, + "italic": ` + + `, + "briefcase-conveyor-belt": ` + + + + + + `, + "ampersands": ` + `, + "circle-arrow-down": ` + + `, + "folder-tree": ` + + + `, + "house-plus": ` + + + `, + "sliders-vertical": ` + + + + + + + + `, + "volume": ``, + "repeat-2": ` + + + `, + "calendar-fold": ` + + + + `, + "gallery-vertical-end": ` + + `, + "scan-eye": ` + + + + + `, + "shield-plus": ` + + `, + "users": ` + + + `, + "volume-1": ` + `, + "banknote-arrow-down": ` + + + + + `, + "caravan": ` + + + `, + "ellipsis-vertical": ` + + `, + "heading-5": ` + + + + `, + "messages-square": ` + `, + "sofa": ` + + + + `, + "square-user-round": ` + + `, + "zap-off": ` + + + `, + "arrow-up": ` + `, + "badge-help": ` + + `, + "crown": ` + `, + "flask-conical": ` + + `, + "git-compare": ` + + + `, + "sailboat": ` + + `, + "server-cog": ` + + + + + + + + + + + `, + "ribbon": ` + + + + `, + "award": ` + `, + "plane": ``, + "wallpaper": ` + + + `, + "bluetooth": ``, + "fish": ` + + + + + `, + "folder-git": ` + + + `, + "folder-pen": ` + `, + "panels-top-left": ` + + `, + "pi": ` + + `, + "pyramid": ` + `, + "ship": ` + + + + `, + "app-window": ` + + + `, + "chart-bar-increasing": ` + + + `, + "map-pin-off": ` + + + + `, + "mouse-pointer-click": ` + + + + `, + "square-menu": ` + + + `, + "square-mouse-pointer": ` + `, + "webcam": ` + + + `, + "twitch": ``, + "book-image": ` + + `, + "columns-3-cog": ` + + + + + + + + + + + `, + "map-pin": ` + `, + "shield-question": ` + + `, + "truck": ` + + + + `, + "chart-column-decreasing": ` + + + `, + "cpu": ` + + + + + + + + + + + + + `, + "ticket-x": ` + + `, + "stretch-vertical": ` + `, + "warehouse": ` + + + `, + "cigarette-off": ` + + + + + `, + "dna-off": ` + + + + + + + + + `, + "file-sliders": ` + + + + + `, + "list-minus": ` + + + `, + "arrow-up-z-a": ` + + + + `, + "fence": ` + + + + + + `, + "folder-x": ` + + `, + "shield-check": ` + `, + "chevrons-right": ` + `, + "croissant": ` + + + + `, + "hand-helping": ` + + `, + "list-filter": ` + + `, + "salad": ` + + + + `, + "flashlight": ` + + `, + "mail-plus": ` + + + `, + "life-buoy": ` + + + + + `, + "snowflake": ` + + + + + + + + + + + `, + "dog": ` + + + + `, + "keyboard": ` + + + + + + + + `, + "phone-outgoing": ` + + `, + "square-asterisk": ` + + + `, + "square-stack": ` + + `, + "user-plus": ` + + + `, + "calendar-minus": ` + + + + `, + "circle-arrow-up": ` + + `, + "list-ordered": ` + + + + + `, + "map-pin-x-inside": ` + + `, + "percent": ` + + `, + "school": ` + + + + + `, + "arrow-left-right": ` + + + `, + "option": ` + `, + "repeat": ` + + + `, + "user-search": ` + + + `, + "calendar-sync": ` + + + + + + + `, + "coffee": ` + + + `, + "folder-key": ` + + + `, + "frame": ` + + + `, + "slice": ``, + "toilet": ` + `, + "book-headphones": ` + + + `, + "bed-single": ` + + `, + "circle-user-round": ` + + `, + "diff": ` + + `, + "move-up": ` + `, + "move-diagonal-2": ` + + `, + "square-square": ` + `, + "usb": ` + + + + + + `, + "receipt-pound-sterling": ` + + + `, + "milk": ` + + `, + "radar": ` + + + + + + + `, + "scaling": ` + + + `, + "squares-intersect": ` + + + + + + + + + + `, + "bed-double": ` + + + `, + "beer-off": ` + + + + + + + `, + "folder-cog": ` + + + + + + + + + `, + "hospital": ` + + + + + `, + "leafy-green": ` + `, + "move-up-left": ` + `, + "message-circle-reply": ` + + `, + "notepad-text": ` + + + + + + `, + "a-arrow-up": ` + + + `, + "diameter": ` + + + + `, + "projector": ` + + + + + `, + "radiation": ` + + + `, + "pocket-knife": ` + + + + `, + "square-scissors": ` + + + + + `, + "tickets": ` + + + + `, + "trello": ` + + `, + "circle-parking-off": ` + + + `, + "factory": ` + + + `, + "pill": ` + `, + "receipt-text": ` + + + `, + "roller-coaster": ` + + + + + + `, + "vibrate": ` + + `, + "candy": ` + + + + `, + "flask-round": ` + + `, + "folder-root": ` + + `, + "mail-check": ` + + `, + "message-square-code": ` + + `, + "receipt": ` + + `, + "soup": ` + + + + + `, + "zoom-out": ` + + `, + "arrow-down-a-z": ` + + + + `, + "expand": ` + + + + + + + `, + "folders": ` + `, + "panel-bottom": ` + `, + "play": ``, + "wifi-pen": ` + + + `, + "pencil-line": ` + + `, + "file-user": ` + + + `, + "hash": ` + + + `, + "rail-symbol": ` + + `, + "square-arrow-down": ` + + `, + "copyleft": ` + `, + "wallet": ` + `, + "badge-plus": ` + + `, + "dice-6": ` + + + + + + `, + "file-down": ` + + + `, + "hotel": ` + + + + + + + + + `, + "mail-open": ` + `, + "ticket-minus": ` + `, + "barcode": ` + + + + `, + "columns-2": ` + `, + "image": ` + + `, + "panda": ` + + + + + `, + "parking-meter": ` + + + + `, + "square-chart-gantt": ` + + + `, + "align-end-horizontal": ` + + `, + "calendar-arrow-up": ` + + + + + `, + "bookmark-x": ` + + `, + "chevrons-right-left": ` + `, + "cooking-pot": ` + + + `, + "contrast": ` + `, + "shield-off": ` + + `, + "subscript": ` + + `, + "arrow-down-to-dot": ` + + `, + "clipboard-type": ` + + + + `, + "git-branch": ` + + + `, + "image-plus": ` + + + + `, + "list-end": ` + + + + `, + "spline": ` + + `, + "gamepad-2": ` + + + + `, + "image-up": ` + + + `, + "message-circle-warning": ` + + `, + "route-off": ` + + + + + + `, + "scale": ` + + + + `, + "send-horizontal": ` + `, + "volleyball": ` + + + + + `, + "arrow-right-left": ` + + + `, + "bug": ` + + + + + + + + + + `, + "cloud-alert": ` + + `, + "combine": ` + + + + + `, + "dam": ` + + + + + + `, + "euro": ` + + `, + "file-warning": ` + + `, + "fold-vertical": ` + + + + + + + `, + "bell-plus": ` + + + `, + "book-text": ` + + `, + "copy-slash": ` + + `, + "folder-lock": ` + + `, + "laptop-minimal-check": ` + + `, + "globe-lock": ` + + + `, + "move-left": ` + `, + "message-circle-code": ` + + `, + "church": ` + + + + `, + "circle-fading-plus": ` + + + + + + `, + "hdmi-port": ` + `, + "folder-plus": ` + + `, + "monitor-down": ` + + + + `, + "rows-2": ` + `, + "satellite-dish": ` + + + `, + "square-m": ` + `, + "beaker": ` + + `, + "container": ` + + + + `, + "map-pin-check": ` + + `, + "arrow-up-right": ` + `, + "clock-6": ` + `, + "search-check": ` + + `, + "sparkles": ` + + + + `, + "touchpad-off": ` + + + + + `, + "unfold-horizontal": ` + + + + + + + `, + "wifi": ` + + + `, + "turtle": ` + + + `, + "album": ` + `, + "arrow-up-0-1": ` + + + + `, + "chevron-last": ` + `, + "indent-increase": ` + + + `, + "list-tree": ` + + + + `, + "align-horizontal-distribute-center": ` + + + + + `, + "align-horizontal-justify-center": ` + + `, + "bell": ` + `, + "heart-pulse": ` + `, + "plug-2": ` + + + + `, + "search": ` + `, + "badge-russian-ruble": ` + + `, + "folder-git-2": ` + + + `, + "hand-metal": ` + + + `, + "headset": ` + `, + "loader-pinwheel": ` + + + `, + "scissors-line-dashed": ` + + + + + + `, + "server-off": ` + + + + + `, + "annoyed": ` + + + `, + "book-key": ` + + + + `, + "chart-scatter": ` + + + + + `, + "laugh": ` + + + `, + "panels-left-bottom": ` + + `, + "receipt-cent": ` + + `, + "arrow-down-to-line": ` + + `, + "bone": ``, + "panels-right-bottom": ` + + `, + "signal-zero": ``, + "skull": ` + + + `, + "stretch-horizontal": ` + `, + "vegan": ` + + `, + "arrow-down-0-1": ` + + + + `, + "chef-hat": ` + `, + "mails": ` + + `, + "message-square-text": ` + + `, + "wind-arrow-down": ` + + + `, + "chevrons-down-up": ` + `, + "git-pull-request-create-arrow": ` + + + + + `, + "orbit": ` + + + + `, + "rss": ` + + `, + "share-2": ` + + + + `, + "smile-plus": ` + + + + + `, + "tent-tree": ` + + + + + + `, + "text": ` + + `, + "file-minus": ` + + `, + "files": ` + + `, + "gallery-vertical": ` + + `, + "panel-top-close": ` + + `, + "move-3d": ` + + + `, + "test-tube": ` + + `, + "undo-dot": ` + + `, + "workflow": ` + + `, + "keyboard-off": ` + + + + + + + + + `, +} diff --git a/components/icon/icondefs.go b/components/icon/icondefs.go new file mode 100644 index 0000000..4e79f9a --- /dev/null +++ b/components/icon/icondefs.go @@ -0,0 +1,1595 @@ +// templui component icon - version: v0.94.0 installed by templui v0.94.0 +package icon +// This file is auto generated +// Using Lucide icons version 0.507.0 +var ALargeSmall = Icon("a-large-small") +var Accessibility = Icon("accessibility") +var Antenna = Icon("antenna") +var Activity = Icon("activity") +var AirVent = Icon("air-vent") +var AlarmClockCheck = Icon("alarm-clock-check") +var AlarmClockMinus = Icon("alarm-clock-minus") +var AlarmClockOff = Icon("alarm-clock-off") +var Airplay = Icon("airplay") +var AtSign = Icon("at-sign") +var AlarmClockPlus = Icon("alarm-clock-plus") +var AlarmClock = Icon("alarm-clock") +var AlarmSmoke = Icon("alarm-smoke") +var Album = Icon("album") +var AlignCenterHorizontal = Icon("align-center-horizontal") +var AlignCenterVertical = Icon("align-center-vertical") +var AlignCenter = Icon("align-center") +var AlignEndHorizontal = Icon("align-end-horizontal") +var AlignEndVertical = Icon("align-end-vertical") +var AlignHorizontalDistributeCenter = Icon("align-horizontal-distribute-center") +var AlignHorizontalDistributeEnd = Icon("align-horizontal-distribute-end") +var AlignHorizontalDistributeStart = Icon("align-horizontal-distribute-start") +var AlignHorizontalJustifyCenter = Icon("align-horizontal-justify-center") +var AlignHorizontalJustifyEnd = Icon("align-horizontal-justify-end") +var AlignHorizontalJustifyStart = Icon("align-horizontal-justify-start") +var AlignHorizontalSpaceAround = Icon("align-horizontal-space-around") +var AlignHorizontalSpaceBetween = Icon("align-horizontal-space-between") +var AlignJustify = Icon("align-justify") +var AlignLeft = Icon("align-left") +var AlignRight = Icon("align-right") +var AlignStartVertical = Icon("align-start-vertical") +var AlignStartHorizontal = Icon("align-start-horizontal") +var AlignVerticalDistributeCenter = Icon("align-vertical-distribute-center") +var AlignVerticalDistributeEnd = Icon("align-vertical-distribute-end") +var AlignVerticalDistributeStart = Icon("align-vertical-distribute-start") +var AlignVerticalJustifyCenter = Icon("align-vertical-justify-center") +var AlignVerticalJustifyEnd = Icon("align-vertical-justify-end") +var AlignVerticalJustifyStart = Icon("align-vertical-justify-start") +var AlignVerticalSpaceAround = Icon("align-vertical-space-around") +var AlignVerticalSpaceBetween = Icon("align-vertical-space-between") +var Ambulance = Icon("ambulance") +var Ampersand = Icon("ampersand") +var Ampersands = Icon("ampersands") +var Amphora = Icon("amphora") +var Anchor = Icon("anchor") +var Angry = Icon("angry") +var Annoyed = Icon("annoyed") +var Anvil = Icon("anvil") +var Aperture = Icon("aperture") +var AppWindowMac = Icon("app-window-mac") +var AppWindow = Icon("app-window") +var Apple = Icon("apple") +var ArchiveRestore = Icon("archive-restore") +var ArchiveX = Icon("archive-x") +var Archive = Icon("archive") +var Armchair = Icon("armchair") +var ArrowBigDownDash = Icon("arrow-big-down-dash") +var ArrowBigDown = Icon("arrow-big-down") +var ArrowBigLeftDash = Icon("arrow-big-left-dash") +var ArrowBigLeft = Icon("arrow-big-left") +var ArrowBigRightDash = Icon("arrow-big-right-dash") +var ArrowBigRight = Icon("arrow-big-right") +var ArrowBigUpDash = Icon("arrow-big-up-dash") +var ArrowBigUp = Icon("arrow-big-up") +var ArrowDown01 = Icon("arrow-down-0-1") +var ArrowDown10 = Icon("arrow-down-1-0") +var ArrowDownAZ = Icon("arrow-down-a-z") +var ArrowDownFromLine = Icon("arrow-down-from-line") +var ArrowDownLeft = Icon("arrow-down-left") +var ArrowDownNarrowWide = Icon("arrow-down-narrow-wide") +var ArrowDownRight = Icon("arrow-down-right") +var ArrowDownToDot = Icon("arrow-down-to-dot") +var ArrowDownToLine = Icon("arrow-down-to-line") +var ArrowDownUp = Icon("arrow-down-up") +var ArrowDownWideNarrow = Icon("arrow-down-wide-narrow") +var ArrowDownZA = Icon("arrow-down-z-a") +var ArrowDown = Icon("arrow-down") +var ArrowLeftFromLine = Icon("arrow-left-from-line") +var ArrowLeftRight = Icon("arrow-left-right") +var ArrowLeftToLine = Icon("arrow-left-to-line") +var ArrowLeft = Icon("arrow-left") +var ArrowRightFromLine = Icon("arrow-right-from-line") +var ArrowRightLeft = Icon("arrow-right-left") +var ArrowRightToLine = Icon("arrow-right-to-line") +var ArrowRight = Icon("arrow-right") +var ArrowUp01 = Icon("arrow-up-0-1") +var ArrowUp10 = Icon("arrow-up-1-0") +var ArrowUpAZ = Icon("arrow-up-a-z") +var ArrowUpDown = Icon("arrow-up-down") +var ArrowUpFromDot = Icon("arrow-up-from-dot") +var ArrowUpFromLine = Icon("arrow-up-from-line") +var ArrowUpLeft = Icon("arrow-up-left") +var ArrowUpNarrowWide = Icon("arrow-up-narrow-wide") +var ArrowUpRight = Icon("arrow-up-right") +var ArrowUpToLine = Icon("arrow-up-to-line") +var ArrowUpWideNarrow = Icon("arrow-up-wide-narrow") +var ArrowUpZA = Icon("arrow-up-z-a") +var ArrowUp = Icon("arrow-up") +var ArrowsUpFromLine = Icon("arrows-up-from-line") +var Asterisk = Icon("asterisk") +var BellDot = Icon("bell-dot") +var Atom = Icon("atom") +var AudioLines = Icon("audio-lines") +var AudioWaveform = Icon("audio-waveform") +var Award = Icon("award") +var Axe = Icon("axe") +var Axis3d = Icon("axis-3d") +var Baby = Icon("baby") +var Backpack = Icon("backpack") +var BadgeAlert = Icon("badge-alert") +var BadgeCent = Icon("badge-cent") +var BadgeCheck = Icon("badge-check") +var BadgeDollarSign = Icon("badge-dollar-sign") +var BadgeEuro = Icon("badge-euro") +var BadgeHelp = Icon("badge-help") +var BadgeIndianRupee = Icon("badge-indian-rupee") +var BadgeInfo = Icon("badge-info") +var BadgeJapaneseYen = Icon("badge-japanese-yen") +var BadgeMinus = Icon("badge-minus") +var BadgePercent = Icon("badge-percent") +var BadgePlus = Icon("badge-plus") +var BadgePoundSterling = Icon("badge-pound-sterling") +var BadgeRussianRuble = Icon("badge-russian-ruble") +var BadgeSwissFranc = Icon("badge-swiss-franc") +var BadgeX = Icon("badge-x") +var BookmarkMinus = Icon("bookmark-minus") +var AArrowDown = Icon("a-arrow-down") +var Bone = Icon("bone") +var Badge = Icon("badge") +var BookA = Icon("book-a") +var BookAudio = Icon("book-audio") +var BookCheck = Icon("book-check") +var BookCopy = Icon("book-copy") +var BookDashed = Icon("book-dashed") +var BookDown = Icon("book-down") +var BookHeadphones = Icon("book-headphones") +var BookHeart = Icon("book-heart") +var BookImage = Icon("book-image") +var BookKey = Icon("book-key") +var BookLock = Icon("book-lock") +var BookMarked = Icon("book-marked") +var BookMinus = Icon("book-minus") +var BookOpenCheck = Icon("book-open-check") +var BookOpenText = Icon("book-open-text") +var BookOpen = Icon("book-open") +var AArrowUp = Icon("a-arrow-up") +var Bomb = Icon("bomb") +var BellElectric = Icon("bell-electric") +var BellMinus = Icon("bell-minus") +var BellOff = Icon("bell-off") +var BugPlay = Icon("bug-play") +var BrainCog = Icon("brain-cog") +var Brain = Icon("brain") +var BrickWallFire = Icon("brick-wall-fire") +var BrickWall = Icon("brick-wall") +var BriefcaseBusiness = Icon("briefcase-business") +var BaggageClaim = Icon("baggage-claim") +var Ban = Icon("ban") +var Banana = Icon("banana") +var Bandage = Icon("bandage") +var BanknoteArrowDown = Icon("banknote-arrow-down") +var BanknoteArrowUp = Icon("banknote-arrow-up") +var BanknoteX = Icon("banknote-x") +var Banknote = Icon("banknote") +var Barcode = Icon("barcode") +var Baseline = Icon("baseline") +var BookUp = Icon("book-up") +var BriefcaseConveyorBelt = Icon("briefcase-conveyor-belt") +var BookUser = Icon("book-user") +var BookPlus = Icon("book-plus") +var BookX = Icon("book-x") +var Book = Icon("book") +var BookmarkCheck = Icon("bookmark-check") +var BriefcaseMedical = Icon("briefcase-medical") +var BellPlus = Icon("bell-plus") +var CalendarSearch = Icon("calendar-search") +var Bug = Icon("bug") +var Building2 = Icon("building-2") +var Building = Icon("building") +var BusFront = Icon("bus-front") +var Bus = Icon("bus") +var CableCar = Icon("cable-car") +var Cable = Icon("cable") +var CakeSlice = Icon("cake-slice") +var Cake = Icon("cake") +var Calculator = Icon("calculator") +var Calendar1 = Icon("calendar-1") +var CalendarArrowDown = Icon("calendar-arrow-down") +var CalendarArrowUp = Icon("calendar-arrow-up") +var CalendarCheck2 = Icon("calendar-check-2") +var CalendarCheck = Icon("calendar-check") +var Bath = Icon("bath") +var BookText = Icon("book-text") +var BookType = Icon("book-type") +var BookUp2 = Icon("book-up-2") +var BatteryCharging = Icon("battery-charging") +var BatteryFull = Icon("battery-full") +var BatteryLow = Icon("battery-low") +var BatteryMedium = Icon("battery-medium") +var BrushCleaning = Icon("brush-cleaning") +var BatteryPlus = Icon("battery-plus") +var Briefcase = Icon("briefcase") +var BringToFront = Icon("bring-to-front") +var Box = Icon("box") +var Brush = Icon("brush") +var Bubbles = Icon("bubbles") +var BugOff = Icon("bug-off") +var Bird = Icon("bird") +var Bell = Icon("bell") +var BetweenHorizontalEnd = Icon("between-horizontal-end") +var BetweenHorizontalStart = Icon("between-horizontal-start") +var BetweenVerticalEnd = Icon("between-vertical-end") +var BetweenVerticalStart = Icon("between-vertical-start") +var BotOff = Icon("bot-off") +var BookmarkPlus = Icon("bookmark-plus") +var BookmarkX = Icon("bookmark-x") +var Bookmark = Icon("bookmark") +var BoomBox = Icon("boom-box") +var BotMessageSquare = Icon("bot-message-square") +var BluetoothConnected = Icon("bluetooth-connected") +var Bitcoin = Icon("bitcoin") +var Blend = Icon("blend") +var Blinds = Icon("blinds") +var Blocks = Icon("blocks") +var Bluetooth = Icon("bluetooth") +var BluetoothOff = Icon("bluetooth-off") +var BluetoothSearching = Icon("bluetooth-searching") +var BowArrow = Icon("bow-arrow") +var Binary = Icon("binary") +var Bike = Icon("bike") +var Braces = Icon("braces") +var Boxes = Icon("boxes") +var BedDouble = Icon("bed-double") +var Battery = Icon("battery") +var Beaker = Icon("beaker") +var BeanOff = Icon("bean-off") +var Bean = Icon("bean") +var Beef = Icon("beef") +var BedSingle = Icon("bed-single") +var Bed = Icon("bed") +var BicepsFlexed = Icon("biceps-flexed") +var CalendarMinus2 = Icon("calendar-minus-2") +var CalendarCog = Icon("calendar-cog") +var CalendarDays = Icon("calendar-days") +var CalendarFold = Icon("calendar-fold") +var CalendarHeart = Icon("calendar-heart") +var BeerOff = Icon("beer-off") +var Bold = Icon("bold") +var Binoculars = Icon("binoculars") +var Brackets = Icon("brackets") +var Beer = Icon("beer") +var CalendarPlus2 = Icon("calendar-plus-2") +var CalendarMinus = Icon("calendar-minus") +var CalendarOff = Icon("calendar-off") +var CalendarPlus = Icon("calendar-plus") +var Biohazard = Icon("biohazard") +var Bolt = Icon("bolt") +var CalendarRange = Icon("calendar-range") +var CalendarClock = Icon("calendar-clock") +var BrainCircuit = Icon("brain-circuit") +var Bot = Icon("bot") +var BellRing = Icon("bell-ring") +var BatteryWarning = Icon("battery-warning") +var CalendarSync = Icon("calendar-sync") +var CalendarX2 = Icon("calendar-x-2") +var Cannabis = Icon("cannabis") +var CalendarX = Icon("calendar-x") +var Carrot = Icon("carrot") +var CaptionsOff = Icon("captions-off") +var Captions = Icon("captions") +var CarFront = Icon("car-front") +var CarTaxiFront = Icon("car-taxi-front") +var Car = Icon("car") +var Caravan = Icon("caravan") +var Cat = Icon("cat") +var CaseLower = Icon("case-lower") +var CaseSensitive = Icon("case-sensitive") +var CaseUpper = Icon("case-upper") +var CassetteTape = Icon("cassette-tape") +var Cast = Icon("cast") +var Castle = Icon("castle") +var ChartBar = Icon("chart-bar") +var Cctv = Icon("cctv") +var ChartArea = Icon("chart-area") +var ChartBarBig = Icon("chart-bar-big") +var ChartBarDecreasing = Icon("chart-bar-decreasing") +var ChartBarIncreasing = Icon("chart-bar-increasing") +var ChartBarStacked = Icon("chart-bar-stacked") +var ChartColumnIncreasing = Icon("chart-column-increasing") +var ChartColumnDecreasing = Icon("chart-column-decreasing") +var ChartNoAxesColumnDecreasing = Icon("chart-no-axes-column-decreasing") +var ChartColumnStacked = Icon("chart-column-stacked") +var ChartColumn = Icon("chart-column") +var ChartGantt = Icon("chart-gantt") +var ChartLine = Icon("chart-line") +var ChartNetwork = Icon("chart-network") +var ChartScatter = Icon("chart-scatter") +var ChartNoAxesColumnIncreasing = Icon("chart-no-axes-column-increasing") +var ChartNoAxesColumn = Icon("chart-no-axes-column") +var ChartNoAxesCombined = Icon("chart-no-axes-combined") +var ChartNoAxesGantt = Icon("chart-no-axes-gantt") +var ChartPie = Icon("chart-pie") +var CandyCane = Icon("candy-cane") +var Camera = Icon("camera") +var ChartColumnBig = Icon("chart-column-big") +var ChartCandlestick = Icon("chart-candlestick") +var CandyOff = Icon("candy-off") +var ChevronDown = Icon("chevron-down") +var Cherry = Icon("cherry") +var CameraOff = Icon("camera-off") +var CheckCheck = Icon("check-check") +var ChartSpline = Icon("chart-spline") +var Check = Icon("check") +var ChevronLast = Icon("chevron-last") +var Candy = Icon("candy") +var Calendar = Icon("calendar") +var ChevronUp = Icon("chevron-up") +var ChevronLeft = Icon("chevron-left") +var ChevronRight = Icon("chevron-right") +var ChevronsDown = Icon("chevrons-down") +var ChevronsDownUp = Icon("chevrons-down-up") +var CircleArrowOutDownLeft = Icon("circle-arrow-out-down-left") +var ChevronsLeft = Icon("chevrons-left") +var ChevronsRightLeft = Icon("chevrons-right-left") +var ChevronsRight = Icon("chevrons-right") +var ChevronsUpDown = Icon("chevrons-up-down") +var ChevronsUp = Icon("chevrons-up") +var Chrome = Icon("chrome") +var Church = Icon("church") +var CigaretteOff = Icon("cigarette-off") +var Cigarette = Icon("cigarette") +var CircleAlert = Icon("circle-alert") +var CircleArrowDown = Icon("circle-arrow-down") +var CircleArrowLeft = Icon("circle-arrow-left") +var ChevronsLeftRightEllipsis = Icon("chevrons-left-right-ellipsis") +var CircleSlash = Icon("circle-slash") +var CircleArrowOutDownRight = Icon("circle-arrow-out-down-right") +var CircleArrowOutUpLeft = Icon("circle-arrow-out-up-left") +var CircleArrowOutUpRight = Icon("circle-arrow-out-up-right") +var CircleArrowRight = Icon("circle-arrow-right") +var CircleArrowUp = Icon("circle-arrow-up") +var CircleCheckBig = Icon("circle-check-big") +var CircleCheck = Icon("circle-check") +var CircleChevronDown = Icon("circle-chevron-down") +var CircleChevronLeft = Icon("circle-chevron-left") +var CircleChevronRight = Icon("circle-chevron-right") +var CircleChevronUp = Icon("circle-chevron-up") +var CircleDashed = Icon("circle-dashed") +var CircleDivide = Icon("circle-divide") +var CircleDollarSign = Icon("circle-dollar-sign") +var CircleDotDashed = Icon("circle-dot-dashed") +var CircleDot = Icon("circle-dot") +var CircleEqual = Icon("circle-equal") +var CircleEllipsis = Icon("circle-ellipsis") +var CircleFadingArrowUp = Icon("circle-fading-arrow-up") +var CircleFadingPlus = Icon("circle-fading-plus") +var CircleGauge = Icon("circle-gauge") +var CircleHelp = Icon("circle-help") +var CircleMinus = Icon("circle-minus") +var CircleOff = Icon("circle-off") +var ChevronsLeftRight = Icon("chevrons-left-right") +var CirclePlay = Icon("circle-play") +var CircleParking = Icon("circle-parking") +var CirclePause = Icon("circle-pause") +var CirclePercent = Icon("circle-percent") +var Clock7 = Icon("clock-7") +var CircleSmall = Icon("circle-small") +var CircleStop = Icon("circle-stop") +var CircleUserRound = Icon("circle-user-round") +var CircleUser = Icon("circle-user") +var CircleX = Icon("circle-x") +var Circle = Icon("circle") +var CircuitBoard = Icon("circuit-board") +var Citrus = Icon("citrus") +var Clapperboard = Icon("clapperboard") +var ClipboardCheck = Icon("clipboard-check") +var ClipboardCopy = Icon("clipboard-copy") +var ClipboardList = Icon("clipboard-list") +var ClipboardMinus = Icon("clipboard-minus") +var CircleSlash2 = Icon("circle-slash-2") +var Clock10 = Icon("clock-10") +var Clock11 = Icon("clock-11") +var Clock12 = Icon("clock-12") +var Clock2 = Icon("clock-2") +var Clock3 = Icon("clock-3") +var Clock4 = Icon("clock-4") +var Clock5 = Icon("clock-5") +var Clock6 = Icon("clock-6") +var ClockPlus = Icon("clock-plus") +var Clock8 = Icon("clock-8") +var Clock9 = Icon("clock-9") +var ClockAlert = Icon("clock-alert") +var ClockArrowDown = Icon("clock-arrow-down") +var ClockArrowUp = Icon("clock-arrow-up") +var ClockFading = Icon("clock-fading") +var CloudDownload = Icon("cloud-download") +var Clock = Icon("clock") +var CloudAlert = Icon("cloud-alert") +var CloudCog = Icon("cloud-cog") +var Cloudy = Icon("cloudy") +var CircleParkingOff = Icon("circle-parking-off") +var CloudFog = Icon("cloud-fog") +var CloudDrizzle = Icon("cloud-drizzle") +var CirclePlus = Icon("circle-plus") +var Coffee = Icon("coffee") +var Clover = Icon("clover") +var Club = Icon("club") +var CodeXml = Icon("code-xml") +var Code = Icon("code") +var Codepen = Icon("codepen") +var Codesandbox = Icon("codesandbox") +var ClipboardPlus = Icon("clipboard-plus") +var CloudMoonRain = Icon("cloud-moon-rain") +var CloudMoon = Icon("cloud-moon") +var CloudOff = Icon("cloud-off") +var CloudRainWind = Icon("cloud-rain-wind") +var CloudRain = Icon("cloud-rain") +var CloudSnow = Icon("cloud-snow") +var CloudSunRain = Icon("cloud-sun-rain") +var CloudSun = Icon("cloud-sun") +var CloudUpload = Icon("cloud-upload") +var Cloud = Icon("cloud") +var ClipboardPenLine = Icon("clipboard-pen-line") +var ClipboardPen = Icon("clipboard-pen") +var CloudHail = Icon("cloud-hail") +var Cookie = Icon("cookie") +var ClipboardPaste = Icon("clipboard-paste") +var ClipboardX = Icon("clipboard-x") +var ClipboardType = Icon("clipboard-type") +var Component = Icon("component") +var Coins = Icon("coins") +var Columns2 = Icon("columns-2") +var Columns3Cog = Icon("columns-3-cog") +var Columns3 = Icon("columns-3") +var Columns4 = Icon("columns-4") +var Combine = Icon("combine") +var Command = Icon("command") +var Compass = Icon("compass") +var Clipboard = Icon("clipboard") +var CupSoda = Icon("cup-soda") +var CookingPot = Icon("cooking-pot") +var CopyCheck = Icon("copy-check") +var CopyMinus = Icon("copy-minus") +var CopyPlus = Icon("copy-plus") +var CopySlash = Icon("copy-slash") +var CopyX = Icon("copy-x") +var Copy = Icon("copy") +var Copyleft = Icon("copyleft") +var Copyright = Icon("copyright") +var CornerDownLeft = Icon("corner-down-left") +var CornerDownRight = Icon("corner-down-right") +var CornerLeftDown = Icon("corner-left-down") +var CornerLeftUp = Icon("corner-left-up") +var CornerRightDown = Icon("corner-right-down") +var CornerRightUp = Icon("corner-right-up") +var CornerUpLeft = Icon("corner-up-left") +var CornerUpRight = Icon("corner-up-right") +var Cpu = Icon("cpu") +var CreativeCommons = Icon("creative-commons") +var CreditCard = Icon("credit-card") +var Croissant = Icon("croissant") +var Crop = Icon("crop") +var Cross = Icon("cross") +var Cog = Icon("cog") +var Computer = Icon("computer") +var ConciergeBell = Icon("concierge-bell") +var Cone = Icon("cone") +var Construction = Icon("construction") +var ContactRound = Icon("contact-round") +var Contact = Icon("contact") +var Container = Icon("container") +var Contrast = Icon("contrast") +var Crown = Icon("crown") +var Cuboid = Icon("cuboid") +var Egg = Icon("egg") +var Currency = Icon("currency") +var Cylinder = Icon("cylinder") +var Dam = Icon("dam") +var DatabaseBackup = Icon("database-backup") +var DatabaseZap = Icon("database-zap") +var Database = Icon("database") +var DecimalsArrowLeft = Icon("decimals-arrow-left") +var DecimalsArrowRight = Icon("decimals-arrow-right") +var Delete = Icon("delete") +var Dessert = Icon("dessert") +var Diameter = Icon("diameter") +var DiamondMinus = Icon("diamond-minus") +var DiamondPercent = Icon("diamond-percent") +var DiamondPlus = Icon("diamond-plus") +var Diamond = Icon("diamond") +var Dice1 = Icon("dice-1") +var Dice2 = Icon("dice-2") +var Dice3 = Icon("dice-3") +var Dice4 = Icon("dice-4") +var Dice5 = Icon("dice-5") +var Dice6 = Icon("dice-6") +var Dices = Icon("dices") +var Diff = Icon("diff") +var Disc2 = Icon("disc-2") +var Disc3 = Icon("disc-3") +var DiscAlbum = Icon("disc-album") +var Disc = Icon("disc") +var Divide = Icon("divide") +var DnaOff = Icon("dna-off") +var ChefHat = Icon("chef-hat") +var Drill = Icon("drill") +var Dock = Icon("dock") +var Dog = Icon("dog") +var DollarSign = Icon("dollar-sign") +var Donut = Icon("donut") +var DoorClosedLocked = Icon("door-closed-locked") +var DoorClosed = Icon("door-closed") +var Dna = Icon("dna") +var DoorOpen = Icon("door-open") +var Dot = Icon("dot") +var Download = Icon("download") +var DraftingCompass = Icon("drafting-compass") +var Drama = Icon("drama") +var Dribbble = Icon("dribbble") +var DropletOff = Icon("droplet-off") +var EarOff = Icon("ear-off") +var Ear = Icon("ear") +var EarthLock = Icon("earth-lock") +var Earth = Icon("earth") +var Eclipse = Icon("eclipse") +var EggFried = Icon("egg-fried") +var EggOff = Icon("egg-off") +var Drum = Icon("drum") +var Droplets = Icon("droplets") +var Drumstick = Icon("drumstick") +var Crosshair = Icon("crosshair") +var FileOutput = Icon("file-output") +var FileBox = Icon("file-box") +var FileBadge = Icon("file-badge") +var FileChartColumnIncreasing = Icon("file-chart-column-increasing") +var FileChartColumn = Icon("file-chart-column") +var FileChartLine = Icon("file-chart-line") +var FileChartPie = Icon("file-chart-pie") +var FileCheck2 = Icon("file-check-2") +var FileCheck = Icon("file-check") +var FileClock = Icon("file-clock") +var FileCode2 = Icon("file-code-2") +var FileCode = Icon("file-code") +var FileCog = Icon("file-cog") +var FileDiff = Icon("file-diff") +var FileDigit = Icon("file-digit") +var FileDown = Icon("file-down") +var FileHeart = Icon("file-heart") +var FileImage = Icon("file-image") +var FileInput = Icon("file-input") +var FileJson2 = Icon("file-json-2") +var FileJson = Icon("file-json") +var FileKey2 = Icon("file-key-2") +var FileKey = Icon("file-key") +var FileLock2 = Icon("file-lock-2") +var FileLock = Icon("file-lock") +var FileMinus2 = Icon("file-minus-2") +var FileMinus = Icon("file-minus") +var FileMusic = Icon("file-music") +var Facebook = Icon("facebook") +var Ellipsis = Icon("ellipsis") +var EqualApproximately = Icon("equal-approximately") +var EqualNot = Icon("equal-not") +var Equal = Icon("equal") +var Eraser = Icon("eraser") +var EthernetPort = Icon("ethernet-port") +var Euro = Icon("euro") +var Expand = Icon("expand") +var ExternalLink = Icon("external-link") +var EyeClosed = Icon("eye-closed") +var EyeOff = Icon("eye-off") +var Eye = Icon("eye") +var FerrisWheel = Icon("ferris-wheel") +var Factory = Icon("factory") +var Fan = Icon("fan") +var FastForward = Icon("fast-forward") +var Feather = Icon("feather") +var Fence = Icon("fence") +var Dumbbell = Icon("dumbbell") +var FolderDown = Icon("folder-down") +var FilePenLine = Icon("file-pen-line") +var FilePen = Icon("file-pen") +var FilePlus2 = Icon("file-plus-2") +var FilePlus = Icon("file-plus") +var FileQuestion = Icon("file-question") +var FileScan = Icon("file-scan") +var FileSearch2 = Icon("file-search-2") +var FileSearch = Icon("file-search") +var FileSliders = Icon("file-sliders") +var FileSpreadsheet = Icon("file-spreadsheet") +var FileStack = Icon("file-stack") +var FileSymlink = Icon("file-symlink") +var FileTerminal = Icon("file-terminal") +var Droplet = Icon("droplet") +var Flag = Icon("flag") +var FileType2 = Icon("file-type-2") +var FileType = Icon("file-type") +var FileUp = Icon("file-up") +var FileUser = Icon("file-user") +var FileVideo2 = Icon("file-video-2") +var FileVideo = Icon("file-video") +var FileVolume2 = Icon("file-volume-2") +var FileVolume = Icon("file-volume") +var FileText = Icon("file-text") +var FlameKindling = Icon("flame-kindling") +var Flame = Icon("flame") +var FlashlightOff = Icon("flashlight-off") +var FileWarning = Icon("file-warning") +var Flashlight = Icon("flashlight") +var FlaskConicalOff = Icon("flask-conical-off") +var FlaskConical = Icon("flask-conical") +var FlaskRound = Icon("flask-round") +var FlipHorizontal2 = Icon("flip-horizontal-2") +var FlipHorizontal = Icon("flip-horizontal") +var FlipVertical2 = Icon("flip-vertical-2") +var FlipVertical = Icon("flip-vertical") +var Flower2 = Icon("flower-2") +var Flower = Icon("flower") +var Focus = Icon("focus") +var FoldHorizontal = Icon("fold-horizontal") +var FoldVertical = Icon("fold-vertical") +var FolderArchive = Icon("folder-archive") +var FolderCheck = Icon("folder-check") +var FolderClock = Icon("folder-clock") +var EllipsisVertical = Icon("ellipsis-vertical") +var Figma = Icon("figma") +var FileArchive = Icon("file-archive") +var FileAudio2 = Icon("file-audio-2") +var FileAudio = Icon("file-audio") +var FileAxis3d = Icon("file-axis-3d") +var FileBadge2 = Icon("file-badge-2") +var FileX2 = Icon("file-x-2") +var FishOff = Icon("fish-off") +var FishSymbol = Icon("fish-symbol") +var Fish = Icon("fish") +var FlagOff = Icon("flag-off") +var FlagTriangleLeft = Icon("flag-triangle-left") +var FlagTriangleRight = Icon("flag-triangle-right") +var Files = Icon("files") +var FileX = Icon("file-x") +var File = Icon("file") +var Film = Icon("film") +var Fingerprint = Icon("fingerprint") +var FolderCog = Icon("folder-cog") +var FolderCode = Icon("folder-code") +var Grid3x3 = Icon("grid-3x3") +var FolderGit2 = Icon("folder-git-2") +var FolderGit = Icon("folder-git") +var FolderHeart = Icon("folder-heart") +var FolderInput = Icon("folder-input") +var FolderKanban = Icon("folder-kanban") +var FolderKey = Icon("folder-key") +var FolderLock = Icon("folder-lock") +var FireExtinguisher = Icon("fire-extinguisher") +var FolderDot = Icon("folder-dot") +var History = Icon("history") +var GripHorizontal = Icon("grip-horizontal") +var GripVertical = Icon("grip-vertical") +var Grip = Icon("grip") +var Group = Icon("group") +var Guitar = Icon("guitar") +var FolderMinus = Icon("folder-minus") +var Ham = Icon("ham") +var Hamburger = Icon("hamburger") +var Hammer = Icon("hammer") +var HandCoins = Icon("hand-coins") +var HandHeart = Icon("hand-heart") +var HandHelping = Icon("hand-helping") +var HandMetal = Icon("hand-metal") +var FolderOpenDot = Icon("folder-open-dot") +var HandPlatter = Icon("hand-platter") +var FolderOpen = Icon("folder-open") +var Hand = Icon("hand") +var Handshake = Icon("handshake") +var HardDriveDownload = Icon("hard-drive-download") +var HardDriveUpload = Icon("hard-drive-upload") +var HardDrive = Icon("hard-drive") +var HardHat = Icon("hard-hat") +var Hash = Icon("hash") +var Haze = Icon("haze") +var HdmiPort = Icon("hdmi-port") +var FolderOutput = Icon("folder-output") +var Heading1 = Icon("heading-1") +var FolderPen = Icon("folder-pen") +var FolderPlus = Icon("folder-plus") +var FolderRoot = Icon("folder-root") +var FolderSearch2 = Icon("folder-search-2") +var FolderSearch = Icon("folder-search") +var Heading2 = Icon("heading-2") +var Heading3 = Icon("heading-3") +var Heading4 = Icon("heading-4") +var Heading5 = Icon("heading-5") +var Heading6 = Icon("heading-6") +var Heading = Icon("heading") +var HeadphoneOff = Icon("headphone-off") +var Headphones = Icon("headphones") +var Headset = Icon("headset") +var HeartCrack = Icon("heart-crack") +var HeartHandshake = Icon("heart-handshake") +var HeartMinus = Icon("heart-minus") +var HeartOff = Icon("heart-off") +var HeartPlus = Icon("heart-plus") +var HeartPulse = Icon("heart-pulse") +var Heart = Icon("heart") +var FolderClosed = Icon("folder-closed") +var CirclePower = Icon("circle-power") +var Hexagon = Icon("hexagon") +var Keyboard = Icon("keyboard") +var HopOff = Icon("hop-off") +var Hop = Icon("hop") +var Hospital = Icon("hospital") +var Hotel = Icon("hotel") +var FolderSymlink = Icon("folder-symlink") +var FolderSync = Icon("folder-sync") +var FolderTree = Icon("folder-tree") +var FolderUp = Icon("folder-up") +var FolderX = Icon("folder-x") +var Folder = Icon("folder") +var Folders = Icon("folders") +var Footprints = Icon("footprints") +var Forklift = Icon("forklift") +var Forward = Icon("forward") +var Frame = Icon("frame") +var Framer = Icon("framer") +var Frown = Icon("frown") +var Fuel = Icon("fuel") +var Fullscreen = Icon("fullscreen") +var FunnelPlus = Icon("funnel-plus") +var FunnelX = Icon("funnel-x") +var Funnel = Icon("funnel") +var GalleryHorizontalEnd = Icon("gallery-horizontal-end") +var GalleryHorizontal = Icon("gallery-horizontal") +var GalleryThumbnails = Icon("gallery-thumbnails") +var GalleryVerticalEnd = Icon("gallery-vertical-end") +var GalleryVertical = Icon("gallery-vertical") +var Gamepad2 = Icon("gamepad-2") +var Gamepad = Icon("gamepad") +var Gauge = Icon("gauge") +var Gavel = Icon("gavel") +var Gem = Icon("gem") +var Ghost = Icon("ghost") +var Gift = Icon("gift") +var GitBranchPlus = Icon("git-branch-plus") +var GitBranch = Icon("git-branch") +var GitCommitHorizontal = Icon("git-commit-horizontal") +var GitCommitVertical = Icon("git-commit-vertical") +var GitCompareArrows = Icon("git-compare-arrows") +var GitCompare = Icon("git-compare") +var GitFork = Icon("git-fork") +var GitGraph = Icon("git-graph") +var GitMerge = Icon("git-merge") +var GitPullRequestArrow = Icon("git-pull-request-arrow") +var GitPullRequestClosed = Icon("git-pull-request-closed") +var GitPullRequestCreateArrow = Icon("git-pull-request-create-arrow") +var GitPullRequestCreate = Icon("git-pull-request-create") +var GitPullRequestDraft = Icon("git-pull-request-draft") +var GitPullRequest = Icon("git-pull-request") +var Github = Icon("github") +var Gitlab = Icon("gitlab") +var GlassWater = Icon("glass-water") +var Glasses = Icon("glasses") +var GlobeLock = Icon("globe-lock") +var Globe = Icon("globe") +var Goal = Icon("goal") +var Grab = Icon("grab") +var GraduationCap = Icon("graduation-cap") +var Grape = Icon("grape") +var Grid2x2Check = Icon("grid-2x2-check") +var Grid2x2Plus = Icon("grid-2x2-plus") +var Grid2x2X = Icon("grid-2x2-x") +var Grid2x2 = Icon("grid-2x2") +var Inbox = Icon("inbox") +var HousePlug = Icon("house-plug") +var HousePlus = Icon("house-plus") +var HouseWifi = Icon("house-wifi") +var House = Icon("house") +var IceCreamBowl = Icon("ice-cream-bowl") +var IceCreamCone = Icon("ice-cream-cone") +var IdCard = Icon("id-card") +var Hourglass = Icon("hourglass") +var IndentDecrease = Icon("indent-decrease") +var IndentIncrease = Icon("indent-increase") +var IndianRupee = Icon("indian-rupee") +var Infinity = Icon("infinity") +var Info = Icon("info") +var InspectionPanel = Icon("inspection-panel") +var Instagram = Icon("instagram") +var Italic = Icon("italic") +var IterationCcw = Icon("iteration-ccw") +var IterationCw = Icon("iteration-cw") +var JapaneseYen = Icon("japanese-yen") +var Joystick = Icon("joystick") +var Kanban = Icon("kanban") +var KeyRound = Icon("key-round") +var KeySquare = Icon("key-square") +var Key = Icon("key") +var KeyboardMusic = Icon("keyboard-music") +var KeyboardOff = Icon("keyboard-off") +var ImageDown = Icon("image-down") +var ImageUpscale = Icon("image-upscale") +var Image = Icon("image") +var Images = Icon("images") +var Import = Icon("import") +var ImageOff = Icon("image-off") +var ImageMinus = Icon("image-minus") +var Mailbox = Icon("mailbox") +var LampCeiling = Icon("lamp-ceiling") +var ImageUp = Icon("image-up") +var ImagePlay = Icon("image-play") +var ImagePlus = Icon("image-plus") +var ListEnd = Icon("list-end") +var LampFloor = Icon("lamp-floor") +var LampWallDown = Icon("lamp-wall-down") +var LampWallUp = Icon("lamp-wall-up") +var Lamp = Icon("lamp") +var LandPlot = Icon("land-plot") +var Landmark = Icon("landmark") +var Languages = Icon("languages") +var LaptopMinimalCheck = Icon("laptop-minimal-check") +var LaptopMinimal = Icon("laptop-minimal") +var Laptop = Icon("laptop") +var LassoSelect = Icon("lasso-select") +var LampDesk = Icon("lamp-desk") +var ListFilterPlus = Icon("list-filter-plus") +var ListFilter = Icon("list-filter") +var ListMinus = Icon("list-minus") +var ListMusic = Icon("list-music") +var ListOrdered = Icon("list-ordered") +var ListPlus = Icon("list-plus") +var ListRestart = Icon("list-restart") +var ListStart = Icon("list-start") +var ListTodo = Icon("list-todo") +var ListTree = Icon("list-tree") +var ListVideo = Icon("list-video") +var ListX = Icon("list-x") +var List = Icon("list") +var LoaderCircle = Icon("loader-circle") +var LoaderPinwheel = Icon("loader-pinwheel") +var Loader = Icon("loader") +var LocateFixed = Icon("locate-fixed") +var LocateOff = Icon("locate-off") +var Locate = Icon("locate") +var Lasso = Icon("lasso") +var Laugh = Icon("laugh") +var Layers2 = Icon("layers-2") +var Layers = Icon("layers") +var LayoutDashboard = Icon("layout-dashboard") +var LayoutGrid = Icon("layout-grid") +var LayoutList = Icon("layout-list") +var LayoutPanelLeft = Icon("layout-panel-left") +var LayoutPanelTop = Icon("layout-panel-top") +var LayoutTemplate = Icon("layout-template") +var Leaf = Icon("leaf") +var LeafyGreen = Icon("leafy-green") +var Lectern = Icon("lectern") +var LetterText = Icon("letter-text") +var LibraryBig = Icon("library-big") +var LocationEdit = Icon("location-edit") +var LockKeyholeOpen = Icon("lock-keyhole-open") +var LockKeyhole = Icon("lock-keyhole") +var LockOpen = Icon("lock-open") +var Lock = Icon("lock") +var LogIn = Icon("log-in") +var LogOut = Icon("log-out") +var Logs = Icon("logs") +var Lollipop = Icon("lollipop") +var Luggage = Icon("luggage") +var Magnet = Icon("magnet") +var MailCheck = Icon("mail-check") +var MailMinus = Icon("mail-minus") +var MailOpen = Icon("mail-open") +var MailPlus = Icon("mail-plus") +var MailQuestion = Icon("mail-question") +var Library = Icon("library") +var LifeBuoy = Icon("life-buoy") +var Ligature = Icon("ligature") +var LightbulbOff = Icon("lightbulb-off") +var Lightbulb = Icon("lightbulb") +var Link2Off = Icon("link-2-off") +var Link2 = Icon("link-2") +var Link = Icon("link") +var Linkedin = Icon("linkedin") +var ListCheck = Icon("list-check") +var ListChecks = Icon("list-checks") +var ListCollapse = Icon("list-collapse") +var MailX = Icon("mail-x") +var MailWarning = Icon("mail-warning") +var Mail = Icon("mail") +var MoveLeft = Icon("move-left") +var MailSearch = Icon("mail-search") +var PanelBottomDashed = Icon("panel-bottom-dashed") +var MoveRight = Icon("move-right") +var MoveUpLeft = Icon("move-up-left") +var MoveUpRight = Icon("move-up-right") +var MoveUp = Icon("move-up") +var MoveVertical = Icon("move-vertical") +var Move = Icon("move") +var Music2 = Icon("music-2") +var Music3 = Icon("music-3") +var Music4 = Icon("music-4") +var Music = Icon("music") +var Navigation2Off = Icon("navigation-2-off") +var Mails = Icon("mails") +var MapPinCheckInside = Icon("map-pin-check-inside") +var MapPinCheck = Icon("map-pin-check") +var MapPinHouse = Icon("map-pin-house") +var MapPinMinusInside = Icon("map-pin-minus-inside") +var MapPinMinus = Icon("map-pin-minus") +var MapPinOff = Icon("map-pin-off") +var MapPinPlusInside = Icon("map-pin-plus-inside") +var MapPinPlus = Icon("map-pin-plus") +var MapPinXInside = Icon("map-pin-x-inside") +var MapPinX = Icon("map-pin-x") +var MapPin = Icon("map-pin") +var MapPinned = Icon("map-pinned") +var MapPlus = Icon("map-plus") +var Map = Icon("map") +var MarsStroke = Icon("mars-stroke") +var Mars = Icon("mars") +var Martini = Icon("martini") +var Maximize2 = Icon("maximize-2") +var Maximize = Icon("maximize") +var Medal = Icon("medal") +var MegaphoneOff = Icon("megaphone-off") +var Megaphone = Icon("megaphone") +var Meh = Icon("meh") +var MemoryStick = Icon("memory-stick") +var Menu = Icon("menu") +var Merge = Icon("merge") +var MessageCircleCode = Icon("message-circle-code") +var MessageCircleDashed = Icon("message-circle-dashed") +var MessageCircleHeart = Icon("message-circle-heart") +var MessageCircleMore = Icon("message-circle-more") +var MessageCircleOff = Icon("message-circle-off") +var MessageCirclePlus = Icon("message-circle-plus") +var MessageCircleQuestion = Icon("message-circle-question") +var MessageCircleReply = Icon("message-circle-reply") +var MessageCircleWarning = Icon("message-circle-warning") +var MessageCircleX = Icon("message-circle-x") +var MessageCircle = Icon("message-circle") +var MessageSquareCode = Icon("message-square-code") +var MessageSquareDashed = Icon("message-square-dashed") +var MessageSquareDiff = Icon("message-square-diff") +var MessageSquareDot = Icon("message-square-dot") +var MessageSquareHeart = Icon("message-square-heart") +var MessageSquareLock = Icon("message-square-lock") +var MessageSquareMore = Icon("message-square-more") +var MessageSquareOff = Icon("message-square-off") +var MessageSquarePlus = Icon("message-square-plus") +var MessageSquareQuote = Icon("message-square-quote") +var MessageSquareReply = Icon("message-square-reply") +var MessageSquareShare = Icon("message-square-share") +var MessageSquareText = Icon("message-square-text") +var MessageSquareWarning = Icon("message-square-warning") +var MessageSquareX = Icon("message-square-x") +var MessageSquare = Icon("message-square") +var MessagesSquare = Icon("messages-square") +var MicOff = Icon("mic-off") +var MicVocal = Icon("mic-vocal") +var Navigation2 = Icon("navigation-2") +var NavigationOff = Icon("navigation-off") +var Navigation = Icon("navigation") +var Network = Icon("network") +var Newspaper = Icon("newspaper") +var Nfc = Icon("nfc") +var NonBinary = Icon("non-binary") +var NotebookPen = Icon("notebook-pen") +var NotebookTabs = Icon("notebook-tabs") +var NotebookText = Icon("notebook-text") +var Notebook = Icon("notebook") +var NotepadTextDashed = Icon("notepad-text-dashed") +var NotepadText = Icon("notepad-text") +var NutOff = Icon("nut-off") +var Nut = Icon("nut") +var OctagonAlert = Icon("octagon-alert") +var OctagonMinus = Icon("octagon-minus") +var OctagonPause = Icon("octagon-pause") +var OctagonX = Icon("octagon-x") +var Octagon = Icon("octagon") +var Omega = Icon("omega") +var Option = Icon("option") +var Orbit = Icon("orbit") +var Origami = Icon("origami") +var Package2 = Icon("package-2") +var PackageCheck = Icon("package-check") +var PackageMinus = Icon("package-minus") +var PackageOpen = Icon("package-open") +var PackagePlus = Icon("package-plus") +var PackageSearch = Icon("package-search") +var PackageX = Icon("package-x") +var Package = Icon("package") +var PaintBucket = Icon("paint-bucket") +var PaintRoller = Icon("paint-roller") +var PaintbrushVertical = Icon("paintbrush-vertical") +var Paintbrush = Icon("paintbrush") +var Palette = Icon("palette") +var Panda = Icon("panda") +var PanelBottomClose = Icon("panel-bottom-close") +var Mic = Icon("mic") +var Pointer = Icon("pointer") +var PanelBottomOpen = Icon("panel-bottom-open") +var PanelBottom = Icon("panel-bottom") +var PanelLeftClose = Icon("panel-left-close") +var PanelLeftDashed = Icon("panel-left-dashed") +var PanelLeftOpen = Icon("panel-left-open") +var PanelLeft = Icon("panel-left") +var PanelRightClose = Icon("panel-right-close") +var PanelRightDashed = Icon("panel-right-dashed") +var PanelRightOpen = Icon("panel-right-open") +var PanelRight = Icon("panel-right") +var PanelTopClose = Icon("panel-top-close") +var PanelTopDashed = Icon("panel-top-dashed") +var PanelTopOpen = Icon("panel-top-open") +var PanelTop = Icon("panel-top") +var PanelsLeftBottom = Icon("panels-left-bottom") +var PanelsRightBottom = Icon("panels-right-bottom") +var PanelsTopLeft = Icon("panels-top-left") +var Paperclip = Icon("paperclip") +var Parentheses = Icon("parentheses") +var ParkingMeter = Icon("parking-meter") +var PartyPopper = Icon("party-popper") +var Pause = Icon("pause") +var PawPrint = Icon("paw-print") +var PcCase = Icon("pc-case") +var PenLine = Icon("pen-line") +var PenOff = Icon("pen-off") +var PenTool = Icon("pen-tool") +var Pen = Icon("pen") +var Highlighter = Icon("highlighter") +var PilcrowLeft = Icon("pilcrow-left") +var PencilOff = Icon("pencil-off") +var PencilRuler = Icon("pencil-ruler") +var Pencil = Icon("pencil") +var Pentagon = Icon("pentagon") +var Microchip = Icon("microchip") +var Microscope = Icon("microscope") +var Microwave = Icon("microwave") +var Milestone = Icon("milestone") +var MilkOff = Icon("milk-off") +var Milk = Icon("milk") +var Minimize2 = Icon("minimize-2") +var Minimize = Icon("minimize") +var Minus = Icon("minus") +var MonitorCheck = Icon("monitor-check") +var MonitorCog = Icon("monitor-cog") +var MonitorDot = Icon("monitor-dot") +var MonitorDown = Icon("monitor-down") +var MonitorOff = Icon("monitor-off") +var MonitorPause = Icon("monitor-pause") +var MonitorPlay = Icon("monitor-play") +var MonitorSmartphone = Icon("monitor-smartphone") +var MonitorSpeaker = Icon("monitor-speaker") +var Percent = Icon("percent") +var PersonStanding = Icon("person-standing") +var PhilippinePeso = Icon("philippine-peso") +var PhoneCall = Icon("phone-call") +var PhoneForwarded = Icon("phone-forwarded") +var PhoneIncoming = Icon("phone-incoming") +var PhoneMissed = Icon("phone-missed") +var PhoneOff = Icon("phone-off") +var PhoneOutgoing = Icon("phone-outgoing") +var Phone = Icon("phone") +var Pi = Icon("pi") +var Piano = Icon("piano") +var Pickaxe = Icon("pickaxe") +var PictureInPicture2 = Icon("picture-in-picture-2") +var PictureInPicture = Icon("picture-in-picture") +var PiggyBank = Icon("piggy-bank") +var PlaneTakeoff = Icon("plane-takeoff") +var PilcrowRight = Icon("pilcrow-right") +var Pilcrow = Icon("pilcrow") +var PillBottle = Icon("pill-bottle") +var Pill = Icon("pill") +var PinOff = Icon("pin-off") +var Pin = Icon("pin") +var Pipette = Icon("pipette") +var Pizza = Icon("pizza") +var PlaneLanding = Icon("plane-landing") +var RotateCcwKey = Icon("rotate-ccw-key") +var Popcorn = Icon("popcorn") +var Popsicle = Icon("popsicle") +var MonitorStop = Icon("monitor-stop") +var PoundSterling = Icon("pound-sterling") +var PowerOff = Icon("power-off") +var Power = Icon("power") +var Presentation = Icon("presentation") +var PrinterCheck = Icon("printer-check") +var MonitorUp = Icon("monitor-up") +var Printer = Icon("printer") +var MonitorX = Icon("monitor-x") +var Monitor = Icon("monitor") +var MoonStar = Icon("moon-star") +var Moon = Icon("moon") +var MountainSnow = Icon("mountain-snow") +var Mountain = Icon("mountain") +var MouseOff = Icon("mouse-off") +var MousePointer2 = Icon("mouse-pointer-2") +var Projector = Icon("projector") +var MousePointerBan = Icon("mouse-pointer-ban") +var MousePointerClick = Icon("mouse-pointer-click") +var MousePointer = Icon("mouse-pointer") +var Mouse = Icon("mouse") +var Move3d = Icon("move-3d") +var MoveDiagonal2 = Icon("move-diagonal-2") +var MoveDiagonal = Icon("move-diagonal") +var MoveDownLeft = Icon("move-down-left") +var MoveDownRight = Icon("move-down-right") +var MoveDown = Icon("move-down") +var MoveHorizontal = Icon("move-horizontal") +var RectangleGoggles = Icon("rectangle-goggles") +var Puzzle = Icon("puzzle") +var Pyramid = Icon("pyramid") +var QrCode = Icon("qr-code") +var Quote = Icon("quote") +var Rabbit = Icon("rabbit") +var Radar = Icon("radar") +var Radiation = Icon("radiation") +var Radical = Icon("radical") +var RadioReceiver = Icon("radio-receiver") +var RadioTower = Icon("radio-tower") +var Radio = Icon("radio") +var Radius = Icon("radius") +var RailSymbol = Icon("rail-symbol") +var Rainbow = Icon("rainbow") +var Rat = Icon("rat") +var Ratio = Icon("ratio") +var ReceiptCent = Icon("receipt-cent") +var ReceiptEuro = Icon("receipt-euro") +var ReceiptIndianRupee = Icon("receipt-indian-rupee") +var ReceiptJapaneseYen = Icon("receipt-japanese-yen") +var ReceiptPoundSterling = Icon("receipt-pound-sterling") +var ReceiptRussianRuble = Icon("receipt-russian-ruble") +var ReceiptSwissFranc = Icon("receipt-swiss-franc") +var ReceiptText = Icon("receipt-text") +var Receipt = Icon("receipt") +var RectangleEllipsis = Icon("rectangle-ellipsis") +var RemoveFormatting = Icon("remove-formatting") +var CloudLightning = Icon("cloud-lightning") +var Reply = Icon("reply") +var Repeat1 = Icon("repeat-1") +var Proportions = Icon("proportions") +var ChevronFirst = Icon("chevron-first") +var Plug = Icon("plug") +var Plane = Icon("plane") +var Play = Icon("play") +var Plug2 = Icon("plug-2") +var PlugZap = Icon("plug-zap") +var Shell = Icon("shell") +var RotateCcwSquare = Icon("rotate-ccw-square") +var RotateCcw = Icon("rotate-ccw") +var RotateCwSquare = Icon("rotate-cw-square") +var RotateCw = Icon("rotate-cw") +var RouteOff = Icon("route-off") +var Route = Icon("route") +var Router = Icon("router") +var Rows2 = Icon("rows-2") +var Rows3 = Icon("rows-3") +var Rows4 = Icon("rows-4") +var Rss = Icon("rss") +var RulerDimensionLine = Icon("ruler-dimension-line") +var Ruler = Icon("ruler") +var RussianRuble = Icon("russian-ruble") +var Sailboat = Icon("sailboat") +var Salad = Icon("salad") +var Sandwich = Icon("sandwich") +var SatelliteDish = Icon("satellite-dish") +var Satellite = Icon("satellite") +var SaudiRiyal = Icon("saudi-riyal") +var SaveAll = Icon("save-all") +var SaveOff = Icon("save-off") +var Save = Icon("save") +var Scale3d = Icon("scale-3d") +var Scale = Icon("scale") +var Scaling = Icon("scaling") +var ScanBarcode = Icon("scan-barcode") +var ScanEye = Icon("scan-eye") +var ScanFace = Icon("scan-face") +var ScanHeart = Icon("scan-heart") +var ScanLine = Icon("scan-line") +var ScanQrCode = Icon("scan-qr-code") +var ScanSearch = Icon("scan-search") +var ScanText = Icon("scan-text") +var Scan = Icon("scan") +var School = Icon("school") +var ScissorsLineDashed = Icon("scissors-line-dashed") +var Scissors = Icon("scissors") +var ScreenShareOff = Icon("screen-share-off") +var ScreenShare = Icon("screen-share") +var ScrollText = Icon("scroll-text") +var Scroll = Icon("scroll") +var SearchCheck = Icon("search-check") +var SearchCode = Icon("search-code") +var SearchSlash = Icon("search-slash") +var SearchX = Icon("search-x") +var Search = Icon("search") +var Section = Icon("section") +var SendHorizontal = Icon("send-horizontal") +var SendToBack = Icon("send-to-back") +var Send = Icon("send") +var SeparatorHorizontal = Icon("separator-horizontal") +var SeparatorVertical = Icon("separator-vertical") +var ServerCog = Icon("server-cog") +var ServerCrash = Icon("server-crash") +var ServerOff = Icon("server-off") +var Server = Icon("server") +var Settings2 = Icon("settings-2") +var Settings = Icon("settings") +var Shapes = Icon("shapes") +var Share2 = Icon("share-2") +var Share = Icon("share") +var Sheet = Icon("sheet") +var Clock1 = Icon("clock-1") +var RefreshCcwDot = Icon("refresh-ccw-dot") +var RectangleVertical = Icon("rectangle-vertical") +var Recycle = Icon("recycle") +var Redo2 = Icon("redo-2") +var RedoDot = Icon("redo-dot") +var Redo = Icon("redo") +var SquareArrowOutUpLeft = Icon("square-arrow-out-up-left") +var ShieldAlert = Icon("shield-alert") +var ShieldBan = Icon("shield-ban") +var ShieldCheck = Icon("shield-check") +var ShieldEllipsis = Icon("shield-ellipsis") +var ShieldHalf = Icon("shield-half") +var ShieldMinus = Icon("shield-minus") +var ShieldOff = Icon("shield-off") +var ShieldPlus = Icon("shield-plus") +var ShieldQuestion = Icon("shield-question") +var ShieldUser = Icon("shield-user") +var ShieldX = Icon("shield-x") +var Shield = Icon("shield") +var ShipWheel = Icon("ship-wheel") +var Ship = Icon("ship") +var Shirt = Icon("shirt") +var ShoppingBag = Icon("shopping-bag") +var ShoppingBasket = Icon("shopping-basket") +var ShoppingCart = Icon("shopping-cart") +var Shovel = Icon("shovel") +var ShowerHead = Icon("shower-head") +var Shredder = Icon("shredder") +var Shrimp = Icon("shrimp") +var Shrink = Icon("shrink") +var Shrub = Icon("shrub") +var Shuffle = Icon("shuffle") +var Sigma = Icon("sigma") +var SignalHigh = Icon("signal-high") +var SignalLow = Icon("signal-low") +var SignalMedium = Icon("signal-medium") +var SignalZero = Icon("signal-zero") +var Signal = Icon("signal") +var Signature = Icon("signature") +var SignpostBig = Icon("signpost-big") +var Signpost = Icon("signpost") +var Siren = Icon("siren") +var SkipBack = Icon("skip-back") +var SkipForward = Icon("skip-forward") +var Skull = Icon("skull") +var Slack = Icon("slack") +var Slash = Icon("slash") +var Slice = Icon("slice") +var SlidersHorizontal = Icon("sliders-horizontal") +var SlidersVertical = Icon("sliders-vertical") +var SmartphoneCharging = Icon("smartphone-charging") +var SmartphoneNfc = Icon("smartphone-nfc") +var Smartphone = Icon("smartphone") +var SmilePlus = Icon("smile-plus") +var Smile = Icon("smile") +var Snail = Icon("snail") +var Snowflake = Icon("snowflake") +var SoapDispenserDroplet = Icon("soap-dispenser-droplet") +var Sofa = Icon("sofa") +var Soup = Icon("soup") +var Space = Icon("space") +var Spade = Icon("spade") +var Sparkle = Icon("sparkle") +var Sparkles = Icon("sparkles") +var Speaker = Icon("speaker") +var Speech = Icon("speech") +var SpellCheck2 = Icon("spell-check-2") +var SpellCheck = Icon("spell-check") +var SplinePointer = Icon("spline-pointer") +var Spline = Icon("spline") +var Split = Icon("split") +var SprayCan = Icon("spray-can") +var Sprout = Icon("sprout") +var ReplaceAll = Icon("replace-all") +var Repeat = Icon("repeat") +var RefreshCw = Icon("refresh-cw") +var RefreshCcw = Icon("refresh-ccw") +var RefreshCwOff = Icon("refresh-cw-off") +var Replace = Icon("replace") +var SquareArrowDown = Icon("square-arrow-down") +var SquareArrowDownLeft = Icon("square-arrow-down-left") +var SquareArrowDownRight = Icon("square-arrow-down-right") +var Refrigerator = Icon("refrigerator") +var SquareArrowOutDownLeft = Icon("square-arrow-out-down-left") +var SquareArrowLeft = Icon("square-arrow-left") +var SunMedium = Icon("sun-medium") +var SquareActivity = Icon("square-activity") +var SquareArrowOutDownRight = Icon("square-arrow-out-down-right") +var ReplyAll = Icon("reply-all") +var TextCursorInput = Icon("text-cursor-input") +var SunMoon = Icon("sun-moon") +var SunSnow = Icon("sun-snow") +var Sun = Icon("sun") +var Sunrise = Icon("sunrise") +var Sunset = Icon("sunset") +var Superscript = Icon("superscript") +var SwatchBook = Icon("swatch-book") +var SwissFranc = Icon("swiss-franc") +var SwitchCamera = Icon("switch-camera") +var Sword = Icon("sword") +var Swords = Icon("swords") +var Syringe = Icon("syringe") +var Table2 = Icon("table-2") +var TableCellsMerge = Icon("table-cells-merge") +var TableCellsSplit = Icon("table-cells-split") +var TableColumnsSplit = Icon("table-columns-split") +var TableOfContents = Icon("table-of-contents") +var TableProperties = Icon("table-properties") +var TableRowsSplit = Icon("table-rows-split") +var Table = Icon("table") +var TabletSmartphone = Icon("tablet-smartphone") +var Tablet = Icon("tablet") +var Tablets = Icon("tablets") +var Tag = Icon("tag") +var Tags = Icon("tags") +var Tally1 = Icon("tally-1") +var Tally2 = Icon("tally-2") +var Tally3 = Icon("tally-3") +var Tally4 = Icon("tally-4") +var Tally5 = Icon("tally-5") +var Tangent = Icon("tangent") +var Target = Icon("target") +var Telescope = Icon("telescope") +var TentTree = Icon("tent-tree") +var Tent = Icon("tent") +var Terminal = Icon("terminal") +var TestTubeDiagonal = Icon("test-tube-diagonal") +var TestTube = Icon("test-tube") +var TestTubes = Icon("test-tubes") +var Pocket = Icon("pocket") +var Plus = Icon("plus") +var PocketKnife = Icon("pocket-knife") +var TrainFront = Icon("train-front") +var TextCursor = Icon("text-cursor") +var TextQuote = Icon("text-quote") +var TextSearch = Icon("text-search") +var SquareArrowOutUpRight = Icon("square-arrow-out-up-right") +var SquareArrowRight = Icon("square-arrow-right") +var SquareArrowUpLeft = Icon("square-arrow-up-left") +var SquareArrowUpRight = Icon("square-arrow-up-right") +var SquareArrowUp = Icon("square-arrow-up") +var SquareAsterisk = Icon("square-asterisk") +var SquareBottomDashedScissors = Icon("square-bottom-dashed-scissors") +var SquareChartGantt = Icon("square-chart-gantt") +var SquareCheckBig = Icon("square-check-big") +var SquareCheck = Icon("square-check") +var SquareChevronDown = Icon("square-chevron-down") +var SquareChevronLeft = Icon("square-chevron-left") +var SquareChevronRight = Icon("square-chevron-right") +var SquareChevronUp = Icon("square-chevron-up") +var SquareCode = Icon("square-code") +var SquareDashedBottomCode = Icon("square-dashed-bottom-code") +var SquareDashedBottom = Icon("square-dashed-bottom") +var SquareDashedKanban = Icon("square-dashed-kanban") +var SquareDashedMousePointer = Icon("square-dashed-mouse-pointer") +var TextSelect = Icon("text-select") +var Text = Icon("text") +var Theater = Icon("theater") +var ThermometerSnowflake = Icon("thermometer-snowflake") +var ThermometerSun = Icon("thermometer-sun") +var Thermometer = Icon("thermometer") +var ThumbsDown = Icon("thumbs-down") +var ThumbsUp = Icon("thumbs-up") +var TicketCheck = Icon("ticket-check") +var TicketMinus = Icon("ticket-minus") +var TicketPercent = Icon("ticket-percent") +var TicketPlus = Icon("ticket-plus") +var TicketSlash = Icon("ticket-slash") +var SquareDashed = Icon("square-dashed") +var SquareDivide = Icon("square-divide") +var SquareDot = Icon("square-dot") +var SquareEqual = Icon("square-equal") +var SquareFunction = Icon("square-function") +var SquareKanban = Icon("square-kanban") +var SquareLibrary = Icon("square-library") +var SquareM = Icon("square-m") +var SquareMenu = Icon("square-menu") +var SquareMinus = Icon("square-minus") +var SquareMousePointer = Icon("square-mouse-pointer") +var SquareParkingOff = Icon("square-parking-off") +var SquareParking = Icon("square-parking") +var SquarePen = Icon("square-pen") +var SquarePercent = Icon("square-percent") +var SquarePi = Icon("square-pi") +var SquarePilcrow = Icon("square-pilcrow") +var SquarePlay = Icon("square-play") +var SquarePlus = Icon("square-plus") +var SquarePower = Icon("square-power") +var SquareRadical = Icon("square-radical") +var SquareRoundCorner = Icon("square-round-corner") +var SquareScissors = Icon("square-scissors") +var SquareSigma = Icon("square-sigma") +var SquareSlash = Icon("square-slash") +var SquareSplitHorizontal = Icon("square-split-horizontal") +var SquareSplitVertical = Icon("square-split-vertical") +var SquareSquare = Icon("square-square") +var SquareStack = Icon("square-stack") +var SquareTerminal = Icon("square-terminal") +var SquareUserRound = Icon("square-user-round") +var SquareUser = Icon("square-user") +var SquareX = Icon("square-x") +var Square = Icon("square") +var SquaresExclude = Icon("squares-exclude") +var SquaresIntersect = Icon("squares-intersect") +var SquaresSubtract = Icon("squares-subtract") +var SquaresUnite = Icon("squares-unite") +var Squircle = Icon("squircle") +var Squirrel = Icon("squirrel") +var Stamp = Icon("stamp") +var StarHalf = Icon("star-half") +var StarOff = Icon("star-off") +var Star = Icon("star") +var StepBack = Icon("step-back") +var StepForward = Icon("step-forward") +var TicketX = Icon("ticket-x") +var Ticket = Icon("ticket") +var TicketsPlane = Icon("tickets-plane") +var Tickets = Icon("tickets") +var TimerOff = Icon("timer-off") +var TimerReset = Icon("timer-reset") +var Timer = Icon("timer") +var ToggleLeft = Icon("toggle-left") +var ToggleRight = Icon("toggle-right") +var Toilet = Icon("toilet") +var Tornado = Icon("tornado") +var Stethoscope = Icon("stethoscope") +var Sticker = Icon("sticker") +var StickyNote = Icon("sticky-note") +var Store = Icon("store") +var StretchHorizontal = Icon("stretch-horizontal") +var StretchVertical = Icon("stretch-vertical") +var Strikethrough = Icon("strikethrough") +var Subscript = Icon("subscript") +var SunDim = Icon("sun-dim") +var RockingChair = Icon("rocking-chair") +var Ribbon = Icon("ribbon") +var Rocket = Icon("rocket") +var Regex = Icon("regex") +var UserRoundCheck = Icon("user-round-check") +var TrainTrack = Icon("train-track") +var TramFront = Icon("tram-front") +var Transgender = Icon("transgender") +var Trash2 = Icon("trash-2") +var Trash = Icon("trash") +var TreeDeciduous = Icon("tree-deciduous") +var TreePalm = Icon("tree-palm") +var TreePine = Icon("tree-pine") +var Trees = Icon("trees") +var Trello = Icon("trello") +var TrendingDown = Icon("trending-down") +var TrendingUp = Icon("trending-up") +var TriangleAlert = Icon("triangle-alert") +var TrendingUpDown = Icon("trending-up-down") +var Torus = Icon("torus") +var TouchpadOff = Icon("touchpad-off") +var Touchpad = Icon("touchpad") +var TowerControl = Icon("tower-control") +var ToyBrick = Icon("toy-brick") +var Tractor = Icon("tractor") +var TrafficCone = Icon("traffic-cone") +var TrainFrontTunnel = Icon("train-front-tunnel") +var RollerCoaster = Icon("roller-coaster") +var Undo2 = Icon("undo-2") +var TriangleRight = Icon("triangle-right") +var Triangle = Icon("triangle") +var Trophy = Icon("trophy") +var TruckElectric = Icon("truck-electric") +var TriangleDashed = Icon("triangle-dashed") +var UndoDot = Icon("undo-dot") +var Undo = Icon("undo") +var UnfoldHorizontal = Icon("unfold-horizontal") +var UnfoldVertical = Icon("unfold-vertical") +var Ungroup = Icon("ungroup") +var University = Icon("university") +var Unlink2 = Icon("unlink-2") +var Unlink = Icon("unlink") +var Unplug = Icon("unplug") +var Upload = Icon("upload") +var Usb = Icon("usb") +var UserCheck = Icon("user-check") +var UserCog = Icon("user-cog") +var UserMinus = Icon("user-minus") +var UserPlus = Icon("user-plus") +var UserLock = Icon("user-lock") +var UserPen = Icon("user-pen") +var ZoomOut = Icon("zoom-out") +var UserRoundCog = Icon("user-round-cog") +var UserRoundMinus = Icon("user-round-minus") +var UserRoundPen = Icon("user-round-pen") +var UserRoundPlus = Icon("user-round-plus") +var UserRoundSearch = Icon("user-round-search") +var UserRoundX = Icon("user-round-x") +var UserRound = Icon("user-round") +var UserSearch = Icon("user-search") +var UserX = Icon("user-x") +var User = Icon("user") +var UsersRound = Icon("users-round") +var Users = Icon("users") +var UtensilsCrossed = Icon("utensils-crossed") +var Utensils = Icon("utensils") +var UtilityPole = Icon("utility-pole") +var Variable = Icon("variable") +var Vault = Icon("vault") +var Vegan = Icon("vegan") +var VenetianMask = Icon("venetian-mask") +var VenusAndMars = Icon("venus-and-mars") +var Venus = Icon("venus") +var VibrateOff = Icon("vibrate-off") +var Vibrate = Icon("vibrate") +var VideoOff = Icon("video-off") +var Video = Icon("video") +var Videotape = Icon("videotape") +var View = Icon("view") +var Voicemail = Icon("voicemail") +var Volleyball = Icon("volleyball") +var Volume1 = Icon("volume-1") +var Volume2 = Icon("volume-2") +var VolumeOff = Icon("volume-off") +var VolumeX = Icon("volume-x") +var Volume = Icon("volume") +var Vote = Icon("vote") +var WalletCards = Icon("wallet-cards") +var WalletMinimal = Icon("wallet-minimal") +var Wallet = Icon("wallet") +var Wallpaper = Icon("wallpaper") +var WandSparkles = Icon("wand-sparkles") +var Wand = Icon("wand") +var Warehouse = Icon("warehouse") +var WashingMachine = Icon("washing-machine") +var Watch = Icon("watch") +var WavesLadder = Icon("waves-ladder") +var Waves = Icon("waves") +var Waypoints = Icon("waypoints") +var Webcam = Icon("webcam") +var WebhookOff = Icon("webhook-off") +var Webhook = Icon("webhook") +var Weight = Icon("weight") +var WheatOff = Icon("wheat-off") +var Wheat = Icon("wheat") +var WholeWord = Icon("whole-word") +var WifiHigh = Icon("wifi-high") +var WifiLow = Icon("wifi-low") +var WifiOff = Icon("wifi-off") +var WifiPen = Icon("wifi-pen") +var WifiZero = Icon("wifi-zero") +var Wifi = Icon("wifi") +var WindArrowDown = Icon("wind-arrow-down") +var Wind = Icon("wind") +var WineOff = Icon("wine-off") +var Wine = Icon("wine") +var Workflow = Icon("workflow") +var Worm = Icon("worm") +var WrapText = Icon("wrap-text") +var Wrench = Icon("wrench") +var X = Icon("x") +var Youtube = Icon("youtube") +var ZapOff = Icon("zap-off") +var Zap = Icon("zap") +var ZoomIn = Icon("zoom-in") +var Podcast = Icon("podcast") +var Truck = Icon("truck") +var TypeOutline = Icon("type-outline") +var Type = Icon("type") +var UmbrellaOff = Icon("umbrella-off") +var Umbrella = Icon("umbrella") +var Underline = Icon("underline") +var TvMinimal = Icon("tv-minimal") +var Turtle = Icon("turtle") +var TvMinimalPlay = Icon("tv-minimal-play") +var Tv = Icon("tv") +var Twitch = Icon("twitch") +var PointerOff = Icon("pointer-off") +var Twitter = Icon("twitter") +var Rotate3d = Icon("rotate-3d") +var Repeat2 = Icon("repeat-2") +var Rewind = Icon("rewind") +var RectangleHorizontal = Icon("rectangle-horizontal") +var PencilLine = Icon("pencil-line") +var Heater = Icon("heater") diff --git a/components/label/label.templ b/components/label/label.templ new file mode 100644 index 0000000..b1a30fc --- /dev/null +++ b/components/label/label.templ @@ -0,0 +1,42 @@ +// templui component label - version: v0.93.0 installed by templui v0.93.0 +package label + +import "git.hafen.run/lukas/timeshare/utils" + +type Props struct { + ID string + Class string + Attributes templ.Attributes + For string + Error string +} + +templ Label(props ...Props) { + {{ var p Props }} + if len(props) > 0 { + {{ p = props[0] }} + } + +} + +templ Script() { + +} diff --git a/components/radio/radio.templ b/components/radio/radio.templ new file mode 100644 index 0000000..6fc77f9 --- /dev/null +++ b/components/radio/radio.templ @@ -0,0 +1,58 @@ +// templui component radio - version: v0.93.0 installed by templui v0.93.0 +package radio + +import "git.hafen.run/lukas/timeshare/utils" + +type Props struct { + ID string + Class string + Attributes templ.Attributes + Name string + Value string + Form string + Disabled bool + Required bool + Checked bool +} + +templ Radio(props ...Props) { + {{ var p Props }} + if len(props) > 0 { + {{ p = props[0] }} + } + +} diff --git a/components/toast/toast.templ b/components/toast/toast.templ new file mode 100644 index 0000000..e2d364a --- /dev/null +++ b/components/toast/toast.templ @@ -0,0 +1,153 @@ +// templui component toast - version: v0.94.0 installed by templui v0.94.0 +package toast + +import ( + "git.hafen.run/lukas/timeshare/components/button" + "git.hafen.run/lukas/timeshare/components/icon" + "git.hafen.run/lukas/timeshare/utils" + "strconv" +) + +type Variant string +type Position string + +const ( + VariantDefault Variant = "default" + VariantSuccess Variant = "success" + VariantError Variant = "error" + VariantWarning Variant = "warning" + VariantInfo Variant = "info" +) + +const ( + PositionTopRight Position = "top-right" + PositionTopLeft Position = "top-left" + PositionTopCenter Position = "top-center" + PositionBottomRight Position = "bottom-right" + PositionBottomLeft Position = "bottom-left" + PositionBottomCenter Position = "bottom-center" +) + +type Props struct { + ID string + Class string + Attributes templ.Attributes + Title string + Description string + Variant Variant + Position Position + Duration int + Dismissible bool + ShowIndicator bool + Icon bool +} + +templ Toast(props ...Props) { + {{ var p Props }} + if len(props) > 0 { + {{ p = props[0] }} + } + if p.ID == "" { + {{ p.ID = utils.RandomID() }} + } + // Set defaults + if p.Variant == "" { + {{ p.Variant = VariantDefault }} + } + if p.Position == "" { + {{ p.Position = PositionBottomRight }} + } + if p.Duration == 0 { + {{ p.Duration = 3000 }} + } +
+
+ // Progress indicator + if p.ShowIndicator && p.Duration > 0 { +
+
+
+ } + // Icon + if p.Icon { + switch p.Variant { + case VariantSuccess: + @icon.CircleCheck(icon.Props{Size: 22, Class: "text-green-500 mr-3 flex-shrink-0"}) + case VariantError: + @icon.CircleX(icon.Props{Size: 22, Class: "text-red-500 mr-3 flex-shrink-0"}) + case VariantWarning: + @icon.TriangleAlert(icon.Props{Size: 22, Class: "text-yellow-500 mr-3 flex-shrink-0"}) + case VariantInfo: + @icon.Info(icon.Props{Size: 22, Class: "text-blue-500 mr-3 flex-shrink-0"}) + } + } + // Content + + if p.Title != "" { +

{ p.Title }

+ } + if p.Description != "" { +

@templ.Raw(p.Description) +

+ } +
+ // Dismiss button + if p.Dismissible { + @button.Button(button.Props{ + Size: button.SizeIcon, + Variant: button.VariantGhost, + Attributes: templ.Attributes{ + "aria-label": "Close", + "data-tui-toast-dismiss": "", + "type": "button", + }, + }) { + @icon.X(icon.Props{ + Size: 18, + Class: "opacity-75 hover:opacity-100", + }) + } + } +
+
+} + +templ Script() { + +} diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..a82ddd7 --- /dev/null +++ b/dockerfile @@ -0,0 +1,34 @@ +FROM --platform=$BUILDPLATFORM golang:alpine AS build + +RUN apk add git + +WORKDIR /src/ + +COPY go.* /src/ + +RUN go mod download -x + +COPY . /src + +#Compiler Settings +ENV CGO_ENABLED=0 + +# for full parings check out https://go.dev/doc/install/source#environment +ENV GOOS=linux +# this will be the target cpu arch +# Can be amd64 arm64 386 ppc64 +ENV GOARCH=amd64 + +RUN go build -o /out/app . + +# if you need certificates use: alpine +# otherwise just use: scratch +FROM alpine AS run + +COPY --from=build /out/app / + +# if needed +EXPOSE 8080 +ENV VALKEY_ADDR redis:6379 + +ENTRYPOINT [ "/app" ] diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e36f9c7 --- /dev/null +++ b/go.mod @@ -0,0 +1,12 @@ +module git.hafen.run/lukas/timeshare + +go 1.25.0 + +require ( + github.com/Oudwins/tailwind-merge-go v0.2.1 // indirect + github.com/a-h/templ v0.3.943 // indirect + github.com/gabriel-vasile/mimetype v1.4.10 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/valkey-io/valkey-go v1.0.64 // indirect + golang.org/x/sys v0.34.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..f41c7c7 --- /dev/null +++ b/go.sum @@ -0,0 +1,12 @@ +github.com/Oudwins/tailwind-merge-go v0.2.1 h1:jxRaEqGtwwwF48UuFIQ8g8XT7YSualNuGzCvQ89nPFE= +github.com/Oudwins/tailwind-merge-go v0.2.1/go.mod h1:kkZodgOPvZQ8f7SIrlWkG/w1g9JTbtnptnePIh3V72U= +github.com/a-h/templ v0.3.943 h1:o+mT/4yqhZ33F3ootBiHwaY4HM5EVaOJfIshvd5UNTY= +github.com/a-h/templ v0.3.943/go.mod h1:oCZcnKRf5jjsGpf2yELzQfodLphd2mwecwG4Crk5HBo= +github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0= +github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/valkey-io/valkey-go v1.0.64 h1:3u4+b6D6zs9JQs254TLy4LqitCMHHr9XorP9GGk7XY4= +github.com/valkey-io/valkey-go v1.0.64/go.mod h1:bHmwjIEOrGq/ubOJfh5uMRs7Xj6mV3mQ/ZXUbmqpjqY= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= diff --git a/guard.dockerfile b/guard.dockerfile new file mode 100644 index 0000000..01f5960 --- /dev/null +++ b/guard.dockerfile @@ -0,0 +1,20 @@ +FROM --platform=$BUILDPLATFORM golang:alpine AS build + +# for full parings check out https://go.dev/doc/install/source#environment +ENV GOOS=linux +# this will be the target cpu arch +# Can be amd64 arm64 386 ppc64 +ENV GOARCH=amd64 + +RUN apk add git +WORKDIR /src/ +RUN git clone https://git.hafen.run/lukas/oauth-guard.git +WORKDIR /src/oauth-guard +RUN go mod download -x +ENV CGO_ENABLED=0 +RUN go build -o oauth-guard . + +COPY config.toml . + +EXPOSE 3000 +CMD [ "./oauth-guard" ] diff --git a/main.go b/main.go new file mode 100644 index 0000000..c2b92ab --- /dev/null +++ b/main.go @@ -0,0 +1,170 @@ +package main + +import ( + "archive/zip" + "bytes" + "embed" + "encoding/json" + "fmt" + "io" + "log" + "mime/multipart" + "net/http" + "os" + "time" + + "git.hafen.run/lukas/timeshare/pages" + "github.com/a-h/templ" + "github.com/gabriel-vasile/mimetype" + "github.com/google/uuid" + "github.com/valkey-io/valkey-go" +) + +//go:embed assets +var assetsFS embed.FS + +type File struct { + FileKey string + File *multipart.FileHeader +} + +func main() { + valkeyAddr := os.Getenv("VALKEY_ADDR") + if valkeyAddr == "" { + valkeyAddr = "127.0.0.1:6379" + } + client, err := valkey.NewClient(valkey.ClientOption{InitAddress: []string{valkeyAddr}}) + if err != nil { + log.Fatalln("unable to connect to valkey instance: ", err.Error()) + } + + http.Handle("/assets/", http.FileServer(http.FS(assetsFS))) + http.Handle("GET /upload", templ.Handler(pages.Upload([]pages.Expiry{ + {DurationCode: "24h", DurationName: "24 Hours"}, + {DurationCode: "36h", DurationName: "36 Hours"}, + {DurationCode: "48h", DurationName: "48 Hours"}, + {DurationCode: "168h", DurationName: "1 Week"}, + }, ""))) + + http.Handle("POST /upload", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + err := r.ParseMultipartForm(125_000_000) // 1G max memory usage + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + form := r.MultipartForm + expiry_values := form.Value["expiry"] + expiry, err := time.ParseDuration(expiry_values[0]) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + form_files := form.File["files"] + files := make([]string, len(form_files)) + for i := range form_files { + fid := uuid.New().String() + files[i] = fid + f, err := form_files[i].Open() + if err != nil { + continue + } + buf := new(bytes.Buffer) + _, err = io.Copy(buf, f) + if err != nil { + continue + } + err = client.Do(r.Context(), client.B().Set().Key(fid+":filename").Value(form_files[i].Filename).Ex(expiry).Build()).Error() + if err != nil { + continue + } + + err = client.Do(r.Context(), client.B().Set().Key(fid+":contents").Value(valkey.BinaryString(buf.Bytes())).Ex(expiry).Build()).Error() + if err != nil { + continue + } + } + + uid := uuid.New() + files_b, _ := json.Marshal(files) + err = client.Do(r.Context(), client.B().Set().Key(uid.String()).Value(string(files_b)).Ex(expiry).Build()).Error() + + templ.Handler(pages.Upload([]pages.Expiry{ + {DurationCode: "24h", DurationName: "24 Hours"}, + {DurationCode: "36h", DurationName: "36 Hours"}, + {DurationCode: "48h", DurationName: "48 Hours"}, + {DurationCode: "168h", DurationName: "1 Week"}, + }, fmt.Sprintf("https://share.lukaswerner.com/%s", uid.String()))).ServeHTTP(w, r) + })) + + http.Handle("/{upload_id}", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + upload_id := r.PathValue("upload_id") + if upload_id == "" { + w.WriteHeader(http.StatusBadRequest) + return + } + + files_json, err := client.Do(r.Context(), + client.B().Get().Key(upload_id).Build()).ToString() + if err != nil { + + http.Error(w, err.Error(), http.StatusNotFound) + return + } + + var files []string + + err = json.Unmarshal([]byte(files_json), &files) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + if len(files) == 1 { + file := files[0] + + filename, err := client.Do(r.Context(), client.B().Get().Key(file+":filename").Build()).ToString() + if err != nil { + return + } + fileContents, err := client.Do(r.Context(), client.B().Get().Key(file+":contents").Build()).AsBytes() + if err != nil { + return + } + w.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename)) + mime := mimetype.Detect(fileContents) + w.Header().Add("mimetype", mime.String()) + w.Write(fileContents) + return + } + + zipBuf := new(bytes.Buffer) + zipWriter := zip.NewWriter(zipBuf) + + for _, file := range files { + filename, err := client.Do(r.Context(), client.B().Get().Key(file+":filename").Build()).ToString() + if err != nil { + continue + } + fileContents, err := client.Do(r.Context(), client.B().Get().Key(file+":contents").Build()).AsBytes() + if err != nil { + continue + } + w, err := zipWriter.Create(filename) + if err != nil { + continue + } + w.Write(fileContents) + + } + + zipWriter.Close() + w.Header().Add("mimetype", "application/zip") + w.Header().Add("Content-Disposition", `attachment; filename="timeshare-download.zip"`) + io.Copy(w, zipBuf) + + })) + http.Handle("/", templ.Handler(pages.Index())) + log.Println(http.ListenAndServe(":8080", nil)) +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..1b19fbf --- /dev/null +++ b/makefile @@ -0,0 +1,22 @@ +# Run templ generation in watch mode +templ: + templ generate --watch --proxy="http://localhost:8090" --open-browser=false + +# Run air for Go hot reload +server: + air \ + --build.cmd "go build -o tmp/bin/main ./main.go" \ + --build.bin "tmp/bin/main" \ + --build.delay "100" \ + --build.exclude_dir "node_modules" \ + --build.include_ext "go" \ + --build.stop_on_error "false" \ + --misc.clean_on_exit true + +# Watch Tailwind CSS changes +tailwind: + tailwindcss -i ./assets/css/input.css -o ./assets/css/output.css --watch + +# Start development server with all watchers +dev: + make -j3 tailwind templ server diff --git a/pages/index.templ b/pages/index.templ new file mode 100644 index 0000000..b16db1f --- /dev/null +++ b/pages/index.templ @@ -0,0 +1,10 @@ +package pages + +templ Index() { + @PageSkeleton("Time Share") { +
+

Time Share

+

Lukas Werner

+
+ } +} diff --git a/pages/skeleton.templ b/pages/skeleton.templ new file mode 100644 index 0000000..b9c65a8 --- /dev/null +++ b/pages/skeleton.templ @@ -0,0 +1,30 @@ +package pages + +import "git.hafen.run/lukas/timeshare/components/toast" + +templ PageSkeleton(title string) { + + + + + + + + { title } + + + + + + + + { children... } + @toast.Script() + + +} diff --git a/pages/upload.templ b/pages/upload.templ new file mode 100644 index 0000000..94fece7 --- /dev/null +++ b/pages/upload.templ @@ -0,0 +1,98 @@ +package pages + +import ( + "fmt" + "git.hafen.run/lukas/timeshare/components/button" + "git.hafen.run/lukas/timeshare/components/label" + "git.hafen.run/lukas/timeshare/components/radio" + "git.hafen.run/lukas/timeshare/components/toast" +) + +type Expiry struct { + DurationCode string + DurationName string +} + +templ Upload(expirations []Expiry, uploadedLink string) { + @PageSkeleton("Upload - Time Share") { + if uploadedLink != "" { + @toast.Toast(toast.Props{ + Title: "Share Created!", + Description: fmt.Sprintf(`%s`, uploadedLink, uploadedLink), + Variant: toast.VariantSuccess, + Duration: 120000, // 2 min + Position: toast.PositionBottomCenter, + Dismissible: true, + Icon: true, + }) + } +
+
+

Time Share Upload

+ +
+

Drop files onto here or click to upload

+
+ + +
+

Expiration:

+
+ for i, expiry := range expirations { +
+ @radio.Radio(radio.Props{ + ID: expiry.DurationCode, + Name: "expiry", + Value: expiry.DurationCode, + Checked: i == 0, + }) + @label.Label(label.Props{ + For: expiry.DurationCode, + }) { + { expiry.DurationName } + } +
+ } +
+ @button.Button(button.Props{ + Type: "submit", + }) { + Upload + } +
+
+
+ } +} diff --git a/utils/templui.go b/utils/templui.go new file mode 100644 index 0000000..e16ace1 --- /dev/null +++ b/utils/templui.go @@ -0,0 +1,55 @@ +// templui util templui.go - version: v0.93.0 installed by templui v0.93.0 +package utils + +import ( + "fmt" + + "crypto/rand" + + "github.com/a-h/templ" + + twmerge "github.com/Oudwins/tailwind-merge-go" +) + +// TwMerge combines Tailwind classes and resolves conflicts. +// Example: "bg-red-500 hover:bg-blue-500", "bg-green-500" → "hover:bg-blue-500 bg-green-500" +func TwMerge(classes ...string) string { + return twmerge.Merge(classes...) +} + +// TwIf returns value if condition is true, otherwise an empty value of type T. +// Example: true, "bg-red-500" → "bg-red-500" +func If[T comparable](condition bool, value T) T { + var empty T + if condition { + return value + } + return empty +} + +// TwIfElse returns trueValue if condition is true, otherwise falseValue. +// Example: true, "bg-red-500", "bg-gray-300" → "bg-red-500" +func IfElse[T any](condition bool, trueValue T, falseValue T) T { + if condition { + return trueValue + } + return falseValue +} + +// MergeAttributes combines multiple Attributes into one. +// Example: MergeAttributes(attr1, attr2) → combined attributes +func MergeAttributes(attrs ...templ.Attributes) templ.Attributes { + merged := templ.Attributes{} + for _, attr := range attrs { + for k, v := range attr { + merged[k] = v + } + } + return merged +} + +// RandomID generates a random ID string. +// Example: RandomID() → "id-1a2b3c" +func RandomID() string { + return fmt.Sprintf("id-%s", rand.Text()) +}