Initial commit: notification-elements-demo app

Interactive Angular 19 demo for @sda/notification-elements-ui with
6 sections: Bell & Feed, Notification Center, Inbox, Comments &
Threads, Mention Input, and Full-Featured layout. Includes mock
data, dark mode toggle, and real-time event log.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Giuliano Silvestro
2026-02-13 21:49:19 +10:00
commit 5d0c9ec7eb
36473 changed files with 3778146 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
export declare class CompressionTable {
static create(value: unknown): CompressionTable;
protected integers: Set<number>;
protected nonIntegers: Set<unknown>;
protected table: unknown[];
protected map: Map<unknown, number>;
addInteger(int: number): void;
addLiteral(value: number | string | unknown): void;
walk(value: unknown): void;
finalize(): void;
getIndex(value: unknown): number;
getTable(): unknown[];
compress(value: unknown): unknown;
}

View File

@@ -0,0 +1,169 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CompressionTable = void 0;
const JsonPackExtension_1 = require("../JsonPackExtension");
const isSafeInteger = Number.isSafeInteger;
class CompressionTable {
constructor() {
this.integers = new Set();
this.nonIntegers = new Set();
this.table = [];
this.map = new Map();
}
static create(value) {
const table = new CompressionTable();
table.walk(value);
table.finalize();
return table;
}
addInteger(int) {
this.integers.add(int);
}
addLiteral(value) {
if (isSafeInteger(value)) {
this.addInteger(value);
return;
}
this.nonIntegers.add(value);
}
walk(value) {
switch (typeof value) {
case 'object': {
if (!value)
return this.addLiteral(null);
const constructor = value.constructor;
switch (constructor) {
case Object: {
const obj = value;
for (const key in obj) {
this.addLiteral(key);
this.walk(obj[key]);
}
break;
}
case Array: {
const arr = value;
const len = arr.length;
for (let i = 0; i < len; i++)
this.walk(arr[i]);
break;
}
case Map: {
const map = value;
map.forEach((value, key) => {
this.walk(key);
this.walk(value);
});
break;
}
case Set: {
const set = value;
set.forEach((value) => {
this.walk(value);
});
break;
}
case JsonPackExtension_1.JsonPackExtension: {
const ext = value;
this.addInteger(ext.tag);
this.walk(ext.val);
}
}
return;
}
default:
return this.addLiteral(value);
}
}
finalize() {
const integers = Array.from(this.integers);
integers.sort((a, b) => a - b);
const len = integers.length;
const table = this.table;
const map = this.map;
if (len > 0) {
const first = integers[0];
table.push(first);
map.set(first, 0);
let last = first;
for (let i = 1; i < len; i++) {
const int = integers[i];
table.push(int - last);
map.set(int, i);
last = int;
}
}
const nonIntegers = Array.from(this.nonIntegers);
nonIntegers.sort();
const lenNonIntegers = nonIntegers.length;
for (let i = 0; i < lenNonIntegers; i++) {
const value = nonIntegers[i];
table.push(value);
map.set(value, len + i);
}
this.integers.clear();
this.nonIntegers.clear();
}
getIndex(value) {
const index = this.map.get(value);
if (index === undefined)
throw new Error(`Value [${value}] not found in compression table.`);
return index;
}
getTable() {
return this.table;
}
compress(value) {
switch (typeof value) {
case 'object': {
if (!value)
return this.getIndex(null);
const constructor = value.constructor;
switch (constructor) {
case Object: {
const obj = value;
const newObj = {};
for (const key in obj)
newObj[this.getIndex(key)] = this.compress(obj[key]);
return newObj;
}
case Array: {
const arr = value;
const newArr = [];
const len = arr.length;
for (let i = 0; i < len; i++)
newArr.push(this.compress(arr[i]));
return newArr;
}
case Map: {
const map = value;
const newMap = new Map();
map.forEach((value, key) => {
newMap.set(this.compress(key), this.compress(value));
});
return newMap;
}
case Set: {
const set = value;
const newSet = new Set();
set.forEach((value) => {
newSet.add(this.compress(value));
});
break;
}
case JsonPackExtension_1.JsonPackExtension: {
const ext = value;
const newExt = new JsonPackExtension_1.JsonPackExtension(this.getIndex(ext.tag), this.compress(ext.val));
return newExt;
}
}
throw new Error('UNEXPECTED_OBJECT');
}
default: {
return this.getIndex(value);
}
}
}
}
exports.CompressionTable = CompressionTable;
//# sourceMappingURL=CompressionTable.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,6 @@
export declare class DecompressionTable {
protected readonly table: unknown[];
importTable(rleTable: unknown[]): void;
getLiteral(index: number): unknown;
decompress(value: unknown): unknown;
}

View File

@@ -0,0 +1,96 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DecompressionTable = void 0;
const JsonPackExtension_1 = require("../JsonPackExtension");
const isSafeInteger = Number.isSafeInteger;
class DecompressionTable {
constructor() {
this.table = [];
}
importTable(rleTable) {
const length = rleTable.length;
if (!length)
return;
const table = this.table;
const first = rleTable[0];
table.push(first);
let i = 1;
if (isSafeInteger(first)) {
let prev = first;
let value;
while (i < length) {
value = rleTable[i];
if (isSafeInteger(value)) {
prev = prev + value;
table.push(prev);
i++;
}
else {
break;
}
}
}
while (i < length)
table.push(rleTable[i++]);
}
getLiteral(index) {
const table = this.table;
return table[index];
}
decompress(value) {
switch (typeof value) {
case 'number': {
return this.getLiteral(value);
}
case 'object': {
if (!value)
return null;
const constructor = value.constructor;
switch (constructor) {
case Object: {
const obj = value;
const newObj = {};
for (const key in obj)
newObj[String(this.getLiteral(Number(key)))] = this.decompress(obj[key]);
return newObj;
}
case Array: {
const arr = value;
const newArr = [];
const len = arr.length;
for (let i = 0; i < len; i++)
newArr.push(this.decompress(arr[i]));
return newArr;
}
case Map: {
const map = value;
const newMap = new Map();
map.forEach((value, key) => {
newMap.set(this.decompress(key), this.decompress(value));
});
return newMap;
}
case Set: {
const set = value;
const newSet = new Set();
set.forEach((value) => {
newSet.add(this.decompress(value));
});
break;
}
case JsonPackExtension_1.JsonPackExtension: {
const ext = value;
const newExt = new JsonPackExtension_1.JsonPackExtension(Number(this.getLiteral(ext.tag)), this.decompress(ext.val));
return newExt;
}
}
return value;
}
default: {
return value;
}
}
}
}
exports.DecompressionTable = DecompressionTable;
//# sourceMappingURL=DecompressionTable.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DecompressionTable.js","sourceRoot":"","sources":["../../src/util/DecompressionTable.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1 @@
export declare const toDataUri: (buf: Uint8Array, params?: Record<string, string | number>) => string;

View File

@@ -0,0 +1,12 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.toDataUri = void 0;
const toBase64_1 = require("@jsonjoy.com/base64/lib/toBase64");
const toDataUri = (buf, params) => {
let uri = 'data:application/octet-stream;base64';
for (const key in params)
uri += `;${key}=${params[key]}`;
return uri + ',' + (0, toBase64_1.toBase64)(buf);
};
exports.toDataUri = toDataUri;
//# sourceMappingURL=toDataUri.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"toDataUri.js","sourceRoot":"","sources":["../../../src/util/buffers/toDataUri.ts"],"names":[],"mappings":";;;AAAA,+DAA0D;AAEnD,MAAM,SAAS,GAAG,CAAC,GAAe,EAAE,MAAwC,EAAU,EAAE;IAC7F,IAAI,GAAG,GAAG,sCAAsC,CAAC;IACjD,KAAK,MAAM,GAAG,IAAI,MAAM;QAAE,GAAG,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1D,OAAO,GAAG,GAAG,GAAG,GAAG,IAAA,mBAAQ,EAAC,GAAG,CAAC,CAAC;AACnC,CAAC,CAAC;AAJW,QAAA,SAAS,aAIpB"}