@editora/ui-core

Framework-agnostic UI primitives and Web Components for production-grade applications.

Overview

@editora/ui-core is the framework-agnostic UI layer in the Editora ecosystem. It ships custom elements, dialog managers, token-based theming helpers, and overlay/focus utilities for complex UI flows.

Import rule: load @editora/ui-core once at app bootstrap to register all custom elements.

Installation

npm install @editora/ui-core

Bootstrap

import '@editora/ui-core';

Quick Start (Vanilla / Any Framework)

<ui-field label="Email" hint="Work email">
  <ui-input name="email" type="email" placeholder="you@company.com" required></ui-input>
</ui-field>

<ui-button variant="primary">Save</ui-button>

Core Utilities

  • createSignal, computed, effect
  • ElementBase
  • applyTheme, defaultTokens
  • Portal/overlay/focus helpers: showPortalFor, autoUpdatePosition, focus managers
  • showToast

Dialog Managers (Promise API)

  • createDialogManager / DialogManager
  • createAlertDialogManager / AlertDialogManager
import '@editora/ui-core';
import { createDialogManager } from '@editora/ui-core';

const dialogs = createDialogManager();

const result = await dialogs.confirm({
  title: 'Delete record',
  description: 'This action cannot be undone.',
  submitText: 'Delete',
  cancelText: 'Cancel',
  mode: 'queue'
});

if (result.action === 'submit') {
  // delete
}

Component Catalog

Primitives and forms

ui-button, ui-input, ui-textarea, ui-field, ui-form, ui-checkbox, ui-select, ui-combobox, ui-date-picker, ui-color-picker and related controls.

Layout and navigation

ui-layout, ui-sidebar, ui-app-header, ui-breadcrumb, ui-navigation-menu, ui-menubar, ui-tabs, ui-grid, ui-container.

Data and display

ui-data-table, ui-pagination, ui-table, ui-chart, ui-calendar, ui-gantt, ui-progress, ui-skeleton, ui-empty-state.

Overlays and interaction

ui-dialog, ui-alert-dialog, ui-popover, ui-dropdown, ui-context-menu, ui-tooltip, ui-drawer, ui-floating-toolbar, ui-command-palette.

Events and Integration Pattern

<ui-date-picker id="start" name="startDate" clearable></ui-date-picker>
<script type="module">
  import '@editora/ui-core';

  const picker = document.getElementById('start');
  picker.addEventListener('change', (e) => {
    console.log('new date', e.detail.value);
  });
</script>

Most events are dispatched as CustomEvent with typed detail, and usually bubble across shadow boundaries.

Gantt Planning Timeline

ui-gantt is the framework-agnostic planning timeline behind the React Gantt wrapper. It supports task, summary, and milestone rows; dependency routing; drag/resize editing; keyboard selection; baselines; critical tasks; split segments; and row virtualization for large schedules.

<ui-gantt id="releasePlan" zoom="week" sort="start" bar-variant="soft"></ui-gantt>

<script type="module">
  import '@editora/ui-core';

  const gantt = document.getElementById('releasePlan');

  gantt.setAttribute('tasks', JSON.stringify([
    {
      id: 'api',
      label: 'API contracts',
      start: '2026-02-10',
      end: '2026-02-24',
      progress: 62,
      baselineStart: '2026-02-07',
      baselineEnd: '2026-02-21',
      critical: true
    },
    {
      id: 'qa',
      label: 'QA sign-off',
      start: '2026-02-27',
      type: 'milestone',
      tone: 'success'
    }
  ]));

  gantt.setAttribute('links', JSON.stringify([
    { id: 'api-qa', source: 'api', target: 'qa', type: 'e2s' }
  ]));

  gantt.addEventListener('taskchange', (event) => console.log('task changed', event.detail));
  gantt.addEventListener('taskdelete', (event) => console.log('delete task', event.detail.id));
  gantt.addEventListener('linkselect', (event) => console.log('dependency selected', event.detail));
</script>
  • Dependency types: e2s, s2s, e2e, and s2e, with routed SVG connectors and arrowheads.
  • Bar variants: solid, soft, striped, outline, and glass.
  • Toolbar controls: zoom, filter, and sort; use readonly for non-editable reports.

Theming

import { applyTheme, defaultTokens } from '@editora/ui-core';

applyTheme({
  ...defaultTokens,
  colors: {
    ...defaultTokens.colors,
    primary: '#0f766e',
    text: '#0f172a',
    background: '#ffffff'
  },
  radius: '10px'
});

Performance and Production Notes

  • Package is sideEffects: true because custom element registration happens at module import time.
  • Use virtualized table mode for large datasets (ui-data-table[virtualize]).
  • Avoid heavy synchronous work inside frequently fired event handlers.
  • Initialize theme tokens early to avoid flash-of-unstyled-components.

Related Docs