Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
HFT-informatics-weekend
SI - Time Series Map Viewer
Commits
b2e6db41
Commit
b2e6db41
authored
Oct 11, 2025
by
Heisenberg5124
Browse files
Initial commit
parent
98450f89
Changes
6
Hide whitespace changes
Inline
Side-by-side
frontend/src/App.tsx
View file @
b2e6db41
import
'
./App.css
'
import
{
MapViewer
}
from
"
@/components/map/map-viewer.tsx
"
;
import
{
Slider
}
from
"
@/components/ui/slider.tsx
"
;
import
{
MapLayerCard
}
from
"
@/components/map/map-layer-card.tsx
"
;
import
{
useState
}
from
"
react
"
;
import
TimelineSlider
from
"
@/components/timeline/timeline-slider.tsx
"
;
...
...
frontend/src/components/ui/button.tsx
0 → 100644
View file @
b2e6db41
import
*
as
React
from
"
react
"
import
{
Slot
}
from
"
@radix-ui/react-slot
"
import
{
cva
,
type
VariantProps
}
from
"
class-variance-authority
"
import
{
cn
}
from
"
@/lib/utils
"
const
buttonVariants
=
cva
(
"
inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive
"
,
{
variants
:
{
variant
:
{
default
:
"
bg-primary text-primary-foreground hover:bg-primary/90
"
,
destructive
:
"
bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60
"
,
outline
:
"
border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50
"
,
secondary
:
"
bg-secondary text-secondary-foreground hover:bg-secondary/80
"
,
ghost
:
"
hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50
"
,
link
:
"
text-primary underline-offset-4 hover:underline
"
,
},
size
:
{
default
:
"
h-9 px-4 py-2 has-[>svg]:px-3
"
,
sm
:
"
h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5
"
,
lg
:
"
h-10 rounded-md px-6 has-[>svg]:px-4
"
,
icon
:
"
size-9
"
,
"
icon-sm
"
:
"
size-8
"
,
"
icon-lg
"
:
"
size-10
"
,
},
},
defaultVariants
:
{
variant
:
"
default
"
,
size
:
"
default
"
,
},
}
)
function
Button
({
className
,
variant
,
size
,
asChild
=
false
,
...
props
}:
React
.
ComponentProps
<
"
button
"
>
&
VariantProps
<
typeof
buttonVariants
>
&
{
asChild
?:
boolean
})
{
const
Comp
=
asChild
?
Slot
:
"
button
"
return
(
<
Comp
data-slot
=
"button"
className
=
{
cn
(
buttonVariants
({
variant
,
size
,
className
}))
}
{
...
props
}
/>
)
}
export
{
Button
,
buttonVariants
}
frontend/src/components/ui/card.tsx
0 → 100644
View file @
b2e6db41
import
*
as
React
from
"
react
"
import
{
cn
}
from
"
@/lib/utils
"
function
Card
({
className
,
...
props
}:
React
.
ComponentProps
<
"
div
"
>
)
{
return
(
<
div
data-slot
=
"card"
className
=
{
cn
(
"
bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm
"
,
className
)
}
{
...
props
}
/>
)
}
function
CardHeader
({
className
,
...
props
}:
React
.
ComponentProps
<
"
div
"
>
)
{
return
(
<
div
data-slot
=
"card-header"
className
=
{
cn
(
"
@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6
"
,
className
)
}
{
...
props
}
/>
)
}
function
CardTitle
({
className
,
...
props
}:
React
.
ComponentProps
<
"
div
"
>
)
{
return
(
<
div
data-slot
=
"card-title"
className
=
{
cn
(
"
leading-none font-semibold
"
,
className
)
}
{
...
props
}
/>
)
}
function
CardDescription
({
className
,
...
props
}:
React
.
ComponentProps
<
"
div
"
>
)
{
return
(
<
div
data-slot
=
"card-description"
className
=
{
cn
(
"
text-muted-foreground text-sm
"
,
className
)
}
{
...
props
}
/>
)
}
function
CardAction
({
className
,
...
props
}:
React
.
ComponentProps
<
"
div
"
>
)
{
return
(
<
div
data-slot
=
"card-action"
className
=
{
cn
(
"
col-start-2 row-span-2 row-start-1 self-start justify-self-end
"
,
className
)
}
{
...
props
}
/>
)
}
function
CardContent
({
className
,
...
props
}:
React
.
ComponentProps
<
"
div
"
>
)
{
return
(
<
div
data-slot
=
"card-content"
className
=
{
cn
(
"
px-6
"
,
className
)
}
{
...
props
}
/>
)
}
function
CardFooter
({
className
,
...
props
}:
React
.
ComponentProps
<
"
div
"
>
)
{
return
(
<
div
data-slot
=
"card-footer"
className
=
{
cn
(
"
flex items-center px-6 [.border-t]:pt-6
"
,
className
)
}
{
...
props
}
/>
)
}
export
{
Card
,
CardHeader
,
CardFooter
,
CardTitle
,
CardAction
,
CardDescription
,
CardContent
,
}
frontend/src/components/ui/label.tsx
0 → 100644
View file @
b2e6db41
import
*
as
React
from
"
react
"
import
*
as
LabelPrimitive
from
"
@radix-ui/react-label
"
import
{
cn
}
from
"
@/lib/utils
"
function
Label
({
className
,
...
props
}:
React
.
ComponentProps
<
typeof
LabelPrimitive
.
Root
>
)
{
return
(
<
LabelPrimitive
.
Root
data-slot
=
"label"
className
=
{
cn
(
"
flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50
"
,
className
)
}
{
...
props
}
/>
)
}
export
{
Label
}
frontend/src/components/ui/radio-group.tsx
0 → 100644
View file @
b2e6db41
import
*
as
React
from
"
react
"
import
*
as
RadioGroupPrimitive
from
"
@radix-ui/react-radio-group
"
import
{
CircleIcon
}
from
"
lucide-react
"
import
{
cn
}
from
"
@/lib/utils
"
function
RadioGroup
({
className
,
...
props
}:
React
.
ComponentProps
<
typeof
RadioGroupPrimitive
.
Root
>
)
{
return
(
<
RadioGroupPrimitive
.
Root
data-slot
=
"radio-group"
className
=
{
cn
(
"
grid gap-3
"
,
className
)
}
{
...
props
}
/>
)
}
function
RadioGroupItem
({
className
,
...
props
}:
React
.
ComponentProps
<
typeof
RadioGroupPrimitive
.
Item
>
)
{
return
(
<
RadioGroupPrimitive
.
Item
data-slot
=
"radio-group-item"
className
=
{
cn
(
"
border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50
"
,
className
)
}
{
...
props
}
>
<
RadioGroupPrimitive
.
Indicator
data-slot
=
"radio-group-indicator"
className
=
"relative flex items-center justify-center"
>
<
CircleIcon
className
=
"fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2"
/>
</
RadioGroupPrimitive
.
Indicator
>
</
RadioGroupPrimitive
.
Item
>
)
}
export
{
RadioGroup
,
RadioGroupItem
}
frontend/src/components/ui/slider.tsx
0 → 100644
View file @
b2e6db41
import
*
as
React
from
"
react
"
import
*
as
SliderPrimitive
from
"
@radix-ui/react-slider
"
import
{
cn
}
from
"
@/lib/utils
"
function
Slider
({
className
,
defaultValue
,
value
,
min
=
0
,
max
=
100
,
...
props
}:
React
.
ComponentProps
<
typeof
SliderPrimitive
.
Root
>
)
{
const
_values
=
React
.
useMemo
(
()
=>
Array
.
isArray
(
value
)
?
value
:
Array
.
isArray
(
defaultValue
)
?
defaultValue
:
[
min
,
max
],
[
value
,
defaultValue
,
min
,
max
]
)
return
(
<
SliderPrimitive
.
Root
data-slot
=
"slider"
defaultValue
=
{
defaultValue
}
value
=
{
value
}
min
=
{
min
}
max
=
{
max
}
className
=
{
cn
(
"
relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col
"
,
className
)
}
{
...
props
}
>
<
SliderPrimitive
.
Track
data-slot
=
"slider-track"
className
=
{
cn
(
"
bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5
"
)
}
>
<
SliderPrimitive
.
Range
data-slot
=
"slider-range"
className
=
{
cn
(
"
bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full
"
)
}
/>
</
SliderPrimitive
.
Track
>
{
Array
.
from
({
length
:
_values
.
length
},
(
_
,
index
)
=>
(
<
SliderPrimitive
.
Thumb
data-slot
=
"slider-thumb"
key
=
{
index
}
className
=
"border-primary ring-ring/50 block size-4 shrink-0 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50"
/>
))
}
</
SliderPrimitive
.
Root
>
)
}
export
{
Slider
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment