/// Semantic identifiers for UI automation and accessibility. /// /// These IDs are exposed via Flutter's Semantics tree, making widgets /// discoverable by automation tools (Appium, WebDriver, Puppeteer with /// accessibility enabled). /// /// Naming convention: `{area}_{component}_{identifier}` /// - area: room or feature area (e.g., profile, nav, dataGrid) /// - component: widget type (e.g., menu, button, row) /// - identifier: specific item (e.g., light, containers, selectAll) library; /// Profile dropdown menu IDs. abstract class ProfileSemantics { static const button = 'profile_button'; static const menu = 'profile_menu'; static const settings = 'profile_menu_settings'; static const themeSystem = 'profile_menu_theme_system'; static const themeLight = 'profile_menu_theme_light'; static const themeDark = 'profile_menu_theme_dark'; static const logout = 'profile_menu_logout'; } /// Room tab navigation IDs. abstract class RoomTabSemantics { static const frontHall = 'roomTab_frontHall'; static const controlRoom = 'roomTab_controlRoom'; static const security = 'roomTab_security'; static const parlor = 'roomTab_parlor'; /// Get semantic ID for room index. static String forIndex(int index) => switch (index) { 0 => frontHall, 1 => controlRoom, 2 => security, 3 => parlor, _ => 'roomTab_$index', }; } /// Navigation panel IDs. abstract class NavSemantics { static const panel = 'nav_panel'; static const refresh = 'nav_refresh'; /// Generate ID for a nav item. static String item(String id) => 'nav_item_$id'; /// Generate ID for a nav section. static String section(String id) => 'nav_section_$id'; } /// DataGrid component IDs. abstract class DataGridSemantics { static const grid = 'dataGrid'; static const search = 'dataGrid_search'; static const searchClear = 'dataGrid_search_clear'; static const selectAll = 'dataGrid_selectAll'; static const loading = 'dataGrid_loading'; static const empty = 'dataGrid_empty'; static const error = 'dataGrid_error'; static const refresh = 'dataGrid_refresh'; /// Generate ID for a column header. static String header(String columnId) => 'dataGrid_header_$columnId'; /// Generate ID for a row. static String row(String itemId) => 'dataGrid_row_$itemId'; /// Generate ID for a row checkbox. static String rowCheckbox(String itemId) => 'dataGrid_row_${itemId}_checkbox'; /// Generate ID for a row actions menu. static String rowActions(String itemId) => 'dataGrid_row_${itemId}_actions'; /// Generate ID for a row action. static String rowAction(String itemId, String actionId) => 'dataGrid_row_${itemId}_action_$actionId'; /// Generate ID for a bulk action button. static String bulkAction(String actionId) => 'dataGrid_bulk_$actionId'; static const bulkClear = 'dataGrid_bulk_clear'; } /// Dialog/modal IDs. abstract class DialogSemantics { static const confirm = 'dialog_confirm'; static const cancel = 'dialog_cancel'; static const close = 'dialog_close'; /// Generate ID for a named dialog. static String named(String name) => 'dialog_$name'; /// Generate ID for a dialog action button. static String action(String dialogName, String actionId) => 'dialog_${dialogName}_$actionId'; } /// Settings page IDs. abstract class SettingsSemantics { static const themeDropdown = 'settings_theme'; static const defaultRoomDropdown = 'settings_defaultRoom'; } /// Filter panel IDs. abstract class FilterPanelSemantics { static const panel = 'filterPanel'; static const search = 'filterPanel_search'; static const searchClear = 'filterPanel_search_clear'; static const refresh = 'filterPanel_refresh'; /// Generate ID for a filter item. static String item(String id) => 'filterPanel_item_$id'; } /// Loading/state indicator IDs. abstract class StateSemantics { static const authLoading = 'state_auth_loading'; static const authError = 'state_auth_error'; static const pageLoading = 'state_page_loading'; /// Generate ID for a snackbar. static String snackbar(String type) => 'snackbar_$type'; }