1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
//! [`TimeField`] — segmented time input bound to [`OrbitalDateTime`].
use *;
use component_doc;
use use_theme_options;
use cratepicker_style_sheet;
use crate::;
use ;
/// Segmented time input bound to [`OrbitalDateTime`] on a reference calendar day.
///
/// TimeField renders hour/minute (and meridiem for 12-hour) segments. Parsed values are
/// anchored to `appearance.reference_date` or the nearest [`DatetimeLocale`](crate::DatetimeLocale)
/// default. For scroll-column time selection, use core [`TimePicker`](orbital_core_components::TimePicker).
///
/// # When to use
///
/// - Time-of-day entry with keyboard-friendly segments
/// - Scheduling forms paired with a date field on the same reference day
///
/// # Usage
///
/// 1. Bind `Option<OrbitalDateTime>` via [`TimeFieldBind`].
/// 2. Set `appearance.format` to `Time12` or `Time24`.
/// 3. Set `appearance.timezone` and `reference_date` when the anchor day or zone differs from defaults.
///
/// # Lifecycle
///
/// - **Value:** completed time segments commit on blur via [`SegmentedDatetimeField`].
/// - **Open state:** no popover — segments are always editable inline.
///
/// # Timezone
///
/// `appearance.timezone` controls how hour/minute segments resolve to [`OrbitalDateTime`]
/// on `appearance.reference_date`.
///
/// # Examples
///
/// ## Time segments
/// Default 12-hour segmented input with bind readout for E2E.
/// <!-- preview -->
/// ```rust
/// use orbital_base_components::{OrbitalDateTime, ToUnixSeconds};
/// use crate::preview::{PickerPreviewExample, PickerPreviewKnobs};
/// let value = RwSignal::new(None::<OrbitalDateTime>);
/// view! {
/// <PickerPreviewExample data_testid="time-field-preview">
/// <PickerPreviewKnobs />
/// <TimeField bind=value />
/// <div data-testid="time-field-preview-VALUE">{move || value.get().map(|v| v.to_unix_seconds().to_string()).unwrap_or_else(|| "none".to_string())}</div>
/// </PickerPreviewExample>
/// }
/// ```
///
/// ## 24-hour format
/// Hour and minute segments without meridiem.
/// <!-- preview -->
/// ```rust
/// use orbital_base_components::OrbitalDateTime;
/// use crate::preview::PickerPreviewExample;
/// let value = RwSignal::new(None::<OrbitalDateTime>);
/// view! {
/// <PickerPreviewExample data_testid="TF-02">
/// <TimeField bind=value appearance=TimeFieldAppearance::time24() />
/// </PickerPreviewExample>
/// }
/// ```
///
/// ## Bind readout
/// Completed segments update the bound value readout.
/// <!-- preview -->
/// ```rust
/// use orbital_base_components::{OrbitalDateTime, ToUnixSeconds};
/// use crate::preview::PickerPreviewExample;
/// let value = RwSignal::new(None::<OrbitalDateTime>);
/// view! {
/// <PickerPreviewExample data_testid="TF-03">
/// <TimeField bind=value />
/// <div data-testid="TF-03-VALUE">{move || value.get().map(|v| v.to_unix_seconds().to_string()).unwrap_or_else(|| "none".to_string())}</div>
/// </PickerPreviewExample>
/// }
/// ```