@ryuxdsgn/design-intelligence 2.13.4 → 2.13.5

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.
@@ -255,7 +255,7 @@ export const RULES = [
255
255
  notWhen: "reversible, low-impact actions where undo is enough",
256
256
  tradeoff: "one extra step versus irreversible loss",
257
257
  level: "required",
258
- do: "Weigh each destructive or costly action: is it reversible, how big is the impact, how easy is recovery? Prefer undo for reversible actions; confirm with the specifics (amount, recipient, item) when it is irreversible and costly; skip confirmation when it only adds friction.",
258
+ do: "Weigh each destructive or costly action: is it reversible, how big is the impact, how easy is recovery? Prefer undo for reversible actions; confirm with the specifics (amount, recipient, item) when it is irreversible and costly; skip confirmation when it only adds friction.\n - A confirmation restates the request and its effect (\"Hapus 3 foto dari album Liburan? Foto tidak bisa dikembalikan.\"), and its buttons name the outcomes (\"Hapus foto\" and \"Batal\"), never Ya/Tidak or OK.\n - Give a destructive confirmation no default button; ask for typing a word only for the rarest, most dangerous actions.",
259
259
  dont: "Confirm every action by reflex, or use a bare \"Are you sure?\" before a payment.",
260
260
  why: "Confirmation that appears everywhere gets dismissed by habit; specifics and undo catch real mistakes.",
261
261
  basis: "Nielsen heuristic 5; NNGroup confirmation-dialog guidance",
@@ -565,10 +565,10 @@ export const RULES = [
565
565
  num: 3,
566
566
  title: "Specific, plain copy",
567
567
  level: "preferred",
568
- do: "Name the action and what it gets the user (\"Bayar Rp45.000\", \"Simpan alamat\"); use sentence case and plain lists, with at most one emoji where the channel expects it.",
568
+ do: "Lead with the point and cut words that add length without meaning; write labels as RX-CD-12 says; use sentence case and plain lists, with at most one emoji where the channel expects it.",
569
569
  dont: "Use vague labels (\"Submit\", \"Learn more\", \"Get started\" when a specific action exists), hype words (\"unlock\", \"elevate\", \"seamlessly\", \"revolutionary\", \"next-generation\"), emoji bullets, ALL CAPS, or stacked exclamation marks.",
570
570
  why: "Specific, plain copy tells users what happens next; decoration on every line buries it and reads as generated.",
571
- basis: `NNGroup button and link-label guidance; ${RUN}: unconstrained WhatsApp copy`,
571
+ basis: `NNGroup 3 C's of informational microcopy (clarity, concision, character); NNGroup button and link-label guidance; ${RUN}: unconstrained WhatsApp copy`,
572
572
  check: "audit_copy",
573
573
  formerly: ["RX-C-06", "RX-C-10"],
574
574
  },
@@ -616,6 +616,53 @@ export const RULES = [
616
616
  basis: `pattern also in ${AS} R-28; written for RYUX`,
617
617
  check: "review",
618
618
  },
619
+ {
620
+ num: 11,
621
+ title: "Tone fits the moment, voice stays",
622
+ level: "preferred",
623
+ do: "Set a tone profile once, from the brand and the users, on four scales: formal to casual, serious to funny, respectful to irreverent, matter-of-fact to enthusiastic; add a few tone words and the anti-tone words to avoid (\"hangat, tidak sok akrab\").\n - Keep the voice the same everywhere and shift the tone with the user's state: matter-of-fact and serious for errors, money, and waiting; brief for success, where a check mark already says it worked (\"Alamat disimpan\", without \"berhasil\" unless the voice wants the warmth); warmer only in onboarding and empty moments.\n - Add personality only where it costs no clarity or length: clarity first, concision second, character third.",
624
+ dont: "Joke in an error or a payment failure, cheer on a routine save, or switch between \"kamu\" and \"Anda\" across screens.",
625
+ why: "The same words feel caring in one moment and careless in another; tone measurably changes how users judge a product.",
626
+ basis: "NNGroup tone-of-voice dimensions (four dimensions; tested tone profiles); NNGroup 3 C's of informational microcopy",
627
+ notWhen: "the brand guide already defines the tone; follow it",
628
+ tradeoff: "a sober tone in serious moments gives up some brand flavour",
629
+ check: "review",
630
+ },
631
+ {
632
+ num: 12,
633
+ title: "Labels say what happens",
634
+ level: "required",
635
+ do: "Start a button with a verb and name the result (\"Bayar Rp45.000\", \"Simpan alamat\", \"Lanjut ke pembayaran\"), in about four words or fewer.\n - Make a link meaningful on its own, as if it is the only thing read: specific (\"Lihat syarat promo\", not \"Selengkapnya\"), front-loaded, and sincere: the screen it opens is the one it promised.\n - Keep a label and the title of the screen or dialog it opens the same words (RX-CD-05).",
636
+ dont: "Use \"Submit\", \"OK\", \"Klik di sini\", \"Selengkapnya\", or \"Get started\" when a specific action exists, or a label that promises one thing and opens another (\"Lihat detail & pesan\" that opens a contact form).",
637
+ why: "Users read the label, not the text around it; a label that breaks its promise costs trust on the next tap.",
638
+ basis: "NNGroup better link labels (4Ss: specific, sincere, substantial, succinct); NNGroup UI copy guidance on command names; NNGroup button and link-label guidance",
639
+ check: "audit_copy",
640
+ },
641
+ {
642
+ num: 13,
643
+ title: "Empty states teach and lead",
644
+ level: "required",
645
+ when: "a list, search, inbox, or dashboard can be empty",
646
+ do: "Show an empty state only after loading has finished, and say plainly that nothing is here yet.\n - Tell the user what will appear here and how to fill it, in brief, explicit steps (\"Simpan tempat favorit dengan ikon hati, nanti muncul di sini\").\n - Give one direct action that starts that task, and keep a no-results state apart from a first-use state: name the active filters and offer to clear them.",
647
+ dont: "Leave the area blank, show \"Belum ada data\" alone, flash an empty state while data is still loading, or describe what to do without how.",
648
+ why: "An empty area is the moment users learn what a feature is for; a premature or bare message reads as broken.",
649
+ basis: "NNGroup designing empty states in complex applications (system status, learning cues, direct pathways)",
650
+ tradeoff: "each empty state needs its own copy and action",
651
+ check: "review; the view × state matrix (RX-EC-01)",
652
+ },
653
+ {
654
+ num: 14,
655
+ title: "Notifications and permission requests earn their place",
656
+ level: "contextual",
657
+ when: "the product sends push notifications or asks for a device permission",
658
+ do: "Make each notification self-sufficient: what happened, what the user needs to do, and when (\"Paketmu tiba besok, 10.00–12.00\"), understandable without opening the app.\n - Combine bursts into one notification and send only what the user would want, with notification settings inside the app.\n - Ask for a permission in context, after the user has seen the value, and say what they get in plain words (\"Izinkan lokasi untuk melihat tempat baca terdekat\").",
659
+ dont: "Ask for notifications on first launch, promise \"pengalaman yang lebih baik\", send several alerts at once, or truncate the one fact that matters.",
660
+ why: "Notifications compete with everything on the phone; an irrelevant or unclear one gets the whole channel turned off.",
661
+ basis: "NNGroup mobile push-notification mistakes; NNGroup permission-request design considerations",
662
+ notWhen: "the operating system or a regulation sets the wording",
663
+ tradeoff: "fewer notifications means fewer re-engagement chances",
664
+ check: "review",
665
+ },
619
666
  ]),
620
667
  ...skill("ui", [
621
668
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuxdsgn/design-intelligence",
3
- "version": "2.13.4",
3
+ "version": "2.13.5",
4
4
  "description": "RYUX: design intelligence for AI agents and designers. One skill, five entry points: Analyze, Design, Build, Critique, and QA, for Claude Code, Codex, Cursor, Gemini CLI, OpenCode, Cline, Copilot, and more.",
5
5
  "type": "module",
6
6
  "bin": {