mirror of
https://github.com/dzeiocom/components.git
synced 2025-06-15 12:09:20 +00:00
Compare commits
26 Commits
Author | SHA1 | Date | |
---|---|---|---|
7000d3ebac
|
|||
3bde426325
|
|||
b13a40ef18
|
|||
e481160528
|
|||
a0342050db
|
|||
c1f37b6e7c
|
|||
d2fbe42db8
|
|||
031971b859
|
|||
1488386e1d
|
|||
26c2c50f23 | |||
c591c2f0a8 | |||
7fe816c997 | |||
7e28baf2aa | |||
b19992b57c | |||
0bb84f9946 | |||
8cddeab594 | |||
68939d8390 | |||
8186284ded | |||
e173bd2a37 | |||
754da58a68 | |||
3b314d5307 | |||
8c64a57a16
|
|||
c1e40c6789
|
|||
bd0787d0ec
|
|||
5f51088ab0
|
|||
d7a09a4dcd
|
@ -1,4 +1,5 @@
|
||||
const path = require("path");
|
||||
const webpack = require('webpack')
|
||||
|
||||
module.exports = {
|
||||
"stories": [
|
||||
@ -16,5 +17,18 @@ module.exports = {
|
||||
propFilter: (prop) => (prop.parent ? !/node_modules/.test(prop.parent.fileName) : true),
|
||||
},
|
||||
},
|
||||
presets: [path.resolve(__dirname, "./next.js")]
|
||||
presets: [path.resolve(__dirname, "./next.js")],
|
||||
// Allow to use Next/Image
|
||||
webpackFinal: (config) => {
|
||||
config.plugins.push(new webpack.DefinePlugin({
|
||||
'process.env.__NEXT_IMAGE_OPTS': JSON.stringify({
|
||||
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
||||
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
|
||||
domains: [],
|
||||
path: '/',
|
||||
loader: 'default',
|
||||
})
|
||||
}))
|
||||
return config
|
||||
}
|
||||
}
|
||||
|
17
.storybook/mockNextImage.js
Normal file
17
.storybook/mockNextImage.js
Normal file
@ -0,0 +1,17 @@
|
||||
// https://stackoverflow.com/a/64765638/7335674
|
||||
|
||||
import * as nextImage from 'next/image'
|
||||
|
||||
Object.defineProperty(nextImage, 'default', {
|
||||
configurable: true,
|
||||
value: (props) => {
|
||||
return (
|
||||
<div style={{display: 'inline-block', maxWidth: '100%', overflow: 'hidden', position: 'relative', boxSizing: 'border-box', margin: 0}}>
|
||||
<div style={{boxSizing: 'border-box', display: 'block', maxWidth: '100%'}}>
|
||||
<img {...props} alt="" aria-hidden="true" role="presentation" style={{maxWidth: '100%', display: 'block', margin: 0, border: 'none', padding: 0}} />
|
||||
</div>
|
||||
<img {...props} style={{position: 'absolute', inset: 0, boxSizing: 'border-box', padding: 0, border: 'none', margin: 'auto', display: 'block', width: 0, height: 0, minWidth: '100%', maxWidth: '100%', minHeight: '100%', maxHeight: '100%'}} />
|
||||
</div>
|
||||
)
|
||||
},
|
||||
})
|
@ -1,5 +1,6 @@
|
||||
import '../src/dzeio/general.styl'
|
||||
import './mockNextRouter'
|
||||
import './mockNextImage'
|
||||
|
||||
export const parameters = {
|
||||
layout: 'centered'
|
||||
|
3
.storybook/public/90-38.svg
Normal file
3
.storybook/public/90-38.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg width="90" height="38" viewBox="0 0 90 38" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="90" height="38" fill="#C4C4C4"/>
|
||||
</svg>
|
After Width: | Height: | Size: 150 B |
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@dzeio/components",
|
||||
"version": "0.7.2",
|
||||
"version": "0.8.2",
|
||||
"license": "MIT",
|
||||
"main": "./index.js",
|
||||
"types": "./types/index.d.ts",
|
||||
@ -36,7 +36,7 @@
|
||||
"typescript": "^4.2.3"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "rm -rf src/dzeio/**/*.js && start-storybook -p 6006",
|
||||
"dev": "rm -rf src/dzeio/**/*.js && start-storybook -s ./.storybook/public -p 6006",
|
||||
"build": "rollup --config",
|
||||
"prepublishOnly": "yarn build",
|
||||
"postinstall": "rollup --config"
|
||||
|
@ -12,7 +12,9 @@ export default [
|
||||
url: false,
|
||||
autoModules: true,
|
||||
mode: 'extract',
|
||||
|
||||
modules: {
|
||||
generateScopedName: '[local][hash:5]'
|
||||
}
|
||||
}),
|
||||
typescript({useTsconfigDeclarationDir: true}), // so Rollup can convert TypeScript to JavaScript
|
||||
],
|
||||
|
@ -37,9 +37,11 @@ export default class Box extends React.Component<Props> {
|
||||
{this.props.headerButtons}
|
||||
</BoxHeader>
|
||||
)}
|
||||
<BoxBody noPadding={this.props.noPadding}>
|
||||
{this.props.children}
|
||||
</BoxBody>
|
||||
{this.props.children && (
|
||||
<BoxBody noPadding={this.props.noPadding}>
|
||||
{this.props.children}
|
||||
</BoxBody>
|
||||
)}
|
||||
</BoxWrapper>
|
||||
)
|
||||
}
|
||||
|
@ -5,28 +5,33 @@ $backColor = #757575
|
||||
.label
|
||||
position relative
|
||||
display flex
|
||||
padding-left 8px
|
||||
margin 8px
|
||||
user-select none
|
||||
align-items center
|
||||
|
||||
+ .label
|
||||
margin-top 8px
|
||||
|
||||
p
|
||||
margin-left 18px
|
||||
margin-left 8px
|
||||
|
||||
span
|
||||
top 0
|
||||
left 0
|
||||
width 20px
|
||||
height @width
|
||||
position absolute
|
||||
box-shadow inset 0 0 0 2px $backColor
|
||||
position relative
|
||||
box-shadow inset 0 0 0 2px $grayDark
|
||||
border-radius 2px
|
||||
transition all $transition
|
||||
|
||||
@media (prefers-color-scheme dark)
|
||||
box-shadow inset 0 0 0 2px $grayLight
|
||||
|
||||
&::after
|
||||
border-radius 20px
|
||||
position absolute
|
||||
transition all $transition
|
||||
background $default
|
||||
background $main
|
||||
|
||||
svg
|
||||
transition $transition
|
||||
@ -41,19 +46,9 @@ $backColor = #757575
|
||||
left 0
|
||||
opacity 0
|
||||
|
||||
&:focus + span
|
||||
box-shadow inset 0 0 0 2px black, 0 0 0 2px rgba(black,.3)
|
||||
@media (prefers-color-scheme dark)
|
||||
box-shadow inset 0 0 0 2px white, 0 0 0 2px rgba(white,.3)
|
||||
|
||||
&:focus:checked + span
|
||||
box-shadow inset 0 0 0 2px $default, 0 0 0 2px rgba($default,.3)
|
||||
@media (prefers-color-scheme dark)
|
||||
box-shadow inset 0 0 0 2px $default, 0 0 0 2px rgba($default,.3)
|
||||
|
||||
&:checked + span
|
||||
background rgba($default, .5)
|
||||
box-shadow inset 0 0 0 2px $default
|
||||
background rgba($main, .5)
|
||||
box-shadow inset 0 0 0 2px $main
|
||||
|
||||
svg
|
||||
color white
|
||||
@ -67,7 +62,6 @@ $backColor = #757575
|
||||
box-shadow inset 0 0 0 2px white
|
||||
|
||||
.radio
|
||||
margin-left 18px // Margin + margin for Circle
|
||||
span
|
||||
border-radius 20px
|
||||
|
||||
@ -86,20 +80,19 @@ $backColor = #757575
|
||||
.switch
|
||||
padding 2px 0 2px 10px // 2px base padding 10px circle padding
|
||||
|
||||
&:hover span
|
||||
box-shadow none
|
||||
|
||||
&::after
|
||||
&:hover span::after
|
||||
background black
|
||||
@media (prefers-color-scheme dark)
|
||||
background white
|
||||
|
||||
span
|
||||
width 28px
|
||||
height 14px
|
||||
border-radius 20px
|
||||
top 50%
|
||||
margin-right 10px
|
||||
box-shadow none
|
||||
background rgba($backColor, .5)
|
||||
transform translateY(-50%)
|
||||
|
||||
&::after
|
||||
content " "
|
||||
@ -115,93 +108,39 @@ $backColor = #757575
|
||||
width 20px
|
||||
|
||||
&:checked + span
|
||||
box-shadow none
|
||||
|
||||
&::after
|
||||
left 100%
|
||||
transform translate(-50%, -50%)
|
||||
background $default
|
||||
|
||||
.primary
|
||||
$color = $primary
|
||||
background $main
|
||||
|
||||
checkBox($color)
|
||||
input:checked + span
|
||||
background rgba($color, .5)
|
||||
box-shadow inset 0 0 0 2px $color
|
||||
|
||||
&::after
|
||||
background $color
|
||||
|
||||
input:focus:checked + span
|
||||
box-shadow inset 0 0 0 2px $color, 0 0 0 2px rgba($color,.3)
|
||||
&.switch
|
||||
input:checked + span
|
||||
box-shadow none
|
||||
|
||||
.secondary
|
||||
$color = $secondary
|
||||
|
||||
input:checked + span
|
||||
background rgba($color, .5)
|
||||
box-shadow inset 0 0 0 2px $color
|
||||
|
||||
&::after
|
||||
background $color
|
||||
|
||||
&.switch
|
||||
input:checked + span
|
||||
box-shadow none
|
||||
|
||||
.info
|
||||
$color = $info
|
||||
|
||||
input:checked + span
|
||||
background rgba($color, .5)
|
||||
box-shadow inset 0 0 0 2px $color
|
||||
|
||||
&::after
|
||||
background $color
|
||||
|
||||
&.switch
|
||||
input:checked + span
|
||||
box-shadow none
|
||||
checkBox($infoLight)
|
||||
@media (prefers-color-scheme dark)
|
||||
checkBox($infoDark)
|
||||
|
||||
.success
|
||||
$color = $success
|
||||
checkBox($successLight)
|
||||
@media (prefers-color-scheme dark)
|
||||
checkBox($successDark)
|
||||
|
||||
input:checked + span
|
||||
background rgba($color, .5)
|
||||
box-shadow inset 0 0 0 2px $color
|
||||
|
||||
&::after
|
||||
background $color
|
||||
|
||||
&.switch
|
||||
input:checked + span
|
||||
box-shadow none
|
||||
|
||||
.danger
|
||||
$color = $danger
|
||||
|
||||
input:checked + span
|
||||
background rgba($color, .5)
|
||||
box-shadow inset 0 0 0 2px $color
|
||||
|
||||
&::after
|
||||
background $color
|
||||
|
||||
&.switch
|
||||
input:checked + span
|
||||
box-shadow none
|
||||
.error
|
||||
checkBox($errorLight)
|
||||
@media (prefers-color-scheme dark)
|
||||
checkBox($errorDark)
|
||||
|
||||
.warning
|
||||
$color = $warning
|
||||
|
||||
input:checked + span
|
||||
background rgba($color, .5)
|
||||
box-shadow inset 0 0 0 2px $color
|
||||
|
||||
&::after
|
||||
background $color
|
||||
|
||||
&.switch
|
||||
input:checked + span
|
||||
box-shadow none
|
||||
checkBox($warningLight)
|
||||
@media (prefers-color-scheme dark)
|
||||
checkBox($warningDark)
|
||||
|
@ -7,38 +7,32 @@ import css from './Checkbox.module.styl'
|
||||
import Text from '../Text'
|
||||
|
||||
interface Props extends React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> {
|
||||
label?: string
|
||||
id: string
|
||||
type?: undefined
|
||||
radio?: boolean
|
||||
switch?: boolean
|
||||
color?: ColorType
|
||||
label: string
|
||||
type?: 'checkbox' | 'radio' | 'switch'
|
||||
}
|
||||
|
||||
export default class Checkbox extends React.Component<Props> {
|
||||
|
||||
public render() {
|
||||
const props: Props = Object.assign({}, this.props)
|
||||
const props: Partial<Props> = Object.assign({}, this.props)
|
||||
delete props.label
|
||||
delete props.type
|
||||
delete props.color
|
||||
delete props.switch
|
||||
delete props.radio
|
||||
|
||||
const realType = this.props.radio ? 'radio' : 'checkbox'
|
||||
const realType = this.props.type ?? 'checkbox'
|
||||
|
||||
return (
|
||||
<label htmlFor={this.props.id} className={buildClassName(
|
||||
<label htmlFor={this.props.id ?? this.props.label} className={buildClassName(
|
||||
[css.label],
|
||||
[css.radio, realType === 'radio'],
|
||||
[css.switch, this.props.switch],
|
||||
[css.switch, realType === 'switch'],
|
||||
[css[this.props.color as string], this.props.color]
|
||||
)}>
|
||||
<input {...props}
|
||||
type={realType}
|
||||
id={this.props.id ?? this.props.label}
|
||||
type={realType === 'switch' ? 'checkbox' : realType}
|
||||
/>
|
||||
<span>
|
||||
{realType === 'checkbox' && ! this.props.switch && (
|
||||
{realType === 'checkbox' && (
|
||||
<Check strokeWidth={4} size={16}/>
|
||||
)}
|
||||
</span>
|
||||
|
@ -1,34 +1,29 @@
|
||||
@import "../config"
|
||||
|
||||
$transparent = 75%
|
||||
$transparent = 15%
|
||||
|
||||
.back
|
||||
transition all $transition
|
||||
background linear-gradient(to left, $default, transparentify($default, $transparent))
|
||||
background $mainGradient
|
||||
|
||||
.primary
|
||||
$color = $primary
|
||||
background linear-gradient(to left, $color, transparentify($color, $transparent))
|
||||
|
||||
.secondary
|
||||
$color = $secondary
|
||||
background linear-gradient(to left, $color, transparentify($color, $transparent))
|
||||
&.fullscreen
|
||||
min-height 100vh
|
||||
|
||||
.info
|
||||
$color = $info
|
||||
background linear-gradient(to left, $color, transparentify($color, $transparent))
|
||||
background linear-gradient(to left, $color, lighten($color, $transparent))
|
||||
|
||||
.success
|
||||
$color = $success
|
||||
background linear-gradient(to left, $color, transparentify($color, $transparent))
|
||||
background linear-gradient(to left, $color, lighten($color, $transparent))
|
||||
|
||||
.danger
|
||||
$color = $danger
|
||||
background linear-gradient(to left, $color, transparentify($color, $transparent))
|
||||
background linear-gradient(to left, $color, lighten($color, $transparent))
|
||||
|
||||
.warning
|
||||
$color = $warning
|
||||
background linear-gradient(to left, $color, transparentify($color, $transparent))
|
||||
background linear-gradient(to left, $color, lighten($color, $transparent))
|
||||
|
||||
@media (prefers-color-scheme dark)
|
||||
.back
|
||||
|
@ -8,12 +8,18 @@ interface Props {
|
||||
color?: ColorType
|
||||
className?: string
|
||||
children: React.ReactNode
|
||||
fullscreen?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* Make the background a linear-gradient
|
||||
*
|
||||
* @version 1.0.0
|
||||
*/
|
||||
export default class GradientBackground extends React.Component<Props> {
|
||||
|
||||
public render = () => (
|
||||
<div className={buildClassName([css.back], [css[this.props.color as string], this.props.color], [this.props.className])}>
|
||||
<div className={buildClassName(css.back, [css[this.props.color as string], this.props.color], this.props.className)}>
|
||||
{this.props.children}
|
||||
</div>
|
||||
)
|
||||
|
@ -6,7 +6,7 @@
|
||||
max-width 100%
|
||||
display inline-block
|
||||
|
||||
+ .parent
|
||||
&:not(.block) + .parent:not(.block)
|
||||
margin-left 16px
|
||||
|
||||
label
|
||||
@ -217,7 +217,7 @@
|
||||
@media (prefers-color-scheme dark)
|
||||
background #202020
|
||||
|
||||
&:hover
|
||||
&:hover:not(:disabled)
|
||||
background rgba(gray, .2)
|
||||
|
||||
@media (prefers-color-scheme dark)
|
||||
|
@ -24,7 +24,7 @@ interface Props {
|
||||
export default class Link extends React.Component<Props> {
|
||||
|
||||
public render() {
|
||||
const external = this.props.external ?? !this.props.href.startsWith('/')
|
||||
const external = this.props.external ?? this.props.href.startsWith('http')
|
||||
if (external) {
|
||||
// external link
|
||||
return (
|
||||
|
@ -6,6 +6,7 @@
|
||||
width 100%
|
||||
height 7px
|
||||
pointer-events none
|
||||
z-index 200
|
||||
|
||||
top 0
|
||||
&.hide
|
||||
|
@ -4,9 +4,22 @@ import { buildClassName } from '../Util'
|
||||
import css from './Loader.module.styl'
|
||||
|
||||
interface Props {
|
||||
/**
|
||||
* The new Percentage (if you calculate it yourself)
|
||||
*/
|
||||
percent?: number
|
||||
|
||||
/**
|
||||
* Auto random loader
|
||||
*/
|
||||
auto?: {
|
||||
/**
|
||||
* the minimum and maximum interval between two increment
|
||||
*/
|
||||
interval: [number, number]
|
||||
/**
|
||||
* the minimum and maximum incrementation (MUST be an integer)
|
||||
*/
|
||||
increment: [number, number]
|
||||
}
|
||||
}
|
||||
@ -15,6 +28,11 @@ interface State {
|
||||
percent?: number
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a simple loading animation at the top of the page
|
||||
*
|
||||
* @version 1.0.0
|
||||
*/
|
||||
export default class Loader extends React.Component<Props, State> {
|
||||
|
||||
public state: State = {}
|
||||
|
@ -216,9 +216,7 @@
|
||||
margin 0
|
||||
padding 0
|
||||
|
||||
.userMenu
|
||||
// padding-bottom 16px
|
||||
a
|
||||
.userMenu a
|
||||
padding 16px 0
|
||||
|
||||
|
||||
|
@ -26,5 +26,5 @@ Basic.args = {
|
||||
}]
|
||||
}
|
||||
},
|
||||
logo: {src: '/assets/logo.svg', width: 90, height: 38}
|
||||
logo: {src: '/90-38.svg', width: 90, height: 38}
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ interface Props {
|
||||
name: string
|
||||
}>
|
||||
/**
|
||||
* Internal Usem don't use it !
|
||||
* Internal Use don't use it !
|
||||
*/
|
||||
mobileMenu?: () => void
|
||||
}
|
||||
@ -82,7 +82,7 @@ interface State {
|
||||
|
||||
/**
|
||||
* Navbar/Sidebar Component
|
||||
* @version 1.0.1
|
||||
* @version 1.0.2
|
||||
*/
|
||||
export default class Navbar extends React.Component<Props, State> {
|
||||
|
||||
@ -224,7 +224,7 @@ export default class Navbar extends React.Component<Props, State> {
|
||||
</div>
|
||||
</div>
|
||||
<div className={buildClassName(css.userMenu, [css.menuActive, !this.state.isMobile && this.state.menuActive])}>
|
||||
<Row>
|
||||
<Row nomargin={this.getType() === 'navbar'}>
|
||||
{this.props.user.menu?.informations && (
|
||||
<Col>{this.props.user.menu?.informations}</Col>
|
||||
)}
|
||||
|
@ -3,14 +3,12 @@
|
||||
.row
|
||||
display flex
|
||||
flex-wrap wrap
|
||||
margin (0 - $gapSize) 0 0 (0 - $gapSize)
|
||||
padding $gapSize
|
||||
|
||||
&:not(.nomargin)
|
||||
margin (0 - $gapSize) 0 0
|
||||
padding 0 $gapSize * 2 0 $gapSize
|
||||
|
||||
.row:not(.nomargin)
|
||||
padding 0
|
||||
margin (0 - $gapSize) 0 0 (0 - $gapSize)
|
||||
&.nomargin
|
||||
.row
|
||||
padding 0
|
||||
|
||||
.nowrap
|
||||
flex-wrap nowrap
|
||||
|
@ -12,7 +12,6 @@ interface Props {
|
||||
|
||||
export default class Text extends React.Component<Props> {
|
||||
|
||||
|
||||
public render() {
|
||||
const classes = buildClassName(
|
||||
css.text,
|
||||
@ -23,16 +22,10 @@ export default class Text extends React.Component<Props> {
|
||||
this.props.className
|
||||
)
|
||||
|
||||
switch (this.props.type || 'p') {
|
||||
case 'h1': return (<h1 className={classes}>{this.props.children}</h1>)
|
||||
case 'h2': return (<h2 className={classes}>{this.props.children}</h2>)
|
||||
case 'h3': return (<h3 className={classes}>{this.props.children}</h3>)
|
||||
case 'h4': return (<h4 className={classes}>{this.props.children}</h4>)
|
||||
case 'h5': return (<h5 className={classes}>{this.props.children}</h5>)
|
||||
case 'h6': return (<h6 className={classes}>{this.props.children}</h6>)
|
||||
case 'em': return (<p className={classes}><em>{this.props.children}</em></p>)
|
||||
case 'span': return (<span className={classes}>{this.props.children}</span>)
|
||||
default: return (<p className={classes}>{this.props.children}</p>)
|
||||
if (this.props.type === 'em') {
|
||||
return (<p className={classes}><em>{this.props.children}</em></p>)
|
||||
}
|
||||
|
||||
return React.createElement(this.props.type || 'p', {className: classes, children: this.props.children})
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { SVGAttributes } from 'react'
|
||||
|
||||
export type ColorType = 'primary' | 'info' | 'success' | 'error' | 'warning'
|
||||
export type ColorType = 'info' | 'success' | 'error' | 'warning'
|
||||
|
||||
export interface IconProps extends SVGAttributes<SVGElement> {
|
||||
color?: string
|
||||
|
@ -4,6 +4,8 @@
|
||||
* @summary DZEIO Component Library
|
||||
*/
|
||||
|
||||
import './dzeio/general.styl'
|
||||
|
||||
import Box from './dzeio/Box'
|
||||
import Button from './dzeio/Button'
|
||||
import Checkbox from './dzeio/Checkbox'
|
||||
|
Reference in New Issue
Block a user