@kya-os/consent 0.1.0 → 0.1.1

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 (200) hide show
  1. package/dist/bundle/index.d.ts +44 -0
  2. package/dist/bundle/index.d.ts.map +1 -0
  3. package/dist/bundle/index.js +45 -0
  4. package/dist/bundle/index.js.map +1 -0
  5. package/dist/bundle/inline.d.ts +18 -0
  6. package/dist/bundle/inline.d.ts.map +1 -0
  7. package/dist/bundle/inline.js +18 -0
  8. package/dist/bundle/inline.js.map +1 -0
  9. package/dist/bundle/shell.d.ts +91 -0
  10. package/dist/bundle/shell.d.ts.map +1 -0
  11. package/dist/bundle/shell.js +282 -0
  12. package/dist/bundle/shell.js.map +1 -0
  13. package/dist/components/consent-button.d.ts +61 -0
  14. package/dist/components/consent-button.d.ts.map +1 -0
  15. package/dist/components/consent-button.js +177 -0
  16. package/dist/components/consent-button.js.map +1 -0
  17. package/dist/components/consent-checkbox.d.ts +61 -0
  18. package/dist/components/consent-checkbox.d.ts.map +1 -0
  19. package/dist/components/consent-checkbox.js +220 -0
  20. package/dist/components/consent-checkbox.js.map +1 -0
  21. package/dist/components/consent-input.d.ts +91 -0
  22. package/dist/components/consent-input.d.ts.map +1 -0
  23. package/dist/components/consent-input.js +332 -0
  24. package/dist/components/consent-input.js.map +1 -0
  25. package/dist/components/consent-oauth-button.d.ts +87 -0
  26. package/dist/components/consent-oauth-button.d.ts.map +1 -0
  27. package/dist/components/consent-oauth-button.js +389 -0
  28. package/dist/components/consent-oauth-button.js.map +1 -0
  29. package/dist/components/consent-otp-input.d.ts +92 -0
  30. package/dist/components/consent-otp-input.d.ts.map +1 -0
  31. package/dist/components/consent-otp-input.js +378 -0
  32. package/dist/components/consent-otp-input.js.map +1 -0
  33. package/dist/components/consent-permissions.d.ts +104 -0
  34. package/dist/components/consent-permissions.d.ts.map +1 -0
  35. package/dist/components/consent-permissions.js +430 -0
  36. package/dist/components/consent-permissions.js.map +1 -0
  37. package/dist/components/consent-shell.d.ts +72 -0
  38. package/dist/components/consent-shell.d.ts.map +1 -0
  39. package/dist/components/consent-shell.js +231 -0
  40. package/dist/components/consent-shell.js.map +1 -0
  41. package/dist/components/consent-terms.d.ts +89 -0
  42. package/dist/components/consent-terms.d.ts.map +1 -0
  43. package/dist/components/consent-terms.js +284 -0
  44. package/dist/components/consent-terms.js.map +1 -0
  45. package/dist/components/index.d.ts +19 -0
  46. package/dist/components/index.d.ts.map +1 -0
  47. package/dist/components/index.js +23 -0
  48. package/dist/components/index.js.map +1 -0
  49. package/dist/components/mcp-consent.d.ts +152 -0
  50. package/dist/components/mcp-consent.d.ts.map +1 -0
  51. package/dist/components/mcp-consent.js +874 -0
  52. package/dist/components/mcp-consent.js.map +1 -0
  53. package/dist/consent.js +3737 -0
  54. package/dist/consent.min.js +1564 -0
  55. package/dist/constants/auth-modes.d.ts +7 -2
  56. package/dist/constants/auth-modes.d.ts.map +1 -1
  57. package/dist/constants/auth-modes.js +28 -36
  58. package/dist/constants/auth-modes.js.map +1 -1
  59. package/dist/constants/colors.js +1 -4
  60. package/dist/constants/colors.js.map +1 -1
  61. package/dist/constants/defaults.d.ts +1 -1
  62. package/dist/constants/defaults.d.ts.map +1 -1
  63. package/dist/constants/defaults.js +16 -19
  64. package/dist/constants/defaults.js.map +1 -1
  65. package/dist/constants/index.d.ts +3 -3
  66. package/dist/constants/index.d.ts.map +1 -1
  67. package/dist/constants/index.js +3 -26
  68. package/dist/constants/index.js.map +1 -1
  69. package/dist/index.d.ts +10 -7
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +12 -23
  72. package/dist/index.js.map +1 -1
  73. package/dist/react/index.d.ts +123 -0
  74. package/dist/react/index.d.ts.map +1 -0
  75. package/dist/react/index.js +154 -0
  76. package/dist/react/index.js.map +1 -0
  77. package/dist/resolution/index.d.ts +3 -3
  78. package/dist/resolution/index.d.ts.map +1 -1
  79. package/dist/resolution/index.js +3 -19
  80. package/dist/resolution/index.js.map +1 -1
  81. package/dist/resolution/resolve-branding.d.ts +1 -1
  82. package/dist/resolution/resolve-branding.d.ts.map +1 -1
  83. package/dist/resolution/resolve-branding.js +14 -24
  84. package/dist/resolution/resolve-branding.js.map +1 -1
  85. package/dist/resolution/resolve-config.d.ts +2 -2
  86. package/dist/resolution/resolve-config.d.ts.map +1 -1
  87. package/dist/resolution/resolve-config.js +57 -53
  88. package/dist/resolution/resolve-config.js.map +1 -1
  89. package/dist/resolution/resolve-copy.d.ts +2 -2
  90. package/dist/resolution/resolve-copy.d.ts.map +1 -1
  91. package/dist/resolution/resolve-copy.js +35 -43
  92. package/dist/resolution/resolve-copy.js.map +1 -1
  93. package/dist/schemas/api.schemas.d.ts +7 -4
  94. package/dist/schemas/api.schemas.d.ts.map +1 -1
  95. package/dist/schemas/api.schemas.js +70 -74
  96. package/dist/schemas/api.schemas.js.map +1 -1
  97. package/dist/schemas/branding.schemas.js +17 -20
  98. package/dist/schemas/branding.schemas.js.map +1 -1
  99. package/dist/schemas/config.schemas.d.ts +1 -1
  100. package/dist/schemas/config.schemas.d.ts.map +1 -1
  101. package/dist/schemas/config.schemas.js +64 -70
  102. package/dist/schemas/config.schemas.js.map +1 -1
  103. package/dist/schemas/index.d.ts +4 -4
  104. package/dist/schemas/index.d.ts.map +1 -1
  105. package/dist/schemas/index.js +4 -20
  106. package/dist/schemas/index.js.map +1 -1
  107. package/dist/schemas/modes.schemas.js +60 -63
  108. package/dist/schemas/modes.schemas.js.map +1 -1
  109. package/dist/security/escape.d.ts.map +1 -1
  110. package/dist/security/escape.js +12 -17
  111. package/dist/security/escape.js.map +1 -1
  112. package/dist/security/index.d.ts +2 -2
  113. package/dist/security/index.d.ts.map +1 -1
  114. package/dist/security/index.js +2 -18
  115. package/dist/security/index.js.map +1 -1
  116. package/dist/security/validators.js +9 -20
  117. package/dist/security/validators.js.map +1 -1
  118. package/dist/styles/css-variables.d.ts +1 -1
  119. package/dist/styles/css-variables.d.ts.map +1 -1
  120. package/dist/styles/css-variables.js +18 -27
  121. package/dist/styles/css-variables.js.map +1 -1
  122. package/dist/styles/index.d.ts +3 -3
  123. package/dist/styles/index.d.ts.map +1 -1
  124. package/dist/styles/index.js +3 -19
  125. package/dist/styles/index.js.map +1 -1
  126. package/dist/styles/stylesheet.d.ts +1 -1
  127. package/dist/styles/stylesheet.d.ts.map +1 -1
  128. package/dist/styles/stylesheet.js +20 -27
  129. package/dist/styles/stylesheet.js.map +1 -1
  130. package/dist/styles/tokens.js +1 -4
  131. package/dist/styles/tokens.js.map +1 -1
  132. package/dist/templates/base/base-template.d.ts +3 -3
  133. package/dist/templates/base/base-template.d.ts.map +1 -1
  134. package/dist/templates/base/base-template.js +31 -35
  135. package/dist/templates/base/base-template.js.map +1 -1
  136. package/dist/templates/base/components.js +49 -65
  137. package/dist/templates/base/components.js.map +1 -1
  138. package/dist/templates/base/index.d.ts +2 -2
  139. package/dist/templates/base/index.d.ts.map +1 -1
  140. package/dist/templates/base/index.js +2 -20
  141. package/dist/templates/base/index.js.map +1 -1
  142. package/dist/templates/index.d.ts +9 -9
  143. package/dist/templates/index.d.ts.map +1 -1
  144. package/dist/templates/index.js +9 -25
  145. package/dist/templates/index.js.map +1 -1
  146. package/dist/templates/modes/consent-only.template.d.ts +2 -2
  147. package/dist/templates/modes/consent-only.template.d.ts.map +1 -1
  148. package/dist/templates/modes/consent-only.template.js +11 -15
  149. package/dist/templates/modes/consent-only.template.js.map +1 -1
  150. package/dist/templates/modes/credentials.template.d.ts +4 -4
  151. package/dist/templates/modes/credentials.template.d.ts.map +1 -1
  152. package/dist/templates/modes/credentials.template.js +20 -24
  153. package/dist/templates/modes/credentials.template.js.map +1 -1
  154. package/dist/templates/modes/index.d.ts +6 -6
  155. package/dist/templates/modes/index.d.ts.map +1 -1
  156. package/dist/templates/modes/index.js +6 -16
  157. package/dist/templates/modes/index.js.map +1 -1
  158. package/dist/templates/modes/magic-link.template.d.ts +2 -2
  159. package/dist/templates/modes/magic-link.template.d.ts.map +1 -1
  160. package/dist/templates/modes/magic-link.template.js +14 -18
  161. package/dist/templates/modes/magic-link.template.js.map +1 -1
  162. package/dist/templates/modes/oauth.template.d.ts +2 -2
  163. package/dist/templates/modes/oauth.template.d.ts.map +1 -1
  164. package/dist/templates/modes/oauth.template.js +21 -25
  165. package/dist/templates/modes/oauth.template.js.map +1 -1
  166. package/dist/templates/modes/otp.template.d.ts +2 -2
  167. package/dist/templates/modes/otp.template.d.ts.map +1 -1
  168. package/dist/templates/modes/otp.template.js +17 -21
  169. package/dist/templates/modes/otp.template.js.map +1 -1
  170. package/dist/templates/modes/success.template.d.ts +2 -2
  171. package/dist/templates/modes/success.template.d.ts.map +1 -1
  172. package/dist/templates/modes/success.template.js +24 -29
  173. package/dist/templates/modes/success.template.js.map +1 -1
  174. package/dist/templates/registry.d.ts +4 -4
  175. package/dist/templates/registry.d.ts.map +1 -1
  176. package/dist/templates/registry.js +30 -38
  177. package/dist/templates/registry.js.map +1 -1
  178. package/dist/types/api.types.d.ts +6 -5
  179. package/dist/types/api.types.d.ts.map +1 -1
  180. package/dist/types/api.types.js +1 -2
  181. package/dist/types/api.types.js.map +1 -1
  182. package/dist/types/branding.types.js +1 -2
  183. package/dist/types/branding.types.js.map +1 -1
  184. package/dist/types/config.types.d.ts +5 -5
  185. package/dist/types/config.types.d.ts.map +1 -1
  186. package/dist/types/config.types.js +1 -2
  187. package/dist/types/config.types.js.map +1 -1
  188. package/dist/types/copy.types.js +1 -2
  189. package/dist/types/copy.types.js.map +1 -1
  190. package/dist/types/index.d.ts +6 -6
  191. package/dist/types/index.d.ts.map +1 -1
  192. package/dist/types/index.js +6 -22
  193. package/dist/types/index.js.map +1 -1
  194. package/dist/types/modes.types.js +1 -4
  195. package/dist/types/modes.types.js.map +1 -1
  196. package/dist/types/page.types.d.ts +6 -6
  197. package/dist/types/page.types.d.ts.map +1 -1
  198. package/dist/types/page.types.js +1 -2
  199. package/dist/types/page.types.js.map +1 -1
  200. package/package.json +41 -4
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Consent Checkbox Web Component
3
+ *
4
+ * A styled checkbox for consent pages with label support.
5
+ * Works in browser, React, and SSR environments.
6
+ * Implements Form Associated Custom Elements for proper form participation.
7
+ *
8
+ * @module components/consent-checkbox
9
+ */
10
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
11
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
12
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
13
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
14
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
15
+ };
16
+ import { LitElement, html, css } from 'lit';
17
+ import { customElement, property } from 'lit/decorators.js';
18
+ /**
19
+ * ConsentCheckbox - A themed checkbox component with label
20
+ *
21
+ * @example
22
+ * ```html
23
+ * <consent-checkbox name="terms" required>
24
+ * I agree to the <a href="/terms">Terms</a>
25
+ * </consent-checkbox>
26
+ * ```
27
+ *
28
+ * @fires change - Fired when checkbox state changes
29
+ * @csspart checkbox - The checkbox input element
30
+ * @csspart label - The label text wrapper
31
+ * @cssprop --consent-primary - Primary brand color for checked state
32
+ */
33
+ let ConsentCheckbox = class ConsentCheckbox extends LitElement {
34
+ constructor() {
35
+ super();
36
+ /**
37
+ * Form field name
38
+ */
39
+ this.name = '';
40
+ /**
41
+ * Checked state
42
+ */
43
+ this.checked = false;
44
+ /**
45
+ * Required for form validation
46
+ */
47
+ this.required = false;
48
+ /**
49
+ * Disabled state
50
+ */
51
+ this.disabled = false;
52
+ /**
53
+ * Value when checked
54
+ */
55
+ this.value = 'on';
56
+ this.internals = this.attachInternals();
57
+ }
58
+ // Update form value when properties change
59
+ updated(changedProperties) {
60
+ if (changedProperties.has('checked') || changedProperties.has('value')) {
61
+ this.updateFormValue();
62
+ }
63
+ }
64
+ updateFormValue() {
65
+ // Update the form value based on checked state
66
+ if (this.checked) {
67
+ this.internals.setFormValue(this.value);
68
+ }
69
+ else {
70
+ this.internals.setFormValue(null);
71
+ }
72
+ }
73
+ handleChange(e) {
74
+ const input = e.target;
75
+ this.checked = input.checked;
76
+ this.updateFormValue();
77
+ // Dispatch a change event that bubbles
78
+ this.dispatchEvent(new CustomEvent('change', {
79
+ detail: { checked: this.checked, value: this.value },
80
+ bubbles: true,
81
+ composed: true,
82
+ }));
83
+ }
84
+ render() {
85
+ return html `
86
+ <label part="label">
87
+ <input
88
+ part="checkbox"
89
+ type="checkbox"
90
+ name=${this.name}
91
+ .value=${this.value}
92
+ .checked=${this.checked}
93
+ ?required=${this.required}
94
+ ?disabled=${this.disabled}
95
+ @change=${this.handleChange}
96
+ />
97
+ <span class="text">
98
+ <slot></slot>
99
+ </span>
100
+ </label>
101
+ `;
102
+ }
103
+ };
104
+ // Enable form association
105
+ ConsentCheckbox.formAssociated = true;
106
+ ConsentCheckbox.styles = css `
107
+ :host {
108
+ display: block;
109
+ }
110
+
111
+ label {
112
+ display: flex;
113
+ align-items: flex-start;
114
+ gap: 0.75rem;
115
+ cursor: pointer;
116
+ font-size: 0.875rem;
117
+ color: #374151;
118
+ line-height: 1.5;
119
+ }
120
+
121
+ :host([disabled]) label {
122
+ cursor: not-allowed;
123
+ opacity: 0.6;
124
+ }
125
+
126
+ /* Custom checkbox styling - matches AgentShield exactly */
127
+ input[type='checkbox'] {
128
+ /* Reset */
129
+ appearance: none;
130
+ -webkit-appearance: none;
131
+ margin: 0;
132
+
133
+ /* Size - matches AgentShield w-4 h-4 */
134
+ width: 1rem;
135
+ height: 1rem;
136
+ min-width: 1rem;
137
+ margin-top: 0.125rem; /* Align with text baseline */
138
+
139
+ /* Border */
140
+ border: 1px solid #d1d5db;
141
+ border-radius: 0.25rem;
142
+
143
+ /* Background */
144
+ background-color: white;
145
+
146
+ /* Interaction */
147
+ cursor: pointer;
148
+ position: relative;
149
+ transition: background-color 0.15s ease, border-color 0.15s ease;
150
+ }
151
+
152
+ input[type='checkbox']:hover:not(:disabled) {
153
+ border-color: var(--consent-primary, #2563eb);
154
+ }
155
+
156
+ input[type='checkbox']:focus-visible {
157
+ outline: 2px solid var(--consent-primary, #2563eb);
158
+ outline-offset: 2px;
159
+ }
160
+
161
+ /* Checked state */
162
+ input[type='checkbox']:checked {
163
+ background-color: var(--consent-primary, #2563eb);
164
+ border-color: var(--consent-primary, #2563eb);
165
+ }
166
+
167
+ /* Checkmark */
168
+ input[type='checkbox']:checked::after {
169
+ content: '';
170
+ position: absolute;
171
+ left: 4px;
172
+ top: 1px;
173
+ width: 5px;
174
+ height: 9px;
175
+ border: solid white;
176
+ border-width: 0 2px 2px 0;
177
+ transform: rotate(45deg);
178
+ }
179
+
180
+ /* Disabled */
181
+ input[type='checkbox']:disabled {
182
+ cursor: not-allowed;
183
+ opacity: 0.5;
184
+ }
185
+
186
+ /* Text wrapper */
187
+ .text {
188
+ flex: 1;
189
+ }
190
+
191
+ /* Links in label */
192
+ ::slotted(a) {
193
+ color: var(--consent-primary, #2563eb);
194
+ text-decoration: underline;
195
+ }
196
+
197
+ ::slotted(a:hover) {
198
+ text-decoration: none;
199
+ }
200
+ `;
201
+ __decorate([
202
+ property({ type: String })
203
+ ], ConsentCheckbox.prototype, "name", void 0);
204
+ __decorate([
205
+ property({ type: Boolean, reflect: true })
206
+ ], ConsentCheckbox.prototype, "checked", void 0);
207
+ __decorate([
208
+ property({ type: Boolean })
209
+ ], ConsentCheckbox.prototype, "required", void 0);
210
+ __decorate([
211
+ property({ type: Boolean, reflect: true })
212
+ ], ConsentCheckbox.prototype, "disabled", void 0);
213
+ __decorate([
214
+ property({ type: String })
215
+ ], ConsentCheckbox.prototype, "value", void 0);
216
+ ConsentCheckbox = __decorate([
217
+ customElement('consent-checkbox')
218
+ ], ConsentCheckbox);
219
+ export { ConsentCheckbox };
220
+ //# sourceMappingURL=consent-checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent-checkbox.js","sourceRoot":"","sources":["../../src/components/consent-checkbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;;;;;;;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;;;;;;;;;;;GAcG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,UAAU;IAM7C;QACE,KAAK,EAAE,CAAC;QAIV;;WAEG;QAEH,SAAI,GAAG,EAAE,CAAC;QAEV;;WAEG;QAEH,YAAO,GAAG,KAAK,CAAC;QAEhB;;WAEG;QAEH,aAAQ,GAAG,KAAK,CAAC;QAEjB;;WAEG;QAEH,aAAQ,GAAG,KAAK,CAAC;QAEjB;;WAEG;QAEH,UAAK,GAAG,IAAI,CAAC;QA/BX,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IAC1C,CAAC;IAgID,2CAA2C;IACxB,OAAO,CAAC,iBAAuC;QAChE,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,+CAA+C;QAC/C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,CAAQ;QAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,MAA0B,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,uCAAuC;QACvC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,QAAQ,EAAE;YACxB,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;YACpD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC;IACJ,CAAC;IAEQ,MAAM;QACb,OAAO,IAAI,CAAA;;;;;iBAKE,IAAI,CAAC,IAAI;mBACP,IAAI,CAAC,KAAK;qBACR,IAAI,CAAC,OAAO;sBACX,IAAI,CAAC,QAAQ;sBACb,IAAI,CAAC,QAAQ;oBACf,IAAI,CAAC,YAAY;;;;;;KAMhC,CAAC;IACJ,CAAC;;AAzLD,0BAA0B;AACnB,8BAAc,GAAG,IAAI,AAAP,CAAQ;AAuCb,sBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8F3B,AA9FqB,CA8FpB;AAxHF;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CACjB;AAMV;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gDAC3B;AAMhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;iDACX;AAMjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;iDAC1B;AAMjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CACd;AAvCF,eAAe;IAD3B,aAAa,CAAC,kBAAkB,CAAC;GACrB,eAAe,CA2L3B"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Consent Input Web Component
3
+ *
4
+ * A styled text input for consent pages with label and error support.
5
+ * Implements Form Associated Custom Elements for proper form participation.
6
+ *
7
+ * @module components/consent-input
8
+ */
9
+ import { LitElement } from 'lit';
10
+ /**
11
+ * Input types supported
12
+ */
13
+ export type InputType = 'text' | 'email' | 'password' | 'tel' | 'url';
14
+ /**
15
+ * ConsentInput - A themed input component with label
16
+ *
17
+ * @example
18
+ * ```html
19
+ * <consent-input
20
+ * type="email"
21
+ * name="email"
22
+ * label="Email Address"
23
+ * placeholder="you@example.com"
24
+ * required
25
+ * ></consent-input>
26
+ * ```
27
+ *
28
+ * @fires input - Fired when input value changes
29
+ * @fires change - Fired when input loses focus after change
30
+ * @csspart input - The input element
31
+ * @csspart label - The label element
32
+ * @cssprop --consent-primary - Primary brand color for focus state
33
+ */
34
+ export declare class ConsentInput extends LitElement {
35
+ static formAssociated: boolean;
36
+ private internals;
37
+ constructor();
38
+ /**
39
+ * Input type
40
+ */
41
+ type: InputType;
42
+ /**
43
+ * Form field name
44
+ */
45
+ name: string;
46
+ /**
47
+ * Input value
48
+ */
49
+ value: string;
50
+ /**
51
+ * Label text
52
+ */
53
+ label: string;
54
+ /**
55
+ * Placeholder text
56
+ */
57
+ placeholder: string;
58
+ /**
59
+ * Required for form validation
60
+ */
61
+ required: boolean;
62
+ /**
63
+ * Disabled state
64
+ */
65
+ disabled: boolean;
66
+ /**
67
+ * Autocomplete attribute
68
+ */
69
+ autocomplete: string;
70
+ /**
71
+ * Error message to display
72
+ */
73
+ error?: string;
74
+ /**
75
+ * Show password toggle for password inputs
76
+ */
77
+ private showPassword;
78
+ static styles: import("lit").CSSResult;
79
+ protected updated(changedProperties: Map<string, unknown>): void;
80
+ private handleInput;
81
+ private handleChange;
82
+ private togglePasswordVisibility;
83
+ private renderPasswordToggle;
84
+ render(): import("lit").TemplateResult<1>;
85
+ }
86
+ declare global {
87
+ interface HTMLElementTagNameMap {
88
+ 'consent-input': ConsentInput;
89
+ }
90
+ }
91
+ //# sourceMappingURL=consent-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent-input.d.ts","sourceRoot":"","sources":["../../src/components/consent-input.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBACa,YAAa,SAAQ,UAAU;IAE1C,MAAM,CAAC,cAAc,UAAQ;IAE7B,OAAO,CAAC,SAAS,CAAmB;;IAOpC;;OAEG;IAEH,IAAI,EAAE,SAAS,CAAU;IAEzB;;OAEG;IAEH,IAAI,SAAM;IAEV;;OAEG;IAEH,KAAK,SAAM;IAEX;;OAEG;IAEH,KAAK,SAAM;IAEX;;OAEG;IAEH,WAAW,SAAM;IAEjB;;OAEG;IAEH,QAAQ,UAAS;IAEjB;;OAEG;IAEH,QAAQ,UAAS;IAEjB;;OAEG;IAEH,YAAY,SAAM;IAElB;;OAEG;IAEH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IAEH,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAgB,MAAM,0BAiIpB;cAGiB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAMlE,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,oBAAoB;IA8BnB,MAAM;CAgChB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,YAAY,CAAC;KAC/B;CACF"}
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Consent Input Web Component
3
+ *
4
+ * A styled text input for consent pages with label and error support.
5
+ * Implements Form Associated Custom Elements for proper form participation.
6
+ *
7
+ * @module components/consent-input
8
+ */
9
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
10
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
11
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
12
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
13
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
14
+ };
15
+ import { LitElement, html, css } from 'lit';
16
+ import { customElement, property, state } from 'lit/decorators.js';
17
+ /**
18
+ * ConsentInput - A themed input component with label
19
+ *
20
+ * @example
21
+ * ```html
22
+ * <consent-input
23
+ * type="email"
24
+ * name="email"
25
+ * label="Email Address"
26
+ * placeholder="you@example.com"
27
+ * required
28
+ * ></consent-input>
29
+ * ```
30
+ *
31
+ * @fires input - Fired when input value changes
32
+ * @fires change - Fired when input loses focus after change
33
+ * @csspart input - The input element
34
+ * @csspart label - The label element
35
+ * @cssprop --consent-primary - Primary brand color for focus state
36
+ */
37
+ let ConsentInput = class ConsentInput extends LitElement {
38
+ constructor() {
39
+ super();
40
+ /**
41
+ * Input type
42
+ */
43
+ this.type = 'text';
44
+ /**
45
+ * Form field name
46
+ */
47
+ this.name = '';
48
+ /**
49
+ * Input value
50
+ */
51
+ this.value = '';
52
+ /**
53
+ * Label text
54
+ */
55
+ this.label = '';
56
+ /**
57
+ * Placeholder text
58
+ */
59
+ this.placeholder = '';
60
+ /**
61
+ * Required for form validation
62
+ */
63
+ this.required = false;
64
+ /**
65
+ * Disabled state
66
+ */
67
+ this.disabled = false;
68
+ /**
69
+ * Autocomplete attribute
70
+ */
71
+ this.autocomplete = '';
72
+ /**
73
+ * Show password toggle for password inputs
74
+ */
75
+ this.showPassword = false;
76
+ this.internals = this.attachInternals();
77
+ }
78
+ // Update form value when properties change
79
+ updated(changedProperties) {
80
+ if (changedProperties.has('value')) {
81
+ this.internals.setFormValue(this.value || null);
82
+ }
83
+ }
84
+ handleInput(e) {
85
+ const input = e.target;
86
+ this.value = input.value;
87
+ this.internals.setFormValue(this.value || null);
88
+ this.dispatchEvent(new CustomEvent('input', {
89
+ detail: { value: this.value },
90
+ bubbles: true,
91
+ composed: true,
92
+ }));
93
+ }
94
+ handleChange(e) {
95
+ const input = e.target;
96
+ this.value = input.value;
97
+ this.dispatchEvent(new CustomEvent('change', {
98
+ detail: { value: this.value },
99
+ bubbles: true,
100
+ composed: true,
101
+ }));
102
+ }
103
+ togglePasswordVisibility() {
104
+ this.showPassword = !this.showPassword;
105
+ }
106
+ renderPasswordToggle() {
107
+ if (this.type !== 'password')
108
+ return null;
109
+ const icon = this.showPassword
110
+ ? html `
111
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
112
+ <path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/>
113
+ <line x1="1" y1="1" x2="23" y2="23"/>
114
+ </svg>
115
+ `
116
+ : html `
117
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
118
+ <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/>
119
+ <circle cx="12" cy="12" r="3"/>
120
+ </svg>
121
+ `;
122
+ return html `
123
+ <button
124
+ type="button"
125
+ class="password-toggle"
126
+ @click=${this.togglePasswordVisibility}
127
+ tabindex="-1"
128
+ aria-label=${this.showPassword ? 'Hide password' : 'Show password'}
129
+ >
130
+ ${icon}
131
+ </button>
132
+ `;
133
+ }
134
+ render() {
135
+ const inputType = this.type === 'password' && this.showPassword ? 'text' : this.type;
136
+ return html `
137
+ <div class="field">
138
+ ${this.label
139
+ ? html `
140
+ <label part="label" for="input">
141
+ ${this.label}${this.required ? html `<span class="required">*</span>` : null}
142
+ </label>
143
+ `
144
+ : null}
145
+ <div class="input-wrapper${this.error ? ' has-error' : ''}">
146
+ <input
147
+ part="input"
148
+ id="input"
149
+ type=${inputType}
150
+ name=${this.name}
151
+ .value=${this.value}
152
+ placeholder=${this.placeholder}
153
+ ?required=${this.required}
154
+ ?disabled=${this.disabled}
155
+ autocomplete=${this.autocomplete || 'off'}
156
+ @input=${this.handleInput}
157
+ @change=${this.handleChange}
158
+ />
159
+ ${this.renderPasswordToggle()}
160
+ </div>
161
+ ${this.error ? html `<div class="error-message">${this.error}</div>` : null}
162
+ </div>
163
+ `;
164
+ }
165
+ };
166
+ // Enable form association
167
+ ConsentInput.formAssociated = true;
168
+ ConsentInput.styles = css `
169
+ :host {
170
+ display: block;
171
+ }
172
+
173
+ .field {
174
+ display: flex;
175
+ flex-direction: column;
176
+ gap: 0.375rem;
177
+ }
178
+
179
+ label {
180
+ font-size: 0.875rem;
181
+ font-weight: 500;
182
+ color: #374151;
183
+ }
184
+
185
+ .input-wrapper {
186
+ position: relative;
187
+ display: flex;
188
+ align-items: center;
189
+ }
190
+
191
+ /* Base input styles - use .input-wrapper for higher specificity */
192
+ .input-wrapper input {
193
+ width: 100%;
194
+ padding: 0.625rem 0.75rem;
195
+ font-size: 0.875rem;
196
+ font-family: inherit;
197
+ color: #111827;
198
+ background-color: white;
199
+ border: 1px solid #d1d5db;
200
+ border-radius: 0.5rem;
201
+ outline: none;
202
+ box-shadow: none;
203
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
204
+ }
205
+
206
+ .input-wrapper input:focus {
207
+ border-color: var(--consent-primary, #2563eb);
208
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
209
+ }
210
+
211
+ .input-wrapper input:disabled {
212
+ background-color: #f9fafb;
213
+ cursor: not-allowed;
214
+ opacity: 0.6;
215
+ }
216
+
217
+ .input-wrapper input::placeholder {
218
+ color: #9ca3af;
219
+ }
220
+
221
+ /* Prevent browser validation styling before user interaction */
222
+ .input-wrapper input:invalid {
223
+ border-color: #d1d5db;
224
+ box-shadow: none;
225
+ outline: none;
226
+ background-color: white;
227
+ }
228
+
229
+ /* Override browser autofill styling */
230
+ .input-wrapper input:-webkit-autofill,
231
+ .input-wrapper input:-webkit-autofill:hover,
232
+ .input-wrapper input:-webkit-autofill:focus {
233
+ -webkit-box-shadow: 0 0 0 1000px white inset;
234
+ -webkit-text-fill-color: #111827;
235
+ border-color: #d1d5db;
236
+ transition: background-color 5000s ease-in-out 0s;
237
+ }
238
+
239
+ /* Only show validation styling after user interaction */
240
+ .input-wrapper input:user-invalid {
241
+ border-color: #ef4444;
242
+ }
243
+
244
+ .input-wrapper input:user-invalid:focus {
245
+ border-color: #ef4444;
246
+ box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1);
247
+ }
248
+
249
+ /* Password toggle */
250
+ .input-wrapper input[type='password'] {
251
+ padding-right: 2.5rem;
252
+ }
253
+
254
+ .password-toggle {
255
+ position: absolute;
256
+ right: 0.5rem;
257
+ padding: 0.375rem;
258
+ background: none;
259
+ border: none;
260
+ cursor: pointer;
261
+ color: #6b7280;
262
+ display: flex;
263
+ align-items: center;
264
+ justify-content: center;
265
+ }
266
+
267
+ .password-toggle:hover {
268
+ color: #374151;
269
+ }
270
+
271
+ .password-toggle svg {
272
+ width: 1.25rem;
273
+ height: 1.25rem;
274
+ }
275
+
276
+ /* Error state - use class instead of attribute for proper specificity */
277
+ .input-wrapper.has-error input {
278
+ border-color: #ef4444;
279
+ }
280
+
281
+ .input-wrapper.has-error input:focus {
282
+ border-color: #ef4444;
283
+ box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1);
284
+ }
285
+
286
+ .error-message {
287
+ font-size: 0.75rem;
288
+ color: #ef4444;
289
+ margin-top: 0.25rem;
290
+ }
291
+
292
+ /* Required indicator */
293
+ .required {
294
+ color: #ef4444;
295
+ margin-left: 0.125rem;
296
+ }
297
+ `;
298
+ __decorate([
299
+ property({ type: String })
300
+ ], ConsentInput.prototype, "type", void 0);
301
+ __decorate([
302
+ property({ type: String })
303
+ ], ConsentInput.prototype, "name", void 0);
304
+ __decorate([
305
+ property({ type: String })
306
+ ], ConsentInput.prototype, "value", void 0);
307
+ __decorate([
308
+ property({ type: String })
309
+ ], ConsentInput.prototype, "label", void 0);
310
+ __decorate([
311
+ property({ type: String })
312
+ ], ConsentInput.prototype, "placeholder", void 0);
313
+ __decorate([
314
+ property({ type: Boolean })
315
+ ], ConsentInput.prototype, "required", void 0);
316
+ __decorate([
317
+ property({ type: Boolean, reflect: true })
318
+ ], ConsentInput.prototype, "disabled", void 0);
319
+ __decorate([
320
+ property({ type: String })
321
+ ], ConsentInput.prototype, "autocomplete", void 0);
322
+ __decorate([
323
+ property({ type: String })
324
+ ], ConsentInput.prototype, "error", void 0);
325
+ __decorate([
326
+ state()
327
+ ], ConsentInput.prototype, "showPassword", void 0);
328
+ ConsentInput = __decorate([
329
+ customElement('consent-input')
330
+ ], ConsentInput);
331
+ export { ConsentInput };
332
+ //# sourceMappingURL=consent-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent-input.js","sourceRoot":"","sources":["../../src/components/consent-input.ts"],"names":[],"mappings":"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"}