mnfst 0.5.235 → 0.5.237

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.
@@ -0,0 +1,368 @@
1
+ /* Manifest Reset - browser style normalizer */
2
+
3
+ @layer base, components, utilities;
4
+
5
+ @layer base {
6
+
7
+ *,
8
+ ::after,
9
+ ::before,
10
+ ::backdrop,
11
+ ::file-selector-button {
12
+ box-sizing: border-box;
13
+ margin: 0;
14
+ padding: 0;
15
+ border: 0 solid
16
+ }
17
+
18
+ :where(:root) {
19
+ -webkit-tap-highlight-color: transparent;
20
+ -webkit-text-size-adjust: 100%;
21
+ -moz-text-size-adjust: 100%;
22
+ text-size-adjust: 100%;
23
+ text-rendering: optimizeLegibility;
24
+ overflow-wrap: break-word;
25
+ -moz-tab-size: 4;
26
+ -o-tab-size: 4;
27
+ tab-size: 4;
28
+
29
+ /* Device safe-area insets (0 unless viewport-fit=cover on a notched screen) */
30
+ --safe-top: env(safe-area-inset-top, 0px);
31
+ --safe-right: env(safe-area-inset-right, 0px);
32
+ --safe-bottom: env(safe-area-inset-bottom, 0px);
33
+ --safe-left: env(safe-area-inset-left, 0px)
34
+ }
35
+
36
+ :where(html),
37
+ :host {
38
+ width: 100vw;
39
+ max-width: 100vw;
40
+ overflow-x: hidden;
41
+ line-height: 1.5;
42
+ tab-size: 4;
43
+ font-family: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
44
+ font-feature-settings: normal;
45
+ font-variation-settings: normal;
46
+ -webkit-text-size-adjust: 100%;
47
+ -webkit-tap-highlight-color: transparent;
48
+ scroll-behavior: smooth;
49
+ -ms-overflow-style: none;
50
+ scrollbar-width: none;
51
+
52
+ &::-webkit-scrollbar {
53
+ display: none
54
+ }
55
+
56
+ &:has(dialog:popover-open) {
57
+ overflow: hidden
58
+ }
59
+ }
60
+
61
+ :where(body) {
62
+ max-width: 100vw;
63
+ min-height: 100vh;
64
+ margin: 0;
65
+ line-height: inherit
66
+ }
67
+
68
+ :where(a) {
69
+ color: inherit;
70
+ -webkit-text-decoration: inherit;
71
+ text-decoration: inherit;
72
+ }
73
+
74
+ :where(abbr[title]) {
75
+ -webkit-text-decoration: underline dotted;
76
+ text-decoration: underline dotted
77
+ }
78
+
79
+ :where([aria-controls]) {
80
+ cursor: pointer
81
+ }
82
+
83
+ :where([aria-hidden=false][hidden]) {
84
+ display: initial
85
+ }
86
+
87
+ :where([aria-hidden=false][hidden]:not(:focus)) {
88
+ clip: rect(0, 0, 0, 0);
89
+ position: absolute
90
+ }
91
+
92
+ :where(audio:not([controls])) {
93
+ display: none;
94
+ height: 0
95
+ }
96
+
97
+ :where(b, strong) {
98
+ font-weight: bolder
99
+ }
100
+
101
+ :where(button, input, optgroup, select, textarea) {
102
+ margin: 0;
103
+ padding: 0;
104
+ font-family: inherit;
105
+ font-feature-settings: inherit;
106
+ font-variation-settings: inherit;
107
+ font-size: 100%;
108
+ font-weight: inherit;
109
+ line-height: inherit;
110
+ letter-spacing: inherit;
111
+ color: inherit
112
+ }
113
+
114
+ :where(button, select) {
115
+ text-transform: none
116
+ }
117
+
118
+ :where(button, input:where([type='button'], [type='reset'], [type='submit']), ::file-selector-button) {
119
+ appearance: button;
120
+ background-color: transparent;
121
+ background-image: none
122
+ }
123
+
124
+ :where(::-webkit-file-upload-button) {
125
+ -webkit-appearance: button;
126
+ font: inherit
127
+ }
128
+
129
+ :where(::-webkit-inner-spin-button, ::-webkit-outer-spin-button) {
130
+ height: auto
131
+ }
132
+
133
+ :where(::-webkit-search-decoration) {
134
+ -webkit-appearance: none
135
+ }
136
+
137
+ :where(button, [role=button]) {
138
+ cursor: pointer
139
+ }
140
+
141
+ :where(code, samp, pre) {
142
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
143
+ font-size: 1em;
144
+ font-feature-settings: normal;
145
+ font-variation-settings: normal;
146
+ }
147
+
148
+ :where([dir=rtl]) {
149
+ direction: rtl
150
+ }
151
+
152
+ :where([disabled], :disabled, [aria-disabled=true], .disabled) {
153
+ opacity: .5;
154
+ cursor: default;
155
+ pointer-events: none
156
+ }
157
+
158
+ :where(figcaption) {
159
+ font-size: 75%
160
+ }
161
+
162
+ :where(figure) {
163
+ display: block;
164
+ padding: 0
165
+ }
166
+
167
+ :where(::file-selector-button) {
168
+ margin-inline-end: 4px
169
+ }
170
+
171
+ :where(h1, h2, h3, h4, h5, h6) {
172
+ font-size: inherit;
173
+ font-weight: inherit
174
+ }
175
+
176
+ :where(hr) {
177
+ height: 1px;
178
+ color: inherit;
179
+ background-color: var(--color-line, color-mix(in oklch, oklch(20.5% 0 0) 12%, transparent));
180
+ border: 0 none
181
+ }
182
+
183
+ :where(img, svg, video, canvas, audio, iframe, embed, object) {
184
+ display: block
185
+ }
186
+
187
+ :where(img, video) {
188
+ max-width: 100%;
189
+ height: auto
190
+ }
191
+
192
+ :where(::-webkit-autofill, :-webkit-autofill:focus) {
193
+ transition: background-color 0s 600000s, color 0s 600000s
194
+ }
195
+
196
+ :where(::-webkit-date-and-time-value) {
197
+ min-height: 1lh;
198
+ text-align: inherit
199
+ }
200
+
201
+ :where(::-webkit-datetime-edit) {
202
+ display: inline-flex
203
+ }
204
+
205
+ :where(::-webkit-datetime-edit-fields-wrapper) {
206
+ padding: 0
207
+ }
208
+
209
+ :where(::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field) {
210
+ padding-block: 0
211
+ }
212
+
213
+ :where(select:is([multiple], [size])) optgroup {
214
+ font-weight: bolder
215
+ }
216
+
217
+ :where(select:is([multiple], [size])) optgroup option {
218
+ padding-inline-start: 20px
219
+ }
220
+
221
+ :where(small) {
222
+ font-size: 80%
223
+ }
224
+
225
+ :where(span) {
226
+ color: inherit
227
+ }
228
+
229
+ :where(sub, sup) {
230
+ font-size: 50%;
231
+ line-height: 0;
232
+ position: relative;
233
+ vertical-align: baseline
234
+ }
235
+
236
+ :where(sub) {
237
+ bottom: -0.25em
238
+ }
239
+
240
+ :where(sup) {
241
+ top: -0.5em
242
+ }
243
+
244
+ :where(svg):not([fill]) {
245
+ fill: currentColor
246
+ }
247
+
248
+ :where(svg):not(:root) {
249
+ overflow: hidden
250
+ }
251
+
252
+ :where(table) {
253
+ text-indent: 0;
254
+ border-color: inherit;
255
+ border-collapse: collapse
256
+ }
257
+
258
+ :-moz-focusring {
259
+ outline: auto
260
+ }
261
+
262
+ :-moz-ui-invalid {
263
+ box-shadow: none
264
+ }
265
+
266
+ :where(::placeholder) {
267
+ opacity: 1;
268
+ color: color-mix(in oklab, currentcolor 50%, transparent)
269
+ }
270
+
271
+ /* Animates `scale`, not `transform`: a transform animation with fill `both`
272
+ keeps its final value and would override any transform an author sets on
273
+ a popover of their own. */
274
+ @keyframes mnfst-popover-in {
275
+ from {
276
+ scale: .9;
277
+ }
278
+
279
+ to {
280
+ scale: 1;
281
+ }
282
+ }
283
+
284
+ :where([popover]):not(.unstyle):popover-open {
285
+ display: flex;
286
+ animation: mnfst-popover-in .15s ease-in both;
287
+ }
288
+
289
+ :where(progress) {
290
+ vertical-align: baseline
291
+ }
292
+
293
+ :where([type='search']) {
294
+ -webkit-appearance: textfield;
295
+ appearance: textfield;
296
+ outline-offset: -2px
297
+ }
298
+
299
+ :where(summary) {
300
+ display: list-item
301
+ }
302
+
303
+ :where(textarea) {
304
+ resize: vertical
305
+ }
306
+
307
+ [hidden],
308
+ [un-cloak],
309
+ [v-cloak],
310
+ [x-cloak] {
311
+ display: none
312
+ }
313
+
314
+ /* @ rule - font smoothing for iOS and Mac */
315
+ @media (-webkit-min-device-pixel-ratio: 2) {
316
+ :where(html) {
317
+ -webkit-font-smoothing: antialiased;
318
+ -moz-osx-font-smoothing: grayscale
319
+ }
320
+ }
321
+
322
+ /* @ rule - reduced motion */
323
+ @media (prefers-reduced-motion:reduce) {
324
+
325
+ :not([aria-busy=true]),
326
+ :not([aria-busy=true])::after,
327
+ :not([aria-busy=true])::before {
328
+ background-attachment: initial !important;
329
+ animation-duration: 1ms !important;
330
+ animation-delay: -1ms !important;
331
+ animation-iteration-count: 1 !important;
332
+ scroll-behavior: auto !important;
333
+ transition-delay: 0s !important;
334
+ transition-duration: 0s !important
335
+ }
336
+ }
337
+
338
+ /* @ rule - reverse animation direction for rtl mode */
339
+ @media (prefers-reduced-motion:no-preference) {
340
+ [dir=rtl] progress:indeterminate {
341
+ animation-direction: reverse
342
+ }
343
+ }
344
+
345
+ /* View transition styles */
346
+ ::view-transition-group(*) {
347
+ animation-duration: var(--view-transition-duration, 200ms);
348
+ animation-timing-function: var(--view-transition-easing, cubic-bezier(0.4, 0, 0.2, 1))
349
+ }
350
+
351
+ /* Skip view transition for live/non-rasterizable content */
352
+ iframe,
353
+ video,
354
+ canvas,
355
+ [data-no-view-transition] {
356
+ view-transition-name: none
357
+ }
358
+ }
359
+
360
+ /* Cross-document view transitions opt-in */
361
+ @view-transition {
362
+ navigation: auto
363
+ }
364
+
365
+ /* Unlayered on purpose: a closed popover must beat layer-based layout classes. */
366
+ [popover]:not(.unstyle):not(:popover-open) {
367
+ display: none;
368
+ }
@@ -177,13 +177,27 @@
177
177
  & table {
178
178
  width: 100%;
179
179
  table-layout: fixed;
180
+ border-collapse: separate;
181
+ border-spacing: 0;
182
+ border: 1px solid var(--color-line);
180
183
 
184
+ /* Inner dividers only: the table's own border draws the rounded edge */
181
185
  & :where(td, th) {
182
186
  padding: 0.35em 0.5em;
183
- border: 1px solid var(--color-line);
187
+ border: 0 none;
188
+ border-inline-end: 1px solid var(--color-line);
189
+ border-block-end: 1px solid var(--color-line);
184
190
  vertical-align: top;
185
191
  }
186
192
 
193
+ & :where(tr > :last-child) {
194
+ border-inline-end: 0 none;
195
+ }
196
+
197
+ & :where(tbody:last-child > tr:last-child > *, tfoot > tr:last-child > *) {
198
+ border-block-end: 0 none;
199
+ }
200
+
187
201
  & th {
188
202
  font-weight: 600;
189
203
  text-align: start;
@@ -2971,8 +2971,8 @@
2971
2971
 
2972
2972
  /* ---- Area engine ----
2973
2973
  Shared by the directive and ManifestRichText.attach(). */
2974
- function setup(el, { format = 'markdown', inline: single = false, breaks = false, all: allStyles = true, literal = false, bound = false, controlled = false, onChange = null } = {}) {
2975
- // .inline html with breaks: one block of lines; <br> kept, Shift+Enter makes one
2974
+ function setup(el, { format = 'markdown', inline: single = false, breaks = false, enterBreaks = false, all: allStyles = true, literal = false, bound = false, controlled = false, onChange = null } = {}) {
2975
+ // .inline html with breaks: one block of lines; <br> kept, Shift+Enter makes one (Enter too with enterBreaks)
2976
2976
  const lines = single && breaks && format === 'html';
2977
2977
  const flat = (html) => lines ? breakLines(html, true) : flattenLines(html, true);
2978
2978
  const ac = new AbortController();
@@ -3197,7 +3197,7 @@
3197
3197
  if (e.isComposing || e.keyCode === 229) return;
3198
3198
  if (e.key === 'Enter' && e.target !== el && e.target.matches && e.target.matches('a[href]') && e.target.closest('[contenteditable="false"]') && el.contains(e.target.closest('[contenteditable="false"]'))) return;
3199
3199
  if ((e.key || '').length > 1 && !/^(Shift|Alt|Control|Meta|CapsLock)$/.test(e.key)) { el._exit = null; if (!/^(Backspace|Delete)$/.test(e.key)) el._after = null; }
3200
- if (e.key === 'Enter' && single) { e.preventDefault(); if (lines && e.shiftKey) lineBreak(); else enter(e.shiftKey); return; }
3200
+ if (e.key === 'Enter' && single) { e.preventDefault(); if (lines && (e.shiftKey || enterBreaks)) lineBreak(); else enter(e.shiftKey); return; }
3201
3201
  if (e.key === 'Enter' && format !== 'plain') {
3202
3202
  if (!ownsEnter(e)) return;
3203
3203
  e.preventDefault();
@@ -3358,7 +3358,7 @@
3358
3358
  const controlled = opts.value !== undefined;
3359
3359
  const core = setup(el, {
3360
3360
  format: FORMATS.has(opts.format) ? opts.format : 'markdown',
3361
- inline: opts.mode === 'inline', breaks: !!opts.breaks, all: opts.all !== false, literal: !!opts.literal,
3361
+ inline: opts.mode === 'inline', breaks: !!opts.breaks, enterBreaks: opts.enter === 'break', all: opts.all !== false, literal: !!opts.literal,
3362
3362
  bound: typeof opts.onChange === 'function', controlled,
3363
3363
  onChange: typeof opts.onChange === 'function' ? opts.onChange : null
3364
3364
  });
@@ -16,7 +16,7 @@
16
16
 
17
17
  // Build stamps the published version here; unstamped (dev) falls back to the
18
18
  // registration URL's `v`, then 'dev'.
19
- const BUILD_VERSION = '0.5.235';
19
+ const BUILD_VERSION = '0.5.237';
20
20
  const CACHE_PREFIX = 'mnfst-sw:';
21
21
  const META_CACHE = CACHE_PREFIX + 'meta';
22
22
  // Sized to hold a full precache.json warm-up (PRECACHE_MAX_ENTRIES server-side)
@@ -45,8 +45,8 @@
45
45
  text-align: left;
46
46
  text-align: start;
47
47
 
48
- /* Make elements within cell inline */
49
- &>*:not(template) {
48
+ /* Make elements within cell inline; text-level elements stay in the text flow */
49
+ &>*:not(template, br, :is(a, abbr, b, cite, code, data, del, dfn, em, i, ins, kbd, mark, q, s, samp, small, strong, sub, sup, time, u, var):not([role=button], [x-icon], .badge)) {
50
50
  display: inline-flex;
51
51
  vertical-align: middle;
52
52
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mnfst",
3
- "version": "0.5.235",
3
+ "version": "0.5.237",
4
4
  "private": false,
5
5
  "workspaces": [
6
6
  "templates/starter",