diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js
index f5f574f328..ae09ca7922 100644
--- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js
+++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js
@@ -38,7 +38,10 @@ import { TEMPLATE_FRAGMENT } from '../../../../../constants.js';
* @param {ComponentContext} context
*/
export function RegularElement(node, context) {
- const is_html = context.state.metadata.namespace === 'html' && node.name !== 'svg';
+ const is_html =
+ context.state.metadata.namespace === 'html' &&
+ node.name !== 'svg' &&
+ !context.state.options.customRenderer;
const name = is_html ? node.name.toLowerCase() : node.name;
context.state.template.push_element(name, node.start, is_html);
diff --git a/packages/svelte/src/internal/client/dom/elements/class.js b/packages/svelte/src/internal/client/dom/elements/class.js
index 038ce33f3e..063e67a70b 100644
--- a/packages/svelte/src/internal/client/dom/elements/class.js
+++ b/packages/svelte/src/internal/client/dom/elements/class.js
@@ -1,5 +1,11 @@
import { to_class } from '../../../shared/attributes.js';
import { hydrating } from '../hydration.js';
+import {
+ class_list_toggle,
+ get_attribute,
+ remove_attribute,
+ set_attribute
+} from '../operations.js';
/**
* @param {Element} dom
@@ -21,17 +27,17 @@ export function set_class(dom, is_html, value, hash, prev_classes, next_classes)
) {
var next_class_name = to_class(value, hash, next_classes);
- if (!hydrating || next_class_name !== dom.getAttribute('class')) {
+ if (!hydrating || next_class_name !== get_attribute(dom, 'class')) {
// Removing the attribute when the value is only an empty string causes
// performance issues vs simply making the className an empty string. So
// we should only remove the class if the value is nullish
// and there no hash/directives :
if (next_class_name == null) {
- dom.removeAttribute('class');
+ remove_attribute(dom, 'class');
} else if (is_html) {
dom.className = next_class_name;
} else {
- dom.setAttribute('class', next_class_name);
+ set_attribute(dom, 'class', next_class_name);
}
}
@@ -42,7 +48,7 @@ export function set_class(dom, is_html, value, hash, prev_classes, next_classes)
var is_present = !!next_classes[key];
if (prev_classes == null || is_present !== !!prev_classes[key]) {
- dom.classList.toggle(key, is_present);
+ class_list_toggle(/** @type {HTMLElement} */ (dom), key, is_present);
}
}
}
diff --git a/packages/svelte/src/internal/client/dom/elements/style.js b/packages/svelte/src/internal/client/dom/elements/style.js
index 3e05eec30e..b5b68eca28 100644
--- a/packages/svelte/src/internal/client/dom/elements/style.js
+++ b/packages/svelte/src/internal/client/dom/elements/style.js
@@ -1,5 +1,12 @@
import { to_style } from '../../../shared/attributes.js';
import { hydrating } from '../hydration.js';
+import {
+ style_remove_property,
+ style_set_property,
+ get_attribute,
+ remove_attribute,
+ set_css_text
+} from '../operations.js';
/**
* @param {Element & ElementCSSInlineStyle} dom
@@ -13,9 +20,9 @@ function update_styles(dom, prev = {}, next, priority) {
if (prev[key] !== value) {
if (next[key] == null) {
- dom.style.removeProperty(key);
+ style_remove_property(/** @type {HTMLElement} */ (dom), key);
} else {
- dom.style.setProperty(key, value, priority);
+ style_set_property(/** @type {HTMLElement} */ (dom), key, value, priority);
}
}
}
@@ -34,11 +41,11 @@ export function set_style(dom, value, prev_styles, next_styles) {
if (hydrating || prev !== value) {
var next_style_attr = to_style(value, next_styles);
- if (!hydrating || next_style_attr !== dom.getAttribute('style')) {
+ if (!hydrating || next_style_attr !== get_attribute(dom, 'style')) {
if (next_style_attr == null) {
- dom.removeAttribute('style');
+ remove_attribute(dom, 'style');
} else {
- dom.style.cssText = next_style_attr;
+ set_css_text(/** @type {HTMLElement} */ (dom), next_style_attr);
}
}
diff --git a/packages/svelte/tests/custom-renderers/samples/value-checked-attributes/_config.js b/packages/svelte/tests/custom-renderers/samples/special-attributes/_config.js
similarity index 82%
rename from packages/svelte/tests/custom-renderers/samples/value-checked-attributes/_config.js
rename to packages/svelte/tests/custom-renderers/samples/special-attributes/_config.js
index b656ac37df..270aa7975a 100644
--- a/packages/svelte/tests/custom-renderers/samples/value-checked-attributes/_config.js
+++ b/packages/svelte/tests/custom-renderers/samples/special-attributes/_config.js
@@ -20,6 +20,8 @@ export default test({
// Input 1: value="hello"
const input_value = inputs[0];
assert.equal(input_value.attributes['value'], 'hello');
+ assert.equal(input_value.attributes['class'], 'hello');
+ assert.equal(input_value.attributes['style'], 'color: blue');
// Input 2: type="checkbox" checked=""
const input_checked = inputs[1];
@@ -40,6 +42,8 @@ export default test({
// Input 5: spread attributes
const input_spread = inputs[4];
assert.equal(input_spread.attributes['value'], 'hello');
+ assert.equal(input_spread.attributes['class'], 'hello');
+ assert.equal(input_spread.attributes['style'], 'color: blue');
// Click the button to update all values
dispatch_event(button, 'click');
@@ -48,7 +52,8 @@ export default test({
// After update:
// Input 1: value="world"
assert.equal(input_value.attributes['value'], 'world');
-
+ assert.equal(input_value.attributes['class'], 'world');
+ assert.equal(input_value.attributes['style'], 'color: red');
// Input 2: checked should be removed
assert.equal(input_checked.attributes['checked'], undefined);
@@ -61,5 +66,7 @@ export default test({
// Input 5: spread attributes should update value to "world"
assert.equal(input_spread.attributes['value'], 'world');
+ assert.equal(input_spread.attributes['class'], 'world');
+ assert.equal(input_spread.attributes['style'], 'color: red');
}
});
diff --git a/packages/svelte/tests/custom-renderers/samples/value-checked-attributes/main.svelte b/packages/svelte/tests/custom-renderers/samples/special-attributes/main.svelte
similarity index 68%
rename from packages/svelte/tests/custom-renderers/samples/value-checked-attributes/main.svelte
rename to packages/svelte/tests/custom-renderers/samples/special-attributes/main.svelte
index 097bdc0a39..1139780d5b 100644
--- a/packages/svelte/tests/custom-renderers/samples/value-checked-attributes/main.svelte
+++ b/packages/svelte/tests/custom-renderers/samples/special-attributes/main.svelte
@@ -1,12 +1,14 @@
-
+
@@ -14,6 +16,8 @@