Style Sheet/Bootstrap5

๐Ÿ”ฎ BootStrap5 SCSS ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๋ฐฉ๋ฒ•

์ธํŒŒ_ 2021. 10. 15. 16:13

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

๋ถ€ํŠธ์ŠคํŠธ๋žฉ SCSS ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

๋ณ€์ˆ˜, ๋งต, ๋ฏน์Šค์ธ ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•œ ์†Œ์Šค์˜ Sass ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๊ตฌ์ถ•์„ ๊ณ ์†ํ™”ํ•˜๊ณ  ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ5๋Š” ๋ณ€์ˆ˜, ๋งต, ๋ฏน์Šค์ธ ๋“ฑ์„ ํ™œ์šฉํ•œ ์†Œ์Šค์˜ Sass ํŒŒ์ผ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

 

'Style Sheet/Sass' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก

์•ˆ๋…•ํ•˜์„ธ์š”. ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•˜๋Š” ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๋กœ์„œ ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

inpa.tistory.com


SCSS ํŒŒ์ผ ๊ตฌ์กฐ

๊ฐ€๋Šฅํ•œ ํ•œ, Bootstrap์˜ ํ•ต์‹ฌ ํŒŒ์ผ์€ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ๋งˆ์„ธ์š”.

Sass์—์„œ๋Š” Bootstrap์„ ๊ฐ€์ ธ์™€ ์ž์ฒด ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ๊ฐ„์ ‘์ ์œผ๋กœ Bootstrap์„ ์ˆ˜์ •ํ•˜๊ณ  ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ ๊ตฌ์กฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

your-project/
โ”œโ”€โ”€ scss
โ”‚   โ””โ”€โ”€ custom.scss
โ””โ”€โ”€ node_modules/
    โ””โ”€โ”€ bootstrap
        โ”œโ”€โ”€ js
        โ””โ”€โ”€ scss

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•


SCSS ํ…œํ”Œ๋ฆฟ ์ œ์ž‘ํ•˜๊ธฐ

 

[SCSS] ๐Ÿ’Ž Sass(SCSS) ๋ž€? ๐Ÿšš ์„ค์น˜ ๋ฐ ์ปดํŒŒ์ผ

Sass CSS๊ฐ€ ๋ณต์žกํ•œ ์–ธ์–ด๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ž‘์—…์ด ํฌ๊ณ  ๊ณ ๋„ํ™” ๋ ์ˆ˜๋ก ๋ถˆํŽธํ•จ์ด ์ƒ๊ธด๋‹ค. โ€‹์ด์— Sass๋Š” ๋ถˆํ•„์š”ํ•œ ์„ ํƒ์ž(Selector)์˜ ๊ณผ์šฉ๊ณผ ์—ฐ์‚ฐ ๊ธฐ๋Šฅ์˜ ํ•œ๊ณ„, ๊ตฌ๋ฌธ(Statement)์˜ ๋ถ€์žฌ ๋“ฑ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด์„œ

inpa.tistory.com

 

1. ์šฐ์„  ๊ธฐ๋ณธ์ ์ธ index.html์˜ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  package.json์˜ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ

$ npm init -yโ€‹

 

2. ์ตœ์‹  ๋ถ€์ŠคํŠธํŠธ๋žฉ๊ณผ ์•„์ด์ฝ˜์„ ๋‹ค์šด๋กœ๋“œ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

$ npm install bootstrap@next 
$ npm i bootstrap-iconsโ€‹

 

3. ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  scss / main.scss ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

 

4. ๊ทธ๋ฆฌ๊ณ  main.scss๋กœ ๊ฐ€์„œ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ๊ณ  ์ปดํŒŒ์ผ ํ•ด์ค๋‹ˆ๋‹ค.

@import "../node_modules/bootstrap/scss/bootstrap.scss";

 

์ปดํŒŒ์ผ์ด ์™„๋ฃŒ๋˜๋ฉด, ์ด๋ ‡๊ฒŒ css๊ฐ€ ๋œจ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

๋ชจ๋“  ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์˜ ๊ธฐ๋Šฅ์ด cssํŒŒ์ผ์— ์ฑ„์›Œ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” main.scss์—์„œ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ css์™€ ์‚ฌ์šฉ์ž css ๊ฐ’๋“ค์„ ์กฐ์œจํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด, ์•Œ์•„์„œ ์ตœ์ข… ๊ฒฐ๊ณผ๋กœ css๋กœ ์ปดํŒŒ์ผ์ด ๋˜์–ด ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

 

5. html์— ์ ์šฉํ•˜๊ธฐ

index.html๋กœ ๋Œ์•„๊ฐ€ ์ด๋ ‡๊ฒŒ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ฉด scss ์ž‘์—…๋‚ด์šฉ์ด ์ปดํŒŒ์ผํ™”ํ•ด์„œ css๋กœ ์ ์šฉ๋˜๋ฏ€๋กœ scss์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Game information website</title>
    <link rel="stylesheet" href="css/main.css">  <!-- ์ด๋ ‡๊ฒŒ css๊ฒฝ๋กœ๋กœ ์ˆ˜์ • -->
</head>
<body>
    <h1 class="text-primary">Bootstrap5</h1>
    <!-- _variables.scssํŒŒ์ผ์—์„œ ํ™•์ธ ํ• ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์ƒ‰์ƒ์„ ์ ์šฉ -->
</body>
</html>

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ „์šฉ ํด๋ž˜์Šค๋ฅผ ์ค˜์„œ ํ…์ŠคํŠธ์— ์ƒ‰์ƒ ์ ์šฉ์ด ๋œ๊ฑธ ํ™•์ธํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


SCSS ๋ณ€์ˆ˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

์œ„์˜ ์˜ˆ์ œ์—์„œ text-primary ์†์„ฑ๊ฐ’์„ ์คฌ๋”๋‹ˆ ํŒŒ๋ž‘์ƒ‰์œผ๋กœ ๋ณ€ํ•œ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์ผ ํŒŒ๋ž‘์ƒ‰์ด ์•„๋‹Œ ๋‹ค๋ฅธ์ƒ‰์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?

์›๋ณธ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํŒŒ์ผ์„ ๋œฏ์–ด์„œ ์ˆ˜์ •ํ•ด์•ผ ํ• ๊นŒ์š”? ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

main.scss์—์„œ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋ณ€์ˆ˜๊ฐ’์„ ์„ ์–ธํ•ด์ฃผ๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

/* import๋ณด๋‹ค ์œ„์ชฝ์— ์ •์˜ํ•ด์•ผ, ๋‚˜์ค‘์˜ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ css์˜ !default ๊ฐ€ ์ ์šฉ๋˜์–ด ๋‚˜ํƒ€๋‚œ๋‹ค.*/
$primary: #401f7c; /*๋ณด๋ผ์ƒ‰*/

@import './node_modules/bootstrap/scss/bootstrap';

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

Bootstrap์˜ ๋ชจ๋“  Sass ๋ณ€์ˆ˜์—๋Š” !default ํ”Œ๋ž˜๊ทธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, Bootstrap์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋‹น์‹ ์˜ Sass์—์„œ ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

_variables.scss ์—์„œ ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋„ค์ž„์— ์ง€์ •๋œ ์ƒ‰์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์ƒ‰์ƒ์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์œผ๋ฉด ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด (์˜ค๋ฒ„๋ผ์ดํŒ…) ์ƒ‰์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•
๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

 

์ ์šฉ ์˜ˆ์‹œ

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta http-equiv="X-UA-Compatible" content="IE=edge" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <link rel="stylesheet" href="./dist/main.css" />
      <title>Bootstrap5</title>
   </head>
   <body>
      <h1 class="text-primary">Bootstrap5</h1>
      <h1 class="text-secondary">Bootstrap5</h1>
      <h1 class="text-danger">Bootstrap5</h1>
      <button class="btn btn-primary">๋ฒ„ํŠผ</button>
   </body>
</html>
$primary: #401f7c; 
$secondary: blue;
$border-radius: 40px;

@import './node_modules/bootstrap/scss/bootstrap';

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•


SCSS ํด๋ž˜์Šค ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

๋ฐ”๋กœ ์œ„ ์˜ˆ์ œ์—์„œ, ๋ฒ„ํŠผ ํƒœ๊ทธ์— p-5๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ค˜๋ด…์‹œ๋‹ค.

p-5๋ผ๋Š” ๊ฑด padding 5์˜ ์†์„ฑ ํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค.

<button class="btn btn-primary p-5">๋ฒ„ํŠผ</button>

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

์šฐ๋ฆฌ๋Š” padding 5๋ผ๋Š” ์ •์˜๋œ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๋ฐ”๊พธ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ฆ‰ ํด๋ž˜์Šค p-5๊ฐ€ ์ •์˜๋œ scss์— ๊ฐ€์„œ ์ด ์—ญ์‹œ, ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

utilities.scss์— ๊ฐ€๋ณด๋ฉด,

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•
๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

๋‹ค์–‘ํ•œ ์†์„ฑ๋“ค์ด map์ž๋ฃŒํ˜•์œผ๋กœ ์ •์˜ ๋˜์–ด์žˆ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ค‘์—์„œ padding์„ ์ฐพ์•„๋ด…์‹œ๋‹ค.

 /* Padding utilities */
"padding": (
      responsive: true, /* ๋ฐ˜์‘ํ˜• ์ค‘๋‹จ์  ์‚ฌ์šฉ ์—ฌ๋ถ€ */
      property: padding, /* padding์†์„ฑ์„ ์ด์šฉ */
      class: p, /* ํ‚ค์›Œ๋“œ๋Š” p๋ผ ์ •์˜ */
      values: $spacers /* p์˜ ๊ฐ’์œผ๋กœ๋Š” $spacers ๋ผ๋Š” ๋งต๋ณ€์ˆ˜๋ฅผ ์ด์šฉ */
),

$spacer๋ณ€์ˆ˜์—๋Š” 0~5๊นŒ์ง€ 1rem์˜ ๋ฐฐ์ˆ˜๋กœ ์„ค์ •๋˜์–ด์žˆ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

 

์ด ์ •์˜๋œ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ ํ•ด๋ด…์‹œ๋‹ค.

$utilities: () !default; /* ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ดˆ๊ธฐํ™” */
$utilities: map-merge(
   (
      'button-padding': ( /* ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ ์ •์˜ */ 
			responsive: true,
         property: padding,
         class: bp, /* ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ช…์„ ์ •์˜ */
         values: /* $spacers๋Œ€์‹ ์— ์ƒˆ๋กœ์šด ๋งต์œผ๋กœ ์ •์˜  */
            (
               0: 0,
               1: 0.2rem,
               2: 0.4rem,
               3: 0.6rem,
               4: 0.8rem,
               5: 1,
            ),
      ),
   ),
   $utilities /* ๊ธฐ์กด ์œ ํ‹ธ๋ฆฌํ‹ฐ์™€ merge */
);

@import './node_modules/bootstrap/scss/bootstrap';

์ •์˜๋ฅผ ํ–ˆ์œผ๋ฉด, ์ด์ œ buttonํƒœ๊ทธ์— ๊ฐ€์„œ ํด๋ž˜์Šค bp-5๋ฅผ ์ค˜ ๋ด…์‹œ๋‹ค.

<button class="btn btn-primary bp-5">๋ฒ„ํŠผ</button>

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•

์ •์ƒ์ ์œผ๋กœ ์ ์šฉ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ƒˆ๋กญ๊ฒŒ  _utilities.scss๋ฅผ ๋งŒ๋“ค๊ณ  ์œ„ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค์‹œ๋‹ค.

๊ทธ๋ฆฌ๊ณ   main.scss์—์„œ ๊ธฐ์กด ์ž„ํฌํŠธ ์œ„์— _utilities.scss๋ฅผ ์ž„ํฌํŠธ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์™œ ์ด๋ ‡๊ฒŒ ํ•˜๋ƒ๋ฉด์€, bootstrap.scss์—์„œ๋Š” ๋ณ€์ˆ˜๋“ค์ด !default์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งŒ์ผ ๊ฐ™์€ ๋ณ€์ˆ˜๋ช…์ด ์ด๋ณด๋‹ค ์•ž์— ์žˆ์„๊ฒฝ์šฐ, ๊ทธ ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ์ •์˜์— ๋”ฐ๋ผ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋งŒ์ผ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์™„์ „ํžˆ ๋ฎ์–ด๋ฒ„๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด, bootstrap.scss ๋‹ค์Œ์— ์ •์˜ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•


$utilities ํด๋ž˜์Šค ๋งต ์†์„ฑ ์ •๋ฆฌํ‘œ

์˜ต์…˜ ํ˜•์‹ ์„ค๋ช…
property Required ์ ์šฉ๋  css ํ”„๋กœํผํ‹ฐ ์ง€์ •.
values Required -์†์„ฑ๊ฐ’์„ ๋ชจ์€ map๋ฆฌ์ŠคํŠธ ์ง€์ •.
class Optional ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํด๋ž˜์Šค๋ช… ์„ ์ง€์ •
state Optional :hover, :focus ๊ฐ™์€ ๊ฐ€์ƒ ํด๋ž˜์Šค ์ง€์ •

์ปดํŒŒ์ผํ•˜๋ฉด, .opacity-hover:hover๊ฐ€ ๋œ๋‹ค.
responsive Optional ๋ฐ˜์‘ํ˜• ์ค‘๋‹จ์  ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ์—ฌ๋ถ€

.opacity-md-25
rfs Optional Boolean to enable fluid rescaling. Have a look at the RFS page to find out how this works. false by default.
print Optional print ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ** ๋˜ํ•œ ** ์ธ์‡„์šฉ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ,
์ด๋Š” 
@media print {...} ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๋‚ด์—์„œ๋งŒ ์ ์šฉ
rtl Optional Boolean indicating if utility should be kept in RTL. true by default.

# Reference

https://velog.io/@dragoocho/%EB%B6%80%ED%8A%B8%EC%8A%A4%ED%8A%B8%EB%9E%A95-%ED%85%9C%ED%94%8C%EB%A6%BF-%EA%B5%AC%EC%B6%95

https://getbootstrap.kr/docs/5.0/customize/sass/