@ziamana/bruine 0.1.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/LICENSE +21 -0
- package/README.md +315 -0
- package/THIRD_PARTY_NOTICES.md +24 -0
- package/cordis.patch.yml +166 -0
- package/dist/bin.js +5358 -0
- package/dist/compat.js +40 -0
- package/dist/plugins/approval.js +147 -0
- package/dist/plugins/headless.js +236 -0
- package/dist/plugins/herdr.js +470 -0
- package/dist/plugins/mcp.js +275 -0
- package/dist/plugins/modes.js +850 -0
- package/dist/plugins/render.js +3723 -0
- package/dist/plugins/repl.js +9589 -0
- package/dist/plugins/silence.js +234 -0
- package/dist/plugins/startup.js +42 -0
- package/dist/plugins/web-search.js +138 -0
- package/package.json +93 -0
- package/skills/code-review/SKILL.md +30 -0
- package/skills/git-workflow/SKILL.md +31 -0
- package/skills/impeccable/LICENSE +191 -0
- package/skills/impeccable/NOTICE.md +11 -0
- package/skills/impeccable/SKILL.md +87 -0
- package/skills/impeccable/reference/adapt.md +318 -0
- package/skills/impeccable/reference/adapt.native.md +58 -0
- package/skills/impeccable/reference/android.md +46 -0
- package/skills/impeccable/reference/animate.md +89 -0
- package/skills/impeccable/reference/audit.md +137 -0
- package/skills/impeccable/reference/audit.native.md +139 -0
- package/skills/impeccable/reference/bolder.md +33 -0
- package/skills/impeccable/reference/clarify.md +94 -0
- package/skills/impeccable/reference/colorize.md +86 -0
- package/skills/impeccable/reference/component-review.md +63 -0
- package/skills/impeccable/reference/craft-floor.md +44 -0
- package/skills/impeccable/reference/craft.md +5 -0
- package/skills/impeccable/reference/critique.md +806 -0
- package/skills/impeccable/reference/degraded/asset-producer.md +42 -0
- package/skills/impeccable/reference/degraded/documenter.md +24 -0
- package/skills/impeccable/reference/degraded/finish-reviewer.md +38 -0
- package/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/skills/impeccable/reference/delight.md +70 -0
- package/skills/impeccable/reference/distill.md +111 -0
- package/skills/impeccable/reference/doctor.md +54 -0
- package/skills/impeccable/reference/document.md +416 -0
- package/skills/impeccable/reference/extract.md +69 -0
- package/skills/impeccable/reference/generate.md +101 -0
- package/skills/impeccable/reference/harden.md +345 -0
- package/skills/impeccable/reference/hooks.md +113 -0
- package/skills/impeccable/reference/init.md +131 -0
- package/skills/impeccable/reference/ios.md +51 -0
- package/skills/impeccable/reference/layout.md +84 -0
- package/skills/impeccable/reference/live-setup.md +104 -0
- package/skills/impeccable/reference/live.md +325 -0
- package/skills/impeccable/reference/mode-operate.md +21 -0
- package/skills/impeccable/reference/mode-persuade.md +19 -0
- package/skills/impeccable/reference/mode-read.md +21 -0
- package/skills/impeccable/reference/new-work.md +154 -0
- package/skills/impeccable/reference/onboard.md +234 -0
- package/skills/impeccable/reference/operate.md +61 -0
- package/skills/impeccable/reference/optimize.md +258 -0
- package/skills/impeccable/reference/overdrive.md +127 -0
- package/skills/impeccable/reference/polish.md +105 -0
- package/skills/impeccable/reference/quieter.md +99 -0
- package/skills/impeccable/reference/region-map.md +26 -0
- package/skills/impeccable/reference/routing.md +24 -0
- package/skills/impeccable/reference/shape.md +59 -0
- package/skills/impeccable/reference/typeset.md +80 -0
- package/skills/impeccable/reference/visualize.md +46 -0
- package/skills/impeccable/scripts/VERSION +1 -0
- package/skills/impeccable/scripts/command-metadata.json +98 -0
- package/skills/impeccable/scripts/data/font-index-failures.json +121 -0
- package/skills/impeccable/scripts/data/font-index.json +1 -0
- package/skills/impeccable/scripts/impeccable +206 -0
- package/skills/impeccable/scripts/impeccable.cmd +214 -0
- package/skills/impeccable/scripts/live-browser-dom.js +167 -0
- package/skills/impeccable/scripts/live-browser-ignores.js +242 -0
- package/skills/impeccable/scripts/live-browser-session.js +148 -0
- package/skills/impeccable/scripts/live-browser.js +13510 -0
- package/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/skills/make-interfaces-feel-better/LICENSE +21 -0
- package/skills/make-interfaces-feel-better/SKILL.md +187 -0
- package/skills/make-interfaces-feel-better/agents/openai.yaml +3 -0
- package/skills/make-interfaces-feel-better/animations.md +403 -0
- package/skills/make-interfaces-feel-better/icons.md +63 -0
- package/skills/make-interfaces-feel-better/performance.md +88 -0
- package/skills/make-interfaces-feel-better/surfaces.md +256 -0
- package/skills/make-interfaces-feel-better/typography.md +157 -0
- package/skills/playwright-cli/LICENSE +201 -0
- package/skills/playwright-cli/SKILL.md +489 -0
- package/skills/playwright-cli/references/element-attributes.md +23 -0
- package/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/skills/playwright-cli/references/pr-attachments.md +60 -0
- package/skills/playwright-cli/references/request-mocking.md +87 -0
- package/skills/playwright-cli/references/running-code.md +245 -0
- package/skills/playwright-cli/references/session-management.md +227 -0
- package/skills/playwright-cli/references/storage-state.md +275 -0
- package/skills/playwright-cli/references/test-generation.md +433 -0
- package/skills/playwright-cli/references/tracing.md +139 -0
- package/skills/playwright-cli/references/video-recording.md +216 -0
- package/skills/remotion/SKILL.md +42 -0
- package/skills/systematic-debugging/SKILL.md +26 -0
- package/skills/thermo-nuclear-code-quality-review/LICENSE +21 -0
- package/skills/thermo-nuclear-code-quality-review/SKILL.md +192 -0
- package/skills/write-tests/SKILL.md +35 -0
- package/skills/youtube-transcript/LICENSE +21 -0
- package/skills/youtube-transcript/SKILL.md +41 -0
- package/skills/youtube-transcript/package.json +8 -0
- package/skills/youtube-transcript/transcript.js +44 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to the Licensor for inclusion in the Work by the copyright
|
|
52
|
+
owner or by an individual or Legal Entity authorized to submit on
|
|
53
|
+
behalf of the copyright owner. For the purposes of this definition,
|
|
54
|
+
"submitted" means any form of electronic, verbal, or written
|
|
55
|
+
communication sent to the Licensor or its representatives, including
|
|
56
|
+
but not limited to communication on electronic mailing lists, source
|
|
57
|
+
code control systems, and issue tracking systems that are managed by,
|
|
58
|
+
or on behalf of, the Licensor for the purpose of discussing and
|
|
59
|
+
improving the Work, but excluding communication that is conspicuously
|
|
60
|
+
marked or otherwise designated in writing by the copyright owner as
|
|
61
|
+
"Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
66
|
+
|
|
67
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
68
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
69
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
70
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
71
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
72
|
+
Work and such Derivative Works in Source or Object form.
|
|
73
|
+
|
|
74
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
75
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
76
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
77
|
+
(except as stated in this section) patent license to make, have made,
|
|
78
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
79
|
+
where such license applies only to those patent claims licensable
|
|
80
|
+
by such Contributor that are necessarily infringed by their
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
82
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
89
|
+
|
|
90
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
91
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
92
|
+
modifications, and in Source or Object form, provided that You
|
|
93
|
+
meet the following conditions:
|
|
94
|
+
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
97
|
+
|
|
98
|
+
(b) You must cause any modified files to carry prominent notices
|
|
99
|
+
stating that You changed the files; and
|
|
100
|
+
|
|
101
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
102
|
+
that You distribute, all copyright, patent, trademark, and
|
|
103
|
+
attribution notices from the Source form of the Work,
|
|
104
|
+
excluding those notices that do not pertain to any part of
|
|
105
|
+
the Derivative Works; and
|
|
106
|
+
|
|
107
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
130
|
+
|
|
131
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
132
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
133
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
134
|
+
this License, without any additional terms or conditions.
|
|
135
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
136
|
+
the terms of any separate license agreement you may have executed
|
|
137
|
+
with Licensor regarding such Contributions.
|
|
138
|
+
|
|
139
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
140
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
141
|
+
except as required for reasonable and customary use in describing the
|
|
142
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
143
|
+
|
|
144
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
145
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
146
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
147
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
148
|
+
implied, including, without limitation, any warranties or conditions
|
|
149
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
152
|
+
risks associated with Your exercise of permissions under this License.
|
|
153
|
+
|
|
154
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
155
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
156
|
+
unless required by applicable law (such as deliberate and grossly
|
|
157
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
158
|
+
liable to You for damages, including any direct, indirect, special,
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
160
|
+
result of this License or out of the use or inability to use the
|
|
161
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
165
|
+
|
|
166
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
167
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
+
or other liability obligations and/or rights consistent with this
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
176
|
+
|
|
177
|
+
END OF TERMS AND CONDITIONS
|
|
178
|
+
|
|
179
|
+
Copyright 2025 Paul Bakaus
|
|
180
|
+
|
|
181
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
182
|
+
you may not use this file except in compliance with the License.
|
|
183
|
+
You may obtain a copy of the License at
|
|
184
|
+
|
|
185
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
186
|
+
|
|
187
|
+
Unless required by applicable law or agreed to in writing, software
|
|
188
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
189
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
190
|
+
See the License for the specific language governing permissions and
|
|
191
|
+
limitations under the License.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Third-Party Notices
|
|
2
|
+
|
|
3
|
+
This project includes content derived from third-party work, used under the terms of its original license.
|
|
4
|
+
|
|
5
|
+
## Platform Design Skills
|
|
6
|
+
|
|
7
|
+
The `skill/reference/ios.md` and `skill/reference/android.md` platform reference files are distilled from ehmo's `platform-design-skills` (Apple Human Interface Guidelines and Material Design 3 rules), rewritten in Impeccable's voice.
|
|
8
|
+
|
|
9
|
+
**Original work:** https://github.com/ehmo/platform-design-skills
|
|
10
|
+
**Original license:** MIT
|
|
11
|
+
**Author:** ehmo
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: impeccable
|
|
3
|
+
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
|
4
|
+
version: 4.5.0
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: "[shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live|generate] [target]"
|
|
7
|
+
license: Apache 2.0
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
This skill gives you the tools and permission to create design that earns to be called out-of-distribution craft: Whereas before, your design work would have been safe, timid and measured, you now approach every design task as an award-winning design director with impeccable understanding for what makes exceptional design work: production-grade code, peak creativity, a clear POV, deep understanding of the needs of the client and users, and exceptional craft.
|
|
11
|
+
|
|
12
|
+
Core principles:
|
|
13
|
+
- Go all out. No hedging, no shortcuts. The deliverable must be complete (except assets the user must provide).
|
|
14
|
+
- Dream big and bold. Distinct, beautiful, outstanding and highly inspiring work.
|
|
15
|
+
- Verify in bounded passes, not a loop, and the ceiling covers the whole cycle: screenshots, defect scans, micro-edits, and rebuilds alike. Build fully, inspect once with a batched round (desktop and mobile together on the web; the shipped device classes on a native platform), fix everything it shows in one batch, confirm with at most one more round, and stop polishing. Open-ended self-QA burns the user's money doing worse what the finish handoffs do better.
|
|
16
|
+
|
|
17
|
+
## Setup
|
|
18
|
+
|
|
19
|
+
1. Run `"${CLAUDE_SKILL_DIR}/scripts/impeccable" context` once per session, where `${CLAUDE_SKILL_DIR}` is the directory that contains this SKILL.md (the skill folder, not a plugin root two levels above it); keep cwd at the user's project. Every `"${CLAUDE_SKILL_DIR}/scripts/impeccable" <verb>` command in this skill and its references resolves against that base directory. In reference files, replace the skill-base-dir placeholder with this directory before running commands; it is not a shell variable. On a Windows shell without `sh`, call `"${CLAUDE_SKILL_DIR}/scripts/impeccable.cmd"` instead. The launcher runs a self-contained binary that ships next to it or is downloaded once on first run; no Node or other runtime is required. Pass a named source file or route as `--target <path>`. It loads PRODUCT.md, DESIGN.md, the matching surface brief, and native-platform guidance when applicable; follow its directives and do not rerun it.
|
|
20
|
+
2. Load the request's playbook: its Commands-table reference for an explicit/implied sub-command, or [reference/new-work.md](reference/new-work.md) for a new surface or replacement visual world. Inspect target and incumbent visual truth before editing. When the app cannot run, start with committed visual-regression goldens or screenshot fixtures; verify target and freshness against current tokens, CSS, components, or assets, resolve conflicts, and compare theme/variant captures.
|
|
21
|
+
3. After resolving analysis and direction, read [reference/craft-floor.md](reference/craft-floor.md) immediately before any UI edit, including small refinements. It carries the quality floor, the absolute bans, and the reflexes no detector catches. Do not load it for planning-only work.
|
|
22
|
+
|
|
23
|
+
**Launcher unavailable:** On refusal or failure, send a separate message **before the next tool call**: “Context loading did not run; I’ll read the existing project context directly.” Then read existing PRODUCT.md and DESIGN.md without inventing missing context, follow applicable steps 2–3, and continue through permitted tools. This applies to planning and editing; launcher failure alone does not block either.
|
|
24
|
+
|
|
25
|
+
## How to design
|
|
26
|
+
|
|
27
|
+
- **The brief wins.** Honor pinned aesthetics, eras, materials, fonts, and palettes even when they conflict with a saturated-pattern warning. Redirecting a clear brief toward your taste is failure.
|
|
28
|
+
- **Refinement preserves; redesign replaces.** Refinement keeps the incumbent identity, behavior, copy, and everything outside scope. Ask before replacing factual copy or adding claims. Redesign keeps product truth, content, function, native affordances, and constraints, but treats the old look as evidence and anti-reference; choose a replacement world in new-work and replace DESIGN.md. Never split the difference into polish on the discarded look.
|
|
29
|
+
- **Visual authority is evidence, not a filename.** Missing DESIGN.md alone does not make a project greenfield; new-work decides whether to preserve, expand, or replace the incumbent world.
|
|
30
|
+
|
|
31
|
+
## Modes
|
|
32
|
+
|
|
33
|
+
The mode names what the visitor's success looks like on this surface.
|
|
34
|
+
|
|
35
|
+
- **Persuade:** the visitor decides and acts; design is the product. Landing pages, marketing, campaigns, pricing. Earn attention and action. Ship real imagery when the brief needs it; follow the committed world, not category habit.
|
|
36
|
+
- **Operate:** the visitor completes a task. App UI, dashboards, editors, admin, settings, tools. Scanability, consistency, native expectations, and the real usage scene outrank expression. Brand lives in precise details.
|
|
37
|
+
- **Read:** the visitor understands something. Docs, articles, guides, help, changelogs. Structure for comprehension, then make the reading experience worth staying in.
|
|
38
|
+
- **Experience:** the visitor is inside the work itself. Portfolios, galleries, showcases. Let the artifact lead from the first viewport; the interface recedes.
|
|
39
|
+
|
|
40
|
+
Choose the mode from the requested surface, not the product, and persist it only in that surface brief. A tool's landing page is still Persuade; a fashion house's documentation is still Read; a docs index is Read, not Persuade. See [new-work.md](reference/new-work.md) for new surfaces and [operate.md](reference/operate.md) for deeper Operate/Read guidance.
|
|
41
|
+
|
|
42
|
+
## Commands
|
|
43
|
+
|
|
44
|
+
| Command | Category | Description | Reference |
|
|
45
|
+
|---|---|---|---|
|
|
46
|
+
| `craft [feature]` | Build | Deprecated alias for an ordinary new-work request | [reference/craft.md](reference/craft.md) |
|
|
47
|
+
| `shape [feature]` | Build | Plan UX/UI before writing code | [reference/shape.md](reference/shape.md) |
|
|
48
|
+
| `init` | Build | Capture durable product context in PRODUCT.md | [reference/init.md](reference/init.md) |
|
|
49
|
+
| `document` | Build | Generate DESIGN.md from existing project code | [reference/document.md](reference/document.md) |
|
|
50
|
+
| `extract [target]` | Build | Pull reusable tokens and components into design system | [reference/extract.md](reference/extract.md) |
|
|
51
|
+
| `critique [target]` | Evaluate | UX design review with heuristic scoring | [reference/critique.md](reference/critique.md) |
|
|
52
|
+
| `audit [target]` | Evaluate | Technical quality checks (a11y, perf, responsive) | [reference/audit.md](reference/audit.md) · native: [reference/audit.native.md](reference/audit.native.md) |
|
|
53
|
+
| `polish [target]` | Refine | Final quality pass before shipping | [reference/polish.md](reference/polish.md) |
|
|
54
|
+
| `bolder [target]` | Refine | Amplify safe or bland designs | [reference/bolder.md](reference/bolder.md) |
|
|
55
|
+
| `quieter [target]` | Refine | Tone down aggressive or overstimulating designs | [reference/quieter.md](reference/quieter.md) |
|
|
56
|
+
| `distill [target]` | Refine | Strip to essence, remove complexity | [reference/distill.md](reference/distill.md) |
|
|
57
|
+
| `harden [target]` | Refine | Production-ready: errors, i18n, edge cases | [reference/harden.md](reference/harden.md) |
|
|
58
|
+
| `onboard [target]` | Refine | Design first-run flows, empty states, activation | [reference/onboard.md](reference/onboard.md) |
|
|
59
|
+
| `animate [target]` | Enhance | Add purposeful animations and motion | [reference/animate.md](reference/animate.md) |
|
|
60
|
+
| `colorize [target]` | Enhance | Add strategic color to monochromatic UIs | [reference/colorize.md](reference/colorize.md) |
|
|
61
|
+
| `typeset [target]` | Enhance | Improve typography hierarchy and fonts | [reference/typeset.md](reference/typeset.md) |
|
|
62
|
+
| `layout [target]` | Enhance | Fix spacing, rhythm, and visual hierarchy | [reference/layout.md](reference/layout.md) |
|
|
63
|
+
| `delight [target]` | Enhance | Add personality and memorable touches | [reference/delight.md](reference/delight.md) |
|
|
64
|
+
| `overdrive [target]` | Enhance | Push past conventional limits | [reference/overdrive.md](reference/overdrive.md) |
|
|
65
|
+
| `clarify [target]` | Fix | Improve UX copy, labels, and error messages | [reference/clarify.md](reference/clarify.md) |
|
|
66
|
+
| `adapt [target]` | Fix | Adapt for different devices and screen sizes | [reference/adapt.md](reference/adapt.md) · native: [reference/adapt.native.md](reference/adapt.native.md) |
|
|
67
|
+
| `optimize [target]` | Fix | Diagnose and fix UI performance | [reference/optimize.md](reference/optimize.md) |
|
|
68
|
+
| `live` | Iterate | Visual variant mode: pick elements in the browser, iterate on alternatives | [reference/live.md](reference/live.md) |
|
|
69
|
+
| `generate [n] [action] [element]` | Iterate | Variants, versions, or alternatives of a named element to choose from in the live browser; no manual picking | [reference/generate.md](reference/generate.md) |
|
|
70
|
+
|
|
71
|
+
Routing:
|
|
72
|
+
|
|
73
|
+
- **No argument:** read [routing.md](reference/routing.md) and present its context-aware menu; never auto-run a command.
|
|
74
|
+
- **Explicit or clearly implied request to run a command:** load its reference (native variant on native platforms) and follow it. Ask once if two commands fit.
|
|
75
|
+
- **Workflow or command-selection question:** read [Workflow questions](reference/routing.md#workflow-questions).
|
|
76
|
+
- **Otherwise:** treat the request as general design work. Missing PRODUCT.md routes a new surface or replacement world through init, then new-work; a narrow refinement of existing code proceeds on the incumbent implementation as `impeccable context` directs, offering init afterward rather than blocking on it.
|
|
77
|
+
- `teach` aliases `init`. `craft` is a deprecated alias for ordinary new-work and adds nothing. `shape` owns task discovery, then enters new-work only for visual-world and surface-concept decisions.
|
|
78
|
+
|
|
79
|
+
After init writes PRODUCT.md, resume without rerunning `impeccable context`; init loads the native platform reference itself when the platform it recorded is `ios`, `android`, or `adaptive`.
|
|
80
|
+
|
|
81
|
+
**Pin / Unpin:** `"${CLAUDE_SKILL_DIR}/scripts/impeccable" pin <pin|unpin> <command>` creates or removes a standalone `/<command>` shortcut. Report the script's result concisely; relay stderr verbatim on error.
|
|
82
|
+
|
|
83
|
+
**Hooks:** `/impeccable hooks <on|off|status|ignore-rule|ignore-file|ignore-value|reset>` manages the design detector hook for this project (auto-runs the detector after UI file edits and surfaces findings). Load [reference/hooks.md](reference/hooks.md) when the user invokes it with any argument.
|
|
84
|
+
|
|
85
|
+
**Doctor:** `/impeccable doctor` reports and repairs drift between this project's Impeccable artifacts (PRODUCT.md, DESIGN.md and its sidecar, config, surface briefs, the hook) and what this version reads. Load [reference/doctor.md](reference/doctor.md) when the user invokes it, or when they ask what is out of date, stale, or needs refreshing. A `CONTEXT_STALE` directive in Setup's output is the cheap subset of the same report; act on it there per its own instructions rather than running doctor unasked.
|
|
86
|
+
|
|
87
|
+
**Never repair drift as a side effect of a design task.** A `CONTEXT_STALE` finding is reported, not acted on, unless the user asks. The one exception is a finding marked `auto`, which the next write to that file performs anyway.
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
> **Additional context needed**: target platforms/devices and usage contexts.
|
|
2
|
+
|
|
3
|
+
Adapt an existing design to a different context: another screen size, device, platform, or use case. The trap is treating adaptation as scaling. The job is rethinking the experience for the new context.
|
|
4
|
+
|
|
5
|
+
**Web only** (mobile web included). Native platforms (`ios` / `android` / `adaptive`) route to [adapt.native.md](adapt.native.md) instead; if the project is native, switch to it now.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Assess Adaptation Challenge
|
|
10
|
+
|
|
11
|
+
Understand what needs adaptation and why:
|
|
12
|
+
|
|
13
|
+
1. **Identify the source context**:
|
|
14
|
+
- What was it designed for originally? (Desktop web? Mobile app?)
|
|
15
|
+
- What assumptions were made? (Large screen? Mouse input? Fast connection?)
|
|
16
|
+
- What works well in current context?
|
|
17
|
+
|
|
18
|
+
2. **Understand target context**:
|
|
19
|
+
- **Device**: Mobile, tablet, desktop, TV, watch, print?
|
|
20
|
+
- **Input method**: Touch, mouse, keyboard, voice, gamepad?
|
|
21
|
+
- **Screen constraints**: Size, resolution, orientation?
|
|
22
|
+
- **Connection**: Fast wifi, slow 3G, offline?
|
|
23
|
+
- **Usage context**: On-the-go vs desk, quick glance vs focused reading?
|
|
24
|
+
- **User expectations**: What do users expect on this platform?
|
|
25
|
+
|
|
26
|
+
3. **Identify adaptation challenges**:
|
|
27
|
+
- What won't fit? (Content, navigation, features)
|
|
28
|
+
- What won't work? (Hover states on touch, tiny touch targets)
|
|
29
|
+
- What's inappropriate? (Desktop patterns on mobile, mobile patterns on desktop)
|
|
30
|
+
|
|
31
|
+
**CRITICAL**: Adaptation is rethinking the experience for the new context, not scaling pixels.
|
|
32
|
+
|
|
33
|
+
## Plan Adaptation Strategy
|
|
34
|
+
|
|
35
|
+
Create context-appropriate strategy:
|
|
36
|
+
|
|
37
|
+
### Mobile Adaptation (Desktop → Mobile)
|
|
38
|
+
|
|
39
|
+
**Layout Strategy**:
|
|
40
|
+
- Single column instead of multi-column
|
|
41
|
+
- Vertical stacking instead of side-by-side
|
|
42
|
+
- Full-width components instead of fixed widths
|
|
43
|
+
- Bottom navigation instead of top/side navigation
|
|
44
|
+
|
|
45
|
+
**Interaction Strategy**:
|
|
46
|
+
- Touch targets 44x44px minimum (not hover-dependent)
|
|
47
|
+
- Swipe gestures where appropriate (lists, carousels)
|
|
48
|
+
- Bottom sheets instead of dropdowns
|
|
49
|
+
- Thumbs-first design (controls within thumb reach)
|
|
50
|
+
- Larger tap areas with more spacing
|
|
51
|
+
|
|
52
|
+
**Content Strategy**:
|
|
53
|
+
- Progressive disclosure (don't show everything at once)
|
|
54
|
+
- Prioritize primary content (secondary content in tabs/accordions)
|
|
55
|
+
- Shorter text (more concise)
|
|
56
|
+
- Larger text (16px minimum)
|
|
57
|
+
|
|
58
|
+
**Navigation Strategy**:
|
|
59
|
+
- Hamburger menu or bottom navigation
|
|
60
|
+
- Reduce navigation complexity
|
|
61
|
+
- Sticky headers for context
|
|
62
|
+
- Back button in navigation flow
|
|
63
|
+
|
|
64
|
+
### Tablet Adaptation (Hybrid Approach)
|
|
65
|
+
|
|
66
|
+
**Layout Strategy**:
|
|
67
|
+
- Two-column layouts (not single or three-column)
|
|
68
|
+
- Side panels for secondary content
|
|
69
|
+
- Master-detail views (list + detail)
|
|
70
|
+
- Adaptive based on orientation (portrait vs landscape)
|
|
71
|
+
|
|
72
|
+
**Interaction Strategy**:
|
|
73
|
+
- Support both touch and pointer
|
|
74
|
+
- Touch targets 44x44px but allow denser layouts than phone
|
|
75
|
+
- Side navigation drawers
|
|
76
|
+
- Multi-column forms where appropriate
|
|
77
|
+
|
|
78
|
+
### Desktop Adaptation (Mobile → Desktop)
|
|
79
|
+
|
|
80
|
+
**Layout Strategy**:
|
|
81
|
+
- Multi-column layouts (use horizontal space)
|
|
82
|
+
- Side navigation always visible
|
|
83
|
+
- Multiple information panels simultaneously
|
|
84
|
+
- Fixed widths with max-width constraints (don't stretch to 4K)
|
|
85
|
+
|
|
86
|
+
**Interaction Strategy**:
|
|
87
|
+
- Hover states for additional information
|
|
88
|
+
- Keyboard shortcuts
|
|
89
|
+
- Right-click context menus
|
|
90
|
+
- Drag and drop where helpful
|
|
91
|
+
- Multi-select with Shift/Cmd
|
|
92
|
+
|
|
93
|
+
**Content Strategy**:
|
|
94
|
+
- Show more information upfront (less progressive disclosure)
|
|
95
|
+
- Data tables with many columns
|
|
96
|
+
- Richer visualizations
|
|
97
|
+
- More detailed descriptions
|
|
98
|
+
|
|
99
|
+
### Print Adaptation (Screen → Print)
|
|
100
|
+
|
|
101
|
+
**Layout Strategy**:
|
|
102
|
+
- Page breaks at logical points
|
|
103
|
+
- Remove navigation, footer, interactive elements
|
|
104
|
+
- Black and white (or limited color)
|
|
105
|
+
- Proper margins for binding
|
|
106
|
+
|
|
107
|
+
**Content Strategy**:
|
|
108
|
+
- Expand shortened content (show full URLs, hidden sections)
|
|
109
|
+
- Add page numbers, headers, footers
|
|
110
|
+
- Include metadata (print date, page title)
|
|
111
|
+
- Convert charts to print-friendly versions
|
|
112
|
+
|
|
113
|
+
### Email Adaptation (Web → Email)
|
|
114
|
+
|
|
115
|
+
**Layout Strategy**:
|
|
116
|
+
- Narrow width (600px max)
|
|
117
|
+
- Single column only
|
|
118
|
+
- Inline CSS (no external stylesheets)
|
|
119
|
+
- Table-based layouts (for email client compatibility)
|
|
120
|
+
|
|
121
|
+
**Interaction Strategy**:
|
|
122
|
+
- Large, obvious CTAs (buttons not text links)
|
|
123
|
+
- No hover states (not reliable)
|
|
124
|
+
- Deep links to web app for complex interactions
|
|
125
|
+
|
|
126
|
+
## Implement Adaptations
|
|
127
|
+
|
|
128
|
+
Apply changes systematically:
|
|
129
|
+
|
|
130
|
+
### Responsive Breakpoints
|
|
131
|
+
|
|
132
|
+
Choose appropriate breakpoints:
|
|
133
|
+
- Mobile: 320px-767px
|
|
134
|
+
- Tablet: 768px-1023px
|
|
135
|
+
- Desktop: 1024px+
|
|
136
|
+
- Or content-driven breakpoints (where design breaks)
|
|
137
|
+
|
|
138
|
+
### Layout Adaptation Techniques
|
|
139
|
+
|
|
140
|
+
- **CSS Grid/Flexbox**: Reflow layouts automatically
|
|
141
|
+
- **Container Queries**: Adapt based on container, not viewport
|
|
142
|
+
- **`clamp()`**: Fluid sizing between min and max
|
|
143
|
+
- **Media queries**: Different styles for different contexts
|
|
144
|
+
- **Display properties**: Show/hide elements per context
|
|
145
|
+
|
|
146
|
+
### Touch Adaptation
|
|
147
|
+
|
|
148
|
+
- Increase touch target sizes (44x44px minimum)
|
|
149
|
+
- Add more spacing between interactive elements
|
|
150
|
+
- Remove hover-dependent interactions
|
|
151
|
+
- Add touch feedback (ripples, highlights)
|
|
152
|
+
- Consider thumb zones (easier to reach bottom than top)
|
|
153
|
+
|
|
154
|
+
### Content Adaptation
|
|
155
|
+
|
|
156
|
+
- Use `display: none` sparingly (still downloads)
|
|
157
|
+
- Progressive enhancement (core content first, enhancements on larger screens)
|
|
158
|
+
- Lazy loading for off-screen content
|
|
159
|
+
- Responsive images (`srcset`, `picture` element)
|
|
160
|
+
|
|
161
|
+
### Navigation Adaptation
|
|
162
|
+
|
|
163
|
+
- Transform complex nav to hamburger/drawer on mobile
|
|
164
|
+
- Bottom nav bar for mobile apps
|
|
165
|
+
- Persistent side navigation on desktop
|
|
166
|
+
- Breadcrumbs on smaller screens for context
|
|
167
|
+
|
|
168
|
+
**IMPORTANT**: Test on real devices. Device emulation in DevTools is helpful but not perfect.
|
|
169
|
+
|
|
170
|
+
**NEVER**:
|
|
171
|
+
- Hide core functionality on mobile (if it matters, make it work)
|
|
172
|
+
- Assume desktop = powerful device (consider accessibility, older machines)
|
|
173
|
+
- Use different information architecture across contexts (confusing)
|
|
174
|
+
- Break user expectations for platform (mobile users expect mobile patterns)
|
|
175
|
+
- Forget landscape orientation on mobile/tablet
|
|
176
|
+
- Use generic breakpoints blindly (use content-driven breakpoints)
|
|
177
|
+
- Ignore touch on desktop (many desktop devices have touch)
|
|
178
|
+
|
|
179
|
+
## Verify Adaptations
|
|
180
|
+
|
|
181
|
+
Test thoroughly across contexts:
|
|
182
|
+
|
|
183
|
+
- **Real devices**: Test on actual phones, tablets, desktops
|
|
184
|
+
- **Different orientations**: Portrait and landscape
|
|
185
|
+
- **Different browsers**: Safari, Chrome, Firefox, Edge
|
|
186
|
+
- **Different OS**: iOS, Android, Windows, macOS
|
|
187
|
+
- **Different input methods**: Touch, mouse, keyboard
|
|
188
|
+
- **Edge cases**: Very small screens (320px), very large screens (4K)
|
|
189
|
+
- **Slow connections**: Test on throttled network
|
|
190
|
+
|
|
191
|
+
**Custom controls** (sliders, drag surfaces, scrollable control strips): a before/after slider can pass every width check above and still refuse to drag on iOS, so exercise each one in scope in the same batched round as the checks above:
|
|
192
|
+
|
|
193
|
+
- **Primary gesture**: Tap it and confirm it responds as designed, then drag it with the target input method; the drag must complete, not just start
|
|
194
|
+
- **Scroll across it**: A swipe along the page's scroll axis across the control scrolls the page or container without activating it; a drag that starts on the control along its axis moves the control, not the page. Neither failure throws an error, so try both
|
|
195
|
+
- **Evidence**: Say what produced the evidence: an emulated viewport, synthesized touch input through a browser tool, which engine ran it (Chromium is not Safari), or a physical device. Screenshots and resized viewports verify layout, never a gesture. Name what stayed untested and move on; unreachable hardware is a reported gap, not a blocker
|
|
196
|
+
|
|
197
|
+
When the adaptation feels native to each context, hand off to `/impeccable polish` for the final pass.
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Reference Material
|
|
202
|
+
|
|
203
|
+
The sections below were previously `responsive-design.md` and live inline now so the adapt flow has its deep responsive reference in one place.
|
|
204
|
+
|
|
205
|
+
### Responsive Design
|
|
206
|
+
|
|
207
|
+
#### Mobile-First: Write It Right
|
|
208
|
+
|
|
209
|
+
Start with base styles for mobile, use `min-width` queries to layer complexity. Desktop-first (`max-width`) means mobile loads unnecessary styles first.
|
|
210
|
+
|
|
211
|
+
#### Breakpoints: Content-Driven
|
|
212
|
+
|
|
213
|
+
Don't chase device sizes; let content tell you where to break. Start narrow, stretch until design breaks, add breakpoint there. Three breakpoints usually suffice (640, 768, 1024px). Use `clamp()` for fluid values without breakpoints.
|
|
214
|
+
|
|
215
|
+
#### Detect Input Method, Not Just Screen Size
|
|
216
|
+
|
|
217
|
+
**Screen size doesn't tell you input method.** A laptop with touchscreen, a tablet with keyboard. Use pointer and hover queries:
|
|
218
|
+
|
|
219
|
+
```css
|
|
220
|
+
/* Fine pointer (mouse, trackpad) */
|
|
221
|
+
@media (pointer: fine) {
|
|
222
|
+
.button { padding: 8px 16px; }
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* Coarse pointer (touch, stylus) */
|
|
226
|
+
@media (pointer: coarse) {
|
|
227
|
+
.button { padding: 12px 20px; } /* Larger touch target */
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* Device supports hover */
|
|
231
|
+
@media (hover: hover) {
|
|
232
|
+
.card:hover { transform: translateY(-2px); }
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/* Device doesn't support hover (touch) */
|
|
236
|
+
@media (hover: none) {
|
|
237
|
+
.card { /* No hover state - use active instead */ }
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**Critical**: Don't rely on hover for functionality. Touch users can't hover.
|
|
242
|
+
|
|
243
|
+
#### Safe Areas: Handle the Notch
|
|
244
|
+
|
|
245
|
+
Modern phones have notches, rounded corners, and home indicators. Use `env()`:
|
|
246
|
+
|
|
247
|
+
```css
|
|
248
|
+
body {
|
|
249
|
+
padding-top: env(safe-area-inset-top);
|
|
250
|
+
padding-bottom: env(safe-area-inset-bottom);
|
|
251
|
+
padding-left: env(safe-area-inset-left);
|
|
252
|
+
padding-right: env(safe-area-inset-right);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* With fallback */
|
|
256
|
+
.footer {
|
|
257
|
+
padding-bottom: max(1rem, env(safe-area-inset-bottom));
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Enable viewport-fit** in your meta tag:
|
|
262
|
+
```html
|
|
263
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
#### Responsive Images: Get It Right
|
|
267
|
+
|
|
268
|
+
##### srcset with Width Descriptors
|
|
269
|
+
|
|
270
|
+
```html
|
|
271
|
+
<img
|
|
272
|
+
src="hero-800.jpg"
|
|
273
|
+
srcset="
|
|
274
|
+
hero-400.jpg 400w,
|
|
275
|
+
hero-800.jpg 800w,
|
|
276
|
+
hero-1200.jpg 1200w
|
|
277
|
+
"
|
|
278
|
+
sizes="(max-width: 768px) 100vw, 50vw"
|
|
279
|
+
alt="Hero image"
|
|
280
|
+
>
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**How it works**:
|
|
284
|
+
- `srcset` lists available images with their actual widths (`w` descriptors)
|
|
285
|
+
- `sizes` tells the browser how wide the image will display
|
|
286
|
+
- Browser picks the best file based on viewport width AND device pixel ratio
|
|
287
|
+
|
|
288
|
+
##### Picture Element for Art Direction
|
|
289
|
+
|
|
290
|
+
When you need different crops/compositions (not just resolutions):
|
|
291
|
+
|
|
292
|
+
```html
|
|
293
|
+
<picture>
|
|
294
|
+
<source media="(min-width: 768px)" srcset="wide.jpg">
|
|
295
|
+
<source media="(max-width: 767px)" srcset="tall.jpg">
|
|
296
|
+
<img src="fallback.jpg" alt="...">
|
|
297
|
+
</picture>
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
#### Layout Adaptation Patterns
|
|
301
|
+
|
|
302
|
+
**Navigation**: Three stages: hamburger + drawer on mobile, horizontal compact on tablet, full with labels on desktop. **Tables**: Transform to cards on mobile using `display: block` and `data-label` attributes. **Progressive disclosure**: Use `<details>/<summary>` for content that can collapse on mobile.
|
|
303
|
+
|
|
304
|
+
#### Testing: Don't Trust DevTools Alone
|
|
305
|
+
|
|
306
|
+
DevTools device emulation is useful for layout but misses:
|
|
307
|
+
|
|
308
|
+
- Actual touch interactions
|
|
309
|
+
- Real CPU/memory constraints
|
|
310
|
+
- Network latency patterns
|
|
311
|
+
- Font rendering differences
|
|
312
|
+
- Browser chrome/keyboard appearances
|
|
313
|
+
|
|
314
|
+
**Test on at least**: One real iPhone, one real Android, a tablet if relevant. Cheap Android phones reveal performance issues you'll never see on simulators.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
**Avoid**: Desktop-first design. Device detection instead of feature detection. Separate mobile/desktop codebases. Ignoring tablet and landscape. Assuming all mobile devices are powerful.
|