NEOMO


πŸ‘†Go to GitHub by clicking the image above!πŸ‘†


What is this?
Neomorphism(neumorphism) Design Framework Open Source


Tech Stack


Organization
neomo/
β”œβ”€β”€ css/
β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”œβ”€β”€ alert.css
β”‚ β”‚ β”œβ”€β”€ badge.css
β”‚ β”‚ β”œβ”€β”€ breadcrumb.css
β”‚ β”‚ β”œβ”€β”€ button.css
β”‚ β”‚ β”œβ”€β”€ card.css
β”‚ β”‚ β”œβ”€β”€ dropdown.css
β”‚ β”‚ β”œβ”€β”€ icon.css
β”‚ β”‚ β”œβ”€β”€ modal.css
β”‚ β”‚ β”œβ”€β”€ navbar.css
β”‚ β”‚ β”œβ”€β”€ navigation.css
β”‚ β”‚ β”œβ”€β”€ pagination.css
β”‚ β”‚ β”œβ”€β”€ progressbar.css
β”‚ β”‚ β”œβ”€β”€ select.css
β”‚ β”‚ β”œβ”€β”€ spinners.css
β”‚ β”‚ β”œβ”€β”€ tab.css
β”‚ β”‚ β”œβ”€β”€ toast.css
β”‚ β”‚ └── tooltips.css
β”‚ β”œβ”€β”€ content/
β”‚ β”‚ └── table.css
β”‚ β”œβ”€β”€ forms/
β”‚ β”‚ β”œβ”€β”€ checkbox.css
β”‚ β”‚ β”œβ”€β”€ file.css
β”‚ β”‚ β”œβ”€β”€ floatinglabel.css
β”‚ β”‚ β”œβ”€β”€ input.css
β”‚ β”‚ β”œβ”€β”€ radio.css
β”‚ β”‚ β”œβ”€β”€ range.css
β”‚ β”‚ └── switches.css
β”‚ β”œβ”€β”€ helpers/
β”‚ β”‚ β”œβ”€β”€ coloredLinks.css
β”‚ β”‚ └── typography.css
β”‚ β”œβ”€β”€ layout/
β”‚ β”‚ β”œβ”€β”€ columns.css
β”‚ β”‚ └── container.css
β”‚ β”œβ”€β”€ color.css
β”‚ └── neomo.css
β”œβ”€β”€ dist/
β”‚ β”œβ”€β”€ neomo.min.css
β”‚ └── neomo.min.js
└── js/
└── neomo.js

1. button.css
  1. κ°€μš΄λ° μ •λ ¬

    justify-content: center; //κ°€λ‘œμΆ•μ„ κΈ°μ€€μœΌλ‘œ μ’Œμš°μ— λŒ€ν•œ μ •λ ¬
    align-items: center; //μ„Έλ‘œμΆ•μ„ κΈ°μ€€μœΌλ‘œ μ’Œμš°μ— λŒ€ν•œ μ •λ ¬
    


  2. box-shadow

    .button:hover {
      outline: 0;
      cursor: pointer;
      box-shadow: inset 3px 3px 5px #b8b9be, inset -3px -3px 5px #fff !important;
    }
    
    • inset 뒀에 μ˜€λŠ” 첫 번째 μš”μ†Œ: offset-x, μˆ˜ν‰ 거리λ₯Ό μ˜λ―Έν•˜λ©° 음수 값은 그림자λ₯Ό μš”μ†Œμ˜ μ™Όμͺ½μ— ν‘œμ‹œν•¨
    • inset 뒀에 μ˜€λŠ” 두 번째 μš”μ†Œ: offset-y, 수직 거리λ₯Ό μ˜λ―Έν•˜λ©° 음수 값은 그림자λ₯Ό μš”μ†Œμ˜ μœ„μͺ½μ— ν‘œμ‹œν•¨
    • inset 뒀에 μ˜€λŠ” μ„Έ 번째 μš”μ†Œ: blur-radius, 값이 클수둝 그림자 ν…Œλ‘λ¦¬κ°€ 흐렀지고 크기가 더 컀지고 색이 더 밝아짐

  3. λ²„νŠΌ 크기 μ„€μ •

    button.normal {
      width: 5rem;
      height: 2.7rem;
    }
    
    • μ ˆλŒ€μ μΈ κ°’: px
    • μƒλŒ€μ μΈ κ°’: rem, em
    • rem: 기쀀이 λ˜λŠ” 값은 μ΅œμƒμœ„ μš”μ†Œμ˜ font-size (e.g. html νƒœκ·Έ)
    • em: 기쀀이 λ˜λŠ” 값은 ν˜„μž¬ μŠ€νƒ€μΌ 지정 μš”μ†Œμ˜ font-size (e.g. div νƒœκ·Έ)

2. spinners.css
  1. animation

    .loader.point-purple {
      border-bottom: 3px solid var(--purple);
      border-radius: 50%;
      width: 1.5em;
      height: 1.5em;
      animation: spin 2s linear infinite;
    }
    @keyframes spin {
      0% {
        transform: rotate(0deg);
      }
      100% {
        transform: rotate(360deg);
      }
    }
    
    • 0% λŒ€μ‹  From μ‚¬μš© κ°€λŠ₯
    • 100% λŒ€μ‹  To μ‚¬μš© κ°€λŠ₯
    • animation-timing-function: linear -> μ• λ‹ˆλ©”μ΄μ…˜ νš¨κ³Όκ°€ μ²˜μŒλΆ€ν„° λκΉŒμ§€ μΌμ •ν•œ μ†λ„λ‘œ 진행
    • animation-iteration-count: infinite

3. tooltips.css
  1. display

    .tooltip {
      position: relative;
      display: inline-block;
    }
    
    • inline: μ „ν›„ μ€„λ°”κΏˆ 없이 ν•œ 쀄에 λ‹€λ₯Έ μ—˜λ¦¬λ¨ΌνŠΈλ“€κ³Ό λ‚˜λž€νžˆ 배치
    • block: μ „ν›„ μ€„λ°”κΏˆμ΄ λ“€μ–΄κ°€ 혼자 ν•œ 쀄 차지
    • inline-block: inline μ—˜λ¦¬λ¨ΌνŠΈμ²˜λŸΌ λ‚˜λž€νžˆ λ°°μΉ˜λ˜μ§€λ§Œ, width & height & margin & padding 속성 지정 κ°€λŠ₯

  2. position

    .tooltip {
      position: relative;
      display: inline-block;
    }
    .tooltip .tooltip-content {
      visibility: hidden;
      padding: 7px;
      width: fit-content;
      position: absolute;
      z-index: 100;
    }
    
    • static: position 속성을 λΆ€μ—¬ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ κ°€μ§€λŠ” λ””ν΄νŠΈ κ°’
    • relative: ν˜„μž¬ μœ„μΉ˜μ—μ„œ μƒλŒ€μ μΈ offset 속성을 쀄 수 있음
    • absolute: λΆ€λͺ¨ 쀑에 static이 μ•„λ‹Œ μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ μƒλŒ€μ μΈ offset 속성을 쀄 수 있음(ν˜„μž¬ μœ„μΉ˜κ°€ λ³€ν•˜λŠ” 것은 μ•„λ‹˜!)

  3. translate

    .tooltip .tooltip-content.bottom {
      transform: translateX(-50%);
      top: 115%;
      left: 50%;
    }
    
    • ν˜„μž¬ μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ 이동
    • translateX(): κ°€λ‘œλ‘œ 이동(μ–‘μˆ˜ 값은 였λ₯Έμͺ½/음수 값은 μ™Όμͺ½)
    • translateY(): μ„Έλ‘œλ‘œ 이동(μ–‘μˆ˜ 값은 μ•„λž˜μͺ½/음수 값은 μœ„μͺ½)
    • translate(X, Y): κ°€λ‘œμ„Έλ‘œ κ°’μœΌλ‘œ 이동

4. input.css
  1. > κ²°ν•©μž

    .input-group > input {
      border: none;
    }
    
    • 첫 번째 μš”μ†Œμ˜ λ°”λ‘œ μ•„λž˜ μžμ‹μΈ λ…Έλ“œλ₯Ό 선택

  2. flex

    .input-group {
      display: flex;
      width: fit-content;
      border-radius: 10px;
      box-shadow: 3px 3px 7px #ababab, -3px -3px 7px #ffffff;
    }
    
    • flex container
    • container μ•ˆμ— μžˆλŠ” μ•„μ΄ν…œλ“€μ€ κ°€λ‘œ λ°©ν–₯으둜 배치되고, μžμ‹ μ΄ 가진 λ‚΄μš©λ¬Όμ˜ width만큼만 차지
    • flex-direction은 row, column, row-reverse, column-reverseκ°€ 있음

5. switches.css
  1. + κ²°ν•©μž

    input:checked + .switch {
      background: white;
      box-shadow: inset 3px 3px 5px #b8b9be, inset -3px -3px 5px #fff;
    }
    
    • 첫 번째 μš”μ†Œμ˜ λ°”λ‘œ 뒀에 μœ„μΉ˜ν•˜λ©΄μ„œ 같은 λΆ€λͺ¨λ₯Ό κ³΅μœ ν•˜λŠ” 두 번째 선택


6. CSS Selectors
  1. μœ ν˜• μ„ νƒμž

    input {
    }
    
    • 주어진 λ…Έλ“œ 이름(input)을 가진 λͺ¨λ“  μš”μ†Œλ₯Ό 선택

  2. 클래슀 μ„ νƒμž

    .index {
    }
    
    • 주어진 클래슀 νŠΉμ„±(index)을 가진 λͺ¨λ“  μš”μ†Œλ₯Ό 선택

  3. ID μ„ νƒμž

    #toc {
    }
    
    • id νŠΉμ„±(toc)에 따라 μš”μ†Œλ₯Ό 선택
    • λ¬Έμ„œ λ‚΄μ—λŠ” 주어진 idλ₯Ό 가진 μš”μ†Œκ°€ ν•˜λ‚˜λ§Œ 쑴재