@maccesar/titools 5.1.0 → 5.2.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.
Files changed (85) hide show
  1. package/README.md +44 -12
  2. package/agents/ti-pro.md +4 -0
  3. package/commands/ti-audit.md +4 -0
  4. package/lib/config.js +2 -0
  5. package/package.json +1 -1
  6. package/skills/purgetss/SKILL.md +4 -4
  7. package/skills/purgetss/references/EXAMPLES.md +3 -3
  8. package/skills/purgetss/references/adopting-purgetss.md +2 -2
  9. package/skills/purgetss/references/animation-advanced.md +2 -2
  10. package/skills/purgetss/references/arbitrary-values.md +8 -5
  11. package/skills/purgetss/references/class-categories.md +5 -5
  12. package/skills/purgetss/references/class-index-properties.md +6 -6
  13. package/skills/purgetss/references/class-index.md +2 -2
  14. package/skills/purgetss/references/cli-commands.md +2 -2
  15. package/skills/purgetss/references/dynamic-component-creation.md +2 -2
  16. package/skills/purgetss/references/grid-layout.md +1 -1
  17. package/skills/purgetss/references/migration-guide.md +34 -4
  18. package/skills/purgetss/references/multi-density-images.md +6 -6
  19. package/skills/purgetss/references/platform-modifiers.md +21 -0
  20. package/skills/purgetss/references/ui-ux-design.md +1 -1
  21. package/skills/purgetss/references/version-history.md +9 -4
  22. package/skills/ti-admob-unified/SKILL.md +44 -0
  23. package/skills/ti-admob-unified/agents/openai.yaml +4 -0
  24. package/skills/ti-admob-unified/assets/example/app.js +1003 -0
  25. package/skills/ti-admob-unified/assets/example/lib/ads.js +618 -0
  26. package/skills/ti-admob-unified/assets/example/library-usage.js +104 -0
  27. package/skills/ti-admob-unified/references/api-reference.md +592 -0
  28. package/skills/ti-admob-unified/references/banners.md +435 -0
  29. package/skills/ti-admob-unified/references/contributing.md +228 -0
  30. package/skills/ti-admob-unified/references/dependencies.md +85 -0
  31. package/skills/ti-admob-unified/references/fullscreen.md +223 -0
  32. package/skills/ti-admob-unified/references/game-monetization.md +17 -0
  33. package/skills/ti-admob-unified/references/getting-started.md +275 -0
  34. package/skills/ti-admob-unified/references/index.md +30 -0
  35. package/skills/ti-admob-unified/references/integration.md +85 -0
  36. package/skills/ti-admob-unified/references/library.md +189 -0
  37. package/skills/ti-admob-unified/references/mediation.md +132 -0
  38. package/skills/ti-admob-unified/references/migration.md +255 -0
  39. package/skills/ti-admob-unified/references/module-changelog.md +54 -0
  40. package/skills/ti-admob-unified/references/module-license.txt +21 -0
  41. package/skills/ti-admob-unified/references/privacy.md +254 -0
  42. package/skills/ti-admob-unified/references/roadmap.md +146 -0
  43. package/skills/ti-admob-unified/references/source-notes.md +33 -0
  44. package/skills/ti-admob-unified/references/source-snapshot.json +440 -0
  45. package/skills/ti-admob-unified/references/third-party-notices.md +22 -0
  46. package/skills/ti-game/SKILL.md +10 -1
  47. package/skills/ti-game/references/api.md +10 -2
  48. package/skills/ti-game/references/debugging-performance.md +6 -0
  49. package/skills/ti-game/references/examples.md +11 -1
  50. package/skills/ti-game/references/patterns.md +24 -2
  51. package/skills/ti-game/references/physics.md +502 -0
  52. package/skills/ti-game/references/project-setup.md +23 -1
  53. package/skills/ti-game/references/recipes-action.md +46 -14
  54. package/skills/ti-game/references/recipes-adventure-effects.md +12 -1
  55. package/skills/ti-game/references/roadmap.md +2 -2
  56. package/skills/ti-game/references/tilemaps.md +2 -1
  57. package/skills/ti-game-assets/SKILL.md +53 -0
  58. package/skills/ti-game-assets/agents/openai.yaml +4 -0
  59. package/skills/ti-game-assets/references/alpha.md +26 -0
  60. package/skills/ti-game-assets/references/art-direction.md +37 -0
  61. package/skills/ti-game-assets/references/integration.md +49 -0
  62. package/skills/ti-game-assets/references/manifest.example.json +429 -0
  63. package/skills/ti-game-assets/references/manifest.md +39 -0
  64. package/skills/ti-game-assets/references/offline-audio.md +33 -0
  65. package/skills/ti-game-assets/references/prompts.md +33 -0
  66. package/skills/ti-game-assets/references/repeating-textures.md +17 -0
  67. package/skills/ti-game-assets/references/responsible-ads.md +31 -0
  68. package/skills/ti-game-assets/references/sound-assets.md +42 -0
  69. package/skills/ti-game-assets/references/vector-sources.md +21 -0
  70. package/skills/ti-game-assets/scripts/alpha_tools.py +160 -0
  71. package/skills/ti-game-assets/scripts/requirements.txt +1 -0
  72. package/skills/ti-game-assets/scripts/validate_manifest.py +267 -0
  73. package/skills/ti-synthengine/SKILL.md +37 -13
  74. package/skills/ti-synthengine/references/api.md +397 -31
  75. package/skills/ti-synthengine/references/audio-engine.md +235 -14
  76. package/skills/ti-synthengine/references/examples.md +396 -17
  77. package/skills/ti-synthengine/references/guide.md +331 -12
  78. package/skills/ti-synthengine/references/recipes.md +212 -22
  79. package/skills/ti-synthengine/references/recommendations.md +53 -16
  80. package/skills/ti-synthengine/references/sound-design.md +359 -15
  81. package/skills/ti-synthengine/references/source-notes.md +121 -0
  82. package/skills/ti-synthengine/references/source-snapshot.json +105 -0
  83. package/skills/ti-synthengine/references/stats-performance.json +2992 -0
  84. package/skills/ti-synthengine/references/stats-performance.md +38 -0
  85. package/skills/ti-synthengine/references/troubleshooting.md +61 -4
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  </div>
8
8
 
9
- TiTools is a Titanium SDK toolkit for AI coding assistants. It ships 11 skills — 6 specialist skills (`ti-reuse-first`, `ti-expert`, `purgetss`, `ti-ui`, `ti-game`, `ti-synthengine`) plus 5 documentation-mirror skills (`ti-api`, `ti-guides`, `ti-howtos`, `alloy-guides`, `alloy-howtos`) — a research agent, and reference files covering reuse and simplification, Titanium architecture, API reference, native how-tos, Alloy MVC, PurgeTSS styling and resource automation, UI/UX patterns, 2D games, and native sound synthesis.
9
+ TiTools is a Titanium SDK toolkit for AI coding assistants. It ships 13 skills — 8 specialist skills (`ti-reuse-first`, `ti-expert`, `purgetss`, `ti-ui`, `ti-game`, `ti-game-assets`, `ti-synthengine`, `ti-admob-unified`) plus 5 documentation-mirror skills (`ti-api`, `ti-guides`, `ti-howtos`, `alloy-guides`, `alloy-howtos`) — a research agent, and reference files covering reuse and simplification, Titanium architecture, API reference, native how-tos, Alloy MVC, PurgeTSS styling and resource automation, UI/UX patterns, 2D games, and native sound synthesis.
10
10
 
11
11
  The reference files are maintained against official documentation whenever an official source exists, so the assistant can retrieve current framework behavior instead of guessing from generic training data. As of v5.0.0 those sources are the Titanium SDK's own API definitions and the rewritten guides at [titaniumsdk.com](https://titaniumsdk.com). [Where the references come from](#where-the-references-come-from) has the detail.
12
12
 
@@ -36,7 +36,7 @@ The fastest way to get started with Claude Code. One command to add the marketpl
36
36
  ```
37
37
 
38
38
  What you get:
39
- - All 11 TiTools skills (`ti-reuse-first`, `ti-expert`, `purgetss`, `ti-ui`, `ti-game`, `ti-synthengine`, `ti-api`, `ti-guides`, `ti-howtos`, `alloy-guides`, `alloy-howtos`)
39
+ - All 13 TiTools skills (`ti-reuse-first`, `ti-expert`, `purgetss`, `ti-ui`, `ti-game`, `ti-game-assets`, `ti-synthengine`, `ti-admob-unified`, `ti-api`, `ti-guides`, `ti-howtos`, `alloy-guides`, `alloy-howtos`)
40
40
  - ti-pro research agent
41
41
  - Session hook that auto-detects Titanium projects (`tiapp.xml`, Alloy, PurgeTSS, `ti.game`, `ti.synthengine`)
42
42
  - Slash commands: `/ti-check`, `/ti-new-screen`, `/ti-audit`
@@ -70,7 +70,7 @@ claude # or gemini, or codex
70
70
  ```
71
71
 
72
72
  What gets installed:
73
- - The 10 TiTools skills to `~/.agents/skills/`
73
+ - The 13 TiTools skills to `~/.agents/skills/`
74
74
  - ti-pro agent for Claude Code
75
75
  - Platform symlinks for Claude Code (Gemini CLI and Codex CLI auto-discover from `~/.agents/skills/` — no symlinks needed)
76
76
  - Knowledge index in your project's `AGENTS.md`/`CLAUDE.md`/`GEMINI.md`
@@ -179,7 +179,9 @@ The knowledge index is based on the latest Titanium SDK documentation. If your p
179
179
  | purgetss | Alloy styling + asset automation | Utility classes; Alloy/Classic branding, images, colors, fonts and modules |
180
180
  | ti-ui | UI/UX patterns | Complex layouts, ListViews, platform UI |
181
181
  | ti-game | 2D games with the `ti.game` module | Sprites, physics, tile layers, wall jumps, pathfinding, text/performance HUDs, particles, camera |
182
- | ti-synthengine | Sound design with `ti.synthengine` | Tones, chords, retro/UI effects, alarms, sweeps, patterns, mixing and troubleshooting |
182
+ | ti-game-assets | Visual and sound assets | Image generation/editing, synthesis variants, stereo placement, alpha cleanup, manifests, parallax and complete exports |
183
+ | ti-synthengine | Sound design with `ti.synthengine` | Tones, chords, retro/UI effects, alarms, sweeps, patterns, ADSR envelopes, resonant filters, FM, detune, binaural positioning, engine statistics, mixing and troubleshooting |
184
+ | ti-admob-unified | Advertising, privacy and mediation | Official `ti.admob.unified` guides, copy-ready library, banners/fullscreen, UMP/ATT and selected-provider configuration |
183
185
  | ti-api | Complete Titanium API reference | Looking up properties, methods, events |
184
186
  | ti-guides | SDK fundamentals | tiapp.xml, Hyperloop, distribution, JDK/Xcode compatibility, release notes |
185
187
  | ti-howtos | Native feature integration | Location, push, media, platform APIs |
@@ -187,10 +189,11 @@ The knowledge index is based on the latest Titanium SDK documentation. If your p
187
189
  | alloy-howtos | Alloy CLI, configuration, debugging | alloy.jmk, config.json, custom XML tags |
188
190
 
189
191
  Notes:
190
- - The first six (`ti-reuse-first`, `ti-expert`, `purgetss`, `ti-ui`, `ti-game`, `ti-synthengine`) are specialist workflow skills reflecting TiTools' Titanium conventions and native-module contracts.
192
+ - The first eight (`ti-reuse-first`, `ti-expert`, `purgetss`, `ti-ui`, `ti-game`, `ti-game-assets`, `ti-synthengine`, `ti-admob-unified`) are specialist workflow skills reflecting TiTools' Titanium conventions and native-module contracts.
191
193
  - `ti-reuse-first` runs before the others. It asks whether a thing needs to exist and what already does it — a search order that stops at the first rung that holds — and sweeps an existing `app/` for near-identical controllers, single-listener events, wrappers around one call, and layout recomputed in JavaScript. It is deliberately two-sided: it says when adding a module or a Widget is the right answer, so the bias does not simply invert.
192
194
  - `ti-game` documents the `ti.game` native module (2D sprite engine on OpenGL ES 2.0, Android and iOS). Its API reference was verified against the module source and tracks upstream `main` (the module ships features ahead of its manifest version); it applies to Alloy and Classic projects alike and does not depend on PurgeTSS.
193
- - `ti-synthengine` translates aesthetic sound requests into strict, production-ready JavaScript for the cross-platform `ti.synthengine` 1.0.0 module. Seven references preserve the official documentation and an eighth adds curated retro, xylophone, memory-pad, polyphony and timer-ownership recipes; the API contract was cross-checked against both native implementations.
195
+ - `ti-synthengine` translates aesthetic sound requests into strict, production-ready JavaScript for the cross-platform `ti.synthengine` 1.0.0 beta module. Eight references preserve official documentation, accompanied by raw statistics benchmark trials; curated recipes add retro effects, xylophone interaction, memory pads, polyphony and timer ownership. The reviewed source includes eleven public methods with optional diagnostics; feature detection remains necessary for older beta binaries. Maintenance notes and a hash manifest distinguish the reviewed working tree from its base commit and published packages, track preserved navigation and state audit limits.
196
+ - `ti-game-assets` treats images and sounds as essential game assets. It coordinates integrated `image_gen` artwork with `ti-synthengine` sound design, variants and stereo placement, and ships Pillow helpers for conservative alpha cleanup and per-world visual/audio manifests.
194
197
  - The latter five are documentation-mirror skills, audited against official sources via the internal `titools-skill-auditor`. See [Where the references come from](#where-the-references-come-from).
195
198
  - `purgetss` reference files are audited against the official PurgeTSS documentation and against the package source (the CLI and the generated `utilities.tss`), but its workflow conventions are opinionated.
196
199
 
@@ -274,7 +277,7 @@ TiTools provides slash commands for common tasks. Both channels ship them: the p
274
277
  These commands automatically invoke the relevant skills:
275
278
  - `/ti-check` reads `tiapp.xml`, validates declared native modules, and reports project health
276
279
  - `/ti-new-screen` uses `ti-expert` + `purgetss` to create properly structured files
277
- - `/ti-audit` routes all 11 skills: the reuse sweep first, core Titanium checks always, Alloy/PurgeTSS checks when detected, integration how-tos when used, and `ti-game` / `ti-synthengine` checks when those modules are declared
280
+ - `/ti-audit` routes all 13 skills: the reuse sweep first, core Titanium checks always, Alloy/PurgeTSS checks when detected, integration how-tos when used, `ti-game-assets` checks for game asset workflows, and `ti-game` / `ti-synthengine` / `ti-admob-unified` checks when those modules are declared
278
281
 
279
282
  ---
280
283
 
@@ -318,6 +321,8 @@ All skills include automatic project detection to ensure compatibility:
318
321
  | ti-expert | Alloy vs Classic | Checks for `app/` (Alloy) vs `Resources/` (Classic) structure |
319
322
  | ti-ui | Titanium projects | Checks for `tiapp.xml` (both Alloy and Classic) |
320
323
  | ti-game | ti.game module | Checks for `<module>ti.game</module>` in `tiapp.xml` or `require('ti.game')` |
324
+ | ti-game-assets | Game art/sound workflows | Reads asset inventories, generation/export workflows and requested visual or sound assets; no module install required for drawings |
325
+ | ti-admob-unified | ti.admob.unified and mediation | Declared core/complement modules or requested ad/privacy/provider integration |
321
326
  | ti-synthengine | ti.synthengine module | Checks for `<module>ti.synthengine</module>` in `tiapp.xml` or `require('ti.synthengine')` |
322
327
 
323
328
  Why this matters:
@@ -333,11 +338,12 @@ Why this matters:
333
338
  | --- | --- |
334
339
  | Whether to build it at all | `ti-reuse-first`, first |
335
340
  | Architecture and UI | `ti-expert`, `ti-ui`, `purgetss` when configured |
336
- | Native modules | `ti-game`, `ti-synthengine` when declared |
341
+ | Game assets | `ti-game-assets` for visual and sound creation, preparation and integration |
342
+ | Native modules | `ti-game`, `ti-synthengine`, `ti-admob-unified` when declared or requested |
337
343
  | Exact SDK/API guidance | `ti-api`, `ti-guides`, `ti-howtos` |
338
344
  | Alloy MVC and tooling | `alloy-guides`, `alloy-howtos` for Alloy projects |
339
345
 
340
- All eleven ship with TiTools; no second skill package is required.
346
+ All thirteen ship with TiTools; no second skill package is required.
341
347
 
342
348
  ---
343
349
 
@@ -502,14 +508,37 @@ Key rules:
502
508
 
503
509
  ---
504
510
 
511
+ ### ti-game-assets
512
+
513
+ Create game art and sound assets as a coherent set: transparent HD masters or strict logical-grid pixel art, animation states, three-layer parallax, synthesized effects/music/ambience, related sound variants and screen-position stereo. `ti-game` owns native game behavior and `ti-synthengine` owns the sound contract; the asset skill coordinates both.
514
+
515
+ For the processing helpers and development tests, install Python dependencies in a virtual environment:
516
+
517
+ ```bash
518
+ python3 -m venv /tmp/titools-assets-env
519
+ /tmp/titools-assets-env/bin/pip install -r skills/ti-game-assets/scripts/requirements.txt
520
+ TITOOLS_ASSETS_PYTHON=/tmp/titools-assets-env/bin/python npm test
521
+ ```
522
+
523
+ Raster drawing generation/editing uses integrated `image_gen`. Authored SVG/procedural pipelines preserve editable sources and deterministically export PNG; offline synthesis can generate WAV. The bundled Python helpers validate alpha, SVG provenance, hashes and WAV headers/payloads. Cleaning writes new files and requires a reviewed protected region or an explicit defined-edge trial. Sound recipes remain source assets even without recorded audio files. Guides cover seamless texture/audio loops and responsible ad transitions through the separate `ti-admob-unified` skill. Technical checks, visual inspection and device listening are reported separately.
524
+
525
+ ### ti-admob-unified
526
+
527
+ Integrate César's `ti.admob.unified` module in Alloy or Classic using its official documentation for installation, API, UMP/ATT, privacy options, banner layout, fullscreen lifecycle and mediation. The skill includes the official copy-ready application library and guides for AppLovin, Meta, InMobi, Unity and Liftoff. The module's first public 1.0.0 release is under preparation at this snapshot.
528
+
529
+ Source commit, per-file hashes and rebased links are recorded. Future updates use the maintainer auditor's source map and the read-only check `node scripts/verify-module-snapshot.mjs --source /path/to/ti.admob.unified`; new, changed or removed docs are reported before updating. Community guidance remains separate from official mirrors.
530
+
531
+ Installing an adapter does not configure a publisher account or prove delivery. The skill distinguishes build/linking, Google test ads, each provider's test delivery and physical-device acceptance; it preserves the game's selected frequency policy instead of enabling every format.
532
+
505
533
  ### ti-synthengine
506
534
 
507
- Cross-platform sound design and synthesis with the native `ti.synthengine` 1.0.0 module for Android and iOS.
535
+ Cross-platform sound design and synthesis with the native `ti.synthengine` 1.0.0 beta module for Android and iOS.
508
536
 
509
537
  When it activates:
510
538
  - `tiapp.xml` declares `ti.synthengine`, or code calls `require('ti.synthengine')`
511
539
  - The app needs generated UI feedback, game cues, retro/chiptune effects, alarms, chords, pads, noise percussion, sweeps, panning, or vibrato
512
540
  - A synth call returns `false`, the first sound glitches, a pattern stops, a chord pumps, or output changes after a route switch
541
+ - The app needs voice/queue/rejection counters, optional render-load/output meters, or help interpreting host benchmark evidence
513
542
 
514
543
  Example prompts:
515
544
  ```
@@ -527,6 +556,7 @@ Key rules:
527
556
  - `playTone` accepts `note` or `frequency`, never both; `playChord` accepts `notes` or `frequencies`, never both
528
557
  - `duration` includes attack, the full-level middle, and release, so explicit envelope times must intersect correctly
529
558
  - Use `frequencyEnd` for sweeps, `panEnd` for stereo movement, and `lfoFreq`/`lfoDepth` for pitch vibrato
559
+ - Binaural headphone positioning uses `spatialX`/`spatialY` from -1 to 1, without pan fields. Omit both to keep stereo; check installed coordinate limits because older 1.0.0 builds lack this beta addition
530
560
  - Curated recipes cover retro effects, playable xylophone gestures, four-pad memory cues, controlled waveform comparisons, layered chords and cancellable repetition
531
561
  - Start after the first layout settles, keep one lifecycle owner, check Boolean returns, and call `shutdown()` on cleanup
532
562
 
@@ -627,7 +657,7 @@ Behavior depends on where you run it:
627
657
  | With `--local` flag | Installs skills locally to `./.agents/skills/` in the current project |
628
658
 
629
659
  What it does:
630
- - Installs the 10 TiTools skills (global or local depending on context)
660
+ - Installs the 13 TiTools skills (global or local depending on context)
631
661
  - Installs ti-pro agent for Claude Code
632
662
  - Installs the `/ti-check`, `/ti-new-screen` and `/ti-audit` slash commands into `~/.claude/commands/`
633
663
  - Detects installed AI platforms and lets you choose which to link (only Claude Code needs platform symlinks; Gemini CLI and Codex CLI auto-discover from `~/.agents/skills/`)
@@ -836,7 +866,9 @@ This pattern is documented across four bundled TiTools skills: `ti-ui`, `ti-expe
836
866
  | purgetss | Setup + Critical Rules | 34 files (Classic compatibility, grid, animations, icons, class-index, SVG pipeline, etc.) |
837
867
  | ti-ui | UI Rules + Platform Diffs | 14 files (layouts, lists, gestures, etc.) |
838
868
  | ti-game | Native 2D Game Workflow | 9 files (API, setup, patterns, recipes, tile maps, debugging, roadmap) |
839
- | ti-synthengine | Native Sound Synthesis | 8 files (API, sound design, lifecycle, engine, official examples, curated recipes, recommendations, troubleshooting) |
869
+ | ti-game-assets | Visual and Sound Assets | 10 guides and a manifest example; alpha and contract validation scripts |
870
+ | ti-admob-unified | Unified Advertising | 11 official module guides, source/hash update checks, official example library and game integration guidance |
871
+ | ti-synthengine | Native Sound Synthesis | 10 Markdown references (8 official, curated recipes, maintenance notes), raw statistics trials and a source hash manifest |
840
872
 
841
873
  ---
842
874
 
package/agents/ti-pro.md CHANGED
@@ -7,7 +7,9 @@ skills:
7
7
  - purgetss
8
8
  - ti-ui
9
9
  - ti-game
10
+ - ti-game-assets
10
11
  - ti-synthengine
12
+ - ti-admob-unified
11
13
  - ti-api
12
14
  - ti-guides
13
15
  - ti-howtos
@@ -29,8 +31,10 @@ When invoked, research complex topics by consulting the applicable skills from t
29
31
  - `ti-expert` - Architecture, patterns, conventions
30
32
  - `purgetss` - Utility-first styling classes (optional add-on; use when the project already has it or the user asks about it)
31
33
  - `ti-ui` - UI/UX patterns, layouts, gestures
34
+ - `ti-game-assets` - Visual and sound asset contracts, raster generation, alpha/export validation, synthesis variants and stereo coordination when assets are involved
32
35
  - `ti-game` - Native `ti.game` architecture and API when the module is declared
33
36
  - `ti-synthengine` - Native sound synthesis and strict `ti.synthengine` contract when the module is declared
37
+ - `ti-admob-unified` - Official unified advertising/privacy/mediation module contract and provider setup when declared or requested
34
38
  - `ti-api`, `ti-guides`, `ti-howtos` - Exact Titanium APIs, SDK fundamentals and native integrations
35
39
  - `alloy-guides`, `alloy-howtos` - Alloy MVC, CLI, configuration and compiler workflows when the project is Alloy
36
40
 
@@ -25,6 +25,10 @@ Native-module audit:
25
25
  10. If the project declares `ti.game`, invoke `ti-game` — check for sprites moved from timers instead of native properties, levels sized from `Ti.Platform.displayCaps` instead of the `resize` event, sprites added one by one instead of in one array, and timers or sounds left running when the window closes.
26
26
  11. If the project declares `ti.synthengine`, invoke `ti-synthengine` — check strict option names and types, mutually exclusive pitch fields, valid envelope intersections, checked Boolean results, one clear lifecycle owner, delayed startup after layout, app-owned timer cancellation, and `shutdown()` cleanup.
27
27
 
28
+ 12. If the project has game art/sound inventories or asset-generation/export workflows, invoke `ti-game-assets` — check contracts per set, master provenance/transparency, protected alpha cleanup, frame/pivot alignment, complete derived exports, parallax layers, sound variants and semantic event bindings. Consult `ti-game` and `ti-synthengine` equally in their applicable domains; do not require module installation or new sounds for an image-only task.
29
+
30
+ 13. If the project declares `ti.admob.unified`/mediation complements or implements an ad flow through this module, invoke `ti-admob-unified` — verify official module APIs, consent/request eligibility/initialization, test IDs, banner layout and refresh ownership, deliberate fullscreen presentation, callback cleanup and selected-provider mappings. Separate linking, Google test ads, provider delivery and physical acceptance. In games preserve native pause/audio/input ownership and the existing frequency policy.
31
+
28
32
  If a conditional skill does not apply, record it as `not applicable` with the detected reason instead of inventing findings from it.
29
33
 
30
34
  Report findings grouped by severity: critical, warning, info.
package/lib/config.js CHANGED
@@ -35,7 +35,9 @@ export const SKILLS = [
35
35
  'purgetss',
36
36
  'ti-ui',
37
37
  'ti-game',
38
+ 'ti-game-assets',
38
39
  'ti-synthengine',
40
+ 'ti-admob-unified',
39
41
  'ti-api',
40
42
  'ti-guides',
41
43
  'ti-howtos',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maccesar/titools",
3
- "version": "5.1.0",
3
+ "version": "5.2.0",
4
4
  "description": "Titanium SDK skills and agents for AI coding assistants, including native game and sound synthesis modules",
5
5
  "main": "lib/index.js",
6
6
  "type": "module",
@@ -329,7 +329,7 @@ purgetss create 'MyApp' -d -v fa
329
329
  > ```
330
330
 
331
331
  - **NEVER add `composite` class explicitly** - That's the default, use `horizontal`/`vertical` when needed
332
- - **Arbitrary values use parentheses**: `w-(100)`, `bg-(#ff0000)` - NO square brackets, and no `px` unit (unitless values are pixels; since v7.8.0 `w-(100px)` stops the build with a `Class Syntax Error`)
332
+ - **Arbitrary values use parentheses**: `w-(100)`, `bg-(#ff0000)` - NO square brackets. A unitless value is resolved through `ti.ui.defaultunit` (see [values-and-units.md](references/values-and-units.md)); `w-(100px)` is explicit pixels, valid again since v7.18.0 after stopping the build from v7.8.0 through v7.17.1
333
333
  - **`mode: 'all'` required** in `config.cjs` for Ti Elements styling
334
334
  - **Classes use `kebab-case`**: `.my-class`, IDs use `camelCase`: `#myId`
335
335
 
@@ -427,7 +427,7 @@ Load these only when needed:
427
427
  - [CLI Commands](references/cli-commands.md) - All `purgetss` commands
428
428
  - [Color Commands](references/color-commands.md) - `semantic`, `shades` and `color-module`: Light/Dark semantic colors, palettes in `config.cjs`, and the CommonJS color module
429
429
  - [Adopting PurgeTSS](references/adopting-purgetss.md) - Moving an existing Alloy app from hand-written `.tss` files to utility classes: the style-priority trap, view-by-view workflow, and property-to-class translation tables
430
- - [Migration Guide](references/migration-guide.md) - Upgrading between PurgeTSS versions (v7.2.6 → v7.17.1): breaking changes and what to review after each upgrade
430
+ - [Migration Guide](references/migration-guide.md) - Upgrading between PurgeTSS versions (v7.2.6 → v7.18.0): breaking changes and what to review after each upgrade
431
431
  - **[Values and Units](references/values-and-units.md)** - How `ti.ui.defaultunit` in `tiapp.xml` interprets the unitless numeric values PurgeTSS writes (foundational concept for spacing, sizes, typography)
432
432
 
433
433
  ### Customization
@@ -445,7 +445,7 @@ Load these only when needed:
445
445
  - [Grid Layout System](references/grid-layout.md) - 12-column grid, responsive layouts
446
446
  - [Smart Mappings](references/smart-mappings.md) - How gap, shadows, and grid work under the hood
447
447
  - [Arbitrary Values](references/arbitrary-values.md) - Parentheses notation for custom values
448
- - [Platform Modifiers](references/platform-modifiers.md) - ios:, android:, tablet:, handheld:
448
+ - [Platform Modifiers](references/platform-modifiers.md) - ios:, android:, tablet:, handheld:, and stacked `ios:tablet:` (v7.18.0)
449
449
  - [Opacity Modifier](references/opacity-modifier.md) - Color transparency with /50 syntax
450
450
  - [Titanium Resets](references/titanium-resets.md) - Default styles for Ti elements
451
451
  - [iOS Large Titles](references/ios-large-titles.md) - Best practice for iOS Large Title navigation
@@ -471,7 +471,7 @@ Load these only when needed:
471
471
  - [PurgeTSS UI in Classic](references/purgetss-ui-classic.md) - Native JavaScript setup, public exports, animation objects, cleanup, and platform notes
472
472
 
473
473
  ### Release Notes
474
- - [Version History](references/version-history.md) - Release-by-release feature additions and behavior changes (v7.4.0 → v7.17.1)
474
+ - [Version History](references/version-history.md) - Release-by-release feature additions and behavior changes (v7.4.0 → v7.18.0)
475
475
 
476
476
  > **💡 TEXT FONTS (Google Fonts, Roboto, etc.)**
477
477
  > For text fonts, see [Custom Fonts](references/custom-fonts.md).
@@ -321,14 +321,14 @@ alloy compile
321
321
  <View class="w-(100) bg-(#ff0000)" />
322
322
  ```
323
323
 
324
- **PurgeTSS syntax for arbitrary values uses `()` not `[]`, and pixel values are written without a unit: `w-(100px)` also stops the build (`Explicit "px" unit is redundant`).**
324
+ **PurgeTSS syntax for arbitrary values uses `()` not `[]`. A unitless value follows `ti.ui.defaultunit`; `w-(100px)` is explicit pixels (it stops the build only on v7.8.0 through v7.17.1).**
325
325
 
326
326
  > **🚨 v7.8.0+ HARD-FAILS THE BUILD ON SQUARE BRACKETS**
327
327
  > Since v7.8.0, the build stops with a structured `Class Syntax Error` block (file path + line number + `Fix:` suggestion) the moment it spots `top-[10px]`, `wh-[12]`, or any other square-bracket utility. Pre-v7.8.0, those classes silently dropped into the `// Unused or unsupported classes` block of `app.tss` — easy to miss. Now they're loud and actionable.
328
328
  >
329
329
  > v7.10.1 reworded the error message from `'Tailwind-style brackets "[ ]" are not supported'` to `'Square brackets "[ ]" are not supported'`. Same enforcement, less framing.
330
330
  >
331
- > See [Arbitrary Values → Class syntax pre-validation](arbitrary-values.md#class-syntax-pre-validation) for the full list of patterns the pre-validator catches (5 total, including inverted negative sign, whitespace inside parentheses, and redundant `px` units).
331
+ > See [Arbitrary Values → Class syntax pre-validation](arbitrary-values.md#class-syntax-pre-validation) for the full list of patterns the pre-validator catches (4 since v7.18.0: inverted negative sign, square brackets, empty parentheses, and whitespace inside parentheses).
332
332
 
333
333
  **Examples:**
334
334
  - `w-(100)` - Custom width
@@ -434,7 +434,7 @@ module.exports = {
434
434
  | `w-full` | Percentage-based | `w-screen` (Ti.UI.FILL) |
435
435
  | `rounded-full` with `w-*`/`h-*` | Fixed 8×8 circle, conflicts on size | `rounded-full-12` |
436
436
  | `composite` class | Already default | Omit it |
437
- | `w-[100]`, `w-(100px)` | Stops the build (v7.8.0+) | `w-(100)` |
437
+ | `w-[100]` | Stops the build (v7.8.0+) | `w-(100)` |
438
438
  | Manual `.tss` | Duplicates classes; its rules override `app.tss` | Use utility classes (`app.tss` itself is rewritten on every run) |
439
439
  | `gap` on a `%`-width column | Total exceeds 100% | `gap-*` on an inner View, or explicit margins |
440
440
  | ScrollView without `content-*` sizing | No/unexpected scroll | Add `content-w-screen` + `content-h-auto` |
@@ -103,7 +103,7 @@ Once the converted view looks right on both platforms, and the user agrees:
103
103
  | `layout: 'vertical'` | `vertical` |
104
104
  | `elevation: 4` | `elevation-1` (the scale is ×4: `elevation-4` is `16`) |
105
105
 
106
- Spacing classes multiply by 4 (`mt-4` = 16), and the numbers are unitless: Titanium resolves them with `ti.ui.defaultunit` (see [values-and-units.md](values-and-units.md)). For a value off the scale use an arbitrary value **without a unit**: `h-(60)`, not `h-(60px)`, which stops the build since v7.8.0 (see [arbitrary-values.md](arbitrary-values.md)). Colors in your brand palette belong in `config.cjs` (see [customization-deep-dive.md](customization-deep-dive.md)), not in arbitrary `bg-(#hex)` classes repeated across views.
106
+ Spacing classes multiply by 4 (`mt-4` = 16), and the numbers are unitless: Titanium resolves them with `ti.ui.defaultunit` (see [values-and-units.md](values-and-units.md)). For a value off the scale use an arbitrary value: `h-(60)` keeps the default unit, while `h-(60px)` means explicit pixels and stops the build on v7.8.0 through v7.17.1 (see [arbitrary-values.md](arbitrary-values.md)). Colors in your brand palette belong in `config.cjs` (see [customization-deep-dive.md](customization-deep-dive.md)), not in arbitrary `bg-(#hex)` classes repeated across views.
107
107
 
108
108
  ### Platform and device conditionals
109
109
 
@@ -133,5 +133,5 @@ See [animation-system.md](animation-system.md).
133
133
  | Keeping inline attributes (`backgroundColor="…"`) | They override every class | Move them into classes |
134
134
  | Flexbox classes (`flex-row`, `justify-between`) | Classes don't exist | `horizontal` / `vertical` layouts |
135
135
  | `p-*` on a `View` or `Window` | No effect: `padding` exists only on `TextField`, `TextArea` and Android `CardView` | Margins on the children |
136
- | `w-[100]` or `w-(100px)` | Stops the build | `w-(100)` |
136
+ | `w-[100]` | Stops the build | `w-(100)` |
137
137
  | Converting every view at once | Hard to find what broke | One view per step, tested on both platforms |
@@ -204,7 +204,7 @@ Control how draggable views behave when dropped. All are **off by default**.
204
204
  | `snap-center` | `{ animationProperties: { snap: { center: true } } }` | Auto-centers on target |
205
205
  | `snap-center-false` | `{ animationProperties: { snap: { center: false } } }` | Disables snap-center |
206
206
 
207
- Generated utility inventories may still contain `snap-magnet` names, but the current `purgetss.ui` runtime never reads `animationProperties.snap.magnet`. Do not use or recommend those classes as working drag behavior.
207
+ There is no magnet snap: `snap-magnet` and `snap-magnet-false` were generated from v7.5.1 through v7.17.1, but the runtime never read `snap.magnet`, and v7.18.0 removed them.
208
208
 
209
209
  ### keep-z-index
210
210
 
@@ -307,7 +307,7 @@ The callback is a new object containing selected native primitives plus PurgeTSS
307
307
 
308
308
  ### Position and drag state
309
309
 
310
- `swap()`, `snapTo()`, and `reorder()` persist destinations with `applyProperties()` and update private origin fields. They fall back to rendered `rect` coordinates, so call them only after layout.
310
+ `swap()`, `snapTo()`, and `reorder()` persist destinations with `applyProperties()` and update private origin fields. They fall back to rendered `rect` coordinates, so call them only after layout. `swap()` has this fallback since v7.18.0; before, a source view with no `top`/`left` sent the target view to `top: undefined`.
311
311
 
312
312
  Drag precedence is precise:
313
313
 
@@ -49,7 +49,7 @@ Example output:
49
49
 
50
50
  ### Detected patterns
51
51
 
52
- The validator catches five narrow, actionable mistakes:
52
+ The validator catches four narrow, actionable mistakes:
53
53
 
54
54
  | Pattern | Offending input | Suggested fix | Notes |
55
55
  | ----------------------------- | --------------- | ------------- | ---------------------------------------------------------------- |
@@ -57,13 +57,14 @@ The validator catches five narrow, actionable mistakes:
57
57
  | Square-bracket notation | `top-[10]` | `top-(10)` | PurgeTSS uses parentheses, not square brackets, for arbitrary values (v7.10.1 reworded the error from `Tailwind-style brackets "[ ]"` to `Square brackets "[ ]" are not supported`) |
58
58
  | Empty parentheses | `wh-()` | (flagged, no auto-fix) | Add a value such as `wh-(10)` |
59
59
  | Whitespace inside parentheses | `wh-( 200 )` | `wh-(200)` | No spaces allowed between `(`, the value, and `)` |
60
- | Redundant `px` unit | `top-(10px)` | `top-(10)` | PurgeTSS treats unit-less arbitrary values as pixels |
60
+
61
+ From v7.8.0 through v7.17.1 there was a fifth pattern, "Redundant `px` unit", which rejected `top-(10px)` and suggested `top-(10)`. v7.18.0 removed it: its error text claimed unit-less values are pixels, but they resolve through `ti.ui.defaultunit`, so the suggested fix changed the size.
61
62
 
62
63
  ### Unknown classes are still silently dropped
63
64
 
64
- The pre-validator only fires on the five patterns above. Any other unknown class — typos, custom utilities not yet declared, vendor classes that are not enabled in `config.cjs` — is **not** reported as a `Class Syntax Error`. Those classes continue to flow into the `// Unused or unsupported classes` comment block in `app.tss`, exactly like before. This keeps the validator focused on actionable mistakes and avoids noise while you sketch out class names.
65
+ The pre-validator only fires on the four patterns above. Any other unknown class — typos, custom utilities not yet declared, vendor classes that are not enabled in `config.cjs` — is **not** reported as a `Class Syntax Error`. Those classes continue to flow into the `// Unused or unsupported classes` comment block in `app.tss`, exactly like before. This keeps the validator focused on actionable mistakes and avoids noise while you sketch out class names.
65
66
 
66
- > **Units: write arbitrary values unitless.** Because of the redundant-`px` rule, any class like `m-(50px)`, `w-(2300px)` or `text-(48px)` halts the purge. Write `m-(50)`, `w-(2300)`, `text-(48)` instead; other units such as `rem`, `in` or `%` are not flagged.
67
+ > **Units.** A unitless value such as `w-(100)` generates `width: 100`, which Titanium resolves through `ti.ui.defaultunit` (normally `dp`; see [values-and-units.md](values-and-units.md)). A value with a unit keeps it: `w-(100px)` generates `width: '100px'`, explicit pixels, and `rem`, `in` or `%` work the same way. On v7.8.0 through v7.17.1 a `px` suffix stops the purge; write `w-(100)` there only if `dp` is what you meant.
67
68
 
68
69
  ### v7.8.0 parser fix for negatives inside parentheses
69
70
 
@@ -182,9 +183,11 @@ You can set an arbitrary value for any of the following color properties:
182
183
  - `bg-` (*hex-rgb-or-rgba-value*)
183
184
  - `bg-disabled-` (*hex-rgb-or-rgba-value*)
184
185
  - `bg-focused-` (*hex-rgb-or-rgba-value*)
186
+ - `bg-from-` (*hex-rgb-or-rgba-value*) — v7.18.0; earlier versions wrote a literal `{value1}`
185
187
  - `bg-selected-` (*hex-rgb-or-rgba-value*)
186
188
  - `bg-selected-from-` (*hex-rgb-or-rgba-value*)
187
189
  - `bg-selected-to-` (*hex-rgb-or-rgba-value*)
190
+ - `bg-to-` (*hex-rgb-or-rgba-value*)
188
191
  - `border-` (*hex-rgb-or-rgba-value*)
189
192
  - `colors-` (*hex-rgb-or-rgba-value*)
190
193
  - `content-scrim-` (*hex-rgb-or-rgba-value*)
@@ -236,7 +239,7 @@ You can set an arbitrary value for any of the following color properties:
236
239
 
237
240
  ## Spacing Properties
238
241
 
239
- You can set arbitrary values for most size and dimension properties using unitless numbers or units such as `rem`, `in`, or `%`, directly in XML files or in `config.cjs`. A `px` suffix is rejected by the pre-validator (see above).
242
+ You can set arbitrary values for most size and dimension properties using unitless numbers or units such as `px`, `rem`, `in`, or `%`, directly in XML files or in `config.cjs`. A `px` suffix is rejected on v7.8.0 through v7.17.1 (see above).
240
243
 
241
244
  ```xml
242
245
  <Alloy>
@@ -1,6 +1,6 @@
1
1
  # PurgeTSS Class Categories
2
2
 
3
- Every class family in `utilities.tss` (PurgeTSS 7.17.1), grouped by the kind of value it sets. Generated by `.claude/skills/titools-skill-auditor/scripts/purgetss-class-index.mjs`; do not edit by hand. For the property-by-property table see [class-index-properties.md](./class-index-properties.md); for naming rules see [class-index.md](./class-index.md).
3
+ Every class family in `utilities.tss` (PurgeTSS 7.18.0), grouped by the kind of value it sets. Generated by `.claude/skills/titools-skill-auditor/scripts/purgetss-class-index.mjs`; do not edit by hand. For the property-by-property table see [class-index-properties.md](./class-index-properties.md); for naming rules see [class-index.md](./class-index.md).
4
4
 
5
5
  <!-- TOC-START -->
6
6
  ## Contents
@@ -288,7 +288,7 @@ Every class family in `utilities.tss` (PurgeTSS 7.17.1), grouped by the kind of
288
288
  | `item-content-type-uttype-*` | 33 | `itemContentType` | `item-content-type-uttype-text`, `item-content-type-uttype-tiff`, `item-content-type-uttype-apple-protected-mpeg4-audio` |
289
289
  | `keyboard-appearance`, `keyboard-appearance-dark`, `keyboard-appearance-light` | 3 | `keyboardAppearance` | — |
290
290
  | `keyboard-dismiss-mode-none`, `keyboard-dismiss-mode-on-drag`, `keyboard-dismiss-mode-interactive` | 3 | `keyboardDismissMode` | — |
291
- | `keyboard-type`, `keyboard-type-*` | 14 | `keyboardType` | `keyboard-type-decimal-pad`, `keyboard-type-phone-pad`, `keyboard-type-appearance-light` |
291
+ | `keyboard-type`, `keyboard-type-*` | 11 | `keyboardType` | `keyboard-type-decimal-pad`, `keyboard-type-numbers-punctuation`, `keyboard-type-url` |
292
292
  | `kind-contacts-organization`, `kind-contacts-person` | 2 | `kind` | — |
293
293
  | `large-title-display-mode-automatic`, `large-title-display-mode-always`, `large-title-display-mode-never` | 3 | `largeTitleDisplayMode` | — |
294
294
  | `layer-type-web-view-none`, `layer-type-web-view-software`, `layer-type-web-view-hardware` | 3 | `layerType` | — |
@@ -301,7 +301,7 @@ Every class family in `utilities.tss` (PurgeTSS 7.17.1), grouped by the kind of
301
301
  | `location-services-authorization-denied`, `location-services-authorization-restricted`, `location-services-authorization-unknown`, `location-services-authorization-always`, `location-services-authorization-when-in-use` | 5 | `locationServicesAuthorization` | `location-services-authorization-denied`, `location-services-authorization-unknown`, `location-services-authorization-when-in-use` |
302
302
  | `lock-screen-setting-not-supported`, `lock-screen-setting-enabled`, `lock-screen-setting-disabled` | 3 | `lockScreenSetting` | — |
303
303
  | `lockscreen-visibility-private`, `lockscreen-visibility-public`, `lockscreen-visibility-secret` | 3 | `lockscreenVisibility` | — |
304
- | `login-keyboard-type`, `login-keyboard-type-*` | 14 | `loginKeyboardType` | `login-keyboard-type-appearance`, `login-keyboard-type-namephone-pad`, `login-keyboard-type-url` |
304
+ | `login-keyboard-type`, `login-keyboard-type-*` | 11 | `loginKeyboardType` | `login-keyboard-type-decimal-pad`, `login-keyboard-type-numbers-punctuation`, `login-keyboard-type-url` |
305
305
  | `login-return-key-type-*` | 12 | `loginReturnKeyType` | `login-return-key-type-continue`, `login-return-key-type-join`, `login-return-key-type-yahoo` |
306
306
  | `media-type-music-all`, `media-type-music-any-audio`, `media-type-music-audiobook`, `media-type-music`, `media-type-music-podcast` | 5 | `mediaType` | `media-type-music-all`, `media-type-music-audiobook`, `media-type-music-podcast` |
307
307
  | `media-types-*` | 18 | `mediaTypes` | `media-types-music-type-all`, `media-types-video-type-closed-caption`, `media-types-video-type` |
@@ -321,7 +321,7 @@ Every class family in `utilities.tss` (PurgeTSS 7.17.1), grouped by the kind of
321
321
  | `outputs-audio-session-port-*` | 14 | `outputs` | `outputs-audio-session-port-linein`, `outputs-audio-session-port-builtinspeaker`, `outputs-audio-session-port-caraudio` |
322
322
  | `over-scroll-mode-always`, `over-scroll-mode-if-content-scrolls`, `over-scroll-mode-never` | 3 | `overScrollMode` | — |
323
323
  | `override-user-interface-style-unspecified`, `override-user-interface-style-light`, `override-user-interface-style-dark` | 3 | `overrideUserInterfaceStyle` | — |
324
- | `password-keyboard-type`, `password-keyboard-type-*` | 14 | `passwordKeyboardType` | `password-keyboard-type-appearance`, `password-keyboard-type-namephone-pad`, `password-keyboard-type-url` |
324
+ | `password-keyboard-type`, `password-keyboard-type-*` | 11 | `passwordKeyboardType` | `password-keyboard-type-decimal-pad`, `password-keyboard-type-numbers-punctuation`, `password-keyboard-type-url` |
325
325
  | `password-return-key-type-*` | 12 | `passwordReturnKeyType` | `password-return-key-type-continue`, `password-return-key-type-join`, `password-return-key-type-yahoo` |
326
326
  | `physical-size-category-large`, `physical-size-category-normal`, `physical-size-category-small`, `physical-size-category-undefined`, `physical-size-category-xlarge` | 5 | `physicalSizeCategory` | `physical-size-category-large`, `physical-size-category-small`, `physical-size-category-xlarge` |
327
327
  | `platform-w`, `platform-h`, `platform-wh`, `platform-w-inverted`, `platform-h-inverted`, `platform-wh-inverted`, `inverted-platform-w`, `inverted-platform-h` | 8 | `width`, `height` | `platform-w`, `platform-wh`, `platform-wh-inverted` |
@@ -650,7 +650,7 @@ Each sets one property to `true` or `false`. Most come as a pair, `name` and `na
650
650
  - `show-vertical-scroll-indicator` / `show-vertical-scroll-indicator-false`
651
651
  - `shows-controls` / `shows-controls-false`
652
652
  - `smooth-scroll-on-tab-click` / `smooth-scroll-on-tab-click-false`
653
- - `snap-back` / `snap-back-false` / `snap-center` / `snap-center-false` / `snap-magnet` / `snap-magnet-false` / `keep-z-index` / `keep-z-index-false`
653
+ - `snap-back` / `snap-back-false` / `snap-center` / `snap-center-false` / `keep-z-index` / `keep-z-index-false`
654
654
  - `sorted` / `sorted-false`
655
655
  - `split-track` / `split-track-false`
656
656
  - `stopped` / `stopped-false`
@@ -1,6 +1,6 @@
1
1
  # PurgeTSS Class Index — Titanium Properties (A–Z)
2
2
 
3
- Every Titanium property that has PurgeTSS utility classes, with the classes that set it. Generated from `utilities.tss` (PurgeTSS 7.17.1) by `.claude/skills/titools-skill-auditor/scripts/purgetss-class-index.mjs`; do not edit by hand. For naming rules and verification commands see [class-index.md](./class-index.md); for classes grouped by kind of value see [class-categories.md](./class-categories.md).
3
+ Every Titanium property that has PurgeTSS utility classes, with the classes that set it. Generated from `utilities.tss` (PurgeTSS 7.18.0) by `.claude/skills/titools-skill-auditor/scripts/purgetss-class-index.mjs`; do not edit by hand. For naming rules and verification commands see [class-index.md](./class-index.md); for classes grouped by kind of value see [class-categories.md](./class-categories.md).
4
4
 
5
5
  > Before suggesting ANY class, verify it exists: `grep -E "PATTERN" ./purgetss/styles/utilities.tss`
6
6
 
@@ -78,10 +78,10 @@ A property set inside `font` or `animationProperties` is listed with its contain
78
78
  | `animationProperties.close` | `opacity-to-0`, `opacity-to-100`, `toggle-visible` | 3 | Animation | — |
79
79
  | `animationProperties.close` | `zoom-*` | 30 | Animation | — |
80
80
  | `animationProperties.complete` | `zoom-*` | 30 | Animation | — |
81
- | `animationProperties.keepZIndex` | `snap-back`, `snap-back-false`, `snap-center`, `snap-center-false`, `snap-magnet`, `snap-magnet-false`, `keep-z-index`, `keep-z-index-false` | 8 | Animation | — |
81
+ | `animationProperties.keepZIndex` | `snap-back`, `snap-back-false`, `snap-center`, `snap-center-false`, `keep-z-index`, `keep-z-index-false` | 6 | Animation | — |
82
82
  | `animationProperties.open` | `opacity-to-0`, `opacity-to-100`, `toggle-visible` | 3 | Animation | — |
83
83
  | `animationProperties.open` | `zoom-*` | 30 | Animation | — |
84
- | `animationProperties.snap` | `snap-back`, `snap-back-false`, `snap-center`, `snap-center-false`, `snap-magnet`, `snap-magnet-false`, `keep-z-index`, `keep-z-index-false` | 8 | Animation | — |
84
+ | `animationProperties.snap` | `snap-back`, `snap-back-false`, `snap-center`, `snap-center-false`, `keep-z-index`, `keep-z-index-false` | 6 | Animation | — |
85
85
  | `animationStyle` | `animation-style-*` | 14 | ListViewAnimationProperties, TableViewAnimationProperties, closeWindowParams | iOS only |
86
86
  | `appSupportsShakeToEdit` | `app-supports-shake-to-edit`, `app-supports-shake-to-edit-false` | 2 | iOS | — |
87
87
  | `arrowDirection` | `arrow-direction-*` | 11 | CameraOptionsType, PhotoGalleryOptionsType, MenuPopupShowParams, iPad.Popover | some variants platform-only |
@@ -388,7 +388,7 @@ A property set inside `font` or `animationProperties` is listed with its contain
388
388
  | `keyboardDisplayRequiresUserAction` | `keyboard-display-requires-user-action`, `keyboard-display-requires-user-action-false` | 2 | WebView | — |
389
389
  | `keyboardToolbarColor` | `keyboard-toolbar-*` | 245 | TextArea, TextField | — |
390
390
  | `keyboardToolbarHeight` | `keyboard-toolbar-h-*` | 35 | TextArea, TextField | — |
391
- | `keyboardType` | `keyboard-type`, `keyboard-type-*` | 14 | AlertDialog, SearchBar, TextArea, TextField | — |
391
+ | `keyboardType` | `keyboard-type`, `keyboard-type-*` | 11 | AlertDialog, SearchBar, TextArea, TextField | — |
392
392
  | `keyboardVisible` | `keyboard-visible`, `keyboard-visible-false` | 2 | Ti.App | — |
393
393
  | `kind` | `kind-contacts-organization`, `kind-contacts-person` | 2 | Ti.App.iOS.SearchableItemAttributeSet, Ti.Contacts.Person | — |
394
394
  | `largeTitleDisplayMode` | `large-title-display-mode-automatic`, `large-title-display-mode-always`, `large-title-display-mode-never` | 3 | NavigationWindow, TabGroup, Window, iOS.SplitWindow | iOS only |
@@ -422,7 +422,7 @@ A property set inside `font` or `animationProperties` is listed with its contain
422
422
  | `locationServicesEnabled` | `location-services-enabled`, `location-services-enabled-false` | 2 | Ti.Geolocation | — |
423
423
  | `lockScreenSetting` | `lock-screen-setting-not-supported`, `lock-screen-setting-enabled`, `lock-screen-setting-disabled` | 3 | GetUserNotificationSettings | iOS only |
424
424
  | `lockscreenVisibility` | `lockscreen-visibility-private`, `lockscreen-visibility-public`, `lockscreen-visibility-secret` | 3 | Ti.Android.NotificationChannel | Android only |
425
- | `loginKeyboardType` | `login-keyboard-type`, `login-keyboard-type-*` | 14 | AlertDialog | — |
425
+ | `loginKeyboardType` | `login-keyboard-type`, `login-keyboard-type-*` | 11 | AlertDialog | — |
426
426
  | `loginReturnKeyType` | `login-return-key-type-*` | 12 | AlertDialog | — |
427
427
  | `looping` | `looping`, `looping-false` | 2 | Ti.Media.Sound | — |
428
428
  | `mainFrameOnly` | `main-frame-only`, `main-frame-only-false` | 2 | UserScriptParams | — |
@@ -503,7 +503,7 @@ A property set inside `font` or `animationProperties` is listed with its contain
503
503
  | `pagingControlTimeout` | `paging-control-timeout-*` | 22 | ScrollableView | — |
504
504
  | `paragraphSpacingAfter` | `paragraph-spacing-after-*` | 64 | ParagraphAttribute | — |
505
505
  | `paragraphSpacingBefore` | `paragraph-spacing-before-*` | 64 | ParagraphAttribute | — |
506
- | `passwordKeyboardType` | `password-keyboard-type`, `password-keyboard-type-*` | 14 | AlertDialog | — |
506
+ | `passwordKeyboardType` | `password-keyboard-type`, `password-keyboard-type-*` | 11 | AlertDialog | — |
507
507
  | `passwordMask` | `password-mask`, `password-mask-false` | 2 | TextField | — |
508
508
  | `passwordReturnKeyType` | `password-return-key-type-*` | 12 | AlertDialog | — |
509
509
  | `pathOnly` | `path-only`, `path-only-false` | 2 | PhotoGalleryOptionsType | — |
@@ -1,7 +1,7 @@
1
1
  # PurgeTSS Class Index
2
2
 
3
3
  <!-- GENERATED:counts START -->
4
- **Generated from `utilities.tss` (PurgeTSS 7.17.1): 23,343 unique classes, 403 first segments, 620 Titanium properties.** Counts grow with each Titanium SDK and icon-font release.
4
+ **Generated from `utilities.tss` (PurgeTSS 7.18.0): 23,332 unique classes, 403 first segments, 620 Titanium properties.** Counts grow with each Titanium SDK and icon-font release.
5
5
  <!-- GENERATED:counts END -->
6
6
 
7
7
  Before suggesting ANY class, verify it exists:
@@ -258,7 +258,7 @@ The rest of this document collects conventions, prohibitions, and insights surfa
258
258
 
259
259
  ## All First Segments (Alphabetical)
260
260
 
261
- > **NOTE**: v7.4.0 introduced `snap-back`, `snap-back-false`, `snap-center`, `snap-center-false`, `snap-magnet`, `snap-magnet-false`, `keep-z-index`, and `keep-z-index-false`. The current runtime implements back, center, and touch-start z-index preservation but does not read `snap.magnet`; do not suggest the generated magnet classes as working behavior. v7.5.3 added `font-sans`, `font-serif`, and `font-mono`.
261
+ > **NOTE**: v7.4.0 introduced `snap-back`, `snap-back-false`, `snap-center`, `snap-center-false`, `snap-magnet`, `snap-magnet-false`, `keep-z-index`, and `keep-z-index-false`. The runtime never read `snap.magnet`, and v7.18.0 removed `snap-magnet` and `snap-magnet-false`. v7.5.3 added `font-sans`, `font-serif`, and `font-mono`.
262
262
 
263
263
 
264
264
  <!-- GENERATED:prefixes START -->
@@ -346,7 +346,7 @@ purgetss images background/ # re-process one subfolder
346
346
  | `--ios` | Only emit iPhone scale variants. Mutually exclusive with `--android`. |
347
347
  | `--format <ext>` | Convert all outputs to `webp`, `jpeg`, `png`, `avif`, `gif`, or `tiff`. Default: keep source format. |
348
348
  | `--quality <n>` | Quality `0-100` for `webp`, `jpeg`, `avif` and `tiff`. PNG and GIF ignore it. Default `85`. |
349
- | `--width <n>` | (v7.8.0) Pin Android `mdpi` (= iPhone `@1x`) to `<n>` pixels wide. Larger scales derive as ×1.5, ×2, ×3, ×4 from that base; height stays proportional to the source's aspect ratio. Integer in `[1, 8192]`. |
349
+ | `--width <n>` | (v7.8.0) Pin Android `mdpi` (= iPhone `@1x`) to `<n>` pixels wide. Larger scales derive as ×1.5, ×2, ×3, ×4 from that base; height stays proportional to the source's aspect ratio. Integer in `[1, 1024]`. |
350
350
  | `--opacity <n>` | (v7.10.0) Multiply alpha of every density by `n/100`. Integer in `[0, 100]`. With `--format jpeg`, alpha flattens on white. |
351
351
  | `--padding <n>` | (v7.10.0) Shrink the rendered image inside each density canvas by `n%` symmetric borders. Integer in `[0, 40]`. |
352
352
  | `--output <relpath>` | (v7.10.0) Override the basename and subpath relative to each platform's `images/` root. |
@@ -458,7 +458,7 @@ purgetss il [-v=fa,mi,ms,f7] [-m] [-s]
458
458
  | `-m, --module` | Copy the matching CommonJS module into `app/lib/` (Alloy) or `Resources/lib/` (Classic). |
459
459
  | `-s, --styles` | Alloy only: copy official `.tss` sources into `purgetss/styles/` for reference. Classic skips this output. |
460
460
 
461
- Vendor aliases: `fa`/`fontawesome`, `mi`/`materialicons`, `ms`/`materialsymbol`, `f7`/`framework7`.
461
+ Vendor aliases: `fa`/`fontawesome`, `mi`/`materialicons`, `ms`/`materialsymbol`/`materialsymbols` (v7.18.0), `f7`/`framework7`. An unknown value stops the command before it writes anything and lists the valid ones (v7.18.0).
462
462
 
463
463
  Every installed module exposes `families.default`. Direct variant aliases are `solid`/`regular`/`brands` for Font Awesome; `regular`/`outlined`/`round`/`sharp`/`twoTone` for Material Icons; `outlined`/`rounded`/`sharp` for Material Symbols; and `fontFamily` for Framework7.
464
464
 
@@ -123,7 +123,7 @@ classes: [
123
123
  // Arbitrary values use parentheses notation
124
124
  classes: [
125
125
  'w-(160)', // Custom width
126
- 'h-(12.5rem)', // Custom height with a unit (not px: a px suffix stops the build)
126
+ 'h-(12.5rem)', // Custom height with a unit
127
127
  'bg-(#3b82f6)', // Custom hex color
128
128
  'm-(10dp)', // Custom margin with unit
129
129
  'border-(2)' // Custom border width
@@ -265,7 +265,7 @@ function createFormField(fieldType, options) {
265
265
  >
266
266
  > - `$` is the controller instance, so `$.UI.create()` is not available in a plain `app/lib/` CommonJS module, and PurgeTSS does not scan `app/lib/` for classes.
267
267
  > - Each class list is written out in full under `classes:`. A shared `baseClasses` array spread into `classes: [...baseClasses, ...]` is invisible to the scanner: spread elements are skipped and the array itself is not under a `classes:` key, so those classes would be purged from `app.tss`.
268
- > - `px-4` sets `padding`, which exists only on `Ti.UI.TextField`, `Ti.UI.TextArea` (Android and iOS) and `Ti.UI.Android.CardView` (apidoc 13_4_1_GA). The `// padding - Android Only` comment in `utilities.tss` is inaccurate for the two text inputs.
268
+ > - `px-4` sets `padding`, which exists only on `Ti.UI.TextField`, `Ti.UI.TextArea` (Android and iOS) and `Ti.UI.Android.CardView` (apidoc 13_4_1_GA).
269
269
 
270
270
  ### Example 2: Dynamic List Items
271
271
 
@@ -83,7 +83,7 @@ The official source organizes the grid utilities into these categories. The stru
83
83
 
84
84
  ### Row Placement Utilities
85
85
 
86
- The official docs list these as `start`, `end`, and `center`, but no classes with those names exist in `utilities.tss`. The grid alignment classes PurgeTSS generates are:
86
+ The grid alignment classes PurgeTSS generates are:
87
87
 
88
88
  | Class | Generated rule |
89
89
  | -------------- | ----------------------------------------------- |