
Research
Malicious fezbox npm Package Steals Browser Passwords from Cookies via Innovative QR Code Steganographic Technique
A malicious package uses a QR code as steganography in an innovative technique.
@herb-tools/tailwind-class-sorter
Advanced tools
Standalone Tailwind CSS class sorter with Prettier plugin compatibility, extracted from tailwindlabs/prettier-plugin-tailwindcss
Package: @herb-tools/tailwind-class-sorter
A standalone Tailwind CSS class sorter that automatically sorts classes based on the recommended class order.
This package is a fork of the original prettier-plugin-tailwindcss
by Tailwind Labs, modified to provide standalone class sorting functionality for @herb-tools/formatter
and other use cases. The core sorting logic and algorithms are from the original Tailwind Labs implementation.
@herb-tools/formatter
- Designed to work seamlessly with the Herb ecosystemnpm install -D @herb-tools/tailwind-class-sorter
sortTailwindClasses(classStr, options?)
Sorts a string of space-separated Tailwind CSS classes.
import { sortTailwindClasses } from '@herb-tools/tailwind-class-sorter'
const result = await sortTailwindClasses('px-4 bg-blue-500 text-white rounded py-2')
// Result: 'rounded bg-blue-500 px-4 py-2 text-white'
Parameters:
classStr
(string): Space-separated CSS classesoptions?
(SortTailwindClassesOptions): Configuration optionsReturns: Promise<string>
- Sorted class string
sortTailwindClassList(classList, options?)
Sorts an array of Tailwind CSS classes.
import { sortTailwindClassList } from '@herb-tools/tailwind-class-sorter'
const result = await sortTailwindClassList(['px-4', 'bg-blue-500', 'text-white'])
// Result: { classList: ['bg-blue-500', 'px-4', 'text-white'], removedIndices: Set() }
Parameters:
classList
(string[]): Array of CSS classesoptions?
(SortTailwindClassesOptions): Configuration optionsReturns: Promise<{ classList: string[], removedIndices: Set<number> }>
- Sorted classes and removed duplicate indices
TailwindClassSorter
classA reusable class sorter that holds a context for efficient, synchronous sorting. Ideal when you need to sort classes multiple times with the same configuration.
import { TailwindClassSorter } from '@herb-tools/tailwind-class-sorter'
const sorter = await TailwindClassSorter.fromConfig({
tailwindConfig: './tailwind.config.js'
})
const result1 = sorter.sortClasses('px-4 bg-blue-500 text-white')
const result2 = sorter.sortClasses('py-2 bg-red-500 text-black')
Static Methods:
TailwindClassSorter.fromConfig(options?)
: Creates sorter from config file (async)Constructor:
new TailwindClassSorter(contextContainer, options?)
: Creates sorter from pre-loaded context (sync)Instance Methods:
sortClasses(classStr, overrideOptions?)
: Sort classes synchronouslysortClassList(classList, overrideOptions?)
: Sort class array synchronouslygetContext()
: Get the underlying context containergetOptions()
: Get current configuration optionssortClasses(classStr, { env, ...options })
Low-level function for sorting with a pre-configured environment.
sortClassList(classList, { env, removeDuplicates })
Low-level function for sorting class arrays with a pre-configured environment.
getTailwindConfig(options)
Loads and configures Tailwind CSS context.
The SortTailwindClassesOptions
interface supports the following options:
interface SortTailwindClassesOptions {
/** Path to the Tailwind config file */
tailwindConfig?: string
/** Path to the CSS stylesheet used by Tailwind CSS (v4+) */
tailwindStylesheet?: string
/** Preserve whitespace around Tailwind classes when sorting */
tailwindPreserveWhitespace?: boolean
/** Preserve duplicate classes inside a class list when sorting */
tailwindPreserveDuplicates?: boolean
/** Base directory for resolving config files (defaults to process.cwd()) */
baseDir?: string
}
import { sortTailwindClasses } from '@herb-tools/tailwind-class-sorter'
const sorted = await sortTailwindClasses('px-4 bg-blue-500 text-white rounded py-2')
// Result: 'rounded bg-blue-500 px-4 py-2 text-white'
const sorted = await sortTailwindClasses(
'px-4 bg-custom-primary text-white py-2',
{
tailwindConfig: './tailwind.config.js'
}
)
const sorted = await sortTailwindClasses(
'px-4 bg-neon-pink text-brand-primary py-2',
{
tailwindStylesheet: './theme.css'
}
)
const sorted = await sortTailwindClasses(
'px-4 bg-blue-500 px-4 text-white',
{
tailwindPreserveDuplicates: true,
tailwindPreserveWhitespace: true
}
)
// Result: 'px-4 bg-blue-500 px-4 text-white'
import { sortTailwindClassList } from '@herb-tools/tailwind-class-sorter'
const { classList, removedIndices } = await sortTailwindClassList(
['px-4', 'bg-blue-500', 'px-4', 'text-white'],
{ tailwindConfig: './tailwind.config.js' }
)
// classList: ['bg-blue-500', 'px-4', 'text-white']
// removedIndices: Set([2]) - duplicate px-4 at index 2 was removed
For scenarios where you need to sort many class strings with the same configuration, use the TailwindClassSorter
class for better performance:
import { TailwindClassSorter } from '@herb-tools/tailwind-class-sorter'
const sorter = await TailwindClassSorter.fromConfig({
tailwindConfig: './tailwind.config.js',
tailwindPreserveDuplicates: false
})
const components = [
'px-4 bg-blue-500 text-white py-2',
'mx-auto flex items-center justify-center',
'border-2 border-gray-300 rounded-lg shadow-sm'
]
const sortedComponents = components.map(classes => sorter.sortClasses(classes))
You can also create a sorter from a pre-loaded context:
import { TailwindClassSorter, getTailwindConfig } from '@herb-tools/tailwind-class-sorter'
const contextContainer = await getTailwindConfig({
tailwindConfig: './tailwind.config.js'
})
const sorter = new TailwindClassSorter(contextContainer, {
tailwindPreserveDuplicates: false
})
const result = sorter.sortClasses('px-4 px-4 bg-blue-500 text-white')
You can override options on a per-sort basis without creating new instances:
const sorter = await TailwindClassSorter.fromConfig({
tailwindPreserveDuplicates: false
})
const normal = sorter.sortClasses('px-4 px-4 bg-blue-500')
const preserved = sorter.sortClasses('px-4 px-4 bg-blue-500', {
tailwindPreserveDuplicates: true
})
The original prettier-plugin-tailwindcss
is designed as a Prettier plugin. This package extracts the sorting functionality for use in other contexts like @herb-tools/formatter
, build tools, or any JavaScript application that needs Tailwind class sorting.
For the full Prettier plugin experience, use the original package.
MIT License - see LICENSE for details.
Original work Copyright (c) Tailwind Labs Inc. Modified work Copyright (c) Marco Roth
FAQs
Standalone Tailwind CSS class sorter with Prettier plugin compatibility, extracted from tailwindlabs/prettier-plugin-tailwindcss
We found that @herb-tools/tailwind-class-sorter demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
A malicious package uses a QR code as steganography in an innovative technique.
Research
/Security News
Socket identified 80 fake candidates targeting engineering roles, including suspected North Korean operators, exposing the new reality of hiring as a security function.
Application Security
/Research
/Security News
Socket detected multiple compromised CrowdStrike npm packages, continuing the "Shai-Hulud" supply chain attack that has now impacted nearly 500 packages.