diff --git a/zenno/src/lib/Spark.svelte b/zenno/src/lib/Spark.svelte
new file mode 100644
index 0000000..df6653a
--- /dev/null
+++ b/zenno/src/lib/Spark.svelte
@@ -0,0 +1,70 @@
+
+
+{#if cur != null}
+
+ {cur.name}
+ {stars}
+
+{/if}
+
+
diff --git a/zenno/src/lib/data/spark.ts b/zenno/src/lib/data/spark.ts
new file mode 100644
index 0000000..0964301
--- /dev/null
+++ b/zenno/src/lib/data/spark.ts
@@ -0,0 +1,53 @@
+import globalJSON from '../../../../global/spark.json';
+
+/**
+ * Sparks, or succession factors.
+ */
+export interface Spark {
+ /**
+ * Spark ID.
+ */
+ spark_id: number;
+ /**
+ * Regional spark name.
+ */
+ name: string;
+ /**
+ * Regional spark description.
+ */
+ description: string;
+ /**
+ * Spark group.
+ * Different star levels of a given spark are different spark IDs but
+ * share a spark group.
+ */
+ spark_group: number;
+ /**
+ * Spark rarity, or star level.
+ */
+ rarity: 1 | 2 | 3;
+ /**
+ * Spark type.
+ * Roughly the spark color, with extra subdivisions for white sparks.
+ */
+ type: 1 | 2 | 5 | 4 | 6 | 7 | 10 | 8 | 11 | 9 | 3;
+ /**
+ * Possible effects applied by the spark during inspiration.
+ * A random element is selected from this list according to unknown
+ * distributions, then all effects in that selection are applied.
+ */
+ effects: SparkEffect[][];
+}
+
+/**
+ * Effects that a spark can apply.
+ */
+export interface SparkEffect {
+ target: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 21 | 22 | 23 | 24 | 31 | 32 | 33 | 34 | 41 | 51 | 61 | 62 | 63 | 64 | 65;
+ value1?: number;
+ value2: number;
+}
+
+export const sparks = {
+ global: globalJSON as Spark[],
+} as const;
diff --git a/zenno/src/lib/legacy.ts b/zenno/src/lib/legacy.ts
index 2defc00..50e2837 100644
--- a/zenno/src/lib/legacy.ts
+++ b/zenno/src/lib/legacy.ts
@@ -29,7 +29,7 @@ export function mapLegacy(l: Legacy, f: (u: U) => V): Legacy {
p2: f(l.p2),
s21: f(l.s21),
s22: f(l.s22),
- }
+ };
}
/**