Skip to content

Własny interfejs edytora ​

Typowa aplikacja 4B Pen oparta na Vue składa się z trzech warstw:

  1. @open-pencil/core tworzy edytor;
  2. @open-pencil/vue łączy go z composables i komponentami Vue bez narzuconego wyglądu;
  3. aplikacja określa układ, wygląd i zachowanie właściwe dla produktu.

Dlaczego warto rozdzielić te warstwy ​

Gotowa aplikacja 4B Pen jest tylko jednym z możliwych interfejsów.

Na podstawie SDK można utworzyć edytor osadzony w innym produkcie, wewnętrzne narzędzie do pracy z zasobami, edytor szablonów, interfejs do adnotacji albo wyspecjalizowany edytor z obsługą AI.

Zalecana struktura ​

Wygodny interfejs zwykle:

  • wywołuje provideEditor() wysoko w drzewie komponentów;
  • umieszcza obszar roboczy pośrodku;
  • pokazuje strony i warstwy na jednym panelu bocznym;
  • pokazuje właściwości na drugim panelu;
  • steruje menu i paskami narzędzi za pomocą composables.

Przykład ​

vue
<script setup lang="ts">
import { createEditor } from '@open-pencil/core/editor'
import {
  provideEditor,
  CanvasRoot,
  CanvasSurface,
  ToolbarRoot,
  PageListRoot,
  LayerTreeRoot,
} from '@open-pencil/vue'

const editor = createEditor({ width: 1440, height: 900 })
provideEditor(editor)
</script>

<template>
  <div class="grid h-screen grid-cols-[240px_1fr_320px] grid-rows-[48px_1fr]">
    <ToolbarRoot v-slot="{ tools, activeTool, setTool }">
      <header class="col-span-3 flex items-center gap-2 border-b px-3">
        <button
          v-for="tool in tools"
          :key="tool.id"
          :data-active="activeTool === tool.id"
          @click="setTool(tool.id)"
        >
          {{ tool.label }}
        </button>
      </header>
    </ToolbarRoot>

    <aside class="border-r">
      <PageListRoot v-slot="{ pages, currentPageId, switchPage }">
        <nav>
          <button
            v-for="page in pages"
            :key="page.id"
            :data-active="page.id === currentPageId"
            @click="switchPage(page.id)"
          >
            {{ page.name }}
          </button>
        </nav>
      </PageListRoot>
    </aside>

    <main>
      <CanvasRoot>
        <CanvasSurface class="size-full" />
      </CanvasRoot>
    </main>

    <aside class="border-l">
      Panel właściwości
    </aside>
  </div>
</template>

Odpowiedzialność SDK i aplikacji ​

  • SDK odpowiada za integrację z edytorem i logikę niezależną od wyglądu, przeznaczoną do ponownego użycia.
  • Aplikacja odpowiada za układ, wygląd i operacje właściwe dla konkretnego produktu.
  • Composables pozwalają podłączać menu i panele bez zbędnych komponentów opakowujących.

Zobacz też ​

Released under the MIT License.