
3D Extruded Buildings & Urban Footprints
Real-world 3D building extrusions with dynamic sunlight shadows, terrain DEM elevations, and pitch/bearing camera controls.
spinneruiLightweight loading indicator — circular spinner with three sizes and tone variants. Use inside buttons (replacing the icon when an action is in flight) or as a centered page loader.
Also available for Vue ->$pnpm dlx shadcn@latest add https://uipkge.dev/r/react/spinner.json$npx shadcn@latest add https://uipkge.dev/r/react/spinner.json$yarn dlx shadcn@latest add https://uipkge.dev/r/react/spinner.json$bunx shadcn@latest add https://uipkge.dev/r/react/spinner.jsonnpx shadcn@latest add @uipkge-react/spinnerInstalls to:components/ui/spinner/| Name | Type / Values | Default | Required |
|---|---|---|---|
size | 'default''sm''lg''icon' | default | optional |
import * as React from 'react'
import { Loader2 } from 'lucide-react'
import { cn } from '@/lib/utils'
import { spinnerVariants, type SpinnerVariants } from './spinner.variants'
// Omit Lucide's own `size` (number|string) so the cva variant `size` wins.
export interface SpinnerProps
extends Omit<React.ComponentPropsWithoutRef<typeof Loader2>, 'ref' | 'size'>, SpinnerVariants {}
const Spinner = React.forwardRef<SVGSVGElement, SpinnerProps>(({ className, size = 'default', ...props }, ref) => (
<Loader2
ref={ref}
data-uipkge=""
data-slot="spinner"
className={cn(spinnerVariants({ size }), className)}
aria-label="Loading"
role="status"
{...props}
/>
))
Spinner.displayName = 'Spinner'
export { Spinner }
import type { VariantProps } from 'class-variance-authority'
import { cva } from 'class-variance-authority'
/**
* Variant definitions live in their own file (rather than the package
* `index.ts`) so consuming Vue SFCs can import without creating a circular
* dependency through the index. See card.variants.ts for the canonical
* example + the SSR symptom that motivated the split.
*/
// motion-safe: honor prefers-reduced-motion (static glyph when reduced).
export const spinnerVariants = cva('motion-safe:animate-spin text-muted-foreground', {
variants: {
size: {
default: 'size-6',
sm: 'size-4',
lg: 'size-8',
icon: 'size-4',
},
},
defaultVariants: {
size: 'default',
},
})
export type SpinnerVariants = VariantProps<typeof spinnerVariants>
export { Spinner, type SpinnerProps } from './Spinner'
export { spinnerVariants, type SpinnerVariants } from './spinner.variants'
Raw manifest:https://uipkge.dev/r/react/spinner.json