@retalia/pos-components 0.0.4 → 0.0.6

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 (49) hide show
  1. package/README.md +24 -1
  2. package/fesm2022/retalia-pos-components-services.mjs +171 -0
  3. package/fesm2022/retalia-pos-components-services.mjs.map +1 -0
  4. package/fesm2022/retalia-pos-components.mjs +1089 -0
  5. package/fesm2022/retalia-pos-components.mjs.map +1 -0
  6. package/package.json +43 -17
  7. package/types/retalia-pos-components-services.d.ts +168 -0
  8. package/types/retalia-pos-components.d.ts +300 -0
  9. package/eslint.config.js +0 -32
  10. package/ng-package.json +0 -14
  11. package/src/lib/basket/pos-basket.html +0 -124
  12. package/src/lib/basket/pos-basket.scss +0 -285
  13. package/src/lib/basket/pos-basket.spec.ts +0 -198
  14. package/src/lib/basket/pos-basket.stories.ts +0 -114
  15. package/src/lib/basket/pos-basket.ts +0 -142
  16. package/src/lib/item-entry/pos-item-entry.html +0 -41
  17. package/src/lib/item-entry/pos-item-entry.scss +0 -145
  18. package/src/lib/item-entry/pos-item-entry.spec.ts +0 -123
  19. package/src/lib/item-entry/pos-item-entry.stories.ts +0 -31
  20. package/src/lib/item-entry/pos-item-entry.ts +0 -81
  21. package/src/lib/login/pos-login.html +0 -82
  22. package/src/lib/login/pos-login.scss +0 -238
  23. package/src/lib/login/pos-login.spec.ts +0 -89
  24. package/src/lib/login/pos-login.stories.ts +0 -36
  25. package/src/lib/login/pos-login.ts +0 -150
  26. package/src/lib/receipt/pos-receipt.html +0 -116
  27. package/src/lib/receipt/pos-receipt.scss +0 -367
  28. package/src/lib/receipt/pos-receipt.spec.ts +0 -188
  29. package/src/lib/receipt/pos-receipt.stories.ts +0 -163
  30. package/src/lib/receipt/pos-receipt.ts +0 -129
  31. package/src/lib/tender/pos-tender.html +0 -79
  32. package/src/lib/tender/pos-tender.scss +0 -318
  33. package/src/lib/tender/pos-tender.spec.ts +0 -150
  34. package/src/lib/tender/pos-tender.stories.ts +0 -47
  35. package/src/lib/tender/pos-tender.ts +0 -154
  36. package/src/lib/tokens/pos-theme-css.spec.ts +0 -75
  37. package/src/lib/tokens/pos-theme-css.ts +0 -123
  38. package/src/lib/tokens/pos-token-catalog.ts +0 -514
  39. package/src/lib/tokens/pos-tokens.html +0 -351
  40. package/src/lib/tokens/pos-tokens.scss +0 -437
  41. package/src/lib/tokens/pos-tokens.spec.ts +0 -164
  42. package/src/lib/tokens/pos-tokens.stories.ts +0 -22
  43. package/src/lib/tokens/pos-tokens.ts +0 -208
  44. package/src/public-api.ts +0 -37
  45. package/tsconfig.lib.json +0 -14
  46. package/tsconfig.lib.prod.json +0 -11
  47. package/tsconfig.spec.json +0 -11
  48. /package/{src/styles → styles}/styles.css +0 -0
  49. /package/{src/styles → styles}/tokens.css +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retalia-pos-components.mjs","sources":["../../../projects/pos-components/src/lib/login/pos-login.ts","../../../projects/pos-components/src/lib/login/pos-login.html","../../../projects/pos-components/src/lib/basket/pos-basket.ts","../../../projects/pos-components/src/lib/basket/pos-basket.html","../../../projects/pos-components/src/lib/item-entry/pos-item-entry.ts","../../../projects/pos-components/src/lib/item-entry/pos-item-entry.html","../../../projects/pos-components/src/lib/tender/pos-tender.ts","../../../projects/pos-components/src/lib/tender/pos-tender.html","../../../projects/pos-components/src/lib/receipt/pos-receipt.ts","../../../projects/pos-components/src/lib/receipt/pos-receipt.html","../../../projects/pos-components/src/lib/tokens/pos-token-catalog.ts","../../../projects/pos-components/src/lib/tokens/pos-theme-css.ts","../../../projects/pos-components/src/lib/tokens/pos-tokens.ts","../../../projects/pos-components/src/lib/tokens/pos-tokens.html","../../../projects/pos-components/src/public-api.ts","../../../projects/pos-components/src/retalia-pos-components.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\n\r\nexport type PosLoginIntent =\r\n | { readonly type: 'login.key'; readonly key: string }\r\n | { readonly type: 'login.backspace' }\r\n | { readonly type: 'login.next'; readonly clerkNumber: string }\r\n | { readonly type: 'login.submit'; readonly clerkNumber: string; readonly password: string }\r\n | { readonly type: 'login.back' };\r\n\r\n/** Display-only login/session state from the host envelope — not an API DTO. */\r\nexport type PosLoginSessionStatus = 'signedOut' | 'busy' | 'signedIn';\r\n\r\nexport interface PosLoginSessionState {\r\n readonly status: PosLoginSessionStatus;\r\n readonly displayName?: string;\r\n}\r\n\r\nconst DEFAULT_SESSION: PosLoginSessionState = { status: 'signedOut' };\r\n\r\ntype LoginStage = 'clerkNumber' | 'password';\r\n\r\nconst KEYPAD_ROWS: readonly (readonly string[])[] = [\r\n ['1', '2', '3'],\r\n ['4', '5', '6'],\r\n ['7', '8', '9'],\r\n ['0', '.', '←'],\r\n];\r\n\r\n@Component({\r\n selector: 'pos-login',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-login.html',\r\n styleUrl: './pos-login.scss',\r\n host: {\r\n class: 'pos-login',\r\n },\r\n})\r\nexport class PosLogin {\r\n readonly errorMessage = input('');\r\n readonly session = input<PosLoginSessionState>(DEFAULT_SESSION);\r\n\r\n readonly titleClerkNumber = input('Enter Clerk Number');\r\n readonly titleClerkPassword = input('Enter Clerk Password');\r\n readonly nextLabel = input('Next');\r\n readonly loginLabel = input('Login');\r\n\r\n readonly action = output<PosLoginIntent>();\r\n\r\n protected readonly keypadRows = KEYPAD_ROWS;\r\n protected readonly inputValue = signal('');\r\n protected readonly stage = signal<LoginStage>('clerkNumber');\r\n private readonly clerkNumber = signal('');\r\n\r\n protected readonly title = computed(() =>\r\n this.stage() === 'clerkNumber'\r\n ? this.titleClerkNumber()\r\n : this.titleClerkPassword(),\r\n );\r\n\r\n protected readonly maskInput = computed(() => this.stage() === 'password');\r\n\r\n protected readonly showBack = computed(() => this.stage() === 'password');\r\n\r\n protected readonly primaryLabel = computed(() =>\r\n this.stage() === 'password' ? this.loginLabel() : this.nextLabel(),\r\n );\r\n\r\n protected readonly primaryEnabled = computed(\r\n () => this.inputValue().length > 0 && !this.interactionLocked(),\r\n );\r\n\r\n protected readonly interactionLocked = computed(() => {\r\n const status = this.session().status;\r\n return status === 'busy' || status === 'signedIn';\r\n });\r\n\r\n protected readonly sessionStatusText = computed(() => {\r\n const current = this.session();\r\n if (current.status === 'busy') {\r\n return 'Signing in…';\r\n }\r\n if (current.status === 'signedIn') {\r\n return current.displayName\r\n ? `Signed in as ${current.displayName}`\r\n : 'Signed in';\r\n }\r\n return '';\r\n });\r\n\r\n protected onKeypad(key: string): void {\r\n if (this.interactionLocked()) {\r\n return;\r\n }\r\n\r\n if (key === '←') {\r\n this.inputValue.update((value) => value.slice(0, -1));\r\n this.action.emit({ type: 'login.backspace' });\r\n return;\r\n }\r\n\r\n if (this.inputValue().length >= 12) {\r\n return;\r\n }\r\n\r\n this.inputValue.update((value) => value + key);\r\n this.action.emit({ type: 'login.key', key });\r\n }\r\n\r\n protected onPrimary(): void {\r\n if (this.interactionLocked()) {\r\n return;\r\n }\r\n\r\n const value = this.inputValue();\r\n if (!value) {\r\n return;\r\n }\r\n\r\n if (this.stage() === 'clerkNumber') {\r\n this.clerkNumber.set(value);\r\n this.inputValue.set('');\r\n this.stage.set('password');\r\n this.action.emit({ type: 'login.next', clerkNumber: value });\r\n return;\r\n }\r\n\r\n this.action.emit({\r\n type: 'login.submit',\r\n clerkNumber: this.clerkNumber(),\r\n password: value,\r\n });\r\n }\r\n\r\n protected onBack(): void {\r\n if (this.interactionLocked()) {\r\n return;\r\n }\r\n\r\n this.inputValue.set(this.clerkNumber());\r\n this.stage.set('clerkNumber');\r\n this.action.emit({ type: 'login.back' });\r\n }\r\n}\r\n","<section class=\"pos-login__panel\" [attr.aria-busy]=\"session().status === 'busy' ? true : null\">\r\n <header class=\"pos-login__header\">\r\n <p class=\"pos-login__kicker\">Adaptive POS</p>\r\n <h1 class=\"pos-login__title\">{{ title() }}</h1>\r\n </header>\r\n\r\n <div class=\"pos-login__status\" aria-live=\"polite\">\r\n @if (sessionStatusText()) {\r\n <p>{{ sessionStatusText() }}</p>\r\n }\r\n @if (errorMessage()) {\r\n <p class=\"pos-login__error\">{{ errorMessage() }}</p>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-login__body\">\r\n <div class=\"pos-login__display\">\r\n <input\r\n class=\"pos-login__input\"\r\n [attr.type]=\"maskInput() ? 'password' : 'text'\"\r\n [value]=\"inputValue()\"\r\n maxlength=\"12\"\r\n readonly\r\n tabindex=\"-1\"\r\n placeholder=\"· · · ·\"\r\n (keydown)=\"$event.preventDefault()\"\r\n aria-label=\"Login code\"\r\n />\r\n </div>\r\n\r\n <div class=\"pos-login__keypad\" role=\"group\" aria-label=\"Keypad\">\r\n @for (row of keypadRows; track $index) {\r\n <div class=\"pos-login__keypad-row\">\r\n @for (key of row; track key) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-login__key\"\r\n [class.pos-login__key--action]=\"key === '←' || key === '.'\"\r\n [disabled]=\"interactionLocked()\"\r\n (click)=\"onKeypad(key)\"\r\n >\r\n {{ key }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-login__actions\">\r\n @if (showBack()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-login__back\"\r\n aria-label=\"Back\"\r\n [disabled]=\"interactionLocked()\"\r\n (click)=\"onBack()\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <path\r\n d=\"M15 6 9 12l6 6\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>Back</span>\r\n </button>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-login__primary\"\r\n [class.pos-login__primary--disabled]=\"!primaryEnabled()\"\r\n [disabled]=\"!primaryEnabled()\"\r\n (click)=\"onPrimary()\"\r\n >\r\n {{ primaryLabel() }}\r\n </button>\r\n </div>\r\n </div>\r\n</section>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n output,\r\n} from '@angular/core';\r\n\r\nexport type PosBasketIntent =\r\n | {\r\n readonly type: 'basket.changeQuantity';\r\n readonly lineId: number;\r\n readonly qty: number;\r\n }\r\n | { readonly type: 'basket.voidLine'; readonly lineId: number }\r\n | { readonly type: 'basket.clear' };\r\n\r\n/** Display-only VAT from the host envelope — not calculated here. */\r\nexport interface PosBasketVat {\r\n readonly rate: number;\r\n readonly amount: number;\r\n readonly included: boolean;\r\n}\r\n\r\n/** Display-only basket line from the host envelope — not an API DTO. */\r\nexport interface PosBasketLine {\r\n readonly lineId: number;\r\n readonly sku: string;\r\n readonly name: string;\r\n readonly qty: number;\r\n readonly unitPrice: number;\r\n readonly lineTotal: number;\r\n readonly vat: PosBasketVat;\r\n readonly struckThrough: boolean;\r\n}\r\n\r\n/** Display-only totals from the host envelope — not calculated here. */\r\nexport interface PosBasketTotals {\r\n readonly gross: number;\r\n readonly net: number;\r\n readonly vat: number;\r\n readonly discount: number;\r\n readonly due: number;\r\n readonly currency: string;\r\n}\r\n\r\nconst EMPTY_TOTALS: PosBasketTotals = {\r\n gross: 0,\r\n net: 0,\r\n vat: 0,\r\n discount: 0,\r\n due: 0,\r\n currency: 'EUR',\r\n};\r\n\r\n@Component({\r\n selector: 'pos-basket',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-basket.html',\r\n styleUrl: './pos-basket.scss',\r\n host: {\r\n class: 'pos-basket',\r\n },\r\n})\r\nexport class PosBasket {\r\n readonly lines = input<readonly PosBasketLine[]>([]);\r\n readonly totals = input<PosBasketTotals>(EMPTY_TOTALS);\r\n readonly disabled = input(false);\r\n\r\n readonly title = input('Basket');\r\n readonly emptyMessage = input('Basket is empty');\r\n readonly clearLabel = input('Clear basket');\r\n\r\n readonly action = output<PosBasketIntent>();\r\n\r\n protected readonly hasLines = computed(() => this.lines().length > 0);\r\n\r\n protected readonly canClear = computed(\r\n () => this.hasLines() && !this.disabled(),\r\n );\r\n\r\n protected formatMoney(amount: number): string {\r\n return new Intl.NumberFormat(undefined, {\r\n style: 'currency',\r\n currency: this.totals().currency || 'EUR',\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n }).format(amount);\r\n }\r\n\r\n protected canChangeQuantity(line: PosBasketLine): boolean {\r\n return !this.disabled() && !line.struckThrough;\r\n }\r\n\r\n protected canDecrement(line: PosBasketLine): boolean {\r\n return this.canChangeQuantity(line) && line.qty > 1;\r\n }\r\n\r\n protected canVoid(line: PosBasketLine): boolean {\r\n return this.canChangeQuantity(line);\r\n }\r\n\r\n protected onIncrement(line: PosBasketLine): void {\r\n if (!this.canChangeQuantity(line)) {\r\n return;\r\n }\r\n\r\n this.action.emit({\r\n type: 'basket.changeQuantity',\r\n lineId: line.lineId,\r\n qty: line.qty + 1,\r\n });\r\n }\r\n\r\n protected onDecrement(line: PosBasketLine): void {\r\n if (!this.canDecrement(line)) {\r\n return;\r\n }\r\n\r\n this.action.emit({\r\n type: 'basket.changeQuantity',\r\n lineId: line.lineId,\r\n qty: line.qty - 1,\r\n });\r\n }\r\n\r\n protected onVoid(line: PosBasketLine): void {\r\n if (!this.canVoid(line)) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'basket.voidLine', lineId: line.lineId });\r\n }\r\n\r\n protected onClear(): void {\r\n if (!this.canClear()) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'basket.clear' });\r\n }\r\n}\r\n","<section\r\n class=\"pos-basket__panel\"\r\n [attr.aria-busy]=\"disabled() ? true : null\"\r\n>\r\n <header class=\"pos-basket__header\">\r\n <h2 class=\"pos-basket__title\">{{ title() }}</h2>\r\n <p class=\"pos-basket__count\">\r\n {{ lines().length }}\r\n {{ lines().length === 1 ? 'line' : 'lines' }}\r\n </p>\r\n </header>\r\n\r\n <ul class=\"pos-basket__lines\" aria-label=\"Basket lines\">\r\n @if (!hasLines()) {\r\n <li class=\"pos-basket__empty\">{{ emptyMessage() }}</li>\r\n } @else {\r\n @for (line of lines(); track line.lineId) {\r\n <li>\r\n <article\r\n class=\"pos-basket__line\"\r\n [class.pos-basket__line--voided]=\"line.struckThrough\"\r\n >\r\n <div class=\"pos-basket__line-info\">\r\n <h3 class=\"pos-basket__line-name\">{{ line.name }}</h3>\r\n <p class=\"pos-basket__line-sku\">{{ line.sku }}</p>\r\n @if (line.struckThrough) {\r\n <p class=\"pos-basket__line-voided\">Voided</p>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"pos-basket__stepper\"\r\n role=\"group\"\r\n [attr.aria-label]=\"'Quantity for ' + line.name\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"pos-basket__qty-btn\"\r\n aria-label=\"Decrease quantity\"\r\n [disabled]=\"!canDecrement(line)\"\r\n (click)=\"onDecrement(line)\"\r\n >\r\n −\r\n </button>\r\n <span class=\"pos-basket__qty\" aria-live=\"polite\">{{ line.qty }}</span>\r\n <button\r\n type=\"button\"\r\n class=\"pos-basket__qty-btn\"\r\n aria-label=\"Increase quantity\"\r\n [disabled]=\"!canChangeQuantity(line)\"\r\n (click)=\"onIncrement(line)\"\r\n >\r\n +\r\n </button>\r\n </div>\r\n\r\n <div class=\"pos-basket__line-prices\">\r\n <p class=\"pos-basket__unit-price\">{{ formatMoney(line.unitPrice) }}</p>\r\n <p class=\"pos-basket__line-total\">{{ formatMoney(line.lineTotal) }}</p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-basket__void\"\r\n [attr.aria-label]=\"'Void ' + line.name\"\r\n [disabled]=\"!canVoid(line)\"\r\n (click)=\"onVoid(line)\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M6 6l12 12M18 6 6 18\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </article>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n\r\n <footer class=\"pos-basket__footer\">\r\n <dl class=\"pos-basket__totals\" aria-live=\"polite\">\r\n <div class=\"pos-basket__total-row\">\r\n <dt>Gross</dt>\r\n <dd>{{ formatMoney(totals().gross) }}</dd>\r\n </div>\r\n <div class=\"pos-basket__total-row\">\r\n <dt>Net</dt>\r\n <dd>{{ formatMoney(totals().net) }}</dd>\r\n </div>\r\n <div class=\"pos-basket__total-row\">\r\n <dt>VAT</dt>\r\n <dd>{{ formatMoney(totals().vat) }}</dd>\r\n </div>\r\n <div class=\"pos-basket__total-row\">\r\n <dt>Discount</dt>\r\n <dd>{{ formatMoney(totals().discount) }}</dd>\r\n </div>\r\n <div class=\"pos-basket__total-row pos-basket__total-row--due\">\r\n <dt>Due</dt>\r\n <dd>{{ formatMoney(totals().due) }}</dd>\r\n </div>\r\n </dl>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-basket__clear\"\r\n [disabled]=\"!canClear()\"\r\n (click)=\"onClear()\"\r\n >\r\n {{ clearLabel() }}\r\n </button>\r\n </footer>\r\n</section>\r\n","import {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\n\r\nexport type PosItemEntryIntent =\r\n | { readonly type: 'itemEntry.submit'; readonly reference: string };\r\n\r\n@Component({\r\n selector: 'pos-item-entry',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-item-entry.html',\r\n styleUrl: './pos-item-entry.scss',\r\n host: {\r\n class: 'pos-item-entry',\r\n },\r\n})\r\nexport class PosItemEntry {\r\n readonly disabled = input(false);\r\n readonly errorMessage = input('');\r\n readonly autofocus = input(true);\r\n\r\n readonly label = input('Item');\r\n readonly placeholder = input('Scan or enter item');\r\n readonly addLabel = input('Add');\r\n\r\n readonly action = output<PosItemEntryIntent>();\r\n\r\n private readonly itemInput = viewChild<ElementRef<HTMLInputElement>>('itemInput');\r\n\r\n protected readonly reference = signal('');\r\n\r\n protected readonly canSubmit = computed(\r\n () => this.reference().trim().length > 0 && !this.disabled(),\r\n );\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (this.autofocus() && !this.disabled()) {\r\n this.focusInput();\r\n }\r\n });\r\n }\r\n\r\n protected onInput(event: Event): void {\r\n const target = event.target;\r\n if (!(target instanceof HTMLInputElement)) {\r\n return;\r\n }\r\n\r\n this.reference.set(target.value);\r\n }\r\n\r\n protected onSubmit(event: Event): void {\r\n event.preventDefault();\r\n\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n const reference = this.reference().trim();\r\n if (!reference) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'itemEntry.submit', reference });\r\n this.reference.set('');\r\n this.focusInput();\r\n }\r\n\r\n private focusInput(): void {\r\n this.itemInput()?.nativeElement.focus();\r\n }\r\n}\r\n","<section\r\n class=\"pos-item-entry__panel\"\r\n [attr.aria-busy]=\"disabled() ? true : null\"\r\n>\r\n <form class=\"pos-item-entry__form\" (submit)=\"onSubmit($event)\">\r\n <label class=\"pos-item-entry__field\">\r\n <span class=\"pos-item-entry__label\">{{ label() }}</span>\r\n <input\r\n #itemInput\r\n class=\"pos-item-entry__input\"\r\n type=\"text\"\r\n name=\"itemReference\"\r\n autocomplete=\"off\"\r\n spellcheck=\"false\"\r\n [attr.autocorrect]=\"'off'\"\r\n [attr.autocapitalize]=\"'none'\"\r\n enterkeyhint=\"done\"\r\n [placeholder]=\"placeholder()\"\r\n [value]=\"reference()\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\r\n (input)=\"onInput($event)\"\r\n />\r\n </label>\r\n\r\n <button\r\n type=\"submit\"\r\n class=\"pos-item-entry__add\"\r\n [class.pos-item-entry__add--disabled]=\"!canSubmit()\"\r\n [disabled]=\"!canSubmit()\"\r\n >\r\n {{ addLabel() }}\r\n </button>\r\n </form>\r\n\r\n <div class=\"pos-item-entry__status\" aria-live=\"polite\">\r\n @if (errorMessage()) {\r\n <p class=\"pos-item-entry__error\">{{ errorMessage() }}</p>\r\n }\r\n </div>\r\n</section>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\n\r\nexport type PosTenderIntent =\r\n | {\r\n readonly type: 'tender.cash';\r\n readonly amount: number;\r\n };\r\n\r\nconst KEYPAD_ROWS: readonly (readonly string[])[] = [\r\n ['1', '2', '3'],\r\n ['4', '5', '6'],\r\n ['7', '8', '9'],\r\n ['0', '.', '←'],\r\n];\r\n\r\nconst MAX_WHOLE_DIGITS = 8;\r\n\r\nfunction parseCashAmount(raw: string): number | null {\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n const amount = Number(raw);\r\n if (!Number.isFinite(amount) || amount <= 0) {\r\n return null;\r\n }\r\n\r\n return Math.round(amount * 100) / 100;\r\n}\r\n\r\nfunction appendCashKey(current: string, key: string): string {\r\n if (key === '←') {\r\n return current.slice(0, -1);\r\n }\r\n\r\n if (key === '.') {\r\n if (current.includes('.')) {\r\n return current;\r\n }\r\n return current === '' ? '0.' : `${current}.`;\r\n }\r\n\r\n if (!/^\\d$/.test(key)) {\r\n return current;\r\n }\r\n\r\n if (current === '0') {\r\n return key;\r\n }\r\n\r\n const [whole = '', fraction] = current.split('.');\r\n if (fraction !== undefined) {\r\n if (fraction.length >= 2) {\r\n return current;\r\n }\r\n return current + key;\r\n }\r\n\r\n const significant = whole.replace(/^0+/, '');\r\n if (significant.length >= MAX_WHOLE_DIGITS) {\r\n return current;\r\n }\r\n\r\n return current + key;\r\n}\r\n\r\n@Component({\r\n selector: 'pos-tender',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-tender.html',\r\n styleUrl: './pos-tender.scss',\r\n host: {\r\n class: 'pos-tender',\r\n },\r\n})\r\nexport class PosTender {\r\n /** Display-only amount due from the host envelope — not calculated here. */\r\n readonly amountDue = input(0);\r\n /** Display-only change due from the host envelope — not calculated here. */\r\n readonly changeDue = input<number | null>(null);\r\n readonly currency = input('EUR');\r\n readonly disabled = input(false);\r\n readonly errorMessage = input('');\r\n\r\n readonly title = input('Cash tender');\r\n readonly amountDueLabel = input('Amount due');\r\n readonly tenderedLabel = input('Amount tendered');\r\n readonly changeDueLabel = input('Change due');\r\n readonly tenderLabel = input('Tender cash');\r\n readonly processingLabel = input('Processing tender…');\r\n\r\n readonly action = output<PosTenderIntent>();\r\n\r\n protected readonly keypadRows = KEYPAD_ROWS;\r\n protected readonly amountInput = signal('');\r\n\r\n protected readonly parsedAmount = computed(() =>\r\n parseCashAmount(this.amountInput()),\r\n );\r\n\r\n protected readonly canTender = computed(\r\n () => this.parsedAmount() !== null && !this.disabled(),\r\n );\r\n\r\n protected readonly hasChangeDue = computed(() => this.changeDue() !== null);\r\n\r\n protected readonly displayTendered = computed(\r\n () => this.amountInput() || '0',\r\n );\r\n\r\n protected readonly statusText = computed(() => {\r\n if (this.disabled() && !this.hasChangeDue()) {\r\n return this.processingLabel();\r\n }\r\n return '';\r\n });\r\n\r\n protected formatMoney(amount: number): string {\r\n return new Intl.NumberFormat(undefined, {\r\n style: 'currency',\r\n currency: this.currency() || 'EUR',\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n }).format(amount);\r\n }\r\n\r\n protected onKeypad(key: string): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n this.amountInput.update((value) => appendCashKey(value, key));\r\n }\r\n\r\n protected onTender(): void {\r\n if (!this.canTender()) {\r\n return;\r\n }\r\n\r\n const amount = this.parsedAmount();\r\n if (amount === null) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'tender.cash', amount });\r\n }\r\n}\r\n","<section\r\n class=\"pos-tender__panel\"\r\n [attr.aria-busy]=\"disabled() ? true : null\"\r\n>\r\n <header class=\"pos-tender__header\">\r\n <p class=\"pos-tender__kicker\">Adaptive POS</p>\r\n <h2 class=\"pos-tender__title\">{{ title() }}</h2>\r\n </header>\r\n\r\n <div class=\"pos-tender__status\" aria-live=\"polite\">\r\n @if (statusText()) {\r\n <p>{{ statusText() }}</p>\r\n }\r\n @if (errorMessage()) {\r\n <p class=\"pos-tender__error\">{{ errorMessage() }}</p>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-tender__summary\">\r\n <dl class=\"pos-tender__due\">\r\n <div class=\"pos-tender__row\">\r\n <dt>{{ amountDueLabel() }}</dt>\r\n <dd>{{ formatMoney(amountDue()) }}</dd>\r\n </div>\r\n </dl>\r\n\r\n @if (hasChangeDue()) {\r\n <div class=\"pos-tender__change\" role=\"status\" aria-live=\"polite\">\r\n <p class=\"pos-tender__change-label\">{{ changeDueLabel() }}</p>\r\n <p class=\"pos-tender__change-value\">\r\n {{ formatMoney(changeDue() ?? 0) }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"pos-tender__display\"\r\n role=\"group\"\r\n [attr.aria-label]=\"tenderedLabel()\"\r\n >\r\n <p class=\"pos-tender__display-label\">{{ tenderedLabel() }}</p>\r\n <p class=\"pos-tender__display-value\" aria-live=\"polite\">\r\n <span class=\"pos-tender__currency\">{{ currency() }}</span>\r\n <span class=\"pos-tender__digits\">{{ displayTendered() }}</span>\r\n </p>\r\n </div>\r\n\r\n <div class=\"pos-tender__keypad\" role=\"group\" aria-label=\"Cash amount keypad\">\r\n @for (row of keypadRows; track $index) {\r\n <div class=\"pos-tender__keypad-row\">\r\n @for (key of row; track key) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-tender__key\"\r\n [class.pos-tender__key--action]=\"key === '←' || key === '.'\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"key === '←' ? 'Backspace' : key === '.' ? 'Decimal point' : key\"\r\n (click)=\"onKeypad(key)\"\r\n >\r\n {{ key }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-tender__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-tender__primary\"\r\n [class.pos-tender__primary--disabled]=\"!canTender()\"\r\n [disabled]=\"!canTender()\"\r\n (click)=\"onTender()\"\r\n >\r\n {{ tenderLabel() }}\r\n </button>\r\n </div>\r\n</section>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n output,\r\n} from '@angular/core';\r\n\r\nexport interface PosReceiptIntent {\r\n readonly type: 'receipt.newSale';\r\n}\r\n\r\n/** Display-only VAT from the host envelope — not calculated here. */\r\nexport interface PosReceiptVat {\r\n readonly rate: number;\r\n readonly amount: number;\r\n readonly included: boolean;\r\n}\r\n\r\n/** Display-only receipt line from the host envelope — not an API DTO. */\r\nexport interface PosReceiptLine {\r\n readonly lineId: number;\r\n readonly sku: string;\r\n readonly name: string;\r\n readonly qty: number;\r\n readonly unitPrice: number;\r\n readonly lineTotal: number;\r\n readonly vat: PosReceiptVat;\r\n readonly struckThrough: boolean;\r\n}\r\n\r\n/** Display-only totals from the host envelope — not calculated here. */\r\nexport interface PosReceiptTotals {\r\n readonly gross: number;\r\n readonly net: number;\r\n readonly vat: number;\r\n readonly discount: number;\r\n readonly due: number;\r\n readonly currency: string;\r\n}\r\n\r\n/** Display-only tender from the host envelope — not calculated here. */\r\nexport interface PosReceiptPayment {\r\n readonly tender: string;\r\n readonly amount: number;\r\n readonly tendered: number;\r\n readonly change: number;\r\n readonly state: string;\r\n}\r\n\r\n/** Display-only document metadata from the host envelope. */\r\nexport interface PosReceiptDocument {\r\n readonly number: string;\r\n readonly receiptReady: boolean;\r\n}\r\n\r\nconst EMPTY_TOTALS: PosReceiptTotals = {\r\n gross: 0,\r\n net: 0,\r\n vat: 0,\r\n discount: 0,\r\n due: 0,\r\n currency: 'EUR',\r\n};\r\n\r\nconst EMPTY_DOCUMENT: PosReceiptDocument = {\r\n number: '',\r\n receiptReady: false,\r\n};\r\n\r\n@Component({\r\n selector: 'pos-receipt',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-receipt.html',\r\n styleUrl: './pos-receipt.scss',\r\n host: {\r\n class: 'pos-receipt',\r\n },\r\n})\r\nexport class PosReceipt {\r\n readonly lines = input<readonly PosReceiptLine[]>([]);\r\n readonly totals = input<PosReceiptTotals>(EMPTY_TOTALS);\r\n readonly payments = input<readonly PosReceiptPayment[]>([]);\r\n readonly document = input<PosReceiptDocument>(EMPTY_DOCUMENT);\r\n readonly disabled = input(false);\r\n\r\n readonly title = input('Receipt');\r\n readonly emptyMessage = input('No receipt lines');\r\n readonly preparingLabel = input('Preparing receipt…');\r\n readonly readyLabel = input('Receipt ready');\r\n readonly newSaleLabel = input('New sale');\r\n readonly tenderLabel = input('Tender');\r\n readonly amountLabel = input('Amount');\r\n readonly tenderedLabel = input('Tendered');\r\n readonly changeLabel = input('Change');\r\n\r\n readonly action = output<PosReceiptIntent>();\r\n\r\n protected readonly hasLines = computed(() => this.lines().length > 0);\r\n protected readonly hasPayments = computed(() => this.payments().length > 0);\r\n protected readonly hasDocumentNumber = computed(\r\n () => this.document().number.trim().length > 0,\r\n );\r\n\r\n protected readonly statusText = computed(() =>\r\n this.document().receiptReady\r\n ? this.readyLabel()\r\n : this.preparingLabel(),\r\n );\r\n\r\n protected readonly canStartNewSale = computed(() => !this.disabled());\r\n\r\n protected formatMoney(amount: number): string {\r\n return new Intl.NumberFormat(undefined, {\r\n style: 'currency',\r\n currency: this.totals().currency || 'EUR',\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n }).format(amount);\r\n }\r\n\r\n protected onNewSale(): void {\r\n if (!this.canStartNewSale()) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'receipt.newSale' });\r\n }\r\n}\r\n","<section\r\n class=\"pos-receipt__panel\"\r\n [attr.aria-busy]=\"disabled() || !document().receiptReady ? true : null\"\r\n>\r\n <header class=\"pos-receipt__header\">\r\n <div class=\"pos-receipt__heading\">\r\n <p class=\"pos-receipt__kicker\">Adaptive POS</p>\r\n <h2 class=\"pos-receipt__title\">{{ title() }}</h2>\r\n </div>\r\n @if (hasDocumentNumber()) {\r\n <p class=\"pos-receipt__number\" aria-label=\"Document number\">\r\n {{ document().number }}\r\n </p>\r\n }\r\n </header>\r\n\r\n <p class=\"pos-receipt__status\" aria-live=\"polite\">{{ statusText() }}</p>\r\n\r\n <ul class=\"pos-receipt__lines\" aria-label=\"Receipt lines\">\r\n @if (!hasLines()) {\r\n <li class=\"pos-receipt__empty\">{{ emptyMessage() }}</li>\r\n } @else {\r\n @for (line of lines(); track line.lineId) {\r\n <li>\r\n <article\r\n class=\"pos-receipt__line\"\r\n [class.pos-receipt__line--voided]=\"line.struckThrough\"\r\n >\r\n <div class=\"pos-receipt__line-info\">\r\n <h3 class=\"pos-receipt__line-name\">{{ line.name }}</h3>\r\n <p class=\"pos-receipt__line-sku\">{{ line.sku }}</p>\r\n @if (line.struckThrough) {\r\n <p class=\"pos-receipt__line-voided\">Voided</p>\r\n }\r\n </div>\r\n <p class=\"pos-receipt__qty\">{{ line.qty }}</p>\r\n <div class=\"pos-receipt__line-prices\">\r\n <p class=\"pos-receipt__unit-price\">\r\n {{ formatMoney(line.unitPrice) }}\r\n </p>\r\n <p class=\"pos-receipt__line-total\">\r\n {{ formatMoney(line.lineTotal) }}\r\n </p>\r\n </div>\r\n </article>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n\r\n <div class=\"pos-receipt__summary\">\r\n <dl class=\"pos-receipt__totals\" aria-live=\"polite\">\r\n <div class=\"pos-receipt__row\">\r\n <dt>Gross</dt>\r\n <dd>{{ formatMoney(totals().gross) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row\">\r\n <dt>Net</dt>\r\n <dd>{{ formatMoney(totals().net) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row\">\r\n <dt>VAT</dt>\r\n <dd>{{ formatMoney(totals().vat) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row\">\r\n <dt>Discount</dt>\r\n <dd>{{ formatMoney(totals().discount) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row pos-receipt__row--due\">\r\n <dt>Due</dt>\r\n <dd>{{ formatMoney(totals().due) }}</dd>\r\n </div>\r\n </dl>\r\n\r\n @if (hasPayments()) {\r\n <section class=\"pos-receipt__tender\">\r\n <h3 class=\"pos-receipt__tender-title\">{{ tenderLabel() }}</h3>\r\n <ul class=\"pos-receipt__payments\">\r\n @for (payment of payments(); track $index) {\r\n <li class=\"pos-receipt__payment\">\r\n <header class=\"pos-receipt__payment-header\">\r\n <p class=\"pos-receipt__payment-tender\">{{ payment.tender }}</p>\r\n <p class=\"pos-receipt__payment-state\">{{ payment.state }}</p>\r\n </header>\r\n <dl class=\"pos-receipt__payment-amounts\">\r\n <div class=\"pos-receipt__row\">\r\n <dt>{{ amountLabel() }}</dt>\r\n <dd>{{ formatMoney(payment.amount) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row\">\r\n <dt>{{ tenderedLabel() }}</dt>\r\n <dd>{{ formatMoney(payment.tendered) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row pos-receipt__row--change\">\r\n <dt>{{ changeLabel() }}</dt>\r\n <dd>{{ formatMoney(payment.change) }}</dd>\r\n </div>\r\n </dl>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-receipt__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-receipt__new-sale\"\r\n [disabled]=\"!canStartNewSale()\"\r\n (click)=\"onNewSale()\"\r\n >\r\n {{ newSaleLabel() }}\r\n </button>\r\n </div>\r\n</section>\r\n","/**\r\n * Theme-lab catalog. Default values must stay in sync with `styles/tokens.css`.\r\n * The lab never writes that file; edits are live overrides only.\r\n */\r\nexport type PosTokenKind =\r\n | 'color'\r\n | 'length'\r\n | 'font-family'\r\n | 'font-weight'\r\n | 'other';\r\n\r\nexport type PosTokenGroup = 'color' | 'radius' | 'space' | 'type' | 'control';\r\n\r\nexport type PosTokenPreview =\r\n | 'color'\r\n | 'radius'\r\n | 'space'\r\n | 'font-size'\r\n | 'font-family'\r\n | 'font-weight'\r\n | 'letter-spacing'\r\n | 'size';\r\n\r\nexport interface PosTokenSwatch {\r\n readonly name: string;\r\n readonly variable: string;\r\n}\r\n\r\nexport interface PosTokenDefinition extends PosTokenSwatch {\r\n readonly kind: PosTokenKind;\r\n readonly group: PosTokenGroup;\r\n readonly preview: PosTokenPreview;\r\n readonly defaultValue: string;\r\n}\r\n\r\nexport interface PosTokenSample {\r\n readonly id: string;\r\n readonly label: string;\r\n readonly variables: readonly string[];\r\n}\r\n\r\nexport const POS_TOKEN_CATALOG: readonly PosTokenDefinition[] = [\r\n {\r\n name: 'Primary',\r\n variable: '--pos-color-primary',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#c9b5f0',\r\n },\r\n {\r\n name: 'On primary',\r\n variable: '--pos-color-on-primary',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#333333',\r\n },\r\n {\r\n name: 'Success',\r\n variable: '--pos-color-success',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#16dbcc',\r\n },\r\n {\r\n name: 'On success',\r\n variable: '--pos-color-on-success',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#333333',\r\n },\r\n {\r\n name: 'Danger',\r\n variable: '--pos-color-danger',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#fe5c73',\r\n },\r\n {\r\n name: 'On danger',\r\n variable: '--pos-color-on-danger',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#ffffff',\r\n },\r\n {\r\n name: 'Secondary',\r\n variable: '--pos-color-secondary',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#16dbcc',\r\n },\r\n {\r\n name: 'Warning',\r\n variable: '--pos-color-warning',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#f0ad4e',\r\n },\r\n {\r\n name: 'Text',\r\n variable: '--pos-color-text',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#333333',\r\n },\r\n {\r\n name: 'Text muted',\r\n variable: '--pos-color-text-muted',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#999999',\r\n },\r\n {\r\n name: 'Surface',\r\n variable: '--pos-color-surface',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#ffffff',\r\n },\r\n {\r\n name: 'Surface muted',\r\n variable: '--pos-color-surface-muted',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#f5f5f5',\r\n },\r\n {\r\n name: 'Panel',\r\n variable: '--pos-color-panel',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#f5f5f5',\r\n },\r\n {\r\n name: 'Panel elevated',\r\n variable: '--pos-color-panel-elevated',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#ffffff',\r\n },\r\n {\r\n name: 'Ink',\r\n variable: '--pos-color-ink',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#333333',\r\n },\r\n {\r\n name: 'Border',\r\n variable: '--pos-color-border',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#dddddd',\r\n },\r\n {\r\n name: 'Disabled',\r\n variable: '--pos-color-disabled',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#dddddd',\r\n },\r\n {\r\n name: 'On disabled',\r\n variable: '--pos-color-on-disabled',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#999999',\r\n },\r\n {\r\n name: 'Display',\r\n variable: '--pos-color-display',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#333333',\r\n },\r\n {\r\n name: 'On display',\r\n variable: '--pos-color-on-display',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#ffffff',\r\n },\r\n {\r\n name: 'Key',\r\n variable: '--pos-color-key',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#ffffff',\r\n },\r\n {\r\n name: 'Key border',\r\n variable: '--pos-color-key-border',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#dddddd',\r\n },\r\n {\r\n name: 'Key active',\r\n variable: '--pos-color-key-active',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#c9b5f0',\r\n },\r\n {\r\n name: 'On key active',\r\n variable: '--pos-color-on-key-active',\r\n kind: 'color',\r\n group: 'color',\r\n preview: 'color',\r\n defaultValue: '#333333',\r\n },\r\n {\r\n name: 'Radius sm',\r\n variable: '--pos-radius-sm',\r\n kind: 'length',\r\n group: 'radius',\r\n preview: 'radius',\r\n defaultValue: '4px',\r\n },\r\n {\r\n name: 'Radius md',\r\n variable: '--pos-radius-md',\r\n kind: 'length',\r\n group: 'radius',\r\n preview: 'radius',\r\n defaultValue: '8px',\r\n },\r\n {\r\n name: 'Radius lg',\r\n variable: '--pos-radius-lg',\r\n kind: 'length',\r\n group: 'radius',\r\n preview: 'radius',\r\n defaultValue: '12px',\r\n },\r\n {\r\n name: 'Radius pill',\r\n variable: '--pos-radius-pill',\r\n kind: 'length',\r\n group: 'radius',\r\n preview: 'radius',\r\n defaultValue: '9999px',\r\n },\r\n {\r\n name: 'Space xs',\r\n variable: '--pos-space-xs',\r\n kind: 'length',\r\n group: 'space',\r\n preview: 'space',\r\n defaultValue: '4px',\r\n },\r\n {\r\n name: 'Space sm',\r\n variable: '--pos-space-sm',\r\n kind: 'length',\r\n group: 'space',\r\n preview: 'space',\r\n defaultValue: '8px',\r\n },\r\n {\r\n name: 'Space md',\r\n variable: '--pos-space-md',\r\n kind: 'length',\r\n group: 'space',\r\n preview: 'space',\r\n defaultValue: '12px',\r\n },\r\n {\r\n name: 'Space lg',\r\n variable: '--pos-space-lg',\r\n kind: 'length',\r\n group: 'space',\r\n preview: 'space',\r\n defaultValue: '16px',\r\n },\r\n {\r\n name: 'Space xl',\r\n variable: '--pos-space-xl',\r\n kind: 'length',\r\n group: 'space',\r\n preview: 'space',\r\n defaultValue: '24px',\r\n },\r\n {\r\n name: 'Space 2xl',\r\n variable: '--pos-space-2xl',\r\n kind: 'length',\r\n group: 'space',\r\n preview: 'space',\r\n defaultValue: '40px',\r\n },\r\n {\r\n name: 'Space 3xl',\r\n variable: '--pos-space-3xl',\r\n kind: 'length',\r\n group: 'space',\r\n preview: 'space',\r\n defaultValue: '56px',\r\n },\r\n {\r\n name: 'Font family',\r\n variable: '--pos-font-family',\r\n kind: 'font-family',\r\n group: 'type',\r\n preview: 'font-family',\r\n defaultValue:\r\n \"Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif\",\r\n },\r\n {\r\n name: 'Font family display',\r\n variable: '--pos-font-family-display',\r\n kind: 'font-family',\r\n group: 'type',\r\n preview: 'font-family',\r\n defaultValue:\r\n \"Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif\",\r\n },\r\n {\r\n name: 'Font size sm',\r\n variable: '--pos-font-size-sm',\r\n kind: 'length',\r\n group: 'type',\r\n preview: 'font-size',\r\n defaultValue: '0.8125rem',\r\n },\r\n {\r\n name: 'Font size md',\r\n variable: '--pos-font-size-md',\r\n kind: 'length',\r\n group: 'type',\r\n preview: 'font-size',\r\n defaultValue: '0.875rem',\r\n },\r\n {\r\n name: 'Font size lg',\r\n variable: '--pos-font-size-lg',\r\n kind: 'length',\r\n group: 'type',\r\n preview: 'font-size',\r\n defaultValue: '1.125rem',\r\n },\r\n {\r\n name: 'Font size xl',\r\n variable: '--pos-font-size-xl',\r\n kind: 'length',\r\n group: 'type',\r\n preview: 'font-size',\r\n defaultValue: '1.375rem',\r\n },\r\n {\r\n name: 'Font weight semibold',\r\n variable: '--pos-font-weight-semibold',\r\n kind: 'font-weight',\r\n group: 'type',\r\n preview: 'font-weight',\r\n defaultValue: '600',\r\n },\r\n {\r\n name: 'Font weight bold',\r\n variable: '--pos-font-weight-bold',\r\n kind: 'font-weight',\r\n group: 'type',\r\n preview: 'font-weight',\r\n defaultValue: '700',\r\n },\r\n {\r\n name: 'Letter spacing display',\r\n variable: '--pos-letter-spacing-display',\r\n kind: 'length',\r\n group: 'type',\r\n preview: 'letter-spacing',\r\n defaultValue: '0.28em',\r\n },\r\n {\r\n name: 'Button min height',\r\n variable: '--pos-button-min-height',\r\n kind: 'length',\r\n group: 'control',\r\n preview: 'size',\r\n defaultValue: '48px',\r\n },\r\n {\r\n name: 'Keypad size',\r\n variable: '--pos-keypad-size',\r\n kind: 'length',\r\n group: 'control',\r\n preview: 'size',\r\n defaultValue: '3.25rem',\r\n },\r\n {\r\n name: 'Keypad size md',\r\n variable: '--pos-keypad-size-md',\r\n kind: 'length',\r\n group: 'control',\r\n preview: 'size',\r\n defaultValue: '3.75rem',\r\n },\r\n {\r\n name: 'Keypad size lg',\r\n variable: '--pos-keypad-size-lg',\r\n kind: 'length',\r\n group: 'control',\r\n preview: 'size',\r\n defaultValue: '4.25rem',\r\n },\r\n];\r\n\r\nexport const POS_TOKEN_DEFAULTS: Readonly<Record<string, string>> = Object.freeze(\r\n Object.fromEntries(\r\n POS_TOKEN_CATALOG.map((token) => [token.variable, token.defaultValue]),\r\n ),\r\n);\r\n\r\nexport const POS_TOKEN_BY_VARIABLE: ReadonlyMap<string, PosTokenDefinition> =\r\n new Map(POS_TOKEN_CATALOG.map((token) => [token.variable, token]));\r\n\r\nexport const POS_TOKEN_SAMPLES: readonly PosTokenSample[] = [\r\n {\r\n id: 'primary',\r\n label: 'Primary',\r\n variables: [\r\n '--pos-color-primary',\r\n '--pos-color-on-primary',\r\n '--pos-radius-md',\r\n '--pos-button-min-height',\r\n '--pos-font-weight-bold',\r\n ],\r\n },\r\n {\r\n id: 'success',\r\n label: 'Success',\r\n variables: [\r\n '--pos-color-success',\r\n '--pos-color-on-success',\r\n '--pos-radius-md',\r\n '--pos-button-min-height',\r\n '--pos-font-weight-bold',\r\n ],\r\n },\r\n {\r\n id: 'danger',\r\n label: 'Danger',\r\n variables: [\r\n '--pos-color-danger',\r\n '--pos-color-on-danger',\r\n '--pos-radius-md',\r\n '--pos-button-min-height',\r\n '--pos-font-weight-bold',\r\n ],\r\n },\r\n {\r\n id: 'disabled',\r\n label: 'Disabled',\r\n variables: [\r\n '--pos-color-disabled',\r\n '--pos-color-on-disabled',\r\n '--pos-radius-md',\r\n '--pos-button-min-height',\r\n ],\r\n },\r\n {\r\n id: 'text',\r\n label: 'Body text',\r\n variables: [\r\n '--pos-color-text',\r\n '--pos-color-text-muted',\r\n '--pos-font-family',\r\n '--pos-font-size-md',\r\n ],\r\n },\r\n {\r\n id: 'error',\r\n label: 'Danger / error message',\r\n variables: ['--pos-color-danger', '--pos-font-weight-semibold'],\r\n },\r\n];\r\n\r\nexport function tokensInGroup(\r\n group: PosTokenGroup,\r\n): readonly PosTokenDefinition[] {\r\n return POS_TOKEN_CATALOG.filter((token) => token.group === group);\r\n}\r\n\r\nexport function lookupPosTokens(\r\n variables: readonly string[],\r\n): readonly PosTokenDefinition[] {\r\n return variables.flatMap((variable) => {\r\n const token = POS_TOKEN_BY_VARIABLE.get(variable);\r\n return token ? [token] : [];\r\n });\r\n}\r\n","import {\r\n POS_TOKEN_BY_VARIABLE,\r\n POS_TOKEN_CATALOG,\r\n POS_TOKEN_DEFAULTS,\r\n type PosTokenKind,\r\n} from './pos-token-catalog';\r\n\r\nconst TOKEN_DECL = /(--pos-[a-z0-9-]+)\\s*:\\s*([^;}{]+)/gi;\r\n\r\nexport const POS_THEME_CSS_FILENAME = 'pos-theme.css';\r\n\r\nconst THEME_CSS_HEADER = `/**\r\n * Adaptive POS theme\r\n * Generated by <pos-tokens>. Load after @retalia/pos-components styles.\r\n * Package defaults are unchanged; this file only overrides --pos-* on :root.\r\n */`;\r\n\r\nexport function normalizePosTokenValue(\r\n kind: PosTokenKind,\r\n value: string,\r\n): string {\r\n const trimmed = value.trim().replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').trim();\r\n if (!trimmed) {\r\n return '';\r\n }\r\n\r\n if (kind === 'color') {\r\n const hex = parseCssHex(trimmed);\r\n if (hex) {\r\n return hex;\r\n }\r\n }\r\n\r\n return trimmed.replace(/\\s*!important$/i, '').trim();\r\n}\r\n\r\nexport function parseCssHex(value: string): string | null {\r\n const trimmed = value.trim();\r\n const short = /^#([0-9a-f]{3})$/i.exec(trimmed)?.[1];\r\n if (short && short.length === 3) {\r\n const [r, g, b] = short;\r\n return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();\r\n }\r\n\r\n if (/^#[0-9a-f]{6}$/i.test(trimmed)) {\r\n return trimmed.toLowerCase();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function parsePosThemeCss(css: string): Readonly<Record<string, string>> {\r\n const result: Record<string, string> = {};\r\n\r\n for (const match of css.matchAll(TOKEN_DECL)) {\r\n const variable = match[1];\r\n const token = POS_TOKEN_BY_VARIABLE.get(variable);\r\n if (!token) {\r\n continue;\r\n }\r\n\r\n const value = normalizePosTokenValue(token.kind, match[2] ?? '');\r\n if (value) {\r\n result[variable] = value;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function resolvedPosTheme(\r\n overrides: Readonly<Record<string, string>>,\r\n): Readonly<Record<string, string>> {\r\n const resolved: Record<string, string> = { ...POS_TOKEN_DEFAULTS };\r\n for (const [variable, value] of Object.entries(overrides)) {\r\n if (variable in POS_TOKEN_DEFAULTS && value.trim()) {\r\n resolved[variable] = value;\r\n }\r\n }\r\n return resolved;\r\n}\r\n\r\nexport function overridesFromThemeValues(\r\n values: Readonly<Record<string, string>>,\r\n): Record<string, string> {\r\n const overrides: Record<string, string> = {};\r\n for (const [variable, value] of Object.entries(values)) {\r\n const token = POS_TOKEN_BY_VARIABLE.get(variable);\r\n if (!token) {\r\n continue;\r\n }\r\n\r\n const normalized = normalizePosTokenValue(token.kind, value);\r\n if (normalized && normalized !== token.defaultValue) {\r\n overrides[variable] = normalized;\r\n }\r\n }\r\n return overrides;\r\n}\r\n\r\nexport function serializePosThemeCss(\r\n values: Readonly<Record<string, string>>,\r\n): string {\r\n const lines = POS_TOKEN_CATALOG.map((token) => {\r\n const value = values[token.variable] ?? token.defaultValue;\r\n return ` ${token.variable}: ${value};`;\r\n });\r\n\r\n return `${THEME_CSS_HEADER}\\n:root {\\n${lines.join('\\n')}\\n}\\n`;\r\n}\r\n\r\nexport function downloadTextFile(filename: string, contents: string): void {\r\n const blob = new Blob([contents], { type: 'text/css;charset=utf-8' });\r\n const url = URL.createObjectURL(blob);\r\n const anchor = document.createElement('a');\r\n anchor.href = url;\r\n anchor.download = filename;\r\n anchor.rel = 'noopener';\r\n document.body.append(anchor);\r\n anchor.click();\r\n anchor.remove();\r\n URL.revokeObjectURL(url);\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport {\r\n POS_TOKEN_BY_VARIABLE,\r\n POS_TOKEN_SAMPLES,\r\n type PosTokenDefinition,\r\n type PosTokenSwatch,\r\n lookupPosTokens,\r\n tokensInGroup,\r\n} from './pos-token-catalog';\r\nimport {\r\n POS_THEME_CSS_FILENAME,\r\n downloadTextFile,\r\n normalizePosTokenValue,\r\n overridesFromThemeValues,\r\n parseCssHex,\r\n parsePosThemeCss,\r\n resolvedPosTheme,\r\n serializePosThemeCss,\r\n} from './pos-theme-css';\r\n\r\nexport type { PosTokenSwatch };\r\n\r\ninterface PosTokenSelection {\r\n readonly id: string;\r\n readonly title: string;\r\n readonly variables: readonly string[];\r\n}\r\n\r\n@Component({\r\n selector: 'pos-tokens',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-tokens.html',\r\n styleUrl: './pos-tokens.scss',\r\n host: {\r\n class: 'pos-tokens',\r\n '[style]': 'themeStyle()',\r\n '(keydown.escape)': 'clearSelection()',\r\n },\r\n})\r\nexport class PosTokens {\r\n protected readonly colorTokens = tokensInGroup('color');\r\n protected readonly radiusTokens = tokensInGroup('radius');\r\n protected readonly spaceTokens = tokensInGroup('space');\r\n protected readonly typeTokens = tokensInGroup('type');\r\n protected readonly controlTokens = tokensInGroup('control');\r\n\r\n private readonly overrides = signal<Record<string, string>>({});\r\n protected readonly selection = signal<PosTokenSelection | null>(null);\r\n protected readonly statusMessage = signal('');\r\n\r\n protected readonly selectedTokens = computed(() => {\r\n const selection = this.selection();\r\n return selection ? lookupPosTokens(selection.variables) : [];\r\n });\r\n\r\n protected readonly hasOverrides = computed(\r\n () => Object.keys(this.overrides()).length > 0,\r\n );\r\n\r\n protected readonly themeStyle = computed(() =>\r\n Object.entries(this.overrides())\r\n .map(([variable, value]) => `${variable}: ${value}`)\r\n .join('; '),\r\n );\r\n\r\n /** Complete :root CSS for the consuming POS. Package defaults are not written. */\r\n themeCss(): string {\r\n return serializePosThemeCss(resolvedPosTheme(this.overrides()));\r\n }\r\n\r\n /** Load a previously exported theme as live overrides. Does not mutate defaults. */\r\n loadThemeCss(css: string): void {\r\n const parsed = parsePosThemeCss(css);\r\n const knownCount = Object.keys(parsed).length;\r\n this.overrides.set(overridesFromThemeValues(parsed));\r\n\r\n if (knownCount === 0) {\r\n this.statusMessage.set('No --pos-* tokens found in that file.');\r\n return;\r\n }\r\n\r\n this.statusMessage.set(\r\n `Imported ${knownCount} tokens as live overrides. Package defaults are unchanged.`,\r\n );\r\n }\r\n\r\n resetTheme(): void {\r\n this.overrides.set({});\r\n this.statusMessage.set('Live overrides cleared. Package defaults restored in this lab.');\r\n }\r\n\r\n protected exportThemeFile(): void {\r\n downloadTextFile(POS_THEME_CSS_FILENAME, this.themeCss());\r\n this.statusMessage.set(\r\n `Downloaded ${POS_THEME_CSS_FILENAME}. Add it after the package stylesheet in the host POS.`,\r\n );\r\n }\r\n\r\n protected async onImportFile(event: Event): Promise<void> {\r\n const input = event.target;\r\n if (!(input instanceof HTMLInputElement) || !input.files?.length) {\r\n return;\r\n }\r\n\r\n const css = await input.files[0].text();\r\n this.loadThemeCss(css);\r\n input.value = '';\r\n }\r\n\r\n protected selectToken(token: PosTokenDefinition): void {\r\n this.selection.set({\r\n id: `token:${token.variable}`,\r\n title: token.name,\r\n variables: [token.variable],\r\n });\r\n }\r\n\r\n protected selectSample(sampleId: string): void {\r\n const sample = POS_TOKEN_SAMPLES.find((item) => item.id === sampleId);\r\n if (!sample) {\r\n return;\r\n }\r\n\r\n this.selection.set({\r\n id: `sample:${sample.id}`,\r\n title: sample.label,\r\n variables: sample.variables,\r\n });\r\n }\r\n\r\n protected clearSelection(): void {\r\n this.selection.set(null);\r\n }\r\n\r\n protected isTokenSelected(variable: string): boolean {\r\n const selection = this.selection();\r\n return selection?.id === `token:${variable}`;\r\n }\r\n\r\n protected isSampleSelected(sampleId: string): boolean {\r\n return this.selection()?.id === `sample:${sampleId}`;\r\n }\r\n\r\n protected isModified(variable: string): boolean {\r\n return variable in this.overrides();\r\n }\r\n\r\n protected currentValue(variable: string): string {\r\n return this.overrides()[variable] ?? POS_TOKEN_BY_VARIABLE.get(variable)?.defaultValue ?? '';\r\n }\r\n\r\n protected defaultValue(variable: string): string {\r\n return POS_TOKEN_BY_VARIABLE.get(variable)?.defaultValue ?? '';\r\n }\r\n\r\n protected colorInputValue(variable: string): string | null {\r\n return parseCssHex(this.currentValue(variable));\r\n }\r\n\r\n protected tokenFieldId(variable: string): string {\r\n return `pos-token-field-${variable.replace(/[^a-z0-9]+/gi, '-')}`;\r\n }\r\n\r\n protected onTokenInput(variable: string, event: Event): void {\r\n const target = event.target;\r\n if (!(target instanceof HTMLInputElement)) {\r\n return;\r\n }\r\n\r\n this.setTokenValue(variable, target.value);\r\n }\r\n\r\n protected resetToken(variable: string): void {\r\n this.overrides.update((current) => {\r\n if (!(variable in current)) {\r\n return current;\r\n }\r\n\r\n const next = { ...current };\r\n delete next[variable];\r\n return next;\r\n });\r\n }\r\n\r\n private setTokenValue(variable: string, raw: string): void {\r\n const token = POS_TOKEN_BY_VARIABLE.get(variable);\r\n if (!token) {\r\n return;\r\n }\r\n\r\n const normalized = normalizePosTokenValue(token.kind, raw);\r\n this.overrides.update((current) => {\r\n const next = { ...current };\r\n if (!normalized || normalized === token.defaultValue) {\r\n delete next[variable];\r\n } else {\r\n next[variable] = normalized;\r\n }\r\n return next;\r\n });\r\n }\r\n}\r\n","<article class=\"pos-tokens__page\">\r\n <header class=\"pos-tokens__intro\">\r\n <p class=\"pos-tokens__kicker\">@retalia/pos-components</p>\r\n <h1 class=\"pos-tokens__title\">Design tokens</h1>\r\n <p class=\"pos-tokens__lede\">\r\n Click a sample or token to edit it. Changes are live overrides in this lab only —\r\n package defaults are never overwritten. Export a complete <code>:root</code> CSS\r\n file for the consuming POS, and import that file back later to resume editing.\r\n </p>\r\n <div class=\"pos-tokens__toolbar\">\r\n <input\r\n #importFile\r\n class=\"pos-tokens__file\"\r\n type=\"file\"\r\n accept=\".css,text/css\"\r\n (change)=\"onImportFile($event)\"\r\n />\r\n <button type=\"button\" class=\"pos-tokens__tool pos-tokens__tool--primary\" (click)=\"exportThemeFile()\">\r\n Export CSS\r\n </button>\r\n <button type=\"button\" class=\"pos-tokens__tool\" (click)=\"importFile.click()\">\r\n Import CSS\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__tool\"\r\n [disabled]=\"!hasOverrides()\"\r\n (click)=\"resetTheme()\"\r\n >\r\n Reset overrides\r\n </button>\r\n </div>\r\n <p class=\"pos-tokens__status\" role=\"status\" aria-live=\"polite\">{{ statusMessage() }}</p>\r\n </header>\r\n\r\n <div class=\"pos-tokens__layout\">\r\n <div class=\"pos-tokens__gallery\">\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-samples\">\r\n <h2 id=\"pos-tokens-samples\" class=\"pos-tokens__heading\">In action</h2>\r\n <p class=\"pos-tokens__hint\">Click a control to edit the tokens it uses.</p>\r\n <div class=\"pos-tokens__samples\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('primary')\"\r\n [attr.aria-pressed]=\"isSampleSelected('primary')\"\r\n (click)=\"selectSample('primary')\"\r\n >\r\n <span class=\"pos-tokens__btn pos-tokens__btn--primary\">Primary</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('success')\"\r\n [attr.aria-pressed]=\"isSampleSelected('success')\"\r\n (click)=\"selectSample('success')\"\r\n >\r\n <span class=\"pos-tokens__btn pos-tokens__btn--success\">Success</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('danger')\"\r\n [attr.aria-pressed]=\"isSampleSelected('danger')\"\r\n (click)=\"selectSample('danger')\"\r\n >\r\n <span class=\"pos-tokens__btn pos-tokens__btn--danger\">Danger</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('disabled')\"\r\n [attr.aria-pressed]=\"isSampleSelected('disabled')\"\r\n (click)=\"selectSample('disabled')\"\r\n >\r\n <span class=\"pos-tokens__btn pos-tokens__btn--disabled\">Disabled</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample pos-tokens__sample--text\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('text')\"\r\n [attr.aria-pressed]=\"isSampleSelected('text')\"\r\n (click)=\"selectSample('text')\"\r\n >\r\n <span class=\"pos-tokens__sample-text\">\r\n Body text · <span class=\"pos-tokens__sample-muted\">muted</span>\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample pos-tokens__sample--text\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('error')\"\r\n [attr.aria-pressed]=\"isSampleSelected('error')\"\r\n (click)=\"selectSample('error')\"\r\n >\r\n <span class=\"pos-tokens__sample-danger\">Danger / error message</span>\r\n </button>\r\n </div>\r\n </section>\r\n\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-colors\">\r\n <h2 id=\"pos-tokens-colors\" class=\"pos-tokens__heading\">Color</h2>\r\n <ul class=\"pos-tokens__swatch-grid\">\r\n @for (token of colorTokens; track token.variable) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__pick\"\r\n [class.pos-tokens__pick--selected]=\"isTokenSelected(token.variable)\"\r\n [class.pos-tokens__pick--modified]=\"isModified(token.variable)\"\r\n [attr.aria-pressed]=\"isTokenSelected(token.variable)\"\r\n (click)=\"selectToken(token)\"\r\n >\r\n <span\r\n class=\"pos-tokens__chip\"\r\n [style.background]=\"'var(' + token.variable + ')'\"\r\n ></span>\r\n <span class=\"pos-tokens__swatch-meta\">\r\n <span class=\"pos-tokens__swatch-name\">\r\n {{ token.name }}\r\n @if (isModified(token.variable)) {\r\n <span class=\"pos-tokens__edited\">Edited</span>\r\n }\r\n </span>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n </span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-radius\">\r\n <h2 id=\"pos-tokens-radius\" class=\"pos-tokens__heading\">Radius</h2>\r\n <ul class=\"pos-tokens__radius-row\">\r\n @for (token of radiusTokens; track token.variable) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__pick\"\r\n [class.pos-tokens__pick--selected]=\"isTokenSelected(token.variable)\"\r\n [class.pos-tokens__pick--modified]=\"isModified(token.variable)\"\r\n [attr.aria-pressed]=\"isTokenSelected(token.variable)\"\r\n (click)=\"selectToken(token)\"\r\n >\r\n <span\r\n class=\"pos-tokens__radius-box\"\r\n [style.border-radius]=\"'var(' + token.variable + ')'\"\r\n ></span>\r\n <span class=\"pos-tokens__swatch-name\">\r\n {{ token.name }}\r\n @if (isModified(token.variable)) {\r\n <span class=\"pos-tokens__edited\">Edited</span>\r\n }\r\n </span>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-space\">\r\n <h2 id=\"pos-tokens-space\" class=\"pos-tokens__heading\">Space</h2>\r\n <ul class=\"pos-tokens__space-list\">\r\n @for (token of spaceTokens; track token.variable) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__pick pos-tokens__pick--row\"\r\n [class.pos-tokens__pick--selected]=\"isTokenSelected(token.variable)\"\r\n [class.pos-tokens__pick--modified]=\"isModified(token.variable)\"\r\n [attr.aria-pressed]=\"isTokenSelected(token.variable)\"\r\n (click)=\"selectToken(token)\"\r\n >\r\n <span\r\n class=\"pos-tokens__space-bar\"\r\n [style.width]=\"'var(' + token.variable + ')'\"\r\n ></span>\r\n <span class=\"pos-tokens__swatch-meta\">\r\n <span class=\"pos-tokens__swatch-name\">\r\n {{ token.name }}\r\n @if (isModified(token.variable)) {\r\n <span class=\"pos-tokens__edited\">Edited</span>\r\n }\r\n </span>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n </span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-type\">\r\n <h2 id=\"pos-tokens-type\" class=\"pos-tokens__heading\">Typography</h2>\r\n <ul class=\"pos-tokens__type-list\">\r\n @for (token of typeTokens; track token.variable) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__pick\"\r\n [class.pos-tokens__pick--selected]=\"isTokenSelected(token.variable)\"\r\n [class.pos-tokens__pick--modified]=\"isModified(token.variable)\"\r\n [attr.aria-pressed]=\"isTokenSelected(token.variable)\"\r\n (click)=\"selectToken(token)\"\r\n >\r\n <span class=\"pos-tokens__swatch-name\">\r\n {{ token.name }}\r\n @if (isModified(token.variable)) {\r\n <span class=\"pos-tokens__edited\">Edited</span>\r\n }\r\n </span>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n @switch (token.preview) {\r\n @case ('font-family') {\r\n <span\r\n class=\"pos-tokens__type-preview\"\r\n [style.font-family]=\"'var(' + token.variable + ')'\"\r\n >\r\n The quick brown fox\r\n </span>\r\n }\r\n @case ('font-size') {\r\n <span\r\n class=\"pos-tokens__type-preview\"\r\n [style.font-size]=\"'var(' + token.variable + ')'\"\r\n >\r\n The quick brown fox\r\n </span>\r\n }\r\n @case ('font-weight') {\r\n <span\r\n class=\"pos-tokens__type-preview\"\r\n [style.font-weight]=\"'var(' + token.variable + ')'\"\r\n >\r\n The quick brown fox\r\n </span>\r\n }\r\n @case ('letter-spacing') {\r\n <span\r\n class=\"pos-tokens__type-preview pos-tokens__type-preview--caps\"\r\n [style.letter-spacing]=\"'var(' + token.variable + ')'\"\r\n >\r\n Display\r\n </span>\r\n }\r\n }\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-controls\">\r\n <h2 id=\"pos-tokens-controls\" class=\"pos-tokens__heading\">Controls</h2>\r\n <ul class=\"pos-tokens__control-list\">\r\n @for (token of controlTokens; track token.variable) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__pick pos-tokens__pick--row\"\r\n [class.pos-tokens__pick--selected]=\"isTokenSelected(token.variable)\"\r\n [class.pos-tokens__pick--modified]=\"isModified(token.variable)\"\r\n [attr.aria-pressed]=\"isTokenSelected(token.variable)\"\r\n (click)=\"selectToken(token)\"\r\n >\r\n <span\r\n class=\"pos-tokens__size-box\"\r\n [style.width]=\"'var(' + token.variable + ')'\"\r\n [style.height]=\"'var(' + token.variable + ')'\"\r\n ></span>\r\n <span class=\"pos-tokens__swatch-meta\">\r\n <span class=\"pos-tokens__swatch-name\">\r\n {{ token.name }}\r\n @if (isModified(token.variable)) {\r\n <span class=\"pos-tokens__edited\">Edited</span>\r\n }\r\n </span>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n </span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n </div>\r\n\r\n <aside class=\"pos-tokens__inspector\" aria-labelledby=\"pos-tokens-inspector-title\">\r\n <div class=\"pos-tokens__inspector-header\">\r\n <h2 id=\"pos-tokens-inspector-title\" class=\"pos-tokens__heading\">\r\n {{ selection()?.title ?? 'Theme editor' }}\r\n </h2>\r\n @if (selection()) {\r\n <button type=\"button\" class=\"pos-tokens__tool pos-tokens__tool--quiet\" (click)=\"clearSelection()\">\r\n Close\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (!selection()) {\r\n <p class=\"pos-tokens__hint\">\r\n Select a sample or token to change its values. Export writes a complete CSS\r\n file the host POS can load after the package stylesheet.\r\n </p>\r\n } @else {\r\n <ul class=\"pos-tokens__fields\">\r\n @for (token of selectedTokens(); track token.variable) {\r\n <li class=\"pos-tokens__field\">\r\n <label class=\"pos-tokens__field-label\" [attr.for]=\"tokenFieldId(token.variable)\">\r\n {{ token.name }}\r\n </label>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n <div class=\"pos-tokens__field-controls\">\r\n @if (token.kind === 'color') {\r\n @if (colorInputValue(token.variable); as hex) {\r\n <input\r\n class=\"pos-tokens__color\"\r\n type=\"color\"\r\n [value]=\"hex\"\r\n [attr.aria-label]=\"token.name + ' color'\"\r\n (input)=\"onTokenInput(token.variable, $event)\"\r\n />\r\n }\r\n }\r\n <input\r\n class=\"pos-tokens__value\"\r\n type=\"text\"\r\n [id]=\"tokenFieldId(token.variable)\"\r\n [value]=\"currentValue(token.variable)\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n (input)=\"onTokenInput(token.variable, $event)\"\r\n />\r\n </div>\r\n <p class=\"pos-tokens__default\">\r\n Default\r\n <code>{{ defaultValue(token.variable) }}</code>\r\n </p>\r\n @if (isModified(token.variable)) {\r\n <button type=\"button\" class=\"pos-tokens__reset\" (click)=\"resetToken(token.variable)\">\r\n Reset to default\r\n </button>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </aside>\r\n </div>\r\n</article>\r\n","/*\r\n * Public API Surface of @retalia/pos-components\r\n */\r\n\r\nexport { PosLogin } from './lib/login/pos-login';\r\nexport type {\r\n PosLoginIntent,\r\n PosLoginSessionState,\r\n PosLoginSessionStatus,\r\n} from './lib/login/pos-login';\r\n\r\nexport { PosBasket } from './lib/basket/pos-basket';\r\nexport type {\r\n PosBasketIntent,\r\n PosBasketLine,\r\n PosBasketTotals,\r\n PosBasketVat,\r\n} from './lib/basket/pos-basket';\r\n\r\nexport { PosItemEntry } from './lib/item-entry/pos-item-entry';\r\nexport type { PosItemEntryIntent } from './lib/item-entry/pos-item-entry';\r\n\r\nexport { PosTender } from './lib/tender/pos-tender';\r\nexport type { PosTenderIntent } from './lib/tender/pos-tender';\r\n\r\nexport { PosReceipt } from './lib/receipt/pos-receipt';\r\nexport type {\r\n PosReceiptIntent,\r\n PosReceiptLine,\r\n PosReceiptTotals,\r\n PosReceiptVat,\r\n PosReceiptPayment,\r\n PosReceiptDocument,\r\n} from './lib/receipt/pos-receipt';\r\n\r\nexport { PosTokens } from './lib/tokens/pos-tokens';\r\nexport type { PosTokenSwatch } from './lib/tokens/pos-tokens';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["KEYPAD_ROWS","EMPTY_TOTALS"],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,43 @@
1
- {
2
- "name": "@retalia/pos-components",
3
- "version": "0.0.4",
4
- "publishConfig": {
5
- "access": "public",
6
- "registry": "https://registry.npmjs.org/"
7
- },
8
- "peerDependencies": {
9
- "@angular/common": "^21.2.0",
10
- "@angular/core": "^21.2.0"
11
- },
12
- "dependencies": {
13
- "tslib": "^2.3.0"
14
- },
15
- "sideEffects": ["**/*.css"],
16
- "style": "./styles/styles.css"
17
- }
1
+ {
2
+ "name": "@retalia/pos-components",
3
+ "version": "0.0.6",
4
+ "publishConfig": {
5
+ "access": "public",
6
+ "registry": "https://registry.npmjs.org/"
7
+ },
8
+ "exports": {
9
+ "./styles/styles.css": {
10
+ "style": "./styles/styles.css",
11
+ "default": "./styles/styles.css"
12
+ },
13
+ "./styles/tokens.css": {
14
+ "style": "./styles/tokens.css",
15
+ "default": "./styles/tokens.css"
16
+ },
17
+ "./package.json": {
18
+ "default": "./package.json"
19
+ },
20
+ ".": {
21
+ "types": "./types/retalia-pos-components.d.ts",
22
+ "default": "./fesm2022/retalia-pos-components.mjs"
23
+ },
24
+ "./services": {
25
+ "types": "./types/retalia-pos-components-services.d.ts",
26
+ "default": "./fesm2022/retalia-pos-components-services.mjs"
27
+ }
28
+ },
29
+ "peerDependencies": {
30
+ "@angular/common": "^21.2.0",
31
+ "@angular/core": "^21.2.0"
32
+ },
33
+ "dependencies": {
34
+ "tslib": "^2.3.0"
35
+ },
36
+ "sideEffects": [
37
+ "**/*.css"
38
+ ],
39
+ "style": "./styles/styles.css",
40
+ "module": "fesm2022/retalia-pos-components.mjs",
41
+ "typings": "types/retalia-pos-components.d.ts",
42
+ "type": "module"
43
+ }
@@ -0,0 +1,168 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken } from '@angular/core';
3
+ import { HttpInterceptorFn } from '@angular/common/http';
4
+ import { Observable } from 'rxjs';
5
+
6
+ interface PosApiConfig {
7
+ /** Origin for HeadlessAPI. Empty string when the host app proxies `/api`. */
8
+ readonly apiBaseUrl: string;
9
+ /** Cookie holding the Portal Bearer token (paste in local dev). */
10
+ readonly tokenCookieName: string;
11
+ /** Cookie holding the shop id sent as `Shop-Context`. */
12
+ readonly shopContextCookieName: string;
13
+ readonly getAccessToken?: () => string | null;
14
+ readonly getShopContext?: () => string | null;
15
+ }
16
+ declare const DEFAULT_POS_API_CONFIG: PosApiConfig;
17
+ declare const POS_API_CONFIG: InjectionToken<PosApiConfig>;
18
+ declare function readAccessToken(config: PosApiConfig): string | null;
19
+ declare function readShopContext(config: PosApiConfig): string | null;
20
+
21
+ /** Attaches Bearer + Shop-Context from cookies (or host overrides). */
22
+ declare const posApiInterceptor: HttpInterceptorFn;
23
+
24
+ interface ClerkSession {
25
+ readonly clerkNumber: string;
26
+ readonly displayName: string;
27
+ readonly languageCode: string;
28
+ readonly isManager: boolean;
29
+ }
30
+ declare class ClerkAuthError extends Error {
31
+ readonly name = "ClerkAuthError";
32
+ constructor(message: string);
33
+ }
34
+ declare class ClerkAuthService {
35
+ private readonly http;
36
+ /**
37
+ * Looks up the clerk and compares the keypad password in this service.
38
+ * Not a dedicated sign-in endpoint — replace when ID-647 / PosIdentity lands.
39
+ */
40
+ signIn(clerkNumber: string, password: string): Observable<ClerkSession>;
41
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClerkAuthService, never>;
42
+ static ɵprov: i0.ɵɵInjectableDeclaration<ClerkAuthService>;
43
+ }
44
+
45
+ /** Canonical POS state envelope (PosSharedPackages 0.0.1). Not a display DTO. */
46
+ interface Session {
47
+ tenantId: string;
48
+ storeId: string;
49
+ deviceId: string;
50
+ clerkId: string;
51
+ mode: string;
52
+ locale: string;
53
+ offline: boolean;
54
+ }
55
+ interface Vat {
56
+ rate: number;
57
+ amount: number;
58
+ included: boolean;
59
+ }
60
+ type LineModifier = Record<string, unknown>;
61
+ type LineDiscount = Record<string, unknown>;
62
+ interface BasketLine {
63
+ lineId: number;
64
+ sku: string;
65
+ name: string;
66
+ qty: number;
67
+ unitPrice: number;
68
+ lineTotal: number;
69
+ vat: Vat;
70
+ modifiers: LineModifier[];
71
+ discounts: LineDiscount[];
72
+ struckThrough: boolean;
73
+ }
74
+ interface Basket {
75
+ basketId: string;
76
+ lines: BasketLine[];
77
+ }
78
+ interface Totals {
79
+ gross: number;
80
+ net: number;
81
+ vat: number;
82
+ discount: number;
83
+ due: number;
84
+ currency: string;
85
+ }
86
+ interface Payment {
87
+ tender: string;
88
+ amount: number;
89
+ tendered: number;
90
+ change: number;
91
+ state: string;
92
+ }
93
+ interface Document {
94
+ number: string;
95
+ receiptReady: boolean;
96
+ }
97
+ interface Constraints {
98
+ currency: string;
99
+ offlineCapable: boolean;
100
+ }
101
+ interface ValidationIssue {
102
+ code: string;
103
+ severity: string;
104
+ }
105
+ interface Workflow {
106
+ step: string;
107
+ next: string[];
108
+ }
109
+ type Advisory = Record<string, unknown>;
110
+ interface PosStateEnvelope {
111
+ schemaVersion: string;
112
+ correlationId: string;
113
+ session: Session;
114
+ state: string;
115
+ basket: Basket;
116
+ totals: Totals;
117
+ payments: Payment[];
118
+ document: Document;
119
+ availableActions: string[];
120
+ constraints: Constraints;
121
+ validation: ValidationIssue[];
122
+ workflow: Workflow;
123
+ advisory: Advisory | null;
124
+ }
125
+
126
+ interface AddItemCommand {
127
+ readonly basketId: string;
128
+ readonly sku: string;
129
+ readonly qty: number;
130
+ }
131
+ interface ChangeQuantityCommand {
132
+ readonly basketId: string;
133
+ readonly lineId: number;
134
+ readonly qty: number;
135
+ }
136
+ interface ClearBasketCommand {
137
+ readonly basketId: string;
138
+ }
139
+ interface TenderCashCommand {
140
+ readonly basketId: string;
141
+ readonly amount: number;
142
+ }
143
+ interface NewSaleCommand {
144
+ readonly basketId: string;
145
+ }
146
+ /**
147
+ * Thin HTTP client for open-till sale commands (command in → PosStateEnvelope out).
148
+ *
149
+ * Keep as one client while the surface is small. When basket, tender, and sale
150
+ * lifecycle each grow their own handful of methods, split by subdomain, e.g.:
151
+ * - basket: addItem / changeQuantity / clearBasket (+ discounts, modifiers, …)
152
+ * - tender: tenderCash (+ card, void payment, …)
153
+ * - sale: newSale (+ suspend, recall, …)
154
+ * Extract is cheap; avoid splitting early into near-empty clients.
155
+ */
156
+ declare class PosCommandsClient {
157
+ private readonly http;
158
+ addItem(command: AddItemCommand, key?: string): Observable<PosStateEnvelope>;
159
+ changeQuantity(command: ChangeQuantityCommand, key?: string): Observable<PosStateEnvelope>;
160
+ clearBasket(command: ClearBasketCommand, key?: string): Observable<PosStateEnvelope>;
161
+ tenderCash(command: TenderCashCommand, key?: string): Observable<PosStateEnvelope>;
162
+ newSale(command: NewSaleCommand, key?: string): Observable<PosStateEnvelope>;
163
+ static ɵfac: i0.ɵɵFactoryDeclaration<PosCommandsClient, never>;
164
+ static ɵprov: i0.ɵɵInjectableDeclaration<PosCommandsClient>;
165
+ }
166
+
167
+ export { ClerkAuthError, ClerkAuthService, DEFAULT_POS_API_CONFIG, POS_API_CONFIG, PosCommandsClient, posApiInterceptor, readAccessToken, readShopContext };
168
+ export type { AddItemCommand, Advisory, Basket, BasketLine, ChangeQuantityCommand, ClearBasketCommand, ClerkSession, Constraints, Document, LineDiscount, LineModifier, NewSaleCommand, Payment, PosApiConfig, PosStateEnvelope, Session, TenderCashCommand, Totals, ValidationIssue, Vat, Workflow };