Skip to content

Commit 75162bb

Browse files
Update vendored trix version to 2.1.7 (rails#53329)
This updates Trix to 2.1.7, which includes support for the upcoming security fix in rails#51729 and enhanced form support via `ElementInternals` and HTML5 validations. See: - https://github.com/basecamp/trix/releases/tag/v2.1.7 - basecamp/trix#1190
1 parent 865a3a2 commit 75162bb

File tree

1 file changed

+230
-47
lines changed
  • actiontext/app/assets/javascripts

1 file changed

+230
-47
lines changed

actiontext/app/assets/javascripts/trix.js

Lines changed: 230 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Trix 2.1.6
2+
Trix 2.1.7
33
Copyright © 2024 37signals, LLC
44
*/
55
(function (global, factory) {
@@ -9,7 +9,7 @@ Copyright © 2024 37signals, LLC
99
})(this, (function () { 'use strict';
1010

1111
var name = "trix";
12-
var version = "2.1.6";
12+
var version = "2.1.7";
1313
var description = "A rich text editor for everyday writing";
1414
var main = "dist/trix.umd.min.js";
1515
var module = "dist/trix.esm.min.js";
@@ -1037,7 +1037,11 @@ $\
10371037
const getCSPNonce = function () {
10381038
const element = getMetaElement("trix-csp-nonce") || getMetaElement("csp-nonce");
10391039
if (element) {
1040-
return element.getAttribute("content");
1040+
const {
1041+
nonce,
1042+
content
1043+
} = element;
1044+
return nonce == "" ? content : nonce;
10411045
}
10421046
};
10431047
const getMetaElement = name => document.head.querySelector("meta[name=".concat(name, "]"));
@@ -11719,7 +11723,7 @@ $\
1171911723
updateInputElement() {
1172011724
const element = this.compositionController.getSerializableElement();
1172111725
const value = serializeToContentType(element, "text/html");
11722-
return this.editorElement.setInputElementValue(value);
11726+
return this.editorElement.setFormValue(value);
1172311727
}
1172411728
notifyEditorElement(message, data) {
1172511729
switch (message) {
@@ -11977,7 +11981,186 @@ $\
1197711981
}
1197811982
}();
1197911983
installDefaultCSSForTagName("trix-editor", "%t {\n display: block;\n}\n\n%t:empty::before {\n content: attr(placeholder);\n color: graytext;\n cursor: text;\n pointer-events: none;\n white-space: pre-line;\n}\n\n%t a[contenteditable=false] {\n cursor: text;\n}\n\n%t img {\n max-width: 100%;\n height: auto;\n}\n\n%t ".concat(attachmentSelector, " figcaption textarea {\n resize: none;\n}\n\n%t ").concat(attachmentSelector, " figcaption textarea.trix-autoresize-clone {\n position: absolute;\n left: -9999px;\n max-height: 0px;\n}\n\n%t ").concat(attachmentSelector, " figcaption[data-trix-placeholder]:empty::before {\n content: attr(data-trix-placeholder);\n color: graytext;\n}\n\n%t [data-trix-cursor-target] {\n display: ").concat(cursorTargetStyles.display, " !important;\n width: ").concat(cursorTargetStyles.width, " !important;\n padding: 0 !important;\n margin: 0 !important;\n border: none !important;\n}\n\n%t [data-trix-cursor-target=left] {\n vertical-align: top !important;\n margin-left: -1px !important;\n}\n\n%t [data-trix-cursor-target=right] {\n vertical-align: bottom !important;\n margin-right: -1px !important;\n}"));
11984+
var _internals = /*#__PURE__*/new WeakMap();
11985+
var _validate = /*#__PURE__*/new WeakSet();
11986+
class ElementInternalsDelegate {
11987+
constructor(element) {
11988+
_classPrivateMethodInitSpec(this, _validate);
11989+
_classPrivateFieldInitSpec(this, _internals, {
11990+
writable: true,
11991+
value: void 0
11992+
});
11993+
this.element = element;
11994+
_classPrivateFieldSet(this, _internals, element.attachInternals());
11995+
}
11996+
connectedCallback() {
11997+
_classPrivateMethodGet(this, _validate, _validate2).call(this);
11998+
}
11999+
disconnectedCallback() {}
12000+
get labels() {
12001+
return _classPrivateFieldGet(this, _internals).labels;
12002+
}
12003+
get disabled() {
12004+
var _this$element$inputEl;
12005+
return (_this$element$inputEl = this.element.inputElement) === null || _this$element$inputEl === void 0 ? void 0 : _this$element$inputEl.disabled;
12006+
}
12007+
set disabled(value) {
12008+
this.element.toggleAttribute("disabled", value);
12009+
}
12010+
get required() {
12011+
return this.element.hasAttribute("required");
12012+
}
12013+
set required(value) {
12014+
this.element.toggleAttribute("required", value);
12015+
_classPrivateMethodGet(this, _validate, _validate2).call(this);
12016+
}
12017+
get validity() {
12018+
return _classPrivateFieldGet(this, _internals).validity;
12019+
}
12020+
get validationMessage() {
12021+
return _classPrivateFieldGet(this, _internals).validationMessage;
12022+
}
12023+
get willValidate() {
12024+
return _classPrivateFieldGet(this, _internals).willValidate;
12025+
}
12026+
setFormValue(value) {
12027+
_classPrivateMethodGet(this, _validate, _validate2).call(this);
12028+
}
12029+
checkValidity() {
12030+
return _classPrivateFieldGet(this, _internals).checkValidity();
12031+
}
12032+
reportValidity() {
12033+
return _classPrivateFieldGet(this, _internals).reportValidity();
12034+
}
12035+
setCustomValidity(validationMessage) {
12036+
_classPrivateMethodGet(this, _validate, _validate2).call(this, validationMessage);
12037+
}
12038+
}
12039+
function _validate2() {
12040+
let customValidationMessage = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
12041+
const {
12042+
required,
12043+
value
12044+
} = this.element;
12045+
const valueMissing = required && !value;
12046+
const customError = !!customValidationMessage;
12047+
const input = makeElement("input", {
12048+
required
12049+
});
12050+
const validationMessage = customValidationMessage || input.validationMessage;
12051+
_classPrivateFieldGet(this, _internals).setValidity({
12052+
valueMissing,
12053+
customError
12054+
}, validationMessage);
12055+
}
12056+
var _focusHandler = /*#__PURE__*/new WeakMap();
12057+
var _resetBubbled = /*#__PURE__*/new WeakMap();
12058+
var _clickBubbled = /*#__PURE__*/new WeakMap();
12059+
class LegacyDelegate {
12060+
constructor(element) {
12061+
_classPrivateFieldInitSpec(this, _focusHandler, {
12062+
writable: true,
12063+
value: void 0
12064+
});
12065+
_classPrivateFieldInitSpec(this, _resetBubbled, {
12066+
writable: true,
12067+
value: event => {
12068+
if (event.defaultPrevented) return;
12069+
if (event.target !== this.element.form) return;
12070+
this.element.reset();
12071+
}
12072+
});
12073+
_classPrivateFieldInitSpec(this, _clickBubbled, {
12074+
writable: true,
12075+
value: event => {
12076+
if (event.defaultPrevented) return;
12077+
if (this.element.contains(event.target)) return;
12078+
const label = findClosestElementFromNode(event.target, {
12079+
matchingSelector: "label"
12080+
});
12081+
if (!label) return;
12082+
if (!Array.from(this.labels).includes(label)) return;
12083+
this.element.focus();
12084+
}
12085+
});
12086+
this.element = element;
12087+
}
12088+
connectedCallback() {
12089+
_classPrivateFieldSet(this, _focusHandler, ensureAriaLabel(this.element));
12090+
window.addEventListener("reset", _classPrivateFieldGet(this, _resetBubbled), false);
12091+
window.addEventListener("click", _classPrivateFieldGet(this, _clickBubbled), false);
12092+
}
12093+
disconnectedCallback() {
12094+
var _classPrivateFieldGet2;
12095+
(_classPrivateFieldGet2 = _classPrivateFieldGet(this, _focusHandler)) === null || _classPrivateFieldGet2 === void 0 || _classPrivateFieldGet2.destroy();
12096+
window.removeEventListener("reset", _classPrivateFieldGet(this, _resetBubbled), false);
12097+
window.removeEventListener("click", _classPrivateFieldGet(this, _clickBubbled), false);
12098+
}
12099+
get labels() {
12100+
const labels = [];
12101+
if (this.element.id && this.element.ownerDocument) {
12102+
labels.push(...Array.from(this.element.ownerDocument.querySelectorAll("label[for='".concat(this.element.id, "']")) || []));
12103+
}
12104+
const label = findClosestElementFromNode(this.element, {
12105+
matchingSelector: "label"
12106+
});
12107+
if (label) {
12108+
if ([this.element, null].includes(label.control)) {
12109+
labels.push(label);
12110+
}
12111+
}
12112+
return labels;
12113+
}
12114+
get disabled() {
12115+
console.warn("This browser does not support the [disabled] attribute for trix-editor elements.");
12116+
return false;
12117+
}
12118+
set disabled(value) {
12119+
console.warn("This browser does not support the [disabled] attribute for trix-editor elements.");
12120+
}
12121+
get required() {
12122+
console.warn("This browser does not support the [required] attribute for trix-editor elements.");
12123+
return false;
12124+
}
12125+
set required(value) {
12126+
console.warn("This browser does not support the [required] attribute for trix-editor elements.");
12127+
}
12128+
get validity() {
12129+
console.warn("This browser does not support the validity property for trix-editor elements.");
12130+
return null;
12131+
}
12132+
get validationMessage() {
12133+
console.warn("This browser does not support the validationMessage property for trix-editor elements.");
12134+
return "";
12135+
}
12136+
get willValidate() {
12137+
console.warn("This browser does not support the willValidate property for trix-editor elements.");
12138+
return false;
12139+
}
12140+
setFormValue(value) {}
12141+
checkValidity() {
12142+
console.warn("This browser does not support checkValidity() for trix-editor elements.");
12143+
return true;
12144+
}
12145+
reportValidity() {
12146+
console.warn("This browser does not support reportValidity() for trix-editor elements.");
12147+
return true;
12148+
}
12149+
setCustomValidity(validationMessage) {
12150+
console.warn("This browser does not support setCustomValidity(validationMessage) for trix-editor elements.");
12151+
}
12152+
}
12153+
var _delegate = /*#__PURE__*/new WeakMap();
1198012154
class TrixEditorElement extends HTMLElement {
12155+
constructor() {
12156+
super();
12157+
_classPrivateFieldInitSpec(this, _delegate, {
12158+
writable: true,
12159+
value: void 0
12160+
});
12161+
_classPrivateFieldSet(this, _delegate, this.constructor.formAssociated ? new ElementInternalsDelegate(this) : new LegacyDelegate(this));
12162+
}
12163+
1198112164
// Properties
1198212165

1198312166
get trixId() {
@@ -11989,19 +12172,31 @@ $\
1198912172
}
1199012173
}
1199112174
get labels() {
11992-
const labels = [];
11993-
if (this.id && this.ownerDocument) {
11994-
labels.push(...Array.from(this.ownerDocument.querySelectorAll("label[for='".concat(this.id, "']")) || []));
11995-
}
11996-
const label = findClosestElementFromNode(this, {
11997-
matchingSelector: "label"
11998-
});
11999-
if (label) {
12000-
if ([this, null].includes(label.control)) {
12001-
labels.push(label);
12002-
}
12003-
}
12004-
return labels;
12175+
return _classPrivateFieldGet(this, _delegate).labels;
12176+
}
12177+
get disabled() {
12178+
return _classPrivateFieldGet(this, _delegate).disabled;
12179+
}
12180+
set disabled(value) {
12181+
_classPrivateFieldGet(this, _delegate).disabled = value;
12182+
}
12183+
get required() {
12184+
return _classPrivateFieldGet(this, _delegate).required;
12185+
}
12186+
set required(value) {
12187+
_classPrivateFieldGet(this, _delegate).required = value;
12188+
}
12189+
get validity() {
12190+
return _classPrivateFieldGet(this, _delegate).validity;
12191+
}
12192+
get validationMessage() {
12193+
return _classPrivateFieldGet(this, _delegate).validationMessage;
12194+
}
12195+
get willValidate() {
12196+
return _classPrivateFieldGet(this, _delegate).willValidate;
12197+
}
12198+
get type() {
12199+
return this.localName;
1200512200
}
1200612201
get toolbarElement() {
1200712202
if (this.hasAttribute("toolbar")) {
@@ -12068,9 +12263,10 @@ $\
1206812263
});
1206912264
}
1207012265
}
12071-
setInputElementValue(value) {
12266+
setFormValue(value) {
1207212267
if (this.inputElement) {
1207312268
this.inputElement.value = value;
12269+
_classPrivateFieldGet(this, _delegate).setFormValue(value);
1207412270
}
1207512271
}
1207612272

@@ -12080,7 +12276,6 @@ $\
1208012276
if (!this.hasAttribute("data-trix-internal")) {
1208112277
makeEditable(this);
1208212278
addAccessibilityRole(this);
12083-
ensureAriaLabel(this);
1208412279
if (!this.editorController) {
1208512280
triggerEvent("trix-before-initialize", {
1208612281
onElement: this
@@ -12094,53 +12289,41 @@ $\
1209412289
}));
1209512290
}
1209612291
this.editorController.registerSelectionManager();
12097-
this.registerResetListener();
12098-
this.registerClickListener();
12292+
_classPrivateFieldGet(this, _delegate).connectedCallback();
1209912293
autofocus(this);
1210012294
}
1210112295
}
1210212296
disconnectedCallback() {
1210312297
var _this$editorControlle2;
1210412298
(_this$editorControlle2 = this.editorController) === null || _this$editorControlle2 === void 0 || _this$editorControlle2.unregisterSelectionManager();
12105-
this.unregisterResetListener();
12106-
return this.unregisterClickListener();
12299+
_classPrivateFieldGet(this, _delegate).disconnectedCallback();
1210712300
}
1210812301

1210912302
// Form support
1211012303

12111-
registerResetListener() {
12112-
this.resetListener = this.resetBubbled.bind(this);
12113-
return window.addEventListener("reset", this.resetListener, false);
12304+
checkValidity() {
12305+
return _classPrivateFieldGet(this, _delegate).checkValidity();
1211412306
}
12115-
unregisterResetListener() {
12116-
return window.removeEventListener("reset", this.resetListener, false);
12307+
reportValidity() {
12308+
return _classPrivateFieldGet(this, _delegate).reportValidity();
1211712309
}
12118-
registerClickListener() {
12119-
this.clickListener = this.clickBubbled.bind(this);
12120-
return window.addEventListener("click", this.clickListener, false);
12310+
setCustomValidity(validationMessage) {
12311+
_classPrivateFieldGet(this, _delegate).setCustomValidity(validationMessage);
1212112312
}
12122-
unregisterClickListener() {
12123-
return window.removeEventListener("click", this.clickListener, false);
12124-
}
12125-
resetBubbled(event) {
12126-
if (event.defaultPrevented) return;
12127-
if (event.target !== this.form) return;
12128-
return this.reset();
12313+
formDisabledCallback(disabled) {
12314+
if (this.inputElement) {
12315+
this.inputElement.disabled = disabled;
12316+
}
12317+
this.toggleAttribute("contenteditable", !disabled);
1212912318
}
12130-
clickBubbled(event) {
12131-
if (event.defaultPrevented) return;
12132-
if (this.contains(event.target)) return;
12133-
const label = findClosestElementFromNode(event.target, {
12134-
matchingSelector: "label"
12135-
});
12136-
if (!label) return;
12137-
if (!Array.from(this.labels).includes(label)) return;
12138-
return this.focus();
12319+
formResetCallback() {
12320+
this.reset();
1213912321
}
1214012322
reset() {
1214112323
this.value = this.defaultValue;
1214212324
}
1214312325
}
12326+
_defineProperty(TrixEditorElement, "formAssociated", "ElementInternals" in window);
1214412327

1214512328
var elements = /*#__PURE__*/Object.freeze({
1214612329
__proto__: null,

0 commit comments

Comments
 (0)