Changelog
Every published release of the @pockets-ui packages, generated from the changesets that shipped with each version. Packages version together in lockstep, so one version number covers the whole scope.
v4.0.1
@pockets-ui/components
fix(build): emit a single
"use client"directive at the top of each bundleBun's bundler kept every source module's
"use client"directive inline as a bare statement, so the published bundles carried one mid-file per component. Turbopack rejects directives outside the file prologue, which broke Next.js apps importing the packages. The build now strips the per-module directives and restores one banner per output file.
@pockets-ui/utils
fix(build): emit a single
"use client"directive at the top of each bundleBun's bundler kept every source module's
"use client"directive inline as a bare statement, so the published bundles carried one mid-file per component. Turbopack rejects directives outside the file prologue, which broke Next.js apps importing the packages. The build now strips the per-module directives and restores one banner per output file.
v4.0.0
@pockets-ui/components
Panda CSS v2:
@pockets-ui/componentsis now the design system.@pockets-ui/componentsowns the theme (tokens, recipes, conditions) and publishes its own generated styled-system as@pockets-ui/components/{css,jsx,recipes,tokens,patterns,types}.@pockets-ui/theme,@pockets-ui/styled,@pockets-ui/cli, and@pockets-ui/postcssare gone;@pockets-ui/tokens-nativenow generates from@pockets-ui/components/theme. Panda v2 requires Node 22+.**Migrating a consumer**
Before:
sh bun add @pockets-ui/components @pockets-ui/styled @pockets-ui/theme @pockets-ui/postcss @pockets-ui/utils @pockets-ui/cli bunx pockets-ui init bunx pockets-ui codegenAfter:
sh bun remove @pockets-ui/styled @pockets-ui/theme @pockets-ui/postcss @pockets-ui/cli bun add @pockets-ui/components bun add -D @pandacss/dev @pandacss/postcss # or @pandacss/vite / @pandacss/bun1. Rename
pockets.config.tstopanda.config.tsand point it at the design system:ts import { defineConfig } from "@pandacss/dev";export default defineConfig({ designSystem: "@pockets-ui/components", include: ["./app/**/*.{ts,tsx}", "./src/**/*.{ts,tsx}"], // optional, same as before: theme: { extend: { tokens: { fonts: { heading: { value: "var(--font-x)" } } } }, }, });
Do not list
@pockets-ui/componentsininclude, and do not setprefix,hash, orseparator— the design system owns them.2.
postcss.config.*: replace"@pockets-ui/postcss": {}with"@pandacss/postcss": {}.3. Scripts: replace
pockets-ui codegenwithpanda codegen(prepare,predev, orprebuild). It writes a thinstyled-system/shim into your app that re-exportsjsx,recipes, andpatternsfrom the package and generates your owncss()and tokens.4. Imports:
@pockets-ui/styled/css→ your app'sstyled-system/css(or@pockets-ui/components/cssif you extend nothing);@pockets-ui/styled/recipes→styled-system/recipesor@pockets-ui/components/recipes. Component imports from@pockets-ui/componentsare unchanged.5. Keep
@layer reset, base, tokens, recipes, utilities;in your global CSS.**Consume without Panda**:
import "@pockets-ui/components/styles.css"ships every recipe variant and text style pre-built. On that path only recipe variants are styled —css()and style props on the components have no matching CSS.**Behaviour changes from Panda v2**: compound variants emit one class each; CSS variables are declared with
@property(Chrome 85+, Safari 16.4+, Firefox 128+);createStyleContextis gone fromjsx— the components usecreateSlotRecipeContext, and every style-context part now carries adata-slotattribute.Add the
8xl(90rem) size token. It is the defaultmaxWidthof Panda'scontainerpattern, which previously resolved to nothing in pockets, so a barecontainer()set no max width.
@pockets-ui/tokens-native
Panda CSS v2:
@pockets-ui/componentsis now the design system.@pockets-ui/componentsowns the theme (tokens, recipes, conditions) and publishes its own generated styled-system as@pockets-ui/components/{css,jsx,recipes,tokens,patterns,types}.@pockets-ui/theme,@pockets-ui/styled,@pockets-ui/cli, and@pockets-ui/postcssare gone;@pockets-ui/tokens-nativenow generates from@pockets-ui/components/theme. Panda v2 requires Node 22+.**Migrating a consumer**
Before:
sh bun add @pockets-ui/components @pockets-ui/styled @pockets-ui/theme @pockets-ui/postcss @pockets-ui/utils @pockets-ui/cli bunx pockets-ui init bunx pockets-ui codegenAfter:
sh bun remove @pockets-ui/styled @pockets-ui/theme @pockets-ui/postcss @pockets-ui/cli bun add @pockets-ui/components bun add -D @pandacss/dev @pandacss/postcss # or @pandacss/vite / @pandacss/bun1. Rename
pockets.config.tstopanda.config.tsand point it at the design system:ts import { defineConfig } from "@pandacss/dev";export default defineConfig({ designSystem: "@pockets-ui/components", include: ["./app/**/*.{ts,tsx}", "./src/**/*.{ts,tsx}"], // optional, same as before: theme: { extend: { tokens: { fonts: { heading: { value: "var(--font-x)" } } } }, }, });
Do not list
@pockets-ui/componentsininclude, and do not setprefix,hash, orseparator— the design system owns them.2.
postcss.config.*: replace"@pockets-ui/postcss": {}with"@pandacss/postcss": {}.3. Scripts: replace
pockets-ui codegenwithpanda codegen(prepare,predev, orprebuild). It writes a thinstyled-system/shim into your app that re-exportsjsx,recipes, andpatternsfrom the package and generates your owncss()and tokens.4. Imports:
@pockets-ui/styled/css→ your app'sstyled-system/css(or@pockets-ui/components/cssif you extend nothing);@pockets-ui/styled/recipes→styled-system/recipesor@pockets-ui/components/recipes. Component imports from@pockets-ui/componentsare unchanged.5. Keep
@layer reset, base, tokens, recipes, utilities;in your global CSS.**Consume without Panda**:
import "@pockets-ui/components/styles.css"ships every recipe variant and text style pre-built. On that path only recipe variants are styled —css()and style props on the components have no matching CSS.**Behaviour changes from Panda v2**: compound variants emit one class each; CSS variables are declared with
@property(Chrome 85+, Safari 16.4+, Firefox 128+);createStyleContextis gone fromjsx— the components usecreateSlotRecipeContext, and every style-context part now carries adata-slotattribute.Add the
8xl(90rem) size token. It is the defaultmaxWidthof Panda'scontainerpattern, which previously resolved to nothing in pockets, so a barecontainer()set no max width.
@pockets-ui/utils
Panda CSS v2:
@pockets-ui/componentsis now the design system.@pockets-ui/componentsowns the theme (tokens, recipes, conditions) and publishes its own generated styled-system as@pockets-ui/components/{css,jsx,recipes,tokens,patterns,types}.@pockets-ui/theme,@pockets-ui/styled,@pockets-ui/cli, and@pockets-ui/postcssare gone;@pockets-ui/tokens-nativenow generates from@pockets-ui/components/theme. Panda v2 requires Node 22+.**Migrating a consumer**
Before:
sh bun add @pockets-ui/components @pockets-ui/styled @pockets-ui/theme @pockets-ui/postcss @pockets-ui/utils @pockets-ui/cli bunx pockets-ui init bunx pockets-ui codegenAfter:
sh bun remove @pockets-ui/styled @pockets-ui/theme @pockets-ui/postcss @pockets-ui/cli bun add @pockets-ui/components bun add -D @pandacss/dev @pandacss/postcss # or @pandacss/vite / @pandacss/bun1. Rename
pockets.config.tstopanda.config.tsand point it at the design system:ts import { defineConfig } from "@pandacss/dev";export default defineConfig({ designSystem: "@pockets-ui/components", include: ["./app/**/*.{ts,tsx}", "./src/**/*.{ts,tsx}"], // optional, same as before: theme: { extend: { tokens: { fonts: { heading: { value: "var(--font-x)" } } } }, }, });
Do not list
@pockets-ui/componentsininclude, and do not setprefix,hash, orseparator— the design system owns them.2.
postcss.config.*: replace"@pockets-ui/postcss": {}with"@pandacss/postcss": {}.3. Scripts: replace
pockets-ui codegenwithpanda codegen(prepare,predev, orprebuild). It writes a thinstyled-system/shim into your app that re-exportsjsx,recipes, andpatternsfrom the package and generates your owncss()and tokens.4. Imports:
@pockets-ui/styled/css→ your app'sstyled-system/css(or@pockets-ui/components/cssif you extend nothing);@pockets-ui/styled/recipes→styled-system/recipesor@pockets-ui/components/recipes. Component imports from@pockets-ui/componentsare unchanged.5. Keep
@layer reset, base, tokens, recipes, utilities;in your global CSS.**Consume without Panda**:
import "@pockets-ui/components/styles.css"ships every recipe variant and text style pre-built. On that path only recipe variants are styled —css()and style props on the components have no matching CSS.**Behaviour changes from Panda v2**: compound variants emit one class each; CSS variables are declared with
@property(Chrome 85+, Safari 16.4+, Firefox 128+);createStyleContextis gone fromjsx— the components usecreateSlotRecipeContext, and every style-context part now carries adata-slotattribute.
v3.8.0
Version-alignment release — no user-facing changes.
v3.7.0
@pockets-ui/components
Every component now takes the full Panda styling surface, not just
css. The 23 hand-written components (Button, Card, Checkbox, Switch, Slider, Meter, ProgressBar, TextField, DateField, Tooltip, Popover, Dialog, Menu, Select, ComboBox, GridList, Table, TagGroup, Toast, Breadcrumbs, RadioGroup, Calendar, DatePicker) are rebuilt on Panda'screateStyleContext— the same pattern Avatar, Banner, and UserCard already used — with the single-element Button and Card onstyled(…, recipe). Every exported part accepts style props (bg,p,gap, …) alongsidecss, a raw Reactstyleobject (previously omitted from the types),className,as, andunstyledto drop the recipe. Generic parts (Select.Root'sitems,DateField's value type,Table.Body, …) keep their type parameters. Two prop types narrowed:Table.Column'swidth/minWidth/maxWidthandPopover/Tooltip/DatePicker.Content'soffsetandCalendar.Grid'soffsetare still react-aria's positioning props, forwarded past Panda's same-named style props.
v3.6.0
@pockets-ui/components
Add
Avatar— a compound component (Root,Image,Fallback,Badge,Group,GroupCount) with the shadcn/Base UI avatar API, image load-state fallback, three sizes, and itsavatarslot recipe.Add
UserCard— the member molecule. A compound component whose always-shown header (Avatar,Identity→NameRow→Name+Badge, inlineMetas,Activity,Actions) covers the Network list rows, and whose standardizedDetailsblock (Stats→Stat→StatValue+StatLabel,Section→SectionTitle+Item, and a react-ariaDisclosure→DisclosureTrigger+DisclosurePanel) carries the richer profile-card, dashboard, and feed variants.NameandItemare react-ariaLinks. Root takessize(normal,compact),layout(card— a framed surface with a hairline above the details block — orinline— frameless list rows with hairline dividers), andvariant(outline,elevated), and ships with itsuser-cardslot recipe.TagGroup: add
TagGroup.StaticTag, a display-only tag that never takes part in selection or removal, with anintentprop (neutral,action,info,success,warning,danger,brand,premium) washed from the semanticbg/fgintents. The recipe exposes--pk-tag-bg/--pk-tag-fgfor one-off retheming.
v3.5.0
@pockets-ui/components
Add
ComboBox, a filterable picker built on React Aria'sComboBox. Typing in the field filters the options;selectionMode="multiple"renders the selection as removable tags (viaTagGroup) inside the field, ahead of the input, with the popover staying open while picking and Backspace on an empty input removing the last tag. Ships with thecomboBoxslot recipe in the theme preset.
v3.4.0
@pockets-ui/components
Add Card, a static content surface with a standardized background, radius, and border, with
paddingdensity variants (compact/comfortable/spacious/none) and outline/elevated variants.Extract
createPocketinto a new public@pockets-ui/utilspackage.Fixes a broken publish of
@pockets-ui/components: the bundle shipped a live#create-pocketpackage import whose imports-map target (a.tsxsource file) was not included in the tarball, so any consumer of the published package failed to resolve it at runtime.createPocketis now imported from@pockets-ui/utils(a regular dependency) and the imports map is gone. Declarations now land atdist/index.d.tsinstead ofdist/src/index.d.ts(publishConfig updated accordingly; the public API surface of@pockets-ui/componentsis unchanged).
@pockets-ui/utils
Extract
createPocketinto a new public@pockets-ui/utilspackage.Fixes a broken publish of
@pockets-ui/components: the bundle shipped a live#create-pocketpackage import whose imports-map target (a.tsxsource file) was not included in the tarball, so any consumer of the published package failed to resolve it at runtime.createPocketis now imported from@pockets-ui/utils(a regular dependency) and the imports map is gone. Declarations now land atdist/index.d.tsinstead ofdist/src/index.d.ts(publishConfig updated accordingly; the public API surface of@pockets-ui/componentsis unchanged).
v3.3.0
@pockets-ui/tokens-native
Add
@pockets-ui/tokens-native— the pockets tokens for React Native and ExpoThe web packages ship the design system as a Panda preset compiled to CSS, which native cannot consume: no CSS variables, no selectors, no
rem. This new package carries the same tokens, generated from the samepreset.theme.extendobject Panda uses for the web build, as plain data — dp numbers, hex colors, and the_darkcondition flattened into a second theme object.It has no dependencies (it does not even import
react-native) and is shaped forreact-native-unistyles:ts import { StyleSheet } from "react-native-unistyles"; import { themes } from "@pockets-ui/tokens-native";StyleSheet.configure({ themes, settings: { adaptiveThemes: true } });
src/tokens.generated.tsis checked in, so a token change is reviewable as a diff, and a test re-runs the generator and fails if the output moves — a token retuned in@pockets-ui/themecannot silently go missing on native.Three conversions are lossy and documented in the package README:
- **Shadows** ship twice —
shadowsas faithful RN 0.76+boxShadowlayers, andshadowsLegacycollapsed onto a single layer for the old architecture. - **OKLCH → hex** loses sub-step precision at three decimal places. Under 2/255 everywhere except the two highest-chroma brand anchors, where vermilion
#FF4F01lands as#ff4f07and BP Blue#023AD7as#063ad7— the same values a browser computes from the same OKLCH, so native and web agree. - **Responsive
displaytype styles** split intotextStyles(mobile) andtextStylesMd(tablet), since RN has no media queries.
Component recipes are not included: they are authored against web semantics (
inline-flex,cursor,outline, CSS transitions, and&[data-hovered]selectors from react-aria-components' state model) and need a dedicated resolver to port.- **Shadows** ship twice —
v3.2.0
@pockets-ui/components
Add
Banner— an inline, persistent status message withintent(info/success/warning/danger),variant(subtle/solid/outline), andsize(sm/md).Banner.Rootis an ARIA live region (role="status", orrole="alert"for interruptive messages) andBanner.Closeis a React AriaButton; dismissal works uncontrolled by default, withisOpen/onOpenChangefor controlled use.Banner.Rootis a column:Banner.Headerholds the first line (Banner.Icon,Banner.Title,Banner.Close) andBanner.Content/Banner.Actionsstack below it at full width.Default intent glyphs come from
lucide-react, which@pockets-ui/componentsnow declares as a peer dependency.
v3.1.0
@pockets-ui/components
Widen the React peer dependency range to
^18.3.1 || ^19.The range was pinned to
^19.2.8, the exact version the workspace develops against. Anything on React 18 — or on a React 19 release earlier than 19.2.8 — got a peer conflict on install rather than a resolvable tree, even though neither package uses an API newer than 18.3.Nothing about the installed React changes for consumers already on 19: the range still accepts everything
^19.2.8did.
v3.0.0
@pockets-ui/components
Use
defineRecipefor single-element components instead of modelling them as one-slot slot recipes, and stop double-prefixing recipe class names.Buttonis the first single-element recipe:buttonRecipereplacesbuttonSlotRecipe, it's registered under the preset's newtheme.extend.recipesblock, andbutton(props)now returns a class string rather than a{ root }record.Every recipe's
classNameis now authored bare ("dialog", not"pk-dialog") — thepk-prefix comes from the config'sprefix, which Panda was already prepending on top of it.**Breaking:**
- Call sites that read
button(...).rootmust usebutton(...)directly. - Emitted class names lose the duplicated prefix:
.pk-pk-dialog__content→.pk-dialog__content,.pk-pk-button__root→.pk-button. Stylesheets or tests targeting the oldpk-pk-*classes need updating; the documentedpk-<name>__<slot>form is now what actually ships.
- Call sites that read
Add a
Popovercompound component (Root, Trigger, Content) built on React Aria, with a placement-aware slot recipe (enter/exit animation, focus-managed dialog surface).
v2.1.0
Version-alignment release — no user-facing changes.
v2.0.0
@pockets-ui/components
Add Meter component — a labeled bar displaying a quantity within a known range, built on React Aria's Meter with a
meterslot recipe (root, label, valueText, track, fill).Add Toast component — a compound notification system (Region, Root, Content, Title, Description, Close) built on react-aria-components' toast queue, with a
createToastQueuehelper and thepk-toastslot recipe.Add Breadcrumbs — a compound hierarchy trail (Root, Item, Link, Separator) built on react-aria-components, with its slot recipe.
Add Calendar — a styled react-aria-components Calendar with month navigation, weekday header, and day cells styled via the new
calendarslot recipe (selected, today, unavailable, disabled, and invalid states).Add DatePicker — a compound segmented date field + calendar popover (Root, Label, Control, Input, Trigger, Content) built on react-aria-components, with its slot recipe.
Add GridList — a styled react-aria-components GridList compound (
Root,Item) with keyboard navigation, single/multiple selection (auto-rendered selection checkboxes), row actions, stack/grid layouts, and an empty state, styled via the newgridListslot recipe.Add DateField component — keyboard-editable date input with per-segment editing, built on React Aria's DateField.
Add Menu — a compound action menu (Root, Trigger, Content, Item, SubmenuTrigger, Shortcut, Section, SectionHeader, Separator) built on react-aria-components, with its slot recipe.
Add ProgressBar component — react-aria-components ProgressBar styled via the
progressBarslot recipe, with determinate and indeterminate (sweep animation) states.Add RadioGroup — a compound single-choice control (Root, Label, Item) built on react-aria-components, with its slot recipe.
Add Select — a compound single-choice picker (Root, Label, Trigger, Value, Content, Item) built on react-aria-components, with its slot recipe.
Add Slider — a single- or multi-thumb range input (label, value output, track, fill, thumbs) built on react-aria-components, with its slot recipe.
Add Switch — a styled react-aria-components Switch with track, thumb, and label slots styled via the new
switchRecipeslot recipe (selected, focus-visible, and disabled states driven off RAC data-\* attributes).Add Table — a compound data grid (Root, Header, Column, Body, Row, Cell) built on react-aria-components, styled via the new
tableslot recipe. Includes keyboard navigation, automatic checkbox-selection columns, column sorting with an animated indicator, disabled rows, and an empty state.Add TagGroup compound component (Root, Label, List, Tag) built on react-aria-components, with selection, removal, and the tagGroup slot recipe.
Add Tooltip compound component (Root, Content) built on react-aria-components, with placement-aware arrow and enter/exit animation.
v1.0.0
@pockets-ui/components
Add the
bun component <name>scaffolder and an internalcreatePocketcontext utility (#create-pocketpackage import, not part of the public API). Declaration output moved todist/src/index.d.ts(publishConfig updated accordingly; the runtime bundle is unchanged).@pockets-ui/stylednow declaresreactas a peer dependency, since its generatedjsxruntime imports React.
v0.0.3
@pockets-ui/components
Mark components as Client Components. They're built on react-aria-components, which uses React Context (
createContext) and therefore only runs in Client Components — without a"use client"directive, importing e.g.Buttoninto a Next.js Server Component threw "createContext only works in Client Components".Each component source now carries
"use client", and the bundleddistbuild emits the directive as its first line (via a build banner, since the bundler does not hoist it). Consumers can now import pockets components directly into Server Components without adding their own"use client".
v0.0.2
Version-alignment release — no user-facing changes.
v0.0.1
Initial release of the @pockets-ui scope — theme, styled, components, cli, and postcss — published before per-package changelogs existed.