diff --git a/src/compiler/compile/render_dom/wrappers/MustacheTag.ts b/src/compiler/compile/render_dom/wrappers/MustacheTag.ts index 08d2b9ee87..0bfa0198ae 100644 --- a/src/compiler/compile/render_dom/wrappers/MustacheTag.ts +++ b/src/compiler/compile/render_dom/wrappers/MustacheTag.ts @@ -25,10 +25,14 @@ export default class MustacheTagWrapper extends Tag { this.parent instanceof ElementWrapper && this.parent.attributes.filter((a) => a.node.is_spread); - let contenteditable_attr_value: Expression | undefined = undefined; + let contenteditable_attr_value: Expression | true | undefined = undefined; if (contenteditable_attributes.length > 0) { - const value = (contenteditable_attributes[0] as AttributeWrapper).get_value(block); - contenteditable_attr_value = x`${value}`; + const attribute = contenteditable_attributes[0] as AttributeWrapper; + if ([true, 'true', ''].includes(attribute.node.get_static_value())) { + contenteditable_attr_value = true; + } else { + contenteditable_attr_value = x`${attribute.get_value(block)}`; + } } else if (spread_attributes.length > 0 && data.element_data_name) { contenteditable_attr_value = x`${data.element_data_name}['contenteditable']`; } @@ -37,7 +41,11 @@ export default class MustacheTagWrapper extends Tag { block, value => { if (contenteditable_attr_value) { - return x`@set_data_maybe_contenteditable(${this.var}, ${value}, ${contenteditable_attr_value})`; + if (contenteditable_attr_value === true) { + return x`@set_data_contenteditable(${this.var}, ${value})`; + } else { + return x`@set_data_maybe_contenteditable(${this.var}, ${value}, ${contenteditable_attr_value})`; + } } else { return x`@set_data(${this.var}, ${value})`; } diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index ae50e365d2..cd47138fef 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -91,12 +91,16 @@ export function set_data_dev(text: Text, data: unknown) { text.data = (data as string); } +export function set_data_contenteditable_dev(text: Text, data: unknown) { + data = '' + data; + if (text.wholeText === data) return; + dispatch_dev('SvelteDOMSetData', { node: text, data }); + text.data = (data as string); +} + export function set_data_maybe_contenteditable_dev(text: Text, data: unknown, attr_value: string) { if (~contenteditable_truthy_values.indexOf(attr_value)) { - data = '' + data; - if (text.wholeText === data) return; - dispatch_dev('SvelteDOMSetData', { node: text, data }); - text.data = (data as string); + set_data_contenteditable_dev(text, data); } else { set_data_dev(text, data); } diff --git a/src/runtime/internal/dom.ts b/src/runtime/internal/dom.ts index 2e54305c46..bbe9ed2e08 100644 --- a/src/runtime/internal/dom.ts +++ b/src/runtime/internal/dom.ts @@ -587,11 +587,15 @@ export function set_data(text: Text, data: unknown) { text.data = (data as string); } +export function set_data_contenteditable(text: Text, data: unknown) { + data = '' + data; + if (text.wholeText === data) return; + text.data = (data as string); +} + export function set_data_maybe_contenteditable(text: Text, data: unknown, attr_value: string) { if (~contenteditable_truthy_values.indexOf(attr_value)) { - data = '' + data; - if (text.wholeText === data) return; - text.data = (data as string); + set_data_contenteditable(text, data) } else { set_data(text, data); }