-
Notifications
You must be signed in to change notification settings - Fork 310
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add: BPM・拍子変更機能を追加 #2303
Merged
Merged
Add: BPM・拍子変更機能を追加 #2303
Changes from all commits
Commits
Show all changes
138 commits
Select commit
Hold shift + click to select a range
b053319
Add: 右クリックメニューを追加
sevenc-nanashi f548b90
Add: ダイアログを仮置き
sevenc-nanashi 98bfb09
Add: ある程度Storyを追加
sevenc-nanashi 7926faf
Delete: 未使用のimportを削除
sevenc-nanashi cb2d29e
Add: 削除周りの制御を追加
sevenc-nanashi 4566a67
Add: ルーラーの表示を追加
sevenc-nanashi d861b88
Add: ルーラーの表示をクリックできるように
sevenc-nanashi 29b5bfa
Add: ツールバーで設定出来るように
sevenc-nanashi 6bd2460
Add: SequencerGridを複数拍子に対応
sevenc-nanashi ae30925
Add: SequencerRulerを複数拍子に対応
sevenc-nanashi 5d50cb9
Refactor: Container/Presentationに分離
sevenc-nanashi a2c2d57
Add: Storyを追加
sevenc-nanashi 8d88b6e
Change: uiLockedをpropsで渡せるようにする
sevenc-nanashi 756971a
Add: テストの痕跡を追加
sevenc-nanashi b4d703e
Refactor: SequencerGridをContainer/Presentationに分離
sevenc-nanashi 9131b71
Add: SequencerGridのStoryを追加
sevenc-nanashi baeb8b2
Delete: 複数拍子に対応したので削除
sevenc-nanashi e0d3090
Fix: パスを修正
sevenc-nanashi d5da914
Add: Storyを追加
sevenc-nanashi b0ce215
Change: 縦方向に制限する
sevenc-nanashi dce8a41
Merge: upstream/main -> add/multiple-bpm
sevenc-nanashi 25e694f
[update snapshots]
sevenc-nanashi 74e95b9
(スナップショットを更新)
github-actions[bot] 7458135
Delete: 異物混入を消す
sevenc-nanashi 7d5df06
Delete: デバッグの残骸を削除
sevenc-nanashi 0d56fa9
Merge: upstream/main -> add/multiple-bpm
sevenc-nanashi 9c2e259
Update: スナップショットを更新
sevenc-nanashi 99c1cb4
(スナップショットを更新)
github-actions[bot] 5197afa
Merge: main -> add/multiple-bpm
sevenc-nanashi 97b0685
Change: ContextMenuをDIする
sevenc-nanashi efa1580
[update snapshots]
sevenc-nanashi a10557d
Fix: skip-screenshotをつける
sevenc-nanashi d9c51bd
(スナップショットを更新)
github-actions[bot] a8da727
Merge: main -> add/multiple-bpm
sevenc-nanashi 2207396
Merge: origin/add/multiple-bpm -> add/multiple-bpm
sevenc-nanashi 5709fd1
Fix: playheadPosition -> playheadTicks
sevenc-nanashi 3f47c2a
Change: Dot記法にする
sevenc-nanashi 33c3b6a
Fix: スナップ線が出ていなかったのを修正
sevenc-nanashi 3237f60
Fix: Storybookが壊れてたのを修正
sevenc-nanashi 512f7b3
Add: snapTypeを指定
sevenc-nanashi e1f1b76
Change: フォーマットを変える
sevenc-nanashi c94506f
Change: gridPatternsに色々入れる
sevenc-nanashi 28c7429
Change: atを使う
sevenc-nanashi ae32da6
Change: tickToMeasureNumberを使う
sevenc-nanashi bd6e125
Change: patternの計算を修正
sevenc-nanashi a342a17
Improve: Ruler側も良い感じにする
sevenc-nanashi 24eea03
Change: measureWidthにする
sevenc-nanashi 4798205
Fix: deepを外す
sevenc-nanashi 26a910e
Delete: beatsPerMeasure()を削除
sevenc-nanashi e2ca101
Refactor: 書き方を変える
sevenc-nanashi c81cd59
Code: last -> current
sevenc-nanashi 1260cc0
Delete: ヘッダーを消す
sevenc-nanashi 4193ba3
Change: externally taggedにする
sevenc-nanashi 9ff6b8e
Change: テンポ/拍子のダイアログを分ける
sevenc-nanashi 4a432db
Fix: 使われてないスナップショットを削除するように
sevenc-nanashi d2dd39a
(スナップショットを更新)
github-actions[bot] 0328e53
Fix: 削除できるように
sevenc-nanashi 8e37449
Fix: Linterの怒られを修正
sevenc-nanashi 1aacc8e
Change: findを使う
sevenc-nanashi 3bc6e06
Add: 良い感じにたたむように
sevenc-nanashi 9a88f33
Code: コメントを追加
sevenc-nanashi 746a759
Change: スナップ線の位置を変える
sevenc-nanashi 41ec1ea
Improve: BPMのツールチップの表示を変える
sevenc-nanashi 1a0d7bb
Add: BPM/拍子のヘッダーを追加
sevenc-nanashi 4d740ad
Merge: upstream/main -> add/multiple-bpm
sevenc-nanashi 3583f01
Fix: tempoChangeの指定を修正
sevenc-nanashi 3ba5267
Change: item !== falseで判別するように
sevenc-nanashi da37160
Code: prettierにしたがう
sevenc-nanashi 4a7eff5
Fix: soft tabにする
sevenc-nanashi 1b44bb0
Change: BPM -> テンポ
sevenc-nanashi c1c62d1
Code: フォーマット
sevenc-nanashi 8a88804
Delete: 不要なWorkaroundを削除
sevenc-nanashi dccac33
(スナップショットを更新)
github-actions[bot] 696dd50
Change: テキストのスタイルを取得する
sevenc-nanashi 969932f
Add: フォールバックを追加
sevenc-nanashi 197590e
Fix: ESLintを無効化する
sevenc-nanashi 6401377
Merge: upstream/main -> add/multiple-bpm
sevenc-nanashi 322886c
Fix: ロガーが反転してるのを直す
sevenc-nanashi 5003b30
Improve: キャッシュを追加
sevenc-nanashi 48282a9
Codd: undefinedチェックということを明示
sevenc-nanashi f5ceae7
Merge branch 'main' into add/multiple-bpm
sevenc-nanashi 808260a
Update: ロックファイルを更新
sevenc-nanashi e95a8ee
Merge: main -> add/multiple-bpm
sevenc-nanashi aae9a55
Code: 細かい整理
sevenc-nanashi c62e263
Merge: upstream/main -> add/multiple-bpm
sevenc-nanashi 6441c05
Refactor: useSequencerGridに切り出し
sevenc-nanashi 23a32e1
Change: ズームのControlをrangeにする
sevenc-nanashi 5629018
[update snapshots]
sevenc-nanashi 6358093
(スナップショットを更新)
github-actions[bot] 27bfe0e
Delete: 使ってなかった残骸を削除
sevenc-nanashi dc08dc1
Change: ダイアログを小さく
sevenc-nanashi 9ea16a7
Change: QInputにする
sevenc-nanashi a362f3a
Code: 不要なimportを消す
sevenc-nanashi 339d025
Code: 不要なcomputedを削除
sevenc-nanashi 401b9f2
[updatesn apshots]
sevenc-nanashi 30d4425
[update snapshots]
sevenc-nanashi 9414e41
(スナップショットを更新)
github-actions[bot] 61055ca
Merge: main -> add/multiple-bpm
sevenc-nanashi fbc6783
Change: slotを使わないようにする
sevenc-nanashi b8ba733
Fix: slotsを消す
sevenc-nanashi 646d82d
Delete: 使ってないimportを消す
sevenc-nanashi 256a4a9
Code: TempoOrTimeSignatureChange -> ValueChange
sevenc-nanashi 56c483f
Update: スナップショットを更新
sevenc-nanashi 2a5126f
(スナップショットを更新)
github-actions[bot] ae63e1e
Code: TextWidthCacheKeyをbranded stringにする
sevenc-nanashi 19fd5cf
Delete: ホバー周りを一旦消す
sevenc-nanashi cd6ae0c
Fix: titleを直す
sevenc-nanashi ab3438a
Merge: upstream/main -> add/multiple-bpm
sevenc-nanashi c22b92b
Delete: 使ってないダイアログ周りの画像を消す
sevenc-nanashi 571b51f
Code: beatWidthをprivateにする
sevenc-nanashi c86387e
Code: getSnappedTickFromOffsetXに切り出す
sevenc-nanashi 3a91677
Fix: キャンセルボタンの色を直す
sevenc-nanashi 7f3ce9a
(スナップショットを更新)
github-actions[bot] bde0577
Change: -bg -> -background
sevenc-nanashi 403e18c
Change: dummyをなくす
sevenc-nanashi 8464616
Code: showDialog -> showValueChangeDialog
sevenc-nanashi 7d2cb3f
Update: スナップショットを更新
sevenc-nanashi c491cef
(スナップショットを更新)
github-actions[bot] 605f766
Delete: 使ってない属性を消す
sevenc-nanashi 4a1352a
Code: textPadding -> valueChangeTextPadding
sevenc-nanashi cd235ae
Delete: displayTypeを一旦消す
sevenc-nanashi 0fbd54e
Change: asを使わない
sevenc-nanashi e327c64
Code: ファイル概要を追加
sevenc-nanashi 554bae1
Update: スナップショットを更新
sevenc-nanashi b9e49e6
Merge: main -> add/multiple-bpm
sevenc-nanashi f698fd5
Update: スナップショットを更新
sevenc-nanashi d97d56f
Merge branch 'main' into add/multiple-bpm
sevenc-nanashi 9e0509f
Update: スナップショットを更新
sevenc-nanashi c73142b
(スナップショットを更新)
github-actions[bot] 847c9d3
Change: 現在の値をデフォルトにする
sevenc-nanashi e196121
Update: スナップショットを作り直す
sevenc-nanashi b181461
Refactor: contextMenuDataを分解する
sevenc-nanashi f5f4fc3
[update snapshots]
Hiroshiba b601ba5
Merge: upstream/main -> add/multiple-bpm
sevenc-nanashi c475f8c
Fix: package-lock.jsonを再構築
sevenc-nanashi 83305c6
Fix: diff取得を修正
sevenc-nanashi 94bc949
(スナップショットを更新)
github-actions[bot] fafb08d
Update src/components/Sing/SequencerRuler/Presentation.vue
Hiroshiba File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
<!-- | ||
テンポや拍子などを変更・追加するためのダイアログ | ||
--> | ||
<template> | ||
sevenc-nanashi marked this conversation as resolved.
Show resolved
Hide resolved
|
||
<QDialog ref="dialogRef" v-model="modelValue"> | ||
<QCard class="q-py-sm q-px-md dialog-card"> | ||
<QCardSection> | ||
<div class="text-h5"> | ||
{{ props.title }} | ||
</div> | ||
</QCardSection> | ||
|
||
<QSeparator /> | ||
|
||
<QCardSection> | ||
<QCardActions> | ||
<div>{{ props.name }}</div> | ||
<QSpace /> | ||
<slot /> | ||
</QCardActions> | ||
</QCardSection> | ||
|
||
<QSeparator /> | ||
|
||
<QCardActions> | ||
<QSpace /> | ||
<QBtn | ||
unelevated | ||
label="キャンセル" | ||
color="surface" | ||
textColor="display" | ||
class="text-no-wrap text-bold q-mr-sm" | ||
@click="handleCancel" | ||
/> | ||
<QBtn | ||
unelevated | ||
:label="okText" | ||
color="primary" | ||
textColor="display-on-primary" | ||
class="text-no-wrap text-bold q-mr-sm" | ||
@click="handleOk" | ||
/> | ||
</QCardActions> | ||
</QCard> | ||
</QDialog> | ||
</template> | ||
|
||
<script setup lang="ts"> | ||
import { useDialogPluginComponent } from "quasar"; | ||
import { computed } from "vue"; | ||
|
||
const { dialogRef, onDialogOK, onDialogCancel } = useDialogPluginComponent(); | ||
|
||
const modelValue = defineModel<boolean>(); | ||
const props = defineProps<{ | ||
title: string; | ||
mode: "add" | "edit"; | ||
name: string; | ||
}>(); | ||
defineSlots<{ | ||
default(props: Record<string, never>): void; | ||
}>(); | ||
|
||
defineEmits({ | ||
...useDialogPluginComponent.emitsObject, | ||
}); | ||
|
||
const okText = computed(() => | ||
props.mode === "edit" ? "変更する" : "追加する", | ||
); | ||
|
||
const handleOk = () => { | ||
onDialogOK(); | ||
}; | ||
|
||
const handleCancel = () => { | ||
onDialogCancel(); | ||
modelValue.value = false; | ||
}; | ||
</script> | ||
|
||
<style scoped lang="scss"> | ||
.dialog-card { | ||
width: 400px; | ||
max-width: 40vw; | ||
} | ||
|
||
.value-input { | ||
width: 60px; | ||
} | ||
</style> |
103 changes: 103 additions & 0 deletions
103
src/components/Sing/ChangeValueDialog/TempoChangeDialog.stories.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
import { userEvent, within, expect, fn } from "@storybook/test"; | ||
import { Meta, StoryObj } from "@storybook/vue3"; | ||
import TempoChangeDialog from "./TempoChangeDialog.vue"; | ||
import { DEFAULT_BPM } from "@/sing/domain"; | ||
|
||
const meta: Meta<typeof TempoChangeDialog> = { | ||
component: TempoChangeDialog, | ||
args: { | ||
modelValue: true, | ||
tempoChange: { | ||
bpm: DEFAULT_BPM, | ||
}, | ||
mode: "add", | ||
|
||
onOk: fn(), | ||
onHide: fn(), | ||
}, | ||
tags: ["!autodocs"], // ダイアログ系はautodocsのプレビューが正しく表示されないので無効化 | ||
}; | ||
|
||
export default meta; | ||
type Story = StoryObj<typeof meta>; | ||
|
||
export const CreateOpened: Story = { | ||
name: "開いている:追加", | ||
args: { | ||
modelValue: true, | ||
mode: "add", | ||
}, | ||
}; | ||
export const ChangeOpened: Story = { | ||
name: "開いている:変更", | ||
args: { | ||
modelValue: true, | ||
tempoChange: { | ||
bpm: 120, | ||
}, | ||
mode: "edit", | ||
}, | ||
}; | ||
|
||
export const ClickOk: Story = { | ||
name: "OKボタンを押す:追加", | ||
args: { ...CreateOpened.args }, | ||
play: async ({ args }) => { | ||
const canvas = within(document.body); // ダイアログなので例外的にdocument.bodyを使う | ||
|
||
const input = canvas.getByLabelText("テンポ"); | ||
await userEvent.clear(input); | ||
await userEvent.type(input, "100"); | ||
|
||
const button = canvas.getByRole("button", { name: /追加する/ }); | ||
await userEvent.click(button); | ||
|
||
await expect(args["onOk"]).toBeCalledWith({ | ||
tempoChange: { | ||
bpm: 100, | ||
}, | ||
}); | ||
}, | ||
}; | ||
|
||
export const ClickDelete: Story = { | ||
name: "OKボタンを押す:編集", | ||
args: { ...ChangeOpened.args }, | ||
play: async ({ args }) => { | ||
const canvas = within(document.body); // ダイアログなので例外的にdocument.bodyを使う | ||
|
||
const input = canvas.getByLabelText("テンポ"); | ||
await userEvent.clear(input); | ||
await userEvent.type(input, "100"); | ||
|
||
const button = canvas.getByRole("button", { name: /変更する/ }); | ||
await userEvent.click(button); | ||
|
||
await expect(args["onOk"]).toBeCalledWith({ | ||
tempoChange: { | ||
bpm: 100, | ||
}, | ||
}); | ||
}, | ||
}; | ||
|
||
export const CancelClose: Story = { | ||
name: "キャンセルボタンを押す", | ||
args: { ...ChangeOpened.args }, | ||
play: async ({ args }) => { | ||
const canvas = within(document.body); // ダイアログなので例外的にdocument.bodyを使う | ||
|
||
const button = canvas.getByRole("button", { name: /キャンセル/ }); | ||
await userEvent.click(button); | ||
|
||
await expect(args["onOk"]).not.toBeCalled(); | ||
}, | ||
}; | ||
|
||
export const Closed: Story = { | ||
name: "閉じている", | ||
tags: ["skip-screenshot"], | ||
args: { | ||
modelValue: false, | ||
}, | ||
}; |
44 changes: 44 additions & 0 deletions
44
src/components/Sing/ChangeValueDialog/TempoChangeDialog.vue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
<template> | ||
<CommonDialog | ||
v-model="modelValue" | ||
:title="props.mode === 'add' ? 'テンポの追加' : 'テンポの編集'" | ||
name="テンポ" | ||
:mode="props.mode" | ||
@ok="() => $emit('ok', { tempoChange })" | ||
@hide="() => $emit('hide')" | ||
> | ||
<QInput | ||
v-model.number="tempoChange.bpm" | ||
type="number" | ||
dense | ||
hideBottomSpace | ||
class="value-input" | ||
aria-label="テンポ" | ||
/> | ||
</CommonDialog> | ||
</template> | ||
|
||
<script setup lang="ts"> | ||
import { QInput, useDialogPluginComponent } from "quasar"; | ||
import { ref } from "vue"; | ||
import CommonDialog from "./CommonDialog.vue"; | ||
import { Tempo } from "@/store/type"; | ||
import { cloneWithUnwrapProxy } from "@/helpers/cloneWithUnwrapProxy"; | ||
const modelValue = defineModel<boolean>(); | ||
const props = defineProps<{ | ||
tempoChange: Omit<Tempo, "position">; | ||
mode: "add" | "edit"; | ||
}>(); | ||
defineEmits({ | ||
...useDialogPluginComponent.emitsObject, | ||
}); | ||
const tempoChange = ref(cloneWithUnwrapProxy(props.tempoChange)); | ||
</script> | ||
|
||
<style scoped lang="scss"> | ||
.value-input { | ||
width: 60px; | ||
} | ||
</style> |
107 changes: 107 additions & 0 deletions
107
src/components/Sing/ChangeValueDialog/TimeSignatureChangeDialog.stories.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
import { userEvent, within, expect, fn } from "@storybook/test"; | ||
import { Meta, StoryObj } from "@storybook/vue3"; | ||
import TimeSignatureChangeDialog from "./TimeSignatureChangeDialog.vue"; | ||
import { DEFAULT_BEAT_TYPE, DEFAULT_BEATS } from "@/sing/domain"; | ||
|
||
const meta: Meta<typeof TimeSignatureChangeDialog> = { | ||
component: TimeSignatureChangeDialog, | ||
args: { | ||
modelValue: true, | ||
timeSignatureChange: { | ||
beats: DEFAULT_BEATS, | ||
beatType: DEFAULT_BEAT_TYPE, | ||
}, | ||
mode: "add", | ||
|
||
onOk: fn(), | ||
onHide: fn(), | ||
}, | ||
tags: ["!autodocs"], // ダイアログ系はautodocsのプレビューが正しく表示されないので無効化 | ||
}; | ||
|
||
export default meta; | ||
type Story = StoryObj<typeof meta>; | ||
|
||
export const CreateOpened: Story = { | ||
name: "開いている:追加", | ||
args: { | ||
modelValue: true, | ||
mode: "add", | ||
}, | ||
}; | ||
export const ChangeOpened: Story = { | ||
name: "開いている:変更", | ||
args: { | ||
modelValue: true, | ||
timeSignatureChange: { | ||
beats: 4, | ||
beatType: 4, | ||
}, | ||
mode: "edit", | ||
}, | ||
}; | ||
|
||
export const ClickOk: Story = { | ||
name: "OKボタンを押す:追加", | ||
args: { ...CreateOpened.args }, | ||
play: async ({ args }) => { | ||
const canvas = within(document.body); // ダイアログなので例外的にdocument.bodyを使う | ||
|
||
const input = canvas.getByLabelText("拍子の分子"); | ||
await userEvent.clear(input); | ||
await userEvent.type(input, "3"); | ||
|
||
const button = canvas.getByRole("button", { name: /追加する/ }); | ||
await userEvent.click(button); | ||
|
||
await expect(args["onOk"]).toBeCalledWith({ | ||
timeSignatureChange: { | ||
beats: 3, | ||
beatType: 4, | ||
}, | ||
}); | ||
}, | ||
}; | ||
|
||
export const ClickDelete: Story = { | ||
name: "OKボタンを押す:編集", | ||
args: { ...ChangeOpened.args }, | ||
play: async ({ args }) => { | ||
const canvas = within(document.body); // ダイアログなので例外的にdocument.bodyを使う | ||
|
||
const input = canvas.getByLabelText("拍子の分子"); | ||
await userEvent.clear(input); | ||
await userEvent.type(input, "6"); | ||
|
||
const button = canvas.getByRole("button", { name: /変更する/ }); | ||
await userEvent.click(button); | ||
|
||
await expect(args["onOk"]).toBeCalledWith({ | ||
timeSignatureChange: { | ||
beats: 6, | ||
beatType: 4, | ||
}, | ||
}); | ||
}, | ||
}; | ||
|
||
export const CancelClose: Story = { | ||
name: "キャンセルボタンを押す", | ||
args: { ...ChangeOpened.args }, | ||
play: async ({ args }) => { | ||
const canvas = within(document.body); // ダイアログなので例外的にdocument.bodyを使う | ||
|
||
const button = canvas.getByRole("button", { name: /キャンセル/ }); | ||
await userEvent.click(button); | ||
|
||
await expect(args["onOk"]).not.toBeCalled(); | ||
}, | ||
}; | ||
|
||
export const Closed: Story = { | ||
name: "閉じている", | ||
tags: ["skip-screenshot"], | ||
args: { | ||
modelValue: false, | ||
}, | ||
}; |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(ただのコメントです)
! これで行けるということは、たぶん
git add
の方いらない気がしますね!