Feather is a Design System which gives Sail developers easy access to a small set of predefined styles.
Feather is implemented as a library of CSS classes, and is bundled with Hawk.
Benefits of opting into Feather's constraints:
Feather uses CSS variables that...
the user can override
respect OS light/dark theme
UIs styled with Feather fit in with the style of Hawk
“birds of a feather flock together”
prose
Class the .prose
class adds blog-like spacing, sizing, and readability styling to semantic children such as p
li
h1
h2
a
etc.
This document uses it.
;article.prose # cool - neat - fine ==
fr jb
fr ja
fr jc
fr js
fr je
fc ac
fc as
fc ae
fc af
wf
width: full
wfc
width: fit-content
mw-page
max-width: page (650px)
hf
height: full
hfc
height: fit-content
the hidden
class hides the element.
loader
indicator parent
loading
loading state
loaded
loaded state
;button.loader =onclick "$(this).toggleClass('htmx-request')" ;span.loaded: toggle load state ;span.loading: ...loading ==
scroll-y
scroll-y: auto
scroll-x
scroll-x: auto
relative
position: relative
sticky
position: sticky
absolute
position: absolute
fixed
postion: fixed
block
display: block
inline
display: inline-block
pre
white-space: pre
pre-line
white-space: pre-line
break
word-break: break-word
action
touch-action: manipulation
Order requires constraints.
Interfaces must work on a mobile web browser.
no element should need to be wider than 300px (but may expand if there is room)
avoid horizontal scrolling
left-click (tap) is the only mouse event
co-locate actionable elements with the elements on which they act
put styling inline
put javascript inline
don't abstract too early
don't fight the browser
animations are optimizations, not features
avoid the client/server distinction by ignoring the existance of the client (use POST forms to change state)
for ephemeral state, prefer text attributes in the DOM over javascript state
network requests should always have indicators
prefer autosave to manually saving
be semantic with your tags
Life evolves through a vital chaos.
;div.any.class(style "any: css;"); ;div =class "any class" =style """ any: css; that-you: want; """ ; == ;style ;+ ;/ %- trip ''' .any-css { that-you: want; } ''' == ;script ;+ ;/ %- trip ''' alert('any js you want'); ''' == ;button =onclick "alert('any js you want')" ; do something ==