trdr-ds-install 1.2.4 → 1.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trdr-ds-install",
3
- "version": "1.2.4",
3
+ "version": "1.3.0",
4
4
  "description": "Installs the TRDR Design System skill for Claude Code",
5
5
  "bin": {
6
6
  "trdr-ds-install": "./bin/install.js"
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: trdr-ds
3
- description: Applies the TRDR Design System to any project. Runs a two-phase workflow - first analyzes the project and presents a migration plan for approval, then executes the full implementation (tokens, components, CLAUDE.md, violation fixes). Trigger when developer mentions "apply design system", "implement TRDR DS", "add TRDR tokens", "design system setup", "migrar design system", "aplicar design system", or invokes /trdr-ds.
3
+ description: Applies the TRDR Design System to any project. Runs a two-phase workflow - first analyzes the project and presents a migration plan for approval, then executes the full implementation (tokens, components, CLAUDE.md, violation fixes). For large projects (50+ violations), execution is batched by folder with progress saved to DS_PROGRESS.md and resumable at any time. Trigger when developer mentions "apply design system", "implement TRDR DS", "add TRDR tokens", "design system setup", "migrar design system", "aplicar design system", or invokes /trdr-ds.
4
4
  user-invocable: true
5
- argument-hint: "[analyze|apply|sync]"
5
+ argument-hint: "[analyze|apply|resume|status|sync|batch N]"
6
6
  allowed-tools: [Read, Glob, Grep, Edit, Write, Bash, WebFetch]
7
7
  ---
8
8
 
@@ -25,6 +25,9 @@ Execute in two clearly separated phases: **PHASE 1: ANALYZE → PHASE 2: EXECUTE
25
25
  |-----|-----------|
26
26
  | `analyze` *(default when none given)* | Run Phase 1 only — produce a migration plan, do not modify any project file |
27
27
  | `apply` | Run Phase 1 + Phase 2 |
28
+ | `resume` | Read `DS_PROGRESS.md` from the project root and continue from the last checkpoint (Phase 2 batching only) |
29
+ | `status` | Read `DS_PROGRESS.md` and display a progress summary table — no files modified |
30
+ | `batch [N]` | Override default batch size for Phase 2 (default: 25 files/batch) |
28
31
  | `sync` | Re-fetch `https://trdr.mrocontent.com.br/components.json` and `https://trdr.mrocontent.com.br/tokens.css`, overwrite `data/components.json` and `references/tokens.css` in the skill directory, report the diff. No project changes. |
29
32
  | `--latest` *(modifier on `analyze` or `apply`)* | Same as `sync` first, then continue normally |
30
33
 
@@ -34,6 +37,26 @@ Execute in two clearly separated phases: **PHASE 1: ANALYZE → PHASE 2: EXECUTE
34
37
 
35
38
  Scan the project and produce a structured migration plan. Do NOT modify any project files yet.
36
39
 
40
+ ### Step 0 — Detect previous progress
41
+
42
+ Before any analysis, check if `DS_PROGRESS.md` exists at the project root.
43
+
44
+ **If found AND `Status:` line is NOT `COMPLETE`:**
45
+ ```
46
+ ⚠️ Previous TRDR DS migration found (status: [IN_PROGRESS/PAUSED]).
47
+
48
+ Reply with:
49
+ - `"resume"` — continue from last checkpoint (Batch [N])
50
+ - `"restart"` — discard progress and run a fresh analysis
51
+ - `"status"` — see a progress summary without modifying anything
52
+ ```
53
+ **STOP HERE. Wait for the developer's reply.**
54
+
55
+ **If found AND `Status: COMPLETE`:**
56
+ Inform the dev that a previous migration was already completed (show date). Offer to re-run analysis to detect new files added since then. Continue only if the dev explicitly says so.
57
+
58
+ **If not found:** Continue normally to Step 1.
59
+
37
60
  ### Step 1 — Detect framework
38
61
 
39
62
  Read `package.json` at the project root. Identify:
@@ -89,6 +112,11 @@ Flag any gradient that doesn't reference a TRDR gradient token (`var(--gradient-
89
112
  **H — Hardcoded font-size in px** (should use .trdr-h* / .trdr-body-* text style classes):
90
113
  Search: `font-size:\s*\d+px` in CSS/SCSS files (skip tokens.css itself)
91
114
 
115
+ Track:
116
+ - `total_violations` = sum of all A–H occurrences
117
+ - `total_files_with_violations` = count of unique files with ≥ 1 violation
118
+ - `violations_by_folder` = map of `{ folder: string, files: string[], count: number }[]` grouped by first-level folder inside `src/` (or project root if no `src/`)
119
+
92
120
  ### Step 3.5 — Detect component replacement candidates
93
121
 
94
122
  Scan the project for UI patterns that indicate elements replaceable by TRDR implemented components.
@@ -176,7 +204,11 @@ Use the loaded data throughout the rest of the workflow. Track:
176
204
 
177
205
  ### Step 5 — Present the migration plan and STOP
178
206
 
179
- Output the following report and **do not proceed** until the developer explicitly approves:
207
+ Output the following report and **do not proceed** until the developer explicitly approves.
208
+
209
+ Determine execution mode based on thresholds:
210
+ - **Small project** (`total_violations <= 50` AND `total_files_with_violations <= 30`): standard monolithic execution — no batching, no DS_PROGRESS.md
211
+ - **Large project** (`total_violations > 50` OR `total_files_with_violations > 30`): batched execution — include the large project warning below
180
212
 
181
213
  ```markdown
182
214
  ## TRDR Design System — Migration Plan
@@ -230,11 +262,21 @@ Output the following report and **do not proceed** until the developer explicitl
230
262
 
231
263
  > **Implementados:** o CSS já estará em `components.css` após a Fase 2 — o dev só precisa trocar as classes.
232
264
  > **Stubs:** receberão banner comment com tokens recomendados + entrada em `MISSING_COMPONENTS.md`.
233
- > **Não listados aqui:** componentes específicos da TRDR (boleta, janela) — verificar manualmente se o projeto os usa.
234
265
 
235
266
  ### SCOPE ESTIMATE: [Small / Medium / Large]
236
267
  Small = <10 violations | Medium = 10–50 | Large = 50+
237
268
 
269
+ [ONLY for large projects — include this block:]
270
+ ### ⚠️ LARGE PROJECT DETECTED
271
+ [total_violations] violations across [total_files_with_violations] files.
272
+ Phase 2 will run in **BATCHES BY FOLDER** to prevent context overflow and allow resuming.
273
+
274
+ Default batch: 25 files/batch → ~[ceil(total_files_with_violations/25)] batches estimated
275
+ Progress saved to `DS_PROGRESS.md` — resumable anytime with `/trdr-ds resume`.
276
+
277
+ To change batch size: reply with `"Apply, batch 15"` or `"Apply, batch 40"`.
278
+ [END large project block]
279
+
238
280
  ### WHAT WILL NOT BE TOUCHED:
239
281
  - Images, SVGs, fonts files
240
282
  - node_modules/, .next/, dist/, build/, out/
@@ -245,6 +287,7 @@ Small = <10 violations | Medium = 10–50 | Large = 50+
245
287
 
246
288
  **Reply with one of:**
247
289
  - `"Apply"` or `"Executar"` — proceed with everything above
290
+ - `"Apply, batch [N]"` — proceed with custom batch size (large projects only)
248
291
  - `"Apply, skip [file or directory]"` — proceed but exclude specific paths
249
292
  - `"Only tokens"` — only create tokens.css, components.css, and CLAUDE.md (no violation fixes)
250
293
  - `"Change [detail]"` — adjust a specific part of the plan before executing
@@ -257,7 +300,55 @@ Small = <10 violations | Medium = 10–50 | Large = 50+
257
300
 
258
301
  ## PHASE 2: EXECUTION (only after explicit approval)
259
302
 
260
- Execute in order. Report progress after each major step.
303
+ Parse the developer's reply:
304
+ - Extract batch size override from `"Apply, batch N"` → use N; otherwise default to 25.
305
+ - Extract skip paths from `"Apply, skip [path]"` → exclude those from violation processing.
306
+ - `"Only tokens"` → skip Steps 5 and 6 (no violation fixes, no component banners).
307
+
308
+ Report progress after each major step.
309
+
310
+ ### Step 0 — Initialize checkpoint
311
+
312
+ **Determine execution mode:**
313
+ ```
314
+ if total_violations <= 50 AND total_files_with_violations <= 30:
315
+ mode = MONOLITHIC (no DS_PROGRESS.md created — skip to Step 1)
316
+ else:
317
+ mode = BATCHED (create DS_PROGRESS.md, execute in batches)
318
+ ```
319
+
320
+ **For BATCHED mode — create `DS_PROGRESS.md` at the project root:**
321
+
322
+ ```markdown
323
+ # TRDR DS Migration — Progress
324
+ Started: [ISO datetime]
325
+ Project: [project name from package.json]
326
+ Batch size: [N]
327
+ Status: IN_PROGRESS
328
+
329
+ ## Foundation
330
+ - [ ] tokens.css
331
+ - [ ] components.css
332
+ - [ ] CLAUDE.md
333
+ - [ ] @import no CSS global
334
+
335
+ ## Lotes de Violações
336
+ Total de arquivos com violações: [total_files_with_violations]
337
+ Total de violações: [total_violations]
338
+ Total de lotes: [N]
339
+
340
+ [For each folder in violations_by_folder, sorted alphabetically.
341
+ If a folder has more files than batch_size, split into sub-batches labeled "1a", "1b", etc.
342
+ Files at the project root (not inside src/) go in a final "raiz" batch.]
343
+
344
+ ### Lote 1 — [folder/] ([N] arquivos) — PENDING
345
+ ### Lote 2 — [folder/] ([N] arquivos) — PENDING
346
+ ...
347
+ ### Lote [n] — raiz ([N] arquivos) — PENDING
348
+
349
+ ## Padrões Sem Token (revisão manual)
350
+ [empty — filled during execution]
351
+ ```
261
352
 
262
353
  ### Step 1 — Create tokens.css
263
354
 
@@ -274,6 +365,11 @@ If `references/tokens.css` is missing in the skill directory:
274
365
  1. Try `WebFetch: https://trdr.mrocontent.com.br/tokens.css`, save it to the skill dir, then proceed.
275
366
  2. If the Hub is also unreachable → STOP with error message asking the maintainer to run `npm run sync`.
276
367
 
368
+ **For BATCHED mode:** After writing tokens.css, update `DS_PROGRESS.md`:
369
+ ```
370
+ - [x] tokens.css — [path]/tokens.css
371
+ ```
372
+
277
373
  ### Step 2 — Create components.css
278
374
 
279
375
  Build `components.css` by concatenating the `.code.css` block of every implemented component plus the typography utility classes.
@@ -312,6 +408,11 @@ After all component CSS blocks, append the text style utility classes:
312
408
  .trdr-label-l3 { font-family: var(--font-secondary); font-size: 14px; font-weight: 600; line-height: 1.4; }
313
409
  ```
314
410
 
411
+ **For BATCHED mode:** Update `DS_PROGRESS.md`:
412
+ ```
413
+ - [x] components.css — [path]/components.css
414
+ ```
415
+
315
416
  ### Step 3 — Update global CSS
316
417
 
317
418
  Find the main global CSS file (globals.css, main.css, index.css, app.css) and add at the very top:
@@ -325,6 +426,11 @@ Adjust the relative path if tokens.css is in a subdirectory.
325
426
 
326
427
  If the project already imports a different design system's variables and there are naming conflicts, warn the developer before proceeding.
327
428
 
429
+ **For BATCHED mode:** Update `DS_PROGRESS.md`:
430
+ ```
431
+ - [x] @import — [global-css-file]
432
+ ```
433
+
328
434
  ### Step 4 — Create CLAUDE.md
329
435
 
330
436
  Create `CLAUDE.md` at the project root, populated dynamically from the catalog:
@@ -383,9 +489,62 @@ bg.primary (base) → bg.secondary/tertiary (content areas) → surface.* (cards
383
489
  → interactive components → overlays/modals/tooltips
384
490
  ```
385
491
 
492
+ **For BATCHED mode:** Update `DS_PROGRESS.md`:
493
+ ```
494
+ - [x] CLAUDE.md — CLAUDE.md
495
+ ```
496
+
497
+ Then output:
498
+ ```
499
+ ✅ Foundation complete — tokens.css, components.css, CLAUDE.md, @import all done.
500
+ Starting violation processing in [N] batches of up to [batch_size] files each.
501
+ ```
502
+
386
503
  ### Step 5 — Migrate violations
387
504
 
388
- For each violation found in Phase 1, apply the semantic token replacement.
505
+ **MONOLITHIC mode:** Process all files with violations in one pass. Apply all replacements below. Continue to Step 6.
506
+
507
+ **BATCHED mode:** Process one batch at a time, with a STOP between batches.
508
+
509
+ For each batch listed as PENDING in `DS_PROGRESS.md`:
510
+
511
+ 1. Update `DS_PROGRESS.md` — change batch status to `IN_PROGRESS`
512
+ 2. For each file in the batch:
513
+ - Apply all applicable violation fixes (see mapping tables below)
514
+ - Count violations fixed
515
+ 3. Update `DS_PROGRESS.md` — change batch status to `COMPLETED`:
516
+ ```
517
+ ### Lote [N] — [folder/] ([N] arquivos) — COMPLETED
518
+ Violações corrigidas: [N] | Arquivos: [N]/[N]
519
+ ```
520
+ Add any unfixable patterns to the "Padrões Sem Token" section of `DS_PROGRESS.md`.
521
+ 4. Output batch summary:
522
+ ```
523
+ ✅ Lote [N] concluído — [folder/] ([N] arquivos, [N] violações corrigidas)
524
+ Progresso geral: [done]/[total] lotes | [total_fixed] violações corrigidas
525
+ ```
526
+ 5. If more batches are PENDING:
527
+
528
+ **STOP HERE.** Output:
529
+ ```
530
+ Próximo: **Lote [N+1] — [folder/]** ([N] arquivos)
531
+ Responda:
532
+ - "continuar" / "continue" — processar próximo lote
533
+ - "pular [pasta]" — skip this folder and go to the next batch
534
+ - "parar" / "stop" — save progress and stop here (resume later with `/trdr-ds resume`)
535
+ - "tudo" / "all" — process all remaining batches without pausing
536
+ ```
537
+ **Wait for developer reply.**
538
+
539
+ If reply is `"tudo"` / `"all"`: process all remaining batches without pausing (update DS_PROGRESS.md after each).
540
+ If reply is `"pular [pasta]"`: mark that batch as SKIPPED in DS_PROGRESS.md and move to the next.
541
+ If reply is `"parar"`: set `Status: PAUSED` in DS_PROGRESS.md. STOP. Do not proceed to Step 6 or 7.
542
+
543
+ 6. After ALL batches are COMPLETED (or skipped): continue to Step 6.
544
+
545
+ ---
546
+
547
+ **Violation mapping tables (used in Steps 5 for both modes):**
389
548
 
390
549
  **Color mapping (hardcoded → semantic):**
391
550
  | Hardcoded value | Context | Replace with |
@@ -430,17 +589,17 @@ For each violation found in Phase 1, apply the semantic token replacement.
430
589
  **rgba() mapping:**
431
590
  | Hardcoded pattern | Context | Replace with |
432
591
  |-------------------|---------|-------------|
433
- | `rgba(0,0,0,*)` | box-shadow | No TRDR shadow token exists → flag in DS_MIGRATION.md as "Missing shadow token" |
592
+ | `rgba(0,0,0,*)` | box-shadow | No TRDR shadow token exists → flag in DS_PROGRESS.md / DS_MIGRATION.md as "Missing shadow token" |
434
593
  | `rgba(255,255,255,.29)` approx | overlay/backdrop | `var(--bg-overlay)` |
435
- | `rgba(255,255,255,*)` other | overlay | flag in DS_MIGRATION.md |
594
+ | `rgba(255,255,255,*)` other | overlay | flag |
436
595
  | Any other `rgba(N,N,N,*)` | various | Map to nearest semantic alpha token (--surface-brand, --surface-info, --action-*-alpha, etc.) or flag |
437
596
 
438
597
  **Gradient mapping:**
439
598
  | Pattern | Replace with |
440
599
  |---------|-------------|
441
600
  | `linear-gradient(...)` using only TRDR brand colors | `var(--gradient-text-brand)`, `var(--gradient-bg-hero)`, or `var(--gradient-bg-fade)` as appropriate |
442
- | `linear-gradient(...)` using any non-DS colors | Flag in DS_MIGRATION.md as non-compliant — developer must decide: remove, replace with a TRDR gradient token, or add a new token to the Hub |
443
- | Gradient inside SVG data URI embedded in CSS | Flag in DS_MIGRATION.md |
601
+ | `linear-gradient(...)` using any non-DS colors | Flag — developer must decide: remove, replace with TRDR gradient token, or add new token to Hub |
602
+ | Gradient inside SVG data URI embedded in CSS | Flag |
444
603
 
445
604
  **Font-size mapping:**
446
605
  | Hardcoded value | Replace with |
@@ -457,14 +616,14 @@ For each violation found in Phase 1, apply the semantic token replacement.
457
616
  | `font-size: 14px` | `.trdr-body-b3` or `.trdr-label-l3` (check weight context) |
458
617
  | `font-size: 12px` | `.trdr-body-b4` or `.trdr-body-aux` (check letter-spacing) |
459
618
  | `font-size: 10px` | `.trdr-body-b5` class |
460
- | `font-size: [other px]` | Nearest text style class — flag in DS_MIGRATION.md if no match |
619
+ | `font-size: [other px]` | Nearest text style class — flag if no match |
461
620
 
462
621
  **Do NOT replace:**
463
622
  - Hex values inside binary image files (PNG, JPG, GIF)
464
- - SVG external files — flag them in DS_MIGRATION.md but do not auto-edit
623
+ - SVG external files — flag them but do not auto-edit
465
624
  - Values in commented-out code
466
625
 
467
- **All other values MUST be replaced or flagged.** There are no exceptions for "decorative" gradients, shadows, or overlays. If no semantic token exists for a given pattern, flag it in DS_MIGRATION.md under "Missing DS tokens" and notify the developer to request the token in the Hub.
626
+ **All other values MUST be replaced or flagged.** No exceptions for "decorative" gradients, shadows, or overlays.
468
627
 
469
628
  ### Step 6 — Apply component code (smart fallback)
470
629
 
@@ -490,7 +649,7 @@ Use the `replacementCandidates[]` list built in Phase 1 Step 3.5. For each entry
490
649
  - Status: ⚠️ stub — code blocks pending
491
650
  ```
492
651
  4. **If no slug matches** the detected pattern:
493
- - Flag the pattern in `MISSING_COMPONENTS.md` under "Unmapped patterns" with the file location and a one-line description of the UI need. The maintainer can then decide whether to add a stub to the catalog.
652
+ - Flag the pattern in `MISSING_COMPONENTS.md` under "Unmapped patterns" with the file location and a one-line description of the UI need.
494
653
 
495
654
  ### Step 7 — Generate DS_MIGRATION.md
496
655
 
@@ -509,6 +668,7 @@ Hub: https://trdr.mrocontent.com.br
509
668
  - ✅ [N] violations fixed in [M] files
510
669
  - ✅ [global-css] updated with @import
511
670
  - ⚠️ [S] stub components flagged in MISSING_COMPONENTS.md (if any)
671
+ [If batched: - ✅ Migrated in [N] batches — see DS_PROGRESS.md for batch-level detail]
512
672
 
513
673
  ## Files modified
514
674
  [List each file and what changed]
@@ -522,11 +682,10 @@ Hub: https://trdr.mrocontent.com.br
522
682
  - Others: add Google Fonts `<link>` in HTML head
523
683
  - [ ] **Dark/light mode**: tokens.css uses [data-theme="light"] for overrides — add `data-theme="light"` to `<html>` to activate light mode
524
684
  - [ ] **Trading UI**: If this project has price/position displays, verify context.trading.* tokens are applied (see Hub: /tokens/semanticos)
525
- - [ ] **Stubs**: Review MISSING_COMPONENTS.md and decide whether to wait for canonical implementation in the Hub or hand-roll the component now using the listed tokens
685
+ - [ ] **Stubs**: Review MISSING_COMPONENTS.md and decide whether to wait for canonical implementation in the Hub or hand-roll using the listed tokens
526
686
  - [ ] **Skipped files**: [list any files excluded from migration]
527
687
 
528
688
  ## Missing DS tokens (flagged — no semantic token available)
529
- [List patterns found in the project that have no TRDR token yet — request these in the Hub]
530
689
  | Pattern | File | Suggestion |
531
690
  |---------|------|-----------|
532
691
  | `box-shadow: rgba(0,0,0,*)` | [file:line] | Request shadow token in Hub |
@@ -543,6 +702,12 @@ Hub: https://trdr.mrocontent.com.br
543
702
  - Rules: https://trdr.mrocontent.com.br/para-ia
544
703
  ```
545
704
 
705
+ **For BATCHED mode:** After writing DS_MIGRATION.md, update `DS_PROGRESS.md`:
706
+ ```
707
+ Status: COMPLETE
708
+ Completed: [ISO datetime]
709
+ ```
710
+
546
711
  ---
547
712
 
548
713
  ## EXECUTION SUMMARY
@@ -558,6 +723,7 @@ Created:
558
723
  • CLAUDE.md (design system context for Claude Code)
559
724
  • DS_MIGRATION.md (migration log + manual checklist)
560
725
  • MISSING_COMPONENTS.md ([S] stubs flagged) — only if applicable
726
+ [If batched: • DS_PROGRESS.md (migration log — status: COMPLETE)]
561
727
 
562
728
  Modified:
563
729
  • [global-css] — @import added
@@ -571,6 +737,63 @@ Hub: https://trdr.mrocontent.com.br
571
737
 
572
738
  ---
573
739
 
740
+ ## RESUME MODE (when invoked with `resume` argument)
741
+
742
+ 1. Look for `DS_PROGRESS.md` at the project root.
743
+ - If not found: output `❌ No previous migration found. Run /trdr-ds to start a new one.`
744
+ - If `Status: COMPLETE`: output `✅ Migration already complete (finished [date]). Run /trdr-ds to check for new violations.`
745
+
746
+ 2. Read `DS_PROGRESS.md`. Find the first batch with status `IN_PROGRESS` or `PENDING`.
747
+
748
+ 3. Output a resume summary:
749
+ ```
750
+ Resuming TRDR DS migration — [project name]
751
+ Foundation: ✅ complete
752
+ Batches completed: [done]/[total] | Violations fixed so far: [N]
753
+ Resuming at: **Lote [N] — [folder/]** ([N] files)
754
+ ```
755
+
756
+ 4. Continue Phase 2 Step 5 from that batch. Follow the same STOP-between-batches flow.
757
+
758
+ 5. After all batches finish: run Steps 6 and 7 (component banners + DS_MIGRATION.md).
759
+
760
+ ---
761
+
762
+ ## STATUS MODE (when invoked with `status` argument)
763
+
764
+ 1. Look for `DS_PROGRESS.md` at the project root.
765
+ - If not found: output `No migration in progress. Run /trdr-ds to start.`
766
+
767
+ 2. Read `DS_PROGRESS.md` and output a progress table — do NOT modify any files:
768
+
769
+ ```
770
+ ## TRDR DS — Migration Status
771
+
772
+ Project: [name] | Started: [date] | Status: [IN_PROGRESS/PAUSED/COMPLETE]
773
+
774
+ ### Foundation
775
+ | Step | File | Status |
776
+ |------|------|--------|
777
+ | tokens.css | [path] | ✅ / ⏳ |
778
+ | components.css | [path] | ✅ / ⏳ |
779
+ | CLAUDE.md | CLAUDE.md | ✅ / ⏳ |
780
+ | @import | [global-css] | ✅ / ⏳ |
781
+
782
+ ### Violation Batches
783
+ | Lote | Pasta | Arquivos | Violações | Status |
784
+ |------|-------|----------|-----------|--------|
785
+ | 1 | src/components/ | 12 | 34 | ✅ COMPLETED |
786
+ | 2 | src/pages/ | 8 | 12 | 🔄 IN_PROGRESS |
787
+ | 3 | src/app/ | 15 | — | ⏳ PENDING |
788
+ | 4 | src/styles/ | 6 | — | ⏳ PENDING |
789
+
790
+ Progress: [N]% ([done]/[total] batches — [violations_fixed]/[total_violations] violations fixed)
791
+
792
+ To continue: `/trdr-ds resume`
793
+ ```
794
+
795
+ ---
796
+
574
797
  ## SYNC MODE (when invoked as `/trdr-ds sync`)
575
798
 
576
799
  1. WebFetch `https://trdr.mrocontent.com.br/components.json` → save as `<skill-dir>/data/components.json`
@@ -581,7 +804,7 @@ Hub: https://trdr.mrocontent.com.br
581
804
  - Removed: [list slugs no longer in catalog]
582
805
  4. No project files are touched.
583
806
 
584
- If either fetch fails, report which one and exit with a non-zero status. Do NOT touch the snapshot if the fetch succeeded but the response is malformed (e.g., missing `components` array).
807
+ If either fetch fails, report which one and exit. Do NOT touch the snapshot if the response is malformed (e.g., missing `components` array).
585
808
 
586
809
  ---
587
810
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "version": "1.0",
3
- "generatedAt": "2026-05-11T21:56:00.879Z",
4
- "total": 15,
5
- "implemented": 15,
3
+ "generatedAt": "2026-05-12T15:34:28.515Z",
4
+ "total": 17,
5
+ "implemented": 17,
6
6
  "categories": {
7
7
  "formulario": "Formulário / Controles",
8
8
  "modal": "Modais / Overlays",
@@ -1112,6 +1112,172 @@
1112
1112
  "prompt": "Implemente o componente Boleta do Design System TRDR — painel lateral de negociações de 283px de largura.\n\nESTRUTURA (3 seções com border-left: 1px solid --border-subtle):\n\n1. ABAS (height: 45px, padding: 8px, border-bottom sutil)\n - Segmented control pill (border-radius: 9999px, bg: --surface-secondary #222)\n - 2 segments: \"Avançado\" (ativo) e \"Simples\" (inativo)\n - Segment ativo: bg --action-secondary-default #4A4A4A, radius 16px, padding 8px 12px\n - Segment inativo: bg transparente, text --content-tertiary\n\n2. CONTAINER — campos do formulário (padding: 8px, gap: 16px, border-bottom sutil)\n - Linha \"Estratégia\": label (tertiary 12px/500) + valor \"Manejo\" + chevron (primary)\n - Linha \"Disp.\": label + valor \"258.010.200,00 USDT\" (primary)\n - Grupo \"Quantidade\": label 12px + input 32px (bg --surface-primary, radius 8px, padding 8px) + 3 quick buttons (border --border-default, radius 8px, padding 8px 12px, font 14px/600 secondary, gap 4px)\n - Grupo \"Preço da Ordem\": label 12px + input 32px\n - Linha \"TP/SL\": checkbox 16x16 (border default, radius 5px, bg --surface-tertiary) + label primary\n\n3. BOTÕES (padding: 8px, gap: 8px)\n - 4 rows de ação (gap 8px cada):\n • Long (flex:1, bg --context-trading-long-default, text --context-trading-long-text #4FE290, radius 8px, padding 8px, font 14px/600)\n • Short (flex:1, bg --context-trading-short-default, text --context-trading-short-text #F34F45, radius 8px, padding 8px 12px, font 14px/600)\n - \"Zerar (5)\": width 100%, height 32px, border 1px sólido --color-orange-500 (#FF6400), text --color-orange-500, radius 8px\n - \"Cancelar ordens (2) + Zerar (5)\": width 100%, border --border-default, text --content-secondary, radius 8px\n - Row \"Cancelar Ordem\" (shrink-0) + \"Inverter\" (flex:1 min-width:100px): ambos border --border-default\n - Resumo Posição: \"Posição\" (14px tertiary) / \"Zerado\" (16px --content-success #4FE290), + 2 linhas meta 12px tertiary\n\nHover states: long-hover rgba(79,226,144,0.12), short-hover rgba(243,79,69,0.12), zerar-hover --context-trading-stop-alpha.\nResultado pixel-perfect com exatamente 283px de largura."
1113
1113
  }
1114
1114
  },
1115
+ {
1116
+ "slug": "tabela-cotacoes",
1117
+ "name": "Tabela de Cotações",
1118
+ "figmaId": "77:3681",
1119
+ "category": "trading",
1120
+ "implemented": true,
1121
+ "description": "Tabela de cotações em tempo real. Exibe ativo, último preço, variação % com código de cor (verde/vermelho), tendência (seta), quantidade e dados de oferta/demanda.",
1122
+ "props": [
1123
+ {
1124
+ "name": "rows",
1125
+ "type": "CotacaoRow[]",
1126
+ "values": [
1127
+ "array de dados de cotação"
1128
+ ]
1129
+ }
1130
+ ],
1131
+ "dimensions": [
1132
+ {
1133
+ "label": "Largura total",
1134
+ "width": "800px",
1135
+ "height": "—"
1136
+ },
1137
+ {
1138
+ "label": "Altura do header",
1139
+ "width": "—",
1140
+ "height": "32px"
1141
+ },
1142
+ {
1143
+ "label": "Altura da linha",
1144
+ "width": "—",
1145
+ "height": "32px"
1146
+ },
1147
+ {
1148
+ "label": "Célula Último",
1149
+ "width": "80px",
1150
+ "height": "32px"
1151
+ }
1152
+ ],
1153
+ "tokens": [
1154
+ {
1155
+ "property": "Var% positivo",
1156
+ "token": "context.trading.up",
1157
+ "value": "#4FE290"
1158
+ },
1159
+ {
1160
+ "property": "Var% negativo",
1161
+ "token": "context.trading.down",
1162
+ "value": "#F34F45"
1163
+ },
1164
+ {
1165
+ "property": "Cell Último bg",
1166
+ "token": "surface.primary",
1167
+ "value": "#4A4A4A"
1168
+ },
1169
+ {
1170
+ "property": "Row alternada",
1171
+ "token": "—",
1172
+ "value": "rgba(255,255,255,0.08)"
1173
+ },
1174
+ {
1175
+ "property": "Row hover",
1176
+ "token": "surface.secondary",
1177
+ "value": "#222222"
1178
+ },
1179
+ {
1180
+ "property": "Header border",
1181
+ "token": "border.default",
1182
+ "value": "#4A4A4A"
1183
+ },
1184
+ {
1185
+ "property": "Header text",
1186
+ "token": "content.tertiary",
1187
+ "value": "#A4A4A4"
1188
+ },
1189
+ {
1190
+ "property": "Cell text",
1191
+ "token": "content.primary",
1192
+ "value": "#FFFFFF"
1193
+ }
1194
+ ],
1195
+ "anatomy": "Tabela (table-layout: fixed, border-collapse: collapse):\n [thead > tr (32px, border-bottom 1px --border-default)]\n [th: 14px/400 --content-tertiary | padding: 4px 8px]\n Colunas: Ativo(65) Último(80) Q Últ(65) Var%(65) Tend(65) Dif(65) Stat(65) QOfc(65) Ofc(65) Ofv(65) QOfv(65) Teórico(65)\n [tbody > tr (32px, cursor pointer)]\n [tr:nth-child(even): bg rgba(255,255,255,0.08)]\n [tr:hover: bg --surface-secondary]\n [tr.selected: bg --bg-secondary]\n [td: 14px/400 --content-primary | padding: 4px 8px]\n [td.col-ultimo: bg --surface-primary #4A4A4A]\n [td.col-var-up: color --context-trading-up #4FE290]\n [td.col-var-down: color --context-trading-down #F34F45]\n [td.col-tend: ícone Material Symbols arrow_drop_up/down]",
1196
+ "code": {
1197
+ "html": "<!-- Tabela de Cotações TRDR (Figma: 77:3681) -->\n<div style=\"width:100%;overflow-x:auto;background:var(--bg-primary)\">\n <table class=\"trdr-tabela-cotacoes\">\n <colgroup>\n <col style=\"width:65px\"> <col style=\"width:80px\"> <col style=\"width:65px\">\n <col style=\"width:65px\"> <col style=\"width:65px\"> <col style=\"width:65px\">\n <col style=\"width:65px\"> <col style=\"width:65px\"> <col style=\"width:65px\">\n <col style=\"width:65px\"> <col style=\"width:65px\"> <col style=\"width:65px\">\n </colgroup>\n <thead>\n <tr>\n <th>Ativo</th><th>Último</th><th>Q Últ</th><th>Var %</th>\n <th>Tend</th><th>Dif</th><th>Stat...</th><th>QOfc</th>\n <th>Ofc</th><th>Ofv</th><th>QOfv</th><th>Teórico</th>\n </tr>\n </thead>\n <tbody>\n <tr class=\"trdr-tabela-cotacoes-row-selected\">\n <td>ITUB4</td>\n <td class=\"col-ultimo\">50.47</td>\n <td>100</td>\n <td class=\"col-var-down\">-0.72%</td>\n <td><span class=\"col-tend-icon col-tend-down\">arrow_drop_down</span></td>\n <td>0.36</td><td>.</td><td>1.000</td>\n <td>50.47</td><td>50.49</td><td>1.300</td><td>.</td>\n </tr>\n <tr>\n <td>VALE3</td>\n <td class=\"col-ultimo\">92,00</td>\n <td>200</td>\n <td class=\"col-var-up\">+1.20%</td>\n <td><span class=\"col-tend-icon col-tend-up\">arrow_drop_up</span></td>\n <td>0.50</td><td>.</td><td>2.700</td>\n <td>92,00</td><td>92,10</td><td>4.000</td><td>.</td>\n </tr>\n </tbody>\n </table>\n</div>",
1198
+ "css": "/* Tabela de Cotações — TRDR Design System */\n/* Tokens: --context-trading-up (#4FE290), --context-trading-down (#F34F45) */\n/* Tokens: --surface-primary (#4A4A4A), --surface-secondary (#222222) */\n/* Tokens: --border-default (#4A4A4A), --content-tertiary (#A4A4A4) */\n\n.trdr-tabela-cotacoes {\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n font-family: var(--font-secondary); /* Inter */\n font-size: 14px;\n font-weight: 400;\n color: var(--content-primary); /* #FFFFFF */\n}\n\n.trdr-tabela-cotacoes thead tr {\n height: 32px;\n border-bottom: 1px solid var(--border-default); /* #4A4A4A */\n}\n\n.trdr-tabela-cotacoes th {\n padding: 4px 8px;\n text-align: left;\n color: var(--content-tertiary); /* #A4A4A4 */\n font-weight: 400;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.trdr-tabela-cotacoes tbody tr {\n height: 32px;\n cursor: pointer;\n transition: background-color 0.1s ease;\n}\n\n.trdr-tabela-cotacoes tbody tr:nth-child(even) {\n background: rgba(255, 255, 255, 0.08);\n}\n\n.trdr-tabela-cotacoes tbody tr:hover {\n background: var(--surface-secondary); /* #222222 */\n}\n\n.trdr-tabela-cotacoes tbody tr.trdr-tabela-cotacoes-row-selected {\n background: var(--bg-secondary); /* #141519 */\n}\n\n.trdr-tabela-cotacoes td {\n padding: 4px 8px;\n text-align: left;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.trdr-tabela-cotacoes td.col-ultimo {\n background: var(--surface-primary); /* #4A4A4A */\n}\n\n.trdr-tabela-cotacoes .col-var-up { color: var(--context-trading-up); } /* #4FE290 */\n.trdr-tabela-cotacoes .col-var-down { color: var(--context-trading-down); } /* #F34F45 */\n\n.trdr-tabela-cotacoes .col-tend-icon {\n font-family: 'Material Symbols Outlined';\n font-size: 20px;\n font-variation-settings: 'FILL' 1, 'GRAD' 0, 'wght' 400;\n vertical-align: middle;\n}\n.trdr-tabela-cotacoes .col-tend-up { color: var(--context-trading-up); }\n.trdr-tabela-cotacoes .col-tend-down { color: var(--context-trading-down); }",
1199
+ "react": "import TabelaCotacoes, { CotacaoRow } from '@/components/ui/TabelaCotacoes'\n\nconst rows: CotacaoRow[] = [\n {\n ativo: 'ITUB4',\n ultimo: '50.47',\n qUlt: 100,\n varPct: -0.72,\n tend: 'down',\n dif: '0.36',\n qOfc: '1.000',\n ofc: '50.47',\n ofv: '50.49',\n qOfv: '1.300',\n selected: true,\n },\n {\n ativo: 'VALE3',\n ultimo: '92,00',\n qUlt: 200,\n varPct: 1.20,\n tend: 'up',\n dif: '0.50',\n },\n]\n\nexport default function Example() {\n return <TabelaCotacoes rows={rows} />\n}",
1200
+ "prompt": "Crie um componente React 'TabelaCotacoes' pixel-perfect baseado no Figma TRDR (node 77:3681).\n\nESTRUTURA:\n- Elemento <table> com table-layout: fixed e border-collapse: collapse\n- Wrapper <div> com overflow-x: auto e background: var(--bg-primary)\n\nHEADER (thead > tr):\n- height: 32px\n- border-bottom: 1px solid var(--border-default) /* #4A4A4A */\n- th: padding 4px 8px, font 14px/400, color var(--content-tertiary) /* #A4A4A4 */\n\nCOLUNAS (colgroup):\nAtivo=65px, Último=80px, Q Últ=65px, Var%=65px, Tend=65px, Dif=65px,\nStat=65px, QOfc=65px, Ofc=65px, Ofv=65px, QOfv=65px, Teórico=65px\n\nDATA ROWS (tbody > tr):\n- height: 32px, cursor: pointer\n- tr:nth-child(even): background rgba(255,255,255,0.08)\n- tr:hover: background var(--surface-secondary) /* #222222 */\n- tr.selected: background var(--bg-secondary) /* #141519 */\n- td: padding 4px 8px, font 14px/400, color var(--content-primary) /* #FFFFFF */\n- td.col-ultimo: background var(--surface-primary) /* #4A4A4A */\n- td variação positiva: color var(--context-trading-up) /* #4FE290 */\n- td variação negativa: color var(--context-trading-down) /* #F34F45 */\n- td tendência: ícone Material Symbols Outlined 'arrow_drop_up'/'arrow_drop_down', 20px, FILL 1\n\nINTERFACE TypeScript:\ninterface CotacaoRow {\n ativo: string; ultimo: string|number; qUlt?: string|number\n varPct: number; tend?: 'up'|'down'|null; dif?: string|number\n status?: string; qOfc?: string|number; ofc?: string|number\n ofv?: string|number; qOfv?: string|number; teorico?: string|number\n selected?: boolean\n}\n\nUsar APENAS tokens semânticos TRDR. NUNCA hex direto. NUNCA --scale-spacing-*."
1201
+ }
1202
+ },
1203
+ {
1204
+ "slug": "tabela-ordens",
1205
+ "name": "Tabela de Ordens",
1206
+ "figmaId": "336:3114",
1207
+ "category": "trading",
1208
+ "implemented": true,
1209
+ "description": "Tabela de histórico de ordens. Exibe horário, ativo, tipo C/V (colorido), preço, quantidade, status (Aberta/Executada/Cancelada) e origem. Linhas canceladas recebem fundo vermelho translúcido.",
1210
+ "props": [
1211
+ {
1212
+ "name": "rows",
1213
+ "type": "OrdemRow[]",
1214
+ "values": [
1215
+ "array de dados de ordens"
1216
+ ]
1217
+ }
1218
+ ],
1219
+ "dimensions": [
1220
+ {
1221
+ "label": "Largura total",
1222
+ "width": "896px",
1223
+ "height": "—"
1224
+ },
1225
+ {
1226
+ "label": "Altura do header",
1227
+ "width": "—",
1228
+ "height": "32px"
1229
+ },
1230
+ {
1231
+ "label": "Altura da linha",
1232
+ "width": "—",
1233
+ "height": "32px"
1234
+ }
1235
+ ],
1236
+ "tokens": [
1237
+ {
1238
+ "property": "C (Compra) text",
1239
+ "token": "context.trading.long.text",
1240
+ "value": "#6DE7A2"
1241
+ },
1242
+ {
1243
+ "property": "V (Venda) text",
1244
+ "token": "context.trading.short.text",
1245
+ "value": "#F56D64"
1246
+ },
1247
+ {
1248
+ "property": "Row cancelada bg",
1249
+ "token": "context.trading.short.default",
1250
+ "value": "rgba(241,49,38,0.08)"
1251
+ },
1252
+ {
1253
+ "property": "Row hover",
1254
+ "token": "surface.secondary",
1255
+ "value": "#222222"
1256
+ },
1257
+ {
1258
+ "property": "Header border",
1259
+ "token": "border.default",
1260
+ "value": "#4A4A4A"
1261
+ },
1262
+ {
1263
+ "property": "Header text",
1264
+ "token": "content.tertiary",
1265
+ "value": "#A4A4A4"
1266
+ },
1267
+ {
1268
+ "property": "Cell text",
1269
+ "token": "content.primary",
1270
+ "value": "#FFFFFF"
1271
+ }
1272
+ ],
1273
+ "anatomy": "Tabela (table-layout: fixed, border-collapse: collapse):\n [thead > tr (32px, border-bottom 1px --border-default)]\n [th: 14px/400 --content-tertiary | padding: 4px 8px]\n Colunas: Horário(81) Ativo(80) C/V(65) Preço(104) Médio(79)\n Qtde(65) Disp(65) Aberta(65) Exec(65) Status(86) Validade(79) Origem(65)\n [tbody > tr (32px, cursor pointer)]\n [tr:nth-child(even): bg rgba(255,255,255,0.05)]\n [tr:hover: bg --surface-secondary]\n [tr.cancelada: bg --context-trading-short-default]\n [td: 14px/400 --content-primary | padding: 4px 8px | text-overflow: ellipsis]\n [td.col-cv-c: color --context-trading-long-text #6DE7A2, font-weight 600]\n [td.col-cv-v: color --context-trading-short-text #F56D64, font-weight 600]",
1274
+ "code": {
1275
+ "html": "<!-- Tabela de Ordens TRDR (Figma: 336:3114) -->\n<div style=\"width:100%;overflow-x:auto;background:var(--bg-primary)\">\n <table class=\"trdr-tabela-ordens\">\n <colgroup>\n <col style=\"width:81px\"> <col style=\"width:80px\"> <col style=\"width:65px\">\n <col style=\"width:104px\"><col style=\"width:79px\"> <col style=\"width:65px\">\n <col style=\"width:65px\"> <col style=\"width:65px\"> <col style=\"width:65px\">\n <col style=\"width:86px\"> <col style=\"width:79px\"> <col style=\"width:65px\">\n </colgroup>\n <thead>\n <tr>\n <th>Horário</th><th>Ativo</th><th>C/V</th><th>Preço</th>\n <th>Médio</th><th>Qtde</th><th>Disp</th><th>Aberta</th>\n <th>Exec</th><th>Status</th><th>Validade</th><th>Origem</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>11:32:56</td><td>WDOK18</td>\n <td class=\"col-cv-c\">C</td>\n <td>3.425.600</td><td>3.425.600</td>\n <td>20</td><td>.</td><td>.</td><td>20</td>\n <td>Aberta</td><td>.</td><td>Loss</td>\n </tr>\n <tr>\n <td>11:35:24</td><td>WDOK18</td>\n <td class=\"col-cv-v\">V</td>\n <td>3.425.600</td><td>3.425.600</td>\n <td>19</td><td>.</td><td>.</td><td>19</td>\n <td>Aberta</td><td>.</td><td>Criptor</td>\n </tr>\n <tr class=\"trdr-tabela-ordens-row-cancelada\">\n <td>11:36:03</td><td>WDOK18</td>\n <td class=\"col-cv-c\">C</td>\n <td>3.425.600</td><td>3.425.600</td>\n <td>16</td><td>.</td><td>.</td><td>16</td>\n <td>Cancelada</td><td>.</td><td>Criptor</td>\n </tr>\n </tbody>\n </table>\n</div>",
1276
+ "css": "/* Tabela de Ordens — TRDR Design System */\n/* Tokens: --context-trading-long-text (#6DE7A2) — C (Compra) */\n/* Tokens: --context-trading-short-text (#F56D64) — V (Venda) */\n/* Tokens: --context-trading-short-default — fundo linha cancelada */\n/* Tokens: --border-default (#4A4A4A), --content-tertiary (#A4A4A4) */\n\n.trdr-tabela-ordens {\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n font-family: var(--font-secondary); /* Inter */\n font-size: 14px;\n font-weight: 400;\n color: var(--content-primary); /* #FFFFFF */\n}\n\n.trdr-tabela-ordens thead tr {\n height: 32px;\n border-bottom: 1px solid var(--border-default); /* #4A4A4A */\n}\n\n.trdr-tabela-ordens th {\n padding: 4px 8px;\n text-align: left;\n color: var(--content-tertiary); /* #A4A4A4 */\n font-weight: 400;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.trdr-tabela-ordens tbody tr {\n height: 32px;\n cursor: pointer;\n transition: background-color 0.1s ease;\n}\n\n.trdr-tabela-ordens tbody tr:nth-child(even) {\n background: rgba(255, 255, 255, 0.05);\n}\n\n.trdr-tabela-ordens tbody tr:hover {\n background: var(--surface-secondary); /* #222222 */\n}\n\n.trdr-tabela-ordens tbody tr.trdr-tabela-ordens-row-cancelada {\n background: var(--context-trading-short-default); /* rgba(241,49,38,0.08) */\n}\n\n.trdr-tabela-ordens td {\n padding: 4px 8px;\n text-align: left;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.trdr-tabela-ordens .col-cv-c {\n color: var(--context-trading-long-text); /* #6DE7A2 */\n font-weight: 600;\n}\n\n.trdr-tabela-ordens .col-cv-v {\n color: var(--context-trading-short-text); /* #F56D64 */\n font-weight: 600;\n}",
1277
+ "react": "import TabelaOrdens, { OrdemRow } from '@/components/ui/TabelaOrdens'\n\nconst rows: OrdemRow[] = [\n {\n horario: '11:32:56',\n ativo: 'WDOK18',\n tipo: 'C',\n preco: '3.425.600',\n medio: '3.425.600',\n qtde: 20,\n exec: 20,\n status: 'aberta',\n origem: 'Loss',\n },\n {\n horario: '11:35:24',\n ativo: 'WDOK18',\n tipo: 'V',\n preco: '3.425.600',\n medio: '3.425.600',\n qtde: 19,\n exec: 19,\n status: 'aberta',\n origem: 'Criptor',\n },\n {\n horario: '11:36:03',\n ativo: 'WDOK18',\n tipo: 'C',\n preco: '3.425.600',\n medio: '3.425.600',\n qtde: 16,\n exec: 16,\n status: 'cancelada',\n origem: 'Criptor',\n },\n]\n\nexport default function Example() {\n return <TabelaOrdens rows={rows} />\n}",
1278
+ "prompt": "Crie um componente React 'TabelaOrdens' pixel-perfect baseado no Figma TRDR (node 336:3114).\n\nESTRUTURA:\n- Elemento <table> com table-layout: fixed e border-collapse: collapse\n- Wrapper <div> com overflow-x: auto e background: var(--bg-primary)\n\nHEADER (thead > tr):\n- height: 32px\n- border-bottom: 1px solid var(--border-default) /* #4A4A4A */\n- th: padding 4px 8px, font 14px/400, color var(--content-tertiary) /* #A4A4A4 */\n\nCOLUNAS (colgroup):\nHorário=81px, Ativo=80px, C/V=65px, Preço=104px, Médio=79px,\nQtde=65px, Disp=65px, Aberta=65px, Exec=65px, Status=86px, Validade=79px, Origem=65px\n\nDATA ROWS (tbody > tr):\n- height: 32px, cursor: pointer\n- tr:nth-child(even): background rgba(255,255,255,0.05)\n- tr:hover: background var(--surface-secondary) /* #222222 */\n- tr.cancelada: background var(--context-trading-short-default) /* rgba(241,49,38,0.08) */\n- td: padding 4px 8px, font 14px/400, color var(--content-primary), text-overflow ellipsis\n- td.col-cv-c (Compra): color var(--context-trading-long-text) /* #6DE7A2 */, font-weight 600\n- td.col-cv-v (Venda): color var(--context-trading-short-text) /* #F56D64 */, font-weight 600\n\nINTERFACE TypeScript:\ntype OrdemStatus = 'aberta' | 'executada' | 'cancelada' | 'parcial'\ninterface OrdemRow {\n horario: string; ativo: string; tipo: 'C'|'V'\n preco: string|number; medio?: string|number\n qtde: number; disp?: string|number; aberta?: string|number; exec?: string|number\n status: OrdemStatus; validade?: string; origem?: string\n}\n\nUsar APENAS tokens semânticos TRDR. NUNCA hex direto. NUNCA --scale-spacing-*."
1279
+ }
1280
+ },
1115
1281
  {
1116
1282
  "slug": "card",
1117
1283
  "name": "Card",
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * SNAPSHOT — TRDR Design Tokens
3
3
  * Sincronizado de: https://trdr.mrocontent.com.br/tokens.css
4
- * Em: 2026-05-11T23:32:45.091Z
4
+ * Em: 2026-05-12T15:40:04.662Z
5
5
  * Não edite manualmente — atualize via "npm run sync-tokens"
6
6
  */
7
7