private void dumpContrastRatios( PrintWriter out ) {
		out.printf( "%n%n#-------- Contrast Ratios --------%n%n" );
		out.println( "# WCAG 2 Contrast Requirements: minimum 4.5; enhanced 7.0" );
		out.println( "# https://webaim.org/articles/contrast/#sc143" );
		out.println();

		HashMap<String, String> fg2bgMap = new HashMap<>();
		defaults.keySet().stream()
			.filter( key -> key instanceof String && ((String)key).endsWith( "ackground" ) )
			.map( key -> (String) key )
			.forEach( bgKey -> {
				String fgKey = bgKey.replace( "Background", "Foreground" ).replace( "background", "foreground" );
				fg2bgMap.put( fgKey, bgKey );
			} );

		// special cases
		fg2bgMap.remove( "Button.disabledForeground" );
		fg2bgMap.put( "Button.disabledText", "Button.disabledBackground" );
		fg2bgMap.remove( "ToggleButton.disabledForeground" );
		fg2bgMap.put( "ToggleButton.disabledText", "ToggleButton.disabledBackground" );
		fg2bgMap.put( "CheckBox.foreground", "Panel.background" );
		fg2bgMap.put( "CheckBox.disabledText", "Panel.background" );
		fg2bgMap.put( "Label.foreground", "Panel.background" );
		fg2bgMap.put( "Label.disabledForeground", "Panel.background" );
		fg2bgMap.remove( "ProgressBar.foreground" );
		fg2bgMap.put( "ProgressBar.selectionForeground", "ProgressBar.foreground" );
		fg2bgMap.put( "ProgressBar.selectionBackground", "ProgressBar.background" );
		fg2bgMap.put( "RadioButton.foreground", "Panel.background" );
		fg2bgMap.put( "RadioButton.disabledText", "Panel.background" );
		fg2bgMap.remove( "ScrollBar.foreground" );
		fg2bgMap.remove( "ScrollBar.hoverButtonForeground" );
		fg2bgMap.remove( "ScrollBar.pressedButtonForeground" );
		fg2bgMap.remove( "ScrollPane.foreground" );
		fg2bgMap.remove( "Separator.foreground" );
		fg2bgMap.remove( "Slider.foreground" );
		fg2bgMap.remove( "SplitPane.foreground" );
		fg2bgMap.remove( "TextArea.disabledForeground" );
		fg2bgMap.put( "TextArea.inactiveForeground", "TextArea.disabledBackground" );
		fg2bgMap.remove( "TextPane.disabledForeground" );
		fg2bgMap.put( "TextPane.inactiveForeground", "TextPane.disabledBackground" );
		fg2bgMap.remove( "EditorPane.disabledForeground" );
		fg2bgMap.put( "EditorPane.inactiveForeground", "EditorPane.disabledBackground" );
		fg2bgMap.remove( "TextField.disabledForeground" );
		fg2bgMap.put( "TextField.inactiveForeground", "TextField.disabledBackground" );
		fg2bgMap.remove( "FormattedTextField.disabledForeground" );
		fg2bgMap.put( "FormattedTextField.inactiveForeground", "FormattedTextField.disabledBackground" );
		fg2bgMap.remove( "PasswordField.disabledForeground" );
		fg2bgMap.put( "PasswordField.inactiveForeground", "PasswordField.disabledBackground" );
		fg2bgMap.remove( "ToolBar.dockingForeground" );
		fg2bgMap.remove( "ToolBar.floatingForeground" );
		fg2bgMap.remove( "ToolBar.foreground" );
		fg2bgMap.remove( "ToolBar.hoverButtonGroupForeground" );
		fg2bgMap.remove( "Viewport.foreground" );

		fg2bgMap.remove( "InternalFrame.closeHoverForeground" );
		fg2bgMap.remove( "InternalFrame.closePressedForeground" );
		fg2bgMap.remove( "TabbedPane.closeHoverForeground" );
		fg2bgMap.remove( "TabbedPane.closePressedForeground" );
		fg2bgMap.remove( "TitlePane.closeHoverForeground" );
		fg2bgMap.remove( "TitlePane.closePressedForeground" );

		// non-text
		HashMap<String, String> nonTextMap = new HashMap<>();
		nonTextMap.put( "Menu.icon.arrowColor", "Panel.background" );
		nonTextMap.put( "Menu.icon.disabledArrowColor", "Panel.background" );
		nonTextMap.put( "CheckBoxMenuItem.icon.checkmarkColor", "Panel.background" );
		nonTextMap.put( "CheckBoxMenuItem.icon.disabledCheckmarkColor", "Panel.background" );
		nonTextMap.put( "ProgressBar.foreground", "Panel.background" );
		nonTextMap.put( "ProgressBar.background", "Panel.background" );
		nonTextMap.put( "Separator.foreground", "Separator.background" );
		nonTextMap.put( "Slider.trackColor", "Panel.background" );
		nonTextMap.put( "Slider.trackValueColor", "Panel.background" );
		nonTextMap.put( "Slider.disabledTrackColor", "Panel.background" );
		nonTextMap.put( "TabbedPane.contentAreaColor", "Panel.background" );
		nonTextMap.put( "ToolBar.separatorColor", "ToolBar.background" );


//		out.println();
//		fg2bgMap.entrySet().stream()
//			.sorted( (e1, e2) -> e1.getKey().compareTo( e2.getKey() ) )
//			.forEach( e -> {
//				out.printf( "%-50s  %s%n", e.getKey(), e.getValue() );
//			} );
//		out.println();

		AtomicReference<String> lastSubkey = new AtomicReference<>();

		fg2bgMap.entrySet().stream()
			.sorted( (e1, e2) -> {
				String key1 = e1.getKey();
				String key2 = e2.getKey();
				int dot1 = key1.lastIndexOf( '.' );
				int dot2 = key2.lastIndexOf( '.' );
				if( dot1 < 0 || dot2 < 0 )
					return key1.compareTo( key2 );
				int r = key1.substring( dot1 + 1 ).compareTo( key2.substring( dot2 + 1 ) );
				if( r != 0 )
					return r;
				return key1.substring( 0, dot1 ).compareTo( key2.substring( 0, dot2 ) );
			} )
			.forEach( e -> {
				dumpContrastRatio( out, e.getKey(), e.getValue(), lastSubkey );
			} );

		out.println();
		out.println( "#-- non-text --" );
		nonTextMap.entrySet().stream()
			.sorted( (e1, e2) -> {
				return e1.getKey().compareTo( e2.getKey() );
			} )
			.forEach( e -> {
				dumpContrastRatio( out, e.getKey(), e.getValue(), null );
			} );
	}
Dumps look and feel UI defaults to files.

@author Karl Tauber
flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/uidefaults/UIDefaultsDump.java