Olá! Meu nome é Andrey, desenvolvo profissionalmente interfaces da Web há mais de 11 anos e, no último ano, desenvolvi o projeto Numl, que pode ser chamado de linguagem de marcação e estilo para a Web. Neste artigo, mostrarei como, em uma tentativa de superar vários recursos de CSS e simplificar o layout de projetos da web, acabamos com uma linguagem inteira que não apenas satisfazia todas as nossas necessidades de estilo, mas também nos permitiu reduzir a quantidade de código JS e melhorar a acessibilidade.
Para começar, brevemente sobre o Numl e como isso pode ser interessante para os desenvolvedores.
O Numl é uma linguagem de marcação que combina as funções de uma estrutura CSS , uma estrutura JS sem composição e um Sistema de Design , e fornece um conjunto de elementos pré-criados, cada um dos quais com um extenso conjunto de propriedades para personalização. O idioma é baseado na API do navegador Custom Elements nativa da especificação Web Components e é compatível com estruturas JS populares, como Vue , Svelte , Angular e React . Um recurso distinto (e eu diria até "único") do Numl é que ele gera todos os estilos para a interface em tempo de execuçãopara tirar o máximo proveito do seu CSS e obter grande flexibilidade no estilo e na personalização de elementos. Este artigo é a resposta para a pergunta de como aconteceu e por que essa abordagem merece o direito à vida.
Na semana passada, 4 de julho, o projeto completou exatamente um ano e já passou da fase de prova de conceito . Um grande projeto Sellerscale e uma extensão do navegador da Sellerscale estão gravados nele . Além disso, usando o Numl, vários outros sites foram criados, incluindo sua própria página de destino e o Storybook. Um conjunto completo de links estará no final.
Painel de escala de vendedores. Pilha: VueJS, Numl
Extensão de escala de vendedor. Pilha: Svelte, Numl
Numl , HTML/CSS , -, CSS ARIA. , CSS , , -. Utility-First CSS? .
, Numl, numl.design, Storybook , Numl REPL.
22 , , Turbo Pascal, , , . , - . - HTML/CSS, JS- . , . , , , , CSS-, .
, , Modifier Value ( ). , , . , .
, , , CSS , . . , -, , . - , , , , . " CSS", :
- CSS . , Grid, . , ( ),
position
,top/right/bottom/left
transform
, JS, . - CSS , . ,
box-shadow
(/ ),transform
( ) .. , JS-, . - , .
!important
. - , .
.cls:hover
.cls:focus
. , , . CSS (.cls:hover:not(:focus)
..), , , . , - , . - , . , (
.btn.fancy-btn
) , " ". , , , "/ hover ". " ", ( touch-) CSS. - CSS Media Queries (
@media not all and (hover: none)
) , . - CSS+HTML, CCSOM+DOM . , , , .
- JS, CSS- . . runtime -
getComputedStyle()
, . - CSS . , .
, . , - . , breakpoints CSS-.
, , — . CSS , - , , CSS .
, .
...
, CSS, . , CSS . , , .
. , , MyGrid
MyFlex
display
, , item- (basis/width/height
) - ( ) . basis
, width
, height
, .
size
text
, . size
font-size/line-heigh
, ( css ), , ..
inline-. , , , , , .
, , DX (Developer Experience). / .
- , . .
. . , . , . :
<template>
<div :class="classes" :style="styles">
<slot></slot>
</div>
</template>
, !
.. . . :
<my-btn>
Button
<my-popup>Popup content</my-popup>
</my-btn>
, . , . MyDropdown
, . , , .
, , , , , , ( ). - - my-grid
, . Custom Elements. , ! Custom Elements, Open Source NUDE Elements, Numl. nu-
.
: NUDE – JS-, Numl .
. Numl . inline-. CSS . CSS . , : nu-grid
columns
1fr 1fr
. , columnsAttr('1fr 1fr')
, :
export function columnsAttr(val) {
return {
'grid-template-columns': val,
};
}
CSS:
nu-grid[columns="1fr 1fr"] {
grid-template-columns: 1fr 1fr;
}
… <style>
, <head>
. , CSS, .
( ), , , CSS.
, , - CSS ( Atomic CSS), CSS-in-JS , CSS .
CSS, , .
, Numl . , <nu-block border>
:
nu-block[border] {
border: var(--nu-border-width) solid var(--nu-border-color);
}
, .
place
. , .
<nu-card>
<nu-el place="outside-top">Float element</nu-el>
</nu-card>
grid/flex-, float-, fixed sticky. CSS .
. , transform
:
<nu-card move="2rem 2rem" scale="2">
Card
</nu-card>
, , :
<nu-block width="10x"></nu-block>
x
— gap.
gap'. Flexbox, :
<nu-flex gap="2x 1x" flow="row wrap">
<nu-block>Item 1</nu-block>
<nu-block>Item 2</nu-block>
<nu-block>Item 3</nu-block>
</nu-flex>
. API . - Numl , . , Numl .
?
, , . , — . CSS , . , 4 , , , , . : .
, . , , , . .
Numl. - <nu-attrs>
, -. , . , :
<nu-pane>
<nu-attrs for="btn" color="special"></nu-attrs>
<nu-btn>Button 1</nu-btn>
<nu-btn>Button 2</nu-btn>
</nu-pane>
, color="special"
. , ( !) <nu-attrs>
, . <nu-attrs>
, , . , .
- , , , . , ( ).
. , - , , . ( 0 359 HSL) Custom Properties , .
. (, ), , .
-. Sellerscale
, :
- . ( WCAG Contrast Ratio).
- , , .
- .
- API .
- , .
- , (, )
, . , . : tenphi.me ( ) Storybook. CodePen Numl.
numl.design
Storybook
, , hue()
, , , Numl HSC (, , ). .
. Numl. tenphi.me
Numl -, .
, , Numl. ...
( )
. , . ( ) : breakpoint', , |
( ), - . breakpoint' , :
<nu-root responsive="60rem|40rem">
...
</nu-root>
(, ). - . , |
:
<nu-root responsive="60rem|40rem">
<nu-grid columns="repeat(4, 1fr)|1fr 1fr|1fr">
...
</nu-grid>
</nu-root>
, . , , .
Sellerscale
, , . , , ( ), .
:
<nu-card shadow="0 :hover[1]">
Content
</nu-card>
, , , .
, :
<nu-card>
<nu-block color="^ text :hover[special]">Content</nu-block>
</nu-card>
. , :
nu-card[color="^:hover[special]"]:hover {
color: var(--nu-spcial-color);
}
nu-card[color="^:hover[special]"]:not(:hover) {
color: var(--nu-text-color);
}
. ? Numl . , ( text
). CSS , , ! , , , .
is-
. :
<nu-btn is-loading>
<nu-el show="^ y :loading[n]">Submit</nu-el>
<nu-icon name="loader" show="^ n :loading[y]"></nu-icon>
</nu-btn>
, , CSS :
- , , .
- " ", .
- .
- . , , hover. , , , hover touch-. ( Numl, API).
- Media Queries.
- Numl . runtime , , ,
getComputedStyle()
. . - . , . .
, , . :)
, , . : .
.
, ? , HTML, <button>
.
Numl, . . Numl Behaviors. . , nx-
.
<nu-el nx-action>Button</nu-el>
REPL — nu-el
.
, nu-btn
. Numl 35-. . , , , Markdown Numl!
Numl Storybook: Markdown->Numl
. , , , . ( !)
- , - .
Numl ARIA, .
. . , ID, . , ID button-23
.
Numl . ID , . , . , ID, ID, Numl ID. , , .
<nu-region labelledby="label">
<nu-block id="label"></nu-block>
</nu-region>
HTML, , .
Numl aria- . , , , ( aria-
), .
:
<nu-btn label="Turn on lights">
<nu-icon name="sun"></nu-icon>
</nu-btn>
. , .
, Numl ARIA , .
Numl - . , CSS JS "", . , , :
- . Numl 40, , , . , , , , Numl - JS . .
- . Numl , , , . , , UX .
- SSR. Numl SSR , . . SEO , prerender.io.
- . Numl , Custom Elements, Custom Properties CSS Grid. Numl Edge 15+ , ( ).
- Numl - , JS-. , . .
- Numl - , . .
, Numl , , :
- . , "-", , .
- DX, -. HTML, . (// / )
- " " , .
- . " CSS". .
- CSS- ( TailwindCSS) , .
- , .
- - , .
- ;)
Numl , . , , .
PRE-BETA (v0.11). , , experimental
v1 (, ). 2020.
:
- 1100+
- 200+ npm
- ~1300
- 85 GitHub (, , !)
Numl, , , , . ( !) .
! . :
- GitHub
- – numl.design) / (Stack: Numl + Parcel)
- Storybook / (Stack: Numl + Vue2)
- WIP
- WIP
- Telegram – @numldesign / Gitter
- Twitter – @numldesign
Numl:
- , Numl / (Stack: Numl + Vue3 + Vite)
- Sellerscale — , Numl ( v0.10)
- - @KatrinLuna / (Stack: Numl + Vue2)
,
REPL, Numl.
, , , JS CSS: