agx-chat-web 1.2.1 → 1.2.3

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 (66) hide show
  1. package/dist/agx-chat.esm.js +1 -1
  2. package/dist/agx-chat.esm.js.map +1 -1
  3. package/package.json +2 -3
  4. package/src/__tests__/app/Messenger/classes/slaCalculations.spec.ts +0 -122
  5. package/src/app/ChatProvider/ChatProvider.tsx +0 -20
  6. package/src/app/Messenger/classes/slaCalculations.ts +0 -197
  7. package/src/app/Messenger/components/ChatButton/ChatButton.tsx +0 -64
  8. package/src/app/Messenger/components/ChatTabs/ChatTabs.less +0 -18
  9. package/src/app/Messenger/components/ChatTabs/ChatTabs.tsx +0 -32
  10. package/src/app/Messenger/components/DocMessage/DocMessage.less +0 -71
  11. package/src/app/Messenger/components/DocMessage/DocMessage.tsx +0 -50
  12. package/src/app/Messenger/components/ImagesContainer/ImagesContainer.less +0 -79
  13. package/src/app/Messenger/components/ImagesContainer/ImagesContainer.tsx +0 -51
  14. package/src/app/Messenger/components/IncomingMessage/IncomingMessage.tsx +0 -170
  15. package/src/app/Messenger/components/InfiniteScroll/InfiniteScroll.tsx +0 -80
  16. package/src/app/Messenger/components/InputFile/InputFile.tsx +0 -147
  17. package/src/app/Messenger/components/InputFile/inputFile.less +0 -59
  18. package/src/app/Messenger/components/MessageBallon/MessageBalloon.tsx +0 -100
  19. package/src/app/Messenger/components/MessengerAvatar/MessengerAvatar.tsx +0 -29
  20. package/src/app/Messenger/components/MessengerThemeWrapper/MessengerThemeWrapper.tsx +0 -62
  21. package/src/app/Messenger/components/RenderFileIcon/RenderFileIcon.tsx +0 -40
  22. package/src/app/Messenger/components/SearchInput/SearchInput.less +0 -45
  23. package/src/app/Messenger/components/SearchInput/SearchInput.tsx +0 -77
  24. package/src/app/Messenger/components/Select/Select.less +0 -22
  25. package/src/app/Messenger/components/Select/Select.tsx +0 -56
  26. package/src/app/Messenger/components/SendMessageForm/SendMessageForm.tsx +0 -254
  27. package/src/app/Messenger/components/SenderMessages/SenderMessages.tsx +0 -91
  28. package/src/app/Messenger/components/SystemMessage/SystemMessage.tsx +0 -25
  29. package/src/app/Messenger/components/TextArea/TextArea.tsx +0 -35
  30. package/src/app/Messenger/components/TextArea/Textarea.less +0 -22
  31. package/src/app/Messenger/components/Tooltip/Tooltip.less +0 -27
  32. package/src/app/Messenger/components/Tooltip/Tooltip.tsx +0 -17
  33. package/src/app/Messenger/hooks/useConversations.tsx +0 -143
  34. package/src/app/Messenger/hooks/useMessages.tsx +0 -49
  35. package/src/app/Messenger/hooks/useThemes.tsx +0 -14
  36. package/src/app/Messenger/icons/AttachFileIcon.tsx +0 -20
  37. package/src/app/Messenger/icons/CSVFileIcon.tsx +0 -26
  38. package/src/app/Messenger/icons/CloseIcon.tsx +0 -20
  39. package/src/app/Messenger/icons/DOCFileIcon.tsx +0 -54
  40. package/src/app/Messenger/icons/DownloadMinimalistIcon.tsx +0 -37
  41. package/src/app/Messenger/icons/EmptyIcon.tsx +0 -20
  42. package/src/app/Messenger/icons/MP4FileIcon.tsx +0 -26
  43. package/src/app/Messenger/icons/MessageIcon.tsx +0 -27
  44. package/src/app/Messenger/icons/PDFFileIcon.tsx +0 -54
  45. package/src/app/Messenger/icons/ReadIcon.tsx +0 -18
  46. package/src/app/Messenger/icons/SearchIcon.tsx +0 -20
  47. package/src/app/Messenger/icons/TimerIcon.tsx +0 -18
  48. package/src/app/Messenger/icons/TrashIcon.tsx +0 -21
  49. package/src/app/Messenger/views/Messenger.less +0 -623
  50. package/src/app/Messenger/views/MessengerList.tsx +0 -170
  51. package/src/app/Messenger/views/MessengerListItem.tsx +0 -178
  52. package/src/app/Messenger/views/MessengerMessages.tsx +0 -414
  53. package/src/app/Messenger/views/NewFormChat.tsx +0 -145
  54. package/src/app/i18n/index.ts +0 -36
  55. package/src/app/i18n/locales/en.json +0 -64
  56. package/src/app/i18n/locales/pt.json +0 -64
  57. package/src/assets/right-arrow.svg +0 -10
  58. package/src/index.ts +0 -23
  59. package/src/react-app-env.d.ts +0 -19
  60. package/src/setupTests.ts +0 -5
  61. package/src/styles/abstracts/animations.less +0 -8
  62. package/src/styles/abstracts/mixins.less +0 -5
  63. package/src/styles/abstracts/variables.less +0 -31
  64. package/src/styles/base/base.less +0 -6
  65. package/src/styles/index.less +0 -5
  66. package/src/types.ts +0 -174
@@ -1,40 +0,0 @@
1
- import React from 'react'
2
- import FileDoc from '../../icons/DOCFileIcon'
3
- import FilePdf from '../../icons/PDFFileIcon'
4
- import CSVFileIcon from '../../icons/CSVFileIcon'
5
- import MP4FileIcon from '../../icons/MP4FileIcon'
6
- import { useTranslation } from 'react-i18next'
7
-
8
- const RenderFileIcon = ({
9
- fileType,
10
- b64,
11
- }: {
12
- fileType?: string
13
- b64?: string
14
- }) => {
15
- const { t } = useTranslation('messengerMessages')
16
-
17
- if (fileType === 'application/pdf') {
18
- return <FilePdf width='40' height='40' />
19
- } else if (
20
- fileType === 'application/msword' ||
21
- fileType ===
22
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
23
- ) {
24
- return <FileDoc width='40' height='40' />
25
- } else if (fileType === 'text/csv') {
26
- return <CSVFileIcon width='40' height='40' />
27
- } else if (fileType === 'video/mp4') {
28
- return <MP4FileIcon width='40' height='40' />
29
- } else {
30
- return (
31
- <img
32
- alt={t('renderFileIcon.altImage')}
33
- src={b64}
34
- className='images-container__image'
35
- />
36
- )
37
- }
38
- }
39
-
40
- export default RenderFileIcon
@@ -1,45 +0,0 @@
1
- .input-search {
2
- display: flex;
3
- align-items: center;
4
- justify-content: center;
5
- width: 100%;
6
- margin: 1rem 0;
7
- position: relative;
8
-
9
- &__select {
10
- border-radius: 30px 0 0 30px;
11
- padding: 10px;
12
- background: transparent;
13
- margin-left: 1rem;
14
- width: 30%;
15
- }
16
-
17
- &__option {
18
- color: black;
19
- }
20
-
21
- &__search {
22
- width: 70%;
23
- margin-right: 1rem;
24
- border-radius: 0 30px 30px 0;
25
- padding: 9px;
26
- color: var(--secondary-color);
27
- border: var(--secondary-color) 1px solid;
28
- background: transparent;
29
- position: relative;
30
-
31
- &::placeholder {
32
- color: var(--secondary-color);
33
- opacity: 60%;
34
- }
35
- }
36
-
37
- &__icon {
38
- border: none;
39
- background: transparent;
40
- position: absolute;
41
- right: 2rem;
42
- display: flex;
43
- cursor: pointer;
44
- }
45
- }
@@ -1,77 +0,0 @@
1
- import SearchIcon from '../../icons/SearchIcon'
2
- import React, { useState } from 'react'
3
- import useTheme from '../../hooks/useThemes'
4
- import { useTranslation } from 'react-i18next'
5
-
6
- interface IProps {
7
- searchChat: (value: string, key: string) => void
8
- searchKeys: { label: string; value: string }[]
9
- loadingSearch: boolean
10
- }
11
-
12
- function SearchInput ({ searchChat, searchKeys, loadingSearch }: IProps) {
13
- const { t } = useTranslation('messengerList')
14
- const [searchKey, setSearchKey] = useState<string>(searchKeys[0].value)
15
- const [searchValue, setSearchValue] = useState<string>('')
16
- const { theme } = useTheme()
17
-
18
- const onSearch = (event: React.ChangeEvent<HTMLInputElement>) => {
19
- setSearchValue(event.target.value)
20
- }
21
-
22
- const handleKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => {
23
- if (event.key === 'Enter') {
24
- searchChat(searchValue, searchKey)
25
- }
26
- }
27
-
28
- return (
29
- <div className='input-search'>
30
- <select
31
- className='input-search__select'
32
- onChange={(e) => setSearchKey(e.target.value)}
33
- style={{
34
- color: theme.asideFontColor,
35
- border: `${theme.asideFontColor} 1px solid`,
36
- }}
37
- >
38
- {searchKeys.map((item, index) => (
39
- <option
40
- className='input-search__option'
41
- key={index}
42
- value={item.value}
43
- >
44
- {item.label}
45
- </option>
46
- ))}
47
- </select>
48
-
49
- <input
50
- className='input-search__search'
51
- placeholder={t('searchInput.placeholder')}
52
- onChange={onSearch}
53
- onKeyDown={handleKeyPress}
54
- style={{
55
- color: theme.asideFontColor,
56
- border: `${theme.asideFontColor} 1px solid`,
57
- borderLeft: 0,
58
- }}
59
- />
60
-
61
- <button
62
- className='input-search__icon'
63
- onClick={() => searchChat(searchValue, searchKey)}
64
- >
65
- {loadingSearch ? (
66
- <div className='messenger__messages-loading'>
67
- <div className='messenger__messages-loading--loader' />
68
- </div>
69
- ) : (
70
- <SearchIcon />
71
- )}
72
- </button>
73
- </div>
74
- )
75
- }
76
-
77
- export default SearchInput
@@ -1,22 +0,0 @@
1
- .form-select {
2
- margin-bottom: 1rem;
3
- width: 100%;
4
-
5
- &__label {
6
- color: @title-form-color;
7
- font-weight: bold;
8
- margin: 0.5rem;
9
- }
10
-
11
- &__input {
12
- border: 1.5px solid hsl(0, 0%, 80%);
13
- border-radius: 4px;
14
- margin-top: 0.5rem;
15
- padding: 8px 8px;
16
- width: 100%;
17
-
18
- &:focus {
19
- outline: #2684ff 2px solid !important;
20
- }
21
- }
22
- }
@@ -1,56 +0,0 @@
1
- import React from 'react'
2
- import useTheme from '../../hooks/useThemes'
3
- interface IProps {
4
- options: {
5
- label: string
6
- value: string
7
- }[]
8
- label: string
9
- onChange: (value: string) => void
10
- name: string
11
- placeholder: string
12
- value: string
13
- }
14
-
15
- function SelectNew ({
16
- options,
17
- name,
18
- placeholder,
19
- label,
20
- onChange,
21
- value,
22
- }: IProps) {
23
- const { theme } = useTheme()
24
- return (
25
- <div className='form-select'>
26
- <label
27
- htmlFor={name}
28
- className='form-select__label'
29
- style={{ color: theme.newChatFormTexts }}
30
- >
31
- {label}
32
- </label>
33
- <select
34
- name={name}
35
- className='form-select__input'
36
- onChange={(e) => onChange(e.target.value)}
37
- value={value}
38
- style={{
39
- backgroundColor: theme.inputBg,
40
- color: theme.newChatFormTexts,
41
- }}
42
- >
43
- <option value='' disabled hidden>
44
- {placeholder}
45
- </option>
46
- {options.map((motivo) => (
47
- <option key={motivo.value} value={motivo.value}>
48
- {motivo.label}
49
- </option>
50
- ))}
51
- </select>
52
- </div>
53
- )
54
- }
55
-
56
- export default SelectNew
@@ -1,254 +0,0 @@
1
- import useTheme from '../../hooks/useThemes'
2
- import React, {
3
- Fragment,
4
- MutableRefObject,
5
- useMemo,
6
- useRef,
7
- useState,
8
- } from 'react'
9
- import { IList } from 'types'
10
- import AttachFileIcon from '../../../Messenger/icons/AttachFileIcon'
11
- import rightArrow from '../../../../assets/right-arrow.svg'
12
- import { SpinLoading } from '../../views/MessengerMessages'
13
- import ToolTip from '../Tooltip/Tooltip'
14
- import { useTranslation } from 'react-i18next'
15
-
16
- interface IProps {
17
- allowImages: boolean
18
- current?: IList
19
- onSubmit: (value: FormData, callback: () => void) => void
20
- file?: File | null
21
- updateFile: (file: File | null) => void
22
- isLoading?: boolean
23
- maxFileSize: string
24
- }
25
-
26
- function AllowDocuments ({
27
- allowImages,
28
- attachFile,
29
- handleFile,
30
- closedChat,
31
- maxFileField,
32
- }: {
33
- allowImages: boolean
34
- attachFile: MutableRefObject<HTMLInputElement | null>
35
- handleFile: (e: React.ChangeEvent<HTMLInputElement>) => void
36
- closedChat: boolean
37
- maxFileField: string
38
- }) {
39
- const { t } = useTranslation('messengerMessages')
40
-
41
- if (allowImages) {
42
- return (
43
- <Fragment>
44
- <input
45
- type='file'
46
- size={1}
47
- className='messenger__messages-send--file'
48
- ref={attachFile}
49
- onChange={handleFile}
50
- accept='.jpg, .jpeg, .png, .pdf, .doc, .docx, .mp4, .csv'
51
- />
52
-
53
- <ToolTip text={t('sendMessageForm.maxFileField', { maxFileField })}>
54
- <AttachFileIcon
55
- className={`messenger__messages-send__attach ${closedChat ? 'messenger__messages-send__attach--disabled' : ''}`}
56
- onClick={() => (!closedChat ? attachFile.current?.click() : null)}
57
- />
58
- </ToolTip>
59
- </Fragment>
60
- )
61
- }
62
-
63
- return <></>
64
- }
65
-
66
- function SendMessageForm ({
67
- allowImages,
68
- current,
69
- onSubmit,
70
- file,
71
- updateFile,
72
- isLoading,
73
- maxFileSize,
74
- }: IProps) {
75
- const { t } = useTranslation('messengerMessages')
76
- const [formHeight, setFormHeight] = useState<number>(100)
77
- const [sending, setSending] = useState<boolean>(false)
78
-
79
- const inputRef: MutableRefObject<HTMLTextAreaElement | null> = useRef(null)
80
- const attachFile: MutableRefObject<HTMLInputElement | null> = useRef(null)
81
-
82
- const closedChat = useMemo(
83
- () => current?.status.current.state === 'final',
84
- [current]
85
- )
86
-
87
- const { theme } = useTheme()
88
-
89
- function correctTextAreaHeight (styleConfig: {
90
- height: number
91
- overflow: string
92
- }) {
93
- const textarea = inputRef.current
94
- if (textarea) {
95
- textarea.style.height = `${styleConfig.height}px`
96
- textarea.style.overflowY = styleConfig.overflow
97
- }
98
- }
99
-
100
- function resetHeights () {
101
- const inicialFormHeight = 100
102
- const inicialTextAreaHeight = 50
103
- setFormHeight(inicialFormHeight)
104
- correctTextAreaHeight({ height: inicialTextAreaHeight, overflow: 'hidden' })
105
- }
106
-
107
- function adjustFormHeight (textareaRef: typeof inputRef.current) {
108
- if (textareaRef) {
109
- const initialHeight = 50
110
- const maxHeight = 80
111
- const newHeight = textareaRef.scrollHeight
112
-
113
- if (newHeight > maxHeight) {
114
- correctTextAreaHeight({
115
- height: maxHeight,
116
- overflow: 'auto',
117
- })
118
- return maxHeight + initialHeight
119
- }
120
-
121
- correctTextAreaHeight({
122
- height: initialHeight,
123
- overflow: 'auto',
124
- })
125
- return initialHeight * 2
126
- }
127
-
128
- return formHeight
129
- }
130
-
131
- function handleTextareaChange () {
132
- const textarea = inputRef.current
133
- setFormHeight(adjustFormHeight(textarea))
134
- }
135
-
136
- function handleSubmit (e?: React.FormEvent<HTMLFormElement>) {
137
- e?.preventDefault()
138
- if (sending) return
139
- setSending(true)
140
-
141
- const data = new FormData()
142
- if (file) data.append('file', file)
143
- if (inputRef.current?.value) data.append('message', inputRef.current?.value)
144
-
145
- onSubmit(data, () => {
146
- if (inputRef.current) inputRef.current.value = ''
147
- if (file) updateFile(null)
148
- setSending(false)
149
- resetHeights()
150
- })
151
- }
152
-
153
- function handleFile (e: React.ChangeEvent<HTMLInputElement>) {
154
- if (e.target.files) {
155
- const file = e.target.files[0]
156
- const allowedTypes = [
157
- 'image/png',
158
- 'image/jpeg',
159
- 'application/pdf',
160
- 'application/msword',
161
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
162
- 'text/csv',
163
- 'video/mp4',
164
- ]
165
- const allowedExtensions = [
166
- 'png',
167
- 'jpeg',
168
- 'jpg',
169
- 'pdf',
170
- 'doc',
171
- 'docx',
172
- 'csv',
173
- 'mp4',
174
- ]
175
- const fileType = file?.type
176
- const fileExtension = file?.name.split('.').pop()?.toLowerCase()
177
- const isAllowed = fileType
178
- ? allowedTypes.includes(fileType)
179
- : fileExtension
180
- ? allowedExtensions.includes(fileExtension)
181
- : false
182
- if (isAllowed) {
183
- updateFile(file)
184
- }
185
- }
186
- }
187
-
188
- return (
189
- <form
190
- onSubmit={handleSubmit}
191
- className='messenger__messages-send--form'
192
- style={{
193
- height: `${formHeight}px`,
194
- maxHeight: '150px',
195
- }}
196
- >
197
- <div className='messenger__messages-send__input-container'>
198
- <textarea
199
- onChange={handleTextareaChange}
200
- placeholder={
201
- closedChat
202
- ? t('sendMessageForm.chatEnded')
203
- : t('sendMessageForm.typeMessage')
204
- }
205
- ref={inputRef}
206
- onKeyDown={(e) => {
207
- if (e.key === 'Enter' && !e.shiftKey) {
208
- e.preventDefault()
209
- handleSubmit()
210
- }
211
- }}
212
- className={`messenger__messages-send__input ${closedChat || sending ? 'messenger__messages-send__input--disabled' : ''} `}
213
- disabled={closedChat || sending}
214
- style={{
215
- backgroundColor: theme?.inputBg,
216
- }}
217
- />
218
-
219
- <AllowDocuments
220
- allowImages={allowImages}
221
- handleFile={handleFile}
222
- attachFile={attachFile}
223
- closedChat={closedChat}
224
- maxFileField={maxFileSize}
225
- />
226
- </div>
227
-
228
- {isLoading ? (
229
- <div className='messenger__messages-sending'>
230
- <SpinLoading />
231
- </div>
232
- ) : (
233
- <button
234
- type='submit'
235
- className={`messenger__messages-send__button ${closedChat || sending ? 'messenger__messages-send__button--disabled' : ''}`}
236
- disabled={closedChat || sending}
237
- style={{
238
- backgroundColor: theme?.buttonPrimary,
239
- }}
240
- >
241
- <img
242
- alt={t('sendMessageForm.rightIcon')}
243
- height={25}
244
- width={25}
245
- className='ml-1'
246
- src={rightArrow}
247
- />
248
- </button>
249
- )}
250
- </form>
251
- )
252
- }
253
-
254
- export default SendMessageForm
@@ -1,91 +0,0 @@
1
- import useTheme from '../../hooks/useThemes'
2
- import React, { useCallback, useState } from 'react'
3
- import { IMessagesBalloon } from 'types'
4
- import ReadIcon from '../../icons/ReadIcon'
5
- import ReactSimpleImageViewer from 'react-simple-image-viewer'
6
- import { MessageImage } from '../IncomingMessage/IncomingMessage'
7
- import DocMessage from '../DocMessage/DocMessage'
8
-
9
- function SenderMessages ({
10
- date,
11
- message,
12
- read,
13
- hasFile,
14
- file,
15
- formatDate,
16
- id,
17
- }: IMessagesBalloon) {
18
- const [currentImage, setCurrentImage] = useState(0)
19
- const [isViewerOpen, setIsViewerOpen] = useState(false)
20
- const { theme } = useTheme()
21
-
22
- const openImageViewer = useCallback((index: number) => {
23
- setCurrentImage(index)
24
- setIsViewerOpen(true)
25
- }, [])
26
-
27
- const closeImageViewer = () => {
28
- setCurrentImage(0)
29
- setIsViewerOpen(false)
30
- }
31
-
32
- const isDoc = [
33
- 'application/msword',
34
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
35
- 'application/pdf',
36
- 'text/csv',
37
- 'video/mp4',
38
- ].includes(file?.mimetype ?? '')
39
-
40
- return (
41
- <div className='messenger__messages-row--sender'>
42
- <div
43
- className='messenger__messages-sender'
44
- id={id}
45
- style={{
46
- background: theme?.messengerSenderColor,
47
- color: theme?.documentMessagesTextColor,
48
- }}
49
- >
50
- <span>
51
- {hasFile &&
52
- (isDoc ? (
53
- <DocMessage
54
- date={date}
55
- message={message}
56
- read={read}
57
- file={file}
58
- formatDate={formatDate}
59
- id={id}
60
- />
61
- ) : (
62
- <MessageImage
63
- src={file?.location}
64
- onClick={() => openImageViewer(currentImage)}
65
- />
66
- ))}
67
-
68
- <p className='messenger__message'>{message}</p>
69
- <div className='messenger__message--bottom'>
70
- <p className='messenger__message--date'>
71
- {formatDate(date) ?? new Date(date).toString()}
72
- </p>
73
- <ReadIcon fill={read ? '#00efff' : 'white'} />
74
- </div>
75
- </span>
76
- </div>
77
-
78
- {file && !isDoc && isViewerOpen && (
79
- <ReactSimpleImageViewer
80
- src={[file.location]}
81
- currentIndex={0}
82
- disableScroll={false}
83
- closeOnClickOutside={true}
84
- onClose={closeImageViewer}
85
- />
86
- )}
87
- </div>
88
- )
89
- }
90
-
91
- export default SenderMessages
@@ -1,25 +0,0 @@
1
- import React from 'react'
2
- import useTheme from '../../hooks/useThemes'
3
- import { IInconmingMessage } from 'types'
4
-
5
- function SystemMessage ({ date, message, formatDate, id }: IInconmingMessage) {
6
- const { theme } = useTheme()
7
-
8
- return (
9
- <div className='messenger__messages-row--system' id={id}>
10
- <div
11
- className='messenger__messages-received messenger__messages-received--system'
12
- style={{ background: theme?.messengerSystemColor }}
13
- >
14
- <span>
15
- <p className='messenger__message'>{message}</p>
16
- <p className='messenger__message--date'>
17
- {formatDate(date) ?? new Date(date).toString()}
18
- </p>
19
- </span>
20
- </div>
21
- </div>
22
- )
23
- }
24
-
25
- export default SystemMessage
@@ -1,35 +0,0 @@
1
- import React from 'react'
2
- import useTheme from '../../hooks/useThemes'
3
- interface IProps {
4
- label: string
5
- onChange: (value: string) => void
6
- name: string
7
- placeholder: string
8
- }
9
-
10
- function Textarea ({ name, placeholder, label, onChange }: IProps) {
11
- const { theme } = useTheme()
12
- return (
13
- <div className='text-area'>
14
- <label
15
- htmlFor={name}
16
- className='text-area__label'
17
- style={{ color: theme.newChatFormTexts }}
18
- >
19
- {label}
20
- </label>
21
- <textarea
22
- style={{
23
- backgroundColor: theme.inputBg,
24
- color: theme.newChatFormTexts,
25
- }}
26
- name={name}
27
- placeholder={placeholder}
28
- className='text-area__input'
29
- onChange={(e) => onChange(e.target.value)}
30
- />
31
- </div>
32
- )
33
- }
34
-
35
- export default Textarea
@@ -1,22 +0,0 @@
1
- .text-area {
2
- margin-bottom: 1rem;
3
- width: 100%;
4
-
5
- &__label {
6
- color: @title-form-color;
7
- font-weight: bold;
8
- margin: 0.5rem;
9
- }
10
-
11
- &__input {
12
- border: 1.5px solid hsl(0, 0%, 80%);
13
- border-radius: 4px;
14
- margin-top: 0.5rem;
15
- padding: 4px 8px;
16
- width: 100%;
17
-
18
- &:focus {
19
- outline: #2684ff 2px solid !important;
20
- }
21
- }
22
- }
@@ -1,27 +0,0 @@
1
- .tooltip {
2
- position: relative;
3
- display: inline-block;
4
- }
5
-
6
- .tooltip__text {
7
- visibility: hidden;
8
- background-color: black;
9
- color: #fff;
10
- text-align: center;
11
- border-radius: 5px;
12
- padding: 5px;
13
- position: absolute;
14
- z-index: 1;
15
- bottom: 125%;
16
- left: -40%;
17
- margin-left: -60px;
18
- opacity: 0;
19
- transition:
20
- opacity 0.3s,
21
- visibility 0.3s;
22
- }
23
-
24
- .tooltip:hover .tooltip__text {
25
- visibility: visible;
26
- opacity: 1;
27
- }