@zuii/core 1.0.0 → 1.2.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/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @zuii/core
2
+
3
+ ## 1.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 27c2495: feat(form): centralisation des styles form dans core et intégration complète dans booking (BEM, classes dynamiques)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuii/core",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Styles de base et utilitaires pour zuii",
5
5
  "main": "./src/styles/main.scss",
6
6
  "exports": {
@@ -0,0 +1,29 @@
1
+ @use "../../tokens" as tokens;
2
+
3
+ /**
4
+ * Mixin pour le style de base d'un conteneur de menu (Dropdown, ContextMenu, etc.).
5
+ * Uniformise l'apparence des menus avec des ombres, des bordures et des animations.
6
+ */
7
+ @mixin menu-container-base {
8
+ --menu-border-radius: var(--border-radius-sm, 0.375rem);
9
+
10
+ position: fixed;
11
+ z-index: 1000;
12
+ min-width: 160px;
13
+ background-color: var(--white, #fff);
14
+ border: 1px solid var(--gray-200, #e2e8f0);
15
+ border-radius: var(--menu-border-radius);
16
+ box-shadow: var(--shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.1));
17
+ padding: 4px;
18
+ outline: none;
19
+ animation: menu-fade-in 0.1s ease-out;
20
+ }
21
+
22
+ @keyframes menu-fade-in {
23
+ from {
24
+ opacity: 0;
25
+ }
26
+ to {
27
+ opacity: 1;
28
+ }
29
+ }
@@ -0,0 +1,64 @@
1
+ @use "./form.scss" as *;
2
+ @use "../../Button/style/mixins" as *;
3
+
4
+ .file-input__wrapper {
5
+ width: 100%;
6
+ display: flex;
7
+ flex-direction: column;
8
+
9
+ // Espace pour le dashboard
10
+ .file-input__content {
11
+ border-radius: 12px;
12
+ overflow: hidden;
13
+ }
14
+ }
15
+
16
+ .uppy-Dashboard-browse,
17
+ .uppy-DashboardContent-addMore,
18
+ .uppy-DashboardContent-back,
19
+ .uppy-DashboardContent-save {
20
+ color: var(--primary);
21
+ }
22
+
23
+ .uppy-Webcam-button{
24
+ @include btn-icon;
25
+ width: auto;
26
+ margin: 0
27
+ }
28
+
29
+ .uppy-Webcam-button.btn-danger{
30
+ @include btn-icon;
31
+ --btn-border-color: var(--danger);
32
+ --btn-bg: var(--danger);
33
+ --btn-hover-bg: var(--danger-dark);
34
+ --btn-hover-border-color: var(--danger-dark);
35
+ --btn-active-bg: var(--danger-dark);
36
+ --btn-active-border-color: var(--danger-dark);
37
+
38
+ background-color: var(--btn-bg);
39
+
40
+ &:hover{
41
+ --btn-bg: var(--btn-hover-bg);
42
+ }
43
+ }
44
+
45
+ .uppy-DashboardContent-pane,
46
+ .uppy-Informer,
47
+ .uppy-DashboardContent-bar{
48
+ z-index: 0;
49
+ }
50
+
51
+ .uppy-Dashboard-Item-previewIcon{
52
+ z-index: 1;
53
+ }
54
+
55
+
56
+ .uppy-Dashboard-Item-action:not(.uppy-Dashboard-Item-action.uppy-Dashboard-Item-action--remove) {
57
+ pointer-events: auto !important;
58
+ opacity: 1 !important;
59
+ cursor: pointer !important;
60
+ }
61
+
62
+ .uppy-Dashboard-Item-action.uppy-Dashboard-Item-action--remove{
63
+ z-index: 1;
64
+ }
@@ -0,0 +1,8 @@
1
+ .form-check-input:checked {
2
+ background-color: var(--accent);
3
+ border-color: var(--accent);
4
+ }
5
+
6
+ .form-check-input:focus {
7
+ box-shadow: 0 0 2px 4px color-mix(in srgb, var(--primary), transparent 80%);
8
+ }
@@ -0,0 +1,48 @@
1
+ @use "../../Button/style/mixins" as *;
2
+ @use "../style/form.scss" as *;
3
+
4
+ .form__input.form__input--color {
5
+ --form-border: none;
6
+
7
+ padding: 0;
8
+ min-height: 33px;
9
+
10
+ &[disabled] {
11
+ .color-selection {
12
+ cursor: default;
13
+ }
14
+ }
15
+
16
+ .color-selection {
17
+ cursor: pointer;
18
+ border: 1px dashed color-mix(in srgb, var(--primary), transparent 60%);
19
+ padding: .6rem;
20
+ width: 100%;
21
+ border-radius: var(--radius-base);
22
+ }
23
+
24
+
25
+ }
26
+
27
+ .pcr-app .pcr-interaction .pcr-result{
28
+ @extend .form__input;
29
+ margin: 0;
30
+ margin-top: .5rem;
31
+
32
+ &:focus{
33
+ box-shadow: none;
34
+ border-color: var(--accent);
35
+
36
+ }
37
+ }
38
+
39
+ .pcr-app .pcr-interaction input[type="button"] {
40
+ @include btn-primary;
41
+ margin-top: .5rem;
42
+ margin-left: .2rem;
43
+
44
+ &.active{
45
+ box-shadow: none;
46
+ }
47
+ }
48
+
@@ -0,0 +1,84 @@
1
+ .form__input:has([class^="flatpickr"]) {
2
+ flex-direction: column;
3
+ gap: 0;
4
+
5
+
6
+ }
7
+
8
+ .form-date-control {
9
+ width: 10ch;
10
+ text-align: center;
11
+ }
12
+
13
+ .flatpickr-day{
14
+ color: currentcolor;
15
+ border-radius: var(--radius-base);
16
+ }
17
+
18
+ .flatpickr-day.flatpickr-disabled,
19
+ .flatpickr-day.flatpickr-disabled:hover,
20
+ .flatpickr-day.prevMonthDay,
21
+ .flatpickr-day.nextMonthDay,
22
+ .flatpickr-day.notAllowed,
23
+ .flatpickr-day.notAllowed.prevMonthDay,
24
+ .flatpickr-day.notAllowed.nextMonthDay{
25
+ color: color-mix(in srgb, currentcolor,transparent 60%);
26
+ }
27
+
28
+ .flatpickr-day.selected,
29
+ .flatpickr-day.startRange,
30
+ .flatpickr-day.endRange,
31
+ .flatpickr-day.selected.inRange,
32
+ .flatpickr-day.startRange.inRange,
33
+ .flatpickr-day.endRange.inRange,
34
+ .flatpickr-day.selected:focus,
35
+ .flatpickr-day.startRange:focus,
36
+ .flatpickr-day.endRange:focus,
37
+ .flatpickr-day.selected:hover,
38
+ .flatpickr-day.startRange:hover,
39
+ .flatpickr-day.endRange:hover,
40
+ .flatpickr-day.selected.prevMonthDay,
41
+ .flatpickr-day.startRange.prevMonthDay,
42
+ .flatpickr-day.endRange.prevMonthDay,
43
+ .flatpickr-day.selected.nextMonthDay,
44
+ .flatpickr-day.startRange.nextMonthDay,
45
+ .flatpickr-day.endRange.nextMonthDay{
46
+ background-color: var(--primary);
47
+ border-color: var(--primary);
48
+ color: var(--white);
49
+ }
50
+
51
+ .flatpickr-months .flatpickr-prev-month:hover svg,
52
+ .flatpickr-months .flatpickr-next-month:hover svg{
53
+ fill: var(--secondary);
54
+ }
55
+
56
+ .flatpickr-day.inRange,
57
+ .flatpickr-day.prevMonthDay.inRange,
58
+ .flatpickr-day.nextMonthDay.inRange,
59
+ .flatpickr-day.today.inRange,
60
+ .flatpickr-day.prevMonthDay.today.inRange,
61
+ .flatpickr-day.nextMonthDay.today.inRange,
62
+ .flatpickr-day:hover,
63
+ .flatpickr-day.prevMonthDay:hover,
64
+ .flatpickr-day.nextMonthDay:hover,
65
+ .flatpickr-day:focus,
66
+ .flatpickr-day.prevMonthDay:focus,
67
+ .flatpickr-day.nextMonthDay:focus{
68
+ background-color: var(--primary-light);
69
+ border-color: var(--primary-light);
70
+ color: var(--white);
71
+ }
72
+
73
+ .form-date-control{
74
+ width: 100%;
75
+ text-align: start;
76
+ }
77
+
78
+ .flatpickr-wrapper:has(.flatpickr-input){
79
+ display: none;
80
+ }
81
+ .flatpickr-wrapper:has(.flatpickr-input.active){
82
+ display: flex;
83
+ }
84
+
@@ -0,0 +1,9 @@
1
+ .form__input:has(.is-invalid) ~ .invalid-feedback{
2
+ display: block;
3
+ }
4
+
5
+
6
+ .form-control.is-valid,
7
+ .form-control.is-invalid{
8
+ background: none;
9
+ }
@@ -0,0 +1,17 @@
1
+ .file-input {
2
+ margin: var(--spacing-sm) 0;
3
+ }
4
+
5
+ .uppy-Dashboard-browse,
6
+ .uppy-Root {
7
+ color: var(--accent);
8
+ }
9
+
10
+ .uppy-Dashboard-inner{
11
+ background-color: var(--white);
12
+ border: var(--border-width) solid var(--border-color);
13
+ }
14
+
15
+ .uppy-StatusBar:not([aria-hidden="true"]).is-waiting{
16
+ background-color: var(--white);
17
+ }
@@ -0,0 +1,152 @@
1
+ .form__input{
2
+ --form-placeholder-color: color-mix(in srgb, var(--body-color), transparent 70%);
3
+ --form-border: var(--border-width) solid var(--border-color);
4
+ }
5
+
6
+ .form__input:not(:has(.choices)){
7
+ padding: var(--spacing-xs) var(--spacing-sm);
8
+ }
9
+
10
+ .choices{
11
+ width: 100%;
12
+ }
13
+
14
+ .choices__inner{
15
+ padding: 0;
16
+ background: transparent;
17
+ border-color: transparent;
18
+ display: flex;
19
+ align-items: center;
20
+ padding-left: 1rem;
21
+ }
22
+
23
+ .form__input{
24
+ background-color: var(--white);
25
+ border-radius: var(--radius-base);
26
+ border: var(--form-border);
27
+ margin: var(--spacing-sm) 0;
28
+ display: flex;
29
+ gap: var(--spacing-xs);
30
+ transition: all .2s cubic-bezier(0.455, 0.03, 0.515, 0.955);
31
+ flex: 1;
32
+
33
+ &[type="checkbox"],
34
+ &[type="radio"] {
35
+ appearance: none;
36
+ width: 1.25rem;
37
+ height: 1.25rem;
38
+ background-color: var(--white);
39
+ border: 2px solid var(--color-gray-300);
40
+ border-radius: var(--radius-sm);
41
+ cursor: pointer;
42
+ position: relative;
43
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
44
+ vertical-align: middle;
45
+ margin-top: -2px;
46
+
47
+ &::after {
48
+ content: '';
49
+ position: absolute;
50
+ top: 50%;
51
+ left: 50%;
52
+ width: 0.75rem;
53
+ height: 0.75rem;
54
+ background-color: var(--white);
55
+ mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>');
56
+ mask-repeat: no-repeat;
57
+ mask-size: contain;
58
+ transform: translate(-50%, -50%) scale(0);
59
+ transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
60
+ }
61
+
62
+ &:checked {
63
+ background-color: var(--primary);
64
+ border-color: var(--primary);
65
+
66
+ &::after {
67
+ transform: translate(-50%, -50%) scale(1);
68
+ }
69
+ }
70
+
71
+ &:focus {
72
+ outline: none;
73
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary), transparent 80%);
74
+ border-color: var(--primary);
75
+ }
76
+
77
+ &:hover:not(:checked):not(:disabled) {
78
+ border-color: var(--primary);
79
+ background-color: color-mix(in srgb, var(--primary), transparent 95%);
80
+ }
81
+
82
+ &:disabled {
83
+ background-color: var(--color-gray-100);
84
+ border-color: var(--color-gray-200);
85
+ cursor: not-allowed;
86
+ opacity: 0.7;
87
+ }
88
+ }
89
+
90
+ &[type="radio"] {
91
+ border-radius: var(--radius-pill);
92
+
93
+ &::after {
94
+ mask-image: none;
95
+ border-radius: var(--radius-pill);
96
+ width: 0.5rem;
97
+ height: 0.5rem;
98
+ }
99
+ }
100
+
101
+ .form-control:not([type="checkbox"]):not([type="radio"]),
102
+ textarea {
103
+ padding: 0;
104
+ background-color: transparent;
105
+ border-radius: var(--radius-none);
106
+ border: none;
107
+ line-height: 1.3;
108
+
109
+ &:focus,
110
+ &:focus-visible {
111
+ border:none;
112
+ box-shadow: none;
113
+ outline: none;
114
+ }
115
+ }
116
+
117
+ }
118
+
119
+ .form__input:has(.form-control:focus){
120
+ border-color: var(--accent);
121
+ }
122
+
123
+ .group--vertical .form__input{
124
+ width: 100%;
125
+ }
126
+
127
+ input[type="checkbox"],
128
+ input[type="radio"]{
129
+ --border-color: var(--primary);
130
+ }
131
+
132
+ .form__group .form-label{
133
+ margin-bottom: 0;
134
+ }
135
+
136
+
137
+ .form__input:has(.form-control:disabled){
138
+ border-color: var(--gray-200);
139
+ background-color: var(--gray-100);
140
+
141
+ .form-control,
142
+ .form-control::placeholder,
143
+ .icon{
144
+ color: var(--form-placeholder-color);
145
+ }
146
+ }
147
+
148
+ input::placeholder,
149
+ textarea::placeholder{
150
+ color: var(--form-placeholder-color);
151
+ }
152
+
@@ -0,0 +1,24 @@
1
+ @layer vendor {
2
+ // @import "tel-input";
3
+
4
+ }
5
+ @import "choices.js/public/assets/styles/choices.css" layer(vendor);
6
+ @import "flatpickr/dist/flatpickr.css" layer(vendor);
7
+ @import "@simonwep/pickr/dist/themes/nano.min.css" layer(vendor);
8
+ @import "@uppy/core/css/style.min.css" layer(vendor);
9
+ @import "@uppy/dashboard/css/style.min.css" layer(vendor);
10
+ @import "@uppy/webcam/css/style.min.css" layer(vendor);
11
+
12
+ @layer components {
13
+ @import "form";
14
+ // @import "select";
15
+ @import "checkbox";
16
+ @import "number-input";
17
+ // @import "color";
18
+ @import "date";
19
+ @import "feedback";
20
+
21
+ // @import "range-input";
22
+ // @import "_file-input";
23
+
24
+ }
@@ -0,0 +1,53 @@
1
+ .form {
2
+
3
+ /* Chrome, Safari, Edge, Opera */
4
+ &-control::-webkit-outer-spin-button,
5
+ &-control::-webkit-inner-spin-button {
6
+ -webkit-appearance: none;
7
+ margin: 0;
8
+ }
9
+
10
+ /* Firefox */
11
+ &-control[type=number] {
12
+ -moz-appearance: textfield;
13
+ appearance: textfield;
14
+ }
15
+
16
+ &__addon {
17
+ cursor: pointer;
18
+ user-select: none;
19
+ transition: background-color 0.2s;
20
+
21
+ &:hover {
22
+ background-color: var(--bs-gray-200);
23
+ }
24
+
25
+ &:active {
26
+ background-color: var(--bs-gray-300);
27
+ }
28
+ }
29
+
30
+ }
31
+
32
+ fieldset:disabled {
33
+ --border-color: color-mix(in srgb, currentColor, transparent 70%);
34
+
35
+
36
+ .number-input {
37
+
38
+ .number-input__addon {
39
+ pointer-events: none;
40
+ }
41
+
42
+ input {
43
+ background-color: transparent;
44
+ color: color-mix(in srgb, currentColor, transparent 70%);
45
+ }
46
+
47
+ .input-group-text {
48
+ background-color: transparent;
49
+ color: color-mix(in srgb, currentColor, transparent 70%);
50
+ }
51
+ }
52
+
53
+ }
@@ -0,0 +1,24 @@
1
+ .range-input {
2
+ position: relative;
3
+ width: 100%;
4
+
5
+ &__badge-wrapper {
6
+ position: absolute;
7
+ top: -25px;
8
+ left: 0;
9
+ width: 100%;
10
+ pointer-events: none;
11
+ }
12
+
13
+ &__badge {
14
+ position: absolute;
15
+ transform: translateX(-50%);
16
+ white-space: nowrap;
17
+ transition: left 0.1s ease-out;
18
+ }
19
+
20
+ &__control {
21
+ width: 100%;
22
+ cursor: pointer;
23
+ }
24
+ }
@@ -0,0 +1,92 @@
1
+ @use "../components/menu/menu-base" as *;
2
+
3
+ .choices{
4
+ width: 100%;
5
+ display: flex;
6
+ align-items: center;
7
+ padding: var(--spacing-xs) var(--spacing-sm);
8
+ padding: 0 var(--spacing-sm);
9
+ width: 100%;
10
+ // line-height: 1.49;
11
+ }
12
+
13
+ // .form__input:has(.choices){
14
+ // padding-top: 4px !important;
15
+ // padding-bottom: 4px !important;
16
+ // }
17
+
18
+
19
+ .choices__placeholder{
20
+ opacity: 1;
21
+ color: var(--form-placeholder-color);
22
+ }
23
+
24
+ .choices__inner,
25
+ .choices__input{
26
+ background-color: transparent;
27
+ border: none;
28
+ border-radius: 0;
29
+ min-height: initial;
30
+ margin: 0;
31
+ display: flex;
32
+ align-items: center;
33
+ padding-left: .5rem;
34
+ }
35
+
36
+ .choices:not([data-type="select-multiple"]) .choices__inner{
37
+ display: flex;
38
+ align-items: center;
39
+ gap: var(--spacing-xs);
40
+ }
41
+
42
+ .choices__list--single{
43
+ padding: 0;
44
+ }
45
+
46
+ .choices[data-type*="select-one"]::after{
47
+ content: "";
48
+ mask-image: var(--icons-chevron-down);
49
+ mask-size: contain;
50
+ mask-repeat: no-repeat;
51
+ mask-position: center;
52
+ width: 1rem;
53
+ height: 1rem;
54
+ background: currentColor;
55
+ border: none;
56
+ display: block;
57
+ top: 0;
58
+ position: relative;
59
+ right: 0;
60
+ margin-top: 0;
61
+ }
62
+
63
+
64
+
65
+ .choices__list--multiple .choices__item{
66
+ border-radius: var(--radius-pill);
67
+ background-color: var(--accent);
68
+ border: var(--border-width) solid var(--accent-dark);
69
+ }
70
+
71
+ .choices__list--dropdown {
72
+ @include menu-container-base;
73
+ position: absolute;
74
+ width: 100%;
75
+ margin-top: 4px;
76
+ padding: 4px;
77
+ }
78
+
79
+ .select__flag {
80
+ margin-right: var(--spacing-xs);
81
+ width: 20px;
82
+ height: 15px;
83
+ display: inline-block;
84
+ }
85
+
86
+ .form__input:has(.choices.is-disabled){
87
+ --border-color: color-mix(in srgb, currentColor, transparent 70%);
88
+ color: color-mix(in srgb, currentColor , transparent 70%);
89
+
90
+ }
91
+
92
+
@@ -0,0 +1,2 @@
1
+ @use "intl-tel-input/build/css/intlTelInput.css" as *;
2
+