PNG Transparency for Internet Explorer (IE6 and Beyond)

Like GIFs and JPEGs, PNG images are ideal for web use. Like GIFs, the PNG is great for displaying small images with few colors, like logos and icons. Also, PNGs sport a few advantages over GIF images. Most notably, they support alpha transparency.

What is alpha-transparency? GIF files are only capable of displaying a pixel as either completely transparent or completely opaque: this is known as binary transparency. When an image contains alpha layers, however, parts of an image can be partially transparent. You can specify a level of transparency from 0 to 255. Below is an image with layers of varying transparency:

PNG with transparent layers

PNGs thus have the potential for creating some interesting effects on a web page, like translucent background images and drop-shadows. But despite their advantages over GIFS, PNGs aren’t nearly as popular as GIFs web design, primarily because of the impression that PNGs don’t enjoy wide browser support. 

This view on PNGs is a bit of a misconception.

While Internet Explorer for Windows 6 (IE6) and previous versions of IE don’t support PNGs’ alpha-transparency feature, all popular browsers can display PNGs.

While IE6- doesn’t explicitly support alpha-transparency out-of-the-box, if you will, there is a workaround that ensures PNG’s cross-browser compatibility.

Microsoft has a plethora of proprietary visual filters and transitions that are available to IE4+. These filters are designed to apply various multimedia affects (transition wipes, light effects and so on) to images in a web page that are viewed with IE. One of these image filters — AlphaImageLoader — lets you display a PNG with alpha-transparency in IE6.

You can employ this filter within the HTML of your page by creating a div element and embedding into it a bit of CSS:


<div style=”position:relative; height: 188px; width: 188px;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader 
(src='images/image.png',sizingMethod='scale');”></div>

The key property here is the filter property. While filter is not valid CSS, it does allow you to apply the AlphaImageLoader filter to the image specified in the parentheses. However, since it isn’t standards-compliant, you may wish to apply this property only as needed (i.e., only when the page is being displayed in IE6-). 

By combining this method, developers can build rich image-based designs with alpha transparency like they would for modern browsers like Safari, Firefox, and Internet Explorer 7 that all supports PNG alpha alpha transparency natively. 

How to Include PNG Transparency in IE6

One available method for doing this is employing Angus Turnbull’s .htc script:

  1. First, download the .htc script at TwinHelix Designs. HTC is a
    scripting language
    only usable by Internet Explorer (because it was created by Microsoft) and this specific script contains applies the AlphaImageLoader filter to all images within a web page. 
  2. After downloadign the script, upload the script to your Web server.
  3. Then, create (or download from TwinHelix) a blank gif file. This image file is 1×1 pixel with the color set as transparent. (Back in the 90s, these were called these gems “single pixel GIFs”). Within the .htc script, change the line that references the blank.gif file so that it points to the gif’s location on the server.
  4. Create a separate CSS file (we’ll name it ie.css), and include within in the following single line, referencing the location of the .htc file: 
    
    img { 
     behavior: url(iepngfix.htc); 
    }
    

    The behavior property let’s you attach a script to some selector (in this case, all img elements). So, this CSS file attaches the .htc file to all of your images, thus applying the desired filter effect to every image within a web page. 

  5. But, we only want to load this CSS file when the page is viewed in IE6-. To do this, just add the following conditional comment to your page’s header: 
    
    <!--[if lte IE 6]>
    <link rel="stylesheet" type="text/css" media="screen" 
    href="ie.css" />    
    <![endif]-->
    

    Conditional comments like these are understood by IE. What the comment says is, “if the browser is IE6 or below, then read the lines within the comment tags. Otherwise, ignore them.” Conditional comments provide a convenient way of applying IE-specific HTML or CSS. Here, the ie.css stylesheet loads only if the page is displayed in IE6‑, letting you apply the non-compliant CSS only when it’s absolutely necessary. 

While a rather convoluted way to get transparent PNGs working in your web pages (although less convulted than my previous method), it does provide a method that is as standards-compliant as possible, giving you the freedom to include the beauty of semi-transparent layers in your designs.

Train the Trainer Swag Prep

Train the Trainer Swag Prep

Molly E. Holzschlag’s free Train the Trainer program is a small, focused gathering for those who are in education, technology training, or work with a company where they can provide in-depth training for their teams.

Topics include HTML, XHTML and CSS technology principles as well as project management ideas, code reviews and one-on-one time. And let’s not forget the free swag, too! 

The swag packages include a free copy of Microsoft’s Expression Web software, IE7 water bottle and stickers, a copy of CSS for Designers, a copy of Transcending CSS, and a copy of the CSS Cookbook.

All in all, it comes out to over $500 dollars in free stuff. 

Not too bad for a free workshop, eh? 

Thanks to Microsoft, Lynda.com, PeachPit and O’Reilly for sending us the karma points to pass onto others.

CSS Floats to Display Columns in Any Order


With my publisher’s permission, I’m sharing the following excerpt from my latest book, CSS Cookbook, Second Edition, which discusses a neat trick for designing multi-column layouts in any order.

Problem

You want to develop a system to display content in columns in any order.

Solution

Given the following markup:


<div id="container-outer">
<div id="container">
 <div id="content" class="column">
  <div class="wrap">
   [...]
  </div>
 </div><!-- /END #content -->

 <div id="navigation" class="column">
  <div class="wrap">
   [...]
  </div>
 </div><!-- /END #navigation -->

 <div id="related-info" class="column">
  <div class="wrap">
   [...]
  </div>
 </div><!-- /END #related-info -->
</div><!-- /END #container -->
</div><!-- /END #container-outer -->

Apply the following CSS rules:


.column {
 float: left;
}

#content {
 margin-left: 20%;
 width: 60%;
}

#navigation {
 margin-left: -80%;
 width: 20%;
}

#related-info {
 width: 19%;
}

/* IEx patches */
* html .column {
 display: inline;
}

* html #navigation li {
 height: 1%;
}
/**/

This will yield the basic page layout that you see in Figure 9–18, with two narrow, flexible-width sidebars bounding an equally flexible center column (see Figure 9–18).

From this rather bland foundation, you can layer additional CSS on top of it. Adding the following code to your CSS will yield a design like Figure 9–19:


body {
 font: normal 62.5%/1.7 Verdana, Geneva, Helvetica, Arial, sans-serif;
 margin: 0;
 padding: 0;
}
#container:after {
 clear: both;
 content: ".";
 display: block;
 height: 0;
 visibility: hidden;
}
#container {
 display: inline-block;
}
/* Hide from MacIE5 */
#container {
 display: block;
}
/**/
#container-outer {
 background: url("bg-left.gif") repeat-y 20% 0;
}
#container {
 background: url("bg-right.gif") repeat-y 80% 0;
}
.column .wrap {
 padding: 20px;
}
#content .wrap {
 padding: 20px 30px;
}
#content p {
 margin-top: 0;
}
#content p:first-child {
 font: normal 1.4em/1.6 Georgia, Times, "Times New Roman", serif;
}
#content p:first-child:first-line {
 text-transform: uppercase;
}
#navigation ul, #navigation ul li {
 list-style: none;
 margin: 0;
 padding: 0;
}
#navigation ul li {
 margin-bottom: .4em;
}
#navigation li a {
 background: #36C;
 color: #FFF;
 border-left: 7px solid #09F;
 display: block;
 padding: .4em .4em .4em 20px;
 text-decoration: none;
}
#navigation li a:hover {
 border-left: none;
 border-right: 7px solid #09F;
 padding-left: 27px;
}
#related-info {
 color: #555;
 font-style: italic;
}
#copyright {
 border: 1px solid #B2B2B2;
 border-width: 1px 0;
 clear: both;
 padding: 10px 20px;
 text-align: center;
}
#copyright p {
 margin: 0;
} 

Discussion

The float model has a storied history. The authors of the CSS specification never intended floats to be used for page-level layout control: rather, they were a means to control the flow of content around an object, much as align="left" or align="right" would cause text to wrap around an img element. But despite the specification’s original spirit, floats do offer us a powerful and flexible alternative to traditional, table-based layout techniques.

Alex Robinson, a designer, published an influential article on creating the “Any Order Columns” in CSS. Robinson’s technique allows developers to create multicolumn layouts easily by using floats to display each column in any order, regardless of the order in which those blocks appear in the markup.

The Markup

To work with this technique, first you need to establish columns in your markup, like so:


<div id="container">
 <div id="content" class="column">
  [...]
 </div><!-- /END #content -->

 <div id="navigation" class="column">
  [...]
 </div><!-- /END #navigation -->

 <div id="related-info" class="column">
  [...]
 </div><!-- /END #related-info -->
</div><!-- /END #container -->

<div id="copyright">
 <p>Copyright notice goes here.</p>
</div>

Inside each div, place any markup you would like. Figure 9–20 shows what the unstyled document looks like, with a few paragraphs and an unordered list thrown in for good measure.

From this demonstration so far, a div element is set up for each of your three columns, and each is assigned an id that describes the kind of content that will be placed inside. In this solution, the values for id are content, navigation, and related-info. It would have been just as easy to use center, left, and right, but that wouldn’t have been especially forward-thinking: what happens when you change your site’s CSS file, and the new design requires the “left” div to appear on the righthand side of the page?

Defining the Columns

With this simple markup structure in place, you can apply a generic float rule to all three column divs:

    
.column {
 float: left;
}

As you see in Figure 9–21, the layout does not look drastically different. The copyright text is a bit out of alignment, but the bulk of your page appears as it did before with each column div stacking horizontally. Once dimensions are assigned to these blocks, however, things rapidly change.

First, start with the content block. To set the block to be 60% of the window width, and the width of the lefthand sidebar to be 20% of the screen, create the following rule:


#content {
 margin-left: 20%;
 width: 60%;
}

Figure 9–22 shows that the layout is looking a bit odd, but starting to take shape.

By setting a lefthand margin equal to the width of your lefthand sidebar, you’ve essentially “reserved” some space for it. The next step is to use negative margins to “pull” the navigation div across the content div to the lefthand side of the page:


#navigation {
 margin-left: -80%;
 width: 20%;
}

The margin-left value applied is a sum of the width of the center column (60%) and its lefthand margin (20%). This pulls the navigation column over to its proper place (see Figure 9–23).

Now, simply by setting a width on the related-info block, the three-column layout is complete, as shown in Figure 9–24:


#related-info {
 width: 20%;
} 

Looks excellent, although the copyright div is still a bit off. But with the clear property, that’s easily fixed (see Figure 9–25):


#copyright {
 clear: both;
}  

Although the layout may look as though your columns are nearly complete, Figure 9–26 shows you that Internet Explorer on Windows needs a little extra attention.

Thankfully, this is a documented IE bug known as the “Doubled Float-Margin Bug”: essentially, when a margin is applied to a floated box in the same direction as the float, that margin is doubled in size.

Since a lefthand margin is applied to a left-floated element, IE on Windows takes that 20% margin and doubles it to 40%.

Thankfully, the fix is a simple one. By applying display:inline to the problematic element, Internet Explorer behaves again. To do this, add the following lines to your CSS:


/* IEx patches */
* html .column {
 display: inline;
}
/**/

The oddly formatted comments and * html prefix ensure that this code is seen by IE on Windows, and IE on Windows alone. And as Figure 9–27 shows, IE is behaving properly.

So you’ve arrived at last: a flexible, three-column layout template. But where else can you take this?

Creating Whitespace

The space between the columns is called a gutter. To customize this layout by increasing the size of the gutters, an approach would be to apply some margins around the columns. There are a number of ways to achieve this effect, but first start by adding an additional div to each of your columns, like so:


<div id="container">
 <div id="content" class="column">
  <div class="wrap">
   [...]
  </div>
 </div><!-- /end #content -->

 <div id="navigation" class="column">
  <div class="wrap">
   [...]
  </div>
 </div><!-- /end #navigation -->

 <div id="related-info" class="column">
  <div class="wrap">
   [...]
  </div>
 </div><!-- /end #related-info -->
</div><!-- /end #container -->

With your “wrap” divs in place, apply padding to them with CSS to create more breathing room (see Figure 9–28):


.column .wrap {
 padding: 20px;
}

#content .wrap {
 padding: 20px 30px;
} 

Adjusting the Order of Columns

As you may have noticed by now, the “Any Order Columns” method is grounded in the intelligent use of margins: positive margins are used to reserve space, while negative margins are used to “pull” columns out of their natural position.

Now simplify the CSS for a moment, and remove all the column margins:


#content {
 width: 60%;
}
#navigation {
 width: 20%;
}
#related-info {
 width: 19%;
}

As a result, your layout now looks like Figure 9–29, with each column appearing in its natural position in the float order.

By adding a lefthand margin to your navigation div, and then by using a negative lefthand margin to move your related-info div, you can essentially reverse the order of the second two columns. With the following CSS, you’re left with a layout like Figure 9–30:

#content {
 width: 60%;
}
#navigation {
 margin-left: 20%;
 width: 20%;
}
#related-info {
 margin-left: -39%;
 width: 19%;
} 

And to complete the demonstration, place the content column on the righthand side of the page, as shown in Figure 9–31.

To do so, apply the following code:


#content {
 margin-left: 40%;
 width: 60%;
}
#navigation {
 margin-left: -100%;
 width: 20%;
}
#related-info {
 margin-left: -80%;
 width: 19%;
} 

As with the first layout, you’ve applied a margin to the content column in order to “reserve” some whitespace on the lefthand side of our page. Then, you’ve used negative lefthand margins to pull the navigation and “related information” divs into the proper location.

Page Layout Algorithm

A simple way to calculate rearranging columns is to follow a somewhat simple algorithm used to calculate the negative margins for a column:

  1. For the column you want to determine its negative margin, first calculate the rightmost point for all columns that precedes it in the source code.
  2. Then specify the leftmost point for the column.
  3. Finally, subtract the rightmost value from the leftmost to give the left margin for the element.

If this technique doesn’t work, there’s always good ol’ trial and error.

Faking Columns

Now return to your first layout (see Figure 9–32), and see how you can make your columns feel, well, a bit more polished. The first step? Background images.

Faux columns” is a technique developed by web designer Dan Cederholm that utilizes a horizontally repeating background image.

By using one tiled image, Cederholm’s method works incredibly well in a fixed-width design: however, the technique’s versatility means that it needs only slight modification to work in our fully flexible layout.

First, you need two images, one for each side of the content column. Figure 9–33 shows the lefthand graphic, while Figure 9–34 shows the right.

Next, you’ll need to wrap your container block in an extra div, like so:


<div id="container-outer">
 <div id="container">
  [Rest of template goes here]
 </div>
</div>

And finally, you’ll need to add the following rules to your style sheet:


#container:after {
 clear: both;
 content: ".";
 display: block;
 height: 0;
 visibility: hidden;
}
#container {
 display: inline-block;
}
/**/
#container {
 display: block;
}
/**/
/**//*/
#container {
 display: inline-block;
}
/**/
#container-outer {
 background: url("bg-left.gif") repeat-y 20% 0;
}
#container {
 background: url("bg-right.gif") repeat-y 80% 0;
}

With this code in place, the columns appear as full-length columns, like the ones in Figure 9–35.

From here, feel free to add any typographic styles you’d like; the ones supplied in the Solution section of this recipe will do nicely, and will yield the finished design shown in Figure 9–36.

An Alternative Solution

The float model for laying out pages is powerful, but floats can have a rather steep learning curve. As a result, many designers find absolute positioning to be an attractive alternative, enabling them to precisely position the different components of their design with x- and y-coordinates.

Unfortunately, positioned elements are taken “out of the document flow,” which effectively collapses their containing element. As a result, “positioned” designs lack the powerful float concept of clearing, which enables the different parts of your designs to be “context-aware”: that is, a footer div (such as the copyright block in the solution, earlier) can be cleared of the floated blocks above it, but not of any positioned elements on the page.

Shaun Inman, a talented web designer/developer, has written a lean JavaScript function to fix this problem. When inserted into your web pages, Inman’s script will automatically “clear” elements of any other positioned elements on the page (see Figure 9–37).

The only potential drawback to this method is that it does rely on JavaScript being active in the user’s browser. But if your content is accessible if you disable JavaScript in your target browsers during testing, then all should be well.

Dalai Lama and President Bush: The iPhone Wallpaper

This week President Bush became the first sitting U.S. President to appear publicly with the Dalai Lama (photo by Eric Draper). This moment in history reminded me of another historical moment: Nixon meeting Elvis (that photo by Ollie Atkins):

Nixon and Elvlis: The iPhone Wallpaper

So, to help capture this history, I made both events into iPhone wallpapers. Natch.

The Taylor McKnight Interview

I first met Taylor McKnight at a SXSW conference, which one I don’t recall. Probably 2004. Or maybe 2005. It seems like many years ago, especially in terms of Web years.

Back then Taylor was a Web Developer for the University of Florida’s Web division. The university’s Web site is so successful it hasn’t gone a major redesign in years and is still the template that other universities copy to this day.

Taylor has since left UF, but still lives in Gainesville, working on pushing forward Internet-enabled entertainment endeavors that we all wish the music and movie industries were undertaking on their own.

I’m happy he agreed to be the first one in my new on-going interview series of Web developers helping to move our industry forward.

Taylor McKnight header


Christopher Schmitt: For the record, what’s your name and what you do? 

Taylor McKnight and I play on websites for a living.

CS: How would you describe yourself? 

TM: 24 year old entrepreneur who likes to create things, travel and listen to music.

CS: What are you currently into right now musically?

TM: Brightblack Morning Light — really chill, Sunday lounging music. The Ghost Is Dancing — Indie pop/rock that can’t go wrong with horns. Mika — Crazy pop that was popular in the UK and recently made it’s way over here. Boy Eats Drum Machine — This guy’s voice is bizarre, but it grows on you.

CS: Where have you traveled?

TM: In the past six months I’ve been to New York City three times, Boston, Austin for SXSW, London, Barcelona, and San Francisco. Most of it was work and or conferences but when you like what you are doing so much, it’s not really work.

CS: With all the traveling, do you have any tips for dealing with traveling? 

TM: Packing wise, I got these Packing Cubes that make it easy to find stuff in my suitcase. I try to concentrate on staying hydrated so I feel good when I get there.

CS: Anywhere you like to go that you haven’t been?

TM: I’m thinking about living in Berlin for a month next summer with some friends who already did it a year ago and want to go back. I also want to see Japan.

CS: What was your first exposure to the internet and/or Web? 

TM: Prodigy. When I was like 10 at my step mom’s office. I barely remember it but it was slow… and awesome.

CS: In what way was it awesome?

TM: I remember being excited that it was this different level of interactivity. Video games were pre-programmed months ago, magazines were written weeks ago, but things you were reading and playing with—even on dial-up—were as close to instant as you could get.

CS: Do you remember what Web sites you used to visit regularly back in the day?

TM: Well, I didn’t use Prodigy for that long, but in the AOL 9600 baud days, it was pretty much chatrooms trying to talk to cute girls who were probably old men.

CS: Was Podbop your first Web application/mashup? What was the experience like in building it and the reaction from the online community?

TM: Yes, Podbop, was my first webapp. I built it with Daniel Westermann-Clark. I was a bit naive and really thought we were just building it for ourselves and a few friends. It was built in our spare time over a few months—most of which was building up our database with MP3 links. At the urge of the Eventful.com crew, we took it to Mashup Camp and ended up winning best mashup. People really enjoyed how insanely simple it was yet useful.

CS: How is podbop doing?

TM: Podbop is on the back-burner these days as I concentrate on Chime.TV and Hype Machine. It’s not growing, but has a steady user-base.

CS: I’ve recenty moved to Cincinnati and I noticed a lot of local bands here don’t have their MP3s listed with the site. Any tips on how I, as a fan or potential fan of some local bands, could get them hooked up on it? Other than emailing them?

TM: Well, anybody, can add them, so if you know of a band with an MP3 go for it. Otherwise, what has been most effective for me is letting labels know about it since they usually have a bunch of bands under them.

CS: Chime.TV is a departure from music and into video from your recent projects of Podbop and Hype Machine. Describe Chime.TV and how it was accomplished? 

TM: Chime.TV is a super video aggregator that is probably the closest thing you will find to TV online with the most content and nothing to install. We combine 10 of the top video sites from around the web into 20+ channels, if you don’t know what you want to watch, and global search, if you do know what you want. It was created by myself and Chirag Mehta and was done over six months in our spare time. It’s easily the most complex project I’ve ever been a part of and I’m very proud of what we’ve done.

CS: Did you win another mashup award for Chime.TV?

TM: Yes, Chime.TV won the Best Mashup Award at Mashup Camp IV this past July in San Francisco. It was my second time winning that award and was very exciting for both of us. Hanging around people and the environment in general at Mashup Camp is really enjoyable.

CS: There is really a lot going on at Chime.TV. Recently, I’ve been searching for Chime.tv videos and having them play sequentially without a lot of hopping around. 

TM: Good idea, I made a Flight of the Conchord channel.

CS: That’s fantastic. I didn’t even know you could do that or that one could be registered user of the site. Does Chime.TV support openID?

TM: Chime.TV doesn’t support openID.

CS: Any other features Chime.TV has that people who like YouTube would prefer over simply surfing youtube?

TM: So with your free user account you can create your own channels, bookmark favorites, and send video mail to friends which shows up when they login to Chime.TV. All the videos play non-stopwe even preload the next video) and are resizable. It’s also better than Youtube because we include videos from: blip.tv, Break.com, DailyMotion, Google Videos, GUBA, Kewego, MetaCafe, MySpace, Veoh.com, and YouTube.

CS: With sites like Chime.TV, Podbop.org and Hype Machine, you are leveraging social Internet trails and turning them into useful applications for people to in turn digest. Are you finding a lot of potential profit in this area? 

TM: I’ve been too focused on creating fun, useful apps to worry about profit too much. A.k.a, I have usually had a day-job that pays the bills. For Podbop and Hype Machine we make money off advertising, which has done pretty well.

CS: Were able to pay the bills right away with these two sites? How long did it take?

TM: For Podbop, our only cost is one $50 a month server, so we were able to cover that pretty easily. Hype Machine was around 2 years before I came aboard and was already making income when I joined.

CS: Could you describe Hype Machine and why someone would want to use the site?

TM: The Hype Machine follows music blog discussions. Everyday, hundreds of people around the world write about music they love and it all ends up here. You can find out what’s popular among music blogs this week, listen to the latest tracks being posted or even search for a specific band to hear more of them. It’s one of the best ways to explore and discover new music.

CS: What’s a typical work day for you? 

TM: Wake up at 8 or 9am, walk down the street with my laptop for a croissant and iced coffee while I check my email. Come back to my home office and work 6–8 hours on various projects like Hype Machine, Chime.TV, my blog, etc. Intersparsed with random errands and lunch. Call it a day usually around 4 or 5pm.

CS: What are typical work-related activities do usually do om a day or week?

TM: Currently I am spending my days working on the Hype Machine redesign. Chatting with Anthony over IM or Skype and implementing various design and code changes. For Chime.TV it’s a bit more marketing oriented. I look for new places to spread the word about our site and come up with new ways to promote it. I’m also currently obsessed with my Tumblelog so I post a lot.

CS: When your workload is heavy, how do you cope? 

TM: Make a physical list of what the steps I need to accomplish. Add copious amounts of
music and caffeine. Shut the door.

CS: How often does that happen in a given week or month?

TM: Probably 2–3 times a month.

CS: What software do you use on regular basis?

  • Synergy. I have a Dell and a 15″ Macbook Pro that share a 24″ monitor, keyboard and mouse using
    Synergy. It’s incredible.
  • Subethaedit is what I handcode XHTML and CSS in (it’s the only thing I use)
  • Transmit and CuteFTP are my FTP clients of choice.
  • Adium and Trillian are my all-in-one chat clients

Also, there is Photoshop, Winamp as all my music is on my Dell, IE7, Firefox, and Safari.

CS: What’s your greatest strength? 

TM: Creative brainstorming.

CS: Anything special you do in brainstorming?

TM: Nothing original. I surround myself with things that inspire me like posters, artwork, music and browse web design galleries like CSS Beauty and other Web sites like NotCot.org.

CS: What’s your greatest weakness? 

TM: Distracted too easily.

CS: Lots of people have that problem, but they haven’t been part of three Web properties like Chime.TV, Podbop, and Hype Machine. What keeps you focused to carry these projects out?

TM: They interest me personally. I love videos, go to concerts and like discovering music, so improving these sites benefit my life and that’s motivation.

CS: In your opinion, what parts of the Web need to be improved or fixed in order for the Web of today to evolve into the Web of the future?

TM: Overall, I’d say more aggregators like Chime.TV and Hype Machine to help filter out all the noise that inevitably comes with everything becoming cheaper/easier/common like making your own music or videos or blog, etc. Maybe even super aggregators for the aggregators.

Music on the Web needs to find a legal way to better cope/compete with things like bittorrent and album leaks. Things like pre-release album orders when music leaks and the ability to actually get everything in one place.