bootstrap5-rails-extensions 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef22d282b16beda6e45198696a5a195bd7b1c8fec2194d0a800feac98250241c
4
- data.tar.gz: 6688cd5525b52bc6fff9eac91ce4f34c0bad6485ff7e44f5e6fef9947d52e213
3
+ metadata.gz: 30a517635c440866d05eda8f9f78979f717adde81302f6eb1b3b66c22b1af387
4
+ data.tar.gz: 0d48465a221310005e798f3cde5eb6bd39056f648e2bc7f223006276612dd63d
5
5
  SHA512:
6
- metadata.gz: 818f330d8adbf842416ea5f326ab16b6e8521d32291351cbe327ee2a5de12afa7a92817fac300f5a389e23561d749a4011e732b6b83b6b066c12250d29810db5
7
- data.tar.gz: e8e7e38011baabc19fedea102432a44f760f7998d14d0c7d505a78a712d3899b381a766705c6c59462852abbb4e9b4bc869a42562258a6ecee34c666c5bc6c38
6
+ metadata.gz: 3b34f3cac3a7ad697339af4fd3b26d39d237c5d8bc4773ae541241149aae114b52155efd9fc9a11cc56371785d72f955f741f41f4fbbd40a13c43752971c91b2
7
+ data.tar.gz: 36dcccba7e84efb6245546fca6f344b42cab12b3203ab8df51c30dda285436661e345dca139d02179cbd9d79f6dfa6e2eda6e8248e31967d58ad5e21d472baf0
data/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ # CHANGELOG
2
+
3
+ ## 0.3.0 - 2025-10-06
4
+ - StimulusコントローラをGemから切り離し、npmパッケージ`bootstrap5-rails-extensions-js`として提供するようにしました。
5
+ - 利用者は各コントローラを直接`application.register`で登録する構成に変更しました。
6
+
7
+ ## 0.1.1
8
+ - 初期リリースです。
@@ -0,0 +1,22 @@
1
+ # CODE OF CONDUCT
2
+
3
+ ## 目的
4
+ - 本プロジェクトに関わるすべての方が安心して協力できる環境を維持することを目的としています。
5
+
6
+ ## 行動指針
7
+ - 互いを敬意をもって扱い、思いやりのある言動を心がけてください。
8
+ - 建設的なフィードバックを行い、個人攻撃や誹謗中傷を避けてください。
9
+ - 異なる意見や経験を尊重し、多様性を歓迎してください。
10
+
11
+ ## 禁止事項
12
+ - いかなる形であれハラスメント、差別的発言、脅迫行為を行わないでください。
13
+ - 公共の場に適さないコンテンツを共有しないでください。
14
+
15
+ ## 報告方法
16
+ - 行動規範に反する事案を確認した場合は、可能な限り詳細な情報を添えてメンテナへご連絡ください。
17
+
18
+ ## 適用範囲
19
+ - この行動規範は、オンラインおよびオフラインを問わず、本プロジェクトに関連するすべての活動に適用されます。
20
+
21
+ ## 改訂
22
+ - 本行動規範は必要に応じて更新します。更新が行われた場合は、本リポジトリで周知します。
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bootstrap5-rails-extensions (0.1.1)
4
+ bootstrap5-rails-extensions (0.3.0)
5
5
  rails (>= 8.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Bootstrap5 Rails Extensions(Rails Engine)
2
2
 
3
- RailsアプリケーションでBootstrap 5をTurbo/Stimulusと併用しやすくするための拡張を提供します。モーダルやオフキャンバス、カード、テーブル、トースト向けのDSLヘルパーと、対応するStimulusコントローラを同梱しています。
3
+ RailsアプリケーションでBootstrap 5をTurbo/Stimulusと併用しやすくするための拡張を提供します。モーダルやオフキャンバス、カード、テーブル、トースト向けのDSLヘルパーと、対応するStimulusコントローラを別途配布するnpmパッケージと連携して利用します。
4
4
 
5
5
  ## インストール
6
6
 
@@ -16,11 +16,12 @@ gem "bootstrap5-rails-extensions"
16
16
 
17
17
  ### Stimulusコントローラの登録
18
18
 
19
- Importmapをご利用の場合は、エンジンが提供するコントローラ群をpinしてください。
19
+ Stimulusコントローラは npm パッケージ `bootstrap5-rails-extensions-js` から提供します。あらかじめインストールしてください。
20
20
 
21
- ```ruby
22
- # config/importmap.rb
23
- pin_all_from "bootstrap5_rails_extensions", under: "bootstrap5_rails_extensions"
21
+ ```bash
22
+ npm install bootstrap5-rails-extensions-js
23
+ # または
24
+ yarn add bootstrap5-rails-extensions-js
24
25
  ```
25
26
 
26
27
  Stimulusアプリケーションへの登録例です。
@@ -28,17 +29,20 @@ Stimulusアプリケーションへの登録例です。
28
29
  ```javascript
29
30
  // app/javascript/controllers/index.js
30
31
  import { application } from "./application"
31
-
32
- import ModalController from "bootstrap5_rails_extensions/modal_controller"
33
- import OffcanvasController from "bootstrap5_rails_extensions/offcanvas_controller"
34
- import ToastController from "bootstrap5_rails_extensions/toast_controller"
32
+ import {
33
+ ModalController,
34
+ OffcanvasController,
35
+ ToastController,
36
+ } from "bootstrap5-rails-extensions-js"
35
37
 
36
38
  application.register("modal", ModalController)
37
39
  application.register("offcanvas", OffcanvasController)
38
40
  application.register("toast", ToastController)
39
41
  ```
40
42
 
41
- ESBuildやViteなどを利用している場合も、同様にコントローラをインポートして登録してください。
43
+ 必要なコントローラーのみを選択的にインポートし、任意の識別子で`application.register`を呼び出すことも可能です。
44
+
45
+ Importmapをご利用の場合は、`./bin/importmap pin bootstrap5-rails-extensions-js` を実行した上で同様に読み込んでください。
42
46
 
43
47
  ### トースト用コンテナの設置
44
48
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bootstrap5RailsExtensions
4
- VERSION = "0.1.1"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootstrap5-rails-extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dreaw Inc.
@@ -32,6 +32,8 @@ extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
34
  - ".gitignore"
35
+ - CHANGELOG.md
36
+ - CODE_OF_CONDUCT.md
35
37
  - Gemfile
36
38
  - Gemfile.lock
37
39
  - LICENSE.txt
@@ -42,9 +44,6 @@ files:
42
44
  - app/helpers/bootstrap5_rails_extensions/offcanvas_helper.rb
43
45
  - app/helpers/bootstrap5_rails_extensions/table_helper.rb
44
46
  - app/helpers/bootstrap5_rails_extensions/toast_helper.rb
45
- - app/javascript/bootstrap5_rails_extensions/modal_controller.js
46
- - app/javascript/bootstrap5_rails_extensions/offcanvas_controller.js
47
- - app/javascript/bootstrap5_rails_extensions/toast_controller.js
48
47
  - app/views/bootstrap5_rails_extensions/_modal.html.erb
49
48
  - app/views/bootstrap5_rails_extensions/_offcanvas.html.erb
50
49
  - app/views/bootstrap5_rails_extensions/_toast.html.erb
@@ -1,88 +0,0 @@
1
- import { Controller } from "@hotwired/stimulus"
2
- import { Modal } from "bootstrap"
3
-
4
- // Stimulusコントローラー(Bootstrap.Modalの薄いラッパー)
5
- //
6
- // 目的:
7
- // - 画面上の任意のトリガーで、モーダルのオープンとTurbo Frameの読み込みを同時に制御する
8
- // 契約:
9
- // - トリガー属性:
10
- // data-modal-target="#modalId" // 開きたいモーダルのセレクタ(必須)
11
- // data-turbo-frame="frameId" // Turbo FrameのID(指定時はTurboに任せて読み込み)
12
- // href // 読み込むURL(任意。未指定ならフレーム読み込みはスキップ)
13
- // 備考:
14
- // - Bootstrapのdata APIと競合させないため、documentのcapture段階で先取りして手動でshow()する
15
- export default class extends Controller {
16
- static targets = ["form"]
17
-
18
- connect() {
19
- // この要素自身のモーダルインスタンスを確保
20
- this.modal = Modal.getOrCreateInstance(this.element)
21
-
22
- // 委譲クリックでモーダルを開き、必要ならFrameへ読み込み
23
- // data-modal-target が付いた要素のクリックをフック
24
- this.handleDelegatedClick = (event) => {
25
- const trigger = event.target?.closest?.('[data-modal-target]')
26
- if (!trigger) return
27
-
28
- // 修飾クリックや既に処理済みはスキップ
29
- if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return
30
-
31
- const targetSelector = trigger.getAttribute('data-modal-target')
32
- if (!targetSelector) return
33
-
34
- const targetEl = document.querySelector(targetSelector)
35
- if (!targetEl) return
36
- // 自身が対象モーダルでなければ無視(複数モーダルが同時に存在する場合の重複実行を防止)
37
- if (targetEl !== this.element) return
38
-
39
- // モーダルをプログラムで開く
40
- this.modal.show()
41
- }
42
- // captureでBootstrapのdata APIより先に処理する
43
- document.addEventListener('click', this.handleDelegatedClick, true)
44
-
45
- }
46
-
47
- disconnect() {
48
- document.removeEventListener('click', this.handleDelegatedClick, true)
49
- if (this.modal) {
50
- this.modal.hide()
51
- this.modal.dispose()
52
- this.modal = null
53
- }
54
- }
55
-
56
- // 手動制御用のアクション
57
- open() { this.modal?.show() }
58
- hide(event) {
59
- // Turboイベント以外(クリックなど detail が number)のケースはそのまま閉じる
60
- if (!event?.detail || typeof event.detail === 'number') {
61
- this.modal?.hide()
62
- return
63
- }
64
-
65
- // Turbo submit で失敗 (422) した場合のみ閉じない
66
- if (event.detail.success === false) return
67
-
68
- this.modal?.hide()
69
- }
70
- toggle() { this.modal?.toggle() }
71
-
72
- formSubmit(event) {
73
- event?.preventDefault()
74
-
75
- const form = this.hasFormTarget ? this.formTarget : this.element.querySelector("form")
76
-
77
- if (!form) {
78
- console.warn("[modal] フォームが見つかりませんでした。")
79
- return
80
- }
81
-
82
- if (typeof form.requestSubmit === "function") {
83
- form.requestSubmit()
84
- } else {
85
- form.submit()
86
- }
87
- }
88
- }
@@ -1,62 +0,0 @@
1
- import { Controller } from "@hotwired/stimulus"
2
- import { Offcanvas } from "bootstrap"
3
-
4
- // Stimulusコントローラー(Bootstrap.Offcanvasの薄いラッパー)
5
- //
6
- // 目的:
7
- // - 任意のトリガークリックで「オフキャンバスを開く + Turbo FrameへURLを読み込む」を同時に行う
8
- // 契約:
9
- // - トリガー属性:
10
- // data-offcanvas-target="#offcanvasId" // 開きたいOffcanvasのセレクタ(必須)
11
- // data-turbo-frame="frameId" // Turbo FrameのID(指定時はTurboに任せて読み込み)
12
- // href // 読み込むURL(任意。未指定ならフレーム読み込みはスキップ)
13
- // 備考:
14
- // - Bootstrapのdata APIと競合させないため、documentのcapture段階で先取りして手動でshow()する
15
-
16
- export default class extends Controller {
17
-
18
- connect() {
19
- this.offcanvas = Offcanvas.getOrCreateInstance(this.element)
20
-
21
- // 委譲クリックでオープン+Frame読み込み
22
- this.handleDelegatedClick = (event) => {
23
- const trigger = event.target?.closest?.('[data-offcanvas-target]')
24
- if (!trigger) return
25
-
26
- // 修飾クリック等はスキップ
27
- if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return
28
-
29
- const targetSelector = trigger.getAttribute('data-offcanvas-target')
30
- if (!targetSelector) return
31
-
32
- const targetEl = document.querySelector(targetSelector)
33
- if (!targetEl) return
34
- // 自分のOffcanvas以外宛は無視
35
- if (targetEl !== this.element) return
36
-
37
- // 開く
38
- this.offcanvas.show()
39
- }
40
- document.addEventListener('click', this.handleDelegatedClick, true)
41
-
42
- }
43
-
44
- disconnect() {
45
- document.removeEventListener('click', this.handleDelegatedClick, true)
46
- if (this.offcanvas) {
47
- this.offcanvas.hide()
48
- this.offcanvas.dispose()
49
- this.offcanvas = null
50
- }
51
- }
52
-
53
- open() { this.offcanvas?.show() }
54
- hide(event) {
55
- // Turboイベント以外(クリックなど detail が number)のケースはそのまま閉じる
56
- if (!event?.detail || typeof event.detail === 'number') {
57
- this.modal?.hide()
58
- return
59
- }
60
- }
61
- toggle() { this.offcanvas?.toggle() }
62
- }
@@ -1,31 +0,0 @@
1
- import { Controller } from "@hotwired/stimulus"
2
- import { Toast } from "bootstrap"
3
-
4
- // 単一トースト要素用のシンプルなコントローラー
5
- // 要素自体(.toast)がターゲット。接続時に即showする。
6
- export default class extends Controller {
7
- static values = {
8
- delay: { type: Number, default: 4000 },
9
- autohide: { type: Boolean, default: true },
10
- }
11
-
12
- connect() {
13
- this.toast = Toast.getOrCreateInstance(this.element, {
14
- autohide: this.autohideValue,
15
- delay: this.delayValue,
16
- })
17
- this.toast.show()
18
-
19
- // Turboキャッシュ前に破棄
20
- this.beforeCache = () => {
21
- try { this.toast?.hide(); this.toast?.dispose() } catch (_) {}
22
- }
23
- document.addEventListener("turbo:before-cache", this.beforeCache)
24
- }
25
-
26
- disconnect() {
27
- document.removeEventListener("turbo:before-cache", this.beforeCache)
28
- try { this.toast?.hide(); this.toast?.dispose() } catch (_) {}
29
- this.toast = null
30
- }
31
- }