@retalia/pos-components 0.0.7 → 0.0.9
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.
- package/README.md +80 -8
- package/fesm2022/retalia-pos-components-services.mjs +12 -2
- package/fesm2022/retalia-pos-components-services.mjs.map +1 -1
- package/fesm2022/retalia-pos-components.mjs +267 -106
- package/fesm2022/retalia-pos-components.mjs.map +1 -1
- package/package.json +1 -1
- package/styles/styles.css +1 -0
- package/styles/tokens.css +21 -15
- package/types/retalia-pos-components-services.d.ts +11 -2
- package/types/retalia-pos-components.d.ts +95 -23
|
@@ -1 +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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"}
|
|
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/header/pos-header.ts","../../../projects/pos-components/src/lib/header/pos-header.html","../../../projects/pos-components/src/lib/transaction-action-bar/pos-transaction-action-bar.ts","../../../projects/pos-components/src/lib/transaction-action-bar/pos-transaction-action-bar.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 DIGIT_KEYS: readonly string[] = ['1', '2', '3', '4', '5', '6', '7', '8', '9'];\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 heading = input('Clerk sign in');\r\n readonly titleClerkNumber = input('Enter clerk PIN');\r\n readonly titleClerkPassword = input('Enter clerk password');\r\n readonly nextLabel = input('Next');\r\n readonly loginLabel = input('Login');\r\n\r\n /** Shop context beside the keypad. Off leaves the keypad on its own. */\r\n readonly showAside = input(true);\r\n /** Draws a frame around the login shell. Off by default. */\r\n readonly bordered = input(false);\r\n /** When false, the brand image is omitted, including the built-in mark. */\r\n readonly showBrandImage = input(true);\r\n /** Partner image URL. Empty, while `showBrandImage` is true, uses the built-in Retalia mark. */\r\n readonly brandImage = input('');\r\n /** Wordmark after the image. Empty shows no text. */\r\n readonly brandLabel = input('RETALIA');\r\n /** First address line under the brand. Empty hides it. */\r\n readonly locationName = input('Address1');\r\n /** Second address line. Empty hides it. */\r\n readonly terminalLine = input('Address2');\r\n /** Shop line. Empty hides it. */\r\n readonly shopName = input('shop 1');\r\n readonly dateLabel = input('Date');\r\n readonly posNumberLabel = input('POS No');\r\n /** Empty hides the POS number tile. */\r\n readonly posNumber = input('001');\r\n\r\n readonly action = output<PosLoginIntent>();\r\n\r\n protected readonly digitKeys = DIGIT_KEYS;\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 hasEntry = computed(() => this.inputValue().length > 0);\r\n\r\n protected readonly displayText = computed(() => {\r\n const value = this.inputValue();\r\n if (!value) {\r\n return this.title();\r\n }\r\n return this.maskInput() ? '•'.repeat(value.length) : value;\r\n });\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 interactionLocked = computed(() => {\r\n const status = this.session().status;\r\n return status === 'busy' || status === 'signedIn';\r\n });\r\n\r\n protected readonly shownDate = computed(() =>\r\n new Intl.DateTimeFormat('en-GB', {\r\n weekday: 'long',\r\n day: 'numeric',\r\n month: 'long',\r\n }).format(new Date()),\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","<div\r\n class=\"pos-login__shell\"\r\n [class.pos-login__shell--aside]=\"showAside()\"\r\n [class.pos-login__shell--bordered]=\"bordered()\"\r\n>\r\n @if (showAside()) {\r\n <aside class=\"pos-login__aside\">\r\n @if (showBrandImage() || brandLabel()) {\r\n <div class=\"pos-login__brand\">\r\n @if (showBrandImage()) {\r\n @if (brandImage()) {\r\n <img\r\n class=\"pos-login__brand-image\"\r\n [src]=\"brandImage()\"\r\n [alt]=\"brandLabel() ? '' : 'Brand'\"\r\n />\r\n } @else {\r\n <svg\r\n class=\"pos-login__brand-image\"\r\n viewBox=\"492.40 241.70 51.34 54.94\"\r\n [attr.aria-hidden]=\"brandLabel() ? true : null\"\r\n [attr.aria-label]=\"brandLabel() ? null : 'Retalia'\"\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M 522.628906 291.910156 C 522.636719 293.0625 523.441406 293.511719 524.425781 292.914062 L 540.464844 283.207031 C 541.449219 282.613281 542.246094 281.195312 542.246094 280.046875 L 542.246094 261.132812 C 542.246094 259.980469 541.441406 259.523438 540.453125 260.113281 L 524.292969 269.691406 C 523.300781 270.277344 522.503906 271.683594 522.511719 272.835938 Z M 522.628906 291.910156\"\r\n />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M 539.097656 253.351562 L 517.101562 243.664062 C 516.066406 243.203125 514.417969 243.265625 513.421875 243.804688 L 495.835938 253.308594 C 494.839844 253.847656 494.027344 255.214844 494.023438 256.367188 L 493.910156 280.140625 C 493.902344 281.292969 494.699219 282.679688 495.683594 283.234375 L 501.734375 286.640625 C 502.71875 287.199219 503.503906 286.71875 503.480469 285.566406 L 503.214844 271.488281 C 503.207031 271.082031 503.492188 270.894531 503.855469 271.066406 L 506.128906 272.148438 C 507.152344 272.636719 507.980469 273.960938 507.980469 275.113281 L 507.980469 287.839844 C 507.980469 288.992188 508.773438 290.394531 509.746094 290.972656 L 515.777344 294.5625 C 516.753906 295.140625 517.554688 294.679688 517.566406 293.527344 L 517.800781 273.300781 C 517.808594 272.488281 517.539062 271.238281 517.195312 270.503906 L 515.460938 266.789062 C 515.292969 266.421875 515.476562 266.109375 515.871094 266.089844 L 518.925781 265.941406 C 520.050781 265.886719 521.761719 265.378906 522.738281 264.808594 L 539.195312 255.21875 C 540.175781 254.648438 540.132812 253.8125 539.097656 253.351562 M 520.609375 255.050781 L 518.019531 256.585938 C 516.914062 257.125 515.734375 257.289062 514.710938 256.804688 L 511.078125 255.101562 C 510.054688 254.621094 510.023438 253.773438 511.003906 253.210938 L 513.835938 251.597656 C 514.53125 251.203125 515.691406 251.132812 516.425781 251.445312 L 520.449219 253.128906 C 521.488281 253.570312 521.5625 254.429688 520.609375 255.050781\"\r\n />\r\n </svg>\r\n }\r\n }\r\n @if (brandLabel()) {\r\n <span class=\"pos-login__brand-label\">{{ brandLabel() }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (locationName() || terminalLine()) {\r\n <div class=\"pos-login__place\">\r\n @if (locationName()) {\r\n <p class=\"pos-login__location\">{{ locationName() }}</p>\r\n }\r\n @if (terminalLine()) {\r\n <p class=\"pos-login__terminal\">{{ terminalLine() }}</p>\r\n }\r\n @if (shopName()) {\r\n <p class=\"pos-login__terminal\">{{ shopName() }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"pos-login__facts\">\r\n <div class=\"pos-login__fact\">\r\n <p class=\"pos-login__fact-label\">{{ dateLabel() }}</p>\r\n <p class=\"pos-login__fact-value\">{{ shownDate() }}</p>\r\n </div>\r\n @if (posNumber()) {\r\n <div class=\"pos-login__fact\">\r\n <p class=\"pos-login__fact-label\">{{ posNumberLabel() }}</p>\r\n <p class=\"pos-login__fact-value\">{{ posNumber() }}</p>\r\n </div>\r\n }\r\n </div>\r\n </aside>\r\n }\r\n\r\n<section class=\"pos-login__panel\" [attr.aria-busy]=\"session().status === 'busy' ? true : null\">\r\n <div class=\"pos-login__main\">\r\n <header class=\"pos-login__header\">\r\n <h1 class=\"pos-login__heading\">{{ heading() }}</h1>\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 Back\r\n </button>\r\n }\r\n </header>\r\n\r\n <div class=\"pos-login__display\">\r\n <p class=\"pos-login__title\" [class.pos-login__title--entry]=\"hasEntry()\">{{ displayText() }}</p>\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 (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 (key of digitKeys; track key) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-login__key\"\r\n [disabled]=\"interactionLocked()\"\r\n (click)=\"onKeypad(key)\"\r\n >\r\n {{ key }}\r\n </button>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-login__key pos-login__key--delete\"\r\n aria-label=\"Delete\"\r\n [disabled]=\"interactionLocked()\"\r\n (click)=\"onKeypad('←')\"\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=\"M8 5h12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H8l-5-7 5-7Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.7\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"m14 10 4 4m0-4-4 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.7\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-login__key\"\r\n [disabled]=\"interactionLocked()\"\r\n (click)=\"onKeypad('0')\"\r\n >\r\n 0\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-login__primary\"\r\n [attr.aria-label]=\"primaryLabel()\"\r\n [disabled]=\"interactionLocked()\"\r\n (click)=\"onPrimary()\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <path\r\n d=\"M5 12.5 9.5 17 19 7.5\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n @if (sessionStatusText() || errorMessage()) {\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\" role=\"alert\">{{ errorMessage() }}</p>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</section>\r\n</div>\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 /** Draws the panel frame. Off by default so the host can sit the basket flush. */\r\n readonly bordered = input(false);\r\n\r\n readonly title = input('Basket');\r\n readonly emptyMessage = input('Basket is empty');\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 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","<section\r\n class=\"pos-basket__panel\"\r\n [class.pos-basket__panel--bordered]=\"bordered()\"\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 </footer>\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 PosHeaderIntent = { readonly type: 'header.signOut' };\r\n\r\n@Component({\r\n selector: 'pos-header',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-header.html',\r\n styleUrl: './pos-header.scss',\r\n host: {\r\n class: 'pos-header',\r\n role: 'banner',\r\n },\r\n})\r\nexport class PosHeader {\r\n readonly title = input('');\r\n readonly context = input('');\r\n /** When false, the brand image is omitted, including the built-in mark. */\r\n readonly showBrandImage = input(true);\r\n /** Partner image URL. Empty, while `showBrandImage` is true, uses the built-in Retalia mark. */\r\n readonly brandImage = input('');\r\n /** Wordmark after the image. Empty shows no text. */\r\n readonly brandLabel = input('');\r\n readonly clerkName = input('');\r\n readonly clerkRole = input('');\r\n readonly signOutLabel = input('Portal Logout');\r\n readonly menuLabel = input('Menu');\r\n readonly canSignOut = input(true);\r\n readonly disabled = input(false);\r\n\r\n readonly action = output<PosHeaderIntent>();\r\n\r\n protected readonly menuOpen = signal(false);\r\n\r\n protected readonly initial = computed(() => {\r\n const name = this.clerkName().trim();\r\n return name ? name.charAt(0).toUpperCase() : '';\r\n });\r\n\r\n protected toggleMenu(): void {\r\n if (this.disabled() || !this.canSignOut()) {\r\n return;\r\n }\r\n\r\n this.menuOpen.update((open) => !open);\r\n }\r\n\r\n protected closeMenu(): void {\r\n this.menuOpen.set(false);\r\n }\r\n\r\n protected onSignOut(): void {\r\n if (this.disabled() || !this.canSignOut()) {\r\n return;\r\n }\r\n\r\n this.menuOpen.set(false);\r\n this.action.emit({ type: 'header.signOut' });\r\n }\r\n}\r\n","<div class=\"pos-header__identity\">\r\n @if (showBrandImage() || brandLabel()) {\r\n <div class=\"pos-header__brand\">\r\n @if (showBrandImage()) {\r\n @if (brandImage()) {\r\n <img\r\n class=\"pos-header__brand-image\"\r\n [src]=\"brandImage()\"\r\n [alt]=\"brandLabel() ? '' : 'Brand'\"\r\n />\r\n } @else {\r\n <svg\r\n class=\"pos-header__brand-image\"\r\n viewBox=\"492.40 241.70 51.34 54.94\"\r\n [attr.aria-hidden]=\"brandLabel() ? true : null\"\r\n [attr.aria-label]=\"brandLabel() ? null : 'Retalia'\"\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M 522.628906 291.910156 C 522.636719 293.0625 523.441406 293.511719 524.425781 292.914062 L 540.464844 283.207031 C 541.449219 282.613281 542.246094 281.195312 542.246094 280.046875 L 542.246094 261.132812 C 542.246094 259.980469 541.441406 259.523438 540.453125 260.113281 L 524.292969 269.691406 C 523.300781 270.277344 522.503906 271.683594 522.511719 272.835938 Z M 522.628906 291.910156\"\r\n />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M 539.097656 253.351562 L 517.101562 243.664062 C 516.066406 243.203125 514.417969 243.265625 513.421875 243.804688 L 495.835938 253.308594 C 494.839844 253.847656 494.027344 255.214844 494.023438 256.367188 L 493.910156 280.140625 C 493.902344 281.292969 494.699219 282.679688 495.683594 283.234375 L 501.734375 286.640625 C 502.71875 287.199219 503.503906 286.71875 503.480469 285.566406 L 503.214844 271.488281 C 503.207031 271.082031 503.492188 270.894531 503.855469 271.066406 L 506.128906 272.148438 C 507.152344 272.636719 507.980469 273.960938 507.980469 275.113281 L 507.980469 287.839844 C 507.980469 288.992188 508.773438 290.394531 509.746094 290.972656 L 515.777344 294.5625 C 516.753906 295.140625 517.554688 294.679688 517.566406 293.527344 L 517.800781 273.300781 C 517.808594 272.488281 517.539062 271.238281 517.195312 270.503906 L 515.460938 266.789062 C 515.292969 266.421875 515.476562 266.109375 515.871094 266.089844 L 518.925781 265.941406 C 520.050781 265.886719 521.761719 265.378906 522.738281 264.808594 L 539.195312 255.21875 C 540.175781 254.648438 540.132812 253.8125 539.097656 253.351562 M 520.609375 255.050781 L 518.019531 256.585938 C 516.914062 257.125 515.734375 257.289062 514.710938 256.804688 L 511.078125 255.101562 C 510.054688 254.621094 510.023438 253.773438 511.003906 253.210938 L 513.835938 251.597656 C 514.53125 251.203125 515.691406 251.132812 516.425781 251.445312 L 520.449219 253.128906 C 521.488281 253.570312 521.5625 254.429688 520.609375 255.050781\"\r\n />\r\n </svg>\r\n }\r\n }\r\n @if (brandLabel()) {\r\n <span class=\"pos-header__brand-label\">{{ brandLabel() }}</span>\r\n }\r\n </div>\r\n }\r\n @if (title()) {\r\n <h1 class=\"pos-header__title\">{{ title() }}</h1>\r\n }\r\n @if (context()) {\r\n <p class=\"pos-header__context\">{{ context() }}</p>\r\n }\r\n</div>\r\n\r\n<div class=\"pos-header__session\">\r\n @if (clerkName()) {\r\n <div class=\"pos-header__clerk\">\r\n @if (canSignOut()) {\r\n <div class=\"pos-header__menu-anchor\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-header__menu-button\"\r\n [attr.aria-label]=\"menuLabel()\"\r\n [attr.aria-expanded]=\"menuOpen()\"\r\n aria-haspopup=\"menu\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"toggleMenu()\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <circle cx=\"5\" cy=\"12\" r=\"1.6\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" />\r\n <circle cx=\"19\" cy=\"12\" r=\"1.6\" />\r\n </svg>\r\n </button>\r\n </div>\r\n }\r\n <span class=\"pos-header__avatar\" aria-hidden=\"true\">{{ initial() }}</span>\r\n <span class=\"pos-header__clerk-text\">\r\n <span class=\"pos-header__clerk-name\">{{ clerkName() }}</span>\r\n @if (clerkRole()) {\r\n <span class=\"pos-header__clerk-role\">{{ clerkRole() }}</span>\r\n }\r\n </span>\r\n </div>\r\n }\r\n @if (menuOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-header__backdrop\"\r\n aria-label=\"Close menu\"\r\n (click)=\"closeMenu()\"\r\n ></button>\r\n <div class=\"pos-header__menu\" role=\"menu\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-header__logout\"\r\n role=\"menuitem\"\r\n (click)=\"onSignOut()\"\r\n >\r\n {{ signOutLabel() }}\r\n </button>\r\n </div>\r\n }\r\n</div>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'pos-transaction-action-bar',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-transaction-action-bar.html',\r\n styleUrl: './pos-transaction-action-bar.scss',\r\n host: {\r\n class: 'pos-transaction-action-bar',\r\n },\r\n})\r\nexport class PosTransactionActionBar {}\r\n","<ng-content />\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 '(document:keydown)': 'onDocumentKeydown($event)',\r\n },\r\n})\r\nexport class PosItemEntry {\r\n readonly disabled = input(false);\r\n /** Draws the panel frame. Off by default so the host can sit the field flush. */\r\n readonly bordered = 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 barcode, search products');\r\n readonly scannerStatus = input('scanner ready');\r\n /** Key that moves focus to the field. Empty hides the hint and the shortcut. */\r\n readonly focusHotkey = input('F2');\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 onDocumentKeydown(event: KeyboardEvent): void {\r\n const hotkey = this.focusHotkey();\r\n if (!hotkey || event.key !== hotkey || event.repeat) {\r\n return;\r\n }\r\n\r\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\r\n return;\r\n }\r\n\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n this.focusInput();\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.canSubmit()) {\r\n return;\r\n }\r\n\r\n const reference = this.reference().trim();\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 [class.pos-item-entry__panel--bordered]=\"bordered()\"\r\n [attr.aria-busy]=\"disabled() ? true : null\"\r\n>\r\n <form class=\"pos-item-entry__form\" (submit)=\"onSubmit($event)\">\r\n <div\r\n class=\"pos-item-entry__omnibox\"\r\n [class.pos-item-entry__omnibox--disabled]=\"disabled()\"\r\n >\r\n <label class=\"pos-item-entry__field\">\r\n <span class=\"pos-item-entry__label\">{{ label() }}</span>\r\n <svg\r\n class=\"pos-item-entry__search\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\r\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\r\n </svg>\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 [attr.aria-keyshortcuts]=\"focusHotkey() || null\"\r\n (input)=\"onInput($event)\"\r\n />\r\n </label>\r\n\r\n <span class=\"pos-item-entry__scanner\">\r\n <svg\r\n class=\"pos-item-entry__scan\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n >\r\n <line x1=\"4\" y1=\"6\" x2=\"4\" y2=\"18\" />\r\n <line x1=\"7\" y1=\"6\" x2=\"7\" y2=\"18\" />\r\n <line x1=\"11\" y1=\"6\" x2=\"11\" y2=\"18\" />\r\n <line x1=\"14\" y1=\"6\" x2=\"14\" y2=\"18\" />\r\n <line x1=\"18\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n <line x1=\"21\" y1=\"6\" x2=\"21\" y2=\"18\" />\r\n </svg>\r\n {{ scannerStatus() }}\r\n </span>\r\n\r\n @if (focusHotkey()) {\r\n <kbd class=\"pos-item-entry__hotkey\">{{ focusHotkey() }}</kbd>\r\n }\r\n </div>\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 | { readonly type: 'tender.cancel' };\r\n\r\nconst COIN_AMOUNTS: readonly number[] = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2];\r\nconst NOTE_AMOUNTS: readonly number[] = [5, 10, 20, 50];\r\n\r\nfunction roundMoney(amount: number): number {\r\n return Math.round(amount * 100) / 100;\r\n}\r\n\r\nfunction roundUp(amount: number, step: number): number {\r\n return roundMoney(Math.ceil(amount / step) * step);\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 Payment');\r\n readonly amountDueLabel = input('Remaining');\r\n readonly tenderedLabel = input('Amount given');\r\n readonly changeDueLabel = input('Change due');\r\n readonly tenderLabel = input('Pay Now');\r\n readonly cancelLabel = input('Cancel');\r\n readonly hint = input('tap coins and notes, or use a quick amount.');\r\n readonly processingLabel = input('Processing tender…');\r\n\r\n readonly action = output<PosTenderIntent>();\r\n\r\n protected readonly coins = COIN_AMOUNTS;\r\n protected readonly notes = NOTE_AMOUNTS;\r\n protected readonly given = signal(0);\r\n\r\n protected readonly parsedAmount = computed(() => {\r\n const amount = this.given();\r\n return amount > 0 ? amount : null;\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 displayGiven = computed(() => this.given().toFixed(2));\r\n\r\n protected readonly quickAmounts = computed(() => {\r\n const remaining = this.amountDue();\r\n if (!(remaining > 0)) {\r\n return [];\r\n }\r\n\r\n const values = [\r\n remaining,\r\n roundUp(remaining, 5),\r\n roundUp(remaining, 10),\r\n roundUp(remaining, 20),\r\n ].map((value) => roundMoney(value));\r\n\r\n return values\r\n .filter(\r\n (value, index) =>\r\n value >= remaining - 0.001 && values.indexOf(value) === index,\r\n )\r\n .slice(0, 4);\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 denominationLabel(amount: number): string {\r\n const currency = (this.currency() || 'EUR').toUpperCase();\r\n if (amount >= 1) {\r\n return new Intl.NumberFormat(undefined, {\r\n style: 'currency',\r\n currency,\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(amount);\r\n }\r\n\r\n const minor = Math.round(amount * 100);\r\n if (currency === 'GBP') {\r\n return `${minor}p`;\r\n }\r\n if (currency === 'EUR') {\r\n return `${minor}c`;\r\n }\r\n return this.formatMoney(amount);\r\n }\r\n\r\n protected quickLabel(amount: number): string {\r\n const formatted = this.formatMoney(amount);\r\n return roundMoney(amount) === roundMoney(this.amountDue())\r\n ? `Exact ${formatted}`\r\n : formatted;\r\n }\r\n\r\n protected isExact(amount: number): boolean {\r\n return roundMoney(amount) === roundMoney(this.amountDue());\r\n }\r\n\r\n protected addAmount(amount: number): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n this.given.update((current) => roundMoney(current + amount));\r\n }\r\n\r\n protected setAmount(amount: number): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n this.given.set(roundMoney(amount));\r\n }\r\n\r\n protected resetAmount(): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n this.given.set(0);\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 protected onCancel(): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'tender.cancel' });\r\n }\r\n}\r\n","<section class=\"pos-tender__panel\" [attr.aria-busy]=\"disabled() ? true : null\">\r\n <header class=\"pos-tender__header\">\r\n <h2 class=\"pos-tender__title\">{{ title() }}</h2>\r\n <p class=\"pos-tender__hint\">\r\n {{ amountDueLabel() }}:\r\n <span class=\"pos-tender__due\">{{ formatMoney(amountDue()) }}</span>\r\n - {{ hint() }}\r\n </p>\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\">{{ formatMoney(changeDue() ?? 0) }}</p>\r\n </div>\r\n }\r\n </header>\r\n\r\n @if (statusText() || errorMessage()) {\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\" role=\"alert\">{{ errorMessage() }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"pos-tender__money\">\r\n <div class=\"pos-tender__coins\" role=\"group\" aria-label=\"Coins\">\r\n @for (amount of coins; track amount) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-tender__coin\"\r\n [attr.data-amount]=\"amount\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"'Add ' + denominationLabel(amount)\"\r\n (click)=\"addAmount(amount)\"\r\n >\r\n {{ denominationLabel(amount) }}\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-tender__notes\" role=\"group\" aria-label=\"Notes\">\r\n @for (amount of notes; track amount) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-tender__note\"\r\n [attr.data-amount]=\"amount\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"'Add ' + denominationLabel(amount)\"\r\n (click)=\"addAmount(amount)\"\r\n >\r\n {{ denominationLabel(amount) }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (quickAmounts().length) {\r\n <div class=\"pos-tender__quick\" role=\"group\" aria-label=\"Quick amounts\">\r\n @for (amount of quickAmounts(); track amount) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-tender__pill\"\r\n [class.pos-tender__pill--exact]=\"isExact(amount)\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"setAmount(amount)\"\r\n >\r\n {{ quickLabel(amount) }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"pos-tender__given\">\r\n <label class=\"pos-tender__given-label\" for=\"pos-tender-given\">{{ tenderedLabel() }}</label>\r\n <input\r\n id=\"pos-tender-given\"\r\n class=\"pos-tender__digits\"\r\n [value]=\"displayGiven()\"\r\n readonly\r\n tabindex=\"-1\"\r\n aria-label=\"Amount given\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"pos-tender__reset\"\r\n aria-label=\"Reset amount\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"resetAmount()\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <path\r\n d=\"M8 5h12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H8l-5-7 5-7Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.7\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path d=\"m14 10 4 4m0-4-4 4\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pos-tender__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-tender__cancel\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onCancel()\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <path d=\"M6 6l12 12M18 6 6 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n </svg>\r\n {{ cancelLabel() }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tender__primary\"\r\n [disabled]=\"!canTender()\"\r\n (click)=\"onTender()\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <path\r\n d=\"M5 12.5 9.5 17 19 7.5\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\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 /** Draws the panel frame. Off by default so the host can sit the receipt flush. */\r\n readonly bordered = 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 [class.pos-receipt__panel--bordered]=\"bordered()\"\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' | 'shadow' | '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 | 'shadow'\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: '#1a1a1a',\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: '#666a70',\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: '#f5f5f7',\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: '#ffffff',\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: '#1a1a1a',\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: '#ececf0',\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: '#1a1a1a',\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: '#ececf0',\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: '#f0e6fd',\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: '#1a1a1a',\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 \"'Chakra Petch', ui-sans-serif, system-ui, 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 \"'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.90625rem',\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: 'Letter spacing brand',\r\n variable: '--pos-letter-spacing-brand',\r\n kind: 'length',\r\n group: 'type',\r\n preview: 'letter-spacing',\r\n defaultValue: '0.08em',\r\n },\r\n {\r\n name: 'Letter spacing tight',\r\n variable: '--pos-letter-spacing-tight',\r\n kind: 'length',\r\n group: 'type',\r\n preview: 'letter-spacing',\r\n defaultValue: '-0.03em',\r\n },\r\n {\r\n name: 'Shadow key',\r\n variable: '--pos-shadow-key',\r\n kind: 'other',\r\n group: 'shadow',\r\n preview: 'shadow',\r\n defaultValue: '0 1px 3px color-mix(in srgb, var(--pos-color-ink) 8%, transparent)',\r\n },\r\n {\r\n name: 'Shadow overlay',\r\n variable: '--pos-shadow-overlay',\r\n kind: 'other',\r\n group: 'shadow',\r\n preview: 'shadow',\r\n defaultValue:\r\n '0 var(--pos-space-md) var(--pos-space-2xl) color-mix(in srgb, var(--pos-color-ink) 14%, transparent)',\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 shadowTokens = tokensInGroup('shadow');\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 { PosHeader } from './lib/header/pos-header';\r\nexport type { PosHeaderIntent } from './lib/header/pos-header';\r\n\r\nexport { PosTransactionActionBar } from './lib/transaction-action-bar/pos-transaction-action-bar';\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":["EMPTY_TOTALS"],"mappings":"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"}
|