@magic-spells/dialog-panel 1.1.0 → 1.1.1

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.
@@ -116,84 +116,96 @@ dialog-panel[state='hiding'] > dialog-backdrop {
116
116
 
117
117
  /* ============================================================
118
118
  Position variants — drawer-style slide-in animations.
119
- Default (no position attr, or position="center") uses the
120
- centered fade/scale animation defined above.
119
+ Self-contained: declares its own `position: fixed` and
120
+ explicit inset values so it doesn't rely on the UA's
121
+ `dialog:modal` styling or on consumer body overflow rules.
122
+ Default (no position attr) uses the centered fade/scale
123
+ animation defined above.
121
124
  ============================================================ */
122
125
 
126
+ /* Shared base for all four drawer positions */
127
+ dialog-panel[position='top'] > dialog,
128
+ dialog-panel[position='right'] > dialog,
129
+ dialog-panel[position='bottom'] > dialog,
130
+ dialog-panel[position='left'] > dialog {
131
+ position: fixed;
132
+ margin: 0;
133
+ max-width: 100%;
134
+ opacity: 1;
135
+ }
136
+
123
137
  /* ---- Top drawer ---- */
124
138
  dialog-panel[position='top'] > dialog {
125
- margin: 0 auto auto auto;
139
+ top: 0;
140
+ right: 0;
141
+ bottom: auto;
142
+ left: 0;
126
143
  width: 100%;
127
- max-width: 100%;
128
144
  max-height: 85vh;
129
- }
130
-
131
- dialog-panel[position='top'][state='showing'] > dialog,
132
- dialog-panel[position='top'][state='hiding'] > dialog {
133
- opacity: 1;
134
145
  transform: translateY(-100%);
135
146
  }
136
147
 
137
148
  dialog-panel[position='top'][state='shown'] > dialog {
138
- opacity: 1;
139
149
  transform: translateY(0);
140
150
  }
141
151
 
142
152
  /* ---- Bottom drawer ---- */
143
153
  dialog-panel[position='bottom'] > dialog {
144
- margin: auto auto 0 auto;
154
+ top: auto;
155
+ right: 0;
156
+ bottom: 0;
157
+ left: 0;
145
158
  width: 100%;
146
- max-width: 100%;
147
159
  max-height: 85vh;
148
- }
149
-
150
- dialog-panel[position='bottom'][state='showing'] > dialog,
151
- dialog-panel[position='bottom'][state='hiding'] > dialog {
152
- opacity: 1;
153
160
  transform: translateY(100%);
154
161
  }
155
162
 
156
163
  dialog-panel[position='bottom'][state='shown'] > dialog {
157
- opacity: 1;
158
164
  transform: translateY(0);
159
165
  }
160
166
 
161
167
  /* ---- Left drawer ---- */
162
168
  dialog-panel[position='left'] > dialog {
163
- margin: auto auto auto 0;
169
+ top: 0;
170
+ right: auto;
171
+ bottom: 0;
172
+ left: 0;
173
+ width: min(24rem, 90vw);
164
174
  height: 100dvh;
165
175
  max-height: 100dvh;
166
- width: min(24rem, 90vw);
167
- max-width: 100%;
168
- }
169
-
170
- dialog-panel[position='left'][state='showing'] > dialog,
171
- dialog-panel[position='left'][state='hiding'] > dialog {
172
- opacity: 1;
173
176
  transform: translateX(-100%);
174
177
  }
175
178
 
176
179
  dialog-panel[position='left'][state='shown'] > dialog {
177
- opacity: 1;
178
180
  transform: translateX(0);
179
181
  }
180
182
 
181
183
  /* ---- Right drawer ---- */
182
184
  dialog-panel[position='right'] > dialog {
183
- margin: auto 0 auto auto;
185
+ top: 0;
186
+ right: 0;
187
+ bottom: 0;
188
+ left: auto;
189
+ width: min(24rem, 90vw);
184
190
  height: 100dvh;
185
191
  max-height: 100dvh;
186
- width: min(24rem, 90vw);
187
- max-width: 100%;
188
- }
189
-
190
- dialog-panel[position='right'][state='showing'] > dialog,
191
- dialog-panel[position='right'][state='hiding'] > dialog {
192
- opacity: 1;
193
192
  transform: translateX(100%);
194
193
  }
195
194
 
196
195
  dialog-panel[position='right'][state='shown'] > dialog {
197
- opacity: 1;
198
196
  transform: translateX(0);
199
197
  }
198
+
199
+ /* ============================================================
200
+ Page scroll lock — prevents the underlying page from
201
+ scrolling while any dialog-panel is open or animating.
202
+ Keyed on the package's own [state='*'] attributes so it
203
+ activates from the first frame of the opening animation
204
+ and stays through the closing animation, regardless of
205
+ when the native <dialog>'s [open] attribute is toggled.
206
+ ============================================================ */
207
+ body:has(dialog-panel[state='showing']),
208
+ body:has(dialog-panel[state='shown']),
209
+ body:has(dialog-panel[state='hiding']) {
210
+ overflow: hidden;
211
+ }
@@ -1 +1 @@
1
- dialog-panel{display:contents}dialog-panel>dialog{border:none;box-shadow:0 10px 25px rgba(0,0,0,.15);max-height:85vh;max-width:32rem;opacity:0;overflow:visible;padding:0;transform:scale(.95);transition:opacity .3s ease-out,transform .3s ease-out;width:90vw}dialog-panel:has(dialog-backdrop)>dialog::backdrop{background:transparent}dialog-panel:not(:has(dialog-backdrop))>dialog::backdrop{background:rgba(0,0,0,.3);opacity:0;transition:opacity .3s ease-out}dialog-backdrop{background:rgba(0,0,0,.3);height:200dvh;left:50%;opacity:0;pointer-events:none;position:fixed;top:50%;transform:translateY(-50%) translateX(-50%);transition:opacity .3s ease-out;width:200vw;z-index:9999999}dialog-panel[state=showing]>dialog{opacity:0;transform:scale(.95)}dialog-panel:not(:has(dialog-backdrop))[state=showing]>dialog::backdrop{opacity:0}dialog-panel[state=shown]>dialog{opacity:1;transform:scale(1)}dialog-panel:not(:has(dialog-backdrop))[state=shown]>dialog::backdrop{opacity:1}dialog-panel[state=hiding]>dialog{opacity:0;transform:scale(.95);transition:opacity .2s ease-in,transform .2s ease-in}dialog-panel:not(:has(dialog-backdrop))[state=hiding]>dialog::backdrop{opacity:0;transition:opacity .2s ease-in}dialog-panel[state=hidden]>dialog-backdrop,dialog-panel[state=showing]>dialog-backdrop{opacity:0;pointer-events:none}dialog-panel[state=shown]>dialog-backdrop{opacity:1;pointer-events:auto}dialog-panel[state=hiding]>dialog-backdrop{opacity:0;pointer-events:none;transition:opacity .2s ease-in}dialog-panel[position=top]>dialog{margin:0 auto auto;max-height:85vh;max-width:100%;width:100%}dialog-panel[position=top][state=hiding]>dialog,dialog-panel[position=top][state=showing]>dialog{opacity:1;transform:translateY(-100%)}dialog-panel[position=top][state=shown]>dialog{opacity:1;transform:translateY(0)}dialog-panel[position=bottom]>dialog{margin:auto auto 0;max-height:85vh;max-width:100%;width:100%}dialog-panel[position=bottom][state=hiding]>dialog,dialog-panel[position=bottom][state=showing]>dialog{opacity:1;transform:translateY(100%)}dialog-panel[position=bottom][state=shown]>dialog{opacity:1;transform:translateY(0)}dialog-panel[position=left]>dialog{height:100dvh;margin:auto auto auto 0;max-height:100dvh;max-width:100%;width:min(24rem,90vw)}dialog-panel[position=left][state=hiding]>dialog,dialog-panel[position=left][state=showing]>dialog{opacity:1;transform:translateX(-100%)}dialog-panel[position=left][state=shown]>dialog{opacity:1;transform:translateX(0)}dialog-panel[position=right]>dialog{height:100dvh;margin:auto 0 auto auto;max-height:100dvh;max-width:100%;width:min(24rem,90vw)}dialog-panel[position=right][state=hiding]>dialog,dialog-panel[position=right][state=showing]>dialog{opacity:1;transform:translateX(100%)}dialog-panel[position=right][state=shown]>dialog{opacity:1;transform:translateX(0)}
1
+ dialog-panel{display:contents}dialog-panel>dialog{border:none;box-shadow:0 10px 25px rgba(0,0,0,.15);max-height:85vh;max-width:32rem;opacity:0;overflow:visible;padding:0;transform:scale(.95);transition:opacity .3s ease-out,transform .3s ease-out;width:90vw}dialog-panel:has(dialog-backdrop)>dialog::backdrop{background:transparent}dialog-panel:not(:has(dialog-backdrop))>dialog::backdrop{background:rgba(0,0,0,.3);opacity:0;transition:opacity .3s ease-out}dialog-backdrop{background:rgba(0,0,0,.3);height:200dvh;left:50%;opacity:0;pointer-events:none;position:fixed;top:50%;transform:translateY(-50%) translateX(-50%);transition:opacity .3s ease-out;width:200vw;z-index:9999999}dialog-panel[state=showing]>dialog{opacity:0;transform:scale(.95)}dialog-panel:not(:has(dialog-backdrop))[state=showing]>dialog::backdrop{opacity:0}dialog-panel[state=shown]>dialog{opacity:1;transform:scale(1)}dialog-panel:not(:has(dialog-backdrop))[state=shown]>dialog::backdrop{opacity:1}dialog-panel[state=hiding]>dialog{opacity:0;transform:scale(.95);transition:opacity .2s ease-in,transform .2s ease-in}dialog-panel:not(:has(dialog-backdrop))[state=hiding]>dialog::backdrop{opacity:0;transition:opacity .2s ease-in}dialog-panel[state=hidden]>dialog-backdrop,dialog-panel[state=showing]>dialog-backdrop{opacity:0;pointer-events:none}dialog-panel[state=shown]>dialog-backdrop{opacity:1;pointer-events:auto}dialog-panel[state=hiding]>dialog-backdrop{opacity:0;pointer-events:none;transition:opacity .2s ease-in}dialog-panel[position=bottom]>dialog,dialog-panel[position=left]>dialog,dialog-panel[position=right]>dialog,dialog-panel[position=top]>dialog{margin:0;max-width:100%;opacity:1;position:fixed}dialog-panel[position=top]>dialog{bottom:auto;left:0;max-height:85vh;right:0;top:0;transform:translateY(-100%);width:100%}dialog-panel[position=top][state=shown]>dialog{transform:translateY(0)}dialog-panel[position=bottom]>dialog{bottom:0;left:0;max-height:85vh;right:0;top:auto;transform:translateY(100%);width:100%}dialog-panel[position=bottom][state=shown]>dialog{transform:translateY(0)}dialog-panel[position=left]>dialog{bottom:0;height:100dvh;left:0;max-height:100dvh;right:auto;top:0;transform:translateX(-100%);width:min(24rem,90vw)}dialog-panel[position=left][state=shown]>dialog{transform:translateX(0)}dialog-panel[position=right]>dialog{bottom:0;height:100dvh;left:auto;max-height:100dvh;right:0;top:0;transform:translateX(100%);width:min(24rem,90vw)}dialog-panel[position=right][state=shown]>dialog{transform:translateX(0)}body:has(dialog-panel[state=hiding]),body:has(dialog-panel[state=showing]),body:has(dialog-panel[state=shown]){overflow:hidden}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magic-spells/dialog-panel",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "A lightweight web component wrapper for native <dialog> elements with state-driven animations.",
5
5
  "author": "Cory Schulz",
6
6
  "license": "MIT",