feat: Add Storybook configuration and motion tokens implementation
- Introduced Storybook configuration files (`main.ts`, `preview.ts`, `tsconfig.json`) for Angular components. - Created motion tokens in `motion-tokens.ts` to define durations, easing functions, and transforms. - Developed a Storybook story for motion tokens showcasing their usage and reduced motion fallback. - Added SCSS variables for motion durations, easing, and transforms in `_motion.scss`. - Implemented accessibility smoke tests using Playwright and Axe for automated accessibility checks. - Created portable and sealed bundle structures with corresponding JSON files for evidence locker. - Added shell script for verifying notify kit determinism.
This commit is contained in:
20
docs/notifications/schemas/channel.schema.json
Normal file
20
docs/notifications/schemas/channel.schema.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://stella-ops.org/notify/schemas/channel.schema.json",
|
||||
"title": "Notify Channel Configuration",
|
||||
"type": "object",
|
||||
"required": ["schema_version", "tenant_id", "channel_id", "kind", "config"],
|
||||
"properties": {
|
||||
"schema_version": { "type": "string", "pattern": "^v[0-9]+\\.[0-9]+$" },
|
||||
"tenant_id": { "type": "string", "minLength": 1 },
|
||||
"channel_id": { "type": "string", "pattern": "^[A-Z0-9_-]{4,64}$" },
|
||||
"kind": { "type": "string", "enum": ["email", "slack", "teams", "webhook", "sms"] },
|
||||
"config": { "type": "object" },
|
||||
"secrets_ref": { "type": "object", "additionalProperties": { "type": "string" } },
|
||||
"rate_limit": { "type": "object" },
|
||||
"enabled": { "type": "boolean", "default": true },
|
||||
"created_at": { "type": "string", "format": "date-time" },
|
||||
"updated_at": { "type": "string", "format": "date-time" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
20
docs/notifications/schemas/dlq-notify.schema.json
Normal file
20
docs/notifications/schemas/dlq-notify.schema.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://stella-ops.org/notify/schemas/dlq-notify.schema.json",
|
||||
"title": "Notify Dead Letter Entry",
|
||||
"type": "object",
|
||||
"required": ["schema_version", "tenant_id", "delivery_id", "reason", "payload", "first_failed_at"],
|
||||
"properties": {
|
||||
"schema_version": { "type": "string", "pattern": "^v[0-9]+\\.[0-9]+$" },
|
||||
"tenant_id": { "type": "string", "minLength": 1 },
|
||||
"delivery_id": { "type": "string", "pattern": "^[0-9a-fA-F-]{18,36}$" },
|
||||
"reason": { "type": "string" },
|
||||
"payload": { "type": "object" },
|
||||
"backoff_attempts": { "type": "integer", "minimum": 0 },
|
||||
"dedupe_key": { "type": "string" },
|
||||
"first_failed_at": { "type": "string", "format": "date-time" },
|
||||
"last_failed_at": { "type": "string", "format": "date-time" },
|
||||
"redrive_after": { "type": "string", "format": "date-time" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
26
docs/notifications/schemas/event-envelope.schema.json
Normal file
26
docs/notifications/schemas/event-envelope.schema.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://stella-ops.org/notify/schemas/event-envelope.schema.json",
|
||||
"title": "Notify Event Envelope",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"schema_version",
|
||||
"tenant_id",
|
||||
"event_id",
|
||||
"occurred_at",
|
||||
"kind",
|
||||
"payload"
|
||||
],
|
||||
"properties": {
|
||||
"schema_version": { "type": "string", "pattern": "^v[0-9]+\\.[0-9]+$" },
|
||||
"tenant_id": { "type": "string", "minLength": 1 },
|
||||
"event_id": { "type": "string", "pattern": "^[0-9a-fA-F-]{18,36}$" },
|
||||
"occurred_at": { "type": "string", "format": "date-time" },
|
||||
"kind": { "type": "string", "minLength": 1 },
|
||||
"correlation_id": { "type": "string" },
|
||||
"source": { "type": "string" },
|
||||
"payload": { "type": "object" },
|
||||
"attributes": { "type": "object", "additionalProperties": { "type": ["string", "number", "boolean", "null"] } }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
14
docs/notifications/schemas/inputs.lock
Normal file
14
docs/notifications/schemas/inputs.lock
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"catalog": "notify-schemas-catalog.json",
|
||||
"hash_algorithm": "blake3-256",
|
||||
"canonicalization": "json-normalized-utf8",
|
||||
"entries": [
|
||||
{ "file": "event-envelope.schema.json", "digest": "TBD" },
|
||||
{ "file": "rule.schema.json", "digest": "TBD" },
|
||||
{ "file": "template.schema.json", "digest": "TBD" },
|
||||
{ "file": "channel.schema.json", "digest": "TBD" },
|
||||
{ "file": "receipt.schema.json", "digest": "TBD" },
|
||||
{ "file": "webhook.schema.json", "digest": "TBD" },
|
||||
{ "file": "dlq-notify.schema.json", "digest": "TBD" }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"payloadType": "application/vnd.notify.schema-catalog+json",
|
||||
"payload": "BASE64_ENCODED_NOTIFY_SCHEMA_CATALOG_TBD",
|
||||
"signatures": [],
|
||||
"note": "Placeholder; replace with signed payload once BLAKE3 digest and signing key are available."
|
||||
}
|
||||
15
docs/notifications/schemas/notify-schemas-catalog.json
Normal file
15
docs/notifications/schemas/notify-schemas-catalog.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"catalog_version": "v1.0",
|
||||
"hash_algorithm": "blake3-256",
|
||||
"canonicalization": "json-normalized-utf8",
|
||||
"generated_at": "2025-12-04T00:00:00Z",
|
||||
"schemas": [
|
||||
{ "id": "event-envelope", "file": "event-envelope.schema.json", "version": "v1.0", "digest": "TBD" },
|
||||
{ "id": "rule", "file": "rule.schema.json", "version": "v1.0", "digest": "TBD" },
|
||||
{ "id": "template", "file": "template.schema.json", "version": "v1.0", "digest": "TBD" },
|
||||
{ "id": "channel", "file": "channel.schema.json", "version": "v1.0", "digest": "TBD" },
|
||||
{ "id": "receipt", "file": "receipt.schema.json", "version": "v1.0", "digest": "TBD" },
|
||||
{ "id": "webhook", "file": "webhook.schema.json", "version": "v1.0", "digest": "TBD" },
|
||||
{ "id": "dlq", "file": "dlq-notify.schema.json", "version": "v1.0", "digest": "TBD" }
|
||||
]
|
||||
}
|
||||
21
docs/notifications/schemas/receipt.schema.json
Normal file
21
docs/notifications/schemas/receipt.schema.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://stella-ops.org/notify/schemas/receipt.schema.json",
|
||||
"title": "Notify Delivery Receipt",
|
||||
"type": "object",
|
||||
"required": ["schema_version", "tenant_id", "delivery_id", "rule_id", "channel", "status", "sent_at"],
|
||||
"properties": {
|
||||
"schema_version": { "type": "string", "pattern": "^v[0-9]+\\.[0-9]+$" },
|
||||
"tenant_id": { "type": "string", "minLength": 1 },
|
||||
"delivery_id": { "type": "string", "pattern": "^[0-9a-fA-F-]{18,36}$" },
|
||||
"rule_id": { "type": "string" },
|
||||
"channel": { "type": "string" },
|
||||
"status": { "type": "string", "enum": ["sent", "delivered", "failed", "queued", "acknowledged"] },
|
||||
"attempt": { "type": "integer", "minimum": 1 },
|
||||
"sent_at": { "type": "string", "format": "date-time" },
|
||||
"ack_url": { "type": "string", "format": "uri" },
|
||||
"response": { "type": "object" },
|
||||
"errors": { "type": "array", "items": { "type": "string" } }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
37
docs/notifications/schemas/rule.schema.json
Normal file
37
docs/notifications/schemas/rule.schema.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://stella-ops.org/notify/schemas/rule.schema.json",
|
||||
"title": "Notify Rule",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"schema_version",
|
||||
"tenant_id",
|
||||
"rule_id",
|
||||
"name",
|
||||
"sources",
|
||||
"predicates",
|
||||
"actions",
|
||||
"approvals_required"
|
||||
],
|
||||
"properties": {
|
||||
"schema_version": { "type": "string", "pattern": "^v[0-9]+\\.[0-9]+$" },
|
||||
"tenant_id": { "type": "string", "minLength": 1 },
|
||||
"rule_id": { "type": "string", "pattern": "^[A-Z0-9_-]{4,64}$" },
|
||||
"name": { "type": "string", "minLength": 1 },
|
||||
"description": { "type": "string" },
|
||||
"severity": { "type": "string", "enum": ["info", "low", "medium", "high", "critical"] },
|
||||
"sources": { "type": "array", "items": { "type": "string" }, "minItems": 1 },
|
||||
"predicates": { "type": "array", "items": { "type": "object" }, "minItems": 1 },
|
||||
"actions": {
|
||||
"type": "array",
|
||||
"items": { "type": "object" },
|
||||
"minItems": 1
|
||||
},
|
||||
"approvals_required": { "type": "integer", "minimum": 0, "maximum": 3 },
|
||||
"quiet_hours": { "type": "array", "items": { "type": "string" } },
|
||||
"simulation_required": { "type": "boolean", "default": true },
|
||||
"created_at": { "type": "string", "format": "date-time" },
|
||||
"updated_at": { "type": "string", "format": "date-time" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
22
docs/notifications/schemas/template.schema.json
Normal file
22
docs/notifications/schemas/template.schema.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://stella-ops.org/notify/schemas/template.schema.json",
|
||||
"title": "Notify Template",
|
||||
"type": "object",
|
||||
"required": ["schema_version", "tenant_id", "template_id", "channel", "locale", "body"],
|
||||
"properties": {
|
||||
"schema_version": { "type": "string", "pattern": "^v[0-9]+\\.[0-9]+$" },
|
||||
"tenant_id": { "type": "string", "minLength": 1 },
|
||||
"template_id": { "type": "string", "pattern": "^[A-Z0-9_-]{4,64}$" },
|
||||
"channel": { "type": "string", "enum": ["email", "slack", "teams", "webhook", "sms"] },
|
||||
"locale": { "type": "string", "pattern": "^[a-z]{2}(-[A-Z]{2})?$" },
|
||||
"subject": { "type": "string" },
|
||||
"body": { "type": "string" },
|
||||
"helpers": { "type": "object", "additionalProperties": { "type": "string" } },
|
||||
"merge_fields": { "type": "array", "items": { "type": "string" } },
|
||||
"preview_hash": { "type": "string" },
|
||||
"created_at": { "type": "string", "format": "date-time" },
|
||||
"updated_at": { "type": "string", "format": "date-time" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
20
docs/notifications/schemas/webhook.schema.json
Normal file
20
docs/notifications/schemas/webhook.schema.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://stella-ops.org/notify/schemas/webhook.schema.json",
|
||||
"title": "Notify Webhook Payload",
|
||||
"type": "object",
|
||||
"required": ["schema_version", "tenant_id", "delivery_id", "signature", "body"],
|
||||
"properties": {
|
||||
"schema_version": { "type": "string", "pattern": "^v[0-9]+\\.[0-9]+$" },
|
||||
"tenant_id": { "type": "string", "minLength": 1 },
|
||||
"delivery_id": { "type": "string", "pattern": "^[0-9a-fA-F-]{18,36}$" },
|
||||
"signature": { "type": "string" },
|
||||
"hmac_id": { "type": "string" },
|
||||
"body": { "type": "object" },
|
||||
"sent_at": { "type": "string", "format": "date-time" },
|
||||
"nonce": { "type": "string" },
|
||||
"audience": { "type": "string" },
|
||||
"expires_at": { "type": "string", "format": "date-time" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
Reference in New Issue
Block a user