--- title: Pattern design best practices --- Here is a list of best practices when designing patterns: ## Re-use measurements When designing patterns, re-use the measurements that are already in use as much as possible. Nobody wins when every pattern requires its own set of measurements, or names certain measurements differently. :::tip ###### See our measurements page for standard measurement names The [measurements reference page](/reference/measurements/) contains all our standard measurement names. ::: ## Re-use options The same arguments for re-using measurements are also (somewhat) true for options. While your pattern may require some very specific options, there's probably a bunch that are similar to other patterns. Re-use those names. As in, `bicepsEase` exists. So don't go creating an `upperArmEase` option. ## Re-use CSS classes While you can style your pattern however you want, try to re-use the [CSS class names](/reference/css) that are in use in our default `@freesewing/plugin-theme` plugin. Doing so will ensure consistent styling for patterns. ## Respect draft settings Apart from the pattern options that you configure for your pattern, all FreeSewing patterns have a set of [draft settings](/reference/settings) that can be tweaked by the user. While many of these will automatically be handled by FreeSewing, there are some that you will need to take into account while developing your pattern. They are: ### Complete The [`complete`](/reference/settings/complete) setting is a boolean that is either true or false. Its goal is to determine whether we should draft a _complete_ pattern which includes elements such as seam allowance lines, labels, and markings for buttons and notches, or if the pattern should include the part outlines only. It is your job when developing your pattern to ensure that the pattern checks the `complete` setting and includes or omits the appropriate elements based on the setting's value. ### Paperless The [`paperless`](/reference/settings/paperless) setting is a boolean that is either true or false. A _paperless_ pattern is a pattern that has extra dimension markings so users can trace or transfer the pattern onto fabric or paper without having the need to print it. It is your job when developing your pattern to ensure that the pattern checks the `paperless` setting and includes or omits the dimensions based on the setting's value. ### Seam allowance The [`sa`](/reference/settings/sa) setting is a number that controls the seam allowance width. Unless `sa` is zero, patterns are drafted with seam allowance lines included. It is your job when developing your pattern to ensure that the pattern checks the `sa` setting and includes or omits the seam allowance lines based on the setting's value. :::tip ##### Use a multiple of `sa` for your hem allowance Resist the temptation to use an absolute value for any seam allowance, including at the hem. Instead, always use a multiple of the `sa` value. This will help to ensure that the seam allowances will scale to appropriate values when the pattern is scaled up or down to giant or doll sizes. ::: ## Use percentage options where possible When designing patterns, you should refrain from using absolute values. That 6 cm ease you add might be fine for all scenarios you tested. But, then somebody comes around who is twice your size or who is making clothes for a doll, and things will go off the rails. Don't be tempted to add absolute values to your patterns, as they don't scale. Instead, embrace percentages as options. By using values that are percentages of measurements, the values will scale and continue to work as the measurements scale up or down. :::tip ##### Use the doll and giant tests To check how well your pattern scales, you can use the _doll_ and _giant_ tests by sampling the pattern for 3 measurements sets: 1. A set of measurements from an average person (the person) 2. A set of measurements 1/10th of an average person (the doll) 3. A set of measurements 3 times that of an average person (the giant) A well-designed pattern will scale a factor 10 down or 3 up and still hold its shape. If your pattern makes assumptions about size, these tests will show that. FreeSewing's development environment provides these tests out of the box, so you can see their results at the click of a button. ::: ## Use translation keys, not text Don't insert literal text in your patterns. Instead, insert a key that can then be translated. For example, if you want to put "_Finish with bias tape_" on your pattern, don't be tempted to do this: ```js path.seam.attr('data-text', 'Finish with bias tape') ``` That (English) string is now hard-coded in your pattern. As FreeSewing supports translation out of the box, it would be a real shame not to make use of it. Instead, insert a key to identify the string: ```js path.seam.attr('data-text', 'finishWithBiasTape') ``` This way, different strings for different languages can be associated with the key, allowing translated text to be used. You can find and browse the translations and available translation keys for each design in the design's [i18n folder on Codeberg][1]. [1]: https://codeberg.org/freesewing/freesewing/src/branch/develop/designs/aaron/i18n ## Construct paths counter-clockwise Construct your paths _counter-clockwise_ (anti-clockwise). You have to pick a direction anyway, and going counter-clockwise is a bit of a convention. This applies both to naming points (specifically the control points of curves) and the order in which you define your points. Obviously, the order in which you add points to your code needs to take a backseat to the logic of your code. But typically what you're doing is constructing an outline of (a part of) a garment. So pick a point, and make your way around counter-clockwise. When naming control points for curves, re-use the name of the point they are attached to and add `Cp1` to the control point before and `Cp2` to the control point after the point if, once again, you follow your path counter-clockwise. For example: ```js part.paths.seam = new Path() .move(points.hemCenter) .line(points.hemSide) .line(points.waistSide) .curve(points.waistSideCp2, points.armholeCp1, points.armhole) ``` :::tip ##### This convention helps with `Path.offset()` too Constructing a path counter-clockwise will also ensure that the path offset goes outwards rather than inwards. :::