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

soda-material

v0.0.27

Published

Modern lightweight React Component Library

Downloads

133

Readme

Soda

     

A React(>=18) component library that may follow Material Design 3 (a.k.a. Material You)

Features:

  • Less dependencies (bundled in npm package)
  • Follow the Material You design
  • Complete implementation of Material You components
  • Keyboard accessibility
  • Support both controlled and uncontrolled

[!WARNING]
Working in progress, API is unstable and can be changed in any time.
For production, you may want use the official material web component library or the MDUI library.

This is an experimental project, (best) browser support:
Chrome>=105, Safari>=15.4, Firefox>=121

The recommended browser is Chrome>=119

Installation

npm install soda-material
import React from 'react'
import ReactDOM from 'react-dom/client'
import 'soda-material/dist/style.css' // Note that you MUST import the style
import { Button } from 'soda-material'

ReactDOM.createRoot(document.getElementById('root')!).render(
    <React.StrictMode>
        <Button variant="outlined">Button</Button>
    </React.StrictMode>,
)

If bundle size is your concern, it's also possible to import only the specific component.

import 'soda-material/dist/style.css' // Still need to import the style in some where
import { Button } from 'soda-material/dist/components/button'
import { Select } from 'soda-material/dist/composition/Select'

export default function App() {
    return (
        <>
            <Button variant="text">Button</Button>
            <Select options={['one', 'two', 'three']}></Select>
        </>
    )
}

Next.js is also supported out of the box.

Documentation

See: https://soda.js.org

[!IMPORTANT]
Only components defined in the Material Design Docs will be put into src/components directory, these components do NOT include heavy logic.
Other necessary components or helpers can be found at src/composition directory.

[!NOTE]
Most components in src/components forward ref attribute for library interactivity.
If has, it will be the root DOM node of the entire component.
If not, it will be documented and will be checked if you use typescript.

Resources

Icons

This library use the MDI Icon Library
You can refer it at https://materialdesignicons.com/

import { mdiMagnify } from '@mdi/js'
import Icon from '@mdi/react'
import { IconButton } from 'soda-material'

const App = () => (
    <>
        <Icon path={mdiMagnify} size={1} />
        <IconButton path={mdiMagnify} />
    </>
)

A replacement is google fonts: https://fonts.google.com/icons

Fonts

It's highly recommended that you use a font that supports font-weight: 500,
as some component state requires it to behavior clear to user.

The easiest way is to use the Roboto font, just simply add a few lines of css code as below!

/* using Roboto */
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@100;200;300;400;500;700;900&display=swap');
* {
    font-family: 'Roboto', sans-serif;
}
/*
Tips:
Chinese user may prefer:
@import url('https://fonts.loli.net/css2?family=Roboto:wght@100;200;300;400;500;700;900&display=swap');
@import url('https://fonts.upset.dev/css2?family=Roboto:wght@100;200;300;400;500;700;900&display=swap');
@import url('https://fonts.font.im/css?family=Roboto:100,300,400,500,700,900');
@import url('https://fonts.bunny.net/css?family=roboto:100,300,400,500,700,900');
*/

/* using Google Sans */
@import url('https://fonts.googleapis.com/css2?family=Google+Sans:wght@100;200;300;400;500;700;900&display=swap');
* {
    font-family: 'Google Sans', sans-serif;
}

Theming

This library use the official material design css variable (--md-sys-color-<token>, at :root) to theming.
So you can simply overwrite them or use the @material/material-color-utilities package to apply theme.

// we also provide a series of wrapper function, making theming easier
import { applyThemeForSoda } from 'soda/dist/utils/theme'

// simply
applyThemeForSoda('#f82506')

// or
applyThemeForSoda(themeFromHexString('#f82506'), [
    {
        name: 'custom-1',
        value: argbFromHex('#ff0000'),
        blend: true,
    },
])

// or
function SelectThemeFromFileButton() {
    const onClick = async () => {
        const fileHandleArray = await window.showOpenFilePicker({
            types: [
                {
                    description: 'please choose an image',
                    accept: {
                        'image/*': ['.png', '.gif', '.jpeg', '.jpg', '.webp'],
                    },
                },
            ],
            multiple: false,
            excludeAcceptAllOption: true,
        })
        const file: File = await fileHandleArray[0].getFile()
        applyThemeForSoda(await themeFromImageOrFile(file)) // *
    }
    return <button onClick={onClick}>Select An Image</button>
}

zIndex

Some components have fixed boolean property, it's useful to set it to true.
When enabled, the component will become position: fixed.
Also, components have default zIndex value, but you can also set the zIndex
property to overwrite it, it also expose an inset property, which can be used
for controlling the position.

<Snackbar fixed open={true} zIndex={999} inset="auto 0 5rem">
    Fixed Snackbar
</Snackbar>

Currently, the default zIndex is:

| Component | zIndex | | ---------- | ------ | | snackbar | 1 | | app-bar | 1 | | navigation | 2 | | sheet | 3 |

TODO

  • [ ] ARIA support

  • [ ] More customizable CSS vars

  • [ ] Better React API & Better component abstraction

Development

npm install
npm run storybook

Naming convention:

  • a .tsx file with capitalized beginning is a react component (exports the same name, no default export)
  • a .scss file will use hyphen to separate component name in file name
  • in any css code, use underscore to separate component name, use hyphen to separate name segments