Inputs
Radio
Cross-platform extension. iOS 26 patterns this differently — single-select pickers in Settings and Mail use a checkmark on the active list row (see
LiqList), not a classic radio circle. This component ships the more familiar shadcn/ui / forui.dev circle radio for cross-library parity, dressed in iOS 26 visual language (Liquid Glass surfaces, San Francisco type, iOS color palette) so it composes cleanly with the rest of the library.
LiqRadio is the iOS 26 radio circle. It is a 22pt ring that animates
in a centered 12pt filled dot when its value matches the surrounding
groupValue. The visible ring sits inside a 44pt tap target for
comfortable hit testing and renders at 40% opacity when disabled.
Single
import 'package:docs_snippets/src/demo.dart';import 'package:docs_snippets/src/snippet_frame.dart';import 'package:flutter/widgets.dart';import 'package:liqkit_ui/liqkit_ui.dart';/// Snippet builder consumed by `apps/docs_snippets/lib/src/routes.g.dart`.Widget radioSingleBuilder(BuildContext context) { return SnippetFrame( child: LiqDemo<String>( initial: 'a', builder: (v, set) { return Row( mainAxisSize: MainAxisSize.min, children: [ LiqRadio<String>(value: 'a', groupValue: v, onChanged: set), const SizedBox(width: 16), LiqRadio<String>(value: 'b', groupValue: v, onChanged: set), const SizedBox(width: 16), LiqRadio<String>(value: 'c', groupValue: v, onChanged: set), ], ); }, ), );}
Group
import 'package:docs_snippets/src/demo.dart';import 'package:docs_snippets/src/snippet_frame.dart';import 'package:flutter/widgets.dart';import 'package:liqkit_ui/liqkit_ui.dart';/// Snippet builder consumed by `apps/docs_snippets/lib/src/routes.g.dart`.Widget radioGroupBuilder(BuildContext context) { return SnippetFrame( child: LiqDemo<String>( initial: 'auto', builder: (v, set) { return LiqRadioGroup<String>( value: v, onChanged: set, options: const <({String value, String label})>[ (value: 'auto', label: 'Auto'), (value: 'light', label: 'Light'), (value: 'dark', label: 'Dark'), ], ); }, ), );}