Goals
Goals for this Structure Proposal
Knowledge Structure
Hypermedia sites should enable an expressive intellectual structure for creators. Good organization should be easy to create, but the responsibility for creating well-organized content ultimately lies with the creators.
Map to Presentation
The site and document structure should declare a framework for how content should be presented. It does not need to be pixel-perfect, but instead provide a guideline for client implementers so that content can be presented roughly in-line with the expectations of the creators.
Coherence and clarity of API
Site and document model should have well-defined terms, and the API should reflect the goals and principles described here.
Consistency
The Hypermedia API should be consistent throughout, when it comes to naming and design patterns.
Minimalist
Hypermedia Sites should avoid extra complexity, to reduce the implementation cost and to make it easier to learn.
Non-Goals
Changes/Operations API
This proposal describes the structure of the current state of a site. For now, the signed permanent data describes changes to the site+document model. These signed changes will be documented elsewhere.
Previous design, backwards compatibility, implementation path
Seed Hypermedia has an existing implementation with certain constraints. This proposal does not take any limitations from the existing system. Instead it is a clean approach and may make backwards-incompatible changes. If we decide that sites+documents should have this structure, we can decide what the migration strategy is. Or if we want to bend this proposal to the existing implementation
Incomplete Implementations Acceptable
Here we are focusing on the approach to the design, not on specific features. Some features described are very low-priority, and we won't ever need to implement them. The idea is to sketch our current feature requests into this model so we can figure out how they would be implemented if we do decided to build them.
Site
A Site is the container for Documents. It may be published independently to the web.
Each Document in a Site is addressed using a Path.
Documents in a Site may contain Capabilities, which grant permissions to other Accounts to edit a Document (and optionally to Sub-Documents)
Hypermedia URLs are created for all Documents in the Site by using the Site ID plus the Document Path.
Home Document
Every Site must have a Document with an empty Path, which is used as the main Document to introduce readers to the content.
Sub-Document
Any Document with a Path is a Sub-Document because it is organized within another document.
The Path of a Sub-Document is prefixed with the Path of the parent Document. For example:
/teams is a Sub-Document of the Home Document
/teams/mercedes is a Sub-Document of the /teams Document
Document
A Document is the base of organizing knowledge. It is comparable to a single PDF or web page. A document describes what may appear within a single window at one time.
Content
The Document Content contains the full message that the authors are intending to share. It is saved inside the content field.
Attributes
A Document contains the following Attributes which are used to describe the Document, as well as some presentation preferences:
Name
Icon
Width
Navigation
Every Document has a Document Navigation. By default, the Navigation will be the Navigation View of the Document Content. (Previously known as the outline).
The Document may have a navigation field defined, which will override the Content that is used to generate the Navigation. This allows authors to control how readers will go deeper into the content, and will probably contain Cards and Queries that expose Sub-Documents.
A Document Navigation can include an embed of the document itself, which allows an "outline" to appear in the Navigation UI, helping the reader jump around headings inside the document.
Theme
Values from the theme field are special because they affect the syle of Sub-Documents in addition to the document itself.
The Seed app will probably only allow theme customization from the Site Home, but the protocol theoretically supports the Theme on any document.
"theme": {
"colors": {},
}Example Snapshot
{
"name": "My Document",
"icon": "ipfs://1234",
"content": BlockNode[]
"navigation": BlockNode[],
"theme": {...}
...attributes
}Comment
A Comment contains hierarchal Content from a single author that is attached to a single document, known as the Target Document of the comment.
Blocks and Block Hierarchy
Blocks
A Block is a single node of content, and it often contains text.
The Block Node is the fundamental building block for creating structures of content within a document. It contains a single Block as well as an ordered set of children BlockNodes. Generally, a BlockNode may contain any type of child blocks.
Generally, Blocks and Block Nodes form Content in the Hypermedia Structure
ID
Every Block has an ID that allows it to be referenced directly
Type
Specify one of the pre-defined Block Types
Text
A string field on the Block
Link
Some blocks such as Embeds make a reference to something else, and the common link attribute is used
Attributes
A Block can contain additional data known as Attributes to describe more details of how it can be used.
Text Blocks
Many Block types contain the text value. If a Block does, it may contain a list of Annotations to make the text more expressive.
Block Types
Text/Paragraph
Standard text in a Document
Heading
Provide structure to a Document. Used to organize a Document and Navigation
Image, Video, File
Multimedia Blocks. The text of these blocks is the "caption" of the media element
Code
Format a block of text as code, optionally specifying the language
Embed
An embed is a reference to another Document or Comment, with a view specified which changes the presentation. May refer to a whole Document, a Block or BlockNode within, or a Range of text.
The Embed Block has a view Attribute which specifies which type of embed it is:
Content Embed View
Show the full content that is referenced.
Card Embed View
A special block representation for another Document that appears inside
Navigation Embed View
Show the Navigation Structure of another document
Query
Look up the Sub-Documents of a Document in the Site, and present them as as cards or within the Navigation View of the document. Contains the following:
URL, reference to the Site or Document to query
Recursive
Feature
Visually emphasize this content with a full-width background. The text of this block is a type of Heading, and the Children are visually inside this background. The background may be a color or an image, and there may be an image associated with the Feature Block.
Button
Button Block shows a button with a link to the web or another Document
Activity
The Activity Block shows the comments, version history, and activity summary of Sub-Documents.
Metadata
Show the Document title, authors, and version history for the Document
Annotation Types
Bold, Italic, Underline, Code
Simple text styling attributes that may be applied to a range of text
Link
Specify a range of text to link to a web URL, or a Hypermedia URL (Document, Document Block, Comment)
Embed
This annotation applies to a single special character in the text which allows you to embed the title or portion of text from another document into this place of the text
Presentation
The Client is the app or web software that is responsible for rendering the Hypermedia Structure.
The Body is the author-controlled area of a Site and Document. On the web Client, it takes up the whole window (matching the html <body>). In desktop Clients, it takes up the main view (under the app's title bar, right of the navigation sidebar, left of the panels, and above the app footer)
Here we define the Presentation: how Sites and Documents should be rendered by the Client inside the Body.
Visual summary of the suggested Presentation
Site Header
The Site Header is meant to show the reader what Site they are inside, and give access to the Site Navigation and other features that the Client provides, such as access to the mobile menu.
The Home Document may specify a layout for the header that the Client should respect, to enable different visual styles for the Header. For example, a layout for center-aligned Navigation under the Site Logo.
Site Logo
The Site Logo is determined by the attributes of the Home Document.
If the logo attribute is set, use the image from there.
Otherwise, the Site Logo is created by combining the name and icon of the Home Document.
Navigation
The Navigation Views of a Document should always be easily accessible while the Document is open. For a Site Home Document, it should appear in the Site Header (or be accessible from the Header, if there is not enough space). If space allows, the Navigation should be visible in the Sidebar.
Site Home
Breadcrumb
Shows the parent Documents and may give access to the Home Document
Note: The Breadcrumb may have different presentation styles— it does not have to take the form factor of traditional breadcrumbs (for example it may be a dropdown or a vertical list of parents) This would be decided by the Client and may be informed by Document Attributes.
Site Home Mobile Breadcrumbs
Subdocument Mobile Breadcrumbs
Mobile Support
To support phone-sized screens, a Client should give easy access to the Navigation of the document. To ease navigation across the site, the navigation should have its own Breadcrumb that helps the user access the Navigation of Parent Documents and the Site Home.
This strikes a balance of keeping the UI minimal and focused, while giving the reader easy access to navigate across the site.
Content Presentation
Content is rendered by vertically stacking all the Blocks.
Hierarchy
Header Blocks are rendered with larger bold text, and nested Headers should be smaller to help the reader visually understand the structure of the Content.
Children Blocks are generally indented, unless they appear within a Header block. Under a Header, the hierarchy should be visually apparent without using blank horizontal space to indicate it.
Collapsing
Clients should support the ability for a reader to Collapse, hiding all children of a Block Node. This will help the reader hide content they are not interested in, or aren't ready to read yet.
Navigation Presentation
The Navigation Presentation is intended to help the user move around the content.
The Navigation Presentation will vary depending on the context where the Navigation is shown. For example:
Site Header shows Navigation Links as a horizontal list, and children Navigation Links are within dropdowns that appear on hover.
The Sidebar shows a vertical list of Navigation Links, and children links are indented beneath
Navigation Links
A hierarchy of links
Navigation Block Types
Critically, many blocks will not be shown in the Navigation Presentation. The following blocks will appear:
Heading: Shown as navigation links, clicking will go to the Document with the Heading Block Node highlighted, or a focus view of the Block Node
Feature: Same as Heading blocks
Embeds
Card View: Appaear as regular navigation links
Content View: Embed the Navigation Presentation of the referenced Content
Navigation Embeds: Embed the Navigation of the referenced Document
Query: Each result of the query is shown as a navigation link
Embed Views
When the Navigation Content includes an Embed Block, the view attibute is critical to define the Navigation Presentation.
FAQ
Addressing questions that pop up. (Ready for the team to set fire to this proposal!)
Sidebar Navigation
Q: What if an author wants the sidebar to be used for navigating within the Home Document of a site
A:
Example Document Snapshots
Site with Outline Navigation
A document snapshot of a Home Document:
{
"name": "F1 Fans",
"content": [
{
"block": {
"id": "block1",
"type": "Heading",
"text": "Teams",
"style": "h1"
},
"children": [
{
"block": {
"id": "block2",
"type": "Heading",
"text": "Ferrari"
},
"children": [
{
"block": {
"id": "block3",
"type": "Paragraph",
"text": "Founded by Enzo Ferrari in 1929"
}
}
]
},
{
"block": {
"id": "block2",
"type": "Heading",
"text": "Mercedes"
},
"children": [
{
"block": {
"id": "block3",
"type": "Paragraph",
"text": "First raced in 1954"
}
}
]
}
]
}
]
}This Document will have the following Navigation structure. Because the navigation is not explicitly defined in the document, the nav is an Outline of the Document content:
Teams
Ferrari
Mercedes
Site with Shared Sidebar
A Sub-Document may embed the navigation of a parent document. Imagine there is a document /teams/ferarri:
{
"name": "Ferrari",
"content": [],
"navigation": [
{
"block": {
"id": "block1",
"type": "Heading",
"text": "Drivers",
"style": "h1"
},
"children": [
{
"block": {
"id": "block2",
"type": "Embed",
"link": "hm://123/teams/ferrari/drivers/louis-hamilton",
"view": "Card"
}
},
{
"block": {
"id": "block3",
"type": "Embed",
"link": "hm://123/teams/ferrari/drivers/charles-leclerc",
"view": "Card"
}
}
]
}
]
}This Document will have the navigation structure:
Drivers
Louis Hamilton
Charles Leclerk
The driver document is located at /teams/ferrari/drivers/louis-hamilton:
{
"name": "Louis Hamilton",
"content": [],
"navigation": [
{
"block": {
"id": "block1",
"type": "Embed",
"link": "hm://123/teams/ferrari",
"view": "Navigation"
}
}
]
}The navigation structure matches the drivers doc. When you click on "Louis Hamilton" from the drivers navigaion, the Louis page highlights and the navigation content stays the same.