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
9 changes: 0 additions & 9 deletions packages/assets/styles/defaults.scss
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,6 @@ textarea,
border: none;
outline: none;

&:focus,
&:focus-visible {
box-shadow:
inset 0 0 0 transparent,
0 0 0 0.25rem var(--color-brand-shadow);
color: var(--color-contrast);
outline: none;
}

&:disabled,
&[disabled] {
opacity: 0.6;
Expand Down
53 changes: 37 additions & 16 deletions packages/ui/src/components/base/MarkdownEditor.vue
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
<Button :action="() => linkModal?.hide()"><XIcon /> Cancel</Button>
<Button
color="primary"
:disabled="linkValidationErrorMessage || !linkUrl"
:disabled="!!linkValidationErrorMessage || !linkUrl"
:action="
() => {
if (editor) markdownCommands.replaceSelection(editor, linkMarkdown)
Expand Down Expand Up @@ -189,7 +189,7 @@
<Button :action="() => videoModal?.hide()"><XIcon /> Cancel</Button>
<Button
color="primary"
:disabled="linkValidationErrorMessage || !linkUrl"
:disabled="!!linkValidationErrorMessage || !linkUrl"
:action="
() => {
if (editor) markdownCommands.replaceSelection(editor, videoMarkdown)
Expand Down Expand Up @@ -230,7 +230,7 @@
</div>
</div>
<div ref="editorRef" :class="{ hide: previewMode }" />
<div v-if="!previewMode" class="info-blurb">
<div v-if="!previewMode" class="info-blurb mt-2">
<div class="info-blurb">
<InfoIcon />
<span
Expand Down Expand Up @@ -345,19 +345,32 @@ onMounted(() => {

const theme = EditorView.theme({
// in defaults.scss there's references to .cm-content and such to inherit global styles
'&': {
borderRadius: 'var(--radius-md)',
background: 'var(--color-button-bg)',
border: '0.25rem solid transparent',
transition: 'border-color 0.1s ease-in-out',
},
'&.cm-focused': {
'box-shadow': 'inset 0 0 0 transparent, 0 0 0 0.25rem var(--color-brand-shadow)',
color: 'var(--color-contrast)',
outline: 'none',
},
'.cm-focused': {
border: 'none',
},
'.cm-content': {
marginBlockEnd: '0.5rem',
padding: '0.5rem',
minHeight: '200px',
caretColor: 'var(--color-contrast)',
width: '100%',
overflowX: 'scroll',
maxHeight: props.maxHeight ? `${props.maxHeight}px` : 'unset',
overflowY: 'scroll',
},
'.cm-scroller': {
borderRadius: 'var(--radius-md)',
height: '100%',
overflow: 'visible',
maxHeight: props.maxHeight ? `${props.maxHeight}px` : 'unset',
overflow: 'auto',
},
})

Expand Down Expand Up @@ -581,23 +594,35 @@ watch(
editorThemeCompartment.reconfigure(
EditorView.theme({
// in defaults.scss there's references to .cm-content and such to inherit global styles
'&': {
borderRadius: 'var(--radius-md)',
background: 'var(--color-button-bg)',
border: '0.25rem solid transparent',
transition: 'border-color 0.1s ease-in-out',
},
'&.cm-focused': {
'box-shadow': 'inset 0 0 0 transparent, 0 0 0 0.25rem var(--color-brand-shadow)',
color: 'var(--color-contrast)',
outline: 'none',
},
'.cm-focused': {
border: 'none',
},
'.cm-content': {
marginBlockEnd: '0.5rem',
padding: '0.5rem',
minHeight: '200px',
caretColor: 'var(--color-contrast)',
width: '100%',
overflowX: 'scroll',
maxHeight: props.maxHeight ? `${props.maxHeight}px` : 'unset',
overflowY: 'scroll',

opacity: newValue ? 0.6 : 1,
pointerEvents: newValue ? 'none' : 'all',
cursor: newValue ? 'not-allowed' : 'auto',
},
'.cm-scroller': {
borderRadius: 'var(--radius-md)',
height: '100%',
overflow: 'visible',
maxHeight: props.maxHeight ? `${props.maxHeight}px` : 'unset',
overflow: 'auto',
},
}),
),
Expand Down Expand Up @@ -957,8 +982,4 @@ function openVideoModal() {
pointer-events: none;
cursor: not-allowed;
}

:deep(.cm-content) {
overflow: auto;
}
</style>
76 changes: 74 additions & 2 deletions packages/ui/src/stories/base/MarkdownEditor.stories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,56 @@ const meta = {

export default meta

const CONTENT = `# Sample Markdown Document

This is a demonstration of the markdown editor component.

## Features

The editor supports various markdown formatting options:

- **Bold text** for emphasis
- *Italic text* for subtle emphasis
- \`Inline code\` for technical terms
- [Links](https://example.com) for references

## Code Blocks

\`\`\`javascript
function greet(name) {
return \`Hello, \${name}!\`;
}
\`\`\`

## Lists

1. First item
2. Second item
3. Third item

### Nested Lists

- Parent item
- Child item
- Another child
- Another parent

## Blockquotes

> This is a blockquote that can be used for callouts or citations.

## Conclusion

This content demonstrates the editor's capabilities.`

export const Default: StoryObj = {
render: () => ({
components: { MarkdownEditor },
setup() {
const content = ref('# Hello World\n\nThis is some **markdown** content.')
return { content }
},
template: `
template: /*html*/ `
<div class="h-96">
<MarkdownEditor v-model="content" />
</div>
Expand All @@ -32,10 +74,40 @@ export const WithPlaceholder: StoryObj = {
const content = ref('')
return { content }
},
template: `
template: /*html*/ `
<div class="h-96">
<MarkdownEditor v-model="content" placeholder="Write your description here..." />
</div>
`,
}),
}

export const WithContent: StoryObj = {
render: () => ({
components: { MarkdownEditor },
setup() {
const content = ref(CONTENT)
return { content }
},
template: /*html*/ `
<div>
<MarkdownEditor v-model="content" />
</div>
`,
}),
}

export const MaxHeightWithScroll: StoryObj = {
render: () => ({
components: { MarkdownEditor },
setup() {
const content = ref(CONTENT)
return { content }
},
template: /*html*/ `
<div>
<MarkdownEditor v-model="content" :max-height="300" />
</div>
`,
}),
}