Updated: 2026-06-26
Audited: 2026-06-26
psH738AqHDxuMyFm897f9r ·
Component: card-duty period-alt (4617:13876) in components ftdt (4543:5876) ·
captured 2026-06-26
Variant 2 (expanded — 1051 px, includes flight segments, rest, notes, Conclude button) not previewed here. See Figma node 4617:13920.
| Variant | Figma node | Height | Description |
|---|---|---|---|
Property 1=Default | 4617:13877 | 237 px | Collapsed view: datetime header + progress bar + duty KV row + outline button |
Property 1=Variant2 | 4617:13920 | 1051 px | Expanded: all Default content + EDIT link + Flight Segments section + segment rows + rest + notes + CONCLUDE button |
Property 1=delete demo | 4617:13962 | 237 px | Same as Default but offset left by 67 px; red trash zone visible on trailing edge — swipe gesture affordance |
Tier: domain control. Composes ProgressBarViewModel. Data sourced from FTDT domain via factory.
| Screen | Node | Role |
|---|---|---|
| FTDT — Duty Periods | 4544:5877 | Repeating list item (Default + delete-demo variants) |
| FTDT — Archived Logs | 4575:9452 | Repeating list item (Default only — no delete in archived) |
Underline Button node (4617:14386).ProgressBarViewModel as a composed child.section title component pattern (4596:11818) — heavy label left, book value right, space-between.Target home: ALPAMobile.HybridUi. Component file: DutyPeriodCard.razor. Composes <AlpaProgressBar> for the Max Duty Period row — do not re-implement the bar inline.
| Parameter | Type | Required | Description |
|---|---|---|---|
StartDatetime | string | Yes | Formatted duty start datetime with TZ offset (e.g. "April 28 2026 10:58 -06:00"). |
MaxDutyBar | ProgressBarViewModel | Yes | Composed Progress Bar data. Passed through to <AlpaProgressBar> — "Ends" datetime is the bar's LimitValue. |
DutyTotal | string | Yes | Total duty time shown in the key-value row (e.g. "16:00"). |
OnManage | EventCallback | Yes | Invoked by the "MANAGE FLIGHTS & DETAILS" outline button. |
IsSwipeable | bool | No | Enables trailing red delete zone. Default: false. Pass false on Archived Logs screen. |
OnDelete | EventCallback? | No | Archive/delete action. Only shown when IsSwipeable is true. |
@* Duty Periods screen — swipeable list *@
@foreach (var dp in DutyPeriods)
{
<AlpaDutyPeriodCard StartDatetime="@dp.StartDatetime"
MaxDutyBar="@dp.MaxDutyBar"
DutyTotal="@dp.DutyTotal"
OnManage="@(() => NavigateToDetail(dp))"
IsSwipeable="true"
OnDelete="@(() => ArchiveDutyPeriod(dp))" />
}
@* Archived Logs screen — read-only, no delete *@
@foreach (var dp in ArchivedPeriods)
{
<AlpaDutyPeriodCard StartDatetime="@dp.StartDatetime"
MaxDutyBar="@dp.MaxDutyBar"
DutyTotal="@dp.DutyTotal"
OnManage="@(() => NavigateToDetail(dp))" />
}
Classes will live in ALPAMobile.HybridUi/wwwroot/css/alpa-components.css under the alpa-duty-period-card BEM block. The composed <AlpaProgressBar> is styled by its own alpa-progress-bar block — do not override those classes here.
| Class | Scope | Key rules |
|---|---|---|
.alpa-duty-period-card | Root wrapper | background:white; border-bottom:1px solid var(--ui-form-borders); position:relative; overflow:hidden |
.alpa-duty-period-card__inner | Content padding area | padding:16px; display:flex; flex-direction:column; gap:8px |
.alpa-duty-period-card__header | Datetime header | font-family:var(--font-family/body); font-weight:var(--font-weight/heavy); font-size:18px; color:var(--text-primary); white-space:nowrap |
.alpa-duty-period-card__pb-section | Progress bar wrapper | padding:8px 0; display:flex; flex-direction:column; gap:8px |
.alpa-duty-period-card__kv-row | Key-value row (Duty/total) | display:flex; justify-content:space-between; align-items:center; padding:8px 0 |
.alpa-duty-period-card__kv-key | Row key label | font-family:var(--font-family/body); font-weight:var(--font-weight/heavy); font-size:18px; color:var(--text-primary) |
.alpa-duty-period-card__kv-val | Row value label | font-family:var(--font-family/body); font-weight:400; font-size:16px; color:var(--text-primary) |
.alpa-duty-period-card__manage-btn | Outline pill button | display:flex; justify-content:space-between; align-items:center; width:100%; padding:12px 16px; border:1px solid var(--border-blue-dk); border-radius:38px; background:transparent; cursor:pointer |
.alpa-duty-period-card__manage-btn-label | Button label text | font-family:var(--font-family/body); font-weight:500; font-size:15px; color:var(--text-primary); text-transform:uppercase; letter-spacing:0.6px |
.alpa-duty-period-card__swipe-zone | Trailing delete affordance | position:absolute; right:0; top:0; bottom:0; width:67px; background:var(--status-error); display:flex; align-items:center; justify-content:center |
.alpa-duty-period-card--swiping | Swipe-revealed state modifier | Applied on swipe threshold; translates __inner left by 67px via transform:translateX(-67px) |