Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Unable to run the project #351

Open
kkcoms opened this issue Mar 20, 2024 · 4 comments
Open

feat: Unable to run the project #351

kkcoms opened this issue Mar 20, 2024 · 4 comments

Comments

@kkcoms
Copy link

kkcoms commented Mar 20, 2024

Describe the feature you'd like to request

The documentation states:

npm i novel

and then:

import { Editor } from "novel";

export default function App() {
  return (
     <Editor />
  )
}

but doing that and following all the documentation leads you to not run the project at all as is likely is missing a bunch of imports and libraries needed for a headless solution.

Describe the solution you'd like to see

A more polish documentation and maybe a package or set of commands that allow to import all needed packages and dependecies.

Additional information

No response

@ahmeterenodaci
Copy link

I was struggling with this documentation too. I managed to solve it (with tailwindcss).

First, install this packages:
pnpm add novel
pnpm add @vercel/blob
pnpm add class-variance-authority
pnpm add lucide-react

If you don't have @tailwindcss/typography follow this link.

Then you need extensions to make novel work. Follow this link and create extensions.ts.

Finally, you can use novel as follows:
<EditorRoot><EditorContent extensions={defaultExtensions}></EditorContent></EditorRoot>

@arndvs
Copy link

arndvs commented Mar 26, 2024

I was struggling with this documentation too. I managed to solve it (with tailwindcss).

Hello ahmeterenodaci - can you share the code you used to solve it?

I followed your steps and installed @vercel/blob, class-variance-authority in addition to novel ( I already had tailwind and lucide-react installed). And created the extensions.ts and imported it into my editor.

Here's my editor:

'use client';

import { defaultExtensions } from '@/lib/extensions';
import { EditorContent, EditorRoot, JSONContent } from 'novel';
import { useState } from 'react';

const NovelEditor = () => {
  const [content, setContent] = useState<JSONContent | undefined>(undefined);
  const extensions = [...defaultExtensions];

  return (
    <EditorRoot>
      <EditorContent
        extensions={extensions}
        initialContent={content}
        onUpdate={({ editor }) => {
          const json = editor.getJSON();
          setContent(json);
        }}
      >
        {/* Add the required children prop */}
        <div>{/* Add any additional content or placeholder */}</div>
      </EditorContent>
    </EditorRoot>
  );
};

export default NovelEditor;

Can you share the editor you're using? Thanks!

@Prathamesh-Dukare
Copy link

I was struggling with this documentation too. I managed to solve it (with tailwindcss).

Hello ahmeterenodaci - can you share the code you used to solve it?

I followed your steps and installed @vercel/blob, class-variance-authority in addition to novel ( I already had tailwind and lucide-react installed). And created the extensions.ts and imported it into my editor.

Here's my editor:

'use client';

import { defaultExtensions } from '@/lib/extensions';
import { EditorContent, EditorRoot, JSONContent } from 'novel';
import { useState } from 'react';

const NovelEditor = () => {
  const [content, setContent] = useState<JSONContent | undefined>(undefined);
  const extensions = [...defaultExtensions];

  return (
    <EditorRoot>
      <EditorContent
        extensions={extensions}
        initialContent={content}
        onUpdate={({ editor }) => {
          const json = editor.getJSON();
          setContent(json);
        }}
      >
        {/* Add the required children prop */}
        <div>{/* Add any additional content or placeholder */}</div>
      </EditorContent>
    </EditorRoot>
  );
};

export default NovelEditor;

Can you share the editor you're using? Thanks!

Is this worked for you ?

@ahmeterenodaci
Copy link

ahmeterenodaci commented Apr 1, 2024

#351 (comment)
Sorry for late reply. I tried your code and its worked for me. If you don't have any error it means it's working but you might want to add some css like this:

    .ProseMirror {
      @apply p-12 px-8 sm:px-12;
    }
                
    .ProseMirror .is-editor-empty:first-child::before {
      content: attr(data-placeholder);
      float: left;
      color: hsl(var(--muted-foreground));
      pointer-events: none;
      height: 0;
    }
    .ProseMirror .is-empty::before {
      content: attr(data-placeholder);
      float: left;
      color: hsl(var(--muted-foreground));
      pointer-events: none;
      height: 0;
    }
    
    /* Custom image styles */
    
    .ProseMirror img {
      transition: filter 0.1s ease-in-out;
    
      &:hover {
        cursor: pointer;
        filter: brightness(90%);
      }
    
      &.ProseMirror-selectednode {
        outline: 3px solid #5abbf7;
        filter: brightness(90%);
      }
    }
    
    .img-placeholder {
      position: relative;
    
      &:before {
        content: "";
        box-sizing: border-box;
        position: absolute;
        top: 50%;
        left: 50%;
        width: 36px;
        height: 36px;
        border-radius: 50%;
        border: 3px solid var(--novel-stone-200);
        border-top-color: var(--novel-stone-800);
        animation: spinning 0.6s linear infinite;
      }
    }
    
    @keyframes spinning {
      to {
        transform: rotate(360deg);
      }
    }
    
    /* Custom TODO list checkboxes – shoutout to this awesome tutorial: https://moderncss.dev/pure-css-custom-checkbox-style/ */
    
    ul[data-type="taskList"] li > label {
      margin-right: 0.2rem;
      user-select: none;
    }
    
    @media screen and (max-width: 768px) {
      ul[data-type="taskList"] li > label {
        margin-right: 0.5rem;
      }
    }
    
    ul[data-type="taskList"] li > label input[type="checkbox"] {
      -webkit-appearance: none;
      appearance: none;
      background-color: hsl(var(--background));
      margin: 0;
      cursor: pointer;
      width: 1.2em;
      height: 1.2em;
      position: relative;
      top: 5px;
      border: 2px solid hsl(var(--border));
      margin-right: 0.3rem;
      display: grid;
      place-content: center;
    
      &:hover {
        background-color: hsl(var(--accent));
      }
    
      &:active {
        background-color: hsl(var(--accent));
      }
    
      &::before {
        content: "";
        width: 0.65em;
        height: 0.65em;
        transform: scale(0);
        transition: 120ms transform ease-in-out;
        box-shadow: inset 1em 1em;
        transform-origin: center;
        clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);
      }
    
      &:checked::before {
        transform: scale(1);
      }
    }
    
    ul[data-type="taskList"] li[data-checked="true"] > div > p {
      color: var(--muted-foreground);
      text-decoration: line-through;
      text-decoration-thickness: 2px;
    }
    
    /* Overwrite tippy-box original max-width */
    
    .tippy-box {
      max-width: 400px !important;
    }
    
    .ProseMirror:not(.dragging) .ProseMirror-selectednode {
      outline: none !important;
      background-color: var(--novel-highlight-blue);
      transition: background-color 0.2s;
      box-shadow: none;
    }
    
    .drag-handle {
      position: fixed;
      opacity: 1;
      transition: opacity ease-in 0.2s;
      border-radius: 0.25rem;
    
      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(0, 0, 0, 0.5)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7.55228475,8 8,8.44771525 8,9 C8,9.55228475 7.55228475,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E");
      background-size: calc(0.5em + 0.375rem) calc(0.5em + 0.375rem);
      background-repeat: no-repeat;
      background-position: center;
      width: 1.2rem;
      height: 1.5rem;
      z-index: 50;
      cursor: grab;
    
      &:hover {
        background-color: var(--novel-stone-100);
        transition: background-color 0.2s;
      }
    
      &:active {
        background-color: var(--novel-stone-200);
        transition: background-color 0.2s;
        cursor: grabbing;
      }
    
      &.hide {
        opacity: 0;
        pointer-events: none;
      }
    
      @media screen and (max-width: 600px) {
        display: none;
        pointer-events: none;
      }
    }
    
    .dark .drag-handle {
      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(255, 255, 255, 0.5)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7.55228475,8 8,8.44771525 8,9 C8,9.55228475 7.55228475,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E");
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants