mosaic-headless 1.20.0 → 1.21.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 +5 -3
- package/README.ko.md +5 -3
- package/README.md +45 -3
- package/README.zh-TW.md +38 -3
- package/SKILL.md +49 -8
- 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.csv +144 -0
- package/data/intro-verification.csv +9 -9
- package/data/navigation-verification.csv +28 -0
- package/data/page-modal-verification.csv +20 -0
- package/data/rwd-verification.csv +2 -0
- package/data/slider-verification.csv +20 -0
- package/package.json +6 -6
- package/references/dialog-and-triggers.md +75 -1
- package/references/slider.md +79 -0
- package/{bin → scripts}/check-release.mjs +25 -8
- package/{bin → scripts}/sync-version.mjs +14 -2
- package/sites/_moksa.py +179 -2
- package/sites/moksa.json +17014 -11914
- package/tools/verify_dialog.py +61 -34
- package/tools/verify_navigation.py +114 -0
- package/tools/verify_slider.py +256 -0
- /package/{bin → scripts}/install.mjs +0 -0
package/README.ja.md
CHANGED
|
@@ -146,8 +146,8 @@ commit の成功はページが動く証拠ではないし、正しいスタイ
|
|
|
146
146
|
| **ノード型** | 122 / 122 を 1 型 1 ドキュメントでスイープ、commit → 描画 → 断言 → 削除:74 RENDERED、25 COMMITTED、15 COMMIT_5xx、12 BROKE_PAGE。1.0.8 で再スイープ:以前は黙って commit されていた 5 型が、親なしではページを落とすようになった。描画されなかった行のうち 3 つは「必要な親なしで commit した」というスイープ手法の産物で、その旨が行の横にある |
|
|
147
147
|
| **スタイルプロパティ** | 98 / 98 を実ページに書き、コンパイル済み CSS と照合:58 COMPILED、18 ABSENT、21 SKIPPED |
|
|
148
148
|
| **ノードプロパティ** | 191 / 191 を各プロパティ自身のバリデータ連鎖から導いた値で再探査:35 APPLIED、43 NO_EFFECT、55 NO_HOST、47 SKIPPED |
|
|
149
|
-
| **レスポンシブ** | 2 サイト計
|
|
150
|
-
| **ブラウザ** | 配信された 2 ページを Chromium の 3 つのビューポートで計算スタイル
|
|
149
|
+
| **レスポンシブ** | 2 サイト計 733 件の `_t`/`_m` 宣言を、サイトが実際に配信したスタイルシートに対して 1 件ずつ断言 — 全件検証済み |
|
|
150
|
+
| **ブラウザ** | 配信された 2 ページを Chromium の 3 つのビューポートで計算スタイル 4,132 件読み取り:2,929 件が一致、912 件は比較不能として明示、**上書き 0 件** |
|
|
151
151
|
| **デザイン監査** | コントラスト、フォントフォールバック、CJK の字送り、横溢れ、テキストの切れ、1 行の文字数 — ブラウザ上で実行、**指摘 26 件、すべて理由付きで裁定済み** — 理由のない容認はリリースゲートが拒否する |
|
|
152
152
|
| **コンポーネント** | コンポーネントシステムを端から端まで駆動、**8 件中 8 件**:カテゴリの下に作成、ドキュメントが自己修復、書き込み可能インスタンス経由でツリーを充填、読み取り専用インスタンスは同じ書き込みを拒否(ネガティブコントロール)、ページ上の 2 インスタンスが 1 つの定義を 2 度描画 |
|
|
153
153
|
| **スタイル状態** | 53 状態のうち 52 を実ページに書き、表が約束するセレクタと照合:**36 が完全一致**、13 NO_HOST、3 SKIPPED、0 BROKE_PAGE。擬似クラスは大文字で出力される(`.M_EL9:HOVER`) |
|
|
@@ -160,6 +160,8 @@ commit の成功はページが動く証拠ではないし、正しいスタイ
|
|
|
160
160
|
| **スキル自身** | `claude plugin eval .` — ユーザーが実際に尋ねる 5 問を各 3 回、スキルあり/なしの 2 腕、1 回ごとに LLM 審査 3 名。**あり:5 問すべて 1.00。なし:5 問すべて 0.00。** ベースラインの最善の回答は回答拒否だった |
|
|
161
161
|
| **ライブ計測** | REST ルート 115、variant 156、条件サブジェクト 59、23 テーブル / 210 カラム |
|
|
162
162
|
| **1.0.9 の新機能** | modal(`<dialog>`)、OpenStreetMap、exit-intent と scroll-depth のトリガー、run rules、memory アクション、modal ショートハンド — すべて実ページに作り、ブラウザで実際に操作:19 / 19。「離脱時ポップアップを 1 セッション 1 回」が配線なしのオブジェクト 1 つで済む |
|
|
163
|
+
| **slider** | ファクトリが要求する入れ子でブラウザ実操作、19 / 19:宣言どおりの間隔で自走、矢印・ドット・キーボードで駆動、`prefers-reduced-motion` では自ら停止。ドットは実はテンプレートで、スライド数だけ複製され id は全部同じ |
|
|
164
|
+
| **本物のサイト** | 変換済み 19 ページを 1 つのサイトに:実メニューとページごとのモーダル。ナビ 27 / 27、モーダル 19 / 19、トリガー/ルール/記憶/閉じ方の組み合わせは 6 種 |
|
|
163
165
|
| **カスタムフィールド** | ACF と Meta Box、1 ページに 40 フィールド、`@VAR` / `@LOOP` で配信 HTML から読み戻し:62 のうち 59 が解決、3 つの空は理由付き;複数値フィールドのループはフィールドの行数どおりに描画。`tools/list_fields.php` が Mosaic の実際の登録名を出す |
|
|
164
166
|
| **ライブ更新** | 1.0.7 → 1.0.8 をプラグイン自身の milestone ルートで wp-admin の外から駆動:6 milestone、4 テーブル改名、出力クラス名は全部変わり、`customStyles` は全部書き換え — その結果に対して上の計測をすべて再実行 |
|
|
165
167
|
|
|
@@ -269,7 +271,7 @@ npm version minor # package.json、SKILL.md、8 つのプラットフォー
|
|
|
269
271
|
# commit、tag、push;tag が release.yml を起動する
|
|
270
272
|
```
|
|
271
273
|
|
|
272
|
-
`
|
|
274
|
+
`scripts/check-release.mjs` がすべてのリリースを門番する。検査するのは「検査しやすいこと」ではなく
|
|
273
275
|
「間違えやすいこと」:版番号の一致、`files` の各 glob が何かに一致すること、各検証 CSV の行数が
|
|
274
276
|
SKILL.md と 4 つの README が引用する数と等しいこと、未裁定のデザイン監査指摘がないこと、eval
|
|
275
277
|
スイートが存在すること、そして **tarball そのものの検査** — npm の `files` 許可リストは
|
package/README.ko.md
CHANGED
|
@@ -142,8 +142,8 @@ commit 성공은 페이지가 동작한다는 증거가 아니고, 올바른 스
|
|
|
142
142
|
| **노드 타입** | 122 / 122를 문서당 하나씩 스윕, commit → 렌더 → 단언 → 삭제: 74 RENDERED, 25 COMMITTED, 15 COMMIT_5xx, 12 BROKE_PAGE. 1.0.8에서 재스윕: 전에는 조용히 commit되던 5개 타입이 부모 없이는 페이지를 죽인다. 렌더되지 않은 행 중 셋은 "필요한 부모 없이 commit"한 스윕 방식의 산물이며, 그 사실이 행 옆에 적혀 있다 |
|
|
143
143
|
| **스타일 프로퍼티** | 98 / 98을 실제 페이지에 쓰고 컴파일된 CSS와 대조: 58 COMPILED, 18 ABSENT, 21 SKIPPED |
|
|
144
144
|
| **노드 프로퍼티** | 191 / 191을 각 프로퍼티 자신의 검증기 체인에서 도출한 값으로 재탐사: 35 APPLIED, 43 NO_EFFECT, 55 NO_HOST, 47 SKIPPED |
|
|
145
|
-
| **반응형** | 두 사이트 합쳐
|
|
146
|
-
| **브라우저** | 전달된 두 페이지를 Chromium의 세 가지 뷰포트에서 계산 스타일
|
|
145
|
+
| **반응형** | 두 사이트 합쳐 733개의 `_t`/`_m` 선언을, 사이트가 실제로 내보낸 스타일시트에 대해 하나씩 단언 — 전부 검증됨 |
|
|
146
|
+
| **브라우저** | 전달된 두 페이지를 Chromium의 세 가지 뷰포트에서 계산 스타일 4,132건 판독: 2,929건 일치, 912건은 비교 불가로 명시, **덮어쓰기 0건** |
|
|
147
147
|
| **디자인 감사** | 명암비, 폰트 폴백, CJK 자간, 가로 넘침, 텍스트 잘림, 한 줄 글자 수 — 브라우저에서 실행, **지적 26건, 모두 서면으로 판정** — 이유 없는 승인은 릴리스 게이트가 거부한다 |
|
|
148
148
|
| **컴포넌트** | 컴포넌트 시스템을 끝에서 끝까지 구동, **8건 중 8건**: 카테고리 아래 생성, 문서 자가 치유, 쓰기 가능 인스턴스로 트리 채움, 읽기 전용 인스턴스는 같은 쓰기를 거부(네거티브 컨트롤), 페이지의 두 인스턴스가 하나의 정의를 두 번 렌더 |
|
|
149
149
|
| **스타일 상태** | 53개 상태 중 52개를 실제 페이지에 쓰고 표가 약속한 셀렉터와 대조: **36개 정확히 일치**, 13 NO_HOST, 3 SKIPPED, 0 BROKE_PAGE. 의사 클래스는 대문자로 출력된다(`.M_EL9:HOVER`) |
|
|
@@ -156,6 +156,8 @@ commit 성공은 페이지가 동작한다는 증거가 아니고, 올바른 스
|
|
|
156
156
|
| **스킬 자체** | `claude plugin eval .` — 사용자가 실제로 묻는 5문항을 각 3회, 스킬 있음/없음 두 팔로, 매회 LLM 심사 3명. **있음: 5문항 모두 1.00. 없음: 5문항 모두 0.00.** 베이스라인의 최선은 답변 거부였다 |
|
|
157
157
|
| **라이브 측정** | REST 라우트 115, variant 156, 조건 subject 59, 23 테이블 / 210 컬럼 |
|
|
158
158
|
| **1.0.9 신기능** | modal(`<dialog>`), OpenStreetMap, exit-intent·scroll-depth 트리거, run rules, memory 액션, modal 숏핸드를 실제 페이지에 만들고 브라우저에서 직접 조작: 19/19. "이탈 의도 팝업, 세션당 한 번"이 배선 없이 객체 하나 |
|
|
159
|
+
| **slider** | 팩토리가 요구하는 중첩으로 브라우저에서 실제 조작, 19/19: 선언한 간격으로 자동 전진, 화살표·불릿·키보드로 구동, `prefers-reduced-motion`에서 스스로 멈춤. 불릿은 사실 템플릿이라 슬라이드 수만큼 복제되고 id가 전부 같다 |
|
|
160
|
+
| **진짜 사이트** | 변환된 19개 페이지를 하나의 사이트로: 실제 메뉴와 페이지별 모달. 내비 27/27, 모달 19/19, 트리거·규칙·기억·닫기 조합 6종 |
|
|
159
161
|
| **커스텀 필드** | ACF와 Meta Box, 한 페이지에 40개 필드, `@VAR` / `@LOOP`로 전달된 HTML에서 읽어냄: 62개 중 59개 해석, 빈 3개는 이유 있음; 다중값 필드 루프는 필드의 행 수 그대로 렌더링. `tools/list_fields.php`가 Mosaic이 실제 등록하는 이름을 출력 |
|
|
160
162
|
| **라이브 업그레이드** | 1.0.7 → 1.0.8을 플러그인 자체 milestone 라우트로 wp-admin 밖에서 구동: 6 milestone, 테이블 4개 이름 변경, 출력 클래스 이름 전부 변경, `customStyles` 전부 재작성 — 그 결과 위에서 위의 측정을 전부 다시 실행 |
|
|
161
163
|
|
|
@@ -263,7 +265,7 @@ npm version minor # package.json, SKILL.md, 8개 플랫폼 템플릿의 버
|
|
|
263
265
|
# commit, tag, push; tag가 release.yml을 트리거
|
|
264
266
|
```
|
|
265
267
|
|
|
266
|
-
`
|
|
268
|
+
`scripts/check-release.mjs`가 모든 릴리스를 지킨다. 검사하는 것은 "검사하기 쉬운 것"이 아니라
|
|
267
269
|
"틀리기 쉬운 것": 버전 번호 일치, `files`의 각 glob이 무언가와 매칭, 각 검증 CSV의 행 수가
|
|
268
270
|
SKILL.md와 네 README가 인용하는 수와 같음, 판정되지 않은 디자인 감사 지적 없음, eval 스위트
|
|
269
271
|
존재, 그리고 **tarball 자체 검사** — npm의 `files` 허용 목록은 `.gitignore`를 덮어쓰며, 한때
|
package/README.md
CHANGED
|
@@ -43,6 +43,45 @@ npx mosaic-headless@latest claude-code --global --force
|
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
|
|
46
|
+
## Install as a Claude plugin
|
|
47
|
+
|
|
48
|
+
The repository is also a Claude plugin: `.claude-plugin/plugin.json` at the root, and
|
|
49
|
+
the root `SKILL.md` loads as its one skill. Once the plugin is listed in the Claude
|
|
50
|
+
directory, install it from there. Until then, Claude Code can load a clone directly:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
git clone https://github.com/Moksa1123/mosaic-headless
|
|
54
|
+
claude --plugin-dir ./mosaic-headless
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
This is an independent project. It is not made by, endorsed by, or affiliated with
|
|
58
|
+
Nextend, the maker of Mosaic Pro.
|
|
59
|
+
|
|
60
|
+
## What this plugin runs and connects to
|
|
61
|
+
|
|
62
|
+
The plugin has no hooks, no MCP servers and no background processes. Everything
|
|
63
|
+
below runs only when Claude follows `SKILL.md` and you approve the command:
|
|
64
|
+
|
|
65
|
+
- **`tools/mo.py`** reads the CSV tables in `data/` and prints answers. It writes
|
|
66
|
+
nothing and contacts nothing.
|
|
67
|
+
- **`tools/*.php`** run inside your own WordPress through `wp eval-file`. They read
|
|
68
|
+
and write Mosaic's own tables and theme data on that site.
|
|
69
|
+
- **`tools/mint_session.php`** creates a logged-in WordPress session and a matching
|
|
70
|
+
REST nonce for an account on *your* site. You put them in a local config file
|
|
71
|
+
(`--config sweep.json`); they are printed to your terminal and sent nowhere else.
|
|
72
|
+
- **`tools/build_site.py`, `data_upgrade.py`, `theme_zip.py`, `probe_accordion.py` and the `sweep_*.py`
|
|
73
|
+
tools** call Mosaic's REST routes on the site in that config file, with that
|
|
74
|
+
session, to read and write pages, components and themes. They contact only that
|
|
75
|
+
site.
|
|
76
|
+
- **`tools/verify_*.py`** open pages of that same site with Playwright (Chromium) or
|
|
77
|
+
`urllib` and compare what was delivered with what was written.
|
|
78
|
+
- **`sites/`** holds the worked example (the author's own site) as data. Its design
|
|
79
|
+
loads Google Fonts, so pages built from it make visitors' browsers fetch fonts from
|
|
80
|
+
Google, as any page using Google Fonts does.
|
|
81
|
+
|
|
82
|
+
The tools need Python 3 and Playwright. Nothing is downloaded at install time, and no
|
|
83
|
+
data is sent to the author or any third party.
|
|
84
|
+
|
|
46
85
|
## What this is
|
|
47
86
|
|
|
48
87
|
Mosaic keeps a page in **23 custom database tables**, not in `post_content` and not
|
|
@@ -151,8 +190,8 @@ factories, so Pro types register and render regardless.
|
|
|
151
190
|
| **node types** | 122 / 122 swept one per document, committed → rendered → asserted → deleted: 74 RENDERED, 25 COMMITTED, 15 COMMIT_5xx, 12 BROKE_PAGE. Re-swept on 1.0.8: five types that used to commit silently now kill the page unparented. The non-rendering rows that are artefacts of committing without the required parent say so beside the row |
|
|
152
191
|
| **style properties** | 98 / 98 written to a live page and checked against the compiled CSS: 58 COMPILED, 18 ABSENT, 21 SKIPPED |
|
|
153
192
|
| **node properties** | 191 / 191 re-probed with a value shaped by each property's own validator chain: 35 APPLIED, 43 NO_EFFECT, 55 NO_HOST, 47 SKIPPED |
|
|
154
|
-
| **responsive** |
|
|
155
|
-
| **browser** |
|
|
193
|
+
| **responsive** | 733 `_t`/`_m` declarations across two sites asserted against the stylesheet the site actually served — all verified |
|
|
194
|
+
| **browser** | 4,132 computed-style readings on two delivered pages in Chromium at three viewports: 2,929 compared and agreed, 912 not-comparable and labelled, **0 overridden** |
|
|
156
195
|
| **design audit** | contrast, font fallback, CJK tracking, overflow, clipped text, line measure — run in the browser, **26 findings, every one ruled on in writing** — an acknowledgement without a reason is refused by the release gate |
|
|
157
196
|
| **components** | the component system driven end to end, **8 of 8**: created under a category, document healed, tree filled through the writable instance, the read-only one refused the same write as a negative control, two instances on a page rendering one definition twice |
|
|
158
197
|
| **style states** | 52 of the 53 states written to a live page and matched against the selector the table promises: **36 compiled exactly**, 13 NO_HOST, 3 SKIPPED, 0 BROKE_PAGE. Pseudo-classes are emitted UPPERCASE (`.M_EL9:HOVER`) |
|
|
@@ -165,6 +204,8 @@ factories, so Pro types register and render regardless.
|
|
|
165
204
|
| **the skill itself** | `claude plugin eval .` — five cases a user would ask, three runs each, with and without the skill loaded, three LLM judges a run. **With: 1.00 on all five. Without: 0.00 on all five.** The baseline's best answer was to refuse |
|
|
166
205
|
| **measured live** | 115 REST routes, 156 variants, 59 condition subjects, 23 tables / 210 columns |
|
|
167
206
|
| **1.0.9 features** | the modal (`<dialog>`), OpenStreetMap, the exit-intent and scroll-depth triggers, run rules, memory actions and the modal shorthand, each built on a live page and exercised in a real browser: 19 of 19. An exit-intent popup that fires once a session is one object, no wiring |
|
|
207
|
+
| **slider** | the whole family nested as its factories require and driven in a browser, 19 of 19: advances on its own delay, arrows and bullets and the keyboard move it, holds still under `prefers-reduced-motion`. The bullet turns out to be a template repeated per slide - same id on every copy |
|
|
208
|
+
| **a real site** | the nineteen converted Elementor pages assembled into one site with a real menu and a modal per page: 27 of 27 navigation checks, 19 of 19 modals, six distinct trigger / run-rule / memory / dismissal configurations |
|
|
168
209
|
| **custom fields** | ACF and Meta Box, forty fields on a page, read back through `@VAR` / `@LOOP` off the delivered HTML: 59 of 62 resolve, 3 empties explained; loops over multi-value fields rendered exactly the field's rows. `tools/list_fields.php` prints the names Mosaic actually registers |
|
|
169
210
|
| **upgraded live** | 1.0.7 -> 1.0.8 over the plugin's own milestone route, from outside wp-admin: 6 milestones, four tables renamed, every emitted class name changed, every `customStyles` rewritten - then every sweep above re-run on the result |
|
|
170
211
|
|
|
@@ -250,6 +291,7 @@ and heading level — and it earned its place at once: it caught the converter l
|
|
|
250
291
|
| `theme_zip.py` / `theme_zip_compare.php` / `theme_delete.php` | Mosaic's own ZIP export/import from outside the editor, the copy held against the source, and a clean delete that refuses the live theme |
|
|
251
292
|
| `list_fields.php` | every `@VAR` / `@LOOP` name a post's custom fields register, with values |
|
|
252
293
|
| `verify_dialog.py` | the 1.0.9 modal, triggers, run rules and memory, driven in a browser |
|
|
294
|
+
| `verify_slider.py` / `verify_navigation.py` | does the slider actually move; is every menu item a real link and every page reachable |
|
|
253
295
|
| `data_upgrade.py` | after a plugin update, Mosaic's data migration over its own milestone route - the editor API is gone until it runs |
|
|
254
296
|
| `sweep_*.py` / `probe_*.py` | the instruments the tables were made with |
|
|
255
297
|
| `bootstrap_probe_theme.php` / `mint_session.php` | a licence-free scratch theme and a REST session from WP-CLI |
|
|
@@ -280,7 +322,7 @@ npm version minor # bumps package.json, SKILL.md and eight platform templat
|
|
|
280
322
|
# commits, tags, pushes; the tag triggers release.yml
|
|
281
323
|
```
|
|
282
324
|
|
|
283
|
-
`
|
|
325
|
+
`scripts/check-release.mjs` gates every release on the things that are easy to get
|
|
284
326
|
wrong: the version numbers agree, every `files` glob matches, every verification
|
|
285
327
|
CSV still has the row count SKILL.md and the four READMEs quote, no design-audit
|
|
286
328
|
finding is unreviewed, the eval suite is present, and **the tarball itself is
|
package/README.zh-TW.md
CHANGED
|
@@ -41,6 +41,38 @@ npx mosaic-headless@latest claude-code --global --force
|
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
|
|
44
|
+
## 以 Claude plugin 安裝
|
|
45
|
+
|
|
46
|
+
這個 repo 同時也是一個 Claude plugin:根目錄有 `.claude-plugin/plugin.json`,根目錄的
|
|
47
|
+
`SKILL.md` 就是它唯一的技能。上架到 Claude 目錄之後可以直接從目錄安裝;在那之前,Claude
|
|
48
|
+
Code 可以直接載入 clone 下來的資料夾:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
git clone https://github.com/Moksa1123/mosaic-headless
|
|
52
|
+
claude --plugin-dir ./mosaic-headless
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
這是獨立專案,不是 Mosaic Pro 開發商 Nextend 的產品,也沒有得到 Nextend 背書或與其合作。
|
|
56
|
+
|
|
57
|
+
## 這個 plugin 會執行什麼、連到哪裡
|
|
58
|
+
|
|
59
|
+
這個 plugin 沒有 hook、沒有 MCP 伺服器、沒有背景程序。下面這些都只在 Claude 依照
|
|
60
|
+
`SKILL.md` 執行、而且你核准指令時才會跑:
|
|
61
|
+
|
|
62
|
+
- **`tools/mo.py`**:讀 `data/` 裡的 CSV 表並印出答案,不寫入任何東西,也不連線。
|
|
63
|
+
- **`tools/*.php`**:透過 `wp eval-file` 在你自己的 WordPress 裡執行,讀寫該網站上 Mosaic
|
|
64
|
+
自己的資料表和主題資料。
|
|
65
|
+
- **`tools/mint_session.php`**:替*你自己網站*上的帳號建立登入 session 和對應的 REST
|
|
66
|
+
nonce。你把它們放進本機的設定檔(`--config sweep.json`);它們只印在你的終端機,不會送到別處。
|
|
67
|
+
- **`tools/build_site.py`、`data_upgrade.py`、`theme_zip.py`、`probe_accordion.py` 和 `sweep_*.py`**:用那份
|
|
68
|
+
session 呼叫設定檔裡那個網站的 Mosaic REST 路由,讀寫頁面、元件和主題。只連到那個網站。
|
|
69
|
+
- **`tools/verify_*.py`**:用 Playwright(Chromium)或 `urllib` 開同一個網站的頁面,比對實際
|
|
70
|
+
輸出和寫入的內容。
|
|
71
|
+
- **`sites/`**:工作範例(作者自己的網站)的資料。它的設計有載入 Google Fonts,所以用它建出來的
|
|
72
|
+
頁面,訪客的瀏覽器會向 Google 抓字型,跟任何使用 Google Fonts 的網頁一樣。
|
|
73
|
+
|
|
74
|
+
工具需要 Python 3 和 Playwright。安裝時不會下載任何東西,也不會把資料送給作者或第三方。
|
|
75
|
+
|
|
44
76
|
## 這是什麼
|
|
45
77
|
|
|
46
78
|
Mosaic 把一個頁面放在 **23 張自訂資料表**裡,不在 `post_content`,也不在 `postmeta`。
|
|
@@ -135,8 +167,8 @@ commit 成功不代表頁面能用,樣式表正確也不代表。這裡每個
|
|
|
135
167
|
| **節點型別** | 122 / 122 逐一放進獨立文件,寫入 → 渲染 → 斷言 → 刪除:74 RENDERED、25 COMMITTED、15 COMMIT_5xx、12 BROKE_PAGE。在 1.0.8 上重掃:五個以前默默寫入的型別,沒放對父節點現在會直接弄死頁面。未渲染的當中有三個是「沒給父層」的掃描方法產物,註記就在列旁 |
|
|
136
168
|
| **樣式屬性** | 98 / 98 寫進真實頁面、對照編譯出的 CSS:58 COMPILED、18 ABSENT、21 SKIPPED |
|
|
137
169
|
| **節點屬性** | 191 / 191 用各自驗證鏈推出的值重新探測:35 APPLIED、43 NO_EFFECT、55 NO_HOST、47 SKIPPED |
|
|
138
|
-
| **響應式** | 兩個站共
|
|
139
|
-
| **瀏覽器** | 在 Chromium 三個視窗寬度上對兩個交付頁面做
|
|
170
|
+
| **響應式** | 兩個站共 733 條 `_t`/`_m` 宣告,對照網站實際送出的樣式表逐條斷言——全數通過 |
|
|
171
|
+
| **瀏覽器** | 在 Chromium 三個視窗寬度上對兩個交付頁面做 4,132 次計算樣式讀取:2,929 條比對相符、912 條標為無法比對、**0 條被覆蓋** |
|
|
140
172
|
| **設計稽核** | 對比度、字體回退、CJK 字距、水平溢出、文字裁切、每行字數——在瀏覽器裡跑,**26 項發現,每一項都有書面裁定**——沒寫理由的 acknowledge 會被發布閘門拒絕 |
|
|
141
173
|
| **元件** | 元件系統從頭驅動到尾,**8 之 8**:在分類下建立、文件自癒、透過可寫實例填入樹、唯讀實例拒絕同一筆寫入作為負控制、頁面上兩個實例渲染同一個定義 |
|
|
142
174
|
| **樣式狀態** | 53 個狀態中的 52 個寫進真實頁面,對照表格承諾的選擇器:**36 個完全吻合**、13 NO_HOST、3 SKIPPED、0 BROKE_PAGE。偽類是大寫輸出的(`.M_EL9:HOVER`) |
|
|
@@ -149,6 +181,8 @@ commit 成功不代表頁面能用,樣式表正確也不代表。這裡每個
|
|
|
149
181
|
| **技能本身** | `claude plugin eval .`——五個使用者真的會問的問題,各跑三次,有載技能和沒載各一臂,每次三個 LLM 裁判。**有:五題全 1.00。沒有:五題全 0.00。** 基準線最好的回答是拒答 |
|
|
150
182
|
| **線上量測** | 115 條 REST 路由、156 個 variant、59 個條件主體、23 張表 / 210 個欄位 |
|
|
151
183
|
| **1.0.9 新功能** | modal(`<dialog>`)、OpenStreetMap、exit-intent 與 scroll-depth 觸發、run rules、memory action 與 modal shorthand,全部建在真實頁面上並用瀏覽器實際操作:19 之 19。「離開意圖彈窗、每個 session 只出現一次」只需要一個物件,不用接線 |
|
|
184
|
+
| **slider** | 整組照工廠要求嵌套後在瀏覽器裡實際操作,19 之 19:會自己按宣告的間隔前進、箭頭與圓點與鍵盤都能驅動、`prefers-reduced-motion` 下會自己停。圓點其實是樣板,依 slide 數複製,每個複製品 id 相同 |
|
|
185
|
+
| **真正的網站** | 19 個轉換頁組成一個站:真實選單、每頁一個彈窗。導覽 27 之 27、彈窗 19 之 19,六種不同的觸發/規則/記憶/關閉設定 |
|
|
152
186
|
| **自訂欄位** | ACF 與 Meta Box,一頁四十個欄位,透過 `@VAR` / `@LOOP` 從送達的 HTML 讀回:62 個裡 59 個解析正確、3 個空值有解釋;多值欄位的迴圈剛好渲染出欄位的列數。`tools/list_fields.php` 列出 Mosaic 真正註冊的名字 |
|
|
153
187
|
| **線上升級** | 1.0.7 → 1.0.8 走外掛自己的 milestone 路由、在 wp-admin 之外驅動:6 個 milestone、四張表改名、每個輸出 class 名稱都變、每個 `customStyles` 都重寫——然後上面每一項掃描在結果上重跑 |
|
|
154
188
|
|
|
@@ -224,6 +258,7 @@ button / html / icon-list / divider / image 佔了全部元素的 99.6%。長尾
|
|
|
224
258
|
| `theme_zip.py` / `theme_zip_compare.php` / `theme_delete.php` | 在編輯器外驅動 Mosaic 自己的 ZIP 匯出匯入、副本對來源逐樹比對、以及拒絕刪 live 主題的乾淨刪除 |
|
|
225
259
|
| `list_fields.php` | 一篇文章的自訂欄位註冊了哪些 `@VAR` / `@LOOP` 名字,連值一起列出 |
|
|
226
260
|
| `verify_dialog.py` | 在瀏覽器裡實際操作 1.0.9 的 modal、觸發、run rules 與 memory |
|
|
261
|
+
| `verify_slider.py` / `verify_navigation.py` | slider 真的會動嗎;選單每一項是不是真連結、每頁是不是都到得了 |
|
|
227
262
|
| `data_upgrade.py` | 外掛更新後,走 Mosaic 自己的 milestone 路由跑資料遷移——沒跑完之前編輯器 API 是不存在的 |
|
|
228
263
|
| `sweep_*.py` / `probe_*.py` | 那些表格是用這些儀器量出來的 |
|
|
229
264
|
| `bootstrap_probe_theme.php` / `mint_session.php` | 免授權的實驗主題,以及從 WP-CLI 鑄出 REST session |
|
|
@@ -252,7 +287,7 @@ npm version minor # 更新 package.json、SKILL.md 和八個平台模板的
|
|
|
252
287
|
# commit、打 tag、push;tag 觸發 release.yml
|
|
253
288
|
```
|
|
254
289
|
|
|
255
|
-
`
|
|
290
|
+
`scripts/check-release.mjs` 把關每一次發版,檢查的是容易出錯而不是容易檢查的事:版號一致、
|
|
256
291
|
`files` 的每個 glob 都對到東西、每張驗證表的列數仍然等於 SKILL.md 和四份 README 引用的數字、
|
|
257
292
|
沒有未裁定的設計稽核發現、eval 套件在場,以及**直接檢查 tarball 本身**——npm 的 `files` 白名單
|
|
258
293
|
會蓋過 `.gitignore`,曾經把一個真實客戶的網站放進即將發布的套件裡。
|
package/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: |
|
|
|
4
4
|
Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface with `mo.py`, which joins every source table to the live sweeps so a lookup leads with the measured verdict rather than the declaration (126 node types, 191 properties, 98 style properties with 20 structured value shapes pinned down, 53 style states, 156 variants, 74 dynamic variables, 15 interaction triggers, 115 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, the design-token and element-class layers verified against compiled CSS, the @VAR() dynamic language verified against rendered output, nine designed pages built through the tables themselves, and the delivered pages re-read in Chromium at three viewports so a rule that is present, correct and still wrong cannot pass. Drives Mosaic's own theme export/import and its plugin data upgrade from outside the editor and holds the copy against the source tree for tree. Measured on Mosaic Pro 1.0.9: the modal (`<dialog>`), OpenStreetMap, the exit-intent and scroll-depth triggers, run rules and the memory actions all built on a live page and read back, and the 1.0.7 -> 1.0.8 -> 1.0.9 migrations driven from outside wp-admin.
|
|
5
5
|
license: "MIT"
|
|
6
6
|
author: "moksa (https://moksaweb.com)"
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.21.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Headless Mosaic
|
|
@@ -172,6 +172,28 @@ DESIGN SYS variants and collection variables both verified against compiled
|
|
|
172
172
|
:root{--brand: rgb(9, 99, 199)} with background-color:var(--brand).
|
|
173
173
|
references/design-system.md
|
|
174
174
|
|
|
175
|
+
SLIDER the slider family nested as its factories require, driven in a
|
|
176
|
+
browser, 19 of 19 across two configurations: it advances unaided on
|
|
177
|
+
its declared delay, the arrows and bullets move it, Enter on a
|
|
178
|
+
focused bullet moves it, and under prefers-reduced-motion it holds
|
|
179
|
+
still on its own. The sweep calls the whole family COMMIT_500 /
|
|
180
|
+
BROKE_PAGE, which is what a bare `slider` does under a plain div and
|
|
181
|
+
nothing about the component - the same kind of row the accordion
|
|
182
|
+
probe corrected. Two facts no markup announces: a
|
|
183
|
+
slider-navigation-bullet is a TEMPLATE, repeated once per slide with
|
|
184
|
+
the SAME id on every copy and an aria-label taken from each slide's
|
|
185
|
+
own title; and an arrow hides ITSELF at the end it cannot pass.
|
|
186
|
+
data/slider-verification.csv
|
|
187
|
+
|
|
188
|
+
SITE the nineteen converted Elementor pages assembled into one real site:
|
|
189
|
+
a shared shell, a menu of `menu-link` nodes that render real
|
|
190
|
+
<a href>, a WordPress page each, and a modal on every page - six
|
|
191
|
+
distinct configurations across pageLoad / exitIntent / scrollDepth,
|
|
192
|
+
cap / cooldown / firstRunWindow, page / session / forever memory and
|
|
193
|
+
four closedby policies. 27 of 27 navigation checks, 19 of 19 pages
|
|
194
|
+
carrying a working modal. data/navigation-verification.csv,
|
|
195
|
+
data/page-modal-verification.csv
|
|
196
|
+
|
|
175
197
|
DIALOG 1.0.9's features built on a live page and read back out of the
|
|
176
198
|
browser, 19 of 19: the modal renders a real <dialog> (aria-modal
|
|
177
199
|
appears only with an overlay child), a modalOpen action opens it and
|
|
@@ -314,7 +336,7 @@ ACCORDION 7 checks that resolve a wrong entry in this skill's own tables.
|
|
|
314
336
|
version of the probe destroyed the positive result it had just
|
|
315
337
|
produced. data/accordion-verification.csv
|
|
316
338
|
|
|
317
|
-
BROWSER
|
|
339
|
+
BROWSER 4,132 computed-style readings on the delivered pages in Chromium, at
|
|
318
340
|
three viewports: every declared property vs `getComputedStyle` on the
|
|
319
341
|
node it targets. 2,929 compared and agreed, 912 not-comparable and
|
|
320
342
|
labelled as such, 0 overridden. Plus a design audit that only a browser
|
|
@@ -326,7 +348,7 @@ BROWSER 3,988 computed-style readings on the delivered pages in Chromium, a
|
|
|
326
348
|
sweep's NO_EFFECT on `processShortcodes` was the sweep, not the flag.
|
|
327
349
|
data/browser-verification.csv, data/design-audit.csv
|
|
328
350
|
|
|
329
|
-
RWD
|
|
351
|
+
RWD 733 responsive declarations across two sites asserted against the
|
|
330
352
|
stylesheet the site actually served - each `_t`/`_m` property matched
|
|
331
353
|
to its element's generated class inside that breakpoint's own media
|
|
332
354
|
query. All verified; the checker is itself checked against a poisoned
|
|
@@ -469,12 +491,14 @@ so the pattern is in the data, not just in this paragraph.
|
|
|
469
491
|
10. `references/interactions.md` — the JavaScript animation system, and how far it is
|
|
470
492
|
verified.
|
|
471
493
|
11. `references/vs-elementor-gutenberg.md` — which builder habits transfer.
|
|
472
|
-
12. `references/
|
|
494
|
+
12. `references/slider.md` — the slider nested as its factories require, and the
|
|
495
|
+
two things about it the markup does not announce.
|
|
496
|
+
13. `references/custom-fields.md` — ACF and Meta Box fields as `@VAR` / `@LOOP`:
|
|
473
497
|
the names, what each field type resolves to, and the loop element that walks
|
|
474
498
|
a multi-value field. Measured, 62 rows.
|
|
475
|
-
|
|
499
|
+
14. `references/dialog-and-triggers.md` — 1.0.9's modal, OpenStreetMap, the
|
|
476
500
|
exit-intent / scroll-depth triggers, run rules, memory and the shorthand.
|
|
477
|
-
|
|
501
|
+
15. `references/upgrading.md` — what a plugin update does to the data and to the
|
|
478
502
|
delivered page, measured on 1.0.7 -> 1.0.8; how to drive the migration and what
|
|
479
503
|
to re-verify afterwards.
|
|
480
504
|
|
|
@@ -493,8 +517,8 @@ so the pattern is in the data, not just in this paragraph.
|
|
|
493
517
|
| `data/property-verification.csv` | 170 | **probed live** — per-property effect on markup vs CSS, with unprovable enums marked INCONCLUSIVE |
|
|
494
518
|
| `data/node-property-verification.csv` | 191 | **swept live** — each property probed with a value shaped by its own validator chain, on a type that declares it |
|
|
495
519
|
| `data/style-verification.csv` | 98 | **swept live** — every style property written to a page and checked against the compiled CSS, with its group beside the result |
|
|
496
|
-
| `data/rwd-verification.csv` |
|
|
497
|
-
| `data/browser-verification.csv` |
|
|
520
|
+
| `data/rwd-verification.csv` | 733 | **checked live** - every `_t`/`_m` declaration vs the served stylesheet, with status per row |
|
|
521
|
+
| `data/browser-verification.csv` | 4132 | **computed in Chromium** - declared vs `getComputedStyle` at three viewports, `not-comparable` labelled per row |
|
|
498
522
|
| `data/design-audit-acknowledged.csv` | 3 | reviewed findings that will not be fixed, each with a written reason. An acknowledgement without a reason is a suppression wearing a better name, and the release gate refuses one |
|
|
499
523
|
| `data/design-audit.csv` | 26 | **computed in Chromium** - contrast, font fallback, CJK tracking, overflow, measure. Empty means it ran and found nothing |
|
|
500
524
|
| `data/data-class-hierarchy.csv` | 125 | source - every data class and its parent, so a type's inherited properties can be resolved |
|
|
@@ -505,6 +529,9 @@ so the pattern is in the data, not just in this paragraph.
|
|
|
505
529
|
| `data/conversion-verification.csv` | 8 | **converted then checked live** - an Elementor page rebuilt as Mosaic and held against its source (text, images, links, heading levels), then put through rwd, browser and the design audit with every finding classified inherited-or-introduced |
|
|
506
530
|
| `data/conversion-batch.csv` | 19 | **converted, built and checked live, one page after another** - every Elementor page of a production site through the converter, with per-page element and content counts |
|
|
507
531
|
| `data/token-benchmark.csv` | 6 | **measured with tiktoken** - the same six lookups priced three ways: reading the plugin source, loading every table, querying `mo.py`. 71-99.5% fewer tokens than the source and 99.6%+ fewer than the tables, which total 259,539 - never load them, query them |
|
|
532
|
+
| `data/slider-verification.csv` | 19 | **driven live** - two sliders, one autoplaying and one a carousel: advance, arrows, bullets, keyboard, reduced motion |
|
|
533
|
+
| `data/navigation-verification.csv` | 27 | **fetched live** - every menu item is a real `<a href>` and every page of the nineteen answers 200 |
|
|
534
|
+
| `data/page-modal-verification.csv` | 19 | **read live** - one modal per page, and what each one's trigger, run rule, memory scope and dismissal policy actually came out as |
|
|
508
535
|
| `data/dialog-verification.csv` | 19 | **driven live** - the 1.0.9 modal, its triggers, its run rules and the memory actions, each exercised in a real browser |
|
|
509
536
|
| `data/custom-fields-verification.csv` | 62 | **rendered live** - ACF and Meta Box fields of every common type read back through `@VAR` / `@LOOP` off the delivered page, loops included |
|
|
510
537
|
| `data/theme-zip-verification.csv` | 22 | **round-tripped live** - Mosaic's own ZIP export imported in test mode and compared to its source, table by table and tree by tree |
|
|
@@ -673,6 +700,18 @@ post — `build_all.py` resets first for that reason.
|
|
|
673
700
|
rows and `theme_zip_compare.php` reports a tree that does not match - delete
|
|
674
701
|
nodes with a missing parent REPEATEDLY until none are left, because each pass
|
|
675
702
|
orphans the next level down.
|
|
703
|
+
- **Only three interaction types can be an `interactionShorthand`**: `pageLoad`,
|
|
704
|
+
`exitIntent`, `scrollDepth` (`InteractionTypesManager::getShorthandInteractionTypes`).
|
|
705
|
+
Any other is dropped in silence - the modal renders with its aria and its
|
|
706
|
+
`closedby`, the page carries no interaction, and nothing ever opens it. The
|
|
707
|
+
three that remain are exactly the ones that do not need the element to be
|
|
708
|
+
visible first, which a modal never is.
|
|
709
|
+
- **A `slider-navigation-bullet` is a template, not a list item.** One authored
|
|
710
|
+
bullet is repeated once per slide, every copy carrying the SAME id - writing
|
|
711
|
+
three gets three templates and a document full of duplicate ids. The
|
|
712
|
+
`aria-label` is Mosaic's, taken from each slide's own `title`. An arrow hides
|
|
713
|
+
itself at the end it cannot pass unless the slider is a carousel, so a test
|
|
714
|
+
that clicks `next` after autoplay has parked the slider finds nothing there.
|
|
676
715
|
- **An interaction that targets another element stores that element's NODE id**,
|
|
677
716
|
not its attrID, so both have to be written in one pass (`nodeID` on a spec
|
|
678
717
|
node pins it). The id must be unique in the THEME - `wp_mosaic_nodes`' primary
|
|
@@ -749,6 +788,8 @@ post — `build_all.py` resets first for that reason.
|
|
|
749
788
|
| `theme_zip.py` | drive Mosaic's OWN export/import - the ZIP the editor makes, attachments included, over the milestone protocol; import lands in test mode unless told `--activate` |
|
|
750
789
|
| `theme_zip_compare.php` | hold an imported copy against its source, tree for tree - every scoped table, the (parentType, type) shape, which ids survive, and orphans named rather than counted |
|
|
751
790
|
| `theme_delete.php` | remove a theme completely through the plugin's own routine; refuses the live one |
|
|
791
|
+
| `verify_slider.py` | the slider in a real browser: does it advance, do the arrows and bullets drive it, does the keyboard, does it stop when motion is not wanted |
|
|
792
|
+
| `verify_navigation.py` | a multi-page site: is every menu item a real `<a href>`, and does every page answer 200 (a template that was never bound answers 406 with an empty body, which only a logged-out visitor sees) |
|
|
752
793
|
| `verify_dialog.py` | the 1.0.9 modal in a real browser: does it open, close, answer Esc, remember, cap - and does an OpenStreetMap carry the coordinates it was given |
|
|
753
794
|
| `list_fields.php` | every `@VAR` / `@LOOP` name Mosaic registers for one post - custom fields, their derived `__label` / `__url` / `__id` properties, the row variables of each loop - with the value each resolves to (`wp eval-file`) |
|
|
754
795
|
| `data_upgrade.py` | after a plugin update, run Mosaic's data migration over its own milestone route - the step wp-admin does from a screen - and set the config's version when the editor API is back |
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "moksa (https://moksaweb.com)",
|
|
23
|
-
"version": "1.
|
|
23
|
+
"version": "1.21.0"
|
|
24
24
|
},
|
|
25
25
|
"loaderBehaviour": "Upload via Settings -> Skills -> Upload. Claude.ai parses SKILL.md frontmatter and surfaces the skill in your library. The extraction tool (extract-block-schema.php) needs a live WP-CLI connection and won't run in the sandbox; use it from a local terminal against your own site instead.",
|
|
26
26
|
"uploadSteps": [
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "moksa (https://moksaweb.com)",
|
|
23
|
-
"version": "1.
|
|
23
|
+
"version": "1.21.0"
|
|
24
24
|
},
|
|
25
25
|
"loaderBehaviour": "Auto-loads on session start when SKILL.md frontmatter parses successfully.",
|
|
26
26
|
"verified": true,
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "moksa (https://moksaweb.com)",
|
|
23
|
-
"version": "1.
|
|
23
|
+
"version": "1.21.0"
|
|
24
24
|
},
|
|
25
25
|
"loaderBehaviour": "Confirmed (2026-07-11): Codex CLI natively supports the SKILL.md spec. Place SKILL.md under .codex/skills/<name>/ (project) or ~/.codex/skills/<name>/ (personal) and Codex loads the name+description at session start, then the full body on demand. A parallel, broader convention .agents/skills/ (searched from cwd up to repo root, then ~/.agents/skills/) also exists across multiple tools - if your Codex CLI version prioritizes that path instead, mirror the same SKILL.md there.",
|
|
26
26
|
"verified": true,
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "moksa (https://moksaweb.com)",
|
|
23
|
-
"version": "1.
|
|
23
|
+
"version": "1.21.0"
|
|
24
24
|
},
|
|
25
25
|
"loaderBehaviour": "CHANGED as of 2026-07-11: GitHub Copilot added a proper '.github/skills/' Agent Skills directory (December 2025), alongside the older single-file .github/copilot-instructions.md convention. This config targets the new skills-directory form. If your Copilot version predates this (pre Dec 2025), use the instructions-append fallback instead (see fallback below).",
|
|
26
26
|
"fallback": {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "moksa (https://moksaweb.com)",
|
|
23
|
-
"version": "1.
|
|
23
|
+
"version": "1.21.0"
|
|
24
24
|
},
|
|
25
25
|
"loaderBehaviour": "CHANGED as of 2026-07-11: Gemini CLI now natively supports the same SKILL.md standard as Claude Code and Codex CLI - the same directory-based skill works unmodified. Gemini CLI discovers skills in this precedence order: built-in, extension skills, ~/.gemini/skills/ (personal), .gemini/skills/ (project, shared via version control). At session start Gemini injects each discovered skill's name+description into the system prompt and calls activate_skill when a task matches.",
|
|
26
26
|
"verified": true,
|
|
@@ -58,6 +58,54 @@ https://mosaic.moksaweb.com/moksa/,_,mk-board-utc,customDeclarations:height,34px
|
|
|
58
58
|
https://mosaic.moksaweb.com/moksa/,_,mk-caret-row,display,flex,flex,ok
|
|
59
59
|
https://mosaic.moksaweb.com/moksa/,_,mk-caret-row,alignItems,center,center,ok
|
|
60
60
|
https://mosaic.moksaweb.com/moksa/,_,mk-caret-row,marginTop,10px,10px,ok
|
|
61
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon,paddingLeft,40px,40px,ok
|
|
62
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon,paddingRight,40px,40px,ok
|
|
63
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,backgroundColor,"rgb(250,250,247)","rgb(250, 250, 247)",ok
|
|
64
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,maxWidth,520px,520px,ok
|
|
65
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,width,100%,viewport- or parent-relative,not-comparable
|
|
66
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,flexDirection,column,column,ok
|
|
67
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,rowGap,0px,0px,ok
|
|
68
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,position,relative,relative,ok
|
|
69
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,paddingTop,34px,34px,ok
|
|
70
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,paddingBottom,30px,30px,ok
|
|
71
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,paddingLeft,34px,34px,ok
|
|
72
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,paddingRight,34px,34px,ok
|
|
73
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,customDeclarations:border,"1px solid rgb(22,24,28)",no computed value,not-comparable
|
|
74
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,display,flex,flex,ok
|
|
75
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,columnGap,14px,14px,ok
|
|
76
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,rowGap,10px,10px,ok
|
|
77
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,marginTop,26px,26px,ok
|
|
78
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,flexWrap,wrap,wrap,ok
|
|
79
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,alignItems,center,center,ok
|
|
80
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,backgroundColor,"rgb(255,90,54)","rgb(255, 90, 54)",ok
|
|
81
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,color,"rgb(22,24,28)","rgb(22, 24, 28)",ok
|
|
82
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
83
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,fontSize,11px,11px,ok
|
|
84
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,letterSpacing,0.18em,1.98px,ok
|
|
85
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,fontWeight,500,500,ok
|
|
86
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,paddingLeft,22px,22px,ok
|
|
87
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,paddingRight,22px,22px,ok
|
|
88
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,paddingTop,13px,13px,ok
|
|
89
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,paddingBottom,13px,13px,ok
|
|
90
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,customDeclarations:border,"1px solid rgb(255,90,54)",no computed value,not-comparable
|
|
91
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,display,flex,flex,ok
|
|
92
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,justifyContent,space-between,space-between,ok
|
|
93
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,alignItems,baseline,baseline,ok
|
|
94
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,columnGap,16px,16px,ok
|
|
95
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,paddingBottom,14px,14px,ok
|
|
96
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,customDeclarations:border-bottom,"1px solid rgba(22,24,28,.16)",no computed value,not-comparable
|
|
97
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,backgroundColor,"rgba(0,0,0,0)","rgba(0, 0, 0, 0)",ok
|
|
98
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,color,"rgb(90,92,97)","rgb(90, 92, 97)",ok
|
|
99
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
100
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,fontSize,11px,11px,ok
|
|
101
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,letterSpacing,0.18em,1.98px,ok
|
|
102
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,fontWeight,400,400,ok
|
|
103
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,paddingLeft,4px,4px,ok
|
|
104
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,paddingRight,4px,4px,ok
|
|
105
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,paddingTop,13px,13px,ok
|
|
106
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,paddingBottom,13px,13px,ok
|
|
107
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,cursor,pointer,pointer,ok
|
|
108
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-veil,backgroundColor,"rgba(22,24,28,.62)","rgba(22, 24, 28, 0.62)",ok
|
|
61
109
|
https://mosaic.moksaweb.com/moksa/,_,mk-contact-head,display,grid,grid,ok
|
|
62
110
|
https://mosaic.moksaweb.com/moksa/,_,mk-contact-head,gridCols,84px 1fr,84px 1156px,ok
|
|
63
111
|
https://mosaic.moksaweb.com/moksa/,_,mk-contact-head,columnGap,0px,0px,ok
|
|
@@ -1317,6 +1365,54 @@ https://mosaic.moksaweb.com/moksa/,_t,mk-board-utc,customDeclarations:height,34p
|
|
|
1317
1365
|
https://mosaic.moksaweb.com/moksa/,_t,mk-caret-row,display,flex,flex,ok
|
|
1318
1366
|
https://mosaic.moksaweb.com/moksa/,_t,mk-caret-row,alignItems,center,center,ok
|
|
1319
1367
|
https://mosaic.moksaweb.com/moksa/,_t,mk-caret-row,marginTop,10px,10px,ok
|
|
1368
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon,paddingLeft,40px,40px,ok
|
|
1369
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon,paddingRight,40px,40px,ok
|
|
1370
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,backgroundColor,"rgb(250,250,247)","rgb(250, 250, 247)",ok
|
|
1371
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,maxWidth,520px,520px,ok
|
|
1372
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,width,100%,viewport- or parent-relative,not-comparable
|
|
1373
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,flexDirection,column,column,ok
|
|
1374
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,rowGap,0px,0px,ok
|
|
1375
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,position,relative,relative,ok
|
|
1376
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,paddingTop,34px,34px,ok
|
|
1377
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,paddingBottom,30px,30px,ok
|
|
1378
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,paddingLeft,34px,34px,ok
|
|
1379
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,paddingRight,34px,34px,ok
|
|
1380
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,customDeclarations:border,"1px solid rgb(22,24,28)",no computed value,not-comparable
|
|
1381
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,display,flex,flex,ok
|
|
1382
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,columnGap,14px,14px,ok
|
|
1383
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,rowGap,10px,10px,ok
|
|
1384
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,marginTop,26px,26px,ok
|
|
1385
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,flexWrap,wrap,wrap,ok
|
|
1386
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,alignItems,center,center,ok
|
|
1387
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,backgroundColor,"rgb(255,90,54)","rgb(255, 90, 54)",ok
|
|
1388
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,color,"rgb(22,24,28)","rgb(22, 24, 28)",ok
|
|
1389
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
1390
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,fontSize,11px,11px,ok
|
|
1391
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,letterSpacing,0.18em,1.98px,ok
|
|
1392
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,fontWeight,500,500,ok
|
|
1393
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,paddingLeft,22px,22px,ok
|
|
1394
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,paddingRight,22px,22px,ok
|
|
1395
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,paddingTop,13px,13px,ok
|
|
1396
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,paddingBottom,13px,13px,ok
|
|
1397
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,customDeclarations:border,"1px solid rgb(255,90,54)",no computed value,not-comparable
|
|
1398
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,display,flex,flex,ok
|
|
1399
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,justifyContent,space-between,space-between,ok
|
|
1400
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,alignItems,baseline,baseline,ok
|
|
1401
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,columnGap,16px,16px,ok
|
|
1402
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,paddingBottom,14px,14px,ok
|
|
1403
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,customDeclarations:border-bottom,"1px solid rgba(22,24,28,.16)",no computed value,not-comparable
|
|
1404
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,backgroundColor,"rgba(0,0,0,0)","rgba(0, 0, 0, 0)",ok
|
|
1405
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,color,"rgb(90,92,97)","rgb(90, 92, 97)",ok
|
|
1406
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
1407
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,fontSize,11px,11px,ok
|
|
1408
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,letterSpacing,0.18em,1.98px,ok
|
|
1409
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,fontWeight,400,400,ok
|
|
1410
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,paddingLeft,4px,4px,ok
|
|
1411
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,paddingRight,4px,4px,ok
|
|
1412
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,paddingTop,13px,13px,ok
|
|
1413
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,paddingBottom,13px,13px,ok
|
|
1414
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,cursor,pointer,pointer,ok
|
|
1415
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-veil,backgroundColor,"rgba(22,24,28,.62)","rgba(22, 24, 28, 0.62)",ok
|
|
1320
1416
|
https://mosaic.moksaweb.com/moksa/,_t,mk-contact-head,display,grid,grid,ok
|
|
1321
1417
|
https://mosaic.moksaweb.com/moksa/,_t,mk-contact-head,gridCols,84px 1fr,84px 760px,ok
|
|
1322
1418
|
https://mosaic.moksaweb.com/moksa/,_t,mk-contact-head,columnGap,0px,0px,ok
|
|
@@ -2598,6 +2694,54 @@ https://mosaic.moksaweb.com/moksa/,_m,mk-board-utc,customDeclarations:height,34p
|
|
|
2598
2694
|
https://mosaic.moksaweb.com/moksa/,_m,mk-caret-row,display,flex,flex,ok
|
|
2599
2695
|
https://mosaic.moksaweb.com/moksa/,_m,mk-caret-row,alignItems,center,center,ok
|
|
2600
2696
|
https://mosaic.moksaweb.com/moksa/,_m,mk-caret-row,marginTop,10px,10px,ok
|
|
2697
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon,paddingLeft,18px,18px,ok
|
|
2698
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon,paddingRight,18px,18px,ok
|
|
2699
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,backgroundColor,"rgb(250,250,247)","rgb(250, 250, 247)",ok
|
|
2700
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,maxWidth,520px,520px,ok
|
|
2701
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,width,100%,viewport- or parent-relative,not-comparable
|
|
2702
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,flexDirection,column,column,ok
|
|
2703
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,rowGap,0px,0px,ok
|
|
2704
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,position,relative,relative,ok
|
|
2705
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,paddingTop,34px,34px,ok
|
|
2706
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,paddingBottom,30px,30px,ok
|
|
2707
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,paddingLeft,34px,34px,ok
|
|
2708
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,paddingRight,34px,34px,ok
|
|
2709
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,customDeclarations:border,"1px solid rgb(22,24,28)",no computed value,not-comparable
|
|
2710
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,display,flex,flex,ok
|
|
2711
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,columnGap,14px,14px,ok
|
|
2712
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,rowGap,10px,10px,ok
|
|
2713
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,marginTop,26px,26px,ok
|
|
2714
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,flexWrap,wrap,wrap,ok
|
|
2715
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,alignItems,center,center,ok
|
|
2716
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,backgroundColor,"rgb(255,90,54)","rgb(255, 90, 54)",ok
|
|
2717
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,color,"rgb(22,24,28)","rgb(22, 24, 28)",ok
|
|
2718
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
2719
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,fontSize,11px,11px,ok
|
|
2720
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,letterSpacing,0.18em,1.98px,ok
|
|
2721
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,fontWeight,500,500,ok
|
|
2722
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,paddingLeft,22px,22px,ok
|
|
2723
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,paddingRight,22px,22px,ok
|
|
2724
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,paddingTop,13px,13px,ok
|
|
2725
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,paddingBottom,13px,13px,ok
|
|
2726
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,customDeclarations:border,"1px solid rgb(255,90,54)",no computed value,not-comparable
|
|
2727
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,display,flex,flex,ok
|
|
2728
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,justifyContent,space-between,space-between,ok
|
|
2729
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,alignItems,baseline,baseline,ok
|
|
2730
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,columnGap,16px,16px,ok
|
|
2731
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,paddingBottom,14px,14px,ok
|
|
2732
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,customDeclarations:border-bottom,"1px solid rgba(22,24,28,.16)",no computed value,not-comparable
|
|
2733
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,backgroundColor,"rgba(0,0,0,0)","rgba(0, 0, 0, 0)",ok
|
|
2734
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,color,"rgb(90,92,97)","rgb(90, 92, 97)",ok
|
|
2735
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
2736
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,fontSize,11px,11px,ok
|
|
2737
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,letterSpacing,0.18em,1.98px,ok
|
|
2738
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,fontWeight,400,400,ok
|
|
2739
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,paddingLeft,4px,4px,ok
|
|
2740
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,paddingRight,4px,4px,ok
|
|
2741
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,paddingTop,13px,13px,ok
|
|
2742
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,paddingBottom,13px,13px,ok
|
|
2743
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,cursor,pointer,pointer,ok
|
|
2744
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-veil,backgroundColor,"rgba(22,24,28,.62)","rgba(22, 24, 28, 0.62)",ok
|
|
2601
2745
|
https://mosaic.moksaweb.com/moksa/,_m,mk-contact-head,display,grid,grid,ok
|
|
2602
2746
|
https://mosaic.moksaweb.com/moksa/,_m,mk-contact-head,gridCols,48px 1fr,48px 306px,ok
|
|
2603
2747
|
https://mosaic.moksaweb.com/moksa/,_m,mk-contact-head,columnGap,0px,0px,ok
|