@infonomic/uikit 6.3.1 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,18 +12,18 @@ interface LoaderProps {
12
12
 
13
13
  function Loader({ loader, label }: LoaderProps): React.JSX.Element {
14
14
  return (
15
- <div className="flex flex-col items-center">
15
+ <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '0.5rem' }}>
16
16
  {loader}
17
- <span className="text-sm text-gray-500">{label}</span>
17
+ <span style={{ fontSize: '0.875rem', color: 'var(--muted)' }}>{label}</span>
18
18
  </div>
19
19
  )
20
20
  }
21
21
 
22
22
  const LoaderDemo = (): React.JSX.Element => (
23
- <div className="loader-demo grid grid-cols-4 gap-5">
23
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: '1.25rem' }}>
24
24
  <Loader loader={<LoaderRing size={48} />} label="Ring" />
25
25
  <Loader loader={<LoaderEllipsis size={48} />} label="Ellipsis" />
26
- <Loader loader={<LoaderSpinner />} label="Spinner" />
26
+ <Loader loader={<LoaderSpinner size={48} />} label="Spinner" />
27
27
  </div>
28
28
  )
29
29
 
@@ -35,10 +35,121 @@ export default {
35
35
 
36
36
  export const Default = (): React.JSX.Element => {
37
37
  return (
38
- <div className="mb-6">
39
- <div className="max-w-[700px]">
38
+ <div style={{ marginBottom: '1.5rem' }}>
39
+ <div style={{ maxWidth: 700 }}>
40
40
  <LoaderDemo />
41
41
  </div>
42
42
  </div>
43
43
  )
44
44
  }
45
+
46
+ const sizes: (number | string)[] = [24, 36, 48, 64, 80]
47
+
48
+ export const Sizes = (): React.JSX.Element => {
49
+ return (
50
+ <div style={{ maxWidth: '800px', margin: '1.5rem auto' }}>
51
+ <div style={{ maxWidth: '800px', display: 'flex', flexDirection: 'column', gap: '2.5rem' }}>
52
+ <div>
53
+ <h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ring</h3>
54
+ <div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
55
+ {sizes.map((size) => (
56
+ <Loader key={String(size)} loader={<LoaderRing size={size} />} label={`${size}${typeof size === 'number' ? 'px' : ''}`} />
57
+ ))}
58
+ </div>
59
+ </div>
60
+ <div>
61
+ <h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ellipsis</h3>
62
+ <div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
63
+ {sizes.map((size) => (
64
+ <Loader key={String(size)} loader={<LoaderEllipsis size={size} />} label={`${size}${typeof size === 'number' ? 'px' : ''}`} />
65
+ ))}
66
+ </div>
67
+ </div>
68
+ <div>
69
+ <h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Spinner</h3>
70
+ <div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
71
+ {sizes.map((size) => (
72
+ <Loader key={String(size)} loader={<LoaderSpinner size={size} />} label={`${size}${typeof size === 'number' ? 'px' : ''}`} />
73
+ ))}
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ )
79
+ }
80
+
81
+ const colors = [
82
+ { value: 'var(--theme-500)', label: 'Theme' },
83
+ { value: '#e53e3e', label: '#e53e3e' },
84
+ { value: '#38a169', label: '#38a169' },
85
+ { value: '#3182ce', label: '#3182ce' },
86
+ { value: '#d69e2e', label: '#d69e2e' },
87
+ ]
88
+
89
+ export const Colors = (): React.JSX.Element => {
90
+ return (
91
+ <div style={{ maxWidth: '800px', margin: '1.5rem auto' }}>
92
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2.5rem' }}>
93
+ <div>
94
+ <h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ring</h3>
95
+ <div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
96
+ {colors.map(({ value, label }) => (
97
+ <Loader key={label} loader={<LoaderRing size={48} color={value} />} label={label} />
98
+ ))}
99
+ </div>
100
+ </div>
101
+ <div>
102
+ <h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ellipsis</h3>
103
+ <div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
104
+ {colors.map(({ value, label }) => (
105
+ <Loader key={label} loader={<LoaderEllipsis size={48} color={value} />} label={label} />
106
+ ))}
107
+ </div>
108
+ </div>
109
+ <div>
110
+ <h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Spinner</h3>
111
+ <div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
112
+ {colors.map(({ value, label }) => (
113
+ <Loader key={label} loader={<LoaderSpinner size={48} color={value} />} label={label} />
114
+ ))}
115
+ </div>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ )
120
+ }
121
+
122
+ const stringSizes: (number | string)[] = ['1.5rem', '2rem', '3rem', '4rem']
123
+
124
+ export const StringSizes = (): React.JSX.Element => {
125
+ return (
126
+ <div style={{ maxWidth: '800px', margin: '1.5rem auto' }}>
127
+ <div style={{ maxWidth: '800px', display: 'flex', flexDirection: 'column', gap: '2.5rem' }}>
128
+ <div>
129
+ <h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ring (rem units)</h3>
130
+ <div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
131
+ {stringSizes.map((size) => (
132
+ <Loader key={String(size)} loader={<LoaderRing size={size} />} label={String(size)} />
133
+ ))}
134
+ </div>
135
+ </div>
136
+ <div>
137
+ <h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ellipsis (rem units)</h3>
138
+ <div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
139
+ {stringSizes.map((size) => (
140
+ <Loader key={String(size)} loader={<LoaderEllipsis size={size} />} label={String(size)} />
141
+ ))}
142
+ </div>
143
+ </div>
144
+ <div>
145
+ <h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Spinner (rem units)</h3>
146
+ <div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
147
+ {stringSizes.map((size) => (
148
+ <Loader key={String(size)} loader={<LoaderSpinner size={size} />} label={String(size)} />
149
+ ))}
150
+ </div>
151
+ </div>
152
+ </div>
153
+ </div>
154
+ )
155
+ }
@@ -0,0 +1,55 @@
1
+ @layer infonomic-base,
2
+ infonomic-functional,
3
+ infonomic-utilities,
4
+ infonomic-theme,
5
+ infonomic-typography,
6
+ infonomic-components;
7
+
8
+ @layer infonomic-components {
9
+ .loader-ring,
10
+ :global(.infonomic-loader-ring) {
11
+ --_size: var(--loader-ring-size, 60px);
12
+ --_color: var(--loader-ring-color, var(--loader-color, currentColor));
13
+ display: inline-block;
14
+ position: relative;
15
+ width: var(--_size);
16
+ height: var(--_size);
17
+ }
18
+
19
+ .loader-ring-arc,
20
+ :global(.infonomic-loader-ring-arc) {
21
+ box-sizing: border-box;
22
+ display: block;
23
+ position: absolute;
24
+ width: calc(var(--_size) * 0.8);
25
+ height: calc(var(--_size) * 0.8);
26
+ margin: calc(var(--_size) * 0.1);
27
+ border-width: calc(var(--_size) * 0.1);
28
+ border-radius: 50%;
29
+ animation: loader-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
30
+ border-style: solid;
31
+ border-color: var(--_color) transparent transparent transparent;
32
+ }
33
+
34
+ .loader-ring-arc:nth-child(1) {
35
+ animation-delay: -0.45s;
36
+ }
37
+
38
+ .loader-ring-arc:nth-child(2) {
39
+ animation-delay: -0.3s;
40
+ }
41
+
42
+ .loader-ring-arc:nth-child(3) {
43
+ animation-delay: -0.15s;
44
+ }
45
+
46
+ @keyframes loader-ring {
47
+ 0% {
48
+ transform: rotate(0deg);
49
+ }
50
+
51
+ 100% {
52
+ transform: rotate(360deg);
53
+ }
54
+ }
55
+ }
@@ -1,31 +1,43 @@
1
1
  // https://github.com/JoshK2/react-spinners-css
2
2
  import type React from 'react'
3
3
 
4
- import classNames from 'classnames'
4
+ import cx from 'classnames'
5
5
 
6
6
  import type { LoaderProps } from './@types/index.js'
7
+ import styles from './ring.module.css'
8
+
9
+ export function LoaderRing({
10
+ color,
11
+ size,
12
+ className,
13
+ style,
14
+ ...rest
15
+ }: LoaderProps): React.JSX.Element {
16
+ const ringStyle: React.CSSProperties & Record<string, string | number | undefined> = {
17
+ ...style,
18
+ }
19
+ if (size != null) {
20
+ ringStyle['--loader-ring-size'] = typeof size === 'number' ? `${size}px` : size
21
+ }
22
+ if (color) {
23
+ ringStyle['--loader-ring-color'] = color
24
+ }
7
25
 
8
- export function LoaderRing({ color, size = 60, className, style }: LoaderProps): React.JSX.Element {
9
26
  const circles = [...Array(4)].map((_, index) => {
10
27
  return (
11
28
  <div
12
29
  // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>
13
30
  key={index}
14
- style={{
15
- borderColor: `${color || 'var(--loader-color)'} transparent transparent transparent`,
16
- width: size * 0.8,
17
- height: size * 0.8,
18
- margin: size * 0.1,
19
- borderWidth: size * 0.1,
20
- }}
31
+ className={cx('infonomic-loader-ring-arc', styles['loader-ring-arc'])}
21
32
  />
22
33
  )
23
34
  })
24
35
 
25
36
  return (
26
37
  <div
27
- className={classNames('lds-ring', className)}
28
- style={{ width: size, height: size, ...style }}
38
+ className={cx('infonomic-loader-ring', styles['loader-ring'], className)}
39
+ style={ringStyle}
40
+ {...rest}
29
41
  >
30
42
  {circles}
31
43
  </div>
@@ -0,0 +1,106 @@
1
+ @layer infonomic-base,
2
+ infonomic-functional,
3
+ infonomic-utilities,
4
+ infonomic-theme,
5
+ infonomic-typography,
6
+ infonomic-components;
7
+
8
+ @layer infonomic-components {
9
+ .loader-spinner,
10
+ :global(.infonomic-loader-spinner) {
11
+ --_size: var(--loader-spinner-size, 56px);
12
+ --_color: var(--loader-spinner-color, var(--loader-color, currentColor));
13
+ display: inline-block;
14
+ position: relative;
15
+ width: var(--_size);
16
+ height: var(--_size);
17
+ }
18
+
19
+ .loader-spinner-blade,
20
+ :global(.infonomic-loader-spinner-blade) {
21
+ transform-origin: calc(var(--_size) * 0.5) calc(var(--_size) * 0.5714);
22
+ animation: loader-spinner 1.2s linear infinite;
23
+ }
24
+
25
+ .loader-spinner-blade-inner,
26
+ :global(.infonomic-loader-spinner-blade-inner) {
27
+ display: block;
28
+ position: absolute;
29
+ top: 0;
30
+ left: calc(var(--_size) * 0.4464);
31
+ width: calc(var(--_size) * 0.0893);
32
+ height: calc(var(--_size) * 0.25);
33
+ border-radius: 20%;
34
+ background: var(--_color);
35
+ }
36
+
37
+ .loader-spinner-blade:nth-child(1) {
38
+ transform: rotate(0deg);
39
+ animation-delay: -1.1s;
40
+ }
41
+
42
+ .loader-spinner-blade:nth-child(2) {
43
+ transform: rotate(30deg);
44
+ animation-delay: -1s;
45
+ }
46
+
47
+ .loader-spinner-blade:nth-child(3) {
48
+ transform: rotate(60deg);
49
+ animation-delay: -0.9s;
50
+ }
51
+
52
+ .loader-spinner-blade:nth-child(4) {
53
+ transform: rotate(90deg);
54
+ animation-delay: -0.8s;
55
+ }
56
+
57
+ .loader-spinner-blade:nth-child(5) {
58
+ transform: rotate(120deg);
59
+ animation-delay: -0.7s;
60
+ }
61
+
62
+ .loader-spinner-blade:nth-child(6) {
63
+ transform: rotate(150deg);
64
+ animation-delay: -0.6s;
65
+ }
66
+
67
+ .loader-spinner-blade:nth-child(7) {
68
+ transform: rotate(180deg);
69
+ animation-delay: -0.5s;
70
+ }
71
+
72
+ .loader-spinner-blade:nth-child(8) {
73
+ transform: rotate(210deg);
74
+ animation-delay: -0.4s;
75
+ }
76
+
77
+ .loader-spinner-blade:nth-child(9) {
78
+ transform: rotate(240deg);
79
+ animation-delay: -0.3s;
80
+ }
81
+
82
+ .loader-spinner-blade:nth-child(10) {
83
+ transform: rotate(270deg);
84
+ animation-delay: -0.2s;
85
+ }
86
+
87
+ .loader-spinner-blade:nth-child(11) {
88
+ transform: rotate(300deg);
89
+ animation-delay: -0.1s;
90
+ }
91
+
92
+ .loader-spinner-blade:nth-child(12) {
93
+ transform: rotate(330deg);
94
+ animation-delay: 0s;
95
+ }
96
+
97
+ @keyframes loader-spinner {
98
+ 0% {
99
+ opacity: 1;
100
+ }
101
+
102
+ 100% {
103
+ opacity: 0;
104
+ }
105
+ }
106
+ }
@@ -1,27 +1,51 @@
1
1
  // https://github.com/JoshK2/react-spinners-css
2
2
  import type React from 'react'
3
3
 
4
- import classNames from 'classnames'
4
+ import cx from 'classnames'
5
5
 
6
6
  import type { LoaderProps } from './@types/index.js'
7
+ import styles from './spinner.module.css'
7
8
 
8
- type SpinnerProps = Omit<LoaderProps, 'size'>
9
-
10
- export function LoaderSpinner({ color, className, style }: SpinnerProps): React.JSX.Element {
9
+ export function LoaderSpinner({
10
+ color,
11
+ size,
12
+ className,
13
+ style,
14
+ ...rest
15
+ }: LoaderProps): React.JSX.Element {
11
16
  const circles = [...Array(12)].map((_, index) => {
12
17
  return (
13
18
  // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>
14
- <div key={index}>
19
+ <div
20
+ key={index}
21
+ className={cx('infonomic-loader-spinner-blade', styles['loader-spinner-blade'])}
22
+ >
15
23
  <div
16
- className={classNames('div-after')}
17
- style={{ backgroundColor: color ? color : 'var(--loader-color)' }}
24
+ className={cx(
25
+ 'infonomic-loader-spinner-blade-inner',
26
+ styles['loader-spinner-blade-inner'],
27
+ )}
18
28
  />
19
29
  </div>
20
30
  )
21
31
  })
22
32
 
33
+ const spinnerStyle: React.CSSProperties & Record<string, string | number | undefined> = {
34
+ ...style,
35
+ }
36
+ if (size != null) {
37
+ spinnerStyle['--loader-spinner-size'] = typeof size === 'number' ? `${size}px` : size
38
+ }
39
+ if (color) {
40
+ spinnerStyle['--loader-spinner-color'] = color
41
+ }
42
+
23
43
  return (
24
- <div className={classNames('lds-spinner', className)} style={{ ...style }}>
44
+ <div
45
+ className={cx('infonomic-loader-spinner', styles['loader-spinner'], className)}
46
+ style={spinnerStyle}
47
+ {...rest}
48
+ >
25
49
  {circles}
26
50
  </div>
27
51
  )
@@ -1,4 +1,4 @@
1
1
  /* @import "./scroll-to-top.css"; */
2
2
  @import "./hamburger.css";
3
- @import "./loaders.css";
3
+ /* @import "./loaders.css"; */
4
4
  @import "./fade-in-lift.css";
@@ -1,3 +1,5 @@
1
+ /* No longer used in our actual loaders for React and Astro components
2
+ but left here as a reference. */
1
3
  .lds-ellipsis {
2
4
  display: inline-block;
3
5
  position: relative;
@@ -193,4 +195,4 @@
193
195
  100% {
194
196
  opacity: 0;
195
197
  }
196
- }
198
+ }