diff --git a/AppKit/Themes/Aristo3/ThemeDescriptors.j b/AppKit/Themes/Aristo3/ThemeDescriptors.j index a0c459113..ef4453eba 100644 --- a/AppKit/Themes/Aristo3/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo3/ThemeDescriptors.j @@ -1456,7 +1456,7 @@ var themedButtonValues = nil, [@"content-inset", CGInsetMake(1.0, 17.0, 1.00, 8.0), [CPButtonStateBezelStyleRounded, CPThemeStateControlSizeSmall, CPThemeStateBordered]], - // FIX: We must include CPThemeStateBordered here to override CPButton's definition + // We must include CPThemeStateBordered here to override CPButton's definition [@"min-size", CGSizeMake(38.0, 19.0), [CPButtonStateBezelStyleRounded, CPThemeStateControlSizeSmall, CPThemeStateBordered]], [@"max-size", CGSizeMake(-1.0, 19.0), [CPButtonStateBezelStyleRounded, CPThemeStateControlSizeSmall, CPThemeStateBordered]], [@"nib2cib-adjustment-frame", CGRectMake(3.0, -7.0, -6.0, -4.0), [CPButtonStateBezelStyleRounded, CPThemeStateControlSizeSmall, CPThemeStateBordered]], @@ -1469,7 +1469,7 @@ var themedButtonValues = nil, [@"content-inset", CGInsetMake(1.0, 15.0, 1.0, 10.0), [CPButtonStateBezelStyleRounded, CPThemeStateControlSizeMini, CPThemeStateBordered]], - // FIX: We must include CPThemeStateBordered here to override CPButton's definition + // We must include CPThemeStateBordered here to override CPButton's definition [@"min-size", CGSizeMake(32.0, 15.0), [CPButtonStateBezelStyleRounded, CPThemeStateControlSizeMini, CPThemeStateBordered]], [@"max-size", CGSizeMake(-1.0, 15.0), [CPButtonStateBezelStyleRounded, CPThemeStateControlSizeMini, CPThemeStateBordered]], [@"nib2cib-adjustment-frame", CGRectMake(1.0, -0.0, -3.0, -0.0), [CPButtonStateBezelStyleRounded, CPThemeStateControlSizeMini, CPThemeStateBordered]], @@ -3244,17 +3244,14 @@ var themedButtonValues = nil, [@"stepper-margin", 2.0, CPThemeStateControlSizeSmall], [@"stepper-margin", 2.0, [CPThemeStateControlSizeSmall, CPThemeStateEditing]], - // min/max size is different for textfield+stepper (CPThemeStateComposedControl) and no stepper (CPThemeStateNormal) - [@"min-size", CGSizeMake(0, 20.0), [CPThemeStateControlSizeSmall, CPThemeStateComposedControl]], - [@"max-size", CGSizeMake(-1.0, 20.0), [CPThemeStateControlSizeSmall, CPThemeStateComposedControl]], + [@"min-size", CGSizeMake(0, 19.0), [CPThemeStateControlSizeSmall, CPThemeStateComposedControl]], + [@"max-size", CGSizeMake(-1.0, 19.0), [CPThemeStateControlSizeSmall, CPThemeStateComposedControl]], [@"min-size", CGSizeMake(0, 19.0), CPThemeStateControlSizeSmall], [@"max-size", CGSizeMake(-1.0, 19.0), CPThemeStateControlSizeSmall], // nib2cib-adjustment-frame is different for textfield+stepper (CPThemeStateComposedControl) and no stepper (CPThemeStateNormal) -// [@"nib2cib-adjustment-frame", CGRectMake(0.0, -2.0, -2.0, -2.0), [CPThemeStateControlSizeSmall, CPThemeStateComposedControl]], [@"nib2cib-adjustment-frame", CGRectMake(0.0, 0.0, -2.0, 0.0), [CPThemeStateControlSizeSmall, CPThemeStateComposedControl]], -// [@"nib2cib-adjustment-frame", CGRectMake(0.0, 1.0, 2.0, 0.0), CPThemeStateControlSizeSmall], [@"nib2cib-adjustment-frame", CGRectMake(0.0, 0.0, 0.0, 0.0), CPThemeStateControlSizeSmall], // CPThemeStateControlSizeMini @@ -3267,6 +3264,16 @@ var themedButtonValues = nil, [@"stepper-margin", 2.0, CPThemeStateControlSizeMini], [@"stepper-margin", 2.0, [CPThemeStateControlSizeMini, CPThemeStateEditing]], + [@"min-size", CGSizeMake(0, 15.0), [CPThemeStateControlSizeMini, CPThemeStateComposedControl]], + [@"max-size", CGSizeMake(-1.0, 15.0), [CPThemeStateControlSizeMini, CPThemeStateComposedControl]], + + [@"min-size", CGSizeMake(0, 15.0), CPThemeStateControlSizeMini], + [@"max-size", CGSizeMake(-1.0, 15.0), CPThemeStateControlSizeMini], + [@"date-hour-margin", 0.0, CPThemeStateControlSizeMini], + [@"hour-ampm-margin", 1.0, CPThemeStateControlSizeMini], + [@"stepper-margin", 2.0, CPThemeStateControlSizeMini], + [@"stepper-margin", 2.0, [CPThemeStateControlSizeMini, CPThemeStateEditing]], + // min/max size is different for textfield+stepper (CPThemeStateComposedControl) and no stepper (CPThemeStateNormal) [@"min-size", CGSizeMake(0, 17.0), [CPThemeStateControlSizeMini, CPThemeStateComposedControl]], [@"max-size", CGSizeMake(-1.0, 17.0), [CPThemeStateControlSizeMini, CPThemeStateComposedControl]], @@ -4722,7 +4729,123 @@ var themedButtonValues = nil, @"position": @"absolute", @"z-index": @"300" } size:CGSizeMake(16,16)], + // --- HUD Small Images (14x14) --- + smallHudImageNormal = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"rgba(255,255,255,0.5)", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"50%", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.3)", + @"transition-duration": @"0.2s", + @"transition-property": @"border-color, background-color" + } size:CGSizeMake(14,14)], + smallHudImageSelected = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"#ffffff", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"50%", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.3)" + } beforeDictionary:nil afterDictionary:@{ + @"background-color": @"#ffffff", + @"width": @"5px", + @"height": @"5px", + @"border-radius": @"50%", + @"content": @"''", + @"left": @"3.5px", // (14 - 2 - 5) / 2 + @"top": @"3.5px", + @"position": @"absolute", + @"z-index": @"300" + } size:CGSizeMake(14,14)], + + smallHudImageDisabled = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"rgba(255,255,255,0.3)", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"50%", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.1)" + } size:CGSizeMake(14,14)], + + smallHudImageSelectedDisabled = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"rgba(255,255,255,0.3)", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"50%", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.1)" + } beforeDictionary:nil afterDictionary:@{ + @"background-color": @"rgba(255,255,255,0.5)", + @"width": @"5px", + @"height": @"5px", + @"border-radius": @"50%", + @"content": @"''", + @"left": @"3.5px", + @"top": @"3.5px", + @"position": @"absolute", + @"z-index": @"300" + } size:CGSizeMake(14,14)], + + // --- HUD Mini Images (12x12) --- + miniHudImageNormal = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"rgba(255,255,255,0.5)", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"50%", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.3)", + @"transition-duration": @"0.2s", + @"transition-property": @"border-color, background-color" + } size:CGSizeMake(12,12)], + + miniHudImageSelected = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"#ffffff", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"50%", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.3)" + } beforeDictionary:nil afterDictionary:@{ + @"background-color": @"#ffffff", + @"width": @"4px", + @"height": @"4px", + @"border-radius": @"50%", + @"content": @"''", + @"left": @"3px", // (12 - 2 - 4) / 2 + @"top": @"3px", + @"position": @"absolute", + @"z-index": @"300" + } size:CGSizeMake(12,12)], + + miniHudImageDisabled = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"rgba(255,255,255,0.3)", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"50%", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.1)" + } size:CGSizeMake(12,12)], + + miniHudImageSelectedDisabled = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"rgba(255,255,255,0.3)", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"50%", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.1)" + } beforeDictionary:nil afterDictionary:@{ + @"background-color": @"rgba(255,255,255,0.5)", + @"width": @"4px", + @"height": @"4px", + @"border-radius": @"50%", + @"content": @"''", + @"left": @"3px", + @"top": @"3px", + @"position": @"absolute", + @"z-index": @"300" + } size:CGSizeMake(12,12)], // Global themedRadioButtonValues = [ @@ -4793,8 +4916,24 @@ var themedButtonValues = nil, [@"image", hudImageSelected, [CPThemeStateHUD, CPThemeStateControlSizeMini, CPThemeStateSelected]], // Overrides Standard [Mini, Selected] [@"image", hudImageDisabled, [CPThemeStateHUD, CPThemeStateDisabled]], - - // FIX: Use the specific "Selected+Disabled" image for HUD, beating the standard rules + + // --- HUD Small --- + [@"image", smallHudImageNormal, [CPThemeStateHUD, CPThemeStateControlSizeSmall]], + [@"image", smallHudImageSelected, [CPThemeStateHUD, CPThemeStateControlSizeSmall, CPThemeStateSelected]], + [@"image", smallHudImageSelected, [CPThemeStateHUD, CPThemeStateControlSizeSmall, CPThemeStateSelected, CPThemeStateKeyWindow]], + [@"image", smallHudImageDisabled, [CPThemeStateHUD, CPThemeStateControlSizeSmall, CPThemeStateDisabled]], + [@"image", smallHudImageSelectedDisabled, [CPThemeStateHUD, CPThemeStateControlSizeSmall, CPThemeStateSelected, CPThemeStateDisabled]], + [@"image", smallHudImageSelectedDisabled, [CPThemeStateHUD, CPThemeStateControlSizeSmall, CPThemeStateSelected, CPThemeStateDisabled, CPThemeStateKeyWindow]], + + // --- HUD Mini --- + [@"image", miniHudImageNormal, [CPThemeStateHUD, CPThemeStateControlSizeMini]], + [@"image", miniHudImageSelected, [CPThemeStateHUD, CPThemeStateControlSizeMini, CPThemeStateSelected]], + [@"image", miniHudImageSelected, [CPThemeStateHUD, CPThemeStateControlSizeMini, CPThemeStateSelected, CPThemeStateKeyWindow]], + [@"image", miniHudImageDisabled, [CPThemeStateHUD, CPThemeStateControlSizeMini, CPThemeStateDisabled]], + [@"image", miniHudImageSelectedDisabled, [CPThemeStateHUD, CPThemeStateControlSizeMini, CPThemeStateSelected, CPThemeStateDisabled]], + [@"image", miniHudImageSelectedDisabled, [CPThemeStateHUD, CPThemeStateControlSizeMini, CPThemeStateSelected, CPThemeStateDisabled, CPThemeStateKeyWindow]], + + // Use the specific "Selected+Disabled" image for HUD, beating the standard rules [@"image", hudImageSelectedDisabled, [CPThemeStateHUD, CPThemeStateSelected, CPThemeStateDisabled]], [@"image", hudImageSelectedDisabled, [CPThemeStateHUD, CPThemeStateSelected, CPThemeStateDisabled, CPThemeStateKeyWindow]], @@ -5243,8 +5382,78 @@ var themedButtonValues = nil, @"position": @"absolute", @"z-index": @"300" } size:CGSizeMake(14,14)], + // --- HUD Mini Images (12x12) --- + miniHudImageNormal = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"rgba(255,255,255,0.5)", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"2px", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.3)", + @"transition-duration": @"0.2s", + @"transition-property": @"border-color, background-color" + } size:CGSizeMake(12,12)], + miniHudImageSelected = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"rgba(255,255,255,0.8)", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"2px", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.3)" + } beforeDictionary:nil afterDictionary:@{ + "-webkit-mask-image": svgCheckmark, + "mask-image": svgCheckmark, + "-webkit-mask-size": "contain", + "mask-size": "contain", + "-webkit-mask-repeat": "no-repeat", + "mask-repeat": "no-repeat", + "-webkit-mask-position": "center", + "mask-position": "center", + @"background-color": @"#ffffff", + @"width": @"7px", + @"height": @"7px", + @"content": @"''", + @"left": @"1.5px", // (12 - 2 - 7) / 2 + @"top": @"1.5px", + @"position": @"absolute", + @"z-index": @"300" + } size:CGSizeMake(12,12)], + miniHudImageDisabled = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"rgba(255,255,255,0.3)", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"2px", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.1)" + } size:CGSizeMake(12,12)], + + miniHudImageSelectedDisabled = [CPImage imageWithCSSDictionary:@{ + @"border-color": @"rgba(255,255,255,0.3)", + @"border-style": @"solid", + @"border-width": @"1px", + @"border-radius": @"2px", + @"box-sizing": @"border-box", + @"background-color": @"rgba(0,0,0,0.1)" + } beforeDictionary:nil afterDictionary:@{ + "-webkit-mask-image": svgCheckmark, + "mask-image": svgCheckmark, + "-webkit-mask-size": "contain", + "mask-size": "contain", + "-webkit-mask-repeat": "no-repeat", + "mask-repeat": "no-repeat", + "-webkit-mask-position": "center", + "mask-position": "center", + @"background-color": @"rgba(255,255,255,0.5)", + @"width": @"7px", + @"height": @"7px", + @"content": @"''", + @"left": @"1.5px", + @"top": @"1.5px", + @"position": @"absolute", + @"z-index": @"300" + } size:CGSizeMake(12,12)], // Global themedCheckBoxValues = [ @@ -5309,7 +5518,19 @@ var themedButtonValues = nil, // --- HUD MAPPINGS --- [@"text-color", [CPColor whiteColor], CPThemeStateHUD], [@"text-color", [CPColor colorWithWhite:1 alpha:0.4], [CPThemeStateHUD, CPThemeStateDisabled]], - + + // --- HUD Small (Reuse regular 14x14 HUD images as they fit) --- + [@"image", hudImageNormal, [CPThemeStateHUD, CPThemeStateControlSizeSmall]], + [@"image", hudImageSelected, [CPThemeStateHUD, CPThemeStateControlSizeSmall, CPThemeStateSelected]], + [@"image", hudImageDisabled, [CPThemeStateHUD, CPThemeStateControlSizeSmall, CPThemeStateDisabled]], + [@"image", hudImageSelectedDisabled, [CPThemeStateHUD, CPThemeStateControlSizeSmall, CPThemeStateSelected, CPThemeStateDisabled]], + + // --- HUD Mini (Use new 12x12 images) --- + [@"image", miniHudImageNormal, [CPThemeStateHUD, CPThemeStateControlSizeMini]], + [@"image", miniHudImageSelected, [CPThemeStateHUD, CPThemeStateControlSizeMini, CPThemeStateSelected]], + [@"image", miniHudImageDisabled, [CPThemeStateHUD, CPThemeStateControlSizeMini, CPThemeStateDisabled]], + [@"image", miniHudImageSelectedDisabled, [CPThemeStateHUD, CPThemeStateControlSizeMini, CPThemeStateSelected, CPThemeStateDisabled]], + [@"image", hudImageNormal, CPThemeStateHUD], [@"image", hudImageSelected, [CPThemeStateHUD, CPThemeStateSelected]], [@"image", hudImageDisabled, [CPThemeStateHUD, CPThemeStateDisabled]], diff --git a/Tests/Manual/ThemeKitchenSinkA3/AppController.j b/Tests/Manual/ThemeKitchenSinkA3/AppController.j index d9bbc0111..8a1729a90 100644 --- a/Tests/Manual/ThemeKitchenSinkA3/AppController.j +++ b/Tests/Manual/ThemeKitchenSinkA3/AppController.j @@ -438,13 +438,16 @@ y += rowHeight; // 5. Date Picker - var dpWidth = width + (aSize == CPRegularControlSize ? 30 : 20); + var dpWidth = width + (aSize == CPRegularControlSize ? 20 : 15); + var dp = [[CPDatePicker alloc] initWithFrame:CGRectMake(xPos, y, dpWidth, 28)]; [dp setControlSize:aSize]; [dp setDatePickerStyle:CPTextFieldAndStepperDatePickerStyle]; + // --- Show ONLY Year, Month, and Day (No Time) --- + [dp setDatePickerElements:CPYearMonthDayDatePickerElementFlag]; + [dp setDateValue:[CPDate date]]; [parentView addSubview:dp]; - y += rowHeight; // 6. Checkbox