Repository navigation
Releases: pguijas/folioh
Releases · pguijas/folioh
Release list
folioh 0.3.1
Changed
- The product and public repository are Folioh. The website is
folioh.site. - The command and release binary are
folioh. Workspace crates use the
folioh-*prefix, environment variables useFOLIOH_*, and generated paths
and template namespaces usefolioh. - GitHub Pages previews use the configured Pages domain and base path.
- To upgrade an existing Folio installation, run the installer at
https://folioh.site/install.shand usefolioh. Existingfolio
installations are retained. UseFOLIOH_*
environment variables with the new command. Older binaries retain their
previous command, settings and release archive names.
folio 0.3.0
Added
theme.logoshows in the landing navbar in place of the monogram.- The navbar theme picker offers fifteen choices in three families: six Folio
styles, five Folio Pastel palettes and four Omarchy palettes. Each swatch applies
a complete color-and-style recipe. Project and registered presets keep all their
choices; earlier saved styles and palettes continue to render unchanged. - Customize opens from the final circle in the swatch row, inside the same
popup with a live preview. It offers background, text and accent colors
per mode, plus typography, rhythm, corners, borders and layout. Choices
apply and save immediately; Done closes the picker and keeps them. - Motion and drawer CSS variables:
--folio-motion-*,--folio-ease-enter,
--folio-ease-exit,--folio-spring-drawerand--folio-drawer-*. A
theme sets--folio-drawer-inset: 0,--folio-drawer-width: 100vw,
--folio-drawer-radius: 0and--folio-drawer-shadow: nonefor a
full-screen menu. - The Omarchy preset, inspired by Omarchy: one theme
with four selected palettes, each light or dark only,
with flat square navbar and chapter rows, a palette-tinted pixel background
and a block-letter Folio wordmark, also visible in picker previews.
The pixels flow, follow the mouse with a soft halo and release a wave on
click or hold. The wordmark cycles through four reconstructions on entry,
palette change or replay by click, Enter or Space. Omarchy palette changes
have a brief diagonal transition in supporting browsers. Reduced motion
leaves the artwork and palette changes still; hidden or offscreen artwork
pauses, and neighbouring previews stay static.
Other projects keep their own name. The palettes come from the
MIT-licensed omacom/omarchy repository;THIRD-PARTY-NOTICES.mdcarries
its notice. - The Terminal typography (
fontId: "terminal"): a monospaced body under
Geist headings. - Folio Pastel is the default for new sites and
folio init, with Ink's
pen-blue palette, Grotesque typography and 0.75rem corners. Ink, Jade,
Lavender, Peach and Sky support light and dark with the same shapes.
Existing reader choices survive the default change; older saved Pastel
choices without a palette keep Jade. Project defaults still override
preset defaults. Its palettes and irregular silhouettes are Folio's own; layout,
measurements, motion timings and component CSS adapt cojeev.
THIRD-PARTY-NOTICES.mdretains its MIT notice and the fonts' OFL notice. - Pastel draws the docs shell after cojeev: a 288 px floating sidebar with
integrated branding, search and controls, and a reading trail that marks
the section in view. Three original, soft asymmetric silhouettes morph,
drift and respond to the pointer above a soft color wash. The landing
places them in solid, contrasting palette colors around the product
demo, outside the title and text flow; content and actions stay intact.
Reduced motion keeps them still; hidden and offscreen artwork pauses,
and neighbouring previews stay static. The picker shares the page's
layout, type and artwork. - Pastel callouts keep their functional icons on soft asymmetric holders.
FeatureCard keeps named Hugeicons centered over four original organic
backgrounds, alternating with the card colors; text/emoji fallback and
cards without icons stay unchanged. Decorative masks, number tabs and
timeline markers use original organic outlines, with ruled connectors
and FileTree elbows. - Pastel tabs, code groups, example tabs and the Preview/Code switch are
pills with a selected surface that glides between them, and accordions and
Markdown details are soft cards that open in 300 ms and close in 180 ms. - Pastel code blocks are paper sheets with a file header and language pill,
with five syntax roles in each scheme. TerminalSession is a petrol window
with three stationery tabs. Cards, pill badges, dot-grid previews, dashed
empty states and flush tables retain the adapted component layout. - Under Pastel, switching between light and dark reveals the new scheme as
a circle growing from the control over 300 ms, where the browser supports
view transitions. Under reduced motion the scheme changes at once. - The Grotesque typography (
fontId: "grotesque"): Bricolage Grotesque
headings over a DM Sans body, from Google Fonts. The files are not
preloaded, so a site on another typography downloads neither. - One CSS file per component family under
app/styles/, imported at the
end ofglobals.css, so a theme package can restyle a family by
overriding one file. The MDX components carrydata-slotattributes, and
data-variantwhere they come in kinds (a callout's type, a checklist
item's state), for that CSS to target. - Kbd, Marker and Term, in every theme: keycaps (a bare
<kbd>in page
content too), labelled dividers between two dashed rules withokand
dangertones, and inline definitions that open on hover, focus or tap.
Under Pastel their adapted component styles follow the chosen palette. - Tone variables for the six callout types,
--folio-tone-<type>-fill,
-inkand-accent, and--folio-surface-radiusfor the corner of a
raised surface.
Changed
- Folio styles use stationery names: Letterpress, Ballpoint, Notebook,
Paperback, Roller and Typewriter. Existing preset IDs and saved preferences
remain compatible; Roller remains an explicit choice. - Callouts draw six distinct tones, one per type, from the tone variables on
every preset;note,tipandcheckno longer share the primary color. - On a phone, the docs menu is a drawer that floats 12 px from the screen
edges and springs in from the left over a dimmed page. It is a modal
dialog with a title and a close button: Esc, the close button and a tap
outside close it, focus stays inside it while it is open, and the rest of
the page is inert. Under reduced motion, docs pages drop their transitions
and animations at every width; otherwise desktop does not change. - The theme drawer in the docs sidebar is removed; its controls are the
picker's Customize step, on every page and on phones.ThemeConfigurator
renders nothing and stays exported, so a layout that mounts it still
builds. - The landing no longer shows its own light/dark button;
theme.header.theme_toggle: trueadds one to the landing and the docs
navbars alike. - The carousel arrows and swipes browse each color-and-style variant in
swatch order, continuing across families. Neighbouring previews show
the recipes they select. Navigating applies the selected theme to the page
immediately, without a separate confirmation. - Choosing a variant restores its configured style. The site preset uses
theme.tuneandtheme.radius; Reset in Customize clears manual changes. - Manual colors also work on fixed-scheme Omarchy palettes and persist
through the initial theme bootstrap without a color flash. - A theme package that overrides
components/theme-configurator.tsxkeeps
the exports the picker imports; the root layout mounts
ThemeStyleBootstrap, and page overrides no longer need their own. - A theme package whose
theme/project-theme.tsexports
projectThemeDefaultConfigas an untyped literal no longer fails the
frontend type check. The bundled configurator reads it with every key
optional, so the literal may leave keys out ("does not exist on type") and
may setcustomizationkeys the configurator also defaults, such as
fontIdorcolorId("specified more than once").
Fixed
- Theme previews show real text, section rules and workspace frames, so
typography and spacing differences remain visible alongside colors. - Going from the docs to the landing page by the logo keeps the reader's
theme. - The landing navbar takes the theme's navbar height, and landing headings
and code boxes follow the theme's heading font and code background. - Under
folio serve, a docs page no longer turns into "Element type is
invalid" when it is reloaded or opened from the landing page. Pages under
folio servecarry no "Last updated" line; a build still shows it on
authored pages.
folio 0.3.0-a1
Added
- Folio is one native Rust binary,
folio, installed byinstall.shfrom
GitHub Releases. It replaces thefolio-docsPython package and needs no
Python;folio buildandfolio servestill render through the bundled
Next.js template with Node.js 20.19+ and pnpm 10. - The commands:
folio init,build,serve,coverage,cleanand
roadmap, with the hiddengithub-pagesgroup behind the preview
workflows. - Built-in integrations: landing page, roadmap and OpenAPI are compiled in and
activate through theirdocs.yamlsections (landing:,roadmap:,
openapi:). public:lists project-relative files served verbatim from the site root;
a missing file, or a path outside the project or inside.build/or the
output directory, fails the build.- The Next.js template ships inside the binary and is materialised once under
the user cache directory;FOLIO_TEMPLATE_DIRoverrides it. folio --updatereplaces the binary with the latest GitHub release: it
followsreleases/latest, downloads the platform archive andSHA256SUMS,
verifies the archive and swaps it in place with the installer's tools,
curlandtar.FOLIO_REPOis shared with the installer;
FOLIO_RELEASES_URLpoints it at a mirror.- JavaScript sources:
source.javascript.pathsreads.js,.mjsand.cjs
statically, without Node or a bundler. A module is named after its path
(utils/index.jsisutils), and the ESM and CommonJS exports of each file
— functions, generators, classes with their getters, setters and static
members, and constants — are published with their JSDoc under
api-reference/javascript/. A setter beside its getter reads as the
getter, which takes the setter's JSDoc when it has none of its own, and a
static member that shares its name with an instance one has its own anchor.
node_modulesis never read and.jsxis skipped with a warning. - Rust sources:
source.rust.pathsreads crates statically, without cargo or a
Rust toolchain. Folio takes the crate name fromCargo.toml, follows the
pub moddeclarations fromlib.rsormain.rs, and publishes public
functions, structs, enums, traits, impl blocks and type aliases with their
signatures, attributes and///comments underapi-reference/rust/.
folio servewatches.rsfiles, and a syntax error fails the build naming
the file. theme.packagetakes a mapping naming a git repository, a revision and a
sha256:digest, so a theme someone else published installs in four lines
instead of a copied directory. The package is fetched into the user cache
once, keyed by the digest, and the tree is verified against it before any
build reads it. A local package still works exactly as before.- A Troubleshooting guide for the messages a build most often stops or
warns on — the environment check,Config file not found, unknown config
keys, a stale incremental build, the port, broken links and the export
log — each with its cause and the page that fixes it. Architecture gained the agent-facing surface it always
emitted:llms.txt, the Markdown mirrors and_folio/contract.json. - Agent-readable output from the same build as the HTML:
llms.txt,
llms-full.txt, a Markdown mirror per page, declared as atext/markdown
alternate and listed in the sitemap, and the authoring contract at
/_folio/contract.json.folio servepublishes the same files as a static
build. - Custom components (
components:), custom templates (template.path),
template overlays (template.overlay_path), project themes, Pagefind search,
GitHub Pages branch previews and the MDX component library. folio initdetects Rust (Cargo.toml) and JavaScript (package.json)
projects as well as Python ones and writes their source roots; an existing
docs/without Markdown gets anindex.md.- A typo in a top-level
docs.yamlkey or inside a core section is reported
with the key it most likely meant; the keys insidelanding:,roadmap:
andopenapi:are not checked yet, apart from a roadmap phase's. An unknown
landing section type or hero variant warns. theme.logoshows in the docs navbar under the base path; a logo file that
does not exist stops the build.- A missing page is a themed 404 with a way back, at any depth, and a docs
root without an index page opens the API reference.
Changed
- Folio is now licensed under MIT (previously AGPL-3.0-only).
- Release archives ship THIRD-PARTY-NOTICES.md next to LICENSE, with the
licenses of the bundled shadcn/ui components and of the code adapted from
docstring_parser (MIT) and CPython (PSF License Version 2). - Docs pages no longer show an "Edit this page" link, and the feedback link
opens an issue inproject.repo. Without arepo, neither link is shown;
both used to point at Nextra's own repository. folio serveno longer builds the example projects underdocs/examples/
on its own: each one is a full nested site, and a coldserveof Folio's own
repository spent minutes on four of them before the dev server came up. The
Previewsrow says what was skipped,folio serve --previewsbuilds them,
aDocPreviewwhose example is not built says so in its place, and
folio buildstill builds every example. The nested builds share the
workspace'snode_modulesthrough a link instead of installing their own.- A full build no longer rebuilds every preview example. Each published
example carries the digest of its sources, the Folio version, the template
and the base path it is built for; one whose digest still matches is left
alone, and thePreviewsrow reports what was rebuilt, what was unchanged
and what was swept. An example is a
whole nested build, so a warm build of Folio's own site stops paying for
four of them. - The
Dependenciesrow names the phase it is in while it runs, rather than
readingchecking pnpmthrough apnpm installthat can take minutes. folio servecoalesces source events into one batch per save, reuses
unchanged search-index work, and writes a generated file only when its bytes
change.- The repository is flat: the crates, the guides, the template and the theme
sit at the root, and every crate keeps the tests and the fixtures those tests
read. Thefoliobinary is built byfolio-cli. Plugin::nameandPlugin::config_keysreturn owned values, and the
extension-registry types serialize, so an extension can be described as data.
Nothing loads dynamically yet; this is groundwork for the plugin seam.- A theme package may no longer ship
package.json,pnpm-lock.yamlor
pnpm-workspace.yaml; a fetched one may not shipnext.config.mjseither.
Acomponents:entry may no longer point outside the project directory. - The theme package digest that keys the incremental build context is computed
with a length-prefixed encoding, so it identifies one tree and only one. The
first build after upgrading recomputes it once. - Config keys are typed: string and boolean keys are checked, an explicit
nullfor a string or boolean key is an error (anullproject.name
warns and falls back toUntitled, andnav,public,template.pathand
source.docsreadnullas absent), and each field reports its own
message. Aplugins:key warns and is ignored; the authoring contract's
configKeysnever lists it. output:is rejected when it names, or contains, a configured source
directory or the repository's.git, or sits inside.git: the build
removes the output directory before writing to it.- The
navlist orders real top-level entries and ignores unknown labels. - Landing defaults name no
pip installcommand and no.pykicker; an
omittedinstall:renders no install block and the third default card reads
"Built-in Integrations". - The roadmap groups phases by
project; the generated/docs/roadmap/page
is a# Roadmapheading over the timeline. --version, the banner and generated metadata read0.3.0-a1.- The landing
funnelplate draws its sources and outputs as compact tiles —
an icon and a plain label, in two columns with alternating margins — instead
of path cards;guarantees,captionandcommand_notesare retired and
warn. - Relative links between pages resolve to their docs route when the page is
written, a relative link whose..climbs out of the docs is reported as
broken, and the link check reads thehrefprops of components too. - Underscore route aliases name the hyphenated route as their canonical (and
arenoindexwhen noproject.urlis set); they stay out of the search
index, and so do the page actions. - A
theme.presetortunevalue the configurator does not offer stops the
build naming the nearest one;dark_mode: falsekeeps the site light with
no mode controls. - A roadmap phase the renderer cannot read fails before the build, naming the
entry: a missing or non-string field, astatusother thanshipped,
active,nextorlater, a key the phase does not take, or afeatures:
that is not a list of strings andtext/donemappings. A release links
nowhere outside the roadmap. folio serverefuses a busy port before the build starts,folio build --portwithout--openis a usage error, andfolio cleanon a directory
that does not exist is an error instead of nothing to clean; an output
inside.build/is cleaned with it.CodeGrouplabels its tabs from each block's language.- API pages carry more of what the source documents: constants, re-exports,
class attributes, notes and decorators render on the page and in
llms-full.txt; warning, see also, references, todo and deprecated sections
read as labelled prose; Sphinx roles such as:class:read as code; and
every cross-reference lands on an id its page writes. The Markdown mirror of
an API page keeps its class cards and ...