naked_ui 1.2.0 copy "naked_ui: ^1.2.0" to clipboard
naked_ui: ^1.2.0 copied to clipboard

A library of behavior-first UI components for Flutter that separate state from presentation.

1.2.0 #

Features #

  • Build NakedTooltip on Flutter's RawTooltip for triggers, delays, feedback, animation, hoverable content, and overlay lifetime. Retains 1.1.0 focus, blur, Escape, and collision-resolved OverlayPlacement behaviors.
  • Add NakedTooltip.tooltipKey (GlobalKey<RawTooltipState>) to show the tooltip imperatively via ensureTooltipVisible().

Deprecations #

  • Deprecate NakedTooltip.open, useRootOverlay, and disableHoverableContent for removal in 2.0.0. Setting any of these parameters runs the legacy 1.1.0 implementation. Use tooltipKey to show the tooltip imperatively and onOpenChanged to observe visibility. tooltipKey has no effect when a deprecated parameter is set.

Changed #

  • Clarify NakedCombobox's direct RawAutocomplete composition and retain its lifecycle callbacks. Flutter issue #191928 still allows a pending async result to reopen the options after Escape; the adapter reports that reopen accurately and does not add a second visibility state machine.

Fixes #

  • Allow Escape on a closed NakedTooltip trigger to reach enclosing dismiss actions (such as dialogs or drawers).
  • Deliver uncontrolled NakedTooltip.onOpenChanged notifications after the current frame so callers can safely call setState. Discard pending notifications on disposal, report closure before replacing tooltipKey, and report zero-duration reopens while mounted.
  • Preserve NakedTooltip animation defaults for partial AnimationStyle values, honor reverse curves, and apply style updates without resetting visibility, focus, or raw tooltip state.
  • NakedTextMagnifier now updates its position and focal point when its notifier, size, magnification scale, or vertical shift changes, without waiting for the notifier's next update.
  • A controlled NakedSelect (open + onOpenChanged) now asks its owner before every close, including Escape on the trigger, an ancestor scroll (once when scrolling starts and once when it ends), and a view resize. These used to close the overlay without calling onOpenChanged.
  • Escape on a closed NakedSelect trigger now reaches an enclosing dismiss action, such as the NakedPopover around it. 1.1.0 consumed it.
  • Remove the duplicate horizontal traversal binding from menubar overlays. OverlayPortal preserves the bar ancestry, while menu panels retain their own Home/End bindings; arrow traversal behavior is unchanged.
  • Guard NakedMenu and NakedPopover onCloseRequested callbacks against closed anchors on Flutter 3.41 and 3.47, and avoid restoring focus to a closing menubar trigger when a sibling menu in the same NakedMenubar is already open.
  • Bind Escape directly on dismissible showNakedDialog routes so custom WidgetsApp shortcut maps that omit DismissIntent still dismiss dialogs on Escape while respecting PopScope.
  • Wrap NakedCombobox options overlays in ExcludeFocus (matching Flutter 3.47) so Tab from an open combobox moves focus to the next focusable widget on Flutter 3.41 and 3.44, and guard async optionsBuilder completions after unmount on Flutter 3.41.
  • Preserve other actively focused or hovered NakedTooltip overlays when a blurred tooltip's dismissDelay runs RawTooltip.dismissAllToolTips(), and reset hover/focus state cleanly on Escape or overlay removal.
  • Reset NakedScrollbar hover state when interactive becomes false while hovered, and snap NakedTextMagnifier immediately on widget property updates instead of animating as a line jump.

Evaluated and skipped #

  • Expansible hard-wires a clipped height animation and would drop reverseDuration.
  • RawTooltip still has no per-instance dismiss, controlled open state, root-overlay option, or focus trigger, and ignorePointer needs Flutter 3.44, so the deprecated parameters keep the 1.1.0 implementation.
  • showRawDialog needs Flutter 3.44 and only adds native-window dialogs.

1.1.0 #

Migration #

  • NakedState subclasses now supply equality fields through props, starting with ...super.props. When migrating a manual ==/hashCode override, include its former fields in props; the protected statesEqual and statesHashCode helpers have been removed.

Features #

  • Add NakedCombobox, a headless autocomplete field on RawAutocomplete. Callers own the text field and the options panel. Keyboard highlight, Enter to select, Escape, and async option staleness come from Flutter.
  • Add NakedMenubar on RawMenuAnchorGroup. Menus in the bar close their siblings, switch on hover while one is open, and move with the arrow keys.
  • Add NakedScrollbar on RawScrollbar, with thumb and track colors resolved from hovered and dragged states.
  • Add NakedTextMagnifier on RawMagnifier. NakedTextField now uses it on touch platforms instead of Material's TextMagnifier. Pass magnifierConfiguration to keep the previous Material or Cupertino lens.
  • NakedTextField no longer supplies selection handles or resolves a CupertinoDynamicColor. Pass selectionControls for handles and contextMenuBuilder for the cut, copy, and paste menu. Resolve a dynamic color before passing it as cursorColor.

Docs #

  • Document NakedTooltip as built on RawMenuAnchor. The 1.0 Flutter 3.41 requirement was originally tied to RawTooltip; the tooltip no longer uses it.

1.0.2 #

Fixes #

  • Remove the inner container: true from the NakedSelect trigger's merged semantics. On Flutter 3.44 the overlay made that folded-away node the menu's traversal parent, so the platform received a node with no parent and the macOS accessibility bridge dropped the update and could crash. The trigger still announces one merged node with its label, value, button role, and expanded state.

1.0.1 #

Fixes #

  • Reword the NakedToastScope missing-scope error hint to use WidgetsApp and note that any app host works. Message-only change; no API or behavior change.

1.0.0 #

First stable release. The API is unchanged from 1.0.0-beta.15; this release declares it stable and commits to semantic versioning for future changes.

Development moves to the Remix monorepo (https://github.com/conceptadev/remix), where naked_ui now lives at packages/naked_ui. The package remains independently versioned and published.

1.0.0-beta.15 #

Features #

  • Add NakedToastScope, NakedToastController, and typed toast requests with bounded queues, same-id replacement, lifecycle-aware timers, keyboard dismissal, focus restoration, and status/alert semantics. Presenters retain ownership of visuals and actions.

1.0.0-beta.14 #

Fixes #

  • Link each NakedDisclosure trigger to its controlled panel in the semantics tree. Web relationships now resolve to the current panel DOM node after repeated remounts, while native trigger identity and the panel identifier remain stable.

1.0.0-beta.13 #

Features #

  • Add NakedDisclosure, a standalone headless button-and-panel primitive with controlled and uncontrolled state, accessible expanded semantics, shared widget state, normal panel focus traversal, and optional exit-aware transitions that preserve panel state while closing.

1.0.0-beta.12 #

Features #

  • Add NakedButton.semanticHint on the same Semantics node as the button role, label, enabled state, and tap/long-press actions.
  • Add NakedSelect.semanticValue so the trigger can announce a human-readable selection instead of T.toString(). SemanticsRole.comboBox exists on Flutter 3.41+ but debug semantics still throw Missing checks for role (flutter/flutter#172918), so the trigger keeps the merged button + expanded + value contract.
  • Add NakedRadioGroup, a thin wrapper over Flutter's RadioGroup that supplies what it lacks: a nullable onChanged (null means disabled), a group enabled state radios inherit, and an optional accessible group label. Flutter's RadioGroup keeps the single SemanticsRole.radioGroup node; the label is a plain container around it, never a second role node.

1.0.0-beta.11 #

Features #

  • Add dependency-free NakedLink with Link semantics, optional destination metadata, caller-owned activation, observable hover/focus/press/disabled state, and caller-owned focus nodes. Primary tap, semantic tap, Enter, and Numpad Enter activate; Space and held-key repeats remain unclaimed. Inert Links expose no Link role, destination, focus stop, or tap action.

1.0.0-beta.10 #

Features #

  • Add NakedAccordion.itemBuilder for styling a trigger and panel as one unit. It receives the same NakedAccordionItemState as the trigger builder plus the fully assembled item as its child, and its context resolves NakedAccordionItemState.controllerOf to the authoritative controller shared with the trigger and panel.

Fixes #

  • Track NakedAccordion press state whenever the item is enabled instead of only when onPressChange is supplied, so WidgetState.pressed reaches builders without a callback, and clear the pressed state when the item becomes disabled.

1.0.0-beta.9 #

Fixes #

  • Keep NakedTextField's WidgetState.pressed, onTapChange, and onPressChange synchronized when selection gestures take over; block disabled pointer and selection paths, and defer lifecycle cleanup callbacks to avoid rebuilding while the widget tree is locked.
  • Mark NakedToggleOption semantics as part of a mutually exclusive group, matching Flutter's segmented-control contract for enabled, selected, and disabled options.

1.0.0-beta.8 #

Fixes #

  • Preserve tooltip overlay semantics when semanticLabel is absent or blank, while continuing to avoid duplicate announcements when a non-empty label represents the content on the trigger. Explicit semantics overrides remain authoritative.

1.0.0-beta.7 #

Features #

  • Add NakedSliderState.visualPercentageOf for mapping arbitrary logical fractions to physical track alignment across orientation, text direction, and inversion, while preserving visualPercentageAt thumb placement.

1.0.0-beta.6 #

Fixes #

  • Make NakedTextField honor ambient DefaultSelectionStyle cursor and selection colors, including context-resolved CupertinoDynamicColor variants, while preserving explicit cursor precedence, focus gating, and platform fallbacks.

Maintenance #

  • Point package metadata at the canonical conceptadev/naked_ui repository.

1.0.0-beta.5 #

Breaking changes #

  • Replace alignment-pair overlay positioning with a Radix-shaped OverlayPositionConfig: side, logical alignment, signed side/alignment offsets, collision padding, collision avoidance, and a resolved OverlayPlacement available to overlay descendants after flip or shift.
  • Change NakedSlider from one double value to a nonempty, ordered List<double> values. Callbacks are list-valued; defaults are now min=0, max=100, and step=1. The slider supports arbitrary thumb counts, orientation, inversion, minimum spacing, nearest-thumb pointer selection, non-crossing constraints, and per-thumb focus, labels, formatters, and semantics actions.

Features and behavior changes #

  • Add controlled open / onOpenChanged contracts to Select and Tooltip. Controlled owners may accept or reject trigger, selection, Escape, outside tap, hover, focus, and touch requests without transient visual mutation.
  • Keep Tooltip open while either its trigger or overlay content is hovered, with an opt-out through disableHoverableContent; expose the final collision-resolved placement to tooltip content.
  • Add separate keyed Popover anchors and automatic/manual Tabs activation.
  • Add controlled menu checkbox items and typed radio groups/items with checked roles and mutually-exclusive semantics.
  • Add recursively composable submenus with delayed hover handoff, LTR/RTL open/close arrows, Escape handling, sibling coordination, root dismissal, first-item focus, and trigger-focus restoration.

1.0.0-beta.4 #

Features #

  • Add SemanticsRole.alertDialog support to NakedDialog and a showNakedAlertDialog helper with required non-empty caller-localized names, a non-dismissible outside barrier by default, null cancellation from Escape and platform Back, mandatory focus entry, safe initial-focus selection, closed-loop traversal, and caller-owned focus-node handling. Dismissible barriers require a non-empty localized label. Existing NakedDialog and showNakedDialog defaults remain unchanged.

Behavior changes #

  • Migrate NakedToggleGroup options from independent Tab stops to one roving-focus stop: Tab enters and exits once, arrows and Home/End move focus without selecting, activation proposes the controlled value, and disabled or dynamically removed options repair focus within the group.

1.0.0-beta.3 #

Fixes and hardening #

  • Scope overlay-item builders to their declared state type: NakedMenuItem and NakedSelectOption builders now receive a context containing a matching NakedStateScope<S>, so NakedMenuItemState/NakedSelectOptionState's of/controllerOf helpers resolve to the item state. Downstream code no longer needs NakedButtonState, which leaked the internal button implementation.

1.0.0-beta.2 #

Breaking changes #

  • Require Dart 3.9 and Flutter 3.41, matching the RawTooltip API used by the package.
  • Treat NakedSelect.value as fully controlled, including null; a select without onChanged is now consistently non-interactive.
  • Make NakedAccordionController.values immutable to callers and preserve its observable FIFO ordering.
  • Make NakedStateScope.controllerOf type-specific; generic state helpers now require the requested value type.
  • Require NakedMenu to have either a child or builder, and throw a descriptive error when menu/select items are used outside their owner.

Fixes and hardening #

  • Rebuild controller-driven tabs, prevent duplicate tab selection callbacks, replace duplicated content semantics when semanticLabel is set, and keep orientation-aware Home/End navigation within each tab bar.
  • Apply dialog, tab, menu, and menu-item semantic roles, including selected state for select options.
  • Correct focus-node ownership swaps across controls and remove the redundant focus owner around EditableText.
  • Consolidate overlay positioning, including safe handling of oversized content, and rebuild Popover on the shared anchored-overlay shell.
  • Keep inherited callbacks current, initialize replacement accordion controllers, and scope slider drag-end values to each drag session.
  • Correct example paths in CI workflows and remove redundant dependency steps.

1.0.0-beta.1 #

  • feat(naked-select): add mouseCursor property to NakedSelect
  • refactor(naked-tooltip): replace RawMenuAnchor with RawTooltip
  • fix: stabilize flaky tests (InkSparkle shader + focus mode)

0.2.0-beta.7 #

  • fix: text style handling in NakedTextField
  • feat: improve 3.27-safe semantics for menu, select, accordion, checkbox, radio, slider, and text field

0.2.0-beta.6 #

  • fix: disabled and error state support for NakedTextField

0.2.0-beta.5 #

  • fix: NakedAccordionItemState scope on content
  • refactor: remove NakedMenuController typedef

0.2.0-beta.4 #

  • docs: refine documentation for developer clarity
  • refactor: Simplify NakedTextFieldBuilder signature
  • feat: add excludeSemantics parameter to all widgets

0.2.0-beta.3 #

  • feat: expose StrutStyle to NakedTextField
  • fix: state scope not in the Context
  • feat: recreate NakedTooltip widget
  • refactor: Overlay Rendering
  • docs: Improve the usage examples

0.2.0-beta.2 #

Bug Fixes #

  • Fixed .when method priority order to prioritize active interaction states (dragged) before selection states

Improvements #

  • Added comprehensive test coverage for mixins and utilities

0.2.0-beta.1 #

  • Added: Popover; Toggle

  • API: Standardized state callbacks (onHoverChange/onPressChange/onFocusChange); removed onDisabledState (use enabled); added onSelectChange/onDragChange where applicable

  • Better use of Raw Flutter components where available

  • Accessibility: Improved semantics across button, checkbox, radio, slider, select, tabs, dialog, tooltip

  • Focus/State: Unified focus handling (FocusNodeMixin) and consistent hover/press/selected for builders

  • Architecture: Builder-first APIs (e.g., NakedTextField builder) with state provided via NakedStateScope

0.0.1-dev.2 - 2025-07-03 #

Features #

  • "Naked" - A Behavior-First UI Component Library for Flutter (#579) (c55b55f)
  • Add maybeOf helper to InheritedWidgets and refactor of() (805a37e)
  • Add maybeOf helper to InheritedWidgets and refactor of() (805a37e)
  • Add test for Hover to RadioButton (#601) (8bd0425)
  • Add textStyle prop in NakedTextField (#608) (4b5252b)
  • Implement Tooltip Lifecycle (#603) (2ddbf60)
  • Recreate Button using Naked (#587) (0d55724)
  • Refactor radio and checkbox components with new architecture (#672) (4f3ce7d)

Bug Fixes #

  • Change default autofocus to false in Menu and Select (#609) (76d8736)

Miscellaneous Chores #

0.0.1-dev.0 #

  • Initial development release
  • Core functionality for HeadlessButton component
  • State management via HeadlessInteractiveStateController
  • Support for interactive states (disabled, focused, hovered, pressed)
  • Fully customizable rendering via builder pattern
9
likes
140
points
3.95k
downloads

Documentation

API reference

Publisher

verified publisherleoafarias.com

Weekly Downloads

A library of behavior-first UI components for Flutter that separate state from presentation.

Repository (GitHub)
View/report issues

License

BSD-3-Clause (license)

Dependencies

flutter

More

Packages that depend on naked_ui