Giter Site home page Giter Site logo

basecamp / trix Goto Github PK

View Code? Open in Web Editor NEW
18.7K 250.0 1.1K 5.91 MB

A rich text editor for everyday writing

Home Page: https://trix-editor.org/

License: MIT License

Ruby 0.59% HTML 0.48% Shell 0.36% JavaScript 96.57% SCSS 2.00%
rich-text-editor wysiwyg-editor wysiwyg javascript custom-elements editor text-editor

trix's Introduction

Trix

A Rich Text Editor for Everyday Writing

Compose beautifully formatted text in your web application. Trix is a WYSIWYG editor for writing messages, comments, articles, and lists—the simple documents most web apps are made of. It features a sophisticated document model, support for embedded attachments, and outputs terse and consistent HTML.

Trix is an open-source project from 37signals, the creators of Ruby on Rails. Millions of people trust their text to us, and we built Trix to give them the best possible editing experience. See Trix in action in Basecamp 3.

Different By Design

When Trix was designed in 2014, most WYSIWYG editors were wrappers around HTML’s contenteditable and execCommand APIs, designed by Microsoft to support live editing of web pages in Internet Explorer 5.5, and eventually reverse-engineered and copied by other browsers.

Because these APIs were not fully specified or documented, and because WYSIWYG HTML editors are enormous in scope, each browser’s implementation has its own set of bugs and quirks, and JavaScript developers are left to resolve the inconsistencies.

Trix sidestepped these inconsistencies by treating contenteditable as an I/O device: when input makes its way to the editor, Trix converts that input into an editing operation on its internal document model, then re-renders that document back into the editor. This gives Trix complete control over what happens after every keystroke, and avoids the need to use execCommand at all.

This is the approach that all modern, production ready, WYSIWYG editors now take.

Built on Web standards

Trix supports all evergreen, self-updating desktop and mobile browsers.

Trix is built with established web standards, notably Custom Elements, Mutation Observer, and Promises.

Getting Started

Trix comes bundled in ESM and UMD formats and works with any asset packaging system.

The easiest way to start with Trix is including it from an npm CDN in the <head> of your page:

<head><link rel="stylesheet" type="text/css" href="https://unpkg.com/[email protected]/dist/trix.css">
  <script type="text/javascript" src="https://unpkg.com/[email protected]/dist/trix.umd.min.js"></script>
</head>

trix.css includes default styles for the Trix toolbar, editor, and attachments. Skip this file if you prefer to define these styles yourself.

Alternatively, you can install the npm package and import it in your application:

import Trix from "trix"

document.addEventListener("trix-before-initialize", () => {
  // Change Trix.config if you need
})

Creating an Editor

Place an empty <trix-editor></trix-editor> tag on the page. Trix will automatically insert a separate <trix-toolbar> before the editor.

Like an HTML <textarea>, <trix-editor> accepts autofocus and placeholder attributes. Unlike a <textarea>, <trix-editor> automatically expands vertically to fit its contents.

Integrating With Forms

To submit the contents of a <trix-editor> with a form, first define a hidden input field in the form and assign it an id. Then reference that id in the editor’s input attribute.

<form >
  <input id="x" type="hidden" name="content">
  <trix-editor input="x"></trix-editor>
</form>

Trix will automatically update the value of the hidden input field with each change to the editor.

Populating With Stored Content

To populate a <trix-editor> with stored content, include that content in the associated input element’s value attribute.

<form >
  <input id="x" value="Editor content goes here" type="hidden" name="content">
  <trix-editor input="x"></trix-editor>
</form>

Always use an associated input element to safely populate an editor. Trix won’t load any HTML content inside a <trix-editor>…</trix-editor> tag.

Styling Formatted Content

To ensure what you see when you edit is what you see when you save, use a CSS class name to scope styles for Trix formatted content. Apply this class name to your <trix-editor> element, and to a containing element when you render stored Trix content for display in your application.

<trix-editor class="trix-content"></trix-editor>
<div class="trix-content">Stored content here</div>

The default trix.css file includes styles for basic formatted content—including bulleted and numbered lists, code blocks, and block quotes—under the class name trix-content. We encourage you to use these styles as a starting point by copying them into your application’s CSS with a different class name.

Storing Attached Files

Trix automatically accepts files dragged or pasted into an editor and inserts them as attachments in the document. Each attachment is considered pending until you store it remotely and provide Trix with a permanent URL.

To store attachments, listen for the trix-attachment-add event. Upload the attached files with XMLHttpRequest yourself and set the attachment’s URL attribute upon completion. See the attachment example for detailed information.

If you don’t want to accept dropped or pasted files, call preventDefault() on the trix-file-accept event, which Trix dispatches just before the trix-attachment-add event.

Editing Text Programmatically

You can manipulate a Trix editor programmatically through the Trix.Editor interface, available on each <trix-editor> element through its editor property.

var element = document.querySelector("trix-editor")
element.editor  // is a Trix.Editor instance

Understanding the Document Model

The formatted content of a Trix editor is known as a document, and is represented as an instance of the Trix.Document class. To get the editor’s current document, use the editor.getDocument method.

element.editor.getDocument()  // is a Trix.Document instance

You can convert a document to an unformatted JavaScript string with the document.toString method.

var document = element.editor.getDocument()
document.toString()  // is a JavaScript string

Immutability and Equality

Documents are immutable values. Each change you make in an editor replaces the previous document with a new document. Capturing a snapshot of the editor’s content is as simple as keeping a reference to its document, since that document will never change over time. (This is how Trix implements undo.)

To compare two documents for equality, use the document.isEqualTo method.

var document = element.editor.getDocument()
document.isEqualTo(element.editor.getDocument())  // true

Getting and Setting the Selection

Trix documents are structured as sequences of individually addressable characters. The index of one character in a document is called a position, and a start and end position together make up a range.

To get the editor’s current selection, use the editor.getSelectedRange method, which returns a two-element array containing the start and end positions.

element.editor.getSelectedRange()  // [0, 0]

You can set the editor’s current selection by passing a range array to the editor.setSelectedRange method.

// Select the first character in the document
element.editor.setSelectedRange([0, 1])

Collapsed Selections

When the start and end positions of a range are equal, the range is said to be collapsed. In the editor, a collapsed selection appears as a blinking cursor rather than a highlighted span of text.

For convenience, the following calls to setSelectedRange are equivalent when working with collapsed selections:

element.editor.setSelectedRange(1)
element.editor.setSelectedRange([1])
element.editor.setSelectedRange([1, 1])

Directional Movement

To programmatically move the cursor or selection through the document, call the editor.moveCursorInDirection or editor.expandSelectionInDirection methods with a direction argument. The direction can be either "forward" or "backward".

// Move the cursor backward one character
element.editor.moveCursorInDirection("backward")

// Expand the end of the selection forward by one character
element.editor.expandSelectionInDirection("forward")

Converting Positions to Pixel Offsets

Sometimes you need to know the x and y coordinates of a character at a given position in the editor. For example, you might want to absolutely position a pop-up menu element below the editor’s cursor.

Call the editor.getClientRectAtPosition method with a position argument to get a DOMRect instance representing the left and top offsets, width, and height of the character at the given position.

var rect = element.editor.getClientRectAtPosition(0)
[rect.left, rect.top]  // [17, 49]

Inserting and Deleting Text

The editor interface provides methods for inserting, replacing, and deleting text at the current selection.

To insert or replace text, begin by setting the selected range, then call one of the insertion methods below. Trix will first remove any selected text, then insert the new text at the start position of the selected range.

Inserting Plain Text

To insert unformatted text into the document, call the editor.insertString method.

// Insert “Hello” at the beginning of the document
element.editor.setSelectedRange([0, 0])
element.editor.insertString("Hello")

Inserting HTML

To insert HTML into the document, call the editor.insertHTML method. Trix will first convert the HTML into its internal document model. During this conversion, any formatting that cannot be represented in a Trix document will be lost.

// Insert a bold “Hello” at the beginning of the document
element.editor.setSelectedRange([0, 0])
element.editor.insertHTML("<strong>Hello</strong>")

Inserting a File

To insert a DOM File object into the document, call the editor.insertFile method. Trix will insert a pending attachment for the file as if you had dragged and dropped it onto the editor.

// Insert the selected file from the first file input element
var file = document.querySelector("input[type=file]").file
element.editor.insertFile(file)

Inserting a Content Attachment

Content attachments are self-contained units of HTML that behave like files in the editor. They can be moved or removed, but not edited directly, and are represented by a single character position in the document model.

To insert HTML as an attachment, create a Trix.Attachment with a content attribute and call the editor.insertAttachment method. The HTML inside a content attachment is not subject to Trix’s document conversion rules and will be rendered as-is.

var attachment = new Trix.Attachment({ content: '<span class="mention">@trix</span>' })
element.editor.insertAttachment(attachment)

Inserting a Line Break

To insert a line break, call the editor.insertLineBreak method, which is functionally equivalent to pressing the return key.

// Insert “Hello\n”
element.editor.insertString("Hello")
element.editor.insertLineBreak()

Deleting Text

If the current selection is collapsed, you can simulate deleting text before or after the cursor with the editor.deleteInDirection method.

// “Backspace” the first character in the document
element.editor.setSelectedRange([1, 1])
element.editor.deleteInDirection("backward")

// Delete the second character in the document
element.editor.setSelectedRange([1, 1])
element.editor.deleteInDirection("forward")

To delete a range of text, first set the selected range, then call editor.deleteInDirection with either direction as the argument.

// Delete the first five characters
element.editor.setSelectedRange([0, 4])
element.editor.deleteInDirection("forward")

Working With Attributes and Nesting

Trix represents formatting as sets of attributes applied across ranges of a document.

By default, Trix supports the inline attributes bold, italic, href, and strike, and the block-level attributes heading1, quote, code, bullet, and number.

Applying Formatting

To apply formatting to the current selection, use the editor.activateAttribute method.

element.editor.insertString("Hello")
element.editor.setSelectedRange([0, 5])
element.editor.activateAttribute("bold")

To set the href attribute, pass a URL as the second argument to editor.activateAttribute.

element.editor.insertString("Trix")
element.editor.setSelectedRange([0, 4])
element.editor.activateAttribute("href", "https://trix-editor.org/")

Removing Formatting

Use the editor.deactivateAttribute method to remove formatting from a selection.

element.editor.setSelectedRange([2, 4])
element.editor.deactivateAttribute("bold")

Formatting With a Collapsed Selection

If you activate or deactivate attributes when the selection is collapsed, your formatting changes will apply to the text inserted by any subsequent calls to editor.insertString.

element.editor.activateAttribute("italic")
element.editor.insertString("This is italic")

Adjusting the Nesting Level

To adjust the nesting level of quotes, bulleted lists, or numbered lists, call the editor.increaseNestingLevel and editor.decreaseNestingLevel methods.

element.editor.activateAttribute("quote")
element.editor.increaseNestingLevel()
element.editor.decreaseNestingLevel()

Using Undo and Redo

Trix editors support unlimited undo and redo. Successive typing and formatting changes are consolidated together at five-second intervals; all other input changes are recorded individually in undo history.

Call the editor.undo and editor.redo methods to perform an undo or redo operation.

element.editor.undo()
element.editor.redo()

Changes you make through the editor interface will not automatically record undo entries. You can save your own undo entries by calling the editor.recordUndoEntry method with a description argument.

element.editor.recordUndoEntry("Insert Text")
element.editor.insertString("Hello")

Loading and Saving Editor State

Serialize an editor’s state with JSON.stringify and restore saved state with the editor.loadJSON method. The serialized state includes the document and current selection, but does not include undo history.

// Save editor state to local storage
localStorage["editorState"] = JSON.stringify(element.editor)

// Restore editor state from local storage
element.editor.loadJSON(JSON.parse(localStorage["editorState"]))

Observing Editor Changes

The <trix-editor> element emits several events which you can use to observe and respond to changes in editor state.

  • trix-before-initialize fires when the <trix-editor> element is attached to the DOM just before Trix installs its editor object. If you need to use a custom Trix configuration you can change Trix.config here.

  • trix-initialize fires when the <trix-editor> element is attached to the DOM and its editor object is ready for use.

  • trix-change fires whenever the editor’s contents have changed.

  • trix-paste fires whenever text is pasted into the editor. The paste property on the event contains the pasted string or html, and the range of the inserted text.

  • trix-selection-change fires any time the selected range changes in the editor.

  • trix-focus and trix-blur fire when the editor gains or loses focus, respectively.

  • trix-file-accept fires when a file is dropped or inserted into the editor. You can access the DOM File object through the file property on the event. Call preventDefault on the event to prevent attaching the file to the document.

  • trix-attachment-add fires after an attachment is added to the document. You can access the Trix attachment object through the attachment property on the event. If the attachment object has a file property, you should store this file remotely and set the attachment’s URL attribute. See the attachment example for detailed information.

  • trix-attachment-remove fires when an attachment is removed from the document. You can access the Trix attachment object through the attachment property on the event. You may wish to use this event to clean up remotely stored files.

Contributing to Trix

Trix is open-source software, freely distributable under the terms of an MIT-style license. The source code is hosted on GitHub.

We welcome contributions in the form of bug reports, pull requests, or thoughtful discussions in the GitHub issue tracker. Please see the Code of Conduct for our pledge to contributors.

Trix was created by Javan Makhmali and Sam Stephenson, with development sponsored by 37signals.

Building From Source

Trix uses Yarn to manage dependencies and Rollup to bundle its source.

Install development dependencies with:

$ yarn install

To generate distribution files run:

$ yarn build

Developing In-Browser

You can run a watch process to automatically generate distribution files when your source file change:

$ yarn watch

When the watch process is running you can run a web server to serve the compiled assets:

$ yarn dev

With the development server running, you can visit /index.html to see a Trix debugger inspector, or /test.html to run the tests on a browser.

For easier development, you can watch for changes to the JavaScript and style files, and serve the results in a browser, with a single command:

$ yarn start

Running Tests

You can also run the test in a headless mode with:

$ yarn test

© 37signals, LLC.

trix's People

Contributors

abstractcoder avatar afcapel avatar andersgm avatar conormuirhead avatar dctalbot avatar dependabot[bot] avatar dhh avatar drewrygh avatar genezys avatar hopsoft avatar javan avatar josefarias avatar kevinmcconnell avatar mitar avatar mrhead avatar nali avatar northeastprince avatar olimart avatar pdewacht avatar qrush avatar raulchedrese avatar readmecritic avatar rluba avatar seanpdoyle avatar shimbaco avatar smridge avatar sstephenson avatar t27duck avatar teeparham avatar zzak avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

trix's Issues

List within quote within list => weird result

I was playing around with the Trix demo trying to put multiple paragraphs inside a list item. I seems Trix's document model for an item is just one block element followed by zero or more sublist items? IMHO that's too restrictive but that's your call and I at least applaud Trix for enforcing its model consistently.

But a list item can consist of a quote, which in turn can contain multiple block elements of all kinds.
When one of these elements is in turn a list, clearly buggy things happens:

2015-10-26-160834_728x753_scrot

The main bug is that pressing Enter instead of continuing the inner list appears to continue the outer list and restart the inner. Additionally at the bottom "baz" which was suppossed to be a sublist of "bar" shows a double inner bullet. (The "WAT?" line is not particularly buggy.)
Don't know if these are just styling issues or model issues.

Raw HTML editing mode

We'd like to use this editor as part of a tool that allows users to send emails. Some of those users are extremely good with HTML (designing and testing email is their job), so the lack of a raw html mode is a deal breaker for us. Is that something on your roadmap?

Attachment DOM is messy

I really like how trix sanitized DOM elements when you paste in rich-text content. To assure that things are really clean I also use a sanitizer on the server side before the content is stored into the database.

But I am having issues with attachments. The DOM for attachments it really messy, it has span elements with classes, data attributes, and so on. It is much more complicated to allow such complicated DOM inside attachments, but cleaning DOM elsewhere.

I wonder why all that has to be stored in the resulting HTML? How I see it it would be best if there would be a clean HTML, but I would also store JSON serialization of the editor into the database. So when a user wants to edit content again, I load the JSON serialization of the editor. But when I am displaying the content itself to other users, I can use a clean HTML.

So if I understand correctly, all those extra attributes are in DOM attachments because you are doing extra server-side processing on those DOM attachments and have to parse the HTML to do that? And to be able to know that those are attachments when you start editing old content?

Compatibility with At.js

In the gif demos that @javan provided, he showed the ability to "mention" a person through a dropdown. Does Trix support this out of the box? Or will someone have to write an a custom API to join Trix and At.js (or somthing else) together?

Provide non-minimized dist files

I am making Meteor package and it would be really great if there would be also non-minimized dist files generated by default. Then it is easier to include them into the package and leave to Meteor overall minimization to minimize them at the end, but possible debugging and inspection is much easier with non-minimized versions.

The Dread Webkit-Fake-URL Pasted Image Issue

I was just playing around copying formatting from an RTF doc in TextEdit, when I saw that copy/pasting that includes an image, in the current Safari (9.0), appears to insert the image but doesn't actually upload an attachment. I poked around, and it looks to be a long-known, unfixable issue:

https://bugs.webkit.org/show_bug.cgi?id=49141

I promise I'm not a jerk who jumped to this immediately! I hadn't heard of it before. Sounds like there's only mitigation strategies to choose from: alert the user, strip the image on paste, that kinda thing. Apologies if this is only unaddressed in the demo (i.e. and not in Basecamp); on the off chance it was also news to you I figured you'd want to know about it!

Integrating With Forms design

The current way to submit the value is

<input id="x" type="hidden" name="content">
<trix-editor input="x"></trix-editor>

This is clunky and requires establishing a global id.
Perhaps instead a name attribute on the trix-editor should create the hidden input itself?

<trix-editor name="x"></trix-editor>

The editor can create a hidden input with the name x and put it next to itself.

Similar for value setting:

<input id="x" value="Editor content goes here" type="hidden" name="content">
<trix-editor input="x"></trix-editor>
<trix-editor name="content" value="Editor content goes here"></trix-editor>

Korean(2 bytes) has problem on Chrome

Youtube Video about error

I found another problem.
when I tried to write Korean on Chrome, the focus was out of editor and I couldn't find what I wrote.

But, on Safari, there is no problem at all.

I don't know why this error occurred, I think maybe 2bytes characters can cause this problem.

Custom blocks of content (like math equations)

It would be great to support custom block of content, where from the perspective of Trix it would be some type of content (like <math>1+1</math>) but in reality it would be rendered into a custom HTML (with for example MathJax). So that there would be some API to wrap that block and talk to it. This would then allow custom HTML tags which are rendered with something else under the hood. (Math equations is just an example.)

Setting text style in Chrome on Android

How can I set text style in Chrome on Android?

When I type anything after clicking on "Bold", normal text is rendered. Also, unlike Chrome on desktop, I can't select text in Chrome on Android.

I am using Chrome 46 (Android 5.0).

Provide a demo

Sorry If it's not an issue but by see in action I didn't actually understood role of trix. A standalone demo might be more helpful.

blockquote and code buttons don't play well together

It's not entirely clear what behavior is intended, but I'm fairly confident that the current behavior is not the intended behavior. If you enter a paragraph and alternately click the <blockquote> button and the <code> button, you'll get something like this:

image

(As an aside, it is extremely helpful that Trix permits things like italics and bolding inside <code> blocks—it might be the only editor to do this, and this is something badly needed on the web today, in my opinion.)

Support for tables

It seems there is no support for Tables in trix? Is this on the roadmap or something that has been intentionally left out?

Trix and Razor

Hi,

How can I bind Trix with an HTML helper in Razor within a form, since an usual input is like:
@Html.TextAreaFor(x => x.Content, 3, 1, new { @Class = "form-control", style = "width:300px" })

this renders an input control with the id="content" but this at runtime

thnx

Can't change list item style then make it a sublist

Minor inconvenience:
If I want to create bullet list inside a numbered list, or vice versa, I can do it in this order:

  1. after an item press Enter,

->

  1. after an item press Enter,
    1. increase indent,

->

  1. after an item press Enter,
    • increase indent, switch to bullets (or vice versa)

But if I switch the list style before making it a sublist:

  1. after an item press Enter,
  • switch to bullets (or vice versa)

then I'm stuck: the increase-indent button becomes disabled.

Formatting is applying algorithm

Hello,

This is not an issue at all but a request for some one from core team to write about how formatting (attributes) are applied to document.

The output is super clean so I want some insights :)

Don't always accept files

So far the API of the editor is great and it is controllable from the HTML.

However, we still need to handled files you drag and drop on the editor.
This means that we either need to listen and upload the files or call preventDefault. Both options require JavaScript involvement. Clearly we can't configure uploading easily without JavaScript, but we can choose not to accept any files:

<trix-editor no-uploads>

Even better, consider making accepting files explicit. If no listeners have been added to the trix-attachment-add event, do not accept any files dropped. This will require even less work for the caller to achieve best user experience.

Documenting: links break things

If you have a link in your data, if you don't htmlentities your value then it can break.

Please add that to the documentation.

Do not require a closing tag

The documentation states that Trix "won’t load any HTML content inside a <trix-editor>…</trix-editor> tag". Ideally, of course, this should, indeed, work, just like <textarea>. (In which case #48 can be improved)

If it's impossible, though, why is the closing tag required? Consider making it a singular tag, like <input>:

<form>
  <input name=username>
  <trix-editor class=comment>
</form>

Attaching a file, deleting it, and undoing the deletion does not provide file anymore

If I attach a file, delete the attachment, undo the deletion of the attachment, trix-attachment-add event is triggered again, but attachment.file is null. Thus, if I delete the file on trix-attachment-remove, there is no way to really undo the deletion. Also, the second trix-attachment-add event does not contain any information that it is an undo.

Roadmap Questions

Your friendly neighborhood magnet issue for "is X coming?" and "what about Y?"

Questions so far:

  • More font attributes? Size, face, color, underline, …
  • More block styles? Left/right/center text alignment, headings, …
  • Other writing systems? RTL and other BiDi scripts
  • Tables?
  • Attachment helpers? Upload file, take camera photo, …
  • Other editing modes? Markdown, raw HTML, …
  • Other output formats? Markdown/Textile/…
  • Integration with other frameworks? Angular/React/…
  • API for internal HTML attachments? Support @mentions with e.g. At.js, do a lo-fi task list with [ ] checkboxes, …
  • Drag to reposition attachments? Rather than cut/paste only.
  • Paste handlers? e.g. for automatic embedding
  • API to customize toolbar? Simpler than having to implement from scratch

Code Within Code

I experimented with trix and got, what I found to be, curious behavior.

I can make a code block, then a bullet list within the code block , then more code on that list item, then another list in that code block, etc.

image

Perhaps lists should not be allowed in a code block?

Attaching an image, deselecting it, shows an error in Chrome

In Chrome 46.0.2490.80, if I on demo site drag an image, it gets uploaded and selected. If I then click outside of the editor area, I get the following error in the console:

GET blob:http%3A//trix-editor.org/cdc9f6a2-4112-48d6-91bc-c1516cdc28fd 404 (Not Found)

For some reason a request for a placeholder file is tried? But the image has already been successfully uploaded before I deselected it, and placeholder was replaced. Where is this request/error coming from?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.