Basic Information

{% match item.cover_image_url %} {% when Some with (url) %} Item image {% when None %} No image {% endmatch %}

Square, at least 400x400px. JPG, PNG, or WebP.

Up to 8 extra images shown in a carousel on the item page. The Item Image above stays the card/preview image.

{% for tag in item.tags %} {{ tag.name }} {% if tag.is_primary %}{% endif %} {% if !tag.is_primary %} {% endif %} {% endfor %}
Advanced
Required for Assisted tier. Visible to fans before purchase.
{% match item.content %} {% when crate::types::ItemContent::Text with { body, word_count, reading_time_minutes, .. } %}

Content

{% include "partials/item_text_editor.html" %}
{% when crate::types::ItemContent::Audio with { audio_s3_key, duration_seconds, .. } %}

Audio File

{% include "partials/item_audio_upload.html" %}
{% when crate::types::ItemContent::Video with { video_s3_key, .. } %}

Video File

{% if video_s3_key.is_some() %}Video uploaded. Replace via the content wizard.{% else %}No video uploaded yet. Use the content wizard to upload.{% endif %}

{% when crate::types::ItemContent::Other %} {% endmatch %} {% if item.item_type == "bundle" %}

Bundle Contents ({{ bundle_items.len() }} items)

{% for child in bundle_items %} {% endfor %}
Item Description File
{{ child.title }} {{ child.description }} Manage files
{% if bundle_items.is_empty() %}

No items in this bundle yet. Add a row below.

{% endif %}
{% if !bundleable_items.is_empty() %}
Add existing item
{% endif %}
{% endif %}

Sections ({{ sections.len() }})

Add tabbed content blocks to your public item page: great for Features, Installation, Specs, or FAQ. Buyers see these as tabs below the description. Max 10.

{% if sections.is_empty() %}

No sections yet. Common sections: Features, Installation, Specs, FAQ, Changelog.

{% else %} {% for section in sections %}
{{ section.title }} {{ section.body.chars().count() }} chars
{% endfor %} {% endif %}
Add Section
{# The described markdown editor, named rather than prefixed: three editors share this document and a picker addresses its destination by name, so `body` can only belong to one of them. The id is the string `item-details.js` already reads. See `crate::quasi::rich_field::named`. #} {{ crate::quasi::rich_field::named(None, "new-sec-body", "Body (Markdown)", "Section content...", "", crate::quasi::rich_field::Height::Compact)|safe }} {{ crate::quasi::media_picker::trigger("new-sec-body")|safe }}

Publishing

{% if let Some(scheduled) = item.publish_at %}

Scheduled for {{ scheduled }}.

{% else if item.is_public %}

Unpublishing removes this item from public view but preserves all data.

{% else %}

Publish this item to make it visible to the public.

{% endif %}