@oardi/css-utils 0.19.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.
package/package.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@oardi/css-utils",
3
+ "version": "0.19.0",
4
+ "author": "Ardian Shala",
5
+ "homepage": "https://css-utils.oardi.com",
6
+ "description": "Powerful set of semantic css classes with support for breakpoints, directions and spacings",
7
+ "main": "scss/index.scss",
8
+ "files": [
9
+ "scss"
10
+ ],
11
+ "license": "MIT",
12
+ "scripts": {
13
+ "build": "mkdir -p dist && cp -r scss dist/"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ }
18
+ }
package/readme.md ADDED
@@ -0,0 +1,75 @@
1
+ # CSS Utilies
2
+
3
+ Powerful set of CSS Utility classes for Colors, Typography, Spacings, Flex and CSS Grid.
4
+
5
+ ### Showcase
6
+
7
+ Browse the Showcase [here](https://css-utils.oardi.com/)
8
+
9
+ ### Install package
10
+
11
+ ```
12
+ npm i @oardi/css-utils
13
+ ```
14
+
15
+ ### Import SCSS files
16
+
17
+ #### Option 1 - Import full library
18
+
19
+ This will import the theme with all utility classes and their responsive classes as well as predefined components. This will result in a bundle size around 44kb.
20
+
21
+ ```scss
22
+ @use '@oardi/css-utils/scss/index.scss';
23
+ @use '@oardi/css-utils/scss/components.scss';
24
+ ```
25
+
26
+ #### Option 2 - Import minimal set only
27
+
28
+ To reduce the bundle size, import only what you really need or use a tool like PurgeCSS.
29
+
30
+ Example of a minimal set for colors, typography and spacings like margins and paddings.
31
+
32
+ ```scss
33
+ @use '@oardi/css-utils/scss/variables.scss';
34
+ @use '@oardi/css-utils/scss/typography.scss';
35
+ @use '@oardi/css-utils/scss/spacings.scss';
36
+ ```
37
+
38
+ #### Option 3 - Import specific component only
39
+
40
+ You can import only specific predefined components as well.
41
+
42
+ ```scss
43
+ @use '@oardi/css-utils/scss/variables.scss';
44
+ @use '@oardi/css-utils/scss/components/button.scss';
45
+ ```
46
+
47
+ ### Use Utility classes
48
+
49
+ ```html
50
+ <div class="text-center">some text</div>
51
+ ```
52
+
53
+ This will render a centered text:
54
+
55
+ <div class="text-center">
56
+ some text
57
+ </div>
58
+
59
+ ### Use predefined component classes
60
+
61
+ ```html
62
+ <button class="btn btn-primary">some button text</button>
63
+ ```
64
+
65
+ will render as:
66
+
67
+ <button class="btn btn-primary">some button text</button>
68
+
69
+ ### Credits and Inspiration
70
+
71
+ The main Frameworks which inspired me to create this set of CSS Utility Classes:
72
+
73
+ - [Twitter Bootstrap](https://getbootstrap.com/)
74
+ - [TailwindCSS](https://tailwindcss.com/)
75
+ - [FontAwesome](https://fontawesome.com/)
@@ -0,0 +1,107 @@
1
+ @use 'sass:map';
2
+ @use '../theme.scss' as theme;
3
+
4
+ :root {
5
+ --button-padding: 5px 14px;
6
+ --button-border-width: 2px;
7
+ --button-text-highlight: var(--gray-90);
8
+ --button-icon-highlight: var(--gray-90);
9
+ --button-disabled-bg-color: var(--gray-80);
10
+ }
11
+
12
+ .btn-base {
13
+ border-width: var(--button-border-width);
14
+ border-style: solid;
15
+ background-color: transparent;
16
+ border-color: transparent;
17
+ color: var(--font-color);
18
+ transition: all 0.3s ease;
19
+ -webkit-tap-highlight-color: transparent;
20
+ touch-action: manipulation; // ios fix
21
+
22
+ &:hover {
23
+ cursor: pointer;
24
+ text-decoration: none;
25
+ }
26
+
27
+ &[disabled]:hover,
28
+ [disabled]:focus {
29
+ cursor: not-allowed;
30
+ box-shadow: none;
31
+ }
32
+
33
+ &:focus {
34
+ outline: 0;
35
+ box-shadow: 0 0 0 0.2rem var(--font-color);
36
+ }
37
+ }
38
+
39
+ .btn {
40
+ @extend .btn-base;
41
+
42
+ border-radius: var(--border-radius);
43
+ line-height: var(--line-height);
44
+ padding: var(--button-padding);
45
+
46
+ &:hover {
47
+ background-color: var(--button-text-highlight);
48
+ border-color: var(--button-text-highlight);
49
+ }
50
+
51
+ &[disabled],
52
+ &[disabled]:hover,
53
+ &[active]:hover {
54
+ color: var(--gray-30);
55
+ box-shadow: none;
56
+ background-color: var(--button-disabled-bg-color);
57
+ outline: 0;
58
+ border-color: var(--button-disabled-bg-color);
59
+ }
60
+ }
61
+
62
+ @each $name, $value in map.get(theme.$theme, colors) {
63
+ .btn-#{$name} {
64
+ color: var(--on-#{$name});
65
+ background-color: var(--#{$name});
66
+ border-color: var(--#{$name});
67
+
68
+ &:hover,
69
+ &:active {
70
+ background-color: var(--#{$name}-dark);
71
+ border-color: var(--#{$name}-dark);
72
+ }
73
+
74
+ &:focus {
75
+ box-shadow: 0 0 0 0.2rem var(--#{$name}-light);
76
+ }
77
+ }
78
+
79
+ .btn-#{$name}-outline {
80
+ color: var(--#{$name});
81
+ background-color: transparent;
82
+ border-color: var(--#{$name});
83
+
84
+ &:hover,
85
+ &:active {
86
+ color: var(--on-#{$name});
87
+ background-color: var(--#{$name}-dark);
88
+ border-color: var(--#{$name}-dark);
89
+ }
90
+
91
+ &:focus {
92
+ box-shadow: 0 0 0 0.2rem var(--#{$name}-light);
93
+ }
94
+ }
95
+
96
+ .btn-#{$name}-text {
97
+ color: var(--#{$name});
98
+
99
+ &:focus {
100
+ box-shadow: 0 0 0 0.2rem var(--#{$name}-light);
101
+ }
102
+ }
103
+ }
104
+
105
+ .btn-rounded {
106
+ border-radius: 50px;
107
+ }
@@ -0,0 +1,25 @@
1
+ :root {
2
+ --card-bg-color: var(--white);
3
+ --card-border-color: transparent;
4
+ --card-border-width: 1px;
5
+ --card-body-padding: 1rem;
6
+ }
7
+
8
+ .card {
9
+ background-color: var(--card-bg-color);
10
+ border: var(--card-border-width) solid var(--card-border-color);
11
+ border-radius: var(--border-radius);
12
+
13
+ .card-title {
14
+ // font-weight: bold;
15
+ }
16
+
17
+ .card-title + * {
18
+ margin-top: 1rem;
19
+ }
20
+
21
+ .card-body {
22
+ min-height: 1px;
23
+ padding: var(--card-body-padding);
24
+ }
25
+ }
@@ -0,0 +1,102 @@
1
+ @use 'sass:map';
2
+ @use '../theme.scss';
3
+
4
+ :root {
5
+ --chip-label-padding: 0 7px;
6
+ --chip-border-width: 2px;
7
+ --chip-text-highlight: var(--gray-90);
8
+ --chip-border-radius: 16px;
9
+ --chip-disabled-bg-color: var(--gray-80);
10
+ }
11
+
12
+ .chip-base {
13
+ display: inline-flex;
14
+ border-width: var(--button-border-width);
15
+ border-style: solid;
16
+ background-color: transparent;
17
+ border-color: transparent;
18
+ color: var(--font-color);
19
+ transition: all 0.3s ease;
20
+ -webkit-tap-highlight-color: transparent;
21
+ touch-action: manipulation; // ios fix
22
+
23
+ &:hover {
24
+ cursor: pointer;
25
+ text-decoration: none;
26
+ }
27
+
28
+ &[data-disabled]:hover,
29
+ [data-disabled]:focus {
30
+ cursor: not-allowed;
31
+ box-shadow: none;
32
+ }
33
+
34
+ &:focus {
35
+ outline: 0;
36
+ box-shadow: 0 0 0 0.2rem var(--font-color);
37
+ }
38
+ }
39
+
40
+ .chip {
41
+ @extend .chip-base;
42
+
43
+ border-radius: var(--chip-border-radius);
44
+ line-height: var(--line-height);
45
+
46
+ &:hover {
47
+ background-color: var(--button-text-highlight);
48
+ border-color: var(--button-text-highlight);
49
+ }
50
+
51
+ &[data-disabled],
52
+ &[data-disabled]:hover,
53
+ &[active]:hover {
54
+ color: var(--gray-30);
55
+ box-shadow: none;
56
+ background-color: var(--button-disabled-bg-color);
57
+ outline: 0;
58
+ border-color: var(--button-disabled-bg-color);
59
+ }
60
+
61
+ .chip-label {
62
+ display: inline-flex;
63
+ flex-shrink: 0;
64
+ padding: var(--chip-label-padding);
65
+ }
66
+ }
67
+
68
+ @each $name, $value in map.get(theme.$theme, colors) {
69
+ .chip-#{$name} {
70
+ color: var(--on-#{$name});
71
+ fill: var(--on-#{$name});
72
+ background-color: var(--#{$name});
73
+ border-color: var(--#{$name});
74
+
75
+ &:hover,
76
+ &:active {
77
+ background-color: var(--#{$name}-dark);
78
+ border-color: var(--#{$name}-dark);
79
+ }
80
+
81
+ &:focus {
82
+ box-shadow: 0 0 0 0.2rem var(--#{$name}-light);
83
+ }
84
+ }
85
+
86
+ .chip-#{$name}-outline {
87
+ color: var(--#{$name});
88
+ background-color: transparent;
89
+ border-color: var(--#{$name});
90
+
91
+ &:hover,
92
+ &:active {
93
+ color: var(--on-#{$name});
94
+ background-color: var(--#{$name}-dark);
95
+ border-color: var(--#{$name}-dark);
96
+ }
97
+
98
+ &:focus {
99
+ box-shadow: 0 0 0 0.2rem var(--#{$name}-light);
100
+ }
101
+ }
102
+ }
@@ -0,0 +1,37 @@
1
+ :root {
2
+ --drawer-bg-color: #ffffff;
3
+ }
4
+
5
+ .drawer {
6
+ display: flex;
7
+ flex-direction: column;
8
+ position: fixed;
9
+ top: 0;
10
+ left: -100%;
11
+ height: 100dvh;
12
+ width: min(20rem, 100%);
13
+ z-index: 1045;
14
+ border-right: 2px solid var(--gray-90);
15
+ justify-content: start;
16
+ background-color: var(--white);
17
+ transition: left 250ms ease-out;
18
+
19
+ &.open ~ .overlay {
20
+ display: block;
21
+ }
22
+
23
+ &.open {
24
+ left: 0;
25
+ }
26
+
27
+ .drawer-title-container {
28
+ display: flex;
29
+ padding: 0.5rem 1rem;
30
+ align-items: center;
31
+
32
+ .drawer-title {
33
+ display: flex;
34
+ flex: 1;
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,98 @@
1
+ :root {
2
+ --expansion-panel-border-color: var(--gray-90);
3
+ --expansion-panel-header-bg-color: #ffffff;
4
+ --expansion-panel-content-bg-color: #ffffff;
5
+ --expansion-panel-header-hover-bg-color: var(--highlight);
6
+ --expansion-panel-header-padding: 1.25rem 2.5rem 1.25rem 1.25rem;
7
+ --expansion-panel-inner-padding: 1.25rem;
8
+ }
9
+
10
+ .expansion-panel-container {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: 0.5rem;
14
+
15
+ .expansion-panel {
16
+ color: var(--font-color);
17
+ border: 1px solid var(--expansion-panel-border-color);
18
+ border-radius: var(--border-radius);
19
+ background-color: var(--expansion-panel-header-bg-color);
20
+ transition: all 0.3s ease;
21
+
22
+ &:focus {
23
+ outline: 0;
24
+ box-shadow: var(--box-shadow);
25
+ }
26
+
27
+ .expansion-panel-header {
28
+ display: flex;
29
+ align-items: center;
30
+ background-color: var(--expansion-panel-header-bg-color);
31
+ padding: var(--expansion-panel-header-padding);
32
+ border-top-left-radius: var(--border-radius);
33
+ border-top-right-radius: var(--border-radius);
34
+ position: relative;
35
+ -webkit-tap-highlight-color: transparent;
36
+
37
+ &::after {
38
+ content: '+';
39
+ position: absolute;
40
+ right: 16px;
41
+ width: 32px;
42
+ height: 32px;
43
+ display: flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ font-size: 1.75rem;
47
+ transition: transform 0.5s;
48
+ }
49
+
50
+ &:hover {
51
+ cursor: pointer;
52
+ color: var(--primary) !important;
53
+ }
54
+
55
+ &:focus {
56
+ outline: 0;
57
+ }
58
+ }
59
+
60
+ .expansion-panel-content {
61
+ background-color: var(--expansion-panel-content-bg-color);
62
+ border-bottom-left-radius: var(--border-radius);
63
+ border-bottom-right-radius: var(--border-radius);
64
+
65
+ max-height: 0;
66
+ overflow: hidden;
67
+ transition: max-height 0.25s ease-out;
68
+
69
+ .expansion-panel-inner {
70
+ padding: var(--expansion-panel-inner-padding);
71
+ transition: transform 0.25s linear;
72
+ transform: translateY(-10px);
73
+ }
74
+ }
75
+
76
+ &.active {
77
+ .expansion-panel-header::after {
78
+ content: '-';
79
+ }
80
+
81
+ .expansion-panel-content {
82
+ max-height: 500px;
83
+ opacity: 1;
84
+
85
+ .expansion-panel-inner {
86
+ transform: translateY(0);
87
+ }
88
+ }
89
+ }
90
+
91
+ &:not(.active) {
92
+ .expansion-panel-header {
93
+ border-bottom-left-radius: var(--border-radius);
94
+ border-bottom-right-radius: var(--border-radius);
95
+ }
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,138 @@
1
+ :root {
2
+ --input-bg-color: #ffffff;
3
+ --input-border-width: 1px;
4
+ --input-border-color: var(--gray-80);
5
+ }
6
+
7
+ .form-control {
8
+ display: block;
9
+ width: 100%;
10
+ padding: 0.375rem 0.75rem;
11
+ font-size: 1rem;
12
+ font-weight: 400;
13
+ line-height: var(--line-height);
14
+ -webkit-appearance: none;
15
+ -moz-appearance: none;
16
+ appearance: none;
17
+ color: var(--font-color);
18
+ background-color: var(--input-bg-color);
19
+ background-clip: padding-box;
20
+ border: var(--input-border-width) solid var(--input-border-color);
21
+ border-radius: var(--border-radius);
22
+ transition: transform 0.2s ease;
23
+
24
+ &:focus {
25
+ background-color: var(--input-bg-color);
26
+ border-color: var(--primary-dark);
27
+ outline: 0;
28
+ box-shadow: var(--box-shadow);
29
+ }
30
+
31
+ &.invalid {
32
+ border: var(--input-border-width) solid var(--error) !important;
33
+ padding-right: calc(1.5em + 0.75rem) !important;
34
+ &:focus {
35
+ box-shadow: var(--box-shadow-error);
36
+ }
37
+ }
38
+
39
+ &[disabled],
40
+ &[disabled]:hover,
41
+ &[disabled]:focus {
42
+ cursor: not-allowed;
43
+ box-shadow: none;
44
+ background-color: var(--gray-90);
45
+ }
46
+
47
+ &::placeholder {
48
+ color: var(--gray-50);
49
+ }
50
+ }
51
+
52
+ textarea.form-control {
53
+ height: 80px;
54
+ }
55
+
56
+ .form-check {
57
+ display: flex;
58
+ flex-direction: row;
59
+ align-items: center;
60
+ gap: 0.75rem;
61
+
62
+ .form-check-input {
63
+ flex-shrink: 0;
64
+ appearance: none;
65
+ -webkit-appearance: none;
66
+ width: 16px;
67
+ height: 16px;
68
+ border: var(--input-border-width) solid var(--input-border-color);
69
+ border-radius: 4px;
70
+ position: relative;
71
+ background-color: var(--input-bg-color);
72
+ cursor: pointer;
73
+ transition: transform 0.2s ease;
74
+
75
+ &:checked {
76
+ background-color: var(--primary);
77
+ border-color: var(--primary);
78
+ }
79
+
80
+ &:checked::after {
81
+ content: '';
82
+ position: absolute;
83
+ left: 4px;
84
+ top: 1px;
85
+ width: 5px;
86
+ height: 10px;
87
+ border: solid white;
88
+ border-width: 0 2px 2px 0;
89
+ transform: rotate(45deg);
90
+ }
91
+
92
+ &.invalid {
93
+ border: var(--input-border-width) solid var(--error) !important;
94
+
95
+ &:focus {
96
+ box-shadow: var(--box-shadow-error);
97
+ }
98
+ }
99
+
100
+ &:required ~ .form-label::after {
101
+ content: ' *';
102
+ }
103
+
104
+ &:focus {
105
+ box-shadow: var(--box-shadow);
106
+ outline: 0;
107
+ }
108
+
109
+ &[disabled],
110
+ &[disabled]:hover,
111
+ &[disabled]:focus {
112
+ cursor: not-allowed;
113
+ box-shadow: none;
114
+ background-color: var(--gray-90);
115
+ }
116
+ }
117
+
118
+ .form-label {
119
+ margin-bottom: 0;
120
+ }
121
+
122
+ &:required ~ .form-label::after {
123
+ content: ' *';
124
+ }
125
+ }
126
+
127
+ .form-label {
128
+ margin-bottom: 0.5rem;
129
+ display: inline-block;
130
+
131
+ &:has(~ .form-control:required)::after {
132
+ content: ' *';
133
+ }
134
+
135
+ &:hover {
136
+ cursor: pointer;
137
+ }
138
+ }