secure-ui-components 0.1.0-beta.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 (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +310 -0
  3. package/dist/components/secure-datetime/secure-datetime.css +263 -0
  4. package/dist/components/secure-datetime/secure-datetime.d.ts +124 -0
  5. package/dist/components/secure-datetime/secure-datetime.d.ts.map +1 -0
  6. package/dist/components/secure-datetime/secure-datetime.js +610 -0
  7. package/dist/components/secure-datetime/secure-datetime.js.map +1 -0
  8. package/dist/components/secure-file-upload/secure-file-upload.css +334 -0
  9. package/dist/components/secure-file-upload/secure-file-upload.d.ts +150 -0
  10. package/dist/components/secure-file-upload/secure-file-upload.d.ts.map +1 -0
  11. package/dist/components/secure-file-upload/secure-file-upload.js +911 -0
  12. package/dist/components/secure-file-upload/secure-file-upload.js.map +1 -0
  13. package/dist/components/secure-form/secure-form.css +62 -0
  14. package/dist/components/secure-form/secure-form.d.ts +128 -0
  15. package/dist/components/secure-form/secure-form.d.ts.map +1 -0
  16. package/dist/components/secure-form/secure-form.js +697 -0
  17. package/dist/components/secure-form/secure-form.js.map +1 -0
  18. package/dist/components/secure-input/secure-input.css +168 -0
  19. package/dist/components/secure-input/secure-input.d.ts +114 -0
  20. package/dist/components/secure-input/secure-input.d.ts.map +1 -0
  21. package/dist/components/secure-input/secure-input.js +785 -0
  22. package/dist/components/secure-input/secure-input.js.map +1 -0
  23. package/dist/components/secure-select/secure-select.css +195 -0
  24. package/dist/components/secure-select/secure-select.d.ts +149 -0
  25. package/dist/components/secure-select/secure-select.d.ts.map +1 -0
  26. package/dist/components/secure-select/secure-select.js +634 -0
  27. package/dist/components/secure-select/secure-select.js.map +1 -0
  28. package/dist/components/secure-submit-button/secure-submit-button.css +135 -0
  29. package/dist/components/secure-submit-button/secure-submit-button.d.ts +61 -0
  30. package/dist/components/secure-submit-button/secure-submit-button.d.ts.map +1 -0
  31. package/dist/components/secure-submit-button/secure-submit-button.js +399 -0
  32. package/dist/components/secure-submit-button/secure-submit-button.js.map +1 -0
  33. package/dist/components/secure-table/secure-table.css +341 -0
  34. package/dist/components/secure-table/secure-table.d.ts +64 -0
  35. package/dist/components/secure-table/secure-table.d.ts.map +1 -0
  36. package/dist/components/secure-table/secure-table.js +567 -0
  37. package/dist/components/secure-table/secure-table.js.map +1 -0
  38. package/dist/components/secure-textarea/secure-textarea.css +153 -0
  39. package/dist/components/secure-textarea/secure-textarea.d.ts +111 -0
  40. package/dist/components/secure-textarea/secure-textarea.d.ts.map +1 -0
  41. package/dist/components/secure-textarea/secure-textarea.js +477 -0
  42. package/dist/components/secure-textarea/secure-textarea.js.map +1 -0
  43. package/dist/core/base-component.d.ts +134 -0
  44. package/dist/core/base-component.d.ts.map +1 -0
  45. package/dist/core/base-component.js +303 -0
  46. package/dist/core/base-component.js.map +1 -0
  47. package/dist/core/base.css +37 -0
  48. package/dist/core/security-config.d.ts +89 -0
  49. package/dist/core/security-config.d.ts.map +1 -0
  50. package/dist/core/security-config.js +273 -0
  51. package/dist/core/security-config.js.map +1 -0
  52. package/dist/core/types.d.ts +212 -0
  53. package/dist/core/types.d.ts.map +1 -0
  54. package/dist/core/types.js +7 -0
  55. package/dist/core/types.js.map +1 -0
  56. package/dist/index.d.ts +18 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +19 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/package.json +89 -0
  61. package/dist/styles/tokens.css +257 -0
  62. package/package.json +118 -0
@@ -0,0 +1,341 @@
1
+ /**
2
+ * Secure Table Component Styles
3
+ * Uses design tokens for full customizability
4
+ */
5
+
6
+ /* Host Container */
7
+ :host {
8
+ display: block;
9
+ font-family: var(--secure-ui-font-family-base);
10
+ }
11
+
12
+ /* Table Container */
13
+ .table-container {
14
+ background: var(--secure-ui-color-bg-primary);
15
+ border-radius: var(--secure-ui-border-radius-lg);
16
+ border: var(--secure-ui-border-width-thin) solid var(--secure-ui-color-border);
17
+ overflow: hidden;
18
+ }
19
+
20
+ /* Table Header Controls */
21
+ .table-header {
22
+ display: flex;
23
+ justify-content: space-between;
24
+ align-items: center;
25
+ padding: var(--secure-ui-space-4);
26
+ background-color: var(--secure-ui-color-bg-secondary);
27
+ border-bottom: var(--secure-ui-border-width-thin) solid var(--secure-ui-color-border);
28
+ gap: var(--secure-ui-space-3);
29
+ flex-wrap: wrap;
30
+ }
31
+
32
+ .table-title {
33
+ font-size: var(--secure-ui-font-size-lg);
34
+ font-weight: var(--secure-ui-font-weight-semibold);
35
+ color: var(--secure-ui-color-text-primary);
36
+ margin: 0;
37
+ }
38
+
39
+ .table-controls {
40
+ display: flex;
41
+ gap: var(--secure-ui-space-3);
42
+ align-items: center;
43
+ }
44
+
45
+ /* Search Input */
46
+ .search-input {
47
+ padding: var(--secure-ui-space-2) var(--secure-ui-space-3);
48
+ border: var(--secure-ui-border-width-thin) solid var(--secure-ui-color-border);
49
+ border-radius: var(--secure-ui-border-radius-base);
50
+ font-size: var(--secure-ui-font-size-sm);
51
+ font-family: var(--secure-ui-font-family-base);
52
+ color: var(--secure-ui-color-text-primary);
53
+ background-color: var(--secure-ui-color-bg-primary);
54
+ min-width: 200px;
55
+ transition: all var(--secure-ui-transition-base) var(--secure-ui-transition-ease-in-out);
56
+ }
57
+
58
+ .search-input:focus {
59
+ outline: none;
60
+ border-color: var(--secure-ui-color-primary);
61
+ box-shadow: var(--secure-ui-shadow-focus);
62
+ }
63
+
64
+ .search-input::placeholder {
65
+ color: var(--secure-ui-color-text-secondary);
66
+ }
67
+
68
+ /* Table Wrapper (for horizontal scrolling) */
69
+ .table-wrapper {
70
+ overflow-x: auto;
71
+ overflow-y: visible;
72
+ }
73
+
74
+ /* Table Element */
75
+ .data-table {
76
+ width: 100%;
77
+ border-collapse: collapse;
78
+ font-size: var(--secure-ui-font-size-sm);
79
+ color: var(--secure-ui-table-font-color);
80
+ }
81
+
82
+ /* Table Head */
83
+ .data-table thead {
84
+ background-color: var(--secure-ui-color-bg-tertiary);
85
+ border-bottom: var(--secure-ui-border-width-base) solid var(--secure-ui-color-border);
86
+ }
87
+
88
+ .data-table th {
89
+ padding: var(--secure-ui-space-3) var(--secure-ui-space-4);
90
+ text-align: left;
91
+ font-weight: var(--secure-ui-font-weight-semibold);
92
+ color: var(--secure-ui-color-text-primary);
93
+ white-space: nowrap;
94
+ position: relative;
95
+ }
96
+
97
+ /* Sortable Column Headers */
98
+ .data-table th.sortable {
99
+ cursor: pointer;
100
+ user-select: none;
101
+ transition: background-color var(--secure-ui-transition-fast) var(--secure-ui-transition-ease-in-out);
102
+ }
103
+
104
+ .data-table th.sortable:hover {
105
+ background-color: var(--secure-ui-color-bg-secondary);
106
+ }
107
+
108
+ .data-table th.sorted {
109
+ color: var(--secure-ui-color-primary);
110
+ }
111
+
112
+ .sort-indicator {
113
+ display: inline-block;
114
+ margin-left: var(--secure-ui-space-1);
115
+ font-size: var(--secure-ui-font-size-xs);
116
+ opacity: 0.5;
117
+ transition: opacity var(--secure-ui-transition-fast) var(--secure-ui-transition-ease-in-out);
118
+ }
119
+
120
+ .data-table th.sorted .sort-indicator {
121
+ opacity: 1;
122
+ }
123
+
124
+ /* Table Body */
125
+ .data-table tbody tr {
126
+ border-bottom: var(--secure-ui-border-width-thin) solid var(--secure-ui-color-border);
127
+ transition: background-color var(--secure-ui-transition-fast) var(--secure-ui-transition-ease-in-out);
128
+ }
129
+
130
+ .data-table tbody tr:hover {
131
+ background-color: var(--secure-ui-color-bg-secondary);
132
+ }
133
+
134
+ .data-table tbody tr:last-child {
135
+ border-bottom: none;
136
+ }
137
+
138
+ .data-table td {
139
+ padding: var(--secure-ui-space-3) var(--secure-ui-space-4);
140
+ color: var(--secure-ui-color-text-primary);
141
+ vertical-align: middle;
142
+ }
143
+
144
+ /* Masked Data */
145
+ .masked-cell {
146
+ font-family: var(--secure-ui-font-family-mono);
147
+ color: var(--secure-ui-color-text-secondary);
148
+ letter-spacing: 0.1em;
149
+ }
150
+
151
+ /* Empty State */
152
+ .empty-state {
153
+ padding: var(--secure-ui-space-8) var(--secure-ui-space-4);
154
+ text-align: center;
155
+ color: var(--secure-ui-color-text-secondary);
156
+ }
157
+
158
+ .empty-state-icon {
159
+ font-size: var(--secure-ui-font-size-3xl);
160
+ margin-bottom: var(--secure-ui-space-2);
161
+ }
162
+
163
+ .empty-state-text {
164
+ font-size: var(--secure-ui-font-size-base);
165
+ margin: 0;
166
+ }
167
+
168
+ /* Pagination */
169
+ .pagination {
170
+ display: flex;
171
+ justify-content: space-between;
172
+ align-items: center;
173
+ padding: var(--secure-ui-space-4);
174
+ background-color: var(--secure-ui-color-bg-secondary);
175
+ border-top: var(--secure-ui-border-width-thin) solid var(--secure-ui-color-border);
176
+ gap: var(--secure-ui-space-3);
177
+ flex-wrap: wrap;
178
+ }
179
+
180
+ .pagination-info {
181
+ font-size: var(--secure-ui-font-size-sm);
182
+ color: var(--secure-ui-color-text-secondary);
183
+ }
184
+
185
+ .pagination-controls {
186
+ display: flex;
187
+ gap: var(--secure-ui-space-2);
188
+ }
189
+
190
+ .pagination-button {
191
+ padding: var(--secure-ui-space-2) var(--secure-ui-space-3);
192
+ border: var(--secure-ui-border-width-thin) solid var(--secure-ui-color-border);
193
+ border-radius: var(--secure-ui-border-radius-base);
194
+ background-color: var(--secure-ui-color-bg-primary);
195
+ color: var(--secure-ui-color-text-primary);
196
+ font-size: var(--secure-ui-font-size-sm);
197
+ font-family: var(--secure-ui-font-family-base);
198
+ cursor: pointer;
199
+ transition: all var(--secure-ui-transition-base) var(--secure-ui-transition-ease-in-out);
200
+ }
201
+
202
+ .pagination-button:hover:not(:disabled) {
203
+ background-color: var(--secure-ui-color-primary);
204
+ color: var(--secure-ui-color-text-inverse);
205
+ border-color: var(--secure-ui-color-primary);
206
+ }
207
+
208
+ .pagination-button:disabled {
209
+ opacity: var(--secure-ui-input-disabled-opacity);
210
+ cursor: not-allowed;
211
+ }
212
+
213
+ .pagination-button.active {
214
+ background-color: var(--secure-ui-color-primary);
215
+ color: var(--secure-ui-color-text-inverse);
216
+ border-color: var(--secure-ui-color-primary);
217
+ }
218
+
219
+ /* Page Size Selector */
220
+ .page-size-selector {
221
+ display: flex;
222
+ align-items: center;
223
+ gap: var(--secure-ui-space-2);
224
+ font-size: var(--secure-ui-font-size-sm);
225
+ color: var(--secure-ui-color-text-secondary);
226
+ }
227
+
228
+ .page-size-select {
229
+ padding: var(--secure-ui-space-1) var(--secure-ui-space-2);
230
+ border: var(--secure-ui-border-width-thin) solid var(--secure-ui-color-border);
231
+ border-radius: var(--secure-ui-border-radius-base);
232
+ background-color: var(--secure-ui-color-bg-primary);
233
+ color: var(--secure-ui-color-text-primary);
234
+ font-size: var(--secure-ui-font-size-sm);
235
+ font-family: var(--secure-ui-font-family-base);
236
+ cursor: pointer;
237
+ }
238
+
239
+ /* Loading State */
240
+ .loading-overlay {
241
+ position: absolute;
242
+ top: 0;
243
+ left: 0;
244
+ right: 0;
245
+ bottom: 0;
246
+ background-color: rgba(255, 255, 255, 0.8);
247
+ display: flex;
248
+ justify-content: center;
249
+ align-items: center;
250
+ z-index: var(--secure-ui-z-sticky);
251
+ }
252
+
253
+ .loading-spinner {
254
+ width: 40px;
255
+ height: 40px;
256
+ border: 4px solid var(--secure-ui-color-border);
257
+ border-top-color: var(--secure-ui-color-primary);
258
+ border-radius: 50%;
259
+ animation: spin 0.8s linear infinite;
260
+ }
261
+
262
+ @keyframes spin {
263
+ to { transform: rotate(360deg); }
264
+ }
265
+
266
+ /* Security Tier Styles */
267
+ :host([security-tier="authenticated"]) .table-container {
268
+ border-top: var(--secure-ui-border-width-thick) solid var(--secure-ui-tier-authenticated);
269
+ }
270
+
271
+ :host([security-tier="sensitive"]) .table-container {
272
+ border-top: var(--secure-ui-border-width-thick) solid var(--secure-ui-tier-sensitive);
273
+ }
274
+
275
+ :host([security-tier="critical"]) .table-container {
276
+ border-top: var(--secure-ui-border-width-thick) solid var(--secure-ui-tier-critical);
277
+ }
278
+
279
+ /* Security Badge */
280
+ .security-badge {
281
+ display: inline-block;
282
+ padding: var(--secure-ui-badge-padding);
283
+ margin-left: var(--secure-ui-space-2);
284
+ font-size: var(--secure-ui-badge-font-size);
285
+ font-weight: var(--secure-ui-font-weight-semibold);
286
+ border-radius: var(--secure-ui-badge-border-radius);
287
+ text-transform: uppercase;
288
+ background-color: var(--secure-ui-color-bg-tertiary);
289
+ color: var(--secure-ui-color-text-secondary);
290
+ border: var(--secure-ui-border-width-thin) solid var(--secure-ui-color-border);
291
+ }
292
+
293
+ /* Responsive Design */
294
+ @media (max-width: 768px) {
295
+ .table-header {
296
+ flex-direction: column;
297
+ align-items: stretch;
298
+ }
299
+
300
+ .table-controls {
301
+ flex-direction: column;
302
+ width: 100%;
303
+ }
304
+
305
+ .search-input {
306
+ width: 100%;
307
+ min-width: auto;
308
+ }
309
+
310
+ .pagination {
311
+ flex-direction: column;
312
+ align-items: stretch;
313
+ }
314
+
315
+ .pagination-controls {
316
+ justify-content: center;
317
+ }
318
+
319
+ /* Horizontal scroll shadow indicator — purely visual, no generated text content
320
+ that would be read by screen readers (replaces previous '← Scroll →' ::after) */
321
+ .table-wrapper {
322
+ position: relative;
323
+ background:
324
+ linear-gradient(to right, var(--secure-ui-color-bg-primary) 0%, transparent 100%) left,
325
+ linear-gradient(to left, var(--secure-ui-color-bg-primary) 0%, transparent 100%) right,
326
+ radial-gradient(farthest-side at 0 50%, rgba(0,0,0,.12), transparent) left,
327
+ radial-gradient(farthest-side at 100% 50%, rgba(0,0,0,.12), transparent) right;
328
+ background-repeat: no-repeat;
329
+ background-size: 32px 100%, 32px 100%, 10px 100%, 10px 100%;
330
+ background-attachment: local, local, scroll, scroll;
331
+ }
332
+ }
333
+
334
+ /* Zebra Striping (Optional Enhancement) */
335
+ .data-table tbody tr:nth-child(even) {
336
+ background-color: rgba(0, 0, 0, 0.01);
337
+ }
338
+
339
+ .data-table tbody tr:nth-child(even):hover {
340
+ background-color: var(--secure-ui-color-bg-secondary);
341
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Secure Table Component
3
+ *
4
+ * A security-aware data table component with filtering, sorting, and pagination.
5
+ *
6
+ * Features:
7
+ * - Real-time filtering/search across all columns
8
+ * - Column sorting (ascending/descending)
9
+ * - Pagination
10
+ * - Security tier-based column masking
11
+ * - XSS prevention via sanitization
12
+ * - Audit logging for data access
13
+ *
14
+ * @example
15
+ * <secure-table
16
+ * id="userTable"
17
+ * security-tier="sensitive"
18
+ * ></secure-table>
19
+ *
20
+ * // Set data programmatically
21
+ * const table = document.getElementById('userTable');
22
+ * table.data = [
23
+ * { id: 1, name: 'John', email: 'john@example.com' },
24
+ * { id: 2, name: 'Jane', email: 'jane@example.com' }
25
+ * ];
26
+ * table.columns = [
27
+ * { key: 'id', label: 'ID', sortable: true },
28
+ * { key: 'name', label: 'Name', sortable: true, filterable: true },
29
+ * { key: 'email', label: 'Email', sortable: true, filterable: true, tier: 'sensitive' }
30
+ * ];
31
+ */
32
+ import { SecureBaseComponent } from '../../core/base-component.js';
33
+ import type { TableColumnDefinition } from '../../core/types.js';
34
+ export declare class SecureTable extends SecureBaseComponent {
35
+ #private;
36
+ constructor();
37
+ /**
38
+ * Required by abstract base class, but this component manages its own rendering
39
+ * via the private #render() method.
40
+ * @protected
41
+ */
42
+ protected render(): DocumentFragment | HTMLElement | null;
43
+ /**
44
+ * Component lifecycle - called when added to DOM
45
+ */
46
+ connectedCallback(): void;
47
+ /**
48
+ * Set table data
49
+ */
50
+ set data(data: Record<string, unknown>[]);
51
+ /**
52
+ * Get table data
53
+ */
54
+ get data(): Record<string, unknown>[];
55
+ /**
56
+ * Set column configuration
57
+ */
58
+ set columns(columns: TableColumnDefinition[]);
59
+ /**
60
+ * Get column configuration
61
+ */
62
+ get columns(): TableColumnDefinition[];
63
+ }
64
+ //# sourceMappingURL=secure-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-table.d.ts","sourceRoot":"","sources":["../../../src/components/secure-table/secure-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,KAAK,EAAE,qBAAqB,EAAyC,MAAM,qBAAqB,CAAC;AAExG,qBAAa,WAAY,SAAQ,mBAAmB;;;IA+ClD;;;;OAIG;IACH,SAAS,CAAC,MAAM,IAAI,gBAAgB,GAAG,WAAW,GAAG,IAAI;IAIzD;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAuGzB;;OAEG;IACH,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EASvC;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAEpC;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,qBAAqB,EAAE,EAQ3C;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,qBAAqB,EAAE,CAErC;CAmYF"}