Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/super-editor/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<title>Super Editor - Dev mode</title>
</head>
<body>
<div id="app"></div>
<div id="app" role="application"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
2 changes: 1 addition & 1 deletion packages/super-editor/src/components/SuperEditor.vue
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ onBeforeUnmount(() => {
@click="handleSuperEditorClick"
@mousedown="handleMarginClick"
>
<div ref="editorElem" class="editor-element super-editor__element"></div>
<div ref="editorElem" class="editor-element super-editor__element" role="presentation"></div>
</div>

<div class="placeholder-editor" v-if="!editorReady">
Expand Down
40 changes: 34 additions & 6 deletions packages/super-editor/src/components/toolbar/AlignmentButtons.vue
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,42 @@ const select = (alignment) => {

<template>
<div class="alignment-buttons" :class="{ 'high-contrast': isHighContrastMode }">
<div class="button-icon" @click="select('left')" v-html="toolbarIcons.alignLeft" data-item="btn-textAlign-option">
<div
class="button-icon"
@click="select('left')"
v-html="toolbarIcons.alignLeft"
data-item="btn-textAlign-option"
role="menuitem"
aria-label="Align left"
>
</div>
<div class="button-icon" @click="select('center')" v-html="toolbarIcons.alignCenter"
data-item="btn-textAlign-option"></div>
<div class="button-icon" @click="select('right')" v-html="toolbarIcons.alignRight" data-item="btn-textAlign-option">
<div
class="button-icon"
@click="select('center')"
v-html="toolbarIcons.alignCenter"

data-item="btn-textAlign-option"
role="menuitem"
aria-label="Align center"
></div>
<div
class="button-icon"
@click="select('right')"
v-html="toolbarIcons.alignRight"
data-item="btn-textAlign-option"
role="menuitem"
aria-label="Align right"
>
</div>
<div class="button-icon" @click="select('justify')" v-html="toolbarIcons.alignJustify"
data-item="btn-textAlign-option"></div>
<div
class="button-icon"
@click="select('justify')"
v-html="toolbarIcons.alignJustify"

data-item="btn-textAlign-option"
role="menuitem"
aria-label="Justify"
></div>
</div>
</template>

Expand Down
47 changes: 39 additions & 8 deletions packages/super-editor/src/components/toolbar/ButtonGroup.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ const props = defineProps({
type: String,
default: 'left',
},
fromOverflow: {
type: Boolean,
default: false,
}
});

const currentItem = ref(null);
Expand Down Expand Up @@ -91,13 +95,24 @@ const dropdownOptions = (item) => {
});
};

const getDropdownAttributes = (option, item) => {
return {
role: 'menuitem',
ariaLabel: `${item.attributes.value.ariaLabel} - ${option.label}`,
};
};

const handleClickOutside = (e) => {
closeDropdowns();
};
</script>

<template>
<div :style="getPositionStyle" class="button-group">
<div
:style="getPositionStyle"
class="button-group"
role="group"
>
<div v-for="item in toolbarItems" :key="item.id.value" :class="{
narrow: item.isNarrow.value,
wide: item.isWide.value,
Expand All @@ -106,11 +121,23 @@ const handleClickOutside = (e) => {
<ToolbarSeparator v-if="isSeparator(item)" style="width: 20px" />

<!-- Toolbar button -->
<n-dropdown v-if="isDropdown(item) && item.nestedOptions?.value?.length" :options="dropdownOptions(item)"
:trigger="item.disabled.value ? null : 'click'" :show="item.expand.value" size="medium" placement="bottom-start"
class="toolbar-button toolbar-dropdown sd-editor-toolbar-dropdown" :class="{ 'high-contrast': isHighContrastMode }"
@select="(key, option) => handleSelect(item, option)" @clickoutside="handleClickOutside"
:style="item.dropdownStyles.value">
<n-dropdown
v-if="isDropdown(item) && item.nestedOptions?.value?.length"
:options="dropdownOptions(item)"
:trigger="item.disabled.value ? null : 'click'"
:show="item.expand.value"
size="medium"
placement="bottom-start"
class="toolbar-button toolbar-dropdown sd-editor-toolbar-dropdown"
:class="{ 'high-contrast': isHighContrastMode }"
@select="(key, option) => handleSelect(item, option)"
@clickoutside="handleClickOutside"
:style="item.dropdownStyles.value"
:menu-props="() => ({
role: 'menu'
})"
:node-props="(option) => getDropdownAttributes(option, item)"
>
<n-tooltip trigger="hover" :disabled="!item.tooltip?.value">
<template #trigger>
<ToolbarButton :toolbar-item="item" @textSubmit="handleToolbarButtonTextSubmit(item, $event)"
Expand All @@ -125,8 +152,12 @@ const handleClickOutside = (e) => {

<n-tooltip trigger="hover" v-else-if="isButton(item)" class="sd-editor-toolbar-tooltip">
<template #trigger>
<ToolbarButton :toolbar-item="item" @textSubmit="handleToolbarButtonTextSubmit(item, $event)"
@buttonClick="handleToolbarButtonClick(item)" />
<ToolbarButton
:toolbar-item="item"
:is-overflow-item="fromOverflow"
@textSubmit="handleToolbarButtonTextSubmit(item, $event)"
@buttonClick="handleToolbarButtonClick(item)"
/>
</template>
<div v-if="item.tooltip">
{{ item.tooltip }}
Expand Down
10 changes: 8 additions & 2 deletions packages/super-editor/src/components/toolbar/DocumentMode.vue
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,14 @@ const handleClick = (item) => {

<template>
<div class="document-mode" :class="{ 'high-contrast': isHighContrastMode }">
<div class="option-item" v-for="option in options" @click="handleClick(option)"
:class="{ disabled: option.disabled }" data-item="btn-documentMode-option">
<div
class="option-item"
v-for="option in options"
@click="handleClick(option)"
:class="{ disabled: option.disabled }"
data-item="btn-documentMode-option"
role="menuitem"
>
<div class="document-mode-column icon-column">
<div class="icon-column__icon" v-html="option.icon"></div>
</div>
Expand Down
2 changes: 2 additions & 0 deletions packages/super-editor/src/components/toolbar/IconGrid.vue
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ const handleSelect = (option) => {
<div
v-if="hasNoneIcon"
class="none-option"
role="menuitem"
aria-label="Clear color selection"
@click="handleSelect('none')"
>
<span
Expand Down
9 changes: 8 additions & 1 deletion packages/super-editor/src/components/toolbar/IconGridRow.vue
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,18 @@ onMounted(() => {
});
</script>
<template>
<div class="option-row" v-for="(row, rowIndex) in icons" :key="rowIndex">
<div
class="option-row"
v-for="(row, rowIndex) in icons"
:key="rowIndex"
role="group"
>
<div
class="option"
v-for="(option, optionIndex) in row"
:key="optionIndex"
:aria-label="option.label"
role="menuitem"
@click.stop.prevent="handleClick(option)"
>
<div
Expand Down
12 changes: 9 additions & 3 deletions packages/super-editor/src/components/toolbar/LinkInput.vue
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,15 @@ onMounted(() => {
<div v-if="showInput && !isAnchor">
<div class="input-row">
<div class="input-icon" v-html="toolbarIcons.linkInput"></div>
<input type="text" placeholder="Type or paste a link"
:class="{ error: urlError }" v-model="rawUrl"
@keydown.enter.stop.prevent="handleSubmit" @keydown="urlError = false" />
<input
type="text"
name="link"
placeholder="Type or paste a link"
:class="{ error: urlError }"
v-model="rawUrl"
@keydown.enter.stop.prevent="handleSubmit"
@keydown="urlError = false"
/>

<div class="open-link-icon" :class="{ disabled: !validUrl }" v-html="toolbarIcons.openLink" @click="openLink"
data-item="btn-link-open">
Expand Down
13 changes: 10 additions & 3 deletions packages/super-editor/src/components/toolbar/OverflowMenu.vue
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,22 @@ const handleCommand = ({ item, argument }) => {
</script>

<template>
<div class="overflow-menu">
<div
class="overflow-menu"
>
<div class="overflow-menu-trigger">
<ToolbarButton
:toolbar-item="overflowToolbarItem"
@buttonClick="toggleOverflowMenu"
/>
</div>
<div v-if="isDropdownOpened" class="overflow-menu_items">
<ButtonGroup :toolbar-items="overflowItems" @command="handleCommand" class="superdoc-toolbar-overflow" />
<div v-if="isDropdownOpened" class="overflow-menu_items" role="group">
<ButtonGroup
class="superdoc-toolbar-overflow"
:toolbar-items="overflowItems"
from-overflow
@command="handleCommand"
/>
</div>
</div>
</template>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ const handleClick = (item) => {
:class="{ 'toolbar-table-actions__item--border': option.bottomBorder}"
v-for="option in options"
@click="handleClick(option)"
:data-item="option.props?.['data-item'] || ''">
:data-item="option.props?.['data-item'] || ''"
:ariaLabel="option.props?.ariaLabel"
role="menuitem"
>
<div class="toolbar-table-actions__icon">
<div class="toolbar-table-actions__icon-wrapper" v-html="option.icon"></div>
</div>
Expand Down
5 changes: 4 additions & 1 deletion packages/super-editor/src/components/toolbar/TableGrid.vue
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,10 @@ const handleClick = ({ cols, rows }) => {
</template>
</div>

<div class="toolbar-table-grid-value">
<div
class="toolbar-table-grid-value"
:aria-valuetext="`${selectedRows} x ${selectedCols}`"
>
{{ selectedRows }} x {{ selectedCols }}
</div>
</div>
Expand Down
7 changes: 6 additions & 1 deletion packages/super-editor/src/components/toolbar/Toolbar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,12 @@ const handleCommand = ({ item, argument, option }) => {
</script>

<template>
<div class="superdoc-toolbar" :key="toolbarKey">
<div
class="superdoc-toolbar"
:key="toolbarKey"
role="toolbar"
aria-label="Toolbar"
>
<ButtonGroup
v-if="showLeftSide"
:toolbar-items="getFilteredItems('left')"
Expand Down
22 changes: 17 additions & 5 deletions packages/super-editor/src/components/toolbar/ToolbarButton.vue
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ const props = defineProps({
type: String,
default: null,
},
isOverflowItem: {
type: Boolean,
default: false,
}
});

const {
Expand Down Expand Up @@ -83,12 +87,20 @@ const caretIcon = computed(() => {
</script>

<template>
<div :class="['toolbar-item', attributes.className]" :style="getStyle">
<div @click="handleClick" class="toolbar-button"
<div
:class="['toolbar-item', attributes.className]"
:style="getStyle"
:role="isOverflowItem ? 'menuitem' : ''"
>
<div
@click="handleClick"
class="toolbar-button"
:class="{ active, disabled, narrow: isNarrow, wide: isWide, 'has-inline-text-input': hasInlineTextInput, 'high-contrast': isHighContrastMode }"
:data-item="`btn-${name || ''}`">
<ToolbarButtonIcon v-if="icon" :color="iconColor" class="toolbar-icon"
:class="{ 'high-contrast': isHighContrastMode }" :icon="icon" :name="name">
:data-item="`btn-${name || ''}`"
:aria-label="attributes.ariaLabel"
role="button"
>
<ToolbarButtonIcon v-if="icon" :color="iconColor" class="toolbar-icon" :icon="icon" :name="name">
</ToolbarButtonIcon>

<div class="button-label" v-if="label && !hideLabel && !inlineTextInputVisible">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@ const getSeparatorColor = () => {
</script>

<template>
<div class="toolbar-separator">
<div
class="toolbar-separator"
role="separator"
aria-label="Toolbar separator"
>
<div class="separator-inner" :style="{ backgroundColor: getSeparatorColor() }"></div>
</div>
</template>
Expand Down
Loading