Light UI theme #83
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -15,6 +15,7 @@ ORCA_EXPORT void oc_on_init(void)
 | 
			
		|||
    surface = oc_surface_canvas();
 | 
			
		||||
    canvas = oc_canvas_create();
 | 
			
		||||
    oc_ui_init(&ui);
 | 
			
		||||
    oc_ui_set_theme(&OC_UI_LIGHT_THEME);
 | 
			
		||||
 | 
			
		||||
    //NOTE: load font
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										580
									
								
								src/ui/ui.c
								
								
								
								
							
							
						
						
									
										580
									
								
								src/ui/ui.c
								
								
								
								
							| 
						 | 
				
			
			@ -15,54 +15,6 @@
 | 
			
		|||
 | 
			
		||||
//NOTE(ilia): Design system by semi.design: https://semi.design/en-US/start/overview
 | 
			
		||||
 | 
			
		||||
#define OC_UI_DARK_BLUE_2 { 0.074, 0.361, 0.722, 1 }
 | 
			
		||||
#define OC_UI_DARK_BLUE_5 { 0.33, 0.66, 1, 1 }
 | 
			
		||||
#define OC_UI_DARK_BLUE_6 { 0.5, 0.757, 1, 1 }
 | 
			
		||||
#define OC_UI_DARK_BLUE_7 { 0.66, 0.84, 1, 1 }
 | 
			
		||||
#define OC_UI_DARK_GREY_7 { 0.786, 0.792, 0.804, 1 }
 | 
			
		||||
#define OC_UI_DARK_GREY_9 { 0.976, 0.976, 0.976, 1 }
 | 
			
		||||
 | 
			
		||||
#define OC_UI_DARK_BG_0 { 0.086, 0.086, 0.102, 1 }
 | 
			
		||||
#define OC_UI_DARK_TEXT_0 OC_UI_DARK_GREY_9
 | 
			
		||||
 | 
			
		||||
static oc_ui_theme OC_UI_DARK_THEME = {
 | 
			
		||||
    .white = { 0.894, 0.906, 0.961, 1 },
 | 
			
		||||
    .primary = OC_UI_DARK_BLUE_5,
 | 
			
		||||
    .primaryHover = OC_UI_DARK_BLUE_6,
 | 
			
		||||
    .primaryActive = OC_UI_DARK_BLUE_7,
 | 
			
		||||
    .fill0 = { 1, 1, 1, 0.12 },
 | 
			
		||||
    .fill1 = { 1, 1, 1, 0.16 },
 | 
			
		||||
    .fill2 = { 1, 1, 1, 0.2 },
 | 
			
		||||
    .bg0 = OC_UI_DARK_BG_0,
 | 
			
		||||
    .bg1 = { 0.137, 0.141, 0.161, 1 },
 | 
			
		||||
    .bg2 = { 0.208, 0.212, 0.235, 1 },
 | 
			
		||||
    .bg3 = { 0.263, 0.267, 0.29, 1 },
 | 
			
		||||
    .bg4 = { 0.31, 0.318, 0.349, 1 },
 | 
			
		||||
    .text0 = OC_UI_DARK_TEXT_0,
 | 
			
		||||
    .text1 = { 0.976, 0.976, 0.976, 0.8 }, // OC_UI_DARK_GREY_9
 | 
			
		||||
    .text2 = { 0.976, 0.976, 0.976, 0.6 }, // OC_UI_DARK_GREY_9
 | 
			
		||||
    .text3 = { 0.976, 0.976, 0.976, 0.35 } // OC_UI_DARK_GREY_9
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static oc_ui_style OC_UI_STYLE_DEFAULTS = {
 | 
			
		||||
    .size.width = { .kind = OC_UI_SIZE_CHILDREN,
 | 
			
		||||
                    .value = 0,
 | 
			
		||||
                    .relax = 0 },
 | 
			
		||||
    .size.height = { .kind = OC_UI_SIZE_CHILDREN,
 | 
			
		||||
                     .value = 0,
 | 
			
		||||
                     .relax = 0 },
 | 
			
		||||
 | 
			
		||||
    .layout = { .axis = OC_UI_AXIS_Y,
 | 
			
		||||
                .align = { OC_UI_ALIGN_START,
 | 
			
		||||
                           OC_UI_ALIGN_START } },
 | 
			
		||||
    .bgColor = OC_UI_DARK_BG_0,
 | 
			
		||||
    .color = OC_UI_DARK_TEXT_0,
 | 
			
		||||
    .fontSize = 14,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#undef OC_UI_DARK_BG_0
 | 
			
		||||
#undef OC_UI_DARK_TEXT_0
 | 
			
		||||
 | 
			
		||||
oc_thread_local oc_ui_context oc_uiThreadContext = { 0 };
 | 
			
		||||
oc_thread_local oc_ui_context* oc_uiCurrentContext = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +28,19 @@ void oc_ui_set_context(oc_ui_context* context)
 | 
			
		|||
    oc_uiCurrentContext = context;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void oc_ui_set_theme(oc_ui_theme* theme)
 | 
			
		||||
{
 | 
			
		||||
    oc_ui_get_context()->theme = theme;
 | 
			
		||||
    if(theme == &OC_UI_DARK_THEME)
 | 
			
		||||
    {
 | 
			
		||||
        theme->palette = &OC_UI_DARK_PALETTE;
 | 
			
		||||
    }
 | 
			
		||||
    if(theme == &OC_UI_LIGHT_THEME)
 | 
			
		||||
    {
 | 
			
		||||
        theme->palette = &OC_UI_LIGHT_PALETTE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// stacks
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
| 
						 | 
				
			
			@ -461,7 +426,22 @@ oc_ui_box* oc_ui_box_make_str8(oc_str8 string, oc_ui_flags flags)
 | 
			
		|||
 | 
			
		||||
    //NOTE: create style and setup non-inherited attributes to default values
 | 
			
		||||
    box->targetStyle = oc_arena_push_type(&ui->frameArena, oc_ui_style);
 | 
			
		||||
    oc_ui_apply_style_with_mask(box->targetStyle, &OC_UI_STYLE_DEFAULTS, ~0ULL);
 | 
			
		||||
    oc_ui_style defaultStyle = {
 | 
			
		||||
        .size.width = { .kind = OC_UI_SIZE_CHILDREN,
 | 
			
		||||
                        .value = 0,
 | 
			
		||||
                        .relax = 0 },
 | 
			
		||||
        .size.height = { .kind = OC_UI_SIZE_CHILDREN,
 | 
			
		||||
                         .value = 0,
 | 
			
		||||
                         .relax = 0 },
 | 
			
		||||
 | 
			
		||||
        .layout = { .axis = OC_UI_AXIS_Y,
 | 
			
		||||
                    .align = { OC_UI_ALIGN_START,
 | 
			
		||||
                               OC_UI_ALIGN_START } },
 | 
			
		||||
        .bgColor = ui->theme->bg0,
 | 
			
		||||
        .color = ui->theme->text0,
 | 
			
		||||
        .fontSize = 14,
 | 
			
		||||
    };
 | 
			
		||||
    oc_ui_apply_style_with_mask(box->targetStyle, &defaultStyle, ~0ULL);
 | 
			
		||||
 | 
			
		||||
    //NOTE: set tags, before rules and last box
 | 
			
		||||
    box->tags = ui->nextBoxTags;
 | 
			
		||||
| 
						 | 
				
			
			@ -1550,6 +1530,7 @@ void oc_ui_init(oc_ui_context* ui)
 | 
			
		|||
    ui->init = true;
 | 
			
		||||
 | 
			
		||||
    oc_ui_set_context(ui);
 | 
			
		||||
    oc_ui_set_theme(&OC_UI_DARK_THEME);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void oc_ui_cleanup(void)
 | 
			
		||||
| 
						 | 
				
			
			@ -1613,6 +1594,7 @@ oc_ui_sig oc_ui_button_behavior(oc_ui_box* box)
 | 
			
		|||
oc_ui_sig oc_ui_button_str8(oc_str8 label)
 | 
			
		||||
{
 | 
			
		||||
    oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
    oc_ui_theme* theme = ui->theme;
 | 
			
		||||
 | 
			
		||||
    oc_ui_style defaultStyle = { .size.width = { OC_UI_SIZE_TEXT },
 | 
			
		||||
                                 .size.height = { OC_UI_SIZE_TEXT },
 | 
			
		||||
| 
						 | 
				
			
			@ -1620,8 +1602,8 @@ oc_ui_sig oc_ui_button_str8(oc_str8 label)
 | 
			
		|||
                                 .layout.align.y = OC_UI_ALIGN_CENTER,
 | 
			
		||||
                                 .layout.margin.x = 12,
 | 
			
		||||
                                 .layout.margin.y = 6,
 | 
			
		||||
                                 .color = OC_UI_DARK_THEME.primary,
 | 
			
		||||
                                 .bgColor = OC_UI_DARK_THEME.fill0,
 | 
			
		||||
                                 .color = theme->primary,
 | 
			
		||||
                                 .bgColor = theme->fill0,
 | 
			
		||||
                                 .roundness = 3 };
 | 
			
		||||
 | 
			
		||||
    oc_ui_style_mask defaultMask = OC_UI_STYLE_SIZE_WIDTH
 | 
			
		||||
| 
						 | 
				
			
			@ -1638,12 +1620,12 @@ oc_ui_sig oc_ui_button_str8(oc_str8 label)
 | 
			
		|||
 | 
			
		||||
    oc_ui_pattern hoverPattern = { 0 };
 | 
			
		||||
    oc_ui_pattern_push(&ui->frameArena, &hoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER });
 | 
			
		||||
    oc_ui_style hoverStyle = { .bgColor = OC_UI_DARK_THEME.fill1 };
 | 
			
		||||
    oc_ui_style hoverStyle = { .bgColor = theme->fill1 };
 | 
			
		||||
    oc_ui_style_match_before(hoverPattern, &hoverStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
    oc_ui_pattern activePattern = { 0 };
 | 
			
		||||
    oc_ui_pattern_push(&ui->frameArena, &activePattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_ACTIVE });
 | 
			
		||||
    oc_ui_style activeStyle = { .bgColor = OC_UI_DARK_THEME.fill2 };
 | 
			
		||||
    oc_ui_style activeStyle = { .bgColor = theme->fill2 };
 | 
			
		||||
    oc_ui_style_match_before(activePattern, &activeStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
    oc_ui_flags flags = OC_UI_FLAG_CLICKABLE
 | 
			
		||||
| 
						 | 
				
			
			@ -1694,14 +1676,15 @@ void oc_ui_checkbox_draw(oc_ui_box* box, void* data)
 | 
			
		|||
oc_ui_sig oc_ui_checkbox(const char* name, bool* checked)
 | 
			
		||||
{
 | 
			
		||||
    oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
    oc_ui_theme* theme = ui->theme;
 | 
			
		||||
 | 
			
		||||
    oc_ui_box* box;
 | 
			
		||||
    if (*checked)
 | 
			
		||||
    {
 | 
			
		||||
        oc_ui_style defaultStyle = { .size.width = { OC_UI_SIZE_PIXELS, 16 },
 | 
			
		||||
                                     .size.height = { OC_UI_SIZE_PIXELS, 16 },
 | 
			
		||||
                                     .bgColor = OC_UI_DARK_THEME.primary,
 | 
			
		||||
                                     .color = OC_UI_DARK_THEME.white,
 | 
			
		||||
                                     .bgColor = theme->primary,
 | 
			
		||||
                                     .color = theme->white,
 | 
			
		||||
                                     .roundness = 3 };
 | 
			
		||||
 | 
			
		||||
        oc_ui_style_mask defaultMask = OC_UI_STYLE_SIZE_WIDTH
 | 
			
		||||
| 
						 | 
				
			
			@ -1714,12 +1697,12 @@ oc_ui_sig oc_ui_checkbox(const char* name, bool* checked)
 | 
			
		|||
 | 
			
		||||
        oc_ui_pattern hoverPattern = { 0 };
 | 
			
		||||
        oc_ui_pattern_push(&ui->frameArena, &hoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER });
 | 
			
		||||
        oc_ui_style hoverStyle = { .bgColor = OC_UI_DARK_THEME.primaryHover };
 | 
			
		||||
        oc_ui_style hoverStyle = { .bgColor = theme->primaryHover };
 | 
			
		||||
        oc_ui_style_match_before(hoverPattern, &hoverStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
        oc_ui_pattern activePattern = { 0 };
 | 
			
		||||
        oc_ui_pattern_push(&ui->frameArena, &activePattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_ACTIVE });
 | 
			
		||||
        oc_ui_style activeStyle = { .bgColor = OC_UI_DARK_THEME.primaryActive };
 | 
			
		||||
        oc_ui_style activeStyle = { .bgColor = theme->primaryActive };
 | 
			
		||||
        oc_ui_style_match_before(activePattern, &activeStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
        oc_ui_flags flags = OC_UI_FLAG_CLICKABLE
 | 
			
		||||
| 
						 | 
				
			
			@ -1739,7 +1722,7 @@ oc_ui_sig oc_ui_checkbox(const char* name, bool* checked)
 | 
			
		|||
        oc_ui_style defaultStyle = { .size.width = { OC_UI_SIZE_PIXELS, 16 },
 | 
			
		||||
                                     .size.height = { OC_UI_SIZE_PIXELS, 16 },
 | 
			
		||||
                                     .bgColor = { 0 },
 | 
			
		||||
                                     .borderColor = OC_UI_DARK_THEME.text3,
 | 
			
		||||
                                     .borderColor = theme->text3,
 | 
			
		||||
                                     .borderSize = 1,
 | 
			
		||||
                                     .roundness = 3 };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1754,14 +1737,14 @@ oc_ui_sig oc_ui_checkbox(const char* name, bool* checked)
 | 
			
		|||
 | 
			
		||||
        oc_ui_pattern hoverPattern = { 0 };
 | 
			
		||||
        oc_ui_pattern_push(&ui->frameArena, &hoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER });
 | 
			
		||||
        oc_ui_style hoverStyle = { .bgColor = OC_UI_DARK_THEME.fill0,
 | 
			
		||||
                                   .borderColor = OC_UI_DARK_THEME.primary };
 | 
			
		||||
        oc_ui_style hoverStyle = { .bgColor = theme->fill0,
 | 
			
		||||
                                   .borderColor = theme->primary };
 | 
			
		||||
        oc_ui_style_match_before(hoverPattern, &hoverStyle, OC_UI_STYLE_BG_COLOR | OC_UI_STYLE_BORDER_COLOR);
 | 
			
		||||
 | 
			
		||||
        oc_ui_pattern activePattern = { 0 };
 | 
			
		||||
        oc_ui_pattern_push(&ui->frameArena, &activePattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_ACTIVE });
 | 
			
		||||
        oc_ui_style activeStyle = { .bgColor = OC_UI_DARK_THEME.fill1,
 | 
			
		||||
                                    .borderColor = OC_UI_DARK_THEME.primary };
 | 
			
		||||
        oc_ui_style activeStyle = { .bgColor = theme->fill1,
 | 
			
		||||
                                    .borderColor = theme->primary };
 | 
			
		||||
        oc_ui_style_match_before(activePattern, &activeStyle, OC_UI_STYLE_BG_COLOR | OC_UI_STYLE_BORDER_COLOR);
 | 
			
		||||
 | 
			
		||||
        oc_ui_flags flags = OC_UI_FLAG_CLICKABLE
 | 
			
		||||
| 
						 | 
				
			
			@ -1789,6 +1772,9 @@ oc_ui_sig oc_ui_checkbox(const char* name, bool* checked)
 | 
			
		|||
//------------------------------------------------------------------------------
 | 
			
		||||
oc_ui_box* oc_ui_slider(const char* label, f32* value)
 | 
			
		||||
{
 | 
			
		||||
    oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
    oc_ui_theme* theme = ui->theme;
 | 
			
		||||
 | 
			
		||||
    oc_ui_style_match_before(oc_ui_pattern_all(), &(oc_ui_style){ 0 }, OC_UI_STYLE_LAYOUT);
 | 
			
		||||
    oc_ui_box* frame = oc_ui_box_begin(label, 0);
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -1803,14 +1789,14 @@ oc_ui_box* oc_ui_slider(const char* label, f32* value)
 | 
			
		|||
            thumbRatio = oc_min(thumbSize / frame->rect.w, 1.);
 | 
			
		||||
            beforeRatio = (*value) * (1. - thumbRatio);
 | 
			
		||||
            afterRatio = (1. - *value) * (1. - thumbRatio);
 | 
			
		||||
            trackFillRatio = beforeRatio + thumbRatio;
 | 
			
		||||
            trackFillRatio = beforeRatio + thumbRatio / 2;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            thumbRatio = oc_min(thumbSize / frame->rect.h, 1.);
 | 
			
		||||
            beforeRatio = (1. - *value) * (1. - thumbRatio);
 | 
			
		||||
            afterRatio = (*value) * (1. - thumbRatio);
 | 
			
		||||
            trackFillRatio = thumbRatio + afterRatio;
 | 
			
		||||
            trackFillRatio = thumbRatio / 2 + afterRatio;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(frame->rect.w > 0 || frame->rect.h > 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -1827,7 +1813,7 @@ oc_ui_box* oc_ui_slider(const char* label, f32* value)
 | 
			
		|||
 | 
			
		||||
        oc_ui_style trackStyle = { .floating.x = true,
 | 
			
		||||
                                   .floating.y = true,
 | 
			
		||||
                                   .bgColor = OC_UI_DARK_THEME.fill0,
 | 
			
		||||
                                   .bgColor = theme->fill0,
 | 
			
		||||
                                   .roundness = trackThickness / 2 };
 | 
			
		||||
        trackStyle.size.c[trackAxis] = (oc_ui_size){ OC_UI_SIZE_PARENT, 1 };
 | 
			
		||||
        trackStyle.size.c[secondAxis] = (oc_ui_size){ OC_UI_SIZE_PIXELS, trackThickness };
 | 
			
		||||
| 
						 | 
				
			
			@ -1852,7 +1838,7 @@ oc_ui_box* oc_ui_slider(const char* label, f32* value)
 | 
			
		|||
                                           .floating.y = true,
 | 
			
		||||
                                           .floatTarget.x = 0,
 | 
			
		||||
                                           .floatTarget.y = (thumbSize - trackThickness) / 2,
 | 
			
		||||
                                           .bgColor = OC_UI_DARK_THEME.primary,
 | 
			
		||||
                                           .bgColor = theme->primary,
 | 
			
		||||
                                           .roundness = trackThickness / 2 };
 | 
			
		||||
            oc_ui_style_next(&trackFillStyle, styleFloatMask);
 | 
			
		||||
            oc_ui_box* trackFill = oc_ui_box_make("track_fill", OC_UI_FLAG_DRAW_BACKGROUND);
 | 
			
		||||
| 
						 | 
				
			
			@ -1866,7 +1852,7 @@ oc_ui_box* oc_ui_slider(const char* label, f32* value)
 | 
			
		|||
                                           .floating.y = true,
 | 
			
		||||
                                           .floatTarget.x = (thumbSize - trackThickness) / 2,
 | 
			
		||||
                                           .floatTarget.y = frame->rect.h * (1 - trackFillRatio),
 | 
			
		||||
                                           .bgColor = OC_UI_DARK_THEME.primary,
 | 
			
		||||
                                           .bgColor = theme->primary,
 | 
			
		||||
                                           .roundness = trackThickness / 2 };
 | 
			
		||||
            oc_ui_style_next(&trackFillStyle, styleFloatMask);
 | 
			
		||||
            oc_ui_box* trackFill = oc_ui_box_make("track_fill", OC_UI_FLAG_DRAW_BACKGROUND);
 | 
			
		||||
| 
						 | 
				
			
			@ -1880,12 +1866,18 @@ oc_ui_box* oc_ui_slider(const char* label, f32* value)
 | 
			
		|||
 | 
			
		||||
        oc_ui_style thumbStyle = { .size.width = (oc_ui_size){ OC_UI_SIZE_PIXELS, thumbSize },
 | 
			
		||||
                                   .size.height = (oc_ui_size){ OC_UI_SIZE_PIXELS, thumbSize },
 | 
			
		||||
                                   .bgColor = OC_UI_DARK_THEME.white,
 | 
			
		||||
                                   .bgColor = theme->white,
 | 
			
		||||
                                   .borderColor = theme->sliderThumbBorder,
 | 
			
		||||
                                   .borderSize = 1,
 | 
			
		||||
                                   .roundness = thumbSize / 2 };
 | 
			
		||||
        oc_ui_style_next(&thumbStyle, styleMask);
 | 
			
		||||
        oc_ui_style_mask thumbMask = OC_UI_STYLE_SIZE
 | 
			
		||||
                                   | OC_UI_STYLE_BG_COLOR
 | 
			
		||||
                                   | OC_UI_STYLE_BORDER_COLOR
 | 
			
		||||
                                   | OC_UI_STYLE_BORDER_SIZE
 | 
			
		||||
                                   | OC_UI_STYLE_ROUNDNESS;
 | 
			
		||||
        oc_ui_style_next(&thumbStyle, thumbMask);
 | 
			
		||||
 | 
			
		||||
        oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
        oc_ui_style thumbActiveStyle = { .borderColor = OC_UI_DARK_THEME.primary,
 | 
			
		||||
        oc_ui_style thumbActiveStyle = { .borderColor = theme->primary,
 | 
			
		||||
                                         .borderSize = 1 };
 | 
			
		||||
        oc_ui_pattern thumbActivePattern = { 0 };
 | 
			
		||||
        oc_ui_pattern_push(&ui->frameArena,
 | 
			
		||||
| 
						 | 
				
			
			@ -1958,6 +1950,8 @@ oc_ui_box* oc_ui_slider(const char* label, f32* value)
 | 
			
		|||
 | 
			
		||||
oc_ui_box* oc_ui_scrollbar(const char* label, f32 thumbRatio, f32* scrollValue)
 | 
			
		||||
{
 | 
			
		||||
    oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
    oc_ui_theme* theme = ui->theme;
 | 
			
		||||
    oc_ui_style_match_before(oc_ui_pattern_all(), &(oc_ui_style){ 0 }, OC_UI_STYLE_LAYOUT);
 | 
			
		||||
    oc_ui_box* frame = oc_ui_box_begin(label, 0);
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -1985,7 +1979,7 @@ oc_ui_box* oc_ui_scrollbar(const char* label, f32 thumbRatio, f32* scrollValue)
 | 
			
		|||
 | 
			
		||||
        oc_ui_style thumbStyle = trackStyle;
 | 
			
		||||
        thumbStyle.size.c[trackAxis] = (oc_ui_size){ OC_UI_SIZE_PARENT, thumbRatio };
 | 
			
		||||
        thumbStyle.bgColor = OC_UI_DARK_THEME.fill2;
 | 
			
		||||
        thumbStyle.bgColor = theme->fill2;
 | 
			
		||||
 | 
			
		||||
        oc_ui_style_mask trackStyleMask = OC_UI_STYLE_SIZE_WIDTH
 | 
			
		||||
                                        | OC_UI_STYLE_SIZE_HEIGHT
 | 
			
		||||
| 
						 | 
				
			
			@ -2004,8 +1998,7 @@ oc_ui_box* oc_ui_scrollbar(const char* label, f32 thumbRatio, f32* scrollValue)
 | 
			
		|||
        oc_ui_style_next(&beforeSpacerStyle, OC_UI_STYLE_SIZE);
 | 
			
		||||
        oc_ui_box* beforeSpacer = oc_ui_box_make("before_spacer", 0);
 | 
			
		||||
 | 
			
		||||
        oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
        oc_ui_style thumbHoverActiveStyle = { .bgColor = OC_UI_DARK_THEME.fill1 };
 | 
			
		||||
        oc_ui_style thumbHoverActiveStyle = { .bgColor = theme->fill1 };
 | 
			
		||||
        oc_ui_pattern thumbHoverPattern = { 0 };
 | 
			
		||||
        oc_ui_pattern_push(&ui->frameArena,
 | 
			
		||||
                           &thumbHoverPattern,
 | 
			
		||||
| 
						 | 
				
			
			@ -2200,6 +2193,7 @@ void oc_ui_tooltip_arrow_draw(oc_ui_box* box, void* data)
 | 
			
		|||
void oc_ui_tooltip(const char* label)
 | 
			
		||||
{
 | 
			
		||||
    oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
    oc_ui_theme* theme = ui->theme;
 | 
			
		||||
 | 
			
		||||
    oc_vec2 p = oc_ui_mouse_position();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2210,7 +2204,7 @@ void oc_ui_tooltip(const char* label)
 | 
			
		|||
                                   .floating.x = true,
 | 
			
		||||
                                   .floating.y = true,
 | 
			
		||||
                                   .floatTarget = { p.x, p.y + 5},
 | 
			
		||||
                                   .bgColor = OC_UI_DARK_GREY_7 };
 | 
			
		||||
                                   .bgColor = theme->palette->grey7 };
 | 
			
		||||
        oc_ui_style_mask arrowMask = OC_UI_STYLE_SIZE
 | 
			
		||||
                                   | OC_UI_STYLE_FLOAT
 | 
			
		||||
                                   | OC_UI_STYLE_BG_COLOR;
 | 
			
		||||
| 
						 | 
				
			
			@ -2226,8 +2220,8 @@ void oc_ui_tooltip(const char* label)
 | 
			
		|||
                                      .floating.x = true,
 | 
			
		||||
                                      .floating.y = true,
 | 
			
		||||
                                      .floatTarget = { p.x + 24, p.y },
 | 
			
		||||
                                      .bgColor = OC_UI_DARK_GREY_7,
 | 
			
		||||
                                      .color = OC_UI_DARK_THEME.bg0,
 | 
			
		||||
                                      .bgColor = theme->palette->grey7,
 | 
			
		||||
                                      .color = theme->bg0,
 | 
			
		||||
                                      .roundness = 6 };
 | 
			
		||||
        oc_ui_style_mask contentsMask = OC_UI_STYLE_SIZE
 | 
			
		||||
                                      | OC_UI_STYLE_LAYOUT_MARGINS
 | 
			
		||||
| 
						 | 
				
			
			@ -2278,6 +2272,7 @@ void oc_ui_menu_bar_end(void)
 | 
			
		|||
void oc_ui_menu_begin(const char* label)
 | 
			
		||||
{
 | 
			
		||||
    oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
    oc_ui_theme* theme = ui->theme;
 | 
			
		||||
    oc_ui_box* container = oc_ui_box_make(label, 0);
 | 
			
		||||
    oc_ui_box_push(container);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2290,12 +2285,12 @@ void oc_ui_menu_begin(const char* label)
 | 
			
		|||
 | 
			
		||||
    oc_ui_pattern hoverPattern = { 0 };
 | 
			
		||||
    oc_ui_pattern_push(&ui->frameArena, &hoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER });
 | 
			
		||||
    oc_ui_style hoverStyle = { .bgColor = OC_UI_DARK_THEME.fill0 };
 | 
			
		||||
    oc_ui_style hoverStyle = { .bgColor = theme->fill0 };
 | 
			
		||||
    oc_ui_style_match_before(hoverPattern, &hoverStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
    oc_ui_pattern draggingPattern = { 0 };
 | 
			
		||||
    oc_ui_pattern_push(&ui->frameArena, &draggingPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_DRAGGING });
 | 
			
		||||
    oc_ui_style draggingStyle = { .bgColor = OC_UI_DARK_THEME.fill2 };
 | 
			
		||||
    oc_ui_style draggingStyle = { .bgColor = theme->fill2 };
 | 
			
		||||
    oc_ui_style_match_before(draggingPattern, &draggingStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
    oc_ui_box* button = oc_ui_box_begin("button", OC_UI_FLAG_CLICKABLE | OC_UI_FLAG_DRAW_BACKGROUND);
 | 
			
		||||
| 
						 | 
				
			
			@ -2312,7 +2307,6 @@ void oc_ui_menu_begin(const char* label)
 | 
			
		|||
    oc_ui_sig sig = oc_ui_box_sig(button);
 | 
			
		||||
    oc_ui_sig barSig = oc_ui_box_sig(bar);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    oc_ui_style style = { .size.width = { OC_UI_SIZE_CHILDREN },
 | 
			
		||||
                          .size.height = { OC_UI_SIZE_CHILDREN },
 | 
			
		||||
                          .floating.x = true,
 | 
			
		||||
| 
						 | 
				
			
			@ -2322,12 +2316,16 @@ void oc_ui_menu_begin(const char* label)
 | 
			
		|||
                          .layout.axis = OC_UI_AXIS_Y,
 | 
			
		||||
                          .layout.margin.x = 0,
 | 
			
		||||
                          .layout.margin.y = 4,
 | 
			
		||||
                          .bgColor = OC_UI_DARK_THEME.bg1};
 | 
			
		||||
                          .bgColor = theme->bg1,
 | 
			
		||||
                          .borderColor = theme->elevatedBorder,
 | 
			
		||||
                          .borderSize = 1 };
 | 
			
		||||
 | 
			
		||||
    oc_ui_style_mask mask = OC_UI_STYLE_SIZE
 | 
			
		||||
                          | OC_UI_STYLE_FLOAT
 | 
			
		||||
                          | OC_UI_STYLE_LAYOUT
 | 
			
		||||
                          | OC_UI_STYLE_BG_COLOR;
 | 
			
		||||
                          | OC_UI_STYLE_BG_COLOR
 | 
			
		||||
                          | OC_UI_STYLE_BORDER_COLOR
 | 
			
		||||
                          | OC_UI_STYLE_BORDER_SIZE;
 | 
			
		||||
 | 
			
		||||
    oc_ui_flags flags = OC_UI_FLAG_OVERLAY
 | 
			
		||||
                      | OC_UI_FLAG_DRAW_BACKGROUND
 | 
			
		||||
| 
						 | 
				
			
			@ -2376,6 +2374,7 @@ void oc_ui_menu_end(void)
 | 
			
		|||
oc_ui_sig oc_ui_menu_button(const char* name)
 | 
			
		||||
{
 | 
			
		||||
    oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
    oc_ui_theme* theme = ui->theme;
 | 
			
		||||
 | 
			
		||||
    oc_ui_style_next(&(oc_ui_style){ .size.width = { OC_UI_SIZE_TEXT },
 | 
			
		||||
                                     .size.height = { OC_UI_SIZE_TEXT },
 | 
			
		||||
| 
						 | 
				
			
			@ -2388,12 +2387,12 @@ oc_ui_sig oc_ui_menu_button(const char* name)
 | 
			
		|||
 | 
			
		||||
    oc_ui_pattern hoverPattern = { 0 };
 | 
			
		||||
    oc_ui_pattern_push(&ui->frameArena, &hoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER });
 | 
			
		||||
    oc_ui_style hoverStyle = { .bgColor = OC_UI_DARK_THEME.fill0 };
 | 
			
		||||
    oc_ui_style hoverStyle = { .bgColor = theme->fill0 };
 | 
			
		||||
    oc_ui_style_match_before(hoverPattern, &hoverStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
    oc_ui_pattern draggingPattern = { 0 };
 | 
			
		||||
    oc_ui_pattern_push(&ui->frameArena, &draggingPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_DRAGGING });
 | 
			
		||||
    oc_ui_style draggingStyle = { .bgColor = OC_UI_DARK_THEME.fill2 };
 | 
			
		||||
    oc_ui_style draggingStyle = { .bgColor = theme->fill2 };
 | 
			
		||||
    oc_ui_style_match_before(draggingPattern, &draggingStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
    oc_ui_flags flags = OC_UI_FLAG_CLICKABLE
 | 
			
		||||
| 
						 | 
				
			
			@ -2468,24 +2467,25 @@ oc_ui_select_popup_info oc_ui_select_popup(const char* name, oc_ui_select_popup_
 | 
			
		|||
    oc_ui_select_popup_info result = *info;
 | 
			
		||||
 | 
			
		||||
    oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
    oc_ui_theme* theme = ui->theme;
 | 
			
		||||
 | 
			
		||||
    oc_ui_container(name, 0)
 | 
			
		||||
    {
 | 
			
		||||
        oc_ui_pattern hoverPattern = { 0 };
 | 
			
		||||
        oc_ui_pattern_push(&ui->frameArena, &hoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER });
 | 
			
		||||
        oc_ui_style hoverStyle = { .bgColor = OC_UI_DARK_THEME.fill1 };
 | 
			
		||||
        oc_ui_style hoverStyle = { .bgColor = theme->fill1 };
 | 
			
		||||
        oc_ui_style_match_after(hoverPattern, &hoverStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
        oc_ui_pattern activePattern = { 0 };
 | 
			
		||||
        oc_ui_pattern_push(&ui->frameArena, &activePattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_ACTIVE });
 | 
			
		||||
        oc_ui_style activeStyle = { .borderColor = OC_UI_DARK_THEME.primary,
 | 
			
		||||
        oc_ui_style activeStyle = { .borderColor = theme->primary,
 | 
			
		||||
                                    .borderSize = 1 };
 | 
			
		||||
        oc_ui_style_match_after(activePattern, &activeStyle, OC_UI_STYLE_BORDER_COLOR | OC_UI_STYLE_BORDER_SIZE);
 | 
			
		||||
 | 
			
		||||
        oc_ui_pattern draggingPattern = { 0 };
 | 
			
		||||
        oc_ui_pattern_push(&ui->frameArena, &draggingPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_DRAGGING });
 | 
			
		||||
        oc_ui_style draggingStyle = { .bgColor = OC_UI_DARK_THEME.fill2,
 | 
			
		||||
                                      .borderColor = OC_UI_DARK_THEME.primary,
 | 
			
		||||
        oc_ui_style draggingStyle = { .bgColor = theme->fill2,
 | 
			
		||||
                                      .borderColor = theme->primary,
 | 
			
		||||
                                      .borderSize = 1 };
 | 
			
		||||
        oc_ui_style_match_after(draggingPattern, &draggingStyle, OC_UI_STYLE_BG_COLOR | OC_UI_STYLE_BORDER_COLOR | OC_UI_STYLE_BORDER_SIZE);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2512,7 +2512,7 @@ oc_ui_select_popup_info oc_ui_select_popup(const char* name, oc_ui_select_popup_
 | 
			
		|||
                                               .size.height = { OC_UI_SIZE_CHILDREN },
 | 
			
		||||
                                               .layout.margin.x = 12,
 | 
			
		||||
                                               .layout.margin.y = 6,
 | 
			
		||||
                                               .bgColor = OC_UI_DARK_THEME.fill0,
 | 
			
		||||
                                               .bgColor = theme->fill0,
 | 
			
		||||
                                               .roundness = 3 },
 | 
			
		||||
                               OC_UI_STYLE_SIZE
 | 
			
		||||
                                   | OC_UI_STYLE_LAYOUT_MARGIN_X
 | 
			
		||||
| 
						 | 
				
			
			@ -2532,7 +2532,7 @@ oc_ui_select_popup_info oc_ui_select_popup(const char* name, oc_ui_select_popup_
 | 
			
		|||
                                             .floating.x = true,
 | 
			
		||||
                                             .floating.y = true,
 | 
			
		||||
                                             .floatTarget = { button->rect.w - button->rect.h, 0 },
 | 
			
		||||
                                             .color = OC_UI_DARK_THEME.text2 },
 | 
			
		||||
                                             .color = theme->text2 },
 | 
			
		||||
                             OC_UI_STYLE_SIZE
 | 
			
		||||
                                 | OC_UI_STYLE_FLOAT
 | 
			
		||||
                                 | OC_UI_STYLE_COLOR);
 | 
			
		||||
| 
						 | 
				
			
			@ -2545,6 +2545,7 @@ oc_ui_select_popup_info oc_ui_select_popup(const char* name, oc_ui_select_popup_
 | 
			
		|||
        //panel
 | 
			
		||||
        oc_ui_box* panel = oc_ui_box_make("panel",
 | 
			
		||||
                                          OC_UI_FLAG_DRAW_BACKGROUND
 | 
			
		||||
                                              | OC_UI_FLAG_DRAW_BORDER
 | 
			
		||||
                                              | OC_UI_FLAG_BLOCK_MOUSE
 | 
			
		||||
                                              | OC_UI_FLAG_OVERLAY);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2566,12 +2567,16 @@ oc_ui_select_popup_info oc_ui_select_popup(const char* name, oc_ui_select_popup_
 | 
			
		|||
                                               .layout.axis = OC_UI_AXIS_Y,
 | 
			
		||||
                                               .layout.margin.x = 0,
 | 
			
		||||
                                               .layout.margin.y = 5,
 | 
			
		||||
                                               .bgColor = OC_UI_DARK_THEME.bg3,
 | 
			
		||||
                                               .bgColor = theme->bg3,
 | 
			
		||||
                                               .borderColor = theme->elevatedBorder,
 | 
			
		||||
                                               .borderSize = 1,
 | 
			
		||||
                                               .roundness = 6 },
 | 
			
		||||
                               OC_UI_STYLE_SIZE
 | 
			
		||||
                                   | OC_UI_STYLE_FLOAT
 | 
			
		||||
                                   | OC_UI_STYLE_LAYOUT
 | 
			
		||||
                                   | OC_UI_STYLE_BG_COLOR
 | 
			
		||||
                                   | OC_UI_STYLE_BORDER_COLOR
 | 
			
		||||
                                   | OC_UI_STYLE_BORDER_SIZE
 | 
			
		||||
                                   | OC_UI_STYLE_ROUNDNESS);
 | 
			
		||||
 | 
			
		||||
        oc_ui_box_push(panel);
 | 
			
		||||
| 
						 | 
				
			
			@ -2598,11 +2603,11 @@ oc_ui_select_popup_info oc_ui_select_popup(const char* name, oc_ui_select_popup_
 | 
			
		|||
 | 
			
		||||
                oc_ui_pattern hoverPattern = { 0 };
 | 
			
		||||
                oc_ui_pattern_push(&ui->frameArena, &hoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER });
 | 
			
		||||
                oc_ui_style_match_before(hoverPattern, &(oc_ui_style){ .bgColor = OC_UI_DARK_THEME.fill0 }, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
                oc_ui_style_match_before(hoverPattern, &(oc_ui_style){ .bgColor = theme->fill0 }, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
                oc_ui_pattern draggingPattern = { 0 };
 | 
			
		||||
                oc_ui_pattern_push(&ui->frameArena, &draggingPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_DRAGGING });
 | 
			
		||||
                oc_ui_style_match_before(draggingPattern, &(oc_ui_style){ .bgColor = OC_UI_DARK_THEME.fill2 }, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
                oc_ui_style_match_before(draggingPattern, &(oc_ui_style){ .bgColor = theme->fill2 }, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
                oc_ui_box* wrapper = oc_ui_box_begin_str8(info->options[i],
 | 
			
		||||
                                                          OC_UI_FLAG_CLICKABLE | OC_UI_FLAG_DRAW_BACKGROUND);
 | 
			
		||||
| 
						 | 
				
			
			@ -2610,7 +2615,7 @@ oc_ui_select_popup_info oc_ui_select_popup(const char* name, oc_ui_select_popup_
 | 
			
		|||
                {
 | 
			
		||||
                    oc_ui_style_next(&(oc_ui_style){ .size.width = { OC_UI_SIZE_PIXELS, checkmarkSize },
 | 
			
		||||
                                                     .size.height = { OC_UI_SIZE_PIXELS, checkmarkSize },
 | 
			
		||||
                                                     .color = OC_UI_DARK_THEME.text2 },
 | 
			
		||||
                                                     .color = theme->text2 },
 | 
			
		||||
                                     OC_UI_STYLE_SIZE | OC_UI_STYLE_COLOR);
 | 
			
		||||
                    oc_ui_box* checkmark = oc_ui_box_make("checkmark", OC_UI_FLAG_DRAW_PROC);
 | 
			
		||||
                    oc_ui_box_set_draw_proc(checkmark, oc_ui_select_popup_draw_checkmark, 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -3285,7 +3290,7 @@ void oc_ui_text_box_render(oc_ui_box* box, void* data)
 | 
			
		|||
            selectBox.x += beforeSelectBox.x + beforeSelectBox.w;
 | 
			
		||||
            selectBox.y += textY;
 | 
			
		||||
 | 
			
		||||
            oc_set_color((oc_color)OC_UI_DARK_BLUE_2);
 | 
			
		||||
            oc_set_color(ui->theme->palette->blue2);
 | 
			
		||||
            oc_rectangle_fill(selectBox.x, selectBox.y, selectBox.w, lineHeight);
 | 
			
		||||
 | 
			
		||||
            oc_set_font(style->font);
 | 
			
		||||
| 
						 | 
				
			
			@ -3337,12 +3342,13 @@ void oc_ui_text_box_render(oc_ui_box* box, void* data)
 | 
			
		|||
oc_ui_text_box_result oc_ui_text_box(const char* name, oc_arena* arena, oc_str8 text)
 | 
			
		||||
{
 | 
			
		||||
    oc_ui_context* ui = oc_ui_get_context();
 | 
			
		||||
    oc_ui_theme* theme = ui->theme;
 | 
			
		||||
 | 
			
		||||
    oc_ui_text_box_result result = { .text = text };
 | 
			
		||||
 | 
			
		||||
    oc_ui_style frameStyle = { .layout.margin.x = 12,
 | 
			
		||||
                               .layout.margin.y = 6,
 | 
			
		||||
                               .bgColor = OC_UI_DARK_THEME.fill0,
 | 
			
		||||
                               .bgColor = theme->fill0,
 | 
			
		||||
                               .roundness = 3 };
 | 
			
		||||
    oc_ui_style_mask frameMask = OC_UI_STYLE_LAYOUT_MARGIN_X
 | 
			
		||||
                               | OC_UI_STYLE_LAYOUT_MARGIN_Y
 | 
			
		||||
| 
						 | 
				
			
			@ -3352,18 +3358,18 @@ oc_ui_text_box_result oc_ui_text_box(const char* name, oc_arena* arena, oc_str8
 | 
			
		|||
 | 
			
		||||
    oc_ui_pattern hoverPattern = { 0 };
 | 
			
		||||
    oc_ui_pattern_push(&ui->frameArena, &hoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER });
 | 
			
		||||
    oc_ui_style hoverStyle = { .bgColor = OC_UI_DARK_THEME.fill1 };
 | 
			
		||||
    oc_ui_style hoverStyle = { .bgColor = theme->fill1 };
 | 
			
		||||
    oc_ui_style_match_after(hoverPattern, &hoverStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
    oc_ui_pattern activePattern = { 0 };
 | 
			
		||||
    oc_ui_pattern_push(&ui->frameArena, &activePattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_ACTIVE });
 | 
			
		||||
    oc_ui_style activeStyle = { .borderColor = OC_UI_DARK_THEME.primary,
 | 
			
		||||
    oc_ui_style activeStyle = { .borderColor = theme->primary,
 | 
			
		||||
                                .borderSize = 1 };
 | 
			
		||||
    oc_ui_style_match_after(activePattern, &activeStyle, OC_UI_STYLE_BORDER_COLOR | OC_UI_STYLE_BORDER_SIZE);
 | 
			
		||||
 | 
			
		||||
    oc_ui_pattern draggingPattern = { 0 };
 | 
			
		||||
    oc_ui_pattern_push(&ui->frameArena, &draggingPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_DRAGGING });
 | 
			
		||||
    oc_ui_style draggingStyle = { .bgColor = OC_UI_DARK_THEME.fill2 };
 | 
			
		||||
    oc_ui_style draggingStyle = { .bgColor = theme->fill2 };
 | 
			
		||||
    oc_ui_style_match_after(draggingPattern, &draggingStyle, OC_UI_STYLE_BG_COLOR);
 | 
			
		||||
 | 
			
		||||
    oc_ui_flags frameFlags = OC_UI_FLAG_CLICKABLE
 | 
			
		||||
| 
						 | 
				
			
			@ -3559,3 +3565,379 @@ oc_ui_text_box_result oc_ui_text_box(const char* name, oc_arena* arena, oc_str8
 | 
			
		|||
 | 
			
		||||
    return (result);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Themes
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
oc_ui_palette OC_UI_DARK_PALETTE = {
 | 
			
		||||
    .red0 = { 0.424, 0.035, 0.043, 1 },
 | 
			
		||||
    .red1 = { 0.565, 0.067, 0.063, 1 },
 | 
			
		||||
    .red2 = { 0.706, 0.125, 0.098, 1 },
 | 
			
		||||
    .red3 = { 0.843, 0.200, 0.141, 1 },
 | 
			
		||||
    .red4 = { 0.984, 0.286, 0.196, 1 },
 | 
			
		||||
    .red5 = { 0.988, 0.447, 0.353, 1 },
 | 
			
		||||
    .red6 = { 0.992, 0.600, 0.514, 1 },
 | 
			
		||||
    .red7 = { 0.992, 0.745, 0.675, 1 },
 | 
			
		||||
    .red8 = { 0.996, 0.878, 0.835, 1 },
 | 
			
		||||
    .red9 = { 1.000, 0.953, 0.937, 1 },
 | 
			
		||||
    .orange0 = { 0.333, 0.122, 0.012, 1 },
 | 
			
		||||
    .orange1 = { 0.502, 0.208, 0.024, 1 },
 | 
			
		||||
    .orange2 = { 0.667, 0.314, 0.039, 1 },
 | 
			
		||||
    .orange3 = { 0.835, 0.435, 0.059, 1 },
 | 
			
		||||
    .orange4 = { 1.000, 0.573, 0.078, 1 },
 | 
			
		||||
    .orange5 = { 1.000, 0.682, 0.263, 1 },
 | 
			
		||||
    .orange6 = { 1.000, 0.780, 0.447, 1 },
 | 
			
		||||
    .orange7 = { 1.000, 0.867, 0.631, 1 },
 | 
			
		||||
    .orange8 = { 1.000, 0.937, 0.816, 1 },
 | 
			
		||||
    .orange9 = { 1.000, 0.976, 0.929, 1 },
 | 
			
		||||
    .amber0 = { 0.318, 0.180, 0.035, 1 },
 | 
			
		||||
    .amber1 = { 0.475, 0.294, 0.059, 1 },
 | 
			
		||||
    .amber2 = { 0.631, 0.420, 0.086, 1 },
 | 
			
		||||
    .amber3 = { 0.792, 0.561, 0.118, 1 },
 | 
			
		||||
    .amber4 = { 0.949, 0.718, 0.149, 1 },
 | 
			
		||||
    .amber5 = { 0.961, 0.792, 0.314, 1 },
 | 
			
		||||
    .amber6 = { 0.969, 0.859, 0.478, 1 },
 | 
			
		||||
    .amber7 = { 0.980, 0.918, 0.651, 1 },
 | 
			
		||||
    .amber8 = { 0.988, 0.965, 0.824, 1 },
 | 
			
		||||
    .amber9 = { 0.996, 0.984, 0.929, 1 },
 | 
			
		||||
    .yellow0 = { 0.329, 0.286, 0.012, 1 },
 | 
			
		||||
    .yellow1 = { 0.494, 0.424, 0.024, 1 },
 | 
			
		||||
    .yellow2 = { 0.659, 0.557, 0.039, 1 },
 | 
			
		||||
    .yellow3 = { 0.824, 0.686, 0.059, 1 },
 | 
			
		||||
    .yellow4 = { 0.988, 0.808, 0.078, 1 },
 | 
			
		||||
    .yellow5 = { 0.992, 0.871, 0.263, 1 },
 | 
			
		||||
    .yellow6 = { 0.992, 0.922, 0.443, 1 },
 | 
			
		||||
    .yellow7 = { 0.996, 0.961, 0.627, 1 },
 | 
			
		||||
    .yellow8 = { 0.996, 0.984, 0.816, 1 },
 | 
			
		||||
    .yellow9 = { 1.000, 0.996, 0.925, 1 },
 | 
			
		||||
    .lime0 = { 0.192, 0.275, 0.012, 1 },
 | 
			
		||||
    .lime1 = { 0.294, 0.412, 0.020, 1 },
 | 
			
		||||
    .lime2 = { 0.404, 0.553, 0.035, 1 },
 | 
			
		||||
    .lime3 = { 0.518, 0.690, 0.047, 1 },
 | 
			
		||||
    .lime4 = { 0.635, 0.827, 0.067, 1 },
 | 
			
		||||
    .lime5 = { 0.682, 0.863, 0.227, 1 },
 | 
			
		||||
    .lime6 = { 0.741, 0.898, 0.400, 1 },
 | 
			
		||||
    .lime7 = { 0.812, 0.929, 0.588, 1 },
 | 
			
		||||
    .lime8 = { 0.898, 0.965, 0.788, 1 },
 | 
			
		||||
    .lime9 = { 0.953, 0.984, 0.914, 1 },
 | 
			
		||||
    .lightGreen0 = { 0.149, 0.239, 0.075, 1 },
 | 
			
		||||
    .lightGreen1 = { 0.231, 0.361, 0.114, 1 },
 | 
			
		||||
    .lightGreen2 = { 0.318, 0.482, 0.157, 1 },
 | 
			
		||||
    .lightGreen3 = { 0.404, 0.600, 0.204, 1 },
 | 
			
		||||
    .lightGreen4 = { 0.498, 0.722, 0.251, 1 },
 | 
			
		||||
    .lightGreen5 = { 0.592, 0.776, 0.373, 1 },
 | 
			
		||||
    .lightGreen6 = { 0.690, 0.831, 0.506, 1 },
 | 
			
		||||
    .lightGreen7 = { 0.788, 0.890, 0.655, 1 },
 | 
			
		||||
    .lightGreen8 = { 0.894, 0.945, 0.820, 1 },
 | 
			
		||||
    .lightGreen9 = { 0.953, 0.973, 0.929, 1 },
 | 
			
		||||
    .green0 = { 0.071, 0.235, 0.098, 1 },
 | 
			
		||||
    .green1 = { 0.110, 0.353, 0.145, 1 },
 | 
			
		||||
    .green2 = { 0.153, 0.467, 0.192, 1 },
 | 
			
		||||
    .green3 = { 0.196, 0.584, 0.239, 1 },
 | 
			
		||||
    .green4 = { 0.243, 0.702, 0.286, 1 },
 | 
			
		||||
    .green5 = { 0.365, 0.761, 0.392, 1 },
 | 
			
		||||
    .green6 = { 0.498, 0.820, 0.518, 1 },
 | 
			
		||||
    .green7 = { 0.651, 0.882, 0.659, 1 },
 | 
			
		||||
    .green8 = { 0.816, 0.941, 0.820, 1 },
 | 
			
		||||
    .green9 = { 0.925, 0.969, 0.925, 1 },
 | 
			
		||||
    .teal0 = { 0.008, 0.235, 0.224, 1 },
 | 
			
		||||
    .teal1 = { 0.016, 0.353, 0.333, 1 },
 | 
			
		||||
    .teal2 = { 0.027, 0.467, 0.435, 1 },
 | 
			
		||||
    .teal3 = { 0.039, 0.584, 0.533, 1 },
 | 
			
		||||
    .teal4 = { 0.055, 0.702, 0.631, 1 },
 | 
			
		||||
    .teal5 = { 0.200, 0.761, 0.690, 1 },
 | 
			
		||||
    .teal6 = { 0.369, 0.820, 0.757, 1 },
 | 
			
		||||
    .teal7 = { 0.557, 0.882, 0.827, 1 },
 | 
			
		||||
    .teal8 = { 0.769, 0.941, 0.910, 1 },
 | 
			
		||||
    .teal9 = { 0.902, 0.969, 0.957, 1 },
 | 
			
		||||
    .cyan0 = { 0.016, 0.204, 0.239, 1 },
 | 
			
		||||
    .cyan1 = { 0.027, 0.310, 0.361, 1 },
 | 
			
		||||
    .cyan2 = { 0.039, 0.424, 0.482, 1 },
 | 
			
		||||
    .cyan3 = { 0.055, 0.537, 0.600, 1 },
 | 
			
		||||
    .cyan4 = { 0.075, 0.659, 0.722, 1 },
 | 
			
		||||
    .cyan5 = { 0.220, 0.733, 0.776, 1 },
 | 
			
		||||
    .cyan6 = { 0.384, 0.804, 0.831, 1 },
 | 
			
		||||
    .cyan7 = { 0.569, 0.875, 0.890, 1 },
 | 
			
		||||
    .cyan8 = { 0.776, 0.937, 0.945, 1 },
 | 
			
		||||
    .cyan9 = { 0.906, 0.969, 0.973, 1 },
 | 
			
		||||
    .lightBlue0 = { 0.000, 0.216, 0.380, 1 },
 | 
			
		||||
    .lightBlue1 = { 0.000, 0.302, 0.522, 1 },
 | 
			
		||||
    .lightBlue2 = { 0.012, 0.400, 0.663, 1 },
 | 
			
		||||
    .lightBlue3 = { 0.039, 0.506, 0.800, 1 },
 | 
			
		||||
    .lightBlue4 = { 0.075, 0.624, 0.941, 1 },
 | 
			
		||||
    .lightBlue5 = { 0.251, 0.706, 0.953, 1 },
 | 
			
		||||
    .lightBlue6 = { 0.431, 0.784, 0.965, 1 },
 | 
			
		||||
    .lightBlue7 = { 0.616, 0.863, 0.976, 1 },
 | 
			
		||||
    .lightBlue8 = { 0.808, 0.933, 0.988, 1 },
 | 
			
		||||
    .lightBlue9 = { 0.922, 0.973, 0.996, 1 },
 | 
			
		||||
    .blue0 = { 0.020, 0.192, 0.439, 1 },
 | 
			
		||||
    .blue1 = { 0.039, 0.275, 0.580, 1 },
 | 
			
		||||
    .blue2 = { 0.074, 0.361, 0.722, 1 },
 | 
			
		||||
    .blue3 = { 0.114, 0.459, 0.859, 1 },
 | 
			
		||||
    .blue4 = { 0.161, 0.565, 1.000, 1 },
 | 
			
		||||
    .blue5 = { 0.33, 0.66, 1, 1 },
 | 
			
		||||
    .blue6 = { 0.5, 0.757, 1, 1 },
 | 
			
		||||
    .blue7 = { 0.66, 0.84, 1, 1 },
 | 
			
		||||
    .blue8 = { 0.831, 0.925, 1.000, 1 },
 | 
			
		||||
    .blue9 = { 0.937, 0.973, 1.000, 1 },
 | 
			
		||||
    .indigo0 = { 0.090, 0.118, 0.396, 1 },
 | 
			
		||||
    .indigo1 = { 0.125, 0.161, 0.478, 1 },
 | 
			
		||||
    .indigo2 = { 0.161, 0.212, 0.557, 1 },
 | 
			
		||||
    .indigo3 = { 0.204, 0.267, 0.639, 1 },
 | 
			
		||||
    .indigo4 = { 0.251, 0.325, 0.718, 1 },
 | 
			
		||||
    .indigo5 = { 0.373, 0.443, 0.773, 1 },
 | 
			
		||||
    .indigo6 = { 0.506, 0.569, 0.831, 1 },
 | 
			
		||||
    .indigo7 = { 0.655, 0.706, 0.886, 1 },
 | 
			
		||||
    .indigo8 = { 0.820, 0.847, 0.945, 1 },
 | 
			
		||||
    .indigo9 = { 0.929, 0.937, 0.973, 1 },
 | 
			
		||||
    .violet0 = { 0.251, 0.106, 0.467, 1 },
 | 
			
		||||
    .violet1 = { 0.298, 0.141, 0.549, 1 },
 | 
			
		||||
    .violet2 = { 0.345, 0.180, 0.627, 1 },
 | 
			
		||||
    .violet3 = { 0.392, 0.224, 0.710, 1 },
 | 
			
		||||
    .violet4 = { 0.447, 0.275, 0.788, 1 },
 | 
			
		||||
    .violet5 = { 0.533, 0.396, 0.831, 1 },
 | 
			
		||||
    .violet6 = { 0.635, 0.533, 0.875, 1 },
 | 
			
		||||
    .violet7 = { 0.745, 0.678, 0.914, 1 },
 | 
			
		||||
    .violet8 = { 0.867, 0.831, 0.957, 1 },
 | 
			
		||||
    .violet9 = { 0.945, 0.933, 0.980, 1 },
 | 
			
		||||
    .purple0 = { 0.290, 0.063, 0.380, 1 },
 | 
			
		||||
    .purple1 = { 0.369, 0.090, 0.463, 1 },
 | 
			
		||||
    .purple2 = { 0.451, 0.122, 0.541, 1 },
 | 
			
		||||
    .purple3 = { 0.537, 0.157, 0.624, 1 },
 | 
			
		||||
    .purple4 = { 0.627, 0.200, 0.702, 1 },
 | 
			
		||||
    .purple5 = { 0.710, 0.325, 0.761, 1 },
 | 
			
		||||
    .purple6 = { 0.792, 0.471, 0.820, 1 },
 | 
			
		||||
    .purple7 = { 0.867, 0.627, 0.882, 1 },
 | 
			
		||||
    .purple8 = { 0.937, 0.808, 0.941, 1 },
 | 
			
		||||
    .purple9 = { 0.969, 0.922, 0.969, 1 },
 | 
			
		||||
    .pink0 = { 0.361, 0.027, 0.188, 1 },
 | 
			
		||||
    .pink1 = { 0.502, 0.055, 0.255, 1 },
 | 
			
		||||
    .pink2 = { 0.643, 0.090, 0.318, 1 },
 | 
			
		||||
    .pink3 = { 0.780, 0.133, 0.380, 1 },
 | 
			
		||||
    .pink4 = { 0.922, 0.184, 0.443, 1 },
 | 
			
		||||
    .pink5 = { 0.937, 0.337, 0.525, 1 },
 | 
			
		||||
    .pink6 = { 0.953, 0.494, 0.624, 1 },
 | 
			
		||||
    .pink7 = { 0.969, 0.659, 0.737, 1 },
 | 
			
		||||
    .pink8 = { 0.984, 0.827, 0.863, 1 },
 | 
			
		||||
    .pink9 = { 0.992, 0.933, 0.945, 1 },
 | 
			
		||||
    .grey0 = { 0.110, 0.122, 0.137, 1 },
 | 
			
		||||
    .grey1 = { 0.180, 0.196, 0.220, 1 },
 | 
			
		||||
    .grey2 = { 0.255, 0.275, 0.298, 1 },
 | 
			
		||||
    .grey3 = { 0.333, 0.357, 0.380, 1 },
 | 
			
		||||
    .grey4 = { 0.420, 0.439, 0.459, 1 },
 | 
			
		||||
    .grey5 = { 0.533, 0.553, 0.573, 1 },
 | 
			
		||||
    .grey6 = { 0.655, 0.671, 0.690, 1 },
 | 
			
		||||
    .grey7 = { 0.786, 0.792, 0.804, 1 },
 | 
			
		||||
    .grey8 = { 0.902, 0.910, 0.918, 1 },
 | 
			
		||||
    .grey9 = { 0.976, 0.976, 0.976, 1 },
 | 
			
		||||
    .black = { 0, 0, 0, 1 },
 | 
			
		||||
    .white = { 1, 1, 1, 1 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
oc_ui_theme OC_UI_DARK_THEME = {
 | 
			
		||||
    .white = { 0.894, 0.906, 0.961, 1 },
 | 
			
		||||
    .primary = { 0.33, 0.66, 1, 1 }, // blue5
 | 
			
		||||
    .primaryHover = { 0.5, 0.757, 1, 1 }, // blue6
 | 
			
		||||
    .primaryActive = { 0.66, 0.84, 1, 1 }, // blue7
 | 
			
		||||
    .fill0 = { 1, 1, 1, 0.12 },
 | 
			
		||||
    .fill1 = { 1, 1, 1, 0.16 },
 | 
			
		||||
    .fill2 = { 1, 1, 1, 0.2 },
 | 
			
		||||
    .bg0 = { 0.086, 0.086, 0.102, 1 },
 | 
			
		||||
    .bg1 = { 0.137, 0.141, 0.161, 1 },
 | 
			
		||||
    .bg2 = { 0.208, 0.212, 0.235, 1 },
 | 
			
		||||
    .bg3 = { 0.263, 0.267, 0.29, 1 },
 | 
			
		||||
    .bg4 = { 0.31, 0.318, 0.349, 1 },
 | 
			
		||||
    .text0 = { 0.976, 0.976, 0.976, 1 }, // grey9
 | 
			
		||||
    .text1 = { 0.976, 0.976, 0.976, 0.8 }, // grey9
 | 
			
		||||
    .text2 = { 0.976, 0.976, 0.976, 0.6 }, // grey9
 | 
			
		||||
    .text3 = { 0.976, 0.976, 0.976, 0.35 }, // grey9
 | 
			
		||||
    .sliderThumbBorder = { 0, 0, 0, 0.075 },
 | 
			
		||||
    .elevatedBorder = { 1, 1, 1, 0.1 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
oc_ui_palette OC_UI_LIGHT_PALETTE = {
 | 
			
		||||
    .red0 = { 0.996, 0.949, 0.929, 1 },
 | 
			
		||||
    .red1 = { 0.996, 0.867, 0.824, 1 },
 | 
			
		||||
    .red2 = { 0.992, 0.718, 0.647, 1 },
 | 
			
		||||
    .red3 = { 0.984, 0.565, 0.471, 1 },
 | 
			
		||||
    .red4 = { 0.980, 0.400, 0.298, 1 },
 | 
			
		||||
    .red5 = { 0.976, 0.224, 0.125, 1 },
 | 
			
		||||
    .red6 = { 0.835, 0.145, 0.082, 1 },
 | 
			
		||||
    .red7 = { 0.698, 0.078, 0.047, 1 },
 | 
			
		||||
    .red8 = { 0.557, 0.031, 0.020, 1 },
 | 
			
		||||
    .red9 = { 0.416, 0.004, 0.012, 1 },
 | 
			
		||||
    .orange0 = { 1.000, 0.973, 0.918, 1 },
 | 
			
		||||
    .orange1 = { 0.996, 0.933, 0.800, 1 },
 | 
			
		||||
    .orange2 = { 0.996, 0.851, 0.596, 1 },
 | 
			
		||||
    .orange3 = { 0.992, 0.757, 0.396, 1 },
 | 
			
		||||
    .orange4 = { 0.992, 0.651, 0.200, 1 },
 | 
			
		||||
    .orange5 = { 0.988, 0.533, 0.000, 1 },
 | 
			
		||||
    .orange6 = { 0.824, 0.404, 0.000, 1 },
 | 
			
		||||
    .orange7 = { 0.659, 0.290, 0.000, 1 },
 | 
			
		||||
    .orange8 = { 0.494, 0.192, 0.000, 1 },
 | 
			
		||||
    .orange9 = { 0.329, 0.114, 0.000, 1 },
 | 
			
		||||
    .amber0 = { 0.996, 0.984, 0.922, 1 },
 | 
			
		||||
    .amber1 = { 0.988, 0.961, 0.808, 1 },
 | 
			
		||||
    .amber2 = { 0.976, 0.910, 0.620, 1 },
 | 
			
		||||
    .amber3 = { 0.965, 0.847, 0.435, 1 },
 | 
			
		||||
    .amber4 = { 0.953, 0.776, 0.255, 1 },
 | 
			
		||||
    .amber5 = { 0.941, 0.694, 0.078, 1 },
 | 
			
		||||
    .amber6 = { 0.784, 0.541, 0.059, 1 },
 | 
			
		||||
    .amber7 = { 0.627, 0.400, 0.039, 1 },
 | 
			
		||||
    .amber8 = { 0.471, 0.275, 0.024, 1 },
 | 
			
		||||
    .amber9 = { 0.314, 0.169, 0.012, 1 },
 | 
			
		||||
    .yellow0 = { 1.000, 0.992, 0.918, 1 },
 | 
			
		||||
    .yellow1 = { 0.996, 0.984, 0.796, 1 },
 | 
			
		||||
    .yellow2 = { 0.992, 0.953, 0.596, 1 },
 | 
			
		||||
    .yellow3 = { 0.988, 0.910, 0.396, 1 },
 | 
			
		||||
    .yellow4 = { 0.984, 0.855, 0.196, 1 },
 | 
			
		||||
    .yellow5 = { 0.980, 0.784, 0.000, 1 },
 | 
			
		||||
    .yellow6 = { 0.816, 0.667, 0.000, 1 },
 | 
			
		||||
    .yellow7 = { 0.655, 0.545, 0.000, 1 },
 | 
			
		||||
    .yellow8 = { 0.490, 0.416, 0.000, 1 },
 | 
			
		||||
    .yellow9 = { 0.325, 0.282, 0.000, 1 },
 | 
			
		||||
    .lime0 = { 0.949, 0.980, 0.902, 1 },
 | 
			
		||||
    .lime1 = { 0.890, 0.965, 0.773, 1 },
 | 
			
		||||
    .lime2 = { 0.796, 0.929, 0.557, 1 },
 | 
			
		||||
    .lime3 = { 0.718, 0.890, 0.357, 1 },
 | 
			
		||||
    .lime4 = { 0.655, 0.855, 0.173, 1 },
 | 
			
		||||
    .lime5 = { 0.608, 0.820, 0.000, 1 },
 | 
			
		||||
    .lime6 = { 0.494, 0.682, 0.000, 1 },
 | 
			
		||||
    .lime7 = { 0.388, 0.545, 0.000, 1 },
 | 
			
		||||
    .lime8 = { 0.282, 0.408, 0.000, 1 },
 | 
			
		||||
    .lime9 = { 0.184, 0.275, 0.000, 1 },
 | 
			
		||||
    .lightGreen0 = { 0.953, 0.973, 0.925, 1 },
 | 
			
		||||
    .lightGreen1 = { 0.890, 0.941, 0.816, 1 },
 | 
			
		||||
    .lightGreen2 = { 0.784, 0.886, 0.647, 1 },
 | 
			
		||||
    .lightGreen3 = { 0.678, 0.827, 0.494, 1 },
 | 
			
		||||
    .lightGreen4 = { 0.576, 0.773, 0.357, 1 },
 | 
			
		||||
    .lightGreen5 = { 0.482, 0.714, 0.235, 1 },
 | 
			
		||||
    .lightGreen6 = { 0.392, 0.596, 0.188, 1 },
 | 
			
		||||
    .lightGreen7 = { 0.306, 0.475, 0.149, 1 },
 | 
			
		||||
    .lightGreen8 = { 0.224, 0.357, 0.106, 1 },
 | 
			
		||||
    .lightGreen9 = { 0.145, 0.239, 0.071, 1 },
 | 
			
		||||
    .green0 = { 0.925, 0.969, 0.925, 1 },
 | 
			
		||||
    .green1 = { 0.816, 0.941, 0.820, 1 },
 | 
			
		||||
    .green2 = { 0.643, 0.878, 0.655, 1 },
 | 
			
		||||
    .green3 = { 0.490, 0.820, 0.510, 1 },
 | 
			
		||||
    .green4 = { 0.353, 0.761, 0.384, 1 },
 | 
			
		||||
    .green5 = { 0.231, 0.702, 0.275, 1 },
 | 
			
		||||
    .green6 = { 0.188, 0.584, 0.231, 1 },
 | 
			
		||||
    .green7 = { 0.145, 0.467, 0.184, 1 },
 | 
			
		||||
    .green8 = { 0.106, 0.349, 0.141, 1 },
 | 
			
		||||
    .green9 = { 0.067, 0.235, 0.094, 1 },
 | 
			
		||||
    .teal0 = { 0.894, 0.969, 0.957, 1 },
 | 
			
		||||
    .teal1 = { 0.753, 0.941, 0.910, 1 },
 | 
			
		||||
    .teal2 = { 0.529, 0.878, 0.827, 1 },
 | 
			
		||||
    .teal3 = { 0.329, 0.820, 0.757, 1 },
 | 
			
		||||
    .teal4 = { 0.153, 0.761, 0.690, 1 },
 | 
			
		||||
    .teal5 = { 0.000, 0.702, 0.631, 1 },
 | 
			
		||||
    .teal6 = { 0.000, 0.584, 0.537, 1 },
 | 
			
		||||
    .teal7 = { 0.000, 0.467, 0.435, 1 },
 | 
			
		||||
    .teal8 = { 0.000, 0.349, 0.333, 1 },
 | 
			
		||||
    .teal9 = { 0.000, 0.235, 0.227, 1 },
 | 
			
		||||
    .cyan0 = { 0.898, 0.969, 0.973, 1 },
 | 
			
		||||
    .cyan1 = { 0.761, 0.937, 0.941, 1 },
 | 
			
		||||
    .cyan2 = { 0.541, 0.867, 0.886, 1 },
 | 
			
		||||
    .cyan3 = { 0.345, 0.796, 0.827, 1 },
 | 
			
		||||
    .cyan4 = { 0.173, 0.722, 0.773, 1 },
 | 
			
		||||
    .cyan5 = { 0.020, 0.643, 0.714, 1 },
 | 
			
		||||
    .cyan6 = { 0.012, 0.525, 0.596, 1 },
 | 
			
		||||
    .cyan7 = { 0.004, 0.412, 0.475, 1 },
 | 
			
		||||
    .cyan8 = { 0.000, 0.302, 0.357, 1 },
 | 
			
		||||
    .cyan9 = { 0.000, 0.196, 0.239, 1 },
 | 
			
		||||
    .lightBlue0 = { 0.914, 0.969, 0.992, 1 },
 | 
			
		||||
    .lightBlue1 = { 0.788, 0.925, 0.988, 1 },
 | 
			
		||||
    .lightBlue2 = { 0.584, 0.847, 0.973, 1 },
 | 
			
		||||
    .lightBlue3 = { 0.384, 0.765, 0.961, 1 },
 | 
			
		||||
    .lightBlue4 = { 0.188, 0.675, 0.945, 1 },
 | 
			
		||||
    .lightBlue5 = { 0.000, 0.584, 0.933, 1 },
 | 
			
		||||
    .lightBlue6 = { 0.000, 0.482, 0.792, 1 },
 | 
			
		||||
    .lightBlue7 = { 0.000, 0.388, 0.655, 1 },
 | 
			
		||||
    .lightBlue8 = { 0.000, 0.294, 0.514, 1 },
 | 
			
		||||
    .lightBlue9 = { 0.000, 0.208, 0.373, 1 },
 | 
			
		||||
    .blue0 = { 0.918, 0.961, 1.000, 1 },
 | 
			
		||||
    .blue1 = { 0.796, 0.906, 0.996, 1 },
 | 
			
		||||
    .blue2 = { 0.596, 0.804, 0.992, 1 },
 | 
			
		||||
    .blue3 = { 0.396, 0.698, 0.988, 1 },
 | 
			
		||||
    .blue4 = { 0.196, 0.584, 0.984, 1 },
 | 
			
		||||
    .blue5 = { 0.000, 0.392, 0.980, 1 },
 | 
			
		||||
    .blue6 = { 0.000, 0.384, 0.839, 1 },
 | 
			
		||||
    .blue7 = { 0.000, 0.310, 0.702, 1 },
 | 
			
		||||
    .blue8 = { 0.000, 0.239, 0.561, 1 },
 | 
			
		||||
    .blue9 = { 0.000, 0.173, 0.420, 1 },
 | 
			
		||||
    .indigo0 = { 0.925, 0.937, 0.973, 1 },
 | 
			
		||||
    .indigo1 = { 0.820, 0.847, 0.941, 1 },
 | 
			
		||||
    .indigo2 = { 0.655, 0.702, 0.882, 1 },
 | 
			
		||||
    .indigo3 = { 0.502, 0.565, 0.827, 1 },
 | 
			
		||||
    .indigo4 = { 0.369, 0.435, 0.769, 1 },
 | 
			
		||||
    .indigo5 = { 0.247, 0.318, 0.710, 1 },
 | 
			
		||||
    .indigo6 = { 0.200, 0.259, 0.631, 1 },
 | 
			
		||||
    .indigo7 = { 0.157, 0.204, 0.549, 1 },
 | 
			
		||||
    .indigo8 = { 0.122, 0.157, 0.471, 1 },
 | 
			
		||||
    .indigo9 = { 0.090, 0.114, 0.388, 1 },
 | 
			
		||||
    .violet0 = { 0.953, 0.929, 0.976, 1 },
 | 
			
		||||
    .violet1 = { 0.886, 0.820, 0.957, 1 },
 | 
			
		||||
    .violet2 = { 0.769, 0.655, 0.914, 1 },
 | 
			
		||||
    .violet3 = { 0.651, 0.498, 0.867, 1 },
 | 
			
		||||
    .violet4 = { 0.533, 0.357, 0.824, 1 },
 | 
			
		||||
    .violet5 = { 0.416, 0.227, 0.780, 1 },
 | 
			
		||||
    .violet6 = { 0.341, 0.184, 0.702, 1 },
 | 
			
		||||
    .violet7 = { 0.275, 0.145, 0.620, 1 },
 | 
			
		||||
    .violet8 = { 0.212, 0.110, 0.541, 1 },
 | 
			
		||||
    .violet9 = { 0.157, 0.078, 0.459, 1 },
 | 
			
		||||
    .purple0 = { 0.969, 0.914, 0.969, 1 },
 | 
			
		||||
    .purple1 = { 0.937, 0.792, 0.941, 1 },
 | 
			
		||||
    .purple2 = { 0.867, 0.608, 0.878, 1 },
 | 
			
		||||
    .purple3 = { 0.788, 0.435, 0.820, 1 },
 | 
			
		||||
    .purple4 = { 0.706, 0.286, 0.761, 1 },
 | 
			
		||||
    .purple5 = { 0.620, 0.157, 0.702, 1 },
 | 
			
		||||
    .purple6 = { 0.529, 0.118, 0.620, 1 },
 | 
			
		||||
    .purple7 = { 0.443, 0.086, 0.541, 1 },
 | 
			
		||||
    .purple8 = { 0.361, 0.059, 0.459, 1 },
 | 
			
		||||
    .purple9 = { 0.286, 0.039, 0.380, 1 },
 | 
			
		||||
    .pink0 = { 0.992, 0.925, 0.937, 1 },
 | 
			
		||||
    .pink1 = { 0.984, 0.812, 0.847, 1 },
 | 
			
		||||
    .pink2 = { 0.965, 0.627, 0.710, 1 },
 | 
			
		||||
    .pink3 = { 0.949, 0.451, 0.588, 1 },
 | 
			
		||||
    .pink4 = { 0.929, 0.282, 0.482, 1 },
 | 
			
		||||
    .pink5 = { 0.914, 0.118, 0.388, 1 },
 | 
			
		||||
    .pink6 = { 0.773, 0.075, 0.337, 1 },
 | 
			
		||||
    .pink7 = { 0.635, 0.043, 0.282, 1 },
 | 
			
		||||
    .pink8 = { 0.494, 0.020, 0.227, 1 },
 | 
			
		||||
    .pink9 = { 0.353, 0.004, 0.169, 1 },
 | 
			
		||||
    .grey0 = { 0.976, 0.976, 0.976, 1 },
 | 
			
		||||
    .grey1 = { 0.902, 0.910, 0.918, 1 },
 | 
			
		||||
    .grey2 = { 0.776, 0.792, 0.804, 1 },
 | 
			
		||||
    .grey3 = { 0.655, 0.671, 0.690, 1 },
 | 
			
		||||
    .grey4 = { 0.533, 0.553, 0.573, 1 },
 | 
			
		||||
    .grey5 = { 0.420, 0.439, 0.459, 1 },
 | 
			
		||||
    .grey6 = { 0.333, 0.357, 0.380, 1 },
 | 
			
		||||
    .grey7 = { 0.255, 0.275, 0.298, 1 },
 | 
			
		||||
    .grey8 = { 0.180, 0.196, 0.220, 1 },
 | 
			
		||||
    .grey9 = { 0.110, 0.122, 0.137, 1 },
 | 
			
		||||
    .black = { 0, 0, 0, 1 },
 | 
			
		||||
    .white = { 1, 1, 1, 1 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
oc_ui_theme OC_UI_LIGHT_THEME = {
 | 
			
		||||
    .white = { 1, 1, 1, 1 },
 | 
			
		||||
    .primary = { 0.000, 0.392, 0.980, 1 }, // blue5
 | 
			
		||||
    .primaryHover = { 0.000, 0.384, 0.839, 1 }, // blue6
 | 
			
		||||
    .primaryActive = { 0.000, 0.310, 0.702, 1 }, // blue7
 | 
			
		||||
    .fill0 = { 0.180, 0.196, 0.220, 0.05 }, // grey8
 | 
			
		||||
    .fill1 = { 0.180, 0.196, 0.220, 0.09 }, // grey8
 | 
			
		||||
    .fill2 = { 0.180, 0.196, 0.220, 0.13 }, // grey8
 | 
			
		||||
    .bg0 = { 1, 1, 1, 1 },
 | 
			
		||||
    .bg1 = { 1, 1, 1, 1 },
 | 
			
		||||
    .bg2 = { 1, 1, 1, 1 },
 | 
			
		||||
    .bg3 = { 1, 1, 1, 1 },
 | 
			
		||||
    .bg4 = { 1, 1, 1, 1 },
 | 
			
		||||
    .text0 = { 0.110, 0.122, 0.137, 1 }, // grey9
 | 
			
		||||
    .text1 = { 0.110, 0.122, 0.137, 0.8 }, // grey9
 | 
			
		||||
    .text2 = { 0.110, 0.122, 0.137, 0.62 }, // grey9
 | 
			
		||||
    .text3 = { 0.110, 0.122, 0.137, 0.35 }, // grey9
 | 
			
		||||
    .sliderThumbBorder = { 0, 0, 0, 0.075 },
 | 
			
		||||
    .elevatedBorder = { 0, 0, 0, 0.075 }
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										178
									
								
								src/ui/ui.h
								
								
								
								
							
							
						
						
									
										178
									
								
								src/ui/ui.h
								
								
								
								
							| 
						 | 
				
			
			@ -175,6 +175,175 @@ typedef struct oc_ui_style
 | 
			
		|||
    oc_ui_style_mask animationMask;
 | 
			
		||||
} oc_ui_style;
 | 
			
		||||
 | 
			
		||||
typedef struct oc_ui_palette
 | 
			
		||||
{
 | 
			
		||||
    oc_color red0;
 | 
			
		||||
    oc_color red1;
 | 
			
		||||
    oc_color red2;
 | 
			
		||||
    oc_color red3;
 | 
			
		||||
    oc_color red4;
 | 
			
		||||
    oc_color red5;
 | 
			
		||||
    oc_color red6;
 | 
			
		||||
    oc_color red7;
 | 
			
		||||
    oc_color red8;
 | 
			
		||||
    oc_color red9;
 | 
			
		||||
    oc_color orange0;
 | 
			
		||||
    oc_color orange1;
 | 
			
		||||
    oc_color orange2;
 | 
			
		||||
    oc_color orange3;
 | 
			
		||||
    oc_color orange4;
 | 
			
		||||
    oc_color orange5;
 | 
			
		||||
    oc_color orange6;
 | 
			
		||||
    oc_color orange7;
 | 
			
		||||
    oc_color orange8;
 | 
			
		||||
    oc_color orange9;    
 | 
			
		||||
    oc_color amber0;
 | 
			
		||||
    oc_color amber1;
 | 
			
		||||
    oc_color amber2;
 | 
			
		||||
    oc_color amber3;
 | 
			
		||||
    oc_color amber4;
 | 
			
		||||
    oc_color amber5;
 | 
			
		||||
    oc_color amber6;
 | 
			
		||||
    oc_color amber7;
 | 
			
		||||
    oc_color amber8;
 | 
			
		||||
    oc_color amber9;
 | 
			
		||||
    oc_color yellow0;
 | 
			
		||||
    oc_color yellow1;
 | 
			
		||||
    oc_color yellow2;
 | 
			
		||||
    oc_color yellow3;
 | 
			
		||||
    oc_color yellow4;
 | 
			
		||||
    oc_color yellow5;
 | 
			
		||||
    oc_color yellow6;
 | 
			
		||||
    oc_color yellow7;
 | 
			
		||||
    oc_color yellow8;
 | 
			
		||||
    oc_color yellow9;
 | 
			
		||||
    oc_color lime0;
 | 
			
		||||
    oc_color lime1;
 | 
			
		||||
    oc_color lime2;
 | 
			
		||||
    oc_color lime3;
 | 
			
		||||
    oc_color lime4;
 | 
			
		||||
    oc_color lime5;
 | 
			
		||||
    oc_color lime6;
 | 
			
		||||
    oc_color lime7;
 | 
			
		||||
    oc_color lime8;
 | 
			
		||||
    oc_color lime9;
 | 
			
		||||
    oc_color lightGreen0;
 | 
			
		||||
    oc_color lightGreen1;
 | 
			
		||||
    oc_color lightGreen2;
 | 
			
		||||
    oc_color lightGreen3;
 | 
			
		||||
    oc_color lightGreen4;
 | 
			
		||||
    oc_color lightGreen5;
 | 
			
		||||
    oc_color lightGreen6;
 | 
			
		||||
    oc_color lightGreen7;
 | 
			
		||||
    oc_color lightGreen8;
 | 
			
		||||
    oc_color lightGreen9;
 | 
			
		||||
    oc_color green0;
 | 
			
		||||
    oc_color green1;
 | 
			
		||||
    oc_color green2;
 | 
			
		||||
    oc_color green3;
 | 
			
		||||
    oc_color green4;
 | 
			
		||||
    oc_color green5;
 | 
			
		||||
    oc_color green6;
 | 
			
		||||
    oc_color green7;
 | 
			
		||||
    oc_color green8;
 | 
			
		||||
    oc_color green9;
 | 
			
		||||
    oc_color teal0;
 | 
			
		||||
    oc_color teal1;
 | 
			
		||||
    oc_color teal2;
 | 
			
		||||
    oc_color teal3;
 | 
			
		||||
    oc_color teal4;
 | 
			
		||||
    oc_color teal5;
 | 
			
		||||
    oc_color teal6;
 | 
			
		||||
    oc_color teal7;
 | 
			
		||||
    oc_color teal8;
 | 
			
		||||
    oc_color teal9;
 | 
			
		||||
    oc_color cyan0;
 | 
			
		||||
    oc_color cyan1;
 | 
			
		||||
    oc_color cyan2;
 | 
			
		||||
    oc_color cyan3;
 | 
			
		||||
    oc_color cyan4;
 | 
			
		||||
    oc_color cyan5;
 | 
			
		||||
    oc_color cyan6;
 | 
			
		||||
    oc_color cyan7;
 | 
			
		||||
    oc_color cyan8;
 | 
			
		||||
    oc_color cyan9;
 | 
			
		||||
    oc_color lightBlue0;
 | 
			
		||||
    oc_color lightBlue1;
 | 
			
		||||
    oc_color lightBlue2;
 | 
			
		||||
    oc_color lightBlue3;
 | 
			
		||||
    oc_color lightBlue4;
 | 
			
		||||
    oc_color lightBlue5;
 | 
			
		||||
    oc_color lightBlue6;
 | 
			
		||||
    oc_color lightBlue7;
 | 
			
		||||
    oc_color lightBlue8;
 | 
			
		||||
    oc_color lightBlue9;
 | 
			
		||||
    oc_color blue0;
 | 
			
		||||
    oc_color blue1;
 | 
			
		||||
    oc_color blue2;
 | 
			
		||||
    oc_color blue3;
 | 
			
		||||
    oc_color blue4;
 | 
			
		||||
    oc_color blue5;
 | 
			
		||||
    oc_color blue6;
 | 
			
		||||
    oc_color blue7;
 | 
			
		||||
    oc_color blue8;
 | 
			
		||||
    oc_color blue9;
 | 
			
		||||
    oc_color indigo0;
 | 
			
		||||
    oc_color indigo1;
 | 
			
		||||
    oc_color indigo2;
 | 
			
		||||
    oc_color indigo3;
 | 
			
		||||
    oc_color indigo4;
 | 
			
		||||
    oc_color indigo5;
 | 
			
		||||
    oc_color indigo6;
 | 
			
		||||
    oc_color indigo7;
 | 
			
		||||
    oc_color indigo8;
 | 
			
		||||
    oc_color indigo9;
 | 
			
		||||
    oc_color violet0;
 | 
			
		||||
    oc_color violet1;
 | 
			
		||||
    oc_color violet2;
 | 
			
		||||
    oc_color violet3;
 | 
			
		||||
    oc_color violet4;
 | 
			
		||||
    oc_color violet5;
 | 
			
		||||
    oc_color violet6;
 | 
			
		||||
    oc_color violet7;
 | 
			
		||||
    oc_color violet8;
 | 
			
		||||
    oc_color violet9;
 | 
			
		||||
    oc_color purple0;
 | 
			
		||||
    oc_color purple1;
 | 
			
		||||
    oc_color purple2;
 | 
			
		||||
    oc_color purple3;
 | 
			
		||||
    oc_color purple4;
 | 
			
		||||
    oc_color purple5;
 | 
			
		||||
    oc_color purple6;
 | 
			
		||||
    oc_color purple7;
 | 
			
		||||
    oc_color purple8;
 | 
			
		||||
    oc_color purple9;
 | 
			
		||||
    oc_color pink0;
 | 
			
		||||
    oc_color pink1;
 | 
			
		||||
    oc_color pink2;
 | 
			
		||||
    oc_color pink3;
 | 
			
		||||
    oc_color pink4;
 | 
			
		||||
    oc_color pink5;
 | 
			
		||||
    oc_color pink6;
 | 
			
		||||
    oc_color pink7;
 | 
			
		||||
    oc_color pink8;
 | 
			
		||||
    oc_color pink9;
 | 
			
		||||
    oc_color grey0;
 | 
			
		||||
    oc_color grey1;
 | 
			
		||||
    oc_color grey2;
 | 
			
		||||
    oc_color grey3;
 | 
			
		||||
    oc_color grey4;
 | 
			
		||||
    oc_color grey5;
 | 
			
		||||
    oc_color grey6;
 | 
			
		||||
    oc_color grey7;
 | 
			
		||||
    oc_color grey8;
 | 
			
		||||
    oc_color grey9;
 | 
			
		||||
    oc_color black;
 | 
			
		||||
    oc_color white;
 | 
			
		||||
} oc_ui_palette;
 | 
			
		||||
 | 
			
		||||
extern oc_ui_palette OC_UI_DARK_PALETTE;
 | 
			
		||||
extern oc_ui_palette OC_UI_LIGHT_PALETTE;
 | 
			
		||||
 | 
			
		||||
typedef struct oc_ui_theme
 | 
			
		||||
{
 | 
			
		||||
    oc_color white;
 | 
			
		||||
| 
						 | 
				
			
			@ -193,8 +362,15 @@ typedef struct oc_ui_theme
 | 
			
		|||
    oc_color text1;
 | 
			
		||||
    oc_color text2;
 | 
			
		||||
    oc_color text3;
 | 
			
		||||
    oc_color sliderThumbBorder;
 | 
			
		||||
    oc_color elevatedBorder;
 | 
			
		||||
 | 
			
		||||
    oc_ui_palette *palette;
 | 
			
		||||
} oc_ui_theme;
 | 
			
		||||
 | 
			
		||||
extern oc_ui_theme OC_UI_DARK_THEME;
 | 
			
		||||
extern oc_ui_theme OC_UI_LIGHT_THEME;
 | 
			
		||||
 | 
			
		||||
typedef struct oc_ui_tag
 | 
			
		||||
{
 | 
			
		||||
    u64 hash;
 | 
			
		||||
| 
						 | 
				
			
			@ -434,6 +610,7 @@ typedef struct oc_ui_context
 | 
			
		|||
    i32 editFirstDisplayedChar;
 | 
			
		||||
    f64 editCursorBlinkStart;
 | 
			
		||||
 | 
			
		||||
    oc_ui_theme* theme;
 | 
			
		||||
} oc_ui_context;
 | 
			
		||||
 | 
			
		||||
//-------------------------------------------------------------------------------------
 | 
			
		||||
| 
						 | 
				
			
			@ -447,6 +624,7 @@ ORCA_API void oc_ui_process_event(oc_event* event);
 | 
			
		|||
ORCA_API void oc_ui_begin_frame(oc_vec2 size, oc_ui_style* defaultStyle, oc_ui_style_mask mask);
 | 
			
		||||
ORCA_API void oc_ui_end_frame(void);
 | 
			
		||||
ORCA_API void oc_ui_draw(void);
 | 
			
		||||
ORCA_API void oc_ui_set_theme(oc_ui_theme* theme);
 | 
			
		||||
 | 
			
		||||
#define oc_ui_frame(size, style, mask) oc_defer_loop(oc_ui_begin_frame((size), (style), (mask)), oc_ui_end_frame())
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue