5htp-core 0.4.1 → 0.4.2

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.
Files changed (37) hide show
  1. package/package.json +2 -3
  2. package/src/client/app/index.ts +8 -7
  3. package/src/client/assets/css/components/button.less +13 -9
  4. package/src/client/assets/css/components/table.less +13 -1
  5. package/src/client/assets/css/core.less +0 -1
  6. package/src/client/assets/css/text/text.less +1 -2
  7. package/src/client/assets/css/utils/layouts.less +8 -0
  8. package/src/client/components/Form.ts +7 -1
  9. package/src/client/components/Select/index.tsx +14 -2
  10. package/src/client/components/Table/index.tsx +56 -80
  11. package/src/client/components/containers/Popover/index.tsx +2 -2
  12. package/src/client/components/input/Checkbox/index.tsx +6 -4
  13. package/src/client/components/inputv3/date/Calendar.css +156 -0
  14. package/src/client/components/inputv3/date/Clock.css +62 -0
  15. package/src/client/components/inputv3/date/DateTimePicker.css +132 -0
  16. package/src/client/components/inputv3/date/index.tsx +9 -9
  17. package/src/client/components/inputv3/index.tsx +36 -38
  18. package/src/client/services/router/index.tsx +3 -2
  19. package/src/client/services/router/request/api.ts +27 -10
  20. package/src/client/services/router/request/index.ts +0 -8
  21. package/src/common/router/layouts.ts +3 -2
  22. package/src/common/validation/schema.ts +2 -5
  23. package/src/common/validation/validators.ts +5 -6
  24. package/src/server/services/database/index.ts +2 -2
  25. package/src/server/services/router/response/index.ts +0 -0
  26. package/src/server/services/router/response/page/document.tsx +4 -6
  27. package/src/client/assets/fonts/Inter.zip +0 -0
  28. package/src/client/assets/fonts/Lato/index.less +0 -71
  29. package/src/client/assets/fonts/Lato/latin-400.woff2 +0 -0
  30. package/src/client/assets/fonts/Lato/latin-700.woff2 +0 -0
  31. package/src/client/assets/fonts/Lato/latin-900.woff2 +0 -0
  32. package/src/client/assets/fonts/Lato/latin-ext-400.woff2 +0 -0
  33. package/src/client/assets/fonts/Lato/latin-ext-700.woff2 +0 -0
  34. package/src/client/assets/fonts/Lato/latin-ext-900.woff2 +0 -0
  35. package/src/client/assets/fonts/Oswald.zip +0 -0
  36. package/src/client/components/inputv3/date/react-calendar.less +0 -143
  37. package/src/client/components/inputv3/date/react-daterange-picker.less +0 -112
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "5htp-core",
3
3
  "description": "Convenient TypeScript framework designed for Performance and Productivity.",
4
- "version": "0.4.1",
4
+ "version": "0.4.2",
5
5
  "author": "Gaetan Le Gac (https://github.com/gaetanlegac)",
6
6
  "repository": "git://github.com/gaetanlegac/5htp-core.git",
7
7
  "license": "MIT",
@@ -13,7 +13,6 @@
13
13
  "framework"
14
14
  ],
15
15
  "dependencies": {
16
- "@wojtekmaj/react-daterange-picker": "^5.0.2",
17
16
  "accepts": "^1.3.7",
18
17
  "activity-detector": "^3.0.0",
19
18
  "ansi-to-html": "^0.7.1",
@@ -65,7 +64,7 @@
65
64
  "picomatch": "^2.3.1",
66
65
  "preact": "^10.5.15",
67
66
  "preact-render-to-string": "^5.1.19",
68
- "react-datetime-picker": "^5.0.3",
67
+ "react-datetime-picker": "^5.6.0",
69
68
  "react-scrollbars-custom": "^4.0.27",
70
69
  "react-slider": "^2.0.1",
71
70
  "react-textarea-autosize": "^8.3.3",
@@ -88,13 +88,13 @@ export default abstract class Application {
88
88
  public bindErrorHandlers() {
89
89
 
90
90
  // Impossible de recup le stacktrace ...
91
- /*window.addEventListener("unhandledrejection", (e) => {
92
- clientBug(JSON.stringify(e))
93
- console.log("unhandledrejection", e.stack);
94
-
95
- });*/
91
+ window.addEventListener("unhandledrejection", (e) => {
92
+ const error = new Error(e.reason); // How to get stacktrace ?
93
+ this.handleError(error);
94
+ });
96
95
 
97
- window.onerror = (message, file, line, col, stacktrace) =>
96
+ window.onerror = (message, file, line, col, stacktrace) => {
97
+ console.error(`Exception catched by method B`, message);
98
98
  this.reportBug({
99
99
  stacktrace: stacktrace?.stack || JSON.stringify({ message, file, line, col })
100
100
  }).then(() => {
@@ -106,9 +106,10 @@ export default abstract class Application {
106
106
  { autohide: false });*/
107
107
 
108
108
  })
109
+ }
109
110
  }
110
111
 
111
- public abstract handleError( error: CoreError | Error, httpCode?: number );
112
+ public abstract handleError( error: CoreError | Error );
112
113
 
113
114
  // TODO: move on app side
114
115
  public reportBug = (infos: TBugReportInfos) => fetch('/feedback/bug/ui', {
@@ -69,7 +69,7 @@
69
69
  z-index: 1; // Make the label on top of ::before for example
70
70
 
71
71
  // Handle overflow
72
- white-space: nowrap;
72
+ //white-space: nowrap;
73
73
  text-overflow: ellipsis;
74
74
  overflow: hidden;
75
75
 
@@ -169,6 +169,9 @@
169
169
 
170
170
  > .label {
171
171
  flex-direction: column;
172
+
173
+ white-space: normal;
174
+ text-align: center;
172
175
  }
173
176
  }
174
177
 
@@ -246,7 +249,7 @@ ul.row {
246
249
 
247
250
  > .label {
248
251
 
249
- display: none;
252
+ visibility: hidden;
250
253
  position: absolute;
251
254
 
252
255
  background: #111;
@@ -261,7 +264,7 @@ ul.row {
261
264
  }
262
265
 
263
266
  &:not([disabled]):hover > .label {
264
- display: block;
267
+ visibility: visible;
265
268
  }
266
269
  }
267
270
  }
@@ -277,15 +280,15 @@ ul.row {
277
280
  position: relative;
278
281
 
279
282
  // Submenu
280
- &:not(:hover) > .btn + .menu,
283
+ &:not(.contPopover):not(:hover) > .btn + .menu,
281
284
  > .btn[disabled] + .menu {
282
- display: none;
285
+ visibility: hidden;
283
286
  }
284
287
  }
285
288
 
286
289
  &.menu > li {
287
290
  &:hover > .btn:not([disabled]):hover > .label {
288
- display: block;
291
+ visibility: visible;
289
292
  }
290
293
  }
291
294
 
@@ -319,7 +322,7 @@ ul.col {
319
322
  }
320
323
 
321
324
  &:not([disabled]):hover > .label {
322
- display: block;
325
+ visibility: visible;
323
326
  }
324
327
  }
325
328
  }
@@ -373,15 +376,16 @@ ul.col {
373
376
 
374
377
  // Submenu
375
378
  ul.row {
379
+
376
380
  .btn.icon > .label,
377
381
  > li > .btn + .menu {
378
382
  bottom: 100%;
379
- margin-bottom: @spacing / 2;
383
+ margin-bottom: 0; // User's mouse shouldnt go outside the li so the hover state is not lost
380
384
  }
381
385
 
382
386
  > li > .btn + .menu.pos-bottom {
383
387
  bottom: auto;
384
388
  top: 100%;
385
- margin-bottom: @spacing / 2;
389
+ margin-top: 0; // User's mouse shouldnt go outside the li so the hover state is not lost
386
390
  }
387
391
  }
@@ -9,7 +9,7 @@ table {
9
9
  width: 100%;
10
10
  padding: 0;
11
11
  border-collapse: separate;
12
- border-spacing: 0 0.5em;
12
+ border-spacing: 0 0; // must be fully managed by padding
13
13
 
14
14
  // By default, chrome disables text inherits
15
15
  line-height: inherit;
@@ -25,6 +25,10 @@ table {
25
25
  padding: 1em 1em;
26
26
  text-align: left;
27
27
 
28
+ + td, th {
29
+ border-left: solid 1px #F5F5F5
30
+ }
31
+
28
32
  &:first-child {
29
33
  padding-left: 2em;
30
34
  }
@@ -48,6 +52,14 @@ table {
48
52
  }
49
53
  }
50
54
 
55
+ // Size
56
+ &.s, .table.s & {
57
+ td, th {
58
+ padding: 0.7em 1em;
59
+ font-size: 1rem;
60
+ }
61
+ }
62
+
51
63
  // Tableua responsive
52
64
  // Utilisation déconseillée (lauvaise utilisation de l'espace, ergonomie horrible
53
65
  /*@media (max-width: @responsive2) {
@@ -8,7 +8,6 @@
8
8
  // Fonts
9
9
  @import '../fonts/Inter/index.less';
10
10
  @import '../fonts/Rubik/index.less';
11
- @import '../fonts/Lato/index.less';
12
11
 
13
12
  // Apply the theme class
14
13
  .bg {
@@ -4,8 +4,7 @@
4
4
  a {
5
5
  color: inherit;
6
6
  cursor: pointer;
7
- text-decoration: underline;
8
- text-decoration: none;
7
+ text-decoration: underline; // Make simple text links visible
9
8
 
10
9
  &:not([disabled]):hover,
11
10
  &.active {
@@ -28,6 +28,14 @@
28
28
 
29
29
  .scrollable {
30
30
  overflow: auto;
31
+ -ms-overflow-style: none; /* IE and Edge */
32
+ scrollbar-width: none; /* Firefox */
33
+
34
+ /* For Chrome, Safari, and other WebKit-based browsers */
35
+ &::-webkit-scrollbar {
36
+ display: none;
37
+ }
38
+
31
39
  }
32
40
 
33
41
  .row {
@@ -225,7 +225,13 @@ export default function useForm<TFormData extends {}>(
225
225
  const form = {
226
226
  fields: fields.current,
227
227
  data,
228
- set: setData,
228
+ set: data => {
229
+ setState(current => ({
230
+ ...current,
231
+ hasChanged: true
232
+ }));
233
+ setData(data);
234
+ },
229
235
  validate,
230
236
  submit,
231
237
  options,
@@ -64,7 +64,7 @@ export default ({
64
64
  noneSelection,
65
65
  enableSearch,
66
66
  value: current,
67
- onChange,
67
+ onChange: onChangeCallback,
68
68
  multiple,
69
69
  dropdown,
70
70
  ...otherProps
@@ -136,6 +136,18 @@ export default ({
136
136
  typeof initChoices === 'function' ? true : initChoices
137
137
  ]);
138
138
 
139
+ const onChange = (...args) => {
140
+
141
+ if (onChangeCallback) {
142
+ onChangeCallback(...args);
143
+ }
144
+
145
+ // Close the popover
146
+ if (popoverState[1] && !multiple) {
147
+ popoverState[1](false);
148
+ }
149
+ }
150
+
139
151
  /*----------------------------------
140
152
  - RENDER
141
153
  ----------------------------------*/
@@ -168,7 +180,7 @@ export default ({
168
180
 
169
181
  return dropdown ? (
170
182
  <Popover content={(
171
- <div class="card col">
183
+ <div class="card col al-top">
172
184
 
173
185
  <div class="col">
174
186
 
@@ -7,15 +7,15 @@ import React from 'react';
7
7
  import { ComponentChild } from 'preact';
8
8
 
9
9
  // Composants
10
- import Button, { Props as PropsBouton } from '@client/components/button';
11
- import Dropdown from '@client/components/dropdown.old';
12
- //import Checkbox from '@client/components/Champs/Checkbox';
10
+ import Button, { Props as TButtonProps } from '@client/components/button';
11
+ import Popover from '../containers/Popover';
12
+ import Checkbox from '../input/Checkbox';
13
13
 
14
14
  /*----------------------------------
15
15
  - TYPES
16
16
  ----------------------------------*/
17
17
 
18
- export type TDonneeInconnue = {[cle: string]: any};
18
+ export type TDonneeInconnue = { id: any } & {[cle: string]: any};
19
19
 
20
20
  export type Props<TRow> = {
21
21
 
@@ -36,6 +36,13 @@ export type TColumn = {
36
36
  class?: string
37
37
  }
38
38
 
39
+ export type TAction<TRow> = Omit<TButtonProps, 'onClick'> & {
40
+ onClick: (row: TRow) => void,
41
+ label: ComponentChild,
42
+ multi?: boolean,
43
+ default?: boolean,
44
+ }
45
+
39
46
  /*----------------------------------
40
47
  - COMPOSANTS
41
48
  ----------------------------------*/
@@ -55,101 +62,77 @@ export default function Liste<TRow extends TDonneeInconnue>({
55
62
  );
56
63
 
57
64
  const [selection, setSelection] = React.useState<number[]>([]);
58
- const [sort, setSort] = React.useState<{ col: number, dir: 1 | -1 } | null>(null);
59
-
60
- const trier = (colonne: TColumn, iColonne: number) => {
61
-
62
- if (!setData)
63
- return console.warn(`[ui][table] Please specify a setData function to enable sorting features.`);
64
-
65
- const ordre = sort && iColonne === sort.col
66
- ? -1 * sort.dir as (1 | -1) // Inversement ordre
67
- : 1;
68
-
69
- setData([
70
- ...rows.sort((a: TRow, b: TRow) => {
71
-
72
- const valA = colonne.valeur(a);
73
- const valB = colonne.valeur(b);
74
-
75
- const typeA = typeof valA;
76
- const typeB = typeof valB;
77
-
78
- if (typeA === 'number' && typeB === 'number')
79
- return ordre === 1 ? (valA as number) - (valB as number) : (valB as number) - (valA as number)
80
- else if (typeA === 'string' && typeB === 'string')
81
- return ordre === 1
82
- ? (valA as string).localeCompare(valB as string)
83
- : (valB as string).localeCompare(valA as string)
84
- else
85
- throw new Error(`Type de données incompatible entre deux lignes: ${valA}:${typeA} vs ${valB}:${typeB}.`);
86
-
87
-
88
- })
89
- ]);
90
-
91
- setSort({ col: iColonne, dir: ordre });
92
- }
93
-
94
65
  const selectionMultiple = actions && actions.some((action) => action.multi);
95
66
 
67
+ const defaultAction = actions && actions.find((action) => action.default);
68
+
96
69
  /*----------------------------------
97
70
  - RENDU COLONNES / LIGNES
98
71
  ----------------------------------*/
99
72
  let renduColonnes: ComponentChild[] = [];
100
73
 
101
74
  const renduLignes = rows.map((row: TRow, iDonnee: number) => (
102
- <tr>
103
- {/*selectionMultiple && (
75
+ <tr {...defaultAction ? {
76
+ onClick: () => defaultAction.onClick(row),
77
+ class: 'clickable'
78
+ } : {}}>
79
+ {selectionMultiple && (
104
80
  <td>
105
81
  <Checkbox
106
- nom={"selectionner" + iDonnee}
107
- label={false}
108
- valeur={selection.includes(iDonnee)}
82
+ id={"selectionner" + iDonnee}
83
+ value={selection.includes(row.id)}
109
84
  onChange={(selectionner: boolean) => {
110
- setSelection(selectionner
85
+ setSelection(current => selectionner
111
86
  // Ajoute
112
- ? [...selection, iDonnee]
87
+ ? [...current, row.id]
113
88
  // Retire
114
- : selection.filter((e, i) => i !== iDonnee))
89
+ : current.filter((currentId, i) => currentId !== row.id))
115
90
  }}
116
91
  />
117
92
  </td>
118
- )*/}
119
-
120
- {columns(row, rows, iDonnee).map((colonne, iColonne) => {
93
+ )}
121
94
 
122
- const triable = colonne.raw !== undefined;
95
+ {columns(row, rows, iDonnee).map((col) => {
123
96
 
124
97
  if (iDonnee === 0) renduColonnes.push(
125
- <th
126
- onClick={triable !== undefined ? () => trier(colonne, iColonne) : undefined}
127
- className={triable !== undefined ? 'cliquable' : undefined}
128
- >
129
- {colonne.label}
98
+ <th>
99
+ {col.label}
130
100
  </th>
131
101
  );
132
102
 
133
- const affichageBrut = ['number', 'string'].includes(typeof colonne.cell) || React.isValidElement(colonne.cell);
103
+ const affichageBrut = ['number', 'string'].includes(typeof col.cell) || React.isValidElement(col.cell);
134
104
 
135
- let classe = colonne.class || '';
136
- if (typeof colonne.raw === 'number')
105
+ let classe = col.class || '';
106
+ if (typeof col.raw === 'number')
137
107
  classe += 'txtRight';
138
108
 
139
109
  return (
140
110
  <td class={classe}>
141
- {affichageBrut ? colonne.cell : JSON.stringify(colonne.cell)}
111
+ {affichageBrut ? col.cell : JSON.stringify(col.cell)}
142
112
  </td>
143
113
  )
144
114
  })}
145
115
 
146
- {/*actions !== undefined && (
116
+ {actions !== undefined && (
147
117
  <td>
148
- <Popover menu={{ actions, rows: row }}>
149
- <Button taille="s" icone="solid/ellipsis-h" />
118
+ <Popover content={(
119
+ <ul class="col menu card bg white">
120
+ {actions.map(({ label, onClick, ...props }: TAction<TRow>) => (
121
+ <li>
122
+ <Button {...props}
123
+ onClick={() => onClick && onClick(row)}
124
+
125
+ >
126
+ {label}
127
+ </Button>
128
+ </li>
129
+ ))}
130
+ </ul>
131
+ )}>
132
+ <Button size="s" icon="solid/ellipsis-h" />
150
133
  </Popover>
151
134
  </td>
152
- )*/}
135
+ )}
153
136
  </tr>
154
137
  ));
155
138
 
@@ -170,11 +153,9 @@ export default function Liste<TRow extends TDonneeInconnue>({
170
153
  {selectionMultiple && (
171
154
  <th>
172
155
  <Checkbox
173
- nom="toutSelectionner"
174
- label={false}
175
- valeur={selection.length >= rows.length}
156
+ value={selection.length >= rows.length}
176
157
  onChange={(status: boolean) => {
177
- setSelection(status ? Object.keys(rows) : []);
158
+ setSelection(status ? rows.map(r => r.id) : []);
178
159
  }}
179
160
  />
180
161
  </th>
@@ -197,24 +178,19 @@ export default function Liste<TRow extends TDonneeInconnue>({
197
178
  <div className="card pdv-05 row inline pos_bottom">
198
179
  <strong>{selection.length} selected items</strong>
199
180
 
200
- {actions.map((action: TAction<TRow>) => {
181
+ {actions.map(({ label, multi, onClick, ...props }: TAction<TRow>) => {
201
182
 
202
- if (!action.multi)
183
+ if (!multi)
203
184
  return;
204
185
 
205
- const donneesSelection = selection.map((index: number) => rows[index]);
186
+ const selectedRows = selection.map((index: number) => rows[index]);
206
187
 
207
188
  return (
208
189
  <Button
209
- {...(action.bouton ? (action.multi
210
- ? action.bouton([row], [iDonnee])
211
- : action.bouton(row, iDonnee)
212
- ) : {})}
213
- icone={action.icone}
214
- onClick={() => action.onClick && action.onClick(donneesSelection, selection)}
215
- lien={action.lien && action.lien(donneesSelection, selection)}
190
+ {...props}
191
+ onClick={() => onClick && onClick(selectedRows)}
216
192
  >
217
- {action.label}
193
+ {label}
218
194
  </Button>
219
195
  )
220
196
  })}
@@ -4,7 +4,7 @@
4
4
 
5
5
  // Npm
6
6
  import React from 'react';
7
- import { JSX, ComponentChild } from 'preact';
7
+ import { JSX, ComponentChild, VNode } from 'preact';
8
8
  import type { StateUpdater } from 'preact/hooks';
9
9
 
10
10
  // Libs
@@ -20,7 +20,7 @@ export type Props = JSX.HTMLAttributes<HTMLDivElement> & {
20
20
  id?: string,
21
21
 
22
22
  // Display
23
- content?: JSX.Element,
23
+ content?: ComponentChild,
24
24
  state?: [boolean, StateUpdater<boolean>],
25
25
  width?: number | string,
26
26
  disable?: boolean
@@ -14,7 +14,7 @@ import { useInput, InputBaseProps } from '../../inputv3/base';
14
14
  ----------------------------------*/
15
15
  export type Props = {
16
16
  id: string,
17
- label: ComponentChild,
17
+ label?: ComponentChild,
18
18
  // State
19
19
  inputRef?: React.Ref<HTMLInputElement>
20
20
  }
@@ -68,9 +68,11 @@ export default ({
68
68
  {...fieldProps}
69
69
  />
70
70
 
71
- <label htmlFor={id} class="col-1 txt-left">
72
- {labelText}
73
- </label>
71
+ {labelText !== undefined && (
72
+ <label htmlFor={id} class="col-1 txt-left">
73
+ {labelText}
74
+ </label>
75
+ )}
74
76
 
75
77
  </div>
76
78
 
@@ -0,0 +1,156 @@
1
+ .react-calendar {
2
+ width: 350px;
3
+ max-width: 100%;
4
+ background: white;
5
+ border: 1px solid #a0a096;
6
+ font-family: Arial, Helvetica, sans-serif;
7
+ line-height: 1.125em;
8
+ }
9
+
10
+ .react-calendar--doubleView {
11
+ width: 700px;
12
+ }
13
+
14
+ .react-calendar--doubleView .react-calendar__viewContainer {
15
+ display: flex;
16
+ margin: -0.5em;
17
+ }
18
+
19
+ .react-calendar--doubleView .react-calendar__viewContainer > * {
20
+ width: 50%;
21
+ margin: 0.5em;
22
+ }
23
+
24
+ .react-calendar,
25
+ .react-calendar *,
26
+ .react-calendar *:before,
27
+ .react-calendar *:after {
28
+ -moz-box-sizing: border-box;
29
+ -webkit-box-sizing: border-box;
30
+ box-sizing: border-box;
31
+ }
32
+
33
+ .react-calendar button {
34
+ margin: 0;
35
+ border: 0;
36
+ outline: none;
37
+ }
38
+
39
+ .react-calendar button:enabled:hover {
40
+ cursor: pointer;
41
+ }
42
+
43
+ .react-calendar__navigation {
44
+ display: flex;
45
+ height: 44px;
46
+ margin-bottom: 1em;
47
+ }
48
+
49
+ .react-calendar__navigation button {
50
+ min-width: 44px;
51
+ background: none;
52
+ }
53
+
54
+ .react-calendar__navigation button:disabled {
55
+ background-color: #f0f0f0;
56
+ }
57
+
58
+ .react-calendar__navigation button:enabled:hover,
59
+ .react-calendar__navigation button:enabled:focus {
60
+ background-color: #e6e6e6;
61
+ }
62
+
63
+ .react-calendar__month-view__weekdays {
64
+ text-align: center;
65
+ text-transform: uppercase;
66
+ font: inherit;
67
+ font-size: 0.75em;
68
+ font-weight: bold;
69
+ }
70
+
71
+ .react-calendar__month-view__weekdays__weekday {
72
+ padding: 0.5em;
73
+ }
74
+
75
+ .react-calendar__month-view__weekNumbers .react-calendar__tile {
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ font: inherit;
80
+ font-size: 0.75em;
81
+ font-weight: bold;
82
+ }
83
+
84
+ .react-calendar__month-view__days__day--weekend {
85
+ color: #d10000;
86
+ }
87
+
88
+ .react-calendar__month-view__days__day--neighboringMonth,
89
+ .react-calendar__decade-view__years__year--neighboringDecade,
90
+ .react-calendar__century-view__decades__decade--neighboringCentury {
91
+ color: #757575;
92
+ }
93
+
94
+ .react-calendar__year-view .react-calendar__tile,
95
+ .react-calendar__decade-view .react-calendar__tile,
96
+ .react-calendar__century-view .react-calendar__tile {
97
+ padding: 2em 0.5em;
98
+ }
99
+
100
+ .react-calendar__tile {
101
+ max-width: 100%;
102
+ padding: 10px 6.6667px;
103
+ background: none;
104
+ text-align: center;
105
+ line-height: 16px;
106
+ font: inherit;
107
+ font-size: 0.833em;
108
+ }
109
+
110
+ .react-calendar__tile:disabled {
111
+ background-color: #f0f0f0;
112
+ color: #ababab;
113
+ }
114
+
115
+ .react-calendar__month-view__days__day--neighboringMonth:disabled,
116
+ .react-calendar__decade-view__years__year--neighboringDecade:disabled,
117
+ .react-calendar__century-view__decades__decade--neighboringCentury:disabled {
118
+ color: #cdcdcd;
119
+ }
120
+
121
+ .react-calendar__tile:enabled:hover,
122
+ .react-calendar__tile:enabled:focus {
123
+ background-color: #e6e6e6;
124
+ }
125
+
126
+ .react-calendar__tile--now {
127
+ background: #ffff76;
128
+ }
129
+
130
+ .react-calendar__tile--now:enabled:hover,
131
+ .react-calendar__tile--now:enabled:focus {
132
+ background: #ffffa9;
133
+ }
134
+
135
+ .react-calendar__tile--hasActive {
136
+ background: #76baff;
137
+ }
138
+
139
+ .react-calendar__tile--hasActive:enabled:hover,
140
+ .react-calendar__tile--hasActive:enabled:focus {
141
+ background: #a9d4ff;
142
+ }
143
+
144
+ .react-calendar__tile--active {
145
+ background: #006edc;
146
+ color: white;
147
+ }
148
+
149
+ .react-calendar__tile--active:enabled:hover,
150
+ .react-calendar__tile--active:enabled:focus {
151
+ background: #1087ff;
152
+ }
153
+
154
+ .react-calendar--selectRange .react-calendar__tile--hover {
155
+ background-color: #e6e6e6;
156
+ }