rails_modal_manager 1.0.46 → 1.0.48

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: 7dec9a40ef3da3620d41315569b51f9b0a3ac6a291bdd81edf77ca6271858464
4
- data.tar.gz: 719e56407709affe6b21f781ad92cc5496f3ed1c13de711b6f4cbc3769915910
3
+ metadata.gz: ee19f493f83594ff6e4ff8c8d6ed72ce1015290dfe73b90c7064b8fc589ec516
4
+ data.tar.gz: 3442fbef22b38eb2f2f8bcf7dacf7328d221de6c7dead4f9e6c10b3ff75cdda1
5
5
  SHA512:
6
- metadata.gz: 41af209ea06bad87c813444fe5a4e7ba074d685709d9f1dbf916e5dfbd983120d2445de1436bec01ee7b9d3b675084887824010e7ffce4704df4b0c4d74b3757
7
- data.tar.gz: 14ed339f8138e4e4586f4b13d4fd078e570752bd92f2e7367d2d8c3b128dde332c12f755e7343be703e8810bf5f5f73abe623fbb25ccc740452befa6fc3bca65
6
+ metadata.gz: 8d809ba871b2859b7eaa62eb0cb9dac68b634ba675d5e5966879846a0caea647db95205bef602ac90fecc944d4391e5dd9bf671d71c5aa3cb36c8dd28f6645b3
7
+ data.tar.gz: 54d1785b5431878ae0ed8c7aaa075543a89dc3caf0a0636978d883a10b07332b37025b1ea9ef2c8754332770c5662565b28de02b2cd93ea078c18ab00aba6724
@@ -7,6 +7,27 @@
7
7
  CSS Variables (Light Theme)
8
8
  ============================================ */
9
9
  :root {
10
+ /* OS/브라우저 자동 폼 색상 대응 (input, scrollbar 등) */
11
+ color-scheme: light dark;
12
+
13
+ /* v1.0.48 — Motion 토큰 (기존 --rmm-animation-duration/timing 과 병행) */
14
+ --rmm-dur-fast: 140ms;
15
+ --rmm-dur-base: 220ms;
16
+ --rmm-dur-slow: 360ms;
17
+ --rmm-ease-standard: cubic-bezier(0.2, 0, 0, 1);
18
+ --rmm-ease-emphasized: cubic-bezier(0.3, 0, 0, 1);
19
+ --rmm-ease-decel: cubic-bezier(0, 0, 0, 1);
20
+ --rmm-ease-in: cubic-bezier(0.64, 0, 0.78, 0);
21
+ --rmm-ease-out: cubic-bezier(0.22, 1, 0.36, 1);
22
+
23
+ /* v1.0.48 — 포커스 링 / 드래그 강조 섀도 */
24
+ --rmm-ring-color: rgba(59, 130, 246, 0.55);
25
+ --rmm-ring: 0 0 0 2px var(--rmm-modal-bg, #ffffff), 0 0 0 4px var(--rmm-ring-color);
26
+ --rmm-elev-drag:
27
+ 0 4px 8px rgba(0, 0, 0, 0.08),
28
+ 0 24px 48px -12px rgba(0, 0, 0, 0.22),
29
+ 0 48px 96px -32px rgba(0, 0, 0, 0.30);
30
+
10
31
  /* Modal */
11
32
  --rmm-modal-bg: #ffffff;
12
33
  --rmm-modal-border: rgba(0, 0, 0, 0.1);
@@ -159,6 +180,13 @@
159
180
  --rmm-taskbar-bg: #0f172a;
160
181
  --rmm-taskbar-item-bg: rgba(255, 255, 255, 0.1);
161
182
  --rmm-taskbar-item-hover: rgba(255, 255, 255, 0.15);
183
+
184
+ /* v1.0.48 — 다크 테마 ring/elev */
185
+ --rmm-ring-color: rgba(99, 179, 237, 0.65);
186
+ --rmm-elev-drag:
187
+ 0 4px 8px rgba(0, 0, 0, 0.25),
188
+ 0 24px 48px -12px rgba(0, 0, 0, 0.55),
189
+ 0 48px 96px -32px rgba(0, 0, 0, 0.70);
162
190
  }
163
191
 
164
192
  /* ============================================
@@ -214,6 +242,7 @@
214
242
  transform var(--rmm-animation-duration) var(--rmm-animation-timing);
215
243
  overflow: hidden;
216
244
  max-height: 90vh;
245
+ max-height: min(90vh, 90dvh); /* v1.0.48 — iOS 주소창 대응, 미지원 브라우저는 위 값 사용 */
217
246
  }
218
247
 
219
248
  .rmm-modal.rmm-active {
@@ -1736,3 +1765,198 @@
1736
1765
  transform: translate(-50%, -50%) scale(1) !important;
1737
1766
  }
1738
1767
  }
1768
+
1769
+ /* ============================================
1770
+ v1.0.48 — Modernization port (from rails-modal-manager2)
1771
+ ============================================
1772
+ 외부 API/클래스명/옵션은 전혀 바꾸지 않음. 아래 규칙들은 기존 규칙 뒤에
1773
+ 추가되어 시각적 품질만 끌어올림. 문제 발생 시 이 블록만 제거하면 완전 원복.
1774
+ */
1775
+
1776
+ /* 포커스 링: 키보드 탐색 시에만 나타남 (마우스 클릭 시 노출 안 함) */
1777
+ .rmm-modal :focus-visible,
1778
+ .rmm-overlay :focus-visible,
1779
+ .rmm-taskbar :focus-visible {
1780
+ outline: none;
1781
+ box-shadow: var(--rmm-ring);
1782
+ border-radius: 6px;
1783
+ }
1784
+
1785
+ /* 드래그 중 "들림" 효과 — JS가 이미 .rmm-dragging 클래스를 세팅함 */
1786
+ .rmm-modal.rmm-dragging {
1787
+ box-shadow: var(--rmm-elev-drag);
1788
+ transition: box-shadow var(--rmm-dur-fast) var(--rmm-ease-standard);
1789
+ }
1790
+
1791
+ /* Depth 4, 5 자동 확장 — 기존 0~3 팔레트를 바탕으로 더 어둡게 섞어 생성
1792
+ (color-mix 미지원 구형 브라우저는 depth-3 값으로 폴백) */
1793
+ @supports (color: color-mix(in srgb, red, blue)) {
1794
+ :root {
1795
+ --rmm-header-bg-depth-4: color-mix(in srgb, var(--rmm-header-bg-depth-3) 80%, #000 20%);
1796
+ --rmm-header-text-depth-4: var(--rmm-header-text-depth-3);
1797
+ --rmm-header-bg-depth-5: color-mix(in srgb, var(--rmm-header-bg-depth-3) 60%, #000 40%);
1798
+ --rmm-header-text-depth-5: var(--rmm-header-text-depth-3);
1799
+ }
1800
+ .dark {
1801
+ --rmm-header-bg-depth-4: color-mix(in srgb, var(--rmm-header-bg-depth-3) 80%, #000 20%);
1802
+ --rmm-header-bg-depth-5: color-mix(in srgb, var(--rmm-header-bg-depth-3) 60%, #000 40%);
1803
+ }
1804
+ }
1805
+
1806
+ /* prefers-reduced-motion: 사용자가 OS 설정으로 모션 축소를 요청한 경우
1807
+ 모든 트랜지션/애니메이션을 거의 즉시 끝내 접근성 향상 */
1808
+ @media (prefers-reduced-motion: reduce) {
1809
+ .rmm-overlay,
1810
+ .rmm-modal,
1811
+ .rmm-modal *,
1812
+ .rmm-taskbar,
1813
+ .rmm-sidebar,
1814
+ .rmm-submenu,
1815
+ .rmm-content-loader {
1816
+ transition-duration: 0.01ms !important;
1817
+ animation-duration: 0.01ms !important;
1818
+ animation-iteration-count: 1 !important;
1819
+ }
1820
+ }
1821
+
1822
+ /* ============================================
1823
+ v1.0.48 — 애니메이션 고도화 (v2 이식)
1824
+ ============================================
1825
+ v1 의 기존 트랜지션 규칙 자체는 남아 있고, 여기서 **뒤에 오는 규칙으로**
1826
+ duration/easing 만 재정의. 비대칭 이징 적용:
1827
+ · 닫힘(기본 상태) : fast(140ms) + ease-in → 빠르고 깔끔하게 사라짐
1828
+ · 열림(.rmm-active): base(220ms) + ease-emphasized → 부드럽게 나타남
1829
+ · 최소화 : slow(360ms) + ease-emphasized → taskbar 로 천천히 흡수
1830
+ CSS cascade 순서 덕분에 별도 position 분기 오버라이드 없이도 적용됨.
1831
+ */
1832
+ /* Overlay: 열림도 닫힘도 base(220ms) + ease-out — v2 방식.
1833
+ **의도적으로 modal(fast exit) 보다 느리게** 사라지게 해서 배경 잔상이
1834
+ 남아 "잔향" 느낌. 또 기본 blur 를 8px + saturate 로 상향해 배경과의
1835
+ 대비를 강화 (v2 overlay 와 동급). */
1836
+ .rmm-overlay {
1837
+ backdrop-filter: blur(8px) saturate(1.1);
1838
+ -webkit-backdrop-filter: blur(8px) saturate(1.1);
1839
+ transition: opacity var(--rmm-dur-base) var(--rmm-ease-out),
1840
+ visibility var(--rmm-dur-base) var(--rmm-ease-out);
1841
+ }
1842
+ /* 기존 .rmm-overlay-blur 는 더 강하게 — 중첩 모달 분리감 */
1843
+ .rmm-overlay.rmm-overlay-blur {
1844
+ backdrop-filter: blur(16px) saturate(1.2);
1845
+ -webkit-backdrop-filter: blur(16px) saturate(1.2);
1846
+ }
1847
+
1848
+ /* ⚠️ 중요: CSS Transforms L2 스펙상 개별 `scale`/`translate` 는 `transform`
1849
+ 함수보다 **나중에 적용**됨. position-center 는 transform: translate(-50%,-50%)
1850
+ 로 중앙 정렬하는데, 이 상태에서 scale 개별 프로퍼티를 더하면 -50% 계산이
1851
+ 원본 박스 기준으로 유지되어 **열림/닫힘 시 우하단으로 쏠리는 현상** 발생.
1852
+ → scale/translate 개별 프로퍼티를 쓰지 않고, 각 position 의 transform 체인
1853
+ **내부**에 scale()/translateY() 를 포함시켜 중심점 일치 보장.
1854
+ 아래는 position 별 오버라이드. */
1855
+ .rmm-modal {
1856
+ transform-origin: 50% 50%;
1857
+ will-change: transform, opacity;
1858
+ transition: opacity var(--rmm-dur-fast) var(--rmm-ease-in),
1859
+ visibility var(--rmm-dur-fast) var(--rmm-ease-in),
1860
+ transform var(--rmm-dur-fast) var(--rmm-ease-in),
1861
+ box-shadow var(--rmm-dur-base) var(--rmm-ease-out);
1862
+ }
1863
+ .rmm-modal.rmm-active {
1864
+ transition-duration: var(--rmm-dur-base);
1865
+ transition-timing-function: var(--rmm-ease-emphasized);
1866
+ }
1867
+
1868
+ /* Position-aware transform — scale/translateY 를 transform 체인 **내부**에
1869
+ 포함시켜 중심점 쏠림 방지. :not() 필터로 드래그/커스텀위치 상태 제외. */
1870
+ .rmm-modal.rmm-position-center:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1871
+ transform: translate(-50%, -50%) scale(0.94) translateY(14px);
1872
+ }
1873
+ .rmm-modal.rmm-position-center.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1874
+ transform: translate(-50%, -50%) scale(1) translateY(0);
1875
+ }
1876
+
1877
+ .rmm-modal.rmm-position-top:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1878
+ transform: translateX(-50%) scale(0.94) translateY(-14px);
1879
+ }
1880
+ .rmm-modal.rmm-position-top.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1881
+ transform: translateX(-50%) scale(1) translateY(0);
1882
+ }
1883
+
1884
+ .rmm-modal.rmm-position-bottom:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1885
+ transform: translateX(-50%) scale(0.94) translateY(14px);
1886
+ }
1887
+ .rmm-modal.rmm-position-bottom.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1888
+ transform: translateX(-50%) scale(1) translateY(0);
1889
+ }
1890
+
1891
+ .rmm-modal.rmm-position-top-left:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized),
1892
+ .rmm-modal.rmm-position-top-right:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized),
1893
+ .rmm-modal.rmm-position-bottom-left:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized),
1894
+ .rmm-modal.rmm-position-bottom-right:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1895
+ transform: scale(0.94) translateY(14px);
1896
+ }
1897
+ .rmm-modal.rmm-position-top-left.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized),
1898
+ .rmm-modal.rmm-position-top-right.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized),
1899
+ .rmm-modal.rmm-position-bottom-left.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized),
1900
+ .rmm-modal.rmm-position-bottom-right.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1901
+ transform: scale(1) translateY(0);
1902
+ }
1903
+
1904
+ /* PC size fixes (@media min-width: 769px) 가 position-center 에 !important 로
1905
+ transform 을 덮어써 있음 → 같은 specificity + !important 로 재오버라이드 */
1906
+ @media (min-width: 769px) {
1907
+ .rmm-modal.rmm-size-md.rmm-position-center:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized),
1908
+ .rmm-modal.rmm-size-lg.rmm-position-center:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized),
1909
+ .rmm-modal.rmm-size-xl.rmm-position-center:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1910
+ transform: translate(-50%, -50%) scale(0.94) translateY(14px) !important;
1911
+ }
1912
+ .rmm-modal.rmm-size-md.rmm-position-center.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized),
1913
+ .rmm-modal.rmm-size-lg.rmm-position-center.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized),
1914
+ .rmm-modal.rmm-size-xl.rmm-position-center.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1915
+ transform: translate(-50%, -50%) scale(1) translateY(0) !important;
1916
+ }
1917
+ }
1918
+
1919
+ /* 모바일(≤768px)도 기존 CSS 가 position-center 에 !important 걸고 있음 */
1920
+ @media (max-width: 768px) {
1921
+ .rmm-modal.rmm-position-center:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1922
+ transform: translate(-50%, -50%) scale(0.94) translateY(14px) !important;
1923
+ }
1924
+ .rmm-modal.rmm-position-center.rmm-active:not(.rmm-dragging):not(.rmm-custom-position):not(.rmm-minimized) {
1925
+ transform: translate(-50%, -50%) scale(1) translateY(0) !important;
1926
+ }
1927
+ }
1928
+
1929
+ /* 최소화: 기존 transform: scale(0.2) !important 그대로 사용. 이번엔 개별
1930
+ scale/translate 프로퍼티를 안 쓰므로 따로 초기화할 것 없음. transition 만 재정의. */
1931
+ .rmm-modal.rmm-minimized {
1932
+ transition: opacity var(--rmm-dur-slow) var(--rmm-ease-emphasized),
1933
+ visibility var(--rmm-dur-slow) var(--rmm-ease-emphasized),
1934
+ transform var(--rmm-dur-slow) var(--rmm-ease-emphasized) !important;
1935
+ }
1936
+ .rmm-overlay.rmm-minimized {
1937
+ transition: opacity var(--rmm-dur-slow) var(--rmm-ease-emphasized),
1938
+ visibility var(--rmm-dur-slow) var(--rmm-ease-emphasized) !important;
1939
+ }
1940
+
1941
+ /* ============================================
1942
+ v1.0.48 — 모바일(≤768px) 헤더 컨트롤 정리
1943
+ ============================================
1944
+ 터치 환경에서는 최소화 / 크기조절(최대화) / 기본크기 복원 버튼이 조작 실수를
1945
+ 유발하고 공간만 차지하므로 **resizable/minimizable 옵션과 무관하게** 숨김.
1946
+ 사이드바 토글, 커스텀 헤더 버튼, 닫기 버튼은 그대로 유지.
1947
+ 기존 line 1627 의 `.rmm-default-size-btn { display: none }` 규칙과 같은
1948
+ breakpoint(768px)를 사용해 일관성 확보 + !important 로 확실히 덮어씀.
1949
+ */
1950
+ @media (max-width: 768px) {
1951
+ .rmm-header .rmm-minimize-btn,
1952
+ .rmm-header .rmm-maximize-btn,
1953
+ .rmm-header .rmm-default-size-btn {
1954
+ display: none !important;
1955
+ }
1956
+ /* 구버전 ERB 폴백: 클래스 없는 최소화 버튼이 렌더되는 경우 */
1957
+ .rmm-header .rmm-header-btn[data-action*="#minimize"],
1958
+ .rmm-header .rmm-header-btn[data-action*="#maximize"],
1959
+ .rmm-header .rmm-header-btn[data-action*="#restoreDefaultSize"] {
1960
+ display: none !important;
1961
+ }
1962
+ }
@@ -412,6 +412,9 @@ export default class extends Controller {
412
412
  const modal = this.element
413
413
  const overlay = this.getOverlay()
414
414
 
415
+ // 모달 내부 미디어(video, audio) 정지
416
+ this.stopMedia()
417
+
415
418
  // Reset sidebar and submenu to first item before hiding
416
419
  this.resetSidebarAndSubmenu()
417
420
 
@@ -497,6 +500,18 @@ export default class extends Controller {
497
500
  })
498
501
  }
499
502
 
503
+ /**
504
+ * Stop all media (video, audio) playing inside the modal
505
+ */
506
+ stopMedia() {
507
+ const mediaElements = this.element.querySelectorAll('video, audio')
508
+ mediaElements.forEach(media => {
509
+ if (!media.paused) {
510
+ media.pause()
511
+ }
512
+ })
513
+ }
514
+
500
515
  // ============================================
501
516
  // Styles
502
517
  // ============================================
@@ -117,7 +117,7 @@
117
117
 
118
118
  <% if minimizable %>
119
119
  <button type="button"
120
- class="rmm-header-btn"
120
+ class="rmm-header-btn rmm-minimize-btn"
121
121
  data-action="click->rmm-header#minimize"
122
122
  title="최소화">
123
123
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsModalManager
4
- VERSION = "1.0.46"
4
+ VERSION = "1.0.48"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_modal_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.46
4
+ version: 1.0.48
5
5
  platform: ruby
6
6
  authors:
7
7
  - reshacs