bref-ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +103 -0
  2. package/dist/base/icon/icon.svelte +78 -0
  3. package/dist/base/icon/icon.svelte.d.ts +7 -0
  4. package/dist/base/icon/index.d.ts +2 -0
  5. package/dist/base/icon/index.js +2 -0
  6. package/dist/base/icon/types.d.ts +8 -0
  7. package/dist/base/icon/types.js +1 -0
  8. package/dist/base/index.d.ts +3 -0
  9. package/dist/base/index.js +3 -0
  10. package/dist/base/theme/color-tokens.d.ts +38 -0
  11. package/dist/base/theme/color-tokens.js +148 -0
  12. package/dist/base/theme/index.d.ts +3 -0
  13. package/dist/base/theme/index.js +3 -0
  14. package/dist/base/theme/mode.d.ts +3 -0
  15. package/dist/base/theme/mode.js +14 -0
  16. package/dist/base/theme/theme.svelte +200 -0
  17. package/dist/base/theme/theme.svelte.d.ts +3 -0
  18. package/dist/base/theme/types.d.ts +30 -0
  19. package/dist/base/theme/types.js +20 -0
  20. package/dist/base/types.d.ts +3 -0
  21. package/dist/base/types.js +1 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +4 -0
  24. package/dist/internal/demo-author.svelte +29 -0
  25. package/dist/internal/demo-author.svelte.d.ts +18 -0
  26. package/dist/internal/demo-code-snippet.svelte +68 -0
  27. package/dist/internal/demo-code-snippet.svelte.d.ts +6 -0
  28. package/dist/internal/demo-header.svelte +57 -0
  29. package/dist/internal/demo-header.svelte.d.ts +18 -0
  30. package/dist/internal/demo-icon-section.svelte +46 -0
  31. package/dist/internal/demo-icon-section.svelte.d.ts +18 -0
  32. package/dist/internal/demo-section.svelte +52 -0
  33. package/dist/internal/demo-section.svelte.d.ts +10 -0
  34. package/dist/internal/demo-types.svelte +61 -0
  35. package/dist/internal/demo-types.svelte.d.ts +18 -0
  36. package/package.json +65 -0
package/README.md ADDED
@@ -0,0 +1,103 @@
1
+ # Bref: a truly Svelte-esque UI Component Library
2
+
3
+ Bref is a Svelte UI component library designed to be minimal, flexible, and easy to use.
4
+ Think of it as, what if `Shadcn/ui` was built specifically for Svelte, used only CSS styling and no Tailwind CSS, fully embracing Svelte's unique capabilities and idioms.
5
+
6
+ ## What We Promise
7
+
8
+ - **Base UI components with escape hatches**: Access raw CSS properties when you need full control
9
+ - **Clear naming conventions**: Component names resemble HTML as much as possible to avoid confusion
10
+ - **Section-based components**: For more complex UI needs like navbars, modals, and cards
11
+ - **Marketing site components**: Ready-made components for building landing pages and marketing sites
12
+ - **Theming component**: A simple component to style the entire UI library (colors, padding, spacing, fonts, borders...) to your desires
13
+ - **WIP: CLI tool**: Import components directly into your codebase and customize them at will
14
+
15
+ ## Installation
16
+
17
+ ```
18
+ npm install bref-ui
19
+ ```
20
+
21
+ ## Usage
22
+
23
+ ```tsx
24
+ <script lang="ts">
25
+ import { Button } from 'bref-ui';
26
+ </script>
27
+
28
+ <Button onclick={() => console.log('Clicked!')}>Click Me</Button>
29
+ ```
30
+
31
+ ## Why Bref?
32
+
33
+ There are excellent Svelte component libraries out there. [Flowbite Svelte](https://github.com/themesberg/flowbite-svelte) and [shadcn-svelte](https://github.com/huntabyte/shadcn-svelte) are doing great work, and you should check them out.
34
+
35
+ Bref takes a different approach:
36
+
37
+ - **Pure CSS**: Uses Svelte's built-in scoped styling instead of Tailwind CSS. If you chose Svelte for its elegant styling solution, Bref keeps that promise.
38
+ - **Minimal**: Only essential components, nothing extra.
39
+ - **Flexible**: Use as an npm package or copy components directly into your project with our CLI tool (WIP).
40
+ - **Batteries included theming**: Just provide your base colors and we handle the rest (see below).
41
+
42
+ ## Theming: Just Bring Your Colors
43
+
44
+ Bref is a **batteries included** theming solution. You don't need to be a color theory expert or spend hours crafting the perfect palette.
45
+
46
+ Simply provide your base theme colors, and Bref automatically generates all the necessary CSS variables with proper contrast ratios, hover states, and luminance variations. No more manually calculating shades, tints, or ensuring accessibility compliance.
47
+
48
+ Bref handles:
49
+ - **Shade generation**: Automatically creates lighter and darker variants
50
+ - **Contrast calculation**: Ensures text remains readable on all backgrounds
51
+ - **State variations**: Hover, active, and disabled states just work
52
+ - **Dark mode**: Seamlessly adapts your palette for dark themes
53
+
54
+ ## Base Components
55
+
56
+ - [ ] Button
57
+ - [ ] Input
58
+ - [ ] Textarea
59
+ - [ ] Select
60
+ - [ ] Checkbox
61
+ - [ ] Radio
62
+ - [ ] Switch
63
+ - [ ] Label
64
+ - [ ] Avatar
65
+ - [ ] Img
66
+ - [ ] Icon
67
+ - [ ] Progress
68
+ - [ ] Meter
69
+ - [ ] Skeleton
70
+ - [ ] Spinner
71
+ - [ ] Badge
72
+ - [ ] Tooltip
73
+ - [ ] Popover
74
+ - [ ] Dialog
75
+
76
+ ## Section Components
77
+
78
+ - [ ] Nav
79
+ - [ ] Aside
80
+ - [ ] Header
81
+ - [ ] Footer
82
+ - [ ] Article
83
+ - [ ] Card
84
+ - [ ] Accordion
85
+ - [ ] Tabs
86
+ - [ ] Table
87
+ - [ ] Form
88
+ - [ ] Toast
89
+
90
+ ## Marketing Components
91
+
92
+ - [ ] Hero
93
+ - [ ] Features
94
+ - [ ] Pricing
95
+ - [ ] FAQ
96
+ - [ ] Testimonials
97
+ - [ ] CTA
98
+
99
+ > If you need something you don't see here, feel free to open an issue or a PR!
100
+
101
+ ## License
102
+
103
+ MIT
@@ -0,0 +1,78 @@
1
+ <script lang="ts">
2
+ import '@fontsource-variable/material-symbols-rounded/fill.css';
3
+ import type { SvelteHTMLElements } from 'svelte/elements';
4
+ import type { IconProps } from './types.js';
5
+
6
+ const {
7
+ name,
8
+ filled = false,
9
+ size = 'medium',
10
+ color = 'foreground',
11
+ ...rest
12
+ }: IconProps & SvelteHTMLElements['span'] = $props();
13
+ </script>
14
+
15
+ <span {...rest} class:filled class={`${size} ${color}`} aria-hidden="true">
16
+ {name}
17
+ </span>
18
+
19
+ <style>
20
+ span {
21
+ font-family: 'Material Symbols Rounded Variable';
22
+ font-weight: 200;
23
+ font-style: normal;
24
+ display: inline-block;
25
+ line-height: 1;
26
+ text-transform: none;
27
+ letter-spacing: normal;
28
+ word-wrap: normal;
29
+ white-space: nowrap;
30
+ direction: ltr;
31
+ user-select: none;
32
+ }
33
+
34
+ .filled {
35
+ font-variation-settings: 'FILL' 1;
36
+ font-weight: 500;
37
+ }
38
+
39
+ .x-small {
40
+ font-size: 0.75rem;
41
+ }
42
+ .small {
43
+ font-size: 1rem;
44
+ }
45
+ .medium {
46
+ font-size: 1.5rem;
47
+ }
48
+ .large {
49
+ font-size: 2rem;
50
+ }
51
+ .x-large {
52
+ font-size: 3rem;
53
+ }
54
+ .foreground {
55
+ color: var(--color-foreground);
56
+ }
57
+ .primary {
58
+ color: var(--color-primary-base);
59
+ }
60
+ .secondary {
61
+ color: var(--color-secondary-base);
62
+ }
63
+ .success {
64
+ color: var(--color-success-base);
65
+ }
66
+ .warning {
67
+ color: var(--color-warning-base);
68
+ }
69
+ .danger {
70
+ color: var(--color-danger-base);
71
+ }
72
+ .background {
73
+ color: var(--color-background);
74
+ }
75
+ .info {
76
+ color: var(--color-info-base);
77
+ }
78
+ </style>
@@ -0,0 +1,7 @@
1
+ import '@fontsource-variable/material-symbols-rounded/fill.css';
2
+ import type { SvelteHTMLElements } from 'svelte/elements';
3
+ import type { IconProps } from './types.ts';
4
+ type $$ComponentProps = IconProps & SvelteHTMLElements['span'];
5
+ declare const Icon: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type Icon = ReturnType<typeof Icon>;
7
+ export default Icon;
@@ -0,0 +1,2 @@
1
+ export { type IconName, type IconProps } from './types.ts';
2
+ export { default as Icon } from './icon.svelte';
@@ -0,0 +1,2 @@
1
+ export {} from "./types.js";
2
+ export { default as Icon } from './icon.svelte';
@@ -0,0 +1,8 @@
1
+ import type { Color, Size } from '../types.ts';
2
+ export type IconName = 'search' | 'home' | 'menu' | 'close' | 'settings' | 'check_circle' | 'favorite' | 'add' | 'delete' | 'arrow_back' | 'star' | 'chevron_right' | 'arrow_forward_ios' | 'logout' | 'cancel' | 'add_circle' | 'arrow_back_ios' | 'arrow_forward' | 'arrow_drop_down' | 'check' | 'more_vert' | 'check_box' | 'open_in_new' | 'toggle_on' | 'refresh' | 'check_box_outline_blank' | 'login' | 'chevron_left' | 'radio_button_unchecked' | 'more_horiz' | 'download' | 'apps' | 'arrow_right_alt' | 'radio_button_checked' | 'filter_alt' | 'remove' | 'bolt' | 'arrow_upward' | 'toggle_off' | 'filter_list' | 'delete_forever' | 'autorenew' | 'key' | 'block' | 'sync' | 'arrow_downward' | 'sort' | 'add_box' | 'arrow_back_ios_new' | 'restart_alt' | 'shopping_cart_checkout' | 'menu_open' | 'expand_circle_down' | 'undo' | 'arrow_circle_right' | 'done_all' | 'backspace' | 'arrow_right' | 'do_not_disturb_on' | 'open_in_full' | 'manage_search' | 'double_arrow' | 'sync_alt' | 'done_outline' | 'zoom_in' | 'drag_indicator' | 'fullscreen' | 'ios_share' | 'star_half' | 'keyboard_double_arrow_right' | 'settings_accessibility' | 'reply' | 'arrow_drop_up' | 'exit_to_app' | 'unfold_more' | 'cached' | 'terminal' | 'library_add' | 'select_check_box' | 'change_circle' | 'swap_horiz' | 'disabled_by_default' | 'swap_vert' | 'dataset' | 'close_fullscreen' | 'app_registration' | 'arrow_circle_up' | 'add_task' | 'download_for_offline' | 'arrow_circle_left' | 'file_open' | 'open_with' | 'minimize' | 'start' | 'keyboard_double_arrow_left' | 'keyboard_double_arrow_down' | 'create_new_folder' | 'upload' | 'compare_arrows' | 'forward' | 'downloading' | 'settings_applications' | 'redo' | 'publish' | 'zoom_out' | 'arrow_left' | 'token' | 'html' | 'switch_access_shortcut' | 'fullscreen_exit' | 'arrow_circle_down' | 'delete_sweep' | 'sort_by_alpha' | 'indeterminate_check_box' | 'view_timeline' | 'first_page' | 'keyboard_double_arrow_up' | 'sync_problem' | 'settings_backup_restore' | 'assistant_navigation' | 'heart_plus' | 'arrow_drop_down_circle' | 'arrow_outward' | 'clear_all' | 'expand' | 'density_medium' | 'subdirectory_arrow_right' | 'unfold_less' | 'last_page' | 'filter_alt_off' | 'download_done' | '123' | 'swipe_left' | 'saved_search' | 'check_small' | 'output' | 'system_update_alt' | 'place_item' | 'select_all' | 'javascript' | 'search_off' | 'fit_screen' | 'maximize' | 'swipe_up' | 'hide_source' | 'dynamic_form' | 'swipe_right' | 'browse_gallery' | 'switch_access_shortcut_add' | 'assistant_direction' | 'density_small' | 'css' | 'move_up' | 'data_thresholding' | 'youtube_searched_for' | 'swap_horizontal_circle' | 'dataset_linked' | 'abc' | 'move_down' | 'restore_from_trash' | 'browse_activity' | 'enable' | 'install_desktop' | 'keyboard_command_key' | 'view_kanban' | 'star_rate' | 'reply_all' | 'compress' | 'switch_left' | 'swipe_down' | 'apps_outage' | 'progress_activity' | 'swap_vertical_circle' | 'remove_done' | 'filter_list_off' | 'hide' | 'sync_disabled' | 'keyboard_control_key' | 'tab' | 'swipe_vertical' | 'pinch' | 'more_up' | 'switch_right' | 'cycle' | 'eject' | 'key_off' | 'view_cozy' | 'php' | 'subdirectory_arrow_left' | 'do_not_disturb_off' | 'send_time_extension' | 'expand_content' | 'width_normal' | 'heart_minus' | 'view_comfy_alt' | 'share_reviews' | 'width_full' | 'file_download_off' | 'unfold_more_double' | 'view_compact_alt' | 'check_indeterminate_small' | 'open_in_new_off' | 'extension_off' | 'more_down' | 'width_wide' | 'repartition' | 'deployed_code' | 'density_large' | 'swipe_left_alt' | 'swipe_down_alt' | 'unfold_less_double' | 'swipe_right_alt' | 'swipe_up_alt' | 'expand_all' | 'keyboard_option_key' | 'quick_reference_all' | 'rebase' | 'tab_unselected' | 'hls' | 'hls_off' | 'collapse_all' | 'file_upload_off' | 'prompt_suggestion' | 'arrow_split' | 'stacks' | 'acute' | 'collapse_content' | 'rebase_edit' | 'data_check' | 'page_info' | 'stack' | 'arrow_upward_alt' | 'close_small' | 'clock_loader_60' | 'rule_settings' | 'stat_0' | 'arrow_downward_alt' | 'captive_portal' | 'left_click' | 'quick_reference' | 'sync_saved_locally' | 'empty_dashboard' | 'clock_loader_40' | 'add_2' | 'arrow_insert' | 'chevron_forward' | 'clock_loader_10' | 'heart_check' | 'question_exchange' | 'data_alert' | 'linked_services' | 'point_scan' | 'search_check' | 'action_key' | 'expand_circle_right' | 'directory_sync' | 'switches' | 'unknown_med' | 'arrow_range' | 'move_item' | 'stat_minus_1' | 'deployed_code_update' | 'category_search' | 'event_list' | 'step' | 'data_info_alert' | 'star_rate_half' | 'stat_3' | 'side_navigation' | 'cards' | 'file_export' | 'stack_star' | 'arrow_left_alt' | 'drag_pan' | 'new_window' | 'steppers' | 'share_windows' | 'expand_circle_up' | 'preliminary' | 'highlight_mouse_cursor' | 'clock_loader_90' | 'recenter' | 'right_panel_open' | 'clock_loader_20' | 'sweep' | 'arrows_output' | 'left_panel_open' | 'patient_list' | 'chevron_backward' | 'clock_loader_80' | 'bubble' | 'modeling' | 'arrows_input' | 'search_check_2' | 'right_panel_close' | 'responsive_layout' | 'settings_heart' | 'capture' | 'radio_button_partial' | 'all_match' | 'pip' | 'dialogs' | 'input_circle' | 'toolbar' | 'arrow_and_edge' | 'deployed_code_account' | 'key_vertical' | 'arrow_back_2' | 'expansion_panels' | 'left_panel_close' | 'resize' | 'stat_2' | 'step_over' | 'move_group' | 'page_control' | 'arrow_upload_progress' | 'download_2' | 'iframe' | 'stat_1' | 'right_click' | 'step_into' | 'deployed_code_history' | 'unknown_5' | 'arrows_outward' | 'sliders' | 'chip_extraction' | 'chronic' | 'open_run' | 'upload_2' | 'stat_minus_2' | 'switch_access_2' | 'app_badging' | 'drag_click' | 'multimodal_hand_eye' | 'stat_minus_3' | 'arrow_upload_ready' | 'bottom_navigation' | 'tab_duplicate' | 'borg' | 'bubbles' | 'dropdown' | 'bottom_panel_open' | 'file_json' | 'switch_access' | 'tab_close' | 'amend' | 'open_in_new_down' | 'partner_reports' | 'tab_group' | 'check_circle_unread' | 'deployed_code_alert' | 'error_med' | 'shelf_position' | 'tabs' | 'buttons_alt' | 'magnification_large' | 'magnification_small' | 'toast' | 'pip_exit' | 'step_out' | 'bottom_drawer' | 'jump_to_element' | 'subheader' | 'arrow_menu_open' | 'go_to_line' | 'reopen_window' | 'stack_off' | 'bottom_panel_close' | 'arrow_or_edge' | 'arrow_top_left' | 'back_to_tab' | 'output_circle' | 'position_top_right' | 'arrow_top_right' | 'chips' | 'filter_arrow_right' | 'tab_new_right' | 'tab_search' | 'splitscreen_landscape' | 'arrow_menu_close' | 'bottom_right_click' | 'clock_arrow_down' | 'desktop_landscape' | 'float_landscape_2' | 'bottom_sheets' | 'shelf_auto_hide' | 'widget_small' | 'clock_arrow_up' | 'tab_recent' | 'view_apps' | 'ripples' | 'hourglass_arrow_up' | 'move_selection_right' | 'tab_move' | 'bucket_check' | 'splitscreen_portrait' | 'tab_inactive' | 'timer_arrow_down' | 'hourglass_arrow_down' | 'move_selection_left' | 'rotate_auto' | 'stack_group' | 'accessible_menu' | 'frame_bug' | 'sync_desktop' | 'position_bottom_right' | 'search_gear' | 'tile_small' | 'widget_medium' | 'widget_width' | 'arrow_shape_up' | 'arrow_shape_up_stack' | 'highlight_keyboard_focus' | 'iframe_off' | 'edit_arrow_down' | 'position_bottom_left' | 'fullscreen_portrait' | 'thermostat_arrow_down' | 'tile_large' | 'arrow_shape_up_stack_2' | 'highlight_text_cursor' | 'move_selection_up' | 'bottom_app_bar' | 'frame_exclamation' | 'tab_close_right' | 'tile_medium' | 'sync_arrow_down' | 'timer_arrow_up' | 'desktop_portrait' | 'switch_access_3' | 'tab_close_inactive' | 'thermostat_arrow_up' | 'desktop_landscape_add' | 'float_portrait_2' | 'chevron_line_up' | 'page_menu_ios' | 'sync_arrow_up' | 'edit_arrow_up' | 'move_selection_down' | 'sync_saved_locally_off' | 'person' | 'person' | 'group' | 'groups' | 'thumb_up' | 'share' | 'public' | 'person_add' | 'handshake' | 'support_agent' | 'face' | 'rocket_launch' | 'sentiment_satisfied' | 'group_add' | 'workspace_premium' | 'psychology' | 'diversity_3' | 'emoji_objects' | 'travel_explore' | 'pets' | 'water_drop' | 'eco' | 'mood' | 'sunny' | 'sentiment_dissatisfied' | 'health_and_safety' | 'quiz' | 'sentiment_very_satisfied' | 'thumb_down' | 'military_tech' | 'gavel' | 'diamond' | 'recycling' | 'monitor_heart' | 'emoji_people' | 'diversity_1' | 'workspaces' | 'recommend' | 'vaccines' | 'compost' | 'forest' | 'waving_hand' | 'psychology_alt' | 'wc' | 'sentiment_neutral' | 'person_remove' | 'sentiment_very_dissatisfied' | 'diversity_2' | 'group_work' | 'medication' | 'front_hand' | 'add_reaction' | 'rocket' | 'man' | 'medical_information' | 'cruelty_free' | 'coronavirus' | 'potted_plant' | 'female' | 'rainy' | 'emoji_nature' | 'communication' | 'cookie' | 'thumbs_up_down' | 'groups_2' | 'bedtime' | 'person_off' | 'connect_without_contact' | 'mood_bad' | 'woman' | 'male' | 'partly_cloudy_day' | 'thunderstorm' | 'solar_power' | 'sentiment_extremely_dissatisfied' | 'heart_broken' | 'clear_day' | 'masks' | 'hive' | 'boy' | 'whatshot' | 'face_6' | 'emoji_food_beverage' | 'emoji_transportation' | 'wind_power' | 'elderly' | 'partner_exchange' | 'reduce_capacity' | 'groups_3' | 'face_3' | 'skull' | 'sick' | 'face_4' | 'pregnant_woman' | 'egg' | 'bloodtype' | 'group_remove' | 'medication_liquid' | 'follow_the_signs' | 'co2' | 'weight' | 'oil_barrel' | 'elderly_woman' | 'person_2' | 'transgender' | 'sanitizer' | 'clean_hands' | 'bring_your_own_ip' | 'face_2' | 'public_off' | 'routine' | 'south_america' | 'social_distance' | 'sign_language' | 'identity_platform' | 'sunny_snowing' | 'flood' | 'face_5' | 'emoji_symbols' | 'garden_cart' | 'egg_alt' | 'cyclone' | 'person_4' | 'girl' | 'dentistry' | 'tsunami' | 'group_off' | 'outdoor_garden' | 'severe_cold' | 'partly_cloudy_night' | 'person_3' | 'tornado' | 'snowing' | 'tactic' | 'safety_divider' | 'cognition' | 'foggy' | 'landslide' | 'vaping_rooms' | 'woman_2' | 'no_adult_content' | 'strategy' | 'volcano' | 'man_2' | 'blind' | '18_up_rating' | '6_ft_apart' | 'person_raised_hand' | 'not_accessible' | 'psychiatry' | 'vape_free' | 'man_4' | 'radiology' | 'neurology' | 'rib_cage' | 'social_leaderboard' | 'hand_bones' | 'eyeglasses' | 'bedtime_off' | 'editor_choice' | 'labs' | 'communities' | 'diversity_4' | 'rheumatology' | 'mystery' | 'man_3' | 'digital_wellbeing' | 'orthopedics' | 'person_check' | 'crowdsource' | 'vital_signs' | 'skeleton' | 'person_alert' | 'tibia' | 'footprint' | 'cognition_2' | 'nutrition' | 'mountain_flag' | 'humerus' | 'sentiment_sad' | 'foot_bones' | 'chess' | 'star_shine' | 'agender' | 'tibia_alt' | 'femur' | 'stethoscope' | 'femur_alt' | 'humerus_alt' | 'sentiment_excited' | 'ulna_radius' | 'destruction' | 'diamond_shine' | 'demography' | 'clinical_notes' | 'ulna_radius_alt' | 'breastfeeding' | 'specific_gravity' | 'cardiology' | 'raven' | 'kid_star' | 'sentiment_calm' | 'cheer' | 'conditions' | 'eyeglasses_2' | 'lab_research' | 'domino_mask' | 'genetics' | 'altitude' | 'crossword' | 'sentiment_stressed' | 'crown' | 'pill' | 'taunt' | 'family_star' | 'sentiment_frustrated' | 'simulation' | 'deceased' | 'earthquake' | 'cookie_off' | 'explosion' | 'weather_hail' | 'cardio_load' | 'folded_hands' | 'person_apron' | 'bomb' | 'emoticon' | 'home_health' | 'brick' | 'comic_bubble' | 'chess_pawn' | 'comedy_mask' | 'sentiment_content' | 'barefoot' | 'share_off' | 'owl' | 'blood_pressure' | 'guardian' | 'person_cancel' | 'playing_cards' | 'pulse_alert' | 'weather_mix' | 'prescriptions' | 'orbit' | 'conversation' | 'stars_2' | 'microbiology' | 'glucose' | 'wrist' | 'falling' | 'lab_panel' | 'sentiment_worried' | 'person_heart' | 'skull_list' | 'sword_rose' | 'heart_smile' | 'helicopter' | 'not_accessible_forward' | 'ent' | 'family_group' | 'recent_patient' | 'poker_chip' | 'planet' | 'mist' | 'pulmonology' | 'syringe' | 'water_bottle' | 'metabolism' | 'chef_hat' | 'globe_book' | 'health_cross' | 'snowing_heavy' | 'allergy' | 'partner_heart' | 'siren' | 'thumbs_up_double' | 'moon_stars' | 'dew_point' | 'rainy_snow' | 'water_lux' | 'candle' | 'manga' | 'pediatrics' | 'prayer_times' | 'stethoscope_check' | 'infrared' | 'admin_meds' | 'allergies' | 'dermatology' | 'pregnancy' | 'rainy_heavy' | 'body_system' | 'eyeglasses_2_sound' | 'heart_arrow' | 'menu_book_2' | 'mixture_med' | 'nephrology' | 'oxygen_saturation' | 'square_dot' | 'water_do' | 'face_down' | 'oncology' | 'surgical' | 'symptoms' | 'chess_queen' | 'rainy_light' | 'cannabis' | 'face_shake' | 'hand_meal' | 'ophthalmology' | 'procedure' | 'respiratory_rate' | 'hand_package' | 'hematology' | 'humidity_percentage' | 'outpatient' | 'body_fat' | 'chess_king' | 'chess_knight' | 'congenital' | 'gynecology' | 'siren_check' | 'ward' | 'water_orp' | 'child_hat' | 'face_nod' | 'gastroenterology' | 'oral_disease' | 'short_stay' | 'water_ph' | 'moving_beds' | 'stethoscope_arrow' | 'water_ec' | 'shield_watch' | 'chess_rook' | 'immunology' | 'medical_mask' | 'water_bottle_large' | 'drone_2' | 'face_left' | 'outpatient_med' | 'siren_question' | 'wounds_injuries' | 'chess_bishop' | 'endocrinology' | 'fluid_balance' | 'fluid_med' | 'massage' | 'acupuncture' | 'chess_king_2' | 'drone' | 'face_right' | 'face_up' | 'fluid' | 'inpatient' | 'water_voc' | 'pill_off' | 'playground' | 'salinity' | 'siren_open' | 'urology' | 'chess_pawn_2' | 'playground_2' | 'total_dissolved_solids' | 'calendar_meal' | 'chess_bishop_2' | 'dine_in' | 'table_sign' | 'settings_seating' | 'account_circle' | 'account_circle' | 'info' | 'visibility' | 'calendar_month' | 'schedule' | 'warning' | 'help' | 'language' | 'lock' | 'error' | 'visibility_off' | 'verified' | 'manage_accounts' | 'history' | 'task_alt' | 'event' | 'bookmark' | 'calendar_today' | 'lightbulb' | 'question_mark' | 'category' | 'fingerprint' | 'update' | 'code' | 'priority_high' | 'build' | 'lock_open' | 'date_range' | 'supervisor_account' | 'upload_file' | 'ads_click' | 'event_available' | 'bug_report' | 'touch_app' | 'power_settings_new' | 'today' | 'pending' | 'preview' | 'stars' | 'celebration' | 'translate' | 'account_box' | 'how_to_reg' | 'alarm' | 'edit_square' | 'edit_calendar' | 'extension' | 'label' | 'record_voice_over' | 'web' | 'rate_review' | 'hourglass_empty' | 'event_note' | 'published_with_changes' | 'support' | 'notification_important' | 'accessibility_new' | 'help_center' | 'bookmarks' | 'dangerous' | 'pan_tool_alt' | 'all_inclusive' | 'interests' | 'supervised_user_circle' | 'rule' | 'collections_bookmark' | 'priority' | 'change_history' | 'api' | 'event_upcoming' | 'build_circle' | 'wysiwyg' | 'pan_tool' | 'hotel_class' | 'web_asset' | 'model_training' | 'circle_notifications' | 'manage_history' | 'upgrade' | 'input' | 'accessible' | 'bookmark_add' | 'lock_reset' | 'event_busy' | 'more_time' | 'home_app_logo' | 'backup' | 'flutter_dash' | 'pageview' | 'accessibility' | 'save_as' | 'dynamic_feed' | 'alarm_on' | 'label_important' | 'approval' | 'perm_contact_calendar' | 'square_foot' | 'history_toggle_off' | 'component_exchange' | 'swipe' | 'more' | 'target' | 'event_repeat' | 'bookmark_added' | 'unpublished' | 'open_in_browser' | 'notification_add' | 'offline_bolt' | 'feedback' | 'no_accounts' | 'running_with_errors' | 'background_replace' | 'free_cancellation' | 'webhook' | 'anchor' | 'lock_person' | '3d_rotation' | 'manufacturing' | 'new_label' | 'lock_clock' | 'accessible_forward' | 'add_alert' | 'auto_delete' | 'gesture' | 'domain_verification' | 'outbound' | 'hand_gesture' | 'online_prediction' | 'chrome_reader_mode' | 'lightbulb_circle' | 'settings_power' | 'find_replace' | 'edit_notifications' | 'offline_pin' | 'http' | 'backup_table' | 'wifi_protected_setup' | 'alarm_add' | 'code_blocks' | 'web_traffic' | 'bookmark_remove' | 'pinch_zoom_out' | 'keep' | 'on_device_training' | 'snooze' | 'batch_prediction' | 'code_off' | 'commit' | 'pinch_zoom_in' | 'hourglass_disabled' | 'youtube_activity' | 'arrow_selector_tool' | 'settings_overscan' | 'logo_dev' | 'polymer' | 'alarm_off' | 'voice_over_off' | 'timer_10_alt_1' | 'time_auto' | 'update_disabled' | 'person_add_disabled' | 'rounded_corner' | 'approval_delegation' | 'timer_3_alt_1' | 'label_off' | 'all_out' | 'rsvp' | 'web_asset_off' | 'pin_invoke' | 'license' | 'developer_guide' | 'pin_end' | 'award_star' | 'contacts_product' | 'calendar_clock' | 'problem' | 'sdk' | 'lists' | 'feature_search' | 'release_alert' | 'user_attributes' | 'hourglass' | 'lock_open_right' | 'reminder' | 'data_loss_prevention' | 'keep_off' | 'browse' | 'select_window' | 'flutter' | 'indeterminate_question_box' | 'visibility_lock' | 'delete_history' | 'settings_account_box' | 'ad' | 'ad_group' | 'pan_zoom' | 'person_edit' | 'search_activity' | 'search_hands_free' | 'info_i' | 'account_child_invert' | 'add_ad' | 'wand_stars' | 'circles_ext' | 'gesture_select' | 'account_circle_off' | 'shift' | 'touch_long' | 'select_window_2' | 'book_ribbon' | 'draft_orders' | 'keep_public' | 'account_child' | 'bookmark_star' | 'trackpad_input' | 'watch_screentime' | 'history_2' | 'fingerprint_off' | 'help_clinic' | 'ad_group_off' | 'bookmark_manager' | 'bookmark_check' | 'bookmark_flag' | 'shadow' | 'circles' | 'calendar_check' | 'history_off' | 'timer_pause' | 'pinboard' | 'wand_shine' | 'ad_off' | 'measuring_tape' | 'water_lock' | 'approval_delegation_off' | 'shadow_add' | 'timer_play' | 'alarm_smart_wake' | 'lock_open_circle' | 'scrollable_header' | 'bookmark_heart' | 'power_settings_circle' | 'preview_off' | 'supervised_user_circle_off' | 'unlicense' | 'select_window_off' | 'shift_lock' | 'touch_double' | 'warning_off' | 'alarm_pause' | 'domain_verification_off' | 'hourglass_pause' | 'shadow_minus' | 'touch_triple' | 'bookmark_bag' | 'hand_gesture_off' | 'shift_lock_off' | 'translate_indic' | 'pinboard_unread' | 'verified_off' | 'bookmark_stacks' | 'offline_pin_off' | 'calendar_lock' | 'trackpad_input_3' | 'trackpad_input_2' | 'mail' | 'mail' | 'call' | 'notifications' | 'send' | 'chat' | 'link' | 'forum' | 'inventory_2' | 'chat_bubble' | 'contact_support' | 'phone_in_talk' | 'notifications_active' | 'alternate_email' | 'sms' | 'hub' | 'comment' | 'person_search' | 'import_contacts' | 'contacts' | 'contact_mail' | 'live_help' | 'forward_to_inbox' | 'reviews' | 'lan' | 'mark_email_unread' | 'hourglass_top' | 'contact_phone' | 'inbox' | 'mode_comment' | 'drafts' | 'outgoing_mail' | 'hourglass_bottom' | 'mark_email_read' | 'link_off' | 'calendar_add_on' | 'add_comment' | 'g_translate' | 'phone_enabled' | 'speaker_notes' | 'co_present' | 'perm_phone_msg' | 'network_intelligence' | 'notifications_off' | 'call_end' | 'cell_tower' | 'topic' | 'mark_chat_unread' | 'schedule_send' | 'satellite_alt' | 'dialpad' | 'call_made' | 'mark_unread_chat_alt' | '3p' | 'unarchive' | 'cancel_presentation' | 'next_plan' | 'move_to_inbox' | 'attach_email' | 'mark_as_unread' | 'unsubscribe' | 'present_to_all' | 'phone_callback' | 'call_split' | 'call_received' | 'settings_phone' | 'voice_chat' | 'add_call' | 'phone_forwarded' | 'all_inbox' | 'markunread_mailbox' | 'attribution' | 'mail_lock' | 'voicemail' | 'contact_emergency' | 'mark_chat_read' | 'duo' | 'upcoming' | 'phone_disabled' | 'picture_in_picture_alt' | 'swap_calls' | 'outbox' | 'spoke' | 'ring_volume' | 'cancel_schedule_send' | 'notifications_paused' | 'quickreply' | 'chat_add_on' | 'threat_intelligence' | 'picture_in_picture' | 'phone_missed' | 'comment_bank' | 'send_and_archive' | 'comments_disabled' | 'video_chat' | 'settings_bluetooth' | 'score' | 'call_merge' | 'pause_presentation' | 'speaker_phone' | 'auto_read_play' | 'speaker_notes_off' | 'cell_wifi' | 'mms' | 'play_for_work' | 'call_missed_outgoing' | 'call_missed' | 'wifi_channel' | 'phone_paused' | 'calendar_apps_script' | 'rtt' | 'auto_read_pause' | 'wifi_calling' | 'phone_locked' | 'chat_apps_script' | 'dialer_sip' | 'sip' | 'nat' | 'phone_bluetooth_speaker' | 'e911_avatar' | 'inbox_customize' | 'stacked_email' | 'network_intel_node' | 'chat_info' | 'tooltip' | 'notifications_unread' | 'for_you' | 'chat_error' | 'group_search' | 'business_messages' | 'network_intelligence_history' | 'thread_unread' | 'chat_paste_go' | 'call_quality' | 'notification_multiple' | 'tooltip_2' | 'call_log' | 'network_intelligence_update' | 'network_manage' | 'mail_off' | 'stacked_inbox' | 'ods' | 'mobile_cancel' | 'outbox_alt' | 'picture_in_picture_small' | 'wifi_add' | 'inbox_text' | 'inbox_text_person' | 'picture_in_picture_off' | 'picture_in_picture_center' | 'notification_settings' | 'notification_sound' | 'mail_shield' | 'picture_in_picture_mobile' | 'signal_cellular_add' | 'inbox_text_share' | 'mobile_sound' | 'odt' | 'chat_paste_go_2' | 'picture_in_picture_medium' | 'inbox_text_asterisk' | 'wifi_proxy' | 'mobile_sound_off' | 'picture_in_picture_large' | 'mail_asterisk' | 'chat_dashed' | 'voicemail_2' | 'edit' | 'edit' | 'photo_camera' | 'image' | 'tune' | 'timer' | 'picture_as_pdf' | 'circle' | 'palette' | 'add_a_photo' | 'photo_library' | 'auto_stories' | 'add_photo_alternate' | 'brush' | 'imagesmode' | 'nature' | 'flash_on' | 'camera' | 'wb_sunny' | 'looks_one' | 'straighten' | 'landscape' | 'timelapse' | 'slideshow' | 'crop_square' | 'rotate_right' | 'grid_on' | 'aspect_ratio' | 'crop_free' | 'adjust' | 'style' | 'brightness_6' | 'photo' | 'image_search' | 'nature_people' | 'crop' | 'filter_vintage' | 'compare' | 'center_focus_strong' | 'blur_on' | 'contrast' | 'looks_two' | 'wb_incandescent' | 'flare' | 'colorize' | 'rotate_left' | 'wb_twilight' | 'filter_none' | 'filter_drama' | 'healing' | 'looks_3' | 'animation' | 'brightness_5' | 'incomplete_circle' | 'broken_image' | 'invert_colors' | 'opacity' | 'filter_center_focus' | 'auto_awesome_motion' | 'center_focus_weak' | 'flip' | 'brightness_4' | 'flip_camera_android' | 'flash_off' | 'web_stories' | 'no_photography' | 'lens_blur' | 'mic_external_on' | 'grain' | 'details' | 'flaky' | 'panorama' | 'gif_box' | 'loupe' | 'exposure_plus_1' | 'dehaze' | 'auto_awesome_mosaic' | 'settings_brightness' | 'texture' | 'looks_4' | 'filter_1' | 'timer_off' | 'filter' | 'flip_camera_ios' | 'hide_image' | 'transform' | 'brightness_1' | 'brightness_7' | 'control_point_duplicate' | 'view_compact' | 'photo_camera_front' | 'photo_album' | 'view_comfy' | 'crop_16_9' | 'linked_camera' | 'looks' | 'looks_5' | 'rotate_90_degrees_ccw' | 'gif' | 'exposure' | 'leak_add' | 'hdr_auto' | 'hdr_strong' | 'vrpano' | 'brightness_3' | 'gradient' | 'crop_portrait' | 'crop_7_5' | 'motion_photos_auto' | 'camera_roll' | 'blur_circular' | 'rotate_90_degrees_cw' | 'photo_size_select_small' | 'brightness_2' | 'shutter_speed' | 'looks_6' | 'deblur' | 'flash_auto' | 'filter_2' | 'crop_landscape' | 'filter_tilt_shift' | 'monochrome_photos' | 'night_sight_auto' | 'tonality' | 'motion_photos_paused' | 'crop_5_4' | 'photo_frame' | 'ev_shadow' | 'crop_rotate' | 'hdr_weak' | 'filter_4' | 'filter_3' | 'crop_3_2' | 'fluorescent' | 'exposure_zero' | 'raw_on' | 'photo_size_select_large' | 'switch_camera' | 'macro_off' | 'panorama_horizontal' | 'face_retouching_off' | 'filter_frames' | 'party_mode' | 'motion_blur' | 'filter_b_and_w' | 'blur_linear' | 'exposure_plus_2' | 'wb_iridescent' | 'exposure_neg_1' | 'photo_camera_back' | 'switch_video' | 'hdr_on' | 'burst_mode' | 'blur_medium' | 'filter_5' | 'invert_colors_off' | 'panorama_photosphere' | 'filter_7' | 'timer_10' | 'grid_off' | 'filter_9_plus' | 'filter_8' | 'dirty_lens' | 'timer_3' | 'blur_short' | 'filter_9' | 'image_aspect_ratio' | 'trail_length' | 'wb_shade' | 'vignette' | 'no_flash' | 'filter_6' | 'leak_remove' | 'exposure_neg_2' | 'blur_off' | 'perm_camera_mic' | '60fps_select' | '30fps_select' | 'trail_length_medium' | 'trail_length_short' | 'autofps_select' | 'mic_external_off' | 'panorama_vertical' | 'night_sight_auto_off' | 'gallery_thumbnail' | 'panorama_wide_angle' | 'hdr_off' | 'hdr_enhanced_select' | 'mp' | 'hdr_on_select' | '24mp' | 'photo_prints' | '22mp' | '10mp' | '12mp' | 'hdr_auto_select' | 'hevc' | '18mp' | 'hdr_plus' | 'wb_auto' | 'raw_off' | 'settings_b_roll' | 'masked_transitions' | '9mp' | '13mp' | '20mp' | '3mp' | '5mp' | '15mp' | '19mp' | '7mp' | 'hdr_off_select' | '23mp' | '2mp' | '16mp' | '8mp' | '14mp' | '6mp' | '11mp' | '17mp' | '21mp' | '4mp' | 'reset_settings' | 'motion_photos_on' | 'settings_photo_camera' | 'planner_banner_ad_pt' | 'settings_video_camera' | 'vr180_create2d' | 'photo_auto_merge' | 'landscape_2' | 'settings_timelapse' | 'transition_fade' | 'crop_9_16' | 'transition_push' | 'unknown_2' | 'settings_night_sight' | '50mp' | 'background_grid_small' | 'motion_mode' | 'image_arrow_up' | 'motion_play' | 'settings_cinematic_blur' | 'transition_slide' | 'settings_panorama' | 'transition_dissolve' | 'vr180_create2d_off' | 'macro_auto' | 'reset_focus' | 'timer_1' | 'gif_2' | 'background_dot_small' | 'settings_motion_mode' | 'settings_slow_motion' | 'high_res' | 'reset_iso' | 'background_dot_large' | 'high_density' | 'timer_2' | 'filter_retrolux' | 'shutter_speed_add' | 'view_real_size' | 'masked_transitions_add' | 'shutter_speed_minus' | 'file_png' | 'texture_add' | 'contrast_circle' | 'texture_minus' | 'reset_brightness' | 'dropper_eye' | 'landscape_2_off' | 'vignette_2' | 'auto_stories_off' | 'low_density' | 'mobile_camera_front' | 'tonality_2' | '24fps_select' | 'reset_shutter_speed' | 'transition_chop' | 'contrast_rtl_off' | 'ev_shadow_add' | 'contrast_square' | 'hdr_plus_off' | 'reset_shadow' | 'image_inset' | 'landscape_2_edit' | 'mobile_camera_rear' | 'ev_shadow_minus' | 'reset_exposure' | 'reset_white_balance' | 'shopping_cart' | 'shopping_cart' | 'payments' | 'monitoring' | 'shopping_bag' | 'credit_card' | 'attach_money' | 'database' | 'receipt_long' | 'trending_up' | 'storefront' | 'sell' | 'account_balance' | 'work' | 'paid' | 'analytics' | 'account_balance_wallet' | 'query_stats' | 'savings' | 'store' | 'bar_chart' | 'calculate' | 'account_tree' | 'qr_code_scanner' | 'add_shopping_cart' | 'redeem' | 'receipt' | 'currency_exchange' | 'trending_flat' | 'shopping_basket' | 'domain' | 'qr_code_2' | 'precision_manufacturing' | 'leaderboard' | 'qr_code' | 'timeline' | 'corporate_fare' | 'wallet' | 'insert_chart' | 'show_chart' | 'currency_rupee' | 'meeting_room' | 'work_history' | 'euro' | 'credit_score' | 'loyalty' | 'barcode_scanner' | 'pie_chart' | 'conversion_path' | 'trending_down' | 'copyright' | 'barcode' | 'track_changes' | 'price_check' | 'schema' | 'euro_symbol' | 'add_business' | 'add_card' | 'card_membership' | 'currency_bitcoin' | 'price_change' | 'production_quantity_limits' | 'donut_large' | 'tenancy' | 'data_exploration' | 'contactless' | 'bubble_chart' | 'donut_small' | 'money' | 'stacked_line_chart' | 'money_off' | 'stacked_bar_chart' | 'cases' | 'toll' | 'area_chart' | 'currency_yen' | 'atr' | 'currency_pound' | 'add_chart' | 'remove_shopping_cart' | 'room_preferences' | 'shop' | 'grouped_bar_chart' | 'domain_add' | 'scatter_plot' | 'card_travel' | 'legend_toggle' | 'mediation' | 'ssid_chart' | 'credit_card_off' | 'domain_disabled' | 'candlestick_chart' | 'waterfall_chart' | 'full_stacked_bar_chart' | 'currency_ruble' | 'finance_mode' | 'troubleshoot' | 'atm' | 'strikethrough_s' | 'shop_two' | 'search_insights' | 'next_week' | 'shoppingmode' | 'multiline_chart' | 'bar_chart_4_bars' | 'data_table' | 'currency_lira' | 'chart_data' | 'currency_yuan' | 'finance' | 'no_meeting_room' | 'enterprise' | 'network_node' | 'currency_franc' | 'orders' | 'flowchart' | 'money_bag' | 'source_environment' | 'bid_landscape' | 'graph_2' | 'flowsheet' | 'graph_3' | 'family_history' | 'delivery_truck_speed' | 'podium' | 'database_search' | 'planner_review' | 'conveyor_belt' | 'graph_5' | 'order_approve' | 'cards_star' | 'universal_currency_alt' | 'graph_4' | 'box' | 'contactless_off' | 'graph_7' | 'checkbook' | 'database_upload' | 'graph_1' | 'energy' | 'quick_reorder' | 'universal_currency' | 'send_money' | 'mintmark' | 'mitre' | 'currency_rupee_circle' | 'credit_card_heart' | 'delivery_truck_bolt' | 'money_range' | 'credit_card_clock' | 'forklift' | 'trolley' | 'work_alert' | 'percent_discount' | 'barcode_reader' | 'shopping_bag_speed' | 'front_loader' | 'graph_6' | 'inactive_order' | 'pallet' | 'qr_code_2_add' | 'order_play' | 'credit_card_gear' | 'work_update' | 'enterprise_off' | 'upi_pay' | 'payment_arrow_down' | 'conversion_path_off' | 'box_add' | 'receipt_long_off' | 'database_off' | 'bar_chart_off' | 'bid_landscape_disabled' | 'box_edit' | 'payment_card' | 'shopping_cart_off' | 'briefcase_meal' | 'pin_drop' | 'pin_drop' | 'location_on' | 'map' | 'home_pin' | 'explore' | 'flag' | 'restaurant' | 'my_location' | 'local_fire_department' | 'local_mall' | 'person_pin_circle' | 'near_me' | 'where_to_vote' | 'business_center' | 'east' | 'handyman' | 'factory' | 'local_library' | 'layers' | 'medical_services' | 'local_activity' | 'home_work' | 'emergency' | 'share_location' | 'north_east' | 'add_location' | 'fastfood' | 'navigation' | 'warehouse' | 'person_pin' | 'home_repair_service' | 'local_parking' | 'local_police' | 'local_hospital' | 'south' | 'crisis_alert' | 'zoom_out_map' | 'location_searching' | 'local_florist' | 'location_away' | 'park' | 'local_gas_station' | 'west' | 'maps_ugc' | 'cleaning_services' | '360' | 'local_atm' | 'flag_circle' | 'package' | 'electrical_services' | 'directions' | 'north' | 'add_location_alt' | 'theater_comedy' | 'fmd_bad' | 'alt_route' | 'local_pizza' | 'location_home' | 'signpost' | 'beenhere' | 'local_drink' | 'not_listed_location' | 'wine_bar' | 'local_post_office' | 'traffic' | 'local_convenience_store' | 'tour' | 'trip_origin' | 'safety_check' | 'church' | 'local_laundry_service' | 'moving' | 'ev_station' | 'takeout_dining' | 'zoom_in_map' | 'pest_control' | 'soup_kitchen' | 'stadium' | 'location_off' | 'transfer_within_a_station' | 'connecting_airports' | 'plumbing' | 'multiple_stop' | 'wrong_location' | 'edit_location' | 'minor_crash' | 'mode_of_travel' | 'south_east' | 'add_road' | 'local_pharmacy' | 'fire_truck' | 'castle' | 'globe' | 'dry_cleaning' | 'set_meal' | 'baby_changing_station' | 'north_west' | 'edit_location_alt' | 'layers_clear' | 'mosque' | 'edit_attributes' | 'local_car_wash' | 'run_circle' | 'sos' | 'transit_enterexit' | 'satellite' | 'edit_road' | 'streetview' | 'south_west' | 'kebab_dining' | 'add_home' | 'airline_stops' | 'local_see' | 'fire_hydrant' | 'remove_road' | 'assist_walker' | 'add_home_work' | 'fort' | 'flight_class' | 'no_meals' | 'location_disabled' | 'synagogue' | 'temple_buddhist' | 'compass_calibration' | 'temple_hindu' | 'package_2' | 'pest_control_rodent' | 'explore_off' | 'directions_alt' | 'globe_asia' | 'near_me_disabled' | 'flag_2' | 'pergola' | 'directions_off' | 'things_to_do' | 'globe_uk' | 'globe_location_pin' | 'flag_check' | 'pet_supplies' | 'explore_nearby' | 'share_eta' | 'map_search' | 'file_map' | 'directions_alt_off' | 'universal_local' | 'add_triangle' | 'moved_location' | 'moving_ministry' | 'multiple_airports' | 'safety_check_off' | 'move_location' | 'move' | 'file_map_stack' | 'map_pin_review' | 'map_pin_heart' | 'award_meal' | 'takeout_dining_2' | 'meal_lunch' | 'hanami_dango' | 'rest_area' | 'soba' | 'udon' | 'solo_dining' | 'calendar_meal_2' | 'kanji_alcohol' | 'meal_dinner' | 'parent_child_dining' | 'shaved_ice' | 'yakitori' | 'tatami_seat' | 'description' | 'description' | 'content_copy' | 'dashboard' | 'edit_note' | 'menu_book' | 'grid_view' | 'list' | 'folder' | 'list_alt' | 'inventory' | 'article' | 'folder_open' | 'fact_check' | 'attach_file' | 'format_list_bulleted' | 'assignment' | 'checklist' | 'task' | 'cloud' | 'cloud_upload' | 'draft' | 'summarize' | 'draw' | 'file_copy' | 'newspaper' | 'view_list' | 'design_services' | 'note_add' | 'book' | 'history_edu' | 'border_color' | 'format_quote' | 'pending_actions' | 'request_quote' | 'post_add' | 'cloud_download' | 'table' | 'drag_handle' | 'contact_page' | 'archive' | 'space_dashboard' | 'content_paste' | 'percent' | 'attachment' | 'assignment_ind' | 'format_list_numbered' | 'assignment_turned_in' | 'tag' | 'table_chart' | 'text_fields' | 'docs' | 'integration_instructions' | 'dashboard_customize' | 'sticky_note_2' | 'find_in_page' | 'format_bold' | 'text_snippet' | 'reorder' | 'document_scanner' | 'checklist_rtl' | 'edit_document' | 'cloud_done' | 'cloud_sync' | 'note_alt' | 'table_rows' | 'perm_media' | 'data_object' | 'notes' | 'table_view' | 'title' | 'content_cut' | 'subject' | 'functions' | 'content_paste_search' | 'format_italic' | 'format_color_fill' | 'folder_shared' | 'horizontal_rule' | 'cloud_off' | 'plagiarism' | 'folder_copy' | 'file_present' | 'format_paint' | 'team_dashboard' | 'difference' | 'view_column' | 'add_link' | 'ballot' | 'format_align_left' | 'read_more' | 'view_agenda' | 'format_size' | 'toc' | 'format_underlined' | 'vertical_align_top' | 'height' | 'low_priority' | 'copy_all' | 'format_color_text' | 'vertical_align_bottom' | 'view_week' | 'assignment_late' | 'drive_file_move' | 'drive_folder_upload' | 'view_module' | 'segment' | 'square' | 'assignment_return' | 'polyline' | 'folder_special' | 'calendar_view_month' | 'format_align_center' | 'folder_zip' | 'breaking_news_alt_1' | 'grading' | 'format_align_right' | 'linear_scale' | 'edit_off' | 'view_headline' | 'view_carousel' | 'view_quilt' | 'request_page' | 'text_increase' | 'text_format' | 'hexagon' | 'pages' | 'view_sidebar' | 'add_to_drive' | 'calendar_view_week' | 'numbers' | 'docs_add_on' | 'format_align_justify' | 'counter_1' | 'video_file' | 'join_inner' | 'format_shapes' | 'calendar_view_day' | 'folder_delete' | 'forms_add_on' | 'font_download' | 'format_list_numbered_rtl' | 'imagesearch_roller' | 'content_paste_go' | 'files' | 'cloud_circle' | 'restore_page' | 'format_color_reset' | 'vertical_split' | 'rectangle' | 'rule_folder' | 'spellcheck' | 'view_stream' | 'format_indent_increase' | 'data_array' | 'pivot_table_chart' | 'assignment_returned' | 'merge_type' | 'automation' | 'align_horizontal_left' | 'short_text' | 'text_decrease' | 'space_bar' | 'pentagon' | 'vertical_align_center' | 'join_left' | 'deselect' | 'view_day' | 'function' | 'flip_to_front' | 'format_strikethrough' | 'border_all' | 'shape_line' | 'format_line_spacing' | 'line_weight' | 'contract' | 'join_right' | 'subtitles_off' | 'horizontal_split' | 'align_horizontal_center' | 'format_indent_decrease' | 'counter_2' | 'snippet_folder' | 'format_clear' | 'folder_off' | 'glyphs' | 'align_vertical_bottom' | 'ink_eraser' | 'align_horizontal_right' | 'newsmode' | 'line_axis' | 'ink_pen' | 'content_paste_off' | 'insert_page_break' | 'contract_edit' | 'equal' | 'vertical_distribute' | 'line_style' | 'horizontal_distribute' | 'superscript' | 'news' | 'clarify' | 'counter_3' | 'flip_to_back' | 'align_vertical_center' | 'wrap_text' | 'align_vertical_top' | 'note_stack' | 'ink_highlighter' | 'frame_inspect' | 'finance_chip' | 'margin' | 'view_array' | 'dictionary' | 'subscript' | 'overview' | 'join' | 'assignment_add' | 'border_style' | 'border_clear' | 'note_stack_add' | 'signature' | 'amp_stories' | 'border_outer' | 'full_coverage' | 'book_2' | 'type_specimen' | 'export_notes' | 'forms_apps_script' | 'text_rotate_vertical' | 'csv' | 'padding' | 'docs_apps_script' | 'border_vertical' | 'colors' | 'text_rotation_none' | 'breaking_news' | 'counter_4' | 'format_textdirection_l_to_r' | 'file_save' | 'format_overline' | 'lab_profile' | 'unknown_document' | 'border_horizontal' | 'rubric' | 'font_download_off' | 'view_column_2' | 'format_textdirection_r_to_l' | 'select' | 'add_notes' | 'text_rotation_angleup' | 'diagnosis' | 'border_bottom' | 'format_h1' | 'border_inner' | 'shapes' | 'border_left' | 'border_top' | 'document_search' | 'text_rotation_down' | 'text_rotation_angledown' | 'match_case' | 'list_alt_check' | 'text_rotate_up' | 'border_right' | 'asterisk' | 'draw_abstract' | 'ink_selection' | 'book_5' | 'remove_selection' | 'slide_library' | 'counter_5' | 'grid_guides' | 'text_fields_alt' | 'folder_limited' | 'article_person' | 'variables' | 'format_ink_highlighter' | 'article_shortcut' | 'cell_merge' | 'cloud_alert' | 'format_list_bulleted_add' | 'frame_source' | 'voting_chip' | 'process_chart' | 'folder_managed' | 'cloud_lock' | 'format_underlined_squiggle' | 'reset_image' | 'book_4' | 'format_h2' | 'view_object_track' | 'table_chart_view' | 'stock_media' | 'text_ad' | 'format_paragraph' | 'regular_expression' | 'format_image_left' | 'custom_typography' | 'table_rows_narrow' | 'drive_export' | 'folder_code' | 'insert_text' | 'two_pager' | 'list_alt_add' | 'folder_data' | 'lasso_select' | 'table_eye' | 'counter_6' | 'line_curve' | 'ink_marker' | 'source_notes' | 'variable_add' | 'line_end_circle' | 'scan' | 'smb_share' | 'text_compare' | 'attach_file_add' | 'scan_delete' | 'stylus_laser_pointer' | 'person_book' | 'format_image_right' | 'sticky_note' | 'counter_0' | 'variable_insert' | 'brand_family' | 'counter_7' | 'folder_supervised' | 'dashboard_2' | 'format_letter_spacing' | 'contract_delete' | 'convert_to_text' | 'line_end_arrow_notch' | 'format_h3' | 'location_chip' | 'other_admission' | 'ungroup' | 'counter_9' | 'format_h5' | 'format_h6' | 'text_select_start' | 'business_chip' | 'format_h4' | 'ink_highlighter_move' | 'line_start_circle' | 'counter_8' | 'fit_width' | 'pen_size_1' | 'format_letter_spacing_standard' | 'markdown' | 'format_text_overflow' | 'stroke_partial' | 'add_column_right' | 'decimal_increase' | 'line_end' | 'line_end_arrow' | 'line_start_diamond' | 'file_copy_off' | 'post' | 'flex_wrap' | 'folder_match' | 'pageless' | 'pen_size_2' | 'stroke_full' | 'text_select_move_forward_character' | 'file_save_off' | 'frame_reload' | 'stack_hexagon' | 'diagonal_line' | 'folder_check' | 'folder_eye' | 'line_start' | 'draw_collage' | 'match_word' | 'book_3' | 'fit_page_width' | 'folder_info' | 'format_letter_spacing_2' | 'highlighter_size_5' | 'language_spanish' | 'thumbnail_bar' | 'language_korean_latin' | 'line_end_diamond' | 'assignment_globe' | 'letter_switch' | 'titlecase' | 'add_row_below' | 'language_us' | 'markdown_copy' | 'table_convert' | 'pen_size_3' | 'text_select_end' | 'text_select_move_down' | 'align_justify_space_even' | 'folder_check_2' | 'highlighter_size_3' | 'language_chinese_quick' | 'line_end_square' | 'pen_size_5' | 'table_edit' | 'text_select_move_back_word' | 'top_panel_close' | 'two_pager_store' | 'language_international' | 'match_case_off' | 'align_items_stretch' | 'align_justify_space_between' | 'flex_direction' | 'format_letter_spacing_wide' | 'format_letter_spacing_wider' | 'heap_snapshot_thumbnail' | 'special_character' | 'fit_page' | 'heap_snapshot_large' | 'heap_snapshot_multiple' | 'ink_eraser_off' | 'text_select_jump_to_beginning' | 'attach_file_off' | 'fit_page_height' | 'pen_size_4' | 'script' | 'sheets_rtl' | 'slab_serif' | 'flex_no_wrap' | 'highlighter_size_4' | 'language_french' | 'language_japanese_kana' | 'line_start_arrow' | 'stylus_fountain_pen' | 'text_select_move_forward_word' | 'text_select_move_up' | 'top_panel_open' | 'align_center' | 'combine_columns' | 'highlighter_size_1' | 'language_gb_english' | 'text_select_jump_to_end' | 'tsv' | 'eraser_size_1' | 'eraser_size_5' | 'format_text_wrap' | 'highlighter_size_2' | 'line_start_arrow_notch' | 'page_footer' | 'page_header' | 'text_select_move_back_character' | 'variable_remove' | 'align_flex_center' | 'align_justify_space_around' | 'line_start_square' | 'markdown_paste' | 'unknown_7' | 'add_row_above' | 'format_text_clip' | 'serif' | 'add_column_left' | 'align_justify_flex_start' | 'eraser_size_3' | 'eraser_size_4' | 'language_chinese_cangjie' | 'language_chinese_dayi' | 'align_self_stretch' | 'align_space_between' | 'book_6' | 'eraser_size_2' | 'language_pinyin' | 'align_justify_stretch' | 'align_space_even' | 'language_chinese_pinyin' | 'align_justify_center' | 'align_stretch' | 'decimal_decrease' | 'format_quote_off' | 'stylus_brush' | 'stylus_highlighter' | 'stylus_pencil' | 'uppercase' | 'align_flex_start' | 'align_start' | 'format_textdirection_vertical' | 'language_chinese_array' | 'language_chinese_wubi' | 'language_us_dvorak' | 'text_up' | 'align_flex_end' | 'align_justify_flex_end' | 'align_space_around' | 'language_us_colemak' | 'lowercase' | 'stylus_pen' | 'align_end' | 'play_arrow' | 'play_arrow' | 'play_circle' | 'mic' | 'videocam' | 'volume_up' | 'pause' | 'music_note' | 'library_books' | 'movie' | 'speed' | 'skip_next' | 'replay' | 'volume_off' | 'pause_circle' | 'view_in_ar' | 'fiber_manual_record' | 'stop' | 'stop_circle' | 'skip_previous' | 'equalizer' | 'subscriptions' | 'video_library' | 'fast_forward' | 'playlist_add' | 'video_call' | 'repeat' | 'volume_mute' | 'mic_off' | 'shuffle' | 'hearing' | 'podcasts' | 'library_music' | 'playlist_add_check' | 'fast_rewind' | 'video_camera_front' | 'subtitles' | 'sound_detection_dog_barking' | 'queue_music' | 'play_pause' | 'volume_down' | 'album' | 'discover_tune' | 'radio' | 'av_timer' | 'closed_caption' | 'library_add_check' | 'videocam_off' | 'stream' | 'fiber_new' | 'forward_10' | 'not_started' | 'replay_10' | 'text_to_speech' | 'playlist_play' | 'branding_watermark' | 'interpreter_mode' | 'playlist_remove' | 'recent_actors' | 'slow_motion_video' | 'frame_person' | 'playlist_add_check_circle' | 'video_settings' | 'settings_voice' | 'audio_file' | 'sound_detection_loud_sound' | 'featured_play_list' | 'brand_awareness' | 'lyrics' | 'hd' | 'play_lesson' | 'high_quality' | 'call_to_action' | 'video_camera_back' | 'repeat_one' | 'add_to_queue' | 'music_off' | 'spatial_audio_off' | 'speech_to_text' | 'shuffle_on' | 'volume_down_alt' | 'featured_video' | 'playlist_add_circle' | 'hearing_disabled' | 'replay_5' | 'repeat_on' | 'queue_play_next' | 'spatial_audio' | 'art_track' | 'explicit' | 'voice_selection' | 'airplay' | 'forward_30' | 'forward_5' | '4k' | 'music_video' | 'replay_30' | 'spatial_tracking' | 'control_camera' | 'closed_caption_disabled' | 'digital_out_of_home' | 'play_disabled' | 'animated_images' | 'fiber_smart_record' | 'video_label' | 'broadcast_on_personal' | 'instant_mix' | 'repeat_one_on' | 'sd' | 'missed_video_call' | 'surround_sound' | '10k' | 'fiber_pin' | 'sound_detection_glass_break' | '60fps' | 'broadcast_on_home' | 'remove_from_queue' | 'adaptive_audio_mic' | 'fiber_dvr' | '30fps' | '4k_plus' | 'video_stable' | 'ar_on_you' | '8k' | 'privacy' | '1k' | 'eye_tracking' | 'music_cast' | '2k' | '8k_plus' | 'resume' | '7k' | '9k' | '9k_plus' | '1k_plus' | '5k' | '2k_plus' | '6k' | 'artist' | '5k_plus' | '3k_plus' | '6k_plus' | '7k_plus' | '3k' | 'no_sound' | 'media_link' | 'genres' | 'hangout_video' | 'autoplay' | 'video_search' | 'movie_edit' | 'forward_media' | 'video_camera_front_off' | 'autopause' | 'cinematic_blur' | 'mic_double' | 'speed_2x' | 'ear_sound' | 'adaptive_audio_mic_off' | 'audio_description' | 'video_camera_back_add' | 'split_scene' | 'ar_stickers' | 'hearing_aid' | 'replace_image' | 'select_to_speak' | 'edit_audio' | 'forward_circle' | 'movie_info' | 'speed_1_5x' | 'frame_person_mic' | 'mic_alert' | 'replace_audio' | 'speed_0_2x' | 'speed_0_5x' | 'autostop' | '2d' | 'full_hd' | 'speed_0_75' | 'speed_1_25' | 'speed_0_7x' | '3d' | 'replace_video' | 'speed_0_5' | 'speed_1_2x' | 'av1' | 'avc' | 'music_note_add' | 'speed_1_5' | 'hangout_video_off' | 'speed_0_25' | 'speed_1_75' | 'closed_caption_add' | 'videocam_alert' | 'frame_person_off' | 'sound_sampler' | 'split_scene_up' | 'subtitles_gear' | 'speed_1_2' | 'movie_speaker' | 'spatial_speaker' | 'split_scene_left' | 'hearing_aid_left' | 'split_scene_right' | 'music_history' | 'view_in_ar_off' | 'speed_1_7x' | 'voice_selection_off' | 'split_scene_down' | 'hearing_aid_disabled' | 'movie_off' | 'hearing_aid_disabled_left' | 'local_shipping' | 'local_shipping' | 'directions_car' | 'flight' | 'directions_run' | 'directions_walk' | 'flight_takeoff' | 'directions_bus' | 'train' | 'directions_bike' | 'airport_shuttle' | 'pedal_bike' | 'directions_boat' | 'two_wheeler' | 'agriculture' | 'local_taxi' | 'sailing' | 'electric_car' | 'flight_land' | 'hail' | 'no_crash' | 'commute' | 'car_crash' | 'motorcycle' | 'tram' | 'departure_board' | 'subway' | 'electric_moped' | 'turn_right' | 'fork_right' | 'directions_subway' | 'electric_scooter' | 'tire_repair' | 'turn_left' | 'electric_bike' | 'rv_hookup' | 'bus_alert' | 'transportation' | 'airlines' | 'taxi_alert' | 'directions_railway' | 'u_turn_left' | 'electric_rickshaw' | 'turn_slight_right' | 'fork_left' | 'railway_alert' | 'u_turn_right' | 'turn_slight_left' | 'bike_scooter' | 'turn_sharp_right' | 'no_transfer' | 'turn_sharp_left' | 'snowmobile' | 'swap_driving_apps_wheel' | 'moped' | 'flyover' | 'road' | 'auto_transmission' | 'car_tag' | 'swap_driving_apps' | 'traffic_jam' | 'speed_camera' | 'auto_towing' | 'transit_ticket' | 'ambulance' | 'hov' | 'bus_railway' | 'car_gear' | 'plane_contrails' | 'unpaved_road' | 'bike_lane' | 'car_fan_low_left' | 'directions_railway_2' | 'fan_indirect' | 'garage_money' | 'metro' | 'seat_heat_left' | 'boat_bus' | 'car_fan_low_mid_left' | 'gondola_lift' | 'seat_cool_left' | 'seat_heat_right' | 'steering_wheel_heat' | 'car_fan_recirculate' | 'scooter' | 'bike_dock' | 'car_fan_low_right' | 'car_fan_mid_right' | 'monorail' | 'railway_alert_2' | 'windshield_defrost_front' | 'hvac_max_defrost' | 'cable_car' | 'car_fan_mid_left' | 'car_fan_mid_low_right' | 'car_lock' | 'fan_focus' | 'windshield_defrost_rear' | 'boat_railway' | 'car_defrost_low_right' | 'funicular' | 'garage_check' | 'parking_sign' | 'car_defrost_left' | 'car_defrost_mid_low_left' | 'car_defrost_mid_low_right' | 'car_defrost_mid_right' | 'car_defrost_right' | 'parking_meter' | 'parking_valet' | 'subway_walk' | 'trolley_cable_car' | 'car_defrost_low_left' | 'car_mirror_heat' | 'moped_package' | 'seat_cool_right' | 'seat_vent_right' | 'car_defrost_mid_left' | 'seat_vent_left' | 'windshield_defrost_auto' | 'windshield_heat_front' | 'school' | 'school' | 'campaign' | 'construction' | 'engineering' | 'volunteer_activism' | 'science' | 'sports_esports' | 'confirmation_number' | 'real_estate_agent' | 'cake' | 'self_improvement' | 'sports_soccer' | 'air' | 'biotech' | 'water' | 'hiking' | 'architecture' | 'sports_score' | 'sports_basketball' | 'personal_injury' | 'experiment' | 'waves' | 'theaters' | 'sports_tennis' | 'switch_account' | 'trophy' | 'sports_gymnastics' | 'how_to_vote' | 'backpack' | 'sports_motorsports' | 'surfing' | 'sports_kabaddi' | 'piano' | 'sports' | 'toys' | 'phishing' | 'swords' | 'sports_baseball' | 'sports_volleyball' | 'camping' | 'sports_martial_arts' | 'downhill_skiing' | 'scoreboard' | 'sports_football' | 'kayaking' | 'featured_seasonal_and_gifts' | 'sports_handball' | 'skateboarding' | 'sports_golf' | 'sports_cricket' | 'toys_fan' | 'nordic_walking' | 'scuba_diving' | 'roller_skating' | 'rowing' | 'kitesurfing' | 'storm' | 'rewarded_ads' | 'sports_mma' | 'paragliding' | 'sports_hockey' | 'snowboarding' | 'family_link' | 'ice_skating' | 'sprint' | 'steps' | 'sports_rugby' | 'snowshoeing' | 'readiness_score' | 'ecg_heart' | 'health_metrics' | 'sledding' | 'mindfulness' | 'ifl' | 'toys_and_games' | 'service_toolbox' | 'exercise' | 'person_celebrate' | 'person_play' | 'piano_off' | 'no_backpack' | 'interactive_space' | 'arrow_warm_up' | 'pace' | 'laps' | 'sports_and_outdoors' | 'distance' | 'avg_pace' | 'arrow_cool_down' | 'azm' | 'cake_add' | 'floor' | 'stress_management' | 'elevation' | 'avg_time' | 'newsstand' | 'menstrual_health' | 'relax' | 'cadence' | 'books_movies_and_music' | 'onsen' | 'water_full' | 'eda' | 'spo2' | 'hr_resting' | 'bath_outdoor' | 'water_medium' | 'fertile' | 'bath_private' | 'bia' | 'podiatry' | 'check_in_out' | 'sleep_score' | 'water_loss' | 'science_off' | 'cleaning' | 'glass_cup' | 'bath_public_large' | 'vo2_max' | 'sauna' | 'monitor_weight_gain' | 'physical_therapy' | 'badminton' | 'monitor_weight_loss' | 'padel' | 'pickleball' | 'dark_mode' | 'dark_mode' | 'light_mode' | 'wifi' | 'signal_cellular_alt' | 'password' | 'widgets' | 'android' | 'storage' | 'pin' | 'battery_full' | 'rss_feed' | 'wifi_off' | 'bluetooth' | 'battery_charging_full' | 'graphic_eq' | 'thermostat' | 'dvr' | 'nightlight' | 'battery_5_bar' | 'gpp_maybe' | 'signal_wifi_4_bar' | 'cable' | 'gpp_bad' | 'radar' | 'data_usage' | 'signal_cellular_4_bar' | 'battery_4_bar' | 'battery_full_alt' | 'battery_0_bar' | 'wallpaper' | 'cameraswitch' | 'flashlight_on' | 'signal_disconnected' | 'network_check' | 'battery_6_bar' | 'charger' | 'wifi_tethering' | 'adb' | 'sim_card_download' | 'usb' | 'quick_phrases' | 'splitscreen' | 'battery_1_bar' | 'battery_3_bar' | 'battery_alert' | 'network_wifi_3_bar' | 'battery_low' | 'network_wifi' | 'bluetooth_searching' | 'bluetooth_connected' | '5g' | 'battery_2_bar' | 'wifi_find' | 'network_cell' | 'nfc' | 'pattern' | 'bluetooth_disabled' | 'data_saver_on' | 'signal_cellular_3_bar' | 'signal_wifi_statusbar_not_connected' | 'signal_wifi_bad' | 'brightness_medium' | 'network_wifi_2_bar' | 'network_wifi_1_bar' | 'mode_standby' | 'signal_wifi_off' | 'noise_control_off' | 'battery_charging_90' | 'battery_very_low' | 'signal_wifi_0_bar' | 'battery_unknown' | 'battery_charging_20' | 'grid_4x4' | 'mobiledata_off' | 'battery_charging_80' | 'flashlight_off' | 'settings_system_daydream' | 'signal_wifi_statusbar_null' | 'battery_charging_50' | 'screen_rotation_alt' | 'signal_cellular_1_bar' | 'signal_cellular_2_bar' | '1x_mobiledata' | 'ios' | 'badge_critical_battery' | 'noise_aware' | 'do_not_disturb_on_total_silence' | 'wifi_lock' | '4g_mobiledata' | 'signal_cellular_connected_no_internet_0_bar' | 'nearby_error' | 'battery_charging_60' | 'signal_cellular_connected_no_internet_4_bar' | 'signal_cellular_0_bar' | 'network_ping' | 'battery_charging_30' | 'signal_cellular_nodata' | 'devices_fold' | 'brightness_auto' | 'wifi_tethering_error' | 'grid_3x3' | 'airplanemode_inactive' | 'wifi_2_bar' | 'perm_data_setting' | 'lte_mobiledata' | 'signal_cellular_alt_2_bar' | 'bluetooth_drive' | 'signal_cellular_off' | 'media_bluetooth_on' | 'network_locked' | '4g_plus_mobiledata' | 'apk_install' | 'perm_scan_wifi' | 'stylus_note' | 'wifi_1_bar' | 'signal_cellular_alt_1_bar' | 'timer_10_select' | 'wifi_tethering_off' | '3g_mobiledata' | 'usb_off' | 'dock_to_left' | 'signal_cellular_null' | 'screen_record' | 'apk_document' | 'brightness_alert' | 'lte_plus_mobiledata' | 'grid_goldenratio' | 'noise_control_on' | 'g_mobiledata' | 'portable_wifi_off' | 'media_bluetooth_off' | 'timer_3_select' | 'e_mobiledata' | 'r_mobiledata' | 'h_mobiledata' | 'nearby_off' | 'dual_screen' | 'h_plus_mobiledata' | 'contextual_token' | 'overview_key' | 'stylus' | 'bigtop_updates' | 'screenshot_region' | 'screenshot_frame' | 'dock_to_right' | 'brightness_empty' | 'nearby' | 'splitscreen_right' | 'splitscreen_left' | 'contextual_token_add' | 'password_2' | 'display_external_input' | 'screenshot_keyboard' | 'keyboard_keys' | 'dock_to_bottom' | 'battery_error' | 'splitscreen_add' | 'timer_5' | 'splitscreen_vertical_add' | 'screenshot_frame_2' | 'battery_status_good' | 'android_cell_4_bar' | 'keyboard_external_input' | 'network_wifi_3_bar_locked' | 'battery_android_5' | 'wallpaper_slideshow' | 'battery_android_6' | 'battery_plus' | 'magnify_docked' | 'magnify_fullscreen' | 'screen_rotation_up' | 'wifi_calling_bar_3' | 'android_cell_5_bar' | 'mobile_wrench' | 'splitscreen_bottom' | '1x_mobiledata_badge' | '5g_mobiledata_badge' | 'keyboard_off' | 'wifi_home' | 'backlight_low' | 'keyboard_full' | 'network_wifi_locked' | 'backlight_high_off' | 'battery_android_4' | 'battery_android_frame_full' | 'network_wifi_2_bar_locked' | 'timer_5_shutter' | '4g_mobiledata_badge' | 'backlight_high' | 'battery_android_bolt' | 'battery_android_full' | 'battery_android_question' | 'splitscreen_top' | 'devices_fold_2' | 'keyboard_capslock_badge' | 'password_2_off' | 'android_cell_4_bar_alert' | 'android_wifi_3_bar' | 'android_wifi_4_bar_off' | 'battery_android_1' | 'battery_change' | 'keyboard_previous_language' | 'android_wifi_4_bar_alert' | 'battery_android_2' | 'battery_android_frame_2' | 'battery_android_frame_5' | 'battery_android_plus' | 'keyboard_onscreen' | 'battery_android_frame_1' | 'e_mobiledata_badge' | 'wifi_notification' | '3g_mobiledata_badge' | 'android_cell_5_bar_plus' | 'android_wifi_3_bar_alert' | 'battery_android_0' | 'battery_android_3' | 'battery_android_frame_question' | 'battery_android_share' | 'battery_share' | 'network_wifi_1_bar_locked' | 'nfc_off' | 'wifi_calling_bar_2' | 'battery_android_alert' | 'battery_android_shield' | 'g_mobiledata_badge' | 'signal_cellular_pause' | 'wifi_calling_bar_1' | 'android_cell_4_bar_plus' | 'android_cell_dual_5_bar' | 'android_wifi_3_bar_off' | 'android_wifi_4_bar_plus' | 'battery_android_frame_6' | 'mobile_sensor_lo' | 'android_cell_4_bar_off' | 'android_cell_5_bar_off' | 'android_cell_dual_5_bar_plus' | 'android_wifi_3_bar_plus' | 'android_wifi_4_bar_question' | 'battery_android_frame_3' | 'battery_android_frame_bolt' | 'battery_android_frame_plus' | 'battery_android_frame_shield' | 'grid_3x3_off' | 'h_mobiledata_badge' | 'h_plus_mobiledata_badge' | 'lte_mobiledata_badge' | 'android_cell_5_bar_alert' | 'android_cell_dual_4_bar' | 'android_cell_dual_4_bar_plus' | 'android_wifi_4_bar' | 'lte_plus_mobiledata_badge' | 'mobile_sensor_hi' | 'android_cell_dual_5_bar_alert' | 'android_wifi_3_bar_question' | 'battery_android_frame_4' | 'battery_android_frame_alert' | 'android_cell_dual_4_bar_alert' | 'android_wifi_3_bar_lock' | 'android_wifi_4_bar_lock' | 'battery_android_frame_share' | 'ev_mobiledata_badge' | 'save' | 'save' | 'keyboard_arrow_down' | 'print' | 'computer' | 'devices' | 'desktop_windows' | 'dns' | 'smart_display' | 'headphones' | 'keyboard_backspace' | 'smart_toy' | 'memory' | 'keyboard_arrow_up' | 'keyboard_arrow_right' | 'keyboard' | 'tv' | 'live_tv' | 'laptop_mac' | 'headset_mic' | 'balance' | 'device_thermostat' | 'route' | 'mouse' | 'watch' | 'laptop_chromebook' | 'point_of_sale' | 'keyboard_arrow_left' | 'keyboard_return' | 'power' | 'laptop_windows' | 'developer_board' | 'router' | 'cast' | 'scale' | 'display_settings' | 'fax' | 'videogame_asset' | 'cast_for_education' | 'device_hub' | 'straight' | 'devices_other' | 'screen_search_desktop' | 'desktop_mac' | 'settings_ethernet' | 'settings_input_antenna' | 'monitor' | 'important_devices' | 'tablet_mac' | 'settings_remote' | 'merge' | 'screen_share' | 'keyboard_alt' | 'monitor_weight' | 'connected_tv' | 'tablet' | 'sim_card' | 'speaker' | 'settings_input_component' | 'keyboard_tab' | 'power_off' | 'screenshot_monitor' | 'remember_me' | 'browser_updated' | 'cast_connected' | 'sd_card' | 'tablet_android' | 'robot_2' | 'punch_clock' | 'settings_input_hdmi' | 'scanner' | 'keyboard_hide' | 'print_disabled' | 'speaker_group' | 'keyboard_capslock' | 'disc_full' | 'sd_card_alert' | 'earbuds' | 'lift_to_talk' | 'host' | 'tty' | 'mobile_off' | 'stop_screen_share' | 'headset_off' | 'desktop_access_disabled' | 'head_mounted_device' | 'reset_tv' | 'headphones_battery' | 'roundabout_right' | 'adf_scanner' | 'watch_off' | 'settop_component' | 'settings_input_svideo' | 'robot' | 'chromecast_device' | 'mobile' | 'no_sim' | 'home_max' | 'power_input' | 'earbuds_battery' | 'ramp_right' | 'developer_board_off' | 'roundabout_left' | 'tv_off' | 'devices_wearables' | 'home_mini' | 'ramp_left' | 'videogame_asset_off' | 'aod_tablet' | 'google_home_devices' | 'joystick' | 'gamepad' | 'security_key' | 'tv_options_edit_channels' | 'reset_wrench' | 'rear_camera' | 'developer_mode_tv' | 'hard_drive' | 'mobile_2' | 'camera_video' | 'jamboard_kiosk' | 'fitness_tracker' | 'touchpad_mouse' | 'mobile_arrow_down' | 'memory_alt' | 'aod_watch' | 'mimo' | 'mobile_3' | 'tv_options_input_settings' | 'media_output' | 'devices_off' | 'emoji_language' | 'desktop_cloud' | 'mimo_disconnect' | 'tv_signin' | 'lightning_stand' | 'desktop_cloud_stack' | 'ecg' | 'hard_disk' | 'device_band' | 'hard_drive_2' | 'add_diamond' | 'mobile_hand' | 'tv_guide' | 'watch_vibration' | 'mobile_arrow_right' | 'general_device' | 'tv_remote' | 'tv_displays' | 'watch_arrow' | 'watch_check' | 'keyboard_tab_rtl' | 'p2p' | 'missing_controller' | 'night_sight_max' | 'assistant_device' | 'smart_card_reader' | 'fitness_trackers' | 'media_output_off' | 'handheld_controller' | 'mobile_check' | 'plug_connect' | 'server_person' | 'touchpad_mouse_off' | 'computer_cancel' | 'mobile_lock_portrait' | 'open_jam' | 'mobile_layout' | 'watch_button_press' | 'watch_wake' | 'cast_warning' | 'deskphone' | 'audio_video_receiver' | 'laptop_car' | 'pacemaker' | 'screenshot_tablet' | 'cast_pause' | 'mobile_vibrate' | 'mobile_chat' | 'save_clock' | 'computer_arrow_up' | 'lda' | 'mobile_hand_left' | 'keyboard_lock' | 'earbuds_2' | 'mobile_code' | 'mobile_gear' | 'mobile_alert' | 'mobile_screensaver' | 'mobile_sound_2' | 'mobile_speaker' | 'mobile_info' | 'mobile_text_2' | 'earbud_left' | 'mobile_arrow_up_right' | 'mobile_block' | 'mobile_rotate' | 'mobile_camera' | 'mobile_share' | 'mouse_lock' | 'mouse_lock_off' | 'print_connect' | 'router_off' | 'tablet_camera' | 'ventilator' | 'circle_circle' | 'mobile_cast' | 'mobile_loupe' | 'mobile_rotate_lock' | 'mobile_ticket' | 'smart_card_reader_off' | 'earbud_right' | 'keyboard_lock_off' | 'mobile_charge' | 'mobile_question' | 'print_add' | 'b_circle' | 'earbud_case' | 'mobile_menu' | 'mobile_unlock' | 'print_lock' | 'tv_next' | 'arrows_up_down_circle' | 'mobile_hand_left_off' | 'mobile_hand_off' | 'mobile_landscape' | 'mobile_lock_landscape' | 'mobile_share_stack' | 'mobile_text' | 'print_error' | 'game_bumper_left' | 'game_button_zr' | 'game_trigger_right' | 'mobile_dots' | 'watch_lock' | 'x_circle' | 'y_circle' | 'arrows_left_right_circle' | 'game_bumper_right' | 'game_button_l' | 'game_button_l1' | 'game_button_l2' | 'game_button_r' | 'game_button_r1' | 'game_button_r2' | 'game_button_zl' | 'game_trigger_left' | 'gamepad_circle_down' | 'gamepad_circle_left' | 'gamepad_circle_right' | 'gamepad_circle_up' | 'gamepad_down' | 'gamepad_left' | 'gamepad_right' | 'gamepad_up' | 'rectangle_add' | 'square_circle' | 'triangle_circle' | 'badge' | 'badge' | 'verified_user' | 'report' | 'admin_panel_settings' | 'security' | 'policy' | 'shield' | 'vpn_key' | 'exclamation' | 'assured_workload' | 'privacy_tip' | 'vpn_lock' | 'e911_emergency' | 'disabled_visible' | 'enhanced_encryption' | 'encrypted' | 'private_connectivity' | 'vpn_key_off' | 'passkey' | 'add_moderator' | 'no_encryption' | 'key_visualizer' | 'sync_lock' | 'wifi_password' | 'remove_moderator' | 'report_off' | 'shield_lock' | 'shield_person' | 'id_card' | 'shield_locked' | 'policy_alert' | 'person_shield' | 'shield_question' | 'identity_aware_proxy' | 'encrypted_off' | 'vpn_lock_2' | 'vpn_key_alert' | 'shield_toggle' | 'encrypted_add' | 'encrypted_add_circle' | 'encrypted_minus_circle' | 'mobile_theft' | 'apartment' | 'apartment' | 'location_city' | 'fitness_center' | 'lunch_dining' | 'spa' | 'cottage' | 'local_cafe' | 'hotel' | 'family_restroom' | 'beach_access' | 'local_bar' | 'pool' | 'other_houses' | 'luggage' | 'liquor' | 'casino' | 'airplane_ticket' | 'room_service' | 'sports_bar' | 'bakery_dining' | 'ramen_dining' | 'local_dining' | 'nightlife' | 'icecream' | 'holiday_village' | 'escalator_warning' | 'dinner_dining' | 'museum' | 'festival' | 'attractions' | 'night_shelter' | 'food_bank' | 'golf_course' | 'stairs' | 'villa' | 'car_rental' | 'smoke_free' | 'airline_seat_recline_normal' | 'smoking_rooms' | 'elevator' | 'gite' | 'child_friendly' | 'airline_seat_recline_extra' | 'breakfast_dining' | 'carpenter' | 'car_repair' | 'cabin' | 'brunch_dining' | 'do_not_touch' | 'no_food' | 'travel' | 'houseboat' | 'tapas' | 'rice_bowl' | 'wheelchair_pickup' | 'bento' | 'airline_seat_flat' | 'do_not_step' | 'no_drinks' | 'bungalow' | 'escalator' | 'airline_seat_individual_suite' | 'chalet' | 'no_luggage' | 'airline_seat_legroom_extra' | 'airline_seat_flat_angled' | 'airline_seat_legroom_normal' | 'airline_seat_legroom_reduced' | 'no_stroller' | 'concierge' | 'flights_and_hotels' | 'personal_places' | 'trip' | 'stairs_2' | 'travel_luggage_and_bags' | 'personal_bag' | 'checked_bag' | 'personal_bag_question' | 'carry_on_bag_question' | 'passport' | 'your_trips' | 'checked_bag_question' | 'carry_on_bag_checked' | 'japanese_flag' | 'carry_on_bag' | 'japanese_curry' | 'beer_meal' | 'yoshoku' | 'personal_bag_off' | 'bath_bedrock' | 'washoku' | 'carry_on_bag_inactive' | 'mountain_steam' | 'okonomiyaki' | 'house' | 'house' | 'bed' | 'ac_unit' | 'chair' | 'electric_bolt' | 'coffee' | 'sensors' | 'child_care' | 'emergency_home' | 'back_hand' | 'checkroom' | 'grass' | 'shower' | 'mode_fan' | 'mop' | 'kitchen' | 'thermometer' | 'styler' | 'yard' | 'energy_savings_leaf' | 'bathtub' | 'king_bed' | 'roofing' | 'valve' | 'foundation' | 'window' | 'cooking' | 'garage_home' | 'door_front' | 'mode_heat' | 'light' | 'outdoor_grill' | 'garage' | 'dining' | 'table_restaurant' | 'sensor_occupied' | 'deck' | 'weekend' | 'coffee_maker' | 'highlight' | 'flatware' | 'humidity_high' | 'tv_gen' | 'fireplace' | 'humidity_low' | 'electric_meter' | 'mode_night' | 'humidity_mid' | 'scene' | 'bedroom_parent' | 'chair_alt' | 'blender' | 'microwave' | 'bedroom_baby' | 'hardware' | 'heat_pump' | 'oven_gen' | 'mode_cool' | 'single_bed' | 'mode_off_on' | 'in_home_mode' | 'bathroom' | 'hot_tub' | 'table_bar' | 'sprinkler' | 'home_iot_device' | 'gas_meter' | 'matter' | 'crib' | 'outlet' | 'countertops' | 'fire_extinguisher' | 'soap' | 'propane_tank' | 'gate' | 'living' | 'detector_smoke' | 'remote_gen' | 'energy_program_saving' | 'event_seat' | 'sensor_door' | 'dishwasher_gen' | 'faucet' | 'air_freshener' | 'switch' | 'water_damage' | 'balcony' | 'camera_indoor' | 'wash' | 'microwave_gen' | 'house_siding' | 'bedroom_child' | 'fence' | 'door_sliding' | 'energy_program_time_used' | 'emergency_heat' | 'iron' | 'water_heater' | 'umbrella' | 'desk' | 'apparel' | 'door_back' | 'doorbell' | 'dresser' | 'hvac' | 'emergency_share' | 'mode_fan_off' | 'air_purifier_gen' | 'camera_outdoor' | 'kettle' | 'curtains' | 'stroller' | 'multicooker' | 'sensors_off' | 'shield_moon' | 'mode_heat_cool' | 'emergency_recording' | 'smart_outlet' | 'blinds' | 'thermostat_auto' | 'controller_gen' | 'roller_shades' | 'family_home' | 'health_and_beauty' | 'blinds_closed' | 'lightbulb_2' | 'dry' | 'roller_shades_closed' | 'thermostat_carbon' | 'propane' | 'sensor_window' | 'doorbell_3p' | 'grocery' | 'range_hood' | 'tv_with_assistant' | 'blanket' | 'vertical_shades' | 'vertical_shades_closed' | 'curtains_closed' | 'mode_heat_off' | 'mode_cool_off' | 'shelves' | 'tamper_detection_off' | 'garage_door' | 'skillet' | 'light_off' | 'thermometer_gain' | 'vacuum' | 'wall_art' | 'fork_spoon' | 'home_and_garden' | 'thermometer_add' | 'air_purifier' | 'household_supplies' | 'thermometer_loss' | 'dishwasher' | 'emergency_heat_2' | 'home_improvement_and_tools' | 'oven' | 'stockpot' | 'emergency_share_off' | 'hallway' | 'skillet_cooktop' | 'thermometer_minus' | 'dine_heart' | 'fragrance' | 'dine_lamp' | 'chair_fireplace' | 'chair_umbrella' | 'bath_soak' | 'chair_counter' | 'high_chair' | 'table_large' | 'stadia_controller' | 'stadia_controller' | 'door_open' | 'nest_eco_leaf' | 'nest_clock_farsight_analog' | 'nest_remote_comfort_sensor' | 'laundry' | 'shield_with_heart' | 'battery_horiz_075' | 'familiar_face_and_zone' | 'temp_preferences_eco' | 'tools_power_drill' | 'airwave' | 'productivity' | 'battery_horiz_050' | 'nest_display' | 'activity_zone' | 'weather_snowy' | 'nest_heat_link_gen_3' | 'home_storage' | 'settings_alert' | 'cleaning_bucket' | 'nest_cam_indoor' | 'arrows_more_up' | 'nest_cam_outdoor' | 'detection_and_zone' | 'nest_heat_link_e' | 'nest_multi_room' | 'light_group' | 'nest_secure_alarm' | 'google_wifi' | 'battery_horiz_000' | 'mfg_nest_yale_lock' | 'tools_pliers_wire_stripper' | 'early_on' | 'nest_hello_doorbell' | 'tools_ladder' | 'nest_thermostat_gen_3' | 'detector_alarm' | 'nest_mini' | 'nest_display_max' | 'nest_cam_iq_outdoor' | 'nest_cam_iq' | 'home_speaker' | 'nest_audio' | 'floor_lamp' | 'motion_sensor_active' | 'nest_clock_farsight_digital' | 'zone_person_urgent' | 'self_care' | 'home_max_dots' | 'nest_wifi_router' | 'house_with_shield' | 'cool_to_dry' | 'chromecast_2' | 'nest_farsight_weather' | 'shield_with_house' | 'battery_profile' | 'window_closed' | 'arming_countdown' | 'heat_pump_balance' | 'detector' | 'nest_found_savings' | 'window_open' | 'zone_person_alert' | 'tools_level' | 'detector_status' | 'nest_cam_wired_stand' | 'nest_thermostat_zirconium_eu' | 'arrows_more_down' | 'nest_cam_floodlight' | 'nest_true_radiant' | 'nest_wifi_point' | 'detector_co' | 'door_sensor' | 'nest_tag' | 'climate_mini_split' | 'nest_detect' | 'nest_doorbell_visitor' | 'nest_thermostat_sensor' | 'tools_installation_kit' | 'nest_connect' | 'tools_phillips' | 'nest_sunblock' | 'sensors_krx' | 'nest_thermostat_sensor_eu' | 'table_lamp' | 'doorbell_chime' | 'nest_thermostat_e_eu' | 'tools_flat_head' | 'motion_sensor_urgent' | 'detector_battery' | 'nest_wake_on_approach' | 'nest_wake_on_press' | 'motion_sensor_alert' | 'tamper_detection_on' | 'window_sensor' | 'zone_person_idle' | 'nest_cam_magnet_mount' | 'detector_offline' | 'nest_cam_wall_mount' | 'nest_cam_stand' | 'wall_lamp' | 'heat' | 'motion_sensor_idle' | 'water_pump' | 'nest_thermostat' | 'google_tv_remote' | 'assistant_on_hub' | 'aq' | 'mode_dual' | 'aq_indoor' | 'nest_protect' | 'humidity_indoor' | 'nest_wifi_pro' | 'nest_wifi_pro_2' | 'sensors_krx_off' | 'farsight_digital' | 'on_hub_device' | 'nest_farsight_seasonal' | 'nest_farsight_cool' | 'nest_farsight_dual' | 'nest_farsight_eco' | 'nest_farsight_heat';
3
+ export interface IconProps {
4
+ name: IconName;
5
+ filled?: boolean;
6
+ size?: Size;
7
+ color?: Color;
8
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from './icon/index.ts';
2
+ export * from './types.ts';
3
+ export * from './theme/index.ts';
@@ -0,0 +1,3 @@
1
+ export * from "./icon/index.js";
2
+ export * from "./types.js";
3
+ export * from "./theme/index.js";
@@ -0,0 +1,38 @@
1
+ import type { ColorTokenProps, ThemeMode, ThemeProps } from './types.ts';
2
+ /**
3
+ * Generates a complete set of color tokens based on a base color and theme mode.
4
+ * Produces consistent, accessible color variations for UI components including
5
+ * soft backgrounds, hover states, active states, muted variants, and contrast colors.
6
+ *
7
+ * @param color - The base color in any valid CSS color format
8
+ * @param mode - The current theme mode ('light' or 'dark')
9
+ * @returns An object containing all color token variations
10
+ */
11
+ declare const generateColorTokens: (color: string, mode: ThemeMode) => ColorTokenProps;
12
+ /**
13
+ * Sets a CSS custom property on the document root element.
14
+ * Automatically prefixes the key with '--' if not already present.
15
+ *
16
+ * @param key - The CSS custom property name (with or without '--' prefix)
17
+ * @param value - The value to assign to the CSS custom property
18
+ */
19
+ declare const setCSSProperty: (key: string, value: string) => void;
20
+ /**
21
+ * Generates and applies a complete set of color tokens as CSS custom properties.
22
+ * Each token is set as `--color-{mode}-{colorKey}-{variant}` on the document root.
23
+ *
24
+ * @param colorKey - The semantic name for the color (e.g., 'primary', 'success')
25
+ * @param baseColor - The base color in any valid CSS color format
26
+ * @param mode - The current theme mode ('light' or 'dark')
27
+ */
28
+ declare const setColorTokens: (colorKey: string, baseColor: string, mode: ThemeMode) => void;
29
+ /**
30
+ * Applies all color tokens for a specific theme mode as CSS custom properties.
31
+ * Sets palette colors, surface colors, and border color for the given mode.
32
+ *
33
+ * @param theme - The theme configuration object containing palette and surface colors
34
+ * @param mode - The theme mode ('light' or 'dark') to apply
35
+ */
36
+ declare const setThemeMode: (userTheme: ThemeProps, mode: ThemeMode) => void;
37
+ export { generateColorTokens, setCSSProperty, setThemeMode };
38
+ export default setColorTokens;
@@ -0,0 +1,148 @@
1
+ import { colord } from 'colord';
2
+ /**
3
+ * Generates a soft background color from the base color.
4
+ * In light mode, produces a much lighter shade (like a 100-200 on a color scale)
5
+ * suitable as a background when using the base color as foreground.
6
+ * In dark mode, produces a darker, desaturated version for the same effect.
7
+ *
8
+ * @param baseColor - The base color in any valid CSS color format
9
+ * @param mode - The current theme mode ('light' or 'dark')
10
+ * @returns A hex color string representing the soft background color
11
+ */
12
+ const generateSoftColor = (baseColor, mode) => mode === 'light'
13
+ ? colord(baseColor).lighten(0.35).desaturate(0.1).toHex()
14
+ : colord(baseColor).darken(0.35).desaturate(0.2).toHex();
15
+ /**
16
+ * Returns the base color unchanged.
17
+ * This function serves as a passthrough to maintain consistency
18
+ * in the color token generation API.
19
+ *
20
+ * @param baseColor - The base color in any valid CSS color format
21
+ * @param _mode - The current theme mode (unused, kept for API consistency)
22
+ * @returns The base color as a hex string
23
+ */
24
+ const generateBaseColor = (baseColor, _mode) => colord(baseColor).toHex();
25
+ /**
26
+ * Generates a hover state color from the base color.
27
+ * In light mode, produces a slightly darker shade to indicate interactivity.
28
+ * In dark mode, produces a slightly lighter shade for the same visual feedback.
29
+ *
30
+ * @param baseColor - The base color in any valid CSS color format
31
+ * @param mode - The current theme mode ('light' or 'dark')
32
+ * @returns A hex color string for the hover state
33
+ */
34
+ const generateHoverColor = (baseColor, mode) => mode === 'light' ? colord(baseColor).darken(0.1).toHex() : colord(baseColor).lighten(0.1).toHex();
35
+ /**
36
+ * Generates an active/pressed state color from the base color.
37
+ * In light mode, produces a more pronounced darker shade than hover.
38
+ * In dark mode, produces a more pronounced lighter shade than hover.
39
+ * Used to indicate active state on click or tap interactions.
40
+ *
41
+ * @param baseColor - The base color in any valid CSS color format
42
+ * @param mode - The current theme mode ('light' or 'dark')
43
+ * @returns A hex color string for the active state
44
+ */
45
+ const generateActiveColor = (baseColor, mode) => mode === 'light' ? colord(baseColor).darken(0.2).toHex() : colord(baseColor).lighten(0.2).toHex();
46
+ /**
47
+ * Generates a muted/desaturated version of the base color.
48
+ * Useful for disabled states, placeholder elements, or less prominent UI elements.
49
+ * Also slightly adjusts lightness based on theme mode for better visual balance.
50
+ *
51
+ * @param baseColor - The base color in any valid CSS color format
52
+ * @param mode - The current theme mode ('light' or 'dark')
53
+ * @returns A hex color string representing the muted color
54
+ */
55
+ const generateMutedColor = (baseColor, mode) => mode === 'light'
56
+ ? colord(baseColor).desaturate(0.4).lighten(0.15).toHex()
57
+ : colord(baseColor).desaturate(0.4).darken(0.15).toHex();
58
+ /**
59
+ * Generates a contrast color for text or icons placed on top of the base color.
60
+ * Returns either black or white depending on the base color's perceived brightness,
61
+ * ensuring readability and accessibility (WCAG compliance).
62
+ *
63
+ * @param baseColor - The base color in any valid CSS color format
64
+ * @param _mode - The current theme mode (unused, contrast is based on color luminance)
65
+ * @returns '#ffffff' for dark base colors, '#000000' for light base colors
66
+ */
67
+ const generateContrastColor = (baseColor, _mode) => colord(baseColor).isDark() ? '#ffffff' : '#000000';
68
+ /**
69
+ * Generates a complete set of color tokens based on a base color and theme mode.
70
+ * Produces consistent, accessible color variations for UI components including
71
+ * soft backgrounds, hover states, active states, muted variants, and contrast colors.
72
+ *
73
+ * @param color - The base color in any valid CSS color format
74
+ * @param mode - The current theme mode ('light' or 'dark')
75
+ * @returns An object containing all color token variations
76
+ */
77
+ const generateColorTokens = (color, mode) => ({
78
+ soft: generateSoftColor(color, mode),
79
+ base: generateBaseColor(color, mode),
80
+ hover: generateHoverColor(color, mode),
81
+ active: generateActiveColor(color, mode),
82
+ muted: generateMutedColor(color, mode),
83
+ contrast: generateContrastColor(color, mode)
84
+ });
85
+ /**
86
+ * Sets a CSS custom property on the document root element.
87
+ * Automatically prefixes the key with '--' if not already present.
88
+ *
89
+ * @param key - The CSS custom property name (with or without '--' prefix)
90
+ * @param value - The value to assign to the CSS custom property
91
+ */
92
+ const setCSSProperty = (key, value) => {
93
+ const prefixedKey = key.startsWith('--') ? key : `--${key}`;
94
+ document.documentElement.style.setProperty(prefixedKey, value);
95
+ };
96
+ /**
97
+ * Generates and applies a complete set of color tokens as CSS custom properties.
98
+ * Each token is set as `--color-{mode}-{colorKey}-{variant}` on the document root.
99
+ *
100
+ * @param colorKey - The semantic name for the color (e.g., 'primary', 'success')
101
+ * @param baseColor - The base color in any valid CSS color format
102
+ * @param mode - The current theme mode ('light' or 'dark')
103
+ */
104
+ const setColorTokens = (colorKey, baseColor, mode) => {
105
+ const tokens = generateColorTokens(baseColor, mode);
106
+ Object.entries(tokens).forEach(([variant, value]) => {
107
+ setCSSProperty(`--color-${mode}-${colorKey}-${variant}`, value);
108
+ });
109
+ };
110
+ /**
111
+ * Flips the background and foreground colors of the theme for dark mode.
112
+ * In dark mode, the background becomes the foreground and vice versa.
113
+ * This ensures appropriate contrast and readability in dark themes.
114
+ *
115
+ * @param theme - The theme configuration object containing surface colors
116
+ * @param mode - The current theme mode ('light' or 'dark')
117
+ * @returns A new ThemeProps object with flipped background and foreground if in dark mode
118
+ */
119
+ const flipThemeBackgroundAndForeground = (theme, mode) => {
120
+ const flippedTheme = structuredClone(theme);
121
+ if (mode === 'dark') {
122
+ const darkBackground = theme.surfaceHex.background;
123
+ const lightForeground = theme.surfaceHex.foreground;
124
+ flippedTheme.surfaceHex.background = lightForeground;
125
+ flippedTheme.surfaceHex.foreground = darkBackground;
126
+ }
127
+ return flippedTheme;
128
+ };
129
+ /**
130
+ * Applies all color tokens for a specific theme mode as CSS custom properties.
131
+ * Sets palette colors, surface colors, and border color for the given mode.
132
+ *
133
+ * @param theme - The theme configuration object containing palette and surface colors
134
+ * @param mode - The theme mode ('light' or 'dark') to apply
135
+ */
136
+ const setThemeMode = (userTheme, mode) => {
137
+ const theme = flipThemeBackgroundAndForeground(userTheme, mode);
138
+ Object.entries(theme.paletteHex).forEach(([color, value]) => {
139
+ setCSSProperty(`--color-${mode}-${color}`, value);
140
+ setColorTokens(color, value, mode);
141
+ });
142
+ Object.entries(theme.surfaceHex).forEach(([surface, value]) => {
143
+ setCSSProperty(`--color-${mode}-${surface}`, value);
144
+ });
145
+ setCSSProperty(`--color-${mode}-border`, theme.border.colorHex);
146
+ };
147
+ export { generateColorTokens, setCSSProperty, setThemeMode };
148
+ export default setColorTokens;