@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,176 @@
1
+ /**
2
+ * @typedef {GremlinsTypes.OnEventType} OnEventType
3
+ * @typedef {GremlinsTypes.Super.Gremlins.FieldGremlinProps} FieldGremlinProps
4
+ * @typedef {GremlinsTypes.Super.Gremlins.GroupGremlinProps} GroupGremlinProps
5
+ */
6
+
7
+ /**
8
+ * FieldGremlin component
9
+ * GroupGremlin component
10
+ */
11
+ import React, { Component } from 'react'
12
+ import PropTypes from 'prop-types'
13
+ import classnames from 'classnames'
14
+
15
+ import Field from '#gremlins/super/components/field'
16
+ import Group from '#gremlins/super/components/group'
17
+
18
+ /**
19
+ * @type {OnEventType}
20
+ */
21
+ function DEFAULT_HANDLE_EVENT () {
22
+ //
23
+ }
24
+
25
+ export class FieldGremlin extends Component {
26
+ getClassName () {
27
+ const {
28
+ required = false,
29
+ disabled = false,
30
+ readOnly = false
31
+ } = this.props
32
+
33
+ return classnames('gremlin', { required, disabled, readOnly })
34
+ }
35
+
36
+ getId () {
37
+ const {
38
+ id,
39
+ name
40
+ } = this.props
41
+
42
+ return id || name
43
+ }
44
+
45
+ /**
46
+ * @param {FieldGremlinProps} props
47
+ * @returns {boolean}
48
+ */
49
+ shouldComponentUpdate (props) {
50
+ return (
51
+ (props.name !== this.props.name) ||
52
+ (props.id !== this.props.id) ||
53
+ (props.value !== this.props.value) ||
54
+ (props.required !== this.props.required) ||
55
+ (props.disabled !== this.props.disabled) ||
56
+ (props.readOnly !== this.props.readOnly) ||
57
+ (props.tabIndex !== this.props.tabIndex) ||
58
+ (props.accessKey !== this.props.accessKey) ||
59
+ (props.placeholder !== this.props.placeholder) ||
60
+ (props.onChange !== this.props.onChange)
61
+ )
62
+ }
63
+
64
+ renderField () {
65
+ const id = this.getId()
66
+
67
+ const {
68
+ name,
69
+ value,
70
+ required = false,
71
+ disabled = false,
72
+ readOnly = false,
73
+ tabIndex,
74
+ accessKey,
75
+ placeholder,
76
+ onChange = DEFAULT_HANDLE_EVENT,
77
+ fieldRef
78
+ } = this.props
79
+
80
+ return (
81
+ <Field
82
+ name={name}
83
+ id={id}
84
+ value={value}
85
+ required={required}
86
+ disabled={disabled}
87
+ readOnly={readOnly}
88
+ tabIndex={tabIndex}
89
+ accessKey={accessKey}
90
+ placeholder={placeholder}
91
+ onChange={onChange}
92
+ fieldRef={fieldRef}
93
+ />
94
+ )
95
+ }
96
+
97
+ render () {
98
+ const className = this.getClassName()
99
+
100
+ return (
101
+ <div className={className}>
102
+ {this.renderField()}
103
+ </div>
104
+ )
105
+ }
106
+ }
107
+
108
+ FieldGremlin.propTypes = {
109
+ name: PropTypes.string.isRequired,
110
+ id: PropTypes.string,
111
+ value: PropTypes.string,
112
+ required: PropTypes.bool,
113
+ disabled: PropTypes.bool,
114
+ readOnly: PropTypes.bool,
115
+ tabIndex: PropTypes.number,
116
+ accessKey: PropTypes.string,
117
+ placeholder: PropTypes.string,
118
+ onChange: PropTypes.func,
119
+ fieldRef: PropTypes.shape({
120
+ current: PropTypes.shape({
121
+ value: PropTypes.string
122
+ })
123
+ })
124
+ }
125
+
126
+ export class GroupGremlin extends Component {
127
+ getClassName () {
128
+ return 'gremlin'
129
+ }
130
+
131
+ /**
132
+ * @param {GroupGremlinProps} props
133
+ * @returns {boolean}
134
+ */
135
+ shouldComponentUpdate (props) {
136
+ return (
137
+ (props.children !== this.props.children)
138
+ )
139
+ }
140
+
141
+ renderGroup () {
142
+ const {
143
+ groupRef,
144
+ children
145
+ } = this.props
146
+
147
+ return (
148
+ <Group
149
+ groupRef={groupRef}>
150
+ {children}
151
+ </Group>
152
+ )
153
+ }
154
+
155
+ render () {
156
+ const className = this.getClassName()
157
+
158
+ return (
159
+ <div className={className}>
160
+ {this.renderGroup()}
161
+ </div>
162
+ )
163
+ }
164
+ }
165
+
166
+ GroupGremlin.propTypes = {
167
+ children: PropTypes.oneOfType([
168
+ PropTypes.node,
169
+ PropTypes.arrayOf(
170
+ PropTypes.node
171
+ )
172
+ ]),
173
+ groupRef: PropTypes.shape({
174
+ current: PropTypes.shape({})
175
+ })
176
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "stylelint-config-recommended-scss",
3
+ "plugins": [
4
+ "stylelint-scss"
5
+ ],
6
+ "rules": {
7
+ "no-descending-specificity": [
8
+ true,
9
+ {
10
+ "severity": "warning"
11
+ }
12
+ ]
13
+ }
14
+ }
@@ -0,0 +1,59 @@
1
+ @use "design-system/palette";
2
+ @use "design-system/typography";
3
+
4
+ @use "gremlins/radio";
5
+ @use "gremlins/checkbox";
6
+ @use "gremlins/disabled";
7
+ @use "gremlins/error";
8
+
9
+ @mixin gremlins {
10
+ padding: 0;
11
+ margin: 1rem 0;
12
+
13
+ &:first-child {
14
+ margin-top: 0;
15
+ }
16
+
17
+ &:last-child {
18
+ margin-bottom: 0;
19
+ }
20
+
21
+ line-height: 1.375rem;
22
+
23
+ &.radio {
24
+ @include radio.gremlin-radio;
25
+ }
26
+
27
+ &.checkbox {
28
+ @include checkbox.gremlin-checkbox;
29
+ }
30
+
31
+ &.disabled {
32
+ @include disabled.gremlin-disabled;
33
+ }
34
+
35
+ &.error {
36
+ @include error.gremlin-error;
37
+ }
38
+
39
+ &.fieldset {
40
+ legend {
41
+ @include typography.heading-m;
42
+
43
+ & /* stylelint-disable-line no-duplicate-selectors */ {
44
+ padding: 0;
45
+ margin-top: 0;
46
+ }
47
+ }
48
+
49
+ &.error {
50
+ @include error.gremlin-error;
51
+
52
+ padding-left: 1rem;
53
+ }
54
+ }
55
+ }
56
+
57
+ %gremlins {
58
+ @include gremlins;
59
+ }
@@ -0,0 +1,87 @@
1
+ @use "design-system/helpers/breakpoints";
2
+ @use "design-system/palette";
3
+
4
+ @mixin gremlin-checkbox {
5
+ position: relative;
6
+ padding-left: 3rem;
7
+ margin-bottom: 0.5rem;
8
+ min-height: 2rem;
9
+
10
+ &:last-of-type {
11
+ margin-bottom: 0;
12
+ }
13
+
14
+ label {
15
+ @include breakpoints.breakpoint(mobile) {
16
+ padding-top: 0.375rem;
17
+ }
18
+
19
+ @include breakpoints.breakpoint(large-mobile) {
20
+ padding-top: 0.375rem;
21
+ }
22
+
23
+ @include breakpoints.breakpoint(small-mobile) {
24
+ padding-top: 0.375rem;
25
+ }
26
+ }
27
+
28
+ label:before {
29
+ box-sizing: border-box;
30
+ position: absolute;
31
+ left: 0;
32
+ height: 2rem;
33
+ top: 0;
34
+ width: 2rem;
35
+ overflow: hidden;
36
+ border: 2px solid currentColor;
37
+ content: "\200b";
38
+ background-color: palette.$white;
39
+ }
40
+
41
+ input {
42
+ position: absolute;
43
+ left: 0.5rem;
44
+ top: 0.5rem;
45
+
46
+ &:focus + label:before {
47
+ box-shadow: 0 0 0 2px palette.$outline;
48
+ }
49
+
50
+ &:checked + label:after {
51
+ box-sizing: border-box;
52
+ position: absolute;
53
+ top: 0.625rem; // 10px;
54
+ bottom: 0.625rem; // 10px;
55
+ left: 0.3125rem; // 5px;
56
+ width: 1.375rem; // 22px;
57
+ height: 0.625rem; // 10px;
58
+ overflow: hidden;
59
+ border-bottom: 4px solid currentColor;
60
+ border-left: 4px solid currentColor;
61
+ content: "\200b";
62
+ background-color: palette.$white;
63
+ transform: rotate(-45deg);
64
+ }
65
+ }
66
+
67
+ &.disabled {
68
+ input:checked + {
69
+ label::before {
70
+ border-color: palette.$disabled;
71
+ }
72
+
73
+ label::after {
74
+ border-left-color: palette.$disabled;
75
+ border-bottom-color: palette.$disabled;
76
+ }
77
+ }
78
+
79
+ input + label::before /* stylelint-disable-line no-descending-specificity */ {
80
+ border-color: palette.$disabled;
81
+ }
82
+ }
83
+ }
84
+
85
+ %gremlin-checkbox {
86
+ @include gremlin-checkbox;
87
+ }
@@ -0,0 +1,15 @@
1
+ @use "design-system/palette";
2
+ @use "design-system/typography";
3
+
4
+ @mixin gremlin-disabled {
5
+ input:not([type="checkbox"]):not([type="radio"]),
6
+ select,
7
+ textarea {
8
+ border-color: palette.$disabled;
9
+ color: palette.$disabled;
10
+ }
11
+ }
12
+
13
+ %gremlin-disabled {
14
+ @include gremlin-disabled;
15
+ }
@@ -0,0 +1,48 @@
1
+ @use "design-system/palette";
2
+ @use "design-system/typography";
3
+
4
+ @mixin gremlin-error {
5
+ border-left: 0.25rem solid palette.$error-standard;
6
+ padding: 0 1rem;
7
+
8
+ input:not([type="checkbox"]):not([type="radio"]),
9
+ select,
10
+ textarea {
11
+ border: 2px solid palette.$error-standard;
12
+
13
+ &:focus {
14
+ border-color: palette.$black;
15
+ }
16
+ }
17
+
18
+ &.radio,
19
+ &.checkbox {
20
+ padding-left: 4rem;
21
+
22
+ input /* stylelint-disable-line no-descending-specificity */ {
23
+ left: 1.5rem;
24
+ }
25
+
26
+ label:before /* stylelint-disable-line no-descending-specificity */ {
27
+ left: 1rem;
28
+
29
+ border: 2px solid palette.$error-standard;
30
+ }
31
+ }
32
+
33
+ &.radio {
34
+ input:checked + label:after {
35
+ left: 1.5rem;
36
+ }
37
+ }
38
+
39
+ &.checkbox {
40
+ input:checked + label:after {
41
+ left: 1.3125rem; // 21px;
42
+ }
43
+ }
44
+ }
45
+
46
+ %gremlin-error {
47
+ @include gremlin-error;
48
+ }
@@ -0,0 +1,93 @@
1
+ @use "design-system/helpers/breakpoints";
2
+
3
+ @use "design-system/palette";
4
+ @use "design-system/typography";
5
+
6
+ @mixin gremlin-radio {
7
+ position: relative;
8
+ padding-left: 3rem;
9
+ margin-bottom: 0.5rem;
10
+ min-height: 2rem;
11
+
12
+ &:last-of-type {
13
+ margin-bottom: 0;
14
+ }
15
+
16
+ label {
17
+ @include breakpoints.breakpoint(mobile) {
18
+ padding-top: 0.375rem;
19
+ }
20
+
21
+ @include breakpoints.breakpoint(large-mobile) {
22
+ padding-top: 0.375rem;
23
+ }
24
+
25
+ @include breakpoints.breakpoint(small-mobile) {
26
+ padding-top: 0.375rem;
27
+ }
28
+ }
29
+
30
+ label:before {
31
+ box-sizing: border-box;
32
+ position: absolute;
33
+ left: 0;
34
+ height: 32px;
35
+ top: 0;
36
+ width: 32px;
37
+ overflow: hidden;
38
+ border: 2px solid currentColor;
39
+ border-radius: 50%;
40
+ content: "\200b";
41
+ background-color: palette.$white;
42
+ }
43
+
44
+ input {
45
+ position: absolute;
46
+ left: 0.5rem;
47
+ top: 0.5rem;
48
+
49
+ &:focus + label:before {
50
+ box-shadow: 0 0 0 2px palette.$outline;
51
+ }
52
+
53
+ &:checked + label:after {
54
+ box-sizing: border-box;
55
+ position: absolute;
56
+ top: 0.5rem;
57
+ bottom: 0.5rem;
58
+ left: 0.5rem;
59
+ right: 0.5rem;
60
+ width: 1rem;
61
+ height: 1rem;
62
+ overflow: hidden;
63
+ border: 2px solid currentColor;
64
+ border-radius: 50%;
65
+ content: "\200b";
66
+ background-color: palette.$black;
67
+ }
68
+ }
69
+
70
+ &.disabled {
71
+ input + label {
72
+ &::before,
73
+ &::after {
74
+ border-color: palette.$disabled;
75
+ }
76
+ }
77
+
78
+ input:checked + label {
79
+ &::before,
80
+ &::after {
81
+ border-color: palette.$disabled;
82
+ }
83
+
84
+ &::after /* stylelint-disable-line no-descending-specificity */ {
85
+ background-color: palette.$disabled;
86
+ }
87
+ }
88
+ }
89
+ }
90
+
91
+ %gremlin-radio {
92
+ @include gremlin-radio;
93
+ }
@@ -1,9 +0,0 @@
1
- declare module '#gremlins/common' {
2
- export function DEFAULT_HANDLE_CHANGE (): void
3
-
4
- export function DEFAULT_HANDLE_CLICK (): void
5
- }
6
-
7
- declare module '@modernpoacher/gremlins/common' {
8
- export * from '#gremlins/common'
9
- }
@@ -1,7 +0,0 @@
1
- export function DEFAULT_HANDLE_CHANGE () {
2
- /* */
3
- }
4
-
5
- export function DEFAULT_HANDLE_CLICK () {
6
- /* */
7
- }
@@ -1,9 +0,0 @@
1
- import React from 'react'
2
-
3
- const DISABLED = String.fromCharCode(42)
4
-
5
- export default () => (
6
- <span className='is-disabled'>
7
- {DISABLED}
8
- </span>
9
- )
@@ -1,9 +0,0 @@
1
- import React from 'react'
2
-
3
- const READONLY = String.fromCharCode(42)
4
-
5
- export default () => (
6
- <span className='is-readonly'>
7
- {READONLY}
8
- </span>
9
- )
@@ -1,9 +0,0 @@
1
- import React from 'react'
2
-
3
- const REQUIRED = String.fromCharCode(42)
4
-
5
- export default () => (
6
- <span className='is-required'>
7
- {REQUIRED}
8
- </span>
9
- )
@@ -1,23 +0,0 @@
1
- declare module '#gremlins/components/field' {
2
- import React from 'react'
3
-
4
- export interface FieldProps {
5
- id: string
6
- name: string
7
- required: boolean
8
- disabled: boolean
9
- readOnly: boolean
10
- tabIndex: number
11
- accessKey: string
12
- placeholder: string
13
- onChange: GremlinsTypes.OnChangeType
14
- fieldRef: object
15
- }
16
-
17
- export default class Field extends React.Component<FieldProps> {}
18
- }
19
-
20
- declare module '@modernpoacher/gremlins/components/field' {
21
- export { default } from '#gremlins/components/field'
22
- export * from '#gremlins/components/field'
23
- }
@@ -1,16 +0,0 @@
1
- declare module '#gremlins/components/group' {
2
- import React from 'react'
3
-
4
- export interface GroupProps {
5
- onChange: GremlinsTypes.OnChangeType
6
- groupRef: object
7
- children: React.JSX.Element | React.JSX.Element[]
8
- }
9
-
10
- export default class Group extends React.Component<GroupProps> {}
11
- }
12
-
13
- declare module '@modernpoacher/gremlins/components/group' {
14
- export { default } from '#gremlins/components/group'
15
- export * from '#gremlins/components/group'
16
- }
@@ -1,59 +0,0 @@
1
- /**
2
- * Group component
3
- *
4
- * @typedef {import('@modernpoacher/gremlins/components/group').GroupProps} GroupProps
5
- */
6
-
7
- import React, { Component } from 'react'
8
- import PropTypes from 'prop-types'
9
-
10
- import {
11
- DEFAULT_HANDLE_CHANGE
12
- } from '#gremlins/common'
13
-
14
- export default class Group extends Component {
15
- getClassName () {
16
- return 'group'
17
- }
18
-
19
- /**
20
- * @param {GroupProps} props
21
- * @returns {boolean}
22
- */
23
- shouldComponentUpdate (props, state) {
24
- return (
25
- (props.onChange !== this.props.onChange) ||
26
- (props.children !== this.props.children)
27
- )
28
- }
29
-
30
- render () {
31
- const {
32
- onChange = DEFAULT_HANDLE_CHANGE,
33
- groupRef,
34
- children
35
- } = this.props
36
-
37
- return (
38
- <fieldset
39
- onChange={onChange}
40
- className={this.getClassName()}
41
- ref={groupRef}>
42
- {children}
43
- </fieldset>
44
- )
45
- }
46
- }
47
-
48
- Group.propTypes = {
49
- onChange: PropTypes.func,
50
- children: PropTypes.oneOfType([
51
- PropTypes.node,
52
- PropTypes.arrayOf(
53
- PropTypes.node
54
- )
55
- ]),
56
- groupRef: PropTypes.shape({
57
- current: PropTypes.shape().isRequired
58
- })
59
- }
@@ -1,9 +0,0 @@
1
- declare module '#gremlins/gremlins/checkbox/field' {
2
- import Field from '#gremlins/components/field'
3
-
4
- export default class CheckboxField extends Field {}
5
- }
6
-
7
- declare module '@modernpoacher/gremlins/checkbox/field' {
8
- export { default } from '#gremlins/gremlins/checkbox/field'
9
- }
@@ -1,9 +0,0 @@
1
- declare module '#gremlins/gremlins/checkbox' {
2
- import { FieldGremlin as Gremlin } from '#gremlins/gremlins'
3
-
4
- export default class CheckboxGremlin extends Gremlin {}
5
- }
6
-
7
- declare module '@modernpoacher/gremlins/gremlins/checkbox' {
8
- export { default } from '#gremlins/gremlins/checkbox'
9
- }
@@ -1,9 +0,0 @@
1
- declare module '#gremlins/gremlins/email/field' {
2
- import Field from '#gremlins/components/field'
3
-
4
- export default class EmailField extends Field {}
5
- }
6
-
7
- declare module '@modernpoacher/gremlins/email/field' {
8
- export { default } from '#gremlins/gremlins/email/field'
9
- }