Getting Started
dragdoll-solid is distributed as ES modules via subpath exports. Each module has its own entry point so you can import only what you need. That being said, everything is also exported via the root dragdoll-solid module to provide a bit better developer experience.
Installation
bash
npm install dragdoll-solidWith peer dependencies:
bash
npm install dragdoll-solid dragdoll eventti tikki mezr solid-jsPeer Dependencies
TypeScript / JSX Configuration
If your project relies on a global tsconfig, make sure the Solid runtime is enabled:
jsonc
{
"compilerOptions": {
"jsx": "preserve",
"jsxImportSource": "solid-js",
},
}Alternatively, add /** @jsxImportSource solid-js */ at the top of individual files.
Basic Usage
Here's a simple example of making a draggable element:
tsx
/** @jsxImportSource solid-js */
import { render } from 'solid-js/web';
import {
usePointerSensor,
useKeyboardMotionSensor,
useDraggable,
useDraggableDrag,
} from 'dragdoll-solid';
function DraggableRedBox() {
let element: HTMLDivElement | null = null;
const [pointerSensor, setPointerSensorRef] = usePointerSensor();
const [keyboardSensor, setKeyboardSensorRef] = useKeyboardMotionSensor();
const draggable = useDraggable([pointerSensor, keyboardSensor], () => ({
elements: () => (element ? [element] : []),
}));
const drag = useDraggableDrag(draggable);
return (
<div
ref={(node) => {
element = node;
setPointerSensorRef(node);
setKeyboardSensorRef(node);
}}
class={`draggable ${drag() ? 'dragging' : ''}`}
style={{
position: 'relative',
width: '100px',
height: '100px',
'background-color': 'red',
}}
tabIndex={0}
>
Drag me
</div>
);
}
render(() => <DraggableRedBox />, document.getElementById('root')!);Solid-Specific Notes
- No memoization needed. Solid components run once, so settings objects and callbacks are plain values — no
useMemooruseCallbackrequired. - Ref pattern. Use
let element: HTMLDivElement | null = nulland set it in arefcallback:ref={(node) => { element = node; setPointerSensorRef(node); }}. - Accessor returns. Hooks return
Accessor<T | null>— access the value withsensor(),draggable(), etc. - SSR-safe. All hooks return safe fallback values on the server (
() => nullor[() => null, () => {}]).