diff --git a/components/story/atoms/bands.vue b/components/story/atoms/bands.vue
new file mode 100644
index 0000000..3e503e7
--- /dev/null
+++ b/components/story/atoms/bands.vue
@@ -0,0 +1,54 @@
+
+
+
+
+ {
+ // log.debug(val);
+ updateBands(val);
+ setValue(val as number[]);
+ }
+ "
+ v-model:value="value"
+ :options="options"
+ >
+
+
+
+
+
+
diff --git a/components/story/atoms/characters.vue b/components/story/atoms/characters.vue
new file mode 100644
index 0000000..be0ad80
--- /dev/null
+++ b/components/story/atoms/characters.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/components/story/atoms/genre.vue b/components/story/atoms/genre.vue
new file mode 100644
index 0000000..d91dd87
--- /dev/null
+++ b/components/story/atoms/genre.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/components/story/atoms/pairings.vue b/components/story/atoms/pairings.vue
new file mode 100644
index 0000000..7ad9f98
--- /dev/null
+++ b/components/story/atoms/pairings.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+ update(idx, val as string[])"
+ >
+
+
+
+
+
+
+ remove(idx)"> -
+
+
+
+
+ push([])"> +
+
+
+
+
diff --git a/components/story/atoms/test1.vue b/components/story/atoms/test1.vue
new file mode 100644
index 0000000..587f15d
--- /dev/null
+++ b/components/story/atoms/test1.vue
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/components/story/create/singleChapter.vue b/components/story/create/singleChapter.vue
new file mode 100644
index 0000000..6938882
--- /dev/null
+++ b/components/story/create/singleChapter.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Has NSFW content
+
+
+
+
+ Visible only to registered users
+
+
+
+
+
+ Hides your story from everyone except you and site admins.
+
+ Hidden
+
+
+
+
+
+
+
+
Contents
+
+
+
+
diff --git a/components/story/create/storyform.vue b/components/story/create/storyform.vue
new file mode 100644
index 0000000..2bb78f6
--- /dev/null
+++ b/components/story/create/storyform.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
+
+ Complete
+
+
+
+
+ {
+ if (e.moved) {
+ // log.debug(e.moved);
+ move(e.moved.oldIndex, e.moved.newIndex);
+ acData.chapters = lmove(
+ acData.chapters,
+ e.moved.oldIndex,
+ e.moved.newIndex,
+ );
+ // log.debug(toRaw(acData.chapters.map((a) => toRaw(a))));
+ }
+ }
+ "
+ >
+
+
+
+
+ {{ values.chapters[index]?.chapterTitle || "Untitled" }}
+ {
+ let localFields = toRaw(fields);
+ // log.debug(`${index} | ${element.index}`);
+ // log.debug('fields->', localFields);
+ acData.chapters.splice(index, 1);
+ remove(index);
+ // todo renumber
+ // renumber()
+ }
+ "
+ >
+
+
+
+
+
+
+
+
+ {
+ if (!Array.isArray(values.chapters)) {
+ setFieldValue('chapters', []);
+ }
+ const chaps = [...toRaw(values.chapters)];
+ let lastIndex = chaps.length - 1;
+ if (lastIndex < 0) lastIndex = 0;
+ let lastChapter = chaps[lastIndex];
+ // log.debug('chaptrs->', chaps);
+ // log.debug('lastIndex->', lastIndex, lastChapter);
+ let newChapter = Object.assign({}, defaultChapter, {
+ summary: lastChapter?.summary || '',
+ index: (lastChapter?.index || 0) + 1,
+ bands: lastChapter?.bands || [],
+ characters: lastChapter?.characters || [],
+ relationships: lastChapter?.relationships || [],
+ uuidKey: v4(),
+ genre: lastChapter?.genre || [],
+ });
+ // log.debug('nc->', newChapter);
+ push(newChapter);
+ acData.chapters.push(newChapter);
+ }
+ "
+ >
+ Add chapter
+
+
+
+
+ go.
+
+
diff --git a/components/story/create/uploadOrPaste.vue b/components/story/create/uploadOrPaste.vue
new file mode 100644
index 0000000..a756b8f
--- /dev/null
+++ b/components/story/create/uploadOrPaste.vue
@@ -0,0 +1,53 @@
+
+
+
+ Paste or type content
+ Upload a file
+
+
+
+
+ {
+ let resp = JSON.parse(file.response);
+ if (resp.success) {
+ fileField.setValue(resp.fileName);
+ }
+ }
+ "
+ >
+
+
+ Upload a file
+
+
+