- "content": "<script lang=\"ts\">\n\timport { writable } from \"svelte/store\";\n\timport { onDestroy } from \"svelte\";\n\timport { type CarouselAPI, type CarouselProps, setEmblaContext } from \"./context.js\";\n\timport { cn } from \"$lib/utils.js\";\n\n\ttype $$Props = CarouselProps;\n\n\texport let opts = {};\n\texport let plugins: NonNullable<$$Props[\"plugins\"]> = [];\n\texport let api: $$Props[\"api\"] = undefined;\n\texport let orientation: NonNullable<$$Props[\"orientation\"]> = \"horizontal\";\n\n\tlet className: $$Props[\"class\"] = undefined;\n\texport { className as class };\n\n\tconst apiStore = writable<CarouselAPI | undefined>(undefined);\n\tconst orientationStore = writable(orientation);\n\tconst canScrollPrev = writable(false);\n\tconst canScrollNext = writable(false);\n\tconst optionsStore = writable(opts);\n\tconst pluginStore = writable(plugins);\n\tconst scrollSnapsStore = writable<number[]>([]);\n\tconst selectedIndexStore = writable(0);\n\n\t$: orientationStore.set(orientation);\n\t$: pluginStore.set(plugins);\n\t$: optionsStore.set(opts);\n\n\tfunction scrollPrev() {\n\t\tapi?.scrollPrev();\n\t}\n\tfunction scrollNext() {\n\t\tapi?.scrollNext();\n\t}\n\tfunction scrollTo(index: number, jump?: boolean) {\n\t\tapi?.scrollTo(index, jump);\n\t}\n\n\tfunction onSelect(api: CarouselAPI) {\n\t\tif (!api) return;\n\t\tcanScrollPrev.set(api.canScrollPrev());\n\t\tcanScrollNext.set(api.canScrollNext());\n\t}\n\n\t$: if (api) {\n\t\tonSelect(api);\n\t\tapi.on(\"select\", onSelect);\n\t\tapi.on(\"reInit\", onSelect);\n\t}\n\n\tfunction handleKeyDown(e: KeyboardEvent) {\n\t\tif (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\tscrollPrev();\n\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\tscrollNext();\n\t\t}\n\t}\n\n\tsetEmblaContext({\n\t\tapi: apiStore,\n\t\tscrollPrev,\n\t\tscrollNext,\n\t\torientation: orientationStore,\n\t\tcanScrollNext,\n\t\tcanScrollPrev,\n\t\thandleKeyDown,\n\t\toptions: optionsStore,\n\t\tplugins: pluginStore,\n\t\tonInit,\n\t\tscrollSnaps: scrollSnapsStore,\n\t\tselectedIndex: selectedIndexStore,\n\t\tscrollTo,\n\t});\n\n\tfunction onInit(event: CustomEvent<CarouselAPI>) {\n\t\tapi = event.detail;\n\t\tapiStore.set(api);\n\t\tscrollSnapsStore.set(api.scrollSnapList());\n\t}\n\n\tonDestroy(() => {\n\t\tapi?.off(\"select\", onSelect);\n\t});\n</script>\n\n<div\n\tclass={cn(\"relative\", className)}\n\ton:mouseenter\n\ton:mouseleave\n\trole=\"region\"\n\taria-roledescription=\"carousel\"\n\t{...$$restProps}\n>\n\t<slot />\n</div>\n"
0 commit comments