解説
アーキテクチャ
パッケージが小さなインポートにどう分かれているか、デザインとは何か、絵がどう作られるか、出力、サイズ、独自性を守る決まりを説明します。
Koyomi Calendarsは、実行時の依存のない、ESモジュールにコンパイルされるふつうのTypeScriptです。設計の原則は、各部分がそれぞれ単独のインポートであることで、パッケージが育っても、小さなアイコンは小さいままです。
インポート
| インポート | ソース | 中身 |
|---|---|---|
@johnmorrisdotca/koyomi-calendars | src/index.ts | 18種類すべてのデザインを持つcalendarIcon、名前、レイアウト、枠、プリセット、日本の暦 |
.../themes/<name> | src/themes/<name>.ts | デザイン1つと、共有の部品だけ |
.../month | src/month.ts | monthCalendar、monthGrid、daysInMonth |
.../animate | src/animate.ts | flipCalendarと日付の補助関数 |
.../names | src/names.ts | デザインの名前、ラベル、別名 |
.../japanese | src/japanese.ts | 祝日、旧暦、六曜 |
デザインとは
デザインは、src/themes/にある1つのファイルで、定義をエクスポートします。描画領域(ボックス)、layout(日付がページのどこに入り、年の領域がどこにあるか。年がある場合とない場合)、draw関数、そして必要に応じて、リングを置く位置、週末のページ、日めくりのページが描く追加データです。デザインがインポートするのは、共有の部品(kit.ts:文字、線で描いた数字、図形)と、日めくりのページならtear.tsだけです。ほかのデザインをインポートするデザインはないので、1つだけを単独でインポートできます。
src/icon.tsには、メインのインポート用の18種類の表があります。src/render.tsは、デザインの絵を完全なSVGにするひとつの関数です。オプションを検証し、Intlで日付の言葉を作り、描き、その結果を枠(frame.ts:枠、リング、傾き)で包み、タイトル、ラベル、roleを付けます。
アイコンができるまで
- オプションを検証し、誤ったものごとに
RangeErrorを投げます。プリセットは、渡されたオプションの下に敷かれるので、自分で渡したものが優先されます。 - 日付の言葉を、ロケールに従って
Intlから作ります(未知のロケールは英語になります)。 - デザインが、それぞれ
data-partを付けた部品を、自分の箱の中に描きます。 - 枠が、頼まれれば円盤の上に載せ、リングを足し、傾けます。
- 結果は、大きさ、
role="img"、title、aria-labelを持つSVGで包まれます。
どの段階も、オプションだけで決まる関数です。ライブラリは時計を読まず、乱数も使わず、入出力もしないので、同じ引数なら同じバイト列を返します。flipCalendarだけが、ページに触れる関数で、それも渡された要素だけです。
リポジトリが守る決まり
- 出力が意図せず変わることはありません。
test/identical.test.tsは、meigen-sports 0.19.2から来た最初の17のデザインについて、ゴールデンファイルとバイト単位で一致することを保証します。新しいオプションは、それを使わないアイコンの出力を変えません。 - サイズには予算があります。
scripts/check-bytes.tsが各インポートをバンドルし、予算を超えると失敗します。サイズとバンドルを参照してください。 - すべての絵は独自に描いたものです。 公開されている事実から描き、コピーやトレース、ストック素材は使わず、ロゴもなく、デザインの名前に会社名も含みません。
- すべてのデザインに、ライトとダークの2版と、レイアウト(
pageとyearZone)があります。 ほかのデザインと同じ規則を満たすことを、テストで確かめています。 - **ドキュメントは、1ページにつき1言語で、**その中の例は
pnpm test:readmeが実行します。
月間カレンダー
monthCalendarは、monthGridをもとに自前でレイアウトします。monthGridは単純な算術です。7日ずつの週、1日より前の空きマス、グレゴリオ暦のうるう年の規則です。4つのデザインは、同じ表を描く4つの関数です。表はエクスポートされているので、自分のデザインでも描けます。
ページめくり
flipCalendarは、アイコンの中身を1枚のページに置き換え、選ばれためくり方(FLIP_KEYFRAMES)のWeb Animations APIのキーフレームを再生してから、ふつうのアイコンを1つ戻します。続けて呼ぶと、動いているほうはすぐ終わります。動きの軽減のときは、アイコンを入れ替えるだけです。
テスト
pnpm testは単体テストを実行します(ゴールデンとの比較、各デザインのレイアウト、日本の暦、月の日付の表、ドキュメントの言語)。pnpm test:demoはデモをビルドしてChromiumとWebKitで動かし、pnpm test:readmeはREADMEとガイドのすべての例を実行し、pnpm checkはさらに、lint、型チェック、ビルド、パッケージ内容のチェック、バイトの予算の確認も行います。
この日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。