From c838596cda957fbb767025ba41486a80731a87e4 Mon Sep 17 00:00:00 2001 From: Avii Date: Sat, 8 Aug 2026 18:07:16 +0200 Subject: [PATCH] 1786205236 --- dashboard/ui/main.slint | 71 +- dashboard/ui/material/LICENSE.md | 11 + dashboard/ui/material/README.md | 30 + dashboard/ui/material/material.slint | 66 + .../ui/material/ui/components/app_bar.slint | 256 ++ .../ui/material/ui/components/badge.slint | 36 + .../material/ui/components/base_button.slint | 72 + .../ui/components/base_navigation.slint | 51 + .../ui/components/bottom_app_bar.slint | 64 + .../material/ui/components/bottom_sheet.slint | 125 + .../ui/material/ui/components/card.slint | 112 + .../ui/material/ui/components/check_box.slint | 130 + .../ui/material/ui/components/chip.slint | 205 ++ .../material/ui/components/date_picker.slint | 585 +++++ .../ui/material/ui/components/dialog.slint | 233 ++ .../ui/material/ui/components/divider.slint | 28 + .../ui/material/ui/components/drawer.slint | 89 + .../ui/components/drop_down_menu.slint | 125 + .../ui/components/elevated_button.slint | 45 + .../ui/material/ui/components/elevation.slint | 108 + .../ui/components/extended_touch_area.slint | 57 + .../ui/components/filled_button.slint | 43 + .../ui/components/filled_icon_button.slint | 64 + .../components/floating_action_button.slint | 55 + .../ui/material/ui/components/grid.slint | 10 + .../material/ui/components/horizontal.slint | 9 + .../ui/material/ui/components/icon.slint | 11 + .../material/ui/components/icon_button.slint | 62 + .../ui/material/ui/components/list.slint | 107 + .../ui/material/ui/components/list_view.slint | 8 + .../ui/components/material_text.slint | 14 + .../ui/components/material_window.slint | 18 + .../ui/material/ui/components/menu.slint | 136 ++ .../ui/material/ui/components/modal.slint | 28 + .../ui/components/navigation_bar.slint | 150 ++ .../ui/components/navigation_drawer.slint | 211 ++ .../ui/components/navigation_rail.slint | 84 + .../ui/components/outline_button.slint | 42 + .../ui/components/outline_icon_button.slint | 78 + .../ui/components/progress_indicator.slint | 107 + .../material/ui/components/radio_button.slint | 99 + .../material/ui/components/scroll_view.slint | 166 ++ .../material/ui/components/search_bar.slint | 317 +++ .../ui/components/segmented_button.slint | 103 + .../ui/material/ui/components/slider.slint | 136 ++ .../ui/material/ui/components/snack_bar.slint | 88 + .../material/ui/components/state_layer.slint | 171 ++ .../ui/material/ui/components/switch.slint | 151 ++ .../ui/material/ui/components/tab_bar.slint | 210 ++ .../material/ui/components/text_button.slint | 33 + .../material/ui/components/text_field.slint | 209 ++ .../material/ui/components/time_picker.slint | 674 ++++++ .../material/ui/components/tonal_button.slint | 44 + .../ui/components/tonal_icon_button.slint | 63 + .../ui/material/ui/components/tooltip.slint | 33 + .../ui/material/ui/components/vertical.slint | 9 + dashboard/ui/material/ui/icons/10k.svg | 1 + dashboard/ui/material/ui/icons/10mp.svg | 1 + dashboard/ui/material/ui/icons/11mp.svg | 1 + dashboard/ui/material/ui/icons/123.svg | 1 + dashboard/ui/material/ui/icons/12mp.svg | 1 + dashboard/ui/material/ui/icons/13mp.svg | 1 + dashboard/ui/material/ui/icons/14mp.svg | 1 + dashboard/ui/material/ui/icons/15mp.svg | 1 + dashboard/ui/material/ui/icons/16mp.svg | 1 + dashboard/ui/material/ui/icons/17mp.svg | 1 + .../ui/material/ui/icons/18_up_rating.svg | 1 + dashboard/ui/material/ui/icons/18mp.svg | 1 + dashboard/ui/material/ui/icons/19mp.svg | 1 + dashboard/ui/material/ui/icons/1k.svg | 1 + dashboard/ui/material/ui/icons/1k_plus.svg | 1 + .../ui/material/ui/icons/1x_mobiledata.svg | 1 + dashboard/ui/material/ui/icons/20mp.svg | 1 + dashboard/ui/material/ui/icons/21mp.svg | 1 + dashboard/ui/material/ui/icons/22mp.svg | 1 + dashboard/ui/material/ui/icons/23mp.svg | 1 + dashboard/ui/material/ui/icons/24mp.svg | 1 + dashboard/ui/material/ui/icons/2k.svg | 1 + dashboard/ui/material/ui/icons/2k_plus.svg | 1 + dashboard/ui/material/ui/icons/2mp.svg | 1 + dashboard/ui/material/ui/icons/30fps.svg | 1 + .../ui/material/ui/icons/30fps_select.svg | 1 + dashboard/ui/material/ui/icons/360.svg | 1 + .../ui/material/ui/icons/3d_rotation.svg | 1 + .../ui/material/ui/icons/3g_mobiledata.svg | 1 + dashboard/ui/material/ui/icons/3k.svg | 1 + dashboard/ui/material/ui/icons/3k_plus.svg | 1 + dashboard/ui/material/ui/icons/3mp.svg | 1 + dashboard/ui/material/ui/icons/3p.svg | 1 + .../ui/material/ui/icons/4g_mobiledata.svg | 1 + .../material/ui/icons/4g_plus_mobiledata.svg | 1 + dashboard/ui/material/ui/icons/4k.svg | 1 + dashboard/ui/material/ui/icons/4k_plus.svg | 1 + dashboard/ui/material/ui/icons/4mp.svg | 1 + dashboard/ui/material/ui/icons/5g.svg | 1 + dashboard/ui/material/ui/icons/5k.svg | 1 + dashboard/ui/material/ui/icons/5k_plus.svg | 1 + dashboard/ui/material/ui/icons/5mp.svg | 1 + dashboard/ui/material/ui/icons/60fps.svg | 1 + .../ui/material/ui/icons/60fps_select.svg | 1 + dashboard/ui/material/ui/icons/6_ft_apart.svg | 1 + dashboard/ui/material/ui/icons/6k.svg | 1 + dashboard/ui/material/ui/icons/6k_plus.svg | 1 + dashboard/ui/material/ui/icons/6mp.svg | 1 + dashboard/ui/material/ui/icons/7k.svg | 1 + dashboard/ui/material/ui/icons/7k_plus.svg | 1 + dashboard/ui/material/ui/icons/7mp.svg | 1 + dashboard/ui/material/ui/icons/8k.svg | 1 + dashboard/ui/material/ui/icons/8k_plus.svg | 1 + dashboard/ui/material/ui/icons/8mp.svg | 1 + dashboard/ui/material/ui/icons/9k.svg | 1 + dashboard/ui/material/ui/icons/9k_plus.svg | 1 + dashboard/ui/material/ui/icons/9mp.svg | 1 + dashboard/ui/material/ui/icons/abc.svg | 1 + dashboard/ui/material/ui/icons/ac_unit.svg | 1 + .../ui/material/ui/icons/access_alarm.svg | 1 + .../ui/material/ui/icons/access_alarms.svg | 1 + .../ui/material/ui/icons/access_time.svg | 1 + .../material/ui/icons/access_time_filled.svg | 1 + .../ui/material/ui/icons/accessibility.svg | 1 + .../material/ui/icons/accessibility_new.svg | 1 + dashboard/ui/material/ui/icons/accessible.svg | 1 + .../material/ui/icons/accessible_forward.svg | 1 + .../ui/material/ui/icons/account_balance.svg | 1 + .../ui/icons/account_balance_wallet.svg | 1 + .../ui/material/ui/icons/account_box.svg | 1 + .../ui/material/ui/icons/account_circle.svg | 1 + .../ui/material/ui/icons/account_tree.svg | 1 + dashboard/ui/material/ui/icons/ad_units.svg | 1 + dashboard/ui/material/ui/icons/adb.svg | 1 + dashboard/ui/material/ui/icons/add.svg | 1 + .../ui/material/ui/icons/add_a_photo.svg | 1 + dashboard/ui/material/ui/icons/add_alarm.svg | 1 + dashboard/ui/material/ui/icons/add_alert.svg | 1 + dashboard/ui/material/ui/icons/add_box.svg | 1 + .../ui/material/ui/icons/add_business.svg | 1 + dashboard/ui/material/ui/icons/add_card.svg | 1 + dashboard/ui/material/ui/icons/add_chart.svg | 1 + dashboard/ui/material/ui/icons/add_circle.svg | 1 + .../material/ui/icons/add_circle_outline.svg | 1 + .../ui/material/ui/icons/add_comment.svg | 1 + dashboard/ui/material/ui/icons/add_home.svg | 1 + .../ui/material/ui/icons/add_home_work.svg | 1 + .../ui/material/ui/icons/add_ic_call.svg | 1 + dashboard/ui/material/ui/icons/add_link.svg | 1 + .../ui/material/ui/icons/add_location.svg | 1 + .../ui/material/ui/icons/add_location_alt.svg | 1 + .../ui/material/ui/icons/add_moderator.svg | 1 + .../material/ui/icons/add_photo_alternate.svg | 1 + .../ui/material/ui/icons/add_reaction.svg | 1 + dashboard/ui/material/ui/icons/add_road.svg | 1 + .../material/ui/icons/add_shopping_cart.svg | 1 + dashboard/ui/material/ui/icons/add_task.svg | 1 + .../ui/material/ui/icons/add_to_drive.svg | 1 + .../material/ui/icons/add_to_home_screen.svg | 1 + .../ui/material/ui/icons/add_to_photos.svg | 1 + .../ui/material/ui/icons/add_to_queue.svg | 1 + dashboard/ui/material/ui/icons/addchart.svg | 1 + .../ui/material/ui/icons/adf_scanner.svg | 1 + dashboard/ui/material/ui/icons/adjust.svg | 1 + .../ui/icons/admin_panel_settings.svg | 1 + dashboard/ui/material/ui/icons/ads_click.svg | 1 + .../ui/material/ui/icons/agriculture.svg | 1 + dashboard/ui/material/ui/icons/air.svg | 1 + .../material/ui/icons/airline_seat_flat.svg | 1 + .../ui/icons/airline_seat_flat_angled.svg | 1 + .../icons/airline_seat_individual_suite.svg | 1 + .../ui/icons/airline_seat_legroom_extra.svg | 1 + .../ui/icons/airline_seat_legroom_normal.svg | 1 + .../ui/icons/airline_seat_legroom_reduced.svg | 1 + .../ui/icons/airline_seat_recline_extra.svg | 1 + .../ui/icons/airline_seat_recline_normal.svg | 1 + .../ui/material/ui/icons/airline_stops.svg | 1 + dashboard/ui/material/ui/icons/airlines.svg | 1 + .../ui/material/ui/icons/airplane_ticket.svg | 1 + .../material/ui/icons/airplanemode_active.svg | 1 + .../ui/icons/airplanemode_inactive.svg | 1 + dashboard/ui/material/ui/icons/airplay.svg | 1 + .../ui/material/ui/icons/airport_shuttle.svg | 1 + dashboard/ui/material/ui/icons/alarm.svg | 1 + dashboard/ui/material/ui/icons/alarm_add.svg | 1 + dashboard/ui/material/ui/icons/alarm_off.svg | 1 + dashboard/ui/material/ui/icons/alarm_on.svg | 1 + dashboard/ui/material/ui/icons/album.svg | 1 + .../ui/icons/align_horizontal_center.svg | 1 + .../ui/icons/align_horizontal_left.svg | 1 + .../ui/icons/align_horizontal_right.svg | 1 + .../ui/icons/align_vertical_bottom.svg | 1 + .../ui/icons/align_vertical_center.svg | 1 + .../material/ui/icons/align_vertical_top.svg | 1 + dashboard/ui/material/ui/icons/all_inbox.svg | 1 + .../ui/material/ui/icons/all_inclusive.svg | 1 + dashboard/ui/material/ui/icons/all_out.svg | 1 + dashboard/ui/material/ui/icons/alt_route.svg | 1 + .../ui/material/ui/icons/alternate_email.svg | 1 + dashboard/ui/material/ui/icons/analytics.svg | 1 + dashboard/ui/material/ui/icons/anchor.svg | 1 + dashboard/ui/material/ui/icons/android.svg | 1 + dashboard/ui/material/ui/icons/animation.svg | 1 + .../ui/material/ui/icons/announcement.svg | 1 + dashboard/ui/material/ui/icons/aod.svg | 1 + dashboard/ui/material/ui/icons/apartment.svg | 1 + dashboard/ui/material/ui/icons/api.svg | 1 + .../ui/material/ui/icons/app_blocking.svg | 1 + .../ui/material/ui/icons/app_registration.svg | 1 + .../ui/material/ui/icons/app_settings_alt.svg | 1 + .../ui/material/ui/icons/app_shortcut.svg | 1 + dashboard/ui/material/ui/icons/approval.svg | 1 + dashboard/ui/material/ui/icons/apps.svg | 1 + .../ui/material/ui/icons/apps_outage.svg | 1 + .../ui/material/ui/icons/architecture.svg | 1 + dashboard/ui/material/ui/icons/archive.svg | 1 + dashboard/ui/material/ui/icons/area_chart.svg | 1 + dashboard/ui/material/ui/icons/arrow_back.svg | 1 + .../ui/material/ui/icons/arrow_back_ios.svg | 1 + .../material/ui/icons/arrow_back_ios_new.svg | 1 + .../material/ui/icons/arrow_circle_down.svg | 1 + .../material/ui/icons/arrow_circle_left.svg | 1 + .../material/ui/icons/arrow_circle_right.svg | 1 + .../ui/material/ui/icons/arrow_circle_up.svg | 1 + .../ui/material/ui/icons/arrow_downward.svg | 1 + .../ui/material/ui/icons/arrow_drop_down.svg | 2 + .../ui/icons/arrow_drop_down_circle.svg | 1 + .../ui/material/ui/icons/arrow_drop_up.svg | 1 + .../ui/material/ui/icons/arrow_forward.svg | 1 + .../material/ui/icons/arrow_forward_ios.svg | 1 + dashboard/ui/material/ui/icons/arrow_left.svg | 1 + .../ui/material/ui/icons/arrow_outward.svg | 1 + .../ui/material/ui/icons/arrow_right.svg | 1 + .../ui/material/ui/icons/arrow_right_alt.svg | 1 + .../ui/material/ui/icons/arrow_upward.svg | 1 + dashboard/ui/material/ui/icons/art_track.svg | 1 + dashboard/ui/material/ui/icons/article.svg | 1 + .../ui/material/ui/icons/aspect_ratio.svg | 1 + dashboard/ui/material/ui/icons/assessment.svg | 1 + dashboard/ui/material/ui/icons/assignment.svg | 1 + .../ui/material/ui/icons/assignment_ind.svg | 1 + .../ui/material/ui/icons/assignment_late.svg | 1 + .../material/ui/icons/assignment_return.svg | 1 + .../material/ui/icons/assignment_returned.svg | 1 + .../ui/icons/assignment_turned_in.svg | 1 + .../ui/material/ui/icons/assist_walker.svg | 1 + dashboard/ui/material/ui/icons/assistant.svg | 1 + .../material/ui/icons/assistant_direction.svg | 1 + .../ui/material/ui/icons/assistant_photo.svg | 1 + .../ui/material/ui/icons/assured_workload.svg | 1 + dashboard/ui/material/ui/icons/atm.svg | 1 + .../ui/material/ui/icons/attach_email.svg | 1 + .../ui/material/ui/icons/attach_file.svg | 1 + .../ui/material/ui/icons/attach_money.svg | 1 + dashboard/ui/material/ui/icons/attachment.svg | 1 + .../ui/material/ui/icons/attractions.svg | 1 + .../ui/material/ui/icons/attribution.svg | 1 + dashboard/ui/material/ui/icons/audio_file.svg | 1 + dashboard/ui/material/ui/icons/audiotrack.svg | 1 + .../ui/material/ui/icons/auto_awesome.svg | 1 + .../material/ui/icons/auto_awesome_mosaic.svg | 1 + .../material/ui/icons/auto_awesome_motion.svg | 1 + .../ui/material/ui/icons/auto_delete.svg | 1 + .../ui/material/ui/icons/auto_fix_high.svg | 1 + .../ui/material/ui/icons/auto_fix_normal.svg | 1 + .../ui/material/ui/icons/auto_fix_off.svg | 1 + dashboard/ui/material/ui/icons/auto_graph.svg | 1 + dashboard/ui/material/ui/icons/auto_mode.svg | 1 + .../ui/material/ui/icons/auto_stories.svg | 1 + .../ui/material/ui/icons/autofps_select.svg | 1 + dashboard/ui/material/ui/icons/autorenew.svg | 1 + dashboard/ui/material/ui/icons/av_timer.svg | 1 + .../ui/icons/baby_changing_station.svg | 1 + dashboard/ui/material/ui/icons/back_hand.svg | 1 + dashboard/ui/material/ui/icons/backpack.svg | 1 + dashboard/ui/material/ui/icons/backspace.svg | 1 + dashboard/ui/material/ui/icons/backup.svg | 1 + .../ui/material/ui/icons/backup_table.svg | 1 + dashboard/ui/material/ui/icons/badge.svg | 1 + .../ui/material/ui/icons/bakery_dining.svg | 1 + dashboard/ui/material/ui/icons/balance.svg | 1 + dashboard/ui/material/ui/icons/balcony.svg | 1 + dashboard/ui/material/ui/icons/ballot.svg | 1 + dashboard/ui/material/ui/icons/bar_chart.svg | 1 + .../ui/material/ui/icons/batch_prediction.svg | 1 + dashboard/ui/material/ui/icons/bathroom.svg | 1 + dashboard/ui/material/ui/icons/bathtub.svg | 1 + .../ui/material/ui/icons/battery_0_bar.svg | 1 + .../ui/material/ui/icons/battery_1_bar.svg | 1 + .../ui/material/ui/icons/battery_2_bar.svg | 1 + .../ui/material/ui/icons/battery_3_bar.svg | 1 + .../ui/material/ui/icons/battery_4_bar.svg | 1 + .../ui/material/ui/icons/battery_5_bar.svg | 1 + .../ui/material/ui/icons/battery_6_bar.svg | 1 + .../ui/material/ui/icons/battery_alert.svg | 1 + .../ui/icons/battery_charging_full.svg | 1 + .../ui/material/ui/icons/battery_full.svg | 1 + .../ui/material/ui/icons/battery_saver.svg | 1 + .../ui/material/ui/icons/battery_std.svg | 1 + .../ui/material/ui/icons/battery_unknown.svg | 1 + .../ui/material/ui/icons/beach_access.svg | 1 + dashboard/ui/material/ui/icons/bed.svg | 1 + .../ui/material/ui/icons/bedroom_baby.svg | 1 + .../ui/material/ui/icons/bedroom_child.svg | 1 + .../ui/material/ui/icons/bedroom_parent.svg | 1 + dashboard/ui/material/ui/icons/bedtime.svg | 1 + .../ui/material/ui/icons/bedtime_off.svg | 1 + dashboard/ui/material/ui/icons/beenhere.svg | 1 + dashboard/ui/material/ui/icons/bento.svg | 1 + .../ui/material/ui/icons/bike_scooter.svg | 1 + dashboard/ui/material/ui/icons/biotech.svg | 1 + dashboard/ui/material/ui/icons/blender.svg | 1 + dashboard/ui/material/ui/icons/blind.svg | 1 + dashboard/ui/material/ui/icons/blinds.svg | 1 + .../ui/material/ui/icons/blinds_closed.svg | 1 + dashboard/ui/material/ui/icons/block.svg | 1 + dashboard/ui/material/ui/icons/bloodtype.svg | 1 + dashboard/ui/material/ui/icons/bluetooth.svg | 1 + .../ui/material/ui/icons/bluetooth_audio.svg | 1 + .../material/ui/icons/bluetooth_connected.svg | 1 + .../material/ui/icons/bluetooth_disabled.svg | 1 + .../ui/material/ui/icons/bluetooth_drive.svg | 1 + .../material/ui/icons/bluetooth_searching.svg | 1 + .../ui/material/ui/icons/blur_circular.svg | 1 + .../ui/material/ui/icons/blur_linear.svg | 1 + dashboard/ui/material/ui/icons/blur_off.svg | 1 + dashboard/ui/material/ui/icons/blur_on.svg | 1 + dashboard/ui/material/ui/icons/bolt.svg | 1 + dashboard/ui/material/ui/icons/book.svg | 1 + .../ui/material/ui/icons/book_online.svg | 1 + dashboard/ui/material/ui/icons/bookmark.svg | 1 + .../ui/material/ui/icons/bookmark_add.svg | 1 + .../ui/material/ui/icons/bookmark_added.svg | 1 + .../ui/material/ui/icons/bookmark_border.svg | 1 + .../ui/material/ui/icons/bookmark_remove.svg | 1 + dashboard/ui/material/ui/icons/bookmarks.svg | 1 + dashboard/ui/material/ui/icons/border_all.svg | 1 + .../ui/material/ui/icons/border_bottom.svg | 1 + .../ui/material/ui/icons/border_clear.svg | 1 + .../ui/material/ui/icons/border_color.svg | 1 + .../material/ui/icons/border_horizontal.svg | 1 + .../ui/material/ui/icons/border_inner.svg | 1 + .../ui/material/ui/icons/border_left.svg | 1 + .../ui/material/ui/icons/border_outer.svg | 1 + .../ui/material/ui/icons/border_right.svg | 1 + .../ui/material/ui/icons/border_style.svg | 1 + dashboard/ui/material/ui/icons/border_top.svg | 1 + .../ui/material/ui/icons/border_vertical.svg | 1 + dashboard/ui/material/ui/icons/boy.svg | 1 + .../material/ui/icons/branding_watermark.svg | 1 + .../ui/material/ui/icons/breakfast_dining.svg | 1 + .../ui/material/ui/icons/brightness_1.svg | 1 + .../ui/material/ui/icons/brightness_2.svg | 1 + .../ui/material/ui/icons/brightness_3.svg | 1 + .../ui/material/ui/icons/brightness_4.svg | 1 + .../ui/material/ui/icons/brightness_5.svg | 1 + .../ui/material/ui/icons/brightness_6.svg | 1 + .../ui/material/ui/icons/brightness_7.svg | 1 + .../ui/material/ui/icons/brightness_auto.svg | 1 + .../ui/material/ui/icons/brightness_high.svg | 1 + .../ui/material/ui/icons/brightness_low.svg | 1 + .../material/ui/icons/brightness_medium.svg | 1 + .../material/ui/icons/broadcast_on_home.svg | 1 + .../ui/icons/broadcast_on_personal.svg | 1 + .../ui/material/ui/icons/broken_image.svg | 1 + .../ui/material/ui/icons/browse_gallery.svg | 1 + .../ui/icons/browser_not_supported.svg | 1 + .../ui/material/ui/icons/browser_updated.svg | 1 + .../ui/material/ui/icons/brunch_dining.svg | 1 + dashboard/ui/material/ui/icons/brush.svg | 1 + .../ui/material/ui/icons/bubble_chart.svg | 1 + dashboard/ui/material/ui/icons/bug_report.svg | 1 + dashboard/ui/material/ui/icons/build.svg | 1 + .../ui/material/ui/icons/build_circle.svg | 1 + dashboard/ui/material/ui/icons/bungalow.svg | 1 + dashboard/ui/material/ui/icons/burst_mode.svg | 1 + dashboard/ui/material/ui/icons/bus_alert.svg | 1 + dashboard/ui/material/ui/icons/business.svg | 1 + .../ui/material/ui/icons/business_center.svg | 1 + dashboard/ui/material/ui/icons/cabin.svg | 1 + dashboard/ui/material/ui/icons/cable.svg | 1 + dashboard/ui/material/ui/icons/cached.svg | 1 + dashboard/ui/material/ui/icons/cake.svg | 1 + dashboard/ui/material/ui/icons/calculate.svg | 1 + .../ui/material/ui/icons/calendar_month.svg | 1 + .../ui/material/ui/icons/calendar_today.svg | 1 + .../material/ui/icons/calendar_view_day.svg | 1 + .../material/ui/icons/calendar_view_month.svg | 1 + .../material/ui/icons/calendar_view_week.svg | 1 + dashboard/ui/material/ui/icons/call.svg | 1 + dashboard/ui/material/ui/icons/call_end.svg | 1 + dashboard/ui/material/ui/icons/call_made.svg | 1 + dashboard/ui/material/ui/icons/call_merge.svg | 1 + .../ui/material/ui/icons/call_missed.svg | 1 + .../ui/icons/call_missed_outgoing.svg | 1 + .../ui/material/ui/icons/call_received.svg | 1 + dashboard/ui/material/ui/icons/call_split.svg | 1 + .../ui/material/ui/icons/call_to_action.svg | 1 + dashboard/ui/material/ui/icons/camera.svg | 1 + dashboard/ui/material/ui/icons/camera_alt.svg | 1 + .../ui/material/ui/icons/camera_enhance.svg | 1 + .../ui/material/ui/icons/camera_front.svg | 1 + .../ui/material/ui/icons/camera_indoor.svg | 1 + .../ui/material/ui/icons/camera_outdoor.svg | 1 + .../ui/material/ui/icons/camera_rear.svg | 1 + .../ui/material/ui/icons/camera_roll.svg | 1 + .../ui/material/ui/icons/cameraswitch.svg | 1 + dashboard/ui/material/ui/icons/campaign.svg | 1 + dashboard/ui/material/ui/icons/cancel.svg | 1 + .../material/ui/icons/cancel_presentation.svg | 1 + .../ui/icons/cancel_schedule_send.svg | 1 + .../material/ui/icons/candlestick_chart.svg | 1 + dashboard/ui/material/ui/icons/car_crash.svg | 1 + dashboard/ui/material/ui/icons/car_rental.svg | 1 + dashboard/ui/material/ui/icons/car_repair.svg | 1 + .../ui/material/ui/icons/card_giftcard.svg | 1 + .../ui/material/ui/icons/card_membership.svg | 1 + .../ui/material/ui/icons/card_travel.svg | 1 + dashboard/ui/material/ui/icons/carpenter.svg | 1 + dashboard/ui/material/ui/icons/cases.svg | 1 + dashboard/ui/material/ui/icons/casino.svg | 1 + dashboard/ui/material/ui/icons/cast.svg | 1 + .../ui/material/ui/icons/cast_connected.svg | 1 + .../material/ui/icons/cast_for_education.svg | 1 + dashboard/ui/material/ui/icons/castle.svg | 1 + .../ui/material/ui/icons/catching_pokemon.svg | 1 + dashboard/ui/material/ui/icons/category.svg | 1 + .../ui/material/ui/icons/celebration.svg | 1 + dashboard/ui/material/ui/icons/cell_tower.svg | 1 + dashboard/ui/material/ui/icons/cell_wifi.svg | 1 + .../material/ui/icons/center_focus_strong.svg | 1 + .../material/ui/icons/center_focus_weak.svg | 1 + dashboard/ui/material/ui/icons/chair.svg | 1 + dashboard/ui/material/ui/icons/chair_alt.svg | 1 + dashboard/ui/material/ui/icons/chalet.svg | 1 + .../ui/material/ui/icons/change_circle.svg | 1 + .../ui/material/ui/icons/change_history.svg | 1 + .../ui/material/ui/icons/charging_station.svg | 1 + dashboard/ui/material/ui/icons/chat.svg | 1 + .../ui/material/ui/icons/chat_bubble.svg | 1 + .../material/ui/icons/chat_bubble_outline.svg | 1 + dashboard/ui/material/ui/icons/check.svg | 1 + dashboard/ui/material/ui/icons/check_box.svg | 1 + .../ui/icons/check_box_outline_blank.svg | 1 + .../ui/material/ui/icons/check_circle.svg | 1 + .../ui/icons/check_circle_outline.svg | 1 + dashboard/ui/material/ui/icons/checklist.svg | 1 + .../ui/material/ui/icons/checklist_rtl.svg | 1 + dashboard/ui/material/ui/icons/checkroom.svg | 1 + .../ui/material/ui/icons/chevron_backward.svg | 1 + .../ui/material/ui/icons/chevron_forward.svg | 1 + .../ui/material/ui/icons/chevron_left.svg | 1 + .../ui/material/ui/icons/chevron_right.svg | 1 + dashboard/ui/material/ui/icons/child_care.svg | 1 + .../ui/material/ui/icons/child_friendly.svg | 1 + .../material/ui/icons/chrome_reader_mode.svg | 1 + dashboard/ui/material/ui/icons/church.svg | 1 + dashboard/ui/material/ui/icons/circle.svg | 1 + .../ui/icons/circle_notifications.svg | 1 + dashboard/ui/material/ui/icons/class.svg | 1 + .../ui/material/ui/icons/clean_hands.svg | 1 + .../material/ui/icons/cleaning_services.svg | 1 + dashboard/ui/material/ui/icons/clear.svg | 1 + dashboard/ui/material/ui/icons/clear_all.svg | 1 + dashboard/ui/material/ui/icons/close.svg | 1 + .../ui/material/ui/icons/close_fullscreen.svg | 1 + .../ui/material/ui/icons/closed_caption.svg | 1 + .../ui/icons/closed_caption_disabled.svg | 1 + .../material/ui/icons/closed_caption_off.svg | 1 + dashboard/ui/material/ui/icons/cloud.svg | 1 + .../ui/material/ui/icons/cloud_circle.svg | 1 + dashboard/ui/material/ui/icons/cloud_done.svg | 1 + .../ui/material/ui/icons/cloud_download.svg | 1 + dashboard/ui/material/ui/icons/cloud_off.svg | 1 + .../ui/material/ui/icons/cloud_queue.svg | 1 + dashboard/ui/material/ui/icons/cloud_sync.svg | 1 + .../ui/material/ui/icons/cloud_upload.svg | 1 + dashboard/ui/material/ui/icons/co2.svg | 1 + dashboard/ui/material/ui/icons/co_present.svg | 1 + dashboard/ui/material/ui/icons/code.svg | 1 + dashboard/ui/material/ui/icons/code_off.svg | 1 + dashboard/ui/material/ui/icons/coffee.svg | 1 + .../ui/material/ui/icons/coffee_maker.svg | 1 + .../ui/material/ui/icons/collections.svg | 1 + .../ui/icons/collections_bookmark.svg | 1 + dashboard/ui/material/ui/icons/color_lens.svg | 1 + dashboard/ui/material/ui/icons/colorize.svg | 1 + dashboard/ui/material/ui/icons/comment.svg | 1 + .../ui/material/ui/icons/comment_bank.svg | 1 + .../material/ui/icons/comments_disabled.svg | 1 + dashboard/ui/material/ui/icons/commit.svg | 1 + dashboard/ui/material/ui/icons/commute.svg | 1 + dashboard/ui/material/ui/icons/compare.svg | 1 + .../ui/material/ui/icons/compare_arrows.svg | 1 + .../material/ui/icons/compass_calibration.svg | 1 + dashboard/ui/material/ui/icons/compost.svg | 1 + dashboard/ui/material/ui/icons/compress.svg | 1 + dashboard/ui/material/ui/icons/computer.svg | 1 + .../material/ui/icons/confirmation_number.svg | 1 + .../ui/icons/connect_without_contact.svg | 1 + .../ui/material/ui/icons/connected_tv.svg | 1 + .../material/ui/icons/connecting_airports.svg | 1 + .../ui/material/ui/icons/construction.svg | 1 + .../material/ui/icons/contact_emergency.svg | 1 + .../ui/material/ui/icons/contact_mail.svg | 1 + .../ui/material/ui/icons/contact_page.svg | 1 + .../ui/material/ui/icons/contact_phone.svg | 1 + .../ui/material/ui/icons/contact_support.svg | 1 + .../ui/material/ui/icons/contactless.svg | 1 + dashboard/ui/material/ui/icons/contacts.svg | 1 + .../ui/material/ui/icons/content_copy.svg | 1 + .../ui/material/ui/icons/content_cut.svg | 1 + .../ui/material/ui/icons/content_paste.svg | 1 + .../ui/material/ui/icons/content_paste_go.svg | 1 + .../material/ui/icons/content_paste_off.svg | 1 + .../ui/icons/content_paste_search.svg | 1 + dashboard/ui/material/ui/icons/contrast.svg | 1 + .../ui/material/ui/icons/control_camera.svg | 1 + .../ui/material/ui/icons/control_point.svg | 1 + .../ui/icons/control_point_duplicate.svg | 1 + dashboard/ui/material/ui/icons/cookie.svg | 1 + dashboard/ui/material/ui/icons/copy_all.svg | 1 + dashboard/ui/material/ui/icons/copyright.svg | 1 + .../ui/material/ui/icons/coronavirus.svg | 1 + .../ui/material/ui/icons/corporate_fare.svg | 1 + dashboard/ui/material/ui/icons/cottage.svg | 1 + .../ui/material/ui/icons/countertops.svg | 1 + dashboard/ui/material/ui/icons/create.svg | 1 + .../material/ui/icons/create_new_folder.svg | 1 + .../ui/material/ui/icons/credit_card.svg | 1 + .../ui/material/ui/icons/credit_card_off.svg | 1 + .../ui/material/ui/icons/credit_score.svg | 1 + dashboard/ui/material/ui/icons/crib.svg | 1 + .../ui/material/ui/icons/crisis_alert.svg | 1 + dashboard/ui/material/ui/icons/crop.svg | 1 + dashboard/ui/material/ui/icons/crop_16_9.svg | 1 + dashboard/ui/material/ui/icons/crop_3_2.svg | 1 + dashboard/ui/material/ui/icons/crop_5_4.svg | 1 + dashboard/ui/material/ui/icons/crop_7_5.svg | 1 + dashboard/ui/material/ui/icons/crop_din.svg | 1 + dashboard/ui/material/ui/icons/crop_free.svg | 1 + .../ui/material/ui/icons/crop_landscape.svg | 1 + .../ui/material/ui/icons/crop_original.svg | 1 + .../ui/material/ui/icons/crop_portrait.svg | 1 + .../ui/material/ui/icons/crop_rotate.svg | 1 + .../ui/material/ui/icons/crop_square.svg | 1 + .../ui/material/ui/icons/cruelty_free.svg | 1 + dashboard/ui/material/ui/icons/css.svg | 1 + .../ui/material/ui/icons/currency_bitcoin.svg | 1 + .../material/ui/icons/currency_exchange.svg | 1 + .../ui/material/ui/icons/currency_franc.svg | 1 + .../ui/material/ui/icons/currency_lira.svg | 1 + .../ui/material/ui/icons/currency_pound.svg | 1 + .../ui/material/ui/icons/currency_ruble.svg | 1 + .../ui/material/ui/icons/currency_rupee.svg | 1 + .../ui/material/ui/icons/currency_yen.svg | 1 + .../ui/material/ui/icons/currency_yuan.svg | 1 + dashboard/ui/material/ui/icons/curtains.svg | 1 + .../ui/material/ui/icons/curtains_closed.svg | 1 + dashboard/ui/material/ui/icons/cyclone.svg | 1 + dashboard/ui/material/ui/icons/dangerous.svg | 1 + dashboard/ui/material/ui/icons/dark_mode.svg | 1 + dashboard/ui/material/ui/icons/dashboard.svg | 1 + .../material/ui/icons/dashboard_customize.svg | 1 + dashboard/ui/material/ui/icons/data_array.svg | 1 + .../ui/material/ui/icons/data_exploration.svg | 1 + .../ui/material/ui/icons/data_object.svg | 1 + .../ui/material/ui/icons/data_saver_off.svg | 1 + .../ui/material/ui/icons/data_saver_on.svg | 1 + .../material/ui/icons/data_thresholding.svg | 1 + dashboard/ui/material/ui/icons/data_usage.svg | 1 + dashboard/ui/material/ui/icons/dataset.svg | 1 + .../ui/material/ui/icons/dataset_linked.svg | 1 + dashboard/ui/material/ui/icons/date_range.svg | 1 + dashboard/ui/material/ui/icons/deblur.svg | 1 + dashboard/ui/material/ui/icons/deck.svg | 1 + dashboard/ui/material/ui/icons/dehaze.svg | 1 + dashboard/ui/material/ui/icons/delete.svg | 1 + .../ui/material/ui/icons/delete_forever.svg | 1 + .../ui/material/ui/icons/delete_outline.svg | 1 + .../ui/material/ui/icons/delete_sweep.svg | 1 + .../ui/material/ui/icons/delivery_dining.svg | 1 + .../ui/material/ui/icons/density_large.svg | 1 + .../ui/material/ui/icons/density_medium.svg | 1 + .../ui/material/ui/icons/density_small.svg | 1 + .../ui/material/ui/icons/departure_board.svg | 1 + .../ui/material/ui/icons/description.svg | 1 + dashboard/ui/material/ui/icons/deselect.svg | 1 + .../ui/material/ui/icons/design_services.svg | 1 + dashboard/ui/material/ui/icons/desk.svg | 1 + .../ui/icons/desktop_access_disabled.svg | 1 + .../ui/material/ui/icons/desktop_mac.svg | 1 + .../ui/material/ui/icons/desktop_windows.svg | 1 + dashboard/ui/material/ui/icons/details.svg | 1 + .../ui/material/ui/icons/developer_board.svg | 1 + .../material/ui/icons/developer_board_off.svg | 1 + .../ui/material/ui/icons/developer_mode.svg | 1 + dashboard/ui/material/ui/icons/device_hub.svg | 1 + .../material/ui/icons/device_thermostat.svg | 1 + .../ui/material/ui/icons/device_unknown.svg | 1 + dashboard/ui/material/ui/icons/devices.svg | 1 + .../ui/material/ui/icons/devices_fold.svg | 1 + .../ui/material/ui/icons/devices_other.svg | 1 + dashboard/ui/material/ui/icons/dialer_sip.svg | 1 + dashboard/ui/material/ui/icons/dialpad.svg | 1 + dashboard/ui/material/ui/icons/diamond.svg | 1 + dashboard/ui/material/ui/icons/difference.svg | 1 + dashboard/ui/material/ui/icons/dining.svg | 1 + .../ui/material/ui/icons/dinner_dining.svg | 1 + dashboard/ui/material/ui/icons/directions.svg | 1 + .../ui/material/ui/icons/directions_bike.svg | 1 + .../ui/material/ui/icons/directions_boat.svg | 1 + .../ui/icons/directions_boat_filled.svg | 1 + .../ui/material/ui/icons/directions_bus.svg | 1 + .../ui/icons/directions_bus_filled.svg | 1 + .../ui/material/ui/icons/directions_car.svg | 1 + .../ui/icons/directions_car_filled.svg | 1 + .../ui/material/ui/icons/directions_off.svg | 1 + .../material/ui/icons/directions_railway.svg | 1 + .../ui/icons/directions_railway_filled.svg | 1 + .../ui/material/ui/icons/directions_run.svg | 1 + .../material/ui/icons/directions_subway.svg | 1 + .../ui/icons/directions_subway_filled.svg | 1 + .../material/ui/icons/directions_transit.svg | 1 + .../ui/icons/directions_transit_filled.svg | 1 + .../ui/material/ui/icons/directions_walk.svg | 1 + dashboard/ui/material/ui/icons/dirty_lens.svg | 1 + .../material/ui/icons/disabled_by_default.svg | 1 + .../ui/material/ui/icons/disabled_visible.svg | 1 + dashboard/ui/material/ui/icons/disc_full.svg | 1 + dashboard/ui/material/ui/icons/discount.svg | 1 + .../ui/material/ui/icons/display_settings.svg | 1 + .../ui/material/ui/icons/diversity_1.svg | 1 + .../ui/material/ui/icons/diversity_2.svg | 1 + .../ui/material/ui/icons/diversity_3.svg | 1 + dashboard/ui/material/ui/icons/dns.svg | 1 + dashboard/ui/material/ui/icons/do_disturb.svg | 1 + .../ui/material/ui/icons/do_disturb_alt.svg | 1 + .../ui/material/ui/icons/do_disturb_off.svg | 1 + .../ui/material/ui/icons/do_disturb_on.svg | 1 + .../ui/material/ui/icons/do_not_disturb.svg | 1 + .../material/ui/icons/do_not_disturb_alt.svg | 1 + .../material/ui/icons/do_not_disturb_off.svg | 1 + .../material/ui/icons/do_not_disturb_on.svg | 1 + .../icons/do_not_disturb_on_total_silence.svg | 1 + .../ui/material/ui/icons/do_not_step.svg | 1 + .../ui/material/ui/icons/do_not_touch.svg | 1 + dashboard/ui/material/ui/icons/dock.svg | 1 + .../ui/material/ui/icons/document_scanner.svg | 1 + dashboard/ui/material/ui/icons/domain.svg | 1 + dashboard/ui/material/ui/icons/domain_add.svg | 1 + .../ui/material/ui/icons/domain_disabled.svg | 1 + .../material/ui/icons/domain_verification.svg | 1 + dashboard/ui/material/ui/icons/done.svg | 1 + dashboard/ui/material/ui/icons/done_all.svg | 1 + .../ui/material/ui/icons/done_outline.svg | 1 + .../ui/material/ui/icons/donut_large.svg | 1 + .../ui/material/ui/icons/donut_small.svg | 1 + dashboard/ui/material/ui/icons/door_back.svg | 1 + dashboard/ui/material/ui/icons/door_front.svg | 1 + .../ui/material/ui/icons/door_sliding.svg | 1 + dashboard/ui/material/ui/icons/doorbell.svg | 1 + .../ui/material/ui/icons/double_arrow.svg | 1 + .../ui/material/ui/icons/downhill_skiing.svg | 1 + dashboard/ui/material/ui/icons/download.svg | 1 + .../ui/material/ui/icons/download_done.svg | 1 + .../ui/icons/download_for_offline.svg | 1 + .../ui/material/ui/icons/downloading.svg | 1 + dashboard/ui/material/ui/icons/drafts.svg | 1 + .../ui/material/ui/icons/drag_handle.svg | 1 + .../ui/material/ui/icons/drag_indicator.svg | 1 + dashboard/ui/material/ui/icons/draw.svg | 1 + dashboard/ui/material/ui/icons/drive_eta.svg | 1 + .../ui/material/ui/icons/drive_file_move.svg | 1 + .../material/ui/icons/drive_file_move_rtl.svg | 1 + .../ui/icons/drive_file_rename_outline.svg | 1 + .../material/ui/icons/drive_folder_upload.svg | 1 + dashboard/ui/material/ui/icons/dry.svg | 1 + .../ui/material/ui/icons/dry_cleaning.svg | 1 + dashboard/ui/material/ui/icons/duo.svg | 1 + dashboard/ui/material/ui/icons/dvr.svg | 1 + .../ui/material/ui/icons/dynamic_feed.svg | 1 + .../ui/material/ui/icons/dynamic_form.svg | 1 + .../ui/material/ui/icons/e_mobiledata.svg | 1 + dashboard/ui/material/ui/icons/earbuds.svg | 1 + .../ui/material/ui/icons/earbuds_battery.svg | 1 + dashboard/ui/material/ui/icons/east.svg | 1 + .../ui/material/ui/icons/edgesensor_high.svg | 1 + .../ui/material/ui/icons/edgesensor_low.svg | 1 + dashboard/ui/material/ui/icons/edit.svg | 1 + .../ui/material/ui/icons/edit_attributes.svg | 1 + .../ui/material/ui/icons/edit_calendar.svg | 1 + .../ui/material/ui/icons/edit_location.svg | 1 + .../material/ui/icons/edit_location_alt.svg | 1 + dashboard/ui/material/ui/icons/edit_note.svg | 1 + .../material/ui/icons/edit_notifications.svg | 1 + dashboard/ui/material/ui/icons/edit_off.svg | 1 + dashboard/ui/material/ui/icons/edit_road.svg | 1 + dashboard/ui/material/ui/icons/egg.svg | 1 + dashboard/ui/material/ui/icons/egg_alt.svg | 1 + dashboard/ui/material/ui/icons/eject.svg | 1 + dashboard/ui/material/ui/icons/elderly.svg | 1 + .../ui/material/ui/icons/elderly_woman.svg | 1 + .../ui/material/ui/icons/electric_bike.svg | 1 + .../ui/material/ui/icons/electric_bolt.svg | 1 + .../ui/material/ui/icons/electric_car.svg | 1 + .../ui/material/ui/icons/electric_meter.svg | 1 + .../ui/material/ui/icons/electric_moped.svg | 1 + .../material/ui/icons/electric_rickshaw.svg | 1 + .../ui/material/ui/icons/electric_scooter.svg | 1 + .../material/ui/icons/electrical_services.svg | 1 + dashboard/ui/material/ui/icons/elevator.svg | 1 + dashboard/ui/material/ui/icons/email.svg | 1 + dashboard/ui/material/ui/icons/emergency.svg | 1 + .../material/ui/icons/emergency_recording.svg | 1 + .../ui/material/ui/icons/emergency_share.svg | 1 + .../ui/material/ui/icons/emoji_emotions.svg | 1 + .../ui/material/ui/icons/emoji_events.svg | 1 + .../material/ui/icons/emoji_food_beverage.svg | 1 + .../ui/material/ui/icons/emoji_nature.svg | 1 + .../ui/material/ui/icons/emoji_objects.svg | 1 + .../ui/material/ui/icons/emoji_people.svg | 1 + .../ui/material/ui/icons/emoji_symbols.svg | 1 + .../ui/icons/emoji_transportation.svg | 1 + .../material/ui/icons/energy_savings_leaf.svg | 1 + .../ui/material/ui/icons/engineering.svg | 1 + .../material/ui/icons/enhanced_encryption.svg | 1 + dashboard/ui/material/ui/icons/equalizer.svg | 1 + dashboard/ui/material/ui/icons/error.svg | 1 + .../ui/material/ui/icons/error_outline.svg | 1 + dashboard/ui/material/ui/icons/escalator.svg | 1 + .../material/ui/icons/escalator_warning.svg | 1 + dashboard/ui/material/ui/icons/euro.svg | 1 + .../ui/material/ui/icons/euro_symbol.svg | 1 + dashboard/ui/material/ui/icons/ev_station.svg | 1 + dashboard/ui/material/ui/icons/event.svg | 1 + .../ui/material/ui/icons/event_available.svg | 1 + dashboard/ui/material/ui/icons/event_busy.svg | 1 + dashboard/ui/material/ui/icons/event_note.svg | 1 + .../ui/material/ui/icons/event_repeat.svg | 1 + dashboard/ui/material/ui/icons/event_seat.svg | 1 + .../ui/material/ui/icons/exit_to_app.svg | 1 + dashboard/ui/material/ui/icons/expand.svg | 1 + .../material/ui/icons/expand_circle_down.svg | 1 + .../ui/material/ui/icons/expand_less.svg | 1 + .../ui/material/ui/icons/expand_more.svg | 1 + dashboard/ui/material/ui/icons/explicit.svg | 1 + dashboard/ui/material/ui/icons/explore.svg | 1 + .../ui/material/ui/icons/explore_off.svg | 1 + dashboard/ui/material/ui/icons/exposure.svg | 1 + .../ui/material/ui/icons/exposure_neg_1.svg | 1 + .../ui/material/ui/icons/exposure_neg_2.svg | 1 + .../ui/material/ui/icons/exposure_plus_1.svg | 1 + .../ui/material/ui/icons/exposure_plus_2.svg | 1 + .../ui/material/ui/icons/exposure_zero.svg | 1 + dashboard/ui/material/ui/icons/extension.svg | 1 + .../ui/material/ui/icons/extension_off.svg | 1 + dashboard/ui/material/ui/icons/face.svg | 1 + dashboard/ui/material/ui/icons/face_2.svg | 1 + dashboard/ui/material/ui/icons/face_3.svg | 1 + dashboard/ui/material/ui/icons/face_4.svg | 1 + dashboard/ui/material/ui/icons/face_5.svg | 1 + dashboard/ui/material/ui/icons/face_6.svg | 1 + .../ui/icons/face_retouching_natural.svg | 1 + .../material/ui/icons/face_retouching_off.svg | 1 + dashboard/ui/material/ui/icons/fact_check.svg | 1 + dashboard/ui/material/ui/icons/factory.svg | 1 + .../ui/material/ui/icons/family_restroom.svg | 1 + .../ui/material/ui/icons/fast_forward.svg | 1 + .../ui/material/ui/icons/fast_rewind.svg | 1 + dashboard/ui/material/ui/icons/fastfood.svg | 1 + dashboard/ui/material/ui/icons/favorite.svg | 1 + .../ui/material/ui/icons/favorite_border.svg | 1 + dashboard/ui/material/ui/icons/fax.svg | 1 + .../material/ui/icons/featured_play_list.svg | 1 + .../ui/material/ui/icons/featured_video.svg | 1 + dashboard/ui/material/ui/icons/feed.svg | 1 + dashboard/ui/material/ui/icons/feedback.svg | 1 + dashboard/ui/material/ui/icons/female.svg | 1 + dashboard/ui/material/ui/icons/fence.svg | 1 + dashboard/ui/material/ui/icons/festival.svg | 1 + dashboard/ui/material/ui/icons/fiber_dvr.svg | 1 + .../material/ui/icons/fiber_manual_record.svg | 1 + dashboard/ui/material/ui/icons/fiber_new.svg | 1 + dashboard/ui/material/ui/icons/fiber_pin.svg | 1 + .../material/ui/icons/fiber_smart_record.svg | 1 + dashboard/ui/material/ui/icons/file_copy.svg | 1 + .../ui/material/ui/icons/file_download.svg | 1 + .../material/ui/icons/file_download_done.svg | 1 + .../material/ui/icons/file_download_off.svg | 1 + dashboard/ui/material/ui/icons/file_open.svg | 1 + .../ui/material/ui/icons/file_present.svg | 1 + .../ui/material/ui/icons/file_upload.svg | 1 + dashboard/ui/material/ui/icons/filter.svg | 1 + dashboard/ui/material/ui/icons/filter_1.svg | 1 + dashboard/ui/material/ui/icons/filter_2.svg | 1 + dashboard/ui/material/ui/icons/filter_3.svg | 1 + dashboard/ui/material/ui/icons/filter_4.svg | 1 + dashboard/ui/material/ui/icons/filter_5.svg | 1 + dashboard/ui/material/ui/icons/filter_6.svg | 1 + dashboard/ui/material/ui/icons/filter_7.svg | 1 + dashboard/ui/material/ui/icons/filter_8.svg | 1 + dashboard/ui/material/ui/icons/filter_9.svg | 1 + .../ui/material/ui/icons/filter_9_plus.svg | 1 + dashboard/ui/material/ui/icons/filter_alt.svg | 1 + .../ui/material/ui/icons/filter_alt_off.svg | 1 + .../ui/material/ui/icons/filter_b_and_w.svg | 1 + .../material/ui/icons/filter_center_focus.svg | 1 + .../ui/material/ui/icons/filter_drama.svg | 1 + .../ui/material/ui/icons/filter_frames.svg | 1 + dashboard/ui/material/ui/icons/filter_hdr.svg | 1 + .../ui/material/ui/icons/filter_list.svg | 1 + .../ui/material/ui/icons/filter_list_off.svg | 1 + .../ui/material/ui/icons/filter_none.svg | 1 + .../material/ui/icons/filter_tilt_shift.svg | 1 + .../ui/material/ui/icons/filter_vintage.svg | 1 + .../ui/material/ui/icons/find_in_page.svg | 1 + .../ui/material/ui/icons/find_replace.svg | 1 + .../ui/material/ui/icons/fingerprint.svg | 1 + .../material/ui/icons/fire_extinguisher.svg | 1 + .../ui/material/ui/icons/fire_hydrant_alt.svg | 1 + dashboard/ui/material/ui/icons/fire_truck.svg | 1 + dashboard/ui/material/ui/icons/fireplace.svg | 1 + dashboard/ui/material/ui/icons/first_page.svg | 1 + dashboard/ui/material/ui/icons/fit_screen.svg | 1 + dashboard/ui/material/ui/icons/fitbit.svg | 1 + .../ui/material/ui/icons/fitness_center.svg | 1 + dashboard/ui/material/ui/icons/flag.svg | 1 + .../ui/material/ui/icons/flag_circle.svg | 1 + dashboard/ui/material/ui/icons/flaky.svg | 1 + dashboard/ui/material/ui/icons/flare.svg | 1 + dashboard/ui/material/ui/icons/flash_auto.svg | 1 + dashboard/ui/material/ui/icons/flash_off.svg | 1 + dashboard/ui/material/ui/icons/flash_on.svg | 1 + .../ui/material/ui/icons/flashlight_off.svg | 1 + .../ui/material/ui/icons/flashlight_on.svg | 1 + dashboard/ui/material/ui/icons/flatware.svg | 1 + dashboard/ui/material/ui/icons/flight.svg | 1 + .../ui/material/ui/icons/flight_class.svg | 1 + .../ui/material/ui/icons/flight_land.svg | 1 + .../ui/material/ui/icons/flight_takeoff.svg | 1 + dashboard/ui/material/ui/icons/flip.svg | 1 + .../material/ui/icons/flip_camera_android.svg | 1 + .../ui/material/ui/icons/flip_camera_ios.svg | 1 + .../ui/material/ui/icons/flip_to_back.svg | 1 + .../ui/material/ui/icons/flip_to_front.svg | 1 + dashboard/ui/material/ui/icons/flood.svg | 1 + .../ui/material/ui/icons/fluorescent.svg | 1 + .../ui/material/ui/icons/flutter_dash.svg | 1 + dashboard/ui/material/ui/icons/fmd_bad.svg | 1 + dashboard/ui/material/ui/icons/fmd_good.svg | 1 + dashboard/ui/material/ui/icons/folder.svg | 1 + .../ui/material/ui/icons/folder_copy.svg | 1 + .../ui/material/ui/icons/folder_delete.svg | 1 + dashboard/ui/material/ui/icons/folder_off.svg | 1 + .../ui/material/ui/icons/folder_open.svg | 1 + .../ui/material/ui/icons/folder_shared.svg | 1 + .../ui/material/ui/icons/folder_special.svg | 1 + dashboard/ui/material/ui/icons/folder_zip.svg | 1 + .../ui/material/ui/icons/follow_the_signs.svg | 1 + .../ui/material/ui/icons/font_download.svg | 1 + .../material/ui/icons/font_download_off.svg | 1 + dashboard/ui/material/ui/icons/food_bank.svg | 1 + dashboard/ui/material/ui/icons/forest.svg | 1 + dashboard/ui/material/ui/icons/fork_left.svg | 1 + dashboard/ui/material/ui/icons/fork_right.svg | 1 + .../material/ui/icons/format_align_center.svg | 1 + .../ui/icons/format_align_justify.svg | 1 + .../material/ui/icons/format_align_left.svg | 1 + .../material/ui/icons/format_align_right.svg | 1 + .../ui/material/ui/icons/format_bold.svg | 1 + .../ui/material/ui/icons/format_clear.svg | 1 + .../material/ui/icons/format_color_fill.svg | 1 + .../material/ui/icons/format_color_reset.svg | 1 + .../material/ui/icons/format_color_text.svg | 1 + .../ui/icons/format_indent_decrease.svg | 1 + .../ui/icons/format_indent_increase.svg | 1 + .../ui/material/ui/icons/format_italic.svg | 1 + .../material/ui/icons/format_line_spacing.svg | 1 + .../ui/icons/format_list_bulleted.svg | 1 + .../ui/icons/format_list_numbered.svg | 1 + .../ui/icons/format_list_numbered_rtl.svg | 1 + .../ui/material/ui/icons/format_overline.svg | 1 + .../ui/material/ui/icons/format_paint.svg | 1 + .../ui/material/ui/icons/format_quote.svg | 1 + .../ui/material/ui/icons/format_shapes.svg | 1 + .../ui/material/ui/icons/format_size.svg | 1 + .../ui/icons/format_strikethrough.svg | 1 + .../ui/icons/format_textdirection_l_to_r.svg | 1 + .../ui/icons/format_textdirection_r_to_l.svg | 1 + .../material/ui/icons/format_underlined.svg | 1 + dashboard/ui/material/ui/icons/fort.svg | 1 + dashboard/ui/material/ui/icons/forum.svg | 1 + dashboard/ui/material/ui/icons/forward.svg | 1 + dashboard/ui/material/ui/icons/forward_10.svg | 1 + dashboard/ui/material/ui/icons/forward_30.svg | 1 + dashboard/ui/material/ui/icons/forward_5.svg | 1 + .../ui/material/ui/icons/forward_to_inbox.svg | 1 + dashboard/ui/material/ui/icons/foundation.svg | 1 + .../ui/material/ui/icons/free_breakfast.svg | 1 + .../material/ui/icons/free_cancellation.svg | 1 + dashboard/ui/material/ui/icons/front_hand.svg | 1 + dashboard/ui/material/ui/icons/fullscreen.svg | 1 + .../ui/material/ui/icons/fullscreen_exit.svg | 1 + dashboard/ui/material/ui/icons/functions.svg | 1 + .../ui/material/ui/icons/g_mobiledata.svg | 1 + .../ui/material/ui/icons/g_translate.svg | 1 + dashboard/ui/material/ui/icons/gamepad.svg | 1 + dashboard/ui/material/ui/icons/games.svg | 1 + dashboard/ui/material/ui/icons/garage.svg | 1 + dashboard/ui/material/ui/icons/gas_meter.svg | 1 + dashboard/ui/material/ui/icons/gavel.svg | 1 + .../ui/material/ui/icons/generate_icons.sh | 18 + .../material/ui/icons/generating_tokens.svg | 1 + dashboard/ui/material/ui/icons/gesture.svg | 1 + dashboard/ui/material/ui/icons/get_app.svg | 1 + dashboard/ui/material/ui/icons/gif.svg | 1 + dashboard/ui/material/ui/icons/gif_box.svg | 1 + dashboard/ui/material/ui/icons/girl.svg | 1 + dashboard/ui/material/ui/icons/gite.svg | 1 + .../ui/material/ui/icons/golf_course.svg | 1 + dashboard/ui/material/ui/icons/gpp_bad.svg | 1 + dashboard/ui/material/ui/icons/gpp_good.svg | 1 + dashboard/ui/material/ui/icons/gpp_maybe.svg | 1 + dashboard/ui/material/ui/icons/gps_fixed.svg | 1 + .../ui/material/ui/icons/gps_not_fixed.svg | 1 + dashboard/ui/material/ui/icons/gps_off.svg | 1 + dashboard/ui/material/ui/icons/grade.svg | 1 + dashboard/ui/material/ui/icons/gradient.svg | 1 + dashboard/ui/material/ui/icons/grading.svg | 1 + dashboard/ui/material/ui/icons/grain.svg | 1 + dashboard/ui/material/ui/icons/graphic_eq.svg | 1 + dashboard/ui/material/ui/icons/grass.svg | 1 + dashboard/ui/material/ui/icons/grid_3x3.svg | 1 + dashboard/ui/material/ui/icons/grid_4x4.svg | 1 + .../ui/material/ui/icons/grid_goldenratio.svg | 1 + dashboard/ui/material/ui/icons/grid_off.svg | 1 + dashboard/ui/material/ui/icons/grid_on.svg | 1 + dashboard/ui/material/ui/icons/grid_view.svg | 1 + dashboard/ui/material/ui/icons/group.svg | 1 + dashboard/ui/material/ui/icons/group_add.svg | 1 + dashboard/ui/material/ui/icons/group_off.svg | 1 + .../ui/material/ui/icons/group_remove.svg | 1 + dashboard/ui/material/ui/icons/group_work.svg | 1 + dashboard/ui/material/ui/icons/groups.svg | 1 + dashboard/ui/material/ui/icons/groups_2.svg | 1 + dashboard/ui/material/ui/icons/groups_3.svg | 1 + .../ui/material/ui/icons/h_mobiledata.svg | 1 + .../material/ui/icons/h_plus_mobiledata.svg | 1 + dashboard/ui/material/ui/icons/hail.svg | 1 + dashboard/ui/material/ui/icons/handshake.svg | 1 + dashboard/ui/material/ui/icons/handyman.svg | 1 + dashboard/ui/material/ui/icons/hardware.svg | 1 + dashboard/ui/material/ui/icons/hd.svg | 1 + dashboard/ui/material/ui/icons/hdr_auto.svg | 1 + .../ui/material/ui/icons/hdr_auto_select.svg | 1 + .../material/ui/icons/hdr_enhanced_select.svg | 1 + dashboard/ui/material/ui/icons/hdr_off.svg | 1 + .../ui/material/ui/icons/hdr_off_select.svg | 1 + dashboard/ui/material/ui/icons/hdr_on.svg | 1 + .../ui/material/ui/icons/hdr_on_select.svg | 1 + dashboard/ui/material/ui/icons/hdr_plus.svg | 1 + dashboard/ui/material/ui/icons/hdr_strong.svg | 1 + dashboard/ui/material/ui/icons/hdr_weak.svg | 1 + dashboard/ui/material/ui/icons/headphones.svg | 1 + .../material/ui/icons/headphones_battery.svg | 1 + dashboard/ui/material/ui/icons/headset.svg | 1 + .../ui/material/ui/icons/headset_mic.svg | 1 + .../ui/material/ui/icons/headset_off.svg | 1 + dashboard/ui/material/ui/icons/healing.svg | 1 + .../material/ui/icons/health_and_safety.svg | 1 + dashboard/ui/material/ui/icons/hearing.svg | 1 + .../ui/material/ui/icons/hearing_disabled.svg | 1 + .../ui/material/ui/icons/heart_broken.svg | 1 + dashboard/ui/material/ui/icons/heat_pump.svg | 1 + dashboard/ui/material/ui/icons/height.svg | 1 + dashboard/ui/material/ui/icons/help.svg | 1 + .../ui/material/ui/icons/help_center.svg | 1 + .../ui/material/ui/icons/help_outline.svg | 1 + dashboard/ui/material/ui/icons/hevc.svg | 1 + dashboard/ui/material/ui/icons/hexagon.svg | 1 + dashboard/ui/material/ui/icons/hide_image.svg | 1 + .../ui/material/ui/icons/hide_source.svg | 1 + .../ui/material/ui/icons/high_quality.svg | 1 + dashboard/ui/material/ui/icons/highlight.svg | 1 + .../ui/material/ui/icons/highlight_alt.svg | 1 + .../ui/material/ui/icons/highlight_off.svg | 1 + dashboard/ui/material/ui/icons/hiking.svg | 1 + dashboard/ui/material/ui/icons/history.svg | 1 + .../ui/material/ui/icons/history_edu.svg | 1 + .../material/ui/icons/history_toggle_off.svg | 1 + dashboard/ui/material/ui/icons/hive.svg | 1 + dashboard/ui/material/ui/icons/hls.svg | 1 + dashboard/ui/material/ui/icons/hls_off.svg | 1 + .../ui/material/ui/icons/holiday_village.svg | 1 + dashboard/ui/material/ui/icons/home.svg | 1 + dashboard/ui/material/ui/icons/home_max.svg | 1 + dashboard/ui/material/ui/icons/home_mini.svg | 1 + .../material/ui/icons/home_repair_service.svg | 1 + dashboard/ui/material/ui/icons/home_work.svg | 1 + .../ui/icons/horizontal_distribute.svg | 1 + .../ui/material/ui/icons/horizontal_rule.svg | 1 + .../ui/material/ui/icons/horizontal_split.svg | 1 + dashboard/ui/material/ui/icons/hot_tub.svg | 1 + dashboard/ui/material/ui/icons/hotel.svg | 1 + .../ui/material/ui/icons/hotel_class.svg | 1 + .../ui/material/ui/icons/hourglass_bottom.svg | 1 + .../material/ui/icons/hourglass_disabled.svg | 1 + .../ui/material/ui/icons/hourglass_empty.svg | 1 + .../ui/material/ui/icons/hourglass_full.svg | 1 + .../ui/material/ui/icons/hourglass_top.svg | 1 + dashboard/ui/material/ui/icons/house.svg | 1 + .../ui/material/ui/icons/house_siding.svg | 1 + dashboard/ui/material/ui/icons/houseboat.svg | 1 + dashboard/ui/material/ui/icons/how_to_reg.svg | 1 + .../ui/material/ui/icons/how_to_vote.svg | 1 + dashboard/ui/material/ui/icons/html.svg | 1 + dashboard/ui/material/ui/icons/http.svg | 1 + dashboard/ui/material/ui/icons/https.svg | 1 + dashboard/ui/material/ui/icons/hub.svg | 1 + dashboard/ui/material/ui/icons/hvac.svg | 1 + .../ui/material/ui/icons/ice_skating.svg | 1 + dashboard/ui/material/ui/icons/icecream.svg | 1 + dashboard/ui/material/ui/icons/icons.slint | 2126 +++++++++++++++++ dashboard/ui/material/ui/icons/image.svg | 1 + .../material/ui/icons/image_aspect_ratio.svg | 1 + .../material/ui/icons/image_not_supported.svg | 1 + .../ui/material/ui/icons/image_search.svg | 1 + .../material/ui/icons/imagesearch_roller.svg | 1 + .../ui/material/ui/icons/import_contacts.svg | 1 + .../ui/material/ui/icons/import_export.svg | 1 + .../material/ui/icons/important_devices.svg | 1 + dashboard/ui/material/ui/icons/inbox.svg | 1 + .../material/ui/icons/incomplete_circle.svg | 1 + .../ui/icons/indeterminate_check_box.svg | 1 + dashboard/ui/material/ui/icons/info.svg | 1 + dashboard/ui/material/ui/icons/input.svg | 1 + .../ui/material/ui/icons/insert_chart.svg | 1 + .../ui/icons/insert_chart_outlined.svg | 1 + .../ui/material/ui/icons/insert_comment.svg | 1 + .../material/ui/icons/insert_drive_file.svg | 1 + .../ui/material/ui/icons/insert_emoticon.svg | 1 + .../material/ui/icons/insert_invitation.svg | 1 + .../ui/material/ui/icons/insert_link.svg | 1 + .../material/ui/icons/insert_page_break.svg | 1 + .../ui/material/ui/icons/insert_photo.svg | 1 + dashboard/ui/material/ui/icons/insights.svg | 1 + .../ui/material/ui/icons/install_desktop.svg | 1 + .../ui/material/ui/icons/install_mobile.svg | 1 + .../ui/icons/integration_instructions.svg | 1 + dashboard/ui/material/ui/icons/interests.svg | 1 + .../ui/material/ui/icons/interpreter_mode.svg | 1 + dashboard/ui/material/ui/icons/inventory.svg | 1 + .../ui/material/ui/icons/inventory_2.svg | 1 + .../ui/material/ui/icons/invert_colors.svg | 1 + .../material/ui/icons/invert_colors_off.svg | 1 + dashboard/ui/material/ui/icons/ios_share.svg | 1 + dashboard/ui/material/ui/icons/iron.svg | 1 + dashboard/ui/material/ui/icons/iso.svg | 1 + dashboard/ui/material/ui/icons/javascript.svg | 1 + dashboard/ui/material/ui/icons/join_full.svg | 1 + dashboard/ui/material/ui/icons/join_inner.svg | 1 + dashboard/ui/material/ui/icons/join_left.svg | 1 + dashboard/ui/material/ui/icons/join_right.svg | 1 + dashboard/ui/material/ui/icons/kayaking.svg | 1 + .../ui/material/ui/icons/kebab_dining.svg | 1 + dashboard/ui/material/ui/icons/key.svg | 1 + dashboard/ui/material/ui/icons/key_off.svg | 1 + dashboard/ui/material/ui/icons/keyboard.svg | 1 + .../ui/material/ui/icons/keyboard_alt.svg | 1 + .../material/ui/icons/keyboard_arrow_down.svg | 1 + .../material/ui/icons/keyboard_arrow_left.svg | 1 + .../ui/icons/keyboard_arrow_right.svg | 1 + .../material/ui/icons/keyboard_arrow_up.svg | 1 + .../material/ui/icons/keyboard_backspace.svg | 1 + .../material/ui/icons/keyboard_capslock.svg | 1 + .../ui/icons/keyboard_command_key.svg | 1 + .../ui/icons/keyboard_control_key.svg | 1 + .../ui/icons/keyboard_double_arrow_down.svg | 1 + .../ui/icons/keyboard_double_arrow_left.svg | 1 + .../ui/icons/keyboard_double_arrow_right.svg | 1 + .../ui/icons/keyboard_double_arrow_up.svg | 1 + .../ui/material/ui/icons/keyboard_hide.svg | 1 + .../material/ui/icons/keyboard_option_key.svg | 1 + .../ui/material/ui/icons/keyboard_return.svg | 1 + .../ui/material/ui/icons/keyboard_tab.svg | 1 + .../ui/material/ui/icons/keyboard_voice.svg | 1 + dashboard/ui/material/ui/icons/king_bed.svg | 1 + dashboard/ui/material/ui/icons/kitchen.svg | 1 + .../ui/material/ui/icons/kitesurfing.svg | 1 + dashboard/ui/material/ui/icons/label.svg | 1 + .../ui/material/ui/icons/label_important.svg | 1 + dashboard/ui/material/ui/icons/label_off.svg | 1 + dashboard/ui/material/ui/icons/lan.svg | 1 + dashboard/ui/material/ui/icons/landscape.svg | 1 + dashboard/ui/material/ui/icons/landslide.svg | 1 + dashboard/ui/material/ui/icons/language.svg | 1 + dashboard/ui/material/ui/icons/laptop.svg | 1 + .../material/ui/icons/laptop_chromebook.svg | 1 + dashboard/ui/material/ui/icons/laptop_mac.svg | 1 + .../ui/material/ui/icons/laptop_windows.svg | 1 + dashboard/ui/material/ui/icons/last_page.svg | 1 + dashboard/ui/material/ui/icons/launch.svg | 1 + dashboard/ui/material/ui/icons/layers.svg | 1 + .../ui/material/ui/icons/layers_clear.svg | 1 + .../ui/material/ui/icons/leaderboard.svg | 1 + dashboard/ui/material/ui/icons/leak_add.svg | 1 + .../ui/material/ui/icons/leak_remove.svg | 1 + .../ui/material/ui/icons/legend_toggle.svg | 1 + dashboard/ui/material/ui/icons/lens.svg | 1 + dashboard/ui/material/ui/icons/lens_blur.svg | 1 + .../ui/material/ui/icons/library_add.svg | 1 + .../material/ui/icons/library_add_check.svg | 1 + .../ui/material/ui/icons/library_books.svg | 1 + .../ui/material/ui/icons/library_music.svg | 1 + dashboard/ui/material/ui/icons/light.svg | 1 + dashboard/ui/material/ui/icons/light_mode.svg | 1 + dashboard/ui/material/ui/icons/lightbulb.svg | 1 + .../ui/material/ui/icons/lightbulb_circle.svg | 1 + dashboard/ui/material/ui/icons/line_axis.svg | 1 + dashboard/ui/material/ui/icons/line_style.svg | 1 + .../ui/material/ui/icons/line_weight.svg | 1 + .../ui/material/ui/icons/linear_scale.svg | 1 + dashboard/ui/material/ui/icons/link.svg | 1 + dashboard/ui/material/ui/icons/link_off.svg | 1 + .../ui/material/ui/icons/linked_camera.svg | 1 + dashboard/ui/material/ui/icons/liquor.svg | 1 + dashboard/ui/material/ui/icons/list.svg | 1 + dashboard/ui/material/ui/icons/list_alt.svg | 1 + dashboard/ui/material/ui/icons/live_help.svg | 1 + dashboard/ui/material/ui/icons/live_tv.svg | 1 + dashboard/ui/material/ui/icons/living.svg | 1 + .../ui/material/ui/icons/local_activity.svg | 1 + .../ui/material/ui/icons/local_airport.svg | 1 + dashboard/ui/material/ui/icons/local_atm.svg | 1 + dashboard/ui/material/ui/icons/local_bar.svg | 1 + dashboard/ui/material/ui/icons/local_cafe.svg | 1 + .../ui/material/ui/icons/local_car_wash.svg | 1 + .../ui/icons/local_convenience_store.svg | 1 + .../ui/material/ui/icons/local_dining.svg | 1 + .../ui/material/ui/icons/local_drink.svg | 1 + .../ui/icons/local_fire_department.svg | 1 + .../ui/material/ui/icons/local_florist.svg | 1 + .../material/ui/icons/local_gas_station.svg | 1 + .../material/ui/icons/local_grocery_store.svg | 1 + .../ui/material/ui/icons/local_hospital.svg | 1 + .../ui/material/ui/icons/local_hotel.svg | 1 + .../ui/icons/local_laundry_service.svg | 1 + .../ui/material/ui/icons/local_library.svg | 1 + dashboard/ui/material/ui/icons/local_mall.svg | 1 + .../ui/material/ui/icons/local_movies.svg | 1 + .../ui/material/ui/icons/local_offer.svg | 1 + .../ui/material/ui/icons/local_parking.svg | 1 + .../ui/material/ui/icons/local_pharmacy.svg | 1 + .../ui/material/ui/icons/local_phone.svg | 1 + .../ui/material/ui/icons/local_pizza.svg | 1 + dashboard/ui/material/ui/icons/local_play.svg | 1 + .../ui/material/ui/icons/local_police.svg | 1 + .../material/ui/icons/local_post_office.svg | 1 + .../ui/material/ui/icons/local_printshop.svg | 1 + dashboard/ui/material/ui/icons/local_see.svg | 1 + .../ui/material/ui/icons/local_shipping.svg | 1 + dashboard/ui/material/ui/icons/local_taxi.svg | 1 + .../ui/material/ui/icons/location_city.svg | 1 + .../material/ui/icons/location_disabled.svg | 1 + .../ui/material/ui/icons/location_off.svg | 1 + .../ui/material/ui/icons/location_on.svg | 1 + .../material/ui/icons/location_searching.svg | 1 + dashboard/ui/material/ui/icons/lock.svg | 1 + dashboard/ui/material/ui/icons/lock_clock.svg | 1 + dashboard/ui/material/ui/icons/lock_open.svg | 1 + .../ui/material/ui/icons/lock_person.svg | 1 + dashboard/ui/material/ui/icons/lock_reset.svg | 1 + dashboard/ui/material/ui/icons/login.svg | 1 + dashboard/ui/material/ui/icons/logo_dev.svg | 1 + dashboard/ui/material/ui/icons/logout.svg | 1 + dashboard/ui/material/ui/icons/looks.svg | 1 + dashboard/ui/material/ui/icons/looks_3.svg | 1 + dashboard/ui/material/ui/icons/looks_4.svg | 1 + dashboard/ui/material/ui/icons/looks_5.svg | 1 + dashboard/ui/material/ui/icons/looks_6.svg | 1 + dashboard/ui/material/ui/icons/looks_one.svg | 1 + dashboard/ui/material/ui/icons/looks_two.svg | 1 + dashboard/ui/material/ui/icons/loop.svg | 1 + dashboard/ui/material/ui/icons/loupe.svg | 1 + .../ui/material/ui/icons/low_priority.svg | 1 + dashboard/ui/material/ui/icons/loyalty.svg | 1 + .../ui/material/ui/icons/lte_mobiledata.svg | 1 + .../material/ui/icons/lte_plus_mobiledata.svg | 1 + dashboard/ui/material/ui/icons/luggage.svg | 1 + .../ui/material/ui/icons/lunch_dining.svg | 1 + dashboard/ui/material/ui/icons/lyrics.svg | 1 + dashboard/ui/material/ui/icons/macro_off.svg | 1 + dashboard/ui/material/ui/icons/mail.svg | 1 + dashboard/ui/material/ui/icons/mail_lock.svg | 1 + .../ui/material/ui/icons/mail_outline.svg | 1 + dashboard/ui/material/ui/icons/male.svg | 1 + dashboard/ui/material/ui/icons/man.svg | 1 + dashboard/ui/material/ui/icons/man_2.svg | 1 + dashboard/ui/material/ui/icons/man_3.svg | 1 + dashboard/ui/material/ui/icons/man_4.svg | 1 + .../ui/material/ui/icons/manage_accounts.svg | 1 + .../ui/material/ui/icons/manage_history.svg | 1 + .../ui/material/ui/icons/manage_search.svg | 1 + dashboard/ui/material/ui/icons/map.svg | 1 + .../ui/material/ui/icons/maps_home_work.svg | 1 + dashboard/ui/material/ui/icons/maps_ugc.svg | 1 + dashboard/ui/material/ui/icons/margin.svg | 1 + .../ui/material/ui/icons/mark_as_unread.svg | 1 + .../ui/material/ui/icons/mark_chat_read.svg | 1 + .../ui/material/ui/icons/mark_chat_unread.svg | 1 + .../ui/material/ui/icons/mark_email_read.svg | 1 + .../material/ui/icons/mark_email_unread.svg | 1 + .../ui/icons/mark_unread_chat_alt.svg | 1 + dashboard/ui/material/ui/icons/markunread.svg | 1 + .../material/ui/icons/markunread_mailbox.svg | 1 + dashboard/ui/material/ui/icons/masks.svg | 1 + dashboard/ui/material/ui/icons/maximize.svg | 1 + .../material/ui/icons/media_bluetooth_off.svg | 1 + .../material/ui/icons/media_bluetooth_on.svg | 1 + dashboard/ui/material/ui/icons/mediation.svg | 1 + .../material/ui/icons/medical_information.svg | 1 + .../ui/material/ui/icons/medical_services.svg | 1 + dashboard/ui/material/ui/icons/medication.svg | 1 + .../material/ui/icons/medication_liquid.svg | 1 + .../ui/material/ui/icons/meeting_room.svg | 1 + dashboard/ui/material/ui/icons/memory.svg | 1 + dashboard/ui/material/ui/icons/menu.svg | 1 + dashboard/ui/material/ui/icons/menu_book.svg | 1 + dashboard/ui/material/ui/icons/menu_open.svg | 1 + dashboard/ui/material/ui/icons/merge.svg | 1 + dashboard/ui/material/ui/icons/merge_type.svg | 1 + dashboard/ui/material/ui/icons/message.svg | 1 + dashboard/ui/material/ui/icons/mic.svg | 1 + .../ui/material/ui/icons/mic_external_off.svg | 1 + .../ui/material/ui/icons/mic_external_on.svg | 1 + dashboard/ui/material/ui/icons/mic_none.svg | 1 + dashboard/ui/material/ui/icons/mic_off.svg | 1 + dashboard/ui/material/ui/icons/microwave.svg | 1 + .../ui/material/ui/icons/military_tech.svg | 1 + dashboard/ui/material/ui/icons/minimize.svg | 1 + .../ui/material/ui/icons/minor_crash.svg | 1 + .../ui/icons/miscellaneous_services.svg | 1 + .../material/ui/icons/missed_video_call.svg | 1 + dashboard/ui/material/ui/icons/mms.svg | 1 + .../ui/material/ui/icons/mobile_friendly.svg | 1 + dashboard/ui/material/ui/icons/mobile_off.svg | 1 + .../material/ui/icons/mobile_screen_share.svg | 1 + .../ui/material/ui/icons/mobiledata_off.svg | 1 + dashboard/ui/material/ui/icons/mode.svg | 1 + .../ui/material/ui/icons/mode_comment.svg | 1 + dashboard/ui/material/ui/icons/mode_edit.svg | 1 + .../material/ui/icons/mode_edit_outline.svg | 1 + .../ui/material/ui/icons/mode_fan_off.svg | 1 + dashboard/ui/material/ui/icons/mode_night.svg | 1 + .../ui/material/ui/icons/mode_of_travel.svg | 1 + .../ui/material/ui/icons/mode_standby.svg | 1 + .../ui/material/ui/icons/model_training.svg | 1 + .../ui/material/ui/icons/monetization_on.svg | 1 + dashboard/ui/material/ui/icons/money.svg | 1 + dashboard/ui/material/ui/icons/money_off.svg | 1 + .../ui/material/ui/icons/money_off_csred.svg | 1 + dashboard/ui/material/ui/icons/monitor.svg | 1 + .../ui/material/ui/icons/monitor_heart.svg | 1 + .../ui/material/ui/icons/monitor_weight.svg | 1 + .../material/ui/icons/monochrome_photos.svg | 1 + dashboard/ui/material/ui/icons/mood.svg | 1 + dashboard/ui/material/ui/icons/mood_bad.svg | 1 + dashboard/ui/material/ui/icons/moped.svg | 1 + dashboard/ui/material/ui/icons/more.svg | 1 + dashboard/ui/material/ui/icons/more_horiz.svg | 1 + dashboard/ui/material/ui/icons/more_time.svg | 1 + dashboard/ui/material/ui/icons/more_vert.svg | 1 + dashboard/ui/material/ui/icons/mosque.svg | 1 + .../material/ui/icons/motion_photos_auto.svg | 1 + .../material/ui/icons/motion_photos_off.svg | 1 + .../ui/material/ui/icons/motion_photos_on.svg | 1 + .../material/ui/icons/motion_photos_pause.svg | 1 + .../ui/icons/motion_photos_paused.svg | 1 + dashboard/ui/material/ui/icons/mouse.svg | 1 + dashboard/ui/material/ui/icons/move_down.svg | 1 + .../ui/material/ui/icons/move_to_inbox.svg | 1 + dashboard/ui/material/ui/icons/move_up.svg | 1 + dashboard/ui/material/ui/icons/movie.svg | 1 + .../ui/material/ui/icons/movie_creation.svg | 1 + .../ui/material/ui/icons/movie_filter.svg | 1 + dashboard/ui/material/ui/icons/moving.svg | 1 + dashboard/ui/material/ui/icons/mp.svg | 1 + .../ui/material/ui/icons/multiline_chart.svg | 1 + .../ui/material/ui/icons/multiple_stop.svg | 1 + dashboard/ui/material/ui/icons/museum.svg | 1 + dashboard/ui/material/ui/icons/music_note.svg | 1 + dashboard/ui/material/ui/icons/music_off.svg | 1 + .../ui/material/ui/icons/music_video.svg | 1 + .../ui/material/ui/icons/my_location.svg | 1 + dashboard/ui/material/ui/icons/nat.svg | 1 + dashboard/ui/material/ui/icons/nature.svg | 1 + .../ui/material/ui/icons/nature_people.svg | 1 + .../ui/material/ui/icons/navigate_before.svg | 1 + .../ui/material/ui/icons/navigate_next.svg | 1 + dashboard/ui/material/ui/icons/navigation.svg | 1 + dashboard/ui/material/ui/icons/near_me.svg | 1 + .../ui/material/ui/icons/near_me_disabled.svg | 1 + .../ui/material/ui/icons/nearby_error.svg | 1 + dashboard/ui/material/ui/icons/nearby_off.svg | 1 + .../ui/icons/nest_cam_wired_stand.svg | 1 + .../ui/material/ui/icons/network_cell.svg | 1 + .../ui/material/ui/icons/network_check.svg | 1 + .../ui/material/ui/icons/network_locked.svg | 1 + .../ui/material/ui/icons/network_ping.svg | 1 + .../ui/material/ui/icons/network_wifi.svg | 1 + .../material/ui/icons/network_wifi_1_bar.svg | 1 + .../material/ui/icons/network_wifi_2_bar.svg | 1 + .../material/ui/icons/network_wifi_3_bar.svg | 1 + dashboard/ui/material/ui/icons/new_label.svg | 1 + .../ui/material/ui/icons/new_releases.svg | 1 + dashboard/ui/material/ui/icons/newspaper.svg | 1 + dashboard/ui/material/ui/icons/next_plan.svg | 1 + dashboard/ui/material/ui/icons/next_week.svg | 1 + dashboard/ui/material/ui/icons/nfc.svg | 1 + .../ui/material/ui/icons/night_shelter.svg | 1 + dashboard/ui/material/ui/icons/nightlife.svg | 1 + dashboard/ui/material/ui/icons/nightlight.svg | 1 + .../ui/material/ui/icons/nightlight_round.svg | 1 + .../ui/material/ui/icons/nights_stay.svg | 1 + .../ui/material/ui/icons/no_accounts.svg | 1 + .../ui/material/ui/icons/no_adult_content.svg | 1 + .../ui/material/ui/icons/no_backpack.svg | 1 + dashboard/ui/material/ui/icons/no_cell.svg | 1 + dashboard/ui/material/ui/icons/no_crash.svg | 1 + dashboard/ui/material/ui/icons/no_drinks.svg | 1 + .../ui/material/ui/icons/no_encryption.svg | 1 + .../ui/icons/no_encryption_gmailerrorred.svg | 1 + dashboard/ui/material/ui/icons/no_flash.svg | 1 + dashboard/ui/material/ui/icons/no_food.svg | 1 + dashboard/ui/material/ui/icons/no_luggage.svg | 1 + dashboard/ui/material/ui/icons/no_meals.svg | 1 + .../ui/material/ui/icons/no_meeting_room.svg | 1 + .../ui/material/ui/icons/no_photography.svg | 1 + dashboard/ui/material/ui/icons/no_sim.svg | 1 + .../ui/material/ui/icons/no_stroller.svg | 1 + .../ui/material/ui/icons/no_transfer.svg | 1 + .../ui/material/ui/icons/noise_aware.svg | 1 + .../material/ui/icons/noise_control_off.svg | 1 + .../ui/material/ui/icons/nordic_walking.svg | 1 + dashboard/ui/material/ui/icons/north.svg | 1 + dashboard/ui/material/ui/icons/north_east.svg | 1 + dashboard/ui/material/ui/icons/north_west.svg | 1 + .../ui/material/ui/icons/not_accessible.svg | 1 + .../ui/material/ui/icons/not_interested.svg | 1 + .../material/ui/icons/not_listed_location.svg | 1 + .../ui/material/ui/icons/not_started.svg | 1 + dashboard/ui/material/ui/icons/note.svg | 1 + dashboard/ui/material/ui/icons/note_add.svg | 1 + dashboard/ui/material/ui/icons/note_alt.svg | 1 + dashboard/ui/material/ui/icons/notes.svg | 1 + .../ui/material/ui/icons/notification_add.svg | 1 + .../ui/icons/notification_important.svg | 1 + .../ui/material/ui/icons/notifications.svg | 1 + .../ui/icons/notifications_active.svg | 1 + .../material/ui/icons/notifications_none.svg | 1 + .../material/ui/icons/notifications_off.svg | 1 + .../ui/icons/notifications_paused.svg | 1 + dashboard/ui/material/ui/icons/numbers.svg | 1 + .../ui/material/ui/icons/offline_bolt.svg | 1 + .../ui/material/ui/icons/offline_pin.svg | 1 + .../ui/material/ui/icons/offline_share.svg | 1 + dashboard/ui/material/ui/icons/oil_barrel.svg | 1 + .../material/ui/icons/on_device_training.svg | 1 + .../ui/material/ui/icons/ondemand_video.svg | 1 + .../material/ui/icons/online_prediction.svg | 1 + dashboard/ui/material/ui/icons/opacity.svg | 1 + .../ui/material/ui/icons/open_in_browser.svg | 1 + .../ui/material/ui/icons/open_in_full.svg | 1 + .../ui/material/ui/icons/open_in_new.svg | 1 + .../ui/material/ui/icons/open_in_new_off.svg | 1 + dashboard/ui/material/ui/icons/open_with.svg | 1 + .../ui/material/ui/icons/other_houses.svg | 1 + dashboard/ui/material/ui/icons/outbound.svg | 1 + dashboard/ui/material/ui/icons/outbox.svg | 1 + .../ui/material/ui/icons/outdoor_grill.svg | 1 + dashboard/ui/material/ui/icons/outlet.svg | 1 + .../ui/material/ui/icons/outlined_flag.svg | 1 + dashboard/ui/material/ui/icons/output.svg | 1 + dashboard/ui/material/ui/icons/padding.svg | 1 + dashboard/ui/material/ui/icons/pages.svg | 1 + dashboard/ui/material/ui/icons/pageview.svg | 1 + dashboard/ui/material/ui/icons/paid.svg | 1 + dashboard/ui/material/ui/icons/palette.svg | 1 + dashboard/ui/material/ui/icons/pan_tool.svg | 1 + .../ui/material/ui/icons/pan_tool_alt.svg | 1 + dashboard/ui/material/ui/icons/panorama.svg | 1 + .../material/ui/icons/panorama_fish_eye.svg | 1 + .../material/ui/icons/panorama_horizontal.svg | 1 + .../ui/icons/panorama_horizontal_select.svg | 1 + .../ui/icons/panorama_photosphere.svg | 1 + .../ui/icons/panorama_photosphere_select.svg | 1 + .../material/ui/icons/panorama_vertical.svg | 1 + .../ui/icons/panorama_vertical_select.svg | 1 + .../material/ui/icons/panorama_wide_angle.svg | 1 + .../ui/icons/panorama_wide_angle_select.svg | 1 + .../ui/material/ui/icons/paragliding.svg | 1 + dashboard/ui/material/ui/icons/park.svg | 1 + dashboard/ui/material/ui/icons/party_mode.svg | 1 + dashboard/ui/material/ui/icons/password.svg | 1 + dashboard/ui/material/ui/icons/pattern.svg | 1 + dashboard/ui/material/ui/icons/pause.svg | 1 + .../ui/material/ui/icons/pause_circle.svg | 1 + .../material/ui/icons/pause_circle_filled.svg | 1 + .../ui/icons/pause_circle_outline.svg | 1 + .../material/ui/icons/pause_presentation.svg | 1 + dashboard/ui/material/ui/icons/payment.svg | 1 + dashboard/ui/material/ui/icons/payments.svg | 1 + dashboard/ui/material/ui/icons/pedal_bike.svg | 1 + dashboard/ui/material/ui/icons/pending.svg | 1 + .../ui/material/ui/icons/pending_actions.svg | 1 + dashboard/ui/material/ui/icons/pentagon.svg | 1 + dashboard/ui/material/ui/icons/people.svg | 1 + dashboard/ui/material/ui/icons/people_alt.svg | 1 + .../ui/material/ui/icons/people_outline.svg | 1 + dashboard/ui/material/ui/icons/percent.svg | 1 + .../ui/material/ui/icons/perm_camera_mic.svg | 1 + .../ui/icons/perm_contact_calendar.svg | 1 + .../material/ui/icons/perm_data_setting.svg | 1 + .../ui/icons/perm_device_information.svg | 1 + .../ui/material/ui/icons/perm_identity.svg | 1 + dashboard/ui/material/ui/icons/perm_media.svg | 1 + .../ui/material/ui/icons/perm_phone_msg.svg | 1 + .../ui/material/ui/icons/perm_scan_wifi.svg | 1 + dashboard/ui/material/ui/icons/person.svg | 1 + dashboard/ui/material/ui/icons/person_2.svg | 1 + dashboard/ui/material/ui/icons/person_3.svg | 1 + dashboard/ui/material/ui/icons/person_4.svg | 1 + dashboard/ui/material/ui/icons/person_add.svg | 1 + .../ui/material/ui/icons/person_add_alt.svg | 1 + .../ui/material/ui/icons/person_add_alt_1.svg | 1 + .../material/ui/icons/person_add_disabled.svg | 1 + dashboard/ui/material/ui/icons/person_off.svg | 1 + .../ui/material/ui/icons/person_outline.svg | 1 + dashboard/ui/material/ui/icons/person_pin.svg | 1 + .../material/ui/icons/person_pin_circle.svg | 1 + .../ui/material/ui/icons/person_remove.svg | 1 + .../material/ui/icons/person_remove_alt_1.svg | 1 + .../ui/material/ui/icons/person_search.svg | 1 + .../ui/material/ui/icons/personal_injury.svg | 1 + .../ui/material/ui/icons/personal_video.svg | 1 + .../ui/material/ui/icons/pest_control.svg | 1 + .../material/ui/icons/pest_control_rodent.svg | 1 + dashboard/ui/material/ui/icons/pets.svg | 1 + dashboard/ui/material/ui/icons/phishing.svg | 1 + dashboard/ui/material/ui/icons/phone.svg | 1 + .../ui/material/ui/icons/phone_android.svg | 1 + .../ui/icons/phone_bluetooth_speaker.svg | 1 + .../ui/material/ui/icons/phone_callback.svg | 1 + .../ui/material/ui/icons/phone_disabled.svg | 1 + .../ui/material/ui/icons/phone_enabled.svg | 1 + .../ui/material/ui/icons/phone_forwarded.svg | 1 + .../ui/material/ui/icons/phone_iphone.svg | 1 + .../ui/material/ui/icons/phone_locked.svg | 1 + .../ui/material/ui/icons/phone_missed.svg | 1 + .../ui/material/ui/icons/phone_paused.svg | 1 + dashboard/ui/material/ui/icons/phonelink.svg | 1 + .../ui/material/ui/icons/phonelink_erase.svg | 1 + .../ui/material/ui/icons/phonelink_lock.svg | 1 + .../ui/material/ui/icons/phonelink_off.svg | 1 + .../ui/material/ui/icons/phonelink_ring.svg | 1 + .../ui/material/ui/icons/phonelink_setup.svg | 1 + dashboard/ui/material/ui/icons/photo.svg | 1 + .../ui/material/ui/icons/photo_album.svg | 1 + .../ui/material/ui/icons/photo_camera.svg | 1 + .../material/ui/icons/photo_camera_back.svg | 1 + .../material/ui/icons/photo_camera_front.svg | 1 + .../ui/material/ui/icons/photo_filter.svg | 1 + .../ui/material/ui/icons/photo_library.svg | 1 + .../ui/icons/photo_size_select_actual.svg | 1 + .../ui/icons/photo_size_select_large.svg | 1 + .../ui/icons/photo_size_select_small.svg | 1 + dashboard/ui/material/ui/icons/php.svg | 1 + dashboard/ui/material/ui/icons/piano.svg | 1 + dashboard/ui/material/ui/icons/piano_off.svg | 1 + .../ui/material/ui/icons/picture_as_pdf.svg | 1 + .../material/ui/icons/picture_in_picture.svg | 1 + .../ui/icons/picture_in_picture_alt.svg | 1 + dashboard/ui/material/ui/icons/pie_chart.svg | 1 + .../material/ui/icons/pie_chart_outline.svg | 1 + dashboard/ui/material/ui/icons/pin.svg | 1 + dashboard/ui/material/ui/icons/pin_drop.svg | 1 + dashboard/ui/material/ui/icons/pin_end.svg | 1 + dashboard/ui/material/ui/icons/pin_invoke.svg | 1 + dashboard/ui/material/ui/icons/pinch.svg | 1 + .../material/ui/icons/pivot_table_chart.svg | 1 + dashboard/ui/material/ui/icons/pix.svg | 1 + dashboard/ui/material/ui/icons/place.svg | 1 + dashboard/ui/material/ui/icons/plagiarism.svg | 1 + dashboard/ui/material/ui/icons/play_arrow.svg | 1 + .../ui/material/ui/icons/play_circle.svg | 1 + .../material/ui/icons/play_circle_filled.svg | 1 + .../material/ui/icons/play_circle_outline.svg | 1 + .../ui/material/ui/icons/play_disabled.svg | 1 + .../ui/material/ui/icons/play_for_work.svg | 1 + .../ui/material/ui/icons/play_lesson.svg | 1 + .../ui/material/ui/icons/playlist_add.svg | 1 + .../material/ui/icons/playlist_add_check.svg | 1 + .../ui/icons/playlist_add_check_circle.svg | 1 + .../material/ui/icons/playlist_add_circle.svg | 1 + .../ui/material/ui/icons/playlist_play.svg | 1 + .../ui/material/ui/icons/playlist_remove.svg | 1 + dashboard/ui/material/ui/icons/plumbing.svg | 1 + dashboard/ui/material/ui/icons/plus_one.svg | 1 + dashboard/ui/material/ui/icons/podcasts.svg | 1 + .../ui/material/ui/icons/point_of_sale.svg | 1 + dashboard/ui/material/ui/icons/policy.svg | 1 + dashboard/ui/material/ui/icons/poll.svg | 1 + dashboard/ui/material/ui/icons/polyline.svg | 1 + dashboard/ui/material/ui/icons/polymer.svg | 1 + dashboard/ui/material/ui/icons/pool.svg | 1 + .../material/ui/icons/portable_wifi_off.svg | 1 + dashboard/ui/material/ui/icons/portrait.svg | 1 + dashboard/ui/material/ui/icons/post_add.svg | 1 + dashboard/ui/material/ui/icons/power.svg | 1 + .../ui/material/ui/icons/power_input.svg | 1 + dashboard/ui/material/ui/icons/power_off.svg | 1 + .../material/ui/icons/power_settings_new.svg | 1 + .../ui/icons/precision_manufacturing.svg | 1 + .../ui/material/ui/icons/pregnant_woman.svg | 1 + .../ui/material/ui/icons/present_to_all.svg | 1 + dashboard/ui/material/ui/icons/preview.svg | 1 + .../ui/material/ui/icons/price_change.svg | 1 + .../ui/material/ui/icons/price_check.svg | 1 + dashboard/ui/material/ui/icons/print.svg | 1 + .../ui/material/ui/icons/print_disabled.svg | 1 + .../ui/material/ui/icons/priority_high.svg | 1 + .../ui/material/ui/icons/privacy_tip.svg | 1 + .../ui/icons/private_connectivity.svg | 1 + .../ui/icons/production_quantity_limits.svg | 1 + dashboard/ui/material/ui/icons/propane.svg | 1 + .../ui/material/ui/icons/propane_tank.svg | 1 + dashboard/ui/material/ui/icons/psychology.svg | 1 + .../ui/material/ui/icons/psychology_alt.svg | 1 + dashboard/ui/material/ui/icons/public.svg | 1 + dashboard/ui/material/ui/icons/public_off.svg | 1 + dashboard/ui/material/ui/icons/publish.svg | 1 + .../ui/icons/published_with_changes.svg | 1 + .../ui/material/ui/icons/punch_clock.svg | 1 + dashboard/ui/material/ui/icons/push_pin.svg | 1 + dashboard/ui/material/ui/icons/qr_code.svg | 1 + dashboard/ui/material/ui/icons/qr_code_2.svg | 1 + .../ui/material/ui/icons/qr_code_scanner.svg | 1 + .../ui/material/ui/icons/query_builder.svg | 1 + .../ui/material/ui/icons/query_stats.svg | 1 + .../ui/material/ui/icons/question_answer.svg | 1 + .../ui/material/ui/icons/question_mark.svg | 1 + dashboard/ui/material/ui/icons/queue.svg | 1 + .../ui/material/ui/icons/queue_music.svg | 1 + .../ui/material/ui/icons/queue_play_next.svg | 1 + dashboard/ui/material/ui/icons/quickreply.svg | 1 + dashboard/ui/material/ui/icons/quiz.svg | 1 + .../ui/material/ui/icons/r_mobiledata.svg | 1 + dashboard/ui/material/ui/icons/radar.svg | 1 + dashboard/ui/material/ui/icons/radio.svg | 1 + .../ui/icons/radio_button_checked.svg | 1 + .../ui/icons/radio_button_unchecked.svg | 1 + .../ui/material/ui/icons/railway_alert.svg | 1 + .../ui/material/ui/icons/ramen_dining.svg | 1 + dashboard/ui/material/ui/icons/ramp_left.svg | 1 + dashboard/ui/material/ui/icons/ramp_right.svg | 1 + .../ui/material/ui/icons/rate_review.svg | 1 + dashboard/ui/material/ui/icons/raw_off.svg | 1 + dashboard/ui/material/ui/icons/raw_on.svg | 1 + dashboard/ui/material/ui/icons/read_more.svg | 1 + .../material/ui/icons/real_estate_agent.svg | 1 + dashboard/ui/material/ui/icons/receipt.svg | 1 + .../ui/material/ui/icons/receipt_long.svg | 1 + .../ui/material/ui/icons/recent_actors.svg | 1 + dashboard/ui/material/ui/icons/recommend.svg | 1 + .../material/ui/icons/record_voice_over.svg | 1 + dashboard/ui/material/ui/icons/rectangle.svg | 1 + dashboard/ui/material/ui/icons/recycling.svg | 1 + dashboard/ui/material/ui/icons/redeem.svg | 1 + dashboard/ui/material/ui/icons/redo.svg | 1 + .../ui/material/ui/icons/reduce_capacity.svg | 1 + dashboard/ui/material/ui/icons/refresh.svg | 1 + .../ui/material/ui/icons/remember_me.svg | 1 + dashboard/ui/material/ui/icons/remove.svg | 1 + .../ui/material/ui/icons/remove_circle.svg | 1 + .../ui/icons/remove_circle_outline.svg | 1 + .../ui/material/ui/icons/remove_done.svg | 1 + .../material/ui/icons/remove_from_queue.svg | 1 + .../ui/material/ui/icons/remove_moderator.svg | 1 + .../ui/material/ui/icons/remove_red_eye.svg | 1 + .../ui/material/ui/icons/remove_road.svg | 1 + .../ui/icons/remove_shopping_cart.svg | 1 + dashboard/ui/material/ui/icons/reorder.svg | 1 + .../ui/material/ui/icons/repartition.svg | 1 + dashboard/ui/material/ui/icons/repeat.svg | 1 + dashboard/ui/material/ui/icons/repeat_on.svg | 1 + dashboard/ui/material/ui/icons/repeat_one.svg | 1 + .../ui/material/ui/icons/repeat_one_on.svg | 1 + dashboard/ui/material/ui/icons/replay.svg | 1 + dashboard/ui/material/ui/icons/replay_10.svg | 1 + dashboard/ui/material/ui/icons/replay_30.svg | 1 + dashboard/ui/material/ui/icons/replay_5.svg | 1 + .../ui/icons/replay_circle_filled.svg | 1 + dashboard/ui/material/ui/icons/reply.svg | 1 + dashboard/ui/material/ui/icons/reply_all.svg | 1 + dashboard/ui/material/ui/icons/report.svg | 1 + .../ui/icons/report_gmailerrorred.svg | 1 + dashboard/ui/material/ui/icons/report_off.svg | 1 + .../ui/material/ui/icons/report_problem.svg | 1 + .../ui/material/ui/icons/request_page.svg | 1 + .../ui/material/ui/icons/request_quote.svg | 1 + dashboard/ui/material/ui/icons/reset_tv.svg | 1 + .../ui/material/ui/icons/restart_alt.svg | 1 + dashboard/ui/material/ui/icons/restaurant.svg | 1 + .../ui/material/ui/icons/restaurant_menu.svg | 1 + dashboard/ui/material/ui/icons/restore.svg | 1 + .../material/ui/icons/restore_from_trash.svg | 1 + .../ui/material/ui/icons/restore_page.svg | 1 + dashboard/ui/material/ui/icons/reviews.svg | 1 + dashboard/ui/material/ui/icons/rice_bowl.svg | 1 + .../ui/material/ui/icons/ring_volume.svg | 1 + dashboard/ui/material/ui/icons/rocket.svg | 1 + .../ui/material/ui/icons/rocket_launch.svg | 1 + .../ui/material/ui/icons/roller_shades.svg | 1 + .../ui/icons/roller_shades_closed.svg | 1 + .../ui/material/ui/icons/roller_skating.svg | 1 + dashboard/ui/material/ui/icons/roofing.svg | 1 + dashboard/ui/material/ui/icons/room.svg | 1 + .../ui/material/ui/icons/room_preferences.svg | 1 + .../ui/material/ui/icons/room_service.svg | 1 + .../ui/icons/rotate_90_degrees_ccw.svg | 1 + .../ui/icons/rotate_90_degrees_cw.svg | 1 + .../ui/material/ui/icons/rotate_left.svg | 1 + .../ui/material/ui/icons/rotate_right.svg | 1 + .../ui/material/ui/icons/roundabout_left.svg | 1 + .../ui/material/ui/icons/roundabout_right.svg | 1 + .../ui/material/ui/icons/rounded_corner.svg | 1 + dashboard/ui/material/ui/icons/route.svg | 1 + dashboard/ui/material/ui/icons/router.svg | 1 + dashboard/ui/material/ui/icons/rowing.svg | 1 + dashboard/ui/material/ui/icons/rss_feed.svg | 1 + dashboard/ui/material/ui/icons/rsvp.svg | 1 + dashboard/ui/material/ui/icons/rtt.svg | 1 + dashboard/ui/material/ui/icons/rule.svg | 1 + .../ui/material/ui/icons/rule_folder.svg | 1 + dashboard/ui/material/ui/icons/run_circle.svg | 1 + .../material/ui/icons/running_with_errors.svg | 1 + dashboard/ui/material/ui/icons/rv_hookup.svg | 1 + .../ui/material/ui/icons/safety_check.svg | 1 + .../ui/material/ui/icons/safety_divider.svg | 1 + dashboard/ui/material/ui/icons/sailing.svg | 1 + dashboard/ui/material/ui/icons/sanitizer.svg | 1 + dashboard/ui/material/ui/icons/satellite.svg | 1 + .../ui/material/ui/icons/satellite_alt.svg | 1 + dashboard/ui/material/ui/icons/save.svg | 1 + dashboard/ui/material/ui/icons/save_alt.svg | 1 + dashboard/ui/material/ui/icons/save_as.svg | 1 + .../ui/material/ui/icons/saved_search.svg | 1 + dashboard/ui/material/ui/icons/savings.svg | 1 + dashboard/ui/material/ui/icons/scale.svg | 1 + dashboard/ui/material/ui/icons/scanner.svg | 1 + .../ui/material/ui/icons/scatter_plot.svg | 1 + dashboard/ui/material/ui/icons/schedule.svg | 1 + .../ui/material/ui/icons/schedule_send.svg | 1 + dashboard/ui/material/ui/icons/schema.svg | 1 + dashboard/ui/material/ui/icons/school.svg | 1 + dashboard/ui/material/ui/icons/science.svg | 1 + dashboard/ui/material/ui/icons/score.svg | 1 + dashboard/ui/material/ui/icons/scoreboard.svg | 1 + .../ui/icons/screen_lock_landscape.svg | 1 + .../ui/icons/screen_lock_portrait.svg | 1 + .../ui/icons/screen_lock_rotation.svg | 1 + .../ui/material/ui/icons/screen_rotation.svg | 1 + .../material/ui/icons/screen_rotation_alt.svg | 1 + .../ui/icons/screen_search_desktop.svg | 1 + .../ui/material/ui/icons/screen_share.svg | 1 + dashboard/ui/material/ui/icons/screenshot.svg | 1 + .../material/ui/icons/screenshot_monitor.svg | 1 + .../ui/material/ui/icons/scuba_diving.svg | 1 + dashboard/ui/material/ui/icons/sd.svg | 1 + dashboard/ui/material/ui/icons/sd_card.svg | 1 + .../ui/material/ui/icons/sd_card_alert.svg | 1 + dashboard/ui/material/ui/icons/sd_storage.svg | 1 + dashboard/ui/material/ui/icons/search.svg | 1 + dashboard/ui/material/ui/icons/search_off.svg | 1 + dashboard/ui/material/ui/icons/security.svg | 1 + .../ui/material/ui/icons/security_update.svg | 1 + .../ui/icons/security_update_good.svg | 1 + .../ui/icons/security_update_warning.svg | 1 + dashboard/ui/material/ui/icons/segment.svg | 1 + dashboard/ui/material/ui/icons/select_all.svg | 1 + .../ui/material/ui/icons/self_improvement.svg | 1 + dashboard/ui/material/ui/icons/sell.svg | 1 + dashboard/ui/material/ui/icons/send.svg | 1 + .../ui/material/ui/icons/send_and_archive.svg | 1 + .../material/ui/icons/send_time_extension.svg | 1 + .../ui/material/ui/icons/send_to_mobile.svg | 1 + .../ui/material/ui/icons/sensor_door.svg | 1 + .../ui/material/ui/icons/sensor_occupied.svg | 1 + .../ui/material/ui/icons/sensor_window.svg | 1 + dashboard/ui/material/ui/icons/sensors.svg | 1 + .../ui/material/ui/icons/sensors_off.svg | 1 + .../ui/icons/sentiment_dissatisfied.svg | 1 + .../material/ui/icons/sentiment_neutral.svg | 1 + .../material/ui/icons/sentiment_satisfied.svg | 1 + .../ui/icons/sentiment_satisfied_alt.svg | 1 + .../ui/icons/sentiment_very_dissatisfied.svg | 1 + .../ui/icons/sentiment_very_satisfied.svg | 1 + dashboard/ui/material/ui/icons/set_meal.svg | 1 + dashboard/ui/material/ui/icons/settings.svg | 1 + .../ui/icons/settings_accessibility.svg | 1 + .../ui/icons/settings_applications.svg | 1 + .../ui/icons/settings_backup_restore.svg | 1 + .../material/ui/icons/settings_bluetooth.svg | 1 + .../material/ui/icons/settings_brightness.svg | 1 + .../ui/material/ui/icons/settings_cell.svg | 1 + .../material/ui/icons/settings_ethernet.svg | 1 + .../ui/icons/settings_input_antenna.svg | 1 + .../ui/icons/settings_input_component.svg | 1 + .../ui/icons/settings_input_composite.svg | 1 + .../material/ui/icons/settings_input_hdmi.svg | 1 + .../ui/icons/settings_input_svideo.svg | 1 + .../material/ui/icons/settings_overscan.svg | 1 + .../ui/material/ui/icons/settings_phone.svg | 1 + .../ui/material/ui/icons/settings_power.svg | 1 + .../ui/material/ui/icons/settings_remote.svg | 1 + .../ui/material/ui/icons/settings_suggest.svg | 1 + .../ui/icons/settings_system_daydream.svg | 1 + .../ui/material/ui/icons/settings_voice.svg | 1 + .../ui/material/ui/icons/severe_cold.svg | 1 + dashboard/ui/material/ui/icons/shape_line.svg | 1 + dashboard/ui/material/ui/icons/share.svg | 1 + .../ui/material/ui/icons/share_location.svg | 1 + dashboard/ui/material/ui/icons/shield.svg | 1 + .../ui/material/ui/icons/shield_moon.svg | 1 + dashboard/ui/material/ui/icons/shop.svg | 1 + dashboard/ui/material/ui/icons/shop_2.svg | 1 + dashboard/ui/material/ui/icons/shop_two.svg | 1 + .../ui/material/ui/icons/shopping_bag.svg | 1 + .../ui/material/ui/icons/shopping_basket.svg | 1 + .../ui/material/ui/icons/shopping_cart.svg | 1 + .../ui/icons/shopping_cart_checkout.svg | 1 + dashboard/ui/material/ui/icons/short_text.svg | 1 + dashboard/ui/material/ui/icons/shortcut.svg | 1 + dashboard/ui/material/ui/icons/show_chart.svg | 1 + dashboard/ui/material/ui/icons/shower.svg | 1 + dashboard/ui/material/ui/icons/shuffle.svg | 1 + dashboard/ui/material/ui/icons/shuffle_on.svg | 1 + .../ui/material/ui/icons/shutter_speed.svg | 1 + dashboard/ui/material/ui/icons/sick.svg | 1 + .../ui/material/ui/icons/sign_language.svg | 1 + .../ui/icons/signal_cellular_0_bar.svg | 1 + .../ui/icons/signal_cellular_4_bar.svg | 1 + .../material/ui/icons/signal_cellular_alt.svg | 1 + .../ui/icons/signal_cellular_alt_1_bar.svg | 1 + .../ui/icons/signal_cellular_alt_2_bar.svg | 1 + ...l_cellular_connected_no_internet_0_bar.svg | 1 + ...l_cellular_connected_no_internet_4_bar.svg | 1 + .../ui/icons/signal_cellular_no_sim.svg | 1 + .../ui/icons/signal_cellular_nodata.svg | 1 + .../ui/icons/signal_cellular_null.svg | 1 + .../material/ui/icons/signal_cellular_off.svg | 1 + .../material/ui/icons/signal_wifi_0_bar.svg | 1 + .../material/ui/icons/signal_wifi_4_bar.svg | 1 + .../ui/icons/signal_wifi_4_bar_lock.svg | 1 + .../ui/material/ui/icons/signal_wifi_bad.svg | 1 + .../signal_wifi_connected_no_internet_4.svg | 1 + .../ui/material/ui/icons/signal_wifi_off.svg | 1 + .../ui/icons/signal_wifi_statusbar_4_bar.svg | 1 + ...wifi_statusbar_connected_no_internet_4.svg | 1 + .../ui/icons/signal_wifi_statusbar_null.svg | 1 + dashboard/ui/material/ui/icons/signpost.svg | 1 + dashboard/ui/material/ui/icons/sim_card.svg | 1 + .../ui/material/ui/icons/sim_card_alert.svg | 1 + .../material/ui/icons/sim_card_download.svg | 1 + dashboard/ui/material/ui/icons/single_bed.svg | 1 + dashboard/ui/material/ui/icons/sip.svg | 1 + .../ui/material/ui/icons/skateboarding.svg | 1 + dashboard/ui/material/ui/icons/skip_next.svg | 1 + .../ui/material/ui/icons/skip_previous.svg | 1 + dashboard/ui/material/ui/icons/sledding.svg | 1 + dashboard/ui/material/ui/icons/slideshow.svg | 1 + .../material/ui/icons/slow_motion_video.svg | 1 + .../ui/material/ui/icons/smart_button.svg | 1 + .../ui/material/ui/icons/smart_display.svg | 1 + .../ui/material/ui/icons/smart_screen.svg | 1 + dashboard/ui/material/ui/icons/smart_toy.svg | 1 + dashboard/ui/material/ui/icons/smartphone.svg | 1 + dashboard/ui/material/ui/icons/smoke_free.svg | 1 + .../ui/material/ui/icons/smoking_rooms.svg | 1 + dashboard/ui/material/ui/icons/sms.svg | 1 + dashboard/ui/material/ui/icons/sms_failed.svg | 1 + .../ui/material/ui/icons/snippet_folder.svg | 1 + dashboard/ui/material/ui/icons/snooze.svg | 1 + .../ui/material/ui/icons/snowboarding.svg | 1 + dashboard/ui/material/ui/icons/snowmobile.svg | 1 + .../ui/material/ui/icons/snowshoeing.svg | 1 + dashboard/ui/material/ui/icons/soap.svg | 1 + .../ui/material/ui/icons/social_distance.svg | 1 + .../ui/material/ui/icons/solar_power.svg | 1 + dashboard/ui/material/ui/icons/sort.svg | 1 + .../ui/material/ui/icons/sort_by_alpha.svg | 1 + dashboard/ui/material/ui/icons/sos.svg | 1 + .../ui/material/ui/icons/soup_kitchen.svg | 1 + dashboard/ui/material/ui/icons/source.svg | 1 + dashboard/ui/material/ui/icons/south.svg | 1 + .../ui/material/ui/icons/south_america.svg | 1 + dashboard/ui/material/ui/icons/south_east.svg | 1 + dashboard/ui/material/ui/icons/south_west.svg | 1 + dashboard/ui/material/ui/icons/spa.svg | 1 + dashboard/ui/material/ui/icons/space_bar.svg | 1 + .../ui/material/ui/icons/space_dashboard.svg | 1 + .../ui/material/ui/icons/spatial_audio.svg | 1 + .../material/ui/icons/spatial_audio_off.svg | 1 + .../ui/material/ui/icons/spatial_tracking.svg | 1 + dashboard/ui/material/ui/icons/speaker.svg | 1 + .../ui/material/ui/icons/speaker_group.svg | 1 + .../ui/material/ui/icons/speaker_notes.svg | 1 + .../material/ui/icons/speaker_notes_off.svg | 1 + .../ui/material/ui/icons/speaker_phone.svg | 1 + dashboard/ui/material/ui/icons/speed.svg | 1 + dashboard/ui/material/ui/icons/spellcheck.svg | 1 + .../ui/material/ui/icons/splitscreen.svg | 1 + dashboard/ui/material/ui/icons/spoke.svg | 1 + dashboard/ui/material/ui/icons/sports.svg | 1 + dashboard/ui/material/ui/icons/sports_bar.svg | 1 + .../ui/material/ui/icons/sports_baseball.svg | 1 + .../material/ui/icons/sports_basketball.svg | 1 + .../ui/material/ui/icons/sports_cricket.svg | 1 + .../ui/material/ui/icons/sports_esports.svg | 1 + .../ui/material/ui/icons/sports_football.svg | 1 + .../ui/material/ui/icons/sports_golf.svg | 1 + .../material/ui/icons/sports_gymnastics.svg | 1 + .../ui/material/ui/icons/sports_handball.svg | 1 + .../ui/material/ui/icons/sports_hockey.svg | 1 + .../ui/material/ui/icons/sports_kabaddi.svg | 1 + .../material/ui/icons/sports_martial_arts.svg | 1 + dashboard/ui/material/ui/icons/sports_mma.svg | 1 + .../material/ui/icons/sports_motorsports.svg | 1 + .../ui/material/ui/icons/sports_rugby.svg | 1 + .../ui/material/ui/icons/sports_score.svg | 1 + .../ui/material/ui/icons/sports_soccer.svg | 1 + .../ui/material/ui/icons/sports_tennis.svg | 1 + .../material/ui/icons/sports_volleyball.svg | 1 + dashboard/ui/material/ui/icons/square.svg | 1 + .../ui/material/ui/icons/square_foot.svg | 1 + dashboard/ui/material/ui/icons/ssid_chart.svg | 1 + .../material/ui/icons/stacked_bar_chart.svg | 1 + .../material/ui/icons/stacked_line_chart.svg | 1 + dashboard/ui/material/ui/icons/stadium.svg | 1 + dashboard/ui/material/ui/icons/stairs.svg | 1 + dashboard/ui/material/ui/icons/star.svg | 1 + .../ui/material/ui/icons/star_border.svg | 1 + .../ui/icons/star_border_purple500.svg | 1 + dashboard/ui/material/ui/icons/star_half.svg | 1 + .../ui/material/ui/icons/star_outline.svg | 1 + .../ui/material/ui/icons/star_purple500.svg | 1 + dashboard/ui/material/ui/icons/star_rate.svg | 1 + dashboard/ui/material/ui/icons/stars.svg | 1 + dashboard/ui/material/ui/icons/start.svg | 1 + .../ui/icons/stay_current_landscape.svg | 1 + .../ui/icons/stay_current_portrait.svg | 1 + .../ui/icons/stay_primary_landscape.svg | 1 + .../ui/icons/stay_primary_portrait.svg | 1 + .../ui/material/ui/icons/sticky_note_2.svg | 1 + dashboard/ui/material/ui/icons/stop.svg | 1 + .../ui/material/ui/icons/stop_circle.svg | 1 + .../material/ui/icons/stop_screen_share.svg | 1 + dashboard/ui/material/ui/icons/storage.svg | 1 + dashboard/ui/material/ui/icons/store.svg | 1 + .../ui/icons/store_mall_directory.svg | 1 + dashboard/ui/material/ui/icons/storefront.svg | 1 + dashboard/ui/material/ui/icons/storm.svg | 1 + dashboard/ui/material/ui/icons/straight.svg | 1 + dashboard/ui/material/ui/icons/straighten.svg | 1 + dashboard/ui/material/ui/icons/stream.svg | 1 + dashboard/ui/material/ui/icons/streetview.svg | 1 + .../ui/material/ui/icons/strikethrough_s.svg | 1 + dashboard/ui/material/ui/icons/stroller.svg | 1 + dashboard/ui/material/ui/icons/style.svg | 1 + .../ui/icons/subdirectory_arrow_left.svg | 1 + .../ui/icons/subdirectory_arrow_right.svg | 1 + dashboard/ui/material/ui/icons/subject.svg | 1 + dashboard/ui/material/ui/icons/subscript.svg | 1 + .../ui/material/ui/icons/subscriptions.svg | 1 + dashboard/ui/material/ui/icons/subtitles.svg | 1 + .../ui/material/ui/icons/subtitles_off.svg | 1 + dashboard/ui/material/ui/icons/subway.svg | 1 + dashboard/ui/material/ui/icons/summarize.svg | 1 + .../ui/material/ui/icons/superscript.svg | 1 + .../ui/icons/supervised_user_circle.svg | 1 + .../material/ui/icons/supervisor_account.svg | 1 + dashboard/ui/material/ui/icons/support.svg | 1 + .../ui/material/ui/icons/support_agent.svg | 1 + dashboard/ui/material/ui/icons/surfing.svg | 1 + .../ui/material/ui/icons/surround_sound.svg | 1 + dashboard/ui/material/ui/icons/swap_calls.svg | 1 + dashboard/ui/material/ui/icons/swap_horiz.svg | 1 + .../ui/icons/swap_horizontal_circle.svg | 1 + dashboard/ui/material/ui/icons/swap_vert.svg | 1 + .../ui/icons/swap_vertical_circle.svg | 1 + dashboard/ui/material/ui/icons/swipe.svg | 1 + dashboard/ui/material/ui/icons/swipe_down.svg | 1 + .../ui/material/ui/icons/swipe_down_alt.svg | 1 + dashboard/ui/material/ui/icons/swipe_left.svg | 1 + .../ui/material/ui/icons/swipe_left_alt.svg | 1 + .../ui/material/ui/icons/swipe_right.svg | 1 + .../ui/material/ui/icons/swipe_right_alt.svg | 1 + dashboard/ui/material/ui/icons/swipe_up.svg | 1 + .../ui/material/ui/icons/swipe_up_alt.svg | 1 + .../ui/material/ui/icons/swipe_vertical.svg | 1 + .../ui/icons/switch_access_shortcut.svg | 1 + .../ui/icons/switch_access_shortcut_add.svg | 1 + .../ui/material/ui/icons/switch_account.svg | 1 + .../ui/material/ui/icons/switch_camera.svg | 1 + .../ui/material/ui/icons/switch_left.svg | 1 + .../ui/material/ui/icons/switch_right.svg | 1 + .../ui/material/ui/icons/switch_video.svg | 1 + dashboard/ui/material/ui/icons/synagogue.svg | 1 + dashboard/ui/material/ui/icons/sync.svg | 1 + dashboard/ui/material/ui/icons/sync_alt.svg | 1 + .../ui/material/ui/icons/sync_disabled.svg | 1 + dashboard/ui/material/ui/icons/sync_lock.svg | 1 + .../ui/material/ui/icons/sync_problem.svg | 1 + .../ui/icons/system_security_update.svg | 1 + .../ui/icons/system_security_update_good.svg | 1 + .../icons/system_security_update_warning.svg | 1 + .../ui/material/ui/icons/system_update.svg | 1 + .../material/ui/icons/system_update_alt.svg | 1 + dashboard/ui/material/ui/icons/tab.svg | 1 + .../ui/material/ui/icons/tab_unselected.svg | 1 + dashboard/ui/material/ui/icons/table_bar.svg | 1 + .../ui/material/ui/icons/table_chart.svg | 1 + .../ui/material/ui/icons/table_restaurant.svg | 1 + dashboard/ui/material/ui/icons/table_rows.svg | 1 + dashboard/ui/material/ui/icons/table_view.svg | 1 + dashboard/ui/material/ui/icons/tablet.svg | 1 + .../ui/material/ui/icons/tablet_android.svg | 1 + dashboard/ui/material/ui/icons/tablet_mac.svg | 1 + dashboard/ui/material/ui/icons/tag.svg | 1 + dashboard/ui/material/ui/icons/tag_faces.svg | 1 + .../ui/material/ui/icons/takeout_dining.svg | 1 + .../ui/material/ui/icons/tap_and_play.svg | 1 + dashboard/ui/material/ui/icons/tapas.svg | 1 + dashboard/ui/material/ui/icons/task.svg | 1 + dashboard/ui/material/ui/icons/task_alt.svg | 1 + dashboard/ui/material/ui/icons/taxi_alert.svg | 1 + .../ui/material/ui/icons/temple_buddhist.svg | 1 + .../ui/material/ui/icons/temple_hindu.svg | 1 + dashboard/ui/material/ui/icons/terminal.svg | 1 + dashboard/ui/material/ui/icons/terrain.svg | 1 + .../ui/material/ui/icons/text_decrease.svg | 1 + .../ui/material/ui/icons/text_fields.svg | 1 + .../ui/material/ui/icons/text_format.svg | 1 + .../ui/material/ui/icons/text_increase.svg | 1 + .../ui/material/ui/icons/text_rotate_up.svg | 1 + .../ui/icons/text_rotate_vertical.svg | 1 + .../ui/icons/text_rotation_angledown.svg | 1 + .../ui/icons/text_rotation_angleup.svg | 1 + .../material/ui/icons/text_rotation_down.svg | 1 + .../material/ui/icons/text_rotation_none.svg | 1 + .../ui/material/ui/icons/text_snippet.svg | 1 + dashboard/ui/material/ui/icons/textsms.svg | 1 + dashboard/ui/material/ui/icons/texture.svg | 1 + .../ui/material/ui/icons/theater_comedy.svg | 1 + dashboard/ui/material/ui/icons/theaters.svg | 1 + dashboard/ui/material/ui/icons/thermostat.svg | 1 + .../ui/material/ui/icons/thermostat_auto.svg | 1 + dashboard/ui/material/ui/icons/thumb_down.svg | 1 + .../ui/material/ui/icons/thumb_down_alt.svg | 1 + .../material/ui/icons/thumb_down_off_alt.svg | 1 + dashboard/ui/material/ui/icons/thumb_up.svg | 1 + .../ui/material/ui/icons/thumb_up_alt.svg | 1 + .../ui/material/ui/icons/thumb_up_off_alt.svg | 1 + .../ui/material/ui/icons/thumbs_up_down.svg | 1 + .../ui/material/ui/icons/thunderstorm.svg | 1 + .../ui/material/ui/icons/time_to_leave.svg | 1 + dashboard/ui/material/ui/icons/timelapse.svg | 1 + dashboard/ui/material/ui/icons/timeline.svg | 1 + dashboard/ui/material/ui/icons/timer.svg | 1 + dashboard/ui/material/ui/icons/timer_10.svg | 1 + .../ui/material/ui/icons/timer_10_select.svg | 1 + dashboard/ui/material/ui/icons/timer_3.svg | 1 + .../ui/material/ui/icons/timer_3_select.svg | 1 + dashboard/ui/material/ui/icons/timer_off.svg | 1 + .../ui/material/ui/icons/tips_and_updates.svg | 1 + .../ui/material/ui/icons/tire_repair.svg | 1 + dashboard/ui/material/ui/icons/title.svg | 1 + dashboard/ui/material/ui/icons/toc.svg | 1 + dashboard/ui/material/ui/icons/today.svg | 1 + dashboard/ui/material/ui/icons/toggle_off.svg | 1 + dashboard/ui/material/ui/icons/toggle_on.svg | 1 + dashboard/ui/material/ui/icons/token.svg | 1 + dashboard/ui/material/ui/icons/toll.svg | 1 + dashboard/ui/material/ui/icons/tonality.svg | 1 + dashboard/ui/material/ui/icons/topic.svg | 1 + dashboard/ui/material/ui/icons/tornado.svg | 1 + dashboard/ui/material/ui/icons/touch_app.svg | 1 + dashboard/ui/material/ui/icons/tour.svg | 1 + dashboard/ui/material/ui/icons/toys.svg | 1 + .../ui/material/ui/icons/track_changes.svg | 1 + dashboard/ui/material/ui/icons/traffic.svg | 1 + dashboard/ui/material/ui/icons/train.svg | 1 + dashboard/ui/material/ui/icons/tram.svg | 1 + dashboard/ui/material/ui/icons/transcribe.svg | 1 + .../ui/icons/transfer_within_a_station.svg | 1 + dashboard/ui/material/ui/icons/transform.svg | 1 + .../ui/material/ui/icons/transgender.svg | 1 + .../material/ui/icons/transit_enterexit.svg | 1 + dashboard/ui/material/ui/icons/translate.svg | 1 + .../ui/material/ui/icons/travel_explore.svg | 1 + .../ui/material/ui/icons/trending_down.svg | 1 + .../ui/material/ui/icons/trending_flat.svg | 1 + .../ui/material/ui/icons/trending_up.svg | 1 + .../ui/material/ui/icons/trip_origin.svg | 1 + .../ui/material/ui/icons/troubleshoot.svg | 1 + dashboard/ui/material/ui/icons/try.svg | 1 + dashboard/ui/material/ui/icons/tsunami.svg | 1 + dashboard/ui/material/ui/icons/tty.svg | 1 + dashboard/ui/material/ui/icons/tune.svg | 1 + dashboard/ui/material/ui/icons/tungsten.svg | 1 + dashboard/ui/material/ui/icons/turn_left.svg | 1 + dashboard/ui/material/ui/icons/turn_right.svg | 1 + .../ui/material/ui/icons/turn_sharp_left.svg | 1 + .../ui/material/ui/icons/turn_sharp_right.svg | 1 + .../ui/material/ui/icons/turn_slight_left.svg | 1 + .../material/ui/icons/turn_slight_right.svg | 1 + dashboard/ui/material/ui/icons/turned_in.svg | 1 + .../ui/material/ui/icons/turned_in_not.svg | 1 + dashboard/ui/material/ui/icons/tv.svg | 1 + dashboard/ui/material/ui/icons/tv_off.svg | 1 + .../ui/material/ui/icons/two_wheeler.svg | 1 + .../ui/material/ui/icons/type_specimen.svg | 1 + .../ui/material/ui/icons/u_turn_left.svg | 1 + .../ui/material/ui/icons/u_turn_right.svg | 1 + dashboard/ui/material/ui/icons/umbrella.svg | 1 + dashboard/ui/material/ui/icons/unarchive.svg | 1 + dashboard/ui/material/ui/icons/undo.svg | 1 + .../ui/material/ui/icons/unfold_less.svg | 1 + .../material/ui/icons/unfold_less_double.svg | 1 + .../ui/material/ui/icons/unfold_more.svg | 1 + .../material/ui/icons/unfold_more_double.svg | 1 + .../ui/material/ui/icons/unpublished.svg | 1 + .../ui/material/ui/icons/unsubscribe.svg | 1 + dashboard/ui/material/ui/icons/upcoming.svg | 1 + dashboard/ui/material/ui/icons/update.svg | 1 + .../ui/material/ui/icons/update_disabled.svg | 1 + dashboard/ui/material/ui/icons/upgrade.svg | 1 + dashboard/ui/material/ui/icons/upload.svg | 1 + .../ui/material/ui/icons/upload_file.svg | 1 + dashboard/ui/material/ui/icons/usb.svg | 1 + dashboard/ui/material/ui/icons/usb_off.svg | 1 + dashboard/ui/material/ui/icons/vaccines.svg | 1 + dashboard/ui/material/ui/icons/vape_free.svg | 1 + .../ui/material/ui/icons/vaping_rooms.svg | 1 + dashboard/ui/material/ui/icons/verified.svg | 1 + .../ui/material/ui/icons/verified_user.svg | 1 + .../ui/icons/vertical_align_bottom.svg | 1 + .../ui/icons/vertical_align_center.svg | 1 + .../material/ui/icons/vertical_align_top.svg | 1 + .../material/ui/icons/vertical_distribute.svg | 1 + .../ui/material/ui/icons/vertical_shades.svg | 1 + .../ui/icons/vertical_shades_closed.svg | 1 + .../ui/material/ui/icons/vertical_split.svg | 1 + dashboard/ui/material/ui/icons/vibration.svg | 1 + dashboard/ui/material/ui/icons/video_call.svg | 1 + .../material/ui/icons/video_camera_back.svg | 1 + .../material/ui/icons/video_camera_front.svg | 1 + dashboard/ui/material/ui/icons/video_chat.svg | 1 + dashboard/ui/material/ui/icons/video_file.svg | 1 + .../ui/material/ui/icons/video_label.svg | 1 + .../ui/material/ui/icons/video_library.svg | 1 + .../ui/material/ui/icons/video_settings.svg | 1 + .../ui/material/ui/icons/video_stable.svg | 1 + dashboard/ui/material/ui/icons/videocam.svg | 1 + .../ui/material/ui/icons/videocam_off.svg | 1 + .../ui/material/ui/icons/videogame_asset.svg | 1 + .../material/ui/icons/videogame_asset_off.svg | 1 + .../ui/material/ui/icons/view_agenda.svg | 1 + dashboard/ui/material/ui/icons/view_array.svg | 1 + .../ui/material/ui/icons/view_carousel.svg | 1 + .../ui/material/ui/icons/view_column.svg | 1 + dashboard/ui/material/ui/icons/view_comfy.svg | 1 + .../ui/material/ui/icons/view_comfy_alt.svg | 1 + .../ui/material/ui/icons/view_compact.svg | 1 + .../ui/material/ui/icons/view_compact_alt.svg | 1 + dashboard/ui/material/ui/icons/view_cozy.svg | 1 + dashboard/ui/material/ui/icons/view_day.svg | 1 + .../ui/material/ui/icons/view_headline.svg | 1 + dashboard/ui/material/ui/icons/view_in_ar.svg | 1 + .../ui/material/ui/icons/view_kanban.svg | 1 + dashboard/ui/material/ui/icons/view_list.svg | 1 + .../ui/material/ui/icons/view_module.svg | 1 + dashboard/ui/material/ui/icons/view_quilt.svg | 1 + .../ui/material/ui/icons/view_sidebar.svg | 1 + .../ui/material/ui/icons/view_stream.svg | 1 + .../ui/material/ui/icons/view_timeline.svg | 1 + dashboard/ui/material/ui/icons/view_week.svg | 1 + dashboard/ui/material/ui/icons/vignette.svg | 1 + dashboard/ui/material/ui/icons/villa.svg | 1 + dashboard/ui/material/ui/icons/visibility.svg | 1 + .../ui/material/ui/icons/visibility_off.svg | 1 + dashboard/ui/material/ui/icons/voice_chat.svg | 1 + .../ui/material/ui/icons/voice_over_off.svg | 1 + dashboard/ui/material/ui/icons/voicemail.svg | 1 + dashboard/ui/material/ui/icons/volcano.svg | 1 + .../ui/material/ui/icons/volume_down.svg | 1 + .../ui/material/ui/icons/volume_mute.svg | 1 + dashboard/ui/material/ui/icons/volume_off.svg | 1 + dashboard/ui/material/ui/icons/volume_up.svg | 1 + .../material/ui/icons/volunteer_activism.svg | 1 + dashboard/ui/material/ui/icons/vpn_key.svg | 1 + .../ui/material/ui/icons/vpn_key_off.svg | 1 + dashboard/ui/material/ui/icons/vpn_lock.svg | 1 + dashboard/ui/material/ui/icons/vrpano.svg | 1 + dashboard/ui/material/ui/icons/wallet.svg | 1 + dashboard/ui/material/ui/icons/wallpaper.svg | 1 + dashboard/ui/material/ui/icons/warehouse.svg | 1 + dashboard/ui/material/ui/icons/warning.svg | 1 + .../ui/material/ui/icons/warning_amber.svg | 1 + dashboard/ui/material/ui/icons/wash.svg | 1 + dashboard/ui/material/ui/icons/watch.svg | 1 + .../ui/material/ui/icons/watch_later.svg | 1 + dashboard/ui/material/ui/icons/watch_off.svg | 1 + dashboard/ui/material/ui/icons/water.svg | 1 + .../ui/material/ui/icons/water_damage.svg | 1 + dashboard/ui/material/ui/icons/water_drop.svg | 1 + .../ui/material/ui/icons/waterfall_chart.svg | 1 + dashboard/ui/material/ui/icons/waves.svg | 1 + .../ui/material/ui/icons/waving_hand.svg | 1 + dashboard/ui/material/ui/icons/wb_auto.svg | 1 + dashboard/ui/material/ui/icons/wb_cloudy.svg | 1 + .../ui/material/ui/icons/wb_incandescent.svg | 1 + .../ui/material/ui/icons/wb_iridescent.svg | 1 + dashboard/ui/material/ui/icons/wb_shade.svg | 1 + dashboard/ui/material/ui/icons/wb_sunny.svg | 1 + .../ui/material/ui/icons/wb_twilight.svg | 1 + dashboard/ui/material/ui/icons/wc.svg | 1 + dashboard/ui/material/ui/icons/web.svg | 1 + dashboard/ui/material/ui/icons/web_asset.svg | 1 + .../ui/material/ui/icons/web_asset_off.svg | 1 + .../ui/material/ui/icons/web_stories.svg | 1 + dashboard/ui/material/ui/icons/webhook.svg | 1 + dashboard/ui/material/ui/icons/weekend.svg | 1 + dashboard/ui/material/ui/icons/west.svg | 1 + dashboard/ui/material/ui/icons/whatshot.svg | 1 + .../material/ui/icons/wheelchair_pickup.svg | 1 + .../ui/material/ui/icons/where_to_vote.svg | 1 + dashboard/ui/material/ui/icons/widgets.svg | 1 + dashboard/ui/material/ui/icons/width_full.svg | 1 + .../ui/material/ui/icons/width_normal.svg | 1 + dashboard/ui/material/ui/icons/width_wide.svg | 1 + dashboard/ui/material/ui/icons/wifi.svg | 1 + dashboard/ui/material/ui/icons/wifi_1_bar.svg | 1 + dashboard/ui/material/ui/icons/wifi_2_bar.svg | 1 + .../ui/material/ui/icons/wifi_calling.svg | 1 + .../ui/material/ui/icons/wifi_calling_3.svg | 1 + .../ui/material/ui/icons/wifi_channel.svg | 1 + dashboard/ui/material/ui/icons/wifi_find.svg | 1 + dashboard/ui/material/ui/icons/wifi_lock.svg | 1 + dashboard/ui/material/ui/icons/wifi_off.svg | 1 + .../ui/material/ui/icons/wifi_password.svg | 1 + .../ui/icons/wifi_protected_setup.svg | 1 + .../ui/material/ui/icons/wifi_tethering.svg | 1 + .../ui/icons/wifi_tethering_error.svg | 1 + .../material/ui/icons/wifi_tethering_off.svg | 1 + dashboard/ui/material/ui/icons/wind_power.svg | 1 + dashboard/ui/material/ui/icons/window.svg | 1 + dashboard/ui/material/ui/icons/wine_bar.svg | 1 + dashboard/ui/material/ui/icons/woman.svg | 1 + dashboard/ui/material/ui/icons/woman_2.svg | 1 + dashboard/ui/material/ui/icons/work.svg | 1 + .../ui/material/ui/icons/work_history.svg | 1 + dashboard/ui/material/ui/icons/work_off.svg | 1 + .../ui/material/ui/icons/work_outline.svg | 1 + .../material/ui/icons/workspace_premium.svg | 1 + dashboard/ui/material/ui/icons/workspaces.svg | 1 + dashboard/ui/material/ui/icons/wrap_text.svg | 1 + .../ui/material/ui/icons/wrong_location.svg | 1 + dashboard/ui/material/ui/icons/wysiwyg.svg | 1 + dashboard/ui/material/ui/icons/yard.svg | 1 + .../ui/icons/youtube_searched_for.svg | 1 + dashboard/ui/material/ui/icons/zoom_in.svg | 1 + .../ui/material/ui/icons/zoom_in_map.svg | 1 + dashboard/ui/material/ui/icons/zoom_out.svg | 1 + .../ui/material/ui/icons/zoom_out_map.svg | 1 + .../ui/material/ui/items/list_item.slint | 12 + .../ui/material/ui/items/menu_item.slint | 9 + .../material/ui/items/navigation_item.slint | 15 + .../ui/styling/material_animations.slint | 17 + .../ui/styling/material_palette.slint | 173 ++ .../ui/styling/material_schemes.slint | 59 + .../ui/styling/material_style_metrics.slint | 75 + .../ui/styling/material_typography.slint | 93 + 2190 files changed, 10939 insertions(+), 25 deletions(-) create mode 100644 dashboard/ui/material/LICENSE.md create mode 100644 dashboard/ui/material/README.md create mode 100644 dashboard/ui/material/material.slint create mode 100644 dashboard/ui/material/ui/components/app_bar.slint create mode 100644 dashboard/ui/material/ui/components/badge.slint create mode 100644 dashboard/ui/material/ui/components/base_button.slint create mode 100644 dashboard/ui/material/ui/components/base_navigation.slint create mode 100644 dashboard/ui/material/ui/components/bottom_app_bar.slint create mode 100644 dashboard/ui/material/ui/components/bottom_sheet.slint create mode 100644 dashboard/ui/material/ui/components/card.slint create mode 100644 dashboard/ui/material/ui/components/check_box.slint create mode 100644 dashboard/ui/material/ui/components/chip.slint create mode 100644 dashboard/ui/material/ui/components/date_picker.slint create mode 100644 dashboard/ui/material/ui/components/dialog.slint create mode 100644 dashboard/ui/material/ui/components/divider.slint create mode 100644 dashboard/ui/material/ui/components/drawer.slint create mode 100644 dashboard/ui/material/ui/components/drop_down_menu.slint create mode 100644 dashboard/ui/material/ui/components/elevated_button.slint create mode 100644 dashboard/ui/material/ui/components/elevation.slint create mode 100644 dashboard/ui/material/ui/components/extended_touch_area.slint create mode 100644 dashboard/ui/material/ui/components/filled_button.slint create mode 100644 dashboard/ui/material/ui/components/filled_icon_button.slint create mode 100644 dashboard/ui/material/ui/components/floating_action_button.slint create mode 100644 dashboard/ui/material/ui/components/grid.slint create mode 100644 dashboard/ui/material/ui/components/horizontal.slint create mode 100644 dashboard/ui/material/ui/components/icon.slint create mode 100644 dashboard/ui/material/ui/components/icon_button.slint create mode 100644 dashboard/ui/material/ui/components/list.slint create mode 100644 dashboard/ui/material/ui/components/list_view.slint create mode 100644 dashboard/ui/material/ui/components/material_text.slint create mode 100644 dashboard/ui/material/ui/components/material_window.slint create mode 100644 dashboard/ui/material/ui/components/menu.slint create mode 100644 dashboard/ui/material/ui/components/modal.slint create mode 100644 dashboard/ui/material/ui/components/navigation_bar.slint create mode 100644 dashboard/ui/material/ui/components/navigation_drawer.slint create mode 100644 dashboard/ui/material/ui/components/navigation_rail.slint create mode 100644 dashboard/ui/material/ui/components/outline_button.slint create mode 100644 dashboard/ui/material/ui/components/outline_icon_button.slint create mode 100644 dashboard/ui/material/ui/components/progress_indicator.slint create mode 100644 dashboard/ui/material/ui/components/radio_button.slint create mode 100644 dashboard/ui/material/ui/components/scroll_view.slint create mode 100644 dashboard/ui/material/ui/components/search_bar.slint create mode 100644 dashboard/ui/material/ui/components/segmented_button.slint create mode 100644 dashboard/ui/material/ui/components/slider.slint create mode 100644 dashboard/ui/material/ui/components/snack_bar.slint create mode 100644 dashboard/ui/material/ui/components/state_layer.slint create mode 100644 dashboard/ui/material/ui/components/switch.slint create mode 100644 dashboard/ui/material/ui/components/tab_bar.slint create mode 100644 dashboard/ui/material/ui/components/text_button.slint create mode 100644 dashboard/ui/material/ui/components/text_field.slint create mode 100644 dashboard/ui/material/ui/components/time_picker.slint create mode 100644 dashboard/ui/material/ui/components/tonal_button.slint create mode 100644 dashboard/ui/material/ui/components/tonal_icon_button.slint create mode 100644 dashboard/ui/material/ui/components/tooltip.slint create mode 100644 dashboard/ui/material/ui/components/vertical.slint create mode 100644 dashboard/ui/material/ui/icons/10k.svg create mode 100644 dashboard/ui/material/ui/icons/10mp.svg create mode 100644 dashboard/ui/material/ui/icons/11mp.svg create mode 100644 dashboard/ui/material/ui/icons/123.svg create mode 100644 dashboard/ui/material/ui/icons/12mp.svg create mode 100644 dashboard/ui/material/ui/icons/13mp.svg create mode 100644 dashboard/ui/material/ui/icons/14mp.svg create mode 100644 dashboard/ui/material/ui/icons/15mp.svg create mode 100644 dashboard/ui/material/ui/icons/16mp.svg create mode 100644 dashboard/ui/material/ui/icons/17mp.svg create mode 100644 dashboard/ui/material/ui/icons/18_up_rating.svg create mode 100644 dashboard/ui/material/ui/icons/18mp.svg create mode 100644 dashboard/ui/material/ui/icons/19mp.svg create mode 100644 dashboard/ui/material/ui/icons/1k.svg create mode 100644 dashboard/ui/material/ui/icons/1k_plus.svg create mode 100644 dashboard/ui/material/ui/icons/1x_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/20mp.svg create mode 100644 dashboard/ui/material/ui/icons/21mp.svg create mode 100644 dashboard/ui/material/ui/icons/22mp.svg create mode 100644 dashboard/ui/material/ui/icons/23mp.svg create mode 100644 dashboard/ui/material/ui/icons/24mp.svg create mode 100644 dashboard/ui/material/ui/icons/2k.svg create mode 100644 dashboard/ui/material/ui/icons/2k_plus.svg create mode 100644 dashboard/ui/material/ui/icons/2mp.svg create mode 100644 dashboard/ui/material/ui/icons/30fps.svg create mode 100644 dashboard/ui/material/ui/icons/30fps_select.svg create mode 100644 dashboard/ui/material/ui/icons/360.svg create mode 100644 dashboard/ui/material/ui/icons/3d_rotation.svg create mode 100644 dashboard/ui/material/ui/icons/3g_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/3k.svg create mode 100644 dashboard/ui/material/ui/icons/3k_plus.svg create mode 100644 dashboard/ui/material/ui/icons/3mp.svg create mode 100644 dashboard/ui/material/ui/icons/3p.svg create mode 100644 dashboard/ui/material/ui/icons/4g_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/4g_plus_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/4k.svg create mode 100644 dashboard/ui/material/ui/icons/4k_plus.svg create mode 100644 dashboard/ui/material/ui/icons/4mp.svg create mode 100644 dashboard/ui/material/ui/icons/5g.svg create mode 100644 dashboard/ui/material/ui/icons/5k.svg create mode 100644 dashboard/ui/material/ui/icons/5k_plus.svg create mode 100644 dashboard/ui/material/ui/icons/5mp.svg create mode 100644 dashboard/ui/material/ui/icons/60fps.svg create mode 100644 dashboard/ui/material/ui/icons/60fps_select.svg create mode 100644 dashboard/ui/material/ui/icons/6_ft_apart.svg create mode 100644 dashboard/ui/material/ui/icons/6k.svg create mode 100644 dashboard/ui/material/ui/icons/6k_plus.svg create mode 100644 dashboard/ui/material/ui/icons/6mp.svg create mode 100644 dashboard/ui/material/ui/icons/7k.svg create mode 100644 dashboard/ui/material/ui/icons/7k_plus.svg create mode 100644 dashboard/ui/material/ui/icons/7mp.svg create mode 100644 dashboard/ui/material/ui/icons/8k.svg create mode 100644 dashboard/ui/material/ui/icons/8k_plus.svg create mode 100644 dashboard/ui/material/ui/icons/8mp.svg create mode 100644 dashboard/ui/material/ui/icons/9k.svg create mode 100644 dashboard/ui/material/ui/icons/9k_plus.svg create mode 100644 dashboard/ui/material/ui/icons/9mp.svg create mode 100644 dashboard/ui/material/ui/icons/abc.svg create mode 100644 dashboard/ui/material/ui/icons/ac_unit.svg create mode 100644 dashboard/ui/material/ui/icons/access_alarm.svg create mode 100644 dashboard/ui/material/ui/icons/access_alarms.svg create mode 100644 dashboard/ui/material/ui/icons/access_time.svg create mode 100644 dashboard/ui/material/ui/icons/access_time_filled.svg create mode 100644 dashboard/ui/material/ui/icons/accessibility.svg create mode 100644 dashboard/ui/material/ui/icons/accessibility_new.svg create mode 100644 dashboard/ui/material/ui/icons/accessible.svg create mode 100644 dashboard/ui/material/ui/icons/accessible_forward.svg create mode 100644 dashboard/ui/material/ui/icons/account_balance.svg create mode 100644 dashboard/ui/material/ui/icons/account_balance_wallet.svg create mode 100644 dashboard/ui/material/ui/icons/account_box.svg create mode 100644 dashboard/ui/material/ui/icons/account_circle.svg create mode 100644 dashboard/ui/material/ui/icons/account_tree.svg create mode 100644 dashboard/ui/material/ui/icons/ad_units.svg create mode 100644 dashboard/ui/material/ui/icons/adb.svg create mode 100644 dashboard/ui/material/ui/icons/add.svg create mode 100644 dashboard/ui/material/ui/icons/add_a_photo.svg create mode 100644 dashboard/ui/material/ui/icons/add_alarm.svg create mode 100644 dashboard/ui/material/ui/icons/add_alert.svg create mode 100644 dashboard/ui/material/ui/icons/add_box.svg create mode 100644 dashboard/ui/material/ui/icons/add_business.svg create mode 100644 dashboard/ui/material/ui/icons/add_card.svg create mode 100644 dashboard/ui/material/ui/icons/add_chart.svg create mode 100644 dashboard/ui/material/ui/icons/add_circle.svg create mode 100644 dashboard/ui/material/ui/icons/add_circle_outline.svg create mode 100644 dashboard/ui/material/ui/icons/add_comment.svg create mode 100644 dashboard/ui/material/ui/icons/add_home.svg create mode 100644 dashboard/ui/material/ui/icons/add_home_work.svg create mode 100644 dashboard/ui/material/ui/icons/add_ic_call.svg create mode 100644 dashboard/ui/material/ui/icons/add_link.svg create mode 100644 dashboard/ui/material/ui/icons/add_location.svg create mode 100644 dashboard/ui/material/ui/icons/add_location_alt.svg create mode 100644 dashboard/ui/material/ui/icons/add_moderator.svg create mode 100644 dashboard/ui/material/ui/icons/add_photo_alternate.svg create mode 100644 dashboard/ui/material/ui/icons/add_reaction.svg create mode 100644 dashboard/ui/material/ui/icons/add_road.svg create mode 100644 dashboard/ui/material/ui/icons/add_shopping_cart.svg create mode 100644 dashboard/ui/material/ui/icons/add_task.svg create mode 100644 dashboard/ui/material/ui/icons/add_to_drive.svg create mode 100644 dashboard/ui/material/ui/icons/add_to_home_screen.svg create mode 100644 dashboard/ui/material/ui/icons/add_to_photos.svg create mode 100644 dashboard/ui/material/ui/icons/add_to_queue.svg create mode 100644 dashboard/ui/material/ui/icons/addchart.svg create mode 100644 dashboard/ui/material/ui/icons/adf_scanner.svg create mode 100644 dashboard/ui/material/ui/icons/adjust.svg create mode 100644 dashboard/ui/material/ui/icons/admin_panel_settings.svg create mode 100644 dashboard/ui/material/ui/icons/ads_click.svg create mode 100644 dashboard/ui/material/ui/icons/agriculture.svg create mode 100644 dashboard/ui/material/ui/icons/air.svg create mode 100644 dashboard/ui/material/ui/icons/airline_seat_flat.svg create mode 100644 dashboard/ui/material/ui/icons/airline_seat_flat_angled.svg create mode 100644 dashboard/ui/material/ui/icons/airline_seat_individual_suite.svg create mode 100644 dashboard/ui/material/ui/icons/airline_seat_legroom_extra.svg create mode 100644 dashboard/ui/material/ui/icons/airline_seat_legroom_normal.svg create mode 100644 dashboard/ui/material/ui/icons/airline_seat_legroom_reduced.svg create mode 100644 dashboard/ui/material/ui/icons/airline_seat_recline_extra.svg create mode 100644 dashboard/ui/material/ui/icons/airline_seat_recline_normal.svg create mode 100644 dashboard/ui/material/ui/icons/airline_stops.svg create mode 100644 dashboard/ui/material/ui/icons/airlines.svg create mode 100644 dashboard/ui/material/ui/icons/airplane_ticket.svg create mode 100644 dashboard/ui/material/ui/icons/airplanemode_active.svg create mode 100644 dashboard/ui/material/ui/icons/airplanemode_inactive.svg create mode 100644 dashboard/ui/material/ui/icons/airplay.svg create mode 100644 dashboard/ui/material/ui/icons/airport_shuttle.svg create mode 100644 dashboard/ui/material/ui/icons/alarm.svg create mode 100644 dashboard/ui/material/ui/icons/alarm_add.svg create mode 100644 dashboard/ui/material/ui/icons/alarm_off.svg create mode 100644 dashboard/ui/material/ui/icons/alarm_on.svg create mode 100644 dashboard/ui/material/ui/icons/album.svg create mode 100644 dashboard/ui/material/ui/icons/align_horizontal_center.svg create mode 100644 dashboard/ui/material/ui/icons/align_horizontal_left.svg create mode 100644 dashboard/ui/material/ui/icons/align_horizontal_right.svg create mode 100644 dashboard/ui/material/ui/icons/align_vertical_bottom.svg create mode 100644 dashboard/ui/material/ui/icons/align_vertical_center.svg create mode 100644 dashboard/ui/material/ui/icons/align_vertical_top.svg create mode 100644 dashboard/ui/material/ui/icons/all_inbox.svg create mode 100644 dashboard/ui/material/ui/icons/all_inclusive.svg create mode 100644 dashboard/ui/material/ui/icons/all_out.svg create mode 100644 dashboard/ui/material/ui/icons/alt_route.svg create mode 100644 dashboard/ui/material/ui/icons/alternate_email.svg create mode 100644 dashboard/ui/material/ui/icons/analytics.svg create mode 100644 dashboard/ui/material/ui/icons/anchor.svg create mode 100644 dashboard/ui/material/ui/icons/android.svg create mode 100644 dashboard/ui/material/ui/icons/animation.svg create mode 100644 dashboard/ui/material/ui/icons/announcement.svg create mode 100644 dashboard/ui/material/ui/icons/aod.svg create mode 100644 dashboard/ui/material/ui/icons/apartment.svg create mode 100644 dashboard/ui/material/ui/icons/api.svg create mode 100644 dashboard/ui/material/ui/icons/app_blocking.svg create mode 100644 dashboard/ui/material/ui/icons/app_registration.svg create mode 100644 dashboard/ui/material/ui/icons/app_settings_alt.svg create mode 100644 dashboard/ui/material/ui/icons/app_shortcut.svg create mode 100644 dashboard/ui/material/ui/icons/approval.svg create mode 100644 dashboard/ui/material/ui/icons/apps.svg create mode 100644 dashboard/ui/material/ui/icons/apps_outage.svg create mode 100644 dashboard/ui/material/ui/icons/architecture.svg create mode 100644 dashboard/ui/material/ui/icons/archive.svg create mode 100644 dashboard/ui/material/ui/icons/area_chart.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_back.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_back_ios.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_back_ios_new.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_circle_down.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_circle_left.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_circle_right.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_circle_up.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_downward.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_drop_down.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_drop_down_circle.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_drop_up.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_forward.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_forward_ios.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_left.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_outward.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_right.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_right_alt.svg create mode 100644 dashboard/ui/material/ui/icons/arrow_upward.svg create mode 100644 dashboard/ui/material/ui/icons/art_track.svg create mode 100644 dashboard/ui/material/ui/icons/article.svg create mode 100644 dashboard/ui/material/ui/icons/aspect_ratio.svg create mode 100644 dashboard/ui/material/ui/icons/assessment.svg create mode 100644 dashboard/ui/material/ui/icons/assignment.svg create mode 100644 dashboard/ui/material/ui/icons/assignment_ind.svg create mode 100644 dashboard/ui/material/ui/icons/assignment_late.svg create mode 100644 dashboard/ui/material/ui/icons/assignment_return.svg create mode 100644 dashboard/ui/material/ui/icons/assignment_returned.svg create mode 100644 dashboard/ui/material/ui/icons/assignment_turned_in.svg create mode 100644 dashboard/ui/material/ui/icons/assist_walker.svg create mode 100644 dashboard/ui/material/ui/icons/assistant.svg create mode 100644 dashboard/ui/material/ui/icons/assistant_direction.svg create mode 100644 dashboard/ui/material/ui/icons/assistant_photo.svg create mode 100644 dashboard/ui/material/ui/icons/assured_workload.svg create mode 100644 dashboard/ui/material/ui/icons/atm.svg create mode 100644 dashboard/ui/material/ui/icons/attach_email.svg create mode 100644 dashboard/ui/material/ui/icons/attach_file.svg create mode 100644 dashboard/ui/material/ui/icons/attach_money.svg create mode 100644 dashboard/ui/material/ui/icons/attachment.svg create mode 100644 dashboard/ui/material/ui/icons/attractions.svg create mode 100644 dashboard/ui/material/ui/icons/attribution.svg create mode 100644 dashboard/ui/material/ui/icons/audio_file.svg create mode 100644 dashboard/ui/material/ui/icons/audiotrack.svg create mode 100644 dashboard/ui/material/ui/icons/auto_awesome.svg create mode 100644 dashboard/ui/material/ui/icons/auto_awesome_mosaic.svg create mode 100644 dashboard/ui/material/ui/icons/auto_awesome_motion.svg create mode 100644 dashboard/ui/material/ui/icons/auto_delete.svg create mode 100644 dashboard/ui/material/ui/icons/auto_fix_high.svg create mode 100644 dashboard/ui/material/ui/icons/auto_fix_normal.svg create mode 100644 dashboard/ui/material/ui/icons/auto_fix_off.svg create mode 100644 dashboard/ui/material/ui/icons/auto_graph.svg create mode 100644 dashboard/ui/material/ui/icons/auto_mode.svg create mode 100644 dashboard/ui/material/ui/icons/auto_stories.svg create mode 100644 dashboard/ui/material/ui/icons/autofps_select.svg create mode 100644 dashboard/ui/material/ui/icons/autorenew.svg create mode 100644 dashboard/ui/material/ui/icons/av_timer.svg create mode 100644 dashboard/ui/material/ui/icons/baby_changing_station.svg create mode 100644 dashboard/ui/material/ui/icons/back_hand.svg create mode 100644 dashboard/ui/material/ui/icons/backpack.svg create mode 100644 dashboard/ui/material/ui/icons/backspace.svg create mode 100644 dashboard/ui/material/ui/icons/backup.svg create mode 100644 dashboard/ui/material/ui/icons/backup_table.svg create mode 100644 dashboard/ui/material/ui/icons/badge.svg create mode 100644 dashboard/ui/material/ui/icons/bakery_dining.svg create mode 100644 dashboard/ui/material/ui/icons/balance.svg create mode 100644 dashboard/ui/material/ui/icons/balcony.svg create mode 100644 dashboard/ui/material/ui/icons/ballot.svg create mode 100644 dashboard/ui/material/ui/icons/bar_chart.svg create mode 100644 dashboard/ui/material/ui/icons/batch_prediction.svg create mode 100644 dashboard/ui/material/ui/icons/bathroom.svg create mode 100644 dashboard/ui/material/ui/icons/bathtub.svg create mode 100644 dashboard/ui/material/ui/icons/battery_0_bar.svg create mode 100644 dashboard/ui/material/ui/icons/battery_1_bar.svg create mode 100644 dashboard/ui/material/ui/icons/battery_2_bar.svg create mode 100644 dashboard/ui/material/ui/icons/battery_3_bar.svg create mode 100644 dashboard/ui/material/ui/icons/battery_4_bar.svg create mode 100644 dashboard/ui/material/ui/icons/battery_5_bar.svg create mode 100644 dashboard/ui/material/ui/icons/battery_6_bar.svg create mode 100644 dashboard/ui/material/ui/icons/battery_alert.svg create mode 100644 dashboard/ui/material/ui/icons/battery_charging_full.svg create mode 100644 dashboard/ui/material/ui/icons/battery_full.svg create mode 100644 dashboard/ui/material/ui/icons/battery_saver.svg create mode 100644 dashboard/ui/material/ui/icons/battery_std.svg create mode 100644 dashboard/ui/material/ui/icons/battery_unknown.svg create mode 100644 dashboard/ui/material/ui/icons/beach_access.svg create mode 100644 dashboard/ui/material/ui/icons/bed.svg create mode 100644 dashboard/ui/material/ui/icons/bedroom_baby.svg create mode 100644 dashboard/ui/material/ui/icons/bedroom_child.svg create mode 100644 dashboard/ui/material/ui/icons/bedroom_parent.svg create mode 100644 dashboard/ui/material/ui/icons/bedtime.svg create mode 100644 dashboard/ui/material/ui/icons/bedtime_off.svg create mode 100644 dashboard/ui/material/ui/icons/beenhere.svg create mode 100644 dashboard/ui/material/ui/icons/bento.svg create mode 100644 dashboard/ui/material/ui/icons/bike_scooter.svg create mode 100644 dashboard/ui/material/ui/icons/biotech.svg create mode 100644 dashboard/ui/material/ui/icons/blender.svg create mode 100644 dashboard/ui/material/ui/icons/blind.svg create mode 100644 dashboard/ui/material/ui/icons/blinds.svg create mode 100644 dashboard/ui/material/ui/icons/blinds_closed.svg create mode 100644 dashboard/ui/material/ui/icons/block.svg create mode 100644 dashboard/ui/material/ui/icons/bloodtype.svg create mode 100644 dashboard/ui/material/ui/icons/bluetooth.svg create mode 100644 dashboard/ui/material/ui/icons/bluetooth_audio.svg create mode 100644 dashboard/ui/material/ui/icons/bluetooth_connected.svg create mode 100644 dashboard/ui/material/ui/icons/bluetooth_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/bluetooth_drive.svg create mode 100644 dashboard/ui/material/ui/icons/bluetooth_searching.svg create mode 100644 dashboard/ui/material/ui/icons/blur_circular.svg create mode 100644 dashboard/ui/material/ui/icons/blur_linear.svg create mode 100644 dashboard/ui/material/ui/icons/blur_off.svg create mode 100644 dashboard/ui/material/ui/icons/blur_on.svg create mode 100644 dashboard/ui/material/ui/icons/bolt.svg create mode 100644 dashboard/ui/material/ui/icons/book.svg create mode 100644 dashboard/ui/material/ui/icons/book_online.svg create mode 100644 dashboard/ui/material/ui/icons/bookmark.svg create mode 100644 dashboard/ui/material/ui/icons/bookmark_add.svg create mode 100644 dashboard/ui/material/ui/icons/bookmark_added.svg create mode 100644 dashboard/ui/material/ui/icons/bookmark_border.svg create mode 100644 dashboard/ui/material/ui/icons/bookmark_remove.svg create mode 100644 dashboard/ui/material/ui/icons/bookmarks.svg create mode 100644 dashboard/ui/material/ui/icons/border_all.svg create mode 100644 dashboard/ui/material/ui/icons/border_bottom.svg create mode 100644 dashboard/ui/material/ui/icons/border_clear.svg create mode 100644 dashboard/ui/material/ui/icons/border_color.svg create mode 100644 dashboard/ui/material/ui/icons/border_horizontal.svg create mode 100644 dashboard/ui/material/ui/icons/border_inner.svg create mode 100644 dashboard/ui/material/ui/icons/border_left.svg create mode 100644 dashboard/ui/material/ui/icons/border_outer.svg create mode 100644 dashboard/ui/material/ui/icons/border_right.svg create mode 100644 dashboard/ui/material/ui/icons/border_style.svg create mode 100644 dashboard/ui/material/ui/icons/border_top.svg create mode 100644 dashboard/ui/material/ui/icons/border_vertical.svg create mode 100644 dashboard/ui/material/ui/icons/boy.svg create mode 100644 dashboard/ui/material/ui/icons/branding_watermark.svg create mode 100644 dashboard/ui/material/ui/icons/breakfast_dining.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_1.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_2.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_3.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_4.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_5.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_6.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_7.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_auto.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_high.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_low.svg create mode 100644 dashboard/ui/material/ui/icons/brightness_medium.svg create mode 100644 dashboard/ui/material/ui/icons/broadcast_on_home.svg create mode 100644 dashboard/ui/material/ui/icons/broadcast_on_personal.svg create mode 100644 dashboard/ui/material/ui/icons/broken_image.svg create mode 100644 dashboard/ui/material/ui/icons/browse_gallery.svg create mode 100644 dashboard/ui/material/ui/icons/browser_not_supported.svg create mode 100644 dashboard/ui/material/ui/icons/browser_updated.svg create mode 100644 dashboard/ui/material/ui/icons/brunch_dining.svg create mode 100644 dashboard/ui/material/ui/icons/brush.svg create mode 100644 dashboard/ui/material/ui/icons/bubble_chart.svg create mode 100644 dashboard/ui/material/ui/icons/bug_report.svg create mode 100644 dashboard/ui/material/ui/icons/build.svg create mode 100644 dashboard/ui/material/ui/icons/build_circle.svg create mode 100644 dashboard/ui/material/ui/icons/bungalow.svg create mode 100644 dashboard/ui/material/ui/icons/burst_mode.svg create mode 100644 dashboard/ui/material/ui/icons/bus_alert.svg create mode 100644 dashboard/ui/material/ui/icons/business.svg create mode 100644 dashboard/ui/material/ui/icons/business_center.svg create mode 100644 dashboard/ui/material/ui/icons/cabin.svg create mode 100644 dashboard/ui/material/ui/icons/cable.svg create mode 100644 dashboard/ui/material/ui/icons/cached.svg create mode 100644 dashboard/ui/material/ui/icons/cake.svg create mode 100644 dashboard/ui/material/ui/icons/calculate.svg create mode 100644 dashboard/ui/material/ui/icons/calendar_month.svg create mode 100644 dashboard/ui/material/ui/icons/calendar_today.svg create mode 100644 dashboard/ui/material/ui/icons/calendar_view_day.svg create mode 100644 dashboard/ui/material/ui/icons/calendar_view_month.svg create mode 100644 dashboard/ui/material/ui/icons/calendar_view_week.svg create mode 100644 dashboard/ui/material/ui/icons/call.svg create mode 100644 dashboard/ui/material/ui/icons/call_end.svg create mode 100644 dashboard/ui/material/ui/icons/call_made.svg create mode 100644 dashboard/ui/material/ui/icons/call_merge.svg create mode 100644 dashboard/ui/material/ui/icons/call_missed.svg create mode 100644 dashboard/ui/material/ui/icons/call_missed_outgoing.svg create mode 100644 dashboard/ui/material/ui/icons/call_received.svg create mode 100644 dashboard/ui/material/ui/icons/call_split.svg create mode 100644 dashboard/ui/material/ui/icons/call_to_action.svg create mode 100644 dashboard/ui/material/ui/icons/camera.svg create mode 100644 dashboard/ui/material/ui/icons/camera_alt.svg create mode 100644 dashboard/ui/material/ui/icons/camera_enhance.svg create mode 100644 dashboard/ui/material/ui/icons/camera_front.svg create mode 100644 dashboard/ui/material/ui/icons/camera_indoor.svg create mode 100644 dashboard/ui/material/ui/icons/camera_outdoor.svg create mode 100644 dashboard/ui/material/ui/icons/camera_rear.svg create mode 100644 dashboard/ui/material/ui/icons/camera_roll.svg create mode 100644 dashboard/ui/material/ui/icons/cameraswitch.svg create mode 100644 dashboard/ui/material/ui/icons/campaign.svg create mode 100644 dashboard/ui/material/ui/icons/cancel.svg create mode 100644 dashboard/ui/material/ui/icons/cancel_presentation.svg create mode 100644 dashboard/ui/material/ui/icons/cancel_schedule_send.svg create mode 100644 dashboard/ui/material/ui/icons/candlestick_chart.svg create mode 100644 dashboard/ui/material/ui/icons/car_crash.svg create mode 100644 dashboard/ui/material/ui/icons/car_rental.svg create mode 100644 dashboard/ui/material/ui/icons/car_repair.svg create mode 100644 dashboard/ui/material/ui/icons/card_giftcard.svg create mode 100644 dashboard/ui/material/ui/icons/card_membership.svg create mode 100644 dashboard/ui/material/ui/icons/card_travel.svg create mode 100644 dashboard/ui/material/ui/icons/carpenter.svg create mode 100644 dashboard/ui/material/ui/icons/cases.svg create mode 100644 dashboard/ui/material/ui/icons/casino.svg create mode 100644 dashboard/ui/material/ui/icons/cast.svg create mode 100644 dashboard/ui/material/ui/icons/cast_connected.svg create mode 100644 dashboard/ui/material/ui/icons/cast_for_education.svg create mode 100644 dashboard/ui/material/ui/icons/castle.svg create mode 100644 dashboard/ui/material/ui/icons/catching_pokemon.svg create mode 100644 dashboard/ui/material/ui/icons/category.svg create mode 100644 dashboard/ui/material/ui/icons/celebration.svg create mode 100644 dashboard/ui/material/ui/icons/cell_tower.svg create mode 100644 dashboard/ui/material/ui/icons/cell_wifi.svg create mode 100644 dashboard/ui/material/ui/icons/center_focus_strong.svg create mode 100644 dashboard/ui/material/ui/icons/center_focus_weak.svg create mode 100644 dashboard/ui/material/ui/icons/chair.svg create mode 100644 dashboard/ui/material/ui/icons/chair_alt.svg create mode 100644 dashboard/ui/material/ui/icons/chalet.svg create mode 100644 dashboard/ui/material/ui/icons/change_circle.svg create mode 100644 dashboard/ui/material/ui/icons/change_history.svg create mode 100644 dashboard/ui/material/ui/icons/charging_station.svg create mode 100644 dashboard/ui/material/ui/icons/chat.svg create mode 100644 dashboard/ui/material/ui/icons/chat_bubble.svg create mode 100644 dashboard/ui/material/ui/icons/chat_bubble_outline.svg create mode 100644 dashboard/ui/material/ui/icons/check.svg create mode 100644 dashboard/ui/material/ui/icons/check_box.svg create mode 100644 dashboard/ui/material/ui/icons/check_box_outline_blank.svg create mode 100644 dashboard/ui/material/ui/icons/check_circle.svg create mode 100644 dashboard/ui/material/ui/icons/check_circle_outline.svg create mode 100644 dashboard/ui/material/ui/icons/checklist.svg create mode 100644 dashboard/ui/material/ui/icons/checklist_rtl.svg create mode 100644 dashboard/ui/material/ui/icons/checkroom.svg create mode 100644 dashboard/ui/material/ui/icons/chevron_backward.svg create mode 100644 dashboard/ui/material/ui/icons/chevron_forward.svg create mode 100644 dashboard/ui/material/ui/icons/chevron_left.svg create mode 100644 dashboard/ui/material/ui/icons/chevron_right.svg create mode 100644 dashboard/ui/material/ui/icons/child_care.svg create mode 100644 dashboard/ui/material/ui/icons/child_friendly.svg create mode 100644 dashboard/ui/material/ui/icons/chrome_reader_mode.svg create mode 100644 dashboard/ui/material/ui/icons/church.svg create mode 100644 dashboard/ui/material/ui/icons/circle.svg create mode 100644 dashboard/ui/material/ui/icons/circle_notifications.svg create mode 100644 dashboard/ui/material/ui/icons/class.svg create mode 100644 dashboard/ui/material/ui/icons/clean_hands.svg create mode 100644 dashboard/ui/material/ui/icons/cleaning_services.svg create mode 100644 dashboard/ui/material/ui/icons/clear.svg create mode 100644 dashboard/ui/material/ui/icons/clear_all.svg create mode 100644 dashboard/ui/material/ui/icons/close.svg create mode 100644 dashboard/ui/material/ui/icons/close_fullscreen.svg create mode 100644 dashboard/ui/material/ui/icons/closed_caption.svg create mode 100644 dashboard/ui/material/ui/icons/closed_caption_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/closed_caption_off.svg create mode 100644 dashboard/ui/material/ui/icons/cloud.svg create mode 100644 dashboard/ui/material/ui/icons/cloud_circle.svg create mode 100644 dashboard/ui/material/ui/icons/cloud_done.svg create mode 100644 dashboard/ui/material/ui/icons/cloud_download.svg create mode 100644 dashboard/ui/material/ui/icons/cloud_off.svg create mode 100644 dashboard/ui/material/ui/icons/cloud_queue.svg create mode 100644 dashboard/ui/material/ui/icons/cloud_sync.svg create mode 100644 dashboard/ui/material/ui/icons/cloud_upload.svg create mode 100644 dashboard/ui/material/ui/icons/co2.svg create mode 100644 dashboard/ui/material/ui/icons/co_present.svg create mode 100644 dashboard/ui/material/ui/icons/code.svg create mode 100644 dashboard/ui/material/ui/icons/code_off.svg create mode 100644 dashboard/ui/material/ui/icons/coffee.svg create mode 100644 dashboard/ui/material/ui/icons/coffee_maker.svg create mode 100644 dashboard/ui/material/ui/icons/collections.svg create mode 100644 dashboard/ui/material/ui/icons/collections_bookmark.svg create mode 100644 dashboard/ui/material/ui/icons/color_lens.svg create mode 100644 dashboard/ui/material/ui/icons/colorize.svg create mode 100644 dashboard/ui/material/ui/icons/comment.svg create mode 100644 dashboard/ui/material/ui/icons/comment_bank.svg create mode 100644 dashboard/ui/material/ui/icons/comments_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/commit.svg create mode 100644 dashboard/ui/material/ui/icons/commute.svg create mode 100644 dashboard/ui/material/ui/icons/compare.svg create mode 100644 dashboard/ui/material/ui/icons/compare_arrows.svg create mode 100644 dashboard/ui/material/ui/icons/compass_calibration.svg create mode 100644 dashboard/ui/material/ui/icons/compost.svg create mode 100644 dashboard/ui/material/ui/icons/compress.svg create mode 100644 dashboard/ui/material/ui/icons/computer.svg create mode 100644 dashboard/ui/material/ui/icons/confirmation_number.svg create mode 100644 dashboard/ui/material/ui/icons/connect_without_contact.svg create mode 100644 dashboard/ui/material/ui/icons/connected_tv.svg create mode 100644 dashboard/ui/material/ui/icons/connecting_airports.svg create mode 100644 dashboard/ui/material/ui/icons/construction.svg create mode 100644 dashboard/ui/material/ui/icons/contact_emergency.svg create mode 100644 dashboard/ui/material/ui/icons/contact_mail.svg create mode 100644 dashboard/ui/material/ui/icons/contact_page.svg create mode 100644 dashboard/ui/material/ui/icons/contact_phone.svg create mode 100644 dashboard/ui/material/ui/icons/contact_support.svg create mode 100644 dashboard/ui/material/ui/icons/contactless.svg create mode 100644 dashboard/ui/material/ui/icons/contacts.svg create mode 100644 dashboard/ui/material/ui/icons/content_copy.svg create mode 100644 dashboard/ui/material/ui/icons/content_cut.svg create mode 100644 dashboard/ui/material/ui/icons/content_paste.svg create mode 100644 dashboard/ui/material/ui/icons/content_paste_go.svg create mode 100644 dashboard/ui/material/ui/icons/content_paste_off.svg create mode 100644 dashboard/ui/material/ui/icons/content_paste_search.svg create mode 100644 dashboard/ui/material/ui/icons/contrast.svg create mode 100644 dashboard/ui/material/ui/icons/control_camera.svg create mode 100644 dashboard/ui/material/ui/icons/control_point.svg create mode 100644 dashboard/ui/material/ui/icons/control_point_duplicate.svg create mode 100644 dashboard/ui/material/ui/icons/cookie.svg create mode 100644 dashboard/ui/material/ui/icons/copy_all.svg create mode 100644 dashboard/ui/material/ui/icons/copyright.svg create mode 100644 dashboard/ui/material/ui/icons/coronavirus.svg create mode 100644 dashboard/ui/material/ui/icons/corporate_fare.svg create mode 100644 dashboard/ui/material/ui/icons/cottage.svg create mode 100644 dashboard/ui/material/ui/icons/countertops.svg create mode 100644 dashboard/ui/material/ui/icons/create.svg create mode 100644 dashboard/ui/material/ui/icons/create_new_folder.svg create mode 100644 dashboard/ui/material/ui/icons/credit_card.svg create mode 100644 dashboard/ui/material/ui/icons/credit_card_off.svg create mode 100644 dashboard/ui/material/ui/icons/credit_score.svg create mode 100644 dashboard/ui/material/ui/icons/crib.svg create mode 100644 dashboard/ui/material/ui/icons/crisis_alert.svg create mode 100644 dashboard/ui/material/ui/icons/crop.svg create mode 100644 dashboard/ui/material/ui/icons/crop_16_9.svg create mode 100644 dashboard/ui/material/ui/icons/crop_3_2.svg create mode 100644 dashboard/ui/material/ui/icons/crop_5_4.svg create mode 100644 dashboard/ui/material/ui/icons/crop_7_5.svg create mode 100644 dashboard/ui/material/ui/icons/crop_din.svg create mode 100644 dashboard/ui/material/ui/icons/crop_free.svg create mode 100644 dashboard/ui/material/ui/icons/crop_landscape.svg create mode 100644 dashboard/ui/material/ui/icons/crop_original.svg create mode 100644 dashboard/ui/material/ui/icons/crop_portrait.svg create mode 100644 dashboard/ui/material/ui/icons/crop_rotate.svg create mode 100644 dashboard/ui/material/ui/icons/crop_square.svg create mode 100644 dashboard/ui/material/ui/icons/cruelty_free.svg create mode 100644 dashboard/ui/material/ui/icons/css.svg create mode 100644 dashboard/ui/material/ui/icons/currency_bitcoin.svg create mode 100644 dashboard/ui/material/ui/icons/currency_exchange.svg create mode 100644 dashboard/ui/material/ui/icons/currency_franc.svg create mode 100644 dashboard/ui/material/ui/icons/currency_lira.svg create mode 100644 dashboard/ui/material/ui/icons/currency_pound.svg create mode 100644 dashboard/ui/material/ui/icons/currency_ruble.svg create mode 100644 dashboard/ui/material/ui/icons/currency_rupee.svg create mode 100644 dashboard/ui/material/ui/icons/currency_yen.svg create mode 100644 dashboard/ui/material/ui/icons/currency_yuan.svg create mode 100644 dashboard/ui/material/ui/icons/curtains.svg create mode 100644 dashboard/ui/material/ui/icons/curtains_closed.svg create mode 100644 dashboard/ui/material/ui/icons/cyclone.svg create mode 100644 dashboard/ui/material/ui/icons/dangerous.svg create mode 100644 dashboard/ui/material/ui/icons/dark_mode.svg create mode 100644 dashboard/ui/material/ui/icons/dashboard.svg create mode 100644 dashboard/ui/material/ui/icons/dashboard_customize.svg create mode 100644 dashboard/ui/material/ui/icons/data_array.svg create mode 100644 dashboard/ui/material/ui/icons/data_exploration.svg create mode 100644 dashboard/ui/material/ui/icons/data_object.svg create mode 100644 dashboard/ui/material/ui/icons/data_saver_off.svg create mode 100644 dashboard/ui/material/ui/icons/data_saver_on.svg create mode 100644 dashboard/ui/material/ui/icons/data_thresholding.svg create mode 100644 dashboard/ui/material/ui/icons/data_usage.svg create mode 100644 dashboard/ui/material/ui/icons/dataset.svg create mode 100644 dashboard/ui/material/ui/icons/dataset_linked.svg create mode 100644 dashboard/ui/material/ui/icons/date_range.svg create mode 100644 dashboard/ui/material/ui/icons/deblur.svg create mode 100644 dashboard/ui/material/ui/icons/deck.svg create mode 100644 dashboard/ui/material/ui/icons/dehaze.svg create mode 100644 dashboard/ui/material/ui/icons/delete.svg create mode 100644 dashboard/ui/material/ui/icons/delete_forever.svg create mode 100644 dashboard/ui/material/ui/icons/delete_outline.svg create mode 100644 dashboard/ui/material/ui/icons/delete_sweep.svg create mode 100644 dashboard/ui/material/ui/icons/delivery_dining.svg create mode 100644 dashboard/ui/material/ui/icons/density_large.svg create mode 100644 dashboard/ui/material/ui/icons/density_medium.svg create mode 100644 dashboard/ui/material/ui/icons/density_small.svg create mode 100644 dashboard/ui/material/ui/icons/departure_board.svg create mode 100644 dashboard/ui/material/ui/icons/description.svg create mode 100644 dashboard/ui/material/ui/icons/deselect.svg create mode 100644 dashboard/ui/material/ui/icons/design_services.svg create mode 100644 dashboard/ui/material/ui/icons/desk.svg create mode 100644 dashboard/ui/material/ui/icons/desktop_access_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/desktop_mac.svg create mode 100644 dashboard/ui/material/ui/icons/desktop_windows.svg create mode 100644 dashboard/ui/material/ui/icons/details.svg create mode 100644 dashboard/ui/material/ui/icons/developer_board.svg create mode 100644 dashboard/ui/material/ui/icons/developer_board_off.svg create mode 100644 dashboard/ui/material/ui/icons/developer_mode.svg create mode 100644 dashboard/ui/material/ui/icons/device_hub.svg create mode 100644 dashboard/ui/material/ui/icons/device_thermostat.svg create mode 100644 dashboard/ui/material/ui/icons/device_unknown.svg create mode 100644 dashboard/ui/material/ui/icons/devices.svg create mode 100644 dashboard/ui/material/ui/icons/devices_fold.svg create mode 100644 dashboard/ui/material/ui/icons/devices_other.svg create mode 100644 dashboard/ui/material/ui/icons/dialer_sip.svg create mode 100644 dashboard/ui/material/ui/icons/dialpad.svg create mode 100644 dashboard/ui/material/ui/icons/diamond.svg create mode 100644 dashboard/ui/material/ui/icons/difference.svg create mode 100644 dashboard/ui/material/ui/icons/dining.svg create mode 100644 dashboard/ui/material/ui/icons/dinner_dining.svg create mode 100644 dashboard/ui/material/ui/icons/directions.svg create mode 100644 dashboard/ui/material/ui/icons/directions_bike.svg create mode 100644 dashboard/ui/material/ui/icons/directions_boat.svg create mode 100644 dashboard/ui/material/ui/icons/directions_boat_filled.svg create mode 100644 dashboard/ui/material/ui/icons/directions_bus.svg create mode 100644 dashboard/ui/material/ui/icons/directions_bus_filled.svg create mode 100644 dashboard/ui/material/ui/icons/directions_car.svg create mode 100644 dashboard/ui/material/ui/icons/directions_car_filled.svg create mode 100644 dashboard/ui/material/ui/icons/directions_off.svg create mode 100644 dashboard/ui/material/ui/icons/directions_railway.svg create mode 100644 dashboard/ui/material/ui/icons/directions_railway_filled.svg create mode 100644 dashboard/ui/material/ui/icons/directions_run.svg create mode 100644 dashboard/ui/material/ui/icons/directions_subway.svg create mode 100644 dashboard/ui/material/ui/icons/directions_subway_filled.svg create mode 100644 dashboard/ui/material/ui/icons/directions_transit.svg create mode 100644 dashboard/ui/material/ui/icons/directions_transit_filled.svg create mode 100644 dashboard/ui/material/ui/icons/directions_walk.svg create mode 100644 dashboard/ui/material/ui/icons/dirty_lens.svg create mode 100644 dashboard/ui/material/ui/icons/disabled_by_default.svg create mode 100644 dashboard/ui/material/ui/icons/disabled_visible.svg create mode 100644 dashboard/ui/material/ui/icons/disc_full.svg create mode 100644 dashboard/ui/material/ui/icons/discount.svg create mode 100644 dashboard/ui/material/ui/icons/display_settings.svg create mode 100644 dashboard/ui/material/ui/icons/diversity_1.svg create mode 100644 dashboard/ui/material/ui/icons/diversity_2.svg create mode 100644 dashboard/ui/material/ui/icons/diversity_3.svg create mode 100644 dashboard/ui/material/ui/icons/dns.svg create mode 100644 dashboard/ui/material/ui/icons/do_disturb.svg create mode 100644 dashboard/ui/material/ui/icons/do_disturb_alt.svg create mode 100644 dashboard/ui/material/ui/icons/do_disturb_off.svg create mode 100644 dashboard/ui/material/ui/icons/do_disturb_on.svg create mode 100644 dashboard/ui/material/ui/icons/do_not_disturb.svg create mode 100644 dashboard/ui/material/ui/icons/do_not_disturb_alt.svg create mode 100644 dashboard/ui/material/ui/icons/do_not_disturb_off.svg create mode 100644 dashboard/ui/material/ui/icons/do_not_disturb_on.svg create mode 100644 dashboard/ui/material/ui/icons/do_not_disturb_on_total_silence.svg create mode 100644 dashboard/ui/material/ui/icons/do_not_step.svg create mode 100644 dashboard/ui/material/ui/icons/do_not_touch.svg create mode 100644 dashboard/ui/material/ui/icons/dock.svg create mode 100644 dashboard/ui/material/ui/icons/document_scanner.svg create mode 100644 dashboard/ui/material/ui/icons/domain.svg create mode 100644 dashboard/ui/material/ui/icons/domain_add.svg create mode 100644 dashboard/ui/material/ui/icons/domain_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/domain_verification.svg create mode 100644 dashboard/ui/material/ui/icons/done.svg create mode 100644 dashboard/ui/material/ui/icons/done_all.svg create mode 100644 dashboard/ui/material/ui/icons/done_outline.svg create mode 100644 dashboard/ui/material/ui/icons/donut_large.svg create mode 100644 dashboard/ui/material/ui/icons/donut_small.svg create mode 100644 dashboard/ui/material/ui/icons/door_back.svg create mode 100644 dashboard/ui/material/ui/icons/door_front.svg create mode 100644 dashboard/ui/material/ui/icons/door_sliding.svg create mode 100644 dashboard/ui/material/ui/icons/doorbell.svg create mode 100644 dashboard/ui/material/ui/icons/double_arrow.svg create mode 100644 dashboard/ui/material/ui/icons/downhill_skiing.svg create mode 100644 dashboard/ui/material/ui/icons/download.svg create mode 100644 dashboard/ui/material/ui/icons/download_done.svg create mode 100644 dashboard/ui/material/ui/icons/download_for_offline.svg create mode 100644 dashboard/ui/material/ui/icons/downloading.svg create mode 100644 dashboard/ui/material/ui/icons/drafts.svg create mode 100644 dashboard/ui/material/ui/icons/drag_handle.svg create mode 100644 dashboard/ui/material/ui/icons/drag_indicator.svg create mode 100644 dashboard/ui/material/ui/icons/draw.svg create mode 100644 dashboard/ui/material/ui/icons/drive_eta.svg create mode 100644 dashboard/ui/material/ui/icons/drive_file_move.svg create mode 100644 dashboard/ui/material/ui/icons/drive_file_move_rtl.svg create mode 100644 dashboard/ui/material/ui/icons/drive_file_rename_outline.svg create mode 100644 dashboard/ui/material/ui/icons/drive_folder_upload.svg create mode 100644 dashboard/ui/material/ui/icons/dry.svg create mode 100644 dashboard/ui/material/ui/icons/dry_cleaning.svg create mode 100644 dashboard/ui/material/ui/icons/duo.svg create mode 100644 dashboard/ui/material/ui/icons/dvr.svg create mode 100644 dashboard/ui/material/ui/icons/dynamic_feed.svg create mode 100644 dashboard/ui/material/ui/icons/dynamic_form.svg create mode 100644 dashboard/ui/material/ui/icons/e_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/earbuds.svg create mode 100644 dashboard/ui/material/ui/icons/earbuds_battery.svg create mode 100644 dashboard/ui/material/ui/icons/east.svg create mode 100644 dashboard/ui/material/ui/icons/edgesensor_high.svg create mode 100644 dashboard/ui/material/ui/icons/edgesensor_low.svg create mode 100644 dashboard/ui/material/ui/icons/edit.svg create mode 100644 dashboard/ui/material/ui/icons/edit_attributes.svg create mode 100644 dashboard/ui/material/ui/icons/edit_calendar.svg create mode 100644 dashboard/ui/material/ui/icons/edit_location.svg create mode 100644 dashboard/ui/material/ui/icons/edit_location_alt.svg create mode 100644 dashboard/ui/material/ui/icons/edit_note.svg create mode 100644 dashboard/ui/material/ui/icons/edit_notifications.svg create mode 100644 dashboard/ui/material/ui/icons/edit_off.svg create mode 100644 dashboard/ui/material/ui/icons/edit_road.svg create mode 100644 dashboard/ui/material/ui/icons/egg.svg create mode 100644 dashboard/ui/material/ui/icons/egg_alt.svg create mode 100644 dashboard/ui/material/ui/icons/eject.svg create mode 100644 dashboard/ui/material/ui/icons/elderly.svg create mode 100644 dashboard/ui/material/ui/icons/elderly_woman.svg create mode 100644 dashboard/ui/material/ui/icons/electric_bike.svg create mode 100644 dashboard/ui/material/ui/icons/electric_bolt.svg create mode 100644 dashboard/ui/material/ui/icons/electric_car.svg create mode 100644 dashboard/ui/material/ui/icons/electric_meter.svg create mode 100644 dashboard/ui/material/ui/icons/electric_moped.svg create mode 100644 dashboard/ui/material/ui/icons/electric_rickshaw.svg create mode 100644 dashboard/ui/material/ui/icons/electric_scooter.svg create mode 100644 dashboard/ui/material/ui/icons/electrical_services.svg create mode 100644 dashboard/ui/material/ui/icons/elevator.svg create mode 100644 dashboard/ui/material/ui/icons/email.svg create mode 100644 dashboard/ui/material/ui/icons/emergency.svg create mode 100644 dashboard/ui/material/ui/icons/emergency_recording.svg create mode 100644 dashboard/ui/material/ui/icons/emergency_share.svg create mode 100644 dashboard/ui/material/ui/icons/emoji_emotions.svg create mode 100644 dashboard/ui/material/ui/icons/emoji_events.svg create mode 100644 dashboard/ui/material/ui/icons/emoji_food_beverage.svg create mode 100644 dashboard/ui/material/ui/icons/emoji_nature.svg create mode 100644 dashboard/ui/material/ui/icons/emoji_objects.svg create mode 100644 dashboard/ui/material/ui/icons/emoji_people.svg create mode 100644 dashboard/ui/material/ui/icons/emoji_symbols.svg create mode 100644 dashboard/ui/material/ui/icons/emoji_transportation.svg create mode 100644 dashboard/ui/material/ui/icons/energy_savings_leaf.svg create mode 100644 dashboard/ui/material/ui/icons/engineering.svg create mode 100644 dashboard/ui/material/ui/icons/enhanced_encryption.svg create mode 100644 dashboard/ui/material/ui/icons/equalizer.svg create mode 100644 dashboard/ui/material/ui/icons/error.svg create mode 100644 dashboard/ui/material/ui/icons/error_outline.svg create mode 100644 dashboard/ui/material/ui/icons/escalator.svg create mode 100644 dashboard/ui/material/ui/icons/escalator_warning.svg create mode 100644 dashboard/ui/material/ui/icons/euro.svg create mode 100644 dashboard/ui/material/ui/icons/euro_symbol.svg create mode 100644 dashboard/ui/material/ui/icons/ev_station.svg create mode 100644 dashboard/ui/material/ui/icons/event.svg create mode 100644 dashboard/ui/material/ui/icons/event_available.svg create mode 100644 dashboard/ui/material/ui/icons/event_busy.svg create mode 100644 dashboard/ui/material/ui/icons/event_note.svg create mode 100644 dashboard/ui/material/ui/icons/event_repeat.svg create mode 100644 dashboard/ui/material/ui/icons/event_seat.svg create mode 100644 dashboard/ui/material/ui/icons/exit_to_app.svg create mode 100644 dashboard/ui/material/ui/icons/expand.svg create mode 100644 dashboard/ui/material/ui/icons/expand_circle_down.svg create mode 100644 dashboard/ui/material/ui/icons/expand_less.svg create mode 100644 dashboard/ui/material/ui/icons/expand_more.svg create mode 100644 dashboard/ui/material/ui/icons/explicit.svg create mode 100644 dashboard/ui/material/ui/icons/explore.svg create mode 100644 dashboard/ui/material/ui/icons/explore_off.svg create mode 100644 dashboard/ui/material/ui/icons/exposure.svg create mode 100644 dashboard/ui/material/ui/icons/exposure_neg_1.svg create mode 100644 dashboard/ui/material/ui/icons/exposure_neg_2.svg create mode 100644 dashboard/ui/material/ui/icons/exposure_plus_1.svg create mode 100644 dashboard/ui/material/ui/icons/exposure_plus_2.svg create mode 100644 dashboard/ui/material/ui/icons/exposure_zero.svg create mode 100644 dashboard/ui/material/ui/icons/extension.svg create mode 100644 dashboard/ui/material/ui/icons/extension_off.svg create mode 100644 dashboard/ui/material/ui/icons/face.svg create mode 100644 dashboard/ui/material/ui/icons/face_2.svg create mode 100644 dashboard/ui/material/ui/icons/face_3.svg create mode 100644 dashboard/ui/material/ui/icons/face_4.svg create mode 100644 dashboard/ui/material/ui/icons/face_5.svg create mode 100644 dashboard/ui/material/ui/icons/face_6.svg create mode 100644 dashboard/ui/material/ui/icons/face_retouching_natural.svg create mode 100644 dashboard/ui/material/ui/icons/face_retouching_off.svg create mode 100644 dashboard/ui/material/ui/icons/fact_check.svg create mode 100644 dashboard/ui/material/ui/icons/factory.svg create mode 100644 dashboard/ui/material/ui/icons/family_restroom.svg create mode 100644 dashboard/ui/material/ui/icons/fast_forward.svg create mode 100644 dashboard/ui/material/ui/icons/fast_rewind.svg create mode 100644 dashboard/ui/material/ui/icons/fastfood.svg create mode 100644 dashboard/ui/material/ui/icons/favorite.svg create mode 100644 dashboard/ui/material/ui/icons/favorite_border.svg create mode 100644 dashboard/ui/material/ui/icons/fax.svg create mode 100644 dashboard/ui/material/ui/icons/featured_play_list.svg create mode 100644 dashboard/ui/material/ui/icons/featured_video.svg create mode 100644 dashboard/ui/material/ui/icons/feed.svg create mode 100644 dashboard/ui/material/ui/icons/feedback.svg create mode 100644 dashboard/ui/material/ui/icons/female.svg create mode 100644 dashboard/ui/material/ui/icons/fence.svg create mode 100644 dashboard/ui/material/ui/icons/festival.svg create mode 100644 dashboard/ui/material/ui/icons/fiber_dvr.svg create mode 100644 dashboard/ui/material/ui/icons/fiber_manual_record.svg create mode 100644 dashboard/ui/material/ui/icons/fiber_new.svg create mode 100644 dashboard/ui/material/ui/icons/fiber_pin.svg create mode 100644 dashboard/ui/material/ui/icons/fiber_smart_record.svg create mode 100644 dashboard/ui/material/ui/icons/file_copy.svg create mode 100644 dashboard/ui/material/ui/icons/file_download.svg create mode 100644 dashboard/ui/material/ui/icons/file_download_done.svg create mode 100644 dashboard/ui/material/ui/icons/file_download_off.svg create mode 100644 dashboard/ui/material/ui/icons/file_open.svg create mode 100644 dashboard/ui/material/ui/icons/file_present.svg create mode 100644 dashboard/ui/material/ui/icons/file_upload.svg create mode 100644 dashboard/ui/material/ui/icons/filter.svg create mode 100644 dashboard/ui/material/ui/icons/filter_1.svg create mode 100644 dashboard/ui/material/ui/icons/filter_2.svg create mode 100644 dashboard/ui/material/ui/icons/filter_3.svg create mode 100644 dashboard/ui/material/ui/icons/filter_4.svg create mode 100644 dashboard/ui/material/ui/icons/filter_5.svg create mode 100644 dashboard/ui/material/ui/icons/filter_6.svg create mode 100644 dashboard/ui/material/ui/icons/filter_7.svg create mode 100644 dashboard/ui/material/ui/icons/filter_8.svg create mode 100644 dashboard/ui/material/ui/icons/filter_9.svg create mode 100644 dashboard/ui/material/ui/icons/filter_9_plus.svg create mode 100644 dashboard/ui/material/ui/icons/filter_alt.svg create mode 100644 dashboard/ui/material/ui/icons/filter_alt_off.svg create mode 100644 dashboard/ui/material/ui/icons/filter_b_and_w.svg create mode 100644 dashboard/ui/material/ui/icons/filter_center_focus.svg create mode 100644 dashboard/ui/material/ui/icons/filter_drama.svg create mode 100644 dashboard/ui/material/ui/icons/filter_frames.svg create mode 100644 dashboard/ui/material/ui/icons/filter_hdr.svg create mode 100644 dashboard/ui/material/ui/icons/filter_list.svg create mode 100644 dashboard/ui/material/ui/icons/filter_list_off.svg create mode 100644 dashboard/ui/material/ui/icons/filter_none.svg create mode 100644 dashboard/ui/material/ui/icons/filter_tilt_shift.svg create mode 100644 dashboard/ui/material/ui/icons/filter_vintage.svg create mode 100644 dashboard/ui/material/ui/icons/find_in_page.svg create mode 100644 dashboard/ui/material/ui/icons/find_replace.svg create mode 100644 dashboard/ui/material/ui/icons/fingerprint.svg create mode 100644 dashboard/ui/material/ui/icons/fire_extinguisher.svg create mode 100644 dashboard/ui/material/ui/icons/fire_hydrant_alt.svg create mode 100644 dashboard/ui/material/ui/icons/fire_truck.svg create mode 100644 dashboard/ui/material/ui/icons/fireplace.svg create mode 100644 dashboard/ui/material/ui/icons/first_page.svg create mode 100644 dashboard/ui/material/ui/icons/fit_screen.svg create mode 100644 dashboard/ui/material/ui/icons/fitbit.svg create mode 100644 dashboard/ui/material/ui/icons/fitness_center.svg create mode 100644 dashboard/ui/material/ui/icons/flag.svg create mode 100644 dashboard/ui/material/ui/icons/flag_circle.svg create mode 100644 dashboard/ui/material/ui/icons/flaky.svg create mode 100644 dashboard/ui/material/ui/icons/flare.svg create mode 100644 dashboard/ui/material/ui/icons/flash_auto.svg create mode 100644 dashboard/ui/material/ui/icons/flash_off.svg create mode 100644 dashboard/ui/material/ui/icons/flash_on.svg create mode 100644 dashboard/ui/material/ui/icons/flashlight_off.svg create mode 100644 dashboard/ui/material/ui/icons/flashlight_on.svg create mode 100644 dashboard/ui/material/ui/icons/flatware.svg create mode 100644 dashboard/ui/material/ui/icons/flight.svg create mode 100644 dashboard/ui/material/ui/icons/flight_class.svg create mode 100644 dashboard/ui/material/ui/icons/flight_land.svg create mode 100644 dashboard/ui/material/ui/icons/flight_takeoff.svg create mode 100644 dashboard/ui/material/ui/icons/flip.svg create mode 100644 dashboard/ui/material/ui/icons/flip_camera_android.svg create mode 100644 dashboard/ui/material/ui/icons/flip_camera_ios.svg create mode 100644 dashboard/ui/material/ui/icons/flip_to_back.svg create mode 100644 dashboard/ui/material/ui/icons/flip_to_front.svg create mode 100644 dashboard/ui/material/ui/icons/flood.svg create mode 100644 dashboard/ui/material/ui/icons/fluorescent.svg create mode 100644 dashboard/ui/material/ui/icons/flutter_dash.svg create mode 100644 dashboard/ui/material/ui/icons/fmd_bad.svg create mode 100644 dashboard/ui/material/ui/icons/fmd_good.svg create mode 100644 dashboard/ui/material/ui/icons/folder.svg create mode 100644 dashboard/ui/material/ui/icons/folder_copy.svg create mode 100644 dashboard/ui/material/ui/icons/folder_delete.svg create mode 100644 dashboard/ui/material/ui/icons/folder_off.svg create mode 100644 dashboard/ui/material/ui/icons/folder_open.svg create mode 100644 dashboard/ui/material/ui/icons/folder_shared.svg create mode 100644 dashboard/ui/material/ui/icons/folder_special.svg create mode 100644 dashboard/ui/material/ui/icons/folder_zip.svg create mode 100644 dashboard/ui/material/ui/icons/follow_the_signs.svg create mode 100644 dashboard/ui/material/ui/icons/font_download.svg create mode 100644 dashboard/ui/material/ui/icons/font_download_off.svg create mode 100644 dashboard/ui/material/ui/icons/food_bank.svg create mode 100644 dashboard/ui/material/ui/icons/forest.svg create mode 100644 dashboard/ui/material/ui/icons/fork_left.svg create mode 100644 dashboard/ui/material/ui/icons/fork_right.svg create mode 100644 dashboard/ui/material/ui/icons/format_align_center.svg create mode 100644 dashboard/ui/material/ui/icons/format_align_justify.svg create mode 100644 dashboard/ui/material/ui/icons/format_align_left.svg create mode 100644 dashboard/ui/material/ui/icons/format_align_right.svg create mode 100644 dashboard/ui/material/ui/icons/format_bold.svg create mode 100644 dashboard/ui/material/ui/icons/format_clear.svg create mode 100644 dashboard/ui/material/ui/icons/format_color_fill.svg create mode 100644 dashboard/ui/material/ui/icons/format_color_reset.svg create mode 100644 dashboard/ui/material/ui/icons/format_color_text.svg create mode 100644 dashboard/ui/material/ui/icons/format_indent_decrease.svg create mode 100644 dashboard/ui/material/ui/icons/format_indent_increase.svg create mode 100644 dashboard/ui/material/ui/icons/format_italic.svg create mode 100644 dashboard/ui/material/ui/icons/format_line_spacing.svg create mode 100644 dashboard/ui/material/ui/icons/format_list_bulleted.svg create mode 100644 dashboard/ui/material/ui/icons/format_list_numbered.svg create mode 100644 dashboard/ui/material/ui/icons/format_list_numbered_rtl.svg create mode 100644 dashboard/ui/material/ui/icons/format_overline.svg create mode 100644 dashboard/ui/material/ui/icons/format_paint.svg create mode 100644 dashboard/ui/material/ui/icons/format_quote.svg create mode 100644 dashboard/ui/material/ui/icons/format_shapes.svg create mode 100644 dashboard/ui/material/ui/icons/format_size.svg create mode 100644 dashboard/ui/material/ui/icons/format_strikethrough.svg create mode 100644 dashboard/ui/material/ui/icons/format_textdirection_l_to_r.svg create mode 100644 dashboard/ui/material/ui/icons/format_textdirection_r_to_l.svg create mode 100644 dashboard/ui/material/ui/icons/format_underlined.svg create mode 100644 dashboard/ui/material/ui/icons/fort.svg create mode 100644 dashboard/ui/material/ui/icons/forum.svg create mode 100644 dashboard/ui/material/ui/icons/forward.svg create mode 100644 dashboard/ui/material/ui/icons/forward_10.svg create mode 100644 dashboard/ui/material/ui/icons/forward_30.svg create mode 100644 dashboard/ui/material/ui/icons/forward_5.svg create mode 100644 dashboard/ui/material/ui/icons/forward_to_inbox.svg create mode 100644 dashboard/ui/material/ui/icons/foundation.svg create mode 100644 dashboard/ui/material/ui/icons/free_breakfast.svg create mode 100644 dashboard/ui/material/ui/icons/free_cancellation.svg create mode 100644 dashboard/ui/material/ui/icons/front_hand.svg create mode 100644 dashboard/ui/material/ui/icons/fullscreen.svg create mode 100644 dashboard/ui/material/ui/icons/fullscreen_exit.svg create mode 100644 dashboard/ui/material/ui/icons/functions.svg create mode 100644 dashboard/ui/material/ui/icons/g_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/g_translate.svg create mode 100644 dashboard/ui/material/ui/icons/gamepad.svg create mode 100644 dashboard/ui/material/ui/icons/games.svg create mode 100644 dashboard/ui/material/ui/icons/garage.svg create mode 100644 dashboard/ui/material/ui/icons/gas_meter.svg create mode 100644 dashboard/ui/material/ui/icons/gavel.svg create mode 100644 dashboard/ui/material/ui/icons/generate_icons.sh create mode 100644 dashboard/ui/material/ui/icons/generating_tokens.svg create mode 100644 dashboard/ui/material/ui/icons/gesture.svg create mode 100644 dashboard/ui/material/ui/icons/get_app.svg create mode 100644 dashboard/ui/material/ui/icons/gif.svg create mode 100644 dashboard/ui/material/ui/icons/gif_box.svg create mode 100644 dashboard/ui/material/ui/icons/girl.svg create mode 100644 dashboard/ui/material/ui/icons/gite.svg create mode 100644 dashboard/ui/material/ui/icons/golf_course.svg create mode 100644 dashboard/ui/material/ui/icons/gpp_bad.svg create mode 100644 dashboard/ui/material/ui/icons/gpp_good.svg create mode 100644 dashboard/ui/material/ui/icons/gpp_maybe.svg create mode 100644 dashboard/ui/material/ui/icons/gps_fixed.svg create mode 100644 dashboard/ui/material/ui/icons/gps_not_fixed.svg create mode 100644 dashboard/ui/material/ui/icons/gps_off.svg create mode 100644 dashboard/ui/material/ui/icons/grade.svg create mode 100644 dashboard/ui/material/ui/icons/gradient.svg create mode 100644 dashboard/ui/material/ui/icons/grading.svg create mode 100644 dashboard/ui/material/ui/icons/grain.svg create mode 100644 dashboard/ui/material/ui/icons/graphic_eq.svg create mode 100644 dashboard/ui/material/ui/icons/grass.svg create mode 100644 dashboard/ui/material/ui/icons/grid_3x3.svg create mode 100644 dashboard/ui/material/ui/icons/grid_4x4.svg create mode 100644 dashboard/ui/material/ui/icons/grid_goldenratio.svg create mode 100644 dashboard/ui/material/ui/icons/grid_off.svg create mode 100644 dashboard/ui/material/ui/icons/grid_on.svg create mode 100644 dashboard/ui/material/ui/icons/grid_view.svg create mode 100644 dashboard/ui/material/ui/icons/group.svg create mode 100644 dashboard/ui/material/ui/icons/group_add.svg create mode 100644 dashboard/ui/material/ui/icons/group_off.svg create mode 100644 dashboard/ui/material/ui/icons/group_remove.svg create mode 100644 dashboard/ui/material/ui/icons/group_work.svg create mode 100644 dashboard/ui/material/ui/icons/groups.svg create mode 100644 dashboard/ui/material/ui/icons/groups_2.svg create mode 100644 dashboard/ui/material/ui/icons/groups_3.svg create mode 100644 dashboard/ui/material/ui/icons/h_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/h_plus_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/hail.svg create mode 100644 dashboard/ui/material/ui/icons/handshake.svg create mode 100644 dashboard/ui/material/ui/icons/handyman.svg create mode 100644 dashboard/ui/material/ui/icons/hardware.svg create mode 100644 dashboard/ui/material/ui/icons/hd.svg create mode 100644 dashboard/ui/material/ui/icons/hdr_auto.svg create mode 100644 dashboard/ui/material/ui/icons/hdr_auto_select.svg create mode 100644 dashboard/ui/material/ui/icons/hdr_enhanced_select.svg create mode 100644 dashboard/ui/material/ui/icons/hdr_off.svg create mode 100644 dashboard/ui/material/ui/icons/hdr_off_select.svg create mode 100644 dashboard/ui/material/ui/icons/hdr_on.svg create mode 100644 dashboard/ui/material/ui/icons/hdr_on_select.svg create mode 100644 dashboard/ui/material/ui/icons/hdr_plus.svg create mode 100644 dashboard/ui/material/ui/icons/hdr_strong.svg create mode 100644 dashboard/ui/material/ui/icons/hdr_weak.svg create mode 100644 dashboard/ui/material/ui/icons/headphones.svg create mode 100644 dashboard/ui/material/ui/icons/headphones_battery.svg create mode 100644 dashboard/ui/material/ui/icons/headset.svg create mode 100644 dashboard/ui/material/ui/icons/headset_mic.svg create mode 100644 dashboard/ui/material/ui/icons/headset_off.svg create mode 100644 dashboard/ui/material/ui/icons/healing.svg create mode 100644 dashboard/ui/material/ui/icons/health_and_safety.svg create mode 100644 dashboard/ui/material/ui/icons/hearing.svg create mode 100644 dashboard/ui/material/ui/icons/hearing_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/heart_broken.svg create mode 100644 dashboard/ui/material/ui/icons/heat_pump.svg create mode 100644 dashboard/ui/material/ui/icons/height.svg create mode 100644 dashboard/ui/material/ui/icons/help.svg create mode 100644 dashboard/ui/material/ui/icons/help_center.svg create mode 100644 dashboard/ui/material/ui/icons/help_outline.svg create mode 100644 dashboard/ui/material/ui/icons/hevc.svg create mode 100644 dashboard/ui/material/ui/icons/hexagon.svg create mode 100644 dashboard/ui/material/ui/icons/hide_image.svg create mode 100644 dashboard/ui/material/ui/icons/hide_source.svg create mode 100644 dashboard/ui/material/ui/icons/high_quality.svg create mode 100644 dashboard/ui/material/ui/icons/highlight.svg create mode 100644 dashboard/ui/material/ui/icons/highlight_alt.svg create mode 100644 dashboard/ui/material/ui/icons/highlight_off.svg create mode 100644 dashboard/ui/material/ui/icons/hiking.svg create mode 100644 dashboard/ui/material/ui/icons/history.svg create mode 100644 dashboard/ui/material/ui/icons/history_edu.svg create mode 100644 dashboard/ui/material/ui/icons/history_toggle_off.svg create mode 100644 dashboard/ui/material/ui/icons/hive.svg create mode 100644 dashboard/ui/material/ui/icons/hls.svg create mode 100644 dashboard/ui/material/ui/icons/hls_off.svg create mode 100644 dashboard/ui/material/ui/icons/holiday_village.svg create mode 100644 dashboard/ui/material/ui/icons/home.svg create mode 100644 dashboard/ui/material/ui/icons/home_max.svg create mode 100644 dashboard/ui/material/ui/icons/home_mini.svg create mode 100644 dashboard/ui/material/ui/icons/home_repair_service.svg create mode 100644 dashboard/ui/material/ui/icons/home_work.svg create mode 100644 dashboard/ui/material/ui/icons/horizontal_distribute.svg create mode 100644 dashboard/ui/material/ui/icons/horizontal_rule.svg create mode 100644 dashboard/ui/material/ui/icons/horizontal_split.svg create mode 100644 dashboard/ui/material/ui/icons/hot_tub.svg create mode 100644 dashboard/ui/material/ui/icons/hotel.svg create mode 100644 dashboard/ui/material/ui/icons/hotel_class.svg create mode 100644 dashboard/ui/material/ui/icons/hourglass_bottom.svg create mode 100644 dashboard/ui/material/ui/icons/hourglass_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/hourglass_empty.svg create mode 100644 dashboard/ui/material/ui/icons/hourglass_full.svg create mode 100644 dashboard/ui/material/ui/icons/hourglass_top.svg create mode 100644 dashboard/ui/material/ui/icons/house.svg create mode 100644 dashboard/ui/material/ui/icons/house_siding.svg create mode 100644 dashboard/ui/material/ui/icons/houseboat.svg create mode 100644 dashboard/ui/material/ui/icons/how_to_reg.svg create mode 100644 dashboard/ui/material/ui/icons/how_to_vote.svg create mode 100644 dashboard/ui/material/ui/icons/html.svg create mode 100644 dashboard/ui/material/ui/icons/http.svg create mode 100644 dashboard/ui/material/ui/icons/https.svg create mode 100644 dashboard/ui/material/ui/icons/hub.svg create mode 100644 dashboard/ui/material/ui/icons/hvac.svg create mode 100644 dashboard/ui/material/ui/icons/ice_skating.svg create mode 100644 dashboard/ui/material/ui/icons/icecream.svg create mode 100644 dashboard/ui/material/ui/icons/icons.slint create mode 100644 dashboard/ui/material/ui/icons/image.svg create mode 100644 dashboard/ui/material/ui/icons/image_aspect_ratio.svg create mode 100644 dashboard/ui/material/ui/icons/image_not_supported.svg create mode 100644 dashboard/ui/material/ui/icons/image_search.svg create mode 100644 dashboard/ui/material/ui/icons/imagesearch_roller.svg create mode 100644 dashboard/ui/material/ui/icons/import_contacts.svg create mode 100644 dashboard/ui/material/ui/icons/import_export.svg create mode 100644 dashboard/ui/material/ui/icons/important_devices.svg create mode 100644 dashboard/ui/material/ui/icons/inbox.svg create mode 100644 dashboard/ui/material/ui/icons/incomplete_circle.svg create mode 100644 dashboard/ui/material/ui/icons/indeterminate_check_box.svg create mode 100644 dashboard/ui/material/ui/icons/info.svg create mode 100644 dashboard/ui/material/ui/icons/input.svg create mode 100644 dashboard/ui/material/ui/icons/insert_chart.svg create mode 100644 dashboard/ui/material/ui/icons/insert_chart_outlined.svg create mode 100644 dashboard/ui/material/ui/icons/insert_comment.svg create mode 100644 dashboard/ui/material/ui/icons/insert_drive_file.svg create mode 100644 dashboard/ui/material/ui/icons/insert_emoticon.svg create mode 100644 dashboard/ui/material/ui/icons/insert_invitation.svg create mode 100644 dashboard/ui/material/ui/icons/insert_link.svg create mode 100644 dashboard/ui/material/ui/icons/insert_page_break.svg create mode 100644 dashboard/ui/material/ui/icons/insert_photo.svg create mode 100644 dashboard/ui/material/ui/icons/insights.svg create mode 100644 dashboard/ui/material/ui/icons/install_desktop.svg create mode 100644 dashboard/ui/material/ui/icons/install_mobile.svg create mode 100644 dashboard/ui/material/ui/icons/integration_instructions.svg create mode 100644 dashboard/ui/material/ui/icons/interests.svg create mode 100644 dashboard/ui/material/ui/icons/interpreter_mode.svg create mode 100644 dashboard/ui/material/ui/icons/inventory.svg create mode 100644 dashboard/ui/material/ui/icons/inventory_2.svg create mode 100644 dashboard/ui/material/ui/icons/invert_colors.svg create mode 100644 dashboard/ui/material/ui/icons/invert_colors_off.svg create mode 100644 dashboard/ui/material/ui/icons/ios_share.svg create mode 100644 dashboard/ui/material/ui/icons/iron.svg create mode 100644 dashboard/ui/material/ui/icons/iso.svg create mode 100644 dashboard/ui/material/ui/icons/javascript.svg create mode 100644 dashboard/ui/material/ui/icons/join_full.svg create mode 100644 dashboard/ui/material/ui/icons/join_inner.svg create mode 100644 dashboard/ui/material/ui/icons/join_left.svg create mode 100644 dashboard/ui/material/ui/icons/join_right.svg create mode 100644 dashboard/ui/material/ui/icons/kayaking.svg create mode 100644 dashboard/ui/material/ui/icons/kebab_dining.svg create mode 100644 dashboard/ui/material/ui/icons/key.svg create mode 100644 dashboard/ui/material/ui/icons/key_off.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_alt.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_arrow_down.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_arrow_left.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_arrow_right.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_arrow_up.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_backspace.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_capslock.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_command_key.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_control_key.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_double_arrow_down.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_double_arrow_left.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_double_arrow_right.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_double_arrow_up.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_hide.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_option_key.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_return.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_tab.svg create mode 100644 dashboard/ui/material/ui/icons/keyboard_voice.svg create mode 100644 dashboard/ui/material/ui/icons/king_bed.svg create mode 100644 dashboard/ui/material/ui/icons/kitchen.svg create mode 100644 dashboard/ui/material/ui/icons/kitesurfing.svg create mode 100644 dashboard/ui/material/ui/icons/label.svg create mode 100644 dashboard/ui/material/ui/icons/label_important.svg create mode 100644 dashboard/ui/material/ui/icons/label_off.svg create mode 100644 dashboard/ui/material/ui/icons/lan.svg create mode 100644 dashboard/ui/material/ui/icons/landscape.svg create mode 100644 dashboard/ui/material/ui/icons/landslide.svg create mode 100644 dashboard/ui/material/ui/icons/language.svg create mode 100644 dashboard/ui/material/ui/icons/laptop.svg create mode 100644 dashboard/ui/material/ui/icons/laptop_chromebook.svg create mode 100644 dashboard/ui/material/ui/icons/laptop_mac.svg create mode 100644 dashboard/ui/material/ui/icons/laptop_windows.svg create mode 100644 dashboard/ui/material/ui/icons/last_page.svg create mode 100644 dashboard/ui/material/ui/icons/launch.svg create mode 100644 dashboard/ui/material/ui/icons/layers.svg create mode 100644 dashboard/ui/material/ui/icons/layers_clear.svg create mode 100644 dashboard/ui/material/ui/icons/leaderboard.svg create mode 100644 dashboard/ui/material/ui/icons/leak_add.svg create mode 100644 dashboard/ui/material/ui/icons/leak_remove.svg create mode 100644 dashboard/ui/material/ui/icons/legend_toggle.svg create mode 100644 dashboard/ui/material/ui/icons/lens.svg create mode 100644 dashboard/ui/material/ui/icons/lens_blur.svg create mode 100644 dashboard/ui/material/ui/icons/library_add.svg create mode 100644 dashboard/ui/material/ui/icons/library_add_check.svg create mode 100644 dashboard/ui/material/ui/icons/library_books.svg create mode 100644 dashboard/ui/material/ui/icons/library_music.svg create mode 100644 dashboard/ui/material/ui/icons/light.svg create mode 100644 dashboard/ui/material/ui/icons/light_mode.svg create mode 100644 dashboard/ui/material/ui/icons/lightbulb.svg create mode 100644 dashboard/ui/material/ui/icons/lightbulb_circle.svg create mode 100644 dashboard/ui/material/ui/icons/line_axis.svg create mode 100644 dashboard/ui/material/ui/icons/line_style.svg create mode 100644 dashboard/ui/material/ui/icons/line_weight.svg create mode 100644 dashboard/ui/material/ui/icons/linear_scale.svg create mode 100644 dashboard/ui/material/ui/icons/link.svg create mode 100644 dashboard/ui/material/ui/icons/link_off.svg create mode 100644 dashboard/ui/material/ui/icons/linked_camera.svg create mode 100644 dashboard/ui/material/ui/icons/liquor.svg create mode 100644 dashboard/ui/material/ui/icons/list.svg create mode 100644 dashboard/ui/material/ui/icons/list_alt.svg create mode 100644 dashboard/ui/material/ui/icons/live_help.svg create mode 100644 dashboard/ui/material/ui/icons/live_tv.svg create mode 100644 dashboard/ui/material/ui/icons/living.svg create mode 100644 dashboard/ui/material/ui/icons/local_activity.svg create mode 100644 dashboard/ui/material/ui/icons/local_airport.svg create mode 100644 dashboard/ui/material/ui/icons/local_atm.svg create mode 100644 dashboard/ui/material/ui/icons/local_bar.svg create mode 100644 dashboard/ui/material/ui/icons/local_cafe.svg create mode 100644 dashboard/ui/material/ui/icons/local_car_wash.svg create mode 100644 dashboard/ui/material/ui/icons/local_convenience_store.svg create mode 100644 dashboard/ui/material/ui/icons/local_dining.svg create mode 100644 dashboard/ui/material/ui/icons/local_drink.svg create mode 100644 dashboard/ui/material/ui/icons/local_fire_department.svg create mode 100644 dashboard/ui/material/ui/icons/local_florist.svg create mode 100644 dashboard/ui/material/ui/icons/local_gas_station.svg create mode 100644 dashboard/ui/material/ui/icons/local_grocery_store.svg create mode 100644 dashboard/ui/material/ui/icons/local_hospital.svg create mode 100644 dashboard/ui/material/ui/icons/local_hotel.svg create mode 100644 dashboard/ui/material/ui/icons/local_laundry_service.svg create mode 100644 dashboard/ui/material/ui/icons/local_library.svg create mode 100644 dashboard/ui/material/ui/icons/local_mall.svg create mode 100644 dashboard/ui/material/ui/icons/local_movies.svg create mode 100644 dashboard/ui/material/ui/icons/local_offer.svg create mode 100644 dashboard/ui/material/ui/icons/local_parking.svg create mode 100644 dashboard/ui/material/ui/icons/local_pharmacy.svg create mode 100644 dashboard/ui/material/ui/icons/local_phone.svg create mode 100644 dashboard/ui/material/ui/icons/local_pizza.svg create mode 100644 dashboard/ui/material/ui/icons/local_play.svg create mode 100644 dashboard/ui/material/ui/icons/local_police.svg create mode 100644 dashboard/ui/material/ui/icons/local_post_office.svg create mode 100644 dashboard/ui/material/ui/icons/local_printshop.svg create mode 100644 dashboard/ui/material/ui/icons/local_see.svg create mode 100644 dashboard/ui/material/ui/icons/local_shipping.svg create mode 100644 dashboard/ui/material/ui/icons/local_taxi.svg create mode 100644 dashboard/ui/material/ui/icons/location_city.svg create mode 100644 dashboard/ui/material/ui/icons/location_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/location_off.svg create mode 100644 dashboard/ui/material/ui/icons/location_on.svg create mode 100644 dashboard/ui/material/ui/icons/location_searching.svg create mode 100644 dashboard/ui/material/ui/icons/lock.svg create mode 100644 dashboard/ui/material/ui/icons/lock_clock.svg create mode 100644 dashboard/ui/material/ui/icons/lock_open.svg create mode 100644 dashboard/ui/material/ui/icons/lock_person.svg create mode 100644 dashboard/ui/material/ui/icons/lock_reset.svg create mode 100644 dashboard/ui/material/ui/icons/login.svg create mode 100644 dashboard/ui/material/ui/icons/logo_dev.svg create mode 100644 dashboard/ui/material/ui/icons/logout.svg create mode 100644 dashboard/ui/material/ui/icons/looks.svg create mode 100644 dashboard/ui/material/ui/icons/looks_3.svg create mode 100644 dashboard/ui/material/ui/icons/looks_4.svg create mode 100644 dashboard/ui/material/ui/icons/looks_5.svg create mode 100644 dashboard/ui/material/ui/icons/looks_6.svg create mode 100644 dashboard/ui/material/ui/icons/looks_one.svg create mode 100644 dashboard/ui/material/ui/icons/looks_two.svg create mode 100644 dashboard/ui/material/ui/icons/loop.svg create mode 100644 dashboard/ui/material/ui/icons/loupe.svg create mode 100644 dashboard/ui/material/ui/icons/low_priority.svg create mode 100644 dashboard/ui/material/ui/icons/loyalty.svg create mode 100644 dashboard/ui/material/ui/icons/lte_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/lte_plus_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/luggage.svg create mode 100644 dashboard/ui/material/ui/icons/lunch_dining.svg create mode 100644 dashboard/ui/material/ui/icons/lyrics.svg create mode 100644 dashboard/ui/material/ui/icons/macro_off.svg create mode 100644 dashboard/ui/material/ui/icons/mail.svg create mode 100644 dashboard/ui/material/ui/icons/mail_lock.svg create mode 100644 dashboard/ui/material/ui/icons/mail_outline.svg create mode 100644 dashboard/ui/material/ui/icons/male.svg create mode 100644 dashboard/ui/material/ui/icons/man.svg create mode 100644 dashboard/ui/material/ui/icons/man_2.svg create mode 100644 dashboard/ui/material/ui/icons/man_3.svg create mode 100644 dashboard/ui/material/ui/icons/man_4.svg create mode 100644 dashboard/ui/material/ui/icons/manage_accounts.svg create mode 100644 dashboard/ui/material/ui/icons/manage_history.svg create mode 100644 dashboard/ui/material/ui/icons/manage_search.svg create mode 100644 dashboard/ui/material/ui/icons/map.svg create mode 100644 dashboard/ui/material/ui/icons/maps_home_work.svg create mode 100644 dashboard/ui/material/ui/icons/maps_ugc.svg create mode 100644 dashboard/ui/material/ui/icons/margin.svg create mode 100644 dashboard/ui/material/ui/icons/mark_as_unread.svg create mode 100644 dashboard/ui/material/ui/icons/mark_chat_read.svg create mode 100644 dashboard/ui/material/ui/icons/mark_chat_unread.svg create mode 100644 dashboard/ui/material/ui/icons/mark_email_read.svg create mode 100644 dashboard/ui/material/ui/icons/mark_email_unread.svg create mode 100644 dashboard/ui/material/ui/icons/mark_unread_chat_alt.svg create mode 100644 dashboard/ui/material/ui/icons/markunread.svg create mode 100644 dashboard/ui/material/ui/icons/markunread_mailbox.svg create mode 100644 dashboard/ui/material/ui/icons/masks.svg create mode 100644 dashboard/ui/material/ui/icons/maximize.svg create mode 100644 dashboard/ui/material/ui/icons/media_bluetooth_off.svg create mode 100644 dashboard/ui/material/ui/icons/media_bluetooth_on.svg create mode 100644 dashboard/ui/material/ui/icons/mediation.svg create mode 100644 dashboard/ui/material/ui/icons/medical_information.svg create mode 100644 dashboard/ui/material/ui/icons/medical_services.svg create mode 100644 dashboard/ui/material/ui/icons/medication.svg create mode 100644 dashboard/ui/material/ui/icons/medication_liquid.svg create mode 100644 dashboard/ui/material/ui/icons/meeting_room.svg create mode 100644 dashboard/ui/material/ui/icons/memory.svg create mode 100644 dashboard/ui/material/ui/icons/menu.svg create mode 100644 dashboard/ui/material/ui/icons/menu_book.svg create mode 100644 dashboard/ui/material/ui/icons/menu_open.svg create mode 100644 dashboard/ui/material/ui/icons/merge.svg create mode 100644 dashboard/ui/material/ui/icons/merge_type.svg create mode 100644 dashboard/ui/material/ui/icons/message.svg create mode 100644 dashboard/ui/material/ui/icons/mic.svg create mode 100644 dashboard/ui/material/ui/icons/mic_external_off.svg create mode 100644 dashboard/ui/material/ui/icons/mic_external_on.svg create mode 100644 dashboard/ui/material/ui/icons/mic_none.svg create mode 100644 dashboard/ui/material/ui/icons/mic_off.svg create mode 100644 dashboard/ui/material/ui/icons/microwave.svg create mode 100644 dashboard/ui/material/ui/icons/military_tech.svg create mode 100644 dashboard/ui/material/ui/icons/minimize.svg create mode 100644 dashboard/ui/material/ui/icons/minor_crash.svg create mode 100644 dashboard/ui/material/ui/icons/miscellaneous_services.svg create mode 100644 dashboard/ui/material/ui/icons/missed_video_call.svg create mode 100644 dashboard/ui/material/ui/icons/mms.svg create mode 100644 dashboard/ui/material/ui/icons/mobile_friendly.svg create mode 100644 dashboard/ui/material/ui/icons/mobile_off.svg create mode 100644 dashboard/ui/material/ui/icons/mobile_screen_share.svg create mode 100644 dashboard/ui/material/ui/icons/mobiledata_off.svg create mode 100644 dashboard/ui/material/ui/icons/mode.svg create mode 100644 dashboard/ui/material/ui/icons/mode_comment.svg create mode 100644 dashboard/ui/material/ui/icons/mode_edit.svg create mode 100644 dashboard/ui/material/ui/icons/mode_edit_outline.svg create mode 100644 dashboard/ui/material/ui/icons/mode_fan_off.svg create mode 100644 dashboard/ui/material/ui/icons/mode_night.svg create mode 100644 dashboard/ui/material/ui/icons/mode_of_travel.svg create mode 100644 dashboard/ui/material/ui/icons/mode_standby.svg create mode 100644 dashboard/ui/material/ui/icons/model_training.svg create mode 100644 dashboard/ui/material/ui/icons/monetization_on.svg create mode 100644 dashboard/ui/material/ui/icons/money.svg create mode 100644 dashboard/ui/material/ui/icons/money_off.svg create mode 100644 dashboard/ui/material/ui/icons/money_off_csred.svg create mode 100644 dashboard/ui/material/ui/icons/monitor.svg create mode 100644 dashboard/ui/material/ui/icons/monitor_heart.svg create mode 100644 dashboard/ui/material/ui/icons/monitor_weight.svg create mode 100644 dashboard/ui/material/ui/icons/monochrome_photos.svg create mode 100644 dashboard/ui/material/ui/icons/mood.svg create mode 100644 dashboard/ui/material/ui/icons/mood_bad.svg create mode 100644 dashboard/ui/material/ui/icons/moped.svg create mode 100644 dashboard/ui/material/ui/icons/more.svg create mode 100644 dashboard/ui/material/ui/icons/more_horiz.svg create mode 100644 dashboard/ui/material/ui/icons/more_time.svg create mode 100644 dashboard/ui/material/ui/icons/more_vert.svg create mode 100644 dashboard/ui/material/ui/icons/mosque.svg create mode 100644 dashboard/ui/material/ui/icons/motion_photos_auto.svg create mode 100644 dashboard/ui/material/ui/icons/motion_photos_off.svg create mode 100644 dashboard/ui/material/ui/icons/motion_photos_on.svg create mode 100644 dashboard/ui/material/ui/icons/motion_photos_pause.svg create mode 100644 dashboard/ui/material/ui/icons/motion_photos_paused.svg create mode 100644 dashboard/ui/material/ui/icons/mouse.svg create mode 100644 dashboard/ui/material/ui/icons/move_down.svg create mode 100644 dashboard/ui/material/ui/icons/move_to_inbox.svg create mode 100644 dashboard/ui/material/ui/icons/move_up.svg create mode 100644 dashboard/ui/material/ui/icons/movie.svg create mode 100644 dashboard/ui/material/ui/icons/movie_creation.svg create mode 100644 dashboard/ui/material/ui/icons/movie_filter.svg create mode 100644 dashboard/ui/material/ui/icons/moving.svg create mode 100644 dashboard/ui/material/ui/icons/mp.svg create mode 100644 dashboard/ui/material/ui/icons/multiline_chart.svg create mode 100644 dashboard/ui/material/ui/icons/multiple_stop.svg create mode 100644 dashboard/ui/material/ui/icons/museum.svg create mode 100644 dashboard/ui/material/ui/icons/music_note.svg create mode 100644 dashboard/ui/material/ui/icons/music_off.svg create mode 100644 dashboard/ui/material/ui/icons/music_video.svg create mode 100644 dashboard/ui/material/ui/icons/my_location.svg create mode 100644 dashboard/ui/material/ui/icons/nat.svg create mode 100644 dashboard/ui/material/ui/icons/nature.svg create mode 100644 dashboard/ui/material/ui/icons/nature_people.svg create mode 100644 dashboard/ui/material/ui/icons/navigate_before.svg create mode 100644 dashboard/ui/material/ui/icons/navigate_next.svg create mode 100644 dashboard/ui/material/ui/icons/navigation.svg create mode 100644 dashboard/ui/material/ui/icons/near_me.svg create mode 100644 dashboard/ui/material/ui/icons/near_me_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/nearby_error.svg create mode 100644 dashboard/ui/material/ui/icons/nearby_off.svg create mode 100644 dashboard/ui/material/ui/icons/nest_cam_wired_stand.svg create mode 100644 dashboard/ui/material/ui/icons/network_cell.svg create mode 100644 dashboard/ui/material/ui/icons/network_check.svg create mode 100644 dashboard/ui/material/ui/icons/network_locked.svg create mode 100644 dashboard/ui/material/ui/icons/network_ping.svg create mode 100644 dashboard/ui/material/ui/icons/network_wifi.svg create mode 100644 dashboard/ui/material/ui/icons/network_wifi_1_bar.svg create mode 100644 dashboard/ui/material/ui/icons/network_wifi_2_bar.svg create mode 100644 dashboard/ui/material/ui/icons/network_wifi_3_bar.svg create mode 100644 dashboard/ui/material/ui/icons/new_label.svg create mode 100644 dashboard/ui/material/ui/icons/new_releases.svg create mode 100644 dashboard/ui/material/ui/icons/newspaper.svg create mode 100644 dashboard/ui/material/ui/icons/next_plan.svg create mode 100644 dashboard/ui/material/ui/icons/next_week.svg create mode 100644 dashboard/ui/material/ui/icons/nfc.svg create mode 100644 dashboard/ui/material/ui/icons/night_shelter.svg create mode 100644 dashboard/ui/material/ui/icons/nightlife.svg create mode 100644 dashboard/ui/material/ui/icons/nightlight.svg create mode 100644 dashboard/ui/material/ui/icons/nightlight_round.svg create mode 100644 dashboard/ui/material/ui/icons/nights_stay.svg create mode 100644 dashboard/ui/material/ui/icons/no_accounts.svg create mode 100644 dashboard/ui/material/ui/icons/no_adult_content.svg create mode 100644 dashboard/ui/material/ui/icons/no_backpack.svg create mode 100644 dashboard/ui/material/ui/icons/no_cell.svg create mode 100644 dashboard/ui/material/ui/icons/no_crash.svg create mode 100644 dashboard/ui/material/ui/icons/no_drinks.svg create mode 100644 dashboard/ui/material/ui/icons/no_encryption.svg create mode 100644 dashboard/ui/material/ui/icons/no_encryption_gmailerrorred.svg create mode 100644 dashboard/ui/material/ui/icons/no_flash.svg create mode 100644 dashboard/ui/material/ui/icons/no_food.svg create mode 100644 dashboard/ui/material/ui/icons/no_luggage.svg create mode 100644 dashboard/ui/material/ui/icons/no_meals.svg create mode 100644 dashboard/ui/material/ui/icons/no_meeting_room.svg create mode 100644 dashboard/ui/material/ui/icons/no_photography.svg create mode 100644 dashboard/ui/material/ui/icons/no_sim.svg create mode 100644 dashboard/ui/material/ui/icons/no_stroller.svg create mode 100644 dashboard/ui/material/ui/icons/no_transfer.svg create mode 100644 dashboard/ui/material/ui/icons/noise_aware.svg create mode 100644 dashboard/ui/material/ui/icons/noise_control_off.svg create mode 100644 dashboard/ui/material/ui/icons/nordic_walking.svg create mode 100644 dashboard/ui/material/ui/icons/north.svg create mode 100644 dashboard/ui/material/ui/icons/north_east.svg create mode 100644 dashboard/ui/material/ui/icons/north_west.svg create mode 100644 dashboard/ui/material/ui/icons/not_accessible.svg create mode 100644 dashboard/ui/material/ui/icons/not_interested.svg create mode 100644 dashboard/ui/material/ui/icons/not_listed_location.svg create mode 100644 dashboard/ui/material/ui/icons/not_started.svg create mode 100644 dashboard/ui/material/ui/icons/note.svg create mode 100644 dashboard/ui/material/ui/icons/note_add.svg create mode 100644 dashboard/ui/material/ui/icons/note_alt.svg create mode 100644 dashboard/ui/material/ui/icons/notes.svg create mode 100644 dashboard/ui/material/ui/icons/notification_add.svg create mode 100644 dashboard/ui/material/ui/icons/notification_important.svg create mode 100644 dashboard/ui/material/ui/icons/notifications.svg create mode 100644 dashboard/ui/material/ui/icons/notifications_active.svg create mode 100644 dashboard/ui/material/ui/icons/notifications_none.svg create mode 100644 dashboard/ui/material/ui/icons/notifications_off.svg create mode 100644 dashboard/ui/material/ui/icons/notifications_paused.svg create mode 100644 dashboard/ui/material/ui/icons/numbers.svg create mode 100644 dashboard/ui/material/ui/icons/offline_bolt.svg create mode 100644 dashboard/ui/material/ui/icons/offline_pin.svg create mode 100644 dashboard/ui/material/ui/icons/offline_share.svg create mode 100644 dashboard/ui/material/ui/icons/oil_barrel.svg create mode 100644 dashboard/ui/material/ui/icons/on_device_training.svg create mode 100644 dashboard/ui/material/ui/icons/ondemand_video.svg create mode 100644 dashboard/ui/material/ui/icons/online_prediction.svg create mode 100644 dashboard/ui/material/ui/icons/opacity.svg create mode 100644 dashboard/ui/material/ui/icons/open_in_browser.svg create mode 100644 dashboard/ui/material/ui/icons/open_in_full.svg create mode 100644 dashboard/ui/material/ui/icons/open_in_new.svg create mode 100644 dashboard/ui/material/ui/icons/open_in_new_off.svg create mode 100644 dashboard/ui/material/ui/icons/open_with.svg create mode 100644 dashboard/ui/material/ui/icons/other_houses.svg create mode 100644 dashboard/ui/material/ui/icons/outbound.svg create mode 100644 dashboard/ui/material/ui/icons/outbox.svg create mode 100644 dashboard/ui/material/ui/icons/outdoor_grill.svg create mode 100644 dashboard/ui/material/ui/icons/outlet.svg create mode 100644 dashboard/ui/material/ui/icons/outlined_flag.svg create mode 100644 dashboard/ui/material/ui/icons/output.svg create mode 100644 dashboard/ui/material/ui/icons/padding.svg create mode 100644 dashboard/ui/material/ui/icons/pages.svg create mode 100644 dashboard/ui/material/ui/icons/pageview.svg create mode 100644 dashboard/ui/material/ui/icons/paid.svg create mode 100644 dashboard/ui/material/ui/icons/palette.svg create mode 100644 dashboard/ui/material/ui/icons/pan_tool.svg create mode 100644 dashboard/ui/material/ui/icons/pan_tool_alt.svg create mode 100644 dashboard/ui/material/ui/icons/panorama.svg create mode 100644 dashboard/ui/material/ui/icons/panorama_fish_eye.svg create mode 100644 dashboard/ui/material/ui/icons/panorama_horizontal.svg create mode 100644 dashboard/ui/material/ui/icons/panorama_horizontal_select.svg create mode 100644 dashboard/ui/material/ui/icons/panorama_photosphere.svg create mode 100644 dashboard/ui/material/ui/icons/panorama_photosphere_select.svg create mode 100644 dashboard/ui/material/ui/icons/panorama_vertical.svg create mode 100644 dashboard/ui/material/ui/icons/panorama_vertical_select.svg create mode 100644 dashboard/ui/material/ui/icons/panorama_wide_angle.svg create mode 100644 dashboard/ui/material/ui/icons/panorama_wide_angle_select.svg create mode 100644 dashboard/ui/material/ui/icons/paragliding.svg create mode 100644 dashboard/ui/material/ui/icons/park.svg create mode 100644 dashboard/ui/material/ui/icons/party_mode.svg create mode 100644 dashboard/ui/material/ui/icons/password.svg create mode 100644 dashboard/ui/material/ui/icons/pattern.svg create mode 100644 dashboard/ui/material/ui/icons/pause.svg create mode 100644 dashboard/ui/material/ui/icons/pause_circle.svg create mode 100644 dashboard/ui/material/ui/icons/pause_circle_filled.svg create mode 100644 dashboard/ui/material/ui/icons/pause_circle_outline.svg create mode 100644 dashboard/ui/material/ui/icons/pause_presentation.svg create mode 100644 dashboard/ui/material/ui/icons/payment.svg create mode 100644 dashboard/ui/material/ui/icons/payments.svg create mode 100644 dashboard/ui/material/ui/icons/pedal_bike.svg create mode 100644 dashboard/ui/material/ui/icons/pending.svg create mode 100644 dashboard/ui/material/ui/icons/pending_actions.svg create mode 100644 dashboard/ui/material/ui/icons/pentagon.svg create mode 100644 dashboard/ui/material/ui/icons/people.svg create mode 100644 dashboard/ui/material/ui/icons/people_alt.svg create mode 100644 dashboard/ui/material/ui/icons/people_outline.svg create mode 100644 dashboard/ui/material/ui/icons/percent.svg create mode 100644 dashboard/ui/material/ui/icons/perm_camera_mic.svg create mode 100644 dashboard/ui/material/ui/icons/perm_contact_calendar.svg create mode 100644 dashboard/ui/material/ui/icons/perm_data_setting.svg create mode 100644 dashboard/ui/material/ui/icons/perm_device_information.svg create mode 100644 dashboard/ui/material/ui/icons/perm_identity.svg create mode 100644 dashboard/ui/material/ui/icons/perm_media.svg create mode 100644 dashboard/ui/material/ui/icons/perm_phone_msg.svg create mode 100644 dashboard/ui/material/ui/icons/perm_scan_wifi.svg create mode 100644 dashboard/ui/material/ui/icons/person.svg create mode 100644 dashboard/ui/material/ui/icons/person_2.svg create mode 100644 dashboard/ui/material/ui/icons/person_3.svg create mode 100644 dashboard/ui/material/ui/icons/person_4.svg create mode 100644 dashboard/ui/material/ui/icons/person_add.svg create mode 100644 dashboard/ui/material/ui/icons/person_add_alt.svg create mode 100644 dashboard/ui/material/ui/icons/person_add_alt_1.svg create mode 100644 dashboard/ui/material/ui/icons/person_add_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/person_off.svg create mode 100644 dashboard/ui/material/ui/icons/person_outline.svg create mode 100644 dashboard/ui/material/ui/icons/person_pin.svg create mode 100644 dashboard/ui/material/ui/icons/person_pin_circle.svg create mode 100644 dashboard/ui/material/ui/icons/person_remove.svg create mode 100644 dashboard/ui/material/ui/icons/person_remove_alt_1.svg create mode 100644 dashboard/ui/material/ui/icons/person_search.svg create mode 100644 dashboard/ui/material/ui/icons/personal_injury.svg create mode 100644 dashboard/ui/material/ui/icons/personal_video.svg create mode 100644 dashboard/ui/material/ui/icons/pest_control.svg create mode 100644 dashboard/ui/material/ui/icons/pest_control_rodent.svg create mode 100644 dashboard/ui/material/ui/icons/pets.svg create mode 100644 dashboard/ui/material/ui/icons/phishing.svg create mode 100644 dashboard/ui/material/ui/icons/phone.svg create mode 100644 dashboard/ui/material/ui/icons/phone_android.svg create mode 100644 dashboard/ui/material/ui/icons/phone_bluetooth_speaker.svg create mode 100644 dashboard/ui/material/ui/icons/phone_callback.svg create mode 100644 dashboard/ui/material/ui/icons/phone_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/phone_enabled.svg create mode 100644 dashboard/ui/material/ui/icons/phone_forwarded.svg create mode 100644 dashboard/ui/material/ui/icons/phone_iphone.svg create mode 100644 dashboard/ui/material/ui/icons/phone_locked.svg create mode 100644 dashboard/ui/material/ui/icons/phone_missed.svg create mode 100644 dashboard/ui/material/ui/icons/phone_paused.svg create mode 100644 dashboard/ui/material/ui/icons/phonelink.svg create mode 100644 dashboard/ui/material/ui/icons/phonelink_erase.svg create mode 100644 dashboard/ui/material/ui/icons/phonelink_lock.svg create mode 100644 dashboard/ui/material/ui/icons/phonelink_off.svg create mode 100644 dashboard/ui/material/ui/icons/phonelink_ring.svg create mode 100644 dashboard/ui/material/ui/icons/phonelink_setup.svg create mode 100644 dashboard/ui/material/ui/icons/photo.svg create mode 100644 dashboard/ui/material/ui/icons/photo_album.svg create mode 100644 dashboard/ui/material/ui/icons/photo_camera.svg create mode 100644 dashboard/ui/material/ui/icons/photo_camera_back.svg create mode 100644 dashboard/ui/material/ui/icons/photo_camera_front.svg create mode 100644 dashboard/ui/material/ui/icons/photo_filter.svg create mode 100644 dashboard/ui/material/ui/icons/photo_library.svg create mode 100644 dashboard/ui/material/ui/icons/photo_size_select_actual.svg create mode 100644 dashboard/ui/material/ui/icons/photo_size_select_large.svg create mode 100644 dashboard/ui/material/ui/icons/photo_size_select_small.svg create mode 100644 dashboard/ui/material/ui/icons/php.svg create mode 100644 dashboard/ui/material/ui/icons/piano.svg create mode 100644 dashboard/ui/material/ui/icons/piano_off.svg create mode 100644 dashboard/ui/material/ui/icons/picture_as_pdf.svg create mode 100644 dashboard/ui/material/ui/icons/picture_in_picture.svg create mode 100644 dashboard/ui/material/ui/icons/picture_in_picture_alt.svg create mode 100644 dashboard/ui/material/ui/icons/pie_chart.svg create mode 100644 dashboard/ui/material/ui/icons/pie_chart_outline.svg create mode 100644 dashboard/ui/material/ui/icons/pin.svg create mode 100644 dashboard/ui/material/ui/icons/pin_drop.svg create mode 100644 dashboard/ui/material/ui/icons/pin_end.svg create mode 100644 dashboard/ui/material/ui/icons/pin_invoke.svg create mode 100644 dashboard/ui/material/ui/icons/pinch.svg create mode 100644 dashboard/ui/material/ui/icons/pivot_table_chart.svg create mode 100644 dashboard/ui/material/ui/icons/pix.svg create mode 100644 dashboard/ui/material/ui/icons/place.svg create mode 100644 dashboard/ui/material/ui/icons/plagiarism.svg create mode 100644 dashboard/ui/material/ui/icons/play_arrow.svg create mode 100644 dashboard/ui/material/ui/icons/play_circle.svg create mode 100644 dashboard/ui/material/ui/icons/play_circle_filled.svg create mode 100644 dashboard/ui/material/ui/icons/play_circle_outline.svg create mode 100644 dashboard/ui/material/ui/icons/play_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/play_for_work.svg create mode 100644 dashboard/ui/material/ui/icons/play_lesson.svg create mode 100644 dashboard/ui/material/ui/icons/playlist_add.svg create mode 100644 dashboard/ui/material/ui/icons/playlist_add_check.svg create mode 100644 dashboard/ui/material/ui/icons/playlist_add_check_circle.svg create mode 100644 dashboard/ui/material/ui/icons/playlist_add_circle.svg create mode 100644 dashboard/ui/material/ui/icons/playlist_play.svg create mode 100644 dashboard/ui/material/ui/icons/playlist_remove.svg create mode 100644 dashboard/ui/material/ui/icons/plumbing.svg create mode 100644 dashboard/ui/material/ui/icons/plus_one.svg create mode 100644 dashboard/ui/material/ui/icons/podcasts.svg create mode 100644 dashboard/ui/material/ui/icons/point_of_sale.svg create mode 100644 dashboard/ui/material/ui/icons/policy.svg create mode 100644 dashboard/ui/material/ui/icons/poll.svg create mode 100644 dashboard/ui/material/ui/icons/polyline.svg create mode 100644 dashboard/ui/material/ui/icons/polymer.svg create mode 100644 dashboard/ui/material/ui/icons/pool.svg create mode 100644 dashboard/ui/material/ui/icons/portable_wifi_off.svg create mode 100644 dashboard/ui/material/ui/icons/portrait.svg create mode 100644 dashboard/ui/material/ui/icons/post_add.svg create mode 100644 dashboard/ui/material/ui/icons/power.svg create mode 100644 dashboard/ui/material/ui/icons/power_input.svg create mode 100644 dashboard/ui/material/ui/icons/power_off.svg create mode 100644 dashboard/ui/material/ui/icons/power_settings_new.svg create mode 100644 dashboard/ui/material/ui/icons/precision_manufacturing.svg create mode 100644 dashboard/ui/material/ui/icons/pregnant_woman.svg create mode 100644 dashboard/ui/material/ui/icons/present_to_all.svg create mode 100644 dashboard/ui/material/ui/icons/preview.svg create mode 100644 dashboard/ui/material/ui/icons/price_change.svg create mode 100644 dashboard/ui/material/ui/icons/price_check.svg create mode 100644 dashboard/ui/material/ui/icons/print.svg create mode 100644 dashboard/ui/material/ui/icons/print_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/priority_high.svg create mode 100644 dashboard/ui/material/ui/icons/privacy_tip.svg create mode 100644 dashboard/ui/material/ui/icons/private_connectivity.svg create mode 100644 dashboard/ui/material/ui/icons/production_quantity_limits.svg create mode 100644 dashboard/ui/material/ui/icons/propane.svg create mode 100644 dashboard/ui/material/ui/icons/propane_tank.svg create mode 100644 dashboard/ui/material/ui/icons/psychology.svg create mode 100644 dashboard/ui/material/ui/icons/psychology_alt.svg create mode 100644 dashboard/ui/material/ui/icons/public.svg create mode 100644 dashboard/ui/material/ui/icons/public_off.svg create mode 100644 dashboard/ui/material/ui/icons/publish.svg create mode 100644 dashboard/ui/material/ui/icons/published_with_changes.svg create mode 100644 dashboard/ui/material/ui/icons/punch_clock.svg create mode 100644 dashboard/ui/material/ui/icons/push_pin.svg create mode 100644 dashboard/ui/material/ui/icons/qr_code.svg create mode 100644 dashboard/ui/material/ui/icons/qr_code_2.svg create mode 100644 dashboard/ui/material/ui/icons/qr_code_scanner.svg create mode 100644 dashboard/ui/material/ui/icons/query_builder.svg create mode 100644 dashboard/ui/material/ui/icons/query_stats.svg create mode 100644 dashboard/ui/material/ui/icons/question_answer.svg create mode 100644 dashboard/ui/material/ui/icons/question_mark.svg create mode 100644 dashboard/ui/material/ui/icons/queue.svg create mode 100644 dashboard/ui/material/ui/icons/queue_music.svg create mode 100644 dashboard/ui/material/ui/icons/queue_play_next.svg create mode 100644 dashboard/ui/material/ui/icons/quickreply.svg create mode 100644 dashboard/ui/material/ui/icons/quiz.svg create mode 100644 dashboard/ui/material/ui/icons/r_mobiledata.svg create mode 100644 dashboard/ui/material/ui/icons/radar.svg create mode 100644 dashboard/ui/material/ui/icons/radio.svg create mode 100644 dashboard/ui/material/ui/icons/radio_button_checked.svg create mode 100644 dashboard/ui/material/ui/icons/radio_button_unchecked.svg create mode 100644 dashboard/ui/material/ui/icons/railway_alert.svg create mode 100644 dashboard/ui/material/ui/icons/ramen_dining.svg create mode 100644 dashboard/ui/material/ui/icons/ramp_left.svg create mode 100644 dashboard/ui/material/ui/icons/ramp_right.svg create mode 100644 dashboard/ui/material/ui/icons/rate_review.svg create mode 100644 dashboard/ui/material/ui/icons/raw_off.svg create mode 100644 dashboard/ui/material/ui/icons/raw_on.svg create mode 100644 dashboard/ui/material/ui/icons/read_more.svg create mode 100644 dashboard/ui/material/ui/icons/real_estate_agent.svg create mode 100644 dashboard/ui/material/ui/icons/receipt.svg create mode 100644 dashboard/ui/material/ui/icons/receipt_long.svg create mode 100644 dashboard/ui/material/ui/icons/recent_actors.svg create mode 100644 dashboard/ui/material/ui/icons/recommend.svg create mode 100644 dashboard/ui/material/ui/icons/record_voice_over.svg create mode 100644 dashboard/ui/material/ui/icons/rectangle.svg create mode 100644 dashboard/ui/material/ui/icons/recycling.svg create mode 100644 dashboard/ui/material/ui/icons/redeem.svg create mode 100644 dashboard/ui/material/ui/icons/redo.svg create mode 100644 dashboard/ui/material/ui/icons/reduce_capacity.svg create mode 100644 dashboard/ui/material/ui/icons/refresh.svg create mode 100644 dashboard/ui/material/ui/icons/remember_me.svg create mode 100644 dashboard/ui/material/ui/icons/remove.svg create mode 100644 dashboard/ui/material/ui/icons/remove_circle.svg create mode 100644 dashboard/ui/material/ui/icons/remove_circle_outline.svg create mode 100644 dashboard/ui/material/ui/icons/remove_done.svg create mode 100644 dashboard/ui/material/ui/icons/remove_from_queue.svg create mode 100644 dashboard/ui/material/ui/icons/remove_moderator.svg create mode 100644 dashboard/ui/material/ui/icons/remove_red_eye.svg create mode 100644 dashboard/ui/material/ui/icons/remove_road.svg create mode 100644 dashboard/ui/material/ui/icons/remove_shopping_cart.svg create mode 100644 dashboard/ui/material/ui/icons/reorder.svg create mode 100644 dashboard/ui/material/ui/icons/repartition.svg create mode 100644 dashboard/ui/material/ui/icons/repeat.svg create mode 100644 dashboard/ui/material/ui/icons/repeat_on.svg create mode 100644 dashboard/ui/material/ui/icons/repeat_one.svg create mode 100644 dashboard/ui/material/ui/icons/repeat_one_on.svg create mode 100644 dashboard/ui/material/ui/icons/replay.svg create mode 100644 dashboard/ui/material/ui/icons/replay_10.svg create mode 100644 dashboard/ui/material/ui/icons/replay_30.svg create mode 100644 dashboard/ui/material/ui/icons/replay_5.svg create mode 100644 dashboard/ui/material/ui/icons/replay_circle_filled.svg create mode 100644 dashboard/ui/material/ui/icons/reply.svg create mode 100644 dashboard/ui/material/ui/icons/reply_all.svg create mode 100644 dashboard/ui/material/ui/icons/report.svg create mode 100644 dashboard/ui/material/ui/icons/report_gmailerrorred.svg create mode 100644 dashboard/ui/material/ui/icons/report_off.svg create mode 100644 dashboard/ui/material/ui/icons/report_problem.svg create mode 100644 dashboard/ui/material/ui/icons/request_page.svg create mode 100644 dashboard/ui/material/ui/icons/request_quote.svg create mode 100644 dashboard/ui/material/ui/icons/reset_tv.svg create mode 100644 dashboard/ui/material/ui/icons/restart_alt.svg create mode 100644 dashboard/ui/material/ui/icons/restaurant.svg create mode 100644 dashboard/ui/material/ui/icons/restaurant_menu.svg create mode 100644 dashboard/ui/material/ui/icons/restore.svg create mode 100644 dashboard/ui/material/ui/icons/restore_from_trash.svg create mode 100644 dashboard/ui/material/ui/icons/restore_page.svg create mode 100644 dashboard/ui/material/ui/icons/reviews.svg create mode 100644 dashboard/ui/material/ui/icons/rice_bowl.svg create mode 100644 dashboard/ui/material/ui/icons/ring_volume.svg create mode 100644 dashboard/ui/material/ui/icons/rocket.svg create mode 100644 dashboard/ui/material/ui/icons/rocket_launch.svg create mode 100644 dashboard/ui/material/ui/icons/roller_shades.svg create mode 100644 dashboard/ui/material/ui/icons/roller_shades_closed.svg create mode 100644 dashboard/ui/material/ui/icons/roller_skating.svg create mode 100644 dashboard/ui/material/ui/icons/roofing.svg create mode 100644 dashboard/ui/material/ui/icons/room.svg create mode 100644 dashboard/ui/material/ui/icons/room_preferences.svg create mode 100644 dashboard/ui/material/ui/icons/room_service.svg create mode 100644 dashboard/ui/material/ui/icons/rotate_90_degrees_ccw.svg create mode 100644 dashboard/ui/material/ui/icons/rotate_90_degrees_cw.svg create mode 100644 dashboard/ui/material/ui/icons/rotate_left.svg create mode 100644 dashboard/ui/material/ui/icons/rotate_right.svg create mode 100644 dashboard/ui/material/ui/icons/roundabout_left.svg create mode 100644 dashboard/ui/material/ui/icons/roundabout_right.svg create mode 100644 dashboard/ui/material/ui/icons/rounded_corner.svg create mode 100644 dashboard/ui/material/ui/icons/route.svg create mode 100644 dashboard/ui/material/ui/icons/router.svg create mode 100644 dashboard/ui/material/ui/icons/rowing.svg create mode 100644 dashboard/ui/material/ui/icons/rss_feed.svg create mode 100644 dashboard/ui/material/ui/icons/rsvp.svg create mode 100644 dashboard/ui/material/ui/icons/rtt.svg create mode 100644 dashboard/ui/material/ui/icons/rule.svg create mode 100644 dashboard/ui/material/ui/icons/rule_folder.svg create mode 100644 dashboard/ui/material/ui/icons/run_circle.svg create mode 100644 dashboard/ui/material/ui/icons/running_with_errors.svg create mode 100644 dashboard/ui/material/ui/icons/rv_hookup.svg create mode 100644 dashboard/ui/material/ui/icons/safety_check.svg create mode 100644 dashboard/ui/material/ui/icons/safety_divider.svg create mode 100644 dashboard/ui/material/ui/icons/sailing.svg create mode 100644 dashboard/ui/material/ui/icons/sanitizer.svg create mode 100644 dashboard/ui/material/ui/icons/satellite.svg create mode 100644 dashboard/ui/material/ui/icons/satellite_alt.svg create mode 100644 dashboard/ui/material/ui/icons/save.svg create mode 100644 dashboard/ui/material/ui/icons/save_alt.svg create mode 100644 dashboard/ui/material/ui/icons/save_as.svg create mode 100644 dashboard/ui/material/ui/icons/saved_search.svg create mode 100644 dashboard/ui/material/ui/icons/savings.svg create mode 100644 dashboard/ui/material/ui/icons/scale.svg create mode 100644 dashboard/ui/material/ui/icons/scanner.svg create mode 100644 dashboard/ui/material/ui/icons/scatter_plot.svg create mode 100644 dashboard/ui/material/ui/icons/schedule.svg create mode 100644 dashboard/ui/material/ui/icons/schedule_send.svg create mode 100644 dashboard/ui/material/ui/icons/schema.svg create mode 100644 dashboard/ui/material/ui/icons/school.svg create mode 100644 dashboard/ui/material/ui/icons/science.svg create mode 100644 dashboard/ui/material/ui/icons/score.svg create mode 100644 dashboard/ui/material/ui/icons/scoreboard.svg create mode 100644 dashboard/ui/material/ui/icons/screen_lock_landscape.svg create mode 100644 dashboard/ui/material/ui/icons/screen_lock_portrait.svg create mode 100644 dashboard/ui/material/ui/icons/screen_lock_rotation.svg create mode 100644 dashboard/ui/material/ui/icons/screen_rotation.svg create mode 100644 dashboard/ui/material/ui/icons/screen_rotation_alt.svg create mode 100644 dashboard/ui/material/ui/icons/screen_search_desktop.svg create mode 100644 dashboard/ui/material/ui/icons/screen_share.svg create mode 100644 dashboard/ui/material/ui/icons/screenshot.svg create mode 100644 dashboard/ui/material/ui/icons/screenshot_monitor.svg create mode 100644 dashboard/ui/material/ui/icons/scuba_diving.svg create mode 100644 dashboard/ui/material/ui/icons/sd.svg create mode 100644 dashboard/ui/material/ui/icons/sd_card.svg create mode 100644 dashboard/ui/material/ui/icons/sd_card_alert.svg create mode 100644 dashboard/ui/material/ui/icons/sd_storage.svg create mode 100644 dashboard/ui/material/ui/icons/search.svg create mode 100644 dashboard/ui/material/ui/icons/search_off.svg create mode 100644 dashboard/ui/material/ui/icons/security.svg create mode 100644 dashboard/ui/material/ui/icons/security_update.svg create mode 100644 dashboard/ui/material/ui/icons/security_update_good.svg create mode 100644 dashboard/ui/material/ui/icons/security_update_warning.svg create mode 100644 dashboard/ui/material/ui/icons/segment.svg create mode 100644 dashboard/ui/material/ui/icons/select_all.svg create mode 100644 dashboard/ui/material/ui/icons/self_improvement.svg create mode 100644 dashboard/ui/material/ui/icons/sell.svg create mode 100644 dashboard/ui/material/ui/icons/send.svg create mode 100644 dashboard/ui/material/ui/icons/send_and_archive.svg create mode 100644 dashboard/ui/material/ui/icons/send_time_extension.svg create mode 100644 dashboard/ui/material/ui/icons/send_to_mobile.svg create mode 100644 dashboard/ui/material/ui/icons/sensor_door.svg create mode 100644 dashboard/ui/material/ui/icons/sensor_occupied.svg create mode 100644 dashboard/ui/material/ui/icons/sensor_window.svg create mode 100644 dashboard/ui/material/ui/icons/sensors.svg create mode 100644 dashboard/ui/material/ui/icons/sensors_off.svg create mode 100644 dashboard/ui/material/ui/icons/sentiment_dissatisfied.svg create mode 100644 dashboard/ui/material/ui/icons/sentiment_neutral.svg create mode 100644 dashboard/ui/material/ui/icons/sentiment_satisfied.svg create mode 100644 dashboard/ui/material/ui/icons/sentiment_satisfied_alt.svg create mode 100644 dashboard/ui/material/ui/icons/sentiment_very_dissatisfied.svg create mode 100644 dashboard/ui/material/ui/icons/sentiment_very_satisfied.svg create mode 100644 dashboard/ui/material/ui/icons/set_meal.svg create mode 100644 dashboard/ui/material/ui/icons/settings.svg create mode 100644 dashboard/ui/material/ui/icons/settings_accessibility.svg create mode 100644 dashboard/ui/material/ui/icons/settings_applications.svg create mode 100644 dashboard/ui/material/ui/icons/settings_backup_restore.svg create mode 100644 dashboard/ui/material/ui/icons/settings_bluetooth.svg create mode 100644 dashboard/ui/material/ui/icons/settings_brightness.svg create mode 100644 dashboard/ui/material/ui/icons/settings_cell.svg create mode 100644 dashboard/ui/material/ui/icons/settings_ethernet.svg create mode 100644 dashboard/ui/material/ui/icons/settings_input_antenna.svg create mode 100644 dashboard/ui/material/ui/icons/settings_input_component.svg create mode 100644 dashboard/ui/material/ui/icons/settings_input_composite.svg create mode 100644 dashboard/ui/material/ui/icons/settings_input_hdmi.svg create mode 100644 dashboard/ui/material/ui/icons/settings_input_svideo.svg create mode 100644 dashboard/ui/material/ui/icons/settings_overscan.svg create mode 100644 dashboard/ui/material/ui/icons/settings_phone.svg create mode 100644 dashboard/ui/material/ui/icons/settings_power.svg create mode 100644 dashboard/ui/material/ui/icons/settings_remote.svg create mode 100644 dashboard/ui/material/ui/icons/settings_suggest.svg create mode 100644 dashboard/ui/material/ui/icons/settings_system_daydream.svg create mode 100644 dashboard/ui/material/ui/icons/settings_voice.svg create mode 100644 dashboard/ui/material/ui/icons/severe_cold.svg create mode 100644 dashboard/ui/material/ui/icons/shape_line.svg create mode 100644 dashboard/ui/material/ui/icons/share.svg create mode 100644 dashboard/ui/material/ui/icons/share_location.svg create mode 100644 dashboard/ui/material/ui/icons/shield.svg create mode 100644 dashboard/ui/material/ui/icons/shield_moon.svg create mode 100644 dashboard/ui/material/ui/icons/shop.svg create mode 100644 dashboard/ui/material/ui/icons/shop_2.svg create mode 100644 dashboard/ui/material/ui/icons/shop_two.svg create mode 100644 dashboard/ui/material/ui/icons/shopping_bag.svg create mode 100644 dashboard/ui/material/ui/icons/shopping_basket.svg create mode 100644 dashboard/ui/material/ui/icons/shopping_cart.svg create mode 100644 dashboard/ui/material/ui/icons/shopping_cart_checkout.svg create mode 100644 dashboard/ui/material/ui/icons/short_text.svg create mode 100644 dashboard/ui/material/ui/icons/shortcut.svg create mode 100644 dashboard/ui/material/ui/icons/show_chart.svg create mode 100644 dashboard/ui/material/ui/icons/shower.svg create mode 100644 dashboard/ui/material/ui/icons/shuffle.svg create mode 100644 dashboard/ui/material/ui/icons/shuffle_on.svg create mode 100644 dashboard/ui/material/ui/icons/shutter_speed.svg create mode 100644 dashboard/ui/material/ui/icons/sick.svg create mode 100644 dashboard/ui/material/ui/icons/sign_language.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_0_bar.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_4_bar.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_alt.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_alt_1_bar.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_alt_2_bar.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_connected_no_internet_0_bar.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_connected_no_internet_4_bar.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_no_sim.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_nodata.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_null.svg create mode 100644 dashboard/ui/material/ui/icons/signal_cellular_off.svg create mode 100644 dashboard/ui/material/ui/icons/signal_wifi_0_bar.svg create mode 100644 dashboard/ui/material/ui/icons/signal_wifi_4_bar.svg create mode 100644 dashboard/ui/material/ui/icons/signal_wifi_4_bar_lock.svg create mode 100644 dashboard/ui/material/ui/icons/signal_wifi_bad.svg create mode 100644 dashboard/ui/material/ui/icons/signal_wifi_connected_no_internet_4.svg create mode 100644 dashboard/ui/material/ui/icons/signal_wifi_off.svg create mode 100644 dashboard/ui/material/ui/icons/signal_wifi_statusbar_4_bar.svg create mode 100644 dashboard/ui/material/ui/icons/signal_wifi_statusbar_connected_no_internet_4.svg create mode 100644 dashboard/ui/material/ui/icons/signal_wifi_statusbar_null.svg create mode 100644 dashboard/ui/material/ui/icons/signpost.svg create mode 100644 dashboard/ui/material/ui/icons/sim_card.svg create mode 100644 dashboard/ui/material/ui/icons/sim_card_alert.svg create mode 100644 dashboard/ui/material/ui/icons/sim_card_download.svg create mode 100644 dashboard/ui/material/ui/icons/single_bed.svg create mode 100644 dashboard/ui/material/ui/icons/sip.svg create mode 100644 dashboard/ui/material/ui/icons/skateboarding.svg create mode 100644 dashboard/ui/material/ui/icons/skip_next.svg create mode 100644 dashboard/ui/material/ui/icons/skip_previous.svg create mode 100644 dashboard/ui/material/ui/icons/sledding.svg create mode 100644 dashboard/ui/material/ui/icons/slideshow.svg create mode 100644 dashboard/ui/material/ui/icons/slow_motion_video.svg create mode 100644 dashboard/ui/material/ui/icons/smart_button.svg create mode 100644 dashboard/ui/material/ui/icons/smart_display.svg create mode 100644 dashboard/ui/material/ui/icons/smart_screen.svg create mode 100644 dashboard/ui/material/ui/icons/smart_toy.svg create mode 100644 dashboard/ui/material/ui/icons/smartphone.svg create mode 100644 dashboard/ui/material/ui/icons/smoke_free.svg create mode 100644 dashboard/ui/material/ui/icons/smoking_rooms.svg create mode 100644 dashboard/ui/material/ui/icons/sms.svg create mode 100644 dashboard/ui/material/ui/icons/sms_failed.svg create mode 100644 dashboard/ui/material/ui/icons/snippet_folder.svg create mode 100644 dashboard/ui/material/ui/icons/snooze.svg create mode 100644 dashboard/ui/material/ui/icons/snowboarding.svg create mode 100644 dashboard/ui/material/ui/icons/snowmobile.svg create mode 100644 dashboard/ui/material/ui/icons/snowshoeing.svg create mode 100644 dashboard/ui/material/ui/icons/soap.svg create mode 100644 dashboard/ui/material/ui/icons/social_distance.svg create mode 100644 dashboard/ui/material/ui/icons/solar_power.svg create mode 100644 dashboard/ui/material/ui/icons/sort.svg create mode 100644 dashboard/ui/material/ui/icons/sort_by_alpha.svg create mode 100644 dashboard/ui/material/ui/icons/sos.svg create mode 100644 dashboard/ui/material/ui/icons/soup_kitchen.svg create mode 100644 dashboard/ui/material/ui/icons/source.svg create mode 100644 dashboard/ui/material/ui/icons/south.svg create mode 100644 dashboard/ui/material/ui/icons/south_america.svg create mode 100644 dashboard/ui/material/ui/icons/south_east.svg create mode 100644 dashboard/ui/material/ui/icons/south_west.svg create mode 100644 dashboard/ui/material/ui/icons/spa.svg create mode 100644 dashboard/ui/material/ui/icons/space_bar.svg create mode 100644 dashboard/ui/material/ui/icons/space_dashboard.svg create mode 100644 dashboard/ui/material/ui/icons/spatial_audio.svg create mode 100644 dashboard/ui/material/ui/icons/spatial_audio_off.svg create mode 100644 dashboard/ui/material/ui/icons/spatial_tracking.svg create mode 100644 dashboard/ui/material/ui/icons/speaker.svg create mode 100644 dashboard/ui/material/ui/icons/speaker_group.svg create mode 100644 dashboard/ui/material/ui/icons/speaker_notes.svg create mode 100644 dashboard/ui/material/ui/icons/speaker_notes_off.svg create mode 100644 dashboard/ui/material/ui/icons/speaker_phone.svg create mode 100644 dashboard/ui/material/ui/icons/speed.svg create mode 100644 dashboard/ui/material/ui/icons/spellcheck.svg create mode 100644 dashboard/ui/material/ui/icons/splitscreen.svg create mode 100644 dashboard/ui/material/ui/icons/spoke.svg create mode 100644 dashboard/ui/material/ui/icons/sports.svg create mode 100644 dashboard/ui/material/ui/icons/sports_bar.svg create mode 100644 dashboard/ui/material/ui/icons/sports_baseball.svg create mode 100644 dashboard/ui/material/ui/icons/sports_basketball.svg create mode 100644 dashboard/ui/material/ui/icons/sports_cricket.svg create mode 100644 dashboard/ui/material/ui/icons/sports_esports.svg create mode 100644 dashboard/ui/material/ui/icons/sports_football.svg create mode 100644 dashboard/ui/material/ui/icons/sports_golf.svg create mode 100644 dashboard/ui/material/ui/icons/sports_gymnastics.svg create mode 100644 dashboard/ui/material/ui/icons/sports_handball.svg create mode 100644 dashboard/ui/material/ui/icons/sports_hockey.svg create mode 100644 dashboard/ui/material/ui/icons/sports_kabaddi.svg create mode 100644 dashboard/ui/material/ui/icons/sports_martial_arts.svg create mode 100644 dashboard/ui/material/ui/icons/sports_mma.svg create mode 100644 dashboard/ui/material/ui/icons/sports_motorsports.svg create mode 100644 dashboard/ui/material/ui/icons/sports_rugby.svg create mode 100644 dashboard/ui/material/ui/icons/sports_score.svg create mode 100644 dashboard/ui/material/ui/icons/sports_soccer.svg create mode 100644 dashboard/ui/material/ui/icons/sports_tennis.svg create mode 100644 dashboard/ui/material/ui/icons/sports_volleyball.svg create mode 100644 dashboard/ui/material/ui/icons/square.svg create mode 100644 dashboard/ui/material/ui/icons/square_foot.svg create mode 100644 dashboard/ui/material/ui/icons/ssid_chart.svg create mode 100644 dashboard/ui/material/ui/icons/stacked_bar_chart.svg create mode 100644 dashboard/ui/material/ui/icons/stacked_line_chart.svg create mode 100644 dashboard/ui/material/ui/icons/stadium.svg create mode 100644 dashboard/ui/material/ui/icons/stairs.svg create mode 100644 dashboard/ui/material/ui/icons/star.svg create mode 100644 dashboard/ui/material/ui/icons/star_border.svg create mode 100644 dashboard/ui/material/ui/icons/star_border_purple500.svg create mode 100644 dashboard/ui/material/ui/icons/star_half.svg create mode 100644 dashboard/ui/material/ui/icons/star_outline.svg create mode 100644 dashboard/ui/material/ui/icons/star_purple500.svg create mode 100644 dashboard/ui/material/ui/icons/star_rate.svg create mode 100644 dashboard/ui/material/ui/icons/stars.svg create mode 100644 dashboard/ui/material/ui/icons/start.svg create mode 100644 dashboard/ui/material/ui/icons/stay_current_landscape.svg create mode 100644 dashboard/ui/material/ui/icons/stay_current_portrait.svg create mode 100644 dashboard/ui/material/ui/icons/stay_primary_landscape.svg create mode 100644 dashboard/ui/material/ui/icons/stay_primary_portrait.svg create mode 100644 dashboard/ui/material/ui/icons/sticky_note_2.svg create mode 100644 dashboard/ui/material/ui/icons/stop.svg create mode 100644 dashboard/ui/material/ui/icons/stop_circle.svg create mode 100644 dashboard/ui/material/ui/icons/stop_screen_share.svg create mode 100644 dashboard/ui/material/ui/icons/storage.svg create mode 100644 dashboard/ui/material/ui/icons/store.svg create mode 100644 dashboard/ui/material/ui/icons/store_mall_directory.svg create mode 100644 dashboard/ui/material/ui/icons/storefront.svg create mode 100644 dashboard/ui/material/ui/icons/storm.svg create mode 100644 dashboard/ui/material/ui/icons/straight.svg create mode 100644 dashboard/ui/material/ui/icons/straighten.svg create mode 100644 dashboard/ui/material/ui/icons/stream.svg create mode 100644 dashboard/ui/material/ui/icons/streetview.svg create mode 100644 dashboard/ui/material/ui/icons/strikethrough_s.svg create mode 100644 dashboard/ui/material/ui/icons/stroller.svg create mode 100644 dashboard/ui/material/ui/icons/style.svg create mode 100644 dashboard/ui/material/ui/icons/subdirectory_arrow_left.svg create mode 100644 dashboard/ui/material/ui/icons/subdirectory_arrow_right.svg create mode 100644 dashboard/ui/material/ui/icons/subject.svg create mode 100644 dashboard/ui/material/ui/icons/subscript.svg create mode 100644 dashboard/ui/material/ui/icons/subscriptions.svg create mode 100644 dashboard/ui/material/ui/icons/subtitles.svg create mode 100644 dashboard/ui/material/ui/icons/subtitles_off.svg create mode 100644 dashboard/ui/material/ui/icons/subway.svg create mode 100644 dashboard/ui/material/ui/icons/summarize.svg create mode 100644 dashboard/ui/material/ui/icons/superscript.svg create mode 100644 dashboard/ui/material/ui/icons/supervised_user_circle.svg create mode 100644 dashboard/ui/material/ui/icons/supervisor_account.svg create mode 100644 dashboard/ui/material/ui/icons/support.svg create mode 100644 dashboard/ui/material/ui/icons/support_agent.svg create mode 100644 dashboard/ui/material/ui/icons/surfing.svg create mode 100644 dashboard/ui/material/ui/icons/surround_sound.svg create mode 100644 dashboard/ui/material/ui/icons/swap_calls.svg create mode 100644 dashboard/ui/material/ui/icons/swap_horiz.svg create mode 100644 dashboard/ui/material/ui/icons/swap_horizontal_circle.svg create mode 100644 dashboard/ui/material/ui/icons/swap_vert.svg create mode 100644 dashboard/ui/material/ui/icons/swap_vertical_circle.svg create mode 100644 dashboard/ui/material/ui/icons/swipe.svg create mode 100644 dashboard/ui/material/ui/icons/swipe_down.svg create mode 100644 dashboard/ui/material/ui/icons/swipe_down_alt.svg create mode 100644 dashboard/ui/material/ui/icons/swipe_left.svg create mode 100644 dashboard/ui/material/ui/icons/swipe_left_alt.svg create mode 100644 dashboard/ui/material/ui/icons/swipe_right.svg create mode 100644 dashboard/ui/material/ui/icons/swipe_right_alt.svg create mode 100644 dashboard/ui/material/ui/icons/swipe_up.svg create mode 100644 dashboard/ui/material/ui/icons/swipe_up_alt.svg create mode 100644 dashboard/ui/material/ui/icons/swipe_vertical.svg create mode 100644 dashboard/ui/material/ui/icons/switch_access_shortcut.svg create mode 100644 dashboard/ui/material/ui/icons/switch_access_shortcut_add.svg create mode 100644 dashboard/ui/material/ui/icons/switch_account.svg create mode 100644 dashboard/ui/material/ui/icons/switch_camera.svg create mode 100644 dashboard/ui/material/ui/icons/switch_left.svg create mode 100644 dashboard/ui/material/ui/icons/switch_right.svg create mode 100644 dashboard/ui/material/ui/icons/switch_video.svg create mode 100644 dashboard/ui/material/ui/icons/synagogue.svg create mode 100644 dashboard/ui/material/ui/icons/sync.svg create mode 100644 dashboard/ui/material/ui/icons/sync_alt.svg create mode 100644 dashboard/ui/material/ui/icons/sync_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/sync_lock.svg create mode 100644 dashboard/ui/material/ui/icons/sync_problem.svg create mode 100644 dashboard/ui/material/ui/icons/system_security_update.svg create mode 100644 dashboard/ui/material/ui/icons/system_security_update_good.svg create mode 100644 dashboard/ui/material/ui/icons/system_security_update_warning.svg create mode 100644 dashboard/ui/material/ui/icons/system_update.svg create mode 100644 dashboard/ui/material/ui/icons/system_update_alt.svg create mode 100644 dashboard/ui/material/ui/icons/tab.svg create mode 100644 dashboard/ui/material/ui/icons/tab_unselected.svg create mode 100644 dashboard/ui/material/ui/icons/table_bar.svg create mode 100644 dashboard/ui/material/ui/icons/table_chart.svg create mode 100644 dashboard/ui/material/ui/icons/table_restaurant.svg create mode 100644 dashboard/ui/material/ui/icons/table_rows.svg create mode 100644 dashboard/ui/material/ui/icons/table_view.svg create mode 100644 dashboard/ui/material/ui/icons/tablet.svg create mode 100644 dashboard/ui/material/ui/icons/tablet_android.svg create mode 100644 dashboard/ui/material/ui/icons/tablet_mac.svg create mode 100644 dashboard/ui/material/ui/icons/tag.svg create mode 100644 dashboard/ui/material/ui/icons/tag_faces.svg create mode 100644 dashboard/ui/material/ui/icons/takeout_dining.svg create mode 100644 dashboard/ui/material/ui/icons/tap_and_play.svg create mode 100644 dashboard/ui/material/ui/icons/tapas.svg create mode 100644 dashboard/ui/material/ui/icons/task.svg create mode 100644 dashboard/ui/material/ui/icons/task_alt.svg create mode 100644 dashboard/ui/material/ui/icons/taxi_alert.svg create mode 100644 dashboard/ui/material/ui/icons/temple_buddhist.svg create mode 100644 dashboard/ui/material/ui/icons/temple_hindu.svg create mode 100644 dashboard/ui/material/ui/icons/terminal.svg create mode 100644 dashboard/ui/material/ui/icons/terrain.svg create mode 100644 dashboard/ui/material/ui/icons/text_decrease.svg create mode 100644 dashboard/ui/material/ui/icons/text_fields.svg create mode 100644 dashboard/ui/material/ui/icons/text_format.svg create mode 100644 dashboard/ui/material/ui/icons/text_increase.svg create mode 100644 dashboard/ui/material/ui/icons/text_rotate_up.svg create mode 100644 dashboard/ui/material/ui/icons/text_rotate_vertical.svg create mode 100644 dashboard/ui/material/ui/icons/text_rotation_angledown.svg create mode 100644 dashboard/ui/material/ui/icons/text_rotation_angleup.svg create mode 100644 dashboard/ui/material/ui/icons/text_rotation_down.svg create mode 100644 dashboard/ui/material/ui/icons/text_rotation_none.svg create mode 100644 dashboard/ui/material/ui/icons/text_snippet.svg create mode 100644 dashboard/ui/material/ui/icons/textsms.svg create mode 100644 dashboard/ui/material/ui/icons/texture.svg create mode 100644 dashboard/ui/material/ui/icons/theater_comedy.svg create mode 100644 dashboard/ui/material/ui/icons/theaters.svg create mode 100644 dashboard/ui/material/ui/icons/thermostat.svg create mode 100644 dashboard/ui/material/ui/icons/thermostat_auto.svg create mode 100644 dashboard/ui/material/ui/icons/thumb_down.svg create mode 100644 dashboard/ui/material/ui/icons/thumb_down_alt.svg create mode 100644 dashboard/ui/material/ui/icons/thumb_down_off_alt.svg create mode 100644 dashboard/ui/material/ui/icons/thumb_up.svg create mode 100644 dashboard/ui/material/ui/icons/thumb_up_alt.svg create mode 100644 dashboard/ui/material/ui/icons/thumb_up_off_alt.svg create mode 100644 dashboard/ui/material/ui/icons/thumbs_up_down.svg create mode 100644 dashboard/ui/material/ui/icons/thunderstorm.svg create mode 100644 dashboard/ui/material/ui/icons/time_to_leave.svg create mode 100644 dashboard/ui/material/ui/icons/timelapse.svg create mode 100644 dashboard/ui/material/ui/icons/timeline.svg create mode 100644 dashboard/ui/material/ui/icons/timer.svg create mode 100644 dashboard/ui/material/ui/icons/timer_10.svg create mode 100644 dashboard/ui/material/ui/icons/timer_10_select.svg create mode 100644 dashboard/ui/material/ui/icons/timer_3.svg create mode 100644 dashboard/ui/material/ui/icons/timer_3_select.svg create mode 100644 dashboard/ui/material/ui/icons/timer_off.svg create mode 100644 dashboard/ui/material/ui/icons/tips_and_updates.svg create mode 100644 dashboard/ui/material/ui/icons/tire_repair.svg create mode 100644 dashboard/ui/material/ui/icons/title.svg create mode 100644 dashboard/ui/material/ui/icons/toc.svg create mode 100644 dashboard/ui/material/ui/icons/today.svg create mode 100644 dashboard/ui/material/ui/icons/toggle_off.svg create mode 100644 dashboard/ui/material/ui/icons/toggle_on.svg create mode 100644 dashboard/ui/material/ui/icons/token.svg create mode 100644 dashboard/ui/material/ui/icons/toll.svg create mode 100644 dashboard/ui/material/ui/icons/tonality.svg create mode 100644 dashboard/ui/material/ui/icons/topic.svg create mode 100644 dashboard/ui/material/ui/icons/tornado.svg create mode 100644 dashboard/ui/material/ui/icons/touch_app.svg create mode 100644 dashboard/ui/material/ui/icons/tour.svg create mode 100644 dashboard/ui/material/ui/icons/toys.svg create mode 100644 dashboard/ui/material/ui/icons/track_changes.svg create mode 100644 dashboard/ui/material/ui/icons/traffic.svg create mode 100644 dashboard/ui/material/ui/icons/train.svg create mode 100644 dashboard/ui/material/ui/icons/tram.svg create mode 100644 dashboard/ui/material/ui/icons/transcribe.svg create mode 100644 dashboard/ui/material/ui/icons/transfer_within_a_station.svg create mode 100644 dashboard/ui/material/ui/icons/transform.svg create mode 100644 dashboard/ui/material/ui/icons/transgender.svg create mode 100644 dashboard/ui/material/ui/icons/transit_enterexit.svg create mode 100644 dashboard/ui/material/ui/icons/translate.svg create mode 100644 dashboard/ui/material/ui/icons/travel_explore.svg create mode 100644 dashboard/ui/material/ui/icons/trending_down.svg create mode 100644 dashboard/ui/material/ui/icons/trending_flat.svg create mode 100644 dashboard/ui/material/ui/icons/trending_up.svg create mode 100644 dashboard/ui/material/ui/icons/trip_origin.svg create mode 100644 dashboard/ui/material/ui/icons/troubleshoot.svg create mode 100644 dashboard/ui/material/ui/icons/try.svg create mode 100644 dashboard/ui/material/ui/icons/tsunami.svg create mode 100644 dashboard/ui/material/ui/icons/tty.svg create mode 100644 dashboard/ui/material/ui/icons/tune.svg create mode 100644 dashboard/ui/material/ui/icons/tungsten.svg create mode 100644 dashboard/ui/material/ui/icons/turn_left.svg create mode 100644 dashboard/ui/material/ui/icons/turn_right.svg create mode 100644 dashboard/ui/material/ui/icons/turn_sharp_left.svg create mode 100644 dashboard/ui/material/ui/icons/turn_sharp_right.svg create mode 100644 dashboard/ui/material/ui/icons/turn_slight_left.svg create mode 100644 dashboard/ui/material/ui/icons/turn_slight_right.svg create mode 100644 dashboard/ui/material/ui/icons/turned_in.svg create mode 100644 dashboard/ui/material/ui/icons/turned_in_not.svg create mode 100644 dashboard/ui/material/ui/icons/tv.svg create mode 100644 dashboard/ui/material/ui/icons/tv_off.svg create mode 100644 dashboard/ui/material/ui/icons/two_wheeler.svg create mode 100644 dashboard/ui/material/ui/icons/type_specimen.svg create mode 100644 dashboard/ui/material/ui/icons/u_turn_left.svg create mode 100644 dashboard/ui/material/ui/icons/u_turn_right.svg create mode 100644 dashboard/ui/material/ui/icons/umbrella.svg create mode 100644 dashboard/ui/material/ui/icons/unarchive.svg create mode 100644 dashboard/ui/material/ui/icons/undo.svg create mode 100644 dashboard/ui/material/ui/icons/unfold_less.svg create mode 100644 dashboard/ui/material/ui/icons/unfold_less_double.svg create mode 100644 dashboard/ui/material/ui/icons/unfold_more.svg create mode 100644 dashboard/ui/material/ui/icons/unfold_more_double.svg create mode 100644 dashboard/ui/material/ui/icons/unpublished.svg create mode 100644 dashboard/ui/material/ui/icons/unsubscribe.svg create mode 100644 dashboard/ui/material/ui/icons/upcoming.svg create mode 100644 dashboard/ui/material/ui/icons/update.svg create mode 100644 dashboard/ui/material/ui/icons/update_disabled.svg create mode 100644 dashboard/ui/material/ui/icons/upgrade.svg create mode 100644 dashboard/ui/material/ui/icons/upload.svg create mode 100644 dashboard/ui/material/ui/icons/upload_file.svg create mode 100644 dashboard/ui/material/ui/icons/usb.svg create mode 100644 dashboard/ui/material/ui/icons/usb_off.svg create mode 100644 dashboard/ui/material/ui/icons/vaccines.svg create mode 100644 dashboard/ui/material/ui/icons/vape_free.svg create mode 100644 dashboard/ui/material/ui/icons/vaping_rooms.svg create mode 100644 dashboard/ui/material/ui/icons/verified.svg create mode 100644 dashboard/ui/material/ui/icons/verified_user.svg create mode 100644 dashboard/ui/material/ui/icons/vertical_align_bottom.svg create mode 100644 dashboard/ui/material/ui/icons/vertical_align_center.svg create mode 100644 dashboard/ui/material/ui/icons/vertical_align_top.svg create mode 100644 dashboard/ui/material/ui/icons/vertical_distribute.svg create mode 100644 dashboard/ui/material/ui/icons/vertical_shades.svg create mode 100644 dashboard/ui/material/ui/icons/vertical_shades_closed.svg create mode 100644 dashboard/ui/material/ui/icons/vertical_split.svg create mode 100644 dashboard/ui/material/ui/icons/vibration.svg create mode 100644 dashboard/ui/material/ui/icons/video_call.svg create mode 100644 dashboard/ui/material/ui/icons/video_camera_back.svg create mode 100644 dashboard/ui/material/ui/icons/video_camera_front.svg create mode 100644 dashboard/ui/material/ui/icons/video_chat.svg create mode 100644 dashboard/ui/material/ui/icons/video_file.svg create mode 100644 dashboard/ui/material/ui/icons/video_label.svg create mode 100644 dashboard/ui/material/ui/icons/video_library.svg create mode 100644 dashboard/ui/material/ui/icons/video_settings.svg create mode 100644 dashboard/ui/material/ui/icons/video_stable.svg create mode 100644 dashboard/ui/material/ui/icons/videocam.svg create mode 100644 dashboard/ui/material/ui/icons/videocam_off.svg create mode 100644 dashboard/ui/material/ui/icons/videogame_asset.svg create mode 100644 dashboard/ui/material/ui/icons/videogame_asset_off.svg create mode 100644 dashboard/ui/material/ui/icons/view_agenda.svg create mode 100644 dashboard/ui/material/ui/icons/view_array.svg create mode 100644 dashboard/ui/material/ui/icons/view_carousel.svg create mode 100644 dashboard/ui/material/ui/icons/view_column.svg create mode 100644 dashboard/ui/material/ui/icons/view_comfy.svg create mode 100644 dashboard/ui/material/ui/icons/view_comfy_alt.svg create mode 100644 dashboard/ui/material/ui/icons/view_compact.svg create mode 100644 dashboard/ui/material/ui/icons/view_compact_alt.svg create mode 100644 dashboard/ui/material/ui/icons/view_cozy.svg create mode 100644 dashboard/ui/material/ui/icons/view_day.svg create mode 100644 dashboard/ui/material/ui/icons/view_headline.svg create mode 100644 dashboard/ui/material/ui/icons/view_in_ar.svg create mode 100644 dashboard/ui/material/ui/icons/view_kanban.svg create mode 100644 dashboard/ui/material/ui/icons/view_list.svg create mode 100644 dashboard/ui/material/ui/icons/view_module.svg create mode 100644 dashboard/ui/material/ui/icons/view_quilt.svg create mode 100644 dashboard/ui/material/ui/icons/view_sidebar.svg create mode 100644 dashboard/ui/material/ui/icons/view_stream.svg create mode 100644 dashboard/ui/material/ui/icons/view_timeline.svg create mode 100644 dashboard/ui/material/ui/icons/view_week.svg create mode 100644 dashboard/ui/material/ui/icons/vignette.svg create mode 100644 dashboard/ui/material/ui/icons/villa.svg create mode 100644 dashboard/ui/material/ui/icons/visibility.svg create mode 100644 dashboard/ui/material/ui/icons/visibility_off.svg create mode 100644 dashboard/ui/material/ui/icons/voice_chat.svg create mode 100644 dashboard/ui/material/ui/icons/voice_over_off.svg create mode 100644 dashboard/ui/material/ui/icons/voicemail.svg create mode 100644 dashboard/ui/material/ui/icons/volcano.svg create mode 100644 dashboard/ui/material/ui/icons/volume_down.svg create mode 100644 dashboard/ui/material/ui/icons/volume_mute.svg create mode 100644 dashboard/ui/material/ui/icons/volume_off.svg create mode 100644 dashboard/ui/material/ui/icons/volume_up.svg create mode 100644 dashboard/ui/material/ui/icons/volunteer_activism.svg create mode 100644 dashboard/ui/material/ui/icons/vpn_key.svg create mode 100644 dashboard/ui/material/ui/icons/vpn_key_off.svg create mode 100644 dashboard/ui/material/ui/icons/vpn_lock.svg create mode 100644 dashboard/ui/material/ui/icons/vrpano.svg create mode 100644 dashboard/ui/material/ui/icons/wallet.svg create mode 100644 dashboard/ui/material/ui/icons/wallpaper.svg create mode 100644 dashboard/ui/material/ui/icons/warehouse.svg create mode 100644 dashboard/ui/material/ui/icons/warning.svg create mode 100644 dashboard/ui/material/ui/icons/warning_amber.svg create mode 100644 dashboard/ui/material/ui/icons/wash.svg create mode 100644 dashboard/ui/material/ui/icons/watch.svg create mode 100644 dashboard/ui/material/ui/icons/watch_later.svg create mode 100644 dashboard/ui/material/ui/icons/watch_off.svg create mode 100644 dashboard/ui/material/ui/icons/water.svg create mode 100644 dashboard/ui/material/ui/icons/water_damage.svg create mode 100644 dashboard/ui/material/ui/icons/water_drop.svg create mode 100644 dashboard/ui/material/ui/icons/waterfall_chart.svg create mode 100644 dashboard/ui/material/ui/icons/waves.svg create mode 100644 dashboard/ui/material/ui/icons/waving_hand.svg create mode 100644 dashboard/ui/material/ui/icons/wb_auto.svg create mode 100644 dashboard/ui/material/ui/icons/wb_cloudy.svg create mode 100644 dashboard/ui/material/ui/icons/wb_incandescent.svg create mode 100644 dashboard/ui/material/ui/icons/wb_iridescent.svg create mode 100644 dashboard/ui/material/ui/icons/wb_shade.svg create mode 100644 dashboard/ui/material/ui/icons/wb_sunny.svg create mode 100644 dashboard/ui/material/ui/icons/wb_twilight.svg create mode 100644 dashboard/ui/material/ui/icons/wc.svg create mode 100644 dashboard/ui/material/ui/icons/web.svg create mode 100644 dashboard/ui/material/ui/icons/web_asset.svg create mode 100644 dashboard/ui/material/ui/icons/web_asset_off.svg create mode 100644 dashboard/ui/material/ui/icons/web_stories.svg create mode 100644 dashboard/ui/material/ui/icons/webhook.svg create mode 100644 dashboard/ui/material/ui/icons/weekend.svg create mode 100644 dashboard/ui/material/ui/icons/west.svg create mode 100644 dashboard/ui/material/ui/icons/whatshot.svg create mode 100644 dashboard/ui/material/ui/icons/wheelchair_pickup.svg create mode 100644 dashboard/ui/material/ui/icons/where_to_vote.svg create mode 100644 dashboard/ui/material/ui/icons/widgets.svg create mode 100644 dashboard/ui/material/ui/icons/width_full.svg create mode 100644 dashboard/ui/material/ui/icons/width_normal.svg create mode 100644 dashboard/ui/material/ui/icons/width_wide.svg create mode 100644 dashboard/ui/material/ui/icons/wifi.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_1_bar.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_2_bar.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_calling.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_calling_3.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_channel.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_find.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_lock.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_off.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_password.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_protected_setup.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_tethering.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_tethering_error.svg create mode 100644 dashboard/ui/material/ui/icons/wifi_tethering_off.svg create mode 100644 dashboard/ui/material/ui/icons/wind_power.svg create mode 100644 dashboard/ui/material/ui/icons/window.svg create mode 100644 dashboard/ui/material/ui/icons/wine_bar.svg create mode 100644 dashboard/ui/material/ui/icons/woman.svg create mode 100644 dashboard/ui/material/ui/icons/woman_2.svg create mode 100644 dashboard/ui/material/ui/icons/work.svg create mode 100644 dashboard/ui/material/ui/icons/work_history.svg create mode 100644 dashboard/ui/material/ui/icons/work_off.svg create mode 100644 dashboard/ui/material/ui/icons/work_outline.svg create mode 100644 dashboard/ui/material/ui/icons/workspace_premium.svg create mode 100644 dashboard/ui/material/ui/icons/workspaces.svg create mode 100644 dashboard/ui/material/ui/icons/wrap_text.svg create mode 100644 dashboard/ui/material/ui/icons/wrong_location.svg create mode 100644 dashboard/ui/material/ui/icons/wysiwyg.svg create mode 100644 dashboard/ui/material/ui/icons/yard.svg create mode 100644 dashboard/ui/material/ui/icons/youtube_searched_for.svg create mode 100644 dashboard/ui/material/ui/icons/zoom_in.svg create mode 100644 dashboard/ui/material/ui/icons/zoom_in_map.svg create mode 100644 dashboard/ui/material/ui/icons/zoom_out.svg create mode 100644 dashboard/ui/material/ui/icons/zoom_out_map.svg create mode 100644 dashboard/ui/material/ui/items/list_item.slint create mode 100644 dashboard/ui/material/ui/items/menu_item.slint create mode 100644 dashboard/ui/material/ui/items/navigation_item.slint create mode 100644 dashboard/ui/material/ui/styling/material_animations.slint create mode 100644 dashboard/ui/material/ui/styling/material_palette.slint create mode 100644 dashboard/ui/material/ui/styling/material_schemes.slint create mode 100644 dashboard/ui/material/ui/styling/material_style_metrics.slint create mode 100644 dashboard/ui/material/ui/styling/material_typography.slint diff --git a/dashboard/ui/main.slint b/dashboard/ui/main.slint index f3e9587..147c80c 100644 --- a/dashboard/ui/main.slint +++ b/dashboard/ui/main.slint @@ -1,3 +1,5 @@ +import { BottomAppBar } from "./material/material.slint"; + import { Palette, StyleMetrics, @@ -11,6 +13,8 @@ import { import { Climate, WeatherData } from "./climate.slint"; import { Calendar } from "calendar.slint"; import { Energy } from "energy.slint"; +import { TabBar, Switch, MaterialStyleMetrics } from "material/material.slint"; +import { Icons } from "material/ui/icons/icons.slint"; export struct LightData { id: string, @@ -84,6 +88,36 @@ component Thermometer inherits Rectangle { } } +component LightTile inherits Rectangle { + in property light; + callback clicked(); + + TouchArea { + clicked => { + clicked(); + } + } + + HorizontalLayout { + spacing: MaterialStyleMetrics.padding_8; + Text { + text: light.name; + height: 32px; + vertical-alignment: center; + } + + Rectangle { } + + sw := Switch { + width: 48px; + height: 32px; + enabled: light.available; + checked: light.on; + checked_state_changed(checked) => { root.clicked() } + } + } +} + export component AppWindow inherits Window { width: 1024px; height: 600px; @@ -134,34 +168,23 @@ export component AppWindow inherits Window { Rectangle { preferred-width: root.width; VerticalLayout { - if root.page == 0: Climate { + if tab-bar.current-index == 0: Climate { is-night: is-night; weather: weather; } - if root.page == 1: Calendar { } - if root.page == 2: Energy { } + if tab-bar.current-index == 1: Calendar { } + if tab-bar.current-index == 2: Energy { } Rectangle { height: 64px; - HorizontalBox { - padding-top: 0; - Button { - text: "Climate"; - clicked => { root.page = 0; } - primary: root.page == 0; - } - Button { - text: "Calendar"; - clicked => { root.page = 1; } - primary: root.page == 1; - } - - Button { - text: "Energy"; - clicked => { root.page = 2; } - primary: root.page == 2; - } + tab-bar := TabBar { + width: parent.width; + items: [ + { icon: Icons.heat_pump, text: "Climate" }, + { icon: Icons.edit_calendar, text: "Calendar" }, + { icon: Icons.energy_savings_leaf, text: "Energy" } + ]; } } } @@ -169,10 +192,8 @@ export component AppWindow inherits Window { VerticalBox { preferred-width: 0; - for light[index] in root.lights: Button { - text: light.name; - primary: light.on; - enabled: light.available; + for light[index] in root.lights: LightTile { + light: light; clicked => { toggle-light(light.id) } } } diff --git a/dashboard/ui/material/LICENSE.md b/dashboard/ui/material/LICENSE.md new file mode 100644 index 0000000..49468b5 --- /dev/null +++ b/dashboard/ui/material/LICENSE.md @@ -0,0 +1,11 @@ + + +MIT License + +Copyright (c) 2025 SixtyFPS GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/dashboard/ui/material/README.md b/dashboard/ui/material/README.md new file mode 100644 index 0000000..9d2fe19 --- /dev/null +++ b/dashboard/ui/material/README.md @@ -0,0 +1,30 @@ + + +# Material Design 3 component set for Slint + +[![Gallery image](https://material.slint.dev/tablet-material.webp)](examples/gallery) + +Welcome to the official Material Design 3 component set for [Slint](https://slint.dev). These UI components adhere to [Material Design 3 guidelines](https://m3.material.io/). +The components are intended to use for development of user interfaces with Slint for Android apps, touch friendly interfaces for embedded devices and even for desktop application development. +Contributions and feedback from the community are welcome. + + +## Demos + +[WebAssembly build in the web browser](https://material.slint.dev/wasm/) + +Download and install the [APK for android](https://material.slint.dev/apk/slint_material.apk) + +## Documentation + +View the documentation online at https://material.slint.dev/getting-started/ + +### Get Started + +Clone one of our Material Components for Slint templates and follow the instruction from their README: + + - Rust: https://github.com/slint-ui/material-rust-template + - C++: https://github.com/slint-ui/material-cpp-template + - Node.js/Deno: https://github.com/slint-ui/material-nodejs-template + - Python: https://github.com/slint-ui/material-python-template + diff --git a/dashboard/ui/material/material.slint b/dashboard/ui/material/material.slint new file mode 100644 index 0000000..4b5316f --- /dev/null +++ b/dashboard/ui/material/material.slint @@ -0,0 +1,66 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +// components +export { AppBar, SmallAppBar, MediumAppBar, LargeAppBar } from "./ui/components/app_bar.slint"; +export { Badge } from "./ui/components/badge.slint"; +export { BottomAppBar } from "./ui/components/bottom_app_bar.slint"; +export { CheckState, CheckBox, CheckBoxTile } from "./ui/components/check_box.slint"; +export { ActionChip, FilterChip, InputChip } from "./ui/components/chip.slint"; +export { DatePickerPopup, DatePickerAdapter } from "./ui/components/date_picker.slint"; +export { Dialog, FullscreenDialog } from "./ui/components/dialog.slint"; +export { Drawer, ModalDrawer } from "./ui/components/drawer.slint"; +export { DropDownMenu } from "./ui/components/drop_down_menu.slint"; +export { VerticalDivider, HorizontalDivider } from "./ui/components/divider.slint"; +export { ModalBottomSheet } from "./ui/components/bottom_sheet.slint"; +export { ElevatedCard, FilledCard, OutlinedCard } from "./ui/components/card.slint"; +export { ElevatedButton } from "./ui/components/elevated_button.slint"; +export { Elevation } from "./ui/components/elevation.slint"; +export { ExtendedTouchArea } from "./ui/components/extended_touch_area.slint"; +export { FilledButton } from "./ui/components/filled_button.slint"; +export { FilledIconButton } from "./ui/components/filled_icon_button.slint"; +export { FloatingActionButton, FABStyle } from "./ui/components/floating_action_button.slint"; +export { Grid } from "./ui/components/grid.slint"; +export { Horizontal } from "./ui/components/horizontal.slint"; +export { Icon } from "./ui/components/icon.slint"; +export { IconButton } from "./ui/components/icon_button.slint"; +export { OutlineButton } from "./ui/components/outline_button.slint"; +export { OutlineIconButton } from "./ui/components/outline_icon_button.slint"; +export { Avatar, ListTile } from "./ui/components/list.slint"; +export { ListView } from "./ui/components/list_view.slint"; +export { MaterialText } from "./ui/components/material_text.slint"; +export { MaterialWindow, MaterialWindowAdapter } from "./ui/components/material_window.slint"; +export { PopupMenu } from "./ui/components/menu.slint"; +export { NavigationBar } from "./ui/components/navigation_bar.slint"; +export { NavigationDrawer, ModalNavigationDrawer } from "./ui/components/navigation_drawer.slint"; +export { NavigationRail } from "./ui/components/navigation_rail.slint"; +export { CircularProgressIndicator, LinearProgressIndicator } from "./ui/components/progress_indicator.slint"; +export { RadioButton, RadioButtonTile } from "./ui/components/radio_button.slint"; +export { SearchBar } from "./ui/components/search_bar.slint"; +export { ScrollView } from "./ui/components/scroll_view.slint"; +export { Slider } from "./ui/components/slider.slint"; +export { SnackBar } from "./ui/components/snack_bar.slint"; +export { StateLayerArea, StateLayer, Ripple } from "./ui/components/state_layer.slint"; +export { SegmentedButton } from "./ui/components/segmented_button.slint"; +export { Switch } from "./ui/components/switch.slint"; +export { TabBar, SecondaryTabBar } from "./ui/components/tab_bar.slint"; +export { TextButton } from "./ui/components/text_button.slint"; +export { TextField } from "./ui/components/text_field.slint"; +export { TimePickerPopup, Time } from "./ui/components/time_picker.slint"; +export { TonalButton } from "./ui/components/tonal_button.slint"; +export { TonalIconButton } from "./ui/components/tonal_icon_button.slint"; +export { ToolTip } from "./ui/components/tooltip.slint"; +export { Vertical } from "./ui/components/vertical.slint"; +export { Modal } from "./ui/components/modal.slint"; + +// items +export { ListItem } from "./ui/items/list_item.slint"; +export { NavigationItem, NavigationGroup } from "./ui/items/navigation_item.slint"; +export { MenuItem } from "./ui/items/menu_item.slint"; + +// styles +export { MaterialAnimations } from "./ui/styling/material_animations.slint"; +export { MaterialScheme, MaterialSchemes } from "./ui/styling/material_schemes.slint"; +export { MaterialStyleMetrics } from "./ui/styling/material_style_metrics.slint"; +export { MaterialPalette } from "./ui/styling/material_palette.slint"; +export { MaterialTypography } from "./ui/styling/material_typography.slint"; diff --git a/dashboard/ui/material/ui/components/app_bar.slint b/dashboard/ui/material/ui/components/app_bar.slint new file mode 100644 index 0000000..774e15e --- /dev/null +++ b/dashboard/ui/material/ui/components/app_bar.slint @@ -0,0 +1,256 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { IconButton } from "./icon_button.slint"; +import { MaterialText } from "./material_text.slint"; +import { MaterialTypography, TextStyle } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { IconButtonItem } from "./bottom_app_bar.slint"; + +component BaseAppBar { + in property title; + in property leading_button; + in property show_background; + in property <[IconButtonItem]> trailing_buttons; + in property horizontal_alignment; + in property spacing; + in property vertical_spacing; + in property two_rows; + in property text_style; + in property text_padding; + in property appbar_padding_right: 0; + in property appbar_padding_top: 0; + in property appbar_padding_bottom: 0; + + callback leading_button_clicked(); + callback trailing_button_clicked(index: int); + + min_width: layout.min_width; + min_height: layout.min_height; + + Rectangle { + background: root.show_background ? MaterialPalette.surface_container : MaterialPalette.surface; + + layout := VerticalLayout { + padding_top: root.appbar_padding_top; + padding_bottom: root.appbar_padding_bottom; + min_width: top_layout.min_width; + spacing: root.vertical_spacing; + + top_layout := HorizontalLayout { + padding_left: root.spacing; + padding_right: root.appbar_padding_right; + spacing: MaterialStyleMetrics.spacing_6; + + if root.leading_button.icon.width > 0 && root.leading_button.icon.height > 0 : VerticalLayout { + alignment: center; + + IconButton { + icon: root.leading_button.icon; + enabled: root.leading_button.enabled; + tooltip: root.leading_button.tooltip; + + clicked => { + root.leading_button_clicked(); + } + } + } + + if !root.two_rows : MaterialText { + horizontal_stretch: 1; + text: root.title; + vertical_alignment: center; + horizontal_alignment: root.horizontal_alignment; + color: MaterialPalette.on_surface; + overflow: elide; + style: root.text_style; + } + + // spacer + if root.two_rows : Rectangle { + horizontal_stretch: 1; + } + + if root.trailing_buttons.length > 0 : VerticalLayout { + alignment: center; + + HorizontalLayout { + spacing: top_layout.spacing; + + for item[index] in root.trailing_buttons : IconButton { + icon: item.icon; + enabled: item.enabled; + tooltip: item.tooltip; + + clicked => { + root.trailing_button_clicked(index); + } + } + } + } + } + + if root.two_rows && root.title != "" : HorizontalLayout { + padding_left: root.text_padding; + padding_right: self.padding_left; + + MaterialText { + text: root.title; + horizontal_alignment: root.horizontal_alignment; + color: MaterialPalette.on_surface; + overflow: elide; + style: root.text_style; + } + } + } + } +} + +export component AppBar { + in property title; + in property leading_button; + in property trailing_button; + in property show_background; + + callback leading_button_clicked(); + callback trailing_button_clicked(); + + min_height: max(MaterialStyleMetrics.size_64, base.min_height); + + HorizontalLayout { + base := BaseAppBar { + title: root.title; + horizontal_alignment: center; + + leading_button: root.leading_button; + trailing_buttons: [root.trailing_button]; + show_background: root.show_background; + + appbar_padding_right: self.padding_left; + appbar_padding_top: MaterialStyleMetrics.padding_8; + appbar_padding_bottom: self.padding_top; + spacing: MaterialStyleMetrics.spacing_6; + text_style: MaterialTypography.title_large; + + leading_button_clicked => { + root.leading_button_clicked(); + } + + trailing_button_clicked(index) => { + root.trailing_button_clicked(); + } + } + } +} + +export component SmallAppBar { + in property title; + in property leading_button; + in property <[IconButtonItem]> trailing_buttons; + in property show_background; + + callback leading_button_clicked(); + callback trailing_button_clicked(index: int); + + min_height: max(MaterialStyleMetrics.size_64, base.min_height); + + HorizontalLayout { + base := BaseAppBar { + title: root.title; + horizontal_alignment: left; + leading_button: root.leading_button; + trailing_buttons: root.trailing_buttons; + show_background: root.show_background; + appbar_padding_right: self.padding_left; + appbar_padding_top: MaterialStyleMetrics.padding_8; + appbar_padding_bottom: self.padding_top; + spacing: MaterialStyleMetrics.spacing_4; + text_style: MaterialTypography.title_large; + + leading_button_clicked => { + root.leading_button_clicked(); + } + + trailing_button_clicked(index) => { + root.trailing_button_clicked(index); + } + } + } +} + +export component MediumAppBar { + in property title; + in property leading_button; + in property <[IconButtonItem]> trailing_buttons; + in property show_background; + + callback leading_button_clicked(); + callback trailing_button_clicked(index: int); + + min_height: max(MaterialStyleMetrics.size_64, base.min_height); + + HorizontalLayout { + base := BaseAppBar { + title: root.title; + horizontal_alignment: left; + leading_button: root.leading_button; + trailing_buttons: root.trailing_buttons; + show_background: root.show_background; + appbar_padding_right: self.padding_left; + appbar_padding_top: MaterialStyleMetrics.padding_8; + appbar_padding_bottom: MaterialStyleMetrics.padding_24; + vertical_spacing: MaterialStyleMetrics.spacing_4; + spacing: MaterialStyleMetrics.spacing_4; + two_rows: true; + text_style: MaterialTypography.headline_small; + text_padding: MaterialStyleMetrics.padding_16; + + leading_button_clicked => { + root.leading_button_clicked(); + } + + trailing_button_clicked(index) => { + root.trailing_button_clicked(index); + } + } + } +} + +export component LargeAppBar { + in property title; + in property leading_button; + in property <[IconButtonItem]> trailing_buttons; + in property show_background; + + callback leading_button_clicked(); + callback trailing_button_clicked(index: int); + + min_height: max(MaterialStyleMetrics.size_64, base.min_height); + + HorizontalLayout { + base := BaseAppBar { + title: root.title; + horizontal_alignment: left; + leading_button: root.leading_button; + trailing_buttons: root.trailing_buttons; + show_background: root.show_background; + appbar_padding_right: self.padding_left; + appbar_padding_top: MaterialStyleMetrics.padding_8; + appbar_padding_bottom: MaterialStyleMetrics.padding_28; + vertical_spacing: MaterialStyleMetrics.spacing_40; + spacing: MaterialStyleMetrics.spacing_4; + two_rows: true; + text_style: MaterialTypography.headline_medium; + text_padding: MaterialStyleMetrics.padding_16; + + leading_button_clicked => { + root.leading_button_clicked(); + } + + trailing_button_clicked(index) => { + root.trailing_button_clicked(index); + } + } + } +} diff --git a/dashboard/ui/material/ui/components/badge.slint b/dashboard/ui/material/ui/components/badge.slint new file mode 100644 index 0000000..eacae3e --- /dev/null +++ b/dashboard/ui/material/ui/components/badge.slint @@ -0,0 +1,36 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialText } from "material_text.slint"; + +export component Badge { + in property text; + + width: max(MaterialStyleMetrics.size_16, label.width + 2 * MaterialStyleMetrics.padding_4); + height: max(MaterialStyleMetrics.size_16, label.height); + + background_layer := Rectangle { + width: parent.width; + height: parent.height; + border_radius: self.height / 2; + background: MaterialPalette.error; + } + + label := MaterialText { + text: root.text; + color: MaterialPalette.on_error; + vertical_alignment: center; + horizontal_alignment: center; + style: MaterialTypography.label_small; + } + + states [ + small when root.text == "" : { + background_layer.width: MaterialStyleMetrics.size_6; + background_layer.height: MaterialStyleMetrics.size_6; + } + ] +} diff --git a/dashboard/ui/material/ui/components/base_button.slint b/dashboard/ui/material/ui/components/base_button.slint new file mode 100644 index 0000000..950e734 --- /dev/null +++ b/dashboard/ui/material/ui/components/base_button.slint @@ -0,0 +1,72 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { StateLayerArea } from "./state_layer.slint"; +import { MaterialText } from "./material_text.slint"; +import { Icon } from "./icon.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { Avatar } from "./list.slint"; + +export component BaseButton inherits StateLayerArea { + in property icon; + in property icon_color: self.color; + in property text; + in property button_horizontal_padding: MaterialStyleMetrics.padding_24; + in property button_vertical_padding: MaterialStyleMetrics.padding_10; + in property button_padding_left: self.button_horizontal_padding; + in property button_padding_right: self.button_horizontal_padding; + in property button_padding_top: self.button_vertical_padding; + in property button_padding_bottom: self.button_vertical_padding; + in property spacing: MaterialStyleMetrics.spacing_8; + in property min_layout_width: MaterialStyleMetrics.size_40; + in property min_layout_height: MaterialStyleMetrics.size_40; + in property icon_size: MaterialStyleMetrics.icon_size_18; + in property avatar_icon; + in property avatar_size; + in property avatar_background: #00000000; + out property has_icon: root.icon.width > 0 && root.icon.height > 0; + out property has_avatar: root.avatar_icon.width > 0 && root.avatar_icon.height > 0; + + min_width: max(root.min_layout_width, layout.min_width); + min_height: max(root.min_layout_height, layout.min_height); + tooltip_offset: root.height / 2 + root.icon_size / 2 + MaterialStyleMetrics.padding_14; + + layout := HorizontalLayout { + padding_left: root.button_padding_left; + padding_right: root.button_padding_right; + padding_top: root.button_padding_top; + padding_bottom: root.button_padding_bottom; + spacing: root.spacing; + alignment: center; + + if root.has_icon || root.has_avatar : VerticalLayout { + alignment: center; + + if root.has_avatar && root.avatar_size > 0 : Avatar { + width: root.avatar_size; + height: self.width; + image: root.avatar_icon; + background: root.avatar_background; + } + + if root.has_icon : Icon { + source: root.icon; + colorize: root.icon_color; + opacity: root.enabled ? 100% : 38%; + width: root.icon_size; + } + } + + if root.text != "" : MaterialText { + text: root.text; + style: MaterialTypography.label_large; + color: root.color; + opacity: root.enabled ? 100% : 38%; + overflow: clip; + vertical_alignment: center; + } + + @children + } +} diff --git a/dashboard/ui/material/ui/components/base_navigation.slint b/dashboard/ui/material/ui/components/base_navigation.slint new file mode 100644 index 0000000..a8a4100 --- /dev/null +++ b/dashboard/ui/material/ui/components/base_navigation.slint @@ -0,0 +1,51 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { NavigationItem } from "../items/navigation_item.slint"; + +export component BaseNavigationItemTemplate { + in property icon; + in property selected_icon; + in property text; + in property index; + in property selected; + in property show_badge; + in property badge; + + callback clicked; + callback pointer_event(event: PointerEvent, position: Point); + + accessible-role: tab; + accessible-label: root.text; + accessible-item-index: root.index; + accessible-item-selectable: true; + accessible-item-selected: root.selected; + accessible-action-default => { self.clicked(); } + + @children + +} + +export component BaseNavigation { + in property <[NavigationItem]> items; + in_out property current_index; + + callback index_changed(index: int); + + accessible-role: tab-list; + // accessible-delegate-focus: root.current-focused >= 0 ? root.current-focused : root.current-index; + // accessible-label: root.title; + accessible-item-count: root.items.length; + + @children + + protected function select(index: int) { + if index < 0 || index >= root.items.length { + return; + } + + root.current_index = index; + root.index_changed(index); + } + +} diff --git a/dashboard/ui/material/ui/components/bottom_app_bar.slint b/dashboard/ui/material/ui/components/bottom_app_bar.slint new file mode 100644 index 0000000..daea6ac --- /dev/null +++ b/dashboard/ui/material/ui/components/bottom_app_bar.slint @@ -0,0 +1,64 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { IconButton } from "./icon_button.slint"; +import { FloatingActionButton, FABStyle } from "./floating_action_button.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; + +export struct IconButtonItem { + icon: image, + tooltip: string, + enabled: bool +} + +export component BottomAppBar { + in property <[IconButtonItem]> icon_buttons; + in property fab_icon; + + callback fab_clicked(); + callback icon_button_clicked(index: int); + + min_height: max(MaterialStyleMetrics.size_80, layout.min_height); + + Rectangle { + background: MaterialPalette.surface_container; + + layout := HorizontalLayout { + padding_left: MaterialStyleMetrics.padding_4; + padding_right: MaterialStyleMetrics.padding_16; + + VerticalLayout { + alignment: center; + + HorizontalLayout { + for button[index] in root.icon_buttons : IconButton { + icon: button.icon; + enabled: button.enabled; + tooltip: button.tooltip; + + clicked => { + root.icon_button_clicked(index); + } + } + } + } + + // spacer + Rectangle {} + + if root.fab_icon.width > 0 && root.fab_icon.height > 0 : VerticalLayout { + alignment: center; + + FloatingActionButton { + icon: root.fab_icon; + style: FABStyle.standard; + + clicked => { + root.fab_clicked(); + } + } + } + } + } +} diff --git a/dashboard/ui/material/ui/components/bottom_sheet.slint b/dashboard/ui/material/ui/components/bottom_sheet.slint new file mode 100644 index 0000000..0883352 --- /dev/null +++ b/dashboard/ui/material/ui/components/bottom_sheet.slint @@ -0,0 +1,125 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { Elevation } from "./elevation.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { Horizontal } from "./horizontal.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { Modal } from "./modal.slint"; + +component BottomSheet { + callback drag_moved(offset_y: length); + callback pressed(); + callback released(); + + elevation := Elevation { + width: 100%; + height: 100%; + level: 3; + border_radius: MaterialStyleMetrics.border_radius_16; + } + + TouchArea { + Rectangle { + background: MaterialPalette.surface_container_low; + border_top_left_radius: MaterialStyleMetrics.border_radius_16; + border_top_right_radius: self.border_top_left_radius; + + VerticalLayout { + alignment: start; + + drag_handle := TouchArea { + height: MaterialStyleMetrics.size_36; + + Rectangle { + width: MaterialStyleMetrics.size_32; + height: MaterialStyleMetrics.size_4; + background: MaterialPalette.outline; + border_radius: self.height / 2; + } + + moved => { + root.drag_moved(self.pressed_y - self.mouse_y); + } + + changed pressed => { + if self.pressed { + root.pressed(); + return; + } + + root.released(); + } + } + + Horizontal { + @children + } + } + } + } +} + +export component ModalBottomSheet inherits PopupWindow { + close_policy: no_auto_close; + + property drag_margin: MaterialStyleMetrics.padding_56; + + modal := Modal { + width: 100%; + height: 100%; + + sheet := BottomSheet { + property y_duration: MaterialAnimations.standard_accelerate_duration; + property y_drag_start; + property height_drag_start; + + x: (parent.width - self.width) / 2; + y: parent.height; + width: min(MaterialStyleMetrics.size_640, parent.width - 2 * MaterialStyleMetrics.padding_56); + + @children + + drag_moved(offset_y) => { + self.y_duration = 0; + self.y = max(self.y - offset_y, self.y_drag_start); + self.height += offset_y; + } + + pressed => { + self.y_drag_start = self.y; + self.height_drag_start = self.height; + } + + released => { + if self.y >= root.height - root.drag_margin { + root.close(); + return; + } + + self.y_duration = MaterialAnimations.standard_accelerate_duration; + self.height = self.height_drag_start; + self.y = self.y_drag_start; + } + + animate y, height { + duration: self.y_duration; + easing: MaterialAnimations.standard_easing; + } + } + + clicked => { + root.close(); + } + } + + Timer { + interval: 50ms; + + triggered => { + sheet.y = modal.height - sheet.height; + self.running = false; + } + } +} diff --git a/dashboard/ui/material/ui/components/card.slint b/dashboard/ui/material/ui/components/card.slint new file mode 100644 index 0000000..6afebef --- /dev/null +++ b/dashboard/ui/material/ui/components/card.slint @@ -0,0 +1,112 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { Elevation } from "./elevation.slint"; +import { StateLayerArea } from "./state_layer.slint"; + +component BaseCard { + in property clickable; + in property has_elevation; + in property background; + in property border_color; + in property border_width; + + callback clicked(); + + forward_focus: state_layer; + + if root.has_elevation : Elevation { + width: 100%; + height: 100%; + border_radius: background_layer.border_radius; + level: 1; + } + + background_layer := Rectangle { + background: root.background; + border_radius: MaterialStyleMetrics.border_radius_12; + border_width: root.border_width; + border_color: root.border_color; + } + + state_layer := StateLayerArea { + width: 100%; + height: 100%; + border_radius: background_layer.border_radius; + visible: root.clickable; + enabled: root.visible; + + clicked => { + root.clicked(); + } + } + + Rectangle { + clip: true; + border_radius: MaterialStyleMetrics.border_radius_12; + + @children + } +} + +export component ElevatedCard { + in property clickable <=> base.clickable; + + callback clicked <=> base.clicked; + + forward_focus: base; + accessible-role: button; + accessible-enabled: root.clickable; + accessible-action-default => { base.clicked(); } + + base := BaseCard { + width: 100%; + height: 100%; + has_elevation: true; + background: MaterialPalette.surface; + + @children + } +} + +export component FilledCard { + in property clickable <=> base.clickable; + + callback clicked <=> base.clicked; + + forward_focus: base; + accessible-role: button; + accessible-enabled: root.clickable; + accessible-action-default => { base.clicked(); } + + base := BaseCard { + width: 100%; + height: 100%; + background: MaterialPalette.surface_container_highest; + + @children + } +} + +export component OutlinedCard { + in property clickable <=> base.clickable; + + callback clicked <=> base.clicked; + + forward_focus: base; + accessible-role: button; + accessible-enabled: root.clickable; + accessible-action-default => { base.clicked(); } + + base := BaseCard { + width: 100%; + height: 100%; + background: MaterialPalette.surface_container_low; + border_width: 1px; + border_color: MaterialPalette.outline; + + @children + } +} diff --git a/dashboard/ui/material/ui/components/check_box.slint b/dashboard/ui/material/ui/components/check_box.slint new file mode 100644 index 0000000..227a1db --- /dev/null +++ b/dashboard/ui/material/ui/components/check_box.slint @@ -0,0 +1,130 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { Icons } from "../icons/icons.slint"; +import { ListTile } from "./list.slint"; +import { StateLayerArea } from "./state_layer.slint"; +import { Icon } from "./icon.slint"; + +export enum CheckState { + unchecked, + partially_checked, + checked, +} + +export component CheckBox { + + in_out property check_state; + in_out property tristate; + in property has_error; + in property enabled <=> state_area.enabled; + + property checked: root.check_state == CheckState.checked || root.check_state == CheckState.partially_checked; + + callback checked_state_changed(check_state: CheckState); + + min_width: MaterialStyleMetrics.size_48; + min_height: self.min_width; + accessible-enabled: root.enabled; + accessible-checkable: true; + accessible-checked <=> root.checked; + accessible-role: checkbox; + accessible-action-default => { state_area.clicked(); } + forward_focus: state_area; + + state_area := StateLayerArea { + width: 100%; + height: 100%; + border_radius: max(self.width, self.height) / 2; + color: MaterialPalette.on_surface; + + background_layer := Rectangle { + width: MaterialStyleMetrics.size_18; + height: self.width; + border_radius: MaterialStyleMetrics.border_radius_2; + border_width: root.checked ? 0 : 2px; + border_color: root.has_error ? MaterialPalette.error : MaterialPalette.on_surface_variant; + + if root.checked : Icon { + colorize: MaterialPalette.on_primary; + source: Icons.check; + + states [ + partial_checked when root.check_state == CheckState.partially-checked : { + source: Icons.remove; + } + ] + } + + animate background, border_width { + duration: MaterialAnimations.opacity_duration; + easing: MaterialAnimations.opacity_easing; + } + } + + clicked => { + root.toggle(); + } + } + + changed check_state => { + root.checked_state_changed(root.check_state); + } + + public function toggle() { + if !root.tristate { + root.check_state = root.check_state != CheckState.checked ? CheckState.checked : CheckState.unchecked; + return; + } + + root.check_state = root.check_state == CheckState.checked ? CheckState.partially_checked : + root.check_state == CheckState.partially_checked ? CheckState.unchecked : CheckState.checked; + } + + public function set_check_state(check_state: CheckState) { + if check_state == CheckState.partially-checked { + root.tristate = true; + } + root.check_state = check_state; + } + + states [ + disabled when !root.enabled : { + state_area.display_background: false; + background_layer.border_color: root.checked ? transparent : MaterialPalette.on_surface.with_alpha(38%); + background_layer.background: root.checked ? MaterialPalette.on_surface.with_alpha(38%) : transparent; + } + checked when root.checked : { + background_layer.border_width: 0; + background_layer.background: root.has_error ? MaterialPalette.error : MaterialPalette.primary; + state_area.color: background_layer.background; + } + ] +} + +export component CheckBoxTile inherits ListTile { + in_out property check_state <=> check_box.check_state; + in_out property tristate <=> check_box.tristate; + in property has_error <=> check_box.has_error; + + callback checked_state_changed <=> check_box.checked_state_changed; + + Rectangle { + horizontal-stretch: 0; + + check_box := CheckBox { + enabled: root.enabled; + } + } + + clicked => { + check_box.toggle(); + } + + public function set_check_state(check-state: CheckState) { + check_box.set_check_state(check_state); + } +} diff --git a/dashboard/ui/material/ui/components/chip.slint b/dashboard/ui/material/ui/components/chip.slint new file mode 100644 index 0000000..4182279 --- /dev/null +++ b/dashboard/ui/material/ui/components/chip.slint @@ -0,0 +1,205 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { BaseButton } from "./base_button.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { Icons } from "../icons/icons.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { IconButton } from "icon_button.slint"; + +export component ActionChip { + in property icon <=> base.icon; + in property text <=> base.text; + in property enabled <=> base.enabled; + in property tooltip <=> base.tooltip; + in property avatar_icon <=> base.avatar-icon; + in property avatar_background <=> base.avatar_background; + + callback clicked <=> base.clicked; + + forward-focus: base; + accessible-role: button; + accessible-enabled: root.enabled; + accessible-label: root.text == "" ? root.tooltip : root.text; + accessible-action-default => { base.clicked(); } + + + border := Rectangle { + border_radius: base.border_radius; + border_width: 1px; + border_color: MaterialPalette.outline; + + base := BaseButton { + min_layout_height: MaterialStyleMetrics.size_32; + border_radius: MaterialStyleMetrics.border_radius_8; + color: MaterialPalette.on_surface; + icon_color: MaterialPalette.primary; + spacing: MaterialStyleMetrics.spacing_8; + button_padding_left: self.has_icon ? MaterialStyleMetrics.padding_8 : MaterialStyleMetrics.padding_16; + button_padding_right:MaterialStyleMetrics.padding_16; + button_vertical_padding: MaterialStyleMetrics.padding_6; + avatar_size: MaterialStyleMetrics.size_18; + } + } + + states [ + disabled when !root.enabled : { + base.display_background: false; + base.icon_color: MaterialPalette.on_surface; + } + ] +} + +export component FilterChip { + in property icon <=> base.icon; + in property text <=> base.text; + in property enabled <=> base.enabled; + in property tooltip <=> base.tooltip; + in_out property checked; + + forward-focus: base; + accessible-role: button; + accessible-enabled: root.enabled; + accessible-label: root.text == "" ? root.tooltip : root.text; + accessible-checkable: true; + accessible-checked: root.checked; + accessible-action-default => { base.clicked(); } + + border := Rectangle { + border_radius: base.border_radius; + border_width: 1px; + border_color: MaterialPalette.outline; + + + base := BaseButton { + min_layout_height: MaterialStyleMetrics.size_32; + border_radius: MaterialStyleMetrics.border_radius_8; + color: MaterialPalette.on_surface; + icon_color: MaterialPalette.primary; + spacing: MaterialStyleMetrics.spacing_8; + button_padding_left: self.has_icon ? MaterialStyleMetrics.padding_8 : MaterialStyleMetrics.padding_16; + button_padding_right:MaterialStyleMetrics.padding_16; + button_vertical_padding: MaterialStyleMetrics.padding_6; + avatar_size: MaterialStyleMetrics.size_18; + + clicked => { + root.toggle(); + } + } + + states [ + checked when root.checked : { + base.icon: Icons.check; + base.icon_color: MaterialPalette.on_secondary_container; + base.color: MaterialPalette.on_secondary_container; + border.border_width: 0; + border.background: MaterialPalette.secondary_container; + } + ] + + animate width { duration: MaterialAnimations.standard_accelerate_duration; easing: MaterialAnimations.standard_easing; } + } + + function toggle() { + root.checked = !root.checked; + } + + states [ + disabled when !root.enabled : { + base.display_background: false; + base.icon_color: MaterialPalette.on_surface; + } + ] +} + +export component InputChip { + in property leading_icon <=> base.icon; + in property trailing_icon; + in property avatar <=> base.avatar-icon; + in property avatar_background <=> base.avatar_background; + in property text <=> base.text; + in property enabled <=> base.enabled; + in property tooltip <=> base.tooltip; + in property checkable; + in_out property checked; + + property has_avatar: root.avatar.width > 0 && root.avatar.height > 0; + + callback clicked(); + callback trailing_icon_clicked(); + + forward-focus: base; + accessible-role: button; + accessible-enabled: root.enabled; + accessible-label: root.text == "" ? root.tooltip : root.text; + accessible-checkable: root.checkable; + accessible-checked: root.checked; + accessible-action-default => { base.clicked(); } + + border := Rectangle { + border_radius: base.border_radius; + border_width: 1px; + border_color: MaterialPalette.outline; + clip: true; + + base := BaseButton { + min_layout_height: MaterialStyleMetrics.size_32; + border_radius: root.has_avatar ? self.height / 2 : MaterialStyleMetrics.border_radius_8; + color: MaterialPalette.on_surface; + icon_color: MaterialPalette.primary; + spacing: MaterialStyleMetrics.spacing_8; + button_padding_left: root.has_avatar ? MaterialStyleMetrics.padding_4 : self.has_icon ? MaterialStyleMetrics.padding_8 : MaterialStyleMetrics.padding_12; + button_padding_right: root.trailing_icon.width > 0 && root.trailing_icon.height > 0 ? MaterialStyleMetrics.padding_8 : MaterialStyleMetrics.padding_12; + button_vertical_padding: MaterialStyleMetrics.padding_6; + avatar_size: MaterialStyleMetrics.size_18; + + if root.trailing_icon.width > 0 && root.trailing_icon.height > 0 : VerticalLayout { + alignment: center; + + IconButton { + icon: root.trailing_icon; + inline: true; + enabled: root.enabled; + + clicked => { + root.trailing_icon_clicked(); + } + } + } + + clicked => { + root.clicked(); + root.toggle(); + } + } + + states [ + checked when root.checked : { + base.icon_color: MaterialPalette.on_secondary_container; + base.color: MaterialPalette.on_secondary_container; + border.border_width: 0; + border.background: MaterialPalette.secondary_container; + } + ] + + animate width { duration: MaterialAnimations.standard_accelerate_duration; easing: MaterialAnimations.standard_easing; } + } + + function toggle() { + if !root.checkable { + return; + } + + root.checked = !root.checked; + } + + states [ + disabled when !root.enabled : { + base.display_background: false; + base.icon_color: MaterialPalette.on_surface; + } + ] +} + diff --git a/dashboard/ui/material/ui/components/date_picker.slint b/dashboard/ui/material/ui/components/date_picker.slint new file mode 100644 index 0000000..9fb4586 --- /dev/null +++ b/dashboard/ui/material/ui/components/date_picker.slint @@ -0,0 +1,585 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { BaseDialog } from "./dialog.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { Icons } from "../icons/icons.slint"; +import { MaterialText } from "./material_text.slint"; +import { StateLayer } from "./state_layer.slint"; +import { ScrollView } from "./scroll_view.slint"; +import { IconButton } from "./icon_button.slint"; +import { TextField } from "./text_field.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { ExtendedTouchArea } from "./extended_touch_area.slint"; + +// defines the interface to get the data for the DatePicker from native code. +export global DatePickerAdapter { + // returns the number of days for the given month in the given year. + pure callback month_day_count(month: int, year: int) -> int; + + // return the numbers of day to the first monday of the month. + pure callback month_offset(month: int, year: int) -> int; + + // used to format a date that is defined by day month and year. + pure callback format_date(format: string, day: int, month: int, year: int) -> string; + + // parses the given date string and returns a list of day, month and year. + pure callback parse_date(date: string, format: string) -> [int]; + + // returns true if the given date is valid. + pure callback valid_date(date: string, format: string) -> bool; + + // returns the current date as list of day, month and year. + pure callback date_now() -> [int]; +} + +export struct Date { + year: int, + month: int, + day: int, +} + +component CalendarHeaderDelegate { + in property text <=> text_label.text; + + min_width: max(MaterialStyleMetrics.size_40, content_layer.min_width); + min_height: max(MaterialStyleMetrics.size_40, content_layer.min_height); + + content_layer := VerticalLayout { + text_label := MaterialText { + vertical_alignment: center; + horizontal_alignment: center; + style: MaterialTypography.body_large; + color: MaterialPalette.on_surface; + } + } +} + +component CalendarDelegate { + in property selected; + in property today; + in property text <=> text_label.text; + in property enabled: true; + + callback clicked <=> touch_area.clicked; + + min_width: max(MaterialStyleMetrics.size_40, content_layer.min_width); + min_height: max(MaterialStyleMetrics.size_40, content_layer.min_height); + forward_focus: focus_scope; + + accessible_role: button; + accessible_checkable: true; + accessible_checked: root.selected; + accessible_label: root.text; + accessible_action_default => { touch_area.clicked(); } + + touch_area := TouchArea { + enabled: root.enabled; + } + + focus_scope := FocusScope { + width: 0px; + enabled: root.enabled; + + key_pressed(event) => { + if (event.text == " " || event.text == "\n") { + touch_area.clicked(); + return accept; + } + return reject; + } + } + + background_layer := Rectangle { + border_radius: self.height / 2; + } + + content_layer := HorizontalLayout { + text_label := MaterialText { + vertical_alignment: center; + horizontal_alignment: center; + style: MaterialTypography.body_large; + color: MaterialPalette.on_surface; + } + } + + state_layer := StateLayer { + enabled: root.enabled; + border_radius: background_layer.border_radius; + pressed: touch_area.pressed; + has_hover: touch_area.has_hover; + has_focus: focus_scope.has_focus; + } + + states [ + // FIXME: states + disabled when !root.enabled: { + root.opacity: 0.38; + } + selected when root.selected: { + background_layer.background: MaterialPalette.primary; + text_label.color: MaterialPalette.on_primary; + } + today when root.today: { + background_layer.border_width: 1px; + background_layer.border_color: MaterialPalette.primary; + } + ] +} + +export component Calendar { + in property column_count; + in property row_count; + in property delegate_size; + in property start_column; + in property <[string]> header_model; + in property month_count; + in property today; + in property selected_date; + in property display_month; + in property display_year; + + callback select_date(date: Date); + + // header + for day[index] in root.header_model: CalendarHeaderDelegate { + x: root.delegate_x(index); + y: root.delegate_y(index); + text: day; + } + + // items + for index in root.month_count: CalendarDelegate { + property d: { day: index + 1, month: root.display_month, year: root.display_year }; + + x: root.delegate_x(root.index_on_calendar(index)); + y: root.delegate_y(root.index_on_calendar(index)); + width: root.delegate_size; + height: root.delegate_size; + text: index + 1; + selected: root.selected_date == self.d; + today: root.today == self.d; + + clicked => { + root.select_date(self.d); + } + } + + function index_on_calendar(index: int) -> int { + // add column count because items starts after header row + root.column_count + root.start_column + index + } + + function row_for_index(index: int) -> int { + floor(index / root.column_count) + } + + function column_for_index(index: int) -> int { + mod(index, root.column_count) + } + + function delegate_x(index: int) -> length { + root.column_for_index(index) * root.delegate_size + root.column_for_index(index) * 1px /* * root.style.spacing */ + } + + function delegate_y(index: int) -> length { + root.row_for_index(index) * root.delegate_size + root.row_for_index(index) * 1px /* * root.style.spacing */ + } +} + +component YearSelection { + in property <[int]> model; + in property spacing; + in property visible_row_count; + in property column_count; + in property delegate_width; + in property delegate_height; + in property selected_year; + in property today_year; + + callback select_year(year: int); + + property row_height: root.height / root.visible_row_count; + property row_count: root.model.length / root.column_count; + property viewport_height: root.row_count * root.row_height; + property start_x: root.width / (root.column_count + 1); + property start_y: root.height / (root.visible_row_count + 1); + + ScrollView { + width: 100%; + height: 100%; + viewport_width: root.width; + viewport_height: root.viewport_height; + + for year[index] in root.model: CalendarDelegate { + x: root.delegate_center_x(index) - self.width / 2; + y: root.delegate_center_y(index) - self.height / 2; + width: root.delegate_width; + height: root.delegate_height; + text: year; + selected: year == root.selected_year; + today: year == root.today_year; + + clicked => { + root.select_year(year); + } + } + } + + function delegate_center_x(index: int) -> length { + root.start_x * (root.column_for_index(index) + 1) + } + + function delegate_center_y(index: int) -> length { + root.start_y * (root.row_for_index(index) + 1) + } + + function row_for_index(index: int) -> int { + floor(index / root.column_count) + } + + function column_for_index(index: int) -> int { + mod(index, root.column_count) + } +} + +export component SelectionButton { + in property text <=> text-label.text; + in property icon <=> icon-image.source; + in property enabled: true; + in-out property checked; + + callback clicked(); + + min-width: content-layer.min-width; + min-height: max(40px, content-layer.min-height); + accessible-label: root.text; + accessible-role: button; + accessible-checkable: true; + accessible-checked: root.checked; + accessible-action-default => { touch-area.clicked(); } + forward-focus: touch-area; + + touch-area := ExtendedTouchArea { + width: 100%; + height: 100%; + enabled: root.enabled; + + clicked => { + root.checked = !root.checked; + root.clicked(); + } + } + + state-layer := StateLayer { + enabled: root.enabled; + pressed: touch-area.pressed; + has-hover: touch-area.has-hover; + has-focus: touch-area.has-focus; + background: text_label.color; + } + + content-layer := HorizontalLayout { + alignment: center; + padding-left: 8px; + padding-right: 8px; + spacing: 8px; + + text-label := MaterialText { + vertical-alignment: center; + color: MaterialPalette.on_surface_variant; + style: MaterialTypography.label_large; + } + + icon-image := Image { + y: (parent.height - self.height) / 2; + width: MaterialStyleMetrics.size_18; + colorize: MaterialPalette.on_surface_variant; + transform-rotation: root.checked ? 180deg : 0; + rotation-origin-x: self.width / 2; + rotation-origin-y: self.height / 2; + + animate transform-rotation { duration: 250ms; } + } + } + + states [ + disabled when !root.enabled: { + root.opacity: 0.38; + } + ] +} + + +export component DatePickerPopup inherits PopupWindow { + in property title; + in property date: { day: today[0], month: today[1], year: today[2] }; + + callback canceled(); + callback accepted(date: Date); + + // this is used for the navigation between months + property input_title: @tr("Enter date"); + property input_placeholder_text: "mm/dd/yyyy"; + property input_format: "%m/%d/%Y"; + property cancel_text: @tr("Cancel"); + property ok_text: @tr("Ok"); + property display_date: root.date; + property current_date: root.date; + property delegate_size: 40px; + property year_delegate_width: 72px; + property calendar_column_count: 7; + property calendar_row_count: 6; + property calendar_min_width: root.delegate_size * root.calendar_column_count + (root.calendar_column_count - 1) * 1px; + property calendar_min_height: root.delegate_size * (root.calendar_row_count + 1) + (root.calendar_row_count - 1) * 1px; + property year_selection_column_count: 3; + property year_selection_row_count: 5; + property year_selection; + property selection_mode: true; + property current_input; + + property calendar_month_count: DatePickerAdapter.month_day_count(root.display_date.month, root.display_date.year); + property <[string]> calendar_header_model: [ + @tr("One-letter abbrev for Sunday" => "S"), + @tr("One-letter abbrev for Monday" => "M"), + @tr("One-letter abbrev for Tuesday" => "T"), + @tr("One-letter abbrev for Wednesday" => "W"), + @tr("One-letter abbrev for Thursday" => "T"), + @tr("One-letter abbrev for Friday" => "F"), + @tr("One-letter abbrev for Saturday" => "S"), + ]; + property <[int]> today: DatePickerAdapter.date_now(); + property start_column: DatePickerAdapter.month_offset(root.display_date.month, root.display_date.year); + property current_month: DatePickerAdapter.format_date("%B %Y", root.display_date.day, root.display_date.month, root.display_date.year); + property <[int]> year_model: [ + 2024, + 2025, + 2026, + 2027, + 2028, + 2029, + 2031, + 2032, + 2033, + 2034, + 2035, + 2036, + 2037, + 2038, + 2039, + 2040, + 2041, + 2042, + 2043 + ]; + property selected_year: root.display_date.year; + property today_year: root.today[2]; + property current_day: DatePickerAdapter.format_date("%a, %b %d", root.current_date.day, root.current_date.month, root.current_date.year); + property <[int]> input_formatted: DatePickerAdapter.parse_date(root.current_input, root.input_format); + + close_policy: no_auto_close; + forward_focus: base; + + base := BaseDialog { + width: 100%; + height: 100%; + title: root.title; + actions: [root.cancel_text, root.ok_text]; + + content_layer := VerticalLayout { + spacing: MaterialStyleMetrics.spacing_12; + + header := HorizontalLayout { + MaterialText { + text: root.selection_mode ? root.current_day : root.input_title; + horizontal_alignment: left; + vertical_alignment: center; + style: MaterialTypography.headline_large; + } + + if root.selection_mode: IconButton { + icon: Icons.edit; + accessible_label: "Toggle selection mode"; + + clicked => { + root.toggle_selection_mode(); + } + } + } + + Rectangle { + height: 1px; + background: MaterialPalette.outline; + } + + if root.selection_mode: HorizontalLayout { + // FIXME: spacing + + VerticalLayout { + horizontal_stretch: 0; + alignment: center; + + SelectionButton { + text: root.current_month; + icon: Icons.arrow_drop_down; + checked <=> root.year_selection; + } + } + + Rectangle { } + + IconButton { + icon: Icons.chevron_backward; + accessible_label: "Previous month"; + + clicked => { + root.show_previous(); + } + } + + IconButton { + icon: Icons.chevron_forward; + accessible_label: "Next month"; + + clicked => { + root.show_next(); + } + } + } + + if root.selection_mode: VerticalLayout { + if !root.year_selection: Calendar { + min_width: root.calendar_min_width; + min_height: root.calendar_min_height; + column_count: root.calendar_column_count; + row_count: root.calendar_row_count; + delegate_size: root.delegate_size; + header_model: root.calendar_header_model; + month_count: root.calendar_month_count; + today: { day: root.today[0], month: root.today[1], year: root.today[2] }; + selected_date <=> root.current_date; + start_column: root.start_column; + display_month: root.display_date.month; + display_year: root.display_date.year; + + select_date(date) => { + root.select_date(date); + } + } + + if root.year_selection: YearSelection { + min_width: root.calendar_min_width; + min_height: root.calendar_min_height; + column_count: root.year_selection_column_count; + visible_row_count: root.year_selection_row_count; + delegate_width: root.year_delegate_width; + delegate_height: root.delegate_size; + model: root.year_model; + selected_year: root.selected_year; + today_year: root.today_year; + + select_year(year) => { + root.select_year(year); + } + } + } + + Rectangle { + height: 1px; + visible: root.year_selection; + background: MaterialPalette.outline; + } + + if !root.selection_mode: TextField { + text <=> root.current_input; + placeholder_text: root.input_placeholder_text; + trailing_icon: Icons.calendar_today; + + trailing_icon_clicked => { + root.toggle_selection_mode(); + } + } + } + + action_clicked(index) => { + // cancel + if index == 0 { + root.close(); + root.canceled(); + } else if index == 1 { + root.accepted(root.date); + } + } + + close => { + root.close(); + } + } + + changed date => { + root.display_date = root.date; + root.current_date = root.date; + } + + changed selection_mode => { + // check switch from input mode if input is valid + if root.selection_mode && root.current_input_valid() { + root.current_date = root.input_as_date(); + root.display_date = root.current_date; + } + } + + pure public function ok_enabled() -> bool { + root.selection_mode || root.current_input_valid() + } + + public function get_current_date() -> Date { + if root.selection_mode { + return root.current_date; + } + root.input_as_date() + } + + pure function current_input_valid() -> bool { + DatePickerAdapter.valid_date(root.current_input, root.input_format) + } + + pure function input_as_date() -> Date { + { + day: root.input_formatted[0], + month: root.input_formatted[1], + year: root.input_formatted[2] + } + } + + function select_date(date: Date) { + root.current_date = date; + } + + function select_year(year: int) { + root.current_date = { day: 1, month: 1, year: year }; + root.display_date = root.current_date; + root.year_selection = false; + } + + function show_next() { + if root.display_date.month >= 12 { + root.display_date = { day: 1, month: 1, year: root.display_date.year + 1 }; + return; + } + root.display_date = { day: 1, month: root.display_date.month + 1, year: root.display_date.year }; + } + + function show_previous() { + if root.display_date.month <= 1 { + root.display_date = { day: 1, month: 12, year: root.display_date.year - 1 }; + return; + } + root.display_date = { day: 1, month: root.display_date.month - 1, year: root.display_date.year }; + } + + function toggle_selection_mode() { + root.selection_mode = !root.selection_mode; + } +} diff --git a/dashboard/ui/material/ui/components/dialog.slint b/dashboard/ui/material/ui/components/dialog.slint new file mode 100644 index 0000000..fcdd916 --- /dev/null +++ b/dashboard/ui/material/ui/components/dialog.slint @@ -0,0 +1,233 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { TextButton } from "./text_button.slint"; +import { FilledButton } from "./filled_button.slint"; +import { MaterialText } from "./material_text.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { Modal } from "./modal.slint"; +import { Icon } from "./icon.slint"; +import { IconButton } from "./icon_button.slint"; +import { Icons } from "../icons/icons.slint"; + +export component FullscreenDialog inherits PopupWindow { + in property title; + in property <[string]> actions; + + callback action_clicked(index: int); + + close_policy: no_auto_close; + forward_focus: focus_scope; + + focus_scope := FocusScope { + x: 0; + width: 0; + + key_pressed(event) => { + if event.text == Key.Escape { + root.close(); + return accept; + } + + reject + } + } + + background_layer := Rectangle { + width: 100%; + height: 100%; + opacity: 0; + background: MaterialPalette.surface; + + VerticalLayout { + spacing: MaterialStyleMetrics.spacing_16; + + HorizontalLayout { + padding: MaterialStyleMetrics.padding_24; + spacing: MaterialStyleMetrics.spacing_16; + vertical_stretch: 0; + + IconButton { + icon: Icons.close; + + clicked => { + root.close(); + } + } + + MaterialText { + text: root.title; + style: MaterialTypography.headline_small; + color: MaterialPalette.on_surface; + vertical_alignment: center; + } + + for action[index] in root.actions : TextButton { + text: action; + + clicked => { + root.action_clicked(index); + } + } + } + + @children + + } + } + + Timer { + interval: 50ms; + + triggered => { + background_layer.opacity = 1; + self.running = false; + } + } +} + +export component BaseDialog { + in property title; + in property icon; + in property <[image]> action_button_icons; + in property default_action_text; + in property <[string]> actions; + + property has_icon: root.icon.width > 0 && root.icon.height > 0; + + callback default_action_clicked(); + callback action_button_clicked(index: int); + callback action_clicked(index: int); + callback close(); + + forward_focus: focus_scope; + + focus_scope := FocusScope { + x: 0; + width: 0; + + key_pressed(event) => { + if event.text == Key.Return && root.default_action_text != "" { + root.default_action_clicked(); + return accept; + } + + if event.text == Key.Escape { + root.close(); + return accept; + } + + reject + } + } + + modal := Modal { + width: 100%; + height: 100%; + + background_layer := Rectangle { + x: (parent.width - self.width) / 2; + y: (parent.height - self.height) / 2; + width: layout.min_width; + height: layout.min_height; + opacity: 0; + border_radius: MaterialStyleMetrics.border_radius_28; + background: MaterialPalette.surface_container_high; + + TouchArea { + layout := VerticalLayout { + padding: MaterialStyleMetrics.padding_24; + spacing: MaterialStyleMetrics.spacing_16; + + if root.has_icon : Icon { + x: (parent.width - self.width) / 2; + colorize: MaterialPalette.on_surface; + source: root.icon; + } + + if root.title != "" : MaterialText { + horizontal_alignment: root.has_icon ? center : left; + text: root.title; + style: MaterialTypography.headline_small; + color: MaterialPalette.on_surface; + } + + @children + + HorizontalLayout { + spacing: MaterialStyleMetrics.spacing_8; + + for action_button[index] in root.action_button_icons : IconButton { + icon: action_button; + + clicked => { + root.action_button_clicked(index); + } + } + + // Spacer + Rectangle {} + + for action[index] in root.actions : TextButton { + text: action; + + clicked => { + root.action_clicked(index); + } + } + + if root.default_action_text != "" : FilledButton { + text: root.default_action_text; + + clicked => { + root.default_action_clicked(); + } + } + } + } + } + + animate opacity { duration: MaterialAnimations.opacity_duration; easing: MaterialAnimations.opacity_easing; } + } + + clicked => { + root.close(); + } + } + + Timer { + interval: 50ms; + + triggered => { + background_layer.opacity = 1; + self.running = false; + } + } +} + +export component Dialog inherits PopupWindow { + in property title <=> base.title; + in property icon <=> base.icon; + in property default_action_text <=> base.default_action_text; + in property <[string]> actions <=> base.actions; + + callback default_action_clicked <=> base.default_action_clicked; + callback action_clicked <=> base.action_clicked; + + close_policy: no_auto_close; + forward_focus: base; + + base := BaseDialog { + width: 100%; + height: 100%; + + @children + + close => { + root.close(); + } + } +} diff --git a/dashboard/ui/material/ui/components/divider.slint b/dashboard/ui/material/ui/components/divider.slint new file mode 100644 index 0000000..c7b9498 --- /dev/null +++ b/dashboard/ui/material/ui/components/divider.slint @@ -0,0 +1,28 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialPalette } from "../styling/material_palette.slint"; + +component BaseDivider { + Rectangle { + background: MaterialPalette.outline_variant; + } +} + +export component VerticalDivider { + width: 1px; + + BaseDivider { + width: 100%; + height: 100%; + } +} + +export component HorizontalDivider { + height: 1px; + + BaseDivider { + width: 100%; + height: 100%; + } +} diff --git a/dashboard/ui/material/ui/components/drawer.slint b/dashboard/ui/material/ui/components/drawer.slint new file mode 100644 index 0000000..5938d44 --- /dev/null +++ b/dashboard/ui/material/ui/components/drawer.slint @@ -0,0 +1,89 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialText } from "./material_text.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { Modal } from "./modal.slint"; + +export component DrawerHeader { + in property title; + + min_height: max(MaterialStyleMetrics.size_56, title_label.min_width); + + title_label := MaterialText { + x: MaterialStyleMetrics.padding_16; + width: root.width - MaterialStyleMetrics.padding_16; + text: root.title; + color: MaterialPalette.on_surface_variant; + vertical_alignment: center; + style: MaterialTypography.title_small; + } +} + +export component Drawer { + in property title; + + min_width: max(MaterialStyleMetrics.size_360, layout.min_width); + + TouchArea { + + Rectangle { + background: MaterialPalette.surface_container_low; + border_radius: MaterialStyleMetrics.border_radius_16; + + layout := VerticalLayout { + alignment: start; + padding: MaterialStyleMetrics.padding_12; + + if root.title != "" : DrawerHeader { + width: 100%; + title: root.title; + } + + @children + } + } + } +} + +export component ModalDrawer inherits PopupWindow { + in property position_right; + in property title; + + close_policy: no_auto_close; + + modal := Modal { + width: 100%; + height: 100%; + + drawer := Drawer { + x: root.position_right ? parent.width : -self.width; + y: 0; + height: 100%; + title: root.title; + + @children + + animate x { + duration: MaterialAnimations.standard_accelerate_duration; + easing: MaterialAnimations.standard_easing; + } + } + + clicked => { + root.close(); + } + } + + Timer { + interval: 50ms; + + triggered => { + drawer.x = root.position_right ? root.width - drawer.width : 0; + self.running = false; + } + } +} diff --git a/dashboard/ui/material/ui/components/drop_down_menu.slint b/dashboard/ui/material/ui/components/drop_down_menu.slint new file mode 100644 index 0000000..7f96101 --- /dev/null +++ b/dashboard/ui/material/ui/components/drop_down_menu.slint @@ -0,0 +1,125 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { TextField } from "./text_field.slint"; +import { MenuItem } from "../items/menu_item.slint"; +import { Icons } from "../icons/icons.slint"; +import { MenuInner } from "./menu.slint"; +import { StateLayer } from "./state_layer.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { ScrollView } from "./scroll_view.slint"; + +export component DropDownMenu { + in property label <=> text_field.label; + in property enabled <=> text_field.enabled; + in property leading_icon <=> text_field.leading_icon; + in property <[MenuItem]> items; + in_out property current_index: -1; + + callback selected(index: int); + + property item_height: MaterialStyleMetrics.size_56; + property max_displayed_items: 6; + property text <=> text_field.text; + + min_width: text_field.min_width; + min_height: text_field.min_height; + forward_focus: text_field; accessible-role: combobox; + accessible_enabled: root.enabled; + accessible_expandable: true; + accessible_value <=> text_field.text; + accessible_action_expand => { menu.show(); } + + text_field := TextField { + width: 100%; + height: 100%; + trailing_icon: Icons.arrow_drop_down; + read_only: true; + } + + state_layer := StateLayer { + width: 100%; + height: 100%; + background: MaterialPalette.on_surface; + has_hover: touch_area.has_hover; + enabled: root.enabled; + } + + touch_area := TouchArea { + width: 100%; + height: 100%; + enabled: root.enabled; + + clicked => { + menu.show(); + } + } + + menu := PopupWindow { + x: 0; + width: root.width; + close_policy: close_on_click_outside; + forward_focus: inner_text_field; + + VerticalLayout { + alignment: start; + + inner_text_field := TextField { + width: root.width; + leading_icon: root.leading_icon; + trailing_icon: Icons.arrow_drop_up; + text: root.text; + label: root.label; + read_only: true; + + leading_icon_clicked => { + menu.close(); + } + + trailing_icon_clicked => { + menu.close(); + } + } + + Rectangle { + width: 100%; + height: min(max(root.item_height, items.length * root.item_height), root.max_displayed_items * root.item_height); + background: MaterialPalette.surface_container; + + ScrollView { + VerticalLayout { + menu_inner := MenuInner { + current_index: root.current_index; + items: root.items; + + activated(index) => { + root.update_selection(index); + } + } + } + } + } + } + } + + function update_selection(index: int) { + root.update_text(index); + root.current_index = index; + menu.close(); + root.selected(index); + } + + function update_text(index: int) { + if index < 0 || root.current_index >= root.items.length { + text_field.text = ""; + return; + } + + text_field.text = root.items[index].text; + } + + changed current_index => { + root.update_text(root.current_index); + } +} diff --git a/dashboard/ui/material/ui/components/elevated_button.slint b/dashboard/ui/material/ui/components/elevated_button.slint new file mode 100644 index 0000000..fbfb809 --- /dev/null +++ b/dashboard/ui/material/ui/components/elevated_button.slint @@ -0,0 +1,45 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { Elevation } from "./elevation.slint"; +import { BaseButton } from "./base_button.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; + +export component ElevatedButton { + in property icon <=> base.icon; + in property text <=> base.text; + in property tooltip <=> base.tooltip; + in property enabled <=> base.enabled; + + callback clicked <=> base.clicked; + + accessible-role: button; + accessible-enabled: root.enabled; + accessible-label: root.text == "" ? root.tooltip : root.text; + accessible-action-default => { base.clicked(); } + + elevation := Elevation { + border_radius: root.height / 2; + background: MaterialPalette.surface_container_low; + level: 1; + width: 100%; + height: 100%; + } + + base := BaseButton { + border_radius: elevation.border_radius; + color: MaterialPalette.primary; + } + + states [ + disabled when !root.enabled : { + elevation.background: transparent; + elevation.level: 0; + base.color: MaterialPalette.on_surface; + } + hover when base.has_hover && !base.pressed && !base.enter_pressed : { + elevation.level: 3; + } + ] +} diff --git a/dashboard/ui/material/ui/components/elevation.slint b/dashboard/ui/material/ui/components/elevation.slint new file mode 100644 index 0000000..9fc8596 --- /dev/null +++ b/dashboard/ui/material/ui/components/elevation.slint @@ -0,0 +1,108 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { Palette } from "std-widgets.slint"; +import { MaterialWindow } from "material_window.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; + +export component Elevation { + in property background; + in property border_radius; + in property level; + + property dark: Palette.color_scheme == ColorScheme.dark; + + outer_shadow := Rectangle { + border_radius: root.border_radius; + + inner_shadow := Rectangle { + border_radius: root.border_radius; + background: root.background; + + @children + } + } + + states [ + level_1_light when root.level == 1 && !root.dark: { + outer_shadow.drop_shadow_offset_y: 1px; + outer_shadow.drop_shadow_blur: 2px; + outer_shadow.drop_shadow_color: MaterialPalette.shadow_30; + inner_shadow.drop_shadow_offset_y: 1px; + inner_shadow.drop_shadow_blur: 2px; + inner_shadow.drop_shadow_color: MaterialPalette.shadow_15; + } + level_2_light when root.level == 2 && !root.dark: { + outer_shadow.drop_shadow_offset_y: 1px; + outer_shadow.drop_shadow_blur: 2px; + outer_shadow.drop_shadow_color: MaterialPalette.shadow_30; + inner_shadow.drop_shadow_offset_y: 2px; + inner_shadow.drop_shadow_blur: 6px; + inner_shadow.drop_shadow_color: MaterialPalette.shadow_15; + } + level_3_light when root.level == 3 && !root.dark: { + outer_shadow.drop_shadow_offset_y: 4px; + outer_shadow.drop_shadow_blur: 8px; + outer_shadow.drop_shadow_color: MaterialPalette.shadow_15; + inner_shadow.drop_shadow_offset_y: 1px; + inner_shadow.drop_shadow_blur: 3px; + inner_shadow.drop_shadow_color: MaterialPalette.shadow_30; + } + level_4_light when root.level == 4 && !root.dark: { + outer_shadow.drop_shadow_offset_y: 6px; + outer_shadow.drop_shadow_blur: 10px; + outer_shadow.drop_shadow_color: MaterialPalette.shadow_15; + inner_shadow.drop_shadow_offset_y: 2px; + inner_shadow.drop_shadow_blur: 3px; + inner_shadow.drop_shadow_color: MaterialPalette.shadow_30; + } + level_5_light when root.level == 5 && !root.dark: { + outer_shadow.drop_shadow_offset_y: 8px; + outer_shadow.drop_shadow_blur: 12px; + outer_shadow.drop_shadow_color: MaterialPalette.shadow_15; + inner_shadow.drop_shadow_offset_y: 4px; + inner_shadow.drop_shadow_blur: 4px; + inner_shadow.drop_shadow_color: MaterialPalette.shadow_30; + } + level_1_dark when root.level == 1 && root.dark: { + outer_shadow.drop_shadow_offset_y: 1px; + outer_shadow.drop_shadow_blur: 3px; + outer_shadow.drop_shadow_color: MaterialPalette.shadow_15; + inner_shadow.drop_shadow_offset_y: 1px; + inner_shadow.drop_shadow_blur: 2px; + inner_shadow.drop_shadow_color: MaterialPalette.shadow_30; + } + level_2_dark when root.level == 2 && root.dark: { + outer_shadow.drop_shadow_offset_y: 2px; + outer_shadow.drop_shadow_blur: 6px; + outer_shadow.drop_shadow_color: MaterialPalette.shadow_15; + inner_shadow.drop_shadow_offset_y: 1px; + inner_shadow.drop_shadow_blur: 2px; + inner_shadow.drop_shadow_color: MaterialPalette.shadow_30; + } + level_3_dark when root.level == 3 && root.dark: { + outer_shadow.drop_shadow_offset_y: 4px; + outer_shadow.drop_shadow_blur: 8px; + outer_shadow.drop_shadow_color: MaterialPalette.shadow_15; + inner_shadow.drop_shadow_offset_y: 1px; + inner_shadow.drop_shadow_blur: 3px; + inner_shadow.drop_shadow_color: MaterialPalette.shadow_30; + } + level_4_dark when root.level == 4 && root.dark: { + outer_shadow.drop_shadow_offset_y: 6px; + outer_shadow.drop_shadow_blur: 10px; + outer_shadow.drop_shadow_color: MaterialPalette.shadow_15; + inner_shadow.drop_shadow_offset_y: 2px; + inner_shadow.drop_shadow_blur: 3px; + inner_shadow.drop_shadow_color: MaterialPalette.shadow_30; + } + level_5_dark when root.level == 5 && root.dark: { + outer_shadow.drop_shadow_offset_y: 8px; + outer_shadow.drop_shadow_blur: 12px; + outer_shadow.drop_shadow_color: MaterialPalette.shadow_15; + inner_shadow.drop_shadow_offset_y: 4px; + inner_shadow.drop_shadow_blur: 4px; + inner_shadow.drop_shadow_color: MaterialPalette.shadow_30; + } + ] +} diff --git a/dashboard/ui/material/ui/components/extended_touch_area.slint b/dashboard/ui/material/ui/components/extended_touch_area.slint new file mode 100644 index 0000000..5108c7c --- /dev/null +++ b/dashboard/ui/material/ui/components/extended_touch_area.slint @@ -0,0 +1,57 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { ToolTip } from "tooltip.slint"; + +export component ExtendedTouchArea inherits TouchArea { + in property tooltip; + in property tooltip_offset; + out property has_focus <=> focus_scope.has_focus; + out property enter_pressed; + + callback key_pressed(KeyEvent) -> EventResult; + + forward-focus: focus-scope; + + focus_scope := FocusScope { + x: 0; + width: 0px; + enabled: root.enabled; + + key_pressed(event) => { + if !root.enabled { + return reject; + } + + if (event.text == " " || event.text == "\n") && !root.enter_pressed { + root.enter_pressed = true; + root.clicked(); + return accept; + } + + root.key_pressed(event) + } + + key_released(event) => { + if !root.enabled { + return reject; + } + + if (event.text == " " || event.text == "\n") && root.enter_pressed { + root.enter_pressed = false; + return accept; + } + + reject + } + } + + @children + + if root.tooltip != "" && root.has-hover && !root.pressed : ToolTip { + y: root.tooltip_offset; + text: root.tooltip; + } +} diff --git a/dashboard/ui/material/ui/components/filled_button.slint b/dashboard/ui/material/ui/components/filled_button.slint new file mode 100644 index 0000000..e2b503f --- /dev/null +++ b/dashboard/ui/material/ui/components/filled_button.slint @@ -0,0 +1,43 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { Elevation } from "./elevation.slint"; +import { BaseButton } from "./base_button.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; + +export component FilledButton { + in property icon <=> base.icon; + in property text <=> base.text; + in property tooltip <=> base.tooltip; + in property enabled <=> base.enabled; + + callback clicked <=> base.clicked; + + accessible-role: button; + accessible-enabled: root.enabled; + accessible-label: root.text == "" ? root.tooltip : root.text; + accessible-action-default => { base.clicked(); } + + elevation := Elevation { + border_radius: root.height / 2; + background: MaterialPalette.primary; + width: 100%; + height: 100%; + } + + base := BaseButton { + border_radius: elevation.border_radius; + color: MaterialPalette.on_primary; + } + + states [ + disabled when !root.enabled : { + elevation.background: transparent; + base.color: MaterialPalette.on_surface; + } + hover when base.has_hover && !base.pressed && !base.enter_pressed : { + elevation.level: 1; + } + ] +} diff --git a/dashboard/ui/material/ui/components/filled_icon_button.slint b/dashboard/ui/material/ui/components/filled_icon_button.slint new file mode 100644 index 0000000..0f6f096 --- /dev/null +++ b/dashboard/ui/material/ui/components/filled_icon_button.slint @@ -0,0 +1,64 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { Elevation } from "./elevation.slint"; +import { BaseButton } from "./base_button.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; + +export component FilledIconButton { + in property icon; + in property checked_icon: root.icon; + in property checkable; + in_out property checked; + in property tooltip <=> base.tooltip; + in property enabled <=> base.enabled; + + callback clicked(); + + accessible-role: button; + accessible-enabled: true; + accessible-label: root.tooltip; + accessible-checkable: root.checkable; + accessible-checked: root.checked; + accessible-action-default => { base.clicked(); } + + background_layer := Rectangle { + width: 100%; + height: 100%; + border_radius: base.border_radius; + background: root.checkable ? MaterialPalette.surface_container_highest : MaterialPalette.primary; + visible: root.enabled; + } + + base := BaseButton { + icon: root.checked ? root.checked_icon : root.icon; + border_radius: self.height / 2; + color: !root.enabled ? MaterialPalette.on_surface_variant : root.checkable ? MaterialPalette.primary : MaterialPalette.on_primary; + button_horizontal_padding: 0; + button_vertical_padding: 0; + width: self.height; + icon_size: MaterialStyleMetrics.icon_size_24; + + clicked => { + root.toggle(); + root.clicked(); + } + } + + function toggle() { + if !root.checkable { + return; + } + + root.checked = !root.checked; + } + + states [ + checked when root.enabled && root.checked : { + base.color: MaterialPalette.on_primary; + background_layer.background: MaterialPalette.primary; + } + ] +} diff --git a/dashboard/ui/material/ui/components/floating_action_button.slint b/dashboard/ui/material/ui/components/floating_action_button.slint new file mode 100644 index 0000000..32077f7 --- /dev/null +++ b/dashboard/ui/material/ui/components/floating_action_button.slint @@ -0,0 +1,55 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { Elevation } from "./elevation.slint"; +import { BaseButton } from "./base_button.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; + +export enum FABStyle { + small, + standard, + large +} + +export component FloatingActionButton { + in property icon <=> base.icon; + in property text <=> base.text; + in property tooltip <=> base.tooltip; + in property style; + + callback clicked <=> base.clicked; + + accessible-role: button; + accessible-enabled: true; + accessible-label: root.text == "" ? root.tooltip : root.text; + accessible-action-default => { base.clicked(); } + + elevation := Elevation { + border_radius: root.style == FABStyle.small ? MaterialStyleMetrics.border_radius_12 : + root.style == FABStyle.standard ? MaterialStyleMetrics.border_radius_16 : MaterialStyleMetrics.border_radius_28; + background: MaterialPalette.primary; + level: 3; + width: 100%; + height: 100%; + } + + base := BaseButton { + border_radius: elevation.border_radius; + color: MaterialPalette.on_primary; + button_vertical_padding: root.style == FABStyle.small ? MaterialStyleMetrics.padding_10 : + root.style == FABStyle.standard ? MaterialStyleMetrics.padding_14 : MaterialStyleMetrics.padding_30; + button_horizontal_padding: self.button_vertical_padding; + min_layout_width: self.min_layout_height; + min_layout_height: root.style == FABStyle.small ? MaterialStyleMetrics.size_40 : + root.style == FABStyle.standard ? MaterialStyleMetrics.size_56 : MaterialStyleMetrics.size_90; + icon_size: root.style != FABStyle.large ? MaterialStyleMetrics.icon_size_24 : MaterialStyleMetrics.icon_size_36; + } + + states [ + hover when base.has_hover : { + elevation.level: 4; + } + ] +} diff --git a/dashboard/ui/material/ui/components/grid.slint b/dashboard/ui/material/ui/components/grid.slint new file mode 100644 index 0000000..9c82f56 --- /dev/null +++ b/dashboard/ui/material/ui/components/grid.slint @@ -0,0 +1,10 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; + +export component Grid inherits GridLayout { + padding: MaterialStyleMetrics.padding_8; + spacing_vertical: MaterialStyleMetrics.spacing_8; + spacing_horizontal: MaterialStyleMetrics.spacing_8; +} diff --git a/dashboard/ui/material/ui/components/horizontal.slint b/dashboard/ui/material/ui/components/horizontal.slint new file mode 100644 index 0000000..bddf801 --- /dev/null +++ b/dashboard/ui/material/ui/components/horizontal.slint @@ -0,0 +1,9 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; + +export component Horizontal inherits HorizontalLayout { + padding: MaterialStyleMetrics.padding_8; + spacing: MaterialStyleMetrics.spacing_8; +} diff --git a/dashboard/ui/material/ui/components/icon.slint b/dashboard/ui/material/ui/components/icon.slint new file mode 100644 index 0000000..4d23105 --- /dev/null +++ b/dashboard/ui/material/ui/components/icon.slint @@ -0,0 +1,11 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; + +export component Icon inherits Image { + width: MaterialStyleMetrics.icon_size_18; + height: self.width; + colorize: MaterialPalette.on_background; +} diff --git a/dashboard/ui/material/ui/components/icon_button.slint b/dashboard/ui/material/ui/components/icon_button.slint new file mode 100644 index 0000000..9b2625a --- /dev/null +++ b/dashboard/ui/material/ui/components/icon_button.slint @@ -0,0 +1,62 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { Elevation } from "./elevation.slint"; +import { BaseButton } from "./base_button.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; + +export component IconButton { + in property icon; + in property checked_icon: root.icon; + in property checkable; + in_out property checked; + in property tooltip <=> base.tooltip; + in property enabled <=> base.enabled; + in property inverse; + in property inline: false; + in property has_error; + + callback clicked(); + + accessible-role: button; + accessible-enabled: true; + accessible-label: root.tooltip; + accessible-checkable: root.checkable; + accessible-checked: root.checked; + accessible-action-default => { base.clicked(); } + + base := BaseButton { + icon: root.checked ? root.checked_icon : root.icon; + border_radius: self.height / 2; + color: root.has_error ? MaterialPalette.error : root.inverse ? MaterialPalette.inverse_on_surface : MaterialPalette.on_surface_variant; + button_horizontal_padding: 0; + button_vertical_padding: 0; + width: self.height; + display_background: false; + icon_size: root.inline ? MaterialStyleMetrics.icon_size_18 : MaterialStyleMetrics.icon_size_24; + min_layout_width: root.inline ? MaterialStyleMetrics.icon_size_18 : MaterialStyleMetrics.size_40; + min_layout_height: self.min_layout_width; + clip_ripple: !root.inline; + + clicked => { + root.toggle(); + root.clicked(); + } + } + + function toggle() { + if !root.checkable { + return; + } + + root.checked = !root.checked; + } + + states [ + checked when root.enabled && root.checked : { + base.color: MaterialPalette.primary; + } + ] +} diff --git a/dashboard/ui/material/ui/components/list.slint b/dashboard/ui/material/ui/components/list.slint new file mode 100644 index 0000000..8e7bd68 --- /dev/null +++ b/dashboard/ui/material/ui/components/list.slint @@ -0,0 +1,107 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { StateLayerArea } from "./state_layer.slint"; +import { MaterialText } from "./material_text.slint"; +import { Icon } from "./icon.slint"; + +export component Avatar { + in property image; + in property background: MaterialPalette.primary; + + width: MaterialStyleMetrics.size_32; + height: self.width; + + Rectangle { + width: 100%; + height: 100%; + border_radius: self.width / 2; + background: root.background; + clip: true; + + Image { + source: root.image; + } + } +} + +export component ListTile { + in property text; + in property supporting_text; + in property avatar_icon; + in property avatar_text; + in property avatar_background; + in property avatar_foreground; + in property enabled <=> state_layer.enabled; + + property color: MaterialPalette.on_surface; + + callback clicked <=> state_layer.clicked; + + min_height: max(MaterialStyleMetrics.size_72, layout.min_height); + + state_layer := StateLayerArea { + color: root.color; + + layout := HorizontalLayout { + padding_left: MaterialStyleMetrics.padding_16; + padding_right: MaterialStyleMetrics.padding_24; + padding_top: MaterialStyleMetrics.padding_8; + padding_bottom: self.padding_top; + spacing: MaterialStyleMetrics.spacing_16; + + if root.avatar_background != #00000000 || root.avatar_text != "" || (root.avatar_icon.width > 0 && root.avatar_icon.height > 0) : Rectangle { + width: self.height; + border_radius: self.height / 2; + background: root.avatar_background; + clip: true; + + if root.avatar_text != "" : MaterialText { + text: root.avatar_text; + vertical_alignment: center; + horizontal_alignment: center; + color: root.avatar_foreground; + style: MaterialTypography.title_medium; + } + + if root.avatar_icon.width > 0 && root.avatar_icon.height > 0 : Icon { + width: parent.width; + source: root.avatar_icon; + colorize: root.avatar_foreground; + } + } + + title_layout := VerticalLayout { + alignment: center; + horizontal_stretch: 1; + + MaterialText { + text: root.text; + color: root.color; + overflow: elide; + style: MaterialTypography.body_large; + } + + if root.supporting_text != "" : MaterialText { + text: root.supporting_text; + color: root.color; + overflow: elide; + style: MaterialTypography.body_medium; + } + } + + @children + } + } + + states [ + disabled when !root.enabled : { + state_layer.display_background: false; + title_layout.opacity: 38%; + } + ] +} + diff --git a/dashboard/ui/material/ui/components/list_view.slint b/dashboard/ui/material/ui/components/list_view.slint new file mode 100644 index 0000000..aeb847f --- /dev/null +++ b/dashboard/ui/material/ui/components/list_view.slint @@ -0,0 +1,8 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { ScrollView } from "./scroll_view.slint"; + +export component ListView inherits ScrollView { + +} diff --git a/dashboard/ui/material/ui/components/material_text.slint b/dashboard/ui/material/ui/components/material_text.slint new file mode 100644 index 0000000..4aa5c20 --- /dev/null +++ b/dashboard/ui/material/ui/components/material_text.slint @@ -0,0 +1,14 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialTypography, TextStyle } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; + +export component MaterialText inherits Text { + in property style: MaterialTypography.body_medium; + + font_size: root.style.font_size; + font_weight: root.style.font_weight; + color: MaterialPalette.on_background; + overflow: elide; +} diff --git a/dashboard/ui/material/ui/components/material_window.slint b/dashboard/ui/material/ui/components/material_window.slint new file mode 100644 index 0000000..a861ac0 --- /dev/null +++ b/dashboard/ui/material/ui/components/material_window.slint @@ -0,0 +1,18 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialPalette } from "../styling/material_palette.slint"; + +export global MaterialWindowAdapter { + in property disable_hover; +} + +export component MaterialWindow inherits Window { + in property disable_hover; + + background: MaterialPalette.background; + + changed disable_hover => { + MaterialWindowAdapter.disable_hover = root.disable_hover; + } +} diff --git a/dashboard/ui/material/ui/components/menu.slint b/dashboard/ui/material/ui/components/menu.slint new file mode 100644 index 0000000..f04da7a --- /dev/null +++ b/dashboard/ui/material/ui/components/menu.slint @@ -0,0 +1,136 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { Elevation } from "elevation.slint"; +import { StateLayerArea } from "./state_layer.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { Icon } from "./icon.slint"; +import { MenuItem } from "../items/menu_item.slint"; +import { MaterialText } from "./material_text.slint"; +import { Icons } from "../icons/icons.slint"; + +component MenuItemTemplate { + in property icon; + in property text; + in property trailing_text; + in property enabled <=> state_area.enabled; + in property selected; + + callback clicked(); + + property has_icon: root.icon.width > 0 && root.icon.height > 0; + property color: MaterialPalette.on_surface; + property color_variant: MaterialPalette.on_surface_variant; + + min_height: max(MaterialStyleMetrics.size_56, layout.min_height); + + background_layer := Rectangle { + state_area := StateLayerArea { + color: root.color; + + layout := HorizontalLayout { + padding_left: MaterialStyleMetrics.padding_12; + padding_right: self.padding_left; + padding_top: MaterialStyleMetrics.padding_8; + padding_bottom: self.padding_top; + spacing: MaterialStyleMetrics.spacing_12; + + if root.has_icon : VerticalLayout { + alignment: center; + + Icon { + source: root.icon; + colorize: root.color; + } + } + + MaterialText { + horizontal_stretch: 1; + text: root.text; + style: MaterialTypography.body_large; + color: root.color; + vertical_alignment: center; + } + + if root.trailing_text != "" : MaterialText { + text: root.trailing_text; + style: MaterialTypography.body_large; + color: root.color_variant; + vertical_alignment: center; + } + } + + clicked => { + root.clicked(); + } + } + } + + states [ + disabled when !root.enabled : { + state_area.opacity: MaterialPalette.disable_opacity; + } + selected when root.selected : { + background_layer.background: MaterialPalette.surface_container_highest; + } + ] +} + +export component MenuInner { + in property <[MenuItem]> items; + in_out property current_index: -1; + + callback activated(index: int); + + // used to fix clipping of shadows + out property elevation: 2; + + menu := Elevation { + width: 100%; + level: root.elevation; + height: layout.min_height + root.elevation * 1px; + border_radius: MaterialStyleMetrics.border_radius_4; + background: MaterialPalette.surface_container; + + layout := VerticalLayout { + width: root.width; + padding_top: MaterialStyleMetrics.padding_8; + padding_bottom: self.padding_top; + + for item[index] in root.items : MenuItemTemplate { + icon: item.icon; + text: item.text; + trailing_text: item.trailing_text; + enabled: item.enabled; + selected: index == root.current_index; + + clicked => { + root.activated(index); + } + } + } + } +} + +export component PopupMenu inherits PopupWindow { + in property <[MenuItem]> items; + + callback activated(index: int); + + width: MaterialStyleMetrics.size_200; + close_policy: close_on_click_outside; + + VerticalLayout { + padding: inner.elevation * 1px; + + inner := MenuInner { + items: root.items; + + activated(index) => { + root.activated(index); + } + } + } +} diff --git a/dashboard/ui/material/ui/components/modal.slint b/dashboard/ui/material/ui/components/modal.slint new file mode 100644 index 0000000..b14a4a6 --- /dev/null +++ b/dashboard/ui/material/ui/components/modal.slint @@ -0,0 +1,28 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; + +export component Modal { + callback clicked <=> touch_area.clicked; + + background_layer := Rectangle { + clip: true; + + touch_area := TouchArea { + @children + } + + animate background { duration: MaterialAnimations.opacity_duration; easing: MaterialAnimations.opacity_easing; } + } + + Timer { + interval: 50ms; + + triggered => { + background_layer.background = MaterialPalette.background_modal; + self.running = false; + } + } +} diff --git a/dashboard/ui/material/ui/components/navigation_bar.slint b/dashboard/ui/material/ui/components/navigation_bar.slint new file mode 100644 index 0000000..2705ef3 --- /dev/null +++ b/dashboard/ui/material/ui/components/navigation_bar.slint @@ -0,0 +1,150 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { Badge } from "./badge.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialText } from "./material_text.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { ExtendedTouchArea } from "./extended_touch_area.slint"; +import { StateLayer, Ripple } from "./state_layer.slint"; +import { Icon } from "./icon.slint"; +import { NavigationItem } from "../items/navigation_item.slint"; +import { BaseNavigationItemTemplate, BaseNavigation } from "./base_navigation.slint"; + +export component NavigationItemTemplate inherits BaseNavigationItemTemplate { + property has_icon: root.icon.width > 0 && root.icon.height > 0; + property has_selected_icon: root.selected_icon.width > 0 || root.selected_icon.height > 0; + property color: MaterialPalette.on_surface; + + in property navitem_padding_top: MaterialStyleMetrics.padding_12; + in property navitem_padding_bottom: MaterialStyleMetrics.padding_16; + + Rectangle { + width: 100%; + height: 100%; + } + + touch_area := ExtendedTouchArea { + HorizontalLayout { + alignment: center; + + VerticalLayout { + alignment: start; + spacing: MaterialStyleMetrics.spacing_4; + padding_top: root.navitem_padding_top; + padding_bottom: root.navitem_padding_bottom; + + HorizontalLayout { + alignment: center; + + background_layer := Rectangle { + min_width: state_layout.min_width; + min_height: max(MaterialStyleMetrics.size_32, state_layout.min_height); + border_radius: self.height / 2; + + state_layer := StateLayer { + background: root.color; + border_radius: parent.border_radius; + enabled: true; + has_focus: touch_area.has_focus; + has_hover: touch_area.has_hover; + pressed: touch_area.pressed || touch_area.enter_pressed; + width: 100%; + height: 100%; + + if touch_area.pressed && !root.selected : Ripple { + width: root.width; + height: root.height; + pressed_x: touch_area.pressed_x; + pressed_y: touch_area.pressed_y; + color: root.color; + } + + state_layout := HorizontalLayout { + padding_left: MaterialStyleMetrics.padding_20; + padding_right: self.padding_left; + alignment: center; + + VerticalLayout { + alignment: center; + + if !root.has_icon && !root.has_selected_icon : Rectangle { + width: 12px; + height: self.width; + border_radius: self.width / 2; + background: root.color; + } + + if root.has_icon || root.has_selected_icon : Icon { + source: root.icon; + colorize: root.color; + + states [ + selected when root.selected && root.has_selected_icon : { + source: root.selected_icon; + } + ] + } + } + } + } + + if root.show_badge || root.badge != "" : Badge { + x: parent.width / 2; + y: 0; + text: root.badge; + } + } + } + + label := MaterialText { + text: root.text; + style: MaterialTypography.label_medium; + color: root.color; + horizontal_alignment: center; + } + } + } + + clicked => { + root.clicked(); + } + } + + states [ + selected when root.selected : { + background_layer.background: MaterialPalette.secondary_container; + state_layer.background: transparent; + label.style: MaterialTypography.label_medium_prominent; + } + ] +} + +export component NavigationBar inherits BaseNavigation { + min_height: max(MaterialStyleMetrics.size_80, layout.min_height); + + Rectangle { + background: MaterialPalette.surface_container; + + layout := HorizontalLayout { + padding_left: MaterialStyleMetrics.padding_8; + padding_right: self.padding_left; + spacing: MaterialStyleMetrics.spacing_8; + + for item[index] in root.items : NavigationItemTemplate { + icon: item.icon; + selected_icon: item.selected_icon; + text: item.text; + index: index; + selected: index == root.current_index; + show_badge: item.show_badge; + badge: item.badge; + + clicked => { + root.select(index); + } + } + } + } +} diff --git a/dashboard/ui/material/ui/components/navigation_drawer.slint b/dashboard/ui/material/ui/components/navigation_drawer.slint new file mode 100644 index 0000000..bc42756 --- /dev/null +++ b/dashboard/ui/material/ui/components/navigation_drawer.slint @@ -0,0 +1,211 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { Drawer, ModalDrawer, DrawerHeader } from "./drawer.slint"; +import { NavigationItem, NavigationGroup } from "../items/navigation_item.slint"; +import { HorizontalDivider } from "./divider.slint"; +import { StateLayerArea } from "./state_layer.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { Icon } from "./icon.slint"; +import { MaterialText } from "./material_text.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { BaseNavigationItemTemplate } from "./base_navigation.slint"; + +component NavigationItemTemplate inherits BaseNavigationItemTemplate { + property has_icon: root.icon.width > 0 && root.icon.height > 0; + property has_selected_icon: root.selected_icon.width > 0 || root.selected_icon.height > 0; + property color: MaterialPalette.on_surface_variant; + + min_height: max(MaterialStyleMetrics.size_56, layout.min_height); + + background_layer := Rectangle { + border_radius: self.height / 2; + + state_layer := StateLayerArea { + border_radius: parent.border_radius; + color: root.selected ? transparent : root.color; + + layout := HorizontalLayout { + padding_left: MaterialStyleMetrics.padding_16; + padding_right: MaterialStyleMetrics.padding_24; + padding_top: MaterialStyleMetrics.padding_16; + padding_bottom: self.padding_top; + spacing: MaterialStyleMetrics.spacing_12; + + VerticalLayout { + alignment: center; + + if !root.has_icon && !root.has_selected_icon : Rectangle { + width: MaterialStyleMetrics.icon_size_24; + height: self.width; + + Rectangle { + width: 12px; + height: self.width; + border_radius: self.width / 2; + background: root.color; + } + } + + if root.has_icon || root.has_selected_icon : Icon { + source: root.icon; + colorize: root.color; + + states [ + selected when root.selected && root.has_selected_icon : { + source: root.selected_icon; + } + ] + } + } + + MaterialText { + horizontal_stretch: 1; + text: root.text; + style: MaterialTypography.label_large; + color: root.color; + vertical_alignment: center; + } + + if root.badge != "" : MaterialText { + text: root.badge; + style: MaterialTypography.label_large; + color: root.color; + vertical_alignment: center; + } + } + + clicked => { + root.clicked(); + } + + pointer_event(event) => { + root.pointer_event(event, { + x: self.mouse_x, + y: self.mouse_y, + }); + } + } + + animate background { duration: MaterialAnimations.opacity_duration; easing: MaterialAnimations.opacity_easing; } + } + + states [ + selected when root.selected : { + background_layer.background: MaterialPalette.secondary_container; + root.color: MaterialPalette.on_secondary_container; + } + ] + + animate color { duration: MaterialAnimations.opacity_duration; easing: MaterialAnimations.opacity_easing; } +} + +component NavigationGroupTemplate { + in property title; + in property <[NavigationItem]> items; + in property current_index: -1; + in property has_divider; + + callback select(index: int); + callback item_pointer_event(index: int, event: PointerEvent, position: Point); + + VerticalLayout { + alignment: start; + + if root.title != 0 : DrawerHeader { + title: root.title; + } + + for item[index] in root.items : NavigationItemTemplate { + icon: item.icon; + selected_icon: item.selected_icon; + text: item.text; + badge: item.badge; + selected: index == root.current_index; + index: index; + + clicked => { + root.select(index); + } + pointer_event(event, position) => { + root.item_pointer_event(index, event, { + x: self.x + position.x, + y: self.y + position.y, + }); + } + } + + if root.has_divider : HorizontalDivider {} + } +} + +export component NavigationDrawer inherits Drawer { + callback selected(group-index: int, item_index: int); + callback item_pointer_event(group_index: int, item_index: int, event: PointerEvent, position: Point); + in property <[NavigationGroup]> groups; + in_out property current_group; + in_out property current_index; + + accessible-role: tab-list; + // accessible-delegate-focus: root.current-focused >= 0 ? root.current-focused : root.current-index; + // accessible-label: root.title; + accessible-item-count: root.groups.length; + + for group[group_index] in root.groups : NavigationGroupTemplate { + title: group.title; + items: group.items; + current_index: group_index == root.current_group ? root.current_index : -1; + has_divider: root.groups.length > 1 && group_index < root.groups.length - 1; + + select(index) => { + root.select(group_index, index); + } + item_pointer_event(index, event, position) => { + root.item_pointer_event(group_index, index, event, { x: self.x + position.x, y: self.y + position.y }); + } + } + + function select(group_index: int, item_index: int) { + if group_index < 0 || group_index >= root.groups.length || item_index < 0 || item_index >= root.groups[group_index].items.length { + return; + } + + root.current_group = group_index; + root.current_index = item_index; + root.selected(group_index, item_index); + } +} + +export component ModalNavigationDrawer inherits ModalDrawer { + in property <[NavigationGroup]> groups; + in_out property current_group; + in_out property current_index; + + accessible-role: tab-list; + // accessible-delegate-focus: root.current-focused >= 0 ? root.current-focused : root.current-index; + // accessible-label: root.title; + accessible-item-count: root.groups.length; + + for group[group_index] in root.groups : NavigationGroupTemplate { + title: group.title; + items: group.items; + current_index: group_index == root.current_group ? root.current_index : -1; + has_divider: root.groups.length > 1 && group_index < root.groups.length - 1; + + select(index) => { + root.select(group_index, index); + } + } + + function select(group_index: int, item_index: int) { + if group_index < 0 || group_index >= root.groups.length || item_index < 0 || item_index >= root.groups[group_index].items.length { + return; + } + + root.current_group = group_index; + root.current_index = item_index; + root.close(); + } +} diff --git a/dashboard/ui/material/ui/components/navigation_rail.slint b/dashboard/ui/material/ui/components/navigation_rail.slint new file mode 100644 index 0000000..4ab1a1f --- /dev/null +++ b/dashboard/ui/material/ui/components/navigation_rail.slint @@ -0,0 +1,84 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { NavigationItem } from "../items/navigation_item.slint"; +import { FloatingActionButton, FABStyle } from "./floating_action_button.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { IconButton } from "icon_button.slint"; +import { Icons } from "../icons/icons.slint"; +import { NavigationItemTemplate } from "navigation_bar.slint"; +import { BaseNavigation } from "./base_navigation.slint"; + +export component NavigationRail inherits BaseNavigation { + in property has_menu; + in property fab_icon; + in property alignment; + + callback menu_clicked(); + callback fab_clicked(); + + min_width: max(MaterialStyleMetrics.size_80, layout.min_width); + + Rectangle { + background: MaterialPalette.surface; + + layout := VerticalLayout { + padding_top: MaterialStyleMetrics.padding_44; + padding_bottom: MaterialStyleMetrics.padding_56; + spacing: MaterialStyleMetrics.spacing_4; + + if root.has_menu : IconButton { + icon: Icons.menu; + + clicked => { + root.menu_clicked(); + } + } + + + if root.fab_icon.width > 0 && root.fab_icon.height > 0 : HorizontalLayout { + alignment: center; + + FloatingActionButton { + icon: root.fab_icon; + style: FABStyle.standard; + + clicked => { + root.fab_clicked(); + } + } + } + + // helper to place fab at the top if no items are present + if root.items.length == 0 : Rectangle { + horizontal_stretch: 1; + } + + HorizontalLayout { + vertical_stretch: 1; + alignment: center; + + VerticalLayout { + alignment: root.alignment; + + for item[index] in root.items : NavigationItemTemplate { + icon: item.icon; + selected_icon: item.selected_icon; + text: item.text; + index: index; + selected: index == root.current_index; + show_badge: item.show_badge; + badge: item.badge; + navitem_padding_top: 0; + navitem_padding_bottom: MaterialStyleMetrics.padding_4; + + clicked => { + root.select(index); + } + } + } + } + } + } +} diff --git a/dashboard/ui/material/ui/components/outline_button.slint b/dashboard/ui/material/ui/components/outline_button.slint new file mode 100644 index 0000000..e40db92 --- /dev/null +++ b/dashboard/ui/material/ui/components/outline_button.slint @@ -0,0 +1,42 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { BaseButton } from "./base_button.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; + +export component OutlineButton { + in property icon <=> base.icon; + in property text <=> base.text; + in property enabled <=> base.enabled; + in property tooltip <=> base.tooltip; + + callback clicked <=> base.clicked; + + accessible-role: button; + accessible-enabled: root.enabled; + accessible-label: root.text == "" ? root.tooltip : root.text; + accessible-action-default => { base.clicked(); } + + base := BaseButton { + border_radius: border.border_radius; + color: MaterialPalette.primary; + } + + border := Rectangle { + border_radius: root.height / 2; + border_width: 1px; + border_color: MaterialPalette.outline; + width: 100%; + height: 100%; + } + + states [ + disabled when !root.enabled : { + base.color: MaterialPalette.on_surface; + base.transparent_background: true; + border.border_color: MaterialPalette.on_surface; + border.opacity: MaterialPalette.state_layer_opacity_hover; + } + ] +} diff --git a/dashboard/ui/material/ui/components/outline_icon_button.slint b/dashboard/ui/material/ui/components/outline_icon_button.slint new file mode 100644 index 0000000..142b11a --- /dev/null +++ b/dashboard/ui/material/ui/components/outline_icon_button.slint @@ -0,0 +1,78 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { Elevation } from "./elevation.slint"; +import { BaseButton } from "./base_button.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; + +export component OutlineIconButton { + in property icon; + in property checked_icon: root.icon; + in property checkable; + in_out property checked; + in property tooltip <=> base.tooltip; + in property enabled <=> base.enabled; + + callback clicked(); + + accessible-role: button; + accessible-enabled: true; + accessible-label: root.tooltip; + accessible-checkable: root.checkable; + accessible-checked: root.checked; + accessible-action-default => { base.clicked(); } + + background_layer := Rectangle { + width: 100%; + height: 100%; + border_radius: base.border_radius; + border_width: 1px; + border_color: MaterialPalette.outline; + } + + base := BaseButton { + icon: root.checked ? root.checked_icon : root.icon; + border_radius: self.height / 2; + color: !root.enabled ? MaterialPalette.on_surface_variant : MaterialPalette.on_surface_variant; + button_horizontal_padding: 0; + button_vertical_padding: 0; + width: self.height; + icon_size: MaterialStyleMetrics.icon_size_24; + display_background: false; + + clicked => { + root.toggle(); + root.clicked(); + } + } + + function toggle() { + if !root.checkable { + return; + } + + root.checked = !root.checked; + } + + states [ + disabled when !root.enabled : { + base.color: MaterialPalette.on_surface; + base.transparent_background: true; + background_layer.border_color: root.checked ? transparent : MaterialPalette.on_surface; + background_layer.background: root.checked ? MaterialPalette.on_surface : transparent; + background_layer.opacity: MaterialPalette.state_layer_opacity_hover; + } + checked when root.enabled && root.checked : { + base.color: MaterialPalette.inverse_on_surface; + background_layer.background: MaterialPalette.inverse_surface; + background_layer.border_width: 0; + } + checked_disabled when root.enabled && root.checked : { + base.color: MaterialPalette.inverse_on_surface; + background_layer.background: MaterialPalette.inverse_on_surface; + background_layer.border_width: 0; + } + ] +} diff --git a/dashboard/ui/material/ui/components/progress_indicator.slint b/dashboard/ui/material/ui/components/progress_indicator.slint new file mode 100644 index 0000000..b32567c --- /dev/null +++ b/dashboard/ui/material/ui/components/progress_indicator.slint @@ -0,0 +1,107 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; + +export component LinearProgressIndicator { + in property progress; + in property indeterminate; + + height: MaterialStyleMetrics.size_4; + + Rectangle { + width: 100%; + height: 100%; + clip: true; + background: MaterialPalette.primary_container; + border_radius: MaterialStyleMetrics.border_radius_2; + + track := Rectangle { + x: 0; + y: 0; + width: parent.width * root.progress; + height: 100%; + border_radius: parent.border_radius; + background: MaterialPalette.primary; + } + } +} + +export component CircularProgressIndicator { + in property progress; + in property indeterminate; + + property bar_height: MaterialStyleMetrics.size_4; + + width: self.height; + min_height: MaterialStyleMetrics.size_40; + + background_layer := Rectangle { + width: root.width; + height: root.height; + border_width: root.bar_height; + border_color: root.progress == 1 ? MaterialPalette.primary : MaterialPalette.primary_container; + border_radius: max(self.width, self.height) / 2; + } + + track := Path { + property radius: min(self.viewbox_width, self.viewbox_height) / 2; + property start_x: self.viewbox_width / 2; + property start_y: self.viewbox_height / 2; + property inner_radius: self.radius - (root.bar_height * (self.viewbox_height / self.height)); + property start: !root.indeterminate ? 0 : 1 * mod(animation-tick(), 1.5s) / 1.5s; + property progress: !root.indeterminate ? root.progress : 0.5; + + x: background_layer.x; + y: background_layer.y; + viewbox_width: 100; + viewbox_height: 100; + width: background_layer.width; + height: background_layer.height; + fill: MaterialPalette.primary; + visible: self.progress > 0 && self.progress < 1; + + MoveTo { + x: !root.indeterminate ? track.start_x : track.start_x - track.radius * sin(-track.start * 360deg); + y: !root.indeterminate ? 0 : track.start_y - track.radius * cos(-track.start * 360deg); + } + + ArcTo { + radius_x: 1; + radius_y: 1; + x: !root.indeterminate ? track.start_x : track.start_x - track.inner-radius * sin(-track.start * 360deg); + y: !root.indeterminate ? root.bar_height * (track.viewbox_height / track.height) : track.start_y - track.inner_radius * cos(-track.start * 360deg); + } + + ArcTo { + radius_x: track.inner_radius; + radius_y: track.inner_radius; + x: start_x - track.inner_radius * sin(-(track.start + track.progress) * 360deg); + y: start_y - track.inner_radius * cos(-(track.start + track.progress) * 360deg); + sweep: track.progress > 0; + large-arc: track.progress > 0.5; + } + + ArcTo { + radius_x: 1; + radius_y: 1; + x: start_x - radius * sin(-(track.start + track.progress) * 360deg); + y: start_y - radius * cos(-(track.start + track.progress) * 360deg); + } + + ArcTo { + radius_x: radius; + radius_y: radius; + x: start_x - radius * sin(-track.start * 360deg); + y: start_y - radius * cos(-track.start * 360deg); + sweep: track.progress < 0; + large-arc: track.progress > 0.5; + } + + LineTo { + x: start_x - radius * sin(-track.start * 360deg); + y: start_y - radius * cos(-track.start * 360deg); + } + } +} diff --git a/dashboard/ui/material/ui/components/radio_button.slint b/dashboard/ui/material/ui/components/radio_button.slint new file mode 100644 index 0000000..4dab0bd --- /dev/null +++ b/dashboard/ui/material/ui/components/radio_button.slint @@ -0,0 +1,99 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { StateLayerArea } from "./state_layer.slint"; +import { ListTile } from "./list.slint"; +import { ListView } from "./list_view.slint"; + +export component RadioButton { + in property checked; + in property enabled; + + callback clicked(); + + min_width: MaterialStyleMetrics.size_40; + min_height: self.min_width; + accessible-enabled: root.enabled; + accessible-checkable: true; + accessible-checked <=> root.checked; + accessible-role: checkbox; + accessible-action-default => { state_area.clicked(); } + forward_focus: state_area; + + state_area := StateLayerArea { + width: 100%; + height: 100%; + border_radius: max(self.width, self.height) / 2; + color: MaterialPalette.on_surface; + + border := Rectangle { + width: MaterialStyleMetrics.size_20; + height: self.width; + border_radius: max(self.width, self.height) / 2; + border_color: MaterialPalette.on_surface_variant; + border_width: MaterialStyleMetrics.size_2; + + indicator := Rectangle { + width: parent.width / 2; + height: self.width; + border_radius: max(self.width, self.height) / 2; + background: MaterialPalette.primary; + opacity: !root.checked ? 0 : 1; + + animate opacity { + duration: MaterialAnimations.opacity_duration; + easing: MaterialAnimations.opacity_easing; + } + } + + animate border_color { + duration: MaterialAnimations.opacity_duration; + easing: MaterialAnimations.opacity_easing; + } + } + + clicked => { + root.clicked(); + } + } + + states [ + disabled when !root.enabled : { + border.border_color: MaterialPalette.on_surface; + border.opacity: MaterialPalette.disable_opacity; + indicator.background: MaterialPalette.on_surface; + indicator.opacity: root.checked ? MaterialPalette.disable_opacity : 0; + } + highlighted when !root.checked && (state_area.pressed || state_area.has_focus || state_area.has_hover) : { + border.border_color: MaterialPalette.on_surface; + } + checked when root.checked : { + border.border_color: MaterialPalette.primary; + } + ] +} + +export component RadioButtonTile inherits ListTile { + in_out property checked <=> radio_button.checked; + + callback radio_button_clicked(); + + Rectangle { + horizontal_stretch: 0; + + radio_button := RadioButton { + enabled: root.enabled; + + clicked => { + root.radio_button_clicked(); + } + } + } + + clicked => { + radio_button.clicked(); + } +} diff --git a/dashboard/ui/material/ui/components/scroll_view.slint b/dashboard/ui/material/ui/components/scroll_view.slint new file mode 100644 index 0000000..dd783c3 --- /dev/null +++ b/dashboard/ui/material/ui/components/scroll_view.slint @@ -0,0 +1,166 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialPalette } from "../styling/material_palette.slint"; + +export component ScrollBar { + in property enabled; + out property has_hover: touch_area.has_hover; + in_out property horizontal; + in_out property maximum; + in_out property page_size; + in_out property value; + in property policy: ScrollBarPolicy.as_needed; + + property track_size: root.horizontal ? root.width - 2 * root.offset : root.height - 2 * offset; + property step_size: 10px; + property offset: 2px; + property state_opacity: 40%; + + visible: (self.policy == ScrollBarPolicy.always_on) || (self.policy == ScrollBarPolicy.as_needed && self.maximum > 0); + + Rectangle { + clip: true; + + thumb := Rectangle { + width: !root.horizontal ? parent.width : root.maximum <= 0phx ? 0phx : max(min(32px, root.width), root.track-size * root.page-size / (root.maximum + root.page-size)); + height: root.horizontal ? parent.height : root.maximum <= 0phx ? 0phx : max(min(32px, root.height), root.track-size * (root.page-size / (root.maximum + root.page-size))); + x: !root.horizontal ? (parent.width - self.width) / 2 : root.offset + (root.track-size - thumb.width) * (-root.value / root.maximum); + y: root.horizontal ? (parent.height - self.height) / 2 : root.offset + (root.track-size - thumb.height) * (-root.value / root.maximum); + border-radius: (root.horizontal ? self.height : self.width) / 2; + background: MaterialPalette.on_background; + opacity: hide_timer.running || touch_area.has_hover || touch_area.pressed ? root.state_opacity : 0; + + animate opacity { duration: 150ms; } + } + } + + touch_area := TouchArea { + property pressed_value; + + width: parent.width; + height: parent.height; + + pointer-event(event) => { + if (event.button == PointerEventButton.left && event.kind == PointerEventKind.down) { + self.pressed-value = -root.value; + } + } + + moved => { + if (self.enabled && self.pressed) { + root.value = -max(0px, min(root.maximum, self.pressed-value + ( + root.horizontal ? (touch-area.mouse-x - touch-area.pressed-x) * (root.maximum / (root.track-size - thumb.width)) + : (touch-area.mouse-y - touch-area.pressed-y) * (root.maximum / (root.track-size - thumb.height)) + ))); + } + } + + scroll-event(event) => { + if (root.horizontal && event.delta-x != 0) { + root.value = max(-root.maximum, min(0px, root.value + event.delta-x)); + return accept; + } else if (!root.horizontal && event.delta-y != 0) { + root.value = max(-root.maximum, min(0px, root.value + event.delta-y)); + return accept; + } + + reject + } + + changed has_hover => { + if !self.has_hover && !hide_timer.running { + hide_timer.running = true; + } + } + + changed pressed => { + if self.pressed && hide_timer.running { + hide_timer.running = false; + } + } + } + + changed value => { + if !self.has_hover && !hide_timer.running { + hide_timer.running = true; + } + } + + hide_timer := Timer { + interval: 1.5s; + running: false; + + triggered => { + self.running = false; + } + } + + states [ + pressed when touch_area.pressed : { + root.state_opacity: 80%; + } + hover when root.has_hover : { + root.state_opacity: 70%; + } + ] +} + +export component ScrollView { + in property enabled: true; + out property visible_width <=> flickable.width; + out property visible_height <=> flickable.height; + in_out property viewport_width <=> flickable.viewport_width; + in_out property viewport_height <=> flickable.viewport_height; + in_out property viewport_x <=> flickable.viewport_x; + in_out property viewport_y <=> flickable.viewport_y; + in property vertical_scrollbar_policy <=> vertical_bar.policy; + in property horizontal_scrollbar_policy <=> horizontal_bar.policy; + // FIXME: remove. This property is currently set by the ListView and is used by the native style to draw the scrollbar differently when it has focus + in_out property has_focus; + + callback scrolled <=> flickable.flicked; + + property scroll_bar_size: 8px; + property scroll_bar_padding: 1px; + + min_height: 50px; + min_width: 50px; + horizontal_stretch: 1; + vertical_stretch: 1; + preferred_height: 100%; + preferred_width: 100%; + + flickable := Flickable { + x: 0; + y: 0; + viewport_y <=> vertical_bar.value; + viewport_x <=> horizontal_bar.value; + width: root.width - (root.vertical_scrollbar_policy != ScrollBarPolicy.always_off ? root.scroll_bar_size - 2 * root.scroll_bar_padding : 0); + height: root.height - (root.horizontal_scrollbar_policy != ScrollBarPolicy.always_off ? root.scroll_bar_size : 0); + + @children + } + + vertical_bar := ScrollBar { + enabled: root.enabled; + x: flickable.width + root.scroll_bar_padding; + y: 0; + width: root.visible ? root.scroll_bar_size : 0; + height: root.vertical_scrollbar_policy != ScrollBarPolicy.always_off ? parent.height - horizontal_bar.height : parent.height; + horizontal: false; + maximum: flickable.viewport_height - flickable.height; + page-size: flickable.height; + } + + horizontal_bar := ScrollBar { + enabled: root.enabled; + width: vertical_bar.visible ? parent.width - vertical_bar.width : parent.width; + height: root.horizontal_scrollbar_policy != ScrollBarPolicy.always_off ? root.scroll_bar_size : 0; + x: 0; + y: flickable.height + root.scroll_bar_padding; + horizontal: true; + maximum: flickable.viewport_width - flickable.width; + page_size: flickable.width; + } +} diff --git a/dashboard/ui/material/ui/components/search_bar.slint b/dashboard/ui/material/ui/components/search_bar.slint new file mode 100644 index 0000000..3ea343b --- /dev/null +++ b/dashboard/ui/material/ui/components/search_bar.slint @@ -0,0 +1,317 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { ListItem } from "../items/list_item.slint"; +import { Avatar, ListTile } from "./list.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { StateLayerArea } from "./state_layer.slint"; +import { MaterialText } from "./material_text.slint"; +import { Icon } from "./icon.slint"; +import { IconButton } from "./icon_button.slint"; +import { Icons } from "../icons/icons.slint"; +import { HorizontalDivider } from "./divider.slint"; +import { ListView } from "./list_view.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; + +component SearchTile inherits ListTile { + in property action_button_icon; + + callback action_button_clicked(); + + if root.action_button_icon.width > 0 && root.action_button_icon.height > 0 : IconButton { + icon: root.action_button_icon; + + clicked => { + root.action_button_clicked(); + } + } +} + +component SearchIcon { + in property icon; + in property color; + + VerticalLayout { + alignment: center; + padding_left: MaterialStyleMetrics.padding_8; + padding_right: self.padding_left; + + Icon { + source: root.icon; + colorize: root.color; + } + } +} + +component SearchTextInput { + in_out property text <=> text_input.text; + in property placeholder_text; + property computed_x; + + callback accepted(text: string); + callback edited(text: string); + callback key_pressed(event: KeyEvent) -> EventResult; + callback key_released(event: KeyEvent) -> EventResult; + + forward_focus: text_input; + horizontal_stretch: 1; + + Rectangle { + clip: true; + + text_input := TextInput { + x: min(0px, max(parent.width - self.width - self.text_cursor_width, root.computed_x)); + width: max(parent.width - self.text-cursor-width, self.preferred-width); + height: 100%; + font_size: MaterialTypography.body_large.font_size; + font_weight: MaterialTypography.body_large.font_weight; + vertical_alignment: center; + single_line: true; + color: MaterialPalette.on_surface; + selection_background_color: MaterialPalette.secondary_container; + selection_foreground_color: self.color; + // Disable TextInput's built-in accessibility support as the component takes care of that. + accessible-role: none; + + cursor_position_changed(cursor_position) => { + if cursor_position.x + root.computed_x < 0 { + root.computed_x = - cursor_position.x; + } else if cursor-position.x + root.computed_x > parent.width - self.text-cursor-width { + root.computed_x = parent.width - cursor_position.x - self.text-cursor-width; + } + } + + accepted => { + root.accepted(self.text); + } + + edited => { + root.edited(self.text); + } + + key_pressed(event) => { + root.key_pressed(event) + } + + key_released(event) => { + root.key_released(event) + } + + init => { + if root.text.character_count > 0 { + self.set_selection_offsets(root.text.character_count, root.text.character_count); + } + } + } + if root.text == "" && root.placeholder_text != "" : MaterialText { + width: 100%; + height: 100%; + text: root.placeholder_text; + color: MaterialPalette.on_surface_variant; + vertical_alignment: center; + style: MaterialTypography.body_large; + } + } +} + +export component SearchBar { + in property leading_icon: Icons.menu; + in property trailing_icon; + in property avatar_icon; + in property avatar_background: #00000000; + in property placeholder_text; + in property empty_text; + in_out property text; + in_out property current_index; + in property <[ListItem]> items; + + callback accepted(text: string); + callback edited(text: string); + callback action_button_clicked(index: int); + callback key_pressed(event: KeyEvent) -> EventResult; + callback key_released(event: KeyEvent) -> EventResult; + + property color: MaterialPalette.on_surface_variant; + property item_height: MaterialStyleMetrics.size_72; + + min_height: max(MaterialStyleMetrics.size_56, layout.min_height); + forward_focus: state_layer; + + Rectangle { + background: MaterialPalette.surface_container_high; + border_radius: MaterialStyleMetrics.border_radius_28; + + state_layer := StateLayerArea { + border_radius: parent.border_radius; + color: root.color; + + layout := HorizontalLayout { + padding: MaterialStyleMetrics.padding_4; + spacing: MaterialStyleMetrics.spacing_4; + + SearchIcon { + icon: root.leading_icon; + color: root.color; + } + + MaterialText { + text: root.text; + font_size: MaterialTypography.body_large.font_size; + font_weight: MaterialTypography.body_large.font_weight; + vertical_alignment: center; + color: MaterialPalette.on_surface; + + states [ + placeholder when root.text == "" : { + text: root.placeholder_text; + color: MaterialPalette.on_surface; + } + ] + } + + SearchIcon { + icon: root.trailing_icon; + color: root.color; + } + + if (root.avatar_icon.width > 0 && root.avatar_icon.height > 0) || root.avatar_background != #00000000 : VerticalLayout { + alignment: center; + + Avatar { + image: root.avatar_icon; + background: root.avatar_background; + } + } + } + + changed has_focus => { + if self.has_focus { + popup.show(); + } + } + + clicked => { + popup.show(); + } + } + } + + popup := PopupWindow { + x: 0; + y: 0; + width: root.width; + height: root.height + clamp(root.item_height * root.items.length, 3 * root.item_height, 6 * root.item_height); + close_policy: close_on_click_outside; + forward-focus: popup_input; + + background_layer := Rectangle { + x: 0; + y: 0; + width: 100%; + height: root.height; + background: MaterialPalette.surface_container_high; + border_radius: MaterialStyleMetrics.border_radius_28; + clip: true; + + VerticalLayout { + HorizontalLayout { + padding: MaterialStyleMetrics.padding_4; + spacing: MaterialStyleMetrics.spacing_4; + + IconButton { + icon: Icons.arrow_back; + + clicked => { + popup.close(); + } + } + + popup_input := SearchTextInput { + placeholder_text: root.placeholder_text; + text: root.text; + + accepted => { + root.accepted(self.text); + } + + edited => { + root.text = self.text; + root.edited(self.text); + } + + key_pressed(event) => { + root.key_pressed(event) + } + + key_released(event) => { + root.key_released(event) + } + + changed text => { + root.text = text; + } + } + + IconButton { + icon: Icons.close; + + clicked => { + root.text = ""; + popup.close(); + } + } + } + + HorizontalDivider {} + + if root.items.length == 0 : MaterialText { + text: root.empty_text; + color: root.color; + horizontal_alignment: center; + style: MaterialTypography.label_small; + } + + if root.items.length == 0 : Rectangle {} + + if root.items.length > 0 : ListView { + horizontal_stretch: 1; + + for item[index] in root.items : SearchTile { + text: item.text; + supporting_text: item.supporting_text; + avatar_icon: item.avatar_icon; + avatar_text: item.avatar_text; + avatar_background: item.avatar_background; + avatar_foreground: item.avatar_foreground; + action_button_icon: item.action_button_icon; + + clicked => { + root.text = self.text; + popup.close(); + } + + action_button_clicked => { + root.action_button_clicked(index); + } + } + } + } + + animate height { + duration: MaterialAnimations.standard_accelerate_duration; + easing: MaterialAnimations.standard_easing; + } + } + + Timer { + interval: 50ms; + + triggered => { + background_layer.height = popup.height; + self.running = false; + } + } + } +} diff --git a/dashboard/ui/material/ui/components/segmented_button.slint b/dashboard/ui/material/ui/components/segmented_button.slint new file mode 100644 index 0000000..21acf94 --- /dev/null +++ b/dashboard/ui/material/ui/components/segmented_button.slint @@ -0,0 +1,103 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { BaseButton } from "base_button.slint"; +import { Icons } from "../icons/icons.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; + +export struct SegmentedItem { + icon: image, + text: string +} + +component SegmentedItemTemplate { + in property icon; + in property text; + in property index; + in property selected; + in property last; + + callback clicked <=> base.clicked; + + accessible-role: list-item; + accessible-label: root.text; + accessible-item-selectable: true; + accessible-item-selected: root.selected; + accessible-item-index: root.index; + + if root.selected : Rectangle { + background: MaterialPalette.secondary_container; + } + + base := BaseButton { + min_layout_width: 0; + min_layout_height: 0; + color: MaterialPalette.on_surface; + button_vertical_padding: MaterialStyleMetrics.padding_10; + button_horizontal_padding: MaterialStyleMetrics.padding_24; + spacing: MaterialStyleMetrics.spacing_8; + icon: root.icon; + text: root.text; + + + animate width { duration: MaterialAnimations.standard_accelerate_duration; easing: MaterialAnimations.standard_easing; } + } + + if !root.last : Rectangle { + x: parent.width - self.width; + width: 1px; + height: 100%; + background: MaterialPalette.outline; + } + + states [ + selected when root.selected : { + base.icon: Icons.check; + } + ] +} + +export component SegmentedButton { + in property <[SegmentedItem]> items; + in_out property current_index; + + callback index_changed(index: int); + + min_width: max(2 * MaterialStyleMetrics.size_40, layout.min_width); + min_height: max(MaterialStyleMetrics.size_40, layout.min_height); + + accessible-role: list; + accessible-item-count: root.items.length; + + Rectangle { + clip: true; + border_width: 1px; + border_radius: self.height / 2; + border_color: MaterialPalette.outline; + + layout := HorizontalLayout { + for item[index] in root.items : SegmentedItemTemplate { + icon: item.icon; + text: item.text; + index: index; + last: index == root.items.length - 1; + selected: index == root.current_index; + + clicked => { + root.select(index); + } + } + } + } + + function select(index: int) { + if index < 0 || index >= root.items.length { + return; + } + + root.current_index = index; + root.index_changed(index); + } +} diff --git a/dashboard/ui/material/ui/components/slider.slint b/dashboard/ui/material/ui/components/slider.slint new file mode 100644 index 0000000..cc846b6 --- /dev/null +++ b/dashboard/ui/material/ui/components/slider.slint @@ -0,0 +1,136 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT +// +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { StateLayer } from "./state_layer.slint"; + +export component Slider { + in property enabled; + in_out property value; + in property minimum; + in property stop_count: 0; + in property maximum: 100; + + callback released(value: float); + callback value_changed(value: float); + + property steps: root.stop_count > 0 ? (root.maximum - root.minimum) / root.stop_count : 1; + + min_height: 20px; + accessible-role: slider; + accessible-enabled: root.enabled; + accessible-value: root.value; + accessible-value-minimum: root.minimum; + accessible-value-maximum: root.maximum; + accessible-value-step: min(steps, (root.maximum - root.minimum) / 100); + forward-focus: focus_scope; + + focus_scope := FocusScope { + touch_area := TouchArea { + track := Rectangle { + x: 0; + height: MaterialStyleMetrics.size_16; + background: MaterialPalette.surface_container_highest; + border_radius: self.height / 2; + + Rectangle { + x: 0; + width: state_layer.x - MaterialStyleMetrics.size_6; + border-top-left-radius: track.border_radius; + border-bottom-left-radius: track.border_radius; + border-top-right-radius: MaterialStyleMetrics.size_1; + border-bottom-right-radius: MaterialStyleMetrics.size_1; + background: thumb.background; + } + + if root.stop_count > 0: Rectangle { + width: 100%; + height: 100%; + + for i in (root.maximum - root.minimum) / root.steps: Rectangle { + x: root.value_to_length(track.width, (i + 1) * root.steps) - self.width / 2; + height: MaterialStyleMetrics.size_4; + width: self.height; + border_radius: self.height / 2; + background: MaterialPalette.outline; + } + } + } + + state_layer := Rectangle { + x: root.value_to_length(track.width, root.value) - (self.width) / 2; + width: 0; + height: track.height + (MaterialStyleMetrics.size_14 * 2); + StateLayer { + height: track.height + (MaterialStyleMetrics.size_16 * 2); + width: thumb.width + (MaterialStyleMetrics.size_2 * 2); + border_radius: self.width / 2; + pressed: touch_area.pressed; + has_hover: touch_area.has_hover; + has_focus: focus_scope.has_focus; + enabled: root.enabled; + background: thumb.background; + display_background: thumb_area.pressed || thumb_area.has_hover || focus_scope.has_focus; + + thumb_area := TouchArea { + height: track.height + (MaterialStyleMetrics.size_14 * 2); + width: self.height; + thumb := Rectangle { + width: MaterialStyleMetrics.size_4; + border_radius: self.width / 2; + background: MaterialPalette.primary; + } + + moved => { + root.set_value(root.length_to_value(state_layer.x + self.mouse_x, track.width)); + } + + pointer_event(event) => { + if event.kind == PointerEventKind.up { + root.released(root.value); + } + } + } + } + } + + pointer_event(event) => { + if event.kind == PointerEventKind.down && event.button == PointerEventButton.left { + root.set_value(root.length_to_value(self.mouse_x, track.width)); + } + if event.kind == PointerEventKind.up { + root.released(root.value); + } + } + } + + key_pressed(event) => { + if event.text == Key.LeftArrow { + root.set_value(root.value - root.steps); + return accept; + } + if event.text == Key.RightArrow { + root.set_value(root.value + root.steps); + return accept; + } + reject + } + } + + changed value => { + root.value_changed(root.value); + } + + pure function value_to_length(width: length, value: float) -> length { + clamp(width * (value - root.minimum) / (root.maximum - root.minimum), 0, width) + } + + pure function length_to_value(x: length, width: length) -> float { + x * (root.maximum - root.minimum) / width + } + + function set_value(value: float) { + root.value = clamp(round(value / root.steps) * root.steps, root.minimum, root.maximum) + } +} diff --git a/dashboard/ui/material/ui/components/snack_bar.slint b/dashboard/ui/material/ui/components/snack_bar.slint new file mode 100644 index 0000000..962c742 --- /dev/null +++ b/dashboard/ui/material/ui/components/snack_bar.slint @@ -0,0 +1,88 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { Elevation } from "elevation.slint"; +import { MaterialText } from "./material_text.slint"; +import { TextButton } from "./text_button.slint"; +import { IconButton } from "./icon_button.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { Icons } from "../icons/icons.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; + +export component SnackBar inherits PopupWindow { + in property text; + in property action_text; + in property has_close_button; + + close_policy: no_auto_close; + + callback action_clicked(); + + snack_bar := Elevation { + x: (parent.width - self.width) / 2; + y: parent.height - self.height; + width: MaterialStyleMetrics.size_344; + level: 3; + + background_layer := Rectangle { + background: MaterialPalette.inverse_surface; + border_radius: MaterialStyleMetrics.border_radius_4; + + HorizontalLayout { + padding_left: MaterialStyleMetrics.padding_16; + padding_right: self.padding_left; + padding_top: MaterialStyleMetrics.padding_10; + padding_bottom: self.padding_top; + spacing: MaterialStyleMetrics.spacing_4; + + MaterialText { + text: root.text; + vertical_alignment: center; + horizontal_alignment: left; + wrap: word_wrap; + style: MaterialTypography.body_medium; + color: MaterialPalette.inverse_on_surface; + } + + if root.action_text != "" : TextButton { + text: root.action_text; + inverse: true; + + clicked => { + root.raise_action(); + } + } + + if root.has_close_button : IconButton { + icon: Icons.close; + inverse: true; + + clicked => { + root.close(); + } + } + } + } + + animate y, height { + duration: MaterialAnimations.standard_accelerate_duration; + easing: MaterialAnimations.standard_easing; + } + } + + Timer { + interval: 50ms; + + triggered => { + snack_bar.y = root.height - snack_bar.height - MaterialStyleMetrics.padding_30; + self.running = false; + } + } + + function raise_action() { + root.action_clicked(); + root.close(); + } +} diff --git a/dashboard/ui/material/ui/components/state_layer.slint b/dashboard/ui/material/ui/components/state_layer.slint new file mode 100644 index 0000000..ee50f74 --- /dev/null +++ b/dashboard/ui/material/ui/components/state_layer.slint @@ -0,0 +1,171 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { ToolTip } from "./tooltip.slint"; +import { MaterialWindowAdapter } from "./material_window.slint"; + +export component Ripple { + in property border_radius; + in property pressed_x; + in property pressed_y; + in property color; + in property clip_ripple: true; + + Rectangle { + width: 100%; + height: 100%; + border_radius: root.border_radius; + clip: root.clip_ripple; + + ripple := Rectangle { + x: root.pressed_x - self.width / 2; + y: root.pressed_y - self.height / 2; + height: self.width; + border_radius: self.width / 2; + opacity: MaterialPalette.state_layer_opacity_press; + background: root.color; + + init => { + self.width = root.width * 2 * 1.4142; + } + + animate width { duration: MaterialAnimations.ripple_duration; easing: MaterialAnimations.ripple_easing; } + } + } +} + +export component StateLayer { + in property background; + in property border_radius; + in property display_background: true; + in property enabled; + in property pressed; + in property has_focus; + in property has_hover; + + property state_layer_opacity; + + Rectangle { + width: 100%; + height: 100%; + opacity: root.state_layer_opacity; + background: root.background; + border_radius: root.border_radius; + } + + Rectangle { + width: 100%; + height: 100%; + clip: true; + border_radius: root.border_radius; + + @children + } + + states [ + disabled when !root.enabled && root.display_background : { + root.state_layer_opacity: MaterialPalette.state_layer_opacity_focus; + } + focus when root.enabled && root.has_focus : { + root.state_layer_opacity: MaterialPalette.state_layer_opacity_focus; + } + pressed when root.enabled && root.pressed : { + root.state_layer_opacity: MaterialPalette.state_layer_opacity_press; + } + hover when root.enabled && root.has_hover && !MaterialWindowAdapter.disable_hover : { + root.state_layer_opacity: MaterialPalette.state_layer_opacity_hover; + } + ] + + animate state_layer_opacity { duration: MaterialAnimations.opacity_duration; easing: MaterialAnimations.opacity_easing; } +} + +export component FocusTouchArea inherits TouchArea { + out property has_focus <=> focus_scope.has_focus; + out property enter_pressed; + in property tooltip; + in property tooltip_offset; + + callback key_pressed(KeyEvent) -> EventResult; + + forward_focus: focus_scope; + + focus_scope := FocusScope { + x: 0; + width: 0px; + enabled: root.enabled; + + key_pressed(event) => { + if !root.enabled { + return reject; + } + + if (event.text == " " || event.text == "\n") && !root.enter_pressed { + root.enter_pressed = true; + root.clicked(); + return accept; + } + + root.key_pressed(event) + } + + key_released(event) => { + if !root.enabled { + return reject; + } + + if (event.text == " " || event.text == "\n") && root.enter_pressed { + root.enter_pressed = false; + return accept; + } + + reject + } + } + + @children + + + if root.tooltip != "" && root.has_hover && !MaterialWindowAdapter.disable_hover && !root.pressed : ToolTip { + y: root.tooltip_offset; + text: root.tooltip; + } +} + +export component StateLayerArea inherits FocusTouchArea { + in property color; + in property border_radius; + in property transparent_background; + in property display_background: true; + in property clip_ripple: true; + + property popup_open; + property has_h: root.mouse-x > 0 && root.mouse-x < root.width && root.mouse-y > 0 && root.mouse-y < root.height; + + if !root.enabled || (root.enabled && (root.has_focus || root.pressed || root.enter_pressed || root.has_hover)) : StateLayer { + width: 100%; + height: 100%; + background: root.transparent_background ? transparent : root.color; + border_radius: root.border_radius; + enabled: root.enabled; + pressed: root.pressed || root.enter_pressed; + has_focus: root.has_focus; + has_hover: root.has_hover; + display_background: root.display_background; + } + + // ripple + if root.enabled && (root.pressed || root.enter_pressed) : Ripple { + pressed_x: root.pressed_x; + pressed_y: root.pressed_y; + width: 100%; + height: 100%; + border_radius: root.border_radius; + color: root.color; + clip_ripple: root.clip_ripple; + } + + @children +} diff --git a/dashboard/ui/material/ui/components/switch.slint b/dashboard/ui/material/ui/components/switch.slint new file mode 100644 index 0000000..9409ecc --- /dev/null +++ b/dashboard/ui/material/ui/components/switch.slint @@ -0,0 +1,151 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { FocusTouchArea, StateLayer, Ripple } from "./state_layer.slint"; +import { Icon } from "./icon.slint"; + +export component Switch { + in_out property checked; + in property enabled: true; + in property tooltip <=> touch_area.tooltip; + in property on_icon; + in property off_icon; + + property has_icon: (root.checked && root.on_icon.width > 0 && root.on_icon.height > 0) || (root.off_icon.width > 0 && root.off_icon.height > 0); + property foreground: root.checked ? MaterialPalette.on_primary_container : MaterialPalette.surface_container_highest; + + callback checked_state_changed(checked: bool); + + min_width: MaterialStyleMetrics.size_52; + min_height: MaterialStyleMetrics.size_32; + + accessible-enabled: root.enabled; + accessible-checkable: true; + accessible-checked <=> root.checked; + accessible-role: checkbox; + accessible-action-default => { touch_area.clicked(); } + forward_focus: touch_area; + + touch_area := FocusTouchArea { + enabled: root.enabled; + + background_layer := Rectangle { + background: root.checked ? MaterialPalette.primary : MaterialPalette.surface_container_highest; + border_radius: self.height / 2; + border_width: root.checked ? 0 : 2px; + border_color: MaterialPalette.outline; + + state_layer := StateLayer { + x: indicator.x + (indicator.width - self.width) / 2; + width: self.height; + height: root.height + MaterialStyleMetrics.size_8; + border_radius: self.height / 2; + has_hover: touch_area.has_hover; + has_focus: touch_area.has_focus; + pressed: touch_area.pressed; + enabled: root.enabled; + + // ripple + if root.enabled && (touch_area.pressed || touch_area.enter_pressed) : Ripple { + pressed_x: touch_area.pressed_x; + pressed_y: touch_area.pressed_y; + width: 100%; + height: 100%; + border_radius: state_layer.border_radius; + color: state_layer.background; + clip_ripple: true; + } + } + + indicator := Rectangle { + property indicator-padding: root.checked || root.has_icon ? MaterialStyleMetrics.padding_4 : MaterialStyleMetrics.padding_8; + + property default_height: background_layer.height - 2 * self.indicator-padding; + + x: self.indicator-padding - (self.height - self.default_height) / 2; + width: self.height; + height: self.default_height; + border_radius: self.height / 2; + background: root.checked ? MaterialPalette.primary_container : MaterialPalette.outline; + + if root.has_icon : Icon { + source: root.checked ? root.on_icon : root.off_icon; + colorize: root.foreground; + + animate colorize { + duration: MaterialAnimations.opacity_duration; + easing: MaterialAnimations.opacity_easing; + } + } + + animate height { + duration: MaterialAnimations.emphasized_accelerate_duration; + easing: MaterialAnimations.emphasized_easing; + } + + animate background { + duration: MaterialAnimations.opacity_duration; + easing: MaterialAnimations.opacity_easing; + } + + states [ + checked when root.checked : { + x: background_layer.width - self.indicator-padding - self.width; + + in { + animate x { + duration: MaterialAnimations.emphasized_accelerate_duration; + easing: MaterialAnimations.emphasized_easing; + } + } + + out { + animate x { + duration: MaterialAnimations.emphasized_accelerate_duration; + easing: MaterialAnimations.emphasized_easing; + } + } + } + ] + } + + animate background, border_color { + duration: MaterialAnimations.opacity_duration; + easing: MaterialAnimations.opacity_easing; + } + } + + clicked => { + root.toggle(); + } + } + + function toggle() { + root.checked = !root.checked; + } + + changed checked => { + root.checked_state_changed(root.checked); + } + + states [ + disabled when !root.enabled : { + state_layer.display_background: false; + indicator.background: root.checked ? MaterialPalette.surface : MaterialPalette.outline.with_alpha(MaterialPalette.disable_opacity); + background_layer.background: (root.checked ? MaterialPalette.on_surface : MaterialPalette.surface_variant).with_alpha(MaterialPalette.state_layer_opacity_disabled); + background_layer.border_color: MaterialPalette.on_surface.with_alpha(MaterialPalette.state_layer_opacity_disabled); + foreground: root.checked ? MaterialPalette.on_surface.with_alpha(MaterialPalette.disable_opacity) : MaterialPalette.surface_container_highest; + } + pressed when touch_area.pressed: { + state_layer.background: indicator.background; + indicator.height: background_layer.height - 2px; + indicator.background: root.checked ? MaterialPalette.primary_container : MaterialPalette.on_surface_variant; + } + hover when touch_area.has_hover: { + state_layer.background: indicator.background; + } + ] +} diff --git a/dashboard/ui/material/ui/components/tab_bar.slint b/dashboard/ui/material/ui/components/tab_bar.slint new file mode 100644 index 0000000..0be204b --- /dev/null +++ b/dashboard/ui/material/ui/components/tab_bar.slint @@ -0,0 +1,210 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { NavigationItem } from "../items/navigation_item.slint"; +import { BaseNavigationItemTemplate, BaseNavigation } from "./base_navigation.slint"; +import { StateLayerArea } from "./state_layer.slint"; +import { MaterialText } from "./material_text.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { Icon } from "./icon.slint"; + +component TabItemTemplate inherits BaseNavigationItemTemplate { + out property label_width: label.width; + + property has_selected_icon: root.selected_icon.width > 0 || root.selected_icon.height > 0; + + StateLayerArea { + color: MaterialPalette.primary; + + VerticalLayout { + padding_top: MaterialStyleMetrics.padding_10; + padding_bottom: MaterialStyleMetrics.padding_8; + spacing: MaterialStyleMetrics.spacing_2; + + if root.icon.width > 0 && root.icon.height > 0 : HorizontalLayout { + alignment: center; + + Icon { + source: root.icon; + colorize: label.color; + + states [ + selected when root.selected && root.has_selected_icon : { + source: root.selected_icon; + } + ] + } + } + + HorizontalLayout { + alignment: center; + + label := MaterialText { + text: root.text; + style: MaterialTypography.title_small; + color: MaterialPalette.on_surface_variant; + } + } + } + + clicked => { + root.clicked(); + } + } + + states [ + selected when root.selected : { + label.color: MaterialPalette.primary; + } + ] +} + +component SecondaryTabItemTemplate inherits BaseNavigationItemTemplate { + property has_selected_icon: root.selected_icon.width > 0 || root.selected_icon.height > 0; + + StateLayerArea { + color: label.color; + + HorizontalLayout { + alignment: center; + spacing: MaterialStyleMetrics.spacing_8; + + if root.icon.width > 0 && root.icon.height > 0 : VerticalLayout { + alignment: center; + + Icon { + source: root.icon; + colorize: label.color; + + states [ + selected when root.selected && root.has_selected_icon : { + source: root.selected_icon; + } + ] + } + } + + + label := MaterialText { + text: root.text; + style: MaterialTypography.title_small; + color: MaterialPalette.on_surface_variant; + vertical_alignment: center; + } + } + + clicked => { + root.clicked(); + } + } + + states [ + selected when root.selected : { + label.color: MaterialPalette.on_surface; + } + ] +} + +export component TabBar inherits BaseNavigation { + property indicator_width; + property item_width: root.width / root.items.length; + property current_x: root.item_width * self.current_index; + + min_height: max(MaterialStyleMetrics.size_49, layout.min_height); + + Rectangle { + background: MaterialPalette.surface; + + layout := HorizontalLayout { + for item[index] in root.items : tab_item := TabItemTemplate { + icon: item.icon; + selected_icon: item.selected_icon; + text: item.text; + index: index; + selected: index == root.current_index; + show_badge: item.show_badge; + badge: item.badge; + + clicked => { + root.select(index); + root.set_indicator_width(index, self.label_width); + } + + Timer { + interval: 50ms; + + triggered => { + root.set_indicator_width(index, tab_item.label_width); + self.running = false; + } + } + } + } + + indicator := Rectangle { + x: root.current_x + (root.item_width - self.width) / 2; + y: parent.height - self.height; + width: root.indicator_width; + height: MaterialStyleMetrics.size_3; + border_top_left_radius: self.height / 2; + border_top_right_radius: self.border_top_left_radius; + background: MaterialPalette.primary; + + animate x, width { + duration: MaterialAnimations.standard_accelerate_duration; + easing: MaterialAnimations.standard_easing; + } + } + } + + function set_indicator_width(index: int, width: length) { + if index != root.current_index { + return; + } + + root.indicator_width = width; + } +} + +export component SecondaryTabBar inherits BaseNavigation { + property item_width: root.width / root.items.length; + property current_x: root.item_width * self.current_index; + + min_height: max(MaterialStyleMetrics.size_49, layout.min_height); + + Rectangle { + background: MaterialPalette.surface; + + layout := HorizontalLayout { + for item[index] in root.items : SecondaryTabItemTemplate { + icon: item.icon; + selected_icon: item.selected_icon; + text: item.text; + index: index; + selected: index == root.current_index; + show_badge: item.show_badge; + badge: item.badge; + + clicked => { + root.select(index); + } + } + } + + indicator := Rectangle { + x: root.current_x; + y: parent.height - self.height; + width: root.item_width; + height: MaterialStyleMetrics.size_2; + background: MaterialPalette.primary; + + animate x { + duration: MaterialAnimations.standard_accelerate_duration; + easing: MaterialAnimations.standard_easing; + } + } + } +} diff --git a/dashboard/ui/material/ui/components/text_button.slint b/dashboard/ui/material/ui/components/text_button.slint new file mode 100644 index 0000000..e04e513 --- /dev/null +++ b/dashboard/ui/material/ui/components/text_button.slint @@ -0,0 +1,33 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { BaseButton } from "./base_button.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; + +export component TextButton { + in property icon <=> base.icon; + in property text <=> base.text; + in property enabled <=> base.enabled; + in property tooltip <=> base.tooltip; + in property inverse; + + callback clicked <=> base.clicked; + + accessible-role: button; + accessible-enabled: root.enabled; + accessible-label: root.text == "" ? root.tooltip : root.text; + accessible-action-default => { base.clicked(); } + + base := BaseButton { + border_radius: root.height / 2; + color: root.inverse ? MaterialPalette.inverse_primary : MaterialPalette.primary; + } + + states [ + disabled when !root.enabled : { + base.color: MaterialPalette.on_surface; + base.transparent_background: true; + } + ] +} diff --git a/dashboard/ui/material/ui/components/text_field.slint b/dashboard/ui/material/ui/components/text_field.slint new file mode 100644 index 0000000..320eb01 --- /dev/null +++ b/dashboard/ui/material/ui/components/text_field.slint @@ -0,0 +1,209 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialAnimations } from "../styling/material_animations.slint"; +import { MaterialText } from "./material_text.slint"; +import { IconButton } from "./icon_button.slint"; +import { Icon } from "./icon.slint"; + +export component TextField { + in property label; + in property placeholder_text; + in property supporting_text; + in property has_error; + in property leading_icon; + in property trailing_icon; + in property enabled: true; + in property read_only <=> input.read_only; + out property has_focus: input.has_focus; + in_out property text <=> input.text; + + callback leading_icon_clicked(); + callback trailing_icon_clicked(); + callback accepted(text: string); + callback edited(text: string); + callback key_pressed(event: KeyEvent) -> EventResult; + callback key_released(event: KeyEvent) -> EventResult; + + property has_leading: root.leading_icon.width > 0 && root.leading_icon.height > 0; + property has_trailing: root.trailing_icon.width > 0 && root.trailing_icon.height > 0; + property computed_x; + property highlight: root.enabled && root.has_error ? MaterialPalette.error : root.has_focus ? MaterialPalette.primary : MaterialPalette.on_surface_variant; + + forward_focus: input; + accessible-role: text-input; + accessible-enabled: root.enabled; + accessible-value <=> text; + accessible-placeholder-text: root.text == "" ? placeholder_text : ""; + accessible-action-set-value(v) => { text = v; edited(v); } + + layout := VerticalLayout { + spacing: MaterialStyleMetrics.spacing_4; + + background_layer := Rectangle { + border_top_left_radius: MaterialStyleMetrics.border_radius_4; + border_top_right_radius: MaterialStyleMetrics.border_radius_4; + background: MaterialPalette.surface_container_highest; + min_height: max(MaterialStyleMetrics.size_56, inner_layout.min_height); + + inner_layout := HorizontalLayout { + padding_left: root.has_leading ? MaterialStyleMetrics.padding_4 : MaterialStyleMetrics.padding_16; + padding_right: root.has_trailing ? MaterialStyleMetrics.padding_4 : MaterialStyleMetrics.padding_16; + padding_top: MaterialStyleMetrics.padding_4; + padding_bottom: self.padding_top; + spacing: MaterialStyleMetrics.spacing_2; + + if root.has_leading : IconButton { + icon: root.leading_icon; + enabled: root.enabled; + + clicked => { + root.leading_icon_clicked(); + } + } + + HorizontalLayout { + padding_top: MaterialStyleMetrics.padding_4; + padding_bottom: self.padding_top; + + Rectangle { + horizontal_stretch: 1; + clip: true; + min_height: input.min_height; + + input := TextInput { + x: min(0px, max(parent.width - self.width - self.text_cursor_width, root.computed_x)); + width: max(parent.width - self.text-cursor-width, self.preferred-width); + font_size: MaterialTypography.body_large.font_size; + font_weight: MaterialTypography.body_large.font_weight; + text_cursor_width: MaterialStyleMetrics.size_3; + vertical_alignment: bottom; + single_line: true; + color: MaterialPalette.on_surface; + selection_background_color: MaterialPalette.primary.with_alpha(0.5); + selection_foreground_color: self.color; + enabled: root.enabled; + // Disable TextInput's built-in accessibility support as the component takes care of that. + accessible-role: none; + + cursor_position_changed(cursor_position) => { + if cursor_position.x + root.computed_x < 0 { + root.computed_x = - cursor_position.x; + } else if cursor-position.x + root.computed_x > parent.width - self.text-cursor-width { + root.computed_x = parent.width - cursor_position.x - self.text-cursor-width; + } + } + + accepted => { + root.accepted(self.text); + } + + edited => { + root.edited(self.text); + } + + key_pressed(event) => { + root.key_pressed(event) + } + + key_released(event) => { + root.key_released(event) + } + } + + text_label := MaterialText { + y: (parent.height - self.height) / 2; + width: 100%; + text: root.label; + color: root.highlight; + style: MaterialTypography.body_large; + + states [ + on_top when root.text != "" || input.has_focus : { + y: 0; + style: MaterialTypography.body_small; + } + ] + + animate font_size, y { + duration: MaterialAnimations.standard_fast_duration; + easing: MaterialAnimations.standard_easing; + } + } + } + } + + if root.trailing_icon.width > 0 && root.trailing_icon.height > 0 : IconButton { + icon: root.trailing_icon; + enabled: root.enabled; + has_error: root.has_error; + + clicked => { + root.trailing_icon_clicked(); + } + } + } + + active_indicator := Rectangle { + y: parent.height - self.height; + height: MaterialStyleMetrics.size_1; + background: root.highlight; + + animate height { + duration: MaterialAnimations.standard_fast_duration; + easing: MaterialAnimations.standard_easing; + } + } + } + + if root.supporting_text != "" : HorizontalLayout { + padding_left: MaterialStyleMetrics.padding_16; + padding_right: self.padding_left; + + supporting_text := MaterialText { + text: root.supporting_text; + style: MaterialTypography.body_small; + color: root.highlight; + opacity: root.enabled ? 1 : MaterialPalette.disable_opacity; + } + } + } + + public function set_selection_offsets(start: int, end: int) { + input.set_selection_offsets(start, end); + } + + public function select_all() { + input.select_all(); + } + + public function clear_selection() { + input.clear_selection(); + } + + public function cut() { + input.cut(); + } + + public function copy() { + input.copy(); + } + + public function paste() { + input.paste(); + } + + states [ + disabled when !root.enabled : { + background_layer.background: MaterialPalette.surface_container_highest.with_alpha(MaterialPalette.disable_opacity); + text_label.opacity: MaterialPalette.disable_opacity; + input.opacity: MaterialPalette.disable_opacity; + } + focused when input.has_focus : { + active_indicator.height: MaterialStyleMetrics.size_3; + } + ] +} diff --git a/dashboard/ui/material/ui/components/time_picker.slint b/dashboard/ui/material/ui/components/time_picker.slint new file mode 100644 index 0000000..5109e62 --- /dev/null +++ b/dashboard/ui/material/ui/components/time_picker.slint @@ -0,0 +1,674 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: MIT + +import { BaseDialog } from "./dialog.slint"; +import { Icons } from "../icons/icons.slint"; +import { MaterialText } from "./material_text.slint"; +import { MaterialStyleMetrics } from "../styling/material_style_metrics.slint"; +import { MaterialTypography } from "../styling/material_typography.slint"; +import { MaterialPalette } from "../styling/material_palette.slint"; +import { StateLayerArea } from "state_layer.slint"; + +component TimeSelector inherits Rectangle { + in property selected; + in property value; + + callback clicked <=> touch_area.clicked; + + width: max(MaterialStyleMetrics.size_48, text_label.min_width); + height: max(MaterialStyleMetrics.size_48, text_label.min_height); + border_radius: max(root.width, root.height) / 2; + vertical_stretch: 0; + horizontal_stretch: 0; + + touch_area := TouchArea { + text_label := MaterialText { + text: root.value; + vertical_alignment: center; + horizontal_alignment: center; + style: MaterialTypography.body_large; + color: MaterialPalette.on_surface; + } + } + + states [ + selected when root.selected: { + text_label.color: MaterialPalette.on_primary; + } + ] +} + +component Clock { + in property <[int]> model; + in property two_columns; + in property total; + in_out property current_index; + in property current_value; + + callback current_index_changed(index: int); + + property radius: max(root.width, root.height) / 2; + property picker_ditameter: MaterialStyleMetrics.size_48; + property center: root.radius - root.picker_ditameter / 2; + property outer_padding: 2px; + property inner_padding: 32px; + property radius_outer: root.center - root.outer_padding; + property radius_inner: root.center - root.inner_padding; + property half_total: root.total / 2; + property rotation: 0.25turn; + property current_x: get_index_x(root.current_value); + property current_y: get_index_y(root.current_value); + + min_width: MaterialStyleMetrics.size_256; + min_height: self.min_width; + vertical_stretch: 0; + horizontal_stretch: 0; + + background_layer := Rectangle { + border_radius: max(self.width, self.height) / 2; + background: MaterialPalette.surface_container_highest; + + if root.current_index >= 0 || root.current_index < root.model.length: Path { + stroke: MaterialPalette.primary; + stroke_width: 2px; + viewbox_width: self.width / 1px; + viewbox_height: self.height / 1px; + + MoveTo { + x: root.width / 2px; + y: root.height / 2px; + } + + LineTo { + x: (root.current_x + root.picker_ditameter / 2) / 1px; + y: (root.current_y + root.picker_ditameter / 2) / 1px; + } + } + + Rectangle { + width: MaterialStyleMetrics.size_8; + height: self.width; + background: MaterialPalette.primary; + border_radius: self.width / 2; + } + + if root.current_index < root.model.length: Rectangle { + x: root.current_x; + y: root.current_y; + width: root.picker_ditameter; + height: root.picker_ditameter; + border_radius: root.picker_ditameter / 2; + background: MaterialPalette.primary; + + if root.current_index < 0: Rectangle { + width: MaterialStyleMetrics.size_4; + height: self.width; + border_radius: self.width / 2; + background: MaterialPalette.on_primary; + } + } + + for val[index] in root.model: TimeSelector { + x: get_index_x(val); + y: get_index_y(val); + width: root.picker_ditameter; + height: root.picker_ditameter; + value: val; + selected: index == root.current_index; + accessible_role: button; + accessible_label: @tr("{} Hours or minutes of {}", val, root.total); + accessible_action_default => { + self.clicked(); + } + + clicked => { + root.set_current_index(index); + } + } + } + + + pure function value_to_angle(value: int) -> angle { + if root.two_columns { + if value >= root.half_total { + return clamp((value - root.half_total) / root.half_total * 1turn, 0, 0.999999turn) - root.rotation; + } + return clamp(value / root.half_total * 1turn, 0, 0.99999turn) - root.rotation; + } + + clamp(value / root.total * 1turn, 0, 0.99999turn) - root.rotation + } + + pure function get_index_x(value: int) -> length { + if root.two_columns && value >= root.half_total { + return root.center + (root.radius_inner / 1px * cos(root.value_to_angle(value))) * 1px; + } + + root.center + (root.radius_outer / 1px * cos(root.value_to_angle(value))) * 1px + } + + pure function get_index_y(value: int) -> length { + // this is only for 24 mode + if root.total == 24 && value == 0 { + return root.center + (root.radius_inner / 1px * sin(root.value_to_angle(value))) * 1px; + } + if root.total == 24 && value == 12 { + return root.center + (root.radius_outer / 1px * sin(root.value_to_angle(value))) * 1px; + } + if root.two_columns && value >= root.half_total { + return root.center + (root.radius_inner / 1px * sin(root.value_to_angle(value))) * 1px; + } + + root.center + (root.radius_outer / 1px * sin(root.value_to_angle(value))) * 1px + } + + function set_current_index(index: int) { + root.current_index_changed(index); + } +} + +component TimePickerInput { + in property read_only <=> text_input.read_only; + in property checked; + in_out property text <=> text_input.text; + + callback clicked; + callback edited(value: int); + + width: MaterialStyleMetrics.size_90; + min_height: max(MaterialStyleMetrics.size_80, layout.min_height); + vertical_stretch: 0; + horizontal_stretch: 0; + + forward_focus: text_input; + + background_layer := Rectangle { + border_radius: MaterialStyleMetrics.border_radius_8; + background: MaterialPalette.surface_container_highest; + clip: true; + + layout := HorizontalLayout { + padding: MaterialStyleMetrics.padding_8; + + text_input := TextInput { + vertical_alignment: center; + horizontal_alignment: center; + color: MaterialPalette.on_surface; + font_size: MaterialTypography.display_large.font_size; + font_weight: MaterialTypography.display_large.font_weight; + input_type: number; + visible: !root.read_only; + + edited => { + root.edited(self.text.to_float()); + } + } + } + + if root.read_only : StateLayerArea { + border_radius: background_layer.border_radius; + color: MaterialPalette.on_surface; + + HorizontalLayout { + padding: MaterialStyleMetrics.padding_8; + + MaterialText { + text: root.text.to_float() >= 10 ? root.text : "0" + root.text; + style: MaterialTypography.display_large; + color: MaterialPalette.on_surface; + horizontal_alignment: center; + vertical_alignment: center; + } + } + + clicked => { + root.clicked(); + } + } + } + + states [ + has_focus when text_input.has_focus && !root.read_only: { + background_layer.background: MaterialPalette.primary_container; + background_layer.border_width: 2px; + background_layer.border_color: MaterialPalette.primary; + text_input.color: MaterialPalette.on_primary_container; + } + checked when root.checked: { + background_layer.background: MaterialPalette.primary_container; + text_input.color: MaterialPalette.on_primary_container; + } + ] +} + +component PeriodSelectorItem { + in property text <=> label.text; + in property checked; + + callback clicked <=> state_layer.clicked; + + background_layer := Rectangle { + state_layer := StateLayerArea { + color: label.color; + + label := MaterialText { + color: MaterialPalette.on_surface_variant; + horizontal_alignment: center; + } + } + } + + states [ + checked when root.checked: { + background_layer.background: MaterialPalette.tertiary_container; + label.color: MaterialPalette.on_tertiary_container; + } + ] +} + + +component PeriodSelector { + in property am_selected; + in property horizontal; + + callback update_period(am_selected: bool); + + min_width: max(MaterialStyleMetrics.size_52, layout.min_width); + min_height: max(root.horizontal ? MaterialStyleMetrics.size_38 : MaterialStyleMetrics.size_80, layout.min_height); + accessible_label: "AM or PM"; + accessible_role: checkbox; + accessible_checked: root.am_selected; + + Rectangle { + border_radius: border.border_radius; + clip: true; + + layout := VerticalLayout { + if root.horizontal : HorizontalLayout { + PeriodSelectorItem { + text: "AM"; + checked: root.am_selected; + + clicked => { + if root.am_selected { + return; + } + root.update_period(true); + } + } + + Rectangle { + width: 1px; + background: border.border_color; + vertical_stretch: 0; + } + + PeriodSelectorItem { + text: "PM"; + checked: !root.am_selected; + + clicked => { + if !root.am_selected { + return; + } + root.update_period(false); + } + } + } + + if !root.horizontal : VerticalLayout { + PeriodSelectorItem { + text: "AM"; + checked: root.am_selected; + + clicked => { + if root.am_selected { + return; + } + root.update_period(true); + } + } + + Rectangle { + height: 1px; + background: border.border_color; + vertical_stretch: 0; + } + + PeriodSelectorItem { + text: "PM"; + checked: !root.am_selected; + + clicked => { + if !root.am_selected { + return; + } + root.update_period(false); + } + } + } + } + } + + border := Rectangle { + border_radius: MaterialStyleMetrics.border_radius_8; + border_width: 1px; + border_color: MaterialPalette.outline; + } +} + +export struct Time { + hour: int, + minute: int, + second: int +} + +export component TimePickerPopup inherits PopupWindow { + in property use_24_hour_format: true; + in property title: @tr("Select time"); + in property cancel_text: @tr("Cancel"); + in property ok_text: @tr("Ok"); + in property