@modernpoacher/gremlins 0.0.311 → 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 +83 -28
  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
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/components/common/readonly')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: Required
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = Required
@@ -0,0 +1 @@
1
+ export { default } from '#gremlins/components/common/required'
@@ -0,0 +1,11 @@
1
+ import React from 'react'
2
+
3
+ const REQUIRED = String.fromCharCode(42)
4
+
5
+ export default function Required () {
6
+ return (
7
+ <span className='is-required'>
8
+ {REQUIRED}
9
+ </span>
10
+ )
11
+ }
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/components/common/text-content')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: TextComponent
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = TextComponent
@@ -0,0 +1,2 @@
1
+ export { default } from '#gremlins/components/common/text-content'
2
+ export * from '#gremlins/components/common/text-content'
@@ -1,9 +1,7 @@
1
1
  declare module '#gremlins/components/common/text-content' {
2
2
  import type React from 'react'
3
3
 
4
- export interface TextContentProps {
5
- textContent: string
6
- }
4
+ export type TextContentProps = GremlinsTypes.Components.Common.TextContent.TextContentProps
7
5
 
8
6
  export default function TextContent (props: TextContentProps): React.JSX.Element | null
9
7
  }
@@ -1,15 +1,16 @@
1
1
  /**
2
- * TextContent component
3
- *
4
- * @typedef {import('@modernpoacher/gremlins/components/common/text-content').TextContentProps} TextContentProps
2
+ * @typedef {GremlinsTypes.Components.Common.TextContent.TextContentProps} TextContentProps
5
3
  */
6
4
 
5
+ /**
6
+ * TextContent component
7
+ */
7
8
  import React from 'react'
8
9
  import PropTypes from 'prop-types'
9
10
 
10
11
  /**
11
- * @param {TextContentProps}
12
- * @returns {React.JSX.Element | null}
12
+ * @param {TextContentProps} props
13
+ * @returns {React.JSX.Element | null}
13
14
  */
14
15
  export default function TextContent ({ textContent }) {
15
16
  if (textContent) {
@@ -10,7 +10,15 @@ const log = debug('@modernpoacher/gremlins/components/field')
10
10
 
11
11
  log('`gremlins` is awake')
12
12
 
13
+ const {
14
+ ValueField,
15
+ CheckField,
16
+ toInputValue
17
+ } = require('./index.jsx')
18
+
13
19
  /**
14
- * Exports default, etc
20
+ * Exports ValueField and CheckField
15
21
  */
16
- module.exports = require('./index.jsx')
22
+ module.exports.ValueField = ValueField
23
+ module.exports.CheckField = CheckField
24
+ module.exports.toInputValue = toInputValue
@@ -0,0 +1 @@
1
+ export * from '#gremlins/components/field'
@@ -0,0 +1,24 @@
1
+ declare module '#gremlins/components/field' {
2
+ import type { MouseEvent } from 'react'
3
+
4
+ import Field from '#gremlins/super/components/field'
5
+
6
+ export function toInputValue (value: unknown): string
7
+
8
+ export type ValueProps = GremlinsTypes.Components.Field.ValueProps
9
+ export type CheckProps = GremlinsTypes.Components.Field.CheckProps
10
+
11
+ export class ValueField<P extends ValueProps> extends Field<P> {
12
+ shouldComponentUpdate (props: ValueProps): boolean
13
+ }
14
+
15
+ export class CheckField<P extends CheckProps> extends Field<P> {
16
+ shouldComponentUpdate (props: CheckProps): boolean
17
+
18
+ handleClick (event: MouseEvent<HTMLInputElement>): void
19
+ }
20
+ }
21
+
22
+ declare module '@modernpoacher/gremlins/components/field' {
23
+ export * from '#gremlins/components/field'
24
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @typedef {GremlinsTypes.OnEventType} OnEventType
3
+ * @typedef {GremlinsTypes.Super.Components.Field.FieldProps} FieldProps
4
+ * @typedef {GremlinsTypes.Components.Field.ValueProps} ValueProps
5
+ * @typedef {GremlinsTypes.Components.Field.CheckProps} CheckProps
6
+ */
7
+
8
+ /**
9
+ * Field component
10
+ */
11
+ import PropTypes from 'prop-types'
12
+
13
+ import Field from '#gremlins/super/components/field'
14
+
15
+ /**
16
+ * @type {OnEventType}
17
+ */
18
+ function DEFAULT_HANDLE_EVENT () {
19
+ //
20
+ }
21
+
22
+ /**
23
+ * @param {unknown} value
24
+ * @returns {string}
25
+ */
26
+ export function toInputValue (value) {
27
+ return (value === undefined) ? '' : String(value)
28
+ }
29
+
30
+ /**
31
+ * ValueField component
32
+ *
33
+ * @extends {Field<FieldProps & ValueProps>}
34
+ */
35
+ export class ValueField extends Field {}
36
+
37
+ ValueField.propTypes = {
38
+ ...Field.propTypes,
39
+ defaultValue: PropTypes.string
40
+ }
41
+
42
+ /**
43
+ * CheckField component
44
+ *
45
+ * @extends {Field<FieldProps & CheckProps>}
46
+ */
47
+ export class CheckField extends Field {
48
+ /**
49
+ * @param {CheckProps} props
50
+ * @returns {boolean}
51
+ */
52
+ shouldComponentUpdate (props) {
53
+ const {
54
+ checked,
55
+ defaultChecked,
56
+ onClick,
57
+ ...superProps
58
+ } = props
59
+
60
+ return (
61
+ (checked !== this.props.checked) ||
62
+ (defaultChecked !== this.props.defaultChecked) ||
63
+ super.shouldComponentUpdate(superProps) ||
64
+ (onClick !== this.props.onClick)
65
+ )
66
+ }
67
+
68
+ /**
69
+ * @param {{ target: { value?: string, checked?: boolean } }} event
70
+ * @returns {void}
71
+ */
72
+ handleChange = ({ target: { value, checked } }) => {
73
+ const {
74
+ onChange = DEFAULT_HANDLE_EVENT
75
+ } = this.props
76
+
77
+ onChange(value, checked)
78
+ }
79
+
80
+ /**
81
+ * @param {{ target: { value?: string, checked?: boolean } }} event
82
+ * @returns {void}
83
+ */
84
+ handleClick = ({ target: { value, checked } }) => {
85
+ const {
86
+ onClick = DEFAULT_HANDLE_EVENT
87
+ } = this.props
88
+
89
+ onClick(value, checked)
90
+ }
91
+ }
92
+
93
+ CheckField.propTypes = {
94
+ ...Field.propTypes,
95
+ checked: PropTypes.bool,
96
+ defaultChecked: PropTypes.bool,
97
+ onClick: PropTypes.func
98
+ }
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/sprockets/components/group')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: Group
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = Group
@@ -0,0 +1,2 @@
1
+ export { default } from '#gremlins/components/group'
2
+ export * from '#gremlins/components/group'
@@ -0,0 +1,9 @@
1
+ declare module '#gremlins/components/group' {
2
+ export { default } from '#gremlins/super/components/group'
3
+ export * from '#gremlins/super/components/group'
4
+ }
5
+
6
+ declare module '@modernpoacher/gremlins/components/group' {
7
+ export { default } from '#gremlins/components/group'
8
+ export * from '#gremlins/components/group'
9
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Group component
3
+ */
4
+
5
+ export { default } from '#gremlins/super/components/group'
@@ -0,0 +1,29 @@
1
+ require('@babel/register')({
2
+ ignore: [
3
+ /node_modules\/(?!@modernpoacher\/cogs|@modernpoacher\/sprockets|@modernpoacher\/gremlins)/
4
+ ]
5
+ })
6
+
7
+ const debug = require('debug')
8
+
9
+ const log = debug('@modernpoacher/gremlins/components')
10
+
11
+ log('`gremlins` is awake')
12
+
13
+ const {
14
+ ValueField,
15
+ CheckField,
16
+ toInputValue
17
+ } = require('./field/index.jsx')
18
+
19
+ module.exports.Field = {
20
+ ValueField,
21
+ CheckField,
22
+ toInputValue
23
+ }
24
+
25
+ const {
26
+ default: Group
27
+ } = require('./group/index.jsx')
28
+
29
+ module.exports.Group = Group
@@ -0,0 +1,2 @@
1
+ export { default as Field } from '#gremlins/components/field'
2
+ export { default as Group } from '#gremlins/components/group'
@@ -0,0 +1,2 @@
1
+ export { default as Field } from '#gremlins/components/field'
2
+ export { default as Group } from '#gremlins/components/group'
@@ -0,0 +1,8 @@
1
+ import debug from 'debug'
2
+
3
+ const log = debug('@modernpoacher/gremlins/components')
4
+
5
+ log('`gremlins` is awake')
6
+
7
+ export { default as Field } from './field/index.cjs'
8
+ export { default as Group } from './group/index.cjs'
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/gremlins/checkbox/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/checkbox/field'
2
+ export * from '#gremlins/gremlins/checkbox/field'
@@ -0,0 +1,14 @@
1
+ declare module '#gremlins/gremlins/checkbox/field' {
2
+ import {
3
+ CheckField
4
+ } from '#gremlins/components/field'
5
+
6
+ export type CheckboxProps = GremlinsTypes.Components.Field.Checkbox.CheckboxProps
7
+
8
+ export default class CheckboxField<P extends CheckboxProps> extends CheckField<P> {}
9
+ }
10
+
11
+ declare module '@modernpoacher/gremlins/gremlins/checkbox/field' {
12
+ export { default } from '#gremlins/gremlins/checkbox/field'
13
+ export * from '#gremlins/gremlins/checkbox/field'
14
+ }
@@ -1,12 +1,23 @@
1
1
  /**
2
- * CheckboxField component
2
+ * @typedef {GremlinsTypes.Components.Field.CheckProps} CheckProps
3
+ * @typedef {GremlinsTypes.Components.Field.Checkbox.CheckboxProps} CheckboxProps
4
+ */
5
+
6
+ /**
7
+ * CheckboxField component
3
8
  */
4
9
  import React from 'react'
5
10
  import PropTypes from 'prop-types'
6
11
  import classnames from 'classnames'
7
12
 
8
- import { CheckField } from '#gremlins/components/field'
13
+ import {
14
+ CheckField,
15
+ toInputValue
16
+ } from '#gremlins/components/field'
9
17
 
18
+ /**
19
+ * @extends {CheckField<CheckProps & CheckboxProps>}
20
+ */
10
21
  export default class CheckboxField extends CheckField {
11
22
  getClassName () {
12
23
  return classnames(super.getClassName(), 'checkbox')
@@ -14,10 +25,10 @@ export default class CheckboxField extends CheckField {
14
25
 
15
26
  render () {
16
27
  const {
17
- checked,
18
- id,
19
28
  name,
29
+ id,
20
30
  value,
31
+ checked,
21
32
  required = false,
22
33
  disabled = false,
23
34
  readOnly = false,
@@ -32,10 +43,10 @@ export default class CheckboxField extends CheckField {
32
43
  return (
33
44
  <>
34
45
  <input
35
- checked={checked}
36
- id={id}
37
46
  name={name}
38
- value={value}
47
+ id={id}
48
+ value={toInputValue(value)}
49
+ checked={checked}
39
50
  required={required}
40
51
  disabled={disabled}
41
52
  readOnly={readOnly}
@@ -61,10 +72,10 @@ export default class CheckboxField extends CheckField {
61
72
  return (
62
73
  <>
63
74
  <input
64
- defaultChecked={defaultChecked}
65
- id={id}
66
75
  name={name}
67
- value={value}
76
+ id={id}
77
+ value={toInputValue(value)}
78
+ defaultChecked={defaultChecked}
68
79
  required={required}
69
80
  disabled={disabled}
70
81
  readOnly={readOnly}
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/gremlins/textbox')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: Checkbox
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = Checkbox
@@ -0,0 +1,2 @@
1
+ export { default } from '#gremlins/gremlins/checkbox'
2
+ export * from '#gremlins/gremlins/checkbox'
@@ -0,0 +1,24 @@
1
+ declare module '#gremlins/gremlins/checkbox' {
2
+ import {
3
+ CheckGremlin
4
+ } from '#gremlins/gremlins'
5
+
6
+ export type CheckboxProps = GremlinsTypes.Gremlins.Checkbox.CheckboxProps
7
+
8
+ export default class CheckboxGremlin<P extends CheckboxProps> extends CheckGremlin<P> {
9
+ handleChange (
10
+ value?: string | string[],
11
+ checked?: boolean
12
+ ): void
13
+
14
+ handleClick (
15
+ value?: string | string[],
16
+ checked?: boolean
17
+ ): void
18
+ }
19
+ }
20
+
21
+ declare module '@modernpoacher/gremlins/gremlins/checkbox' {
22
+ export { default } from '#gremlins/gremlins/checkbox'
23
+ export * from '#gremlins/gremlins/checkbox'
24
+ }
@@ -1,47 +1,60 @@
1
1
  /**
2
- * CheckboxGremlin component
2
+ * @typedef {GremlinsTypes.OnEventType} OnEventType
3
+ * @typedef {GremlinsTypes.Gremlins.CheckProps} CheckProps
4
+ * @typedef {GremlinsTypes.Gremlins.Checkbox.CheckboxProps} CheckboxProps
5
+ */
6
+
7
+ /**
8
+ * CheckboxGremlin component
3
9
  */
4
10
  import React from 'react'
5
- import PropTypes from 'prop-types'
6
11
  import classnames from 'classnames'
7
12
 
8
- import { CheckGremlin } from '#gremlins/gremlins'
9
-
10
13
  import {
11
- DEFAULT_HANDLE_CHANGE,
12
- DEFAULT_HANDLE_CLICK
13
- } from '#gremlins/common'
14
+ CheckGremlin
15
+ } from '#gremlins/gremlins'
14
16
 
15
- import Field from './field/index.jsx'
17
+ import Field from '#gremlins/gremlins/checkbox/field'
16
18
 
19
+ /**
20
+ * @type {OnEventType}
21
+ */
22
+ function DEFAULT_HANDLE_EVENT () {
23
+ //
24
+ }
25
+
26
+ /**
27
+ * @extends {CheckGremlin<CheckProps & CheckboxProps>}
28
+ */
17
29
  export default class CheckboxGremlin extends CheckGremlin {
18
30
  getClassName () {
19
31
  return classnames(super.getClassName(), 'checkbox')
20
32
  }
21
33
 
34
+ /**
35
+ * @param {string | string[]} [value]
36
+ * @param {boolean} [checked]
37
+ */
22
38
  handleChange = (value, checked) => {
23
39
  const {
24
- onChange = DEFAULT_HANDLE_CHANGE
40
+ onChange = DEFAULT_HANDLE_EVENT
25
41
  } = this.props
26
42
 
27
43
  onChange(value, checked)
28
44
  }
29
45
 
46
+ /**
47
+ * @param {string | string[]} [value]
48
+ * @param {boolean} [checked]
49
+ */
30
50
  handleClick = (value, checked) => {
31
51
  const {
32
- onClick = DEFAULT_HANDLE_CLICK
52
+ onClick = DEFAULT_HANDLE_EVENT
33
53
  } = this.props
34
54
 
35
55
  onClick(value, checked)
36
56
  }
37
57
 
38
- shouldComponentUpdate (props, state) {
39
- return (
40
- super.shouldComponentUpdate(props) ||
41
- (props.value !== this.props.value)
42
- )
43
- }
44
-
45
58
  renderField () {
46
59
  const id = this.getId()
47
60
 
@@ -61,8 +74,8 @@ export default class CheckboxGremlin extends CheckGremlin {
61
74
 
62
75
  return (
63
76
  <Field
64
- id={id}
65
77
  name={name}
78
+ id={id}
66
79
  value={value}
67
80
  checked={checked}
68
81
  defaultChecked={defaultChecked}
@@ -89,8 +102,3 @@ export default class CheckboxGremlin extends CheckGremlin {
89
102
  )
90
103
  }
91
104
  }
92
-
93
- CheckboxGremlin.propTypes = {
94
- ...CheckGremlin.propTypes,
95
- value: PropTypes.string.isRequired
96
- }
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/gremlins/email/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/email/field'
2
+ export * from '#gremlins/gremlins/email/field'
@@ -0,0 +1,14 @@
1
+ declare module '#gremlins/gremlins/email/field' {
2
+ import {
3
+ ValueField
4
+ } from '#gremlins/components/field'
5
+
6
+ export type EmailProps = GremlinsTypes.Components.Field.Email.EmailProps
7
+
8
+ export default class EmailField<P extends EmailProps> extends ValueField<P> {}
9
+ }
10
+
11
+ declare module '@modernpoacher/gremlins/gremlins/email/field' {
12
+ export { default } from '#gremlins/gremlins/email/field'
13
+ export * from '#gremlins/gremlins/email/field'
14
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @typedef {GremlinsTypes.Components.Field.ValueProps} ValueProps
3
+ * @typedef {GremlinsTypes.Components.Field.Email.EmailProps} EmailProps
4
+ */
5
+
6
+ /**
7
+ * EmailField 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 & EmailProps>}
19
+ */
20
+ export default class EmailField extends ValueField {
21
+ getClassName () {
22
+ return classnames(super.getClassName(), 'email')
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='email'
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='email'
79
+ ref={fieldRef}
80
+ />
81
+ )
82
+ }
83
+ }