@microi.net/cli 6.2.4 → 6.3.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/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +6 -6
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +98 -98
- package/scripts/microi-cli.js +44 -44
- package/scripts/microi-codex-broker.js +2 -0
- package/scripts/microi-skills.meta.json +275 -257
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +89 -86
- package/skills/app-store/SKILL.md +555 -553
- package/skills/app-store/references/platform-row-format.md +7 -0
- package/skills/dos-orm/SKILL.md +2 -0
- package/skills/dos-orm/references/oceanbase-mysql.md +8 -0
- package/skills/message-notification/SKILL.md +2 -0
- package/skills/microi-ai-application/SKILL.md +1 -0
- package/skills/microi-client-frontend/SKILL.md +12 -48
- package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +18 -1
- package/skills/microi-client-frontend/references/progressive-04-/345/211/215/347/253/257/346/216/245/345/217/243/344/270/216/347/274/223/345/255/230/346/201/242/345/244/215.md +45 -0
- package/skills/microi-codex/SKILL.md +2 -0
- package/skills/microi-deployment/SKILL.md +7 -0
- package/skills/microi-docs-coverage/references/capability-map.md +1 -1
- package/skills/microi-microservice/SKILL.md +14 -0
- package/skills/microi-mobile-app-quality/SKILL.md +2 -0
- package/skills/microi-mobile-app-quality/references/mobile-first-delivery.md +2 -1
- package/skills/microi-system-delivery/SKILL.md +8 -1
- package/skills/microi-system-delivery/references/delivery-pitfalls.md +19 -0
- package/skills/microi-ui/SKILL.md +7 -4
- package/skills/microi-uniapp-frontend/SKILL.md +10 -1
- package/skills/microi.v8.js +17 -3
- package/skills/module-engine/SKILL.md +5 -0
- package/skills/playwright-e2e/SKILL.md +11 -3
- package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +4 -4
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +2 -2
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +2 -2
- package/skills/ui-design/SKILL.md +19 -5
- package/skills/ui-design/assets/pattern-showcase/app.js +57 -0
- package/skills/ui-design/assets/pattern-showcase/index.html +35 -4
- package/skills/ui-design/assets/pattern-showcase/scenario-state.js +34 -0
- package/skills/ui-design/assets/pattern-showcase/styles.css +115 -0
- package/skills/ui-design/references/data-workspace-density.md +8 -0
- package/skills/ui-design/references/design-pattern-library.md +50 -1
- package/skills/ui-design/references/mobile-product-language.md +93 -0
- package/skills/uniapp-mall-assets/SKILL.md +1 -0
- package/skills/v8-crud-api/SKILL.md +2 -1
- package/skills/v8-file-upload/SKILL.md +2 -2
- package/skills/v8-frontend-events/SKILL.md +2 -1
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +21 -1
- package/skills/v8-table-event/SKILL.md +2 -1
- package/skills/vision-engine/SKILL.md +284 -280
- package/skills/vision-engine/references/architecture-and-acceptance.md +14 -0
- package/skills/vision-engine/references/realtime-cpu-profiles.md +73 -0
- package/skills/vision-engine/references/video-timeline.md +176 -0
- package/skills/workspace-conventions/SKILL.md +3 -0
|
@@ -257,6 +257,121 @@ button, a { -webkit-tap-highlight-color: transparent; }
|
|
|
257
257
|
.mci-contract__code span { color: #72e7ff; }
|
|
258
258
|
.mci-lab__footer { display: flex; justify-content: space-between; width: min(1180px, calc(100% - 40px)); margin: 0 auto; padding: 30px 0 42px; border-top: 1px solid var(--mci-border); color: var(--mci-text-muted); font-size: 10px; letter-spacing: .08em; }
|
|
259
259
|
|
|
260
|
+
/* 场景维度独立于明暗与强调色;构图和业务状态不随换色改变。 */
|
|
261
|
+
:root {
|
|
262
|
+
--mci-scene-canvas: #14221a;
|
|
263
|
+
--mci-scene-paper: #1c2c22;
|
|
264
|
+
--mci-scene-soft: #293c30;
|
|
265
|
+
--mci-scene-text: #f1f5ed;
|
|
266
|
+
--mci-scene-muted: #b0c0b3;
|
|
267
|
+
--mci-scene-line: #48604f;
|
|
268
|
+
--mci-scene-accent: #c9e5cb;
|
|
269
|
+
--mci-scene-on-accent: #1d3526;
|
|
270
|
+
--mci-scene-warm: #484231;
|
|
271
|
+
--mci-scene-sky: #30494e;
|
|
272
|
+
--mci-scene-risk: #f4cda1;
|
|
273
|
+
}
|
|
274
|
+
:root[data-mci-theme="light"] {
|
|
275
|
+
--mci-scene-canvas: #eef1e9;
|
|
276
|
+
--mci-scene-paper: #fafbf7;
|
|
277
|
+
--mci-scene-soft: #e0e9da;
|
|
278
|
+
--mci-scene-text: #1d3024;
|
|
279
|
+
--mci-scene-muted: #536557;
|
|
280
|
+
--mci-scene-line: #c2cdc0;
|
|
281
|
+
--mci-scene-accent: #29563f;
|
|
282
|
+
--mci-scene-on-accent: #ffffff;
|
|
283
|
+
--mci-scene-warm: #f0e2cd;
|
|
284
|
+
--mci-scene-sky: #dbe9e9;
|
|
285
|
+
--mci-scene-risk: #835122;
|
|
286
|
+
}
|
|
287
|
+
:root[data-mci-palette="violet"] { --mci-scene-accent: #e1d3f3; --mci-scene-on-accent: #39264e; --mci-scene-soft: #383046; }
|
|
288
|
+
:root[data-mci-theme="light"][data-mci-palette="violet"] { --mci-scene-accent: #624779; --mci-scene-on-accent: #fff; --mci-scene-soft: #e8e1f0; }
|
|
289
|
+
.mci-expression { width: min(1180px, calc(100% - 40px)); margin: 0 auto; padding: 64px 0 84px; border-top: 1px solid var(--mci-border); }
|
|
290
|
+
.mci-expression__heading { display: flex; align-items: end; justify-content: space-between; flex-wrap: wrap; gap: 24px; }
|
|
291
|
+
.mci-expression__heading h2 { max-width: 620px; margin: 8px 0 0; font-size: clamp(26px, 3vw, 38px); line-height: 1.25; letter-spacing: -.04em; }
|
|
292
|
+
.mci-expression__kicker, .mci-expression__notice { color: var(--mci-text-muted); font-size: 13px; line-height: 1.7; }
|
|
293
|
+
.mci-expression__kicker { margin: 0; }
|
|
294
|
+
.mci-expression__controls { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
295
|
+
.mci-expression__controls button { min-height: 44px; padding: 0 12px; border: 1px solid var(--mci-border); border-radius: 8px; color: var(--mci-text); background: var(--mci-bg-soft); font-size: 12px; cursor: pointer; }
|
|
296
|
+
.mci-expression__notice { max-width: 760px; margin: 18px 0 32px; }
|
|
297
|
+
.mci-expression__mobile-layout { display: grid; grid-template-columns: minmax(0, 390px) minmax(0, 1fr); align-items: center; gap: clamp(28px, 7vw, 100px); }
|
|
298
|
+
.mci-expression__notes { max-width: 480px; }
|
|
299
|
+
.mci-expression__notes > span { color: var(--mci-text-muted); font-size: 13px; }
|
|
300
|
+
.mci-expression__notes h3 { margin: 20px 0; font-size: clamp(30px, 3.6vw, 48px); line-height: 1.22; letter-spacing: -.04em; }
|
|
301
|
+
.mci-expression__notes p { color: var(--mci-text-muted); font-size: 15px; line-height: 1.8; }
|
|
302
|
+
.mci-expression__notes dl { margin-top: 32px; }
|
|
303
|
+
.mci-expression__notes dl > div { padding: 16px 0; border-top: 1px solid var(--mci-border); }
|
|
304
|
+
.mci-expression__notes dt { margin-bottom: 6px; font-size: 13px; font-weight: 700; }
|
|
305
|
+
.mci-expression__notes dd { margin: 0; color: var(--mci-text-muted); font-size: 13px; line-height: 1.7; }
|
|
306
|
+
.mci-life-phone { display: flex; flex-direction: column; height: 740px; min-width: 0; overflow: hidden; border: 1px solid var(--mci-scene-line); border-radius: 28px; color: var(--mci-scene-text); background: var(--mci-scene-canvas); box-shadow: var(--mci-shadow-card); }
|
|
307
|
+
.mci-life-head { display: flex; flex: 0 0 auto; align-items: center; gap: 10px; padding: 18px; background: var(--mci-scene-paper); }
|
|
308
|
+
.mci-life-head > span:nth-child(2) { font-size: 14px; font-weight: 750; }
|
|
309
|
+
.mci-life-head small { display: block; margin-top: 5px; color: var(--mci-scene-muted); font-size: 11px; font-weight: 400; }
|
|
310
|
+
.mci-life-mark { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 12px; color: var(--mci-scene-on-accent); background: var(--mci-scene-accent); }
|
|
311
|
+
.mci-life-mark svg { width: 26px; height: 26px; fill: none; stroke: currentColor; stroke-width: 1.7; }
|
|
312
|
+
.mci-life-head__dot { width: 8px; height: 8px; margin-left: auto; border-radius: 50%; background: var(--mci-scene-accent); }
|
|
313
|
+
.mci-life-body { flex: 1; min-height: 0; padding: 20px 16px 12px; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }
|
|
314
|
+
.mci-life-editorial { position: relative; min-height: 250px; margin: 0 0 26px; }
|
|
315
|
+
.mci-life-editorial > p { position: relative; z-index: 1; margin: 2px 0 14px; color: var(--mci-scene-muted); font-size: 12px; }
|
|
316
|
+
.mci-life-editorial h3 { position: relative; z-index: 1; margin: 0; font-size: 30px; line-height: 1.22; letter-spacing: -.055em; }
|
|
317
|
+
.mci-life-editorial__caption { position: absolute; bottom: 8px; left: 0; z-index: 1; max-width: 120px; font-size: 12px; line-height: 1.7; color: var(--mci-scene-muted); }
|
|
318
|
+
.mci-life-city { position: absolute; right: -8px; bottom: -7px; width: 174px; height: 184px; animation: mci-city-rest 8s ease-in-out infinite; }
|
|
319
|
+
.mci-life-city__sun { fill: var(--mci-scene-warm); }
|
|
320
|
+
.mci-life-city__ground { fill: var(--mci-scene-soft); }
|
|
321
|
+
.mci-life-city__building { fill: var(--mci-scene-accent); }
|
|
322
|
+
.mci-life-city__window { fill: var(--mci-scene-on-accent); }
|
|
323
|
+
.mci-life-city__route { fill: none; stroke: var(--mci-scene-text); stroke-width: 2; stroke-dasharray: 4 5; }
|
|
324
|
+
.mci-life-city__tree { fill: none; stroke: var(--mci-scene-text); stroke-width: 2; }
|
|
325
|
+
.mci-life-section-title { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
|
|
326
|
+
.mci-life-section-title h3 { margin: 0; font-size: 18px; line-height: 1.5; letter-spacing: -.03em; }
|
|
327
|
+
.mci-life-section-title > span { color: var(--mci-scene-muted); font-size: 12px; white-space: nowrap; }
|
|
328
|
+
.mci-life-categories { display: flex; gap: 6px; padding: 12px 0 16px; overflow-x: auto; scrollbar-width: none; }
|
|
329
|
+
.mci-life-categories button { display: inline-flex; min-width: 52px; min-height: 44px; align-items: center; justify-content: center; padding: 0 12px; border: 1px solid transparent; border-radius: 999px; color: var(--mci-scene-muted); background: transparent; font-size: 13px; line-height: 1; cursor: pointer; }
|
|
330
|
+
.mci-life-categories button[aria-pressed="true"] { color: var(--mci-scene-on-accent); background: var(--mci-scene-accent); }
|
|
331
|
+
.mci-life-benefits { display: grid; gap: 12px; }
|
|
332
|
+
.mci-life-benefit { position: relative; display: grid; grid-template-columns: 84px minmax(0, 1fr); overflow: hidden; border-radius: 14px; background: var(--mci-scene-paper); }
|
|
333
|
+
.mci-life-benefit::before, .mci-life-benefit::after { position: absolute; z-index: 1; left: 78px; width: 12px; height: 12px; border-radius: 50%; content: ''; background: var(--mci-scene-canvas); }
|
|
334
|
+
.mci-life-benefit::before { top: -6px; }.mci-life-benefit::after { bottom: -6px; }
|
|
335
|
+
.mci-life-benefit__mark { position: relative; display: flex; min-height: 148px; align-items: center; justify-content: center; overflow: hidden; border-right: 1px dashed var(--mci-scene-line); background: var(--mci-scene-soft); }
|
|
336
|
+
.mci-life-benefit__mark span { position: relative; z-index: 1; writing-mode: vertical-rl; font-size: 23px; font-weight: 650; letter-spacing: .25em; }
|
|
337
|
+
.mci-life-benefit__mark i { position: absolute; right: -24px; bottom: -25px; width: 110px; height: 110px; border: 1px solid var(--mci-scene-accent); border-radius: 50%; }
|
|
338
|
+
.mci-life-benefit--coffee .mci-life-benefit__mark { background: var(--mci-scene-warm); }.mci-life-benefit--care .mci-life-benefit__mark { background: var(--mci-scene-sky); }
|
|
339
|
+
.mci-life-benefit__body { padding: 16px 14px 14px; }
|
|
340
|
+
.mci-life-benefit__body > small { color: var(--mci-scene-muted); font-size: 11px; }.mci-life-benefit h4 { margin: 6px 0; font-size: 15px; line-height: 1.5; overflow-wrap: anywhere; }
|
|
341
|
+
.mci-life-benefit__body > p { margin: 0; color: var(--mci-scene-muted); font-size: 12px; }
|
|
342
|
+
.mci-life-benefit button { display: flex; width: 100%; min-height: 44px; align-items: center; justify-content: space-between; gap: 8px; margin-top: 6px; padding: 4px 0 0; border: 0; color: var(--mci-scene-accent); background: transparent; font-size: 12px; font-weight: 750; cursor: pointer; }
|
|
343
|
+
.mci-life-benefit button:disabled { color: var(--mci-scene-muted); cursor: default; }
|
|
344
|
+
.mci-life-dock { display: flex; flex: 0 0 auto; align-items: center; gap: 3px; margin: 12px; padding: 5px; border: 1px solid var(--mci-scene-line); border-radius: 999px; background: var(--mci-scene-paper); box-shadow: 0 6px 24px #00000012; }
|
|
345
|
+
.mci-life-dock button { position: relative; display: flex; flex: 1; min-height: 50px; align-items: center; justify-content: center; gap: 7px; padding: 0 9px; border: 0; border-radius: 999px; color: var(--mci-scene-muted); background: transparent; font-size: 12px; cursor: pointer; }
|
|
346
|
+
.mci-life-dock button[aria-pressed="true"] { color: var(--mci-scene-on-accent); background: var(--mci-scene-accent); }
|
|
347
|
+
.mci-life-dock svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
|
|
348
|
+
.mci-life-dock__count { font-variant-numeric: tabular-nums; }
|
|
349
|
+
.mci-life-profile { padding: 12px 4px; }.mci-life-profile > p:first-of-type { margin: 16px 0 8px; color: var(--mci-scene-muted); font-size: 13px; }
|
|
350
|
+
.mci-life-profile h3 { margin: 0 0 28px; font-size: 29px; line-height: 1.35; letter-spacing: -.045em; }
|
|
351
|
+
.mci-life-profile__seal { display: grid; width: 64px; height: 64px; place-items: center; border-radius: 50%; color: var(--mci-scene-on-accent); background: var(--mci-scene-accent); }
|
|
352
|
+
.mci-life-profile__seal svg { width: 42px; height: 42px; fill: none; stroke: currentColor; stroke-width: 1.6; }
|
|
353
|
+
.mci-life-profile dl { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; padding: 22px 0; border-block: 1px solid var(--mci-scene-line); }.mci-life-profile dt { color: var(--mci-scene-muted); font-size: 12px; }.mci-life-profile dd { margin: 12px 0 0; font-size: 26px; font-variant-numeric: tabular-nums; }
|
|
354
|
+
.mci-life-meta { color: var(--mci-scene-muted); font-size: 13px; line-height: 1.8; }.mci-life-empty { padding: 30px 0; }.mci-life-empty p { color: var(--mci-scene-muted); font-size: 13px; line-height: 1.7; }.mci-life-empty button, .mci-workroom__empty button { min-height: 44px; padding: 0; border: 0; color: var(--mci-scene-accent); background: transparent; font-weight: 700; cursor: pointer; }
|
|
355
|
+
.mci-life-action { display: inline-flex; width: 100%; min-height: 46px; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 14px; border: 1px solid var(--mci-scene-accent); border-radius: 8px; color: var(--mci-scene-on-accent); background: var(--mci-scene-accent); font-size: 13px; line-height: 1.5; cursor: pointer; }.mci-life-action:disabled { color: var(--mci-scene-muted); border-color: var(--mci-scene-line); background: transparent; cursor: default; }
|
|
356
|
+
.mci-workroom { container: mci-workroom / inline-size; margin-top: 54px; overflow: hidden; border: 1px solid var(--mci-scene-line); border-radius: 16px; color: var(--mci-scene-text); background: var(--mci-scene-paper); }
|
|
357
|
+
.mci-workroom__head { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 24px; border-bottom: 1px solid var(--mci-scene-line); }
|
|
358
|
+
.mci-workroom__head span:first-child { color: var(--mci-scene-muted); font-size: 12px; }.mci-workroom__head h3 { margin: 8px 0 0; font-size: 24px; line-height: 1.35; letter-spacing: -.04em; }.mci-workroom__stamp { padding: 7px 10px; border: 1px solid var(--mci-scene-line); border-radius: 5px; color: var(--mci-scene-muted); font-size: 12px; white-space: nowrap; }
|
|
359
|
+
.mci-workroom__toolbar { display: flex; align-items: center; flex-wrap: wrap; gap: 14px; padding: 14px 24px; border-bottom: 1px solid var(--mci-scene-line); }
|
|
360
|
+
.mci-workroom__toolbar > div { display: flex; gap: 4px; }.mci-workroom__toolbar button { min-height: 44px; padding: 0 12px; border: 0; border-radius: 7px; color: var(--mci-scene-muted); background: transparent; cursor: pointer; }.mci-workroom__toolbar button[aria-pressed="true"] { color: var(--mci-scene-on-accent); background: var(--mci-scene-accent); }
|
|
361
|
+
.mci-workroom__toolbar label { display: flex; align-items: center; gap: 8px; font-size: 12px; }.mci-workroom__toolbar select { min-height: 44px; max-width: 160px; padding: 0 12px; border: 1px solid var(--mci-scene-line); border-radius: 7px; color: var(--mci-scene-text); background: var(--mci-scene-paper); }.mci-workroom__toolbar > p { margin: 0 0 0 auto; color: var(--mci-scene-muted); font-size: 12px; }
|
|
362
|
+
.mci-workroom__canvas { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(240px, .8fr); }
|
|
363
|
+
.mci-workroom__queue { padding: 20px 24px; }.mci-workroom__section-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; }.mci-workroom__section-head h4 { margin: 0; font-size: 14px; }.mci-workroom__section-head span { color: var(--mci-scene-muted); font-size: 12px; }
|
|
364
|
+
.mci-briefing-row { display: grid; grid-template-columns: 9px minmax(0, 1fr) auto 14px; width: 100%; align-items: center; gap: 13px; margin-top: 6px; padding: 16px 12px; border: 1px solid transparent; border-radius: 8px; text-align: left; color: var(--mci-scene-text); background: transparent; cursor: pointer; }.mci-briefing-row[aria-pressed="true"] { border-color: var(--mci-scene-line); background: var(--mci-scene-soft); }
|
|
365
|
+
.mci-briefing-row__signal { width: 8px; height: 8px; border-radius: 50%; background: var(--mci-scene-muted); }.mci-briefing-row__signal[data-priority="1"] { background: var(--mci-scene-risk); }.mci-briefing-row__copy strong, .mci-briefing-row__copy small { display: block; }.mci-briefing-row__copy strong { font-size: 14px; line-height: 1.6; }.mci-briefing-row__copy small { margin-top: 5px; color: var(--mci-scene-muted); font-size: 12px; line-height: 1.5; }.mci-briefing-row__state { color: var(--mci-scene-muted); font-size: 12px; white-space: nowrap; }
|
|
366
|
+
.mci-workroom__detail { min-width: 0; padding: 24px; border-left: 1px solid var(--mci-scene-line); background: var(--mci-scene-soft); }.mci-workroom__detail-label { color: var(--mci-scene-muted); font-size: 12px; }.mci-workroom__detail h4 { margin: 20px 0 12px; font-size: 21px; line-height: 1.45; }.mci-workroom__detail > p { color: var(--mci-scene-muted); font-size: 13px; line-height: 1.8; }.mci-workroom__detail dl { margin: 24px 0; }.mci-workroom__detail dl > div { display: flex; justify-content: space-between; gap: 12px; padding: 9px 0; font-size: 12px; }.mci-workroom__detail dt { color: var(--mci-scene-muted); }.mci-workroom__detail dd { margin: 0; text-align: right; }.mci-workroom__feedback { min-height: 44px; margin-bottom: 0; }.mci-workroom__empty { padding: 24px 0; }.mci-workroom__empty p { color: var(--mci-scene-muted); font-size: 13px; }
|
|
367
|
+
.mci-expression button:focus-visible, .mci-expression select:focus-visible { outline: 3px solid var(--mci-scene-accent); outline-offset: 3px; }.mci-expression button:active:not(:disabled) { transform: translateY(1px); }
|
|
368
|
+
@keyframes mci-city-rest { 50% { transform: translateY(-4px) rotate(1deg); } }
|
|
369
|
+
@container mci-workroom (max-width: 700px) { .mci-workroom__canvas { grid-template-columns: 1fr; }.mci-workroom__detail { border-top: 1px solid var(--mci-scene-line); border-left: 0; }.mci-workroom__head { align-items: start; padding: 18px; }.mci-workroom__stamp { display: none; }.mci-workroom__head h3 { font-size: 21px; }.mci-workroom__toolbar { padding: 12px 18px; }.mci-workroom__toolbar > p { width: 100%; margin: 0; }.mci-workroom__queue { padding: 18px; }.mci-briefing-row { gap: 9px; padding-inline: 8px; }.mci-briefing-row__state { font-size: 11px; } }
|
|
370
|
+
@media (max-width: 780px) { .mci-expression__mobile-layout { grid-template-columns: 1fr; }.mci-life-phone { width: min(390px, 100%); margin-inline: auto; }.mci-expression__notes { max-width: 100%; }.mci-expression__notes h3 br { display: none; } }
|
|
371
|
+
@media (max-width: 680px) { .mci-expression { width: calc(100% - 28px); padding-block: 48px; }.mci-expression__heading h2 { font-size: 27px; }.mci-expression__controls { gap: 6px; }.mci-expression__controls button { padding-inline: 9px; font-size: 11px; }.mci-expression__notes h3 { font-size: 27px; }.mci-workroom { margin-top: 32px; } }
|
|
372
|
+
:root[data-mci-paused="true"] .mci-lab *, :root[data-mci-paused="true"] .mci-lab *::before, :root[data-mci-paused="true"] .mci-lab *::after { animation-play-state: paused !important; }
|
|
373
|
+
:root[data-mci-motion="reduced"] .mci-lab *, :root[data-mci-motion="reduced"] .mci-lab *::before, :root[data-mci-motion="reduced"] .mci-lab *::after { animation: none !important; transition: none !important; }
|
|
374
|
+
|
|
260
375
|
@keyframes mci-drift { to { transform: translate3d(-18px, 14px, 0) scale(1.03); } }
|
|
261
376
|
@keyframes mci-orbit { to { transform: rotate(360deg); } }
|
|
262
377
|
@keyframes mci-orbit-pulse { 50% { transform: scale(.94) rotate(8deg); filter: drop-shadow(0 0 46px rgba(83, 120, 255, .62)); } }
|
|
@@ -66,6 +66,14 @@
|
|
|
66
66
|
5. 实际执行筛选、排序、分页、图表图例/tooltip、穿透、关闭、错误恢复及键盘焦点。操作可用与视觉可接受分别给结果;构建、DOM 存在和 CSS 静态扫描都不能代替截图批判。
|
|
67
67
|
6. 逐页截图后明确指出最大的三项缺陷并修正;没有问题时说明按哪些任务标准通过。某尺寸或主题受工具限制未完成时如实记录,不复制另一尺寸截图冒充通过。
|
|
68
68
|
|
|
69
|
+
## 有明确参考图的经营驾驶舱
|
|
70
|
+
|
|
71
|
+
用户提供高品质看板参考时,先拆解标题与筛选、KPI、趋势、状态分布、排行和明细的视觉权重,在相同实际容器、主题与业务数据下比较。紧凑表示高效可读,不能退化为一排数字加无层次白卡;允许使用有依据的品牌标题区、浅/暗双套表面、渐变图形、圆环分布和横向排行,但图表类型必须服务真实比较任务,不凑图形和假走势。
|
|
72
|
+
|
|
73
|
+
外画布填满宿主可用宽高,内区块按容器重排;只有明细或真正长内容产生滚动,不固定整页最大宽度或使用缩放充满。空值、当前快照与期间发生量分别标识,图例、单位、状态文字和来源可解释;刷新、筛选、图表/明细穿透继续用同一授权数据源。复杂视觉由微服务/原生界面引擎承担,不能将整页 HTML 塞进接口引擎再称已迁移。
|
|
74
|
+
|
|
75
|
+
首轮视觉批判至少检查:主次是否明显、图表是否可读、是否单调重复、实际宽高是否充分利用、浅/暗主题是否协调;逐项修正后再记录通过。需要动效时使用有限入场与实际交互,不为“科技感”加入所有卡片循环发光或随机数字。
|
|
76
|
+
|
|
69
77
|
## 方法来源与改写边界
|
|
70
78
|
|
|
71
79
|
2026-11-06 检查以下公开 Skill,吸收“先任务和设计系统、区分操作与展示、反思真实渲染、语义颜色与数值对齐、可访问交互”的方法,按吾码 Vue/宿主契约重新组织上述原创规则。未复制外部 Skill 原文、品牌、类名、资产或设计 token。star 是仓库总数,不能证明单个 Skill 的质量,也不能据用户参考截图判定作者使用了哪一个 Skill。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Microi 设计模式库
|
|
2
2
|
|
|
3
|
-
本文件是 Microi.UI
|
|
3
|
+
本文件是 Microi.UI 的内部设计知识库。标准后台操作区使用紧凑基线;定制产品与微服务从任务、内容和视觉性格决定尺度与构图。它把成熟数字产品中反复有效的构图、流程、动效和设计系统方法归纳为 Microi 原创规则,不把任何一套配色、圆角或行业视觉当成所有用户的统一外观。
|
|
4
4
|
|
|
5
5
|
## 目录
|
|
6
6
|
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
6. [动态首屏](#动态首屏)
|
|
13
13
|
7. [数据工作台](#数据工作台)
|
|
14
14
|
8. [组合与验收](#组合与验收)
|
|
15
|
+
9. [项目设计签名与场景配方](#项目设计签名与场景配方)
|
|
15
16
|
|
|
16
17
|
## 模式选择
|
|
17
18
|
|
|
@@ -184,3 +185,51 @@
|
|
|
184
185
|
### 完成定义
|
|
185
186
|
|
|
186
187
|
构建通过不等于 UI 完成。只有真实内容与全部状态可操作、桌面和移动截图通过、控制台无错误、外部资源失败有降级、动效关闭后页面仍完整,才算完成。
|
|
188
|
+
|
|
189
|
+
## 项目设计签名与场景配方
|
|
190
|
+
|
|
191
|
+
适用于新的定制产品、门户、移动端及后台微服务的显著重设计。目标是让构图来自业务对象与用户任务,而不是让所有项目共用同一“渐变标题 + 一排统计 + 等大白卡”模板。现有标准表单、表格、主题和权限契约继续保留;同一产品可以有表现性首页与稳定紧凑的工作区。
|
|
192
|
+
|
|
193
|
+
### 从参考转译到自己的产品
|
|
194
|
+
|
|
195
|
+
先在 `MCI-DESIGN.md` 的视觉性格和页面模式章节记录:参考中值得吸收的具体结构、它如何帮助原任务、如何改写为当前业务对象,以及来源/许可和不复用的资产。医疗参考里的“医生大肖像 + 预约时段”可以启发“核心服务对象 + 可行动选项”,不能直接把医生照片、医院品牌、医疗数据和预约业务塞进不相关产品。
|
|
196
|
+
|
|
197
|
+
形成一组简洁的**设计签名**:例如票券切口与进度刻度、编辑式标题与场景留白、时间轨道与状态节点、照片裁切与文字叠层。签名要同时体现在结构、主要对象和交互中;只给主色起新名字或给通用卡片加图案不够。选择少量能贯穿产品的特征,别把所有参考拼在同一屏。
|
|
198
|
+
|
|
199
|
+
实现前可先用首页与一个任务页验证方向,随即把规则扩展到完整路由;原型不是最终交付。用户已经要求直接完成时不把“等风格确认”变成默认停工点。重要取舍写入契约,后续 AI 应读理由并延续,而不是每页重新选一套潮流效果。
|
|
200
|
+
|
|
201
|
+
### 页面族共享系统,不共享同一构图
|
|
202
|
+
|
|
203
|
+
| 页面任务 | 可选择的主要构图 | 对象与动作的关系 | 应避免 |
|
|
204
|
+
|---|---|---|---|
|
|
205
|
+
| 发现、会员、生活服务首页 | 编辑式标题、一个有来源的主场景、大小有别的服务分区 | 先看清当前价值,再进入核心任务;主视觉与 CTA 有明确锚点 | 每区同高白卡、重复眉题、随机装饰数字 |
|
|
206
|
+
| 资产、券包、订阅权益 | 清晰资产总览、凭证/通行证式对象、规则与流水连续布局 | 数额、可用/冻结、有效期与动作在同一阅读链 | 把资金数字做成玩具、用图形隐藏限制、只有余额没有状态 |
|
|
207
|
+
| 商品、服务或内容目录 | 真实媒体占有合适面积,分类与筛选清楚;精选与普通记录有层次 | 图像帮助识别对象,排序/分类真实改变内容 | 同一礼盒/头像反复填充、用无关照片冒充真实商品 |
|
|
208
|
+
| 订单、工单和进度记录 | 收据、时间线或状态轨道,节点与当前动作连续 | 先显示当前阶段,再呈现可执行下一步与历史 | 每个字段套卡、状态与可用操作相离、彩色标签无语义 |
|
|
209
|
+
| 登录、资料与确认表单 | 安静连续画布、清楚标签、稳定控件与总结 | 装饰退后,输入、错误与提交反馈相邻 | 主视觉占去输入空间、移动键盘遮住动作、持续动画干扰填写 |
|
|
210
|
+
| PC 定制工作台/运营简报 | 满宽任务画布、优先队列、主次有别的指标/趋势、可追溯明细 | 先知道要处理什么,再看原因与授权操作 | 把手机页拉宽、固定四张大卡、无内容的大 Hero、重复宿主导航 |
|
|
211
|
+
|
|
212
|
+
这些是配方,不是硬模板。数据基数、触控和业务顺序可以决定对称/不对称、单列/双栏;相同来源的一组记录保持可比较的几何,不为制造“新颖”随机打散列表。PC 断点按微服务实际内容宽度触发,密度继续服从 [数据工作台规范](data-workspace-density.md)。
|
|
213
|
+
|
|
214
|
+
### 让个性来自关系,而非装饰数量
|
|
215
|
+
|
|
216
|
+
- **排版**:用标题、正文、辅助和数值建立可辨认的层级;中文按真实文案与字号测试换行。表现性标题可以具有尺度对比,后台字段和数字仍需稳定扫读。不要用满屏全大写英文、装饰序号或孤立巨型数字替代内容。
|
|
217
|
+
- **面积与颜色**:主对象占据较大面积,次对象保持克制;色块表达区域、身份或任务层级。主题切换后保留这些关系,不要求所有项目选蓝色、绿色、浅底或深底。
|
|
218
|
+
- **形状**:票据、切口、连续轨道、方圆组合或胶囊只用于与任务相符的对象。普通列表、输入和长表格不为了统一“个性”全部改为特殊形状。
|
|
219
|
+
- **媒体**:使用自有、明确授权或原创生成的真实业务素材;大图有稳定比例、裁切重心和弱网降级。没有可信素材时采用诚实的业务图形,不让版权不明照片或伪商品照片承担真实性证明。
|
|
220
|
+
- **导航**:浮动 Dock、分段导航或主动作可以形成产品识别,但必须保持所有入口、文字、选中态和足够触控面积。按所属容器预留一次实测覆盖高度;不用中间加号暗示不存在的功能,也不复制另一产品的导航身份。
|
|
221
|
+
- **动效**:采用与选择、展开、切换和对象状态一致的运动语法。设计感不靠所有卡片循环漂浮,数据变化不能靠循环图表伪装;隐藏暂停和 reduced-motion 保留最终内容与操作。
|
|
222
|
+
|
|
223
|
+
### 三层观察门禁
|
|
224
|
+
|
|
225
|
+
| 层次 | 实际需要观察的结果 | 不能代替它的证据 |
|
|
226
|
+
|---|---|---|
|
|
227
|
+
| 业务 | 原入口、角色与按钮仍工作,状态和数据有来源,失败可恢复 | 静态参考图、设计稿、演示 Toast |
|
|
228
|
+
| 几何与可访问性 | 实际尺寸下文案/图标对齐、触控和焦点、滚动与安全区、媒体就绪、主题可读 | CSS 类存在、构建成功、骨架屏截图 |
|
|
229
|
+
| 设计表达 | 同视口前后对比中能说明主要对象、阅读顺序、版面节奏和页面族差异;设计签名在不同任务页可辨认 | 只有换色、换圆角、同一 Hero、测试数量或“高级感”自评 |
|
|
230
|
+
|
|
231
|
+
截图先匹配当前路由与身份,等骨架消失、真实内容/媒体出现及入场动画结束,再复核。至少查看一个展示页、资产/列表页、表单页和范围内的 PC 工作台;同一组真实长数据、空态和错误要保留。视觉批判写出具体位置与修改理由,失败留为待修,不编造美观百分比或用某个仓库 star 数保证设计效果。
|
|
232
|
+
|
|
233
|
+
### 原创可运行场景
|
|
234
|
+
|
|
235
|
+
[模式实验室](../assets/pattern-showcase/index.html#expressive) 提供编辑式会员服务与 PC 运营简报两个原创场景:本地分类/导航、领取去重、优先队列、筛选和完成动作可实际操作;支持明暗、非默认强调色和 reduced-motion。它们是说明结构与状态的演示数据,不连接租户或执行真实交易;项目接入时使用实际 SDK、数据与权限,不能只复制演示数。来源与许可约束见 [移动设计资料边界](mobile-product-language.md#方法来源与适用边界)。
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# 移动产品设计语言与可执行视觉门禁
|
|
2
|
+
|
|
3
|
+
适用于 UniApp、H5、App 与小程序的整站设计和重设计。先固定业务路由、权限、状态与交互,再改视觉;参考页只提供设计依据,不授权复制品牌、照片、业务秘密或外部脚本。
|
|
4
|
+
|
|
5
|
+
## 先选择产品表达,避免把后台密度套给手机
|
|
6
|
+
|
|
7
|
+
在 `MCI-DESIGN.md` 同时写清用户任务、主情绪、产品对象、视觉表达强度、动效强度和信息密度。消费会员、生活商城与品牌服务允许更鲜明的构图、具有识别度的产品插画、适度圆角及层次;频繁录入和金融确认保持稳定清楚。用户已明确要求表现性设计时,不得用“默认紧凑”把所有页面降成同色白卡。
|
|
8
|
+
|
|
9
|
+
- 一套产品使用一套语义 token、控件、图标与状态语言;页面按首页、发现/商城、资产、会员、表单、记录、聊天等任务形成不同构图,而非同一张卡片模板重复。
|
|
10
|
+
- 首屏以真实产品对象或核心任务建立识别:业务对象插画、可靠媒体、身份资产或搜索分类。装饰不能伪造优惠、销量、实时状态或经营成果。
|
|
11
|
+
- 字体建立可辨认的标题、正文、辅助与金额层级。手机正文通常 14–16px;辅助文字不承担主任务。金额使用等宽数字,单位弱一级;同一行不混入不必要的标签和英文眉题。
|
|
12
|
+
- 通过色调、版面与有限材质区分品牌首屏、功能入口、商品、资产和表单。保留空/错/无权/禁用/成功状态与焦点,不用渐变和阴影掩盖结构不足。
|
|
13
|
+
- 系统原生控件的交互惯例与返回行为优先;原生导航、触控及安全区原则可吸收,SwiftUI/Compose/React Native 示例不能直接粘贴到 UniApp。
|
|
14
|
+
|
|
15
|
+
## 参考图要转译为构图,不只提取配色
|
|
16
|
+
|
|
17
|
+
用户给出有个性的参考时,先识别主对象占比、标题/正文尺度、图像裁切、色块的语义、留白节奏和主要动作位置,再对应到本业务。人物服务图可启发身份与行动关系,时间表可启发状态轨道;行业照片、名称、数据和交易步骤不能无条件移植。明确哪些是用户审美偏好、哪些只是参考图所属行业。
|
|
18
|
+
|
|
19
|
+
在 `MCI-DESIGN.md` 记录项目设计签名及页面族构图表,按 [项目设计签名与场景配方](design-pattern-library.md#项目设计签名与场景配方) 落地。首页、目录、券包、记录、资料与聊天应共享视觉语法,同时围绕各自任务形成不同阅读顺序;不能47条路由都套同一标题、图标和白卡列表后宣称整站重设计。
|
|
20
|
+
|
|
21
|
+
- 先用主对象和关键任务建立记忆点;可以是有来源的场景图、票券/通行证、资产刻度、服务时间轨道或编辑式内容组合。不是每一页都需要大 Hero、英文眉题、照片或多色背景。
|
|
22
|
+
- 一个主表面与次表面通过面积、色调、排版或材质产生主次,避免每项内容大小相同、白底相同、阴影相同。可比较的同类记录仍保持稳定几何,不能随机排布破坏扫读。
|
|
23
|
+
- 参考里的大标题与留白只有在主任务仍可触达、中文换行稳定时才成立。中文正文/数字/标签分别定义角色,不使用全部加粗或所有字号相近来假装层次。
|
|
24
|
+
- 浮动底部导航可作为一种有业务依据的结构选择,保留文字、图标、选中态、焦点及所有原入口。正文只预留一次导航实测总高度与偏移,弹层/键盘/横屏时检查遮挡;无需中央主动作时不为了造型增加加号。
|
|
25
|
+
- 动效沿用户动作和业务对象建立连续性;入场结束后页面仍应有清楚节奏。图片和插画不能只证明“有图”,应核对来源、主体裁切、真实加载与失败态;通用图形不能冒充不存在的商品实拍。
|
|
26
|
+
|
|
27
|
+
## 图标、Tab 与排序控件必须量测
|
|
28
|
+
|
|
29
|
+
图标加文字统一使用独立节点和 `inline-flex/flex`:`align-items:center; justify-content:center; gap:6px~10px`。图标设置稳定宽高和 `flex-shrink:0`;标签给明确行高。禁止把 `⌄/∨/→` 紧贴业务文案充当唯一图标,禁止靠空格或单个 `padding-top` 修正所有平台。
|
|
30
|
+
|
|
31
|
+
Tab/分段项必须显式设置 `box-sizing:border-box`、触控高度和上下左右居中;不能只增加 `min-height`,保留旧 padding 后就称修复。选择态不能改变边框总厚度、文字基线或触控矩形。滚动分类保留水平可达性,手机不显示桌面风格粗滚动条;不得用 `overflow:hidden` 隐藏无法触达的分类。
|
|
32
|
+
|
|
33
|
+
实际 H5 几何断言至少包括:
|
|
34
|
+
|
|
35
|
+
| 对象 | 可重复检查 |
|
|
36
|
+
|---|---|
|
|
37
|
+
| 图标与文字 | 中心线偏差通常不超过 2 CSS px,真实间距不小于 6px;长文案不推走图标 |
|
|
38
|
+
| 选择/未选择 Tab | 文字行框相对背景上下余量相称,中心偏差通常不超过 2px;触控区至少 44×44px |
|
|
39
|
+
| 分类与排序 | 分类首末项可达,排序触摸区无遮挡,切换实际影响服务端请求及结果 |
|
|
40
|
+
| 全页面 | 375/390/430px 与相关横屏,无页面级横向溢出、孤字标题、重叠和底栏遮挡 |
|
|
41
|
+
|
|
42
|
+
数值为常规基线;字体光学校正例外必须有真实截图和理由,不能把所有偏差都解释为字体问题。
|
|
43
|
+
|
|
44
|
+
## 动效必须被看到,也必须可停
|
|
45
|
+
|
|
46
|
+
- 提交/选择/展开/返回用短反馈说明状态变化;页面入场可用一次 300–450ms 的小位移与透明度。先渲染内容,不等待整段入场才能操作。
|
|
47
|
+
- 用户要求有动效的消费产品,除骨架外至少实现一个与产品对象有关、幅度有限的停留动效;例如连接对象轻浮动。无需在每张卡片上循环,不让正在输入的表单持续跳动。
|
|
48
|
+
- 只动画 `transform/opacity`;不循环改变尺寸、边距、阴影或大面积模糊。隐藏页面、微服务 `afterhidden` 与原生 `onHide` 暂停,恢复不叠加计时器。`prefers-reduced-motion` 和用户 reduced 偏好同时有效。
|
|
49
|
+
- 自动化读取实际动画/计算样式,在两个时间点确认位移或透明度发生变化,再检查暂停及 reduced 时静止。源码存在 `@keyframes`、只有 loading 动起来或截图文件存在,均不足以证明动效验收。
|
|
50
|
+
|
|
51
|
+
## 桌面手机预览与宿主嵌入要保持同一构图
|
|
52
|
+
|
|
53
|
+
呈现目的与是否嵌入是两个维度:声明 `mobile-preview` 或 `workspace`,禁止把 `embedded=true` 等同于“内容拉满桌面”。移动产品预览的外画布填满宿主,内屏仍保持设计手机宽度、移动排版与底栏;真正业务工作台才使用满宽布局。
|
|
54
|
+
|
|
55
|
+
独立与原菜单入口在同一实际 CSS 视口比较内屏宽高、首屏分区、字体、内容、底栏和滚动所有者。使用宿主可用尺寸,不用浏览器外窗减固定常数;iframe 沙箱不能依赖独立 HTML 的 body 规则。覆盖同名原菜单点击、刷新和来回切换,保留 Id/URL/权限。
|
|
56
|
+
|
|
57
|
+
记录请求 viewport、实际 `innerWidth/innerHeight/devicePixelRatio`;宿主 DPI 或浏览器缩放可能使请求值与 CSS 像素不同。以实测矩形验收,不能拿 170px 的页面截图冒充 390px 手机。
|
|
58
|
+
|
|
59
|
+
## 视觉通过与功能通过分别判定
|
|
60
|
+
|
|
61
|
+
按全部路由登记共享壳与页面模式;每类至少检查真实长数据、空态和错误。主要 Tab、详情、表单、资产、设置、聊天覆盖亮/暗及非默认主色;逐页截图后列出并修正最明显的问题。截图必须匹配当前页面标题/身份、等待加载骨架消失、真实内容和媒体出现以及入场动画结束,不能把骨架或半透明入场帧计为已验。业务测试、对比度、几何检查与人工视觉批判共同构成门禁;“无 JS 错误”不能替代设计质量。
|
|
62
|
+
|
|
63
|
+
对明显重设计,在相同视口与内容下保存前后对比,说明主要对象、阅读顺序和不同页面族如何变化。临时忽略品牌色后仍只有同样的卡片墙,说明只是换肤;几何检查通过而构图仍同质时继续记录视觉缺口,不用更多自动化数量关闭它。可运行的原创场景见 [模式实验室](../assets/pattern-showcase/index.html#expressive)。
|
|
64
|
+
|
|
65
|
+
## 方法来源与适用边界
|
|
66
|
+
|
|
67
|
+
2026-11-09 检索 GitHub 与 Gitee。下表为本次核验的设计相关仓库按 GitHub 仓库 star 排序的前五,并非全球完整排名或单个移动 Skill 的 star。Gitee 命中主要为镜像/分支,不把 fork 与原仓 star 相加;技术栈专属内容只吸收可迁移的设计方法。此文为结合吾码容器、UniApp 和真实交付缺陷的原创规则,不分发外部 Skill 正文、命令、资产或默认技术栈。
|
|
68
|
+
|
|
69
|
+
| 原始仓库 | 核验 star | 吸收的方法与边界 |
|
|
70
|
+
|---|---:|---|
|
|
71
|
+
| [Anthropic frontend-design](https://github.com/anthropics/skills/tree/main/skills/frontend-design) | 190079 | 围绕真实产品建立明确视觉意图,渲染后批判;该子 Skill 相邻许可 Apache-2.0 |
|
|
72
|
+
| [UI UX Pro Max](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill) | 147127 | 触控、状态、响应式与设计系统检查;MIT,不执行其外部安装命令 |
|
|
73
|
+
| [Taste Skill](https://github.com/Leonxlnx/taste-skill) | 112256 | 构图、层级及可见交互反馈;MIT,主要针对 Web,不能冒称 UniApp 原生组件能力 |
|
|
74
|
+
| [Impeccable](https://github.com/pbakaus/impeccable) | 106507 | 按页面任务选择表达强度、保留业务事实、实际尺寸批判;Apache-2.0 |
|
|
75
|
+
| [wshobson UI Design](https://github.com/wshobson/agents/tree/main/plugins/ui-design/skills) | 42343 | iOS/Android 的层次、主题与适应式布局;MIT,保留吾码自身栈与权限 |
|
|
76
|
+
|
|
77
|
+
补充核验 [Expo design-system/native-ui](https://github.com/expo/skills)(4098 star、MIT)的单一 token 事实源与平台原生惯例;它是移动专项补充,不因名次较低而遗漏。Gitee 可核对 [UI UX Pro Max 镜像](https://gitee.com/llm_4/ui-ux-pro-max-skill)。star 是当次查询快照,不能证明 Skill 必然产出好设计;仍以本页可执行门禁判断结果。
|
|
78
|
+
|
|
79
|
+
### 2026-11-10 的场景与源码补充
|
|
80
|
+
|
|
81
|
+
研究按“页面任务 → 视觉方法 → 实际可运行示例 → 许可、维护和端适配”筛选,不把高星当作安装建议。下表是原创规则的研究来源;没有把第三方组件、截图、照片或脚本加入吾码分发。代码许可、示例资产许可和维护状态分别核对,聚合组件库的总许可不能覆盖每个上游。
|
|
82
|
+
|
|
83
|
+
| 原始来源 | 可迁移的方法 | 使用边界 |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| [Magic UI BentoGrid](https://github.com/magicuidesign/magicui/blob/main/apps/www/registry/magicui/bento-grid.tsx) 与 Dock | 背景媒体、内容与 CTA 分层;格子跨列有大小语义;触屏动作常显 | MIT正文已核;React/Tailwind实现不直接移入uni-app,hover只能增强不能承载唯一动作 |
|
|
86
|
+
| [Motion Primitives](https://github.com/ibelick/motion-primitives) 的 animated-background、transition-panel | 选中项与背景分开,内容切换保持方向和上下文 | API标记MIT但本轮未找到根许可正文,仅归纳方法,不分发源码 |
|
|
87
|
+
| [ColorUI](https://github.com/weilanwl/coloruicss) 与 [Gitee uv-ui](https://gitee.com/climblee/uv-ui) | 原生移动目录、卡片/时间线及固定导航等高占位、安全区 | MIT正文已核;旧语法、示例照片、营销数值不继承;底栏高度、gap与安全区按自己的容器实测 |
|
|
88
|
+
| [TDesign UniApp](https://github.com/Tencent/tdesign-miniprogram/tree/develop/packages/uniapp-components) | 圆形/标签导航、图标可访问名称、触控基础 | MIT已核;只是控件基础,不能代替产品构图,也不因可用图标就默认去掉导航文字 |
|
|
89
|
+
| [Flutter Responsive Admin](https://github.com/abuanwar072/Flutter-Responsive-Admin-Panel-or-Dashboard) 与 [Tremor](https://github.com/tremorlabs/tremor) | 主工作区与辅助分析分工,移动侧区归入正常信息流,图表数据/图例/尺度各有职责 | 前者MIT、后者Apache-2.0正文已核且部分组件另有MIT说明;只迁移结构和语义,不复用演示统计或把Flutter改成Vue语法 |
|
|
90
|
+
| [Cult UI](https://github.com/nolly-studio/cult-ui) 与 [Kokonut UI](https://github.com/kokonut-labs/kokonutui) | 浮动区域保留触发位置,模块尺寸编码内容层级,动效可减弱 | MIT正文已核;只研究免费公开源码,不复制付费图片/区块,拖动仍要有键盘替代 |
|
|
91
|
+
| [Vue Bits](https://github.com/DavidHDev/vue-bits) / [React Bits](https://github.com/DavidHDev/react-bits)、[Vaul](https://github.com/emilkowalski/vaul)、[Flutter商城示例](https://github.com/abuanwar072/E-commerce-Complete-Flutter-UI) | 表现性媒介、抽屉边界与多章节构图可供批判性比较 | Bits为MIT+Commons Clause,组件/模板/移植再分发受限;Vaul许可MIT但明确未维护;商城未发现LICENSE。这些不是吾码公共组件的拷贝源或默认依赖 |
|
|
92
|
+
|
|
93
|
+
公众号或作品展示不可访问时,只依据已提供并实际看到的截图讨论构图,不声称读完文章;设计者署名不代表素材授权。每次新研究保留实际查询日期、URL与许可事实,失效链接和未取得的正文如实标注,不能编造全量阅读或“全球前五”。
|
|
@@ -43,6 +43,7 @@ Microi 上传字段存在四种必须长期兼容的存储形态,不能假设
|
|
|
43
43
|
|
|
44
44
|
- 历史配置的原始 `FileServer` 主地址兼容 HTTP/HTTPS。公有相对路径的兼容回退保留协议、端口和路径前缀,不强制升级 HTTPS,也不改拼 API Base;仅此原始主地址允许 HTTP。备用绑定、源地址映射和别名仍限定 HTTPS 并通过原验证,私有路径、带凭据地址及危险协议的限制不变。
|
|
45
45
|
- 公共解析器以 `Microi.Client/src/utils/public-resource-router.mjs` 为单一事实源;修改后运行 `node microi.skills/scripts/sync-public-resource-router.mjs --write` 同步三份 SDK 生成块并执行 `--check`。PlatformService 的 SDK 属于其源码输入,变更后必须按原生 Bundle 入口重建及更新四个所属应用包,不能只更新 PC 或手改嵌入 Base64。
|
|
46
|
+
- 小程序运行时可能没有 `URL`、`AbortController` 或 `queueMicrotask`。公有资源解析必须在缺少这些能力时保留经过校验的原始 `FileServer` 地址,不得因浏览器 API 异常把有效路径变为空串;备份路由仅在依赖齐全时启用,不向全局伪造浏览器对象。回归需在隔离运行时移除这些 API,覆盖公有图片、端口/路径前缀、私有拒绝、危险路径与租户切换;普通 Node/H5 测试不能代替该兼容检查。只改本地 SDK 不等于应用包已发布。
|
|
46
47
|
|
|
47
48
|
### 跨端上传字段的形态与桶属性
|
|
48
49
|
|
|
@@ -38,7 +38,7 @@ Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `
|
|
|
38
38
|
生成接口引擎代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;跨表事务、权限校验、状态机、金额/库存计算、复杂 `_Where` 条件等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
|
|
39
39
|
|
|
40
40
|
<!-- /microi-progressive:chunk -->
|
|
41
|
-
<!-- microi-progressive:chunk id=v8-crud-api-001 sha256=
|
|
41
|
+
<!-- microi-progressive:chunk id=v8-crud-api-001 sha256=2a6abff4cdc1c1f3d163e4cce0c5c3eec63ce254a77bf6f1aca4ff008b103de5 -->
|
|
42
42
|
## 核心规则
|
|
43
43
|
|
|
44
44
|
- 接口引擎文件是纯 JavaScript(Jint 引擎,非 Node.js)
|
|
@@ -47,6 +47,7 @@ Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `
|
|
|
47
47
|
- 业务接口禁止接收客户端 SQL 并执行,包含改名/嵌套/编码的整段 SQL、表列及 WHERE/JOIN/ORDER BY 片段。SQL 结构必须是可信服务端固定代码或白名单定义;前端只传有界业务值或有限 queryKey,动态值用 `_Where` / `.AddInParameter`。参数绑定不保护不可信 SQL 正文,不能以只读、仅 SELECT 或管理员登录代替此规则。受权设计期 SQL 配置/数据库管理 MCP 不等于业务接口可透传 SQL。发布前按 `../v8-sql-query/SKILL.md` 检查请求到执行点的数据流和拒绝负例。
|
|
48
48
|
- 严格业务字段白名单先逐项排除本入口支持的宿主传输字段:固定 `ApiEngineKey / ApiAddress`、调用类型、设备和 HTTP 请求元数据;不得把整个下划线前缀视为安全字段,不解析 `_RawBody` 重写动作,也不从传输字段取授权。历史调试器的 `TestParam1` 仅兼容 null/undefined、最多 200 字符的字符串、有限数字或布尔值并立即丢弃;对象、数组、超长值和其它未知字段继续拒绝。真实 HTTP 与内部调用都须验收,普通岗位无初始化配置副作用,权限继续读取权威当前用户与目标租户。
|
|
49
49
|
- `V8.Param` 中嵌套 JSON 的 `JObject/JArray` 可能是 Jint 宿主对象,`Array.isArray` 不一定成立。需要严格数组、布尔或结构校验时,在业务入口对有界业务参数使用 `JSON.parse(JSON.stringify(V8.Param || {}))` 转为纯 JSON,再执行原字段白名单、类型、大小与权限校验;不能把只有 `length` 的对象当数组。只规范化业务参数,不复制或信任客户端身份、`V8.CurrentUser`、`V8.DbTrans` 或 `V8.WF`;大文件继续使用专用文件通道。验收须同时覆盖真实 HTTP 宿主集合和离线 JavaScript 数组。
|
|
50
|
+
- 动态 `V8.Param` 的缺失字段可能返回 `null`,同名属性读取也可能命中 CLR 宿主成员(例如 `values`),不能仅用 `V8.Param[name] !== undefined` 或 `!= null` 判断调用方是否提交了字段。先规范化有界业务 JSON,再以 `Object.prototype.hasOwnProperty.call(input, name)` 检查自有键,区分缺失、显式 `null`、`0` 和 `false`,随后执行该字段的类型和白名单规则;不要调用可能被输入覆盖的 `input.hasOwnProperty()`。此转换不产生可信身份,也不替代大小/深度限制、鉴权、事务或数据范围。回归应包含缺失返回 `null`、宿主同名成员、显式空值及普通 JSON 输入。
|
|
50
51
|
- 通过 `V8.CurrentUser` 获取当前登录用户信息
|
|
51
52
|
- 同租户 `V8.ApiEngine.Run` 嵌套调用缺少身份时,后端从本次重新验证的 DiyToken 恢复独立身份副本;不要让客户端补传 `_CurrentUser`。跨租户公开调用清空原租户身份,匿名仍匿名,可信后台任务保留任务身份。旧节点须更新包含修复的后端;实际验收同时覆盖普通账号 HTTP 嵌套调用、跨租户、匿名与后台任务,不能只用离线夹具证明上线。
|
|
52
53
|
- 高精度 `decimal(p,s)` / 带小数位 `number(p,s)` 的金额、数量、换算率使用无分组、英文小数点的十进制字符串,避免先 `Number()` / `parseFloat()` 或浮点运算丢位。后端使用固定文化解析,拒绝逗号分组、本地化逗号小数、指数、非数字和越界;业务层仍须按字段约束精度、小数位、范围和权限。空值兼容不变,不能从舍入后的历史值重建精度或擅自回填。用真实 HTTP、数据库写后读与目标租户验收,不能把 CLR 参数绑定冒充数据库成功。
|
|
@@ -134,9 +134,9 @@ description: Microi V8 与 MCP 文件上传下载指南。用于流式发布、
|
|
|
134
134
|
- 只读验收结合 `VerifiedCheckpointSkipped/RetryBackoffSkipped/NextCheckAtUtc` 与对象存储访问日志,覆盖等待内零重复读取、元数据变更、失败恢复和多个节点。需确认实际 API 节点已部署修复;文档、单测、镜像上传不等于生产节流生效,也不把检查点成功当成正式 V3 发布回执。
|
|
135
135
|
|
|
136
136
|
<!-- microi-progressive:begin -->
|
|
137
|
-
<!-- microi-progressive:chunk id=v8-file-upload-000 sha256=
|
|
137
|
+
<!-- microi-progressive:chunk id=v8-file-upload-000 sha256=a7a4a8bcc549a25112f58dabc79ed44ede5d48d87e3c53dbbe0224548ff3f162 -->
|
|
138
|
+
- V3 发布长时间停在 `Verifying` 且计数、版本行均不前进时,先回读原版本与运行基线;复用原 requestId/fingerprint/冻结正文和初始应用 CAS,仅将 expectedVersionRowVersion 更新为真实回读值。上传幂等命中不等于已通过验证。后台 V3 恢复、历史已发布别名、历史安装别名各自单循环调度,慢存储不能相互阻塞轮次;升级所有运行节点后再观察原任务进度。不得清锁、伪造 Verified、重置指针或绕开完整字节校验;最终仍需 ReleaseVerified、finalize 和公开入口回读。
|
|
138
139
|
## 核心 API
|
|
139
|
-
|
|
140
140
|
| API | 说明 |
|
|
141
141
|
|-----|------|
|
|
142
142
|
| `V8.FilesByteBase64` | 接收上传时携带的文件字典 `{ FileName: base64 }` |
|
|
@@ -14,10 +14,11 @@ description: Microi 前端 V8 事件与客户端能力指南。用于编写浏
|
|
|
14
14
|
> 本文重点是 **字段事件、按钮事件、列表事件、模板引擎、其它前端钩子**。
|
|
15
15
|
|
|
16
16
|
<!-- microi-progressive:begin -->
|
|
17
|
-
<!-- microi-progressive:chunk id=v8-frontend-events-000 sha256=
|
|
17
|
+
<!-- microi-progressive:chunk id=v8-frontend-events-000 sha256=fc639b3e0fbde86aaec6a60839e6e8dc9526e01486da4ec325686cbbbae44527 -->
|
|
18
18
|
## 能力路由
|
|
19
19
|
|
|
20
20
|
- 查询前端 V8 全部上下文、导航、表单、列表、网络、引擎与工具入口时,读取 `../v8-utilities/references/client-api-index.md`。
|
|
21
|
+
- 详情替换使用模块 `sys_menu.DetailPageV8`,已打开表单的字段初始化才用 `InFormV8`;先读 [详情接管边界](references/progressive-01-列表事件.md#detailpagev8-详情替换与-informv8-初始化)。动态赋值后只缺选项名称时使用原生已选值显示补查,不改保存键或重复触发字段事件。
|
|
21
22
|
- 需求包含“蓝牙打印、标签打印、TSC/TSPL、CPCL、ESC/POS、小票打印、佳博/GP-M322、ZICOX/芝柯/CC4、BLE/SPP”时,必须先读取 `references/bluetooth-print.md`;需要完整指令签名、型号转换范围、编码或位图参数时,再读取 `references/bluetooth-print-api.md`。
|
|
22
23
|
- `microi.app` 是 5+ 在线壳,不能假设存在 `uni` 或 Web Bluetooth。BLE 连接、发现和写入必须统一使用 `plus.bluetooth`,禁止用 `uni.writeBLECharacteristicValue` 写入由 `plus.bluetooth` 建立的连接。5+ `V8.Print.getConnectionState()` 的 `mtu/maxWriteBytes/recommendedPacketSize/writeType/packetIntervalMs` 描述本次连接能力。Android GP-M322 在特征支持时优先 `writeNoResponse`,即使协商出 180 字节有效载荷也只采用 100 字节连续发送稳定档,并保留约 8ms 包间保护;不支持无响应写时兼容 `write`,空 MTU 成功、失败、超时或旧壳只用 20 字节。详见蓝牙参考。
|
|
23
24
|
- 浏览器模板打印、PDF/纸张模板、`mic_print`、`PageObj`、`PrintObj` 使用 `print-engine/SKILL.md`,不要与直接蓝牙指令混为一套 API。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-frontend-events-006 sha256=
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-frontend-events-006 sha256=98758a2a95fe35e6c7413d8d6d6e6e0e05d2b9fdd349e8f21d482e4a00c1e3df -->
|
|
6
6
|
## 列表事件
|
|
7
7
|
|
|
8
8
|
### TableRowClick — 行点击
|
|
@@ -14,6 +14,26 @@ console.log('点击行:', V8.Form.Id);
|
|
|
14
14
|
V8.OpenAnyForm({ TableName: 'OrderDetail', Id: V8.Form.Id, FormMode: 'View' });
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
+
### DetailPageV8 — 详情替换与 InFormV8 初始化
|
|
18
|
+
|
|
19
|
+
- 替换详情写入实际入口模块的 `sys_menu.DetailPageV8`,包括隐藏子表模块;不要写在 `diy_table.InFormV8`。后者在原生表单已打开后初始化字段,直接从中再开微服务会产生先原生后微服务的闪窗。
|
|
20
|
+
- DiyTable 与 `diy-form-full` 统一“配置即替换默认详情”:有 `DetailPageV8` 就等待脚本并由其接管,返回 `undefined` 或 `{ Code: 1 }` 也不自动再开原生。`return false`、`return { Code: 0, Msg: '原因' }` 或将相同值写入 `V8.Result` 表示取消其它 UI。脚本出错结束本次流程并提示,不能悄悄回退原生表单;没有配置详情脚本的普通详情及 Add/Edit 保持原生行为。
|
|
21
|
+
- 脚本需要明确打开原生详情时,调用既有 `V8.OpenForm(V8.Form, 'View')`;该方法传递内部已有的 `isDefaultOpen===true`,避免递归再次执行详情替换。不要新增“继续原生”的业务 flag,也不要把 `undefined` 当作继续原生协议。迁移客户配置时仍显式 `return false`,兼容旧 PC。
|
|
22
|
+
- 新事件对象局部包装 `V8.OpenAppDialog` 并绑定表、记录、菜单、API、租户、用户、初始化/关闭代次及销毁状态;关闭或上下文变化后,迟到脚本不能开旧窗口。不得改写全局或 `ParentV8.OpenAppDialog`。若旧代码用 `ParentV8` 开窗,保留父上下文并显式 `return false`,异步父副作用仍须自行检查当前性。
|
|
23
|
+
- 迁移旧配置只移动 View 接管段,保留 Add/Edit 初始化和原有事件/按钮;不提前执行整段 FormIn。菜单、子表授权和服务端记录权限继续生效,传入 Id、TaskId 不等于授权。验收含列表/子表/嵌套详情、同步/异步取消、正常原生 Hook、异常及关闭/换身份迟到。
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
// 配置在实际模块 sys_menu.DetailPageV8,AppKey/RoutePath先从当前租户在线应用回读。
|
|
27
|
+
V8.OpenAppDialog({
|
|
28
|
+
AppKey: '已发布应用的真实Key',
|
|
29
|
+
RoutePath: '/detail',
|
|
30
|
+
Data: { Id: V8.Form.Id }
|
|
31
|
+
});
|
|
32
|
+
return false;
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`await` 用于事件中的异步准备,并不把打开动作变成等待用户关闭的 Promise;表单初始化逻辑仍留在 InFormV8。
|
|
36
|
+
|
|
17
37
|
### OpenTableBefore — 打开列表前(拦截/初始化筛选)
|
|
18
38
|
|
|
19
39
|
```javascript
|
|
@@ -51,7 +51,7 @@ AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<
|
|
|
51
51
|
| `DataFilterV8.js` | **后端** | `DataFilter` | 获取列表/表单数据后 | 每行数据加工、脱敏、补充字段 |
|
|
52
52
|
|
|
53
53
|
<!-- /microi-progressive:chunk -->
|
|
54
|
-
<!-- microi-progressive:chunk id=v8-table-event-002 sha256=
|
|
54
|
+
<!-- microi-progressive:chunk id=v8-table-event-002 sha256=05744c5423f5e7f324ba28472b4032e890fffde8f8790b570f09c83c13843d68 -->
|
|
55
55
|
## 事件触发规则
|
|
56
56
|
|
|
57
57
|
- 后端 V8 事件 / 接口引擎中调用 `V8.FormEngine` 增删改 → **不触发**表单 V8 事件
|
|
@@ -63,6 +63,7 @@ AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<
|
|
|
63
63
|
### 日志、评论、数据版本的 12 个写入事件
|
|
64
64
|
|
|
65
65
|
事件仍是顶层 `diy_table` 属性,不属于 `sys_menu`、字段 Config 或临时接口。
|
|
66
|
+
设计器中统一归入已有“事件”Tab,按日志、评论、数据版本以三个元数据 Divider 分区;不得把十二项留在基础信息,也不得给分隔标题创建物理业务列。
|
|
66
67
|
`microi_list_events/get_event_code/save_event_code` 与 Manifest `events[]` 使用相同名称。
|
|
67
68
|
`V8.EventName` 等于属性名去掉末尾 `V8`。
|
|
68
69
|
|