Let’s Talk About Speech CSS

Post pobrano z: Let’s Talk About Speech CSS

Boston, like many large cities, has a subway system. Commuters on it are accustomed to hearing regular public address announcements.

Riders simply tune out some announcements, such as the pre-recorded station stop names repeated over and over. Or public service announcements from local politicians and celebrities—again, kind of repetitive and not worth paying attention to after the first time. Most important are service alerts, which typically deliver direct and immediate information riders need to take action on.

An informal priority

A regular rider’s ear gets trained to listen for important announcements, passively, while fiddling around on a phone or zoning out after a hard day of work. It’s not a perfect system—occasionally I’ll find myself trapped on a train that’s been pressed into express service.

But we shouldn’t remove lower priority announcements. It’s unclear what kind of information will be important to whom: tourists, new residents, or visiting friends and family, to name a few.

A little thought experiment: Could this priority be more formalized via sound design? The idea would be to use different voices consistently or to prefix certain announcements with specific tones. I’ve noticed an emergent behavior from the train operators that kind of mimics this: Sometimes they’ll use a short blast of radio static to get riders’ attention before an announcement.

Opportunities

I’ve been wondering if this kind of thinking can be extended to craft better web experiences for everyone. After all, sound is enjoying a renaissance on the web: the Web Audio API has great support, and most major operating systems now ship with built-in narration tools. Digital assistants such as Siri are near-ubiquitous, and podcasts and audiobooks are a normal part of people’s media diet.

Deep in CSS’—ahem—labyrinthine documentation, are references to two Media Types that speak to the problem: aural and speech. The core idea is pretty simple: audio-oriented CSS tells a digitized voice how it should read content, the same as how regular CSS tells the browser how to visually display content. Of the two, aural has been deprecated. speech Media Type detection is also tricky, as a screen reader potentially may not communicate its presence to the browser.

The CSS 3 Speech Module, the evolved version of the aural Media Type, looks the most promising. Like display: none;, it is part of the small subset of CSS that has an impact on screen reader behavior. It uses traditional CSS property/value pairings alongside existing declarations to create an audio experience that has parity with the visual box model.

code {
  background-color: #292a2b;
  color: #e6e6e6;
  font-family: monospace;
  speak: literal-punctuation; /* Reads all punctuation out loud in iOS VoiceOver */
}

Just because you can, doesn’t mean you should

In his book Building Accessible Websites, published in 2003, author/journalist/accessibility researcher Joe Clark outlines some solid reasons for never altering the way spoken audio is generated. Of note:

Support

Many browsers don’t honor the technology, so writing the code would be a waste of effort. Simple and direct.

Proficiency

Clark argues that developers shouldn’t mess with the way spoken content is read because they lack training to „craft computer voices, position them in three-dimensional space, and specify background music and tones for special components.”

This may be the case for some, but ours is an industry of polymaths. I’ve known plenty of engineers who develop enterprise-scale technical architecture by day and compose music by night. There’s also the fact that we’ve kind of already done it.

The point he’s driving at—crafting an all-consuming audio experience is an impossible task—is true. But the situation has changed. An entire audio universe doesn’t need to be created from whole cloth any more. Digitized voices are now supplied by most operating systems, and the number of inexpensive/free stock sound and sound editing resources is near-overwhelming.

Appropriateness

For users of screen readers, the reader’s voice is their interface for the web. As a result, users can be very passionate about their screen reader’s voice. In this light, Clark argues for not changing how a screen reader sounds out content that is not in its dictionary.

Screen readers have highly considered defaults for handling digital interfaces, and probably tackle content types many developers would not even think to consider. For example, certain screen readers use specialized sound cues to signal behaviors. NVDA uses a series of tones to communicate an active progress bar:

Altering screen reader behavior effectively alters the user’s expected experience. Sudden, unannounced changes can be highly disorienting and can be met with fear, anger, and confusion.

A good parallel would be if developers were to change how a mouse scrolls and clicks on a per-website basis. This type of unpredictability is not a case of annoying someone, it’s a case of inadvertently rendering content more difficult to understand or changing default operation to something unfamiliar.

My voice is not your voice

A screen reader’s voice is typically tied to the region and language preference set in the operating system.

For example, iOS contains a setting for not just for English, but for variations that include United Kingdom, Ireland, Singapore, New Zealand and five others. A user picking UK English will, among other things, find their Invert Colors feature renamed to „Invert Colours.”

However, a user’s language preference setting may not be their primary language, the language of their country of origin, or the language of the country they’re currently living in. My favorite example is my American friend who set the voice on his iPhone to UK English to make Siri sound more like a butler.

UK English is also an excellent reminder that regional differences are a point of consideration, y’all.

Another consideration is biological and environmental hearing loss. It can manifest with a spectrum of severity, so the voice-balance property may have the potential to „move” the voice outside of someone’s audible range.

Also, the speed the voice reads out content may be too fast for some or too slow for others. Experienced screen reader operators may speed up the rate of speech, much as some users quickly scroll a page to locate information they need. A user new to screen readers, or a user reading about an unfamiliar topic may desire a slower speaking rate to keep from getting overwhelmed.

And yet

Clark admits that some of his objections exist only in the realm of the academic. He cites the case of a technologically savvy blind user who uses the power of CSS’ interoperability to make his reading experience pleasant.

According to my (passable) research skills, not much work has been done in asking screen reader users their preferences for this sort of technology in the fourteen years since the book was published. It’s also important to remember that screen reader users aren’t necessarily blind, nor are they necessarily technologically illiterate.

The idea here would be to treat CSS audio manipulation as something a user can opt into, either globally or on a per-site basis. Think web extensions like Greasemonkey/Tampermonkey, or when websites ask permission to send notifications. It could be as simple as the kinds of preference toggles users are already used to interacting with:

A fake NVDA screenshot
A fake screenshot simulating a preference in NVDA that would allow the user to enable or disable CSS audio manipulation.

There is already a precedent for this. Accessibility Engineer Léonie Watson notes that JAWS—another popular screen reader—“has a built in sound scheme that enables different voices for different parts of web pages. This suggests that perhaps there is some interest in enlivening the audio experience for screen reader users.”

Opt-in also supposes features such as whitelists to prevent potential abuses of CSS-manipulated speech. For example, a user could only allow certain sites with CSS-manipulated content to be read, or block things like unsavory ad networks who use less-than-scrupulous practices to get attention.

Opinions: I have a few

In certain situations a screen reader can’t know the context of content but can accept a human-authored suggestion on how to correctly parse it. For example, James Craig’s 2011 WWDC video outlines using speak-as values to make street names and code read accurately (starts at the 15:36 mark, requires Safari to view).

In programming, every symbol counts. Being able to confidently state the relationship between things in code is a foundational aspect of programming. The case of thisOne != thisOtherOne being read as „this one is equal to this other one” when the intent was „this one is not equal to this other one” is an especially compelling concern.

Off the top of my head, other examples where this kind of audio manipulation would be desirable are:

  • Ensuring names are pronounced properly.
  • Muting pronunciation of icons (especially icons made with web fonts) in situations where the developer can’t edit the HTML.
  • Using sound effect cues for interactive components that the screen reader lacks built-in behaviors for.
  • Creating a cloud-synced service that stores a user’s personal collection of voice preferences and pronunciation substitutions.
  • Ability to set a companion voice to read specialized content such as transcribed interviews or code examples.
  • Emoting. Until we get something approaching EmotionML support, this could be a good way to approximate the emotive intent of the author (No, emoji don’t count).
  • Spicing things up. If a user can’t view a website’s art direction, their experience relies on the skill of the writer or sound editor—on the internet this can sometimes leave a lot to be desired.

The reality of the situation

The CSS Speech Module document was last modified in March 2012. VoiceOver on iOS implements support using the following speak-as values for the speak property, as shown in this demo by accessibility consultant Paul J. Adam:

  • normal
  • digits
  • literal-punctuation
  • spell-out

Apparently, the iOS accessibility features Speak Selection and Speak Screen currently do not honor these properties.

Despite the fact that CSS 3 Speech Module has to be ratified (and therefore is still subject to change), VoiceOver support signals that a de facto standard has been established. The popularity of iOS—millions of devices, 76% of which run the latest version of iOS—makes implementation worth considering. For those who would benefit from the clarity provided by these declarations, it could potentially make a big difference.

Be inclusive, be explicit

Play to CSS’ strengths and make small, surgical tweaks to website content to enhance the overall user experience, regardless of device or usage context. Start with semantic markup and a Progressive Enhancement mindset. Don’t override pre-existing audio cues for the sake of vanity. Use iOS-supported speak-as values to provide clarity where VoiceOver’s defaults need an informed suggestion.

Writing small utility classes and applying them to semantically neutral span tags wrapped around troublesome content would be a good approach. Here’s a recording of VoiceOver reading this CodePen to demonstrate:

Take care to extensively test to make sure these tweaks don’t impair other screen reading software. If you’re not already testing with screen readers, there’s no time like the present to get started!

Unfortunately, current support for CSS speech is limited. But learning what it can and can’t do, and the situations in which it could be used is still vital for developers. Thoughtful and well-considered application of CSS is a key part of creating robust interfaces for all users, regardless of their ability or circumstance.


Let’s Talk About Speech CSS is a post from CSS-Tricks

How to Create an Aquaman-Inspired Text Effect in Adobe Photoshop

Post pobrano z: How to Create an Aquaman-Inspired Text Effect in Adobe Photoshop

Final product image
What You’ll Be Creating

This tutorial will show you how to use layer styles, textures, brushes, with a bunch of tools and adjustments to create a text effect inspired by the Aquaman movie poster. Let’s get started!

This text effect was inspired by the many Layer Styles available on GraphicRiver.

Tutorial Assets

The following assets were used during the production of this tutorial:

1. How to Create a Background

Step 1

Create a new 3000 x 2071 px document, click the Create new fill or adjustment layer icon at the bottom of the Layers panel, and choose Gradient.

Create the gradient fill using the Colors #297f82 to the left, #1a3344 in the middle, and #0d1018 to the right.

Change the Style to Radial, and click-drag the center of the gradient to place it at the top of the document.

Increase the Scale value to 200, and check the Dither box.

Gradient Fill Layer

Step 2

Go to File > Place Linked, open the Under water texture image, and go to Image > Adjustments > Hue/Saturation to change the Saturation value to -100.

HueSaturation

Step 3

Change the texture layer’s Blend Mode to Color Dodge.

Change the Blend Mode

Step 4

Go to Edit > Transform > Warp, choose Arc from the Warp menu in the Options bar, and click-drag the control point to get a result you like.

Warp Mode

Step 5

Hit the Return key to commit the changes, and click the Add layer mask icon at the bottom of the Layers panel.

Add a Layer Mask

Step 6

Pick the Gradient Tool, set the Foreground and Background Colors to White and Black, choose the Foreground to Background gradient fill, and click the Radial Gradient icon in the Options bar.

Select the mask’s thumbnail, and click-drag from the document’s top to its bottom to create a gradient mask.

Create a Gradient Mask

2. How to Add a Light Rays Brush

Step 1

Pick the Brush Tool, and create a new layer and name it Light Rays.

Change the layer’s Blend Mode to Overlay and its Opacity to 50%.

Create the Light Rays Layer

Step 2

Hold the Option key, and click-drag the texture layer mask’s thumbnail to the Light Rays layer to duplicate it.

Duplicate the Layer Mask

Step 3

Unlink the mask by clicking the link icon between the layer and mask thumbnails.

Select the layer’s thumbnail, and add a light rays brush from the Light Rays pack. You can then press Command-T to enter Free Transform Mode and rotate, resize, and warp the rays.

Free Transform Mode

3. How to Add a Fizz Texture

Step 1

Open the Phineas F. Texture Stock image, and go to Image > Calculations.

Change both Channel values to Red, the Blending to Overlay, and the Result to Selection. Click OK, and go to Edit > Copy.

Calculations Settings

Step 2

Back to the original document, go to Edit > Paste, rename the layer to Top Fizz, and change its Fill value to 0%.

Place the texture at the top of the document and resize it as needed.

Add the Top Fizz Texture

Double-click the Top Fizz layer to apply the following layer style:

Step 3

Add a Bevel and Emboss with these settings:

  • Size: 2
  • Uncheck the Use Global Light box
  • Angle: 122
  • Altitude: 42
  • Gloss Contour: Ring
  • Check the Anti-aliased box
  • Highlight Mode: Linear Light
  • Shadow Mode:
    • Opacity: 35%
Bevel and Emboss

Step 4

Add a Contour with these settings:

  • Contour: Ring – Double
  • Check the Anti-aliased box.
Contour

Step 5

Lower the Opacity to 50%.

Opacity Value

Step 6

Put all the layers except for the Background layer in a group and name it Background.

Background Group

4. How to Create a Smart Object Text Layer

Step 1

Create the text in All Caps using the font Lato Heavy. Set the Size to 250 pt and the Tracking to 645.

Create the Text

Step 2

Rename the text layer to Text, right-click it, and choose Convert to Smart Object.

Convert to Smart Object

5. How to Record a Simple Extrusion Action

Step 1

Open the Actions panel, click the Create new set icon at the bottom of the panel, type Extrusion in the Name field, and click OK.

New Action Set

Step 2

Click the Create new action icon at the bottom of the panel, type Action in the Name field, and click Record.

Create New Action

Step 3

Press Command-J to duplicate the Text layer.

Duplicate the Layer

Step 4

Press Command-T to enter Free Transform Mode.

In the Options bar, click the Maintain aspect ratio icon between the W and H fields, and set their values to 99.9%.

Hit the Return key to commit the changes. You should see all the steps recorded and added to the action you’ve created.

Scale Down

Step 5

Click the Stop recording icon at the bottom of the Actions panel.

Stop Recording

6. How to Create an Extrusion

Step 1

Click the Play selection icon at the bottom of the Actions panel ten times to create ten more copies with the transformation.

Create the Extrusion

Step 2

Select all the Text layers, and go to Layer > Arrange > Reverse. This will place the last copy layer at the bottom and bring the original to the top.

Reverse Layer Order

Step 3

Deselect the first and last Text layers, and place the rest in a group and name it Center.

Center Group

Step 4

Rename the top Text layer to Front and the last to Back.

Front and Back Layers

Step 5

Duplicate the Front layer twice.

Duplicate Layers

Step 6

Drag the Front layer on top of all layers inside the Center group.

Move Layer

7. How to Style the Front Text Layers

Double-click the Front copy 2 layer to apply the following layer style:

Step 1

Add a Bevel and Emboss with these settings:

  • Style: Stroke Emboss
  • Depth: 300
  • Size: 5
  • Uncheck the Use Global Light box
  • Angle: -176
  • Altitude: 21
  • Gloss Contour: Gaussian
  • Check the Anti-aliased box
Bevel and Emboss

Step 2

Add a Contour with these settings:

  • Contour: Cone – Asymmetrical
  • Check the Anti-aliased box.
Contour

Step 3

Add a Stroke with these settings:

  • Size: 3
  • Position: Inside
  • Fill Type: Gradient
  • Style: Reflected
  • Create the Gradient using the Colors #7e662e to the left, and #cfb765 with a Location value around 86%.
Stroke

Step 4

Change the Fill value to 0%.

Change the Fill Value

Step 5

Convert the layer to a Smart Object.

Convert to a Smart Object

Step 6

Double-click the Front copy layer to apply a Pattern Overlay effect with these settings:

  • Pattern: 1.jpg (Open the image from the Metal seamless textures pack, and go to Edit > Define Pattern to add it to the preset)
  • Scale: 50%
Pattern Overlay

This will style the front part of the text.

Styled Front

8. How to Style the Extrusion

Double-click the Front layer to apply the following layer style:

Step 1

Add a Bevel and Emboss with these settings:

  • Style: Stroke Emboss
  • Depth: 230
  • Size: 5
  • Uncheck the Use Global Light box
  • Angle: -90
  • Altitude: 50
  • Gloss Contour: Cove – Deep
  • Check the Anti-aliased box
Bevel and Emboss

Step 2

Add a Contour with these settings:

  • Contour: Rolling Slope – Descending
  • Check the Anti-aliased box.
Contour

Step 3

Add a Stroke with these settings:

  • Size: 3
  • Position: Center
  • Fill Type: Gradient
  • Style: Linear
  • Create the Gradient using the Colors #7e662e to the left and right, and #d4c591 in the middle.
Stroke

Step 4

Change the Front layer’s Fill value to 0%, right-click it, and choose Copy Layer Style.

Copy Layer Style

Step 5

Select the other layers inside the Center group, right-click any of them, and choose Paste Layer Style.

Paste Layer Style

9. How to Style the Back Text Layer

Double-click the Back text layer to apply the following layer style:

Step 1

Add a Bevel and Emboss with these settings:

  • Style: Stroke Emboss
  • Size: 4
  • Uncheck the Use Global Light box
  • Angle: -164
  • Altitude: 53
  • Gloss Contour: Gaussian
  • Check the Anti-aliased box
Bevel and Emboss

Step 2

Add a Contour with these settings:

  • Contour: Cone – Asymmetrical
  • Check the Anti-aliased box.
Contour

Step 3

Add a Stroke with these settings:

  • Size: 2
  • Position: Outside
  • Fill Type: Gradient
  • Style: Reflected
  • Create the Gradient using the Colors #7e662e to the left and right, and #fdcb1c in the middle.
Stroke

Step 4

Change the Back layer’s Fill value to 0%.

Change the Fill Value

Step 5

Double-click the Center group to apply a Gradient Overlay effect with these settings:

  • Check the Dither box
  • Blend Mode: Color Burn
  • Style: Reflected
  • Use the Silver 30 gradient fill
Gradient Overlay

This will finish styling the text.

Styled Text

10. How to Create a Simple Texture Using Filters

Step 1

Create a new layer on top of all layers, fill it with Black, name it Extrusion Texture, and convert it to a Smart Object.

Extrusion Texture

Step 2

Set the Foreground and Background Colors to Black and White, and go to Filter > Render > Fibers.

Change the Vibrance to 20 and the Strength to 5.

Render Fibers

Step 3

Go to Filter > Blur > Motion Blur, and change the Angle to 90 and the Distance to 25.

Motion Blur

Step 4

Use the Rectangular Marquee Tool to select a random small area of the texture.

Create Selection

Step 5

Press Command-J to duplicate the selected area in a new layer, and hide the Extrusion Texture layer.

Duplicate the Layer

11. How to Add the Extrusion Texture

Step 1

Move the duplicated texture layer on top of the Center group, right-click it, and choose Create Clipping Mask.

Create Clipping Mask

Step 2

Place the clipped texture on top of the letter you want to apply it to, and press the Command-T keys to transform the texture so that it matches the part you want it to cover.

Transform the Texture

Step 3

You can add a mask and use a round brush tip to remove any areas you don’t like.

Erase Unwanted Areas

Step 4

Once you’re done, change the texture layer’s Blend Mode to Soft Light.

Blend Mode

Step 5

For rounded letter parts, you can use the Warp mode to adjust the texture.

Warp the Texture

Step 6

Show the Extrusion Texture layer, select a new area, and repeat the steps to add the texture to all the letters you have.

Once you’re done, put the Center group and its texture layers in another group with the name Center + Textures.

Add and Group the Textures

12. How to Add Highlights and a Color Texture

Step 1

Create a new layer on top of all the layers inside the Center + Textures group, name it Highlights, and clip it to the Center group.

Change the Highlights layer’s Blend Mode to Linear Light, and its Opacity to 30%.

Set the Foreground Color to #b5aa98, and use a soft round brush tip to paint some highlights over the bright areas of the extrusion.

Add Highlights

Step 2

Create a new layer on top of the Front copy 2 layer, name it Stroke Highlights, and change its Blend Mode to Vivid Light.

Clip the Stroke Highlights layer to the Front copy 2 layer, and add some highlights to the stroke.

Stroke Highlights

Step 3

Place the out of the blue image on top of the Front copy layer, resize it as needed, rename its layer to Color Texture, and change its Blend Mode to Color.

Command-click the Front copy layer to create a selection.

Add the Color Texture

Step 4

Click the Add layer mask icon.

Add Layer Mask

Step 5

Put all the front layers in a group and name it Front.

Front Group

13. How to Add Texture Overlays

Step 1

Place the grunge-background8 image from the Grunge-Backgrounds pack on top of the Front group, clip it to it, change its layer’s Blend Mode to Soft Light, and resize it as needed.

Add a Grunge Texture

Step 2

Go to Image > Adjustments > Hue/Saturation, and change the Saturation value to -100.

HueSaturation

Step 3

If you like a smaller texture overlay, you can create copies to cover the whole text instead of scaling the texture up.

Scale Down

Step 4

Add the Ur gravel texture on top of the grunge-background8 layers, and go to Image > Adjustments > Levels.

Change the Input Levels Shadows’ value to 50 and the Output Levels Highlights’ value to 150.

Levels

Step 5

Clip the layer to the Front group, change its Blend Mode to Soft Light, and resize the texture to cover the first letter.

Grunge Texture Overlays

Step 6

Duplicate to add the texture to each of the remaining letters, and then put the Front group and its texture layers in another group and name it Front + Texture.

Duplicate and Group the Textures

14. How to Add a Lens Flare

Step 1

Place the Lens Flare 02 image from the 30 Awsome Lens Flare pack on top of all layers, and go to Edit > Transform > Rotate 90° Clockwise.

Add the Lens Flare

Step 2

Double-click the lens flare layer’s thumbnail to open its original file. Create a new layer under the flare’s layer and fill it with Black.

Add a Black Background

Step 3

Select both layers and press Command-E to merge them, and save and close the file.

Merge Layers

Step 4

Change the flare layer’s Blend Mode to Screen and its Opacity to 70%. Place the flare on top of one of the letters in the center of the text, and resize it as needed.

Flare Layers Settings

Step 5

Go to Image > Adjustments > Hue/Saturation, check the Colorize box, and change the Hue to 180 and the Saturation to 50.

HueSaturation

Step 6

Go to Image > Adjustments > Levels, and change the Gamma value to 0.61.

Levels

15. How to Add Water Splashes

Step 1

Create a new layer on top of the flare layer and name it Water Splash 01, and change its Fill value to 0%.

Water Splash Layer

Double-click the Water Splash 01 layer to apply the following layer style:

Step 2

Add a Bevel and Emboss with these settings:

  • Size: 3
  • Uncheck the Use Global Light box
  • Angle: -48
  • Altitude: 21
  • Gloss Contour: Ring
  • Check the Anti-aliased box
  • Highlight Mode: Linear Light
    • Opacity: 35%
  • Shadow Mode:
    • Opacity: 20%
Bevel and Emboss

Step 3

Add a Contour with these settings:

  • Contour: Ring – Double
  • Check the Anti-aliased box.
Contour

Step 4

Use the Free Water Splash Photoshop Brushes and Water Splash Brushes packs’ brush tips to add water splashes to the letter with the flare.

For better results, add each splash in a separate layer, and copy and paste the layer style to each copy.

Add Water Splash Brushes

Step 5

You can also add some splashes to the background behind the text.

Add Water Splashes to the Background

16. How to Make Global Adjustments

Step 1

Place the Concrete Rough 5 texture on top of all layers, rename its layer to Texture Overlay, and change its Blend Mode to Soft Light and its Opacity to 10%.

Add a Texture Overlay

Step 2

Add a Photo Filter adjustment layer on top of all layers, and use the default values.

Photo Filter

Step 3

Save the file as an image, open the image, and go to Image > Image Size to change the size to 1500 x 1063 px.

Image Size

Step 4

You can also use the Crop Tool to control the final size even more.

Crop the Image

Congratulations! You’re Done!

In this tutorial, we created a simple background and a text smart object layer. After that, we recorded an action to create the extrusion, and styled all parts of the text.

Then, we created and added a bunch of different texture overlays, flare, and adjustment layers to the text. Finally, we added some water splash brushes to finish off the effect.

Please feel free to leave your comments, suggestions, and outcomes below.

Final Result

Jekyll Includes are Cool

Post pobrano z: Jekyll Includes are Cool

Dave Rupert:

When cruising through the Includes documentation I noticed a relatively new feature where you can pass data into a component.

I was similarly excited learning about Macros in Nunjucks. Then:

After a couple days of writing includes like this I thought to myself „Why am I not just writing Web Components?”

Direct Link to Article — Permalink


Jekyll Includes are Cool is a post from CSS-Tricks

Designed Lines

Post pobrano z: Designed Lines

Ethan Marcotte on digital disenfranchisement and why we should design lightning fast, accessible websites:

We’re building on a web littered with too-heavy sites, on an internet that’s unevenly, unequally distributed. That’s why designing a lightweight, inexpensive digital experience is a form of kindness. And while that kindness might seem like a small thing these days, it’s a critical one. A device-agnostic, data-friendly interface helps ensure your work can reach as many people as possible, regardless of their location, income level, network quality, or device.

Direct Link to Article — Permalink


Designed Lines is a post from CSS-Tricks

Agregator najlepszych postów o designie, webdesignie, cssie i Internecie