Skip to content

Dropdown

Current implementation: PromeoDropdownV2. The canonical dropdown trigger

  • menu pair, using the published DropdownMotion defaults (currently sourced from defaults/patterns/dropdown_v2.json) for entry / exit animation timing. The trigger fills its parent constraints unless width is set explicitly.

PromeoDropdownV2 via Flutter micro-app at /preview. Live state pushed via postMessage.

From snapshot v2026.05.15-001. Reflects the published defaults, not live playground state — see PRD 02 §6 snapshot-fidelity rule.

// from snapshot v2026.05.15-001
import 'package:flutter/material.dart';
import 'package:promeo_design_system/promeo_design_system.dart';
class DropdownSample extends StatefulWidget {
const DropdownSample({super.key});
@override
State<DropdownSample> createState() => _DropdownSampleState();
}
class _DropdownSampleState extends State<DropdownSample> {
String _value = 'opt1';
@override
Widget build(BuildContext context) {
return PromeoDropdownV2(
value: _value,
items: const [
DropdownItem(value: 'opt1', label: 'Option 1'),
DropdownItem(value: 'opt2', label: 'Option 2'),
DropdownItem(value: 'opt3', label: 'Option 3'),
],
onChanged: (v) => setState(() => _value = v),
motion: const DropdownMotion(
durationMs: 240,
exitEasing: 'easeInOut',
),
);
}
}
PropTypeDefaultNotes
valueStringrequiredCurrently-selected item value
itemsListrequiredPass Strings or DropdownItem(value, label)
onChangedValueChanged<String>requiredFired when the user picks an item
disabledboolfalseLocks interaction; renders disabled style
widthdouble?nullTrigger width; null = fill parent constraints
placementDropdownPlacementautoauto flips on viewport space; top / bottom force
motionDropdownMotion?nullPer-instance motion override; null = use registry defaults
openbool?nullControlled-open mode. Pair with onOpenChange
onOpenChangeValueChanged<bool>?nullFired when open state changes
  • The snippet above reflects the currently-published snapshot’s DropdownMotion overrides; drag the Workshop lab sliders + Apply + Sync to bump the snapshot tag (PRD 02 §6 + slice 3.5).
  • Width default = “fill parent” is intentional (regression from the width: 252 incident, 2026-05-14). Pass a concrete width only when the layout demands it.