<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Radouane Khiri</title>
    <description>The latest articles on DEV Community by Radouane Khiri (@redvanisation).</description>
    <link>https://dev.to/redvanisation</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F205622%2Fcd545bbd-3073-442b-ae35-474400a0ff31.jpg</url>
      <title>DEV Community: Radouane Khiri</title>
      <link>https://dev.to/redvanisation</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/redvanisation"/>
    <language>en</language>
    <item>
      <title>Test-Driven Development with RSpec in Rails</title>
      <dc:creator>Radouane Khiri</dc:creator>
      <pubDate>Tue, 19 Nov 2019 03:35:06 +0000</pubDate>
      <link>https://dev.to/redvanisation/test-driven-development-with-rspec-in-rails-4ek8</link>
      <guid>https://dev.to/redvanisation/test-driven-development-with-rspec-in-rails-4ek8</guid>
      <description>&lt;p&gt;When we start developing an app we usually do it the old fashion way: we get an idea, we elaborate on it, we make a plan to develop an app then we start coding and in the end, we test if our app is working properly.&lt;/p&gt;

&lt;p&gt;Nothing is wrong with that approach but, there are some features that we can not test with it and sometimes it will be very hard and time-consuming to debug the code and find the errors we have, sometimes also we end up writing more code than needed.&lt;/p&gt;

&lt;p&gt;Therefore, the test-driven development or TDD came out to the surface which is a software development process that works as follows: Thinking about the idea, designing and developing tests for every small functionality of the app and expecting the desired result (tests will be failing), then write code to make the tests work, and finally refactor the code to be more readable and maintainable and repeat.&lt;/p&gt;

&lt;h2&gt;
  
  
  The TDD workflow (Red / Green / Refactor cycle):
&lt;/h2&gt;

&lt;p&gt;The process described above is called the “Red, Green, Refactor cycle” and it works as follows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Red:&lt;/strong&gt; Analyze the problem then write the test (which will fail because we do not have the code to make it work yet).&lt;br&gt;
&lt;strong&gt;2. Green:&lt;/strong&gt; Write just enough code to make the test pass.&lt;br&gt;
&lt;strong&gt;3. Refactor:&lt;/strong&gt; Improve the code design and always refactor in green.&lt;/p&gt;

&lt;h2&gt;
  
  
  TDD structure (the AAA):
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The AAA stands for “Arrange, Act and Assert”:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Arrange:&lt;/strong&gt; It consists of the preparations to start testing like initializing or instantiating objects, setting up mocks and stubs, defining let variables using factories …etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Act:&lt;/strong&gt; To predict the behavior expected from the tested object while it is in use, for example, to visit a page then click a button or to build a post then try to save it calling the appropriate methods and execute the behavior we want to test.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Assert:&lt;/strong&gt; To expect the actions and methods used in the “Act” phase to produce the desired results and compare the two.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing with RSpec:
&lt;/h2&gt;

&lt;p&gt;RSpec is a testing tool written in Ruby and used to test it. It is the most frequently used testing library for Ruby in production applications, it is widely used to test Ruby on Rails apps using the TDD approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  RSpec basics:
&lt;/h3&gt;

&lt;p&gt;Some important RSpec basics to jump-start into using it, it works with the AAA structure that I previously explained:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the variable or instantiate the object.&lt;/li&gt;
&lt;li&gt;Use the desired methods on it.&lt;/li&gt;
&lt;li&gt;Expect it to equal something that you set.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0gLJnEpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/xry8qy88e63a6ha9j3tx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0gLJnEpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/xry8qy88e63a6ha9j3tx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  To avoid repetition:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;You can use a Before method with a &lt;code&gt;do…it&lt;/code&gt; block, and instantiate the object inside it with a &lt;code&gt;@&lt;/code&gt; before its name and use it that way everywhere in the test.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="vi"&gt;@variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Classname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;You can also use let with a symbol to name the variable and instantiate the object inside its block (let is lazy and it will cache the variable in the first use and use it from the cache if we use it again).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:variable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Classname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Using RSpec and Capybara in Rails
&lt;/h3&gt;

&lt;p&gt;In Ruby on Rails, there are many testing frameworks like the default one that comes with the new Rails projects &lt;strong&gt;Minitest&lt;/strong&gt; or the ones that I’m writing about in this article &lt;strong&gt;RSpec&lt;/strong&gt; and &lt;strong&gt;Capybara&lt;/strong&gt; which I will explain a how to set them up in a new Rails project and show some basic uses of the two.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up RSpec and Capybara on rails:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Initialize a new rails app without the default &lt;strong&gt;minitest&lt;/strong&gt; run the following command: &lt;code&gt;$ rails new -T &amp;lt;name of the app&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add the following gems to the development group in the Gemfile: &lt;code&gt;‘Rspec-rails’, ‘factory_bot_rails’, ‘spring-commands-rspec’&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add a new group named test and put the following gem inside it: &lt;code&gt;‘Capybara’&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;$ bundle install&lt;/code&gt; to install the gems.&lt;/li&gt;
&lt;li&gt;In the terminal and after &lt;code&gt;cding&lt;/code&gt; to the new app run: &lt;code&gt;$ rails g rspec:install&lt;/code&gt; to install &lt;strong&gt;RSpec&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Then run &lt;code&gt;$ bundle exec spring binstub —- all&lt;/code&gt; to generate &lt;strong&gt;binstub&lt;/strong&gt; for all the files.&lt;/li&gt;
&lt;li&gt;Create the first test file ending with &lt;code&gt;_spec.rb&lt;/code&gt; at the end and &lt;code&gt;require “rails_helper”&lt;/code&gt; in the first line of every &lt;strong&gt;spec file&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Optional:
&lt;/h3&gt;

&lt;p&gt;These two steps may be helpful in some cases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;strong&gt;.rspec&lt;/strong&gt; file in your project and add: &lt;code&gt;— color&lt;/code&gt; to enable colored previews.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;— format&lt;/code&gt; documentation to the same file to get more details when you run the tests.&lt;/li&gt;
&lt;li&gt;To run the &lt;strong&gt;RSpec&lt;/strong&gt; just run the command: &lt;code&gt;$ rspec&lt;/code&gt; in the terminal and you will see something similar to the below image:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--swR-WXx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/s71cq6n2xdd5mni57gd9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--swR-WXx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/s71cq6n2xdd5mni57gd9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing basics:
&lt;/h3&gt;

&lt;p&gt;To write a simple test we have to follow the below steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make a &lt;code&gt;_spec.rb&lt;/code&gt; file for the unit or the feature to be tested or open the one generated automatically by Rails if that’s the case.&lt;/li&gt;
&lt;li&gt;You start with a &lt;code&gt;describe&lt;/code&gt; block that can take a string or a Class.&lt;/li&gt;
&lt;li&gt;You can indent many &lt;code&gt;describe&lt;/code&gt; blocks together but the better practice is to use &lt;code&gt;context&lt;/code&gt; instead for the inner blocks.&lt;/li&gt;
&lt;li&gt;To test the different methods and functionalities of a class use the &lt;code&gt;it&lt;/code&gt; block that takes a string as a description.&lt;/li&gt;
&lt;li&gt;Write your tests inside the &lt;code&gt;it&lt;/code&gt; block.&lt;/li&gt;
&lt;li&gt;Run the command &lt;code&gt;$ bundle exec rspec &amp;lt;file name&amp;gt;&lt;/code&gt; to only test the wanted file, or you can omit the name to run the whole test suite.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Test types in rails:
&lt;/h3&gt;

&lt;p&gt;There are 3 different kinds of tests in Rails&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Unit tests:&lt;/strong&gt; Testing Models or different units and parts of the app to make sure they work properly, E.g: Testing for the presence and validations of a model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Integration test:&lt;/strong&gt; Test that units or features communicate properly together and produce the expected results. E.g: Testing the user’s sign up functionality and checking if it saves a new record to the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Acceptance tests:&lt;/strong&gt; To test the whole application and the user interface UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using RSpec and Capybara in rails:
&lt;/h2&gt;

&lt;h4&gt;
  
  
  1. RSpec (Unit and controller tests):
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Usually, it is used for &lt;strong&gt;unit tests&lt;/strong&gt;, checking if the validation is properly working, if the associations are properly set in both the correct and incorrect cases.&lt;/li&gt;
&lt;li&gt;It is also used to test controllers, checking if all the different actions are properly working and doing what they were created to do, giving the expected results, but I prefer skipping the controllers’ tests and just do it in the integrations since it will check kind of the same thing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Capybara (integration / feature tests):
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Usually, it is used for integration tests that make use of a form, we use &lt;strong&gt;Capybara&lt;/strong&gt; which has a slightly different syntax, in &lt;strong&gt;Capybara&lt;/strong&gt; &lt;code&gt;describe&lt;/code&gt; becomes &lt;code&gt;feature&lt;/code&gt; and &lt;code&gt;it&lt;/code&gt; becomes &lt;code&gt;scenario&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;With &lt;strong&gt;Capybara&lt;/strong&gt; we can make use of the forms easily just filling in the fields with the desired information and expecting the correct or the wrong result as in the below image:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HcAdfz99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qq6u93b54f98ufxodnvy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HcAdfz99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qq6u93b54f98ufxodnvy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Developing a good app requires good maintainable, bug-free code, something that is hard and takes a long time to achieve using the standard development workflow if it is a big app, but implementing the &lt;strong&gt;TDD&lt;/strong&gt; workflow and using tests with &lt;strong&gt;RSpec&lt;/strong&gt; or &lt;strong&gt;Minitest&lt;/strong&gt; make our life much easier, saves up time debugging and makes the code more professional, maintainable and human-readable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources for more about TDD and RSpec
&lt;/h3&gt;

&lt;p&gt;The following websites are great if you’d like to learn more about &lt;strong&gt;RSpec&lt;/strong&gt; and testing in Ruby on Rails:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.tutorialspoint.com/rspec/index.htm"&gt;https://www.tutorialspoint.com/rspec/index.htm&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.betterspecs.org"&gt;http://www.betterspecs.org&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.oreilly.com/library/view/test-driven-development/0321146530"&gt;https://www.oreilly.com/library/view/test-driven-development/0321146530&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;PS:&lt;/strong&gt; Thank you for reading and if you liked my article I would appreciate it if you follow me &lt;strong&gt;here&lt;/strong&gt; and on &lt;strong&gt;&lt;a href="https://twitter.com/redvanisation"&gt;twitter&lt;/a&gt;&lt;/strong&gt; to you get notified about any new articles I post in the future.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rails</category>
      <category>testing</category>
      <category>rspec</category>
      <category>ruby</category>
    </item>
    <item>
      <title>How to Use CSS clip-path Property to Make Amazing Websites</title>
      <dc:creator>Radouane Khiri</dc:creator>
      <pubDate>Fri, 02 Aug 2019 09:34:41 +0000</pubDate>
      <link>https://dev.to/redvanisation/how-to-use-css-clip-path-property-to-make-amazing-websites-3of</link>
      <guid>https://dev.to/redvanisation/how-to-use-css-clip-path-property-to-make-amazing-websites-3of</guid>
      <description>&lt;p&gt;Most web pages on the internet have every or most elements styled as boxes in a square, or in a rectangular shape with sharp 90º corners, or rounded a bit with the CSS border-radius property. This will not help to make your web design stand out from the crowd! It will be looking very ordinary even if you use some sorts of gradients and different color palettes.&lt;/p&gt;

&lt;p&gt;Real-world shapes differ from circles to triangles and polygons, something that would look great if we could implement on our web page design. The good news is that’s totally possible in CSS3! let me introduce you the CSS clip-path property which I consider a real game-changer in modern web design. This property helps you style your elements in custom shapes that you can control and adjust upon your need and even add some cool animations to them and make your page look great without even using JavaScript.&lt;/p&gt;

&lt;p&gt;So what is clip-path property and what does it do?&lt;br&gt;
Clip-path is a new CSS property that allows you to specify a specific region of an element to display instead of showing the complete element, or in other words, it is a CSS3 property that allows you to hide some parts of the element giving you the possibility to shape it however you want! cool right? let’s see how we can use it:&lt;br&gt;
Clip-path accepts four main values in general: polygon(), circle(), ellipse() and inset() each one of these four values is used for a different purpose:&lt;/p&gt;

&lt;p&gt;Polygon(): clip-path: polygon(5% 25%, 100% 0%, 100% 75%, 5% 100%); the first value we will see is the polygon which will take usually four pairs representing the X, Y axes starting from the top left corner, to the top right one, then bottom right and the bottom left corner last. Like in the above example: the first 5% represents the X-axis and the 25% after it represents the Y-axis for the first corner (top left) and so on like explained above.&lt;/p&gt;

&lt;p&gt;Circle(): clip-path: circle(80px at 50% 50%); The first value here is the circle’s size (or axis) the second two values after the at keyword are the X, Y axes from the top left corner of its container and its CSS positioning (static, relative or absolute…) in our case the circle is in the center of its container.&lt;/p&gt;

&lt;p&gt;Ellipse(): clip-path: ellipse(180px 80px at 50% 50%); Its values are the same as the circle, the only difference though is that it takes two values before the at keyword representing its width and height respectively.&lt;/p&gt;

&lt;p&gt;Inset(): clip-path: inset(10% 10% 10% 10%); It is one of my favorite values, what it does exactly is to hide or clip the element in a rectangular shape depending on the values you give it, it starts also from the top left corner going clockwise until the bottom left one. A common use for it is to hide parts of images making only a specific area visible. It is also very useful when we want to make some cool animations mixing it with the transition property and the :hover selector.&lt;br&gt;
The following is a quick demonstration of that:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fCwCq2R4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/3su6fgn7yekga8cnqyel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fCwCq2R4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/3su6fgn7yekga8cnqyel.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
We start by making a quick HTML5 document linking it to a CSS file and creating a container with four elements inside it&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uD8_A6ph--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/f0na3r6wlr68lzv0bg1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uD8_A6ph--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/f0na3r6wlr68lzv0bg1f.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
Then we give the elements different colors and shapes using the clip-path property&lt;/p&gt;

&lt;p&gt;In the last element’s CSS rule (clip4) I clipped all the sides by 10% to make the element look smaller then I reverted that on hover giving it its original size when the mouse is over it, adding a smooth transition effect just to show an example of how to mix these properties and get a nice animation out of them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xD8p0vTj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/h1xv83snwmvbc85tqxgx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xD8p0vTj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/h1xv83snwmvbc85tqxgx.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
The result of the above code in the browser&lt;/p&gt;

&lt;p&gt;Real World Websites Using clip-path:&lt;br&gt;
Some websites are using this cool new property which made the design stand out from the standardly generated pages, it is easy to use and does not require any fancy software to premake it like SVG backgrounds for example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.redvanisation.com/"&gt;https://www.redvanisation.com/&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.widehive.com/artists"&gt;http://www.widehive.com/artists&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first website is my personal portfolio where I implemented the clip-path property in some parts on it like the hero section to achieve an appealing design.&lt;/p&gt;

&lt;p&gt;The second is a music website where they made the artists pictures have different shapes to make them stand out of the rest of the content which gave a very beautiful result.&lt;/p&gt;

&lt;p&gt;Browser Support:&lt;br&gt;
Although this property is very cool, it is not supported by all browsers. By the time this article was written the only browser supporting it 100% is Firefox 54 and up for computer and Firefox 67 and up for Android mobiles. Other major browsers like Chrome and Safari have partial support for it, therefore you might want to use the suffix -webkit- when working with this property just to avoid the headache.&lt;br&gt;
You can check this link for more details about browser support: &lt;a href="https://caniuse.com/#search=clip-path"&gt;https://caniuse.com/#search=clip-path&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conclusion:&lt;br&gt;
The clip-path property is one of my favorites in CSS3 and it can be used to achieve some very nice animation effects and cool shapes. I used it a lot on my personal website and on some other websites that I made and I think the design was very appealing. However, this property has to be used with caution and always have the -webkit- prefix with it since it is not fully supported by all major browsers.&lt;/p&gt;

&lt;p&gt;PS: Thank you for reading and if you liked my article I would appreciate it if you follow me on here and on twitter (&lt;a href="https://twitter.com/redvanisation"&gt;https://twitter.com/redvanisation&lt;/a&gt;) so you get notified about any new articles I post in the future.&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>webdev</category>
      <category>webdesign</category>
    </item>
  </channel>
</rss>
