@cloudware-de/gatekeeper-widget 0.0.0-stage → 0.1.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 (111) hide show
  1. package/LICENSE +17 -0
  2. package/dist/client/instance.d.ts +35 -0
  3. package/dist/client/instance.d.ts.map +1 -0
  4. package/dist/client/instance.js +93 -0
  5. package/dist/client/instance.js.map +1 -0
  6. package/dist/client/transport.d.ts +19 -0
  7. package/dist/client/transport.d.ts.map +1 -0
  8. package/dist/client/transport.js +41 -0
  9. package/dist/client/transport.js.map +1 -0
  10. package/dist/client/urls.d.ts +12 -0
  11. package/dist/client/urls.d.ts.map +1 -0
  12. package/dist/client/urls.js +27 -0
  13. package/dist/client/urls.js.map +1 -0
  14. package/dist/copy/load-notice.d.ts +8 -0
  15. package/dist/copy/load-notice.d.ts.map +1 -0
  16. package/dist/copy/load-notice.js +8 -0
  17. package/dist/copy/load-notice.js.map +1 -0
  18. package/dist/element/honeypot.d.ts +5 -0
  19. package/dist/element/honeypot.d.ts.map +1 -0
  20. package/dist/element/honeypot.js +5 -0
  21. package/dist/element/honeypot.js.map +1 -0
  22. package/dist/element/session.d.ts +32 -0
  23. package/dist/element/session.d.ts.map +1 -0
  24. package/dist/element/session.js +90 -0
  25. package/dist/element/session.js.map +1 -0
  26. package/dist/element/start.d.ts +25 -0
  27. package/dist/element/start.d.ts.map +1 -0
  28. package/dist/element/start.js +85 -0
  29. package/dist/element/start.js.map +1 -0
  30. package/dist/element/states.d.ts +26 -0
  31. package/dist/element/states.d.ts.map +1 -0
  32. package/dist/element/states.js +58 -0
  33. package/dist/element/states.js.map +1 -0
  34. package/dist/element/templates/host.d.ts +7 -0
  35. package/dist/element/templates/host.d.ts.map +1 -0
  36. package/dist/element/templates/host.js +11 -0
  37. package/dist/element/templates/host.js.map +1 -0
  38. package/dist/element/templates/names.d.ts +11 -0
  39. package/dist/element/templates/names.d.ts.map +1 -0
  40. package/dist/element/templates/names.js +20 -0
  41. package/dist/element/templates/names.js.map +1 -0
  42. package/dist/element/templates/sheets.d.ts +10 -0
  43. package/dist/element/templates/sheets.d.ts.map +1 -0
  44. package/dist/element/templates/sheets.js +26 -0
  45. package/dist/element/templates/sheets.js.map +1 -0
  46. package/dist/element/widget.d.ts +75 -0
  47. package/dist/element/widget.d.ts.map +1 -0
  48. package/dist/element/widget.js +852 -0
  49. package/dist/element/widget.js.map +1 -0
  50. package/dist/envelope/run.d.ts +20 -0
  51. package/dist/envelope/run.d.ts.map +1 -0
  52. package/dist/envelope/run.js +104 -0
  53. package/dist/envelope/run.js.map +1 -0
  54. package/dist/index.d.ts +12 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +18 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/pow/messages.d.ts +24 -0
  59. package/dist/pow/messages.d.ts.map +1 -0
  60. package/dist/pow/messages.js +2 -0
  61. package/dist/pow/messages.js.map +1 -0
  62. package/dist/pow/oom.d.ts +7 -0
  63. package/dist/pow/oom.d.ts.map +1 -0
  64. package/dist/pow/oom.js +19 -0
  65. package/dist/pow/oom.js.map +1 -0
  66. package/dist/pow/run.d.ts +13 -0
  67. package/dist/pow/run.d.ts.map +1 -0
  68. package/dist/pow/run.js +73 -0
  69. package/dist/pow/run.js.map +1 -0
  70. package/dist/pow/solve.d.ts +32 -0
  71. package/dist/pow/solve.d.ts.map +1 -0
  72. package/dist/pow/solve.js +114 -0
  73. package/dist/pow/solve.js.map +1 -0
  74. package/dist/pow/wasm-url.d.ts +13 -0
  75. package/dist/pow/wasm-url.d.ts.map +1 -0
  76. package/dist/pow/wasm-url.js +16 -0
  77. package/dist/pow/wasm-url.js.map +1 -0
  78. package/dist/pow/worker.d.ts +2 -0
  79. package/dist/pow/worker.d.ts.map +1 -0
  80. package/dist/pow/worker.js +43 -0
  81. package/dist/pow/worker.js.map +1 -0
  82. package/dist/runtime/workers.d.ts +11 -0
  83. package/dist/runtime/workers.d.ts.map +1 -0
  84. package/dist/runtime/workers.js +36 -0
  85. package/dist/runtime/workers.js.map +1 -0
  86. package/package.json +33 -3
  87. package/src/client/instance.ts +140 -0
  88. package/src/client/transport.ts +55 -0
  89. package/src/client/urls.ts +38 -0
  90. package/src/copy/load-notice.ts +8 -0
  91. package/src/element/honeypot.ts +4 -0
  92. package/src/element/session.ts +131 -0
  93. package/src/element/start.ts +99 -0
  94. package/src/element/states.ts +73 -0
  95. package/src/element/templates/compact.css +4 -0
  96. package/src/element/templates/contrast.css +5 -0
  97. package/src/element/templates/host.ts +11 -0
  98. package/src/element/templates/names.ts +23 -0
  99. package/src/element/templates/sheets.ts +28 -0
  100. package/src/element/templates/standard.css +5 -0
  101. package/src/element/widget.ts +982 -0
  102. package/src/envelope/run.ts +126 -0
  103. package/src/index.ts +77 -0
  104. package/src/pow/messages.ts +21 -0
  105. package/src/pow/oom.ts +20 -0
  106. package/src/pow/run.ts +78 -0
  107. package/src/pow/solve.ts +136 -0
  108. package/src/pow/wasm-url.ts +27 -0
  109. package/src/pow/worker.ts +46 -0
  110. package/src/runtime/workers.ts +40 -0
  111. package/README.md +0 -3
@@ -0,0 +1,73 @@
1
+ /**
2
+ * T-204 UI-Zustände und getrennte ARIA-Labels (Artikel 10).
3
+ * Spec: specs/002-widget/tasks.md T-204
4
+ * Spec: specs/002-widget/spec.md §Öffentliches Custom-Element-API
5
+ */
6
+ export const WIDGET_UI_STATES = [
7
+ "idle",
8
+ "working",
9
+ "success",
10
+ "error",
11
+ "timeout",
12
+ ] as const;
13
+
14
+ export type WidgetUiState = (typeof WIDGET_UI_STATES)[number];
15
+
16
+ export const ARIA_LABELS: Readonly<Record<WidgetUiState, string>> = {
17
+ idle: "Cloudware Gatekeeper: nicht bestätigt",
18
+ working: "Cloudware Gatekeeper: Prüfung läuft",
19
+ success: "Cloudware Gatekeeper: bestätigt",
20
+ error: "Cloudware Gatekeeper: Prüfung fehlgeschlagen",
21
+ timeout: "Cloudware Gatekeeper: Zeitüberschreitung",
22
+ };
23
+
24
+ export function isWidgetUiState(value: string): value is WidgetUiState {
25
+ return (WIDGET_UI_STATES as readonly string[]).includes(value);
26
+ }
27
+
28
+ export function labelForState(state: WidgetUiState): string {
29
+ return ARIA_LABELS[state];
30
+ }
31
+
32
+ /** T-204-Default. Attribut `missing-token` überschreibt (leer = Default). */
33
+ export const TOKEN_MISSING_MESSAGE =
34
+ "Cloudware Gatekeeper: Bitte zuerst die Prüfung abschließen.";
35
+
36
+ export interface CopyHost {
37
+ getAttribute(name: string): string | null;
38
+ }
39
+
40
+ /**
41
+ * Idle/success dürfen per Attribut überschrieben werden.
42
+ * working / error / timeout bleiben T-204.
43
+ * Spec: specs/002-widget/spec.md §Öffentliches Custom-Element-API
44
+ */
45
+ export function labelForHost(host: CopyHost, state: WidgetUiState): string {
46
+ if (state === "idle") {
47
+ const override = host.getAttribute("label-unchecked")?.trim() ?? "";
48
+ if (override.length > 0) {
49
+ return override;
50
+ }
51
+ }
52
+ if (state === "success") {
53
+ const override = host.getAttribute("label-checked")?.trim() ?? "";
54
+ if (override.length > 0) {
55
+ return override;
56
+ }
57
+ }
58
+ return ARIA_LABELS[state];
59
+ }
60
+
61
+ export function missingTokenMessage(host: CopyHost): string {
62
+ const override = host.getAttribute("missing-token")?.trim() ?? "";
63
+ return override.length > 0 ? override : TOKEN_MISSING_MESSAGE;
64
+ }
65
+
66
+ /** Challenge-TTL (300 s), nicht T-210 Hard-Timeout. Attribut `expired-challenge`. */
67
+ export const CHALLENGE_EXPIRED_MESSAGE =
68
+ "Cloudware Gatekeeper: Challenge abgelaufen — bitte erneut versuchen";
69
+
70
+ export function challengeExpiredMessage(host: CopyHost): string {
71
+ const override = host.getAttribute("expired-challenge")?.trim() ?? "";
72
+ return override.length > 0 ? override : CHALLENGE_EXPIRED_MESSAGE;
73
+ }
@@ -0,0 +1,4 @@
1
+ :host([data-template="compact"]) { font-size: 0.875rem; max-width: 16rem; }
2
+ :host([data-template="compact"]) .gk { flex-direction: column; align-items: flex-start; gap: 0.35rem; padding: 0.35rem 0.5rem; }
3
+ :host([data-template="compact"]) .gk-box { width: 1.25rem; height: 1.25rem; min-width: 20px; min-height: 20px; }
4
+ :host([data-template="compact"]) .gk-load { margin: 0.2rem 0 0; font-size: 0.75rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
@@ -0,0 +1,5 @@
1
+ :host([data-template="contrast"]) { color: #f4f4f4; }
2
+ :host([data-template="contrast"]) .gk { background: #0a0a0a; border: 2px solid #f4f4f4; }
3
+ :host([data-template="contrast"]) .gk:focus-within { outline: 3px solid #ff0; outline-offset: 2px; }
4
+ :host([data-template="contrast"]) .gk-box { width: 1.35rem; height: 1.35rem; accent-color: #f4f4f4; }
5
+ :host([data-template="contrast"]) .gk-load { color: #e8e8e8; }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * data-template am Shadow-Host. Nur Darstellung.
3
+ * Spec: specs/002-widget/spec.md §Öffentliches Custom-Element-API
4
+ */
5
+ import { parseTemplate, type WidgetTemplate } from "./names.js";
6
+
7
+ export function applyTemplateToHost(host: HTMLElement): WidgetTemplate {
8
+ const name = parseTemplate(host.getAttribute("template"));
9
+ host.setAttribute("data-template", name);
10
+ return name;
11
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Drei Looks. Unbekannt → standard.
3
+ * Spec: specs/002-widget/spec.md §Öffentliches Custom-Element-API
4
+ */
5
+ export const TEMPLATE_STANDARD = "standard" as const;
6
+ export const TEMPLATE_COMPACT = "compact" as const;
7
+ export const TEMPLATE_CONTRAST = "contrast" as const;
8
+
9
+ export const WIDGET_TEMPLATES = [
10
+ TEMPLATE_STANDARD,
11
+ TEMPLATE_COMPACT,
12
+ TEMPLATE_CONTRAST,
13
+ ] as const;
14
+
15
+ export type WidgetTemplate = (typeof WIDGET_TEMPLATES)[number];
16
+
17
+ export function parseTemplate(raw: string | null | undefined): WidgetTemplate {
18
+ const value = raw?.trim();
19
+ if (value === TEMPLATE_COMPACT || value === TEMPLATE_CONTRAST) {
20
+ return value;
21
+ }
22
+ return TEMPLATE_STANDARD;
23
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shadow-CSS der drei Looks. tsc kann keine .css-Imports.
3
+ * Inhalt muss mit standard.css / compact.css / contrast.css übereinstimmen.
4
+ * Spec: specs/002-widget/spec.md §Öffentliches Custom-Element-API
5
+ */
6
+ export const STANDARD_CSS = `:host { display: inline-block; font-family: system-ui, sans-serif; font-size: 1rem; line-height: 1.4; color: #111; max-width: 22rem; }
7
+ .gk { display: flex; align-items: center; gap: 0.5rem; margin: 0; padding: 0.5rem 0.75rem; border: 1px solid #444; border-radius: 4px; background: #fff; }
8
+ .gk-box { width: 1.25rem; height: 1.25rem; margin: 0; accent-color: #111; }
9
+ .gk-label { user-select: none; }
10
+ .gk-load { margin: 0.4rem 0 0; padding: 0 0.15rem; font-size: 0.8rem; line-height: 1.35; color: #333; }
11
+ `;
12
+
13
+ export const COMPACT_CSS = `:host([data-template="compact"]) { font-size: 0.875rem; max-width: 16rem; }
14
+ :host([data-template="compact"]) .gk { flex-direction: column; align-items: flex-start; gap: 0.35rem; padding: 0.35rem 0.5rem; }
15
+ :host([data-template="compact"]) .gk-box { width: 1.25rem; height: 1.25rem; min-width: 20px; min-height: 20px; }
16
+ :host([data-template="compact"]) .gk-load { margin: 0.2rem 0 0; font-size: 0.75rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
17
+ `;
18
+
19
+ export const CONTRAST_CSS = `:host([data-template="contrast"]) { color: #f4f4f4; }
20
+ :host([data-template="contrast"]) .gk { background: #0a0a0a; border: 2px solid #f4f4f4; }
21
+ :host([data-template="contrast"]) .gk:focus-within { outline: 3px solid #ff0; outline-offset: 2px; }
22
+ :host([data-template="contrast"]) .gk-box { width: 1.35rem; height: 1.35rem; accent-color: #f4f4f4; }
23
+ :host([data-template="contrast"]) .gk-load { color: #e8e8e8; }
24
+ `;
25
+
26
+ export function combinedLookCss(): string {
27
+ return `${STANDARD_CSS}${COMPACT_CSS}${CONTRAST_CSS}`;
28
+ }
@@ -0,0 +1,5 @@
1
+ :host { display: inline-block; font-family: system-ui, sans-serif; font-size: 1rem; line-height: 1.4; color: #111; max-width: 22rem; }
2
+ .gk { display: flex; align-items: center; gap: 0.5rem; margin: 0; padding: 0.5rem 0.75rem; border: 1px solid #444; border-radius: 4px; background: #fff; }
3
+ .gk-box { width: 1.25rem; height: 1.25rem; margin: 0; accent-color: #111; }
4
+ .gk-label { user-select: none; }
5
+ .gk-load { margin: 0.4rem 0 0; padding: 0 0.15rem; font-size: 0.8rem; line-height: 1.35; color: #333; }