npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@takamunesuda/svecium

v0.0.12

Published

A Svelte component library for CesiumJS.

Readme

svecium

svecium is a minimal Svelte 5 component library that wraps CesiumJS, making it easy to build interactive 3D globes and maps in Svelte apps. Compose Cesium features using simple Svelte components—no boilerplate, no hassle.


How to Build (Setup)

1. Vite Configuration (vite.config.ts)

You must configure your Vite project as follows to use svecium with CesiumJS:

import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import { viteStaticCopy } from 'vite-plugin-static-copy';

export default defineConfig({
  plugins: [
    sveltekit(),
    viteStaticCopy({
      targets: [
        { src: 'node_modules/cesium/Build/Cesium/Workers/*', dest: 'cesium/Workers' },
        { src: 'node_modules/cesium/Build/Cesium/Assets/*', dest: 'cesium/Assets' },
        { src: 'node_modules/cesium/Build/Cesium/Widgets/*', dest: 'cesium/Widgets' },
        { src: 'node_modules/cesium/Build/Cesium/ThirdParty/*', dest: 'cesium/ThirdParty' }
      ]
    })
  ],
  define: {
    CESIUM_BASE_URL: JSON.stringify('/cesium')
  }
});

2. Import Cesium CSS

You must import Cesium’s widget CSS in your app (typically where you use the Viewer component):

import 'cesium/Build/Cesium/Widgets/widgets.css';

3. Requirements

  • Svelte 5
  • CesiumJS
  • Vite

Components

Viewer

The Viewer component creates a Cesium Viewer instance and allows you to compose map-related child components (such as Terrain, Imagery, Camera, etc.) inside.

Props

| Name | Type | Required | Description | |-----------|--------|----------|-------------------------------| | ionToken | string | Optional | Cesium Ion access token. Required for Cesium Ion assets (e.g., terrain, 3D Tiles). | | children | slot | Optional | Map-related child components. Usually required for meaningful usage. |

Note:

  • ionToken is optional in the type definition, but required if you use Cesium Ion assets.
  • children is optional in the type definition, but the Viewer is only useful with child components such as Terrain, Imagery, Camera, etc.

Minimal Example

<Viewer ionToken="your_ion_token">
  <Terrain assetId={1234} />
  <Imagery url={tileUrl} />
  <Camera ...props />
</Viewer>
interface ViewerProps {
  ionToken?: string;
  children?: Snippet<[Viewer]>;
}

Terrain

The Terrain component adds a Cesium terrain provider to the Viewer context using a Cesium Ion asset.

Props

| Name | Type | Required | Description | |---------|--------|----------|----------------------------------------------| | assetId | number | Optional | Cesium Ion asset ID for the terrain provider |

Minimal Example

<Viewer ionToken="your_ion_token">
  <Terrain assetId={1234} />
</Viewer>
interface TerrainProps {
  assetId?: number;
}

Camera

The Camera component sets the initial camera position and orientation for the Cesium Viewer. You can control the view by specifying longitude, latitude, height, heading, pitch, and roll. All props are optional and bindable for reactive camera control.

Props

| Name | Type | Required | Description | |-----------|--------|----------|---------------------------------------------| | longitude | number | Optional | Longitude in degrees | | latitude | number | Optional | Latitude in degrees | | height | number | Optional | Height in meters | | heading | number | Optional | Heading in degrees | | pitch | number | Optional | Pitch in degrees | | roll | number | Optional | Roll in degrees |

Minimal Example

<Viewer ionToken="your_ion_token">
  <Camera longitude={139.7673} latitude={35.6812} height={1000} heading={0} pitch={-30} roll={0} />
</Viewer>
interface CameraProps {
  longitude?: number;
  latitude?: number;
  height?: number;
  heading?: number;
  pitch?: number;
  roll?: number;
}

Imagery

The Imagery component adds a raster tile imagery layer to the Cesium Viewer using a URL template (e.g., OpenStreetMap, Mapbox, XYZ, etc.).

Props

| Name | Type | Required | Description | |--------------|--------|----------|-----------------------------------------------| | url | string | Required | URL template for raster tiles | | minimumLevel | number | Optional | Minimum zoom level (default: 0) | | maximumLevel | number | Optional | Maximum zoom level (default: 18) |

Minimal Example

<Viewer ionToken="your_ion_token">
  <Imagery url="https://tile.openstreetmap.org/{z}/{x}/{y}.png" minimumLevel={0} maximumLevel={19} />
</Viewer>
interface ImageryProps {
  url: string;
  minimumLevel?: number;
  maximumLevel?: number;
}

GeoJSONPoint

The GeoJSONPoint component renders GeoJSON Point features on the Cesium globe. You can style points with custom images, colors, size, and more.

Props

| Name | Type | Required | Description | |--------------|-----------------------------------------------------------|----------|-----------------------------------------------------------------------------------------------------| | data | FeatureCollection | Feature | null | Yes | GeoJSON Point feature or feature collection. | | style | PointStyle | Optional | Style options for points (color, opacity, pointSize, outline, image, etc). | | clampToGround| boolean | Optional | Clamp points to ground (default: false). | | heightOffset | number | Optional | Pixel offset from ground (default: undefined). |

Minimal Example

<Viewer ionToken="your_ion_token">
  <GeoJSONPoint
    data={geojsonPointData}
    style={{
      pointImage: imageUrl, // image url
      imageWidth: 32,
      imageHeight: 48,
      rotation: 45,
      anchorX: 0.5,
      anchorY: 1,
      color: '#4169e1',
      opacity: 0.8
    }}
    clampToGround={true}
  />
</Viewer>
interface GeoJSONPointProps {
  data: FeatureCollection<Point> | Feature<Point> | null;
  style?: PointStyle;
  clampToGround?: boolean;
  heightOffset?: number;
}

GeoJSONLine

The GeoJSONLine component renders GeoJSON LineString features as polylines on the Cesium globe. Supports color, width, opacity, outline, and ground clamping.

Props

| Name | Type | Required | Description | |--------------|--------------------------------------------------------------|----------|-----------------------------------------------------------------------------------------------------| | data | FeatureCollection | Feature | null | Yes | GeoJSON LineString feature or feature collection. | | style | LineStyle | Optional | Style options for lines (color, opacity, lineWidth, outline, etc). | | clampToGround| boolean | Optional | Clamp lines to ground (default: false). | | heightOffset | number | Optional | Height offset for line positions (default: undefined). |

Minimal Example

<Viewer ionToken="your_ion_token">
  <GeoJSONLine
    data={geojsonLineData}
    style={{
      color: '#ff0000',
      opacity: 1,
      lineWidth: 12,
      outlineColor: '#ffffff',
      outlineWidth: 1
    }}
    clampToGround={true}
  />
</Viewer>
interface GeoJSONLineProps {
  data: FeatureCollection<LineString> | Feature<LineString> | null;
  style?: LineStyle;
  clampToGround?: boolean;
  heightOffset?: number;
}

GeoJSONPolygon

The GeoJSONPolygon component renders GeoJSON Polygon features as filled polygons on the Cesium globe. You can style fill color, opacity, outline, and more.

Props

| Name | Type | Required | Description | |--------------|----------------------------------------------------------------|----------|-----------------------------------------------------------------------------------------------------| | data | FeatureCollection | Feature | null | Yes | GeoJSON Polygon feature or feature collection. | | style | PolygonStyle | Optional | Style options for polygons (fillColor, fillOpacity, outlineColor, outlineWidth, etc). |

Minimal Example

<Viewer ionToken="your_ion_token">
  <GeoJSONPolygon
    data={geojsonPolygonData}
    style={{
      fillColor: '#ff0000',
      fillOpacity: 0.5,
      outlineColor: '#000000',
      outlineWidth: 2
    }}
  />
</Viewer>
interface GeoJSONPolygonProps {
  data: FeatureCollection<Polygon> | Feature<Polygon> | null;
  style?: PolygonStyle;
}

Mvt

The Mvt component adds a Mapbox Vector Tile (MVT) layer to the Cesium globe using an MVT imagery provider. You can customize stroke color, fill color, line width, and handle feature selection.

Props

| Name | Type | Required | Description | |-----------------|----------------------------|----------|---------------------------------------------------------------| | url | string | Yes | URL template for the MVT tiles. | | layerName | string | Yes | Name of the vector tile layer to display. | | strokeStyle | string | Optional | Stroke color for features (default: '#000000'). | | fillStyle | string | Optional | Fill color for features (default: '#ffffff'). | | lineWidth | number | Optional | Line width for features (default: 2). | | onSelectFeature | (feature: any) => void | Optional | Callback when a feature is selected. |

Minimal Example

<Viewer ionToken="your_ion_token">
  <Mvt
    url="https://example.com/tiles/{z}/{x}/{y}.pbf"
    layerName="myLayer"
    strokeStyle="#0080ff"
    fillStyle="#00ff80"
    lineWidth={3}
    onSelectFeature={(feature) => console.log(feature)}
  />
</Viewer>
interface MvtProps {
  url: string;
  layerName: string;
  strokeStyle?: string;
  fillStyle?: string;
  lineWidth?: number;
  onSelectFeature?: (feature: any) => void;
}

Full Example: All-in Svelte Globe

<script lang="ts">
  import { Viewer, Imagery, Terrain, Camera, GeoJSONPoint, GeoJSONLine, GeoJSONPolygon, Mvt } from '@TakamuneSuda/svecium';

  const ionToken = 'your_cesium_ion_token';
  const tileUrl = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png';
  const mvtUrl = 'https://example.com/tiles/{z}/{x}/{y}.pbf';
  const mvtLayer = 'myLayer';

  // GeoJSONデータ例
  const geojsonPointData = {
    type: 'FeatureCollection',
    features: [
      {
        type: 'Feature',
        geometry: { type: 'Point', coordinates: [139.7673068, 35.681236] },
        properties: { name: 'Tokyo Station' }
      }
    ]
  };
  const geojsonLineData = {
    type: 'FeatureCollection',
    features: [
      {
        type: 'Feature',
        geometry: { type: 'LineString', coordinates: [ [139.76, 35.68], [139.77, 35.69] ] },
        properties: {}
      }
    ]
  };
  const geojsonPolygonData = {
    type: 'FeatureCollection',
    features: [
      {
        type: 'Feature',
        geometry: { type: 'Polygon', coordinates: [ [ [139.76, 35.68], [139.77, 35.68], [139.77, 35.69], [139.76, 35.69], [139.76, 35.68] ] ] },
        properties: {}
      }
    ]
  };
  const imageUrl = 'https://upload.wikimedia.org/wikipedia/commons/4/4e/Pleiades_large.jpg';

  let latitude = $state(35.681236);
  let longitude = $state(139.7673068);
  let height = $state(10000);
  let heading = $state(0);
  let pitch = $state(-30);
  let roll = $state(0);
</script>

<div class="h-screen">
  <Viewer {ionToken}>
    <Terrain assetId={1234} />
    <Imagery url={tileUrl} minimumLevel={0} maximumLevel={19} />
    <Camera bind:latitude bind:longitude bind:height bind:heading bind:pitch bind:roll />
    <GeoJSONPoint
      data={geojsonPointData}
      style={{
        pointImage: imageUrl,
        imageWidth: 32,
        imageHeight: 48,
        rotation: 0,
        anchorX: 0.5,
        anchorY: 1,
        color: '#4169e1',
        opacity: 0.8
      }}
      clampToGround={true}
    />
    <GeoJSONLine
      data={geojsonLineData}
      style={{
        color: '#ff0000',
        opacity: 1,
        lineWidth: 8,
        outlineColor: '#ffffff',
        outlineWidth: 2
      }}
      clampToGround={true}
    />
    <GeoJSONPolygon
      data={geojsonPolygonData}
      style={{
        fillColor: '#ff0000',
        fillOpacity: 0.5,
        outlineColor: '#000000',
        outlineWidth: 2
      }}
    />
    <Mvt
      url={mvtUrl}
      layerName={mvtLayer}
      strokeStyle="#0080ff"
      fillStyle="#00ff80"
      lineWidth={3}
      onSelectFeature={(feature) => console.log('MVT feature selected:', feature)}
    />
  </Viewer>
</div>