npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@salesforce-ux/design-system-markup

v2.0.4

Published

This is a markup generator and validator. Currently it is used by previewer and design-system-site to apply modifiers to html. It is also used by previewer, design-system-internal, and chrome-ext for validation.

Downloads

94

Readme

Design System Markup

This is a markup generator and validator. Currently it is used by previewer and design-system-site to apply modifiers to html. It is also used by previewer, design-system-internal, and chrome-ext for validation.

Usage

npm install @saleforce-ux/design-system-markup

Validation

const {createValidator} = require('./server') // or require('./browser')

const validations = [
  {selector: '.slds-button', restrict: 'button, a'},
  {selector: '.slds-button--brand', restrict: '.slds-button'},
  {selector: '.slds-button--reset', restrict: '[class~=slds-button]'}
]

const validate = createValidator(validations)

const html = `
  <div>
    <span class="slds-button" />
  </div>
`

validate(html)
// [ { selector: '.slds-button',
//  restrict: 'button, a',
//  element: '<span class="slds-button">',
//  valid: false,
//  lines: [ 1 ] } ]

The only non-self explanitory part is that lines is an array of occurences.

Modifier application

const {applyModifiers} = require('../server')

const modifiers = [
  {selector: '.slds-button', restrict: 'button, a'},
  {selector: '.slds-button--reset', restrict: '[class~=slds-button]'},
  {selector: '.slds-button--brand', restrict: '.slds-button'},
  {selector: '.slds-button--destructive', restrict: '.slds-button'}
]

const html = `
  <button class="slds-button" />
`
const results = applyModifiers([modifiers[2]], html)
results.markup
// <button class="slds-button slds-button--brand"></button>


const results1 = removeModifiers([modifiers[0]], html)
results1.markup
// <button></button>

Modifiers is an array of selector/restrict pairs. Selectors apply to their restrict (assertion selector).

Browser/Server

This project includes an adapter to pair cheerio with a browser DOM.

Validation code walkthrough

  1. We set up commentsBySelector which is a map of every selector (even , separated ones) pointing to a list of matching comments. (e.g. ".slds-button, button" => Map({button: comments, .slds-button: comments}))

  2. We partition commentsBySelector into two submaps (commentsByClass and commentsByFancy) by matching .slds- on each key

  3. To validate an element

  • Validate normal slds selectors
    • Extract classNames off the element
    • Try to get the comment corresponding to the className i.e. that is part of our commentsBySelector i.e. part of our system
    • For each comment, get the restrict and use it on the element, and return a list of results: {valid: false, element, restrict} || null, but keep the first success since there may be many comments with the same selector.
  • Validate the "fancy" selectors
    • hack: remove things that break cheerio
    • throw away the map structure and just get the comments since we don't need it
    • For every comment in "fancy", apply the selector to the dom find all elements
    • validate like above where we just apply the restrict to each element found and keep the first success
  • Finally filter only the invalid, make the elements html, and add line numbers
  1. To validate the whole tree
  • Validate the root, then flatMap validate the children