修订内容
- 6fc23b4
Validate npm trusted publishing from GitHub Actions
No runtime changes. This release exercises the trusted-publishing (OIDC) release path so the Trusted Publisher configuration is bound to the repository.
最新更新与功能特性。查看每个版本有哪些变化。
Validate npm trusted publishing from GitHub Actions
No runtime changes. This release exercises the trusted-publishing (OIDC) release path so the Trusted Publisher configuration is bound to the repository.
Make the Cloudflare account configurable, and publish through the npm CLI
The account ID in cloudflare.config.ts was inherited from the upstream
project and pointed at someone else's Cloudflare account. It now reads
CLOUDFLARE_ACCOUNT_ID from the environment, falling back to the previous
value.
The release flow has moved to the npm CLI (pnpm release:npm). The npm CLI is
the only client that implements npm's trusted publishing (OIDC), so CI can
publish with the job's OIDC token once a Trusted Publisher is configured on
npmjs.com for the package — no long-lived NPM_TOKEN secret.
Serve the docs from lark-ui.tapeless.eu.org, and restore the icon prop to the registry
lark-ui.tapeless.eu.org.Badge.icon and Button.icon are back in the component registry. The
Icon | ReactNode prop type is not representable as a JSON schema, so the
generator dropped the whole prop; they are now injected through
ADDITIONAL_COMPONENT_PROPS like the other manual overrides. The registry
cache version was bumped so the change takes effect without --no-cache.Banner.theme's description no longer names the internal class it was
modelled on.Round the dot in the middle of a checked radio
The indicator element carried the dot's white fill but had no border radius,
so it painted a white 6×6 square around the round dot sitting inside it. The
indicator is now rounded-full, matching Feishu's circular dot.
Lighten the segmented Tabs track
The segmented variant painted its track background twice: an absolutely
positioned track element and the tab list each carried
bg-lark-tag-neutral-bg, so the two translucent layers stacked into ~19%
black and the unselected part of the track came out as #cbcece over the
#f5f6f7 canvas.
The redundant track element is gone and the tab list now carries the
background on its own, using bg-lark-control (#eff0f1 light / #262626
dark) — the same token the segmented Radio group uses. The overflow
scroll-fade gradient now uses lark-control too, so it no longer leaves a
seam against the track.
Add a masked option to ClipboardText for sensitive values that should be hidden initially and revealed on demand.
Refresh DatePicker's styling. Days are 32px squares in 36px columns with 8px between weeks and 14px text, and the previous and next buttons are borderless squares that match the days. Two-month views sit side by side, range bands are rounded at their ends and where weeks wrap, and month and year dropdowns (captionLayout="dropdown") are styled.
DatePicker now uses Lark tokens instead of hard-coded colors, so it follows the active theme, and @lark-ui/core/styles/standalone now styles it too. Month-change animations respect prefers-reduced-motion.
The .rdp-* rules and --rdp-* variables in lark.css are gone, apart from the month-change animations. If you customized DatePicker through them, use the classNames prop instead.
Fix the toast bump animation cutting off a toast's slide-in when the same id is added again while the toast is still entering. Duplicate adds through createLarkToastManager() now bump too, and toast motion respects prefers-reduced-motion. Toast surface styles now live on an inner [data-lark-part="surface"] element instead of the role="dialog" root.
Field no longer renders a <label> when it would be empty: when label and labelTooltip are each undefined, null, a boolean or "", and there is no "(optional)" indicator. This fixes Input, InputArea and TagInput without a label but with a description or error: they no longer show an empty row above the control, and their aria-label is no longer replaced by an empty accessible name.
Format generated primitive and theme files with Oxfmt so codegen does not create formatting-only changes.
Hide the native scrollbars of the LayerDialog body and Sidebar content with Lark's own CSS. Base UI only hides them with a style element it injects into the document head, so client routers that swap the head (such as Astro's ClientRouter) or a Content Security Policy that blocks inline styles could leave empty scrollbar tracks along the dialog body.
Add a full-width LayerDialog.Separator for dividing sections of dialog body content.
Tooltip now keeps its own trigger out of the tab order while the tooltip is disabled. This applies only when Lark renders the trigger (no render or asChild), for example around truncated Text that needs a tooltip only when it overflows. A disabled tooltip there has nothing to reveal, so keyboard users no longer stop on it. Custom triggers passed through render keep their own focus behavior.
Add the xAxisHideLabelOverlap prop to TimeseriesChart, defaulting to true.
Match CodeHighlighted loading and error fallback styling to highlighted code. Reset host app backgrounds, borders, and pre border radii to keep the frame and spacing consistent while syntax colors load.
Fix disabled Input text color. It used an undefined text-lark-disabled token, so disabled inputs looked the same as enabled ones. It now uses text-lark-inactive.
Fix Pagination page validation. The page input only accepts whole numbers written as digits, so it no longer calls setPage with NaN, fractions, or values like 0x10 and 1e1. Invalid input now restores the current page. With totalCount={0}, or when page is past the last page, Next and Last are disabled and nothing requests page 0.
Fix three TagInput bugs:
readOnly now prevents all value changes. Tags can no longer be removed with their remove buttons or Backspace, and new tags can't be added by typing, pasting, or blurring.name, each tag is submitted as its own form value, so the empty draft is no longer sent. With required, validation passes as soon as there is at least one tag.Fix TimeseriesChart crashing with RangeError: Maximum call stack size exceeded on large datasets. Marker clustering no longer spreads every timestamp into Math.max/Math.min, and is skipped entirely when the chart has no markers.
Add tooltipTimestampFormat to TimeseriesChart for formatting standard and marker tooltip timestamps in a consumer-selected time zone.
Add a segmented appearance to Radio groups for compact, mutually exclusive choices.
Add appearance="card" and orientation to Checkbox.Group, plus appearance and description to Checkbox.Item. Card groups render as one card with dividers (rows when vertical, a two-column grid when horizontal), matching Radio.Group's card appearance.
DropdownMenu submenu and row improvements:
data-popup-open).bg-lark-tint highlight and rounded-md radius.SubContent's default sideOffset and alignOffset depend on the resolved side, so they stay correct if the submenu has to move above or below the trigger.data-starting-style / data-ending-style (the old data-[state=*] classes never matched).DropdownMenu.Positioner and DropdownMenu.Popup parts. Content and SubContent are built from them, and you can compose them yourself. DropdownMenu.Portal now respects LarkPortalProvider.SubTrigger's icon prop accepts Icon | ReactNode.gap-2, so element and component icons line up identically.inset still forces it.Add Base UI-style composable Popover parts while preserving the legacy Popover.Content API.
Render Radio.Group cards as one card with dividers (rows when vertical, a two-column grid when horizontal), give card radio controls a 1px ring, and tighten card groups' legend and description gaps to match Field.
Allow translating optional markers and label tooltip accessible names with LarkLocaleProvider, with Label-level overrides for custom content.
Add Slider component for picking a number, or a range between two numbers, by dragging a thumb along a track. Built on Base UI's Slider: pass an array to value or defaultValue for a range. Shows each thumb's value in a badge below the track and the minimum and maximum at either end, formats them with format, and supports sm and base sizes.
Allow LayerDialog actions to use a ButtonGroup split button for related alternate submit outcomes.
Fix Autocomplete highlighted item background to use bg-lark-tint, matching Combobox and Select.
Apply dropdown icon spacing and sizing to element icons while preserving their custom classes.
Bump @base-ui/react to 1.9.0. Brings Base UI bug fixes across Menu, Popover, Select, Combobox, Drawer, Dialog, and more, plus the preview menu filtering primitives (Menu.FilterProvider, Menu.Input) via @lark-ui/core/primitives/menu.
Button and LinkButton: optically center text by lifting it slightly, and trim the leading padding when an icon precedes text so the icon side matches the trailing padding.
Stop throwing on malformed URL hashes while syncing table-of-contents sections. Hashes that can't be percent-decoded are matched as-is, so ids containing a literal % still deep-link.
Keep Popover arrows visible when content clips or scrolls by using a compatibility-safe opacity transition.
Remove unused Tabs indicator entrance animation styles.
Keep transient copy feedback visible until the final repeated copy click settles across Lark copy controls.
Fix Flow connectors bending when nodes have a top margin by aligning connector offsets with their anchors.
Match a linkable Badge's focus outline to its pill shape.
Replace the internal class merging dependency with cn.
Stop LayerDialog.Body from clipping the top of its first child. The body now has a little top padding so a leading input's border and focus ring stay visible, and the top scroll fade no longer masks content in Safari before the scroll area is measured.
Restore LayerDialog.Actions.Primary and LayerDialogPrimaryProps as deprecated aliases of LayerDialog.Action and LayerDialogActionProps, so dialogs written against 2.14 keep working.
Fix Loader crashing with can't access property "height" in browsers with SVG disabled (e.g. Tor Browser at the "Safest" security level). The spinner is now sized via width/height SVG attributes instead of an inline style. Note that sizing classes passed via className (e.g. size-4) now take precedence over the size prop.
Hide outside-month dates by default in multi-month DatePicker views so dates and range highlights are not duplicated between panels. Preserve single-month behavior and explicit showOutsideDays overrides.
Fire Sidebar.Collapsible onOpenChangeComplete when the sidebar or mobile drawer shows or hides an open section. Before, the callback fired only when the section itself toggled.
Stop logging runtime warnings for deprecated Text heading variants. The variants remain marked as deprecated in the TypeScript API.
Render the Sidebar.MenuSub guide line as an aria-hidden list item so the sub-menu list only contains <li> children.
Slider: render the current value badge in the high-contrast (black) color instead of the brand blue, with a subtle grey fill when disabled. The filled track is now lighter in dark mode so it stands out from the background.
Fix Flow nodes with a custom render element briefly laying out at the wrong position on mount. Unpositioned nodes are now measured as absolutely positioned elements, so their first reported width matches their final width.
TagInput: ignore Enter, comma and Tab while an IME composition is active, so confirming a Japanese/Chinese/Korean conversion no longer creates a tag early.
Preserve ButtonGroup's outer corners while an overlay control is open.
Prevent Select separators from causing a horizontal scrollbar.
Update the Cloudflare logo cloud colors to match the current brand asset.
Update the bundled Base UI dependency to version 1.8.0 and expose its Combobox item collection and functional Toast update APIs.
Add ButtonGroup component for joining a small set of tightly-coupled buttons into a single control — most commonly a split button (a primary action next to a dropdown trigger). Handles layout only: children keep their own variant, size, and shape while the group flattens inner corners and overlaps borders so the buttons share one seam. Renders role="group". For grouping multiple independent buttons or inputs, use Toolbar instead.
Add sidebar open-change completion callbacks.
Add the TagInput component for creating and removing free-form values.
Add InlineCopyText, a compact borderless copy control for short values in dense interfaces and table cells. It accepts string or rich children, Text typography props excluding heading variants, an explicit copied value for rich content, localized accessible labels, inline success feedback, and hover or focus icon reveal.
Add an optional yAxisMinInterval prop to TimeseriesChart for discrete data.
Add support for footer text below TimeseriesChart tooltip values.
Add a strict responsive LayerDialog component with automatic dismissal composition, alert-dialog semantics, mobile drawer behavior, and application-wide defaults for its built-in close and cancel copy through LarkLocaleProvider.
Add GlobeMap, an SVG orthographic globe with boundary-free hatched land, horizon-faded geographic markers, optional geographic guides, pointer and keyboard rotation, automatic rotation, Lark-themed tooltips, and no WebGL or ECharts requirement.
Reset the native fieldset padding in radio and checkbox groups.
Refine Empty state typography and balance description text when it wraps.
Support nested LayerDialog drawers with independently layered backdrops and responsive mobile actions.
Add a plain CodeHighlighted variant for frameless, padding-free code blocks with a correctly positioned copy button.
Document app-root CSS isolation for reliable stacking of portaled components.
Update formatting for Vite+ 0.3.1.
Use the up/down double chevron in Combobox value and input triggers to match Select.
Add a visual regression contract for truncating text in default Tooltip triggers.
Add scrollItemIntoView() to preserve the position of visible sidebar items while honoring alignment for offscreen items.
Allow default Tooltip trigger children to control their line height, preventing inherited text from being clipped.
Position dialogs near the top of the viewport instead of vertically centering them.
Use the elevated surface color for even rows in the default Table variant.
fix(select): align the trigger surface with form controls
Select triggers now use bg-lark-control, including their open and disabled
states, so they match Input, Combobox, and the rest of the form-control family.
Consumer background classes can still override the default without using
!important. The popup remains on the floating bg-lark-base surface.
fix(select): anchor the popup below the trigger and expose placement props
Select.Positioner relied on Base UI's alignItemWithTrigger default (true),
which overlays the popup on the trigger so the selected option's text lands on
the trigger's value text, emulating a native <select>. Options always render at
text-base, so on xs/sm triggers the popup was much taller than its anchor,
and Base UI's compensating shift detached it from the trigger — on xs it
overhung by 12.5px above and 45.5px below and sat 8px to the left, covering
adjacent content.
The popup now prefers bottom placement and is offset from the trigger, with
Base UI's collision avoidance still flipping it automatically when the preferred
side lacks space. Placement is configurable:
| prop | default | notes |
|---|---|---|
side | "bottom" | preferred side; still flips automatically on collision |
sideOffset | 4 | gap between trigger and popup, matching Combobox/Autocomplete |
align | "start" | alignment along the trigger edge |
alignOffset | — | additional offset along the alignment axis |
alignItemWithTrigger | false | opt back in to the native <select> overlay |
The remaining Base UI Positioner controls are also forwarded unchanged:
anchor, arrowPadding, positionMethod, collisionAvoidance,
collisionBoundary, collisionPadding, sticky, and
disableAnchorTracking.
The popup also now tracks the trigger width via min-w-(--anchor-width) instead
of min-w-[calc(var(--anchor-width)+3px)], which existed to visually offset the
old item-alignment shift.
Allow non-heading Text variants to inherit line height from their surrounding context.
Make Combobox.Input sit flush with the top and sides of Combobox.Content and remove its bottom corner rounding.
Reduce the trailing inset for buttons inside large InputGroup addons.