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

kassiopeia-tools

v1.7.1

Published

A package that brings together several tools used in the Kassiopeia project

Downloads

30

Readme

Kassiopeia Tools

Um pacote de ferramentas para facilitar sua vida no front-end. Utilizado na construção de minhas plataformas, resolvi exportar como lib.

Funcionalidades

  • Toaster (notificações)
  • Processamento de imagem (redimensionamento de imagem, transformação em webp ou jpeg e DataURL)
  • Validações (email, senha)
  • Animações CSS
  • Geração rápida de HTML
  • Popup

Documentação

NPM

Atenção! Evite usar o construtor das ferramentas, pois há a implementação do padrão Singleton. Use sempre o método static get.

Como instalar:

npm install kassiopeia-tools

OU

yarn add kassiopeia-tools

AnimationKassiopeiaTool

AnimationKassiopeiaTool é uma ferramenta que permite animar elementos HTML. Para tal, usamos a lib Animate.css.

Como usar?

import { AnimationKassiopeiaTool } from "kassiopeia-tools";

// Receba o singleton através do método static get
const anim = AnimationKassiopeiaTool.get();

A partir da instância, você terá vários métodos de animações, como:

anim.shakeX(element)

Os métodos de animações recebem os seguintes parâmetros: element: HTMLElement, focus?: boolean, time?: number

  • element: o elemento HTML a qual receberá a animação
  • focus: se você não informar um valor, focus por padrão é true. Ele indica se o element receberá focus através do método element.focus()
  • time: duração da animação em milissegundos. Por padrão é 810

Além dos métodos de animações, exitem:

  • destroy: método usado para remover fragmentos da ferramenta do seu HTML.
  • rebuild: Faz o oposto de destroy
  • clean: este, por sua vez, remove as animações em um elemento:
anim.clean(element)

ToasterKassiopeiaTool

Esta ferramenta é usada para criar notificações personalizadas na tela do usuário

Como usar?

import { ToasterKassiopeiaTool } from "kassiopeia-tools";

const toaster = ToasterKassiopeiaTool.get();

toaster.success("Toaster funcionando!").listeners(
  () => console.log("toaster fechado"),
  () => console.log("Cliquei no toaster")
);

Os métodos seguem os seguintes parâmetros: (message: string, timeInMilliseconds?: number)

Além dessa forma de usar, existe a opção de personalizar. Veja a interface a seguir:

interface IToasterConfig {
  container?: {
    position3D: Vec3D;
    maxWidth?: string;
    useVectorWithPercentage?: boolean;
    centerOnScreen?: boolean;
    border?: { size: number; color: string };
    boundary?: { x: 'start' | 'end'; y: 'top' | 'bottom' };
    outSide?: 'top' | 'bottom' | 'start' | 'end';
  };
  background?: {
    info: IToasterBG;
    success: IToasterBG;
    danger: IToasterBG;
    warn: IToasterBG;
  };
  text?: {
    info: IToasterFont;
    success: IToasterFont;
    danger: IToasterFont;
    warn: IToasterFont;
  };
  icon?: {
    info: IToasterIcon;
    success: IToasterIcon;
    danger: IToasterIcon;
    warn: IToasterIcon;
  };
  progressBar?: {
    info: IToasterBar;
    success: IToasterBar;
    danger: IToasterBar;
    warn: IToasterBar;
  };
  hideOnClick: boolean;
}

Agora veja como é a implementação padrão:

{
      container: {
        position3D: Vec3D.of(5, 5, 999),
        useVectorWithPercentage: true,
        centerOnScreen: false,
        boundary: { x: 'end', y: 'top' },
        outSide: 'end',
      },
      background: {
        info: { color: '#3c48af', useVectorWithRem: true, padding: Vec2D.of(1, 1) },
        success: { color: '#3dbe41', useVectorWithRem: true, padding: Vec2D.of(1, 1) },
        danger: { color: '#ca4141', useVectorWithRem: true, padding: Vec2D.of(1, 1) },
        warn: { color: '#d1c717', useVectorWithRem: true, padding: Vec2D.of(1, 1) },
      },
      text: {
        info: { color: '#ffffff', size: 14, font: 'JetBrains Mono' },
        success: { color: '#f9f9f9', size: 14, font: 'JetBrains Mono' },
        danger: { color: '#f5f5f5', size: 14, font: 'JetBrains Mono' },
        warn: { color: '#1c2003', size: 14, font: 'JetBrains Mono' },
      },
      icon: {
        info: { source: infoIcon('#ffffff'), type: 'innerHTML' },
        success: { source: successIcon('#f9f9f9'), type: 'innerHTML' },
        danger: { source: dangerIcon('#f5f5f5'), type: 'innerHTML' },
        warn: { source: warnIcon('#1c2003'), type: 'innerHTML' },
      },
      progressBar: {
        info: { color: '#ffffff', height: 2, time: 10000 },
        success: { color: '#f9f9f9', height: 2, time: 10000 },
        danger: { color: '#f5f5f5', height: 2, time: 10000 },
        warn: { color: '#1c2003', height: 2, time: 10000 },
      },
      hideOnClick: true,
    };

A partir dos exemplos acima você pode perceber que existem 4 tipos de notificações: info, success, danger, warn.

Veja mais das interfaces aqui

Vamos testar??

Execute e veja o resultado!

import { ToasterKassiopeiaTool, Vec2D, Vec3D } from "kassiopeia-tools";

// toaster.success("Toaster funcionando!").listeners(
//   () => console.log("toaster fechado"),
//   () => console.log("Cliquei no toaster")
// );

toaster.customToaster(
  "Testando uma notificação personalizada",
  {
    background: {
      color: "#000000",
      padding: Vec2D.of(1, 1),
      useVectorWithRem: true,
      opacity: 0.8,
    }, // Esta é a configuração do background ou o corpo visível da mensagem
    hideOnClick: true, // Aqui estou dizendo que a notificação será fechada ao ser clicada pelo user
    text: { color: "#ffffff", font: "JetBrains Mono" }, //Personalize o texto
    container: {
      position3D: Vec3D.of(5, 5, 999), //Os valores são a posição no x, y e o zIndex do container da notificação
      boundary: { x: "end", y: "top" }, //Aqui estamos indicando a posição nos limites da tela. Nesta config, estou dizendo que o toaster estará no final da tela no x e no começo no y. Ou seja, direita superior
      outSide: "top", //Por qual lado o toaster sairá ao ser destruído
      useVectorWithPercentage: true, //Usado junto da opção position3D, indicando se os valores do x e y serão tratados como porcentagem ou px
    },
  },
  10000
);

Espero que você seja melhor que eu personalizando isso

Achou complicado? Você pode fazer algo assim:

// Arquivo -> src/modules/toaster/index.ts(js)
import { ToasterKassiopeiaTool, Vec2D, Vec3D } from "kassiopeia-tools";

export const toasterTool = ToasterKassiopeiaTool.getConfigured({
  container: {
    position3D: Vec3D.of(5, 5, 999),
    useVectorWithPercentage: true,
    centerOnScreen: false,
    boundary: { x: "end", y: "top" },
    outSide: "end",
  },
  background: {
    info: { color: "#3c48af", useVectorWithRem: true, padding: Vec2D.of(1, 1) },
    success: {
      color: "#3dbe41",
      useVectorWithRem: true,
      padding: Vec2D.of(1, 1),
    },
    danger: {
      color: "#ca4141",
      useVectorWithRem: true,
      padding: Vec2D.of(1, 1),
    },
    warn: { color: "#d1c717", useVectorWithRem: true, padding: Vec2D.of(1, 1) },
  },
  text: {
    info: { color: "red", size: 14, font: "JetBrains Mono" },
    success: { color: "#f9f9f9", size: 14, font: "JetBrains Mono" },
    danger: { color: "#f5f5f5", size: 14, font: "JetBrains Mono" },
    warn: { color: "#1c2003", size: 14, font: "JetBrains Mono" },
  },
  progressBar: {
    info: { color: "#ffffff", height: 2, time: 10000 },
    success: { color: "#f9f9f9", height: 2, time: 10000 },
    danger: { color: "#f5f5f5", height: 2, time: 10000 },
    warn: { color: "#1c2003", height: 2, time: 10000 },
  },
  hideOnClick: true,
});

E então usar:

import { toasterTool } from "./modules/toaster";

toasterTool.info("Testando");

Você pode ser criativo. Desenvolva o seu código com base no meu :)

ImageKassiopeiaProcessingTool

Aqui temos algo um pouco mais poderoso. Veja alguns exemplos:

import { ImageKassiopeiaProcessingTool } from "kassiopeia-tools";

const imageTool = ImageKassiopeiaProcessingTool.get();

Você pode transformar um blob em data_url. Atenção: esta classe foi programada para manipular imagens!

O segundo parâmetro pode ser jpeg ou webp. Isso fará com que o blob seja convertido para um dos tipos antes de se tornar data_url

const jpeg = await imageTool.blobToDataURL(blob, "webp");
const webp = await imageTool.blobToDataURL(blob, "jpeg");

Detalhe: o método não foi programado para reduzir qualidade.

Mas, os seguintes métodos sim:

convertFileToJpegBlobWithClipping(file: File, width?: number | undefined, height?: number | undefined, quality?: number | undefined): Promise<Blob>
convertFileToJpegBlobWithoutClipping(file: File, quality?: number | undefined): Promise<Blob>
convertFileToWebpBlobWithClipping(file: File, width?: number | undefined, height?: number | undefined, quality?: number | undefined): Promise<Blob>
convertFileToWebpBlobWithoutClipping(file: File, quality?: number | undefined): Promise<Blob>

HTMLKassiopeiaTool || generateHTML

Esta ferramenta é usada na construção das outras. Usar a api padrão da web para criar elementos pode ser um pouco cansativo, então acabei desenvolvendo isso. É fraco, mas pode te quebrar um galho!

import { generateHTML, HTMLKassiopeiaTool } from "kassiopeia-tools";

generateHTML({
  tag: "span",
  css: {
    overflow: "hidden",
    position: "fixed",
    cursor: "default",
    maxWidth: "70vw",
    border: "2px solid black",
  },
  textContent: "Conteúdo do span em texto",
  // innerHTML: "<div><p>Pode adicionar html também</p></div>",
  children: [], // Um Array com elementos para criar filhos para o span. Cada elemento aqui recebe os mesmos atributos
  attributes: {
    "data-id": Date.now(),
    "data-desc": "Adicione qualquer atributo ao seu elemento por aqui",
    class: "class-here",
  },
  onClick: (event, element) => {
    console.log(event); //Este é o evento de clique
    console.log(element); // element é o elemento criado aqui, neste caso, span
  },
});

//Ou você pode usar a forma completa:
HTMLKassiopeiaTool.get().generateHTML

Você pode usar qualquer uma das formas acima. Ambos os métodos terão o mesmo resultado.

ValidationKassiopeiaTool

Mais um quebra galho que funciona. Adicione validações rápidas da seguinte maneira:

import { ValidationKassiopeiaTool } from "kassiopeia-tools";

const validation = ValidationKassiopeiaTool.get();

const isEmailValid = validation.isEmailValid(email);
const isPasswordValid = validation.isPasswordValid(pass); //Verifica se tem pelo menos 8 caracteres, ao menos um número, e pelo menos uma letra minúsculas e maiúsculas
const isURLValid = validation.isURLValid(url);

//Normalizações
const text = validation.normalizeText(txt); //Usará trim na string se ela existir ou retornará uma nova string vazia;
const uri = validation.normalizeURI(base); // "/t /0]" -> "/t%20/0%5D"

Por último e não menos importante, temos o popup. Esta ferramenta cria telas para urls específicas.

import { PopupKassiopeiaTool, generatePopup } from "kassiopeia-tools";

const window = generatePopup('https://github.com/oGabrielSilva/kassiopeia-tools', 420, 580)

//OU
PopupKassiopeiaTool.get().generate

Licença

MIT