Skip to content

Releases

v0.1.5

Choose a tag to compare

@capy-ai capy-ai released this 14 Nov 04:33

This bumps Cipher to 0.1.5 and points the README install line and registry URL at v0.1.5. This body is the release notes.

v0.1.5 ships #31 and #32. Everything in it is additive. With no new props set, existing call sites behave as they do on v0.1.4.

Behavior changes

  • SortableList moved onto the shared sortable model (#31). Its keys, announcements and focus handling are unchanged. One fix: pressing a grip without dragging no longer leaves the item held.

New

  • SortableGrid (#31): items in responsive columns (minItemWidth) that a person puts in order. Each item places its grip from renderItem's handle, for example in a Card's action.
    • A pointer drag moves the item into the slot under the pointer.
    • From the keyboard, Left and Right move one place, and Up and Down move one row. Space or Enter picks up and drops, Escape cancels, and Alt with an arrow moves one step.
    • A held card takes the pop shadow, and isItemDisabled locks an item.
  • DataTable reorder (#31): { onReorder, isRowDisabled? } puts a grip at the start of the first column. A held row takes the selected surface, and the drop edge from data-drop-target shows where it will land, by pointer or Up and Down. onReorder runs once, on drop. It works on flat rows only; leave sort unset while it's on.
  • SortableHandle and SortableAnnouncer (#31): exported from sortable-list for custom sortable surfaces.
  • ErrorState homeLabel and homeLink (#32): the home link's label, and a CipherLink target that goes through the app's router. The home link is crash's secondary action and the default primary action on not-found and forbidden.
  • Glyphs (#32): award, scan-line, scan-search, radar, zap, vault, file-key and users. layout-grid and server are new names for the existing apps and machine shapes.

v0.1.4

Choose a tag to compare

@capy-ai capy-ai released this 14 Nov 03:14

This bumps Cipher to 0.1.4 and points the README install line and registry URL at v0.1.4. This body is the release notes.

v0.1.4 ships #5, #14, #15, #16, #17 and #18.

Breaking or behavior changes

These apply to both consumers, the Infisical v4 app and license-server-go, unless a line says otherwise.

  • Icon props take IconSource (#14). Every prop that took IconName now takes a glyph name or a Lucide component. Names still work as before. Code that types its own values as IconName before passing them in still compiles, but it can switch to IconSource to pass components.
  • MultiSelect description moves under the label (#14). The trailing slot is now meta. Callers that used description for short values such as counts should move them to meta. The app doesn't use MultiSelect. license-server-go should check its call sites.
  • Number inputs lose the browser spin buttons (#14). The arrow keys still step the value.
  • MultiStep validate no longer accepts a string (#5). It returns boolean | void | { fields?, message? }. fields puts each message on the <Field name> with that key, and anything thrown from validate or onComplete becomes a toast.error. Callers that returned a string fail typecheck and need to move to fields or message.
  • Sheet and dialog steps slide by direction (#5). They no longer morph height. Focus goes to the picked option, else the first field. The MultiStep viewport and Accordion content now pad by the focus clearance and give it back as negative margin, so focus rings at their edges are no longer clipped.
  • Sheet and Dialog open on the first form control (#17). FieldHelp and anything marked data-skip-autofocus are skipped.
  • ActivityLog shows the actor first in each row (#17). license-server-go#102 puts the actor in its summary text, so it should drop it there. total is now optional.
  • An untitled Alert gets its tone icon and actions (#17), and the PageHeader description renders a div.
  • List counts rows through context (#15). Rows inside wrapper components, fragments or sections now count toward select-all, eligibility and the empty state.
  • DataTable with pinned actions shrinks the primary column before scrolling sideways (#15). This applies when that column has no width and no wrap set.
  • FilterBar onChange only receives filters that have values (#16). A new filter stays in FilterBar's own state until its picker closes, so URL-backed filters no longer drop a new chip.
  • DateRangePicker commits on Apply only with two months or presets (#16). Then day picks and presets fill a draft that Apply commits and Cancel or Escape discard. A single month without presets still commits each pick immediately. Pass commit="immediate" or commit="apply" to choose explicitly.

New

  • MultiStep: a step can take render: ({ next }) => ... to advance on pick. Steps also take disabledReason, which blocks Continue. Field takes name, and FieldErrors is exported for forms outside MultiStep (#5, #17).
  • ErrorState: actionLabel with actionLink or onAction (#14).
  • Combobox: option group and description, plus createLabel (also on MultiSelect) (#14, #16).
  • Glyphs:
    • flask, package, sparkles, shield and infinity (#14).
    • pencil, cloud, flag, undo, pause, hourglass, alarm, activity, rocket, archive, archive-restore, arrow-right-left, receipt, credit-card, calendar-clock, chart-column, gift and file-text (#17).
  • DataTable:
    • column.wrap, column.footer (a summary row) and column.secondary (a muted second line).
    • isRowMuted.
    • rowProps with data-drop-target for drop indicators.
    • refreshing, also on List.
    • CellLink (#15).
  • DatePicker: a single-date picker with a presets rail (#16).
  • FilterBar: search-only mode, with searchValue, onSearchChange, searchLabel and searchPlaceholder (#16).
  • Select icon, FieldSet legend, description, help and actions, and help on a group Field (#16).
  • ActivityLog: hasMore, empty and per-entry badge (#17).
  • Small props: StatusText size, ChartContainer height and aspect, Button loadingLabel, Badge icon, and Text and SmallText preWrap (#17).
  • Card: badges on the title line, and selected, which uses the choice look. CardChoice makes a whole card one radio or checkbox with a visible mark (#18).
  • StatCard: a stacked metric card with label, value, icon, tone, delta and trend, note, link, plus loading and error states (#18).

Not in this release

The sortable grid and sortable DataTable rows that license-server-go asked for (INF-110) aren't built yet. They're planned for v0.1.5.

v0.1.3

Choose a tag to compare

@capy-ai capy-ai released this 14 Nov 02:25

Bumps Cipher to 0.1.3. The README now installs #v0.1.3, pins the registry example to v0.1.3, and points to the releases page for the latest tag. This body is the release notes.

Breaking or behavior changes

These change what existing call sites render. Check them in the v4 app and in license-server-go when you bump.

  • DataList borders (#24). Lines now sit only between pairs (.dataPair + .dataPair), so a DataList no longer ends with a line under its last item. In compact density, when the list opens with a half-width pair, the first visual row has no top edge. Default spacing is unchanged. Any app CSS that hid or replaced the trailing line can go.
  • DataTable grouped rows (#24, #28).
    • Depth. Rows under groups now start at depth 0, so only getRowChildren rows indent. Grouped tables that looked indented (such as the app's Approval Policies) lose that indent.
    • Shade. Group header rows now use --cipher-paper instead of the header's --cipher-tint, so they stand apart from the header row.
    • Checkbox. In a selectable grouped DataTable, each group row now draws a tri-state checkbox. It selects every selectable row in the group, children included, and it stays in sync with the header select-all. Call sites get it without any change; check that the selection handlers expect whole-group selections.
  • Halftone (#27).
    • Hover effect. Hovering a Card no longer zooms the pattern into larger cells. It grows outward from the anchor at the same cell size, over about a second.
    • Hover strength. halftone-peak-hover rises to 90% in Light and Dark (from 60% and 30%), so every Halftone in a hovered Card reads much stronger.
    • New props. bounds="header", size, reveal="hover" and ambient are opt-in, and a Halftone with none of them set keeps its resting look.
  • Item (#25). Below the 44rem container breakpoint, badges stay beside the title and only meta moves to the end of the title row. Actions with no visible text (an icon button, an icon group or a RowActions menu) now stay inline at every width.
  • Card hint (#25). When a framed Card title is a fragment with a Badge, the dotted hint underline now covers only the text before the first Badge.
  • Boot theme (#25). readBootTheme follows prefers-color-scheme when no preference is stored. It used to fall back to Dark. storageKeys and keys also accept a single key.
  • Calendar (#13). Range ends and a single selected day use the select fill with the selected border instead of solid ink. Days between the ends sit on a quiet band, and today is a dot instead of a fill.

New

  • SortableList (#12). Reorderable rows with a grip handle, keyboard pick up, move and drop, a live region, and onReorder once per committed move. It adds a grip glyph.
  • DateRangePicker and FilterBar (#13). DateRangePicker opens Calendar in range mode with presets. FilterBar gets a "date-range" field type.
  • Field widths (#26). width="xs" | "sm" | "md" on Input (boxed and plain), Select, SelectTrigger and Combobox, backed by new tokens --cipher-size-field-xs, -sm and -md (96, 176 and 256px). A set width doesn't shrink. With no width, fields fill the row as before.
  • Layout (#26). RadioGroup columns={2 | 3 | 4}, and <InlineGrow>, an Inline child that takes the leftover width.
  • TableGroupRow (#28). A group header row for a hand-built Table, with label, meta, actions, a checkbox slot and colSpan. DataTableGroup takes an optional name for its checkbox label.
  • CSS lint (#24). npm run check now flags a border-bottom on *Row, *Pair or *Item selectors that never reset it for the last row.

Not in this release

These are still open and wait for a later release: #5 (sheet steps, advance on pick, field errors, unclipped focus rings), #14 (icon components, ErrorState action, Card description node, Combobox groups, no number spinners), #15 (DataTable wrap, refreshing, summary row and more), #16 (DatePicker, apply-mode DateRangePicker, search-only FilterBar and more), #17 (first-control focus in Sheet and Dialog, untitled Alert, ActivityLog and more) and #18 (Card badges and selected state, CardChoice, StatCard).

v0.1.2

Choose a tag to compare

@capy-ai capy-ai released this 13 Nov 22:20

Breaking changes

Version-free naming (#10). No back-compat aliases are kept, so every consumer (the Infisical app and license-server-go) has to update in this release.

  • V4Scope is now CipherScope, and the .v4 scope class is now .cipher.
  • --v4-* custom properties are now --cipher-*, including the hue tokens.
  • data-v4-* attributes are now data-cipher-*, and .v4-switcher-* classes are now .cipher-switcher-*.
  • The source stylesheet src/v4.css is now src/base.css. The built ./styles.css export (dist/cipher.css) doesn't change. Registry installs now land in src/components/cipher/.
  • These hooks and helpers lose their v4 prefix:
    • usePortalContainer, useCollisionBoundary, useToastLayer, useScheme, useTheme
    • readBootTheme, themes, defaultTheme, legacyThemes, toTheme, themeScheme, themeChain, themedValue, themeStorage
    • the Scheme and ThemeDefinition types
  • V4_TOASTER_ID is now TOASTER_ID, with the value "cipher".
  • useV4ActionBarReserve is now useActionBarReport. top-bar already exports a different useActionBarReserve.
  • v4LiveOrgPath is removed. It describes an app route, so it now lives in the app.
  • readBootTheme and BootLoader take their storage keys and allowPreview from the host (keys and storageKeys). The defaults are cipher-scheme, cipher-theme and cipher-theme-override. Pass your existing keys to keep users' saved themes.

Framed Cards take no description (#19). On variant="framed", description is now typed never. Plain Cards keep it. When a framed table needs an explanation, use the new hint.

Documentation link (#20). DocumentationLinkBadge (ui/documentation-link-badge) is replaced by DocumentationLink (ui/documentation-link):

  • It's an icon-only link with no text, background or border, and subject is required.
  • The variant prop is removed.
  • The data-slot and the registry item are renamed to documentation-link.
  • PageHeader's badges container now has data-slot="page-header-badges".

Added and improved

  • Halftone, hue scopes and grain (#7). Adds ui/halftone and Card's backdrop slot. Hue scopes come from lib/hue: --cipher-hue with data-hue="subtle" | "pop", which drives --cipher-hue-icon, -tint, -soft and -fill. <AppShell grain> paints an opt-in band grain.
  • Bare icon toggles (#9). An icon-only Button with selected or aria-pressed renders bare, and its filled state takes the product hue.
  • Polish (#11):
    • Card links are scoped to the card.
    • The pager select is lighter, toasts sit lower, the calendar is bounded, and sheet footers keep their buttons in one row.
  • Framed Card hint (#19). A dotted underline on the title, plus a plain-text Tooltip on hover and keyboard focus.
  • DocumentationLink sizes (#20). It sizes itself to where it sits:
    • 32px glyph in a 32x44 hit area beside a page title, and 20px beside a medium title.
    • 12px in Field labels and framed card headers, and 16px everywhere else.
    • size="sm" | "md" | "lg" overrides it, using the new token --cipher-size-icon-2xl.
  • Item rows with actions (#21). A container query at 44rem switches between two layouts:
    • Inline: the timestamp hugs the title on its first-line baseline, with 32px before the buttons.
    • Stacked: the timestamp sits at the end of the title row, and the buttons get their own row.
    • Outline rows get 24px insets and a 2px gap from title to description.
    • The new titleLines prop clamps the title and shows the full title in a Tooltip.
  • Showcase theme switch (#22). It's now one bare sun and moon toggle. This only affects the docs site.