@curvenote/sidenotes
Position floating sidenotes/comments next to a document with inline references.
Goals
-
Place notes/comments to the side of one or more documents with inline references.
-
When an inline reference is clicked, animate the relevant sidenote to be as close as possible and move non-relevant sidenotes out of the way without overlapping.
-
Do not provide UI or impose any styling, only placement.
Use Cases
-
Comment streams next to a document. This is showing Curvenote, which is a scientific writing platform that connects to Jupyter.
Choices
-
Use React, Redux & Typescript
-
Used Redux rather than a hook approach (open to discussion if people are passionate!)
Constraints
-
Multiple documents on the page, currently based on the wrapping
<article>
ID -
Multiple inline references per sidenote, wrapped in
<InlineAnchor>
;InlineAnchor
is aspan
-
Have fallback placements to a
<AnchorBase>
;AnchorBase
is adiv
-
Provide actions to attach non-react bases, anchors or reposition sidenotes
-
All positioning is based on the article, and works with
relative
,fixed
orabsolute
positioning.
Demo
The demo is pretty basic, and not nearly as pretty as the gif above, just blue, green and red divs floating around. See index.tsx for full the code/setup.
yarn install yarn startGetting Started:
yarn add sidenotesReact Setup:
<article id={docId} onClick={deselect}> <AnchorBase anchor={baseId}> Content with <InlineAnchor sidenote={sidenoteId}>inline reference</InlineAnchor> </AnchorBase> <div className="sidenotes"> <Sidenote sidenote={sidenoteId} base={baseId}> Your custom UI, e.g. a comment </Sidenote> </div> </article>The sidenotes
class is the only CSS that is recommended. You can import it directly, or look at it and change it (~30 lines of scss
). To import from javascript (assuming your bundler works with CSS):
Redux State
Once you create your own store, add a sidenotes.reducer
, it must be called sidenotes
. Then pass the store
to setup
with options of padding between sidenotes.
Redux State
The sidenotes.ui
state has the following structure:
Roadmap
-
Have a better mobile solution that places notes at the bottom.
Made with love by Curvenote
Last updated February 19th, 2021