Giter VIP home page Giter VIP logo

jumpu-ui's Introduction

Jumpu UI

Jumpu UI はユーティリティフレンドリーな UI コンポーネントライブラリーです。

Storybook

https://tuqulore.github.io/jumpu-ui/

Figma

デザインツール Figma でも Jumpu UI が公開されています。

Jumpu UI (Figma 版)

コンセプト

Jumpu UI の最大の特徴は、コンポーネントのバリエーションを TailwindCSS ユーティリティーと組み合わせて表現できることです。

たとえば、「ボタン」を小さくしたいとします。一般的には、ボタンへの関心を中心に「小さいボタン」の見た目を用意することになるでしょう。Jumpu UI ではどうするかというと、「ボタン」と「文字が小さい」によって見た目を用意します。「ボタン」は Jumpu UI コンポーネントに、「文字が小さい」は TailwindCSS ユーティリティーにそれぞれ対応づけられます。Jumpu UI では「さまざまなボタン」を「ひとつのボタン」では用意しません。それは TailwindCSS ユーティリティーによって表現されるからです。これがユーティリティフレンドリーな UI コンポーネントというコンセプトです。

ここで、有名な CSS 設計論と比較をしてみましょう。

CSS 設計論 Block Element Modifier
BEM .block .block__elem .block--mod
RSCSS .rscss-component .rscss-component > .elem .rscss-component.-variant
Jumpu UI .jumpu-component .jumpu-component type / .jumpu-component [role="button"] .jumpu-component[aria-pressed="true"] / .jumpu-component.text-sm / .jumpu-other-component

重要なのはクラス名を定義しているのはコンポーネントの粒度のみで、それ以外は要素型セレクター、属性セレクター、TailwindCSS ユーティリティーで表現されていることです。これによって、可能な限りクラスの名前空間を TailwindCSS ユーティリティーに割り当てることができます。

パッケージ

Jumpu UI を使った開発に関する問い合わせ

株式会社ツクロアでは、 Jumpu UI を使った Web アプリケーション設計・開発のご依頼を受け付けています。 こちらのフォームにてまずはお問い合わせください。

jumpu-ui's People

Contributors

github-actions[bot] avatar hidetaro7 avatar knokmki612 avatar renovate-bot avatar renovate[bot] avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

jumpu-ui's Issues

Button: ringの使いどころが考えにくい

他のバリアントと同列ではなく、TailwindCSS独自のユーティリティ機能を使った例のように見えて、わざわざバリアントとして並べるのは違和感がある気がする。

解決策として考えられるのは、ドキュメントにして、使用例などで示す、その際にTailwindCSSのユーティリティだということもしっかり明記しておいたほうがある意味フェアじゃないだろうか?(うちで作ったものではないため)

IconButton: ツールチップの表現方法

現在aria-label属性とdata-label属性に同じような文字列が設定されており、それによってdata-labelがないのであればツールチップを表示しないような使い分けが可能になっています

https://github.com/tuqulore/tuqulore-ui/blob/6dbffb7ed1a19aa6db9d627bd06ed3f539dbeda3/packages/tailwindcss/stories/IconButton.stories.js#L8-L10

https://github.com/tuqulore/tuqulore-ui/blob/6dbffb7ed1a19aa6db9d627bd06ed3f539dbeda3/packages/tailwindcss/iconButton.js#L26-L27

現在のスタイルはツールチップがあらかじめ考慮されているので、ツールチップを表示しないことが考えにくいのであれば、aria-labelのみ設定する想定にしてもよいかと思いました

安定版のリリース

  • リリース作業をおこなう
  • 作業後 #21 でドキュメンテーションする
  • developブランチを廃止する #43

Storybookをwebsiteディレクトリに用意する

  • どのようなコンポーネントが必要か
  • どのようなドキュメンテーションが必要か

を検討したプロトタイプがあるので、それをwebsiteディレクトリに移行する

{Labeled,}LikeButton: いいねがアクティブになっているように認識しづらい

いいねが有効の際のみせかたは検討したほうがいいのか気になりました

Likedというバリアントで表現されていたのですでに実装としては存在していますね
いいねがアクティブになっているように認識できていなかった、という話でしょうか(デザインにおける指摘)

Originally posted by @knokmki612 in #54 (comment)

セマンティックなマークアップ (divを多用しない&ARIAを活用する)

現在のスタイルの設計方針として

BEMとの比較

  • Block: Component
  • Element: クラスとしては定義しない。疑似要素、タグセレクタなどによって表現する
  • Modifier: クラスとしては定義しない。Utilityとの組み合わせで表現するか、異なるComponentとして表現する

となっている。

この方針には .is-active のようなインタラクティブな要素で用いるModifierがカバーできないという問題点がある。

ARIAで提供されているロールの一部は aria-expanded などのような属性が用意されているので、それを使用して回避する。

スタイル設計の方針のやりとり

https://inside.pixiv.blog/2021/07/01/151500 を読んだ

  • Components: デザインの統一性○ 実装の制約○ 実装の柔軟性×
  • Utilities: デザインの統一性○ 実装の制約○ 実装の柔軟性○
  • Constrants: デザインの統一性× 実装の制約× 実装の柔軟性○

とはいえUtilitiesだけだと付与するクラスがとても多くなる

Utilitiesと組み合わされることを考慮したComponentsが欲しい

  • buttonの文字の大きさ
    • 余白をemでつける
    • text-base text-xl などつけたらいい感じに余白がつく

コンポーネントをちょっと変えたいというケースってなに

  • 色: 設定で管理できるのでは
  • ちょっとみせかたを変えてオリジナリティを出す: そういうのって淘汰されがち
    • あまりよくやることではないしよくやるべきではない
    • tuqulore uiとしてはカバーしたくない

Componentsと組み合わせるUtilitiesは、BEM的にはModifierになりそう
必要なUtilitiesがあまりに多いのであれば、別のComponentsとして分けるとよいのか
例: .button.outlined-button があるけどそれらは独立していて組み合わせる必要がない

.card-title .card-body .card-image のようなBEM的にElementsになるものはあまり用意しなくていいのでは
Utilitiesで表現できる複雑でないものだと思うから

.button がどの範囲でカスタマイズして使えて、アウトラインなデザインが欲しければ .outlined-button を使ってね、というのはドキュメンテーションのスコープで取り組む


まずはButtonについてStorybook上で @Hidetaro7 が作業して @knokmki612 もみてみて議論することが必要そう

アイコンがFontawesomeに依存している

Fontawesomeはfree版だと使いにくい(ルックアンドフィール的に)
もう少しスタイリッシュなものにしたい。
かといってPro版だと汎用性にかける。

以前の話だと、他のアイコンでも実装できることを考えたものにするということもあったが、
ここで見せるサンプルはFontawesome以外のものを使うことに決めたほうがよさそう。。

メモしとく。。

emを使うutilityを定義する

コンポーネント内で多用しており、コンポーネントクラス以外でも参照するニーズがあると考えられる

拡張するユーティリティ

  • width
  • height
  • mergin
  • padding

tailwindcssのスタイルのパッケージは、プラグインではなく、applyしたクラス群として提供する

プラグインとして作成すると、theme()関数でthemeに定義された変数を参照することはできるが、逆に言えばtheme()関数を使わなければtailwindcssのベーススタイルを反映したスタイルを組まないことになる。

上記を問題点を解決するため、
applyしたクラス群のスタイルを書き、全体あるいは個別のコンポーネント単位で

  • tailwindcssで変換済みのcssファイル
  • 変換前(applyが展開される前)のcssファイル(ただしsassでuse()などしていたのであればそれらがバンドルされているもの)
  • 変換前(applyが展開される前)のsassファイル

のようなバリエーションでimportして使えるような形で提供する。

Tag: 閉じるボタンが存在する場合のマークアップ

Tagの中にbuttonを使用した場合は閉じるボタンとしてスタイルされる
Tag自身もクリッカブルにしたい場合はbuttonタグでマークアップしたほうがよいが
おそらくbuttonタグのネストはHTMLの仕様に不適合

推奨するマークアップについての議論が必要

labelに対するスタイルはサポートしない

なぜしないのか?その理由をドキュメンテーションする。

  • 状況によっていくつかのスタイルを使い分ける必要がある、例えば名前のフィールドと複数のチェックボックスだとレイアウトが異なる
  • コンセプトとして、デザイナーがある程度意図としているスタイルを付与できるためのフレームワークである、そのため、label要素を強制的にスタイルで縛るのはコンセプトに合致しない
  • 他のフレームワークとの差別化という意味でも、開発者がこのフレームワークを選ぶか選ばないかという判断がしやすくなる

といった理由が上げられる。

Chat: 整理

ChatはGalleryとして用意して、内部で使っている要素をコンポーネントにする

  • message-content: Balloonとしてコンポーネント化する
  • message-share: Galleryとして用意する
  • message-image: 未定
  • chat-date: 未定

StorybookでInvalid DOM property~と表示されることがある

ブラウザの下記のWarningが表示されている

react-dom.development.js:88 Warning: Invalid DOM property `class`. Did you mean `className`?
    in i (created by MDXCreateElement)
    in MDXCreateElement (created by MDXContent)
    in wrapper (created by MDXCreateElement)
    in MDXCreateElement (created by MDXContent)
    in MDXContent (created by page)
    in AddContext (created by page)
    in page
    in div (created by Context.Consumer)
    in Styled(div) (created by DocsContainer)
    in div (created by Context.Consumer)
    in Styled(div) (created by DocsContainer)
    in MDXProvider (created by DocsContainer)
    in ThemeProvider (created by DocsContainer)
    in SourceContainer (created by DocsContainer)
    in DocsContainer

Originally posted by @Hidetaro7 in #79 (review)

Primary Colorの定義がおかしい

image

500が600より暗い。
そもそもどのような経緯で定義を行ってきたのかを忘れているので、再度、カラーの確認をして、ここにメモを残す。

開発フローについて

現在 hideki-trial に随時新しいコミットが入っていっていますが、レビューと新規のコミットがいたちごっごのようになり取り扱いにくく感じています。

そこで

  • develop ブランチを作る
  • 現在の hideki-trial の差分は main ブランチではなく develop ブランチにマージ
  • develop ブランチをベースブランチとして、各コンポーネントの粒度でプルリクエストにする
  • issueに対応する作業は(可能な範囲で)個別にプルリクエストにする

という方針をとることでプルリクエストが大きくなりすぎず課題解決していけると考えます。いかがでしょうか @Hidetaro7

WAI-ARIAについての取り決め

#39 に関係するのだが、どこまで実装するべきか一定のルールは決めておきたい。

無理に利用する必要はないと言われているし、WAI-ARIAの仕様も広いしやりだしたらキリがないほど冗長になる。
個人的には必要最低限、例えばaria-selectedなど、状態管理が必須な場合cssクラスで識別しない方法としては有用だと思うがその他の利用についても確認しておきたい。

aria-role : テキスト

役割を示す。例えば <nav>...</nav><div role="navigation">...</div>は同じ役割として認識される。
ナビゲーションが目的ならnav要素で良いが、HTML要素を詳細に要素名で役割を認識させるには限界があるため、roleがその役割を担う。
SVGにalt属性が存在しないため、altの代替としても利用可能。

buttonのようなコンポーネントまで付与するべきか?現在、icon-buttonおよびtabsに使っているが強い理由はない。
他の有名フレームワーク(Bootstrap, Bulma, Ant Design)を見ると、buttonに使っているケースは見受けられない。

aria-selected : boolean

選択状態を示す、従来はclass="is-xxxx"として使っていたが、それよりは価値が高いと感じるのでこちらは積極的に使っていきたい。

aria-controls : id名

ID識別子を付与して、他要素との関連付けを行う。
例えばタブやモーダルウインドウなど、ボタンに対してコントロールしたい要素に紐付けるなど。

現状、tabsで使っている。

aria-current : boolean

サイト内の現在地が自分自身だった場合などに使用する。

aria-busy : boolean

何かを処理中、例えば非同期ローディングなどをしめす

Storyのmdx形式への移行

TODO: 移行するStoryのリストアップ

  • Accordion
  • Avatar
  • Badge
  • Balloon
  • BoxedTab
  • Button
  • Card
  • Chat
  • FilledTag
  • IconButton
  • Input
  • Introduction
  • LabeledLikeButton
  • LikeButton
  • LoadingCard
  • LoginCard
  • OutlinedButton
  • ProfileCard
  • Select
  • SignUpCard
  • Spinner
  • Tab
  • Tag
  • TextButton
  • Textarea
  • ToggleSwitch

{,Outlined,Text}Button: デフォルトのパディング

ボタン内の文字数によって適切に感じるパディングが変わってくるように思います。

たとえば、現状のStorybook上のボタンは「ボタン」という文字なので、特に左右に多めにパディングが必要ですが、もう少し長い文字数であれば異なるパディングが必要ではないでしょうか。

image

https://github.com/tuqulore/tuqulore-ui/blob/6dbffb7ed1a19aa6db9d627bd06ed3f539dbeda3/packages/tailwindcss/lib/buttonStyle.js#L8

どのように対処するとよいかから議論させてください。

テンプレートリテラル内のマークアップを整形する

prettierのembeddedLanguageFormattingを有効にしたが、 "html``" のようなタグテンプレート内でしか整形されないことが分かった。

  • タグテンプレートに用いるhtmlを定義するか、定義済みのものがあれば利用する

https://prettier.io/blog/2020/08/24/2.1.0.html#add---embedded-language-formattingautooff-option-7875httpsgithubcomprettierprettierpull7875-by-bakkothttpsgithubcombakkot-8825httpsgithubcomprettierprettierpull8825-by-fiskerhttpsgithubcomfisker

  • Accordion
  • Avatar
  • Badge
  • Balloon
  • BoxedTab
  • Button
  • Card
  • Chat
  • FilledTag
  • IconButton
  • Input
  • Introduction
  • LabeledLikeButton
  • LikeButton
  • LoadingCard
  • LoginCard
  • OutlinedButton
  • ProfileCard
  • Select
  • SignUpCard
  • Spinner
  • Tab
  • Tag
  • TextButton
  • Textarea
  • ToggleSwitch

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.