@modernpoacher/gremlins 0.0.310 → 1.0.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.
Files changed (172) hide show
  1. package/.prettierignore +4 -0
  2. package/babel.config.cjs +4 -1
  3. package/eslint.config.mjs +33 -71
  4. package/index.d.mts +169 -2
  5. package/jest.after-each.mjs +10 -0
  6. package/jest.before-each.mjs +10 -0
  7. package/jest.config.mjs +11 -1
  8. package/package.json +91 -36
  9. package/src/{components → js/components}/common/disabled/index.cjs +5 -2
  10. package/src/js/components/common/disabled/index.d.cts +1 -0
  11. package/src/js/components/common/disabled/index.jsx +11 -0
  12. package/src/{components/common/required → js/components/common/readonly}/index.cjs +5 -2
  13. package/src/js/components/common/readonly/index.d.cts +1 -0
  14. package/src/js/components/common/readonly/index.jsx +11 -0
  15. package/src/{components/common/readonly → js/components/common/required}/index.cjs +5 -2
  16. package/src/js/components/common/required/index.d.cts +1 -0
  17. package/src/js/components/common/required/index.jsx +11 -0
  18. package/src/{components → js/components}/common/text-content/index.cjs +5 -2
  19. package/src/js/components/common/text-content/index.d.cts +2 -0
  20. package/src/{components → js/components}/common/text-content/index.d.mts +1 -3
  21. package/src/{components → js/components}/common/text-content/index.jsx +6 -5
  22. package/src/{components → js/components}/field/index.cjs +10 -2
  23. package/src/js/components/field/index.d.cts +1 -0
  24. package/src/js/components/field/index.d.mts +24 -0
  25. package/src/js/components/field/index.jsx +98 -0
  26. package/src/{components → js/components}/group/index.cjs +5 -2
  27. package/src/js/components/group/index.d.cts +2 -0
  28. package/src/js/components/group/index.d.mts +9 -0
  29. package/src/js/components/group/index.jsx +5 -0
  30. package/src/js/components/index.cjs +29 -0
  31. package/src/js/components/index.d.cts +2 -0
  32. package/src/js/components/index.d.mts +2 -0
  33. package/src/js/components/index.mjs +8 -0
  34. package/src/{gremlins → js/gremlins}/checkbox/field/index.cjs +5 -2
  35. package/src/js/gremlins/checkbox/field/index.d.cts +2 -0
  36. package/src/js/gremlins/checkbox/field/index.d.mts +14 -0
  37. package/src/{gremlins → js/gremlins}/checkbox/field/index.jsx +21 -10
  38. package/src/{gremlins → js/gremlins}/checkbox/index.cjs +5 -2
  39. package/src/js/gremlins/checkbox/index.d.cts +2 -0
  40. package/src/js/gremlins/checkbox/index.d.mts +24 -0
  41. package/src/{gremlins → js/gremlins}/checkbox/index.jsx +31 -23
  42. package/src/{gremlins → js/gremlins}/email/field/index.cjs +5 -2
  43. package/src/js/gremlins/email/field/index.d.cts +2 -0
  44. package/src/js/gremlins/email/field/index.d.mts +14 -0
  45. package/src/js/gremlins/email/field/index.jsx +83 -0
  46. package/src/{gremlins → js/gremlins}/email/index.cjs +5 -2
  47. package/src/js/gremlins/email/index.d.cts +2 -0
  48. package/src/js/gremlins/email/index.d.mts +18 -0
  49. package/src/{gremlins → js/gremlins}/email/index.jsx +25 -12
  50. package/src/{gremlins → js/gremlins}/fieldset/group/index.cjs +5 -2
  51. package/src/js/gremlins/fieldset/group/index.d.cts +2 -0
  52. package/src/js/gremlins/fieldset/group/index.d.mts +12 -0
  53. package/src/js/gremlins/fieldset/group/index.jsx +19 -0
  54. package/src/{gremlins → js/gremlins}/fieldset/index.cjs +5 -2
  55. package/src/js/gremlins/fieldset/index.d.cts +2 -0
  56. package/src/js/gremlins/fieldset/index.d.mts +14 -0
  57. package/src/js/gremlins/fieldset/index.jsx +37 -0
  58. package/src/{gremlins → js/gremlins}/index.cjs +9 -4
  59. package/src/js/gremlins/index.d.cts +5 -0
  60. package/src/js/gremlins/index.d.mts +27 -0
  61. package/src/js/gremlins/index.jsx +162 -0
  62. package/src/{gremlins → js/gremlins}/number/field/index.cjs +5 -2
  63. package/src/js/gremlins/number/field/index.d.cts +2 -0
  64. package/src/js/gremlins/number/field/index.d.mts +14 -0
  65. package/src/{gremlins → js/gremlins}/number/field/index.jsx +40 -7
  66. package/src/{gremlins → js/gremlins}/number/index.cjs +5 -2
  67. package/src/js/gremlins/number/index.d.cts +2 -0
  68. package/src/js/gremlins/number/index.d.mts +18 -0
  69. package/src/{gremlins → js/gremlins}/number/index.jsx +25 -8
  70. package/src/{gremlins → js/gremlins}/password/field/index.cjs +5 -2
  71. package/src/js/gremlins/password/field/index.d.cts +2 -0
  72. package/src/js/gremlins/password/field/index.d.mts +14 -0
  73. package/src/js/gremlins/password/field/index.jsx +83 -0
  74. package/src/{gremlins → js/gremlins}/password/index.cjs +5 -2
  75. package/src/js/gremlins/password/index.d.cts +2 -0
  76. package/src/js/gremlins/password/index.d.mts +18 -0
  77. package/src/{gremlins → js/gremlins}/password/index.jsx +25 -12
  78. package/src/{gremlins → js/gremlins}/radio/field/index.cjs +5 -2
  79. package/src/js/gremlins/radio/field/index.d.cts +2 -0
  80. package/src/js/gremlins/radio/field/index.d.mts +14 -0
  81. package/src/{gremlins → js/gremlins}/radio/field/index.jsx +20 -9
  82. package/src/{gremlins → js/gremlins}/radio/index.cjs +5 -2
  83. package/src/js/gremlins/radio/index.d.cts +2 -0
  84. package/src/js/gremlins/radio/index.d.mts +24 -0
  85. package/src/{gremlins → js/gremlins}/radio/index.jsx +33 -17
  86. package/src/{gremlins → js/gremlins}/select/field/index.cjs +5 -2
  87. package/src/js/gremlins/select/field/index.d.cts +2 -0
  88. package/src/js/gremlins/select/field/index.d.mts +18 -0
  89. package/src/js/gremlins/select/field/index.jsx +200 -0
  90. package/src/{gremlins → js/gremlins}/select/index.cjs +5 -2
  91. package/src/js/gremlins/select/index.d.cts +2 -0
  92. package/src/js/gremlins/select/index.d.mts +18 -0
  93. package/src/{gremlins → js/gremlins}/select/index.jsx +53 -16
  94. package/src/{gremlins → js/gremlins}/text/field/index.cjs +5 -2
  95. package/src/js/gremlins/text/field/index.d.cts +2 -0
  96. package/src/js/gremlins/text/field/index.d.mts +14 -0
  97. package/src/js/gremlins/text/field/index.jsx +83 -0
  98. package/src/{gremlins → js/gremlins}/text/index.cjs +5 -2
  99. package/src/js/gremlins/text/index.d.cts +2 -0
  100. package/src/js/gremlins/text/index.d.mts +18 -0
  101. package/src/{gremlins → js/gremlins}/text/index.jsx +25 -12
  102. package/src/{gremlins → js/gremlins}/textarea/field/index.cjs +5 -2
  103. package/src/js/gremlins/textarea/field/index.d.cts +2 -0
  104. package/src/js/gremlins/textarea/field/index.d.mts +18 -0
  105. package/src/js/gremlins/textarea/field/index.jsx +81 -0
  106. package/src/{gremlins → js/gremlins}/textarea/index.cjs +5 -2
  107. package/src/js/gremlins/textarea/index.d.cts +2 -0
  108. package/src/js/gremlins/textarea/index.d.mts +18 -0
  109. package/src/{gremlins → js/gremlins}/textarea/index.jsx +25 -12
  110. package/src/js/super/components/field/index.cjs +20 -0
  111. package/src/js/super/components/field/index.d.cts +2 -0
  112. package/src/js/super/components/field/index.d.mts +23 -0
  113. package/src/{components → js/super/components}/field/index.jsx +44 -87
  114. package/src/js/super/components/group/index.cjs +20 -0
  115. package/src/js/super/components/group/index.d.cts +2 -0
  116. package/src/js/super/components/group/index.d.mts +18 -0
  117. package/src/js/super/components/group/index.jsx +59 -0
  118. package/src/js/super/components/index.cjs +23 -0
  119. package/src/js/super/components/index.d.cts +2 -0
  120. package/src/js/super/components/index.d.mts +2 -0
  121. package/src/js/super/components/index.mjs +8 -0
  122. package/src/js/super/gremlins/index.cjs +22 -0
  123. package/src/js/super/gremlins/index.d.cts +4 -0
  124. package/src/js/super/gremlins/index.d.mts +36 -0
  125. package/src/js/super/gremlins/index.jsx +176 -0
  126. package/src/sass/.stylelintrc +14 -0
  127. package/src/sass/_gremlins.scss +59 -0
  128. package/src/sass/gremlins/_checkbox.scss +87 -0
  129. package/src/sass/gremlins/_disabled.scss +15 -0
  130. package/src/sass/gremlins/_error.scss +48 -0
  131. package/src/sass/gremlins/_radio.scss +93 -0
  132. package/src/common/index.d.mts +0 -9
  133. package/src/common/index.mjs +0 -7
  134. package/src/components/common/disabled/index.jsx +0 -9
  135. package/src/components/common/readonly/index.jsx +0 -9
  136. package/src/components/common/required/index.jsx +0 -9
  137. package/src/components/field/index.d.mts +0 -23
  138. package/src/components/group/index.d.mts +0 -16
  139. package/src/components/group/index.jsx +0 -59
  140. package/src/gremlins/checkbox/field/index.d.mts +0 -9
  141. package/src/gremlins/checkbox/index.d.mts +0 -9
  142. package/src/gremlins/email/field/index.d.mts +0 -9
  143. package/src/gremlins/email/field/index.jsx +0 -54
  144. package/src/gremlins/email/index.d.mts +0 -9
  145. package/src/gremlins/fieldset/group/index.d.mts +0 -9
  146. package/src/gremlins/fieldset/group/index.jsx +0 -16
  147. package/src/gremlins/fieldset/index.d.mts +0 -9
  148. package/src/gremlins/fieldset/index.jsx +0 -41
  149. package/src/gremlins/index.d.mts +0 -45
  150. package/src/gremlins/index.jsx +0 -291
  151. package/src/gremlins/number/field/index.d.mts +0 -9
  152. package/src/gremlins/number/index.d.mts +0 -9
  153. package/src/gremlins/password/field/index.d.mts +0 -9
  154. package/src/gremlins/password/field/index.jsx +0 -54
  155. package/src/gremlins/password/index.d.mts +0 -9
  156. package/src/gremlins/radio/field/index.d.mts +0 -9
  157. package/src/gremlins/radio/index.d.mts +0 -9
  158. package/src/gremlins/select/field/index.d.mts +0 -9
  159. package/src/gremlins/select/field/index.jsx +0 -111
  160. package/src/gremlins/select/index.d.mts +0 -9
  161. package/src/gremlins/text/field/index.d.mts +0 -9
  162. package/src/gremlins/text/field/index.jsx +0 -54
  163. package/src/gremlins/text/index.d.mts +0 -9
  164. package/src/gremlins/textarea/field/index.d.mts +0 -9
  165. package/src/gremlins/textarea/field/index.jsx +0 -53
  166. package/src/gremlins/textarea/index.d.mts +0 -9
  167. /package/src/{components → js/components}/common/disabled/index.d.mts +0 -0
  168. /package/src/{components → js/components}/common/readonly/index.d.mts +0 -0
  169. /package/src/{components → js/components}/common/required/index.d.mts +0 -0
  170. /package/src/{index.cjs → js/index.cjs} +0 -0
  171. /package/src/{index.d.mts → js/index.d.mts} +0 -0
  172. /package/src/{index.mjs → js/index.mjs} +0 -0
@@ -0,0 +1,200 @@
1
+ /**
2
+ * @typedef {GremlinsTypes.OnEventType} OnEventType
3
+ * @typedef {GremlinsTypes.Components.Field.ValueProps} ValueProps
4
+ * @typedef {GremlinsTypes.Components.Field.Select.SelectProps} SelectProps
5
+ */
6
+
7
+ /**
8
+ * SelectField component
9
+ */
10
+ import React from 'react'
11
+ import PropTypes from 'prop-types'
12
+ import classnames from 'classnames'
13
+
14
+ import {
15
+ ValueField,
16
+ toInputValue
17
+ } from '#gremlins/components/field'
18
+
19
+ /**
20
+ * @type {OnEventType}
21
+ */
22
+ function DEFAULT_HANDLE_EVENT () {
23
+ //
24
+ }
25
+
26
+ /**
27
+ * @param {HTMLOptionElement[]} selectedOptions
28
+ * @returns {string[]}
29
+ */
30
+ function fromSelectedOptions (selectedOptions) {
31
+ return (
32
+ Array.from(selectedOptions)
33
+ .map(({ value, text }) => (value || text) ?? '')
34
+ )
35
+ }
36
+
37
+ /**
38
+ * @param {{ target: { selectedOptions: HTMLOptionElement[] } }} event
39
+ * @returns {string[]}
40
+ */
41
+ function getSelectedValues ({ target: { selectedOptions } }) {
42
+ return (
43
+ fromSelectedOptions(selectedOptions)
44
+ )
45
+ }
46
+
47
+ /**
48
+ * @param {{ target: { value?: string } }} event
49
+ * @returns {string}
50
+ */
51
+ function getSelectedValue ({ target: { value } }) {
52
+ return value ?? ''
53
+ }
54
+
55
+ /**
56
+ * @extends {ValueField<ValueProps & SelectProps>}
57
+ */
58
+ export default class SelectField extends ValueField {
59
+ getClassName () {
60
+ return classnames(super.getClassName(), 'select')
61
+ }
62
+
63
+ /**
64
+ * @param {SelectProps} props
65
+ * @returns {boolean}
66
+ */
67
+ shouldComponentUpdate (props) {
68
+ const {
69
+ multiple,
70
+ children,
71
+ ...superProps
72
+ } = props
73
+
74
+ return (
75
+ super.shouldComponentUpdate(superProps) || // , state ||
76
+ (multiple !== this.props.multiple) ||
77
+ (children !== this.props.children)
78
+ )
79
+ }
80
+
81
+ /**
82
+ * @overload
83
+ * @param {{ target: { selectedOptions: { value?: string, text?: string }[] } }} event
84
+ * @returns {void}
85
+ *
86
+ * @overload
87
+ * @param {{ target: { value?: string } }} event
88
+ * @returns {void}
89
+ *
90
+ * @param {any} event
91
+ * @returns {void}
92
+ */
93
+ handleChange = (event) => {
94
+ const {
95
+ multiple = false,
96
+ onChange = DEFAULT_HANDLE_EVENT
97
+ } = this.props
98
+
99
+ if (multiple) {
100
+ onChange(getSelectedValues(event))
101
+ } else {
102
+ onChange(getSelectedValue(event))
103
+ }
104
+ }
105
+
106
+ render () {
107
+ const {
108
+ name,
109
+ id,
110
+ defaultValue,
111
+ required = false,
112
+ disabled = false,
113
+ readOnly = false,
114
+ tabIndex,
115
+ accessKey,
116
+ multiple = false,
117
+ children,
118
+ fieldRef
119
+ } = this.props
120
+
121
+ const className = this.getClassName()
122
+
123
+ if (defaultValue === undefined) {
124
+ const {
125
+ value
126
+ } = this.props
127
+
128
+ return (
129
+ <select
130
+ name={name}
131
+ id={id}
132
+ value={(
133
+ multiple
134
+ ? Array.isArray(value)
135
+ ? value
136
+ : [toInputValue(value)]
137
+ : toInputValue(value)
138
+ )}
139
+ required={required}
140
+ disabled={disabled} // @ts-ignore
141
+ readOnly={readOnly}
142
+ tabIndex={tabIndex}
143
+ accessKey={accessKey}
144
+ multiple={multiple}
145
+ onChange={this.handleChange}
146
+ className={className}
147
+ ref={fieldRef}>
148
+ {children}
149
+ </select>
150
+ )
151
+ }
152
+
153
+ return (
154
+ <select
155
+ name={name}
156
+ id={id}
157
+ defaultValue={(
158
+ multiple
159
+ ? Array.isArray(defaultValue)
160
+ ? defaultValue
161
+ : [String(defaultValue)]
162
+ : String(defaultValue)
163
+ )}
164
+ required={required}
165
+ disabled={disabled} // @ts-ignore
166
+ readOnly={readOnly}
167
+ tabIndex={tabIndex}
168
+ accessKey={accessKey}
169
+ multiple={multiple}
170
+ onChange={this.handleChange}
171
+ className={className}
172
+ ref={fieldRef}>
173
+ {children}
174
+ </select>
175
+ )
176
+ }
177
+ }
178
+
179
+ SelectField.propTypes = {
180
+ ...ValueField.propTypes,
181
+ multiple: PropTypes.bool,
182
+ value: PropTypes.oneOfType([
183
+ PropTypes.string,
184
+ PropTypes.arrayOf(
185
+ PropTypes.string
186
+ )
187
+ ]),
188
+ defaultValue: PropTypes.oneOfType([
189
+ PropTypes.string,
190
+ PropTypes.arrayOf(
191
+ PropTypes.string
192
+ )
193
+ ]),
194
+ children: PropTypes.oneOfType([
195
+ PropTypes.node,
196
+ PropTypes.arrayOf(
197
+ PropTypes.node
198
+ )
199
+ ])
200
+ }
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/gremlins/select')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: Select
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = Select
@@ -0,0 +1,2 @@
1
+ export { default } from '#gremlins/gremlins/select'
2
+ export * from '#gremlins/gremlins/select'
@@ -0,0 +1,18 @@
1
+ declare module '#gremlins/gremlins/select' {
2
+ import {
3
+ ValueGremlin
4
+ } from '#gremlins/gremlins'
5
+
6
+ export type SelectProps = GremlinsTypes.Gremlins.Select.SelectProps
7
+
8
+ export default class SelectGremlin<P extends SelectProps> extends ValueGremlin<Omit<Omit<P, 'value'>, 'defaultValue'>> {
9
+ handleChange (
10
+ value?: string | string[]
11
+ ): void
12
+ }
13
+ }
14
+
15
+ declare module '@modernpoacher/gremlins/gremlins/select' {
16
+ export { default } from '#gremlins/gremlins/select'
17
+ export * from '#gremlins/gremlins/select'
18
+ }
@@ -1,34 +1,71 @@
1
1
  /**
2
- * SelectGremlin component
2
+ * @typedef {GremlinsTypes.OnEventType} OnEventType
3
+ * @typedef {GremlinsTypes.Gremlins.ValueProps} ValueProps
4
+ * @typedef {GremlinsTypes.Gremlins.Select.SelectProps} SelectProps
5
+ */
6
+
7
+ /**
8
+ * SelectGremlin component
3
9
  */
4
10
  import React from 'react'
5
11
  import PropTypes from 'prop-types'
6
12
  import classnames from 'classnames'
7
13
 
8
- import { ValueGremlin } from '#gremlins/gremlins'
9
-
10
14
  import {
11
- DEFAULT_HANDLE_CHANGE
12
- } from '#gremlins/common'
15
+ ValueGremlin
16
+ } from '#gremlins/gremlins'
13
17
 
14
- import Field from './field/index.jsx'
18
+ import Field from '#gremlins/gremlins/select/field'
15
19
 
16
- export default class SelectGremlin extends ValueGremlin {
17
- shouldComponentUpdate (props, state) {
18
- return (
19
- super.shouldComponentUpdate(props) ||
20
- (props.multiple !== this.props.multiple) ||
21
- (props.children !== this.props.children)
22
- )
23
- }
20
+ /**
21
+ * @type {OnEventType}
22
+ */
23
+ function DEFAULT_HANDLE_EVENT () {
24
+ //
25
+ }
24
26
 
27
+ /**
28
+ * @extends {ValueGremlin<ValueProps & SelectProps>}
29
+ */
30
+ export default class SelectGremlin extends ValueGremlin {
25
31
  getClassName () {
26
32
  return classnames(super.getClassName(), 'select')
27
33
  }
28
34
 
35
+ /**
36
+ * @param {SelectProps} props
37
+ * @returns {boolean}
38
+ */
39
+ shouldComponentUpdate (props) {
40
+ const {
41
+ value,
42
+ defaultValue,
43
+ multiple,
44
+ children,
45
+ ...superProps
46
+ } = props
47
+
48
+ return (
49
+ /**
50
+ * `value` may be `string` or `string[]`
51
+ */
52
+ (value !== this.props.value) ||
53
+ /**
54
+ * `defaultValue` may be `string` or `string[]`
55
+ */
56
+ (defaultValue !== this.props.defaultValue) ||
57
+ super.shouldComponentUpdate(superProps) ||
58
+ (multiple !== this.props.multiple) ||
59
+ (children !== this.props.children)
60
+ )
61
+ }
62
+
63
+ /**
64
+ * @param {string | string[]} [value]
65
+ */
29
66
  handleChange = (value) => {
30
67
  const {
31
- onChange = DEFAULT_HANDLE_CHANGE
68
+ onChange = DEFAULT_HANDLE_EVENT
32
69
  } = this.props
33
70
 
34
71
  onChange(value)
@@ -54,8 +91,8 @@ export default class SelectGremlin extends ValueGremlin {
54
91
 
55
92
  return (
56
93
  <Field
57
- id={id}
58
94
  name={name}
95
+ id={id}
59
96
  value={value}
60
97
  defaultValue={defaultValue}
61
98
  required={required}
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/gremlins/text/field')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: Field
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = Field
@@ -0,0 +1,2 @@
1
+ export { default } from '#gremlins/gremlins/text/field'
2
+ export * from '#gremlins/gremlins/text/field'
@@ -0,0 +1,14 @@
1
+ declare module '#gremlins/gremlins/text/field' {
2
+ import {
3
+ ValueField
4
+ } from '#gremlins/components/field'
5
+
6
+ export type TextProps = GremlinsTypes.Components.Field.Text.TextProps
7
+
8
+ export default class TextField<P extends TextProps> extends ValueField<P> {}
9
+ }
10
+
11
+ declare module '@modernpoacher/gremlins/gremlins/text/field' {
12
+ export { default } from '#gremlins/gremlins/text/field'
13
+ export * from '#gremlins/gremlins/text/field'
14
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @typedef {GremlinsTypes.Components.Field.ValueProps} ValueProps
3
+ * @typedef {GremlinsTypes.Components.Field.Text.TextProps} TextProps
4
+ */
5
+
6
+ /**
7
+ * TextField component
8
+ */
9
+ import React from 'react'
10
+ import classnames from 'classnames'
11
+
12
+ import {
13
+ ValueField,
14
+ toInputValue
15
+ } from '#gremlins/components/field'
16
+
17
+ /**
18
+ * @extends {ValueField<ValueProps & TextProps>}
19
+ */
20
+ export default class TextField extends ValueField {
21
+ getClassName () {
22
+ return classnames(super.getClassName(), 'text')
23
+ }
24
+
25
+ render () {
26
+ const {
27
+ name,
28
+ id,
29
+ defaultValue,
30
+ required = false,
31
+ disabled = false,
32
+ readOnly = false,
33
+ tabIndex,
34
+ accessKey,
35
+ placeholder,
36
+ fieldRef
37
+ } = this.props
38
+
39
+ const className = this.getClassName()
40
+
41
+ if (defaultValue === undefined) {
42
+ const {
43
+ value
44
+ } = this.props
45
+
46
+ return (
47
+ <input
48
+ name={name}
49
+ id={id}
50
+ value={toInputValue(value)}
51
+ required={required}
52
+ disabled={disabled}
53
+ readOnly={readOnly}
54
+ tabIndex={tabIndex}
55
+ accessKey={accessKey}
56
+ placeholder={placeholder}
57
+ onChange={this.handleChange}
58
+ className={className}
59
+ type='text'
60
+ ref={fieldRef}
61
+ />
62
+ )
63
+ }
64
+
65
+ return (
66
+ <input
67
+ name={name}
68
+ id={id}
69
+ defaultValue={String(defaultValue)}
70
+ required={required}
71
+ disabled={disabled}
72
+ readOnly={readOnly}
73
+ tabIndex={tabIndex}
74
+ accessKey={accessKey}
75
+ placeholder={placeholder}
76
+ onChange={this.handleChange}
77
+ className={className}
78
+ type='text'
79
+ ref={fieldRef}
80
+ />
81
+ )
82
+ }
83
+ }
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/gremlins/text')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: Text
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = Text
@@ -0,0 +1,2 @@
1
+ export { default } from '#gremlins/gremlins/text'
2
+ export * from '#gremlins/gremlins/text'
@@ -0,0 +1,18 @@
1
+ declare module '#gremlins/gremlins/text' {
2
+ import {
3
+ ValueGremlin
4
+ } from '#gremlins/gremlins'
5
+
6
+ export type TextProps = GremlinsTypes.Gremlins.Text.TextProps
7
+
8
+ export default class TextGremlin<P extends TextProps> extends ValueGremlin<P> {
9
+ handleChange (
10
+ value?: string | string[]
11
+ ): void
12
+ }
13
+ }
14
+
15
+ declare module '@modernpoacher/gremlins/gremlins/text' {
16
+ export { default } from '#gremlins/gremlins/text'
17
+ export * from '#gremlins/gremlins/text'
18
+ }
@@ -1,25 +1,42 @@
1
1
  /**
2
- * TextGremlin component
2
+ * @typedef {GremlinsTypes.OnEventType} OnEventType
3
+ * @typedef {GremlinsTypes.Gremlins.ValueProps} ValueProps
4
+ * @typedef {GremlinsTypes.Gremlins.Password.PasswordProps} PasswordProps
5
+ */
6
+
7
+ /**
8
+ * TextGremlin component
3
9
  */
4
10
  import React from 'react'
5
11
  import classnames from 'classnames'
6
12
 
7
- import { ValueGremlin } from '#gremlins/gremlins'
8
-
9
13
  import {
10
- DEFAULT_HANDLE_CHANGE
11
- } from '#gremlins/common'
14
+ ValueGremlin
15
+ } from '#gremlins/gremlins'
12
16
 
13
- import Field from './field/index.jsx'
17
+ import Field from '#gremlins/gremlins/text/field'
18
+
19
+ /**
20
+ * @type {OnEventType}
21
+ */
22
+ function DEFAULT_HANDLE_EVENT () {
23
+ //
24
+ }
14
25
 
26
+ /**
27
+ * @extends {ValueGremlin<ValueProps & PasswordProps>}
28
+ */
15
29
  export default class TextGremlin extends ValueGremlin {
16
30
  getClassName () {
17
31
  return classnames(super.getClassName(), 'text')
18
32
  }
19
33
 
34
+ /**
35
+ * @param {string | string[]} [value]
36
+ */
20
37
  handleChange = (value) => {
21
38
  const {
22
- onChange = DEFAULT_HANDLE_CHANGE
39
+ onChange = DEFAULT_HANDLE_EVENT
23
40
  } = this.props
24
41
 
25
42
  onChange(value)
@@ -43,8 +60,8 @@ export default class TextGremlin extends ValueGremlin {
43
60
 
44
61
  return (
45
62
  <Field
46
- id={id}
47
63
  name={name}
64
+ id={id}
48
65
  value={value}
49
66
  defaultValue={defaultValue}
50
67
  required={required}
@@ -59,7 +76,3 @@ export default class TextGremlin extends ValueGremlin {
59
76
  )
60
77
  }
61
78
  }
62
-
63
- TextGremlin.propTypes = {
64
- ...ValueGremlin.propTypes
65
- }
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/gremlins/textarea/field')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: Field
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = Field
@@ -0,0 +1,2 @@
1
+ export { default } from '#gremlins/gremlins/textarea/field'
2
+ export * from '#gremlins/gremlins/textarea/field'
@@ -0,0 +1,18 @@
1
+ declare module '#gremlins/gremlins/textarea/field' {
2
+ import type { ChangeEvent } from 'react'
3
+
4
+ import {
5
+ ValueField
6
+ } from '#gremlins/components/field'
7
+
8
+ export type TextareaProps = GremlinsTypes.Components.Field.Textarea.TextareaProps
9
+
10
+ export default class TextareaField<P extends TextareaProps> extends ValueField<P> {
11
+ handleChange (event: ChangeEvent<HTMLTextAreaElement>): void
12
+ }
13
+ }
14
+
15
+ declare module '@modernpoacher/gremlins/gremlins/textarea/field' {
16
+ export { default } from '#gremlins/gremlins/textarea/field'
17
+ export * from '#gremlins/gremlins/textarea/field'
18
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @typedef {GremlinsTypes.Components.Field.ValueProps} ValueProps
3
+ * @typedef {GremlinsTypes.Components.Field.Textarea.TextareaProps} TextareaProps
4
+ */
5
+
6
+ /**
7
+ * TextareaField component
8
+ */
9
+ import React from 'react'
10
+ import classnames from 'classnames'
11
+
12
+ import {
13
+ ValueField,
14
+ toInputValue
15
+ } from '#gremlins/components/field'
16
+
17
+ /**
18
+ * @extends {ValueField<ValueProps & TextareaProps>}
19
+ */
20
+ export default class TextareaField extends ValueField {
21
+ getClassName () {
22
+ return classnames(super.getClassName(), 'textarea')
23
+ }
24
+
25
+ render () {
26
+ const {
27
+ name,
28
+ id,
29
+ defaultValue,
30
+ required = false,
31
+ disabled = false,
32
+ readOnly = false,
33
+ tabIndex,
34
+ accessKey,
35
+ placeholder,
36
+ fieldRef
37
+ } = this.props
38
+
39
+ const className = this.getClassName()
40
+
41
+ if (defaultValue === undefined) {
42
+ const {
43
+ value
44
+ } = this.props
45
+
46
+ return (
47
+ <textarea
48
+ name={name}
49
+ id={id}
50
+ value={toInputValue(value)}
51
+ required={required}
52
+ disabled={disabled}
53
+ readOnly={readOnly}
54
+ tabIndex={tabIndex}
55
+ accessKey={accessKey}
56
+ placeholder={placeholder}
57
+ onChange={this.handleChange}
58
+ className={className}
59
+ ref={fieldRef}
60
+ />
61
+ )
62
+ }
63
+
64
+ return (
65
+ <textarea
66
+ name={name}
67
+ id={id}
68
+ defaultValue={String(defaultValue)}
69
+ required={required}
70
+ disabled={disabled}
71
+ readOnly={readOnly}
72
+ tabIndex={tabIndex}
73
+ accessKey={accessKey}
74
+ placeholder={placeholder}
75
+ onChange={this.handleChange}
76
+ className={className}
77
+ ref={fieldRef}
78
+ />
79
+ )
80
+ }
81
+ }
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/gremlins/textarea')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: Textarea
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = Textarea
@@ -0,0 +1,2 @@
1
+ export { default } from '#gremlins/gremlins/textarea'
2
+ export * from '#gremlins/gremlins/textarea'