mosaic-headless 1.30.0 → 1.31.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.
- package/README.ja.md +4 -2
- package/README.ko.md +4 -2
- package/README.md +5 -3
- package/README.zh-TW.md +4 -2
- package/SKILL.md +83 -39
- package/assets/templates/platforms/claude-ai.json +1 -1
- package/assets/templates/platforms/claude-code.json +1 -1
- package/assets/templates/platforms/codex-cli.json +1 -1
- package/assets/templates/platforms/copilot.json +1 -1
- package/assets/templates/platforms/gemini-cli.json +1 -1
- package/data/browser-verification/moksa.csv +3986 -0
- package/data/browser-verification/my-account.csv +148 -0
- package/data/component-wall-verification.csv +1 -1
- package/data/condition-comparators.csv +2 -2
- package/data/content-loop-verification.csv +4 -1
- package/data/data-class-hierarchy.csv +1 -0
- package/data/dialog-form-verification.csv +2 -2
- package/data/dialog-verification.csv +1 -1
- package/data/form-surface-verification.csv +3 -0
- package/data/interaction-types.csv +1 -0
- package/data/intro-verification.csv +16 -16
- package/data/mobile-audit.csv +22 -19
- package/data/navigation-verification.csv +16 -13
- package/data/node-properties.csv +10 -5
- package/data/node-types.csv +1 -0
- package/data/node-verification.csv +3 -0
- package/data/placement-rules.csv +1 -0
- package/data/pluggables.csv +16 -4
- package/data/popover-verification.csv +38 -0
- package/data/style-states.csv +1 -0
- package/data/token-verification.csv +2 -2
- package/package.json +3 -1
- package/references/dialog-and-triggers.md +199 -8
- package/references/dynamic-content.md +19 -0
- package/references/failure-modes.md +36 -4
- package/references/styling.md +9 -0
- package/references/upgrading.md +46 -1
- package/scripts/check-release.mjs +41 -11
- package/sites/_dialogs.py +18 -8
- package/sites/_moksa.py +69 -39
- package/sites/_popovers.py +570 -0
- package/tools/audit_mobile.py +1 -1
- package/tools/extract_default_children.py +1 -1
- package/tools/extract_node_types.py +1 -1
- package/tools/sweep_node_types.py +55 -6
- package/tools/verify_browser.py +20 -8
- package/tools/verify_conversion.py +6 -2
- package/tools/verify_dialog.py +3 -2
- package/tools/verify_dialog_lab.py +11 -11
- package/tools/verify_intro.py +5 -3
- package/tools/verify_popovers.py +348 -0
- package/data/browser-verification.csv +0 -4133
package/sites/_moksa.py
CHANGED
|
@@ -317,6 +317,8 @@ CAPABILITY_GROUPS = [
|
|
|
317
317
|
"四種動畫並排、輪轉模式、鍵盤與減少動態"),
|
|
318
318
|
("彈窗與觸發", "/dialogs/",
|
|
319
319
|
"九種形態、四種觸發、四種執行規則"),
|
|
320
|
+
("浮動層 Popover", "/popovers/",
|
|
321
|
+
"選單、資訊卡、導覽——1.0.10 不擋頁面的浮動層"),
|
|
320
322
|
]),
|
|
321
323
|
("資料與系統", [
|
|
322
324
|
("內容驅動", "/content/",
|
|
@@ -339,6 +341,8 @@ CAPABILITIES = [
|
|
|
339
341
|
"分頁、手風琴、表單、地圖——都能直接操作"),
|
|
340
342
|
("彈窗與觸發", "/dialogs/",
|
|
341
343
|
"九種形態、四種觸發、四種執行規則"),
|
|
344
|
+
("浮動層 Popover", "/popovers/",
|
|
345
|
+
"選單、資訊卡、導覽——1.0.10 不擋頁面的浮動層"),
|
|
342
346
|
("輪播", "/sliders/",
|
|
343
347
|
"四種動畫並排、輪轉模式、鍵盤與減少動態"),
|
|
344
348
|
("設計系統", "/tokens/",
|
|
@@ -610,10 +614,10 @@ def motion_css():
|
|
|
610
614
|
# the boot sequence, phase by phase: the clauses report in, the log writes
|
|
611
615
|
# itself out a line at a time, and the ruler ticks up the left margin
|
|
612
616
|
boot_stagger = "\n".join(
|
|
613
|
-
" #mk-boot-c%d{animation-delay:%dms}" % (i,
|
|
617
|
+
" #mk-boot-c%d{animation-delay:%dms}" % (i, 345 + i * 156)
|
|
614
618
|
for i in range(len(CLAUSES)))
|
|
615
619
|
log_stagger = "\n".join(
|
|
616
|
-
" #mk-boot-l%d{animation-delay:%dms}" % (i,
|
|
620
|
+
" #mk-boot-l%d{animation-delay:%dms}" % (i, 300 + i * 285)
|
|
617
621
|
for i in range(len(BOOT_LOG)))
|
|
618
622
|
# a named view timeline per section, declared on the section and consumed by its
|
|
619
623
|
# index entry - `timeline-scope` on #mk-doc is what lets the name cross between
|
|
@@ -716,7 +720,14 @@ def motion_css():
|
|
|
716
720
|
# when it was one line. A fixed element whose height depends on its
|
|
717
721
|
# content cannot be cleared by a constant, so below 768px it simply joins
|
|
718
722
|
# the flow and the problem cannot come back.
|
|
719
|
-
|
|
723
|
+
#
|
|
724
|
+
# RELATIVE, not static. Static joined the flow but also switched off the
|
|
725
|
+
# header's z-index:100, and its `contain:layout` still made it a stacking
|
|
726
|
+
# context of its own - so it painted at the page's level, the first section
|
|
727
|
+
# below painted over it, and an opened capability dropdown showed nothing
|
|
728
|
+
# but its top border. Relative keeps the same place in the flow and lets
|
|
729
|
+
# the z-index work again.
|
|
730
|
+
"@media (max-width:767px){#mk-header{position:relative;"
|
|
720
731
|
"background:rgb(250,250,247);"
|
|
721
732
|
"-webkit-backdrop-filter:none;backdrop-filter:none;"
|
|
722
733
|
"border-bottom:1px solid " + RULE + "}}",
|
|
@@ -1069,11 +1080,16 @@ def motion_css():
|
|
|
1069
1080
|
"55%{opacity:1;transform:scale(.97)}100%{opacity:1;transform:scale(1)}}",
|
|
1070
1081
|
|
|
1071
1082
|
# ── motion, all of it opt-out-able ───────────────────────────────────
|
|
1083
|
+
# The whole entrance runs in about 2.6s. It used to take 8.9: the veil held
|
|
1084
|
+
# until 7.15s and the headline arrived at 7.44s, so a first visit was nine
|
|
1085
|
+
# seconds of waiting for the one thing the visitor came to read. Every
|
|
1086
|
+
# one-shot delay and duration was scaled by the same 0.3, so the order and
|
|
1087
|
+
# the overlaps are what they were - only the waiting went.
|
|
1072
1088
|
"@media (prefers-reduced-motion:no-preference){",
|
|
1073
1089
|
" #mk-boot{display:grid;position:fixed;inset:0;z-index:999;"
|
|
1074
1090
|
"background:rgb(250,250,247);align-content:center;justify-items:center;"
|
|
1075
1091
|
"row-gap:20px;overflow:hidden;will-change:transform;contain:layout;"
|
|
1076
|
-
"animation:mk-boot-out .9s cubic-bezier(.76,0,.24,1)
|
|
1092
|
+
"animation:mk-boot-out .9s cubic-bezier(.76,0,.24,1) 2.15s forwards}",
|
|
1077
1093
|
# ── the sheet, and the blocks carved for it ──────────────────────────
|
|
1078
1094
|
" #mk-uki{position:relative;width:min(430px,64vw);aspect-ratio:3/2;"
|
|
1079
1095
|
"background:rgb(250,250,247);overflow:hidden;contain:layout paint}",
|
|
@@ -1082,35 +1098,35 @@ def motion_css():
|
|
|
1082
1098
|
# one <g> per block: each lands out of register and snaps true
|
|
1083
1099
|
" #uk-sun,#uk-fuji,#uk-mist,#uk-sea,#uk-crest,#uk-boat,#uk-wave,"
|
|
1084
1100
|
"#uk-claw,#uk-swell,#uk-key{"
|
|
1085
|
-
"animation:mk-ink
|
|
1101
|
+
"animation:mk-ink .6s cubic-bezier(.2,.7,.3,1) both;"
|
|
1086
1102
|
"transform-box:fill-box;transform-origin:50% 50%}",
|
|
1087
1103
|
# the sheet on the bed is blank until the press starts. Washing the sky in
|
|
1088
1104
|
# at .45s, while the rest of the plate is still a held still frame,
|
|
1089
1105
|
# read as a half-loaded image rather than as paper.
|
|
1090
|
-
" #uk-sky{animation:mk-bokashi
|
|
1091
|
-
" #uk-sun{animation-delay
|
|
1092
|
-
" #uk-fuji{animation-delay
|
|
1093
|
-
" #uk-mist{animation-delay
|
|
1094
|
-
" #uk-sea{animation-delay
|
|
1095
|
-
" #uk-crest{animation-delay
|
|
1096
|
-
" #uk-boat{animation-delay:
|
|
1097
|
-
" #uk-swell{animation-delay:
|
|
1098
|
-
" #uk-wave{animation-delay:
|
|
1099
|
-
" #uk-claw{animation-delay:
|
|
1100
|
-
" #uk-key{animation-delay:
|
|
1106
|
+
" #uk-sky{animation:mk-bokashi .6s cubic-bezier(.3,0,.2,1) .28s both}",
|
|
1107
|
+
" #uk-sun{animation-delay:.43s}",
|
|
1108
|
+
" #uk-fuji{animation-delay:.56s}",
|
|
1109
|
+
" #uk-mist{animation-delay:.67s}",
|
|
1110
|
+
" #uk-sea{animation-delay:.79s}",
|
|
1111
|
+
" #uk-crest{animation-delay:.91s}",
|
|
1112
|
+
" #uk-boat{animation-delay:1.03s}",
|
|
1113
|
+
" #uk-swell{animation-delay:1.38s}",
|
|
1114
|
+
" #uk-wave{animation-delay:1.16s}",
|
|
1115
|
+
" #uk-claw{animation-delay:1.27s}",
|
|
1116
|
+
" #uk-key{animation-delay:1.49s}",
|
|
1101
1117
|
# once the impression has landed, the sea keeps moving
|
|
1102
|
-
" #uk-wave,#uk-claw{animation:mk-ink
|
|
1118
|
+
" #uk-wave,#uk-claw{animation:mk-ink .6s cubic-bezier(.2,.7,.3,1) both,"
|
|
1103
1119
|
"mk-swell 6s ease-in-out 2.7s infinite}",
|
|
1104
|
-
" #uk-swell{animation:mk-ink
|
|
1120
|
+
" #uk-swell{animation:mk-ink .6s cubic-bezier(.2,.7,.3,1) both,"
|
|
1105
1121
|
"mk-swell2 8s ease-in-out 2.9s infinite}",
|
|
1106
|
-
" #uk-wave{animation-delay:
|
|
1107
|
-
" #uk-claw{animation-delay:
|
|
1108
|
-
" #uk-swell{animation-delay:
|
|
1122
|
+
" #uk-wave{animation-delay:1.16s,1.92s}",
|
|
1123
|
+
" #uk-claw{animation-delay:1.27s,1.95s}",
|
|
1124
|
+
" #uk-swell{animation-delay:1.38s,1.98s}",
|
|
1109
1125
|
|
|
1110
1126
|
# 落款 the seal, pressed once the run is finished
|
|
1111
1127
|
" #mk-uki-seal{position:absolute;inset:auto 16px 14px auto;"
|
|
1112
1128
|
"width:34px;height:34px;background:rgb(191,68,40);opacity:0;"
|
|
1113
|
-
"animation:mk-seal .6s cubic-bezier(.16,1,.3,1)
|
|
1129
|
+
"animation:mk-seal .6s cubic-bezier(.16,1,.3,1) 1.68s both}",
|
|
1114
1130
|
' #mk-uki-seal::after{content:"摺";position:absolute;inset:0;'
|
|
1115
1131
|
"display:grid;place-items:center;color:rgb(250,250,247);"
|
|
1116
1132
|
"font-family:" + CJK + ";font-size:19px;line-height:1}",
|
|
@@ -1210,7 +1226,7 @@ def motion_css():
|
|
|
1210
1226
|
"line-height:1;letter-spacing:-.04em;color:rgb(22,24,28);"
|
|
1211
1227
|
"font-variant-numeric:tabular-nums;width:3ch;text-align:right;"
|
|
1212
1228
|
"contain:layout;"
|
|
1213
|
-
"animation:mk-count
|
|
1229
|
+
"animation:mk-count 1.68s cubic-bezier(.32,.72,.28,1) .27s both}",
|
|
1214
1230
|
' #mk-boot-num::after{counter-reset:n var(--mk-n);content:counter(n)}',
|
|
1215
1231
|
" #mk-boot-row{display:flex;align-items:flex-end;column-gap:8px;"
|
|
1216
1232
|
"line-height:1}",
|
|
@@ -1223,7 +1239,7 @@ def motion_css():
|
|
|
1223
1239
|
"background:rgba(22,24,28,.14);position:relative}",
|
|
1224
1240
|
" #mk-boot-fill{position:absolute;inset:0;background:rgb(255,90,54);"
|
|
1225
1241
|
"transform-origin:0 50%;"
|
|
1226
|
-
"animation:mk-boot-fill
|
|
1242
|
+
"animation:mk-boot-fill 1.68s cubic-bezier(.32,.72,.28,1) .27s both}",
|
|
1227
1243
|
# ticks along the rule, so the bar reads as a measure rather than a bar
|
|
1228
1244
|
' #mk-boot-track::after{content:"";position:absolute;left:0;right:0;'
|
|
1229
1245
|
"top:-3px;height:3px;background:repeating-linear-gradient(90deg,"
|
|
@@ -1243,7 +1259,7 @@ def motion_css():
|
|
|
1243
1259
|
" #mk-boot-scan{position:absolute;left:0;right:0;top:0;height:1px;"
|
|
1244
1260
|
"background:linear-gradient(90deg,rgba(255,90,54,0),rgba(255,90,54,.55),"
|
|
1245
1261
|
"rgba(255,90,54,0));"
|
|
1246
|
-
"animation:mk-boot-scan
|
|
1262
|
+
"animation:mk-boot-scan .87s linear .28s 2 both}",
|
|
1247
1263
|
|
|
1248
1264
|
# corner crosshairs: the veil is a plate, and a plate has trim marks
|
|
1249
1265
|
" #mk-boot .mk-x,#mk-boot-x0,#mk-boot-x1,#mk-boot-x2,#mk-boot-x3{"
|
|
@@ -1276,18 +1292,28 @@ def motion_css():
|
|
|
1276
1292
|
" #mk-boot-ready{border:1px solid rgb(191,68,40);padding:5px 12px;"
|
|
1277
1293
|
"font-family:" + MONO + ";font-size:10px;letter-spacing:.24em;"
|
|
1278
1294
|
"color:rgb(191,68,40);opacity:0;"
|
|
1279
|
-
"animation:mk-boot-stamp .5s cubic-bezier(.16,1,.3,1)
|
|
1295
|
+
"animation:mk-boot-stamp .5s cubic-bezier(.16,1,.3,1) 1.96s both}",
|
|
1280
1296
|
" @media (max-width:767px){#mk-boot-num{font-size:40px}"
|
|
1281
1297
|
"#mk-boot-head,#mk-boot-foot{left:18px;right:18px}}",
|
|
1282
1298
|
" #mk-hl1-mask>*,#mk-hl2-mask>*{transform:translateY(112%);"
|
|
1283
1299
|
"animation:mk-linein .95s cubic-bezier(.16,1,.3,1) forwards}",
|
|
1284
|
-
|
|
1285
|
-
|
|
1300
|
+
# The masthead waits for the veil ONLY where there is a veil. The intro
|
|
1301
|
+
# moved to its own page and the homepage kept the timing that assumed it,
|
|
1302
|
+
# so the homepage hero sat blank for 7.3s waiting on an overlay it no
|
|
1303
|
+
# longer has. Without #mk-boot it starts at once; with it, the delays
|
|
1304
|
+
# are the veil's (2.15s + its exit).
|
|
1305
|
+
" #mk-hl1-mask>*{animation-delay:.1s}",
|
|
1306
|
+
" #mk-hl2-mask>*{animation-delay:.16s}",
|
|
1286
1307
|
" #mk-mast-meta,#mk-mast-lede,#mk-mast-cta{opacity:0;"
|
|
1287
1308
|
"animation:mk-softin .8s cubic-bezier(.16,1,.3,1) forwards}",
|
|
1288
|
-
" #mk-mast-meta{animation-delay
|
|
1289
|
-
" #mk-mast-lede{animation-delay
|
|
1290
|
-
" #mk-mast-cta{animation-delay
|
|
1309
|
+
" #mk-mast-meta{animation-delay:.05s}",
|
|
1310
|
+
" #mk-mast-lede{animation-delay:.3s}",
|
|
1311
|
+
" #mk-mast-cta{animation-delay:.38s}",
|
|
1312
|
+
" body:has(#mk-boot) #mk-hl1-mask>*{animation-delay:2.23s}",
|
|
1313
|
+
" body:has(#mk-boot) #mk-hl2-mask>*{animation-delay:2.27s}",
|
|
1314
|
+
" body:has(#mk-boot) #mk-mast-meta{animation-delay:2.2s}",
|
|
1315
|
+
" body:has(#mk-boot) #mk-mast-lede{animation-delay:2.35s}",
|
|
1316
|
+
" body:has(#mk-boot) #mk-mast-cta{animation-delay:2.38s}",
|
|
1291
1317
|
" " + flow_arrows + "{animation:mk-flow 1.9s ease-in-out infinite}",
|
|
1292
1318
|
" #mk-clock-s{animation:mk-secs 60s steps(60,end) infinite}",
|
|
1293
1319
|
" #mk-clock-m{animation:mk-mins 3600s steps(60,end) infinite}",
|
|
@@ -1311,21 +1337,21 @@ def motion_css():
|
|
|
1311
1337
|
"animation:mk-railrun 9s linear infinite}",
|
|
1312
1338
|
flow_stagger,
|
|
1313
1339
|
" #mk-caret{animation:mk-caret 1.15s steps(1,end) infinite;"
|
|
1314
|
-
"animation-delay:
|
|
1340
|
+
"animation-delay:1.15s}",
|
|
1315
1341
|
" #mk-mast-rule{animation:mk-drawx .9s cubic-bezier(.2,.7,.3,1) forwards;"
|
|
1316
|
-
"animation-delay:
|
|
1342
|
+
"animation-delay:1.02s}",
|
|
1317
1343
|
" #mk-spec-rule{animation:mk-drawx .9s cubic-bezier(.2,.7,.3,1) forwards;"
|
|
1318
|
-
"animation-delay:.
|
|
1344
|
+
"animation-delay:.27s}",
|
|
1319
1345
|
" #mk-cue{opacity:0;animation:mk-softin .8s ease forwards;"
|
|
1320
|
-
"animation-delay
|
|
1346
|
+
"animation-delay:.33s}",
|
|
1321
1347
|
" #mk-cue-rail::after{animation:mk-cuearrow 1.9s cubic-bezier(.4,0,.5,1) "
|
|
1322
1348
|
"infinite}",
|
|
1323
1349
|
" #mk-ticker-track{animation:mk-ticker 40s linear infinite}",
|
|
1324
1350
|
" " + marks + "{animation:mk-markin .5s cubic-bezier(.16,1,.3,1) forwards}",
|
|
1325
|
-
" #mk-mark-0{animation-delay
|
|
1326
|
-
" #mk-mark-1{animation-delay
|
|
1327
|
-
" #mk-mark-2{animation-delay
|
|
1328
|
-
" #mk-mark-3{animation-delay
|
|
1351
|
+
" #mk-mark-0{animation-delay:.34s}",
|
|
1352
|
+
" #mk-mark-1{animation-delay:.37s}",
|
|
1353
|
+
" #mk-mark-2{animation-delay:.4s}",
|
|
1354
|
+
" #mk-mark-3{animation-delay:.43s}",
|
|
1329
1355
|
" @supports (animation-timeline:view()){",
|
|
1330
1356
|
" " + reveal_targets + "{animation:mk-rise .01s linear both;"
|
|
1331
1357
|
"animation-timeline:view();animation-range:entry 2% cover 36%}",
|
|
@@ -3292,6 +3318,10 @@ if __name__ == "__main__":
|
|
|
3292
3318
|
SITE["pages"].append({"slug": "sliders", "post_id": 270,
|
|
3293
3319
|
"title": "輪播實驗室",
|
|
3294
3320
|
"tree": apply_type(_sliders.TREE, DISPLAY, CJK, "600")})
|
|
3321
|
+
import _popovers
|
|
3322
|
+
SITE["pages"].append({"slug": "popovers", "post_id": 284,
|
|
3323
|
+
"title": "浮動層",
|
|
3324
|
+
"tree": apply_type(_popovers.TREE, DISPLAY, CJK, "600")})
|
|
3295
3325
|
SITE["pages"].append({"slug": "dialogs", "post_id": 268,
|
|
3296
3326
|
"title": "彈窗實驗室",
|
|
3297
3327
|
"tree": apply_type(_dialogs.TREE, DISPLAY, CJK, "600")})
|