purgetss 7.4.0 → 7.5.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/README.md CHANGED
@@ -10,62 +10,18 @@
10
10
 
11
11
  </div>
12
12
 
13
- **PurgeTSS** is a toolkit for building mobile apps with the [Titanium framework](https://titaniumsdk.com). It adds practical utilities to speed up styling and reduce repeated setup work.
14
-
15
- It includes utility classes, icon font support, an Animation module, a simple grid system, and the `shades` command for generating custom colors.
16
-
17
- If you build UI-heavy screens, PurgeTSS helps you move faster without hand-writing long TSS files.
13
+ **PurgeTSS** is a toolkit for building mobile apps with the [Titanium framework](https://titaniumsdk.com). It provides utility classes, icon font support, an Animation module, a grid system, and the `shades` command for generating custom colors.
18
14
 
19
15
  ---
20
16
 
21
- ## What's New in v7.3.x
22
-
23
- **File rename and improved error handling.** PurgeTSS v7.3 renames `tailwind.tss` to `utilities.tss` to reflect the project's standalone identity, and adds XML syntax validation to catch errors early.
24
-
25
- ### Breaking changes
26
-
27
- - **File rename**: Output file is now `utilities.tss` instead of `tailwind.tss`
28
- - Generated file: `purgetss/styles/utilities.tss` (was `purgetss/styles/tailwind.tss`)
29
- - Distribution file: `dist/utilities.tss` (was `dist/tailwind.tss`)
30
-
31
- ### Major improvements
32
-
33
- - **XML syntax validation**: Catches common Alloy XML malformations before processing
34
- - Detects missing opening `<` brackets (e.g., `Label id=` instead of `<Label id=`)
35
- - Shows detailed error messages with line numbers, context preview, and fix suggestions
36
- - Saves debugging time by catching errors early in the build process
37
-
38
- - **Classic Titanium compatibility**: `deviceInfo()` function now works in both Alloy and Classic projects
39
- - Removed dependency on `Alloy.isTablet`/`Alloy.isHandheld`
40
- - Uses platform-based detection instead
41
-
42
- ### Migration guide
43
-
44
- If you have references to `tailwind.tss` in your project, update them to `utilities.tss`:
45
-
46
- ```bash
47
- # Update any custom scripts or paths
48
- # From: purgetss/styles/tailwind.tss
49
- # To: purgetss/styles/utilities.tss
50
- ```
51
-
52
- For most users, upgrading is straightforward:
53
- ```bash
54
- npm install -g purgetss@latest
55
- ```
56
-
57
- ---
58
-
59
- Here are its main functionalities:
60
-
61
- - **Utility-First Classes**: PurgeTSS ships with 21,000+ utility classes, so you get a lot of styling options out of the box.
62
- - **Efficient style management**: It parses all XML files to create a clean `app.tss` containing only the classes used in your project, reducing size and improving performance.
63
- - **Customization and JIT classes**: You can customize default classes via a config file and use JIT classes for arbitrary values inside views.
64
- - **Icon fonts integration**: Use icon fonts such as Font Awesome, Material Icons, Material Symbols, and Framework7-Icons in Buttons and Labels.
65
- - **`fonts.tss` generation**: The `build-fonts` command creates a `fonts.tss` file with class definitions and fontFamily selectors for regular and icon fonts, with simplified options for filenames and icon prefixes.
66
- - **`shades` command**: Generate custom color shades from a hex color without external tools.
67
- - **Animation module**: Apply basic 2D matrix animations or transformations to elements or arrays of elements.
68
- - **Grid system**: A two-dimensional grid system to align and distribute elements within views.
17
+ - 21,000+ utility classes for styling Titanium views
18
+ - Parses XML files to generate a clean `app.tss` with only the classes your project uses
19
+ - Customizable defaults via `config.cjs`, with JIT classes for arbitrary values
20
+ - Icon font support: Font Awesome, Material Icons, Material Symbols, Framework7-Icons
21
+ - `build-fonts` command generates `fonts.tss` with class definitions and fontFamily selectors
22
+ - `shades` command generates color shades from any hex color
23
+ - Animation module for 2D matrix animations on views or arrays of views
24
+ - Grid system for aligning and distributing elements within views
69
25
 
70
26
  ---
71
27
 
@@ -83,13 +39,22 @@ You can use any position, size, color, opacity, or transformation class from `ut
83
39
 
84
40
  ### Available methods
85
41
 
86
- | Method | Description |
87
- | --------------------------------------- | --------------------------------------------------------------------------------------------- |
88
- | `play(views, cb)` / `toggle(views, cb)` | Animate views from current state to the animation state. Toggles `open`/`close` on each call. |
89
- | `open(views, cb)` | Explicitly run the `open` state animation. |
90
- | `close(views, cb)` | Explicitly run the `close` state animation. |
91
- | `apply(views, cb)` | Apply properties instantly without animation. |
92
- | `draggable(views)` | Make a view or array of views draggable inside their parent. |
42
+ | Method | Description |
43
+ | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
44
+ | `play(views, cb)` / `toggle(views, cb)` | Animate views from current state to the animation state. Toggles `open`/`close` on each call. |
45
+ | `open(views, cb)` | Explicitly run the `open` state animation. |
46
+ | `close(views, cb)` | Explicitly run the `close` state animation. |
47
+ | `apply(views, cb)` | Apply properties instantly without animation. |
48
+ | `draggable(views)` | Make a view or array of views draggable inside their parent. |
49
+ | `undraggable(views)` | Remove draggable behavior and clean up all listeners. |
50
+ | `detectCollisions(views, dragCB, dropCB)` | Enable collision detection on draggable views with hover and drop callbacks. |
51
+ | `swap(view1, view2)` | Animate two views exchanging positions. Auto-normalizes position from margins/right/center via `view.rect`. Inherits `duration`, `delay`, `curve`; fallback: 200ms. |
52
+ | `sequence(views, cb)` | Animate views one after another. Callback fires after the last view. |
53
+ | `shake(view, intensity)` | Bidirectional shake animation for error feedback. Inherits `duration`, `delay`; fallback: 400ms. Default intensity: 10px. |
54
+ | `pulse(view, count)` | Scale-up-and-back pulse animation. Scale from Animation object (default 1.2x). Count: number of pulses (default 1). |
55
+ | `snapTo(view, targets)` | Snap a view to the nearest target by center distance. Auto-normalizes target position. Inherits `duration`, `delay`, `curve`; fallback: 200ms. |
56
+ | `reorder(views, newOrder)` | Animate views to new positions based on index mapping. Auto-normalizes positions. Inherits `duration`, `delay`, `curve`; fallback: 200ms. |
57
+ | `transition(views, layouts)` | Multi-view layout transitions using `Matrix2D.translate().rotate().scale()`. Layout properties: `translation`, `rotate`, `scale`, `zIndex`. Compatible with TiDesigner presets. Views without a layout entry fade out; returning views fade in. |
93
58
 
94
59
  ### Callback event object
95
60
 
@@ -144,6 +109,114 @@ $.myAnimation.draggable([$.card1, $.card2])
144
109
 
145
110
  Use `bounds` to restrict movement, and `drag`/`drop` modifiers for drag-state animations. Use `vertical-constraint` or `horizontal-constraint` classes to limit the drag axis.
146
111
 
112
+ ### Collision detection
113
+
114
+ After calling `draggable()`, you can enable collision detection to know when a dragged view overlaps another:
115
+
116
+ ```js
117
+ $.myAnimation.draggable(views)
118
+ $.myAnimation.detectCollisions(views, onHover, onDrop)
119
+ ```
120
+
121
+ **`dragCB(source, target)`** is called during drag:
122
+ - `target` is the view under the drag center, or `null` when leaving all targets
123
+ - Use this to show visual feedback (highlights, borders, scaling)
124
+
125
+ **`dropCB(source, target)`** is called on drop:
126
+ - `target` is the view where the source was released
127
+ - If no target is found, the source automatically snaps back to its original position with a 200ms animation
128
+
129
+ ### Swap animation
130
+
131
+ Animate two views exchanging positions:
132
+
133
+ ```js
134
+ $.myAnimation.swap(view1, view2)
135
+ ```
136
+
137
+ - Inherits `duration`, `delay`, and `curve` from the Animation object's classes
138
+ - Falls back to 200ms duration, 0ms delay, and ease-in-out curve if not set
139
+ - Handles iOS transform reset automatically
140
+ - Temporarily raises z-index so views animate above siblings
141
+ - Updates internal `_originLeft`/`_originTop` for subsequent drag operations
142
+
143
+ ### Sequence animation
144
+
145
+ Animate views one after another (unlike `play(array)` which runs them in parallel):
146
+
147
+ ```js
148
+ $.fadeIn.sequence([$.title, $.subtitle, $.button], () => {
149
+ console.log('All views animated')
150
+ })
151
+ ```
152
+
153
+ - Each view fully completes before the next starts
154
+ - Callback fires once after the last view
155
+ - Respects `open`/`close` state (set once for the entire sequence)
156
+
157
+ ### Shake animation
158
+
159
+ Quick horizontal shake for error feedback, using native `autoreverse` + `repeat` for smooth performance:
160
+
161
+ ```js
162
+ $.myAnimation.shake($.loginButton) // default intensity: 10px
163
+ $.myAnimation.shake($.input, 6) // subtle: 6px
164
+ $.myAnimation.shake($.errorLabel, 20) // strong: 20px
165
+ ```
166
+
167
+ ### Snap to nearest target
168
+
169
+ After dragging, snap a view to the closest target by center-to-center distance:
170
+
171
+ ```js
172
+ const matched = $.myAnimation.snapTo(draggedView, slotViews)
173
+ if (matched) {
174
+ console.log('Snapped to:', matched.id)
175
+ }
176
+ ```
177
+
178
+ ### Reorder animation
179
+
180
+ Animate an array of views to new positions based on index mapping:
181
+
182
+ ```js
183
+ // Reverse order: view[0] goes to position of view[2], view[2] to position of view[0]
184
+ $.myAnimation.reorder(cardViews, [2, 1, 0])
185
+ ```
186
+
187
+ - All views animate simultaneously
188
+ - Captures positions before animating to avoid conflicts
189
+
190
+ ### Removing draggable behavior
191
+
192
+ Remove draggable behavior and clean up all event listeners:
193
+
194
+ ```js
195
+ $.myAnimation.undraggable(cardViews)
196
+ ```
197
+
198
+ ### Property inheritance
199
+
200
+ The `swap`, `reorder`, `snapTo`, and `shake` methods inherit animation properties from the `<Animation>` object's classes. This means you can configure behavior declaratively in XML:
201
+
202
+ ```xml
203
+ <Animation id="myAnim" module="purgetss.ui" class="curve-animation-ease-out delay-100 duration-150" />
204
+ ```
205
+
206
+ | Property | `play`/`toggle`/`open`/`close`/`sequence` | `swap`/`reorder`/`snapTo` | `shake` |
207
+ | ------------- | :---------------------------------------: | :-----------------------: | :-----------------: |
208
+ | `duration` | ✅ | ✅ | ✅ (÷6) |
209
+ | `delay` | ✅ | ✅ | ✅ |
210
+ | `curve` | ✅ | ✅ | fixed `EASE_IN_OUT` |
211
+ | `autoreverse` | ✅ | — | fixed `true` |
212
+ | `repeat` | ✅ | — | fixed `3` |
213
+
214
+ Fallback defaults when not set: `swap`/`reorder`/`snapTo` → 200ms; `shake` → 400ms. All animation timing is controlled declaratively via the `<Animation>` object's classes.
215
+
216
+ - Removes touch and orientation listeners
217
+ - Removes views from collision detection registry
218
+ - Cleans up internal tracking properties
219
+
147
220
  ### Utility classes for animations
148
221
 
149
222
  | Class pattern | Description |
@@ -167,7 +240,57 @@ Use `bounds` to restrict movement, and `drag`/`drop` modifiers for drag-state an
167
240
 
168
241
  See the full documentation at [purgetss.com/docs/animation-module/introduction](https://purgetss.com/docs/animation-module/introduction).
169
242
 
170
- In short, PurgeTSS keeps styling consistent and removes a lot of repetitive UI setup work.
243
+ ---
244
+
245
+ ## Customizing default components
246
+
247
+ PurgeTSS sets defaults for three components out of the box:
248
+
249
+ | Component | Default |
250
+ | ----------- | --------------------------------------- |
251
+ | `Window` | `backgroundColor: '#FFFFFF'` |
252
+ | `View` | `width: Ti.UI.SIZE, height: Ti.UI.SIZE` |
253
+ | `ImageView` | `hires: true` (iOS only) |
254
+
255
+ Override or extend them in `config.cjs` with `theme.extend`:
256
+
257
+ ```js
258
+ module.exports = {
259
+ theme: {
260
+ extend: {
261
+ Window: {
262
+ apply: 'exit-on-close-false bg-surface'
263
+ }
264
+ }
265
+ }
266
+ }
267
+ ```
268
+
269
+ If an applied class sets a property that already exists in the defaults (e.g., `bg-surface` vs `backgroundColor: '#FFFFFF'`), the applied value wins. Array-type properties like `extendEdges` and `orientationModes` use bracket notation (`[ ]`) in the generated output.
270
+
271
+ ### Shorthand and explicit forms
272
+
273
+ Both are equivalent:
274
+
275
+ ```js
276
+ // Shorthand
277
+ Window: { apply: 'exit-on-close-false' }
278
+
279
+ // Explicit
280
+ Window: { default: { apply: 'exit-on-close-false' } }
281
+ ```
282
+
283
+ Use the explicit form when you need platform-specific variants:
284
+
285
+ ```js
286
+ Button: {
287
+ default: { apply: 'text-xl' },
288
+ ios: { apply: 'font-bold' },
289
+ android: { apply: 'text-2xl font-semibold', color: 'red' }
290
+ }
291
+ ```
292
+
293
+ ---
171
294
 
172
295
  ### Visit the official documentation site at [purgetss.com](https://purgetss.com) to learn more.
173
296
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com
2
+ * Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com
3
3
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4
4
  */
5
5
 
@@ -169,6 +169,7 @@ const icons = {
169
169
  'chartColumn': '\ue0e3',
170
170
  'chartGantt': '\ue0e4',
171
171
  'clapperboard': '\ue131',
172
+ 'closedCaptioningSlash': '\ue135',
172
173
  'clover': '\ue139',
173
174
  'codeCompare': '\ue13a',
174
175
  'codeFork': '\ue13b',
@@ -489,12 +490,25 @@ const icons = {
489
490
  'pentagon': '\ue790',
490
491
  'nonBinary': '\ue807',
491
492
  'spiral': '\ue80a',
493
+ 'pictureInPicture': '\ue80b',
492
494
  'mobileVibrate': '\ue816',
493
495
  'singleQuoteLeft': '\ue81b',
494
496
  'singleQuoteRight': '\ue81c',
495
497
  'busSide': '\ue81d',
496
498
  'septagon': '\ue820',
497
499
  'heptagon': '\ue820',
500
+ 'aquarius': '\ue845',
501
+ 'aries': '\ue846',
502
+ 'cancer': '\ue847',
503
+ 'capricorn': '\ue848',
504
+ 'gemini': '\ue849',
505
+ 'leo': '\ue84a',
506
+ 'libra': '\ue84b',
507
+ 'pisces': '\ue84c',
508
+ 'sagittarius': '\ue84d',
509
+ 'scorpio': '\ue84e',
510
+ 'taurus': '\ue84f',
511
+ 'virgo': '\ue850',
498
512
  'martiniGlassEmpty': '\uf000',
499
513
  'glassMartini': '\uf000',
500
514
  'music': '\uf001',
@@ -1820,6 +1834,8 @@ const icons = {
1820
1834
  'torah': '\uf6a0',
1821
1835
  'toriiGate': '\uf6a1',
1822
1836
  'vihara': '\uf6a7',
1837
+ 'volume': '\uf6a8',
1838
+ 'volumeMedium': '\uf6a8',
1823
1839
  'volumeXmark': '\uf6a9',
1824
1840
  'volumeMute': '\uf6a9',
1825
1841
  'volumeTimes': '\uf6a9',
@@ -2138,6 +2154,44 @@ const icons = {
2138
2154
  'squareFigma': '\ue7e4',
2139
2155
  'tex': '\ue7ff',
2140
2156
  'duolingo': '\ue812',
2157
+ 'supportnow': '\ue833',
2158
+ 'torBrowser': '\ue838',
2159
+ 'typescript': '\ue840',
2160
+ 'squareDeskpro': '\ue844',
2161
+ 'circleZulip': '\ue851',
2162
+ 'julia': '\ue852',
2163
+ 'zulip': '\ue853',
2164
+ 'unison': '\ue854',
2165
+ 'boardGameGeek': '\ue855',
2166
+ 'bgg': '\ue855',
2167
+ 'koFi': '\ue856',
2168
+ 'kubernetes': '\ue857',
2169
+ 'postgresql': '\ue858',
2170
+ 'scaleway': '\ue859',
2171
+ 'venmo': '\ue85a',
2172
+ 'venmoV': '\ue85b',
2173
+ 'unrealEngine': '\ue85c',
2174
+ 'globaleaks': '\ue85d',
2175
+ 'solana': '\ue85e',
2176
+ 'threema': '\ue85f',
2177
+ 'forgejo': '\ue860',
2178
+ 'claude': '\ue861',
2179
+ 'gitee': '\ue863',
2180
+ 'xmpp': '\ue864',
2181
+ 'fediverse': '\ue865',
2182
+ 'tailwindCss': '\ue866',
2183
+ 'archLinux': '\ue867',
2184
+ 'svelte': '\ue868',
2185
+ 'huggingFace': '\ue869',
2186
+ 'leetcode': '\ue86a',
2187
+ 'openstreetmap': '\ue86b',
2188
+ 'ultralytics': '\ue86d',
2189
+ 'ultralyticsHub': '\ue86e',
2190
+ 'ultralyticsYolo': '\ue86f',
2191
+ 'obsidian': '\ue879',
2192
+ 'zoom': '\ue87b',
2193
+ 'vim': '\ue88a',
2194
+ 'symfonycasts': '\ue8ab',
2141
2195
  'squareTwitter': '\uf081',
2142
2196
  'twitterSquare': '\uf081',
2143
2197
  'squareFacebook': '\uf082',
@@ -1,4 +1,4 @@
1
- // Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com
1
+ // Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com
2
2
  // License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
3
3
 
4
4
  // Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons
@@ -145,6 +145,7 @@
145
145
  '.fa-chart-column': { text: '\ue0e3', title: '\ue0e3' }
146
146
  '.fa-chart-gantt': { text: '\ue0e4', title: '\ue0e4' }
147
147
  '.fa-clapperboard': { text: '\ue131', title: '\ue131' }
148
+ '.fa-closed-captioning-slash': { text: '\ue135', title: '\ue135' }
148
149
  '.fa-clover': { text: '\ue139', title: '\ue139' }
149
150
  '.fa-code-compare': { text: '\ue13a', title: '\ue13a' }
150
151
  '.fa-code-fork': { text: '\ue13b', title: '\ue13b' }
@@ -465,12 +466,25 @@
465
466
  '.fa-pentagon': { text: '\ue790', title: '\ue790' }
466
467
  '.fa-non-binary': { text: '\ue807', title: '\ue807' }
467
468
  '.fa-spiral': { text: '\ue80a', title: '\ue80a' }
469
+ '.fa-picture-in-picture': { text: '\ue80b', title: '\ue80b' }
468
470
  '.fa-mobile-vibrate': { text: '\ue816', title: '\ue816' }
469
471
  '.fa-single-quote-left': { text: '\ue81b', title: '\ue81b' }
470
472
  '.fa-single-quote-right': { text: '\ue81c', title: '\ue81c' }
471
473
  '.fa-bus-side': { text: '\ue81d', title: '\ue81d' }
472
474
  '.fa-septagon': { text: '\ue820', title: '\ue820' }
473
475
  '.fa-heptagon': { text: '\ue820', title: '\ue820' }
476
+ '.fa-aquarius': { text: '\ue845', title: '\ue845' }
477
+ '.fa-aries': { text: '\ue846', title: '\ue846' }
478
+ '.fa-cancer': { text: '\ue847', title: '\ue847' }
479
+ '.fa-capricorn': { text: '\ue848', title: '\ue848' }
480
+ '.fa-gemini': { text: '\ue849', title: '\ue849' }
481
+ '.fa-leo': { text: '\ue84a', title: '\ue84a' }
482
+ '.fa-libra': { text: '\ue84b', title: '\ue84b' }
483
+ '.fa-pisces': { text: '\ue84c', title: '\ue84c' }
484
+ '.fa-sagittarius': { text: '\ue84d', title: '\ue84d' }
485
+ '.fa-scorpio': { text: '\ue84e', title: '\ue84e' }
486
+ '.fa-taurus': { text: '\ue84f', title: '\ue84f' }
487
+ '.fa-virgo': { text: '\ue850', title: '\ue850' }
474
488
  '.fa-martini-glass-empty': { text: '\uf000', title: '\uf000' }
475
489
  '.fa-glass-martini': { text: '\uf000', title: '\uf000' }
476
490
  '.fa-music': { text: '\uf001', title: '\uf001' }
@@ -1796,6 +1810,8 @@
1796
1810
  '.fa-torah': { text: '\uf6a0', title: '\uf6a0' }
1797
1811
  '.fa-torii-gate': { text: '\uf6a1', title: '\uf6a1' }
1798
1812
  '.fa-vihara': { text: '\uf6a7', title: '\uf6a7' }
1813
+ '.fa-volume': { text: '\uf6a8', title: '\uf6a8' }
1814
+ '.fa-volume-medium': { text: '\uf6a8', title: '\uf6a8' }
1799
1815
  '.fa-volume-xmark': { text: '\uf6a9', title: '\uf6a9' }
1800
1816
  '.fa-volume-mute': { text: '\uf6a9', title: '\uf6a9' }
1801
1817
  '.fa-volume-times': { text: '\uf6a9', title: '\uf6a9' }
@@ -2114,6 +2130,44 @@
2114
2130
  '.fa-square-figma': { text: '\ue7e4', title: '\ue7e4' }
2115
2131
  '.fa-tex': { text: '\ue7ff', title: '\ue7ff' }
2116
2132
  '.fa-duolingo': { text: '\ue812', title: '\ue812' }
2133
+ '.fa-supportnow': { text: '\ue833', title: '\ue833' }
2134
+ '.fa-tor-browser': { text: '\ue838', title: '\ue838' }
2135
+ '.fa-typescript': { text: '\ue840', title: '\ue840' }
2136
+ '.fa-square-deskpro': { text: '\ue844', title: '\ue844' }
2137
+ '.fa-circle-zulip': { text: '\ue851', title: '\ue851' }
2138
+ '.fa-julia': { text: '\ue852', title: '\ue852' }
2139
+ '.fa-zulip': { text: '\ue853', title: '\ue853' }
2140
+ '.fa-unison': { text: '\ue854', title: '\ue854' }
2141
+ '.fa-board-game-geek': { text: '\ue855', title: '\ue855' }
2142
+ '.fa-bgg': { text: '\ue855', title: '\ue855' }
2143
+ '.fa-ko-fi': { text: '\ue856', title: '\ue856' }
2144
+ '.fa-kubernetes': { text: '\ue857', title: '\ue857' }
2145
+ '.fa-postgresql': { text: '\ue858', title: '\ue858' }
2146
+ '.fa-scaleway': { text: '\ue859', title: '\ue859' }
2147
+ '.fa-venmo': { text: '\ue85a', title: '\ue85a' }
2148
+ '.fa-venmo-v': { text: '\ue85b', title: '\ue85b' }
2149
+ '.fa-unreal-engine': { text: '\ue85c', title: '\ue85c' }
2150
+ '.fa-globaleaks': { text: '\ue85d', title: '\ue85d' }
2151
+ '.fa-solana': { text: '\ue85e', title: '\ue85e' }
2152
+ '.fa-threema': { text: '\ue85f', title: '\ue85f' }
2153
+ '.fa-forgejo': { text: '\ue860', title: '\ue860' }
2154
+ '.fa-claude': { text: '\ue861', title: '\ue861' }
2155
+ '.fa-gitee': { text: '\ue863', title: '\ue863' }
2156
+ '.fa-xmpp': { text: '\ue864', title: '\ue864' }
2157
+ '.fa-fediverse': { text: '\ue865', title: '\ue865' }
2158
+ '.fa-tailwind-css': { text: '\ue866', title: '\ue866' }
2159
+ '.fa-arch-linux': { text: '\ue867', title: '\ue867' }
2160
+ '.fa-svelte': { text: '\ue868', title: '\ue868' }
2161
+ '.fa-hugging-face': { text: '\ue869', title: '\ue869' }
2162
+ '.fa-leetcode': { text: '\ue86a', title: '\ue86a' }
2163
+ '.fa-openstreetmap': { text: '\ue86b', title: '\ue86b' }
2164
+ '.fa-ultralytics': { text: '\ue86d', title: '\ue86d' }
2165
+ '.fa-ultralytics-hub': { text: '\ue86e', title: '\ue86e' }
2166
+ '.fa-ultralytics-yolo': { text: '\ue86f', title: '\ue86f' }
2167
+ '.fa-obsidian': { text: '\ue879', title: '\ue879' }
2168
+ '.fa-zoom': { text: '\ue87b', title: '\ue87b' }
2169
+ '.fa-vim': { text: '\ue88a', title: '\ue88a' }
2170
+ '.fa-symfonycasts': { text: '\ue8ab', title: '\ue8ab' }
2117
2171
  '.fa-square-twitter': { text: '\uf081', title: '\uf081' }
2118
2172
  '.fa-twitter-square': { text: '\uf081', title: '\uf081' }
2119
2173
  '.fa-square-facebook': { text: '\uf082', title: '\uf082' }