@inkweave/plugins 1.0.1 → 1.1.2

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.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, 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":";;;;;;;;;AAGA,MAAMA,IAA0C;AAAA,EAC/C,OAAO;AAAA,EACP,SAAS;AACV;AAEA,IAAIC,IAAO;AACX,MAAMC,IAAa,MACXF,EAAYC,CAAI;AASjB,MAAME,EAAyB;AAAA,EAKrC,YAAYC,GAAc;AAJ1B,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGC,SAAK,OAAO,KAAK,UAAUD,CAAI,GAC/B,KAAK,YAAY,IAAI,KAAK,eAAe,QAAW;AAAA,MACnD,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,IAAA,CACR,EAAE,OAAO,KAAK,KAAK,GACpB,KAAK,OAAO;AAAA,EACb;AACD;AAQA,MAAME,IAAaC,EAAA;AAAA,EAClBC;AAAA,IACC,CAACC,GAAKC,OAAS;AAAA,MACd,6BAAa,IAAA;AAAA,MACb,YAAY,CAACC,GAAOC,GAAOR,MAAS;AACnC,cAAMS,IAAc,IAAI,IAAIH,EAAA,EAAM,OAAO,GACnCI,IAAa,CAAC,GAAID,EAAY,IAAIF,CAAK,KAAK,EAAG;AACrD,QAAAG,EAAWF,CAAK,IAAI,IAAIT,EAAKC,CAAI,GACjCS,EAAY,IAAIF,GAAOG,CAAU,GACjCL,EAAI,EAAE,SAASI,GAAa;AAAA,MAC7B;AAAA,MACA,cAAc,CAACE,MAAW;AACzB,QAAAd,IAAOc;AAAA,MACR;AAAA,IAAA;AAAA,IAED;AAAA,MACC,MAAM;AAAA,MACN,SAAS;AAAA,QACR,SAAS,CAACC,MAAS;AAClB,gBAAMC,IAAMf,IAAa,QAAQc,CAAI;AACrC,cAAI,CAACC,EAAK,QAAO;AACjB,cAAI;AACH,kBAAM,EAAE,OAAAC,EAAA,IAAU,KAAK,MAAMD,CAAG;AAChC,mBAAO;AAAA,cACN,OAAO;AAAA,gBACN,GAAGC;AAAA,gBACH,SAAS,IAAI,IAAIA,EAAM,OAAO;AAAA,cAAA;AAAA,YAC/B;AAAA,UAEF,SAASC,GAAG;AACX,2BAAQ,MAAM,2CAA2CA,CAAC,GACnD;AAAA,UACR;AAAA,QACD;AAAA,QACA,SAAS,CAACH,GAAMI,MAA6C;AAC5D,gBAAMH,IAAM,KAAK,UAAU;AAAA,YAC1B,OAAO;AAAA,cACN,GAAGG,EAAS;AAAA,cACZ,SAAS,MAAM;AAAA,gBACdA,EAAS,MAAM,QAAQ,QAAA;AAAA,cAAQ;AAAA,YAChC;AAAA,UACD,CACA;AACD,UAAAlB,IAAa,QAAQc,GAAMC,CAAG;AAAA,QAC/B;AAAA,QACA,YAAY,CAACD,MAAS;AACrB,UAAAd,EAAA,EAAa,WAAWc,CAAI;AAAA,QAC7B;AAAA,MAAA;AAAA,IACD;AAAA,EACD;AAEF;ACnFA,IAAIK,IAAU;AAAA,EACb,eAAe;AAChB;AAEA,MAAMC,IAAO,CAACX,MACNL,EAAW,CAACY,MAAUA,EAAM,QAAQ,IAAIP,CAAK,KAAK,IAAI,GAGxDY,IAAO,CAACX,GAAeY,MAAkB;AAC9C,QAAMC,IAA2B;AAAA,IAChC,OAAOD,EAAI,MAAM,MAAM,OAAA;AAAA,EAAO;AAE/B,EAAAA,EAAI,WAAW,QAAQ,CAACE,MAAU;AACjC,UAAMC,IAAQH,EAAIE,CAAuB;AACzC,IAAIA,KAASF,KAAOG,MAAU,WAE5B,OAAOA,KAAU,YACjB,OAAOA,KAAU,YACjB,OAAOA,KAAU,aACjB,MAAM,QAAQA,CAAK,OAEnBF,EAASC,CAAK,IAAIC;AAAA,EAGrB,CAAC,GACDrB,EAAW,WAAW,WAAWkB,EAAI,OAAOZ,GAAOa,CAAQ;AAC5D,GAEMG,IAAO,CAACC,GAAmBL,MAAkB;AAClD,MAAID,IAA8B;AAClC,MAAI;AACHA,IAAAA,IAAO,KAAK,MAAMM,CAAS;AAAA,EAC5B,SAASV,GAAG;AACX,YAAQ,MAAM,wCAAwCA,CAAC;AACvD;AAAA,EACD;AACA,EAAII,MACHC,EAAI,MAAM,MAAM,SAASD,EAAK,KAAK,GACnCC,EAAI,MAAA,GACJA,EAAI,WAAW,QAAQ,CAACE,MAAU;AACjC,IACCA,KAASF,KACT,OAAOA,EAAIE,CAAuB,IAAM,OACxCA,KAASH,MAERC,EAAgCE,CAAK,IAAIH,EAAKG,CAAK;AAAA,EACtD,CAAC,GACDF,EAAI,SAAA;AAEN,GAEMM,KAAa,MAAM;AACxB,EAAAC,EAAQ,IAAI,WAAY;AACvB,IAAAzB,EAAW,SAAA,EAAW,aAAae,EAAQ,aAAa;AAAA,EACzD,GAAGA,CAAO;AACX,GAEaW,IAAS,EAAE,MAAAT,GAAA,MAAMK,GAAM,MAAAN,EAAA,GC3D9BW,IAAuC,CAAC,EAAE,WAAAC,IAAY,IAAI,UAAAC,IAAW,WAAW;AACrF,QAAMC,IAAQC,EAAc,CAACnB,MAAUA,EAAM,KAAK,GAC5C,CAACoB,GAAUC,CAAW,IAAIC,EAAS,EAAK;AAE9C,EAAAC,EAAU,MAAM;AACf,IAAAF,EAAY,EAAK;AAAA,EAClB,GAAG,CAACH,CAAK,CAAC;AAEV,QAAMM,IAAcC,EAAY,MAAM;AACrC,IAAAJ,EAAY,EAAI,GAChB,QAAQ,KAAK,mCAAmCH,CAAK,EAAE;AAAA,EACxD,GAAG,CAACA,CAAK,CAAC,GAEJQ,IAAaD,EAAY,MAAM;AACpC,IAAAJ,EAAY,EAAK;AAAA,EAClB,GAAG,CAAA,CAAE;AAEL,SAAKH,IAEDE,IACIH,IAAW,gBAAAU,EAAC,OAAA,EAAI,IAAG,kBAAiB,WAAAX,GAAuB,aAAS,IAAS,OAIpF,gBAAAW,EAAC,OAAA,EAAI,IAAG,kBAAiB,WAAAX,GACxB,UAAA,gBAAAW,EAAC,OAAA,EAAI,KAAKT,GAAO,KAAI,IAAG,SAASM,GAAa,QAAQE,GAAY,GACnE,IATkB;AAWpB,GAEAE,KAAeC,EAAKd,CAAc,GCxBrBI,IAAgB9B,EAAmB,CAACE,OAAS;AAAA,EACzD,OAAO;AAAA,EACP,UAAU,CAAC2B,MAAU3B,EAAI,EAAE,OAAA2B,GAAO;AACnC,EAAE,GAEIY,IAAU,CAACC,GAAcC,MAC1BA,KAAe,qBAAqBA,IAC/BA,EAA2D,gBAAgBD,CAAI,IAEjFA,GAGFrB,KAAO,MAAM;AAClB,EAAAuB,EAAK,IAAI,SAAS,CAACC,GAAgC5B,MAAkB;AACpE,IAAI4B,IACHf,EAAc,SAAA,EAAW,SAASW,EAAQI,GAAK5B,EAAI,QAAQ,WAAW,CAAC,IAEvEa,EAAc,SAAA,EAAW,SAAS,EAAE;AAAA,EAEtC,CAAC,GAEDN,EAAQ,IAAI,WAAY;AACvB,WAAO,eAAe,MAAM,SAAS;AAAA,MACpC,MAAM;AACL,eAAOM,EAAc,WAAW;AAAA,MACjC;AAAA,MAEA,IAAIY,GAAc;AACjB,QAAAZ,EAAc,SAAA,EAAW,SAASY,CAAI;AAAA,MACvC;AAAA,IAAA,CACA,GACD,KAAK,WAAW,KAAK,OAAO,GAC5B,KAAK,OAAO,KAAK,MAAM;AACtB,WAAK,QAAQ;AAAA,IACd,CAAC;AAAA,EACF,GAAG,CAAA,CAAE;AACN;AClDO,MAAMI,EAAgB;AAAA,EAM5B,WAAW,QAAQ;AAClB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,WAAW,QAAQ;AAClB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,WAAW,gBAAgB;AAC1B,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,WAAW,gBAAgB;AAC1B,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,OAAO,UAAUJ,GAAc;AAC9B,SAAK,SAAS,IAAI,MAAMA,CAAI,GAC5B,KAAK,OAAO,OAAO,IACnB,KAAK,iBAAiB,MAAM;;AAC3B,OAAAK,IAAA,KAAK,WAAL,QAAAA,EAAa;AAAA,IACd,GACA,KAAK,OAAO,iBAAiB,kBAAkB,KAAK,cAAc;AAAA,EACnE;AAAA,EAEA,OAAO,UAAUL,GAAc;AAC9B,SAAK,SAAS,IAAI,MAAMA,CAAI,GAC5B,KAAK,iBAAiB,MAAM;;AAC3B,OAAAK,IAAA,KAAK,WAAL,QAAAA,EAAa;AAAA,IACd,GACA,KAAK,OAAO,iBAAiB,kBAAkB,KAAK,cAAc;AAAA,EACnE;AAAA,EAEA,OAAO,eAAe;AACrB,IAAI,KAAK,WACR,KAAK,OAAO,MAAA,GACZ,KAAK,OAAO,cAAc,GAC1B,KAAK,OAAO;AAAA,MACX;AAAA,MACA,KAAK;AAAA,IAAA,GAEN,KAAK,OAAO,MAAM,KAEnB,KAAK,SAAS,MACd,KAAK,iBAAiB,MAAM;AAAA,IAAC;AAAA,EAC9B;AAAA,EAEA,OAAO,eAAe;AACrB,IAAI,KAAK,WACR,KAAK,OAAO,MAAA,GACZ,KAAK,OAAO,cAAc,GAC1B,KAAK,OAAO;AAAA,MACX;AAAA,MACA,KAAK;AAAA,IAAA,GAEN,KAAK,OAAO,MAAM,KAEnB,KAAK,SAAS,MACd,KAAK,iBAAiB,MAAM;AAAA,IAAC;AAAA,EAC9B;AACD;AAjECjD,EADYgD,GACG,UAAkC,OACjDhD,EAFYgD,GAEG,UAAkC,OACjDhD,EAHYgD,GAGG,kBAA6B,MAAM;AAAC,IACnDhD,EAJYgD,GAIG,kBAA6B,MAAM;AAAC;ACDpD,MAAML,IAAU,CAACC,GAAcC,MAC1BA,KAAe,qBAAqBA,IAC/BA,EAA2D,gBAAgBD,CAAI,IAEjFA,GAGFrB,KAAO,MAAM;AAClB,EAAAuB,EAAK,IAAI,SAAS,CAACC,GAAgC5B,MAAkB;AACpE,IAAI4B,KACHC,EAAgB,aAAA,GAChBA,EAAgB,UAAUL,EAAQI,GAAK5B,EAAI,QAAQ,WAAW,CAAC,KAE/D6B,EAAgB,aAAA;AAAA,EAElB,CAAC,GAEDF,EAAK,IAAI,SAAS,CAACC,GAAgC5B,MAAkB;AACpE,IAAI4B,KACHC,EAAgB,aAAA,GAChBA,EAAgB,UAAUL,EAAQI,GAAK5B,EAAI,QAAQ,WAAW,CAAC,KAE/D6B,EAAgB,aAAA;AAAA,EAElB,CAAC,GAEDtB,EAAQ,IAAI,WAAY;AACvB,SAAK,QAAQsB,GACb,KAAK,SAAS,KAAK,MAAM;AACxB,MAAAA,EAAgB,aAAA,GAChBA,EAAgB,aAAA;AAAA,IACjB,CAAC;AAAA,EACF,GAAG,CAAA,CAAE;AACN,GCjCME,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAiBXlC,IAAU;AAAA,EACf,WAAW;AACZ,GASMmC,IAAqBjD,EAAwB,CAACE,OAAS;AAAA,EAC5D,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,oBAAoB,CAACgD,MAAoBhD,EAAI,EAAE,iBAAAgD,GAAiB;AAAA,EAChE,gBAAgB,CAACC,MAAa;AAC7B,QAAIA,EAAS,WAAW,GAAG;AAC1B,MAAAjD,EAAI,EAAE,cAAc,IAAI;AACxB;AAAA,IACD;AACA,UAAMkD,IAAeD,EAASA,EAAS,SAAS,CAAC;AACjD,IAAAjD,EAAI,EAAE,cAAAkD,GAAc;AAAA,EACrB;AACD,EAAE;AAEF,IAAIC,IAAwC;AAE5C,MAAMhC,KAAO,MAAM;AAElB,EAAKgC,MACJA,IAAe,SAAS,cAAc,OAAO,GAC7CA,EAAa,cAAcL,GAC3B,SAAS,KAAK,YAAYK,CAAY,IAGvC7B,EAAQ,IAAI,WAAiC;AAC5C,UAAM8B,IAAiB,KAAK,QACtBC,IAAO;AACb,SAAK,SAAS,SAAUlD,GAAe;AACtC,aAAIkD,EAAK,QAAQ,aAAa,MAC7BN,EAAmB,SAAA,EAAW,mBAAmB,EAAK,GACtDA,EAAmB,SAAA,EAAW,eAAeM,EAAK,QAAoB,IAEhED,EAAe,KAAKC,GAAMlD,CAAK;AAAA,IACvC,GACA,OAAO,eAAe,MAAM,gBAAgB;AAAA,MAC3C,MAAM;AACL,cAAM+C,IAAeH,EAAmB,SAAA,EAAW;AACnD,eAAQM,EAAK,SAAsB,YAAYH,CAAY;AAAA,MAC5D;AAAA,IAAA,CACA,GACD,OAAO,eAAe,MAAM,kBAAkB;AAAA,MAC7C,MAAM;AACL,eAAOI,EAAgBP,CAAkB,EAAE,IAAI,gBAAA;AAAA,MAChD;AAAA,IAAA,CACA;AAED,QAAIQ,IAA8C;AAClD,UAAMC,IAAQC,EAAc,UAAU,MAAM;AAC3C,MAAIJ,EAAK,QAAQ,aAAa,MAC1BE,kBAAoBA,CAAK,GAC7BA,IAAQ,WAAW,MAAM;AACxB,QAAAR,EAAmB,SAAA,EAAW,mBAAmB,EAAI;AAAA,MACtD,IAAKM,EAAK,SAAsB,SAAUA,EAAK,gBAA4BA,EAAK,QAAQ,YAAuB,GAAI;AAAA,IACpH,CAAC;AAED,SAAK,SAAS,KAAK,MAAM;AACxB,MAAAG,EAAA,GACID,kBAAoBA,CAAK;AAAA,IAC9B,CAAC,GACD,KAAK,OAAO,KAAK,MAAM;AACtB,MAAIF,EAAK,QAAQ,aAAa,KAC7BN,EAAmB,SAAA,EAAW,mBAAmB,EAAK,GACvDA,EAAmB,SAAA,EAAW,eAAe,EAAE;AAAA,IAChD,CAAC;AAAA,EACF,GAAGnC,CAAO;AACX,GC9FMO,KAAO,MAAM;AAClB,EAAAG,EAAQ,IAAI,WAAY;AACvB,QAAIoC,IAAoD;AAExD,UAAMF,IAAQG,EAAa,UAAU,MAAM;AAC1C,MAAID,kBAA0BA,CAAW,GAEzCA,IAAc,WAAW,MAAM;AAC9B,cAAME,IAAa,SAAS;AAAA,UAC3B;AAAA,QAAA;AAED,YAAIA,GAAY;AACf,gBAAMC,IAAU,SAAS;AAAA,YACxB;AAAA,UAAA;AAED,UAAAA,KAAA,QAAAA,EAAS,SAAS;AAAA,YACjB,KAAKD,EAAW;AAAA,YAChB,UAAU;AAAA,UAAA;AAAA,QAEZ;AAAA,MACD,GAAG,CAAC;AAAA,IACL,CAAC;AAED,SAAK,SAAS,KAAK,MAAM;AACxB,MAAAJ,EAAA,GACIE,kBAA0BA,CAAW;AAAA,IAC1C,CAAC;AAAA,EACF,GAAG,CAAA,CAAE;AACN,GC5BMI,IAAoB,CAAC,SAAS,QAAQ,GAEtC3C,KAAO,MAAM;AAClB,EAAAuB,EAAK,IAAI,YAAY,CAACC,MAAmC;AACxD,QAAIA,GAAK;AACR,UAAI;AACH,cAAMoB,IAAM,IAAI,IAAIpB,CAAG;AACvB,YAAI,CAACmB,EAAkB,SAASC,EAAI,QAAQ,GAAG;AAC9C,kBAAQ,KAAK,0CAA0CA,EAAI,QAAQ;AACnE;AAAA,QACD;AAAA,MACD,QAAQ;AACP,gBAAQ,KAAK,0BAA0BpB,CAAG;AAC1C;AAAA,MACD;AACA,aAAO,KAAKA,GAAK,UAAU,qBAAqB;AAAA,IACjD;AAAA,EACD,CAAC;AACF,GCjBMqB,IAA6C,CAAC;AAAA,EACnD,KAAArB;AAAA,EACA,SAAAsB;AAAA,EACA,WAAAxC,IAAY;AAAA,EACZ,UAAAyC;AACD,MAAM;AACL,QAAMC,IAAcC,EAA8C,IAAI,GAChEC,IAAK,WAAW1B,KAAO,GAAG;AAEhC,SAAAX,EAAU,MAAM;AACf,QAAI,EAAAqC,KAAM;AAEV,aAAAF,EAAY,UAAU,YAAY,MAAM;AACvC,QAAAF,EAAA;AAAA,MACD,GAAGI,IAAK,GAAI,GAEL,MAAM;AACZ,QAAIF,EAAY,WACf,cAAcA,EAAY,OAAO;AAAA,MAEnC;AAAA,EACD,GAAG,CAACE,GAAIJ,CAAO,CAAC,GAGf,gBAAA7B,EAAC,KAAA,EAAE,WAAW,gBAAgBX,CAAS,IAAI,OAAO,EAAE,SAAS,OAAA,GAC3D,UAAAyC,EAAA,CACF;AAEF,GAEAI,IAAehC,EAAK0B,CAAU,GC7BxB7C,KAAO,MAAM;AAClB,EAAAoD,EAAa,IAAI,QAAQ,CAACC,GAAY7B,MAAQ;AAC7C,IAAA6B,EAAW,OAAO,QAClBA,EAAW,MAAM7B;AAAA,EAClB,CAAC,GACD8B,EAAiB,SAAS,QAAQT,CAAU,GAC5C1C,EAAQ,IAAI,MAAM,EAAE;AACrB,GCRMoD,IAAiD,CAAC;AAAA,EACvD,KAAA/B;AAAA,EACA,SAAAsB;AAAA,EACA,WAAAxC,IAAY;AAAA,EACZ,UAAAyC;AACD,MAAM;AACL,QAAM,CAACS,GAAYC,CAAa,IAAI7C,EAAS,EAAK,GAC5CsC,IAAK,WAAW1B,KAAO,GAAG,GAE1BkC,IAAc,MAAM;AACzB,IAAIF,MAEJV,EAAA,GACAW,EAAc,EAAI,GAElB,WAAW,MAAM;AAChB,MAAAA,EAAc,EAAK;AAAA,IACpB,GAAGP,IAAK,GAAI;AAAA,EACb;AAEA,SACC,gBAAAjC;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,WAAW,gBAAgBX,CAAS,IAAIkD,IAAa,aAAa,EAAE;AAAA,MACpE,SAASE;AAAA,MAER,UAAAX;AAAA,IAAA;AAAA,EAAA;AAGJ,GAEAY,IAAexC,EAAKoC,CAAc,GC7B5BvD,KAAO,MAAM;AAClB,EAAAoD,EAAa,IAAI,MAAM,CAACC,GAAY7B,MAAQ;AAC3C,IAAA6B,EAAW,OAAO,MAClBA,EAAW,MAAM7B;AAAA,EAClB,CAAC,GACD8B,EAAiB,SAAS,MAAMC,CAAc,GAC9CpD,EAAQ,IAAI,MAAM,EAAE;AACrB,GCPMV,IAAU;AAAA,EACf,kBAAkB;AACnB,GAEMO,KAAO,MAAM;AAClB,EAAAuB,EAAK,IAAI,YAAY,CAACqC,GAA8BhE,MAAkB;AACrE,IAAIA,EAAI,QAAQ,oBACfQ,EAAO,KAAK,GAAGR,CAAG;AAAA,EAEpB,CAAC,GAEDO,EAAQ,IAAI,MAAMV,CAAO;AAC1B;"}
1
+ {"version":3,"file":"index.js","sources":["../src/audio/AudioController.ts","../src/audio/index.ts","../src/autoButton/AutoButton.tsx","../src/autoButton/index.ts","../src/memory/storage.ts","../src/memory/index.ts","../src/autosave/index.ts","../src/cdButton/cooldownState.ts","../src/cdButton/CdButton.tsx","../src/cdButton/index.ts","../src/fadeEffect/index.ts","../src/image/Image.tsx","../src/image/index.ts","../src/linkopen/index.ts","../src/scrollafterchoice/index.ts"],"sourcesContent":["export class AudioController {\n private static _sound: HTMLAudioElement | null = null;\n private static _music: HTMLAudioElement | null = null;\n private static _sound_handler: () => void = () => {};\n private static _music_handler: () => void = () => {};\n\n static get sound() {\n return AudioController._sound;\n }\n\n static get music() {\n return AudioController._music;\n }\n\n static get sound_handler() {\n return AudioController._sound_handler;\n }\n\n static get music_handler() {\n return AudioController._music_handler;\n }\n\n static set_music(path: string) {\n AudioController._music = new Audio(path);\n AudioController._music.loop = true;\n AudioController._music_handler = () => {\n AudioController._music?.play();\n };\n AudioController._music.addEventListener(\"canplaythrough\", AudioController._music_handler);\n }\n\n static set_sound(path: string) {\n AudioController._sound = new Audio(path);\n AudioController._sound_handler = () => {\n AudioController._sound?.play();\n };\n AudioController._sound.addEventListener(\"canplaythrough\", AudioController._sound_handler);\n }\n\n static cleanupSound() {\n if (AudioController._sound) {\n AudioController._sound.pause();\n AudioController._sound.currentTime = 0;\n AudioController._sound.removeEventListener(\"canplaythrough\", AudioController._sound_handler);\n AudioController._sound.src = \"\";\n }\n AudioController._sound = null;\n AudioController._sound_handler = () => {};\n }\n\n static cleanupMusic() {\n if (AudioController._music) {\n AudioController._music.pause();\n AudioController._music.currentTime = 0;\n AudioController._music.removeEventListener(\"canplaythrough\", AudioController._music_handler);\n AudioController._music.src = \"\";\n }\n AudioController._music = null;\n AudioController._music_handler = () => {};\n }\n}\n","import { type FileHandler, type InkStory, Patches, Tags } from \"@inkweave/core\";\nimport { AudioController } from \"./AudioController\";\n\nconst getPath = (path: string, fileHandler?: FileHandler) => {\n if (fileHandler && \"resolveFilename\" in fileHandler) {\n return (fileHandler as { resolveFilename: (f: string) => string }).resolveFilename(path);\n }\n return path;\n};\n\nconst load = () => {\n Tags.add(\"sound\", (val: string | null | undefined, ink: InkStory) => {\n if (val) {\n AudioController.cleanupSound();\n AudioController.set_sound(getPath(val, ink.options.fileHandler));\n } else {\n AudioController.cleanupSound();\n }\n });\n\n Tags.add(\"music\", (val: string | null | undefined, ink: InkStory) => {\n if (val) {\n AudioController.cleanupMusic();\n AudioController.set_music(getPath(val, ink.options.fileHandler));\n } else {\n AudioController.cleanupMusic();\n }\n });\n\n Patches.add(function () {\n this.audio = AudioController;\n this.cleanups.push(() => {\n AudioController.cleanupSound();\n AudioController.cleanupMusic();\n });\n }, {});\n};\n\nexport default load;\n","import type { ChoiceComponentProps } from \"@inkweave/react\";\nimport { choiceStyles } from \"@inkweave/react\";\nimport { memo, useEffect, useRef } from \"react\";\n\nconst AutoChoice: React.FC<ChoiceComponentProps> = ({\n choice,\n onClick,\n className = \"\",\n children,\n}) => {\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const onClickRef = useRef(onClick);\n const cd = parseFloat(choice.val || \"0\");\n\n onClickRef.current = onClick;\n\n useEffect(() => {\n if (cd <= 0) return;\n\n intervalRef.current = setInterval(() => {\n onClickRef.current();\n }, cd * 1000);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [cd]);\n\n const buttonClass = `${choiceStyles.button} ${className}`.trim();\n\n return (\n <a className={buttonClass} style={{ display: \"none\" }}>\n {children}\n </a>\n );\n};\n\nexport default memo(AutoChoice);\n","import { ChoiceParser, Patches } from \"@inkweave/core\";\nimport { ChoiceRegistry } from \"@inkweave/react\";\nimport AutoChoice from \"./AutoButton\";\n\nconst load = () => {\n ChoiceParser.add(\"auto\", (new_choice, val) => {\n new_choice.type = \"auto\";\n new_choice.val = val;\n });\n ChoiceRegistry.register(\"auto\", AutoChoice);\n Patches.add(null, {});\n};\n\nexport default load;\n","import { create } from \"zustand\";\nimport { persist, type StorageValue } from \"zustand/middleware\";\n\nconst StorageType: { [key: string]: Storage } = {\n local: localStorage,\n session: sessionStorage,\n};\n\nlet type = \"local\";\nconst getStorage = () => {\n return StorageType[type];\n};\n\nexport interface SaveSlot {\n data: string;\n timestamp: string;\n meta: string;\n}\n\nexport class Save implements SaveSlot {\n data: string;\n timestamp: string;\n meta: string;\n\n constructor(data: object) {\n this.data = JSON.stringify(data);\n this.timestamp = new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(Date.now());\n this.meta = \"autogenerated\";\n }\n}\n\ninterface StorageInterface {\n storage: Map<string, SaveSlot[]>;\n setStorage: (title: string, index: number, data: object) => void;\n changeFormat: (format: string) => void;\n}\n\nconst useStorage = create<StorageInterface>()(\n persist(\n (set, get) => ({\n storage: new Map(),\n setStorage: (title, index, data) => {\n const newSavesMap = new Map(get().storage);\n const file_saves = [...(newSavesMap.get(title) || [])];\n file_saves[index] = new Save(data);\n newSavesMap.set(title, file_saves);\n set({ storage: newSavesMap });\n },\n changeFormat: (format) => {\n type = format;\n },\n }),\n {\n name: \"inkStory\",\n storage: {\n getItem: (name) => {\n const str = getStorage().getItem(name);\n if (!str) return null;\n try {\n const { state } = JSON.parse(str);\n return {\n state: {\n ...state,\n storage: new Map(state.storage),\n },\n };\n } catch (e) {\n console.error(\"InkWeave: Failed to parse storage data:\", e);\n return null;\n }\n },\n setItem: (name, newValue: StorageValue<StorageInterface>) => {\n const str = JSON.stringify({\n state: {\n ...newValue.state,\n storage: Array.from(newValue.state.storage.entries()),\n },\n });\n getStorage().setItem(name, str);\n },\n removeItem: (name) => {\n getStorage().removeItem(name);\n },\n },\n },\n ),\n);\n\nexport default useStorage;\n","import type { InkStory } from \"@inkweave/core\";\nimport { Patches } from \"@inkweave/core\";\nimport type { SaveSlot } from \"./storage\";\nimport useStorage from \"./storage\";\n\ninterface MemorySaveData {\n state: string;\n [key: string]: string | number | boolean | string[] | undefined;\n}\n\nconst options = {\n memory_format: \"local\",\n};\n\nconst show = (title: string): SaveSlot[] | null => {\n return useStorage((state) => state.storage.get(title) || null);\n};\n\nconst save = (index: number, ink: InkStory) => {\n const saveData: MemorySaveData = {\n state: ink.story.state.toJson(),\n };\n ink.save_label.forEach((label) => {\n const value = ink[label as keyof InkStory];\n if (label in ink && value !== undefined) {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n Array.isArray(value)\n ) {\n saveData[label] = value as string | number | boolean | string[];\n }\n }\n });\n useStorage.getState().setStorage(ink.title, index, saveData);\n};\n\nconst load = (save_data: string, ink: InkStory) => {\n let save: MemorySaveData | null = null;\n try {\n save = JSON.parse(save_data);\n } catch (e) {\n console.error(\"InkWeave: Failed to parse save data:\", e);\n return;\n }\n if (save) {\n ink.story.state.LoadJson(save.state);\n ink.clear();\n ink.save_label.forEach((label) => {\n if (label in ink && typeof ink[label as keyof InkStory] !== \"undefined\" && label in save)\n (ink as Record<string, unknown>)[label] = save[label];\n });\n ink.continue();\n }\n};\n\nconst loadMemory = () => {\n Patches.add(() => {\n useStorage.getState().changeFormat(options.memory_format);\n }, options);\n};\n\nexport const memory = { save, load, show };\nexport type { SaveSlot };\nexport default loadMemory;\n","import type { InkStory } from \"@inkweave/core\";\nimport { Patches, Tags } from \"@inkweave/core\";\nimport { memory } from \"../memory\";\n\nconst options = {\n autosave_enabled: true,\n};\n\nconst load = () => {\n Tags.add(\"autosave\", (_: string | null | undefined, ink: InkStory) => {\n if (ink.options.autosave_enabled) {\n memory.save(1, ink);\n }\n });\n\n Patches.add(null, options);\n};\n\nexport default load;\n","// 存储所有 cd 按钮的冷却状态\nconst cooldownStates = new Map<string, number>();\n\nexport function getCooldownKey(choice: { type: string; text: string; val?: string }): string {\n return `${choice.type}_${choice.text}_${choice.val || \"\"}`;\n}\n\nexport function isCooldownActive(key: string): boolean {\n const cooldownUntil = cooldownStates.get(key) || 0;\n return Date.now() < cooldownUntil;\n}\n\nexport function getRemainingSeconds(key: string): number {\n const cooldownUntil = cooldownStates.get(key) || 0;\n const remainingMs = Math.max(0, cooldownUntil - Date.now());\n return Math.ceil(remainingMs / 1000);\n}\n\nexport function setCooldown(key: string, seconds: number): void {\n cooldownStates.set(key, Date.now() + seconds * 1000);\n}\n","import type { ChoiceComponentProps } from \"@inkweave/react\";\nimport { choiceStyles, useStory } from \"@inkweave/react\";\nimport { memo, useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n getCooldownKey,\n getRemainingSeconds,\n isCooldownActive,\n setCooldown,\n} from \"./cooldownState\";\n\nconst CooldownChoice: React.FC<ChoiceComponentProps> = ({\n choice,\n onClick,\n className = \"\",\n children,\n}) => {\n const cd = parseFloat(choice.val || \"0\");\n const key = getCooldownKey(choice);\n const ink = useStory();\n const [, setTick] = useState(0);\n const isMountedRef = useRef(true);\n\n const isDisabled = isCooldownActive(key);\n const remainingSeconds = getRemainingSeconds(key);\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (!isDisabled) return;\n const interval = setInterval(() => {\n if (isMountedRef.current) {\n setTick((t) => t + 1);\n }\n }, 1000);\n return () => clearInterval(interval);\n }, [isDisabled]);\n\n const handleClick = useCallback(() => {\n if (isDisabled) return;\n onClick();\n setCooldown(key, cd);\n setTick((t) => t + 1); // 触发重渲染\n }, [isDisabled, cd, onClick, key]);\n\n const buttonClass =\n `${choiceStyles?.button || \"\"} ${className} ${isDisabled ? choiceStyles?.disabled || \"\" : \"\"}`.trim();\n\n const template = (ink.options.cdTemplate as string) || \"{text} ({time})\";\n const displayText =\n isDisabled && remainingSeconds > 0\n ? template.replace(\"{text}\", String(children)).replace(\"{time}\", String(remainingSeconds))\n : children;\n\n return (\n <a className={buttonClass} onClick={handleClick}>\n {displayText}\n </a>\n );\n};\n\nexport default memo(CooldownChoice);\n","import { ChoiceParser, Patches } from \"@inkweave/core\";\nimport { ChoiceRegistry } from \"@inkweave/react\";\nimport CooldownChoice from \"./CdButton\";\n\nconst options = {\n cdTemplate: \"{text} ({time})\",\n};\n\nconst load = () => {\n ChoiceParser.add(\"cd\", (new_choice, val) => {\n new_choice.type = \"cd\";\n new_choice.val = val;\n });\n ChoiceRegistry.register(\"cd\", CooldownChoice);\n Patches.add(null, options);\n};\n\nexport default load;\n","import {\n contentsStore,\n createSelectors,\n type InkStoryContext,\n Patches,\n Tags,\n} from \"@inkweave/core\";\nimport { create } from \"zustand\";\n\nconst options = {\n // 控制文字显示延迟速度(秒),可通过初始化时传入 linedelay 参数修改\n // 或在 Ink 中使用 #linedelay:0.2 动态调整\n linedelay: 0.05,\n};\n\ntype ContentComplete = {\n contentComplete: boolean;\n last_content: string;\n setContentComplete: (contentComplete: boolean) => void;\n setLastContent: (contents: string[]) => void;\n};\n\nconst useContentComplete = create<ContentComplete>((set) => ({\n contentComplete: true,\n last_content: \"\",\n setContentComplete: (contentComplete) => set({ contentComplete }),\n setLastContent: (contents) => {\n if (contents.length === 0) {\n set({ last_content: \"\" });\n return;\n }\n const last_content = contents[contents.length - 1];\n set({ last_content });\n },\n}));\n\nconst load = () => {\n Tags.add(\"linedelay\", (val: string | null | undefined, ink) => {\n if (val != null) {\n const value = parseFloat(val);\n if (!Number.isNaN(value)) {\n ink.options.linedelay = value;\n if (value === 0) {\n useContentComplete.getState().setContentComplete(true);\n }\n }\n }\n });\n\n Patches.add(function (this: InkStoryContext) {\n const originalChoose = this.choose as (index: number) => void;\n const self = this;\n this.choose = (index: number) => {\n if (self.options.linedelay !== 0) {\n useContentComplete.getState().setContentComplete(false);\n useContentComplete.getState().setLastContent(self.contents as string[]);\n }\n return originalChoose.call(self, index);\n };\n Object.defineProperty(this, \"visibleLines\", {\n get() {\n const last_content = useContentComplete.getState().last_content;\n if (!last_content) return -1;\n return (self.contents as string[]).lastIndexOf(last_content);\n },\n });\n Object.defineProperty(this, \"choicesCanShow\", {\n get() {\n return createSelectors(useContentComplete).use.contentComplete();\n },\n });\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n const unsub = contentsStore.subscribe(() => {\n if (timer) clearTimeout(timer);\n if (self.options.linedelay === 0) {\n useContentComplete.getState().setContentComplete(true);\n return;\n }\n timer = setTimeout(\n () => {\n useContentComplete.getState().setContentComplete(true);\n },\n Math.max(\n 0,\n ((self.contents as string[]).length - (self.visibleLines as number)) *\n (self.options.linedelay as number) *\n 1000,\n ),\n );\n });\n\n this.cleanups.push(() => {\n unsub();\n if (timer) clearTimeout(timer);\n });\n this.clears.push(() => {\n if (self.options.linedelay !== 0) useContentComplete.getState().setContentComplete(false);\n useContentComplete.getState().setLastContent([]);\n });\n }, options);\n};\n\nexport default load;\n","import { memo, useCallback, useEffect, useRef, useState } from \"react\";\nimport { useStoryImage } from \"./index\";\nimport styles from \"./styles.module.css\";\n\ninterface ImageProps {\n className?: string;\n fallback?: React.ReactNode;\n}\n\nconst ImageComponent: React.FC<ImageProps> = ({ className = \"\", fallback = null }) => {\n const image = useStoryImage((state) => state.image);\n const [hasError, setHasError] = useState(false);\n\n useEffect(() => {\n setHasError(false);\n }, []);\n\n const imageRef = useRef(image);\n imageRef.current = image;\n\n const handleError = useCallback(() => {\n setHasError(true);\n console.warn(`InkWeave: Failed to load image: ${imageRef.current}`);\n }, []);\n\n const handleLoad = useCallback(() => {\n setHasError(false);\n }, []);\n\n const containerClassName = `${styles.container} ${className}`.trim();\n\n if (!image) return null;\n\n if (hasError) {\n return fallback ? <div className={containerClassName}>{fallback}</div> : null;\n }\n\n return (\n <div className={containerClassName}>\n <img src={image} alt=\"\" onError={handleError} onLoad={handleLoad} />\n </div>\n );\n};\n\nexport default memo(ImageComponent);\n","import { type FileHandler, type InkStory, Patches, Tags } from \"@inkweave/core\";\nimport { create } from \"zustand\";\n\ndeclare module \"@inkweave/core\" {\n interface InkStory {\n image: string;\n }\n}\n\ntype StoryImage = {\n image: string;\n setImage: (image: string) => void;\n};\n\nexport const useStoryImage = create<StoryImage>((set) => ({\n image: \"\",\n setImage: (image) => set({ image }),\n}));\n\nconst getPath = (path: string, fileHandler?: FileHandler) => {\n if (fileHandler && \"resolveFilename\" in fileHandler) {\n return (fileHandler as { resolveFilename: (f: string) => string }).resolveFilename(path);\n }\n return path;\n};\n\nconst load = () => {\n Tags.add(\"image\", (val: string | null | undefined, ink: InkStory) => {\n if (val) {\n useStoryImage.getState().setImage(getPath(val, ink.options.fileHandler));\n } else {\n useStoryImage.getState().setImage(\"\");\n }\n });\n\n Patches.add(function () {\n Object.defineProperty(this, \"image\", {\n get() {\n return useStoryImage.getState().image;\n },\n\n set(path: string) {\n useStoryImage.getState().setImage(path);\n },\n });\n this.save_label.push(\"image\");\n this.clears.push(() => {\n this.image = \"\";\n });\n }, {});\n};\n\nexport default load;\nexport { default as Image } from \"./Image\";\n","import { Tags } from \"@inkweave/core\";\n\nconst ALLOWED_PROTOCOLS = [\"http:\", \"https:\"];\n\nconst load = () => {\n Tags.add(\"linkopen\", (val: string | null | undefined) => {\n if (val) {\n try {\n const url = new URL(val);\n if (!ALLOWED_PROTOCOLS.includes(url.protocol)) {\n console.warn(\"InkWeave: Blocked unsafe URL protocol:\", url.protocol);\n return;\n }\n } catch {\n console.warn(\"InkWeave: Invalid URL:\", val);\n return;\n }\n window.open(val, \"_blank\", \"noopener,noreferrer\");\n }\n });\n};\n\nexport default load;\n","import { choicesStore, Patches } from \"@inkweave/core\";\n\nconst load = () => {\n Patches.add(function () {\n let scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = choicesStore.subscribe(() => {\n if (scrollTimer) clearTimeout(scrollTimer);\n\n scrollTimer = setTimeout(() => {\n const lastButton = document.querySelector(\n '[data-inkweave=\"choices\"] > li:last-child',\n ) as HTMLElement;\n if (lastButton) {\n const element = document.querySelector('[data-inkweave=\"story\"]') as HTMLElement;\n element?.scrollTo({\n top: lastButton.offsetTop,\n behavior: \"smooth\",\n });\n }\n }, 0);\n });\n\n this.cleanups.push(() => {\n unsub();\n if (scrollTimer) clearTimeout(scrollTimer);\n });\n }, {});\n};\n\nexport default load;\n"],"names":["_AudioController","path","_a","AudioController","getPath","fileHandler","load","Tags","val","ink","Patches","AutoChoice","choice","onClick","className","children","intervalRef","useRef","onClickRef","cd","useEffect","buttonClass","choiceStyles","jsx","AutoChoice$1","memo","ChoiceParser","new_choice","ChoiceRegistry","StorageType","type","getStorage","Save","data","useStorage","create","persist","set","get","title","index","newSavesMap","file_saves","format","name","str","state","e","newValue","options","show","save","saveData","label","value","save_data","loadMemory","memory","_","cooldownStates","getCooldownKey","isCooldownActive","key","cooldownUntil","getRemainingSeconds","remainingMs","setCooldown","seconds","CooldownChoice","useStory","setTick","useState","isMountedRef","isDisabled","remainingSeconds","interval","t","handleClick","useCallback","_b","template","displayText","CooldownChoice$1","useContentComplete","contentComplete","contents","last_content","originalChoose","self","createSelectors","timer","unsub","contentsStore","ImageComponent","fallback","image","useStoryImage","hasError","setHasError","imageRef","handleError","handleLoad","containerClassName","styles","Image","ALLOWED_PROTOCOLS","url","scrollTimer","choicesStore","lastButton","element"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ ._container_1a16a_1{display:flex;justify-content:center;margin-bottom:1rem;flex-shrink:0}._container_1a16a_1 img{max-width:100%;max-height:400px;border-radius:8px;object-fit:contain}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@inkweave/plugins",
3
- "version": "1.0.1",
3
+ "repository": "https://github.com/uglyboy-tl/InkWeave.git",
4
+ "version": "1.1.2",
4
5
  "description": "Optional plugins for InkWeave",
5
6
  "type": "module",
6
7
  "main": "./dist/index.cjs",
@@ -11,17 +12,16 @@
11
12
  "types": "./dist/index.d.ts",
12
13
  "import": "./dist/index.js",
13
14
  "require": "./dist/index.cjs"
14
- }
15
+ },
16
+ "./plugins.css": "./dist/plugins.css"
15
17
  },
16
18
  "files": [
17
19
  "dist"
18
20
  ],
19
21
  "scripts": {
20
- "build": "tsc --noEmit && vite build",
21
- "typecheck": "tsc --noEmit",
22
+ "build": "tsc --noEmit -p tsconfig.build.json && vite build",
22
23
  "test": "bun test",
23
- "test:watch": "bun test --watch",
24
- "publish:pkg": "NPM_CONFIG_TOKEN=$(pass show npm/token) bun publish --access public"
24
+ "publish": "npm publish --access public --provenance"
25
25
  },
26
26
  "keywords": [
27
27
  "ink",
@@ -33,14 +33,19 @@
33
33
  "license": "MIT",
34
34
  "peerDependencies": {
35
35
  "@inkweave/core": "^1.0.0",
36
- "@inkweave/react": "^1.0.0"
36
+ "@inkweave/react": "^1.0.0",
37
+ "react": ">=18.0.0",
38
+ "react-dom": ">=18.0.0",
39
+ "zustand": "^5.0.0"
37
40
  },
38
41
  "devDependencies": {
39
- "@types/react": "^19.0.0",
40
- "jsdom": "^26.1.0",
41
- "react": "^19.0.0",
42
- "typescript": "^5.0.0",
43
- "vite": "^6.0.0",
44
- "vite-plugin-dts": "^4.5.4"
42
+ "@testing-library/jest-dom": "catalog:",
43
+ "@testing-library/react": "catalog:",
44
+ "@types/react": "catalog:",
45
+ "bun-types": "catalog:",
46
+ "react": "catalog:",
47
+ "typescript": "catalog:",
48
+ "vite": "catalog:",
49
+ "vite-plugin-dts": "catalog:"
45
50
  }
46
- }
51
+ }