In general, we have the philosophy that @extend should be used when there's
a semantic relationship between the class being extended and the class doing
the extending, and mixins should be used when you just want to apply styles.
Using @extend just to apply the same box shadow styles to a bunch of
selectors violates this, and so it's not something we want to make easier. I
understand the worry about file size, but I think the right way to manage
that is either manual stylesheet curation or post-processing optimizations,
which is something we've long thought about adding but haven't gotten around
to yet.

It's worth noting that the @top-level directive you mention wouldn't
actually do what you want it to. Each time the mixin you propose would be
mixed in, it would create a new top-level selector with the given
properties, rather than just @extending the old one.

On Wed, May 4, 2011 at 1:04 PM, Aaron Gibralter
<aaron.gibral...@gmail.com>wrote:

> This is building off what I posted here:
> https://groups.google.com/d/topic/haml/2McvrcWhUjo/discussion
>
> Basically I'm using a lot of compass mixins like `box-shadow`. Now, let's
> say I want to repeatedly use:
>
> @include box-shadow(0 0 0 0.15);
>
> That will generate this in many places in my stylesheet:
>
> -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
> -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
> -o-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
> box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>
> I end up having like 20 * those 4 lines:
>
> #my-div {
>   -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   -o-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
> }
>
> #my-div2 {
>   -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   -o-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
> }
>
> And so on... that's a whole lot of bloat in the rendered css!
>
> Of course, it's a whole lot more efficient to do:
>
> .box-shadow-0-0-0-015 {
>   @include box-shadow(0 0 0 0.15);
> }
>
> And then wherever I need that box shadow:
>
> #my-div {
>   @extend .box-shadow-0-0-0-015;
> }
>
> That ends up producing nicer css:
>
> .box-shadow-0-0-0-015, #my-div, ... 20 other selectors {
>   -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   -o-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
> }
>
> *However*, this approach is much harder to maintain. I need to keep track
> of all of my own classes manually. I end up having a ton of generic classes
> like:
>
> .box-shadow-0-0-0-015 {
>   @include box-shadow(0 0 0 0.15);
> }
> .box-shadow-0-0-0-025 {
>   @include box-shadow(0 0 0 0.25);
> }
> .box-shadow-0-0-0-035 {
>   @include box-shadow(0 0 0 0.35);
> }
>
> And it means that my code is not very reusable.
>
> What I was hoping to achieve was the best of both worlds. I want to have a
> mixin that automatically generates a "top-level" class on the fly. This way
> I could do:
>
> #my-div {
>   @include my-super-box-shadow("bs1", 0 0 0 0.15);
> }
>
> #my-div2 {
>   @include my-super-box-shadow("bs1", 0 0 0 0.15);
> }
>
> #my-div3 {
>   @include my-super-box-shadow("bs2", 0 0 0 0.35);
> }
>
> And it would produce:
>
> .bs1, #my-div, #my-div2 {
>   -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   -o-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
>   box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
> }
>
> .bs2, #my-div3 {
>   @include my-super-box-shadow(0 0 0 0.35);
> }
>
> This would be a beautiful combination of efficient CSS output with
> highly-maintainable scss code.
>
> Any thoughts?
>
>
> On Wed, May 4, 2011 at 3:47 PM, Nathan Weizenbaum <nex...@gmail.com>wrote:
>
>> No, it's not. Why wouldn't you just define the top-level selector outside
>> the mixin?
>>
>> On Wed, May 4, 2011 at 11:41 AM, Aaron Gibralter <
>> aaron.gibral...@gmail.com> wrote:
>>
>>> Does anyone know if it would be possible to write a sass function that
>>> could define a top-level selector within another selector: e.g.:
>>>
>>>
>>> @mixin br1 {
>>>   @top-level .br-1 {
>>>     @include border-radius(1px);
>>>   }
>>>   @extend .br-1;
>>> }
>>>
>>> .foo {
>>>   font-size: 10px;
>>>   @include br1;
>>> }
>>>
>>> //=>
>>>
>>> .foo {
>>>   font-size: 10px;
>>> }
>>>
>>> .br-1, .foo {
>>>   border-radius: 1px;
>>> }
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "Haml" group.
>>> To post to this group, send email to haml@googlegroups.com.
>>> To unsubscribe from this group, send email to
>>> haml+unsubscr...@googlegroups.com.
>>> For more options, visit this group at
>>> http://groups.google.com/group/haml?hl=en.
>>>
>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "Haml" group.
>> To post to this group, send email to haml@googlegroups.com.
>> To unsubscribe from this group, send email to
>> haml+unsubscr...@googlegroups.com.
>> For more options, visit this group at
>> http://groups.google.com/group/haml?hl=en.
>>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "Haml" group.
> To post to this group, send email to haml@googlegroups.com.
> To unsubscribe from this group, send email to
> haml+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/haml?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Haml" group.
To post to this group, send email to haml@googlegroups.com.
To unsubscribe from this group, send email to haml+unsubscr...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/haml?hl=en.

Reply via email to