create-nextjs-cms 0.5.23 → 0.5.24

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 (191) hide show
  1. package/package.json +5 -7
  2. package/templates/default/components/NewPage.tsx +2 -2
  3. package/templates/default/components/ProgressBar.tsx +46 -22
  4. package/templates/default/components/form/DateRangeFormInput.tsx +8 -6
  5. package/templates/default/components/form/helpers/_section-hot-reload.js +1 -1
  6. package/templates/default/components/form/inputs/DateFormInput.tsx +82 -34
  7. package/templates/default/components/form/inputs/MultipleSelectFormInput.tsx +40 -107
  8. package/templates/default/components/form/inputs/RichTextFormInput.tsx +2 -0
  9. package/templates/default/components/form/inputs/TagsFormInput.tsx +115 -26
  10. package/templates/default/components/form/inputs/TextFormInput.tsx +1 -1
  11. package/templates/default/components/multi-select.tsx +1144 -0
  12. package/templates/default/components/ui/badge.tsx +16 -12
  13. package/templates/default/components/ui/button.tsx +35 -30
  14. package/templates/default/components/ui/calendar.tsx +145 -47
  15. package/templates/default/components/ui/command.tsx +184 -0
  16. package/templates/default/components/ui/dialog.tsx +143 -0
  17. package/templates/default/components/ui/popover.tsx +39 -22
  18. package/templates/default/components/ui/progress.tsx +31 -0
  19. package/templates/default/components/ui/select.tsx +150 -149
  20. package/templates/default/components/ui/separator.tsx +28 -0
  21. package/templates/default/components.json +8 -3
  22. package/templates/default/{postinstall.js → lib/postinstall.js} +1 -1
  23. package/templates/default/lib/utils.ts +6 -0
  24. package/templates/default/{proxy.ts → middleware.ts} +3 -2
  25. package/templates/default/next-env.d.ts +1 -1
  26. package/templates/default/package.json +41 -52
  27. package/templates/default/public/tinymce/CHANGELOG.md +155 -0
  28. package/templates/default/public/tinymce/README.md +12 -12
  29. package/templates/default/public/tinymce/bower.json +1 -1
  30. package/templates/default/public/tinymce/composer.json +2 -2
  31. package/templates/default/public/tinymce/icons/default/icons.js +40 -32
  32. package/templates/default/public/tinymce/icons/default/icons.min.js +1 -1
  33. package/templates/default/public/tinymce/license.md +7 -4
  34. package/templates/default/public/tinymce/models/dom/model.js +36 -50
  35. package/templates/default/public/tinymce/models/dom/model.min.js +1 -1
  36. package/templates/default/public/tinymce/notices.txt +2 -2
  37. package/templates/default/public/tinymce/package.json +2 -2
  38. package/templates/default/public/tinymce/plugins/accordion/plugin.js +45 -21
  39. package/templates/default/public/tinymce/plugins/accordion/plugin.min.js +1 -1
  40. package/templates/default/public/tinymce/plugins/advlist/plugin.js +8 -6
  41. package/templates/default/public/tinymce/plugins/advlist/plugin.min.js +1 -1
  42. package/templates/default/public/tinymce/plugins/anchor/plugin.js +1 -1
  43. package/templates/default/public/tinymce/plugins/autolink/plugin.js +3 -6
  44. package/templates/default/public/tinymce/plugins/autolink/plugin.min.js +1 -1
  45. package/templates/default/public/tinymce/plugins/autoresize/plugin.js +4 -6
  46. package/templates/default/public/tinymce/plugins/autoresize/plugin.min.js +1 -1
  47. package/templates/default/public/tinymce/plugins/autosave/plugin.js +4 -7
  48. package/templates/default/public/tinymce/plugins/autosave/plugin.min.js +1 -1
  49. package/templates/default/public/tinymce/plugins/charmap/plugin.js +8 -8
  50. package/templates/default/public/tinymce/plugins/charmap/plugin.min.js +1 -1
  51. package/templates/default/public/tinymce/plugins/code/plugin.js +3 -2
  52. package/templates/default/public/tinymce/plugins/code/plugin.min.js +1 -1
  53. package/templates/default/public/tinymce/plugins/codesample/plugin.js +11 -10
  54. package/templates/default/public/tinymce/plugins/codesample/plugin.min.js +2 -2
  55. package/templates/default/public/tinymce/plugins/directionality/plugin.js +9 -11
  56. package/templates/default/public/tinymce/plugins/directionality/plugin.min.js +1 -1
  57. package/templates/default/public/tinymce/plugins/emoticons/plugin.js +7 -7
  58. package/templates/default/public/tinymce/plugins/emoticons/plugin.min.js +1 -1
  59. package/templates/default/public/tinymce/plugins/fullscreen/plugin.js +11 -13
  60. package/templates/default/public/tinymce/plugins/fullscreen/plugin.min.js +1 -1
  61. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/bg-BG.js +93 -0
  62. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/fr-FR.js +93 -0
  63. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/he-IL.js +93 -0
  64. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/hu-HU.js +93 -0
  65. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/ko-KR.js +93 -0
  66. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/nb-NO.js +93 -0
  67. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/pt-BR.js +93 -0
  68. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/pt-PT.js +93 -0
  69. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/sl-SI.js +93 -0
  70. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/sv-SE.js +93 -0
  71. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/th-TH.js +93 -0
  72. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/zh-CN.js +87 -0
  73. package/templates/default/public/tinymce/plugins/help/js/i18n/keynav/zh-TW.js +93 -0
  74. package/templates/default/public/tinymce/plugins/help/plugin.js +15 -17
  75. package/templates/default/public/tinymce/plugins/help/plugin.min.js +1 -1
  76. package/templates/default/public/tinymce/plugins/image/plugin.js +34 -32
  77. package/templates/default/public/tinymce/plugins/image/plugin.min.js +1 -1
  78. package/templates/default/public/tinymce/plugins/importcss/plugin.js +4 -6
  79. package/templates/default/public/tinymce/plugins/importcss/plugin.min.js +1 -1
  80. package/templates/default/public/tinymce/plugins/insertdatetime/plugin.js +4 -3
  81. package/templates/default/public/tinymce/plugins/insertdatetime/plugin.min.js +1 -1
  82. package/templates/default/public/tinymce/plugins/link/plugin.js +170 -38
  83. package/templates/default/public/tinymce/plugins/link/plugin.min.js +1 -1
  84. package/templates/default/public/tinymce/plugins/lists/plugin.js +111 -2053
  85. package/templates/default/public/tinymce/plugins/lists/plugin.min.js +1 -1
  86. package/templates/default/public/tinymce/plugins/media/plugin.js +15 -23
  87. package/templates/default/public/tinymce/plugins/media/plugin.min.js +1 -1
  88. package/templates/default/public/tinymce/plugins/nonbreaking/plugin.js +1 -1
  89. package/templates/default/public/tinymce/plugins/pagebreak/plugin.js +1 -1
  90. package/templates/default/public/tinymce/plugins/preview/plugin.js +88 -10
  91. package/templates/default/public/tinymce/plugins/preview/plugin.min.js +1 -1
  92. package/templates/default/public/tinymce/plugins/quickbars/plugin.js +9 -9
  93. package/templates/default/public/tinymce/plugins/quickbars/plugin.min.js +1 -1
  94. package/templates/default/public/tinymce/plugins/save/plugin.js +1 -1
  95. package/templates/default/public/tinymce/plugins/searchreplace/plugin.js +10 -13
  96. package/templates/default/public/tinymce/plugins/searchreplace/plugin.min.js +1 -1
  97. package/templates/default/public/tinymce/plugins/table/plugin.js +13 -24
  98. package/templates/default/public/tinymce/plugins/table/plugin.min.js +1 -1
  99. package/templates/default/public/tinymce/plugins/visualblocks/plugin.js +1 -1
  100. package/templates/default/public/tinymce/plugins/visualchars/plugin.js +9 -10
  101. package/templates/default/public/tinymce/plugins/visualchars/plugin.min.js +1 -1
  102. package/templates/default/public/tinymce/plugins/wordcount/plugin.js +1 -1
  103. package/templates/default/public/tinymce/skins/content/dark/content.min.ts +3 -0
  104. package/templates/default/public/tinymce/skins/content/dark/content.ts +3 -0
  105. package/templates/default/public/tinymce/skins/content/default/content.min.ts +3 -0
  106. package/templates/default/public/tinymce/skins/content/default/content.ts +3 -0
  107. package/templates/default/public/tinymce/skins/content/document/content.min.ts +3 -0
  108. package/templates/default/public/tinymce/skins/content/document/content.ts +3 -0
  109. package/templates/default/public/tinymce/skins/content/tinymce-5/content.min.ts +3 -0
  110. package/templates/default/public/tinymce/skins/content/tinymce-5/content.ts +3 -0
  111. package/templates/default/public/tinymce/skins/content/tinymce-5-dark/content.min.ts +3 -0
  112. package/templates/default/public/tinymce/skins/content/tinymce-5-dark/content.ts +3 -0
  113. package/templates/default/public/tinymce/skins/content/writer/content.min.ts +3 -0
  114. package/templates/default/public/tinymce/skins/content/writer/content.ts +3 -0
  115. package/templates/default/public/tinymce/skins/ui/oxide/content.css +144 -0
  116. package/templates/default/public/tinymce/skins/ui/oxide/content.inline.css +144 -0
  117. package/templates/default/public/tinymce/skins/ui/oxide/content.inline.js +1 -1
  118. package/templates/default/public/tinymce/skins/ui/oxide/content.inline.min.css +1 -1
  119. package/templates/default/public/tinymce/skins/ui/oxide/content.inline.min.ts +116 -0
  120. package/templates/default/public/tinymce/skins/ui/oxide/content.inline.ts +116 -0
  121. package/templates/default/public/tinymce/skins/ui/oxide/content.js +1 -1
  122. package/templates/default/public/tinymce/skins/ui/oxide/content.min.css +1 -1
  123. package/templates/default/public/tinymce/skins/ui/oxide/content.min.ts +116 -0
  124. package/templates/default/public/tinymce/skins/ui/oxide/content.ts +116 -0
  125. package/templates/default/public/tinymce/skins/ui/oxide/skin.css +923 -449
  126. package/templates/default/public/tinymce/skins/ui/oxide/skin.js +1 -1
  127. package/templates/default/public/tinymce/skins/ui/oxide/skin.min.css +1 -1
  128. package/templates/default/public/tinymce/skins/ui/oxide/skin.min.ts +507 -0
  129. package/templates/default/public/tinymce/skins/ui/oxide/skin.shadowdom.min.ts +9 -0
  130. package/templates/default/public/tinymce/skins/ui/oxide/skin.shadowdom.ts +9 -0
  131. package/templates/default/public/tinymce/skins/ui/oxide/skin.ts +507 -0
  132. package/templates/default/public/tinymce/skins/ui/oxide-dark/content.css +144 -0
  133. package/templates/default/public/tinymce/skins/ui/oxide-dark/content.inline.css +144 -0
  134. package/templates/default/public/tinymce/skins/ui/oxide-dark/content.inline.js +1 -1
  135. package/templates/default/public/tinymce/skins/ui/oxide-dark/content.inline.min.css +1 -1
  136. package/templates/default/public/tinymce/skins/ui/oxide-dark/content.inline.min.ts +116 -0
  137. package/templates/default/public/tinymce/skins/ui/oxide-dark/content.inline.ts +116 -0
  138. package/templates/default/public/tinymce/skins/ui/oxide-dark/content.js +1 -1
  139. package/templates/default/public/tinymce/skins/ui/oxide-dark/content.min.css +1 -1
  140. package/templates/default/public/tinymce/skins/ui/oxide-dark/content.min.ts +116 -0
  141. package/templates/default/public/tinymce/skins/ui/oxide-dark/content.ts +116 -0
  142. package/templates/default/public/tinymce/skins/ui/oxide-dark/skin.css +926 -452
  143. package/templates/default/public/tinymce/skins/ui/oxide-dark/skin.js +1 -1
  144. package/templates/default/public/tinymce/skins/ui/oxide-dark/skin.min.css +1 -1
  145. package/templates/default/public/tinymce/skins/ui/oxide-dark/skin.min.ts +507 -0
  146. package/templates/default/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.ts +9 -0
  147. package/templates/default/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.ts +9 -0
  148. package/templates/default/public/tinymce/skins/ui/oxide-dark/skin.ts +507 -0
  149. package/templates/default/public/tinymce/skins/ui/tinymce-5/content.css +144 -0
  150. package/templates/default/public/tinymce/skins/ui/tinymce-5/content.inline.css +144 -0
  151. package/templates/default/public/tinymce/skins/ui/tinymce-5/content.inline.js +1 -1
  152. package/templates/default/public/tinymce/skins/ui/tinymce-5/content.inline.min.css +1 -1
  153. package/templates/default/public/tinymce/skins/ui/tinymce-5/content.inline.min.ts +116 -0
  154. package/templates/default/public/tinymce/skins/ui/tinymce-5/content.inline.ts +116 -0
  155. package/templates/default/public/tinymce/skins/ui/tinymce-5/content.js +1 -1
  156. package/templates/default/public/tinymce/skins/ui/tinymce-5/content.min.css +1 -1
  157. package/templates/default/public/tinymce/skins/ui/tinymce-5/content.min.ts +116 -0
  158. package/templates/default/public/tinymce/skins/ui/tinymce-5/content.ts +116 -0
  159. package/templates/default/public/tinymce/skins/ui/tinymce-5/skin.css +924 -450
  160. package/templates/default/public/tinymce/skins/ui/tinymce-5/skin.js +1 -1
  161. package/templates/default/public/tinymce/skins/ui/tinymce-5/skin.min.css +1 -1
  162. package/templates/default/public/tinymce/skins/ui/tinymce-5/skin.min.ts +508 -0
  163. package/templates/default/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.ts +9 -0
  164. package/templates/default/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.ts +9 -0
  165. package/templates/default/public/tinymce/skins/ui/tinymce-5/skin.ts +508 -0
  166. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/content.css +144 -0
  167. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/content.inline.css +144 -0
  168. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/content.inline.js +1 -1
  169. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css +1 -1
  170. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.ts +116 -0
  171. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/content.inline.ts +116 -0
  172. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/content.js +1 -1
  173. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/content.min.css +1 -1
  174. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/content.min.ts +116 -0
  175. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/content.ts +116 -0
  176. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/skin.css +925 -451
  177. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/skin.js +1 -1
  178. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/skin.min.css +1 -1
  179. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/skin.min.ts +508 -0
  180. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.ts +9 -0
  181. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.ts +9 -0
  182. package/templates/default/public/tinymce/skins/ui/tinymce-5-dark/skin.ts +508 -0
  183. package/templates/default/public/tinymce/themes/silver/theme.js +543 -593
  184. package/templates/default/public/tinymce/themes/silver/theme.min.js +1 -1
  185. package/templates/default/public/tinymce/tinymce.d.ts +559 -496
  186. package/templates/default/public/tinymce/tinymce.js +6788 -3964
  187. package/templates/default/public/tinymce/tinymce.min.js +3 -4
  188. package/templates/default/styles/globals.css +132 -107
  189. package/templates/default/tsconfig.json +45 -45
  190. package/templates/default/.prettierrc.json +0 -19
  191. package/templates/default/eslint.config.mjs +0 -38
@@ -1,8 +1,12 @@
1
1
  import FormInputElement from '@/components/form/FormInputElement'
2
- import { Autocomplete, Chip, TextField } from '@mui/material'
3
2
  import getString from 'nextjs-cms/translations'
4
3
  import { TagsFieldClientConfig } from 'nextjs-cms/core/fields'
5
4
  import { useController, useFormContext } from 'react-hook-form'
5
+ import { Badge } from '@/components/ui/badge'
6
+ import { Input } from '@/components/ui/input'
7
+ import { X } from 'lucide-react'
8
+ import { useState, useRef } from 'react'
9
+ import { cn } from '@/lib/utils'
6
10
 
7
11
  export default function TagsFormInput({ input }: { input: TagsFieldClientConfig }) {
8
12
  const { control } = useFormContext()
@@ -15,6 +19,69 @@ export default function TagsFormInput({ input }: { input: TagsFieldClientConfig
15
19
  defaultValue: input.value ?? undefined,
16
20
  })
17
21
 
22
+ const [inputValue, setInputValue] = useState('')
23
+ const [highlightedTag, setHighlightedTag] = useState<string | null>(null)
24
+ const inputRef = useRef<HTMLInputElement>(null)
25
+
26
+ // Parse tags from comma-separated string
27
+ const getTags = (): string[] => {
28
+ if (!field.value || typeof field.value !== 'string') return []
29
+ return field.value.split(',').filter((tag) => tag.trim() !== '')
30
+ }
31
+
32
+ // Convert tags array to comma-separated string
33
+ const setTags = (tags: string[]) => {
34
+ const filteredTags = tags.filter((tag) => tag.trim() !== '')
35
+ const value = filteredTags.length > 0 ? filteredTags.join(',') : ''
36
+ field.onChange(value)
37
+ }
38
+
39
+ const addTag = (tag: string) => {
40
+ const trimmedTag = tag.trim()
41
+ if (trimmedTag) {
42
+ const existingTags = getTags()
43
+ if (existingTags.includes(trimmedTag)) {
44
+ // Highlight the existing tag to show it already exists
45
+ setHighlightedTag(trimmedTag)
46
+ setTimeout(() => setHighlightedTag(null), 1000)
47
+ } else {
48
+ const newTags = [...existingTags, trimmedTag]
49
+ setTags(newTags)
50
+ setInputValue('')
51
+ }
52
+ }
53
+ }
54
+
55
+ const removeTag = (tagToRemove: string) => {
56
+ const newTags = getTags().filter((tag) => tag !== tagToRemove)
57
+ setTags(newTags)
58
+ }
59
+
60
+ const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
61
+ if (event.key === 'Enter' || event.key === ',') {
62
+ event.preventDefault()
63
+ if (inputValue.trim()) {
64
+ addTag(inputValue)
65
+ }
66
+ } else if (event.key === 'Backspace' && !inputValue && getTags().length > 0) {
67
+ // Remove last tag when backspace is pressed on empty input
68
+ const lastTag = getTags()[getTags().length - 1]
69
+ if (lastTag) {
70
+ removeTag(lastTag)
71
+ }
72
+ }
73
+ }
74
+
75
+ const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
76
+ setInputValue(event.target.value)
77
+ }
78
+
79
+ const handleContainerClick = () => {
80
+ inputRef.current?.focus()
81
+ }
82
+
83
+ const tags = getTags()
84
+
18
85
  return (
19
86
  <FormInputElement
20
87
  validationError={error}
@@ -29,35 +96,57 @@ export default function TagsFormInput({ input }: { input: TagsFieldClientConfig
29
96
  disabled={field.disabled}
30
97
  name={field.name}
31
98
  onBlur={field.onBlur}
32
- value={field.value}
99
+ value={field.value ?? ''}
33
100
  ref={field.ref}
34
101
  />
35
102
 
36
- <Autocomplete
37
- multiple
38
- // limitTags={2}
39
- options={[]}
40
- getOptionLabel={(option) => option}
41
- renderInput={(params) => (
42
- <TextField
43
- {...params}
44
- label={input.label}
45
- // className='ring-2 outline-0 focus:ring-blue-500 hover:ring-gray-400 ring-gray-300 shadow-xs rounded w-full bg-input text-foreground'
46
- placeholder={input.placeholder ? input.placeholder : getString('start_typing')}
47
- />
103
+ <div
104
+ className={cn(
105
+ 'border-input focus-within:ring-ring flex min-h-9 w-full flex-wrap items-center gap-1 rounded-md border bg-transparent px-3 py-1 text-sm shadow-xs transition-colors focus-within:ring-1',
106
+ 'cursor-text',
107
+ field.disabled && 'cursor-not-allowed opacity-50',
48
108
  )}
49
- freeSolo={true}
50
- onChange={(event, newInputValue) => {
51
- field.onChange(newInputValue.toString())
52
- }}
53
- defaultValue={input.value ? input.value.split(',') : []}
54
- disableClearable={true}
55
- renderTags={(tagValue, getTagProps) => {
56
- return tagValue.map((option, index) => (
57
- <Chip {...getTagProps({ index })} key={option} label={option} />
58
- ))
59
- }}
60
- />
109
+ onClick={handleContainerClick}
110
+ >
111
+ {tags.map((tag, index) => (
112
+ <Badge
113
+ key={`${tag}-${index}`}
114
+ variant='secondary'
115
+ className={cn(
116
+ 'flex items-center gap-1 px-2 py-1 text-xs transition-all duration-200',
117
+ highlightedTag === tag ? 'bg-success/20 border-success/50 animate-pulse' : '',
118
+ )}
119
+ >
120
+ <span>{tag}</span>
121
+ {!field.disabled ? (
122
+ <button
123
+ type='button'
124
+ onClick={(e) => {
125
+ e.stopPropagation()
126
+ removeTag(tag)
127
+ }}
128
+ className='hover:bg-muted-foreground/20 focus:ring-ring ml-1 rounded-sm focus:ring-1 focus:outline-none'
129
+ aria-label={`Remove ${tag} tag`}
130
+ >
131
+ <X className='h-3 w-3' />
132
+ </button>
133
+ ) : null}
134
+ </Badge>
135
+ ))}
136
+
137
+ <Input
138
+ ref={inputRef}
139
+ type='text'
140
+ value={inputValue}
141
+ onChange={handleInputChange}
142
+ onKeyDown={handleKeyDown}
143
+ placeholder={
144
+ tags.length === 0 ? (input.placeholder ? input.placeholder : getString('start_typing')) : ''
145
+ }
146
+ className='min-w-20 flex-1 border-0 p-0 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'
147
+ disabled={field.disabled}
148
+ />
149
+ </div>
61
150
  </FormInputElement>
62
151
  )
63
152
  }
@@ -41,7 +41,7 @@ export default function TextFormInput({
41
41
  onBlur={field.onBlur}
42
42
  value={field.value}
43
43
  ref={field.ref}
44
- className='w-full rounded bg-input p-3 text-foreground shadow-xs outline-0 ring-2 ring-gray-300 hover:ring-gray-400 focus:ring-blue-500'
44
+ className='bg-input text-foreground w-full rounded p-3 shadow-xs ring-2 ring-gray-300 outline-0 hover:ring-gray-400 focus:ring-blue-500'
45
45
  />
46
46
  </FormInputElement>
47
47
  )