@inkweave/plugins 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var b=Object.defineProperty;var T=(t,e,s)=>e in t?b(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var l=(t,e,s)=>T(t,typeof e!="symbol"?e+"":e,s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("@inkweave/core"),_=require("zustand"),L=require("zustand/middleware"),h=require("react/jsx-runtime"),c=require("react"),C=require("@inkweave/react"),$={local:localStorage,session:sessionStorage};let I="local";const f=()=>$[I];class P{constructor(e){l(this,"data");l(this,"timestamp");l(this,"meta");this.data=JSON.stringify(e),this.timestamp=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(Date.now()),this.meta="autogenerated"}}const y=_.create()(L.persist((t,e)=>({storage:new Map,setStorage:(s,o,n)=>{const i=new Map(e().storage),d=[...i.get(s)||[]];d[o]=new P(n),i.set(s,d),t({storage:i})},changeFormat:s=>{I=s}}),{name:"inkStory",storage:{getItem:t=>{const e=f().getItem(t);if(!e)return null;try{const{state:s}=JSON.parse(e);return{state:{...s,storage:new Map(s.storage)}}}catch(s){return console.error("InkWeave: Failed to parse storage data:",s),null}},setItem:(t,e)=>{const s=JSON.stringify({state:{...e.state,storage:Array.from(e.state.storage.entries())}});f().setItem(t,s)},removeItem:t=>{f().removeItem(t)}}}));let v={memory_format:"local"};const E=t=>y(e=>e.storage.get(t)||null),F=(t,e)=>{const s={state:e.story.state.toJson()};e.save_label.forEach(o=>{const n=e[o];o in e&&n!==void 0&&(typeof n=="string"||typeof n=="number"||typeof n=="boolean"||Array.isArray(n))&&(s[o]=n)}),y.getState().setStorage(e.title,t,s)},O=(t,e)=>{let s=null;try{s=JSON.parse(t)}catch(o){console.error("InkWeave: Failed to parse save data:",o);return}s&&(e.story.state.LoadJson(s.state),e.clear(),e.save_label.forEach(o=>{o in e&&typeof e[o]<"u"&&o in s&&(e[o]=s[o])}),e.continue())},k=()=>{a.Patches.add(function(){y.getState().changeFormat(v.memory_format)},v)},w={save:F,load:O,show:E},M=({className:t="",fallback:e=null})=>{const s=m(p=>p.image),[o,n]=c.useState(!1),i=c.useCallback(()=>{n(!0),console.warn(`InkWeave: Failed to load image: ${s}`)},[s]),d=c.useCallback(()=>{n(!1)},[]);return s?o?e?h.jsx("div",{id:"inkweave-image",className:t,children:e}):null:h.jsx("div",{id:"inkweave-image",className:t,children:h.jsx("img",{src:s,alt:"",onError:i,onLoad:d})}):null},j=c.memo(M),m=_.create(t=>({image:"",setImage:e=>t({image:e})})),A=(t,e)=>e&&"resolveFilename"in e?e.resolveFilename(t):t,q=()=>{a.Tags.add("image",(t,e)=>{t?m.getState().setImage(A(t,e.options.fileHandler)):m.getState().setImage("")}),a.Patches.add(function(){Object.defineProperty(this,"image",{get(){return m.getState().image},set(t){m.getState().setImage(t)}}),this.save_label.push("image"),this.clears.push(()=>{this.image=""})},{})};class r{static get sound(){return this._sound}static get music(){return this._music}static get sound_handler(){return this._sound_handler}static get music_handler(){return this._music_handler}static set_music(e){this._music=new Audio(e),this._music.loop=!0,this._music_handler=()=>{var s;(s=this._music)==null||s.play()},this._music.addEventListener("canplaythrough",this._music_handler)}static set_sound(e){this._sound=new Audio(e),this._sound_handler=()=>{var s;(s=this._sound)==null||s.play()},this._sound.addEventListener("canplaythrough",this._sound_handler)}static cleanupSound(){this._sound&&(this._sound.pause(),this._sound.currentTime=0,this._sound.removeEventListener("canplaythrough",this._sound_handler),this._sound.src=""),this._sound=null,this._sound_handler=()=>{}}static cleanupMusic(){this._music&&(this._music.pause(),this._music.currentTime=0,this._music.removeEventListener("canplaythrough",this._music_handler),this._music.src=""),this._music=null,this._music_handler=()=>{}}}l(r,"_sound",null),l(r,"_music",null),l(r,"_sound_handler",()=>{}),l(r,"_music_handler",()=>{});const S=(t,e)=>e&&"resolveFilename"in e?e.resolveFilename(t):t,x=()=>{a.Tags.add("sound",(t,e)=>{t?(r.cleanupSound(),r.set_sound(S(t,e.options.fileHandler))):r.cleanupSound()}),a.Tags.add("music",(t,e)=>{t?(r.cleanupMusic(),r.set_music(S(t,e.options.fileHandler))):r.cleanupMusic()}),a.Patches.add(function(){this.audio=r,this.cleanups.push(()=>{r.cleanupSound(),r.cleanupMusic()})},{})},D=`
1
+ "use strict";var b=Object.defineProperty;var T=(t,e,s)=>e in t?b(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var l=(t,e,s)=>T(t,typeof e!="symbol"?e+"":e,s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("@inkweave/core"),_=require("zustand"),L=require("zustand/middleware"),h=require("react/jsx-runtime"),c=require("react"),C=require("@inkweave/react"),$={local:localStorage,session:sessionStorage};let I="local";const f=()=>$[I];class E{constructor(e){l(this,"data");l(this,"timestamp");l(this,"meta");this.data=JSON.stringify(e),this.timestamp=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(Date.now()),this.meta="autogenerated"}}const y=_.create()(L.persist((t,e)=>({storage:new Map,setStorage:(s,o,n)=>{const i=new Map(e().storage),d=[...i.get(s)||[]];d[o]=new E(n),i.set(s,d),t({storage:i})},changeFormat:s=>{I=s}}),{name:"inkStory",storage:{getItem:t=>{const e=f().getItem(t);if(!e)return null;try{const{state:s}=JSON.parse(e);return{state:{...s,storage:new Map(s.storage)}}}catch(s){return console.error("InkWeave: Failed to parse storage data:",s),null}},setItem:(t,e)=>{const s=JSON.stringify({state:{...e.state,storage:Array.from(e.state.storage.entries())}});f().setItem(t,s)},removeItem:t=>{f().removeItem(t)}}}));let v={memory_format:"local"};const P=t=>y(e=>e.storage.get(t)||null),F=(t,e)=>{const s={state:e.story.state.toJson()};e.save_label.forEach(o=>{const n=e[o];o in e&&n!==void 0&&(typeof n=="string"||typeof n=="number"||typeof n=="boolean"||Array.isArray(n))&&(s[o]=n)}),y.getState().setStorage(e.title,t,s)},O=(t,e)=>{let s=null;try{s=JSON.parse(t)}catch(o){console.error("InkWeave: Failed to parse save data:",o);return}s&&(e.story.state.LoadJson(s.state),e.clear(),e.save_label.forEach(o=>{o in e&&typeof e[o]<"u"&&o in s&&(e[o]=s[o])}),e.continue())},k=()=>{a.Patches.add(function(){y.getState().changeFormat(v.memory_format)},v)},w={save:F,load:O,show:P},M=({className:t="",fallback:e=null})=>{const s=m(p=>p.image),[o,n]=c.useState(!1);c.useEffect(()=>{n(!1)},[s]);const i=c.useCallback(()=>{n(!0),console.warn(`InkWeave: Failed to load image: ${s}`)},[s]),d=c.useCallback(()=>{n(!1)},[]);return s?o?e?h.jsx("div",{id:"inkweave-image",className:t,children:e}):null:h.jsx("div",{id:"inkweave-image",className:t,children:h.jsx("img",{src:s,alt:"",onError:i,onLoad:d})}):null},j=c.memo(M),m=_.create(t=>({image:"",setImage:e=>t({image:e})})),A=(t,e)=>e&&"resolveFilename"in e?e.resolveFilename(t):t,q=()=>{a.Tags.add("image",(t,e)=>{t?m.getState().setImage(A(t,e.options.fileHandler)):m.getState().setImage("")}),a.Patches.add(function(){Object.defineProperty(this,"image",{get(){return m.getState().image},set(t){m.getState().setImage(t)}}),this.save_label.push("image"),this.clears.push(()=>{this.image=""})},{})};class r{static get sound(){return this._sound}static get music(){return this._music}static get sound_handler(){return this._sound_handler}static get music_handler(){return this._music_handler}static set_music(e){this._music=new Audio(e),this._music.loop=!0,this._music_handler=()=>{var s;(s=this._music)==null||s.play()},this._music.addEventListener("canplaythrough",this._music_handler)}static set_sound(e){this._sound=new Audio(e),this._sound_handler=()=>{var s;(s=this._sound)==null||s.play()},this._sound.addEventListener("canplaythrough",this._sound_handler)}static cleanupSound(){this._sound&&(this._sound.pause(),this._sound.currentTime=0,this._sound.removeEventListener("canplaythrough",this._sound_handler),this._sound.src=""),this._sound=null,this._sound_handler=()=>{}}static cleanupMusic(){this._music&&(this._music.pause(),this._music.currentTime=0,this._music.removeEventListener("canplaythrough",this._music_handler),this._music.src=""),this._music=null,this._music_handler=()=>{}}}l(r,"_sound",null),l(r,"_music",null),l(r,"_sound_handler",()=>{}),l(r,"_music_handler",()=>{});const S=(t,e)=>e&&"resolveFilename"in e?e.resolveFilename(t):t,x=()=>{a.Tags.add("sound",(t,e)=>{t?(r.cleanupSound(),r.set_sound(S(t,e.options.fileHandler))):r.cleanupSound()}),a.Tags.add("music",(t,e)=>{t?(r.cleanupMusic(),r.set_music(S(t,e.options.fileHandler))):r.cleanupMusic()}),a.Patches.add(function(){this.audio=r,this.cleanups.push(()=>{r.cleanupSound(),r.cleanupMusic()})},{})},D=`
2
2
  #inkweave-contents div,
3
3
  #inkweave-choices {
4
4
  opacity: 0;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/memory/storage.ts","../src/memory/index.ts","../src/image/Image.tsx","../src/image/index.ts","../src/audio/AudioController.ts","../src/audio/index.ts","../src/fadeEffect/index.ts","../src/scrollafterchoice/index.ts","../src/linkopen/index.ts","../src/autoButton/AutoButton.tsx","../src/autoButton/index.ts","../src/cdButton/CdButton.tsx","../src/cdButton/index.ts","../src/autosave/index.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { persist, StorageValue } from 'zustand/middleware';\n\nconst StorageType: { [key: string]: Storage } = {\n\tlocal: localStorage,\n\tsession: sessionStorage,\n};\n\nlet type = 'local';\nconst getStorage = () => {\n\treturn StorageType[type];\n};\n\nexport interface SaveSlot {\n\tdata: string;\n\ttimestamp: string;\n\tmeta: string;\n}\n\nexport class Save implements SaveSlot {\n\tdata: string;\n\ttimestamp: string;\n\tmeta: string;\n\n\tconstructor(data: object) {\n\t\tthis.data = JSON.stringify(data);\n\t\tthis.timestamp = new Intl.DateTimeFormat(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t}).format(Date.now());\n\t\tthis.meta = 'autogenerated';\n\t}\n}\n\ninterface StorageInterface {\n\tstorage: Map<string, SaveSlot[]>;\n\tsetStorage: (title: string, index: number, data: object) => void;\n\tchangeFormat: (format: string) => void;\n}\n\nconst useStorage = create<StorageInterface>()(\n\tpersist(\n\t\t(set, get) => ({\n\t\t\tstorage: new Map(),\n\t\t\tsetStorage: (title, index, data) => {\n\t\t\t\tconst newSavesMap = new Map(get().storage);\n\t\t\t\tconst file_saves = [...(newSavesMap.get(title) || [])];\n\t\t\t\tfile_saves[index] = new Save(data);\n\t\t\t\tnewSavesMap.set(title, file_saves);\n\t\t\t\tset({ storage: newSavesMap });\n\t\t\t},\n\t\t\tchangeFormat: (format) => {\n\t\t\t\ttype = format;\n\t\t\t},\n\t\t}),\n\t\t{\n\t\t\tname: 'inkStory',\n\t\t\tstorage: {\n\t\t\t\tgetItem: (name) => {\n\t\t\t\t\tconst str = getStorage().getItem(name);\n\t\t\t\t\tif (!str) return null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { state } = JSON.parse(str);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\tstorage: new Map(state.storage),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error('InkWeave: Failed to parse storage data:', e);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetItem: (name, newValue: StorageValue<StorageInterface>) => {\n\t\t\t\t\tconst str = JSON.stringify({\n\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t...newValue.state,\n\t\t\t\t\t\t\tstorage: Array.from(\n\t\t\t\t\t\t\t\tnewValue.state.storage.entries()\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tgetStorage().setItem(name, str);\n\t\t\t\t},\n\t\t\t\tremoveItem: (name) => {\n\t\t\t\t\tgetStorage().removeItem(name);\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t)\n);\n\nexport default useStorage;","import type { InkStory } from '@inkweave/core';\nimport { Patches } from '@inkweave/core';\nimport useStorage from './storage';\nimport type { SaveSlot } from './storage';\n\ninterface MemorySaveData {\n\tstate: string;\n\t[key: string]: string | number | boolean | string[] | undefined;\n}\n\nlet options = {\n\tmemory_format: 'local',\n};\n\nconst show = (title: string): SaveSlot[] | null => {\n\treturn useStorage((state) => state.storage.get(title) || null);\n};\n\nconst save = (index: number, ink: InkStory) => {\n\tconst saveData: MemorySaveData = {\n\t\tstate: ink.story.state.toJson(),\n\t};\n\tink.save_label.forEach((label) => {\n\t\tconst value = ink[label as keyof InkStory];\n\t\tif (label in ink && value !== undefined) {\n\t\t\tif (\n\t\t\t\ttypeof value === 'string' ||\n\t\t\t\ttypeof value === 'number' ||\n\t\t\t\ttypeof value === 'boolean' ||\n\t\t\t\tArray.isArray(value)\n\t\t\t) {\n\t\t\t\tsaveData[label] = value as string | number | boolean | string[];\n\t\t\t}\n\t\t}\n\t});\n\tuseStorage.getState().setStorage(ink.title, index, saveData);\n};\n\nconst load = (save_data: string, ink: InkStory) => {\n\tlet save: MemorySaveData | null = null;\n\ttry {\n\t\tsave = JSON.parse(save_data);\n\t} catch (e) {\n\t\tconsole.error('InkWeave: Failed to parse save data:', e);\n\t\treturn;\n\t}\n\tif (save) {\n\t\tink.story.state.LoadJson(save.state);\n\t\tink.clear();\n\t\tink.save_label.forEach((label) => {\n\t\t\tif (\n\t\t\t\tlabel in ink &&\n\t\t\t\ttypeof ink[label as keyof InkStory] !== 'undefined' &&\n\t\t\t\tlabel in save\n\t\t\t)\n\t\t\t\t(ink as Record<string, unknown>)[label] = save[label];\n\t\t});\n\t\tink.continue();\n\t}\n};\n\nconst loadMemory = () => {\n\tPatches.add(function () {\n\t\tuseStorage.getState().changeFormat(options.memory_format);\n\t}, options);\n};\n\nexport const memory = { save, load, show };\nexport type { SaveSlot };\nexport default loadMemory;","import { memo, useState, useCallback } from 'react';\nimport { useStoryImage } from './index';\n\ninterface ImageProps {\n\tclassName?: string;\n\tfallback?: React.ReactNode;\n}\n\nconst ImageComponent: React.FC<ImageProps> = ({ className = '', fallback = null }) => {\n\tconst image = useStoryImage((state) => state.image);\n\tconst [hasError, setHasError] = useState(false);\n\n\tconst handleError = useCallback(() => {\n\t\tsetHasError(true);\n\t\tconsole.warn(`InkWeave: Failed to load image: ${image}`);\n\t}, [image]);\n\n\tconst handleLoad = useCallback(() => {\n\t\tsetHasError(false);\n\t}, []);\n\n\tif (!image) return null;\n\n\tif (hasError) {\n\t\treturn fallback ? <div id=\"inkweave-image\" className={className}>{fallback}</div> : null;\n\t}\n\n\treturn (\n\t\t<div id=\"inkweave-image\" className={className}>\n\t\t\t<img src={image} alt=\"\" onError={handleError} onLoad={handleLoad} />\n\t\t</div>\n\t);\n};\n\nexport default memo(ImageComponent);","import { create } from 'zustand';\nimport { Tags, Patches, type InkStory, type FileHandler } from '@inkweave/core';\n\ndeclare module '@inkweave/core' {\n\tinterface InkStory {\n\t\timage: string;\n\t}\n}\n\ntype StoryImage = {\n\timage: string;\n\tsetImage: (image: string) => void;\n};\n\nexport const useStoryImage = create<StoryImage>((set) => ({\n\timage: '',\n\tsetImage: (image) => set({ image }),\n}));\n\nconst getPath = (path: string, fileHandler?: FileHandler) => {\n\tif (fileHandler && 'resolveFilename' in fileHandler) {\n\t\treturn (fileHandler as { resolveFilename: (f: string) => string }).resolveFilename(path);\n\t}\n\treturn path;\n};\n\nconst load = () => {\n\tTags.add('image', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tuseStoryImage.getState().setImage(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tuseStoryImage.getState().setImage('');\n\t\t}\n\t});\n\n\tPatches.add(function () {\n\t\tObject.defineProperty(this, 'image', {\n\t\t\tget() {\n\t\t\t\treturn useStoryImage.getState().image;\n\t\t\t},\n\n\t\t\tset(path: string) {\n\t\t\t\tuseStoryImage.getState().setImage(path);\n\t\t\t},\n\t\t});\n\t\tthis.save_label.push('image');\n\t\tthis.clears.push(() => {\n\t\t\tthis.image = '';\n\t\t});\n\t}, {});\n};\n\nexport default load;\nexport { default as Image } from './Image';","export class AudioController {\n\tprivate static _sound: HTMLAudioElement | null = null;\n\tprivate static _music: HTMLAudioElement | null = null;\n\tprivate static _sound_handler: () => void = () => {};\n\tprivate static _music_handler: () => void = () => {};\n\n\tstatic get sound() {\n\t\treturn this._sound;\n\t}\n\n\tstatic get music() {\n\t\treturn this._music;\n\t}\n\n\tstatic get sound_handler() {\n\t\treturn this._sound_handler;\n\t}\n\n\tstatic get music_handler() {\n\t\treturn this._music_handler;\n\t}\n\n\tstatic set_music(path: string) {\n\t\tthis._music = new Audio(path);\n\t\tthis._music.loop = true;\n\t\tthis._music_handler = () => {\n\t\t\tthis._music?.play();\n\t\t};\n\t\tthis._music.addEventListener('canplaythrough', this._music_handler);\n\t}\n\n\tstatic set_sound(path: string) {\n\t\tthis._sound = new Audio(path);\n\t\tthis._sound_handler = () => {\n\t\t\tthis._sound?.play();\n\t\t};\n\t\tthis._sound.addEventListener('canplaythrough', this._sound_handler);\n\t}\n\n\tstatic cleanupSound() {\n\t\tif (this._sound) {\n\t\t\tthis._sound.pause();\n\t\t\tthis._sound.currentTime = 0;\n\t\t\tthis._sound.removeEventListener(\n\t\t\t\t'canplaythrough',\n\t\t\t\tthis._sound_handler\n\t\t\t);\n\t\t\tthis._sound.src = '';\n\t\t}\n\t\tthis._sound = null;\n\t\tthis._sound_handler = () => {};\n\t}\n\n\tstatic cleanupMusic() {\n\t\tif (this._music) {\n\t\t\tthis._music.pause();\n\t\t\tthis._music.currentTime = 0;\n\t\t\tthis._music.removeEventListener(\n\t\t\t\t'canplaythrough',\n\t\t\t\tthis._music_handler\n\t\t\t);\n\t\t\tthis._music.src = '';\n\t\t}\n\t\tthis._music = null;\n\t\tthis._music_handler = () => {};\n\t}\n}","import { Tags, Patches, type InkStory, type FileHandler } from '@inkweave/core';\nimport { AudioController } from './AudioController';\n\nconst getPath = (path: string, fileHandler?: FileHandler) => {\n\tif (fileHandler && 'resolveFilename' in fileHandler) {\n\t\treturn (fileHandler as { resolveFilename: (f: string) => string }).resolveFilename(path);\n\t}\n\treturn path;\n};\n\nconst load = () => {\n\tTags.add('sound', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tAudioController.cleanupSound();\n\t\t\tAudioController.set_sound(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tAudioController.cleanupSound();\n\t\t}\n\t});\n\n\tTags.add('music', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tAudioController.cleanupMusic();\n\t\t\tAudioController.set_music(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tAudioController.cleanupMusic();\n\t\t}\n\t});\n\n\tPatches.add(function () {\n\t\tthis.audio = AudioController;\n\t\tthis.cleanups.push(() => {\n\t\t\tAudioController.cleanupSound();\n\t\t\tAudioController.cleanupMusic();\n\t\t});\n\t}, {});\n};\n\nexport default load;","import { Patches, contentsStore, createSelectors, type InkStoryContext } from '@inkweave/core';\nimport { create } from 'zustand';\n\nconst FADE_CSS = `\n#inkweave-contents div,\n#inkweave-choices {\n opacity: 0;\n animation: inkFadeIn 0.5s forwards;\n animation-delay: var(--delay, 0s);\n}\n@keyframes inkFadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n`;\n\nconst options = {\n\tlinedelay: 0.05,\n};\n\ntype ContentComplete = {\n\tcontentComplete: boolean;\n\tlast_content: string;\n\tsetContentComplete: (contentComplete: boolean) => void;\n\tsetLastContent: (contents: string[]) => void;\n};\n\nconst useContentComplete = create<ContentComplete>((set) => ({\n\tcontentComplete: true,\n\tlast_content: '',\n\tsetContentComplete: (contentComplete) => set({ contentComplete }),\n\tsetLastContent: (contents) => {\n\t\tif (contents.length === 0) {\n\t\t\tset({ last_content: '' });\n\t\t\treturn;\n\t\t}\n\t\tconst last_content = contents[contents.length - 1];\n\t\tset({ last_content });\n\t},\n}));\n\nlet styleElement: HTMLStyleElement | null = null;\n\nconst load = () => {\n\t// Inject CSS only once\n\tif (!styleElement) {\n\t\tstyleElement = document.createElement('style');\n\t\tstyleElement.textContent = FADE_CSS;\n\t\tdocument.head.appendChild(styleElement);\n\t}\n\n\tPatches.add(function (this: InkStoryContext) {\n\t\tconst originalChoose = this.choose as (index: number) => void;\n\t\tconst self = this;\n\t\tthis.choose = function (index: number) {\n\t\t\tif (self.options.linedelay != 0) {\n\t\t\t\tuseContentComplete.getState().setContentComplete(false);\n\t\t\t\tuseContentComplete.getState().setLastContent(self.contents as string[]);\n\t\t\t}\n\t\t\treturn originalChoose.call(self, index);\n\t\t};\n\t\tObject.defineProperty(this, 'visibleLines', {\n\t\t\tget() {\n\t\t\t\tconst last_content = useContentComplete.getState().last_content;\n\t\t\t\treturn (self.contents as string[]).lastIndexOf(last_content);\n\t\t\t},\n\t\t});\n\t\tObject.defineProperty(this, 'choicesCanShow', {\n\t\t\tget() {\n\t\t\t\treturn createSelectors(useContentComplete).use.contentComplete();\n\t\t\t},\n\t\t});\n\n\t\tlet timer: ReturnType<typeof setTimeout> | null = null;\n\t\tconst unsub = contentsStore.subscribe(() => {\n\t\t\tif (self.options.linedelay == 0) return;\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\tuseContentComplete.getState().setContentComplete(true);\n\t\t\t}, ((self.contents as string[]).length - (self.visibleLines as number)) * (self.options.linedelay as number) * 1000);\n\t\t});\n\n\t\tthis.cleanups.push(() => {\n\t\t\tunsub();\n\t\t\tif (timer) clearTimeout(timer);\n\t\t});\n\t\tthis.clears.push(() => {\n\t\t\tif (self.options.linedelay != 0)\n\t\t\t\tuseContentComplete.getState().setContentComplete(false);\n\t\t\tuseContentComplete.getState().setLastContent([]);\n\t\t});\n\t}, options);\n};\n\nexport default load;","import { Patches, choicesStore } from '@inkweave/core';\n\nconst load = () => {\n\tPatches.add(function () {\n\t\tlet scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\t\t\n\t\tconst unsub = choicesStore.subscribe(() => {\n\t\t\tif (scrollTimer) clearTimeout(scrollTimer);\n\t\t\t\n\t\t\tscrollTimer = setTimeout(() => {\n\t\t\t\tconst lastButton = document.querySelector(\n\t\t\t\t\t'ul#inkweave-choices > li:last-child'\n\t\t\t\t) as HTMLElement;\n\t\t\t\tif (lastButton) {\n\t\t\t\t\tconst element = document.querySelector(\n\t\t\t\t\t\t'#inkweave-story'\n\t\t\t\t\t) as HTMLElement;\n\t\t\t\t\telement?.scrollTo({\n\t\t\t\t\t\ttop: lastButton.offsetTop,\n\t\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t});\n\t\t\n\t\tthis.cleanups.push(() => {\n\t\t\tunsub();\n\t\t\tif (scrollTimer) clearTimeout(scrollTimer);\n\t\t});\n\t}, {});\n};\n\nexport default load;","import { Tags } from '@inkweave/core';\n\nconst ALLOWED_PROTOCOLS = ['http:', 'https:'];\n\nconst load = () => {\n\tTags.add('linkopen', (val: string | null | undefined) => {\n\t\tif (val) {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(val);\n\t\t\t\tif (!ALLOWED_PROTOCOLS.includes(url.protocol)) {\n\t\t\t\t\tconsole.warn('InkWeave: Blocked unsafe URL protocol:', url.protocol);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.warn('InkWeave: Invalid URL:', val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twindow.open(val, '_blank', 'noopener,noreferrer');\n\t\t}\n\t});\n};\n\nexport default load;","import { memo, useEffect, useRef } from 'react';\nimport type { ChoiceComponentProps } from '@inkweave/react';\n\nconst AutoChoice: React.FC<ChoiceComponentProps> = ({\n\tval,\n\tonClick,\n\tclassName = '',\n\tchildren,\n}) => {\n\tconst intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\tconst cd = parseFloat(val || '0');\n\n\tuseEffect(() => {\n\t\tif (cd <= 0) return;\n\n\t\tintervalRef.current = setInterval(() => {\n\t\t\tonClick();\n\t\t}, cd * 1000);\n\n\t\treturn () => {\n\t\t\tif (intervalRef.current) {\n\t\t\t\tclearInterval(intervalRef.current);\n\t\t\t}\n\t\t};\n\t}, [cd, onClick]);\n\n\treturn (\n\t\t<a className={`inkweave-btn ${className}`} style={{ display: 'none' }}>\n\t\t\t{children}\n\t\t</a>\n\t);\n};\n\nexport default memo(AutoChoice);","import { ChoiceParser, Patches } from '@inkweave/core';\nimport { ChoiceComponents } from '@inkweave/react';\nimport AutoChoice from './AutoButton';\n\nconst load = () => {\n\tChoiceParser.add('auto', (new_choice, val) => {\n\t\tnew_choice.type = 'auto';\n\t\tnew_choice.val = val;\n\t});\n\tChoiceComponents.register('auto', AutoChoice);\n\tPatches.add(null, {});\n};\n\nexport default load;","import { memo, useState } from 'react';\nimport type { ChoiceComponentProps } from '@inkweave/react';\n\nconst CooldownChoice: React.FC<ChoiceComponentProps> = ({\n\tval,\n\tonClick,\n\tclassName = '',\n\tchildren,\n}) => {\n\tconst [isDisabled, setIsDisabled] = useState(false);\n\tconst cd = parseFloat(val || '0');\n\n\tconst handleClick = () => {\n\t\tif (isDisabled) return;\n\n\t\tonClick();\n\t\tsetIsDisabled(true);\n\n\t\tsetTimeout(() => {\n\t\t\tsetIsDisabled(false);\n\t\t}, cd * 1000);\n\t};\n\n\treturn (\n\t\t<a\n\t\t\tclassName={`inkweave-btn ${className} ${isDisabled ? 'disabled' : ''}`}\n\t\t\tonClick={handleClick}\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t);\n};\n\nexport default memo(CooldownChoice);","import { ChoiceParser, Patches } from '@inkweave/core';\nimport { ChoiceComponents } from '@inkweave/react';\nimport CooldownChoice from './CdButton';\n\nconst load = () => {\n\tChoiceParser.add('cd', (new_choice, val) => {\n\t\tnew_choice.type = 'cd';\n\t\tnew_choice.val = val;\n\t});\n\tChoiceComponents.register('cd', CooldownChoice);\n\tPatches.add(null, {});\n};\n\nexport default load;","import type { InkStory } from '@inkweave/core';\nimport { Patches, Tags } from '@inkweave/core';\nimport { memory } from '../memory';\n\nconst options = {\n\tautosave_enabled: true,\n};\n\nconst load = () => {\n\tTags.add('autosave', (_: string | null | undefined, ink: InkStory) => {\n\t\tif (ink.options.autosave_enabled) {\n\t\t\tmemory.save(2, ink);\n\t\t}\n\t});\n\n\tPatches.add(null, options);\n};\n\nexport default load;"],"names":["StorageType","type","getStorage","Save","data","__publicField","useStorage","create","persist","set","get","title","index","newSavesMap","file_saves","format","name","str","state","e","newValue","options","show","save","ink","saveData","label","value","load","save_data","loadMemory","Patches","memory","ImageComponent","className","fallback","image","useStoryImage","hasError","setHasError","useState","handleError","useCallback","handleLoad","jsx","Image","memo","getPath","path","fileHandler","Tags","val","AudioController","_a","FADE_CSS","useContentComplete","contentComplete","contents","last_content","styleElement","originalChoose","self","createSelectors","timer","unsub","contentsStore","scrollTimer","choicesStore","lastButton","element","ALLOWED_PROTOCOLS","url","AutoChoice","onClick","children","intervalRef","useRef","cd","useEffect","ChoiceParser","new_choice","ChoiceComponents","CooldownChoice","isDisabled","setIsDisabled","handleClick","_"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/memory/storage.ts","../src/memory/index.ts","../src/image/Image.tsx","../src/image/index.ts","../src/audio/AudioController.ts","../src/audio/index.ts","../src/fadeEffect/index.ts","../src/scrollafterchoice/index.ts","../src/linkopen/index.ts","../src/autoButton/AutoButton.tsx","../src/autoButton/index.ts","../src/cdButton/CdButton.tsx","../src/cdButton/index.ts","../src/autosave/index.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { persist, StorageValue } from 'zustand/middleware';\n\nconst StorageType: { [key: string]: Storage } = {\n\tlocal: localStorage,\n\tsession: sessionStorage,\n};\n\nlet type = 'local';\nconst getStorage = () => {\n\treturn StorageType[type];\n};\n\nexport interface SaveSlot {\n\tdata: string;\n\ttimestamp: string;\n\tmeta: string;\n}\n\nexport class Save implements SaveSlot {\n\tdata: string;\n\ttimestamp: string;\n\tmeta: string;\n\n\tconstructor(data: object) {\n\t\tthis.data = JSON.stringify(data);\n\t\tthis.timestamp = new Intl.DateTimeFormat(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t}).format(Date.now());\n\t\tthis.meta = 'autogenerated';\n\t}\n}\n\ninterface StorageInterface {\n\tstorage: Map<string, SaveSlot[]>;\n\tsetStorage: (title: string, index: number, data: object) => void;\n\tchangeFormat: (format: string) => void;\n}\n\nconst useStorage = create<StorageInterface>()(\n\tpersist(\n\t\t(set, get) => ({\n\t\t\tstorage: new Map(),\n\t\t\tsetStorage: (title, index, data) => {\n\t\t\t\tconst newSavesMap = new Map(get().storage);\n\t\t\t\tconst file_saves = [...(newSavesMap.get(title) || [])];\n\t\t\t\tfile_saves[index] = new Save(data);\n\t\t\t\tnewSavesMap.set(title, file_saves);\n\t\t\t\tset({ storage: newSavesMap });\n\t\t\t},\n\t\t\tchangeFormat: (format) => {\n\t\t\t\ttype = format;\n\t\t\t},\n\t\t}),\n\t\t{\n\t\t\tname: 'inkStory',\n\t\t\tstorage: {\n\t\t\t\tgetItem: (name) => {\n\t\t\t\t\tconst str = getStorage().getItem(name);\n\t\t\t\t\tif (!str) return null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { state } = JSON.parse(str);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\tstorage: new Map(state.storage),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error('InkWeave: Failed to parse storage data:', e);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetItem: (name, newValue: StorageValue<StorageInterface>) => {\n\t\t\t\t\tconst str = JSON.stringify({\n\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t...newValue.state,\n\t\t\t\t\t\t\tstorage: Array.from(\n\t\t\t\t\t\t\t\tnewValue.state.storage.entries()\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tgetStorage().setItem(name, str);\n\t\t\t\t},\n\t\t\t\tremoveItem: (name) => {\n\t\t\t\t\tgetStorage().removeItem(name);\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t)\n);\n\nexport default useStorage;","import type { InkStory } from '@inkweave/core';\nimport { Patches } from '@inkweave/core';\nimport useStorage from './storage';\nimport type { SaveSlot } from './storage';\n\ninterface MemorySaveData {\n\tstate: string;\n\t[key: string]: string | number | boolean | string[] | undefined;\n}\n\nlet options = {\n\tmemory_format: 'local',\n};\n\nconst show = (title: string): SaveSlot[] | null => {\n\treturn useStorage((state) => state.storage.get(title) || null);\n};\n\nconst save = (index: number, ink: InkStory) => {\n\tconst saveData: MemorySaveData = {\n\t\tstate: ink.story.state.toJson(),\n\t};\n\tink.save_label.forEach((label) => {\n\t\tconst value = ink[label as keyof InkStory];\n\t\tif (label in ink && value !== undefined) {\n\t\t\tif (\n\t\t\t\ttypeof value === 'string' ||\n\t\t\t\ttypeof value === 'number' ||\n\t\t\t\ttypeof value === 'boolean' ||\n\t\t\t\tArray.isArray(value)\n\t\t\t) {\n\t\t\t\tsaveData[label] = value as string | number | boolean | string[];\n\t\t\t}\n\t\t}\n\t});\n\tuseStorage.getState().setStorage(ink.title, index, saveData);\n};\n\nconst load = (save_data: string, ink: InkStory) => {\n\tlet save: MemorySaveData | null = null;\n\ttry {\n\t\tsave = JSON.parse(save_data);\n\t} catch (e) {\n\t\tconsole.error('InkWeave: Failed to parse save data:', e);\n\t\treturn;\n\t}\n\tif (save) {\n\t\tink.story.state.LoadJson(save.state);\n\t\tink.clear();\n\t\tink.save_label.forEach((label) => {\n\t\t\tif (\n\t\t\t\tlabel in ink &&\n\t\t\t\ttypeof ink[label as keyof InkStory] !== 'undefined' &&\n\t\t\t\tlabel in save\n\t\t\t)\n\t\t\t\t(ink as Record<string, unknown>)[label] = save[label];\n\t\t});\n\t\tink.continue();\n\t}\n};\n\nconst loadMemory = () => {\n\tPatches.add(function () {\n\t\tuseStorage.getState().changeFormat(options.memory_format);\n\t}, options);\n};\n\nexport const memory = { save, load, show };\nexport type { SaveSlot };\nexport default loadMemory;","import { memo, useState, useCallback, useEffect } from 'react';\nimport { useStoryImage } from './index';\n\ninterface ImageProps {\n\tclassName?: string;\n\tfallback?: React.ReactNode;\n}\n\nconst ImageComponent: React.FC<ImageProps> = ({ className = '', fallback = null }) => {\n\tconst image = useStoryImage((state) => state.image);\n\tconst [hasError, setHasError] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetHasError(false);\n\t}, [image]);\n\n\tconst handleError = useCallback(() => {\n\t\tsetHasError(true);\n\t\tconsole.warn(`InkWeave: Failed to load image: ${image}`);\n\t}, [image]);\n\n\tconst handleLoad = useCallback(() => {\n\t\tsetHasError(false);\n\t}, []);\n\n\tif (!image) return null;\n\n\tif (hasError) {\n\t\treturn fallback ? <div id=\"inkweave-image\" className={className}>{fallback}</div> : null;\n\t}\n\n\treturn (\n\t\t<div id=\"inkweave-image\" className={className}>\n\t\t\t<img src={image} alt=\"\" onError={handleError} onLoad={handleLoad} />\n\t\t</div>\n\t);\n};\n\nexport default memo(ImageComponent);","import { create } from 'zustand';\nimport { Tags, Patches, type InkStory, type FileHandler } from '@inkweave/core';\n\ndeclare module '@inkweave/core' {\n\tinterface InkStory {\n\t\timage: string;\n\t}\n}\n\ntype StoryImage = {\n\timage: string;\n\tsetImage: (image: string) => void;\n};\n\nexport const useStoryImage = create<StoryImage>((set) => ({\n\timage: '',\n\tsetImage: (image) => set({ image }),\n}));\n\nconst getPath = (path: string, fileHandler?: FileHandler) => {\n\tif (fileHandler && 'resolveFilename' in fileHandler) {\n\t\treturn (fileHandler as { resolveFilename: (f: string) => string }).resolveFilename(path);\n\t}\n\treturn path;\n};\n\nconst load = () => {\n\tTags.add('image', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tuseStoryImage.getState().setImage(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tuseStoryImage.getState().setImage('');\n\t\t}\n\t});\n\n\tPatches.add(function () {\n\t\tObject.defineProperty(this, 'image', {\n\t\t\tget() {\n\t\t\t\treturn useStoryImage.getState().image;\n\t\t\t},\n\n\t\t\tset(path: string) {\n\t\t\t\tuseStoryImage.getState().setImage(path);\n\t\t\t},\n\t\t});\n\t\tthis.save_label.push('image');\n\t\tthis.clears.push(() => {\n\t\t\tthis.image = '';\n\t\t});\n\t}, {});\n};\n\nexport default load;\nexport { default as Image } from './Image';","export class AudioController {\n\tprivate static _sound: HTMLAudioElement | null = null;\n\tprivate static _music: HTMLAudioElement | null = null;\n\tprivate static _sound_handler: () => void = () => {};\n\tprivate static _music_handler: () => void = () => {};\n\n\tstatic get sound() {\n\t\treturn this._sound;\n\t}\n\n\tstatic get music() {\n\t\treturn this._music;\n\t}\n\n\tstatic get sound_handler() {\n\t\treturn this._sound_handler;\n\t}\n\n\tstatic get music_handler() {\n\t\treturn this._music_handler;\n\t}\n\n\tstatic set_music(path: string) {\n\t\tthis._music = new Audio(path);\n\t\tthis._music.loop = true;\n\t\tthis._music_handler = () => {\n\t\t\tthis._music?.play();\n\t\t};\n\t\tthis._music.addEventListener('canplaythrough', this._music_handler);\n\t}\n\n\tstatic set_sound(path: string) {\n\t\tthis._sound = new Audio(path);\n\t\tthis._sound_handler = () => {\n\t\t\tthis._sound?.play();\n\t\t};\n\t\tthis._sound.addEventListener('canplaythrough', this._sound_handler);\n\t}\n\n\tstatic cleanupSound() {\n\t\tif (this._sound) {\n\t\t\tthis._sound.pause();\n\t\t\tthis._sound.currentTime = 0;\n\t\t\tthis._sound.removeEventListener(\n\t\t\t\t'canplaythrough',\n\t\t\t\tthis._sound_handler\n\t\t\t);\n\t\t\tthis._sound.src = '';\n\t\t}\n\t\tthis._sound = null;\n\t\tthis._sound_handler = () => {};\n\t}\n\n\tstatic cleanupMusic() {\n\t\tif (this._music) {\n\t\t\tthis._music.pause();\n\t\t\tthis._music.currentTime = 0;\n\t\t\tthis._music.removeEventListener(\n\t\t\t\t'canplaythrough',\n\t\t\t\tthis._music_handler\n\t\t\t);\n\t\t\tthis._music.src = '';\n\t\t}\n\t\tthis._music = null;\n\t\tthis._music_handler = () => {};\n\t}\n}","import { Tags, Patches, type InkStory, type FileHandler } from '@inkweave/core';\nimport { AudioController } from './AudioController';\n\nconst getPath = (path: string, fileHandler?: FileHandler) => {\n\tif (fileHandler && 'resolveFilename' in fileHandler) {\n\t\treturn (fileHandler as { resolveFilename: (f: string) => string }).resolveFilename(path);\n\t}\n\treturn path;\n};\n\nconst load = () => {\n\tTags.add('sound', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tAudioController.cleanupSound();\n\t\t\tAudioController.set_sound(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tAudioController.cleanupSound();\n\t\t}\n\t});\n\n\tTags.add('music', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tAudioController.cleanupMusic();\n\t\t\tAudioController.set_music(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tAudioController.cleanupMusic();\n\t\t}\n\t});\n\n\tPatches.add(function () {\n\t\tthis.audio = AudioController;\n\t\tthis.cleanups.push(() => {\n\t\t\tAudioController.cleanupSound();\n\t\t\tAudioController.cleanupMusic();\n\t\t});\n\t}, {});\n};\n\nexport default load;","import { Patches, contentsStore, createSelectors, type InkStoryContext } from '@inkweave/core';\nimport { create } from 'zustand';\n\nconst FADE_CSS = `\n#inkweave-contents div,\n#inkweave-choices {\n opacity: 0;\n animation: inkFadeIn 0.5s forwards;\n animation-delay: var(--delay, 0s);\n}\n@keyframes inkFadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n`;\n\nconst options = {\n\tlinedelay: 0.05,\n};\n\ntype ContentComplete = {\n\tcontentComplete: boolean;\n\tlast_content: string;\n\tsetContentComplete: (contentComplete: boolean) => void;\n\tsetLastContent: (contents: string[]) => void;\n};\n\nconst useContentComplete = create<ContentComplete>((set) => ({\n\tcontentComplete: true,\n\tlast_content: '',\n\tsetContentComplete: (contentComplete) => set({ contentComplete }),\n\tsetLastContent: (contents) => {\n\t\tif (contents.length === 0) {\n\t\t\tset({ last_content: '' });\n\t\t\treturn;\n\t\t}\n\t\tconst last_content = contents[contents.length - 1];\n\t\tset({ last_content });\n\t},\n}));\n\nlet styleElement: HTMLStyleElement | null = null;\n\nconst load = () => {\n\t// Inject CSS only once\n\tif (!styleElement) {\n\t\tstyleElement = document.createElement('style');\n\t\tstyleElement.textContent = FADE_CSS;\n\t\tdocument.head.appendChild(styleElement);\n\t}\n\n\tPatches.add(function (this: InkStoryContext) {\n\t\tconst originalChoose = this.choose as (index: number) => void;\n\t\tconst self = this;\n\t\tthis.choose = function (index: number) {\n\t\t\tif (self.options.linedelay != 0) {\n\t\t\t\tuseContentComplete.getState().setContentComplete(false);\n\t\t\t\tuseContentComplete.getState().setLastContent(self.contents as string[]);\n\t\t\t}\n\t\t\treturn originalChoose.call(self, index);\n\t\t};\n\t\tObject.defineProperty(this, 'visibleLines', {\n\t\t\tget() {\n\t\t\t\tconst last_content = useContentComplete.getState().last_content;\n\t\t\t\treturn (self.contents as string[]).lastIndexOf(last_content);\n\t\t\t},\n\t\t});\n\t\tObject.defineProperty(this, 'choicesCanShow', {\n\t\t\tget() {\n\t\t\t\treturn createSelectors(useContentComplete).use.contentComplete();\n\t\t\t},\n\t\t});\n\n\t\tlet timer: ReturnType<typeof setTimeout> | null = null;\n\t\tconst unsub = contentsStore.subscribe(() => {\n\t\t\tif (self.options.linedelay == 0) return;\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\tuseContentComplete.getState().setContentComplete(true);\n\t\t\t}, ((self.contents as string[]).length - (self.visibleLines as number)) * (self.options.linedelay as number) * 1000);\n\t\t});\n\n\t\tthis.cleanups.push(() => {\n\t\t\tunsub();\n\t\t\tif (timer) clearTimeout(timer);\n\t\t});\n\t\tthis.clears.push(() => {\n\t\t\tif (self.options.linedelay != 0)\n\t\t\t\tuseContentComplete.getState().setContentComplete(false);\n\t\t\tuseContentComplete.getState().setLastContent([]);\n\t\t});\n\t}, options);\n};\n\nexport default load;","import { Patches, choicesStore } from '@inkweave/core';\n\nconst load = () => {\n\tPatches.add(function () {\n\t\tlet scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\t\t\n\t\tconst unsub = choicesStore.subscribe(() => {\n\t\t\tif (scrollTimer) clearTimeout(scrollTimer);\n\t\t\t\n\t\t\tscrollTimer = setTimeout(() => {\n\t\t\t\tconst lastButton = document.querySelector(\n\t\t\t\t\t'ul#inkweave-choices > li:last-child'\n\t\t\t\t) as HTMLElement;\n\t\t\t\tif (lastButton) {\n\t\t\t\t\tconst element = document.querySelector(\n\t\t\t\t\t\t'#inkweave-story'\n\t\t\t\t\t) as HTMLElement;\n\t\t\t\t\telement?.scrollTo({\n\t\t\t\t\t\ttop: lastButton.offsetTop,\n\t\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t});\n\t\t\n\t\tthis.cleanups.push(() => {\n\t\t\tunsub();\n\t\t\tif (scrollTimer) clearTimeout(scrollTimer);\n\t\t});\n\t}, {});\n};\n\nexport default load;","import { Tags } from '@inkweave/core';\n\nconst ALLOWED_PROTOCOLS = ['http:', 'https:'];\n\nconst load = () => {\n\tTags.add('linkopen', (val: string | null | undefined) => {\n\t\tif (val) {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(val);\n\t\t\t\tif (!ALLOWED_PROTOCOLS.includes(url.protocol)) {\n\t\t\t\t\tconsole.warn('InkWeave: Blocked unsafe URL protocol:', url.protocol);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.warn('InkWeave: Invalid URL:', val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twindow.open(val, '_blank', 'noopener,noreferrer');\n\t\t}\n\t});\n};\n\nexport default load;","import { memo, useEffect, useRef } from 'react';\nimport type { ChoiceComponentProps } from '@inkweave/react';\n\nconst AutoChoice: React.FC<ChoiceComponentProps> = ({\n\tval,\n\tonClick,\n\tclassName = '',\n\tchildren,\n}) => {\n\tconst intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\tconst cd = parseFloat(val || '0');\n\n\tuseEffect(() => {\n\t\tif (cd <= 0) return;\n\n\t\tintervalRef.current = setInterval(() => {\n\t\t\tonClick();\n\t\t}, cd * 1000);\n\n\t\treturn () => {\n\t\t\tif (intervalRef.current) {\n\t\t\t\tclearInterval(intervalRef.current);\n\t\t\t}\n\t\t};\n\t}, [cd, onClick]);\n\n\treturn (\n\t\t<a className={`inkweave-btn ${className}`} style={{ display: 'none' }}>\n\t\t\t{children}\n\t\t</a>\n\t);\n};\n\nexport default memo(AutoChoice);","import { ChoiceParser, Patches } from '@inkweave/core';\nimport { ChoiceComponents } from '@inkweave/react';\nimport AutoChoice from './AutoButton';\n\nconst load = () => {\n\tChoiceParser.add('auto', (new_choice, val) => {\n\t\tnew_choice.type = 'auto';\n\t\tnew_choice.val = val;\n\t});\n\tChoiceComponents.register('auto', AutoChoice);\n\tPatches.add(null, {});\n};\n\nexport default load;","import { memo, useState } from 'react';\nimport type { ChoiceComponentProps } from '@inkweave/react';\n\nconst CooldownChoice: React.FC<ChoiceComponentProps> = ({\n\tval,\n\tonClick,\n\tclassName = '',\n\tchildren,\n}) => {\n\tconst [isDisabled, setIsDisabled] = useState(false);\n\tconst cd = parseFloat(val || '0');\n\n\tconst handleClick = () => {\n\t\tif (isDisabled) return;\n\n\t\tonClick();\n\t\tsetIsDisabled(true);\n\n\t\tsetTimeout(() => {\n\t\t\tsetIsDisabled(false);\n\t\t}, cd * 1000);\n\t};\n\n\treturn (\n\t\t<a\n\t\t\tclassName={`inkweave-btn ${className} ${isDisabled ? 'disabled' : ''}`}\n\t\t\tonClick={handleClick}\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t);\n};\n\nexport default memo(CooldownChoice);","import { ChoiceParser, Patches } from '@inkweave/core';\nimport { ChoiceComponents } from '@inkweave/react';\nimport CooldownChoice from './CdButton';\n\nconst load = () => {\n\tChoiceParser.add('cd', (new_choice, val) => {\n\t\tnew_choice.type = 'cd';\n\t\tnew_choice.val = val;\n\t});\n\tChoiceComponents.register('cd', CooldownChoice);\n\tPatches.add(null, {});\n};\n\nexport default load;","import type { InkStory } from '@inkweave/core';\nimport { Patches, Tags } from '@inkweave/core';\nimport { memory } from '../memory';\n\nconst options = {\n\tautosave_enabled: true,\n};\n\nconst load = () => {\n\tTags.add('autosave', (_: string | null | undefined, ink: InkStory) => {\n\t\tif (ink.options.autosave_enabled) {\n\t\t\tmemory.save(2, ink);\n\t\t}\n\t});\n\n\tPatches.add(null, options);\n};\n\nexport default load;"],"names":["StorageType","type","getStorage","Save","data","__publicField","useStorage","create","persist","set","get","title","index","newSavesMap","file_saves","format","name","str","state","e","newValue","options","show","save","ink","saveData","label","value","load","save_data","loadMemory","Patches","memory","ImageComponent","className","fallback","image","useStoryImage","hasError","setHasError","useState","useEffect","handleError","useCallback","handleLoad","jsx","Image","memo","getPath","path","fileHandler","Tags","val","AudioController","_a","FADE_CSS","useContentComplete","contentComplete","contents","last_content","styleElement","originalChoose","self","createSelectors","timer","unsub","contentsStore","scrollTimer","choicesStore","lastButton","element","ALLOWED_PROTOCOLS","url","AutoChoice","onClick","children","intervalRef","useRef","cd","ChoiceParser","new_choice","ChoiceComponents","CooldownChoice","isDisabled","setIsDisabled","handleClick","_"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,18 +1,18 @@
1
- var E = Object.defineProperty;
2
- var F = (e, t, s) => t in e ? E(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s;
3
- var r = (e, t, s) => F(e, typeof t != "symbol" ? t + "" : t, s);
4
- import { Patches as c, Tags as h, createSelectors as T, contentsStore as O, choicesStore as k, ChoiceParser as w } from "@inkweave/core";
1
+ var F = Object.defineProperty;
2
+ var T = (e, t, s) => t in e ? F(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s;
3
+ var r = (e, t, s) => T(e, typeof t != "symbol" ? t + "" : t, s);
4
+ import { Patches as c, Tags as h, createSelectors as O, contentsStore as k, choicesStore as A, ChoiceParser as w } from "@inkweave/core";
5
5
  import { create as _ } from "zustand";
6
- import { persist as A } from "zustand/middleware";
6
+ import { persist as M } from "zustand/middleware";
7
7
  import { jsx as m } from "react/jsx-runtime";
8
- import { memo as y, useState as b, useCallback as S, useRef as M, useEffect as P } from "react";
9
- import { ChoiceComponents as L } from "@inkweave/react";
8
+ import { memo as y, useState as b, useEffect as L, useCallback as S, useRef as P } from "react";
9
+ import { ChoiceComponents as $ } from "@inkweave/react";
10
10
  const D = {
11
11
  local: localStorage,
12
12
  session: sessionStorage
13
13
  };
14
- let $ = "local";
15
- const f = () => D[$];
14
+ let E = "local";
15
+ const f = () => D[E];
16
16
  class J {
17
17
  constructor(t) {
18
18
  r(this, "data");
@@ -27,7 +27,7 @@ class J {
27
27
  }
28
28
  }
29
29
  const v = _()(
30
- A(
30
+ M(
31
31
  (e, t) => ({
32
32
  storage: /* @__PURE__ */ new Map(),
33
33
  setStorage: (s, o, n) => {
@@ -35,7 +35,7 @@ const v = _()(
35
35
  u[o] = new J(n), i.set(s, u), e({ storage: i });
36
36
  },
37
37
  changeFormat: (s) => {
38
- $ = s;
38
+ E = s;
39
39
  }
40
40
  }),
41
41
  {
@@ -101,7 +101,11 @@ const R = (e) => v((t) => t.storage.get(e) || null), W = (e, t) => {
101
101
  v.getState().changeFormat(C.memory_format);
102
102
  }, C);
103
103
  }, j = { save: W, load: N, show: R }, x = ({ className: e = "", fallback: t = null }) => {
104
- const s = d((g) => g.image), [o, n] = b(!1), i = S(() => {
104
+ const s = d((g) => g.image), [o, n] = b(!1);
105
+ L(() => {
106
+ n(!1);
107
+ }, [s]);
108
+ const i = S(() => {
105
109
  n(!0), console.warn(`InkWeave: Failed to load image: ${s}`);
106
110
  }, [s]), u = S(() => {
107
111
  n(!1);
@@ -222,11 +226,11 @@ const ct = () => {
222
226
  }
223
227
  }), Object.defineProperty(this, "choicesCanShow", {
224
228
  get() {
225
- return T(l).use.contentComplete();
229
+ return O(l).use.contentComplete();
226
230
  }
227
231
  });
228
232
  let s = null;
229
- const o = O.subscribe(() => {
233
+ const o = k.subscribe(() => {
230
234
  t.options.linedelay != 0 && (s && clearTimeout(s), s = setTimeout(() => {
231
235
  l.getState().setContentComplete(!0);
232
236
  }, (t.contents.length - t.visibleLines) * t.options.linedelay * 1e3));
@@ -240,7 +244,7 @@ const ct = () => {
240
244
  }, lt = () => {
241
245
  c.add(function() {
242
246
  let e = null;
243
- const t = k.subscribe(() => {
247
+ const t = A.subscribe(() => {
244
248
  e && clearTimeout(e), e = setTimeout(() => {
245
249
  const s = document.querySelector(
246
250
  "ul#inkweave-choices > li:last-child"
@@ -282,8 +286,8 @@ const ct = () => {
282
286
  className: s = "",
283
287
  children: o
284
288
  }) => {
285
- const n = M(null), i = parseFloat(e || "0");
286
- return P(() => {
289
+ const n = P(null), i = parseFloat(e || "0");
290
+ return L(() => {
287
291
  if (!(i <= 0))
288
292
  return n.current = setInterval(() => {
289
293
  t();
@@ -294,7 +298,7 @@ const ct = () => {
294
298
  }, H = y(G), dt = () => {
295
299
  w.add("auto", (e, t) => {
296
300
  e.type = "auto", e.val = t;
297
- }), L.register("auto", H), c.add(null, {});
301
+ }), $.register("auto", H), c.add(null, {});
298
302
  }, K = ({
299
303
  val: e,
300
304
  onClick: t,
@@ -317,7 +321,7 @@ const ct = () => {
317
321
  }, Q = y(K), mt = () => {
318
322
  w.add("cd", (e, t) => {
319
323
  e.type = "cd", e.val = t;
320
- }), L.register("cd", Q), c.add(null, {});
324
+ }), $.register("cd", Q), c.add(null, {});
321
325
  }, X = {
322
326
  autosave_enabled: !0
323
327
  }, ht = () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/memory/storage.ts","../src/memory/index.ts","../src/image/Image.tsx","../src/image/index.ts","../src/audio/AudioController.ts","../src/audio/index.ts","../src/fadeEffect/index.ts","../src/scrollafterchoice/index.ts","../src/linkopen/index.ts","../src/autoButton/AutoButton.tsx","../src/autoButton/index.ts","../src/cdButton/CdButton.tsx","../src/cdButton/index.ts","../src/autosave/index.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { persist, StorageValue } from 'zustand/middleware';\n\nconst StorageType: { [key: string]: Storage } = {\n\tlocal: localStorage,\n\tsession: sessionStorage,\n};\n\nlet type = 'local';\nconst getStorage = () => {\n\treturn StorageType[type];\n};\n\nexport interface SaveSlot {\n\tdata: string;\n\ttimestamp: string;\n\tmeta: string;\n}\n\nexport class Save implements SaveSlot {\n\tdata: string;\n\ttimestamp: string;\n\tmeta: string;\n\n\tconstructor(data: object) {\n\t\tthis.data = JSON.stringify(data);\n\t\tthis.timestamp = new Intl.DateTimeFormat(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t}).format(Date.now());\n\t\tthis.meta = 'autogenerated';\n\t}\n}\n\ninterface StorageInterface {\n\tstorage: Map<string, SaveSlot[]>;\n\tsetStorage: (title: string, index: number, data: object) => void;\n\tchangeFormat: (format: string) => void;\n}\n\nconst useStorage = create<StorageInterface>()(\n\tpersist(\n\t\t(set, get) => ({\n\t\t\tstorage: new Map(),\n\t\t\tsetStorage: (title, index, data) => {\n\t\t\t\tconst newSavesMap = new Map(get().storage);\n\t\t\t\tconst file_saves = [...(newSavesMap.get(title) || [])];\n\t\t\t\tfile_saves[index] = new Save(data);\n\t\t\t\tnewSavesMap.set(title, file_saves);\n\t\t\t\tset({ storage: newSavesMap });\n\t\t\t},\n\t\t\tchangeFormat: (format) => {\n\t\t\t\ttype = format;\n\t\t\t},\n\t\t}),\n\t\t{\n\t\t\tname: 'inkStory',\n\t\t\tstorage: {\n\t\t\t\tgetItem: (name) => {\n\t\t\t\t\tconst str = getStorage().getItem(name);\n\t\t\t\t\tif (!str) return null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { state } = JSON.parse(str);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\tstorage: new Map(state.storage),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error('InkWeave: Failed to parse storage data:', e);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetItem: (name, newValue: StorageValue<StorageInterface>) => {\n\t\t\t\t\tconst str = JSON.stringify({\n\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t...newValue.state,\n\t\t\t\t\t\t\tstorage: Array.from(\n\t\t\t\t\t\t\t\tnewValue.state.storage.entries()\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tgetStorage().setItem(name, str);\n\t\t\t\t},\n\t\t\t\tremoveItem: (name) => {\n\t\t\t\t\tgetStorage().removeItem(name);\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t)\n);\n\nexport default useStorage;","import type { InkStory } from '@inkweave/core';\nimport { Patches } from '@inkweave/core';\nimport useStorage from './storage';\nimport type { SaveSlot } from './storage';\n\ninterface MemorySaveData {\n\tstate: string;\n\t[key: string]: string | number | boolean | string[] | undefined;\n}\n\nlet options = {\n\tmemory_format: 'local',\n};\n\nconst show = (title: string): SaveSlot[] | null => {\n\treturn useStorage((state) => state.storage.get(title) || null);\n};\n\nconst save = (index: number, ink: InkStory) => {\n\tconst saveData: MemorySaveData = {\n\t\tstate: ink.story.state.toJson(),\n\t};\n\tink.save_label.forEach((label) => {\n\t\tconst value = ink[label as keyof InkStory];\n\t\tif (label in ink && value !== undefined) {\n\t\t\tif (\n\t\t\t\ttypeof value === 'string' ||\n\t\t\t\ttypeof value === 'number' ||\n\t\t\t\ttypeof value === 'boolean' ||\n\t\t\t\tArray.isArray(value)\n\t\t\t) {\n\t\t\t\tsaveData[label] = value as string | number | boolean | string[];\n\t\t\t}\n\t\t}\n\t});\n\tuseStorage.getState().setStorage(ink.title, index, saveData);\n};\n\nconst load = (save_data: string, ink: InkStory) => {\n\tlet save: MemorySaveData | null = null;\n\ttry {\n\t\tsave = JSON.parse(save_data);\n\t} catch (e) {\n\t\tconsole.error('InkWeave: Failed to parse save data:', e);\n\t\treturn;\n\t}\n\tif (save) {\n\t\tink.story.state.LoadJson(save.state);\n\t\tink.clear();\n\t\tink.save_label.forEach((label) => {\n\t\t\tif (\n\t\t\t\tlabel in ink &&\n\t\t\t\ttypeof ink[label as keyof InkStory] !== 'undefined' &&\n\t\t\t\tlabel in save\n\t\t\t)\n\t\t\t\t(ink as Record<string, unknown>)[label] = save[label];\n\t\t});\n\t\tink.continue();\n\t}\n};\n\nconst loadMemory = () => {\n\tPatches.add(function () {\n\t\tuseStorage.getState().changeFormat(options.memory_format);\n\t}, options);\n};\n\nexport const memory = { save, load, show };\nexport type { SaveSlot };\nexport default loadMemory;","import { memo, useState, useCallback } from 'react';\nimport { useStoryImage } from './index';\n\ninterface ImageProps {\n\tclassName?: string;\n\tfallback?: React.ReactNode;\n}\n\nconst ImageComponent: React.FC<ImageProps> = ({ className = '', fallback = null }) => {\n\tconst image = useStoryImage((state) => state.image);\n\tconst [hasError, setHasError] = useState(false);\n\n\tconst handleError = useCallback(() => {\n\t\tsetHasError(true);\n\t\tconsole.warn(`InkWeave: Failed to load image: ${image}`);\n\t}, [image]);\n\n\tconst handleLoad = useCallback(() => {\n\t\tsetHasError(false);\n\t}, []);\n\n\tif (!image) return null;\n\n\tif (hasError) {\n\t\treturn fallback ? <div id=\"inkweave-image\" className={className}>{fallback}</div> : null;\n\t}\n\n\treturn (\n\t\t<div id=\"inkweave-image\" className={className}>\n\t\t\t<img src={image} alt=\"\" onError={handleError} onLoad={handleLoad} />\n\t\t</div>\n\t);\n};\n\nexport default memo(ImageComponent);","import { create } from 'zustand';\nimport { Tags, Patches, type InkStory, type FileHandler } from '@inkweave/core';\n\ndeclare module '@inkweave/core' {\n\tinterface InkStory {\n\t\timage: string;\n\t}\n}\n\ntype StoryImage = {\n\timage: string;\n\tsetImage: (image: string) => void;\n};\n\nexport const useStoryImage = create<StoryImage>((set) => ({\n\timage: '',\n\tsetImage: (image) => set({ image }),\n}));\n\nconst getPath = (path: string, fileHandler?: FileHandler) => {\n\tif (fileHandler && 'resolveFilename' in fileHandler) {\n\t\treturn (fileHandler as { resolveFilename: (f: string) => string }).resolveFilename(path);\n\t}\n\treturn path;\n};\n\nconst load = () => {\n\tTags.add('image', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tuseStoryImage.getState().setImage(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tuseStoryImage.getState().setImage('');\n\t\t}\n\t});\n\n\tPatches.add(function () {\n\t\tObject.defineProperty(this, 'image', {\n\t\t\tget() {\n\t\t\t\treturn useStoryImage.getState().image;\n\t\t\t},\n\n\t\t\tset(path: string) {\n\t\t\t\tuseStoryImage.getState().setImage(path);\n\t\t\t},\n\t\t});\n\t\tthis.save_label.push('image');\n\t\tthis.clears.push(() => {\n\t\t\tthis.image = '';\n\t\t});\n\t}, {});\n};\n\nexport default load;\nexport { default as Image } from './Image';","export class AudioController {\n\tprivate static _sound: HTMLAudioElement | null = null;\n\tprivate static _music: HTMLAudioElement | null = null;\n\tprivate static _sound_handler: () => void = () => {};\n\tprivate static _music_handler: () => void = () => {};\n\n\tstatic get sound() {\n\t\treturn this._sound;\n\t}\n\n\tstatic get music() {\n\t\treturn this._music;\n\t}\n\n\tstatic get sound_handler() {\n\t\treturn this._sound_handler;\n\t}\n\n\tstatic get music_handler() {\n\t\treturn this._music_handler;\n\t}\n\n\tstatic set_music(path: string) {\n\t\tthis._music = new Audio(path);\n\t\tthis._music.loop = true;\n\t\tthis._music_handler = () => {\n\t\t\tthis._music?.play();\n\t\t};\n\t\tthis._music.addEventListener('canplaythrough', this._music_handler);\n\t}\n\n\tstatic set_sound(path: string) {\n\t\tthis._sound = new Audio(path);\n\t\tthis._sound_handler = () => {\n\t\t\tthis._sound?.play();\n\t\t};\n\t\tthis._sound.addEventListener('canplaythrough', this._sound_handler);\n\t}\n\n\tstatic cleanupSound() {\n\t\tif (this._sound) {\n\t\t\tthis._sound.pause();\n\t\t\tthis._sound.currentTime = 0;\n\t\t\tthis._sound.removeEventListener(\n\t\t\t\t'canplaythrough',\n\t\t\t\tthis._sound_handler\n\t\t\t);\n\t\t\tthis._sound.src = '';\n\t\t}\n\t\tthis._sound = null;\n\t\tthis._sound_handler = () => {};\n\t}\n\n\tstatic cleanupMusic() {\n\t\tif (this._music) {\n\t\t\tthis._music.pause();\n\t\t\tthis._music.currentTime = 0;\n\t\t\tthis._music.removeEventListener(\n\t\t\t\t'canplaythrough',\n\t\t\t\tthis._music_handler\n\t\t\t);\n\t\t\tthis._music.src = '';\n\t\t}\n\t\tthis._music = null;\n\t\tthis._music_handler = () => {};\n\t}\n}","import { Tags, Patches, type InkStory, type FileHandler } from '@inkweave/core';\nimport { AudioController } from './AudioController';\n\nconst getPath = (path: string, fileHandler?: FileHandler) => {\n\tif (fileHandler && 'resolveFilename' in fileHandler) {\n\t\treturn (fileHandler as { resolveFilename: (f: string) => string }).resolveFilename(path);\n\t}\n\treturn path;\n};\n\nconst load = () => {\n\tTags.add('sound', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tAudioController.cleanupSound();\n\t\t\tAudioController.set_sound(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tAudioController.cleanupSound();\n\t\t}\n\t});\n\n\tTags.add('music', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tAudioController.cleanupMusic();\n\t\t\tAudioController.set_music(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tAudioController.cleanupMusic();\n\t\t}\n\t});\n\n\tPatches.add(function () {\n\t\tthis.audio = AudioController;\n\t\tthis.cleanups.push(() => {\n\t\t\tAudioController.cleanupSound();\n\t\t\tAudioController.cleanupMusic();\n\t\t});\n\t}, {});\n};\n\nexport default load;","import { Patches, contentsStore, createSelectors, type InkStoryContext } from '@inkweave/core';\nimport { create } from 'zustand';\n\nconst FADE_CSS = `\n#inkweave-contents div,\n#inkweave-choices {\n opacity: 0;\n animation: inkFadeIn 0.5s forwards;\n animation-delay: var(--delay, 0s);\n}\n@keyframes inkFadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n`;\n\nconst options = {\n\tlinedelay: 0.05,\n};\n\ntype ContentComplete = {\n\tcontentComplete: boolean;\n\tlast_content: string;\n\tsetContentComplete: (contentComplete: boolean) => void;\n\tsetLastContent: (contents: string[]) => void;\n};\n\nconst useContentComplete = create<ContentComplete>((set) => ({\n\tcontentComplete: true,\n\tlast_content: '',\n\tsetContentComplete: (contentComplete) => set({ contentComplete }),\n\tsetLastContent: (contents) => {\n\t\tif (contents.length === 0) {\n\t\t\tset({ last_content: '' });\n\t\t\treturn;\n\t\t}\n\t\tconst last_content = contents[contents.length - 1];\n\t\tset({ last_content });\n\t},\n}));\n\nlet styleElement: HTMLStyleElement | null = null;\n\nconst load = () => {\n\t// Inject CSS only once\n\tif (!styleElement) {\n\t\tstyleElement = document.createElement('style');\n\t\tstyleElement.textContent = FADE_CSS;\n\t\tdocument.head.appendChild(styleElement);\n\t}\n\n\tPatches.add(function (this: InkStoryContext) {\n\t\tconst originalChoose = this.choose as (index: number) => void;\n\t\tconst self = this;\n\t\tthis.choose = function (index: number) {\n\t\t\tif (self.options.linedelay != 0) {\n\t\t\t\tuseContentComplete.getState().setContentComplete(false);\n\t\t\t\tuseContentComplete.getState().setLastContent(self.contents as string[]);\n\t\t\t}\n\t\t\treturn originalChoose.call(self, index);\n\t\t};\n\t\tObject.defineProperty(this, 'visibleLines', {\n\t\t\tget() {\n\t\t\t\tconst last_content = useContentComplete.getState().last_content;\n\t\t\t\treturn (self.contents as string[]).lastIndexOf(last_content);\n\t\t\t},\n\t\t});\n\t\tObject.defineProperty(this, 'choicesCanShow', {\n\t\t\tget() {\n\t\t\t\treturn createSelectors(useContentComplete).use.contentComplete();\n\t\t\t},\n\t\t});\n\n\t\tlet timer: ReturnType<typeof setTimeout> | null = null;\n\t\tconst unsub = contentsStore.subscribe(() => {\n\t\t\tif (self.options.linedelay == 0) return;\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\tuseContentComplete.getState().setContentComplete(true);\n\t\t\t}, ((self.contents as string[]).length - (self.visibleLines as number)) * (self.options.linedelay as number) * 1000);\n\t\t});\n\n\t\tthis.cleanups.push(() => {\n\t\t\tunsub();\n\t\t\tif (timer) clearTimeout(timer);\n\t\t});\n\t\tthis.clears.push(() => {\n\t\t\tif (self.options.linedelay != 0)\n\t\t\t\tuseContentComplete.getState().setContentComplete(false);\n\t\t\tuseContentComplete.getState().setLastContent([]);\n\t\t});\n\t}, options);\n};\n\nexport default load;","import { Patches, choicesStore } from '@inkweave/core';\n\nconst load = () => {\n\tPatches.add(function () {\n\t\tlet scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\t\t\n\t\tconst unsub = choicesStore.subscribe(() => {\n\t\t\tif (scrollTimer) clearTimeout(scrollTimer);\n\t\t\t\n\t\t\tscrollTimer = setTimeout(() => {\n\t\t\t\tconst lastButton = document.querySelector(\n\t\t\t\t\t'ul#inkweave-choices > li:last-child'\n\t\t\t\t) as HTMLElement;\n\t\t\t\tif (lastButton) {\n\t\t\t\t\tconst element = document.querySelector(\n\t\t\t\t\t\t'#inkweave-story'\n\t\t\t\t\t) as HTMLElement;\n\t\t\t\t\telement?.scrollTo({\n\t\t\t\t\t\ttop: lastButton.offsetTop,\n\t\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t});\n\t\t\n\t\tthis.cleanups.push(() => {\n\t\t\tunsub();\n\t\t\tif (scrollTimer) clearTimeout(scrollTimer);\n\t\t});\n\t}, {});\n};\n\nexport default load;","import { Tags } from '@inkweave/core';\n\nconst ALLOWED_PROTOCOLS = ['http:', 'https:'];\n\nconst load = () => {\n\tTags.add('linkopen', (val: string | null | undefined) => {\n\t\tif (val) {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(val);\n\t\t\t\tif (!ALLOWED_PROTOCOLS.includes(url.protocol)) {\n\t\t\t\t\tconsole.warn('InkWeave: Blocked unsafe URL protocol:', url.protocol);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.warn('InkWeave: Invalid URL:', val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twindow.open(val, '_blank', 'noopener,noreferrer');\n\t\t}\n\t});\n};\n\nexport default load;","import { memo, useEffect, useRef } from 'react';\nimport type { ChoiceComponentProps } from '@inkweave/react';\n\nconst AutoChoice: React.FC<ChoiceComponentProps> = ({\n\tval,\n\tonClick,\n\tclassName = '',\n\tchildren,\n}) => {\n\tconst intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\tconst cd = parseFloat(val || '0');\n\n\tuseEffect(() => {\n\t\tif (cd <= 0) return;\n\n\t\tintervalRef.current = setInterval(() => {\n\t\t\tonClick();\n\t\t}, cd * 1000);\n\n\t\treturn () => {\n\t\t\tif (intervalRef.current) {\n\t\t\t\tclearInterval(intervalRef.current);\n\t\t\t}\n\t\t};\n\t}, [cd, onClick]);\n\n\treturn (\n\t\t<a className={`inkweave-btn ${className}`} style={{ display: 'none' }}>\n\t\t\t{children}\n\t\t</a>\n\t);\n};\n\nexport default memo(AutoChoice);","import { ChoiceParser, Patches } from '@inkweave/core';\nimport { ChoiceComponents } from '@inkweave/react';\nimport AutoChoice from './AutoButton';\n\nconst load = () => {\n\tChoiceParser.add('auto', (new_choice, val) => {\n\t\tnew_choice.type = 'auto';\n\t\tnew_choice.val = val;\n\t});\n\tChoiceComponents.register('auto', AutoChoice);\n\tPatches.add(null, {});\n};\n\nexport default load;","import { memo, useState } from 'react';\nimport type { ChoiceComponentProps } from '@inkweave/react';\n\nconst CooldownChoice: React.FC<ChoiceComponentProps> = ({\n\tval,\n\tonClick,\n\tclassName = '',\n\tchildren,\n}) => {\n\tconst [isDisabled, setIsDisabled] = useState(false);\n\tconst cd = parseFloat(val || '0');\n\n\tconst handleClick = () => {\n\t\tif (isDisabled) return;\n\n\t\tonClick();\n\t\tsetIsDisabled(true);\n\n\t\tsetTimeout(() => {\n\t\t\tsetIsDisabled(false);\n\t\t}, cd * 1000);\n\t};\n\n\treturn (\n\t\t<a\n\t\t\tclassName={`inkweave-btn ${className} ${isDisabled ? 'disabled' : ''}`}\n\t\t\tonClick={handleClick}\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t);\n};\n\nexport default memo(CooldownChoice);","import { ChoiceParser, Patches } from '@inkweave/core';\nimport { ChoiceComponents } from '@inkweave/react';\nimport CooldownChoice from './CdButton';\n\nconst load = () => {\n\tChoiceParser.add('cd', (new_choice, val) => {\n\t\tnew_choice.type = 'cd';\n\t\tnew_choice.val = val;\n\t});\n\tChoiceComponents.register('cd', CooldownChoice);\n\tPatches.add(null, {});\n};\n\nexport default load;","import type { InkStory } from '@inkweave/core';\nimport { Patches, Tags } from '@inkweave/core';\nimport { memory } from '../memory';\n\nconst options = {\n\tautosave_enabled: true,\n};\n\nconst load = () => {\n\tTags.add('autosave', (_: string | null | undefined, ink: InkStory) => {\n\t\tif (ink.options.autosave_enabled) {\n\t\t\tmemory.save(2, ink);\n\t\t}\n\t});\n\n\tPatches.add(null, options);\n};\n\nexport default load;"],"names":["StorageType","type","getStorage","Save","data","__publicField","useStorage","create","persist","set","get","title","index","newSavesMap","file_saves","format","name","str","state","e","newValue","options","show","save","ink","saveData","label","value","load","save_data","loadMemory","Patches","memory","ImageComponent","className","fallback","image","useStoryImage","hasError","setHasError","useState","handleError","useCallback","handleLoad","jsx","Image","memo","getPath","path","fileHandler","Tags","val","AudioController","_a","FADE_CSS","useContentComplete","contentComplete","contents","last_content","styleElement","originalChoose","self","createSelectors","timer","unsub","contentsStore","scrollTimer","choicesStore","lastButton","element","ALLOWED_PROTOCOLS","url","AutoChoice","onClick","children","intervalRef","useRef","cd","useEffect","AutoChoice$1","ChoiceParser","new_choice","ChoiceComponents","CooldownChoice","isDisabled","setIsDisabled","handleClick","CooldownChoice$1","_"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/memory/storage.ts","../src/memory/index.ts","../src/image/Image.tsx","../src/image/index.ts","../src/audio/AudioController.ts","../src/audio/index.ts","../src/fadeEffect/index.ts","../src/scrollafterchoice/index.ts","../src/linkopen/index.ts","../src/autoButton/AutoButton.tsx","../src/autoButton/index.ts","../src/cdButton/CdButton.tsx","../src/cdButton/index.ts","../src/autosave/index.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { persist, StorageValue } from 'zustand/middleware';\n\nconst StorageType: { [key: string]: Storage } = {\n\tlocal: localStorage,\n\tsession: sessionStorage,\n};\n\nlet type = 'local';\nconst getStorage = () => {\n\treturn StorageType[type];\n};\n\nexport interface SaveSlot {\n\tdata: string;\n\ttimestamp: string;\n\tmeta: string;\n}\n\nexport class Save implements SaveSlot {\n\tdata: string;\n\ttimestamp: string;\n\tmeta: string;\n\n\tconstructor(data: object) {\n\t\tthis.data = JSON.stringify(data);\n\t\tthis.timestamp = new Intl.DateTimeFormat(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t}).format(Date.now());\n\t\tthis.meta = 'autogenerated';\n\t}\n}\n\ninterface StorageInterface {\n\tstorage: Map<string, SaveSlot[]>;\n\tsetStorage: (title: string, index: number, data: object) => void;\n\tchangeFormat: (format: string) => void;\n}\n\nconst useStorage = create<StorageInterface>()(\n\tpersist(\n\t\t(set, get) => ({\n\t\t\tstorage: new Map(),\n\t\t\tsetStorage: (title, index, data) => {\n\t\t\t\tconst newSavesMap = new Map(get().storage);\n\t\t\t\tconst file_saves = [...(newSavesMap.get(title) || [])];\n\t\t\t\tfile_saves[index] = new Save(data);\n\t\t\t\tnewSavesMap.set(title, file_saves);\n\t\t\t\tset({ storage: newSavesMap });\n\t\t\t},\n\t\t\tchangeFormat: (format) => {\n\t\t\t\ttype = format;\n\t\t\t},\n\t\t}),\n\t\t{\n\t\t\tname: 'inkStory',\n\t\t\tstorage: {\n\t\t\t\tgetItem: (name) => {\n\t\t\t\t\tconst str = getStorage().getItem(name);\n\t\t\t\t\tif (!str) return null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { state } = JSON.parse(str);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\tstorage: new Map(state.storage),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error('InkWeave: Failed to parse storage data:', e);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetItem: (name, newValue: StorageValue<StorageInterface>) => {\n\t\t\t\t\tconst str = JSON.stringify({\n\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t...newValue.state,\n\t\t\t\t\t\t\tstorage: Array.from(\n\t\t\t\t\t\t\t\tnewValue.state.storage.entries()\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tgetStorage().setItem(name, str);\n\t\t\t\t},\n\t\t\t\tremoveItem: (name) => {\n\t\t\t\t\tgetStorage().removeItem(name);\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t)\n);\n\nexport default useStorage;","import type { InkStory } from '@inkweave/core';\nimport { Patches } from '@inkweave/core';\nimport useStorage from './storage';\nimport type { SaveSlot } from './storage';\n\ninterface MemorySaveData {\n\tstate: string;\n\t[key: string]: string | number | boolean | string[] | undefined;\n}\n\nlet options = {\n\tmemory_format: 'local',\n};\n\nconst show = (title: string): SaveSlot[] | null => {\n\treturn useStorage((state) => state.storage.get(title) || null);\n};\n\nconst save = (index: number, ink: InkStory) => {\n\tconst saveData: MemorySaveData = {\n\t\tstate: ink.story.state.toJson(),\n\t};\n\tink.save_label.forEach((label) => {\n\t\tconst value = ink[label as keyof InkStory];\n\t\tif (label in ink && value !== undefined) {\n\t\t\tif (\n\t\t\t\ttypeof value === 'string' ||\n\t\t\t\ttypeof value === 'number' ||\n\t\t\t\ttypeof value === 'boolean' ||\n\t\t\t\tArray.isArray(value)\n\t\t\t) {\n\t\t\t\tsaveData[label] = value as string | number | boolean | string[];\n\t\t\t}\n\t\t}\n\t});\n\tuseStorage.getState().setStorage(ink.title, index, saveData);\n};\n\nconst load = (save_data: string, ink: InkStory) => {\n\tlet save: MemorySaveData | null = null;\n\ttry {\n\t\tsave = JSON.parse(save_data);\n\t} catch (e) {\n\t\tconsole.error('InkWeave: Failed to parse save data:', e);\n\t\treturn;\n\t}\n\tif (save) {\n\t\tink.story.state.LoadJson(save.state);\n\t\tink.clear();\n\t\tink.save_label.forEach((label) => {\n\t\t\tif (\n\t\t\t\tlabel in ink &&\n\t\t\t\ttypeof ink[label as keyof InkStory] !== 'undefined' &&\n\t\t\t\tlabel in save\n\t\t\t)\n\t\t\t\t(ink as Record<string, unknown>)[label] = save[label];\n\t\t});\n\t\tink.continue();\n\t}\n};\n\nconst loadMemory = () => {\n\tPatches.add(function () {\n\t\tuseStorage.getState().changeFormat(options.memory_format);\n\t}, options);\n};\n\nexport const memory = { save, load, show };\nexport type { SaveSlot };\nexport default loadMemory;","import { memo, useState, useCallback, useEffect } from 'react';\nimport { useStoryImage } from './index';\n\ninterface ImageProps {\n\tclassName?: string;\n\tfallback?: React.ReactNode;\n}\n\nconst ImageComponent: React.FC<ImageProps> = ({ className = '', fallback = null }) => {\n\tconst image = useStoryImage((state) => state.image);\n\tconst [hasError, setHasError] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetHasError(false);\n\t}, [image]);\n\n\tconst handleError = useCallback(() => {\n\t\tsetHasError(true);\n\t\tconsole.warn(`InkWeave: Failed to load image: ${image}`);\n\t}, [image]);\n\n\tconst handleLoad = useCallback(() => {\n\t\tsetHasError(false);\n\t}, []);\n\n\tif (!image) return null;\n\n\tif (hasError) {\n\t\treturn fallback ? <div id=\"inkweave-image\" className={className}>{fallback}</div> : null;\n\t}\n\n\treturn (\n\t\t<div id=\"inkweave-image\" className={className}>\n\t\t\t<img src={image} alt=\"\" onError={handleError} onLoad={handleLoad} />\n\t\t</div>\n\t);\n};\n\nexport default memo(ImageComponent);","import { create } from 'zustand';\nimport { Tags, Patches, type InkStory, type FileHandler } from '@inkweave/core';\n\ndeclare module '@inkweave/core' {\n\tinterface InkStory {\n\t\timage: string;\n\t}\n}\n\ntype StoryImage = {\n\timage: string;\n\tsetImage: (image: string) => void;\n};\n\nexport const useStoryImage = create<StoryImage>((set) => ({\n\timage: '',\n\tsetImage: (image) => set({ image }),\n}));\n\nconst getPath = (path: string, fileHandler?: FileHandler) => {\n\tif (fileHandler && 'resolveFilename' in fileHandler) {\n\t\treturn (fileHandler as { resolveFilename: (f: string) => string }).resolveFilename(path);\n\t}\n\treturn path;\n};\n\nconst load = () => {\n\tTags.add('image', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tuseStoryImage.getState().setImage(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tuseStoryImage.getState().setImage('');\n\t\t}\n\t});\n\n\tPatches.add(function () {\n\t\tObject.defineProperty(this, 'image', {\n\t\t\tget() {\n\t\t\t\treturn useStoryImage.getState().image;\n\t\t\t},\n\n\t\t\tset(path: string) {\n\t\t\t\tuseStoryImage.getState().setImage(path);\n\t\t\t},\n\t\t});\n\t\tthis.save_label.push('image');\n\t\tthis.clears.push(() => {\n\t\t\tthis.image = '';\n\t\t});\n\t}, {});\n};\n\nexport default load;\nexport { default as Image } from './Image';","export class AudioController {\n\tprivate static _sound: HTMLAudioElement | null = null;\n\tprivate static _music: HTMLAudioElement | null = null;\n\tprivate static _sound_handler: () => void = () => {};\n\tprivate static _music_handler: () => void = () => {};\n\n\tstatic get sound() {\n\t\treturn this._sound;\n\t}\n\n\tstatic get music() {\n\t\treturn this._music;\n\t}\n\n\tstatic get sound_handler() {\n\t\treturn this._sound_handler;\n\t}\n\n\tstatic get music_handler() {\n\t\treturn this._music_handler;\n\t}\n\n\tstatic set_music(path: string) {\n\t\tthis._music = new Audio(path);\n\t\tthis._music.loop = true;\n\t\tthis._music_handler = () => {\n\t\t\tthis._music?.play();\n\t\t};\n\t\tthis._music.addEventListener('canplaythrough', this._music_handler);\n\t}\n\n\tstatic set_sound(path: string) {\n\t\tthis._sound = new Audio(path);\n\t\tthis._sound_handler = () => {\n\t\t\tthis._sound?.play();\n\t\t};\n\t\tthis._sound.addEventListener('canplaythrough', this._sound_handler);\n\t}\n\n\tstatic cleanupSound() {\n\t\tif (this._sound) {\n\t\t\tthis._sound.pause();\n\t\t\tthis._sound.currentTime = 0;\n\t\t\tthis._sound.removeEventListener(\n\t\t\t\t'canplaythrough',\n\t\t\t\tthis._sound_handler\n\t\t\t);\n\t\t\tthis._sound.src = '';\n\t\t}\n\t\tthis._sound = null;\n\t\tthis._sound_handler = () => {};\n\t}\n\n\tstatic cleanupMusic() {\n\t\tif (this._music) {\n\t\t\tthis._music.pause();\n\t\t\tthis._music.currentTime = 0;\n\t\t\tthis._music.removeEventListener(\n\t\t\t\t'canplaythrough',\n\t\t\t\tthis._music_handler\n\t\t\t);\n\t\t\tthis._music.src = '';\n\t\t}\n\t\tthis._music = null;\n\t\tthis._music_handler = () => {};\n\t}\n}","import { Tags, Patches, type InkStory, type FileHandler } from '@inkweave/core';\nimport { AudioController } from './AudioController';\n\nconst getPath = (path: string, fileHandler?: FileHandler) => {\n\tif (fileHandler && 'resolveFilename' in fileHandler) {\n\t\treturn (fileHandler as { resolveFilename: (f: string) => string }).resolveFilename(path);\n\t}\n\treturn path;\n};\n\nconst load = () => {\n\tTags.add('sound', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tAudioController.cleanupSound();\n\t\t\tAudioController.set_sound(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tAudioController.cleanupSound();\n\t\t}\n\t});\n\n\tTags.add('music', (val: string | null | undefined, ink: InkStory) => {\n\t\tif (val) {\n\t\t\tAudioController.cleanupMusic();\n\t\t\tAudioController.set_music(getPath(val, ink.options.fileHandler));\n\t\t} else {\n\t\t\tAudioController.cleanupMusic();\n\t\t}\n\t});\n\n\tPatches.add(function () {\n\t\tthis.audio = AudioController;\n\t\tthis.cleanups.push(() => {\n\t\t\tAudioController.cleanupSound();\n\t\t\tAudioController.cleanupMusic();\n\t\t});\n\t}, {});\n};\n\nexport default load;","import { Patches, contentsStore, createSelectors, type InkStoryContext } from '@inkweave/core';\nimport { create } from 'zustand';\n\nconst FADE_CSS = `\n#inkweave-contents div,\n#inkweave-choices {\n opacity: 0;\n animation: inkFadeIn 0.5s forwards;\n animation-delay: var(--delay, 0s);\n}\n@keyframes inkFadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n`;\n\nconst options = {\n\tlinedelay: 0.05,\n};\n\ntype ContentComplete = {\n\tcontentComplete: boolean;\n\tlast_content: string;\n\tsetContentComplete: (contentComplete: boolean) => void;\n\tsetLastContent: (contents: string[]) => void;\n};\n\nconst useContentComplete = create<ContentComplete>((set) => ({\n\tcontentComplete: true,\n\tlast_content: '',\n\tsetContentComplete: (contentComplete) => set({ contentComplete }),\n\tsetLastContent: (contents) => {\n\t\tif (contents.length === 0) {\n\t\t\tset({ last_content: '' });\n\t\t\treturn;\n\t\t}\n\t\tconst last_content = contents[contents.length - 1];\n\t\tset({ last_content });\n\t},\n}));\n\nlet styleElement: HTMLStyleElement | null = null;\n\nconst load = () => {\n\t// Inject CSS only once\n\tif (!styleElement) {\n\t\tstyleElement = document.createElement('style');\n\t\tstyleElement.textContent = FADE_CSS;\n\t\tdocument.head.appendChild(styleElement);\n\t}\n\n\tPatches.add(function (this: InkStoryContext) {\n\t\tconst originalChoose = this.choose as (index: number) => void;\n\t\tconst self = this;\n\t\tthis.choose = function (index: number) {\n\t\t\tif (self.options.linedelay != 0) {\n\t\t\t\tuseContentComplete.getState().setContentComplete(false);\n\t\t\t\tuseContentComplete.getState().setLastContent(self.contents as string[]);\n\t\t\t}\n\t\t\treturn originalChoose.call(self, index);\n\t\t};\n\t\tObject.defineProperty(this, 'visibleLines', {\n\t\t\tget() {\n\t\t\t\tconst last_content = useContentComplete.getState().last_content;\n\t\t\t\treturn (self.contents as string[]).lastIndexOf(last_content);\n\t\t\t},\n\t\t});\n\t\tObject.defineProperty(this, 'choicesCanShow', {\n\t\t\tget() {\n\t\t\t\treturn createSelectors(useContentComplete).use.contentComplete();\n\t\t\t},\n\t\t});\n\n\t\tlet timer: ReturnType<typeof setTimeout> | null = null;\n\t\tconst unsub = contentsStore.subscribe(() => {\n\t\t\tif (self.options.linedelay == 0) return;\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\tuseContentComplete.getState().setContentComplete(true);\n\t\t\t}, ((self.contents as string[]).length - (self.visibleLines as number)) * (self.options.linedelay as number) * 1000);\n\t\t});\n\n\t\tthis.cleanups.push(() => {\n\t\t\tunsub();\n\t\t\tif (timer) clearTimeout(timer);\n\t\t});\n\t\tthis.clears.push(() => {\n\t\t\tif (self.options.linedelay != 0)\n\t\t\t\tuseContentComplete.getState().setContentComplete(false);\n\t\t\tuseContentComplete.getState().setLastContent([]);\n\t\t});\n\t}, options);\n};\n\nexport default load;","import { Patches, choicesStore } from '@inkweave/core';\n\nconst load = () => {\n\tPatches.add(function () {\n\t\tlet scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\t\t\n\t\tconst unsub = choicesStore.subscribe(() => {\n\t\t\tif (scrollTimer) clearTimeout(scrollTimer);\n\t\t\t\n\t\t\tscrollTimer = setTimeout(() => {\n\t\t\t\tconst lastButton = document.querySelector(\n\t\t\t\t\t'ul#inkweave-choices > li:last-child'\n\t\t\t\t) as HTMLElement;\n\t\t\t\tif (lastButton) {\n\t\t\t\t\tconst element = document.querySelector(\n\t\t\t\t\t\t'#inkweave-story'\n\t\t\t\t\t) as HTMLElement;\n\t\t\t\t\telement?.scrollTo({\n\t\t\t\t\t\ttop: lastButton.offsetTop,\n\t\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t});\n\t\t\n\t\tthis.cleanups.push(() => {\n\t\t\tunsub();\n\t\t\tif (scrollTimer) clearTimeout(scrollTimer);\n\t\t});\n\t}, {});\n};\n\nexport default load;","import { Tags } from '@inkweave/core';\n\nconst ALLOWED_PROTOCOLS = ['http:', 'https:'];\n\nconst load = () => {\n\tTags.add('linkopen', (val: string | null | undefined) => {\n\t\tif (val) {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(val);\n\t\t\t\tif (!ALLOWED_PROTOCOLS.includes(url.protocol)) {\n\t\t\t\t\tconsole.warn('InkWeave: Blocked unsafe URL protocol:', url.protocol);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.warn('InkWeave: Invalid URL:', val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twindow.open(val, '_blank', 'noopener,noreferrer');\n\t\t}\n\t});\n};\n\nexport default load;","import { memo, useEffect, useRef } from 'react';\nimport type { ChoiceComponentProps } from '@inkweave/react';\n\nconst AutoChoice: React.FC<ChoiceComponentProps> = ({\n\tval,\n\tonClick,\n\tclassName = '',\n\tchildren,\n}) => {\n\tconst intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\tconst cd = parseFloat(val || '0');\n\n\tuseEffect(() => {\n\t\tif (cd <= 0) return;\n\n\t\tintervalRef.current = setInterval(() => {\n\t\t\tonClick();\n\t\t}, cd * 1000);\n\n\t\treturn () => {\n\t\t\tif (intervalRef.current) {\n\t\t\t\tclearInterval(intervalRef.current);\n\t\t\t}\n\t\t};\n\t}, [cd, onClick]);\n\n\treturn (\n\t\t<a className={`inkweave-btn ${className}`} style={{ display: 'none' }}>\n\t\t\t{children}\n\t\t</a>\n\t);\n};\n\nexport default memo(AutoChoice);","import { ChoiceParser, Patches } from '@inkweave/core';\nimport { ChoiceComponents } from '@inkweave/react';\nimport AutoChoice from './AutoButton';\n\nconst load = () => {\n\tChoiceParser.add('auto', (new_choice, val) => {\n\t\tnew_choice.type = 'auto';\n\t\tnew_choice.val = val;\n\t});\n\tChoiceComponents.register('auto', AutoChoice);\n\tPatches.add(null, {});\n};\n\nexport default load;","import { memo, useState } from 'react';\nimport type { ChoiceComponentProps } from '@inkweave/react';\n\nconst CooldownChoice: React.FC<ChoiceComponentProps> = ({\n\tval,\n\tonClick,\n\tclassName = '',\n\tchildren,\n}) => {\n\tconst [isDisabled, setIsDisabled] = useState(false);\n\tconst cd = parseFloat(val || '0');\n\n\tconst handleClick = () => {\n\t\tif (isDisabled) return;\n\n\t\tonClick();\n\t\tsetIsDisabled(true);\n\n\t\tsetTimeout(() => {\n\t\t\tsetIsDisabled(false);\n\t\t}, cd * 1000);\n\t};\n\n\treturn (\n\t\t<a\n\t\t\tclassName={`inkweave-btn ${className} ${isDisabled ? 'disabled' : ''}`}\n\t\t\tonClick={handleClick}\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t);\n};\n\nexport default memo(CooldownChoice);","import { ChoiceParser, Patches } from '@inkweave/core';\nimport { ChoiceComponents } from '@inkweave/react';\nimport CooldownChoice from './CdButton';\n\nconst load = () => {\n\tChoiceParser.add('cd', (new_choice, val) => {\n\t\tnew_choice.type = 'cd';\n\t\tnew_choice.val = val;\n\t});\n\tChoiceComponents.register('cd', CooldownChoice);\n\tPatches.add(null, {});\n};\n\nexport default load;","import type { InkStory } from '@inkweave/core';\nimport { Patches, Tags } from '@inkweave/core';\nimport { memory } from '../memory';\n\nconst options = {\n\tautosave_enabled: true,\n};\n\nconst load = () => {\n\tTags.add('autosave', (_: string | null | undefined, ink: InkStory) => {\n\t\tif (ink.options.autosave_enabled) {\n\t\t\tmemory.save(2, ink);\n\t\t}\n\t});\n\n\tPatches.add(null, options);\n};\n\nexport default load;"],"names":["StorageType","type","getStorage","Save","data","__publicField","useStorage","create","persist","set","get","title","index","newSavesMap","file_saves","format","name","str","state","e","newValue","options","show","save","ink","saveData","label","value","load","save_data","loadMemory","Patches","memory","ImageComponent","className","fallback","image","useStoryImage","hasError","setHasError","useState","useEffect","handleError","useCallback","handleLoad","jsx","Image","memo","getPath","path","fileHandler","Tags","val","AudioController","_a","FADE_CSS","useContentComplete","contentComplete","contents","last_content","styleElement","originalChoose","self","createSelectors","timer","unsub","contentsStore","scrollTimer","choicesStore","lastButton","element","ALLOWED_PROTOCOLS","url","AutoChoice","onClick","children","intervalRef","useRef","cd","AutoChoice$1","ChoiceParser","new_choice","ChoiceComponents","CooldownChoice","isDisabled","setIsDisabled","handleClick","CooldownChoice$1","_"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inkweave/plugins",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Optional plugins for InkWeave",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -20,7 +20,8 @@
20
20
  "build": "tsc --noEmit && vite build",
21
21
  "typecheck": "tsc --noEmit",
22
22
  "test": "bun test",
23
- "test:watch": "bun test --watch"
23
+ "test:watch": "bun test --watch",
24
+ "publish:pkg": "NPM_CONFIG_TOKEN=$(pass show npm/token) bun publish --access public"
24
25
  },
25
26
  "keywords": [
26
27
  "ink",