Theme My Login Plugin

I’m sure everyone, at one point or another, has wished that their WordPress login, registration and forgot password pages would match the rest of their website. Well, with my new Theme My Login plugin, this is possible. This free WordPress plugin intercepts the wp-login.php page and the profile.php page, overriding them with a new themed page to match the rest of your website, while completely hiding the back-end from subscribers. No complicated setup, just plug-and-play!

Features

  • Your registration, log in and password recovery pages will all match the rest of your website
  • Includes a customizable widget to login anywhere from your blog
  • Redirect users upon log in based on their role
  • Show gravatar to users who are logged in
  • Assign custom links to users who are logged in based on their role
  • Customize user emails for registration and/or password recovery
  • Send user emails in HTML format
  • Allow users to set their own password upon registration
  • Require users to be approved upon registration
  • Theme user profiles

Version History

5.0.6

  • Pass $theme_my_login by reference in option functions
  • Remove accidental invalid characters

5.0.5

  • Add ‘theme-my-login-page’ shortcode before ‘theme-my-login’ shortcode

5.0.4

  • Re-introduce ‘theme-my-login-page’ shortcode for main login page
  • Add French translation
  • Fix typo in function override notice functions
  • Make 2nd argument optional in ‘get_pages’ filter
  • Remove another ’self’ reference in class.php
  • Fix typo in readme.txt

5.0.3

  • Fix an improper fix for PHP4 style constructor in class
  • Only display function override notices on TML settings page properly

5.0.2

  • Fix improper function call for PHP4 style constructor in class

5.0.1

  • Only display function override notices on TML settings page
  • Typecast arrays as arrays (Fixes invalid datatype notices)
  • Add plugin domain to all gettext calls

5.0

  • Rewrite code in a modular fashion in order to speed up plugin
  • Convert custom e-mails, passwords, redirection, user links and user moderation to “modules”
  • Add the option to enable/disable link rewriting, widget and template tag
  • Simplify/optimize admin tabs style
  • Remember current admin tab after save
  • When using custom passwords, allow users to set their own password upon reset
  • When using custom redirection, specify redirection type per user role/per link type
  • New ajax interface for user links admin
  • Theme My Profile now merged into module

4.4

  • Added the option to require new registrations to confirm e-mail address
  • Added the option to redirect users upon log out according to their role
  • Allow ‘theme-my-login.css’ to be loaded from current theme directory
  • Cleaned up and rewrote most code
  • Drop support for WP versions below 2.8

4.3.4

  • Added the option to force redirect upon login

4.3.3

  • Fixed a redirection bug where WordPress is installed in a sub-directory
  • Added CSS style to keep “Remember Me” label inline with checkbox

4.3.2

  • Added the option to redirect unapproved and/or denied users to a custom URL upon login attempt
  • Fixed a bug where custom user password is lost if user moderation is enabled
  • Fixed a PHP notice in the admin (Wish more plugin authors would do this; WP_DEBUG is your friend!)

4.3.1

  • Fixed a MAJOR security hole that allowed anyone to login without a password!!

4.3

  • Added the option to require approval for new registrations
  • Added the option to enable/disable plugin stylesheet
  • Removed form input fields from label tags
  • Dropped support for WordPress versions older than 2.6

4.2.2

  • Added the option to remove ‘Register’ and/or ‘Lost Password’ links
  • Fixed a bug that sent e-mail from all plugins from this plugins setting

4.2.1

  • Fixed a bug that broke other plugins e-mail format
  • Fixed a bug that could break plugin upon upgrade

4.2

  • Added the option to send e-mails in HTML format
  • Fixed a bug that broke custom user role links if all links were deleted

4.1.2

  • Added the ability to change main login page ID (Only needed for debugging)
  • The login will now revert to default wp-login in the case of plugin failure

4.1.1

  • Fixed a major bug dealing with saving options that broke the plugin
  • Fixed a CSS bug causing interference with other interfaces that use jQuery UI Tabs

4.1

  • Implemented custom user passwords
  • Implemented custom e-mail from name & address
  • Removed template tag & shortcode restriction on main login page

4.0

  • Implemented custom links for logged in users based on role
  • Implemented custom redirection upon log in based on role
  • Implemented custom registration/password recovery emails
  • Implemented true shortcode and template tag functionality
  • Implemented true multi-instance functionality
  • Implemented an easy-to-use jQuery tabbed administration menu
  • Implemented both ‘fresh’ and ‘classic’ colors for administration menu

3.3.1

  • Fixed a bug that broke password recovery due to the new system from WP 2.8.4

3.3

  • Fixed a bug that disabled error display when GET variable ‘loggedout’ was set
  • Added template tag access

3.2.8

  • Fixed a security exploit regarding admin password reset addressed in WordPress 2.8.4

3.2.7

  • Fixed a bug that determined how to create the widget

3.2.6

  • Fixed a bug dealing with the version_compare() function
  • Included French translation
  • Included Spanish translation

3.2.5

  • Fixed a bug that produced a ‘headers aldready sent’ error when uploading media
  • Included Dutch translation

3.2.4

  • Fixed the load_plugin_textdomain() call
  • Added ‘login_head’ action hook

3.2.3

  • Fixed and updated many gettext calls for internationalization

3.2.2

  • Added the option to leave widget links blank for default handling

3.2.1

  • Fixed a XHTML validation issue

3.2

  • Added the option to allow/disallow registration and password recovery within the widget
  • Fixed a bug regarding color names within the CSS file that broke validation

3.1.1

  • Fixed a bug that incorrectly determined current user role

3.1

  • Added the ability to specify URL’s for widget ‘Dashboard’ and ‘Profile’ links per user role
  • Implemented WordPress 2.8 widget control for multiple widget instances
  • Fixed a bug regarding the registration complete message

3.0.3

  • Fixed a bug with the widget links

3.0.2

  • Fixed a bug that didn’t allow custom registration message to be displayed
  • Fixed a few PHP unset variable notice’s with a call to isset()

3.0.1

  • Fixed a bug that caused a redirection loop when trying to access wp-login.php
  • Fixed a bug that broke the widget admin interface
  • Added the option to show/hide login page from page list

3.0

  • Added a customizable login widget

2.2

  • Changed the plugin to make it simply do what the title says

2.1

  • Implemented login redirection based on user role

2.0.8

  • Fixed a bug that broke the login with permalinks

2.0.7

  • Fixed a bug that broke the Featured Content plugin

2.0.6

  • Added the option to turn on/off subscriber profile theming

2.0.5

  • Fixed a bug with default redirection
  • Hid the login form from logged in users

2.0.4

  • Fixed a bug regarding relative URL’s in redirection

2.0.3

  • Fixed various reported bugs and cleaned up code

2.0.2

  • Fixed a bug that broke registration
  • Fixed a bug that broke plugins that use ‘the_content’ filter

2.0.1

  • Fixed a bug that redirected users who were not yet logged in to profile page

2.0

  • Completely rewrote plugin to use page template

1.2

  • Added capability to customize page titles for all pages affected by plugin

1.1.2

  • Updated to allow customization of text below registration form

1.1.1

  • Prepared plugin for internationalization
  • Fixed a PHP version bug

1.1

  • Added custom profile to completely hide the back-end from subscribers

1.0.1

  • Made backwards compatible to WordPress 2.5+

1.0

  • Initial release version

Installation

  1. Upload the plugin to your ‘wp-content/plugins’ directory
  2. Activate the plugin

Requirements

  • WordPress 2.8+

Download

Share and Enjoy:
  • RSS
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • MySpace
  • StumbleUpon
  • Technorati
  • Live
  • Twitter
  • Yahoo! Bookmarks

69 Comments

RSS feed for comments on this post. TrackBack URI

  1. I have been using “Theme my Login” and love it. However I have added “Register Plus” plugin so my users can create their own password when they register.
    The problem: the text “a password will be emailed to you” still appears when using “Theme my Login” but not if I use the default WP login page. I currently have it activated if you want to look.

    Thanks

    Comment by David Goss — July 4, 2009 #

  2. hi!
    Thanks a lot!
    I installed this Plugin and its working great..
    That was what I was looking for

    Comment by Sayeed — July 6, 2009 #

  3. I don’t know if I’m the first to report this but I just upgraded to the newest version and my widgets sidebar (admin side) disappeared.

    Comment by Gene — July 11, 2009 #

  4. Works great, thank you

    Comment by öss — July 11, 2009 #

  5. Hi Jeff,
    I love the plugin, thanks for working so hard on it! I’m working on a few changes to it that will add a setting to display both the login & registration forms on one page, as well as check if BuddyPress is installed, and if so, display the BP registration page instead of the default registration page.

    Email me, and I’ll send you the .zip of the plugin after my changes, I think other users will want this functionality too

    Comment by Jason DeVelvis — July 12, 2009 #

  6. Hey, and thanks for this absolutely necessary plugin. I just wanted to tell you that upgrading to 3.0.1, does not give you the feature to theme the profile page anymore, like in the older version. Probably I am missing something?

    Good luck!

    Comment by Ciprian — July 12, 2009 #

  7. Hi, Jeff. It is great plug-in, but I don’t understand, how it works with profile pages. They still open in admin panel. Maybe I’m doing smth wrong?

    Comment by CyberWombat — July 14, 2009 #

  8. As of version 2.2, profile themeing has been removed. I am working on a separate project for that, entitled Theme My Profile. Expect to see it released very soon. In fact, the initial release version is ready, just waiting on WordPress to put me in the repository.

    Comment by Jeff — July 14, 2009 #

  9. Jeff,

    I just wanted to thank you for providing a solution to a problem I was having, one that I spent hours trying to address.

    I installed my wp.org release in the wordpress subdirectory off of the root. I did not want others to see that they were getting routed to the wordpress subdirectory on the URLs. I was able to fix the index.php for the initial visits, but the login and register pages were still showing up as wordpress.

    I opened up a post a few days ago and published my problem. Shortly thereafter, I stumbled across your Theme My Login plugin. It looked interesting, so I installed it. Low and behold – IT FIXED MY PROBLEM!

    I updated the posting so others could see how to resolve this dilema the other week. I’m sure there are others out there besides me. As an entry level HS student, I don’t have much cash, so the only thing I can do is plug your stuff – Big Time!

    Thanks so much.

    Regards,
    Amy

    Comment by teamamy — July 14, 2009 #

  10. Jeff,

    We, my dad and I, just sent you a donation to help fund your work! My dad’s an IT officer and believes in compensating great talent.

    I’ll definately be using your Profile plugin as well.

    Regards,
    Wayne & Amy

    Comment by teamamy — July 14, 2009 #

  11. [...] right out-of-the-box! This free WordPress plugin was designed to be used to fill the void from the Theme My Login Plugin (as of version 2.2, profile themeing has been removed), but it can also be used by [...]

    Pingback by Theme My Profile | Jeff Farthing Web Design — July 15, 2009 #

  12. I can’t say how impressed I am with this plugin.

    It automatically without any setup headaches, heartache, stress or grief, created the most beautiful login page for my article submission page.

    Thanks you have done a great job.

    Comment by Leigh — July 15, 2009 #

  13. For some reason, the plugin has completely stopped working. When it’s activated, the “login” page is a 404 Error, and when deactivated, the “login” page is normal, except where the form should be it just says [theme my login].

    I don’t know what I did to break it. I imported posts/authors/pages from another WP blog and I replaced two core WP files (functions.php and wpmu_functions.php) as recommended by WP to fix a 2.8.1 bug.

    If I switch themes, the same thing happens, so I know it’s not a theme problem.

    Someone, please help.

    Comment by Josh Malmuth — July 16, 2009 #

  14. Make Your WordPress Login Page Match Your Site…

    Theme My Login is a great WordPress plug-in by Jeff Farthing Web Design that gives your login page a look that is consistent with your site.
    ……

    Trackback by Byte Size Updates — July 22, 2009 #

  15. Hi the author of plugins!!

    Thanks for this creation

    But you must fix one on the code

    you have not good ending with this code:

    wp-content/plugins/theme-my-login/theme-my-login.css”>
    Please Correct to this:
    wp-content/plugins/theme-my-login/theme-my-login.css” />

    and try to check this in w3.org validator!!

    Thanks before,

    Comment by Rudi — July 22, 2009 #

  16. Yes, I had just fixed this before you posted this.

    Comment by Jeff — July 23, 2009 #

  17. [...] further explained on Jeff’s site, his plugin overrides the wp-login.php and profile.php pages. The plugin includes a widget you can [...]

    Pingback by WordPress Plugin Review: Theme My Login | blondish.net — July 24, 2009 #

  18. Excellent plugin. Just what I was looking for! Thank you.

    Comment by Christina Dennis — July 24, 2009 #

  19. Ok!! thanks Jeff your plugins is excellent

    Comment by Rudi — July 29, 2009 #

  20. [...] In: Wordpress plugins 30 Jul 2009 Go to Source [...]

    Pingback by Theme My Login Plugin | Jeff Farthing Web Design & Consulting | Squico — July 30, 2009 #

  21. i love it. thank you!

    Comment by happy — August 1, 2009 #

  22. [...] to Facebook Social Follow Theme My Login Twitter [...]

    Pingback by Plugins — August 7, 2009 #

  23. nice work….. very nice plugins.. keep up the gudwork gudluck

    Comment by codingmind — August 24, 2009 #

  24. I have a support question and would register at forum but I see no option to register to ask support question.
    Could you please reply back or email me so I can get issue worked out with you plugin.

    Thanks

    Comment by Chad — August 26, 2009 #

  25. You do not have to register to post in the forum.

    Comment by Jeff — August 26, 2009 #

  26. Hi

    I have some problems no with login
    I get the page with the theme my login.
    Fill out my login and pasword. Then i going back to the main page.
    I have to set the adres /wp-admin again to go on.
    This is with the latest version.

    What is happening?

    Marco

    Comment by Marco — August 30, 2009 #

  27. Found the problem

    Had to set the redirection

    domain/wp-admin Is normal blank

    Comment by Marco — August 30, 2009 #

  28. It doesn’t logout if pages are cached when users are logged in with WP-Super Cache plugin enabled. Everything else just works fantastic.

    If “Don’t cache pages for logged in users.” is ticked with in WP-Super Cache it works okey and log users out perfectly but if it is not ticked users remain logged in even if they click logout links many times.

    Just a note it may help developer.

    Comment by Tusker — August 30, 2009 #

  29. Dear Jeff,
    I thank you sooooooo (look HOW much!) much for the last update. All my wishes come true. It’s like christmas!
    Now I will playing a while with my new toy – some tiny changes in the languages e.g. (hope I will find it).
    Sorry for my English, hope my happiness will compensate it :-) ))

    Comment by Friesenliese — August 31, 2009 #

  30. Hey man, Great plugin!!!

    My new self registered users get two emails though .. both from the email template I created in your settings page. One with their self defined password and one with a random generated password.

    Any ideas on how to get back to just their self set password?

    Comment by James — September 6, 2009 #

  31. How can one register to your forum? I could not find any link to the “register” page.

    Comment by Sourena — September 7, 2009 #

  32. Hi,
    This plugin sounds great but i have some questions :

    1 – How can we register to your blog/forum ? (there must be a missing link to do it). Idea: Why not using your own plugin ? ;-)

    2 – Where can i find the .pot, mo and so on ? The “language” directory is empty in the zip file.

    Thanks a lot & regards.

    Comment by JustMe — September 8, 2009 #

  33. Registration is now open!

    Comment by Jeff — September 9, 2009 #

  34. [...] Site do plug in [...]

    Pingback by Login com aparência do tema (Wordpress) « Nós na Web — September 21, 2009 #

  35. [...] Favorite Plug-Ins – Thesis Openhook goes hand in hand with the theme. It’s made it extremely easy to do some of the things I wanted without spending hours and hours tinkering and messing up (which is my current modus operandi when it comes to dealing with anything that has HTML involved!) I LOVE the quote rotator plug-in, I am reading, Theme My Profile, and Theme My Login. [...]

    Pingback by Fun site info and shameless plugs — Lactivist Leanings — October 21, 2009 #

  36. [...] » Download the Plugin Here. [...]

    Pingback by 7 Ways to Spice Up Your WordPress Login | WPMU — October 23, 2009 #

  37. We just recently updated the plugin from 4.2.2 to the latest 4.3.3. This apperantly broke the send email when users registered, ASked for thier passwords. We had to go back to 4.2.2 to restore that email functionality.

    Comment by Rob — October 30, 2009 #

  38. [...] Theme My Login [...]

    Pingback by Top 1000 WordPress Plugin Authors « Metode de promovare — November 6, 2009 #

  39. Thanks! I was confused at how I’m suppose to use this but I think I finally figured it out! :)

    Comment by Jonathanroxcp — November 17, 2009 #

  40. hi
    i am using this plugin and updated some css and profile issues but the major issue i thought is as it overrides the original wordpress login .. which actually sends a random password to user to it’s mail .. so automatically it verifies the mail .. but when user register with his own password , the email is not verified then ..

    please can we make this changes that it sends a verification link .. to mail and which on clicking activates user account

    Comment by deepesh — November 23, 2009 #

  41. [...] alternative intéressante semble être le plugin Thème My Login de Jeff Farthing. Ce dernier permet de mettre l’écran pour s’enregistrer / se connecter ou redemander [...]

    Pingback by Personnaliser sa page de login WordPress | WordPress tuto — November 30, 2009 #

  42. [...] 21. Theme My Login “Themes the WordPress login, registration and forgot password pages according to your theme.” 로그인창을 좀더 보기좋게 바꿔줍니다. 텅빈 화면에 덩그러니 놓여져있는 로그인 창이 아니라 마치 블로그의 페이지 중 하나인 것처럼 보여주며, 현재 사용중인 테마의 CSS의 영향을 받는듯 합니다. 가볍지만 자칫 민감한 부분도 있어서 몇가지 주의점도 있습니다만. 크게 문제는 없다고 생각되어 유용히 사용중입니다. Jeff Farthing | Visit plugin site [...]

    Pingback by Plug-in list in wordpress | eLKei.NET — December 5, 2009 #

  43. hi friends,
    i am very impressed with this plugins, but i like to add the new user registration link in my theme as like login. can any one help me

    Comment by shivaganesh — December 8, 2009 #

  44. Guys i got the solution for above. thanks a lot… very nice plugins

    Comment by shivaganesh — December 8, 2009 #

  45. I’m using ver.4.3.2 with BP 1.1.3.
    The Theme My Plugin seems to break BP registeration’s validation key. Because user can register, but was unable to get it verified when they clicked on the validation link send to their email. Once I deactivate this plugin, everything is ok.

    Also I’m looking at ways to change the register link in the my login box to point to BP register page instead of WPMU’s signup page.

    Thanks

    Comment by Leon — December 14, 2009 #

  46. Hi
    I have a problem.
    When a normal subscriber tries to go to the profile page, the following error message is displayed:

    Fatal error: Call to a member function on a non-object in /homez.195/voxlibri/www/wp-content/plugins/theme-my-login/theme-my-login.php on line 476

    Please advise….

    Regards

    Jean-Luc

    Comment by Jean-Luc — December 15, 2009 #

  47. I need a checkbox or radio button to confirm user read the TOC…thanks

    Comment by Thorsten — December 15, 2009 #

  48. [...] Plugin Homepage [...]

    Pingback by Install theme-my-login plugin « Knowing more about Wordpress — December 16, 2009 #

  49. i been using this great plug’n but in WP 2.9 it broke the color of themeatic.

    Comment by gournis — December 21, 2009 #

  50. The last update breaks th eFeatured Content Gallery, has a problem with that. Please check it and try to solve it!

    Comment by Hip Hop — December 23, 2009 #

  51. I encountered the same problems with Hip Hop. The lasted version breaks the Featured Content Gallery

    Comment by mekery — December 26, 2009 #

  52. Hip Hop and mekery, what version did work for you?

    I have same issue with Featured Content Gallery, but I am a new user using latest version. Since it seems to have worked with an older version, if someone could please send it to me please? Thanks,

    Comment by Ed — December 29, 2009 #

  53. Installed and running well …..
    thanks a lot !
    ant Paypal Donation url ? you deserve it !

    Comment by erwin — December 30, 2009 #

  54. So let’s try again!

    The TML plugin intereferes with the GD Press Tools plugin robot meta tag generator. There’s an option in GD Press Tools to set the login page as noindex nofollow.

    With TML installed, it blinds the GD Press Tools to treat EVERYTHING as a login page setting and everything gets a noindex nofollow setting. Thus completely ignoring other custom robot tag settings for other pages on my blog that should be generated by the GD Press Tools plugin.

    Anyone know how to fix this because unfortunetly, GS Press Tools plugin takes precedence over the TML plugin :(

    Comment by roger — January 2, 2010 #

  55. Well, I had to deactivate and delete this awesome plugin due to the fact it messes with robot meta tag generation. So it is pointless to send a donation (as I have for other plugins I use).

    I spent all day trying to figure out how to make it work with different settings of TML to have the robot meta tag generator work (even different combination of setting for the robot meta tag generator), but to no avail.

    TML makes all pages look like a login page and no matter how I set the robot tags for other pages, it seems that whatever I have setup for login page is the setting for ALL pages. What a shame! I was really excited about TML!

    Comment by roger — January 3, 2010 #

  56. Thank you for an awesome plugin – Works a treat!

    I do however feel although being one of the easiest plugins I’ve used, it could be improved for greater flexibility. May I suggest the following:

    • An option to enable reCaptcha for those who have keys.
    • Optional extra form fields for a more accurate data capture
    • A password strength meter would be a bonus
    • More importantly getting new users to activate their account via the confirmation email (Register Plus has a good feature for this).

    I would then indefinately donate for this plugin :)

    All just ideas of course!

    Comment by Aaron — January 5, 2010 #

  57. [...] Theme My Login [...]

    Pingback by Ciao BB WEB (ciaobbweb.com) — Blog — Theme My Login — January 6, 2010 #

  58. Thanks for the fix with the Featured Content Gallery, now I need to know how can i translate the plugin, for example instead of sayin “username”, I need to have “Nombre de Usuario”, insted “Password”, I need “Contraseña”… etc Thanks a lot

    Comment by Hip Hop — January 19, 2010 #

  59. The update now displays when you login that you still need to login, even though you are indeed logged into your dashboard.

    Comment by Hunter Boone — January 23, 2010 #

  60. The Latest Version 4.4 does not work with WPMU.
    4.3.2 works fine. Awesome Plugin!

    Comment by Laurence — January 25, 2010 #

  61. Plugin is great however, it (4.4) is not allowing registration and YES, my site does allow registration.

    Comment by ron — January 25, 2010 #

  62. ^I have to agree. An update to the plugin has broken user registrations -_-

    I hope it gets fixed soon, because it’s useless at the moment!

    Comment by Abe — February 5, 2010 #

  63. [...] that members would prefer NOT to see and/or use the back-end login form and deal with it, so I used Theme My Login plugin that create a nice sidebar widget and allow members to register right from the front-end and [...]

    Pingback by How to Create a Bookmark website using Wordpress — February 8, 2010 #

  64. Awesome plugin, just I have this blog and I updated the plugin very nice new updates but lost a very important component Hide the links (pages) Now they appear in the menu and I do not have the old version so any suggestions are welcome very nice plugins Theme and Login I am making a text for code and iframe will send out a url when finished.
    Frank

    Comment by Frank — February 12, 2010 #

  65. Found an old version thank god! 4.1 wow alls back to normal .will add the rss feed for this topic you rock keep up the good work.

    Comment by Bill — February 12, 2010 #

  66. I solved my translation problem by creating a .po file through POEdit.

    Comment by Bruno Galindro — February 18, 2010 #

  67. Thanks for making an amazing plugin.

    One suggestion, if one puts the widget in the footer and submits the form with an error or clicks on the forgot password link, the page reloads and the error and form are not visible as they are not at the top of the page.

    I corrected the issue by adding a name anchor with a check to only jump to the anchor if the instance is a widget and not the page.

    I’m sure you can easily add the code yourself or if you want I can send you the file to save time.

    Comment by Erum — February 23, 2010 #

  68. Sounds like a really cool plugin, but there does seem to be a few technical issues raised. I’d love to add something like this but wouldn’t want to cause myself problems for a ‘want’ not ‘need’ plugin.

    I’ve been looking for cool plugins that make wordpress blogs easier to use, is this one of them?

    I’d like to add it to myWP Autotools section but wouldn’t want to bewilder newbies with technicalities

    Comment by Dean Runcic — March 8, 2010 #

  69. BUG report: after upgrading to the latest version wp_list_pages stopped working properly. The titles were rewritten to welcome, [username]. Had to manually insert the pages for it to work.

    Comment by Beee — March 8, 2010 #

Sorry, the comment form is closed at this time.

Powered by WordPress with GimpStyle Theme design by Horacio Bella.
Entries and comments feeds. Valid XHTML and CSS.