윤민석

윤민석님의 아티클

윤민석

윤민석

Mincho Variants 기능 릴리즈!!

PMC S24를 위해 Variants 기능을 릴리즈 하였습니다.

Vanilla Extract에서는 Recipe라고 알려진 기능으로,

저희 릴리즈 버전에서는 몇가지 기능이 추가되었는데요

1. Flatten Base Style

원래는 base 키에서만 기본 스타일을 지정할 사용할 수 있었지만,

const button = rules({
  base: {
    color: "black",
    backgroundColor: "white",
    borderRadius: 6
  }
});

Stitches처럼 바로 스타일을 작성가능하도록 했습니다.

const button = rules({
  color: "black",
  backgroundColor: "white",
  borderRadius: 6,
});

2. Toggle Variants

기존에는 toggle 해야하는 스타일은 `true`라는 variants로 설정하도록 되어있었는데요,

const button = rules({
  variants: {
    rounded: {
      true: { borderRadius: 999 }
    }
  }
});

저희는 toggles라는 필드를 넣어 간편히 토글 variants를 설정할 수 있도록 하였습니다.

const button = rules({
  toggles: {
    rounded: { borderRadius: 999 }
  }
});

3. 배열값을 허용하는 타입추론 및 사용법

기존에는 toggle 때와 마찬가지로 true를 사용했어야 했지만,

const button = rules({
  variants: {
    rounded: {
      true: { borderRadius: 999 }
    }
    outlined: {
      true: { border: "1px solid black" }
    },
    size: {
      small: { padding: 12 },
      medium: { padding: 16 },
      large: { padding: 24 }
    }
  },

  defaultVariants: {
    rounded: true,
    outlined: true
  }
  compoundVariants: [
    {
      variants: {
        outlined: true,
        size: "small",
      },
      style: {
        fontSize: "16px"
      }
    }
  ]
});

배열을 사용할 경우 자동적으로 true로 사용하도록 만들고 타입추론까지 되도록 하였습니다.

const button = rules({
  variants: {
    rounded: {
      true: { borderRadius: 999 }
    }
    outlined: {
      true: { border: "1px solid black" }
    },
    size: {
      small: { padding: 12 },
      medium: { padding: 16 },
      large: { padding: 24 }
    }
  },

  defaultVariants: ["rounded", "outlined"],
  compoundVariants: [
    {
      variants: ["outlined", { size: "small" }],
      style: {
        fontSize: "16px"
      }
    }
  ]
});

button을 사용할때도 마찬가지로 배열을 허용하고 자동변환됩니다.

const myButton = button(["outlined", "rounded"]);

4. CSS()와의 연동

일반 스타일링을 담당하는 css()에 그대로 넣으면, 기본 Variants를 사용하도록하여 편의성을 높혔습니다.

const base = css({ color: red });
const myRule = rules({
  background: blue,
  props: ["padding"],
  toggles: {
    rounded: { borderRadius: 999 }
  }
});

const myCss = css([base, myRules]); // Same as [base, myRules()]

아직 목표했던 모든 기능을 릴리즈하지는 못했지만, 다양한 편의기능이 들어갔어요.

그럼 11월 공개SW 대회를 목표로 계속 열심히 해보도록 하겠습니다!!

Mincho

디자인시스템을 위한 CSS in JS 프레임워크

3
2
윤민석

윤민석

49만뷰, 절반의 성공 절반의 실패

이전글에서 글을 쓰고 있었다고 했었는데요,

dev.to에 공개했습니다!!

절반의 성공

절반의 성공은 예상외로 트위터에서 흥했다는 점이에요.

image.png

dev.to 블로그에서도 흥해서 매니저들이 뽑은 Top7 글이자,

image.png

금주 최고의 CSS 글로 표시되는 명예를 얻었어요.

image.png

제가 원래 트위터나 dev.to는 사용하지 않고, GitHub와 HackerNews위주로 홍보했던 방침을 바꾼 결과에요.

깃허브 스타도 35개가 되었죠.

image.png

절반의 실패

새로운 마케팅 방법을 시도한 것은 좋았지만,
기존 방법은 실패해버리고 말았어요.

앞서 말씀드린 HackerNews는 디자인이 투박하지만, OpenAI의 샘 알트먼이 사장으로 있었을 만큼 VC 투자로서도 유명한 사이트입니다.

순위권 안에 들면 자동으로 레딧, 페이스북, 트위터등으로 퍼지는등 강력한 영향력을 가지고 있죠.

그런데 제 글이 DEAD표시가 되어 알아보니, Dev.to의 글들은 전반적인 품질이 낮아 광역 스팸 필터..가 걸려있다고 하더라고요.

이미지이미지

트위터, 디스코드등에 홍보하여 모든 트래픽이 HN에 집중적으로 모이도록 해서, 다시 퍼지게 하려는 계획이었는데 플랫폼을 잘못 고르는 바람에 실패해버리고 말았네요. ㅠㅠ

그래서 다음에는 Medium을 활용해볼까 생각중입니다.

다음에는 더 잘 할 수 있을거라 믿으며..

이 글이 재미있었거나, 도움이 조금이라도 되었다면 스타를..!!ㅠㅠ

Mincho

디자인시스템을 위한 CSS in JS 프레임워크

5
0
윤민석

윤민석

17:1 경쟁률 패스!! 팀원 모집합니다.

저희가 만들고 있는 프로젝트, Mincho가 공개SW 개발자대회 1차를 패스했습니다.

접수번호상 약 700명 가까이 지원하는 대규모 대회라 좋은 소식이 아닐 수가 없습니다.

spill_800x800_ec3c23059570f1f3ca60c74775b6b18538f9a1ad2.png

(그 와중에 발견하기 쉬운 우리팀..ㅋㅋ) Designed by Freepik

저희는 현재 저와 정준님으로 구성된 작은 팀입니다.

저희는 현재 CSS-in-JS 라이브러리인 'mincho'를 개발 중에 있습니다. 이 라이브러리는 기존 CSS-in-JS 솔루션들의 장점을 취하면서도, 더 나은 개발자 경험과 성능을 제공해 디자인 시스템에 통합하는 것을 목표로 하고 있습니다.

읽어보시면 아시겠지만 전반적으로 프로젝트 볼륨이 크다보니 개발자가 1~2분 더 계시면 좋지 않을까 싶더라고요.
이 와중에 PMC 2024에서 팀매칭을 지원해주신다!! 하길래 지원을 하게되었습니다.

저희의 주된 목적은 오픈 소스 커뮤니티에 기여하고, 개발자들에게 유용한 도구를 제공하는 것입니다. 물론 이 과정에서 우리의 기술적 역량을 키우고, 새로운 도전을 즐기는 것도 중요한 동기가 되고 있습니다.

공모전도 일종의 동기부여 중 일부입니다.

저희가 찾는 분은:

  • TypeScript랑 친한 사이인 분 (아주 깊은 사이까지는 아니어도 돼요 😉)

  • CSS를 보면 "아, 이거 알아!"하는 정도

  • Git으로 협업해본 경험이 있는 분

관심 있으신 분들은 커피챗 기능으로 부담 없이 연락주세요.

커피 한 잔 하면서 이야기 나눠봐요! (부담스러우시면 메일/디코도 괜찮습니다)

PS: CSS 때문에 머리 아프셨던 분들, 우리랑 함께 그 고통을 없애봐요!

Mincho

디자인시스템을 위한 CSS in JS 프레임워크

1
0
윤민석

윤민석

Mincho 프로젝트의 이번주 #6 - 작가님..9800자 쪽지보냈습니다!!

이전 글에서 문서화 작업을 하고 있다고 말씀드리고 소식이 잠시 끊겼었습니다.

이제 배포를 하기위해 문서화 작업들을 주로 하고 있어요.

  • README 파일들을 작성

  • dev.to 같은 외국 블로그에 소개하기 위한 글

  • Vanilla Extract의 커뮤니티에 소개하기 위한 글

그도 그럴만한게 저는 다른 프로젝트를 보아도 문서화에 공을 엄청나게 들이는 편입니다.

이번 프로젝트도 마찬가지입니다.

근데 제가 봐도 양과 들어간 지식의 양이 엄청나게 넓고 디테일해요...

image.png

아무래도 디자인, CSS, 각종 웹환경과 방법론, 구현체등등 글에서 다루어야 하는 내용 자체가 많다보니 제가 봐도 어색하고 퇴고가 반드시 필요하다 느꼈습니다.

그래서 다양한 곳을 통해 베타리딩을 실행하고, 피드백을 받았는데요.

EasyLogic Studio나 Flitter의 개발자님들처럼 프론트에 대한 많은 고민을 하시던 분들이 많으셔서 유용했습니다.

그리고 그 중에는 정말 감동적인 리뷰(9800자 쪽지)도 있었습니다.

제가 부족하다 느끼는 부분들을 하나하나 다 훑어주시는 엄청난 글 구성 능력자..!

image.png

사실 양이 너무 많아서 저도 대부분의 리뷰가 옳다고 느끼면서도 반영을 하지는 못했는데요.

발표자료에 쓸때도 유용한 피드백이라 레퍼런스로 계속 써도 좋겠다는 생각이 들었습니다.

이렇게 적극적인 독자분을 만날 수 있는건 행운인 것 같네요.

흠흠.. 저도 디콰 여러분에게 사소한팁을 하나 풀어보겠습니다!!

LLM을 이용해 글을 평가하고 싶을때 이렇게 해보세요.

다음 글을 읽고, 박평식처럼 평론을 해줘.

Screenshot 2024-09-01 at 01-59-09 Phind - ## 1. What is CSS in JS CSS in JS is a technique that allows you to write CSS styles directly within your JavaScript(or TypeScript) code. Instead of creating separate CSS files you can define styles along[...].png

박평식님이 별 7개라면..나름 괜찮죠??

혹시 뼈가 뿌러지고 싶을정도로 솔직한 답변을 받고 싶다면?

"신랄하게"를 넣어보십시오.

다음 글을 읽고, 박평식 스타일로 신랄하게 평론을 해줘.

저는 괜히 해봤다가 가루가 되버려서 올리지 않겠습니다 =3=3

그럼 다음주는 디콰 줌 미팅을 주제로 만나요.

- 끝 -

Mincho

디자인시스템을 위한 CSS in JS 프레임워크

2
0
윤민석

윤민석

Mincho 프로젝트의 이번주 #5 - 기본 기능 완성!!

소개글

주간레터

  1. Mincho 프로젝트의 이번주 #1 - 팀 빌딩하는 방법

  2. Mincho 프로젝트의 이번주 #2 - RFC-TDD 프로세스로 개발하기

  3. Mincho 프로젝트의 이번주 #3 - 깃허브 봇들과 함께해요

  4. Mincho 프로젝트의 이번주 #4 - JSON 콘솔 디버깅 라이브러리 배포

  5. Mincho 프로젝트의 이번주 #5 - 기본 기능 완성!! (현재)

저번주의 주간레터는 한번 건너 뛰었는데요,

제가 여행갔다 오느라 작업을 거의 못해서 입니다.

그래도 이번주에는 다행히 배포를 위한 모든 기능을 구현했습니다.

마지막으로 구현한 기능이 생각보다 어려웠네요.

Variant Reference 라는 기능인데요, %Variant이름 을 자리표시자로 두고 참조할 수 있게 만들어 줍니다.

export const myCss = cssVariant({
  primary: {
    color: "red",
    ":has(%secondary)": {
      color: "blue",
    }
  },
  secondary: {
    color: "black",
    "%primary &":{
      color: "white"
    }
  }
});

확실히 전처리기에서 있을범직한 기능이죠.

export const myCss = styleVariant({
  primary: {
    color: "red",
  },
  secondary: {
    color: "black",
  }
});
globalCSS(`${myCss["primary"]}:has(${myCss["secondary"]})`, {
  color: "blue"
});
globalCSS(`${myCss["primary"]} ${myCss["secondary"]}`, {
  color: "white"
});

이제 배포를 하기위해 문서화 작업들을 주로 하고 있어요.

  • README 파일들을 작성

  • dev.to 같은 외국 블로그에 소개하기 위한 글

  • Vanilla Extract의 커뮤니티에 소개하기 위한 글

image.png아무래도 트래픽은 한번에 몰리는 특징이 있다보니, 여러가지 준비가 필요한 것 같아요.

이외에 개발은 changesets를 이용한 Monorepo 자동 버저닝/CHANGLOG 생성과 CommonJS, ESM에서 테스트 검증이 있겠네요.

아 참, 새로운 RFC도 병렬적으로 이루지고 있어요.
새로운 RFC는 흔히 Variants(혹은 recipe)라고 불리는 것으로서 다이나믹한 Props을 다루거나 BEM을 쉽게 구현할 수 있도록 도와주는 역할이에요.

자세한건 다음에 쓸 소개글에 더 적어보도록 하겠습니다.

생각보다 일정잡는게 빡세네요.

Mincho

디자인시스템을 위한 CSS in JS 프레임워크

5
2
윤민석

윤민석

Mincho 프로젝트의 이번주 #4 - JSON 콘솔 디버깅 라이브러리 배포

소개글

주간레터

  1. Mincho 프로젝트의 이번주 #1 - 팀 빌딩하는 방법

  2. Mincho 프로젝트의 이번주 #2 - RFC-TDD 프로세스로 개발하기

  3. Mincho 프로젝트의 이번주 #3 - 깃허브 봇들과 함께해요

  4. Mincho 프로젝트의 이번주 #4 - JSON 콘솔 디버깅 라이브러리 배포 (현재)

이번주는 개발 팁이라기보다는 배포 경험입니다.

드디어 팀원분의 시간이 생겼기 때문에 함께 작업을 할 수 있었어요.

먼저 라이브러리에 대해 간략하게 소개하면, 디버깅에 최적화된 출력을 해주는 패키지에요.

설치 방법은 다음과 같습니다.

npm install -D @mincho-js/debug-log

# 또는
yarn add -D @mincho-js/debug-log

debug-log를 만들게된 이유

2번째주 뉴스레터에서 소개했듯, 이미 debugger를 구축하여 사용하고 있지만,

저희는 복잡한 CSS 관련 변환 객체들을 다루고, 재귀적인 호출등이 있다보니 어려움이 있었습니다.

디버거의 브레이킹 포인트는 포착하고 싶은 컨텍스트 근처에서 변화를 살펴볼때 도움이 되었지만,

화면 자체가 이동하기 때문에 단순히 로그만 찍어보고 싶을때도 많았습니다.

단순히 로그를 찍을때는 보통 다음과 같은 방식으로 출력해 보았지만, 불편했어요.

console.log(JSON.stringify(객체, null, 2));

  1. 타이핑이 너무 많음

  2. 총 몇번이나 호출되는지를 즉각 알 수 없음

  3. 어디에서 호출되었는지를 즉각 알 수 없음

  4. 코드 하이라이팅이 되지 않아 불편

  5. 객체끼리 얼마나 달라졌는지 알 수 없음

그래서 5가지를 매우 간단하게 해결하는 라이브러리를 구축했지요.

  1. 간단한 함수명

  2. 몇 번 호출되는지 횟수 기록

  3. 제목 넣기 가능

  4. JSON 객체 하이라이팅

  5. 객체 비교 기능

주요 API는 3가지 입니다.

1. debugLog

호출할 때마다 count가 증가하고, 제목을 넣을 수 있습니다.

image.png

debugLog();
console.log("test");

debugLog("with title debugLog");
console.log("test2");

2. jsonLog

debugLog에 더불어 JSON을 아름답게 출력해줍니다.

혹시 JSON만 출력하고 싶으시다면 jsonPrint를 써보세요.

image.png

jsonLog({ key1: true, key2: 1, key3: null, key4: "string" });
jsonLog("with title jsonLog", { others: undefined });

여기서부터는 함수 모양이 조금 복잡해 보이기도 하는데요,

제목여부는 function overload를 활용해 자동으로 추론해주고 있습니다.

3. jsonExpect

jsonExpect는 JSON 객체끼리 비교할 수 있는 기능을 탑재하고 있어요.

image.png

jsonExpect({ a: 1 }, { a: 2 });
jsonExpect("with title jsonExpect", { b: 1 }, { c: "1" });

무엇이 추가되고, 무엇이 삭제되었는지, 무엇이 편집되었는지를 한눈에 볼 수 있고

만약 객체가 동일한 모양이라면 same 이라는 박스에서 한번만 출력됩니다.

4. 기타편의기능

심지어 저희는 Vite Plugin화를 시켜놨기 때문에 상단에 import하는 것이 아니라,

함수 내부, 테스트 코드 내부 등 원하는 곳 어디서든 호출하도록 구성하여 사용하고 있답니다.

const { debugLog, jsonLog } = import.meta.debugLog;

물론 test 모드일때만 들어가므로, 프로덕션에 포함될 걱정을 하지 않아도 되요.

아직 vite plugin은 내부용도로만 쓰고 있어요.

JSON 콘솔 디버깅 라이브러리 배포

첫번째 주에서 팀원과 목적/목표등을 정렬(Align)하는 시간도 가졌었는데요.

팀원 분께서는 서비스 배포와 달리 NPM 패키지는 올려본 적이 없었기 때문에 한번 꼭 경험해보고 싶다고 말씀하셨습니다.

사실 저도 개인 계정이 아닌 조직 계정으로 배포는 처음이었는데요.

덕분에 몇가지 삽질을 했지만, 관련 이슈들을 잘 정리해주신 덕분에 매우 편하게 작업할 수 있었습니다.

image.png

  1. 프로젝트 이름: 조직 계정 이름과 scope 가 일치시키는걸 까먹고 있었습니다.

  2. 패치된 패키지: 번들링되는 서비스용 프로젝트면 몰라도, 라이브러리에서 패치된 버전을 배포하기란 생각보다 어렵더라고요. 그래서 저희는 포크를 뜨고, 배포하기로 결정했습니다.

  3. CommonJS: 의존하는 라이브러리 문제인데요, 몇가지 해결 방법을 찾기는 했으나
    비동기 함수로의 전환, 동기식이여도 ESM과의 호환성 문제 등 때문에 어차피 내부용 툴링이니 우선 ESM 전용으로만 배포하기로 했습니다.

  4. 의존하는 패키지에서 JSON을 import하기 위해 import obj from "mod" with { "type": "json" }를 사용하고 있어 경고가 뜨는 모양이더군요.
    역시 저희 환경에는 문제가 전혀 없기 때문에 해결없이 배포를 진행했습니다.

이번주에는 Monorepo에서의 버전 관리를 위한 changesets를 적용하고, 깃허브 액션으로 완전히 자동화된 체계를 갖추어보려고 합니다.

제가 여행을 잠시 다녀올 예정이라 팀원분께서 열심히..!! 작업을 해주시지 않을까 기대해봅니다. ㅎㅎ

혹시 개발에 관심이 있으시다면 댓글을 달아주시거나 alstjr7375@daum.net에 연락을 주셔도 좋습니다.

하단의 업보트와 깃허브 스타를 찍어주셔도 매우 큰 도움이 됩니다!!

- 네번째 뉴스레터 끝 -

Mincho

디자인시스템을 위한 CSS in JS 프레임워크

2
0
윤민석

윤민석

Mincho 프로젝트의 이번주 #3 - 깃허브 봇들과 함께해요

소개글

주간레터

  1. Mincho 프로젝트의 이번주 #1 - 팀 빌딩하는 방법

  2. Mincho 프로젝트의 이번주 #2 - RFC-TDD 프로세스로 개발하기

  3. Mincho 프로젝트의 이번주 #3 - 깃허브 봇들과 함께해요 (현재)

  4. Mincho 프로젝트의 이번주 #4 - JSON 콘솔 디버깅 라이브러리 배포

이번 주 개발 팁은 적은 사람들이 오픈소스 개발을 할 때 커다란 도움이 될 거에요.

사람이 많아도 사전 필터링이 한번은 될테니, 도움이 될테구요.

봇들과 함께하는 개발

여러분의 프로젝트에서는 어느정도로 자동화를 하고 있나요?

회사라면 상당히 많은 자동화 파이프라인이 가동될 수도 있겠지만, 개인 프로젝트들에서는 생각보다 쉽지 않습니다.

이 글에서는 몇가지 유용한 자동화를 소개하려 합니다.

저희 레포에서 풀리퀘스트를 발생시키면 봇들이 돌아가는데요, 같이 확인해봅시다.

1. CI로 체크하기

저희의 CI는 pre_job과 build라는 2개의 과정으로 이루어져 있어요

image.png

pre_job은 git의 커밋 해시를 인식해 한번 돌아간적이 있다고 인식되면 build 과정을 pass 시켜버려요.

커밋을 다시하는 상황이라면 모를까, 다음의 상황에서 또 CI를 돌릴 필요는 없잖아요?

  • push되어 CI가 돌아간 이후에 PR을 열기

  • fast-forward merge가 된 상황

image.png

그렇다면 build 과정에서는 어떤 일이 일어날까요?

  1. 먼저 레포와 캐시를 다운받고요

  2. 워크플로우 및 액션등에 대한 lint를 돌립니다.
    .yml 파일 작성을 잘못해서, PR에서는 통과했지만 릴리즈를 해야할 때 안돌아간다던가, 이슈폼이 제대로 나타나지 않는다던가 하는 일들이 있으면 억울하잖아요?? 그래서 저희는 체크를 따로 하고 있어요.

  3. 이후 yarn test:all이라는 명령어로 각종 테스트를 진행해요.

image.png

어떤 테스트를 돌릴까요?

  1. 린트: 린트로 정적 분석을 하고, 포매팅도 함께 검사해요

  2. 타입 체크: 저희는 타입스크립트 프로젝트이니 타입을 만족하는지 체크해야지요.

  3. 빌드: 당연하지만 빌드는 항상 되어야 합니다.

  4. 테스트 코드: 유닛 테스트들을 모두 만족해야 합니다.

image.png

이 테스트 과정은 turborepo를 이용해 의존성을 파악하고, 병렬로 실행합니다.

캐시와 병렬화 덕분에 1분 정도면 CI 과정은 마무리되요.

2. 코드리뷰

아니.. 코드리뷰를 자동으로 해주는 봇이 있다고요??

저희는 Coderabbit이라는 봇을 도입 후 매우 잘 사용하고 있습니다. (오픈소스는 공짜!!)

PR을 올리면 먼저 기다려달라는 귀여운 메세지가 뜨고요.

image.png

제 PR을 요약해줍니다.

image.png

상세한 코멘트는 별도죠.

image.png

리뷰가 필요하다 생각하면 댓글도 달아주고, 주고받고 할 수 있습니다.

특히 문서화 PR에서 폭풍 코멘트를 날려주셨어요..제..슬픈 영어 실력...ㅠㅠ

코드 리뷰는 상대적으로 덜 빡센 편인데요, 그래도 가끔씩 유용한 리뷰들을 남겨주어 좋습니다.

image.png

3. Fast forward 체크

저희는 fast-forward라는 git merge 방식을 주로 사용해요. (자세한건 다음에 설명하겠습니다)

깃허브에서는 지원하지 않는데요.

image.png

merge 커밋이 생성되 추적이 어려운 점을 방지하고, rebase나 squash와 달리 커밋기록과 해시가 보존하고 싶었어요.

Fast forward merge봇이 fast-forward가 가능한지 체크해주고, 가능하다면 다음과 같이 댓글을 달아서 merge하도록 구성해놨어요.

image.png

의존성 업데이트 및 보안 체크

깃허브 레포의 settings/security_analysis에 가면 다양한 설정이 있습니다.

먼저 Dependa bot.

image.png

뭔가 싶겠지만 한번쯤 본적이 있을거에요.

저희는 여러개가 한꺼번에 열리는 귀찮은 점을 방지하기 위해 그룹으로 한꺼번에 업데이트하도록 설정해두었어요.

image.png

그리고 Code scanning을 통해 자동적으로 보안감사를 하도록 구성해두었습니다.

image.png

아직 저희는 패키지를 배포하고 있지는 않아서 배포하는 액션은 없는데요,

8월 중에는 아마 생길 것 같습니다.

이번주에 한일

이번주에도 많은 일을 했어요.

1. 문서화

먼저 제 프로젝트들의 특징 중 하나라고 하면, 문서양이 규모에 비해 많은 편 입니다.

보는 사람이 편하고, 관리하기도 편하더라고요.

이번에는 README, Code of Conduct, Contributing 등의 문서를 모두 완전히 다시 썼어요.

image.png

특히 Contributing 문서에는 명문화된 개발 프로세스들이 많은데요,

나중에 주간레터에서 하나씩 소개드리도록 하겠습니다.

2. 팀원과 업무 할당 및 공유

팀원이 아마 이번주까지는 할 일 때문에 참여를 많이 못할 것 같아요.

그래도 정기 미팅으로 일요일에 만나고 있습니다.

이번주 일요일에는 Stacked Diff PR을 위한 선형 커밋 로그를 만드는 방법에 대해 알려주고,

패키지 배포에 대해 함께 논의하였답니다.

image.png

3. debugLog

디버깅을 하다가 너무 힘들어서 만든 패키지에요.

호출 될때마다 카운트가 증가하고요,

image.png

JSON을 이쁘게 보여주고

image.png

비교도 할 수 있어요.

image.png

4. 번들링 설정

이제 슬슬 배포가 다가오기 때문에 번들링 관련 설정을 했어야 합니다.

  1. 의존성: 원래 설정은 Node.js에서 모든 의존 패키지가 번들링되어 하나의 JS 파일로 나왔는데요, 어플리케이션이 아니기 때문에 외부 패키지는 설치하도록 변경했습니다.

  2. ESM & CJS: ESM(index.js, index.d.ts)과 CJS(index.cjs, index.d.cts)를 export 할 수 있도록 했어요.

  3. 플러그인: 위에 나온 debug-log를 vite plugin으로까지 만들었어요. 자세한건 다음에. ㅎㅎ

5. property reference 구현

property를 참조할 수 있는 기능이랍니다.

export const myCss = css({
  width: "50px",
  height: "@width",
  margin: "calc(@height / 2)"
});

다음과 같이 컴파일 되겠죠?

export const myCss = style({
  width: "50px",
  height: "50px",
  margin: "calc(50px / 2)"
});

이번주에는 생각보다 다른 할 일이 많았습니다.

이제 기능은 1개만 더 만들면 되네요!!

다음주에는 debug-log부터 배포를 시작해볼거에요!!

혹시 개발에 관심이 있으시다면 댓글을 달아주시거나 alstjr7375@daum.net에 연락을 주셔도 좋습니다.

하단의 업보트와 깃허브 스타를 찍어주셔도 매우 큰 도움이 됩니다!!

- 세번째 뉴스레터 끝 -

Mincho

디자인시스템을 위한 CSS in JS 프레임워크

10
1
윤민석

윤민석

Mincho 프로젝트의 이번주 #2 - RFC-TDD 프로세스로 개발하기

안녕하세요?

벌써 두번째 뉴스레터를 적어야 할 때가 돌아왔습니다!!

뉴스레터에서는 개발 현황 뿐만 아니라, 각종 개발 팁들을 조금씩 풀어보려고 해요.

이번에 소개해드릴 것은 RFC-TDD 프로세스로 개발하기입니다.

소개글

주간레터

  1. Mincho 프로젝트의 이번주 #1 - 팀 빌딩하는 방법

  2. Mincho 프로젝트의 이번주 #2 - RFC-TDD 프로세스로 개발하기 (현재)

  3. Mincho 프로젝트의 이번주 #3 - 깃허브 봇들과 함께해요

  4. Mincho 프로젝트의 이번주 #4 - JSON 콘솔 디버깅 라이브러리 배포

개요

Mincho 프로젝트의 이번주 #1 - 팀 빌딩하는 방법에서 설명한 것처럼 RFC 문서를 작성하면 장점이 많습니다.

스펙 구성, 컨텍스트 공유, 테스트 짜기 등등에서요.

제가 하는 방법을 설명하자면, 다음과 같습니다.

  1. RFC 문서 작성

  2. RFC를 보면서 in source 테스트 케이스 추가

  3. it.only()로 해당 테스트만 실행되게 해놓고, debugger 모드로 실행

  4. 의심가는 부분을 break 걸어놓고, 필요하면 log 추가

  5. 코드가 헷갈리면 IDE 옆에 켜진 AI에게 물어보기

  6. 혹시 구현부분에 추가적인 설계가 필요할 경우 RFC에 적어서 PR 및 커밋

  7. 다시 RFC 보면서 코드 구현

  8. only 옵션 풀어보고, 돌아가면 전체 테스트 한번 돌리기

  9. PR 및 Merge

  10. 반복

뭔가 복잡해보이죠?

그렇다면 우선 많이들 하는 TDD로 개발하기만 생각해봅시다.

TDD로 개발하기

이번에 한 작업은 중첩된 CSS 변환이었는데요,

다음과 같이 범위를 줄여봤어요. 훨씬 쉽죠?

  1. in source 테스트 케이스 추가

  2. it.only()로 해당 테스트만 실행되게 해놓고, debugger 모드로 실행

  3. 의심가는 부분을 break 걸어놓고, 필요하면 log 추가

  4. 구현

  5. only 옵션 풀어보고, 돌아가면 전체 테스트 한번 돌리기

1. in source 테스트 케이스 추가

저희 프로젝트는 탄탄하게 만들기 위해서 in source 테스트를 많이 만듭니다.

in source 테스트가 뭐냐고요?

말 그대로 소스코드와 테스트코드를 함께두는 방식을 말합니다.

Rust에서 자주 쓰는 방법이고, 저희는 Vitest를 통해 달성하고 있어요.

// == Interface ================================================================
export function isCSSVarKey(keyStr: string) {
  return keyStr.startsWith("$");
}

export function isPureCSSVarKey(keyStr: string) {
  return keyStr.startsWith("--");
}

export function isVarsKey(keyStr: string) {
  return keyStr === "vars";
}

export function replaceCSSVarKey(keyStr: string) {
  return convertToCSSVar(keyStr);
}

// == Tests ====================================================================
if (import.meta.vitest) {
  const { describe, it, expect } = import.meta.vitest;

  describe.concurrent("Replace CSS Var value", () => {
    it("Is css var key", () => {
      expect(isCSSVarKey("$myCssVariable")).toBeTruthy();
      expect(isPureCSSVarKey("--my-css-variable")).toBeTruthy();

      expect(isCSSVarKey("-my-css-variable")).toBeFalsy();
      expect(isPureCSSVarKey("-my-css-variable")).toBeFalsy();
      expect(isCSSVarKey("_hover")).toBeFalsy();
      expect(isPureCSSVarKey("_hover")).toBeFalsy();
    });

    it("Convert to css var", () => {
      expect(replaceCSSVarKey("$myCssVariable")).toBe("--my-css-variable");
      expect(replaceCSSVarKey("$my-css-variable")).toBe("--my-css-variable");
    });
  });
}

이렇게 하면 몇가지 장점이 있어요.

  1. 한가지 파일에서 관련된 소스코드와 테스트 코드가 함께 있으므로 작성, 분석, 추적이 쉽습니다.

    1. 작성: 화면 스플릿만 하여 바로 작성할 수 있어요.

    2. 분석: 한 파일에 있으므로, 타입만 보고 인터페이스를 추정하기 힘든 경우 아래로 내려서 예제를 바로 볼 수 있습니다.

    3. 추적: git에서 변경 사항이 여러 파일과 디렉토리에 걸쳐있지 않아 변경사항 추적이 간편합니다. 혹시 test파일을 추가하지 않았다던가 하는 일도 없겠죠.

  2. 유닛 테스트와 통합 테스트를 분리할 수 있습니다. (in-source에 있는게 유닛테스트)

테스트를 작성하는 방법 자체는 다음을 참고해보세요.

새로운 기능이나 버그를 고치기 위한 목적으로, 테스트를 작성했다면 분명 실패할거에요.

아직 기능이 구현되거나 버그가 고쳐지지 않았으니까요.

2. 한가지 테스트만 실행되게 해놓고, debugger 모드로 실행

두번째는 작성한 한가지 테스트만 실행되게 해야합니다.

다른 테스트까지 실행하면 분석하기가 어려워지니까요.

이를 위해 먼저 only 옵션을 주도록 합니다.

    it.only("Nested selector & AtRules", () => {
       // 작성한 테스트...
    });

다음은 Debugger 모드로 현재 파일만 watch로 실행되도록 .vscode/launch.json 파일을 구성합니다.

이렇게 하면 디버그 모드로 현재파일 테스트를 바로 실행하고, 저장될 때마다 테스트가 통과하는지 확인할 수 있어요.

{
  // From https://vitest.dev/guide/debugging#vs-code
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Debug Current Test File",
      "autoAttachChildProcesses": true,
      "skipFiles": ["<node_internals>/**", "**/node_modules/**"],
      "program": "${input:GIT_ROOT}/node_modules/vitest/vitest.mjs",
      "args": [
        "watch", "${relativeFile}"
      ],
      "smartStep": true,
      "outFiles": ["${workspaceRoot}/dist/**/*.js"],
      "console": "integratedTerminal",
      "cwd": "${workspaceRoot}",
    }
  ],

  // Need to install `augustocdias.tasks-shell-input` extension
  "inputs": [
    {
      "id": "GIT_ROOT",
      "type": "command",
      "command": "shellCommand.execute",
      "args": {
        "command": "git rev-parse --show-toplevel",
        "useSingleResult": true,
        "useFirstResult": true
      }
    }
  ]
}

한번 실행해 볼까요?

파일을 저장하니 다시 실행되는 모습을 볼 수 있습니다.

test-watch.gif

3. 의심가는 부분을 break 걸어놓고, 필요하면 log 추가

이제 브레이크 포인트를 두고, 값들을 확인하면서 코딩이 가능해요.

test-debugging.gif

물론 필요하다면 console.log도 찍어도 좋습니다.

보다 이쁘게 보려면 JSON.stringify(object, null, 2) 를 함께 쓰면 되요.

4. 구현 및 커밋

이제 테스트가 통과할 때까지 구현만 하고, only 옵션을 푼다음 테스트하고 커밋하면 끝나겠죠?

이렇게 디버거와 함께 반복적으로 테스트가 통과하는지 체크하면 개발은 편하면서 일정 품질은 보장이 되요.

RFC와 함께하기

그렇다면 RFC는 Test와 함께 어떻게 시너지가 있을까요?

RFC란 "비평을 기다리는 문서"라는 의미로, 새로운 아이디어에 대한 전문가 비평을 받거나 정보를 공유가 목적입니다.

한 번 발행된 RFC는 폐기되지 않으며, 수정이 필요한 경우 새로운 RFC로 발행됩니다.

저희는 각종 기능의 스펙과 배경, 구현 방법등을 담아 발행하고 있습니다.

그리고 테스트를 작성할 때는 RFC에 기반하여 작성하는데요,

설계가 잘못되었거나 보충되어야 할 때를 빠르게 판단할 수 있습니다.

예를들어 CSS 중첩기능을 구현했어야 했는데 다음은 어떻게 변환이 되어야 할까요?

그리고 각종 at-rule들과 복잡한 selector가 중첩이 되면 어떻게 할까요?

const myCss = css({
  "nav li > &": {
    "@media (prefers-color-scheme: dark)": {
      _hover: {
        background: "red"
      }
    }
  }
});

그래서 저는 중첩된 순서가 미리 정해져 있도록 RFC문서를 보충한 후에 기능을 구현했어요.

이제 위 코드는 명시적으로 다음과 같이 변환이 되어야 하고요,

export const myCss = style({
  "@media": {
    "(prefers-color-scheme: dark)": {
      selectors: {
        "nav li > &:hover": {
          background: "red"
        }
      }
    }
  }
});

훨씬 복잡한 상황도 중첩된 순서가 항상 같으므로 안정적인 출력이 가능해져요.

export const myCss = style({
  // Level1: @layer
  "@layer": {
    "framework.layout": {

      // Level2: @supports
      "@supports": {
        "gap: 1rem": {

          // Level3: @media
          "@media": {
            "(prefers-color-scheme: dark) and (prefers-reduced-motion)": {

              // Level4: @container
              "@container": {
                "(min-width: 500px)": {

                  // Level5: selectors
                  "selectors": {
                    "nav li > &:hover": {
                      background: "red"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
});

모아놓음 RFC문서만 보면 각종 기능과 설계를 한눈에 볼 수 있으므로 개발하기가 매우 편해진답니다.

정리하자면

  • RFC 문서: 기능 리스트와 설계, 각종 배경정보

  • In-source 테스트 코드: 실제 구현인 코드와 테스트가 함께

형태이고요,

이를 공정으로 생각하면

  • RFC: 기획-설계

  • TDD: 구현-테스트

로 깔끔하게 분할이 됩니다.

이게 정답이다!!라고 할 수는 없겠지만 몇달 쉬었다가 개발을 시작함에도 적응이 무척 쉽네요.

여러분도 RFC - TDD 프로세스로 작업해보시는 것은 어떨까요?

둘째주 한일

CSS Nesting RFC에서 중첩된 at-rules와 selector 기능이 모두 구현됐어요.

또한 방치되어 있던 의존성을 모두 업데이트 했습니다.

ESLint 설정도 flat config로 바꾸었어요.

CSS Nesting RFC가 끝나면 첫번째 목표인 "Natural CSS in the Typescript "가 이루어지는 셈이니 릴리즈까지는 단 2개의 기능만 남은 셈입니다.

그럼 다음주 출시를 목표로..!! 열심히 해보겠습니다.

담주에 만나요~~

혹시 개발에 관심이 있으시다면 댓글을 달아주시거나 alstjr7375@daum.net에 연락을 주셔도 좋습니다.

하단의 업보트와 깃허브 스타를 찍어주셔도 매우 큰 도움이 됩니다!!

Mincho

디자인시스템을 위한 CSS in JS 프레임워크

5
0
윤민석

윤민석

Mincho 프로젝트의 이번주 #1 - 팀 빌딩하는 방법

소개글

주간레터

  1. Mincho 프로젝트의 이번주 #1 - 팀 빌딩하는 방법 (현재)

  2. Mincho 프로젝트의 이번주 #2 - RFC-TDD 프로세스로 개발하기

  3. Mincho 프로젝트의 이번주 #3 - 깃허브 봇들과 함께해요

  4. Mincho 프로젝트의 이번주 #4 - JSON 콘솔 디버깅 라이브러리 배포

먼저 기쁜 소식이 있습니다.
제 프로젝트가 트렌딩 프로젝트 1위에 올랐습니다.

image.png

#물들어올때_노젓자 는 심산으로 이번주에 한 일을 적어보고, 어떻게 일하는지도 소개해보려 합니다.

  1. 계획

  2. 실행

  3. 홍보

  4. 로고 with AI Driven

계획

사실 저 말고 팀원이 한분 더 계시는데요,
회사 분을 꼬셨습니다..ㅋㅋ

때문에 저 혼자 작업할때는 간단한 메모로 남겨두고 진행했던 일도 문서화가 필요해지게 됩니다.

먼저 개발자 대회 일정에 맞추어 전체적인 작업의 마감라인을 정했어요.

image.png

그 후에는 해야할 목표를 정합니다.

image.png

팀원의 목표와 할 일 또한 정해야 하는데, 역시 모든 시간을 쓰기는 어렵기 때문에 감안하여 정해야합니다.

저는 온보딩을 위해 설계 문서 채우기를 통해, 프로젝트에 대한 이해도를 높히고 구현해야 하는 부분을 미리 고민하도록 할당하였습니다.

또한 어떻게 이루어질지에 대해 프로세스를 안내했죠.

Screenshot_20240708_144654.pngScreenshot_20240708_144756.png

실행

브랜치 병합

먼저 이미 구현되어 있던 기능들을 Merge 합니다.

원래는 리뷰과정을 거쳐야 하나, 현재로서는 피어리뷰까지 거칠만한 리소스가 없기 때문에 PR단위 기록만 남겨두기로 했습니다.

image.png

이때 저희는 Fast Forward와 Rebase를 이용한 선형 커밋기록을 선호하는데요.

복잡한 Merge 구조로 인한 혼동이 매우 적기 때문입니다.

따라서 커밋 기록을 보면 Merge branch 어쩌고 from 저쩌고 가 없는 모습을 볼 수 있습니다.

image.png

선형 구조를 유지하기 위해서 git-branchless라는 툴을 적극적으로 활용중이고요, 제 블로그 글을 읽어보시는 것도 추천드립니다.

추후 가능하다면 구체적인 방법이나 후기를 더 공유하도록 하겠습니다.

설계 문서 초안 작성

팀원분이 작성할 설계 문서에 대해 스펙을 미리 잡아놔야 병목이 없겠죠?

때문에 설계 문서 초안을 미리 작성해둡니다.

저희는 Rust RFCs와 CSS Working Group의 사례와 같이 실제로 코딩하기전에 미리 RFC를 작성하며 구현이 될 기능, 구현 가능성, 참고할만한 컨텍스트등을 공유하도록 하고 있어요.

여기에는 많은 장점들이 있습니다.

  1. 라이브러리의 스펙을 미리 정해두면 오해를 할 가능성이 낮습니다.

  2. 구현을 할때도 스펙의 내용을 보면서 작업하여 컨텍스트 전환이 적습니다.

  3. 스펙을 이용하면 테스트 코드를 만들때도 편합니다.

  4. README나 웹사이트, 각종 문서를 구축할 때도 크게 도움이 됩니다.

  5. 팀원과 프로젝트에 대해 이야기할 때도 RFC를 기준으로 참고하고, 내용이 부족하다면 업데이트하기가 쉽습니다.

  6. 한국인이 아닌 팀원이 들어온다고 하더라도 확장이 가능하며, 팀원이 아닌사람이라도 스펙을 제안할 수 있는 구조입니다.

  7. 프로젝트 설계 히스토리를 독점하는 사람이 없이 공유됩니다.

RFC 문서의 구조는 Rust를 적극적으로 참고하여 만들어졌습니다.

  1. Summary (요약)

  2. Motivation (동기)

  3. Guide-level explanation (사용자가 실제로 사용하는 부분)

  4. Reference-level explanation (구현 부분)

  5. Drawbacks (접근 방식의 단점)

  6. Rationale and alternatives (근거 및 대안)

  7. Unresolved questions (풀리지 않는 질문)

  8. Future possibilities (추후 가능성)

이번에는 온보딩이 주 목적이기 때문에 목차와 일반적인 부분은 제가 써두고,

image.png

상대적으로 많이 알려진 기능이나 기존 RFC를 참고할 수 있는 내용을 위주로 채우도록 만들어두었지요.

image.png

홍보

아직 만들어지지도 않은 프로젝트라 역시 고민이 많았는데요.

우선 인플루언서가 아니고, 그렇다고 조회수를 많은 블로그를 가지고 있지 않거든요. ㅠㅠ

그래도 일전에 오픈소스를 하며 얻은 작은 성과로 인해 개발 상황 공유와 빠른 피드백 루프가 중요함은 잘 알고 있습니다. 프로젝트 주간 레터를 발행하는 이유이기도 해요.

게다가 이런 저런 상황으로 인해 프로젝트의 개발이 미루어질 것을 염려하여 일단 선언하고 따라가야하는 상황을 만들어버리자는 생각이 들어 디스콰이엇에 가입하고 글을 남기게 됩니다!!

주간레터용으로 트렌딩 프로덕트 5위에 진입한 스샷을 찍어놨는데..!

Screenshot 2024-07-07 at 23-28-44 Mincho Disquiet.png

1위가 되버려서 매우 기쁩니다!!
특히 처음 들어와 갈팡질팡할때 권도언님이 많이 도와주셨고 디스콰이엇 뉴스레터에도 실리게 되었습니다.

Screenshot 2024-07-08 at 13-42-15 Disquiet.png

image.png

깃허브에는 5분이나 스타를 눌러주셨고요.

이전에 5k 스타를 받은 프로젝트를 운영하고 있는 체감상 100개까지 채우기가 1000개 보다 어렵고요, 1000개가 5000개보다 어렵습니다.

때문에 한분한분 정말 고마운 분들입니다.

image.png

프로젝트에 관심가져주신 모든 분들께 감사드립니다.

로고 with AI Driven

그런데 글을 남기고, 프로덕트를 등록하려면 로고가 필요하겠더라고요.

저는 AI를 활용해 1시간 반정도로 로고를 만들었어요.

대부분의 시간은 서비스 검색이나 재생성 시도에서 소모되었습니다.

  1. 급하게 Wix Logo Maker라는 AI 아이콘 생성기로 200x200짜리 무료 로고를 만듭니다. (고해상도는 유료)

Screenshot_6-7-2024_142517_manage.wix.com.jpeg

  1. 이런 컬러가 마음에 들지 않았습니다. Phind에서 cluade에게 물어 컬러코드를 #CFFFE5 로 바꿉니다.

image.png

  1. AI로 업스케일링 하여 800x800으로 사이즈를 키웁니다.

Screenshot 2024-07-06 at 14-26-35 Upload Image to Enlarge & Enhance Upscale.media.png

  1. 오픈소스 프로그램인 Krita롤 이용해 사이즈가 커지며 깨진 부분을 수정합니다.

Screenshot_20240706_142729.png

이상 귀여운(?) 로고가 탄생한 과정이었습니다.

logo02_fix.jpg

정리

첫주에는

  1. 전반적인 일정을 잡고,

  2. 프로세스를 구축하며,

  3. 한국어 홍보 파이프라인을 만들어 두었습니다. (영어권은 따로 필요합니다.)

이제는 진짜 본격적인 개발 시작해야죠.

혹시 개발에 관심이 있으시다면 댓글을 달아주시거나 alstjr7375@daum.net에 연락을 주셔도 좋습니다.

하단의 업보트와 깃허브 스타를 찍어주셔도 매우 큰 도움이 됩니다!!

- 첫번째 뉴스레터 끝 -

Mincho

디자인시스템을 위한 CSS in JS 프레임워크

3
0
윤민석

윤민석

새로운 오픈소스 프로젝트 개발을 시작합니다.

안녕하세요?

디자인시스템을 위한 CSS in JS 프레임워크인 Mincho를 개발을 시작했습니다.

Mincho 프레임워크란?

방금 소개했듯이 디자인시스템을 위한 CSS in JS 입니다.

제작동기

처음에는 CSS의 스타일링에 대한 접근과 관리방법에 대한 고민이었습니다.

CSS의 Selector에 대한 방법론으로는 크게 시각적 위계와 의미론적 위계로 나뉘어져 있습니다.

시각적 위계는 .text-red { color: red; } 처럼 시각적인 이름을 사용하는 방식이며,
의미론적 위계는 .error { color: red; } 처럼 의미적인 이름을 사용하자는 방식이에요.

그러한 특성 때문에 목표를 달성하는 방식도 상이합니다.

예를 들어 다음과 같이 컨텐츠는 같지만 다양한 디자인을 만들어야 한다면 어떨까요?

시각적 방식은 CSS는 정해져 있지만, HTML을 변경하여 달성하고
의미론적 방식은 HTML은 그대로지만, CSS를 변경하여 달성하려 하겠죠.

image.png

시각적 위계를 다루는 실제적인 예시로는 TailwindCSS가 있고, 의미론적 위계로는 Stitches가 있습니다.
Tailwind의 Text Color를 보면 text-black, text-white 처럼 딱 봐도 시각적입니다.

Stitches는 Variants라는 API를 창안해놨는데 Element identifiers라는 CSS Class 원래 목적에 부합하며, BEM을 매우 쉽게 적용할 수 있습니다.

기타 CSS에 대한 자세한 역사나 접근법은 다음 글들을 읽어보세요.

  1. CSS 역사로 알아보는 CSS가 어려워진 이유

  2. CSS책 출판제의를 받고 작성했던 원고들 공유... (지금은 부러졌어요)

  3. CSS-in-JS, 무엇이 다른가요?

저는 이 두가지 방식이 화해를 하고, 정반합을 이룰수 있을거라 믿었어요.

마치 민트의 시원하고 상쾌한 맛과 초콜릿의 달콤함이 조화를 이루는 민트초코처럼요!!

배스킨라빈스 '민트 초코 봉봉' 판매량 1위 등극 - 딜사이트

매우 다양한 CSS 프레임워크와 라이브러리가 있지만 제가 만족하는 사용법을 제공하는 것은 찾아볼 수가 없었습니다.
최근에 나온 PandaCSS가 그나마 좋아보이지만, 여전히 시각적 위계와 의미론적 위계를 잘 다룬다고 보기는 어렵습니다.

image.pngimage.png

결국 2년전즈음 프론트엔드 코딩을 하다가 더 쉽게 제 생각을 표현하는 방법을 탐색하기 위해
HTML과 CSS 전처리, 템플릿의 표현력이라는 글을 쓰다가 "내가 해결할 수 있겠는데???"라는 근자감이 들게 됩니다.


하지만 작업양이 방대할 뿐만 아니라 다른 프로젝트를 하느라 시도하지 않았고

그동안 UnoCSS, PandaCSS, StyleX등 여러가지 프레임워크가 나왔습니다.

이렇게 점점 춘추전국시대가 되어가는 CSS 프레임워크 시장을 보며 결국 저도 하고 싶다는 생각이 들어 시작하게 됩니다.

그래서 왜 프레임워크의 이름이 Mincho인가요?

작년에 트위터에 밝혔듯이, 3가지 이유가 있으며 우연의 마주침에서 조합된 필연과도 같습니다(?)

  1. Atomic CSS(Good) + Variant(Good) = Better 인 모습이 민트초코 같아서

  2. Vanilla Extract라는 라이브러리를 기반으로 할 예정이라서

  3. 제가 민초단이라서 (매우중요)

나훈아님의 인터뷰처럼 까와 빠를 둘다 미치게 만드는 슈퍼스타 같은 존재이기도 하죠. ㅎㅎ

비전 및 목표

"Build your own design system"이 비전 입니다.

시각적인 위계 + 의미론적인 위계 통합뿐만 아니라 디자인 자체의 프로세스 개선을 지향합니다.
그래서 아직 지배적인 CSS framework가 없는 웹 생태계에서 한 자리를 차지하는 것이지요.

우리의 CSS in JS 프레임워크는 5개(Literal, Theme, Atomic, Variant, Styled Component)의 레이어로 이루어질 예정입니다.

  1. Literal: JavaScript의 문법적 한계를 고려하며, CSS 전처리기의 다양한 CSS 특화된 구문 제공

  2. Theme: Color, Typography, Spaces 등 디자인 토큰 값과 커스텀

  3. Atomic: 시각적 값과 매핑되는 원자적인 스타일

  4. Variants: 재활용 가능한 블록을 위한 스타일

  5. Styled Component: JSX 컴포넌트와 바인딩

이는 State와도 비교할 수 있습니다. [1, 2]

  1. JSX: HTML과 JS를 바인딩합니다

  2. State hook: 뷰 플랫폼에 구애받지 않는 로직

  3. Behavior hook: 플랫폼 API(DOM, React Native등)를 위한 이벤트, 접근성, 국제화등을 처리

  4. Headless Component: JSX와 hook을 바인딩하여 사용할 수 있도록 제공

  5. Component: 디자인까지 포함된 컴포넌트 블럭

다만 처음부터 모든 기능을 제공할 수는 없기 때문에 단계별로 이루어가려 합니다.

  1. Natural CSS in the Typescript: 각종 CSS전처리 기능등을 Typescript에 특화되도록 바인딩합니다.

  2. A CSS in JS that integrates AtomicCSS and Varients: 원래 목표였던 시각적 위계(AtomicCSS)와 의미론적 위계(Varients)를 통합을 이룹니다.

  3. Build your own design system: 디자인 토큰 관리 및 피그마 플러그인등으로 디자인 시스템을 만들기위한 프레임워크로서 기능합니다.

왜 디스콰이엇에 글을 쓰게 되었나?

사실 완전히 뿅 튀어나온 것은 아니고, 작년 말에 학교 졸작이 끝나고 조금 시도를 한 적이 있습니다.

물론 많은 프로젝트들이 그렇듯 회사일로 바뻐지면서 이래저래 개발이 진행되지 않았습니다. ㅠㅠ

이대로는 안되겠다라는 생각이 들어 공개SW 개발자대회에 참가를 신청하였고, 올해말까지 일정 수준으로 퀄리티를 올려보려고 합니다.

이때 디스콰이엇에 정기적으로 글을 올리는 REAME 주도 개발을 통해 게으른 저에게 강제적인 동기부여를 하고자 합니다.

(홍보도 되면 좋고요!!)

혹시 개발에 관심이 있으시다면 댓글을 달아주시거나 alstjr7375@daum.net에 연락을 주셔도 좋습니다.

하단의 업보트와 깃허브 스타를 찍어주셔도 매우 큰 도움이 됩니다!!

Mincho

디자인시스템을 위한 CSS in JS 프레임워크

10
0