Three architectural pieces for inserting blocks into a column slot from
an overlay button, plus the missing DOM-selection sync that any
imperative consumer of `applyCommand` needs.
- Engine op `insertBlockInColumn` returns `{document, selection,
activeMarks}` in one transaction (Tiptap-style). Atomic blocks land
with a trailing paragraph escape hatch + caret there; text-bearing
blocks select any stub text ("Title", "List item") so the next
keystroke replaces it Notion-style.
- Provider `applyCommandWithOptions` now schedules `restoreDomSelection`
via tick when the command changes the model selection (typing-batch
excluded — the browser already placed the caret). Was the hidden gap:
overlay buttons, drag-drop, slash menu, the new column inserter, all
updated the model but the DOM caret stayed wherever the user last
clicked, breaking subsequent text editing.
- `words-column-inserter.svelte` rebuilt around a busy guard with a
hard 250ms safety timeout (the previous pendingInsert + onCloseAuto
Focus pattern could leave the `+` button dead forever if the
dropdown's teardown swallowed the close callback).
Plus type sync: `WordsProviderSnippetProps` now declares
`selectedBlockPath`, the second arg of `selectAtomicBlock`, and
`setSelection` — they were exposed by the runtime but missing from
the type, breaking typecheck on eidos consumers.
Demo carries a `columns` block in the initial doc as a permanent test
fixture for column-related fixes.
**Known issue documented in CONTINUE.md P0:** typing inside a `columns`
block does NOT insert — selection sync (`syncSelectionFromDom`) isn't
mapping nested paths (`12.0.0.0`) to the model correctly. The inserter
flow is wired correctly; once the path encoding for nested selections
lands, the full Notion-style "click + → pick Heading → type" flow
works end to end.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
active-uix
parent
da8d03085b
commit
bcad6647a7
@ -0,0 +1,421 @@
|
|||||||
|
/**
|
||||||
|
* Translation refs consumed by the block inspector (and its
|
||||||
|
* `WordsNumRow` / `WordsColorRow` / `WordsSpacingRow` building blocks).
|
||||||
|
*
|
||||||
|
* Each entry is an `idlangref` of the form `#?components.words.{key}|fallback`
|
||||||
|
* — the eidos runtime (`eidos.langs.ts(KEY)`) returns the localized
|
||||||
|
* string when a translation is registered, or the post-`|` fallback when
|
||||||
|
* not. Apps that bundle the canonical en/es packs see translations
|
||||||
|
* automatically; consumers without packs see the English fallback.
|
||||||
|
*
|
||||||
|
* Three layers of labels:
|
||||||
|
*
|
||||||
|
* - **Block titles** — what kind of block the inspector is editing
|
||||||
|
* (`Heading 1`, `Text`, `Quote`, …). The heading title uses a
|
||||||
|
* placeholder for the level number rendered by the consumer.
|
||||||
|
* - **Section titles** — the accordion section headers
|
||||||
|
* (`Typography`, `Color`, `Layout`, `Spacing`, `Border`).
|
||||||
|
* - **Field labels + options** — every form control's visible label and
|
||||||
|
* every enumerated option that the inspector renders (font family,
|
||||||
|
* font weight, alignment, border style, etc.). Includes the aria
|
||||||
|
* labels used by the per-side spacing inputs and the link toggle.
|
||||||
|
*
|
||||||
|
* Adding a new label: insert the entry here AND in the consumer
|
||||||
|
* component, then call `eidos.langs.ts(WORDS_INSPECTOR_LANGS.YOUR_KEY)`
|
||||||
|
* to read it. The fallback after `|` is the canonical English string
|
||||||
|
* (the source of truth — translation packs derive from it).
|
||||||
|
*/
|
||||||
|
export const WORDS_INSPECTOR_LANGS = {
|
||||||
|
// Block titles -------------------------------------------------------
|
||||||
|
BLOCK_HEADING: '#?components.words.inspector.block.heading|Heading',
|
||||||
|
BLOCK_PARAGRAPH: '#?components.words.inspector.block.paragraph|Text',
|
||||||
|
BLOCK_QUOTE: '#?components.words.inspector.block.quote|Quote',
|
||||||
|
BLOCK_CODE: '#?components.words.inspector.block.code|Code',
|
||||||
|
BLOCK_LIST_ORDERED: '#?components.words.inspector.block.list-ordered|Numbered list',
|
||||||
|
BLOCK_LIST_CHECK: '#?components.words.inspector.block.list-check|Check list',
|
||||||
|
BLOCK_LIST_BULLET: '#?components.words.inspector.block.list-bullet|Bulleted list',
|
||||||
|
BLOCK_TABLE: '#?components.words.inspector.block.table|Table',
|
||||||
|
BLOCK_IMAGE: '#?components.words.inspector.block.image|Image',
|
||||||
|
BLOCK_DIVIDER: '#?components.words.inspector.block.divider|Divider',
|
||||||
|
BLOCK_CALLOUT: '#?components.words.inspector.block.callout|Callout',
|
||||||
|
BLOCK_GENERIC: '#?components.words.inspector.block.generic|Block',
|
||||||
|
BLOCK_COLUMNS: '#?components.words.inspector.block.columns|Columns',
|
||||||
|
LABEL_COLUMN_WIDTH: '#?components.words.inspector.label.column-width|Width',
|
||||||
|
LABEL_COLUMN_N: '#?components.words.inspector.label.column-n|Column {n}',
|
||||||
|
ARIA_ADD_COLUMN_END:
|
||||||
|
'#?components.words.inspector.aria.add-column-end|Add column at end',
|
||||||
|
ARIA_REMOVE_COLUMN_N:
|
||||||
|
'#?components.words.inspector.aria.remove-column-n|Remove column {n}',
|
||||||
|
PLACEHOLDER_COLUMN_WIDTH:
|
||||||
|
'#?components.words.inspector.placeholder.column-width|1fr, 200px, 30%',
|
||||||
|
|
||||||
|
// Section titles -----------------------------------------------------
|
||||||
|
SECTION_BLOCK: '#?components.words.inspector.section.block|Block',
|
||||||
|
SECTION_TYPOGRAPHY: '#?components.words.inspector.section.typography|Typography',
|
||||||
|
SECTION_COLOR: '#?components.words.inspector.section.color|Color',
|
||||||
|
SECTION_LAYOUT: '#?components.words.inspector.section.layout|Layout',
|
||||||
|
SECTION_SPACING: '#?components.words.inspector.section.spacing|Spacing',
|
||||||
|
SECTION_BORDER: '#?components.words.inspector.section.border|Border',
|
||||||
|
|
||||||
|
// Block-specific labels (heading / list / code / image) -------------
|
||||||
|
LABEL_HEADING_LEVEL: '#?components.words.inspector.label.heading-level|Level',
|
||||||
|
LABEL_LIST_KIND: '#?components.words.inspector.label.list-kind|Kind',
|
||||||
|
LABEL_CODE_LANGUAGE: '#?components.words.inspector.label.code-language|Language',
|
||||||
|
LABEL_SRC: '#?components.words.inspector.label.src|URL',
|
||||||
|
LABEL_ALT: '#?components.words.inspector.label.alt|Alt text',
|
||||||
|
LABEL_CAPTION: '#?components.words.inspector.label.caption|Caption',
|
||||||
|
LABEL_WIDTH: '#?components.words.inspector.label.width|Width',
|
||||||
|
LABEL_HEIGHT: '#?components.words.inspector.label.height|Height',
|
||||||
|
LABEL_IMAGE_ALIGN: '#?components.words.inspector.label.image-align|Align',
|
||||||
|
LABEL_IMAGE_FULL_WIDTH:
|
||||||
|
'#?components.words.inspector.label.image-full-width|Full width',
|
||||||
|
IMAGE_FULL_WIDTH_ON: '#?components.words.inspector.image-full-width.on|On',
|
||||||
|
IMAGE_FULL_WIDTH_OFF: '#?components.words.inspector.image-full-width.off|Off',
|
||||||
|
LABEL_INTENT: '#?components.words.inspector.label.intent|Intent',
|
||||||
|
LABEL_TITLE: '#?components.words.inspector.label.title|Title',
|
||||||
|
LABEL_ROWS: '#?components.words.inspector.label.rows|Rows',
|
||||||
|
LABEL_COLUMNS: '#?components.words.inspector.label.columns|Columns',
|
||||||
|
LABEL_HEADER_ROW: '#?components.words.inspector.label.header-row|Header row',
|
||||||
|
LABEL_HEADER_COLUMN: '#?components.words.inspector.label.header-column|Header column',
|
||||||
|
LABEL_CELL_ALIGN: '#?components.words.inspector.label.cell-align|Cell align',
|
||||||
|
LABEL_CELL_VALIGN: '#?components.words.inspector.label.cell-valign|Vertical align',
|
||||||
|
SECTION_CELL: '#?components.words.inspector.section.cell|Cell',
|
||||||
|
SECTION_ROW: '#?components.words.inspector.section.row|Row',
|
||||||
|
SECTION_TABLE: '#?components.words.inspector.section.table|Table',
|
||||||
|
VALIGN_TOP: '#?components.words.inspector.valign.top|Top',
|
||||||
|
VALIGN_MIDDLE: '#?components.words.inspector.valign.middle|Middle',
|
||||||
|
VALIGN_BOTTOM: '#?components.words.inspector.valign.bottom|Bottom',
|
||||||
|
ARIA_CELL_ALIGN:
|
||||||
|
'#?components.words.inspector.aria.cell-align|Cell horizontal align',
|
||||||
|
ARIA_CELL_VALIGN:
|
||||||
|
'#?components.words.inspector.aria.cell-valign|Cell vertical align',
|
||||||
|
|
||||||
|
// Callout intent options — labels carry the perceptual reading the
|
||||||
|
// sema doctrine assigns to each value (cap. 12). Used as chip text
|
||||||
|
// in the intent ToggleGroup; the chip background is the doctrinal
|
||||||
|
// color of the intent (rendered via the `data-intent` data-attr).
|
||||||
|
INTENT_NEUTRAL: '#?components.words.inspector.intent.neutral|Info',
|
||||||
|
INTENT_AFFIRM: '#?components.words.inspector.intent.affirm|Tip',
|
||||||
|
INTENT_FULFILL: '#?components.words.inspector.intent.fulfill|Success',
|
||||||
|
INTENT_RISK: '#?components.words.inspector.intent.risk|Warning',
|
||||||
|
INTENT_THREAT: '#?components.words.inspector.intent.threat|Error',
|
||||||
|
INTENT_LOSS: '#?components.words.inspector.intent.loss|Critical',
|
||||||
|
|
||||||
|
// List kind options --------------------------------------------------
|
||||||
|
LIST_BULLETED: '#?components.words.inspector.list.bulleted|Bulleted',
|
||||||
|
LIST_NUMBERED: '#?components.words.inspector.list.numbered|Numbered',
|
||||||
|
LIST_CHECK: '#?components.words.inspector.list.check|Check',
|
||||||
|
|
||||||
|
// Block-specific ARIA + placeholders --------------------------------
|
||||||
|
ARIA_HEADING_LEVEL: '#?components.words.inspector.aria.heading-level|Heading level',
|
||||||
|
ARIA_LIST_KIND: '#?components.words.inspector.aria.list-kind|List kind',
|
||||||
|
ARIA_CODE_LANGUAGE: '#?components.words.inspector.aria.code-language|Code language',
|
||||||
|
ARIA_SRC: '#?components.words.inspector.aria.src|Image URL',
|
||||||
|
ARIA_ALT: '#?components.words.inspector.aria.alt|Image alternative text',
|
||||||
|
ARIA_CAPTION: '#?components.words.inspector.aria.caption|Image caption',
|
||||||
|
ARIA_IMAGE_ALIGN: '#?components.words.inspector.aria.image-align|Image alignment',
|
||||||
|
ARIA_IMAGE_FULL_WIDTH:
|
||||||
|
'#?components.words.inspector.aria.image-full-width|Image fills container width',
|
||||||
|
ARIA_UPLOAD_IMAGE:
|
||||||
|
'#?components.words.inspector.aria.upload-image|Upload image (encodes inline as data URL)',
|
||||||
|
ARIA_INTENT: '#?components.words.inspector.aria.intent|Callout intent',
|
||||||
|
ARIA_TITLE: '#?components.words.inspector.aria.title|Callout title',
|
||||||
|
ARIA_ADD_ROW_ABOVE:
|
||||||
|
'#?components.words.inspector.aria.add-row-above|Insert row above',
|
||||||
|
ARIA_ADD_ROW_BELOW:
|
||||||
|
'#?components.words.inspector.aria.add-row-below|Insert row below',
|
||||||
|
ARIA_REMOVE_ROW: '#?components.words.inspector.aria.remove-row|Delete row',
|
||||||
|
ARIA_ADD_COLUMN_LEFT:
|
||||||
|
'#?components.words.inspector.aria.add-column-left|Insert column left',
|
||||||
|
ARIA_ADD_COLUMN_RIGHT:
|
||||||
|
'#?components.words.inspector.aria.add-column-right|Insert column right',
|
||||||
|
ARIA_REMOVE_COLUMN:
|
||||||
|
'#?components.words.inspector.aria.remove-column|Delete column',
|
||||||
|
ARIA_HEADER_ROW: '#?components.words.inspector.aria.header-row|Toggle header row',
|
||||||
|
ARIA_HEADER_COLUMN:
|
||||||
|
'#?components.words.inspector.aria.header-column|Toggle header column',
|
||||||
|
PLACEHOLDER_CODE_LANGUAGE:
|
||||||
|
'#?components.words.inspector.placeholder.code-language|e.g. javascript',
|
||||||
|
PLACEHOLDER_SRC: '#?components.words.inspector.placeholder.src|https://...',
|
||||||
|
PLACEHOLDER_ALT: '#?components.words.inspector.placeholder.alt|Describe the image',
|
||||||
|
PLACEHOLDER_CAPTION:
|
||||||
|
'#?components.words.inspector.placeholder.caption|Optional caption',
|
||||||
|
PLACEHOLDER_CALLOUT_TITLE:
|
||||||
|
'#?components.words.inspector.placeholder.callout-title|Optional title',
|
||||||
|
|
||||||
|
// Field labels -------------------------------------------------------
|
||||||
|
LABEL_FONT: '#?components.words.inspector.label.font|Font',
|
||||||
|
LABEL_FONT_SIZE: '#?components.words.inspector.label.font-size|Font size',
|
||||||
|
LABEL_WEIGHT: '#?components.words.inspector.label.weight|Weight',
|
||||||
|
LABEL_LINE_HEIGHT: '#?components.words.inspector.label.line-height|Line height',
|
||||||
|
LABEL_TEXT: '#?components.words.inspector.label.text|Text',
|
||||||
|
LABEL_BACKGROUND: '#?components.words.inspector.label.background|Background',
|
||||||
|
LABEL_ALIGN: '#?components.words.inspector.label.align|Align',
|
||||||
|
LABEL_MARGIN: '#?components.words.inspector.label.margin|Margin',
|
||||||
|
LABEL_PADDING: '#?components.words.inspector.label.padding|Padding',
|
||||||
|
LABEL_STYLE: '#?components.words.inspector.label.style|Style',
|
||||||
|
LABEL_BORDER_WIDTH: '#?components.words.inspector.label.border-width|Border width',
|
||||||
|
LABEL_COLOR: '#?components.words.inspector.label.color|Color',
|
||||||
|
LABEL_CORNER_RADIUS: '#?components.words.inspector.label.corner-radius|Corner radius',
|
||||||
|
LABEL_PRESET: '#?components.words.inspector.label.preset|Preset',
|
||||||
|
|
||||||
|
// Font family options ------------------------------------------------
|
||||||
|
FONT_DEFAULT: '#?components.words.inspector.font.default|Default',
|
||||||
|
FONT_SANS: '#?components.words.inspector.font.sans|Sans',
|
||||||
|
FONT_SERIF: '#?components.words.inspector.font.serif|Serif',
|
||||||
|
FONT_MONO: '#?components.words.inspector.font.mono|Mono',
|
||||||
|
|
||||||
|
// Font weight options ------------------------------------------------
|
||||||
|
WEIGHT_REGULAR: '#?components.words.inspector.weight.regular|Regular',
|
||||||
|
WEIGHT_MEDIUM: '#?components.words.inspector.weight.medium|Medium',
|
||||||
|
WEIGHT_SEMIBOLD: '#?components.words.inspector.weight.semibold|Semibold',
|
||||||
|
WEIGHT_BOLD: '#?components.words.inspector.weight.bold|Bold',
|
||||||
|
|
||||||
|
// Align options ------------------------------------------------------
|
||||||
|
ALIGN_LEFT: '#?components.words.inspector.align.left|Left',
|
||||||
|
ALIGN_CENTER: '#?components.words.inspector.align.center|Center',
|
||||||
|
ALIGN_RIGHT: '#?components.words.inspector.align.right|Right',
|
||||||
|
ALIGN_JUSTIFY: '#?components.words.inspector.align.justify|Justify',
|
||||||
|
|
||||||
|
// Border style options -----------------------------------------------
|
||||||
|
BORDER_SOLID: '#?components.words.inspector.border.solid|Solid',
|
||||||
|
BORDER_DASHED: '#?components.words.inspector.border.dashed|Dashed',
|
||||||
|
BORDER_DOTTED: '#?components.words.inspector.border.dotted|Dotted',
|
||||||
|
|
||||||
|
// Corner radius preset options ---------------------------------------
|
||||||
|
PRESET_NONE: '#?components.words.inspector.preset.none|None',
|
||||||
|
PRESET_FULL: '#?components.words.inspector.preset.full|Full',
|
||||||
|
|
||||||
|
// ARIA labels (aria-label / title) -----------------------------------
|
||||||
|
ARIA_FONT_FAMILY: '#?components.words.inspector.aria.font-family|Font family',
|
||||||
|
ARIA_FONT_WEIGHT: '#?components.words.inspector.aria.font-weight|Font weight',
|
||||||
|
ARIA_ALIGN: '#?components.words.inspector.aria.align|Align',
|
||||||
|
ARIA_BORDER_STYLE: '#?components.words.inspector.aria.border-style|Border style',
|
||||||
|
ARIA_RADIUS_PRESET: '#?components.words.inspector.aria.radius-preset|Corner radius preset',
|
||||||
|
|
||||||
|
// Spacing per-side aria labels ---------------------------------------
|
||||||
|
SPACING_TOP: '#?components.words.inspector.spacing.top|Top',
|
||||||
|
SPACING_RIGHT: '#?components.words.inspector.spacing.right|Right',
|
||||||
|
SPACING_BOTTOM: '#?components.words.inspector.spacing.bottom|Bottom',
|
||||||
|
SPACING_LEFT: '#?components.words.inspector.spacing.left|Left',
|
||||||
|
SPACING_LINK: '#?components.words.inspector.spacing.link|Chain pairs',
|
||||||
|
SPACING_UNLINK: '#?components.words.inspector.spacing.unlink|Unchain sides',
|
||||||
|
SPACING_LINK_TITLE:
|
||||||
|
'#?components.words.inspector.spacing.link-title|Chain pairs — top with bottom, left with right',
|
||||||
|
SPACING_UNLINK_TITLE:
|
||||||
|
'#?components.words.inspector.spacing.unlink-title|Unchain — edit each side independently',
|
||||||
|
|
||||||
|
// Empty state --------------------------------------------------------
|
||||||
|
EMPTY: '#?components.words.inspector.empty|Select a block to edit its style.'
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
// ── Translation bundle ───────────────────────────────────────────────────────
|
||||||
|
//
|
||||||
|
// The eidos langs engine resolves a ref's fallback (the text after `|`)
|
||||||
|
// ONLY when no entry is registered at the ref's path. Declaring refs is
|
||||||
|
// not enough — apps must call `langs.extend(namespace, bundle)` so the
|
||||||
|
// resolver finds localized values when the active locale changes.
|
||||||
|
//
|
||||||
|
// Words registers this bundle automatically from `Words.svelte`'s
|
||||||
|
// `onMount` (one-shot, idempotent). Apps that want to override or add
|
||||||
|
// locales can call `eidos.langs.extend('components.words.inspector', …)`
|
||||||
|
// after the component mounts — later registrations deep-merge over this
|
||||||
|
// one (the engine warns on leaf overwrites in DEV).
|
||||||
|
//
|
||||||
|
// Each leaf is a `LangRecord` — `{ [locale]: string }`. The engine
|
||||||
|
// picks the entry that matches the active locale, falling back through
|
||||||
|
// the configured chain when an entry is missing.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Localized strings for the inspector. Shape mirrors the ref path —
|
||||||
|
* every entry sits under `components.words.inspector.{section}.{key}`.
|
||||||
|
*
|
||||||
|
* Adding a locale: add the locale key to each leaf (e.g. `pt: '...'`).
|
||||||
|
* Adding a new entry: declare it in `WORDS_INSPECTOR_LANGS` above AND
|
||||||
|
* here; keep both ends in sync. Lint / runtime falls back to the ref's
|
||||||
|
* inline string when the locale lookup misses.
|
||||||
|
*/
|
||||||
|
export const WORDS_INSPECTOR_BUNDLE = {
|
||||||
|
block: {
|
||||||
|
heading: { en: 'Heading', es: 'Encabezado' },
|
||||||
|
paragraph: { en: 'Text', es: 'Texto' },
|
||||||
|
quote: { en: 'Quote', es: 'Cita' },
|
||||||
|
code: { en: 'Code', es: 'Código' },
|
||||||
|
'list-ordered': { en: 'Numbered list', es: 'Lista numerada' },
|
||||||
|
'list-check': { en: 'Check list', es: 'Lista de verificación' },
|
||||||
|
'list-bullet': { en: 'Bulleted list', es: 'Lista con viñetas' },
|
||||||
|
table: { en: 'Table', es: 'Tabla' },
|
||||||
|
image: { en: 'Image', es: 'Imagen' },
|
||||||
|
divider: { en: 'Divider', es: 'Separador' },
|
||||||
|
callout: { en: 'Callout', es: 'Aviso' },
|
||||||
|
generic: { en: 'Block', es: 'Bloque' },
|
||||||
|
columns: { en: 'Columns', es: 'Columnas' }
|
||||||
|
},
|
||||||
|
section: {
|
||||||
|
block: { en: 'Block', es: 'Bloque' },
|
||||||
|
typography: { en: 'Typography', es: 'Tipografía' },
|
||||||
|
color: { en: 'Color', es: 'Color' },
|
||||||
|
layout: { en: 'Layout', es: 'Disposición' },
|
||||||
|
spacing: { en: 'Spacing', es: 'Espaciado' },
|
||||||
|
border: { en: 'Border', es: 'Borde' },
|
||||||
|
cell: { en: 'Cell', es: 'Celda' },
|
||||||
|
row: { en: 'Row', es: 'Fila' },
|
||||||
|
table: { en: 'Table', es: 'Tabla' }
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
'heading-level': { en: 'Level', es: 'Nivel' },
|
||||||
|
'list-kind': { en: 'Kind', es: 'Tipo' },
|
||||||
|
'code-language': { en: 'Language', es: 'Lenguaje' },
|
||||||
|
src: { en: 'URL', es: 'URL' },
|
||||||
|
alt: { en: 'Alt text', es: 'Texto alternativo' },
|
||||||
|
caption: { en: 'Caption', es: 'Pie' },
|
||||||
|
width: { en: 'Width', es: 'Ancho' },
|
||||||
|
height: { en: 'Height', es: 'Alto' },
|
||||||
|
'image-align': { en: 'Align', es: 'Alinear' },
|
||||||
|
'image-full-width': { en: 'Full width', es: 'Ancho total' },
|
||||||
|
intent: { en: 'Intent', es: 'Intención' },
|
||||||
|
title: { en: 'Title', es: 'Título' },
|
||||||
|
rows: { en: 'Rows', es: 'Filas' },
|
||||||
|
columns: { en: 'Columns', es: 'Columnas' },
|
||||||
|
'header-row': { en: 'Header row', es: 'Fila de cabecera' },
|
||||||
|
'header-column': { en: 'Header column', es: 'Columna de cabecera' },
|
||||||
|
'cell-align': { en: 'Cell align', es: 'Alineación celda' },
|
||||||
|
'cell-valign': { en: 'Vertical align', es: 'Alineación vertical' },
|
||||||
|
'column-width': { en: 'Width', es: 'Ancho' },
|
||||||
|
'column-n': { en: 'Column {n}', es: 'Columna {n}' },
|
||||||
|
font: { en: 'Font', es: 'Fuente' },
|
||||||
|
'font-size': { en: 'Font size', es: 'Tamaño' },
|
||||||
|
weight: { en: 'Weight', es: 'Grosor' },
|
||||||
|
'line-height': { en: 'Line height', es: 'Interlineado' },
|
||||||
|
text: { en: 'Text', es: 'Texto' },
|
||||||
|
background: { en: 'Background', es: 'Fondo' },
|
||||||
|
align: { en: 'Align', es: 'Alinear' },
|
||||||
|
margin: { en: 'Margin', es: 'Margen' },
|
||||||
|
padding: { en: 'Padding', es: 'Relleno' },
|
||||||
|
style: { en: 'Style', es: 'Estilo' },
|
||||||
|
'border-width': { en: 'Border width', es: 'Grosor del borde' },
|
||||||
|
color: { en: 'Color', es: 'Color' },
|
||||||
|
'corner-radius': { en: 'Corner radius', es: 'Radio de esquina' },
|
||||||
|
preset: { en: 'Preset', es: 'Preajuste' }
|
||||||
|
},
|
||||||
|
intent: {
|
||||||
|
neutral: { en: 'Info', es: 'Info' },
|
||||||
|
affirm: { en: 'Tip', es: 'Consejo' },
|
||||||
|
fulfill: { en: 'Success', es: 'Éxito' },
|
||||||
|
risk: { en: 'Warning', es: 'Aviso' },
|
||||||
|
threat: { en: 'Error', es: 'Error' },
|
||||||
|
loss: { en: 'Critical', es: 'Crítico' }
|
||||||
|
},
|
||||||
|
list: {
|
||||||
|
bulleted: { en: 'Bulleted', es: 'Viñetas' },
|
||||||
|
numbered: { en: 'Numbered', es: 'Numerada' },
|
||||||
|
check: { en: 'Check', es: 'Verificación' }
|
||||||
|
},
|
||||||
|
'image-full-width': {
|
||||||
|
on: { en: 'On', es: 'Sí' },
|
||||||
|
off: { en: 'Off', es: 'No' }
|
||||||
|
},
|
||||||
|
font: {
|
||||||
|
default: { en: 'Default', es: 'Predeterminada' },
|
||||||
|
sans: { en: 'Sans', es: 'Sans' },
|
||||||
|
serif: { en: 'Serif', es: 'Serif' },
|
||||||
|
mono: { en: 'Mono', es: 'Mono' }
|
||||||
|
},
|
||||||
|
weight: {
|
||||||
|
regular: { en: 'Regular', es: 'Normal' },
|
||||||
|
medium: { en: 'Medium', es: 'Media' },
|
||||||
|
semibold: { en: 'Semibold', es: 'Semi-negrita' },
|
||||||
|
bold: { en: 'Bold', es: 'Negrita' }
|
||||||
|
},
|
||||||
|
align: {
|
||||||
|
left: { en: 'Left', es: 'Izquierda' },
|
||||||
|
center: { en: 'Center', es: 'Centro' },
|
||||||
|
right: { en: 'Right', es: 'Derecha' },
|
||||||
|
justify: { en: 'Justify', es: 'Justificar' }
|
||||||
|
},
|
||||||
|
valign: {
|
||||||
|
top: { en: 'Top', es: 'Arriba' },
|
||||||
|
middle: { en: 'Middle', es: 'Medio' },
|
||||||
|
bottom: { en: 'Bottom', es: 'Abajo' }
|
||||||
|
},
|
||||||
|
border: {
|
||||||
|
solid: { en: 'Solid', es: 'Sólido' },
|
||||||
|
dashed: { en: 'Dashed', es: 'Discontinuo' },
|
||||||
|
dotted: { en: 'Dotted', es: 'Punteado' }
|
||||||
|
},
|
||||||
|
preset: {
|
||||||
|
none: { en: 'None', es: 'Ninguno' },
|
||||||
|
full: { en: 'Full', es: 'Completo' }
|
||||||
|
},
|
||||||
|
aria: {
|
||||||
|
'heading-level': { en: 'Heading level', es: 'Nivel del encabezado' },
|
||||||
|
'list-kind': { en: 'List kind', es: 'Tipo de lista' },
|
||||||
|
'code-language': { en: 'Code language', es: 'Lenguaje del código' },
|
||||||
|
src: { en: 'Image URL', es: 'URL de la imagen' },
|
||||||
|
alt: { en: 'Image alternative text', es: 'Texto alternativo de la imagen' },
|
||||||
|
caption: { en: 'Image caption', es: 'Pie de la imagen' },
|
||||||
|
'image-align': { en: 'Image alignment', es: 'Alineación de la imagen' },
|
||||||
|
'image-full-width': {
|
||||||
|
en: 'Image fills container width',
|
||||||
|
es: 'La imagen ocupa todo el ancho del contenedor'
|
||||||
|
},
|
||||||
|
'upload-image': {
|
||||||
|
en: 'Upload image (encodes inline as data URL)',
|
||||||
|
es: 'Subir imagen (codifica en línea como URL de datos)'
|
||||||
|
},
|
||||||
|
intent: { en: 'Callout intent', es: 'Intención del aviso' },
|
||||||
|
title: { en: 'Callout title', es: 'Título del aviso' },
|
||||||
|
'add-row-above': { en: 'Insert row above', es: 'Insertar fila encima' },
|
||||||
|
'add-row-below': { en: 'Insert row below', es: 'Insertar fila debajo' },
|
||||||
|
'remove-row': { en: 'Delete row', es: 'Eliminar fila' },
|
||||||
|
'add-column-left': { en: 'Insert column left', es: 'Insertar columna a la izquierda' },
|
||||||
|
'add-column-right': { en: 'Insert column right', es: 'Insertar columna a la derecha' },
|
||||||
|
'remove-column': { en: 'Delete column', es: 'Eliminar columna' },
|
||||||
|
'add-column-end': { en: 'Add column at end', es: 'Añadir columna al final' },
|
||||||
|
'remove-column-n': { en: 'Remove column {n}', es: 'Eliminar columna {n}' },
|
||||||
|
'header-row': { en: 'Toggle header row', es: 'Alternar fila de cabecera' },
|
||||||
|
'header-column': { en: 'Toggle header column', es: 'Alternar columna de cabecera' },
|
||||||
|
'cell-align': {
|
||||||
|
en: 'Cell horizontal align',
|
||||||
|
es: 'Alineación horizontal de celda'
|
||||||
|
},
|
||||||
|
'cell-valign': {
|
||||||
|
en: 'Cell vertical align',
|
||||||
|
es: 'Alineación vertical de celda'
|
||||||
|
},
|
||||||
|
'font-family': { en: 'Font family', es: 'Familia tipográfica' },
|
||||||
|
'font-weight': { en: 'Font weight', es: 'Grosor de fuente' },
|
||||||
|
align: { en: 'Align', es: 'Alinear' },
|
||||||
|
'border-style': { en: 'Border style', es: 'Estilo del borde' },
|
||||||
|
'radius-preset': { en: 'Corner radius preset', es: 'Preajuste de radio' }
|
||||||
|
},
|
||||||
|
placeholder: {
|
||||||
|
'code-language': { en: 'e.g. javascript', es: 'p. ej. javascript' },
|
||||||
|
src: { en: 'https://...', es: 'https://...' },
|
||||||
|
alt: { en: 'Describe the image', es: 'Describe la imagen' },
|
||||||
|
caption: { en: 'Optional caption', es: 'Pie opcional' },
|
||||||
|
'callout-title': { en: 'Optional title', es: 'Título opcional' },
|
||||||
|
'column-width': { en: '1fr, 200px, 30%', es: '1fr, 200px, 30%' }
|
||||||
|
},
|
||||||
|
spacing: {
|
||||||
|
top: { en: 'Top', es: 'Arriba' },
|
||||||
|
right: { en: 'Right', es: 'Derecha' },
|
||||||
|
bottom: { en: 'Bottom', es: 'Abajo' },
|
||||||
|
left: { en: 'Left', es: 'Izquierda' },
|
||||||
|
link: { en: 'Chain pairs', es: 'Encadenar pares' },
|
||||||
|
unlink: { en: 'Unchain sides', es: 'Desencadenar lados' },
|
||||||
|
'link-title': {
|
||||||
|
en: 'Chain pairs — top with bottom, left with right',
|
||||||
|
es: 'Encadenar pares — arriba con abajo, izquierda con derecha'
|
||||||
|
},
|
||||||
|
'unlink-title': {
|
||||||
|
en: 'Unchain — edit each side independently',
|
||||||
|
es: 'Desencadenar — editar cada lado independiente'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
empty: {
|
||||||
|
en: 'Select a block to edit its style.',
|
||||||
|
es: 'Selecciona un bloque para editar su estilo.'
|
||||||
|
}
|
||||||
|
} as const;
|
||||||
|
|
||||||
Loading…
Reference in new issue