Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
f72b2cd
docs(primitives): rewrite the remaining seven pages to the house format
rpvilo Sep 14, 2026
f85c18c
docs: refresh the package and repo READMEs
rpvilo Sep 14, 2026
e727ca8
refactor(app): move every icon to Tabler and fix the sidebar seam
rpvilo Sep 14, 2026
9f4deb3
docs(handbook): cut the accessibility page back to the boundary
rpvilo Sep 14, 2026
ae33753
refactor(app): use one outlined icon weight everywhere
rpvilo Sep 14, 2026
9a6975c
fix(docs): align the reference tables and surface tokens
rpvilo Sep 14, 2026
7a79f2b
refactor(app): swap Tabler icons for Keyline outlines
rpvilo Oct 7, 2026
6e3c2c6
feat(app): redesign the docs and playground
rpvilo Oct 7, 2026
1b7623d
feat(app): share one sidebar between the docs and the playground
rpvilo Oct 7, 2026
e175d6f
chore(changeset): note the JSDoc and README refresh
rpvilo Oct 7, 2026
d021997
fix(scripts): end a documented part's section at the next h2
rpvilo Oct 7, 2026
222d38c
feat(docs): tint code frames with the theme and keep reference rows o…
rpvilo Oct 8, 2026
eed529d
docs(composer): show createStore in use
rpvilo Oct 8, 2026
888aa44
feat(demos): preview documents on hover in the tabs demo
rpvilo Oct 8, 2026
4081adc
feat(docs): add a changelog page and show the version in the sidebar
rpvilo Oct 8, 2026
78cf117
fix(docs): address CodeRabbit's review on demos, claims and wording
rpvilo Oct 8, 2026
1d9ae5d
chore(demos): drop an unused icon helper
rpvilo Oct 8, 2026
c8c0e6c
fix(docs): let keyboard users reach overflowing reference rows
rpvilo Oct 8, 2026
93d96d6
fix(demos): make the tabs preview actions and replies work
rpvilo Oct 8, 2026
20fc40a
fix(docs): re-measure reference rows when their content resizes
rpvilo Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/docs-part-jsdoc.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@intentface/chat": patch
---

Documentation only, no runtime change. Every part of `Attachments`, `Chip`, `Message`, `Reasoning` and `Steps` now carries JSDoc saying what it is for and which element it renders, so editors show the same reference as the docs site. The package README is refreshed to match the rewritten docs.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ primitives for React — and the documentation site and playground at

The package ships behavior, state, and wire formats with no styling of its own: a contenteditable
composer with commands and chips, a thread with scroll auto-follow, message part segmentation, tool-call
timelines. This is the Base UI model applied to chat — the package owns behavior, you own every class.
timelines, and the app-shell parts around them — a collapsible sidebar, a nav tree, a closable tab
collection. This is the Base UI model applied to chat — the package owns behavior, you own every class.

## Layout

Expand Down
18 changes: 0 additions & 18 deletions app/(chat)/layout.tsx

This file was deleted.

71 changes: 55 additions & 16 deletions app/(docs)/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { ChevronRight } from "@keyline-icons/react";
import { notFound } from "next/navigation";
import { DocsTOC } from "@/components/docs/docs-toc";
import { DocsTopBarTrigger } from "@/components/docs/docs-top-bar-trigger";
import { PageActions } from "@/components/docs/page-actions";
import { getPage, source } from "@/lib/docs/source";
import { ProgressiveBlur } from "@/components/ui/progressive-blur";
import { getPage, getSectionLabel, source } from "@/lib/docs/source";
import { getMDXComponents } from "@/mdx-components";

type PageProps = {
Expand All @@ -17,24 +20,60 @@ export default async function DocsPage(props: PageProps) {
// fumadocs uses an empty slug for the docs index; the raw-markdown route keys
// off the on-disk filename.
const markdownSlug = slug?.length ? slug : ["index"];
const section = getSectionLabel(page.url);

return (
<div className="mx-auto flex w-fit max-w-full gap-10">
<article className="w-full max-w-3xl shrink-0 pb-16">
<header id="overview" className="mb-4 flex flex-col gap-3">
<h1 className="font-semibold text-2xl text-ink-primary tracking-tight">
{page.data.title}
</h1>
{page.data.description && (
<p className="text-lg text-ink-secondary leading-7">{page.data.description}</p>
)}
<PageActions slug={markdownSlug} source={page.data.source} />
</header>
<div className="[&>*:first-child]:mt-0">
<MDXContent components={getMDXComponents()} />
<div className="flex min-h-full flex-col">
<header className="sticky top-0 z-10 isolate flex h-13 shrink-0 items-center justify-between gap-3 px-3">
{/* Content dissolves under the bar instead of cutting off: a progressive
blur plus a fade. */}
<ProgressiveBlur
direction="top"
blurIntensity={0.5}
className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-14 bg-linear-to-b from-secondary-bg to-transparent"
/>
<div className="flex min-w-0 items-center gap-2">
<DocsTopBarTrigger />
<nav aria-label="Breadcrumb" className="flex min-w-0 items-center gap-1.5 text-sm">
{section && (
<>
<span className="shrink-0 text-ink-secondary">{section}</span>
<ChevronRight className="size-3 shrink-0 text-ink-tertiary" aria-hidden />
</>
)}
<span className="truncate font-medium text-ink-primary">{page.data.title}</span>
</nav>
</div>
</article>
<DocsTOC items={page.data.toc} />
<PageActions slug={markdownSlug} source={page.data.source} />
</header>
{/* isolate: demo z-indexes stay inside the page, below the sticky top bar. */}
<div className="isolate flex flex-1">
<div className="flex min-w-0 flex-1 justify-center px-5 pt-7 pb-24 md:px-12">
<article className="w-full min-w-0 max-w-[680px]">
<header id="overview" className="mb-7 flex scroll-mt-20 flex-col gap-2.5">
<h1 className="font-semibold text-[32px] text-ink-primary leading-[38px] tracking-[-0.02em]">
{page.data.title}
</h1>
{page.data.description && (
<p className="max-w-[600px] text-ink-body text-xl leading-[26px]">
{page.data.description}
</p>
)}
</header>
<div className="[&>*:first-child]:mt-0 [&>h2:first-child]:border-0 [&>h2:first-child]:pt-0">
<MDXContent components={getMDXComponents()} />
</div>
</article>
</div>
{/* The changelog lists versions only, not each "Patch Changes" heading. */}
<DocsTOC
items={
page.url === "/changelog"
? page.data.toc.filter((item) => item.depth === 2)
: page.data.toc
}
/>
</div>
</div>
);
}
Expand Down
11 changes: 4 additions & 7 deletions app/(docs)/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import type { ReactNode } from "react";
import { DocsSidebar } from "@/components/docs/docs-sidebar";
import { source } from "@/lib/docs/source";

// The site shell lives in the root layout; the docs only add their own scroller.
// The panel scrolls, not the window, so the frame stays put around it.
export default function DocsLayout({ children }: { children: ReactNode }) {
return (
<div className="flex min-h-screen bg-secondary-bg">
<DocsSidebar tree={source.pageTree} />
<div className="min-w-0 flex-1">
<main className="mx-auto w-full px-4 pt-10 md:px-6">{children}</main>
</div>
<div data-docs-scroll="" className="h-full w-full overflow-y-auto">
{children}
</div>
);
}
Binary file added app/fonts/IoskeleyMono-Medium.woff2
Binary file not shown.
92 changes: 92 additions & 0 deletions app/fonts/IoskeleyMono-OFL.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
Copyright (c) 2025, Ahmed Hatem (https://github.com/ahatem)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL

---

## SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1. Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

1. Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

1. No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

1. The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

1. The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file added app/fonts/IoskeleyMono-Regular.woff2
Binary file not shown.
Binary file added app/fonts/IoskeleyMono-SemiBold.woff2
Binary file not shown.
Loading
Loading