mosaic-headless 1.6.0 → 1.7.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.
@@ -2,7 +2,7 @@ check,result,detail
2
2
  PLAYS,PASS,43 of 43 intro elements changed state
3
3
  COUNTS,PASS,--mk-n reached 100
4
4
  ENDS,PASS,veil is out of hit-testing from 4200ms
5
- NO_TRAP,PASS,"0 content elements still at opacity 0 in the viewport (41 below the fold awaiting their own scroll timeline, 1 mid-blink)"
5
+ NO_TRAP,PASS,"0 content elements still at opacity 0 in the viewport (61 below the fold awaiting their own scroll timeline, 1 mid-blink)"
6
6
  CLEARS,PASS,a real click landed on 'mk-caret-row'
7
7
  DEGRADES,PASS,with reduced motion the veil is display:none throughout
8
8
  READABLE,PASS,0 elements invisible at 120ms with reduced motion
@@ -10,13 +10,13 @@ READABLE,PASS,0 elements invisible at 120ms with reduced motion
10
10
  t_ms,counter,veil_visibility,veil_clip,veil_covers_centre,hit_centre,invisible_content
11
11
  120,,,,False,html.no-js,0
12
12
  400,0,visible,none,True,mk-boot,7
13
- 800,15,visible,none,True,mk-boot,7
14
- 1300,42,visible,none,True,mk-boot,6
15
- 1800,69,visible,none,True,p.M_EL56,3
16
- 2300,97,visible,none,True,p.M_EL56,3
13
+ 800,11,visible,none,True,mk-boot,7
14
+ 1300,37,visible,none,True,mk-boot,7
15
+ 1800,66,visible,none,True,p.M_EL56,3
16
+ 2300,93,visible,none,True,p.M_EL56,3
17
17
  2700,100,visible,none,True,p.M_EL56,3
18
- 3000,100,visible,inset(0px 0px 3.1269%),True,p.M_EL56,2
19
- 3300,100,visible,inset(0px 0px 93.9568%),False,mk-caret-row,2
18
+ 3000,100,visible,inset(0px 0px 0.487303%),True,p.M_EL56,3
19
+ 3300,100,visible,inset(0px 0px 84.1246%),False,mk-caret-row,2
20
20
  3700,100,hidden,inset(0px 0px 100%),False,mk-caret-row,0
21
21
  4200,100,hidden,inset(0px 0px 100%),False,mk-caret-row,0
22
22
  5200,100,hidden,inset(0px 0px 100%),False,mk-caret-row,0
@@ -87,6 +87,46 @@ https://mosaic.moksaweb.com/moksa/,mk-svc-3,_m,grid-template-columns,"repeat(1,
87
87
  https://mosaic.moksaweb.com/moksa/,mk-svc-3,_m,row-gap,10px,10px,verified
88
88
  https://mosaic.moksaweb.com/moksa/,mk-svc-3,_m,padding-top,20px,20px,verified
89
89
  https://mosaic.moksaweb.com/moksa/,mk-svc-3,_m,padding-bottom,20px,20px,verified
90
+ https://mosaic.moksaweb.com/moksa/,matrix,_t,padding-left,28px,28px,verified
91
+ https://mosaic.moksaweb.com/moksa/,matrix,_t,padding-right,28px,28px,verified
92
+ https://mosaic.moksaweb.com/moksa/,matrix,_m,padding-left,18px,18px,verified
93
+ https://mosaic.moksaweb.com/moksa/,matrix,_m,padding-right,18px,18px,verified
94
+ https://mosaic.moksaweb.com/moksa/,mk-mx-pad,_m,padding-top,52px,52px,verified
95
+ https://mosaic.moksaweb.com/moksa/,mk-mx-pad,_m,padding-bottom,52px,52px,verified
96
+ https://mosaic.moksaweb.com/moksa/,mk-mx-cols,_m,grid-template-columns,"1fr repeat(3, 46px)","1fr repeat(3, 46px)",verified
97
+ https://mosaic.moksaweb.com/moksa/,mk-mx-cols,_m,column-gap,6px,6px,verified
98
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-0,_m,grid-template-columns,"1fr repeat(3, 46px)","1fr repeat(3, 46px)",verified
99
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-0,_m,column-gap,6px,6px,verified
100
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-0,_m,padding-top,11px,11px,verified
101
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-0,_m,padding-bottom,11px,11px,verified
102
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-1,_m,grid-template-columns,"1fr repeat(3, 46px)","1fr repeat(3, 46px)",verified
103
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-1,_m,column-gap,6px,6px,verified
104
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-1,_m,padding-top,11px,11px,verified
105
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-1,_m,padding-bottom,11px,11px,verified
106
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-2,_m,grid-template-columns,"1fr repeat(3, 46px)","1fr repeat(3, 46px)",verified
107
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-2,_m,column-gap,6px,6px,verified
108
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-2,_m,padding-top,11px,11px,verified
109
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-2,_m,padding-bottom,11px,11px,verified
110
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-3,_m,grid-template-columns,"1fr repeat(3, 46px)","1fr repeat(3, 46px)",verified
111
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-3,_m,column-gap,6px,6px,verified
112
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-3,_m,padding-top,11px,11px,verified
113
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-3,_m,padding-bottom,11px,11px,verified
114
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-4,_m,grid-template-columns,"1fr repeat(3, 46px)","1fr repeat(3, 46px)",verified
115
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-4,_m,column-gap,6px,6px,verified
116
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-4,_m,padding-top,11px,11px,verified
117
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-4,_m,padding-bottom,11px,11px,verified
118
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-5,_m,grid-template-columns,"1fr repeat(3, 46px)","1fr repeat(3, 46px)",verified
119
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-5,_m,column-gap,6px,6px,verified
120
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-5,_m,padding-top,11px,11px,verified
121
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-5,_m,padding-bottom,11px,11px,verified
122
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-6,_m,grid-template-columns,"1fr repeat(3, 46px)","1fr repeat(3, 46px)",verified
123
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-6,_m,column-gap,6px,6px,verified
124
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-6,_m,padding-top,11px,11px,verified
125
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-6,_m,padding-bottom,11px,11px,verified
126
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-7,_m,grid-template-columns,"1fr repeat(3, 46px)","1fr repeat(3, 46px)",verified
127
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-7,_m,column-gap,6px,6px,verified
128
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-7,_m,padding-top,11px,11px,verified
129
+ https://mosaic.moksaweb.com/moksa/,mk-mx-r-7,_m,padding-bottom,11px,11px,verified
90
130
  https://mosaic.moksaweb.com/moksa/,process,_t,padding-left,28px,28px,verified
91
131
  https://mosaic.moksaweb.com/moksa/,process,_t,padding-right,28px,28px,verified
92
132
  https://mosaic.moksaweb.com/moksa/,process,_m,padding-left,18px,18px,verified
@@ -104,6 +144,22 @@ https://mosaic.moksaweb.com/moksa/,mk-proc-2,_m,padding-top,20px,20px,verified
104
144
  https://mosaic.moksaweb.com/moksa/,mk-proc-2,_m,padding-right,0px,0px,verified
105
145
  https://mosaic.moksaweb.com/moksa/,mk-proc-3,_m,padding-top,20px,20px,verified
106
146
  https://mosaic.moksaweb.com/moksa/,mk-proc-3,_m,padding-right,0px,0px,verified
147
+ https://mosaic.moksaweb.com/moksa/,figure,_t,padding-left,28px,28px,verified
148
+ https://mosaic.moksaweb.com/moksa/,figure,_t,padding-right,28px,28px,verified
149
+ https://mosaic.moksaweb.com/moksa/,figure,_m,padding-left,18px,18px,verified
150
+ https://mosaic.moksaweb.com/moksa/,figure,_m,padding-right,18px,18px,verified
151
+ https://mosaic.moksaweb.com/moksa/,mk-fig2-pad,_m,padding-top,54px,54px,verified
152
+ https://mosaic.moksaweb.com/moksa/,mk-fig2-pad,_m,padding-bottom,54px,54px,verified
153
+ https://mosaic.moksaweb.com/moksa/,mk-fig2-grid,_t,grid-template-columns,1fr 34px 1fr 34px 1fr,1fr 34px 1fr 34px 1fr,verified
154
+ https://mosaic.moksaweb.com/moksa/,mk-fig2-grid,_m,grid-template-columns,"repeat(1, 1fr)","repeat(1, 1fr)",verified
155
+ https://mosaic.moksaweb.com/moksa/,mk-fig2-grid,_m,row-gap,8px,8px,verified
156
+ https://mosaic.moksaweb.com/moksa/,mk-fig2-grid,_m,margin-top,24px,24px,verified
157
+ https://mosaic.moksaweb.com/moksa/,mk-ar-a-0,_m,transform,rotate(90deg),rotate(90deg),verified
158
+ https://mosaic.moksaweb.com/moksa/,mk-ar-b-0,_m,transform,rotate(90deg),rotate(90deg),verified
159
+ https://mosaic.moksaweb.com/moksa/,mk-ar-a-1,_m,transform,rotate(90deg),rotate(90deg),verified
160
+ https://mosaic.moksaweb.com/moksa/,mk-ar-b-1,_m,transform,rotate(90deg),rotate(90deg),verified
161
+ https://mosaic.moksaweb.com/moksa/,mk-ar-a-2,_m,transform,rotate(90deg),rotate(90deg),verified
162
+ https://mosaic.moksaweb.com/moksa/,mk-ar-b-2,_m,transform,rotate(90deg),rotate(90deg),verified
107
163
  https://mosaic.moksaweb.com/moksa/,works,_t,padding-left,28px,28px,verified
108
164
  https://mosaic.moksaweb.com/moksa/,works,_t,padding-right,28px,28px,verified
109
165
  https://mosaic.moksaweb.com/moksa/,works,_m,padding-left,18px,18px,verified
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mosaic-headless",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "AI-agent skill: build Mosaic Pro (Nextend) WordPress sites by writing the underlying data model directly - 23 custom tables, no visual editor, no DOM. Every node type, style property and node property swept against a live install and asserted on the delivered HTML and compiled CSS. Installs into Claude Code, Cursor, Codex CLI, Gemini CLI, Copilot, Continue, Windsurf and Claude.ai.",
5
5
  "keywords": [
6
6
  "wordpress",
package/sites/_moksa.py CHANGED
@@ -358,6 +358,12 @@ REVEALS = [
358
358
  ("mk-work-4", 3), ("mk-work-5", 3), ("mk-work-6", 4), ("mk-work-7", 4),
359
359
  ("mk-work-8", 5),
360
360
  ("mk-plate-num", 0), ("mk-plate-t", 1),
361
+ ("mk-mx-head", 0), ("mk-mx-cols", 1),
362
+ ("mk-mx-r-0", 1), ("mk-mx-r-1", 2), ("mk-mx-r-2", 2), ("mk-mx-r-3", 3),
363
+ ("mk-mx-r-4", 3), ("mk-mx-r-5", 4), ("mk-mx-r-6", 4), ("mk-mx-r-7", 5),
364
+ ("mk-fig2-head", 0), ("mk-fl-a-0", 1), ("mk-fl-b-0", 2), ("mk-fl-c-0", 3),
365
+ ("mk-fl-a-1", 2), ("mk-fl-b-1", 3), ("mk-fl-c-1", 4),
366
+ ("mk-fl-a-2", 3), ("mk-fl-b-2", 4), ("mk-fl-c-2", 5),
361
367
  ("mk-spec2-head", 0), ("mk-spec2-r-0", 1), ("mk-spec2-r-1", 2),
362
368
  ("mk-spec2-r-2", 3), ("mk-spec2-r-3", 4),
363
369
  ("mk-stack-head", 0), ("mk-stack-0", 1), ("mk-stack-1", 2), ("mk-stack-2", 3),
@@ -1337,6 +1343,149 @@ CONTACT = section("contact", [wrap("mk-contact-in", [
1337
1343
  ]),
1338
1344
  ])])
1339
1345
 
1346
+ # ── the capability matrix ─────────────────────────────────────────────────────
1347
+ # The page could tell you what the studio does; a specification SHOWS you, in a form
1348
+ # you can read across. Filled, half and hollow marks carry the whole answer without
1349
+ # a sentence, and the density is the point - this is the one block on the page that
1350
+ # rewards being read as a grid rather than as a line.
1351
+ MATRIX_COLS = ["網站", "電商", "自動化"]
1352
+ MATRIX = [
1353
+ ("客製化設計", "BESPOKE DESIGN", "●", "●", "◐"),
1354
+ ("RWD 三段點", "RESPONSIVE", "●", "●", "○"),
1355
+ ("SEO 結構化資料", "STRUCTURED DATA", "●", "●", "○"),
1356
+ ("金流/物流串接", "PAYMENT / LOGISTICS", "○", "●", "◐"),
1357
+ ("會員與訂單系統", "ACCOUNTS / ORDERS", "○", "●", "◐"),
1358
+ ("n8n 流程自動化", "WORKFLOW AUTOMATION", "◐", "◐", "●"),
1359
+ ("AI 內容與判讀", "AI CONTENT / REASONING", "◐", "◐", "●"),
1360
+ ("上線後維運", "MAINTENANCE", "●", "●", "●"),
1361
+ ]
1362
+
1363
+
1364
+ def mark(sym, i, j):
1365
+ """One cell of the matrix. The symbol carries the meaning; the colour only
1366
+ reinforces it, so it still reads if the colour is gone."""
1367
+ colour = "--mk-ink" if sym == "●" else (
1368
+ "--mk-accent-ink" if sym == "◐" else "--mk-faint")
1369
+ return box("mk-mx-c-%d-%d" % (i, j),
1370
+ {"display": "flex", "justifyContent": "center"},
1371
+ [T("p", sym, color={"token": colour}, fontSize="13px",
1372
+ fontFamily=MONO, lineHeight="1")])
1373
+
1374
+
1375
+ MATRIX_SEC = section("matrix", [wrap("mk-mx-in", [
1376
+ box("mk-mx-pad", {"paddingTop": "78px", "paddingBottom": "78px"},
1377
+ _m={"paddingTop": "52px", "paddingBottom": "52px"},
1378
+ children=[
1379
+ box("mk-mx-head",
1380
+ {"display": "flex", "justifyContent": "space-between",
1381
+ "columnGap": "20px", "rowGap": "8px", "alignItems": "baseline",
1382
+ "customStyles": "flex-wrap:wrap;"},
1383
+ [mono("TABLE 01 — CAPABILITY", size="10px",
1384
+ color="--mk-accent-ink", track="0.22em"),
1385
+ mono("● 標準 ◐ 選配 ○ 不含", size="10px",
1386
+ color="--mk-faint", track="0.12em")]),
1387
+ # the column header, then one row per capability
1388
+ box("mk-mx-cols",
1389
+ {"display": "grid", "gridCols": "1fr repeat(3, 78px)",
1390
+ "columnGap": "10px", "alignItems": "end", "marginTop": "26px",
1391
+ "paddingBottom": "10px",
1392
+ "customStyles": "border-bottom:1px solid " + RULE_INK + ";"},
1393
+ _m={"gridCols": "1fr repeat(3, 46px)", "columnGap": "6px"},
1394
+ children=[mono("CAPABILITY", size="10px", color="--mk-faint",
1395
+ track="0.18em")]
1396
+ + [box("mk-mx-h-%d" % j,
1397
+ {"display": "flex", "justifyContent": "center"},
1398
+ [mono(c, size="11px", color="--mk-ink", track="0.06em")])
1399
+ for j, c in enumerate(MATRIX_COLS)]),
1400
+ box("mk-mx-rows", {}, [
1401
+ box("mk-mx-r-%d" % i,
1402
+ {"display": "grid", "gridCols": "1fr repeat(3, 78px)",
1403
+ "columnGap": "10px", "alignItems": "center",
1404
+ "paddingTop": "13px", "paddingBottom": "13px",
1405
+ "customStyles": "border-bottom:1px solid " + RULE + ";"},
1406
+ _m={"gridCols": "1fr repeat(3, 46px)", "columnGap": "6px",
1407
+ "paddingTop": "11px", "paddingBottom": "11px"},
1408
+ children=[
1409
+ box("mk-mx-n-%d" % i,
1410
+ {"display": "flex", "columnGap": "12px",
1411
+ "alignItems": "baseline", "rowGap": "2px",
1412
+ "customStyles": "flex-wrap:wrap;"},
1413
+ [T("p", zh, color={"token": "--mk-ink"},
1414
+ fontSize="14px", _m={"fontSize": "12.5px"}),
1415
+ mono(en, size="9px", color="--mk-faint",
1416
+ track="0.16em", _m={"display": "none"})]),
1417
+ ] + [mark(sym, i, j) for j, sym in enumerate(marks)])
1418
+ for i, (zh, en, *marks) in enumerate(MATRIX)
1419
+ ]),
1420
+ ]),
1421
+ ])], bg="--mk-panel")
1422
+
1423
+
1424
+ # ── FIGURE 01: what a workflow actually looks like ────────────────────────────
1425
+ # The page had no graphic on it at all - every section was type and rules, which is
1426
+ # austere for eleven screens. A diagram is the one element that says something no
1427
+ # sentence here can, and drawn in hairline boxes it belongs to the same document
1428
+ # rather than arriving from a different one.
1429
+ FLOW = [
1430
+ ("網站表單", "FORM", "n8n 節點", "WORKFLOW", "ERP 建單", "ERP"),
1431
+ ("電商訂單", "ORDER", "Claude 判讀", "REASONING", "通知/報表", "NOTIFY"),
1432
+ ("客服訊息", "INBOX", "分類與派工", "TRIAGE", "CRM 紀錄", "CRM"),
1433
+ ]
1434
+
1435
+
1436
+ def flow_cell(attr, zh, en):
1437
+ return box(attr,
1438
+ {"paddingTop": "14px", "paddingBottom": "14px",
1439
+ "paddingLeft": "16px", "paddingRight": "16px",
1440
+ "customStyles": "border:1px solid " + RULE + ";"},
1441
+ [mono(en, size="9px", color="--mk-faint", track="0.18em"),
1442
+ T("p", zh, color={"token": "--mk-ink"}, fontSize="14px",
1443
+ marginTop="6px", _m={"fontSize": "13px"})])
1444
+
1445
+
1446
+ def arrow(attr):
1447
+ return box(attr, {"display": "flex", "justifyContent": "center",
1448
+ "alignItems": "center"},
1449
+ [T("p", "→", color={"token": "--mk-accent-ink"}, fontSize="15px",
1450
+ fontFamily=MONO)],
1451
+ _m={"customStyles": "transform:rotate(90deg);"})
1452
+
1453
+
1454
+ FIGURE_SEC = section("figure", [wrap("mk-fig2-in", [
1455
+ box("mk-fig2-pad", {"paddingTop": "82px", "paddingBottom": "82px"},
1456
+ _m={"paddingTop": "54px", "paddingBottom": "54px"},
1457
+ children=[
1458
+ box("mk-fig2-head",
1459
+ {"display": "flex", "justifyContent": "space-between",
1460
+ "columnGap": "20px", "rowGap": "8px",
1461
+ "customStyles": "flex-wrap:wrap;"},
1462
+ [mono("FIGURE 01 — A WORKFLOW", size="10px",
1463
+ color="--mk-accent-ink", track="0.22em"),
1464
+ mono("INPUT → PROCESS → OUTPUT", size="10px",
1465
+ color="--mk-faint", track="0.18em")]),
1466
+ box("mk-fig2-grid",
1467
+ {"display": "grid", "gridCols": "1fr 44px 1fr 44px 1fr",
1468
+ "columnGap": "0px", "rowGap": "16px", "marginTop": "34px"},
1469
+ _t={"gridCols": "1fr 34px 1fr 34px 1fr"},
1470
+ _m={"gridCols": "repeat(1, 1fr)", "rowGap": "8px",
1471
+ "marginTop": "24px"},
1472
+ children=[
1473
+ node for i, row in enumerate(FLOW) for node in (
1474
+ flow_cell("mk-fl-a-%d" % i, row[0], row[1]),
1475
+ arrow("mk-ar-a-%d" % i),
1476
+ flow_cell("mk-fl-b-%d" % i, row[2], row[3]),
1477
+ arrow("mk-ar-b-%d" % i),
1478
+ flow_cell("mk-fl-c-%d" % i, row[4], row[5]),
1479
+ )
1480
+ ]),
1481
+ T("p", "同一條線可以接任何一端:表單、訂單、訊息進來,"
1482
+ "判斷與轉換在中間,結果送到你本來就在用的系統裡。",
1483
+ color={"token": "--mk-muted"}, fontSize="13px", lineHeight="1.95",
1484
+ marginTop="26px", maxWidth="42em", _m={"fontSize": "12.5px"}),
1485
+ ]),
1486
+ ])])
1487
+
1488
+
1340
1489
  # ── PLATE 01: a statement ─────────────────────────────────────────────────────
1341
1490
  # Every clause on this page has the same rhythm - a numbered head, then hairline
1342
1491
  # rows. That is correct for a specification and monotonous for a page. A document
@@ -1511,8 +1660,9 @@ HOME_TREE = {"type": "div", "data": {"attrID": "mk-home"},
1511
1660
  MARKS, INDEX, CUE,
1512
1661
  # paper, panel, paper, ink, paper, ink, paper - the page
1513
1662
  # changes ground five times so it reads as chapters
1514
- MASTHEAD, TICKER_BAND, PLATE, SERVICE_SEC, PROCESS_SEC,
1515
- WORK_SEC, SPECIMEN, STACK_SEC, PRODUCT_SEC, VOICE_SEC, CONTACT,
1663
+ MASTHEAD, TICKER_BAND, PLATE, SERVICE_SEC, MATRIX_SEC,
1664
+ PROCESS_SEC, FIGURE_SEC, WORK_SEC, SPECIMEN, STACK_SEC,
1665
+ PRODUCT_SEC, VOICE_SEC, CONTACT,
1516
1666
  ])]}
1517
1667
 
1518
1668
  SITE = {