@retalia/pos-components 0.0.11 → 0.0.12
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.
|
@@ -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/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/workspace/pos-workspace-controller.ts","../../../projects/pos-components/src/lib/workspace/pos-workspace-layout.ts","../../../projects/pos-components/src/lib/workspace/pos-workspace-pane.ts","../../../projects/pos-components/src/lib/workspace/pos-workspace-pane.html","../../../projects/pos-components/src/lib/workspace/pos-workspace.ts","../../../projects/pos-components/src/lib/workspace/pos-workspace.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 interface PosHeaderIntent {\r\n readonly type: 'header.signOut';\r\n}\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, input, output } from '@angular/core';\r\n\r\nexport type PosTransactionActionBarIntent =\r\n | { readonly type: 'actionBar.clearBasket' }\r\n | { readonly type: 'actionBar.tender' };\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 /** Envelope action names. `clearBasket` shows Cancel. `tender` shows Cash. */\r\n readonly availableActions = input<readonly string[]>([]);\r\n readonly disabled = input(false);\r\n readonly action = output<PosTransactionActionBarIntent>();\r\n\r\n protected onClear(): void {\r\n this.action.emit({ type: 'actionBar.clearBasket' });\r\n }\r\n\r\n protected onCash(): void {\r\n this.action.emit({ type: 'actionBar.tender' });\r\n }\r\n}\r\n","@if (availableActions().includes('clearBasket')) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-transaction-action-bar__button pos-transaction-action-bar__button--cancel\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onClear()\"\r\n >\r\n Cancel\r\n </button>\r\n}\r\n@if (availableActions().includes('tender')) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-transaction-action-bar__button pos-transaction-action-bar__button--cash\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onCash()\"\r\n >\r\n Cash\r\n </button>\r\n}\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 { InjectionToken, type Signal } from '@angular/core';\r\n\r\nimport type {\r\n PosWorkspaceGridPane,\r\n PosWorkspacePaneId,\r\n PosWorkspaceSpan,\r\n} from './pos-workspace-layout';\r\n\r\nexport type PosWorkspaceMoveKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\n\r\nexport interface PosWorkspaceController {\r\n readonly editing: Signal<boolean>;\r\n readonly placements: Signal<ReadonlyMap<PosWorkspacePaneId, PosWorkspaceGridPane>>;\r\n readonly draggingPane: Signal<PosWorkspacePaneId | null>;\r\n readonly spans: Signal<ReadonlyMap<PosWorkspacePaneId, PosWorkspaceSpan | null>>;\r\n readonly flexibleIds: Signal<ReadonlySet<PosWorkspacePaneId>>;\r\n readonly fullWidthIds: Signal<ReadonlySet<PosWorkspacePaneId>>;\r\n readonly settingsPane: Signal<PosWorkspacePaneId | null>;\r\n togglePaneSettings(id: PosWorkspacePaneId): void;\r\n closePaneSettings(id: PosWorkspacePaneId): void;\r\n moveByKey(id: PosWorkspacePaneId, key: PosWorkspaceMoveKey): void;\r\n setFullWidth(id: PosWorkspacePaneId, enabled: boolean): void;\r\n setVisible(id: PosWorkspacePaneId, visible: boolean): void;\r\n setFlexible(id: PosWorkspacePaneId, enabled: boolean): void;\r\n removeFromLayout(id: PosWorkspacePaneId): void;\r\n resizeByKey(id: PosWorkspacePaneId, direction: -1 | 1): void;\r\n beginPaneDrag(id: PosWorkspacePaneId, event: PointerEvent): void;\r\n updatePaneDrag(event: PointerEvent): void;\r\n endPaneDrag(event?: PointerEvent): void;\r\n beginPaneResize(id: PosWorkspacePaneId, event: PointerEvent): void;\r\n updatePaneResize(event: PointerEvent): void;\r\n endPaneResize(): void;\r\n}\r\n\r\nexport const POS_WORKSPACE = new InjectionToken<PosWorkspaceController>('POS_WORKSPACE');\r\n","export const POS_WORKSPACE_PANE_IDS = ['header', 'itemEntry', 'basket', 'actionBar'] as const;\r\n\r\nexport type PosWorkspaceBuiltinPaneId = (typeof POS_WORKSPACE_PANE_IDS)[number];\r\n\r\n/** A library region, or a custom slot (`empty-1`, `empty-2`, …) the POS fills later. */\r\nexport type PosWorkspacePaneId = PosWorkspaceBuiltinPaneId | `empty-${number}`;\r\n\r\nconst EMPTY_PANE_ID = /^empty-(\\d+)$/;\r\n\r\nexport type PosWorkspaceColumn = 0 | 1;\r\n\r\n/** Which edge a pane uses when it spans both columns. */\r\nexport type PosWorkspaceSpan = 'top' | 'bottom';\r\n\r\n/** Where one logged-in sale region sits. Weight 0 sizes to content; a positive weight shares leftover height. */\r\nexport interface PosWorkspacePanePlacement {\r\n readonly id: PosWorkspacePaneId;\r\n readonly column: PosWorkspaceColumn;\r\n readonly order: number;\r\n readonly weight: number;\r\n /** Spans both columns at this pane's place in the stack. */\r\n readonly fullWidth?: boolean;\r\n /** `top` sits above the split. `bottom` sits under both columns. */\r\n readonly span?: PosWorkspaceSpan;\r\n /** Omitted or true shows the pane. False keeps it in the layout and hides it on the till. */\r\n readonly visible?: boolean;\r\n}\r\n\r\n/** Arrangement of the logged-in sale shell. The host can keep this later; the workspace does not store it. */\r\nexport interface PosWorkspaceLayout {\r\n /** Share of the width given to the left column once a pane is docked on the right. */\r\n readonly startColumnRatio: number;\r\n readonly panes: readonly PosWorkspacePanePlacement[];\r\n}\r\n\r\n/** JSON the consuming POS passes back in as the `layout` input. */\r\nexport function workspaceLayoutJson(layout: PosWorkspaceLayout): string {\r\n const document: PosWorkspaceLayout = {\r\n startColumnRatio: layout.startColumnRatio,\r\n panes: layout.panes.map((pane) => {\r\n const placement: PosWorkspacePanePlacement = {\r\n id: pane.id,\r\n column: pane.column,\r\n order: pane.order,\r\n weight: pane.weight,\r\n };\r\n let next: PosWorkspacePanePlacement = placement;\r\n if (pane.span === 'bottom') {\r\n next = { ...placement, span: 'bottom' };\r\n } else if (pane.span === 'top') {\r\n next = { ...placement, fullWidth: true, span: 'top' };\r\n } else if (pane.fullWidth) {\r\n next = { ...placement, fullWidth: true };\r\n }\r\n if (pane.visible === false) {\r\n next = { ...next, visible: false };\r\n }\r\n return next;\r\n }),\r\n };\r\n\r\n return `${JSON.stringify(document, null, 2)}\\n`;\r\n}\r\n\r\n/** Reads a file written by `workspaceLayoutJson`. */\r\nexport function parseWorkspaceLayout(json: string): PosWorkspaceLayout {\r\n let value: unknown;\r\n try {\r\n value = JSON.parse(json);\r\n } catch {\r\n throw new Error('Layout file is not JSON.');\r\n }\r\n\r\n if (!isRecord(value) || typeof value['startColumnRatio'] !== 'number') {\r\n throw new Error('Layout file is missing a column ratio.');\r\n }\r\n\r\n if (!Number.isFinite(value['startColumnRatio']) || !Array.isArray(value['panes'])) {\r\n throw new Error('Layout file is missing a pane list.');\r\n }\r\n\r\n const seen = new Set<string>();\r\n return {\r\n startColumnRatio: value['startColumnRatio'],\r\n panes: value['panes'].map((pane) => readPlacement(pane, seen)),\r\n };\r\n}\r\n\r\nfunction readPlacement(value: unknown, seen: Set<string>): PosWorkspacePanePlacement {\r\n if (!isRecord(value) || typeof value['id'] !== 'string' || !isPaneId(value['id'])) {\r\n throw new Error('Layout file has a pane id this workspace does not know.');\r\n }\r\n\r\n if (seen.has(value['id'])) {\r\n throw new Error('Layout file lists the same pane twice.');\r\n }\r\n seen.add(value['id']);\r\n\r\n const column = value['column'];\r\n const order = value['order'];\r\n const weight = value['weight'];\r\n if (column !== 0 && column !== 1) {\r\n throw new Error('Layout file has a pane outside the two columns.');\r\n }\r\n\r\n if (typeof order !== 'number' || typeof weight !== 'number' || !Number.isFinite(order) || !Number.isFinite(weight)) {\r\n throw new Error('Layout file has a pane without an order or weight.');\r\n }\r\n\r\n const placement: PosWorkspacePanePlacement = {\r\n id: value['id'],\r\n column,\r\n order,\r\n weight,\r\n };\r\n\r\n let next = placement;\r\n if (value['span'] === 'bottom') {\r\n next = { ...placement, span: 'bottom' };\r\n } else if (value['span'] === 'top') {\r\n next = { ...placement, fullWidth: true, span: 'top' };\r\n } else if (value['fullWidth'] === true) {\r\n next = { ...placement, fullWidth: true };\r\n }\r\n\r\n if (value['visible'] === false) {\r\n return { ...next, visible: false };\r\n }\r\n\r\n if (value['visible'] !== undefined && value['visible'] !== true) {\r\n throw new Error('Layout file has a pane visibility that is not true or false.');\r\n }\r\n\r\n return next;\r\n}\r\n\r\nfunction isPaneId(id: string): id is PosWorkspacePaneId {\r\n return isEmptyPaneId(id) || POS_WORKSPACE_PANE_IDS.some((paneId) => paneId === id);\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n\r\nexport interface PosWorkspaceGridPane {\r\n readonly id: PosWorkspacePaneId;\r\n readonly column: 1 | 2;\r\n readonly rowStart: number;\r\n readonly rowEnd: number;\r\n readonly showResize: boolean;\r\n /** When set, the pane stretches across both columns. */\r\n readonly spanColumns?: boolean;\r\n /** Edit mode keeps a hidden pane in the grid so its settings can show it again. */\r\n readonly concealed?: boolean;\r\n}\r\n\r\nexport interface PosWorkspaceGrid {\r\n readonly columns: string;\r\n readonly rows: string;\r\n readonly split: boolean;\r\n readonly panes: readonly PosWorkspaceGridPane[];\r\n}\r\n\r\nexport const POS_WORKSPACE_PANE_LABELS: Record<PosWorkspaceBuiltinPaneId, string> = {\r\n header: 'Header',\r\n itemEntry: 'Item lookup',\r\n basket: 'Basket',\r\n actionBar: 'Action bar',\r\n};\r\n\r\nexport function isEmptyPaneId(id: string): id is `empty-${number}` {\r\n return EMPTY_PANE_ID.test(id);\r\n}\r\n\r\nexport function workspacePaneLabel(id: PosWorkspacePaneId): string {\r\n if (isEmptyPaneId(id)) {\r\n const number = EMPTY_PANE_ID.exec(id)?.[1];\r\n return `Custom container ${number}`;\r\n }\r\n\r\n return POS_WORKSPACE_PANE_LABELS[id];\r\n}\r\n\r\nexport function nextEmptyId(layout: PosWorkspaceLayout): `empty-${number}` {\r\n let highest = 0;\r\n for (const pane of layout.panes) {\r\n const number = EMPTY_PANE_ID.exec(pane.id)?.[1];\r\n if (number) {\r\n highest = Math.max(highest, Number(number));\r\n }\r\n }\r\n\r\n return `empty-${highest + 1}`;\r\n}\r\n\r\n/** Same stack the sale screen uses today: header, item lookup, flexible basket, action bar. */\r\nexport const POS_WORKSPACE_DEFAULT_LAYOUT: PosWorkspaceLayout = {\r\n startColumnRatio: 0.58,\r\n panes: [\r\n { id: 'header', column: 0, order: 0, weight: 0 },\r\n { id: 'itemEntry', column: 0, order: 1, weight: 0 },\r\n { id: 'basket', column: 0, order: 2, weight: 1 },\r\n { id: 'actionBar', column: 0, order: 3, weight: 0 },\r\n ],\r\n};\r\n\r\n/** Basket docked on the right at full height. Item lookup is marked flexible so it fills above the action bar. */\r\nexport const POS_WORKSPACE_BASKET_RIGHT_LAYOUT: PosWorkspaceLayout = {\r\n startColumnRatio: 0.58,\r\n panes: [\r\n { id: 'header', column: 0, order: 0, weight: 0 },\r\n { id: 'itemEntry', column: 0, order: 1, weight: 1 },\r\n { id: 'actionBar', column: 0, order: 2, weight: 0 },\r\n { id: 'basket', column: 1, order: 0, weight: 1 },\r\n ],\r\n};\r\n\r\n/** Nothing placed yet. Edit mode lists the library components so they can be dragged on. */\r\nexport const POS_WORKSPACE_EMPTY_LAYOUT: PosWorkspaceLayout = {\r\n startColumnRatio: 0.58,\r\n panes: [],\r\n};\r\n\r\n/** Header spans both columns, with the basket docked on the right. */\r\nexport const POS_WORKSPACE_HEADER_SPAN_LAYOUT: PosWorkspaceLayout = {\r\n startColumnRatio: 0.58,\r\n panes: [\r\n { id: 'header', column: 0, order: 0, weight: 0, fullWidth: true, span: 'top' },\r\n { id: 'itemEntry', column: 0, order: 0, weight: 1 },\r\n { id: 'actionBar', column: 0, order: 1, weight: 0 },\r\n { id: 'basket', column: 1, order: 0, weight: 1 },\r\n ],\r\n};\r\n\r\n/** Legacy edge. `fullWidth` without `span` stays in the stack where the designer placed it. */\r\nexport function paneSpan(pane: { readonly span?: PosWorkspaceSpan }): PosWorkspaceSpan | null {\r\n if (pane.span === 'bottom') {\r\n return 'bottom';\r\n }\r\n\r\n if (pane.span === 'top') {\r\n return 'top';\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/** True when the pane spans both columns, either in place or on a legacy edge. */\r\nexport function paneFillsWidth(pane: {\r\n readonly fullWidth?: boolean;\r\n readonly span?: PosWorkspaceSpan;\r\n}): boolean {\r\n return pane.fullWidth === true || pane.span === 'top' || pane.span === 'bottom';\r\n}\r\n\r\nconst MIN_RATIO = 0.28;\r\nconst MAX_RATIO = 0.72;\r\nconst MIN_WEIGHT = 0.35;\r\nconst MAX_WEIGHT = 8;\r\n\r\nexport function workspaceGrid(\r\n layout: PosWorkspaceLayout,\r\n present: readonly PosWorkspacePaneId[],\r\n options?: { readonly compact?: boolean; readonly includeHidden?: boolean },\r\n): PosWorkspaceGrid {\r\n const placed = placedPanes(layout, present);\r\n const panes = options?.includeHidden\r\n ? placed\r\n : placed.filter((pane) => pane.visible !== false);\r\n const top = panes.filter((pane) => paneSpan(pane) === 'top').sort((a, b) => a.order - b.order);\r\n const bottom = panes\r\n .filter((pane) => paneSpan(pane) === 'bottom')\r\n .sort((a, b) => a.order - b.order);\r\n const body = panes.filter((pane) => paneSpan(pane) === null);\r\n\r\n let grid: PosWorkspaceGrid;\r\n if (options?.compact === true) {\r\n const stacked = compactStack(columnList(body, 0), columnList(body, 1));\r\n grid = singleColumnGrid([...top, ...stacked, ...bottom]);\r\n } else {\r\n const left = columnList(body, 0);\r\n const rightWide = columnList(body, 1).filter((pane) => pane.fullWidth === true);\r\n const right = columnList(body, 1).filter((pane) => pane.fullWidth !== true);\r\n const sequence = [...left, ...rightWide].sort(\r\n (a, b) => a.order - b.order || a.column - b.column,\r\n );\r\n grid = gridFromSequence(sequence, right, layout.startColumnRatio);\r\n if (bottom.length > 0) {\r\n grid = withFooter(bottom, grid);\r\n }\r\n if (top.length > 0) {\r\n grid = withBanner(top, grid);\r\n }\r\n }\r\n\r\n return options?.includeHidden ? markConcealed(grid, panes) : grid;\r\n}\r\n\r\nfunction markConcealed(\r\n grid: PosWorkspaceGrid,\r\n panes: readonly PosWorkspacePanePlacement[],\r\n): PosWorkspaceGrid {\r\n const hidden = new Set(panes.filter((pane) => pane.visible === false).map((pane) => pane.id));\r\n if (hidden.size === 0) {\r\n return grid;\r\n }\r\n\r\n return {\r\n ...grid,\r\n panes: grid.panes.map((pane) => (hidden.has(pane.id) ? { ...pane, concealed: true } : pane)),\r\n };\r\n}\r\n\r\nfunction gridFromSequence(\r\n sequence: readonly PosWorkspacePanePlacement[],\r\n right: readonly PosWorkspacePanePlacement[],\r\n ratio: number,\r\n): PosWorkspaceGrid {\r\n if (!sequence.some((pane) => pane.fullWidth === true)) {\r\n const left = sequence.filter((pane) => pane.column === 0);\r\n return bodyGridFor(left.length > 0 ? left : sequence, right, ratio);\r\n }\r\n\r\n const blocks: { span?: PosWorkspacePanePlacement; left: PosWorkspacePanePlacement[] }[] = [];\r\n let run: PosWorkspacePanePlacement[] = [];\r\n for (const pane of sequence) {\r\n if (pane.fullWidth === true) {\r\n if (run.length > 0) {\r\n blocks.push({ left: run });\r\n run = [];\r\n }\r\n blocks.push({ span: pane, left: [] });\r\n continue;\r\n }\r\n\r\n run.push(pane);\r\n }\r\n if (run.length > 0) {\r\n blocks.push({ left: run });\r\n }\r\n\r\n const stacks = blocks.filter((block) => block.span == null);\r\n const rights = stacks.map(() => [] as PosWorkspacePanePlacement[]);\r\n if (stacks.length === 0) {\r\n if (right.length > 0) {\r\n blocks.push({ left: [] });\r\n rights.push([...right]);\r\n }\r\n } else if (stacks.length === 1) {\r\n rights[0] = [...right];\r\n } else {\r\n for (const pane of right) {\r\n let best = 0;\r\n let bestDistance = Number.POSITIVE_INFINITY;\r\n stacks.forEach((block, index) => {\r\n const distance = Math.min(...block.left.map((item) => Math.abs(item.order - pane.order)));\r\n if (distance < bestDistance) {\r\n best = index;\r\n bestDistance = distance;\r\n }\r\n });\r\n rights[best].push(pane);\r\n }\r\n }\r\n\r\n let row = 1;\r\n let stackIndex = 0;\r\n const tracks: string[] = [];\r\n const panes: PosWorkspaceGrid['panes'][number][] = [];\r\n let split = false;\r\n let columns = 'minmax(0, 1fr)';\r\n for (const block of blocks) {\r\n const sub =\r\n block.span != null\r\n ? singleColumnGrid([block.span])\r\n : bodyGridFor(block.left, rights[stackIndex++] ?? [], ratio);\r\n if (sub.split) {\r\n split = true;\r\n columns = sub.columns;\r\n }\r\n\r\n for (const track of splitTemplate(sub.rows)) {\r\n tracks.push(track);\r\n }\r\n for (const pane of sub.panes) {\r\n panes.push({\r\n ...pane,\r\n rowStart: pane.rowStart + row - 1,\r\n rowEnd: pane.rowEnd + row - 1,\r\n });\r\n }\r\n row += splitTemplate(sub.rows).length;\r\n }\r\n\r\n return {\r\n columns: split ? columns : 'minmax(0, 1fr)',\r\n rows: tracks.join(' ') || 'minmax(0, 1fr)',\r\n split,\r\n panes,\r\n };\r\n}\r\n\r\nfunction splitTemplate(template: string): string[] {\r\n const tracks: string[] = [];\r\n let depth = 0;\r\n let current = '';\r\n for (const char of template.trim()) {\r\n if (char === '(') {\r\n depth += 1;\r\n } else if (char === ')') {\r\n depth = Math.max(0, depth - 1);\r\n }\r\n\r\n if (depth === 0 && char === ' ') {\r\n if (current) {\r\n tracks.push(current);\r\n }\r\n current = '';\r\n continue;\r\n }\r\n\r\n current += char;\r\n }\r\n if (current) {\r\n tracks.push(current);\r\n }\r\n return tracks;\r\n}\r\n\r\nfunction bodyGridFor(\r\n left: readonly PosWorkspacePanePlacement[],\r\n right: readonly PosWorkspacePanePlacement[],\r\n ratio: number,\r\n): PosWorkspaceGrid {\r\n if (left.length === 0 && right.length === 0) {\r\n return {\r\n columns: 'minmax(0, 1fr)',\r\n rows: 'minmax(0, 1fr)',\r\n split: false,\r\n panes: [],\r\n };\r\n }\r\n\r\n if (left.length === 0) {\r\n return singleColumnGrid(right);\r\n }\r\n\r\n if (right.length === 0) {\r\n return singleColumnGrid(left);\r\n }\r\n\r\n return splitGrid(left, right, ratio);\r\n}\r\n\r\nfunction withBanner(\r\n banner: readonly PosWorkspacePanePlacement[],\r\n body: PosWorkspaceGrid,\r\n): PosWorkspaceGrid {\r\n const offset = banner.length;\r\n return {\r\n columns: body.columns,\r\n rows: `${banner.map(() => 'auto').join(' ')} ${body.rows}`.trim(),\r\n split: body.split,\r\n panes: [\r\n ...banner.map((pane, index) => ({\r\n id: pane.id,\r\n column: 1 as const,\r\n rowStart: index + 1,\r\n rowEnd: index + 2,\r\n showResize: false,\r\n spanColumns: true,\r\n })),\r\n ...body.panes.map((pane) => ({\r\n ...pane,\r\n rowStart: pane.rowStart + offset,\r\n rowEnd: pane.rowEnd + offset,\r\n })),\r\n ],\r\n };\r\n}\r\n\r\nfunction withFooter(\r\n footer: readonly PosWorkspacePanePlacement[],\r\n body: PosWorkspaceGrid,\r\n): PosWorkspaceGrid {\r\n const offset = trackCount(body.rows);\r\n return {\r\n columns: body.columns,\r\n rows: `${body.rows} ${footer.map(() => 'auto').join(' ')}`.trim(),\r\n split: body.split,\r\n panes: [\r\n ...body.panes,\r\n ...footer.map((pane, index) => ({\r\n id: pane.id,\r\n column: 1 as const,\r\n rowStart: offset + index + 1,\r\n rowEnd: offset + index + 2,\r\n showResize: false,\r\n spanColumns: true,\r\n })),\r\n ],\r\n };\r\n}\r\n\r\nexport function dropColumn(\r\n xRatio: number,\r\n splitThreshold: number,\r\n compact: boolean,\r\n): PosWorkspaceColumn {\r\n if (compact) {\r\n return 0;\r\n }\r\n\r\n return xRatio >= splitThreshold ? 1 : 0;\r\n}\r\n\r\nexport function insertionIndex(pointerY: number, midpoints: readonly number[]): number {\r\n for (let index = 0; index < midpoints.length; index += 1) {\r\n if (pointerY < midpoints[index]) {\r\n return index;\r\n }\r\n }\r\n\r\n return midpoints.length;\r\n}\r\n\r\nexport function movePane(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n column: PosWorkspaceColumn,\r\n index: number,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n if (!current) {\r\n return layout;\r\n }\r\n\r\n const remaining = layout.panes.filter((pane) => pane.id !== id);\r\n const target = remaining\r\n .filter((pane) => pane.column === column && paneSpan(pane) === null)\r\n .sort((a, b) => a.order - b.order);\r\n const others = remaining.filter((pane) => paneSpan(pane) !== null || pane.column !== column);\r\n const nextIndex = clamp(index, 0, target.length);\r\n // Drag only places. Keep Full width when the designer already turned it on; never invent it\r\n // from a legacy span edge.\r\n const placed: PosWorkspacePanePlacement =\r\n current.fullWidth === true\r\n ? { ...current, column, span: undefined, fullWidth: true }\r\n : { ...current, column, span: undefined, fullWidth: undefined };\r\n target.splice(nextIndex, 0, placed);\r\n\r\n const panes = sortPanes([\r\n ...reindex(others),\r\n ...target.map((pane, order) => ({ ...pane, column, order })),\r\n ]);\r\n const next = { ...layout, panes };\r\n return sameLayout(layout, next) ? layout : next;\r\n}\r\n\r\n/** Adds a region to a column. An omitted index stacks it after the panes already there. */\r\nexport function addPane(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n column: PosWorkspaceColumn = 0,\r\n index?: number,\r\n): PosWorkspaceLayout {\r\n if (layout.panes.some((pane) => pane.id === id)) {\r\n return layout;\r\n }\r\n\r\n const target = layout.panes\r\n .filter((pane) => pane.column === column && paneSpan(pane) === null)\r\n .sort((a, b) => a.order - b.order);\r\n const others = layout.panes.filter((pane) => paneSpan(pane) !== null || pane.column !== column);\r\n target.splice(index === undefined ? target.length : clamp(index, 0, target.length), 0, {\r\n id,\r\n column,\r\n order: 0,\r\n weight: id === 'basket' ? 1 : 0,\r\n });\r\n\r\n return {\r\n ...layout,\r\n panes: sortPanes([\r\n ...reindex(others),\r\n ...target.map((pane, order) => ({ ...pane, column, order })),\r\n ]),\r\n };\r\n}\r\n\r\n/** Drops a region from the arrangement. A library component can be added again; an empty slot is gone. */\r\nexport function removePane(layout: PosWorkspaceLayout, id: PosWorkspacePaneId): PosWorkspaceLayout {\r\n if (!layout.panes.some((pane) => pane.id === id)) {\r\n return layout;\r\n }\r\n\r\n return {\r\n ...layout,\r\n panes: sortPanes(reindex(layout.panes.filter((pane) => pane.id !== id))),\r\n };\r\n}\r\n\r\n/** Lifts a pane into a row that spans both columns. Column placement is kept for when it returns. */\r\nexport function dockFullWidth(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n index: number,\r\n): PosWorkspaceLayout {\r\n return dockSpan(layout, id, 'top', index);\r\n}\r\n\r\n/** Places a pane in a row that spans both columns, above or below the split. */\r\nexport function dockSpan(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n edge: PosWorkspaceSpan,\r\n index: number,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n if (!current) {\r\n return layout;\r\n }\r\n\r\n const remaining = layout.panes.filter((pane) => pane.id !== id);\r\n const top = remaining\r\n .filter((pane) => paneSpan(pane) === 'top')\r\n .sort((a, b) => a.order - b.order);\r\n const bottom = remaining\r\n .filter((pane) => paneSpan(pane) === 'bottom')\r\n .sort((a, b) => a.order - b.order);\r\n const body = remaining.filter((pane) => paneSpan(pane) === null);\r\n const group = edge === 'top' ? top : bottom;\r\n group.splice(clamp(index, 0, group.length), 0, current);\r\n\r\n const panes = sortPanes([\r\n ...top.map((pane, order) => ({ ...pane, fullWidth: true, span: 'top' as const, order })),\r\n ...bottom.map((pane, order) => ({ ...pane, fullWidth: false, span: 'bottom' as const, order })),\r\n ...reindex(body),\r\n ]);\r\n const next = { ...layout, panes };\r\n return sameLayout(layout, next) ? layout : next;\r\n}\r\n\r\nexport function resizeAdjacent(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n nextId: PosWorkspacePaneId,\r\n delta: number,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n const next = layout.panes.find((pane) => pane.id === nextId);\r\n if (!current || !next || current.id === next.id) {\r\n return layout;\r\n }\r\n\r\n const currentBase = current.weight > 0 ? current.weight : 1;\r\n const nextBase = next.weight > 0 ? next.weight : 1;\r\n const grown = clamp(currentBase + delta, MIN_WEIGHT, MAX_WEIGHT);\r\n const requested = grown - currentBase;\r\n const nextWeight = clamp(nextBase - requested, MIN_WEIGHT, MAX_WEIGHT);\r\n const taken = nextBase - nextWeight;\r\n const currentWeight = clamp(currentBase + taken, MIN_WEIGHT, MAX_WEIGHT);\r\n\r\n return {\r\n ...layout,\r\n panes: layout.panes.map((pane) => {\r\n if (pane.id === current.id) {\r\n return { ...pane, weight: roundWeight(currentWeight) };\r\n }\r\n\r\n if (pane.id === next.id) {\r\n return { ...pane, weight: roundWeight(nextWeight) };\r\n }\r\n\r\n return pane;\r\n }),\r\n };\r\n}\r\n\r\n/** Weight 0 sizes to content. A positive weight shares leftover height in that column. */\r\n/** Turns full width on at the pane's current place, or returns it to its column width. */\r\nexport function setPaneFullWidth(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n enabled: boolean,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n if (!current) {\r\n return layout;\r\n }\r\n\r\n const wide = paneFillsWidth(current);\r\n if (!enabled && !wide) {\r\n return layout;\r\n }\r\n\r\n if (enabled && current.fullWidth === true && current.span == null) {\r\n return layout;\r\n }\r\n\r\n return {\r\n ...layout,\r\n panes: layout.panes.map((pane) => {\r\n if (pane.id !== id) {\r\n return pane;\r\n }\r\n\r\n if (!enabled) {\r\n const { span: _span, fullWidth: _fullWidth, ...rest } = pane;\r\n return rest;\r\n }\r\n\r\n const { span: _span, ...rest } = pane;\r\n return { ...rest, fullWidth: true };\r\n }),\r\n };\r\n}\r\n\r\nexport function setPaneWeight(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n weight: number,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n if (!current || current.weight === weight) {\r\n return layout;\r\n }\r\n\r\n return {\r\n ...layout,\r\n panes: layout.panes.map((pane) => (pane.id === id ? { ...pane, weight } : pane)),\r\n };\r\n}\r\n\r\n/** `false` keeps the pane in the layout and hides it on the till. `true` clears that flag. */\r\nexport function setPaneVisible(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n visible: boolean,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n if (!current || (current.visible !== false) === visible) {\r\n return layout;\r\n }\r\n\r\n return {\r\n ...layout,\r\n panes: layout.panes.map((pane) => {\r\n if (pane.id !== id) {\r\n return pane;\r\n }\r\n\r\n if (visible) {\r\n const { visible: _hidden, ...shown } = pane;\r\n return shown;\r\n }\r\n\r\n return { ...pane, visible: false };\r\n }),\r\n };\r\n}\r\n\r\nexport function setColumnRatio(layout: PosWorkspaceLayout, ratio: number): PosWorkspaceLayout {\r\n const startColumnRatio = roundWeight(clamp(ratio, MIN_RATIO, MAX_RATIO));\r\n if (startColumnRatio === layout.startColumnRatio) {\r\n return layout;\r\n }\r\n\r\n return { ...layout, startColumnRatio };\r\n}\r\n\r\nexport function sameLayout(left: PosWorkspaceLayout, right: PosWorkspaceLayout): boolean {\r\n if (\r\n left.startColumnRatio !== right.startColumnRatio ||\r\n left.panes.length !== right.panes.length\r\n ) {\r\n return false;\r\n }\r\n\r\n const byId = (layout: PosWorkspaceLayout) =>\r\n layout.panes.slice().sort((a, b) => a.id.localeCompare(b.id));\r\n return byId(left).every((pane, index) => {\r\n const other = byId(right)[index];\r\n return (\r\n pane.id === other.id &&\r\n pane.column === other.column &&\r\n pane.order === other.order &&\r\n pane.weight === other.weight &&\r\n paneSpan(pane) === paneSpan(other) &&\r\n (pane.fullWidth === true) === (other.fullWidth === true) &&\r\n (pane.visible !== false) === (other.visible !== false)\r\n );\r\n });\r\n}\r\n\r\nfunction placedPanes(\r\n layout: PosWorkspaceLayout,\r\n present: readonly PosWorkspacePaneId[],\r\n): PosWorkspacePanePlacement[] {\r\n const presentIds = new Set(present);\r\n const seen = new Set<PosWorkspacePaneId>();\r\n const panes: PosWorkspacePanePlacement[] = [];\r\n\r\n for (const pane of layout.panes) {\r\n if (seen.has(pane.id)) {\r\n continue;\r\n }\r\n\r\n if (!presentIds.has(pane.id) && !isEmptyPaneId(pane.id)) {\r\n continue;\r\n }\r\n\r\n seen.add(pane.id);\r\n panes.push(pane);\r\n }\r\n\r\n return panes;\r\n}\r\n\r\nfunction visualColumns(\r\n panes: readonly PosWorkspacePanePlacement[],\r\n compact: boolean,\r\n): [PosWorkspacePanePlacement[], PosWorkspacePanePlacement[]] {\r\n const left = columnList(panes, 0);\r\n const right = columnList(panes, 1);\r\n\r\n if (compact) {\r\n return [compactStack(left, right), []];\r\n }\r\n\r\n if (right.length === 0) {\r\n return [left, []];\r\n }\r\n\r\n if (left.length === 0) {\r\n return [right, []];\r\n }\r\n\r\n return [left, right];\r\n}\r\n\r\n/** On a narrow screen, keep the header at the top and the action bar at the bottom. */\r\nfunction compactStack(\r\n left: readonly PosWorkspacePanePlacement[],\r\n right: readonly PosWorkspacePanePlacement[],\r\n): PosWorkspacePanePlacement[] {\r\n const all = [...left, ...right];\r\n const header = all.filter((pane) => pane.id === 'header');\r\n const actionBar = all.filter((pane) => pane.id === 'actionBar');\r\n const middle = all.filter((pane) => pane.id !== 'header' && pane.id !== 'actionBar');\r\n return [...header, ...middle, ...actionBar];\r\n}\r\n\r\nfunction columnList(\r\n panes: readonly PosWorkspacePanePlacement[],\r\n column: PosWorkspaceColumn,\r\n): PosWorkspacePanePlacement[] {\r\n return panes.filter((pane) => pane.column === column).sort((a, b) => a.order - b.order);\r\n}\r\n\r\nfunction singleColumnGrid(panes: readonly PosWorkspacePanePlacement[]): PosWorkspaceGrid {\r\n const rows = panes.map((pane) => rowTrack(pane.weight));\r\n\r\n return {\r\n columns: 'minmax(0, 1fr)',\r\n rows: rows.join(' '),\r\n split: false,\r\n panes: panes.map((pane, index) => ({\r\n id: pane.id,\r\n column: 1 as const,\r\n rowStart: index + 1,\r\n rowEnd: index + 2,\r\n showResize: index < panes.length - 1,\r\n spanColumns: pane.fullWidth === true ? true : undefined,\r\n })),\r\n };\r\n}\r\n\r\nfunction splitGrid(\r\n left: readonly PosWorkspacePanePlacement[],\r\n right: readonly PosWorkspacePanePlacement[],\r\n ratio: number,\r\n): PosWorkspaceGrid {\r\n const spanLeft = left.length === 1 && right.length > 1;\r\n const spanRight = right.length === 1 && left.length > 1;\r\n\r\n if (!spanLeft && !spanRight) {\r\n if (left.length === 1 && right.length === 1) {\r\n return {\r\n columns: columnTemplate(ratio),\r\n rows: 'minmax(0, 1fr)',\r\n split: true,\r\n panes: [gridPane(left[0], 1, 1, 2, false), gridPane(right[0], 2, 1, 2, false)],\r\n };\r\n }\r\n\r\n return sharedRowGrid(left, right, ratio);\r\n }\r\n\r\n const stack = spanRight ? left : right;\r\n const spanning = spanRight ? right[0] : left[0];\r\n const stackColumn = spanRight ? 1 : 2;\r\n const spanColumn = spanRight ? 2 : 1;\r\n const rows = stackTracks(stack);\r\n\r\n return {\r\n columns: columnTemplate(ratio),\r\n rows: rows.join(' '),\r\n split: true,\r\n panes: [\r\n ...stack.map((pane, index) =>\r\n gridPane(pane, stackColumn, index + 1, index + 2, index < stack.length - 1),\r\n ),\r\n gridPane(spanning, spanColumn, 1, rows.length + 1, false),\r\n ],\r\n };\r\n}\r\n\r\n/** Row size follows weight. Weight 0 is the content height. A positive weight shares leftover height. */\r\nfunction stackTracks(stack: readonly PosWorkspacePanePlacement[]): string[] {\r\n return stack.map((pane) => rowTrack(pane.weight));\r\n}\r\n\r\nfunction sharedRowGrid(\r\n left: readonly PosWorkspacePanePlacement[],\r\n right: readonly PosWorkspacePanePlacement[],\r\n ratio: number,\r\n): PosWorkspaceGrid {\r\n const rowCount = Math.max(left.length, right.length);\r\n const rows: string[] = [];\r\n for (let index = 0; index < rowCount; index += 1) {\r\n const weight = Math.max(left[index]?.weight ?? 0, right[index]?.weight ?? 0);\r\n rows.push(weight > 0 ? rowTrack(weight) : 'auto');\r\n }\r\n\r\n const place = (list: readonly PosWorkspacePanePlacement[], column: 1 | 2) =>\r\n list.map((pane, index) =>\r\n gridPane(pane, column, index + 1, index + 2, index < list.length - 1),\r\n );\r\n\r\n return {\r\n columns: columnTemplate(ratio),\r\n rows: rows.join(' '),\r\n split: true,\r\n panes: [...place(left, 1), ...place(right, 2)],\r\n };\r\n}\r\n\r\nfunction gridPane(\r\n pane: PosWorkspacePanePlacement,\r\n column: 1 | 2,\r\n rowStart: number,\r\n rowEnd: number,\r\n showResize: boolean,\r\n): PosWorkspaceGridPane {\r\n return { id: pane.id, column, rowStart, rowEnd, showResize };\r\n}\r\n\r\nfunction columnTemplate(ratio: number): string {\r\n const start = roundWeight(clamp(ratio, MIN_RATIO, MAX_RATIO));\r\n const end = roundWeight(1 - start);\r\n return `minmax(0, ${start}fr) minmax(0, ${end}fr)`;\r\n}\r\n\r\n/** Counts CSS grid tracks. Spaces inside minmax() stay part of one track. */\r\nfunction trackCount(template: string): number {\r\n let depth = 0;\r\n let count = 0;\r\n let current = false;\r\n\r\n for (const char of template.trim()) {\r\n if (char === '(') {\r\n depth += 1;\r\n } else if (char === ')') {\r\n depth = Math.max(0, depth - 1);\r\n }\r\n\r\n if (depth === 0 && char === ' ') {\r\n current = false;\r\n continue;\r\n }\r\n\r\n if (!current) {\r\n current = true;\r\n count += 1;\r\n }\r\n }\r\n\r\n return count;\r\n}\r\n\r\nfunction rowTrack(weight: number): string {\r\n if (weight <= 0) {\r\n return 'auto';\r\n }\r\n\r\n return `minmax(0, ${roundWeight(weight)}fr)`;\r\n}\r\n\r\nfunction reindex(panes: readonly PosWorkspacePanePlacement[]): PosWorkspacePanePlacement[] {\r\n const columns: PosWorkspaceColumn[] = [0, 1];\r\n const result: PosWorkspacePanePlacement[] = [];\r\n for (const column of columns) {\r\n columnList(panes, column).forEach((pane, order) => {\r\n result.push({ ...pane, order });\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction sortPanes(panes: readonly PosWorkspacePanePlacement[]): PosWorkspacePanePlacement[] {\r\n return panes.slice().sort((a, b) => a.column - b.column || a.order - b.order);\r\n}\r\n\r\nfunction roundWeight(value: number): number {\r\n return Math.round(value * 100) / 100;\r\n}\r\n\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\n\r\nimport { POS_WORKSPACE, type PosWorkspaceMoveKey } from './pos-workspace-controller';\r\nimport { workspacePaneLabel, type PosWorkspacePaneId } from './pos-workspace-layout';\r\n\r\n@Component({\r\n selector: 'pos-workspace-pane',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-workspace-pane.html',\r\n styleUrl: './pos-workspace-pane.scss',\r\n host: {\r\n class: 'pos-workspace-pane',\r\n '[class.pos-workspace-pane--editing]': 'workspace.editing()',\r\n '[class.pos-workspace-pane--dragging]': 'dragging()',\r\n '[class.pos-workspace-pane--hidden]': 'concealed()',\r\n '[attr.data-pane]': 'paneId()',\r\n '[style.display]': 'place() ? null : \"none\"',\r\n '[style.grid-column]': 'columnStyle()',\r\n '[style.grid-row]': 'rowStyle()',\r\n },\r\n})\r\nexport class PosWorkspacePane {\r\n protected readonly workspace = inject(POS_WORKSPACE);\r\n\r\n readonly paneId = input.required<PosWorkspacePaneId>();\r\n /** Draws the unassigned-slot message. The POS replaces this by projecting the same pane id. */\r\n readonly placeholder = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly place = computed(() => this.workspace.placements().get(this.paneId()));\r\n\r\n protected readonly dragging = computed(() => this.workspace.draggingPane() === this.paneId());\r\n protected readonly columnStyle = computed(() => {\r\n const place = this.place();\r\n if (!place) {\r\n return null;\r\n }\r\n\r\n return place.spanColumns ? '1 / -1' : place.column;\r\n });\r\n protected readonly rowStyle = computed(() => {\r\n const place = this.place();\r\n return place ? `${place.rowStart} / ${place.rowEnd}` : null;\r\n });\r\n protected readonly showResize = computed(() => this.place()?.showResize === true);\r\n protected readonly concealed = computed(() => this.place()?.concealed === true);\r\n protected readonly settingsOpen = computed(\r\n () => this.workspace.settingsPane() === this.paneId(),\r\n );\r\n protected readonly fullWidth = computed(() => this.workspace.fullWidthIds().has(this.paneId()));\r\n protected readonly shown = computed(() => this.place()?.concealed !== true);\r\n protected readonly flexible = computed(() => this.workspace.flexibleIds().has(this.paneId()));\r\n protected readonly label = computed(() => workspacePaneLabel(this.paneId()));\r\n protected readonly menuAbove = computed(() => {\r\n const place = this.place();\r\n if (!place) {\r\n return false;\r\n }\r\n\r\n let maxEnd = place.rowEnd;\r\n for (const item of this.workspace.placements().values()) {\r\n maxEnd = Math.max(maxEnd, item.rowEnd);\r\n }\r\n\r\n return place.rowEnd === maxEnd && this.workspace.placements().size > 1;\r\n });\r\n protected readonly handleLabel = computed(\r\n () => `Move ${this.label()}. Arrow keys change its position.`,\r\n );\r\n protected readonly resizeLabel = computed(\r\n () => `Resize ${this.label()}. Arrow keys change its height.`,\r\n );\r\n protected readonly settingsLabel = computed(() => `${this.label()} settings`);\r\n protected readonly closeMenuLabel = computed(() => `Close ${this.label()} settings`);\r\n protected readonly removeLabel = computed(() => `Remove ${this.label()}`);\r\n\r\n protected onDragPointerDown(event: PointerEvent): void {\r\n if (!this.workspace.editing()) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.workspace.closePaneSettings(this.paneId());\r\n this.capture(event);\r\n this.workspace.beginPaneDrag(this.paneId(), event);\r\n }\r\n\r\n protected onDragPointerMove(event: PointerEvent): void {\r\n if (this.workspace.draggingPane() !== this.paneId()) {\r\n return;\r\n }\r\n\r\n this.workspace.updatePaneDrag(event);\r\n }\r\n\r\n protected onDragPointerUp(event: PointerEvent): void {\r\n if (this.workspace.draggingPane() !== this.paneId()) {\r\n return;\r\n }\r\n\r\n this.workspace.endPaneDrag(event);\r\n }\r\n\r\n protected onHandleKeydown(event: KeyboardEvent): void {\r\n if (!this.isMoveKey(event.key)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.workspace.moveByKey(this.paneId(), event.key);\r\n }\r\n\r\n protected toggleSettings(event: Event): void {\r\n event.stopPropagation();\r\n this.workspace.togglePaneSettings(this.paneId());\r\n }\r\n\r\n protected closeSettings(event: Event): void {\r\n event.stopPropagation();\r\n this.workspace.closePaneSettings(this.paneId());\r\n }\r\n\r\n protected onSettingsKeydown(event: KeyboardEvent): void {\r\n if (event.key !== 'Escape') {\r\n return;\r\n }\r\n\r\n event.stopPropagation();\r\n this.workspace.closePaneSettings(this.paneId());\r\n }\r\n\r\n protected onVisible(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.workspace.setVisible(this.paneId(), target.checked);\r\n }\r\n\r\n protected onFlexible(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.workspace.setFlexible(this.paneId(), target.checked);\r\n }\r\n\r\n protected onFullWidth(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.workspace.setFullWidth(this.paneId(), target.checked);\r\n }\r\n\r\n protected onRemove(event: Event): void {\r\n event.stopPropagation();\r\n this.workspace.closePaneSettings(this.paneId());\r\n this.workspace.removeFromLayout(this.paneId());\r\n }\r\n\r\n protected onResizePointerDown(event: PointerEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.capture(event);\r\n this.workspace.beginPaneResize(this.paneId(), event);\r\n }\r\n\r\n protected onResizePointerMove(event: PointerEvent): void {\r\n this.workspace.updatePaneResize(event);\r\n }\r\n\r\n protected onResizePointerUp(): void {\r\n this.workspace.endPaneResize();\r\n }\r\n\r\n protected onResizeKeydown(event: KeyboardEvent): void {\r\n if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.workspace.resizeByKey(this.paneId(), event.key === 'ArrowDown' ? 1 : -1);\r\n }\r\n\r\n private capture(event: PointerEvent): void {\r\n const handle = event.currentTarget;\r\n if (!(handle instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n try {\r\n handle.setPointerCapture(event.pointerId);\r\n } catch {\r\n // The pointer is not active yet. The drag still follows pointerup on the handle.\r\n }\r\n }\r\n\r\n private isMoveKey(key: string): key is PosWorkspaceMoveKey {\r\n return key === 'ArrowUp' || key === 'ArrowDown' || key === 'ArrowLeft' || key === 'ArrowRight';\r\n }\r\n}\r\n","@if (concealed()) {\r\n <p class=\"pos-workspace-pane__concealed\">Hidden on the till. {{ label() }}.</p>\r\n}\r\n\r\n<div class=\"pos-workspace-pane__content\">\r\n <ng-content />\r\n @if (placeholder()) {\r\n <p class=\"pos-workspace-pane__slot\">{{ label() }}. The POS assigns what appears here.</p>\r\n }\r\n</div>\r\n\r\n@if (workspace.editing()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace-pane__handle\"\r\n [attr.aria-label]=\"handleLabel()\"\r\n aria-keyshortcuts=\"ArrowUp ArrowDown ArrowLeft ArrowRight\"\r\n (pointerdown)=\"onDragPointerDown($event)\"\r\n (pointermove)=\"onDragPointerMove($event)\"\r\n (pointerup)=\"onDragPointerUp($event)\"\r\n (pointercancel)=\"onDragPointerUp($event)\"\r\n (keydown)=\"onHandleKeydown($event)\"\r\n >\r\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">\r\n <circle cx=\"5\" cy=\"3\" r=\"1.2\" />\r\n <circle cx=\"11\" cy=\"3\" r=\"1.2\" />\r\n <circle cx=\"5\" cy=\"8\" r=\"1.2\" />\r\n <circle cx=\"11\" cy=\"8\" r=\"1.2\" />\r\n <circle cx=\"5\" cy=\"13\" r=\"1.2\" />\r\n <circle cx=\"11\" cy=\"13\" r=\"1.2\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace-pane__settings\"\r\n [attr.aria-label]=\"settingsLabel()\"\r\n [attr.aria-expanded]=\"settingsOpen()\"\r\n (click)=\"toggleSettings($event)\"\r\n (keydown)=\"onSettingsKeydown($event)\"\r\n >\r\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">\r\n <path d=\"M2 4h12M2 8h12M2 12h12\" />\r\n <circle cx=\"6\" cy=\"4\" r=\"1.5\" />\r\n <circle cx=\"11\" cy=\"8\" r=\"1.5\" />\r\n <circle cx=\"7\" cy=\"12\" r=\"1.5\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace-pane__close\"\r\n [attr.aria-label]=\"removeLabel()\"\r\n (click)=\"onRemove($event)\"\r\n >\r\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">\r\n <path d=\"M4 4l8 8M12 4l-8 8\" />\r\n </svg>\r\n </button>\r\n\r\n @if (settingsOpen()) {\r\n <div\r\n class=\"pos-workspace-pane__menu\"\r\n [class.pos-workspace-pane__menu--above]=\"menuAbove()\"\r\n role=\"group\"\r\n [attr.aria-label]=\"settingsLabel()\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace-pane__menu-close\"\r\n [attr.aria-label]=\"closeMenuLabel()\"\r\n (click)=\"closeSettings($event)\"\r\n >\r\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">\r\n <path d=\"M4 4l8 8M12 4l-8 8\" />\r\n </svg>\r\n </button>\r\n <label class=\"pos-workspace-pane__option\">\r\n <input type=\"checkbox\" [checked]=\"shown()\" (change)=\"onVisible($event)\" />\r\n Visible\r\n </label>\r\n <label class=\"pos-workspace-pane__option\">\r\n <input type=\"checkbox\" [checked]=\"flexible()\" (change)=\"onFlexible($event)\" />\r\n Flexible height\r\n </label>\r\n <label class=\"pos-workspace-pane__option\">\r\n <input type=\"checkbox\" [checked]=\"fullWidth()\" (change)=\"onFullWidth($event)\" />\r\n Full width\r\n </label>\r\n </div>\r\n }\r\n\r\n @if (showResize()) {\r\n <div\r\n class=\"pos-workspace-pane__resize\"\r\n role=\"separator\"\r\n aria-orientation=\"horizontal\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"resizeLabel()\"\r\n aria-keyshortcuts=\"ArrowUp ArrowDown\"\r\n (pointerdown)=\"onResizePointerDown($event)\"\r\n (pointermove)=\"onResizePointerMove($event)\"\r\n (pointerup)=\"onResizePointerUp()\"\r\n (pointercancel)=\"onResizePointerUp()\"\r\n (keydown)=\"onResizeKeydown($event)\"\r\n ></div>\r\n }\r\n}\r\n","import {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChildren,\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n forwardRef,\r\n inject,\r\n input,\r\n linkedSignal,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\n\r\nimport { POS_WORKSPACE, type PosWorkspaceMoveKey } from './pos-workspace-controller';\r\nimport {\r\n addPane,\r\n dropColumn,\r\n insertionIndex,\r\n isEmptyPaneId,\r\n movePane,\r\n nextEmptyId,\r\n paneSpan,\r\n paneFillsWidth,\r\n POS_WORKSPACE_DEFAULT_LAYOUT,\r\n POS_WORKSPACE_PANE_IDS,\r\n removePane,\r\n resizeAdjacent,\r\n sameLayout,\r\n setColumnRatio,\r\n setPaneFullWidth,\r\n setPaneVisible,\r\n setPaneWeight,\r\n workspaceGrid,\r\n parseWorkspaceLayout,\r\n workspaceLayoutJson,\r\n workspacePaneLabel,\r\n type PosWorkspaceBuiltinPaneId,\r\n type PosWorkspaceColumn,\r\n type PosWorkspaceLayout,\r\n type PosWorkspacePaneId,\r\n type PosWorkspaceSpan,\r\n} from './pos-workspace-layout';\r\nimport { PosWorkspacePane } from './pos-workspace-pane';\r\n\r\ninterface PosWorkspaceDropIndicator {\r\n readonly top: number;\r\n readonly left: number;\r\n readonly width: number;\r\n readonly height: number;\r\n readonly line: boolean;\r\n}\r\n\r\ninterface PosWorkspaceDropTarget {\r\n readonly fullWidth: boolean;\r\n readonly column: PosWorkspaceColumn;\r\n readonly index: number;\r\n}\r\n\r\ninterface PosWorkspaceDropHint {\r\n readonly kind: 'top' | 'bottom' | 'dock';\r\n readonly top: number;\r\n readonly left: number;\r\n readonly width: number;\r\n readonly height: number;\r\n}\r\n\r\ninterface PosWorkspaceResizeSession {\r\n readonly id: PosWorkspacePaneId;\r\n readonly nextId: PosWorkspacePaneId;\r\n readonly startY: number;\r\n readonly startLayout: PosWorkspaceLayout;\r\n readonly span: number;\r\n}\r\n\r\nconst COMPACT_WIDTH = 720;\r\nconst DOCK_THRESHOLD = 0.7;\r\n/** Band above a docked right column where a drop spans both columns. */\r\nconst FULL_WIDTH_BAND = 72;\r\n\r\n@Component({\r\n selector: 'pos-workspace',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [PosWorkspacePane],\r\n templateUrl: './pos-workspace.html',\r\n styleUrl: './pos-workspace.scss',\r\n providers: [{ provide: POS_WORKSPACE, useExisting: forwardRef(() => PosWorkspace) }],\r\n host: {\r\n class: 'pos-workspace',\r\n '[class.pos-workspace--editing]': 'editing()',\r\n '[class.pos-workspace--dragging]': 'draggingPane() !== null',\r\n },\r\n})\r\nexport class PosWorkspace {\r\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly paneRefs = contentChildren(PosWorkspacePane);\r\n private readonly frameRef = viewChild<ElementRef<HTMLElement>>('frame');\r\n\r\n /** Draws outlines, drag handles, and resize controls. */\r\n readonly editing = input(false);\r\n /** Starting arrangement. Edits stay in this view until a new layout input arrives. */\r\n readonly layout = input<PosWorkspaceLayout>(POS_WORKSPACE_DEFAULT_LAYOUT);\r\n /** Fired when the arrangement changes. Nothing is stored beyond this view. */\r\n readonly layoutChange = output<PosWorkspaceLayout>();\r\n /** The arrangement to pass back as `layout` from the consuming POS. */\r\n readonly layoutExport = output<PosWorkspaceLayout>();\r\n\r\n private readonly layoutState = linkedSignal(() => this.layout());\r\n private readonly viewportWidth = signal(1280);\r\n private readonly dropTarget = signal<PosWorkspaceDropTarget | null>(null);\r\n private resizeSession: PosWorkspaceResizeSession | null = null;\r\n private paletteGesture: {\r\n readonly id: PosWorkspacePaneId;\r\n readonly x: number;\r\n readonly y: number;\r\n } | null = null;\r\n private ignorePaletteClick = false;\r\n protected readonly paletteOpen = signal(false);\r\n protected readonly paletteMenuLifted = signal(false);\r\n private splitting = false;\r\n private splitStartLayout: PosWorkspaceLayout | null = null;\r\n private readonly history: PosWorkspaceLayout[] = [];\r\n protected readonly canUndo = signal(false);\r\n\r\n readonly draggingPane = signal<PosWorkspacePaneId | null>(null);\r\n readonly settingsPane = signal<PosWorkspacePaneId | null>(null);\r\n readonly spans = computed(() => {\r\n const map = new Map<PosWorkspacePaneId, PosWorkspaceSpan | null>();\r\n for (const pane of this.layoutState().panes) {\r\n map.set(pane.id, paneSpan(pane));\r\n }\r\n return map;\r\n });\r\n readonly fullWidthIds = computed(() => {\r\n const ids = new Set<PosWorkspacePaneId>();\r\n for (const pane of this.layoutState().panes) {\r\n if (paneFillsWidth(pane)) {\r\n ids.add(pane.id);\r\n }\r\n }\r\n return ids;\r\n });\r\n readonly flexibleIds = computed(() => {\r\n const ids = new Set<PosWorkspacePaneId>();\r\n for (const pane of this.layoutState().panes) {\r\n if (pane.weight > 0) {\r\n ids.add(pane.id);\r\n }\r\n }\r\n return ids;\r\n });\r\n protected readonly dropIndicator = signal<PosWorkspaceDropIndicator | null>(null);\r\n protected readonly dropHints = signal<readonly PosWorkspaceDropHint[]>([]);\r\n protected readonly status = signal('');\r\n\r\n private readonly compact = computed(() => this.viewportWidth() < COMPACT_WIDTH);\r\n\r\n protected readonly grid = computed(() =>\r\n workspaceGrid(\r\n this.layoutState(),\r\n this.paneRefs().map((pane) => pane.paneId()),\r\n { compact: this.compact(), includeHidden: this.editing() },\r\n ),\r\n );\r\n\r\n /** Library components the host projected that are not on the screen yet. */\r\n protected readonly palette = computed(() => {\r\n const placed = new Set(this.layoutState().panes.map((pane) => pane.id));\r\n const projected = new Set(this.paneRefs().map((pane) => pane.paneId()));\r\n return POS_WORKSPACE_PANE_IDS.filter((id) => projected.has(id) && !placed.has(id));\r\n });\r\n\r\n /** Empty slots with no projected content. The POS fills a slot by projecting the same id. */\r\n protected readonly emptySlots = computed(() => {\r\n const projected = new Set(this.paneRefs().map((pane) => pane.paneId()));\r\n const seen = new Set<string>();\r\n const slots: `empty-${number}`[] = [];\r\n for (const pane of this.layoutState().panes) {\r\n if (!isEmptyPaneId(pane.id)) {\r\n continue;\r\n }\r\n\r\n if (projected.has(pane.id) || seen.has(pane.id)) {\r\n continue;\r\n }\r\n\r\n seen.add(pane.id);\r\n slots.push(pane.id);\r\n }\r\n\r\n return slots;\r\n });\r\n\r\n protected readonly paneLabel = workspacePaneLabel;\r\n\r\n readonly placements = computed(() => {\r\n const map = new Map<PosWorkspacePaneId, ReturnType<typeof workspaceGrid>['panes'][number]>();\r\n for (const pane of this.grid().panes) {\r\n map.set(pane.id, pane);\r\n }\r\n return map;\r\n });\r\n\r\n protected readonly showSplitter = computed(\r\n () => this.editing() && this.grid().split && !this.compact(),\r\n );\r\n\r\n /** The rows the right column occupies, so the bar stays off full-width panes. */\r\n protected readonly splitterRow = computed(() => {\r\n const splitPanes = this.grid().panes.filter((pane) => pane.column === 2);\r\n if (splitPanes.length === 0) {\r\n return '1 / -1';\r\n }\r\n\r\n const start = Math.min(...splitPanes.map((pane) => pane.rowStart));\r\n const end = Math.max(...splitPanes.map((pane) => pane.rowEnd));\r\n return `${start} / ${end}`;\r\n });\r\n\r\n protected readonly splitterLeft = computed(() => {\r\n const ratio = this.layoutState().startColumnRatio;\r\n return `calc((100% - var(--pos-space-md)) * ${ratio})`;\r\n });\r\n\r\n protected readonly ratioPercent = computed(() =>\r\n Math.round(this.layoutState().startColumnRatio * 100),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n if (!this.editing()) {\r\n this.clearInteraction();\r\n }\r\n });\r\n\r\n effect(() => {\r\n this.layout();\r\n untracked(() => {\r\n this.history.length = 0;\r\n this.canUndo.set(false);\r\n });\r\n });\r\n\r\n afterNextRender(() => {\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n const element = this.hostRef.nativeElement;\r\n const observer = new ResizeObserver((entries) => {\r\n const width = entries[0]?.contentRect.width ?? 0;\r\n if (width >= 1) {\r\n this.viewportWidth.set(width);\r\n }\r\n });\r\n observer.observe(element);\r\n this.destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n togglePaneSettings(id: PosWorkspacePaneId): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n this.settingsPane.update((current) => (current === id ? null : id));\r\n }\r\n\r\n closePaneSettings(id: PosWorkspacePaneId): void {\r\n if (this.settingsPane() === id) {\r\n this.settingsPane.set(null);\r\n }\r\n }\r\n\r\n moveByKey(id: PosWorkspacePaneId, key: PosWorkspaceMoveKey): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const layout = this.layoutState();\r\n const pane = layout.panes.find((item) => item.id === id);\r\n if (!pane) {\r\n return;\r\n }\r\n\r\n if (key === 'ArrowLeft' || key === 'ArrowRight') {\r\n if (this.compact()) {\r\n this.status.set('Widen the screen to dock a pane beside the others.');\r\n return;\r\n }\r\n\r\n const column: PosWorkspaceColumn = key === 'ArrowRight' ? 1 : 0;\r\n if (pane.column === column && paneSpan(pane) === null) {\r\n return;\r\n }\r\n\r\n const index = layout.panes.filter(\r\n (item) => item.column === column && paneSpan(item) === null,\r\n ).length;\r\n this.commit(movePane(layout, id, column, index), this.messageForMove(id, column));\r\n return;\r\n }\r\n\r\n const edge = paneSpan(pane);\r\n if (edge === 'top') {\r\n if (key === 'ArrowDown') {\r\n this.commit(\r\n movePane(layout, id, 0, 0),\r\n `${workspacePaneLabel(id)} returned to the left stack.`,\r\n );\r\n }\r\n return;\r\n }\r\n\r\n if (edge === 'bottom') {\r\n if (key === 'ArrowUp') {\r\n const index = layout.panes.filter(\r\n (item) => item.column === 0 && paneSpan(item) === null,\r\n ).length;\r\n this.commit(\r\n movePane(layout, id, 0, index),\r\n `${workspacePaneLabel(id)} returned to the left stack.`,\r\n );\r\n }\r\n return;\r\n }\r\n\r\n const siblings = layout.panes\r\n .filter((item) => item.column === pane.column && paneSpan(item) === null)\r\n .sort((a, b) => a.order - b.order);\r\n const currentIndex = siblings.findIndex((item) => item.id === id);\r\n const index = key === 'ArrowUp' ? Math.max(0, currentIndex - 1) : currentIndex + 1;\r\n this.commit(movePane(layout, id, pane.column, index), `${workspacePaneLabel(id)} moved.`);\r\n }\r\n\r\n resizeByKey(id: PosWorkspacePaneId, direction: -1 | 1): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const nextId = this.nextVisualId(id);\r\n if (!nextId) {\r\n return;\r\n }\r\n\r\n this.commit(\r\n resizeAdjacent(this.layoutState(), id, nextId, direction * 0.2),\r\n `${workspacePaneLabel(id)} height adjusted.`,\r\n );\r\n }\r\n\r\n beginPaneDrag(id: PosWorkspacePaneId, event: PointerEvent): void {\r\n if (!this.editing() || !this.isPrimaryPointer(event)) {\r\n return;\r\n }\r\n\r\n this.resizeSession = null;\r\n this.draggingPane.set(id);\r\n this.status.set(`Moving ${workspacePaneLabel(id)}. Release to place it.`);\r\n this.updatePaneDrag(event);\r\n }\r\n\r\n updatePaneDrag(event: PointerEvent): void {\r\n const id = this.draggingPane();\r\n const grid = this.gridElement();\r\n if (!id || !grid || !this.editing()) {\r\n return;\r\n }\r\n\r\n const rect = grid.getBoundingClientRect();\r\n if (rect.width <= 0 || rect.height <= 0) {\r\n return;\r\n }\r\n\r\n this.refreshDropHints(rect);\r\n\r\n const splitTop = this.splitBodyTop();\r\n if (splitTop != null && this.inFullWidthDropZone(event.clientY, rect, splitTop)) {\r\n const wideIds = this.idsAboveSplit().filter((paneId) => paneId !== id);\r\n const midpoints = wideIds.map((paneId) => {\r\n const paneRect = this.paneElement(paneId)?.getBoundingClientRect();\r\n return paneRect ? paneRect.top + paneRect.height / 2 : Number.POSITIVE_INFINITY;\r\n });\r\n const index = insertionIndex(event.clientY, midpoints);\r\n this.dropTarget.set({ fullWidth: true, column: 0, index });\r\n this.dropIndicator.set(this.fullWidthIndicator(index, wideIds, rect));\r\n return;\r\n }\r\n\r\n const xRatio = (event.clientX - rect.left) / rect.width;\r\n const threshold = this.grid().split ? this.layoutState().startColumnRatio : DOCK_THRESHOLD;\r\n const column = dropColumn(xRatio, threshold, this.compact());\r\n const ids = this.idsInVisualColumn(column).filter((paneId) => paneId !== id);\r\n const midpoints = ids.map((paneId) => {\r\n const paneRect = this.paneElement(paneId)?.getBoundingClientRect();\r\n return paneRect ? paneRect.top + paneRect.height / 2 : Number.POSITIVE_INFINITY;\r\n });\r\n const index = insertionIndex(event.clientY, midpoints);\r\n this.dropTarget.set({ fullWidth: false, column, index });\r\n this.dropIndicator.set(this.indicatorBox(column, index, ids, rect));\r\n }\r\n\r\n endPaneDrag(event?: PointerEvent): void {\r\n if (event?.type === 'pointercancel') {\r\n this.draggingPane.set(null);\r\n this.dropTarget.set(null);\r\n this.dropIndicator.set(null);\r\n this.dropHints.set([]);\r\n return;\r\n }\r\n\r\n if (event) {\r\n this.updatePaneDrag(event);\r\n }\r\n\r\n const id = this.draggingPane();\r\n const target = this.dropTarget();\r\n this.draggingPane.set(null);\r\n this.dropTarget.set(null);\r\n this.dropIndicator.set(null);\r\n this.dropHints.set([]);\r\n\r\n if (!id || !target || !this.editing()) {\r\n return;\r\n }\r\n\r\n const layout = this.layoutState();\r\n const added = !layout.panes.some((pane) => pane.id === id);\r\n const index = target.fullWidth\r\n ? this.bodyIndexForFullWidthDrop(target.index)\r\n : target.index;\r\n let next = added\r\n ? addPane(layout, id, target.column, index)\r\n : movePane(layout, id, target.column, index);\r\n if (target.fullWidth) {\r\n next = setPaneWeight(setPaneFullWidth(next, id, true), id, 0);\r\n }\r\n if (sameLayout(layout, next)) {\r\n this.status.set(`${workspacePaneLabel(id)} stayed in place.`);\r\n return;\r\n }\r\n\r\n this.commit(next, this.placeMessage(id, target, added));\r\n }\r\n\r\n protected onPalettePointerDown(\r\n kind: PosWorkspaceBuiltinPaneId | 'empty',\r\n event: PointerEvent,\r\n ): void {\r\n if (!this.editing() || !this.isPrimaryPointer(event)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const id = kind === 'empty' ? nextEmptyId(this.layoutState()) : kind;\r\n this.paletteGesture = { id, x: event.clientX, y: event.clientY };\r\n this.capture(event);\r\n this.beginPaneDrag(id, event);\r\n }\r\n\r\n protected onPalettePointerMove(event: PointerEvent): void {\r\n const gesture = this.paletteGesture;\r\n if (!gesture) {\r\n return;\r\n }\r\n\r\n if (Math.hypot(event.clientX - gesture.x, event.clientY - gesture.y) > 8) {\r\n this.paletteMenuLifted.set(true);\r\n }\r\n\r\n this.updatePaneDrag(event);\r\n }\r\n\r\n protected onPalettePointerUp(event: PointerEvent): void {\r\n const gesture = this.paletteGesture;\r\n if (!gesture) {\r\n return;\r\n }\r\n\r\n this.paletteGesture = null;\r\n this.ignorePaletteClick = true;\r\n setTimeout(() => {\r\n this.ignorePaletteClick = false;\r\n }, 0);\r\n\r\n const moved = Math.hypot(event.clientX - gesture.x, event.clientY - gesture.y) > 8;\r\n if (!moved) {\r\n this.clearDrag();\r\n this.commit(\r\n addPane(this.layoutState(), gesture.id, 0),\r\n `${workspacePaneLabel(gesture.id)} added.`,\r\n );\r\n return;\r\n }\r\n\r\n this.endPaneDrag(event);\r\n this.closePalette();\r\n }\r\n\r\n protected onPalettePointerCancel(): void {\r\n this.paletteGesture = null;\r\n this.clearDrag();\r\n this.paletteMenuLifted.set(false);\r\n }\r\n\r\n protected onPaletteClick(kind: PosWorkspaceBuiltinPaneId | 'empty'): void {\r\n if (this.ignorePaletteClick || !this.editing()) {\r\n return;\r\n }\r\n\r\n const id = kind === 'empty' ? nextEmptyId(this.layoutState()) : kind;\r\n this.commit(addPane(this.layoutState(), id, 0), `${workspacePaneLabel(id)} added.`);\r\n }\r\n\r\n protected togglePalette(): void {\r\n this.paletteOpen.update((open) => !open);\r\n if (!this.paletteOpen()) {\r\n this.paletteMenuLifted.set(false);\r\n }\r\n }\r\n\r\n protected closePalette(): void {\r\n this.paletteOpen.set(false);\r\n this.paletteMenuLifted.set(false);\r\n }\r\n\r\n protected onPaletteMenuKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.closePalette();\r\n this.hostRef.nativeElement\r\n .querySelector<HTMLElement>('.pos-workspace__palette-toggle')\r\n ?.focus();\r\n return;\r\n }\r\n\r\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') {\r\n return;\r\n }\r\n\r\n const menu = event.currentTarget;\r\n if (!(menu instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n const items = [...menu.querySelectorAll<HTMLButtonElement>('.pos-workspace__palette-item')];\r\n const current = items.indexOf(document.activeElement as HTMLButtonElement);\r\n const step = event.key === 'ArrowDown' ? 1 : -1;\r\n const next = items[(current + step + items.length) % items.length];\r\n event.preventDefault();\r\n next?.focus();\r\n }\r\n\r\n protected undoLayout(): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const previous = this.history.pop();\r\n if (!previous) {\r\n this.canUndo.set(false);\r\n return;\r\n }\r\n\r\n this.canUndo.set(this.history.length > 0);\r\n this.clearInteraction();\r\n this.layoutState.set(previous);\r\n this.publish('Last edit undone.');\r\n }\r\n\r\n protected applyDefaultLayout(): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n this.clearInteraction();\r\n this.commit(POS_WORKSPACE_DEFAULT_LAYOUT, 'Default layout restored.');\r\n }\r\n\r\n protected resetLayout(): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n this.clearInteraction();\r\n this.commit({ ...this.layoutState(), panes: [] }, 'New layout.');\r\n }\r\n\r\n protected exportLayout(): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const layout = this.layoutState();\r\n this.clearInteraction();\r\n this.layoutExport.emit(layout);\r\n this.downloadLayout(workspaceLayoutJson(layout));\r\n this.status.set('Layout exported.');\r\n }\r\n\r\n protected importLayoutFile(event: Event): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const input = event.target;\r\n if (!(input instanceof HTMLInputElement)) {\r\n return;\r\n }\r\n\r\n const file = input.files?.[0];\r\n input.value = '';\r\n if (!file) {\r\n return;\r\n }\r\n\r\n void file.text().then((text) => {\r\n try {\r\n const layout = parseWorkspaceLayout(text);\r\n this.clearInteraction();\r\n this.commit(layout, 'Layout imported.');\r\n this.status.set('Layout imported.');\r\n } catch {\r\n this.status.set('That file is not a workspace layout.');\r\n }\r\n });\r\n }\r\n\r\n setFullWidth(id: PosWorkspacePaneId, enabled: boolean): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const label = workspacePaneLabel(id);\r\n this.commit(\r\n setPaneFullWidth(this.layoutState(), id, enabled),\r\n enabled ? `${label} spans the full width.` : `${label} stays in its column.`,\r\n );\r\n }\r\n\r\n setVisible(id: PosWorkspacePaneId, visible: boolean): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const label = workspacePaneLabel(id);\r\n this.commit(\r\n setPaneVisible(this.layoutState(), id, visible),\r\n visible ? `${label} is visible on the till.` : `${label} is hidden on the till.`,\r\n );\r\n }\r\n\r\n setFlexible(id: PosWorkspacePaneId, enabled: boolean): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const pane = this.layoutState().panes.find((item) => item.id === id);\r\n if (!pane) {\r\n return;\r\n }\r\n\r\n const weight = enabled ? (pane.weight > 0 ? pane.weight : 1) : 0;\r\n const label = workspacePaneLabel(id);\r\n this.commit(\r\n setPaneWeight(this.layoutState(), id, weight),\r\n enabled ? `${label} fills leftover height.` : `${label} sizes to its content.`,\r\n );\r\n }\r\n\r\n removeFromLayout(id: PosWorkspacePaneId): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n this.commit(removePane(this.layoutState(), id), `${workspacePaneLabel(id)} removed.`);\r\n }\r\n\r\n beginPaneResize(id: PosWorkspacePaneId, event: PointerEvent): void {\r\n if (!this.editing() || !this.isPrimaryPointer(event)) {\r\n return;\r\n }\r\n\r\n const nextId = this.nextVisualId(id);\r\n const grid = this.gridElement();\r\n if (!nextId || !grid) {\r\n return;\r\n }\r\n\r\n const rect = grid.getBoundingClientRect();\r\n if (rect.height <= 0) {\r\n return;\r\n }\r\n\r\n this.draggingPane.set(null);\r\n this.dropIndicator.set(null);\r\n this.resizeSession = {\r\n id,\r\n nextId,\r\n startY: event.clientY,\r\n startLayout: this.layoutState(),\r\n span: rect.height,\r\n };\r\n }\r\n\r\n updatePaneResize(event: PointerEvent): void {\r\n const session = this.resizeSession;\r\n if (!session || !this.editing()) {\r\n return;\r\n }\r\n\r\n const pair = session.startLayout.panes.filter(\r\n (pane) => pane.id === session.id || pane.id === session.nextId,\r\n );\r\n const total = pair.reduce((sum, pane) => sum + (pane.weight > 0 ? pane.weight : 1), 0);\r\n const delta = ((event.clientY - session.startY) / session.span) * total;\r\n this.layoutState.set(resizeAdjacent(session.startLayout, session.id, session.nextId, delta));\r\n }\r\n\r\n endPaneResize(): void {\r\n const session = this.resizeSession;\r\n if (!session) {\r\n return;\r\n }\r\n\r\n this.resizeSession = null;\r\n if (sameLayout(session.startLayout, this.layoutState())) {\r\n return;\r\n }\r\n\r\n this.remember(session.startLayout);\r\n this.publish(`${workspacePaneLabel(session.id)} height adjusted.`);\r\n }\r\n\r\n protected onSplitterDown(event: PointerEvent): void {\r\n if (!this.isPrimaryPointer(event)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n this.capture(event);\r\n this.splitting = true;\r\n this.splitStartLayout = this.layoutState();\r\n }\r\n\r\n protected onSplitterMove(event: PointerEvent): void {\r\n if (!this.splitting) {\r\n return;\r\n }\r\n\r\n const grid = this.gridElement();\r\n if (!grid) {\r\n return;\r\n }\r\n\r\n const rect = grid.getBoundingClientRect();\r\n const style = getComputedStyle(grid);\r\n const padLeft = Number.parseFloat(style.paddingLeft) || 0;\r\n const padRight = Number.parseFloat(style.paddingRight) || 0;\r\n const gap = Number.parseFloat(style.columnGap || style.gap) || 0;\r\n const inner = rect.width - padLeft - padRight - gap;\r\n if (inner <= 0) {\r\n return;\r\n }\r\n\r\n const ratio = (event.clientX - rect.left - padLeft) / inner;\r\n this.layoutState.set(setColumnRatio(this.layoutState(), ratio));\r\n }\r\n\r\n protected onSplitterUp(): void {\r\n if (!this.splitting) {\r\n return;\r\n }\r\n\r\n this.splitting = false;\r\n const start = this.splitStartLayout;\r\n this.splitStartLayout = null;\r\n if (!start || sameLayout(start, this.layoutState())) {\r\n return;\r\n }\r\n\r\n this.remember(start);\r\n this.publish('Column width adjusted.');\r\n }\r\n\r\n protected onSplitterKeydown(event: KeyboardEvent): void {\r\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const delta = event.key === 'ArrowRight' ? 0.04 : -0.04;\r\n this.commit(\r\n setColumnRatio(this.layoutState(), this.layoutState().startColumnRatio + delta),\r\n 'Column width adjusted.',\r\n );\r\n }\r\n\r\n private commit(next: PosWorkspaceLayout, message: string): void {\r\n if (sameLayout(this.layoutState(), next)) {\r\n return;\r\n }\r\n\r\n this.remember(this.layoutState());\r\n this.layoutState.set(next);\r\n this.publish(message);\r\n }\r\n\r\n private remember(layout: PosWorkspaceLayout): void {\r\n this.history.push(layout);\r\n if (this.history.length > 30) {\r\n this.history.shift();\r\n }\r\n this.canUndo.set(true);\r\n }\r\n\r\n private downloadLayout(json: string): void {\r\n if (typeof URL.createObjectURL !== 'function') {\r\n return;\r\n }\r\n\r\n const blob = new Blob([json], { type: 'application/json' });\r\n const url = URL.createObjectURL(blob);\r\n const link = this.hostRef.nativeElement.ownerDocument.createElement('a');\r\n link.href = url;\r\n link.download = 'pos-workspace-layout.json';\r\n link.click();\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n private publish(message: string): void {\r\n this.status.set(message);\r\n this.layoutChange.emit(this.layoutState());\r\n }\r\n\r\n private placeMessage(\r\n id: PosWorkspacePaneId,\r\n target: PosWorkspaceDropTarget,\r\n added: boolean,\r\n ): string {\r\n const label = workspacePaneLabel(id);\r\n if (target.fullWidth) {\r\n return added\r\n ? `${label} added at full width.`\r\n : `${label} spans the full width.`;\r\n }\r\n\r\n if (added) {\r\n return target.column === 1 ? `${label} added on the right.` : `${label} added.`;\r\n }\r\n\r\n return this.messageForMove(id, target.column);\r\n }\r\n\r\n private messageForMove(id: PosWorkspacePaneId, column: PosWorkspaceColumn): string {\r\n const label = workspacePaneLabel(id);\r\n const current = this.layoutState().panes.find((pane) => pane.id === id);\r\n const occupants = this.layoutState().panes.filter(\r\n (pane) => pane.column === column && pane.id !== id,\r\n );\r\n\r\n if (column === 1 && occupants.length === 0) {\r\n return `${label} docked on the right, full height.`;\r\n }\r\n\r\n if (column === 0 && current?.column === 1) {\r\n return `${label} returned to the left stack.`;\r\n }\r\n\r\n return `${label} moved.`;\r\n }\r\n\r\n private refreshDropHints(gridRect: DOMRect): void {\r\n if (this.compact()) {\r\n this.dropHints.set([]);\r\n return;\r\n }\r\n\r\n const host = this.hostRef.nativeElement.getBoundingClientRect();\r\n const top = gridRect.top - host.top;\r\n const left = gridRect.left - host.left;\r\n const ratio = this.grid().split ? this.layoutState().startColumnRatio : DOCK_THRESHOLD;\r\n const hints: PosWorkspaceDropHint[] = [\r\n {\r\n kind: 'dock',\r\n top,\r\n left: left + gridRect.width * ratio,\r\n width: gridRect.width * (1 - ratio),\r\n height: gridRect.height,\r\n },\r\n ];\r\n\r\n const splitTop = this.splitBodyTop();\r\n if (splitTop != null) {\r\n const roomAbove = Math.max(0, splitTop - gridRect.top);\r\n hints.unshift({\r\n kind: 'top',\r\n top,\r\n left,\r\n width: gridRect.width,\r\n height: roomAbove > 8 ? roomAbove : FULL_WIDTH_BAND,\r\n });\r\n }\r\n\r\n this.dropHints.set(hints);\r\n }\r\n\r\n /** True when the pointer is above the docked column (or in the top band when nothing sits above it). */\r\n private inFullWidthDropZone(clientY: number, gridRect: DOMRect, splitTop: number): boolean {\r\n if (splitTop > gridRect.top + 8) {\r\n return clientY < splitTop;\r\n }\r\n\r\n return clientY < gridRect.top + FULL_WIDTH_BAND;\r\n }\r\n\r\n /** Top edge of the side-by-side region (right column). Null when nothing is docked right. */\r\n private splitBodyTop(): number | null {\r\n if (this.compact() || !this.grid().split) {\r\n return null;\r\n }\r\n\r\n let top = Number.POSITIVE_INFINITY;\r\n for (const pane of this.grid().panes) {\r\n if (pane.column !== 2) {\r\n continue;\r\n }\r\n\r\n const rect = this.paneElement(pane.id)?.getBoundingClientRect();\r\n if (rect) {\r\n top = Math.min(top, rect.top);\r\n }\r\n }\r\n\r\n return Number.isFinite(top) ? top : null;\r\n }\r\n\r\n /** Full-width rows that sit above the split, used for drop ordering in that band. */\r\n private idsAboveSplit(): PosWorkspacePaneId[] {\r\n const splitTop = this.splitBodyTop();\r\n if (splitTop == null) {\r\n return [];\r\n }\r\n\r\n return this.grid()\r\n .panes.filter((pane) => {\r\n if (pane.spanColumns !== true) {\r\n return false;\r\n }\r\n\r\n const rect = this.paneElement(pane.id)?.getBoundingClientRect();\r\n return rect != null && rect.top + rect.height / 2 < splitTop;\r\n })\r\n .sort((a, b) => a.rowStart - b.rowStart)\r\n .map((pane) => pane.id);\r\n }\r\n\r\n /** Maps a visual index among banner/full-width rows onto the body column order. */\r\n private bodyIndexForFullWidthDrop(visualIndex: number): number {\r\n const banners = new Set(\r\n this.layoutState()\r\n .panes.filter((pane) => paneSpan(pane) !== null)\r\n .map((pane) => pane.id),\r\n );\r\n const bannersAbove = this.idsAboveSplit().filter((id) => banners.has(id)).length;\r\n return Math.max(0, visualIndex - bannersAbove);\r\n }\r\n\r\n private fullWidthIndicator(\r\n index: number,\r\n ids: readonly PosWorkspacePaneId[],\r\n gridRect: DOMRect,\r\n ): PosWorkspaceDropIndicator {\r\n const host = this.hostRef.nativeElement.getBoundingClientRect();\r\n const left = gridRect.left - host.left;\r\n const width = gridRect.width;\r\n\r\n if (ids.length === 0) {\r\n const splitTop = this.splitBodyTop() ?? gridRect.top;\r\n return {\r\n top: Math.max(gridRect.top, splitTop - FULL_WIDTH_BAND / 2) - host.top,\r\n left,\r\n width,\r\n height: FULL_WIDTH_BAND,\r\n line: false,\r\n };\r\n }\r\n\r\n const anchorId = index >= ids.length ? ids[ids.length - 1] : ids[index];\r\n const anchor = this.paneElement(anchorId)?.getBoundingClientRect();\r\n if (!anchor) {\r\n return {\r\n top: gridRect.top - host.top,\r\n left,\r\n width,\r\n height: FULL_WIDTH_BAND,\r\n line: false,\r\n };\r\n }\r\n\r\n const top = index >= ids.length ? anchor.bottom - host.top : anchor.top - host.top;\r\n return { top, left, width, height: 4, line: true };\r\n }\r\n\r\n private nextVisualId(id: PosWorkspacePaneId): PosWorkspacePaneId | null {\r\n const place = this.placements().get(id);\r\n if (!place?.showResize) {\r\n return null;\r\n }\r\n\r\n const next = this.grid()\r\n .panes.filter((pane) => pane.column === place.column && pane.rowStart >= place.rowEnd)\r\n .sort((a, b) => a.rowStart - b.rowStart)[0];\r\n return next?.id ?? null;\r\n }\r\n\r\n private idsInVisualColumn(column: PosWorkspaceColumn): PosWorkspacePaneId[] {\r\n const dragging = this.draggingPane();\r\n const edges = new Set(\r\n this.layoutState()\r\n .panes.filter((pane) => paneSpan(pane) !== null)\r\n .map((pane) => pane.id),\r\n );\r\n const gridColumn = this.compact() ? 1 : column + 1;\r\n return this.grid()\r\n .panes.filter((pane) => {\r\n if (pane.id === dragging || edges.has(pane.id)) {\r\n return false;\r\n }\r\n\r\n if (this.compact() || column === 0) {\r\n return pane.spanColumns === true || pane.column === gridColumn;\r\n }\r\n\r\n return pane.column === gridColumn && pane.spanColumns !== true;\r\n })\r\n .sort((a, b) => a.rowStart - b.rowStart)\r\n .map((pane) => pane.id);\r\n }\r\n\r\n private indicatorBox(\r\n column: PosWorkspaceColumn,\r\n index: number,\r\n ids: readonly PosWorkspacePaneId[],\r\n gridRect: DOMRect,\r\n ): PosWorkspaceDropIndicator | null {\r\n const host = this.hostRef.nativeElement.getBoundingClientRect();\r\n if (ids.length === 0) {\r\n const threshold = this.grid().split ? this.layoutState().startColumnRatio : DOCK_THRESHOLD;\r\n const bandLeft = column === 1 ? gridRect.width * threshold : 0;\r\n const bandWidth = column === 1 ? gridRect.width * (1 - threshold) : gridRect.width * 0.3;\r\n return {\r\n top: gridRect.top - host.top,\r\n left: gridRect.left - host.left + bandLeft,\r\n width: bandWidth,\r\n height: gridRect.height,\r\n line: false,\r\n };\r\n }\r\n\r\n const anchorId = index >= ids.length ? ids[ids.length - 1] : ids[index];\r\n const anchor = this.paneElement(anchorId)?.getBoundingClientRect();\r\n if (!anchor) {\r\n return null;\r\n }\r\n\r\n const top = index >= ids.length ? anchor.bottom - host.top : anchor.top - host.top;\r\n return {\r\n top,\r\n left: anchor.left - host.left,\r\n width: anchor.width,\r\n height: 4,\r\n line: true,\r\n };\r\n }\r\n\r\n private paneElement(id: PosWorkspacePaneId): HTMLElement | null {\r\n return this.hostRef.nativeElement.querySelector(`[data-pane=\"${id}\"]`);\r\n }\r\n\r\n private gridElement(): HTMLElement | null {\r\n return this.frameRef()?.nativeElement ?? null;\r\n }\r\n\r\n private clearDrag(): void {\r\n this.draggingPane.set(null);\r\n this.dropTarget.set(null);\r\n this.dropIndicator.set(null);\r\n this.dropHints.set([]);\r\n }\r\n\r\n private clearInteraction(): void {\r\n this.paletteGesture = null;\r\n this.paletteOpen.set(false);\r\n this.paletteMenuLifted.set(false);\r\n this.settingsPane.set(null);\r\n this.clearDrag();\r\n this.resizeSession = null;\r\n this.splitting = false;\r\n this.splitStartLayout = null;\r\n }\r\n\r\n private isPrimaryPointer(event: PointerEvent): boolean {\r\n return event.pointerType !== 'mouse' || event.button === 0;\r\n }\r\n\r\n private capture(event: PointerEvent): void {\r\n const handle = event.currentTarget;\r\n if (!(handle instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n try {\r\n handle.setPointerCapture(event.pointerId);\r\n } catch {\r\n // The pointer is not active yet. The drag still follows later pointer events.\r\n }\r\n }\r\n}\r\n","@if (editing()) {\r\n <div class=\"pos-workspace__tools\">\r\n <div class=\"pos-workspace__palette\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-toggle\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-expanded]=\"paletteOpen()\"\r\n (click)=\"togglePalette()\"\r\n >\r\n Components\r\n </button>\r\n @if (paletteOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-backdrop\"\r\n tabindex=\"-1\"\r\n aria-label=\"Close components\"\r\n (click)=\"closePalette()\"\r\n ></button>\r\n <div\r\n class=\"pos-workspace__palette-menu\"\r\n [class.pos-workspace__palette-menu--lifted]=\"paletteMenuLifted()\"\r\n role=\"menu\"\r\n aria-label=\"Components\"\r\n (keydown)=\"onPaletteMenuKeydown($event)\"\r\n >\r\n @for (id of palette(); track id) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n [attr.data-palette]=\"id\"\r\n (pointerdown)=\"onPalettePointerDown(id, $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick(id)\"\r\n >\r\n {{ paneLabel(id) }}\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n data-palette=\"empty\"\r\n (pointerdown)=\"onPalettePointerDown('empty', $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick('empty')\"\r\n >\r\n Custom container\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"pos-workspace__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__undo\"\r\n [disabled]=\"!canUndo()\"\r\n (click)=\"undoLayout()\"\r\n >\r\n Undo\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__new\" (click)=\"resetLayout()\">New</button>\r\n <button type=\"button\" class=\"pos-workspace__default\" (click)=\"applyDefaultLayout()\">\r\n Default layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__import\" (click)=\"layoutFile.click()\">\r\n Import layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__export\" (click)=\"exportLayout()\">\r\n Export layout\r\n </button>\r\n <input\r\n #layoutFile\r\n class=\"pos-workspace__file\"\r\n type=\"file\"\r\n accept=\"application/json,.json\"\r\n aria-label=\"Import layout file\"\r\n (change)=\"importLayoutFile($event)\"\r\n />\r\n </div>\r\n </div>\r\n}\r\n\r\n<div\r\n #frame\r\n class=\"pos-workspace__grid\"\r\n [style.grid-template-columns]=\"grid().columns\"\r\n [style.grid-template-rows]=\"grid().rows\"\r\n>\r\n <ng-content />\r\n @for (slot of emptySlots(); track slot) {\r\n <pos-workspace-pane [paneId]=\"slot\" [placeholder]=\"true\" />\r\n }\r\n @if (showSplitter()) {\r\n <div\r\n class=\"pos-workspace__splitter\"\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n aria-label=\"Resize columns\"\r\n aria-valuemin=\"28\"\r\n aria-valuemax=\"72\"\r\n [attr.aria-valuenow]=\"ratioPercent()\"\r\n tabindex=\"0\"\r\n [style.grid-row]=\"splitterRow()\"\r\n [style.left]=\"splitterLeft()\"\r\n (pointerdown)=\"onSplitterDown($event)\"\r\n (pointermove)=\"onSplitterMove($event)\"\r\n (pointerup)=\"onSplitterUp()\"\r\n (pointercancel)=\"onSplitterUp()\"\r\n (keydown)=\"onSplitterKeydown($event)\"\r\n ></div>\r\n }\r\n</div>\r\n\r\n@for (hint of dropHints(); track hint.kind) {\r\n <div\r\n class=\"pos-workspace__hint\"\r\n [class.pos-workspace__hint--top]=\"hint.kind === 'top'\"\r\n [class.pos-workspace__hint--bottom]=\"hint.kind === 'bottom'\"\r\n [class.pos-workspace__hint--dock]=\"hint.kind === 'dock'\"\r\n [style.top.px]=\"hint.top\"\r\n [style.left.px]=\"hint.left\"\r\n [style.width.px]=\"hint.width\"\r\n [style.height.px]=\"hint.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n@if (dropIndicator(); as indicator) {\r\n <div\r\n class=\"pos-workspace__drop\"\r\n [class.pos-workspace__drop--line]=\"indicator.line\"\r\n [style.top.px]=\"indicator.top\"\r\n [style.left.px]=\"indicator.left\"\r\n [style.width.px]=\"indicator.width\"\r\n [style.height.px]=\"indicator.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n<div class=\"pos-workspace__status\" aria-live=\"polite\">{{ status() }}</div>\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","/*\n * Public API Surface of @retalia/pos-components\n */\n\nexport { PosLogin } from './lib/login/pos-login';\nexport type {\n PosLoginIntent,\n PosLoginSessionState,\n PosLoginSessionStatus,\n} from './lib/login/pos-login';\n\nexport { PosBasket } from './lib/basket/pos-basket';\nexport type {\n PosBasketIntent,\n PosBasketLine,\n PosBasketTotals,\n PosBasketVat,\n} from './lib/basket/pos-basket';\n\nexport { PosHeader } from './lib/header/pos-header';\nexport type { PosHeaderIntent } from './lib/header/pos-header';\n\nexport { PosTransactionActionBar } from './lib/transaction-action-bar/pos-transaction-action-bar';\nexport type { PosTransactionActionBarIntent } from './lib/transaction-action-bar/pos-transaction-action-bar';\n\nexport { PosItemEntry } from './lib/item-entry/pos-item-entry';\nexport type { PosItemEntryIntent } from './lib/item-entry/pos-item-entry';\n\nexport { PosWorkspace } from './lib/workspace/pos-workspace';\nexport { PosWorkspacePane } from './lib/workspace/pos-workspace-pane';\nexport {\n POS_WORKSPACE_BASKET_RIGHT_LAYOUT,\n POS_WORKSPACE_DEFAULT_LAYOUT,\n POS_WORKSPACE_EMPTY_LAYOUT,\n POS_WORKSPACE_HEADER_SPAN_LAYOUT,\n parseWorkspaceLayout,\n workspaceLayoutJson,\n} from './lib/workspace/pos-workspace-layout';\nexport type {\n PosWorkspaceColumn,\n PosWorkspaceLayout,\n PosWorkspacePaneId,\n PosWorkspacePanePlacement,\n PosWorkspaceSpan,\n} from './lib/workspace/pos-workspace-layout';\n\nexport { PosTender } from './lib/tender/pos-tender';\nexport type { PosTenderIntent } from './lib/tender/pos-tender';\n\nexport { PosReceipt } from './lib/receipt/pos-receipt';\nexport type {\n PosReceiptIntent,\n PosReceiptLine,\n PosReceiptTotals,\n PosReceiptVat,\n PosReceiptPayment,\n PosReceiptDocument,\n} from './lib/receipt/pos-receipt';\n\nexport { PosTokens } from './lib/tokens/pos-tokens';\nexport type { PosTokenSwatch } from './lib/tokens/pos-tokens';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["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/workspace/pos-workspace-controller.ts","../../../projects/pos-components/src/lib/workspace/pos-workspace-layout.ts","../../../projects/pos-components/src/lib/workspace/pos-workspace-pane.ts","../../../projects/pos-components/src/lib/workspace/pos-workspace-pane.html","../../../projects/pos-components/src/lib/workspace/pos-workspace.ts","../../../projects/pos-components/src/lib/workspace/pos-workspace.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 interface PosHeaderIntent {\r\n readonly type: 'header.signOut';\r\n}\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, input, output } from '@angular/core';\r\n\r\nexport type PosTransactionActionBarIntent =\r\n | { readonly type: 'actionBar.clearBasket' }\r\n | { readonly type: 'actionBar.tender' };\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 /** Envelope action names. `clearBasket` shows Cancel. `tender` shows Cash. */\r\n readonly availableActions = input<readonly string[]>([]);\r\n readonly disabled = input(false);\r\n readonly action = output<PosTransactionActionBarIntent>();\r\n\r\n protected onClear(): void {\r\n this.action.emit({ type: 'actionBar.clearBasket' });\r\n }\r\n\r\n protected onCash(): void {\r\n this.action.emit({ type: 'actionBar.tender' });\r\n }\r\n}\r\n","@if (availableActions().includes('clearBasket')) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-transaction-action-bar__button pos-transaction-action-bar__button--cancel\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onClear()\"\r\n >\r\n Cancel\r\n </button>\r\n}\r\n@if (availableActions().includes('tender')) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-transaction-action-bar__button pos-transaction-action-bar__button--cash\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onCash()\"\r\n >\r\n Cash\r\n </button>\r\n}\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 { InjectionToken, type Signal } from '@angular/core';\r\n\r\nimport type {\r\n PosWorkspaceGridPane,\r\n PosWorkspacePaneId,\r\n PosWorkspaceSpan,\r\n} from './pos-workspace-layout';\r\n\r\nexport type PosWorkspaceMoveKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\n\r\nexport interface PosWorkspaceController {\r\n readonly editing: Signal<boolean>;\r\n readonly placements: Signal<ReadonlyMap<PosWorkspacePaneId, PosWorkspaceGridPane>>;\r\n readonly draggingPane: Signal<PosWorkspacePaneId | null>;\r\n readonly spans: Signal<ReadonlyMap<PosWorkspacePaneId, PosWorkspaceSpan | null>>;\r\n readonly flexibleIds: Signal<ReadonlySet<PosWorkspacePaneId>>;\r\n readonly fullWidthIds: Signal<ReadonlySet<PosWorkspacePaneId>>;\r\n readonly settingsPane: Signal<PosWorkspacePaneId | null>;\r\n togglePaneSettings(id: PosWorkspacePaneId): void;\r\n closePaneSettings(id: PosWorkspacePaneId): void;\r\n moveByKey(id: PosWorkspacePaneId, key: PosWorkspaceMoveKey): void;\r\n setFullWidth(id: PosWorkspacePaneId, enabled: boolean): void;\r\n setVisible(id: PosWorkspacePaneId, visible: boolean): void;\r\n setFlexible(id: PosWorkspacePaneId, enabled: boolean): void;\r\n removeFromLayout(id: PosWorkspacePaneId): void;\r\n resizeByKey(id: PosWorkspacePaneId, direction: -1 | 1): void;\r\n beginPaneDrag(id: PosWorkspacePaneId, event: PointerEvent): void;\r\n updatePaneDrag(event: PointerEvent): void;\r\n endPaneDrag(event?: PointerEvent): void;\r\n beginPaneResize(id: PosWorkspacePaneId, event: PointerEvent): void;\r\n updatePaneResize(event: PointerEvent): void;\r\n endPaneResize(): void;\r\n}\r\n\r\nexport const POS_WORKSPACE = new InjectionToken<PosWorkspaceController>('POS_WORKSPACE');\r\n","export const POS_WORKSPACE_PANE_IDS = ['header', 'itemEntry', 'basket', 'actionBar'] as const;\r\n\r\nexport type PosWorkspaceBuiltinPaneId = (typeof POS_WORKSPACE_PANE_IDS)[number];\r\n\r\n/** A library region, or a custom slot (`empty-1`, `empty-2`, …) the POS fills later. */\r\nexport type PosWorkspacePaneId = PosWorkspaceBuiltinPaneId | `empty-${number}`;\r\n\r\nconst EMPTY_PANE_ID = /^empty-(\\d+)$/;\r\n\r\nexport type PosWorkspaceColumn = 0 | 1;\r\n\r\n/** Which edge a pane uses when it spans both columns. */\r\nexport type PosWorkspaceSpan = 'top' | 'bottom';\r\n\r\n/** Where one logged-in sale region sits. Weight 0 sizes to content; a positive weight shares leftover height. */\r\nexport interface PosWorkspacePanePlacement {\r\n readonly id: PosWorkspacePaneId;\r\n readonly column: PosWorkspaceColumn;\r\n readonly order: number;\r\n readonly weight: number;\r\n /** Spans both columns at this pane's place in the stack. */\r\n readonly fullWidth?: boolean;\r\n /** `top` sits above the split. `bottom` sits under both columns. */\r\n readonly span?: PosWorkspaceSpan;\r\n /** Omitted or true shows the pane. False keeps it in the layout and hides it on the till. */\r\n readonly visible?: boolean;\r\n}\r\n\r\n/** Arrangement of the logged-in sale shell. The host can keep this later; the workspace does not store it. */\r\nexport interface PosWorkspaceLayout {\r\n /** Share of the width given to the left column once a pane is docked on the right. */\r\n readonly startColumnRatio: number;\r\n readonly panes: readonly PosWorkspacePanePlacement[];\r\n}\r\n\r\n/** JSON the consuming POS passes back in as the `layout` input. */\r\nexport function workspaceLayoutJson(layout: PosWorkspaceLayout): string {\r\n const document: PosWorkspaceLayout = {\r\n startColumnRatio: layout.startColumnRatio,\r\n panes: layout.panes.map((pane) => {\r\n const placement: PosWorkspacePanePlacement = {\r\n id: pane.id,\r\n column: pane.column,\r\n order: pane.order,\r\n weight: pane.weight,\r\n };\r\n let next: PosWorkspacePanePlacement = placement;\r\n if (pane.span === 'bottom') {\r\n next = { ...placement, span: 'bottom' };\r\n } else if (pane.span === 'top') {\r\n next = { ...placement, fullWidth: true, span: 'top' };\r\n } else if (pane.fullWidth) {\r\n next = { ...placement, fullWidth: true };\r\n }\r\n if (pane.visible === false) {\r\n next = { ...next, visible: false };\r\n }\r\n return next;\r\n }),\r\n };\r\n\r\n return `${JSON.stringify(document, null, 2)}\\n`;\r\n}\r\n\r\n/** Reads a file written by `workspaceLayoutJson`. */\r\nexport function parseWorkspaceLayout(json: string): PosWorkspaceLayout {\r\n let value: unknown;\r\n try {\r\n value = JSON.parse(json);\r\n } catch {\r\n throw new Error('Layout file is not JSON.');\r\n }\r\n\r\n if (!isRecord(value) || typeof value['startColumnRatio'] !== 'number') {\r\n throw new Error('Layout file is missing a column ratio.');\r\n }\r\n\r\n if (!Number.isFinite(value['startColumnRatio']) || !Array.isArray(value['panes'])) {\r\n throw new Error('Layout file is missing a pane list.');\r\n }\r\n\r\n const seen = new Set<string>();\r\n return {\r\n startColumnRatio: value['startColumnRatio'],\r\n panes: value['panes'].map((pane) => readPlacement(pane, seen)),\r\n };\r\n}\r\n\r\nfunction readPlacement(value: unknown, seen: Set<string>): PosWorkspacePanePlacement {\r\n if (!isRecord(value) || typeof value['id'] !== 'string' || !isPaneId(value['id'])) {\r\n throw new Error('Layout file has a pane id this workspace does not know.');\r\n }\r\n\r\n if (seen.has(value['id'])) {\r\n throw new Error('Layout file lists the same pane twice.');\r\n }\r\n seen.add(value['id']);\r\n\r\n const column = value['column'];\r\n const order = value['order'];\r\n const weight = value['weight'];\r\n if (column !== 0 && column !== 1) {\r\n throw new Error('Layout file has a pane outside the two columns.');\r\n }\r\n\r\n if (typeof order !== 'number' || typeof weight !== 'number' || !Number.isFinite(order) || !Number.isFinite(weight)) {\r\n throw new Error('Layout file has a pane without an order or weight.');\r\n }\r\n\r\n const placement: PosWorkspacePanePlacement = {\r\n id: value['id'],\r\n column,\r\n order,\r\n weight,\r\n };\r\n\r\n let next = placement;\r\n if (value['span'] === 'bottom') {\r\n next = { ...placement, span: 'bottom' };\r\n } else if (value['span'] === 'top') {\r\n next = { ...placement, fullWidth: true, span: 'top' };\r\n } else if (value['fullWidth'] === true) {\r\n next = { ...placement, fullWidth: true };\r\n }\r\n\r\n if (value['visible'] === false) {\r\n return { ...next, visible: false };\r\n }\r\n\r\n if (value['visible'] !== undefined && value['visible'] !== true) {\r\n throw new Error('Layout file has a pane visibility that is not true or false.');\r\n }\r\n\r\n return next;\r\n}\r\n\r\nfunction isPaneId(id: string): id is PosWorkspacePaneId {\r\n return isEmptyPaneId(id) || POS_WORKSPACE_PANE_IDS.some((paneId) => paneId === id);\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n\r\nexport interface PosWorkspaceGridPane {\r\n readonly id: PosWorkspacePaneId;\r\n readonly column: 1 | 2;\r\n readonly rowStart: number;\r\n readonly rowEnd: number;\r\n readonly showResize: boolean;\r\n /** When set, the pane stretches across both columns. */\r\n readonly spanColumns?: boolean;\r\n /** Edit mode keeps a hidden pane in the grid so its settings can show it again. */\r\n readonly concealed?: boolean;\r\n}\r\n\r\nexport interface PosWorkspaceGrid {\r\n readonly columns: string;\r\n readonly rows: string;\r\n readonly split: boolean;\r\n readonly panes: readonly PosWorkspaceGridPane[];\r\n}\r\n\r\nexport const POS_WORKSPACE_PANE_LABELS: Record<PosWorkspaceBuiltinPaneId, string> = {\r\n header: 'Header',\r\n itemEntry: 'Item lookup',\r\n basket: 'Basket',\r\n actionBar: 'Action bar',\r\n};\r\n\r\nexport function isEmptyPaneId(id: string): id is `empty-${number}` {\r\n return EMPTY_PANE_ID.test(id);\r\n}\r\n\r\nexport function workspacePaneLabel(id: PosWorkspacePaneId): string {\r\n if (isEmptyPaneId(id)) {\r\n const number = EMPTY_PANE_ID.exec(id)?.[1];\r\n return `Custom container ${number}`;\r\n }\r\n\r\n return POS_WORKSPACE_PANE_LABELS[id];\r\n}\r\n\r\nexport function nextEmptyId(layout: PosWorkspaceLayout): `empty-${number}` {\r\n let highest = 0;\r\n for (const pane of layout.panes) {\r\n const number = EMPTY_PANE_ID.exec(pane.id)?.[1];\r\n if (number) {\r\n highest = Math.max(highest, Number(number));\r\n }\r\n }\r\n\r\n return `empty-${highest + 1}`;\r\n}\r\n\r\n/** Same stack the sale screen uses today: header, item lookup, flexible basket, action bar. */\r\nexport const POS_WORKSPACE_DEFAULT_LAYOUT: PosWorkspaceLayout = {\r\n startColumnRatio: 0.58,\r\n panes: [\r\n { id: 'header', column: 0, order: 0, weight: 0 },\r\n { id: 'itemEntry', column: 0, order: 1, weight: 0 },\r\n { id: 'basket', column: 0, order: 2, weight: 1 },\r\n { id: 'actionBar', column: 0, order: 3, weight: 0 },\r\n ],\r\n};\r\n\r\n/** Basket docked on the right at full height. Item lookup is marked flexible so it fills above the action bar. */\r\nexport const POS_WORKSPACE_BASKET_RIGHT_LAYOUT: PosWorkspaceLayout = {\r\n startColumnRatio: 0.58,\r\n panes: [\r\n { id: 'header', column: 0, order: 0, weight: 0 },\r\n { id: 'itemEntry', column: 0, order: 1, weight: 1 },\r\n { id: 'actionBar', column: 0, order: 2, weight: 0 },\r\n { id: 'basket', column: 1, order: 0, weight: 1 },\r\n ],\r\n};\r\n\r\n/** Nothing placed yet. Edit mode lists the library components so they can be dragged on. */\r\nexport const POS_WORKSPACE_EMPTY_LAYOUT: PosWorkspaceLayout = {\r\n startColumnRatio: 0.58,\r\n panes: [],\r\n};\r\n\r\n/** Header spans both columns, with the basket docked on the right. */\r\nexport const POS_WORKSPACE_HEADER_SPAN_LAYOUT: PosWorkspaceLayout = {\r\n startColumnRatio: 0.58,\r\n panes: [\r\n { id: 'header', column: 0, order: 0, weight: 0, fullWidth: true, span: 'top' },\r\n { id: 'itemEntry', column: 0, order: 0, weight: 1 },\r\n { id: 'actionBar', column: 0, order: 1, weight: 0 },\r\n { id: 'basket', column: 1, order: 0, weight: 1 },\r\n ],\r\n};\r\n\r\n/** Legacy edge. `fullWidth` without `span` stays in the stack where the designer placed it. */\r\nexport function paneSpan(pane: { readonly span?: PosWorkspaceSpan }): PosWorkspaceSpan | null {\r\n if (pane.span === 'bottom') {\r\n return 'bottom';\r\n }\r\n\r\n if (pane.span === 'top') {\r\n return 'top';\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/** True when the pane spans both columns, either in place or on a legacy edge. */\r\nexport function paneFillsWidth(pane: {\r\n readonly fullWidth?: boolean;\r\n readonly span?: PosWorkspaceSpan;\r\n}): boolean {\r\n return pane.fullWidth === true || pane.span === 'top' || pane.span === 'bottom';\r\n}\r\n\r\nconst MIN_RATIO = 0.28;\r\nconst MAX_RATIO = 0.72;\r\nconst MIN_WEIGHT = 0.35;\r\nconst MAX_WEIGHT = 8;\r\n\r\nexport function workspaceGrid(\r\n layout: PosWorkspaceLayout,\r\n present: readonly PosWorkspacePaneId[],\r\n options?: { readonly compact?: boolean; readonly includeHidden?: boolean },\r\n): PosWorkspaceGrid {\r\n const placed = placedPanes(layout, present);\r\n const panes = options?.includeHidden\r\n ? placed\r\n : placed.filter((pane) => pane.visible !== false);\r\n const top = panes.filter((pane) => paneSpan(pane) === 'top').sort((a, b) => a.order - b.order);\r\n const bottom = panes\r\n .filter((pane) => paneSpan(pane) === 'bottom')\r\n .sort((a, b) => a.order - b.order);\r\n const body = panes.filter((pane) => paneSpan(pane) === null);\r\n\r\n let grid: PosWorkspaceGrid;\r\n if (options?.compact === true) {\r\n const stacked = compactStack(columnList(body, 0), columnList(body, 1));\r\n grid = singleColumnGrid([...top, ...stacked, ...bottom]);\r\n } else {\r\n const left = columnList(body, 0);\r\n const rightWide = columnList(body, 1).filter((pane) => pane.fullWidth === true);\r\n const right = columnList(body, 1).filter((pane) => pane.fullWidth !== true);\r\n const sequence = [...left, ...rightWide].sort(\r\n (a, b) => a.order - b.order || a.column - b.column,\r\n );\r\n grid = gridFromSequence(sequence, right, layout.startColumnRatio);\r\n if (bottom.length > 0) {\r\n grid = withFooter(bottom, grid);\r\n }\r\n if (top.length > 0) {\r\n grid = withBanner(top, grid);\r\n }\r\n }\r\n\r\n return options?.includeHidden ? markConcealed(grid, panes) : grid;\r\n}\r\n\r\nfunction markConcealed(\r\n grid: PosWorkspaceGrid,\r\n panes: readonly PosWorkspacePanePlacement[],\r\n): PosWorkspaceGrid {\r\n const hidden = new Set(panes.filter((pane) => pane.visible === false).map((pane) => pane.id));\r\n if (hidden.size === 0) {\r\n return grid;\r\n }\r\n\r\n return {\r\n ...grid,\r\n panes: grid.panes.map((pane) => (hidden.has(pane.id) ? { ...pane, concealed: true } : pane)),\r\n };\r\n}\r\n\r\nfunction gridFromSequence(\r\n sequence: readonly PosWorkspacePanePlacement[],\r\n right: readonly PosWorkspacePanePlacement[],\r\n ratio: number,\r\n): PosWorkspaceGrid {\r\n if (!sequence.some((pane) => pane.fullWidth === true)) {\r\n const left = sequence.filter((pane) => pane.column === 0);\r\n return bodyGridFor(left.length > 0 ? left : sequence, right, ratio);\r\n }\r\n\r\n const blocks: { span?: PosWorkspacePanePlacement; left: PosWorkspacePanePlacement[] }[] = [];\r\n let run: PosWorkspacePanePlacement[] = [];\r\n for (const pane of sequence) {\r\n if (pane.fullWidth === true) {\r\n if (run.length > 0) {\r\n blocks.push({ left: run });\r\n run = [];\r\n }\r\n blocks.push({ span: pane, left: [] });\r\n continue;\r\n }\r\n\r\n run.push(pane);\r\n }\r\n if (run.length > 0) {\r\n blocks.push({ left: run });\r\n }\r\n\r\n const stacks = blocks.filter((block) => block.span == null);\r\n const rights = stacks.map(() => [] as PosWorkspacePanePlacement[]);\r\n if (stacks.length === 0) {\r\n if (right.length > 0) {\r\n blocks.push({ left: [] });\r\n rights.push([...right]);\r\n }\r\n } else if (stacks.length === 1) {\r\n rights[0] = [...right];\r\n } else {\r\n for (const pane of right) {\r\n let best = 0;\r\n let bestDistance = Number.POSITIVE_INFINITY;\r\n stacks.forEach((block, index) => {\r\n const distance = Math.min(...block.left.map((item) => Math.abs(item.order - pane.order)));\r\n if (distance < bestDistance) {\r\n best = index;\r\n bestDistance = distance;\r\n }\r\n });\r\n rights[best].push(pane);\r\n }\r\n }\r\n\r\n let row = 1;\r\n let stackIndex = 0;\r\n const tracks: string[] = [];\r\n const panes: PosWorkspaceGrid['panes'][number][] = [];\r\n let split = false;\r\n let columns = 'minmax(0, 1fr)';\r\n for (const block of blocks) {\r\n const sub =\r\n block.span != null\r\n ? singleColumnGrid([block.span])\r\n : bodyGridFor(block.left, rights[stackIndex++] ?? [], ratio);\r\n if (sub.split) {\r\n split = true;\r\n columns = sub.columns;\r\n }\r\n\r\n for (const track of splitTemplate(sub.rows)) {\r\n tracks.push(track);\r\n }\r\n for (const pane of sub.panes) {\r\n panes.push({\r\n ...pane,\r\n rowStart: pane.rowStart + row - 1,\r\n rowEnd: pane.rowEnd + row - 1,\r\n });\r\n }\r\n row += splitTemplate(sub.rows).length;\r\n }\r\n\r\n return {\r\n columns: split ? columns : 'minmax(0, 1fr)',\r\n rows: tracks.join(' ') || 'minmax(0, 1fr)',\r\n split,\r\n panes,\r\n };\r\n}\r\n\r\nfunction splitTemplate(template: string): string[] {\r\n const tracks: string[] = [];\r\n let depth = 0;\r\n let current = '';\r\n for (const char of template.trim()) {\r\n if (char === '(') {\r\n depth += 1;\r\n } else if (char === ')') {\r\n depth = Math.max(0, depth - 1);\r\n }\r\n\r\n if (depth === 0 && char === ' ') {\r\n if (current) {\r\n tracks.push(current);\r\n }\r\n current = '';\r\n continue;\r\n }\r\n\r\n current += char;\r\n }\r\n if (current) {\r\n tracks.push(current);\r\n }\r\n return tracks;\r\n}\r\n\r\nfunction bodyGridFor(\r\n left: readonly PosWorkspacePanePlacement[],\r\n right: readonly PosWorkspacePanePlacement[],\r\n ratio: number,\r\n): PosWorkspaceGrid {\r\n if (left.length === 0 && right.length === 0) {\r\n return {\r\n columns: 'minmax(0, 1fr)',\r\n rows: 'minmax(0, 1fr)',\r\n split: false,\r\n panes: [],\r\n };\r\n }\r\n\r\n if (left.length === 0) {\r\n return singleColumnGrid(right);\r\n }\r\n\r\n if (right.length === 0) {\r\n return singleColumnGrid(left);\r\n }\r\n\r\n return splitGrid(left, right, ratio);\r\n}\r\n\r\nfunction withBanner(\r\n banner: readonly PosWorkspacePanePlacement[],\r\n body: PosWorkspaceGrid,\r\n): PosWorkspaceGrid {\r\n const offset = banner.length;\r\n return {\r\n columns: body.columns,\r\n rows: `${banner.map(() => 'auto').join(' ')} ${body.rows}`.trim(),\r\n split: body.split,\r\n panes: [\r\n ...banner.map((pane, index) => ({\r\n id: pane.id,\r\n column: 1 as const,\r\n rowStart: index + 1,\r\n rowEnd: index + 2,\r\n showResize: false,\r\n spanColumns: true,\r\n })),\r\n ...body.panes.map((pane) => ({\r\n ...pane,\r\n rowStart: pane.rowStart + offset,\r\n rowEnd: pane.rowEnd + offset,\r\n })),\r\n ],\r\n };\r\n}\r\n\r\nfunction withFooter(\r\n footer: readonly PosWorkspacePanePlacement[],\r\n body: PosWorkspaceGrid,\r\n): PosWorkspaceGrid {\r\n const offset = trackCount(body.rows);\r\n return {\r\n columns: body.columns,\r\n rows: `${body.rows} ${footer.map(() => 'auto').join(' ')}`.trim(),\r\n split: body.split,\r\n panes: [\r\n ...body.panes,\r\n ...footer.map((pane, index) => ({\r\n id: pane.id,\r\n column: 1 as const,\r\n rowStart: offset + index + 1,\r\n rowEnd: offset + index + 2,\r\n showResize: false,\r\n spanColumns: true,\r\n })),\r\n ],\r\n };\r\n}\r\n\r\nexport function dropColumn(\r\n xRatio: number,\r\n splitThreshold: number,\r\n compact: boolean,\r\n): PosWorkspaceColumn {\r\n if (compact) {\r\n return 0;\r\n }\r\n\r\n return xRatio >= splitThreshold ? 1 : 0;\r\n}\r\n\r\nexport function insertionIndex(pointerY: number, midpoints: readonly number[]): number {\r\n for (let index = 0; index < midpoints.length; index += 1) {\r\n if (pointerY < midpoints[index]) {\r\n return index;\r\n }\r\n }\r\n\r\n return midpoints.length;\r\n}\r\n\r\nexport function movePane(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n column: PosWorkspaceColumn,\r\n index: number,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n if (!current) {\r\n return layout;\r\n }\r\n\r\n const remaining = layout.panes.filter((pane) => pane.id !== id);\r\n const target = remaining\r\n .filter((pane) => pane.column === column && paneSpan(pane) === null)\r\n .sort((a, b) => a.order - b.order);\r\n const others = remaining.filter((pane) => paneSpan(pane) !== null || pane.column !== column);\r\n const nextIndex = clamp(index, 0, target.length);\r\n // Drag only places. Keep Full width when the designer already turned it on; never invent it\r\n // from a legacy span edge.\r\n const placed: PosWorkspacePanePlacement =\r\n current.fullWidth === true\r\n ? { ...current, column, span: undefined, fullWidth: true }\r\n : { ...current, column, span: undefined, fullWidth: undefined };\r\n target.splice(nextIndex, 0, placed);\r\n\r\n const panes = sortPanes([\r\n ...reindex(others),\r\n ...target.map((pane, order) => ({ ...pane, column, order })),\r\n ]);\r\n const next = { ...layout, panes };\r\n return sameLayout(layout, next) ? layout : next;\r\n}\r\n\r\n/** Adds a region to a column. An omitted index stacks it after the panes already there. */\r\nexport function addPane(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n column: PosWorkspaceColumn = 0,\r\n index?: number,\r\n): PosWorkspaceLayout {\r\n if (layout.panes.some((pane) => pane.id === id)) {\r\n return layout;\r\n }\r\n\r\n const target = layout.panes\r\n .filter((pane) => pane.column === column && paneSpan(pane) === null)\r\n .sort((a, b) => a.order - b.order);\r\n const others = layout.panes.filter((pane) => paneSpan(pane) !== null || pane.column !== column);\r\n target.splice(index === undefined ? target.length : clamp(index, 0, target.length), 0, {\r\n id,\r\n column,\r\n order: 0,\r\n weight: id === 'basket' ? 1 : 0,\r\n });\r\n\r\n return {\r\n ...layout,\r\n panes: sortPanes([\r\n ...reindex(others),\r\n ...target.map((pane, order) => ({ ...pane, column, order })),\r\n ]),\r\n };\r\n}\r\n\r\n/** Drops a region from the arrangement. A library component can be added again; an empty slot is gone. */\r\nexport function removePane(layout: PosWorkspaceLayout, id: PosWorkspacePaneId): PosWorkspaceLayout {\r\n if (!layout.panes.some((pane) => pane.id === id)) {\r\n return layout;\r\n }\r\n\r\n return {\r\n ...layout,\r\n panes: sortPanes(reindex(layout.panes.filter((pane) => pane.id !== id))),\r\n };\r\n}\r\n\r\n/** Lifts a pane into a row that spans both columns. Column placement is kept for when it returns. */\r\nexport function dockFullWidth(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n index: number,\r\n): PosWorkspaceLayout {\r\n return dockSpan(layout, id, 'top', index);\r\n}\r\n\r\n/** Places a pane in a row that spans both columns, above or below the split. */\r\nexport function dockSpan(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n edge: PosWorkspaceSpan,\r\n index: number,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n if (!current) {\r\n return layout;\r\n }\r\n\r\n const remaining = layout.panes.filter((pane) => pane.id !== id);\r\n const top = remaining\r\n .filter((pane) => paneSpan(pane) === 'top')\r\n .sort((a, b) => a.order - b.order);\r\n const bottom = remaining\r\n .filter((pane) => paneSpan(pane) === 'bottom')\r\n .sort((a, b) => a.order - b.order);\r\n const body = remaining.filter((pane) => paneSpan(pane) === null);\r\n const group = edge === 'top' ? top : bottom;\r\n group.splice(clamp(index, 0, group.length), 0, current);\r\n\r\n const panes = sortPanes([\r\n ...top.map((pane, order) => ({ ...pane, fullWidth: true, span: 'top' as const, order })),\r\n ...bottom.map((pane, order) => ({ ...pane, fullWidth: false, span: 'bottom' as const, order })),\r\n ...reindex(body),\r\n ]);\r\n const next = { ...layout, panes };\r\n return sameLayout(layout, next) ? layout : next;\r\n}\r\n\r\nexport function resizeAdjacent(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n nextId: PosWorkspacePaneId,\r\n delta: number,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n const next = layout.panes.find((pane) => pane.id === nextId);\r\n if (!current || !next || current.id === next.id) {\r\n return layout;\r\n }\r\n\r\n const currentBase = current.weight > 0 ? current.weight : 1;\r\n const nextBase = next.weight > 0 ? next.weight : 1;\r\n const grown = clamp(currentBase + delta, MIN_WEIGHT, MAX_WEIGHT);\r\n const requested = grown - currentBase;\r\n const nextWeight = clamp(nextBase - requested, MIN_WEIGHT, MAX_WEIGHT);\r\n const taken = nextBase - nextWeight;\r\n const currentWeight = clamp(currentBase + taken, MIN_WEIGHT, MAX_WEIGHT);\r\n\r\n return {\r\n ...layout,\r\n panes: layout.panes.map((pane) => {\r\n if (pane.id === current.id) {\r\n return { ...pane, weight: roundWeight(currentWeight) };\r\n }\r\n\r\n if (pane.id === next.id) {\r\n return { ...pane, weight: roundWeight(nextWeight) };\r\n }\r\n\r\n return pane;\r\n }),\r\n };\r\n}\r\n\r\n/** Weight 0 sizes to content. A positive weight shares leftover height in that column. */\r\n/** Turns full width on at the pane's current place, or returns it to its column width. */\r\nexport function setPaneFullWidth(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n enabled: boolean,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n if (!current) {\r\n return layout;\r\n }\r\n\r\n const wide = paneFillsWidth(current);\r\n if (!enabled && !wide) {\r\n return layout;\r\n }\r\n\r\n if (enabled && current.fullWidth === true && current.span == null) {\r\n return layout;\r\n }\r\n\r\n return {\r\n ...layout,\r\n panes: layout.panes.map((pane) => {\r\n if (pane.id !== id) {\r\n return pane;\r\n }\r\n\r\n if (!enabled) {\r\n const { span: _span, fullWidth: _fullWidth, ...rest } = pane;\r\n return rest;\r\n }\r\n\r\n const { span: _span, ...rest } = pane;\r\n return { ...rest, fullWidth: true };\r\n }),\r\n };\r\n}\r\n\r\nexport function setPaneWeight(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n weight: number,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n if (!current || current.weight === weight) {\r\n return layout;\r\n }\r\n\r\n return {\r\n ...layout,\r\n panes: layout.panes.map((pane) => (pane.id === id ? { ...pane, weight } : pane)),\r\n };\r\n}\r\n\r\n/** `false` keeps the pane in the layout and hides it on the till. `true` clears that flag. */\r\nexport function setPaneVisible(\r\n layout: PosWorkspaceLayout,\r\n id: PosWorkspacePaneId,\r\n visible: boolean,\r\n): PosWorkspaceLayout {\r\n const current = layout.panes.find((pane) => pane.id === id);\r\n if (!current || (current.visible !== false) === visible) {\r\n return layout;\r\n }\r\n\r\n return {\r\n ...layout,\r\n panes: layout.panes.map((pane) => {\r\n if (pane.id !== id) {\r\n return pane;\r\n }\r\n\r\n if (visible) {\r\n const { visible: _hidden, ...shown } = pane;\r\n return shown;\r\n }\r\n\r\n return { ...pane, visible: false };\r\n }),\r\n };\r\n}\r\n\r\nexport function setColumnRatio(layout: PosWorkspaceLayout, ratio: number): PosWorkspaceLayout {\r\n const startColumnRatio = roundWeight(clamp(ratio, MIN_RATIO, MAX_RATIO));\r\n if (startColumnRatio === layout.startColumnRatio) {\r\n return layout;\r\n }\r\n\r\n return { ...layout, startColumnRatio };\r\n}\r\n\r\nexport function sameLayout(left: PosWorkspaceLayout, right: PosWorkspaceLayout): boolean {\r\n if (\r\n left.startColumnRatio !== right.startColumnRatio ||\r\n left.panes.length !== right.panes.length\r\n ) {\r\n return false;\r\n }\r\n\r\n const byId = (layout: PosWorkspaceLayout) =>\r\n layout.panes.slice().sort((a, b) => a.id.localeCompare(b.id));\r\n return byId(left).every((pane, index) => {\r\n const other = byId(right)[index];\r\n return (\r\n pane.id === other.id &&\r\n pane.column === other.column &&\r\n pane.order === other.order &&\r\n pane.weight === other.weight &&\r\n paneSpan(pane) === paneSpan(other) &&\r\n (pane.fullWidth === true) === (other.fullWidth === true) &&\r\n (pane.visible !== false) === (other.visible !== false)\r\n );\r\n });\r\n}\r\n\r\nfunction placedPanes(\r\n layout: PosWorkspaceLayout,\r\n present: readonly PosWorkspacePaneId[],\r\n): PosWorkspacePanePlacement[] {\r\n const presentIds = new Set(present);\r\n const seen = new Set<PosWorkspacePaneId>();\r\n const panes: PosWorkspacePanePlacement[] = [];\r\n\r\n for (const pane of layout.panes) {\r\n if (seen.has(pane.id)) {\r\n continue;\r\n }\r\n\r\n if (!presentIds.has(pane.id) && !isEmptyPaneId(pane.id)) {\r\n continue;\r\n }\r\n\r\n seen.add(pane.id);\r\n panes.push(pane);\r\n }\r\n\r\n return panes;\r\n}\r\n\r\nfunction visualColumns(\r\n panes: readonly PosWorkspacePanePlacement[],\r\n compact: boolean,\r\n): [PosWorkspacePanePlacement[], PosWorkspacePanePlacement[]] {\r\n const left = columnList(panes, 0);\r\n const right = columnList(panes, 1);\r\n\r\n if (compact) {\r\n return [compactStack(left, right), []];\r\n }\r\n\r\n if (right.length === 0) {\r\n return [left, []];\r\n }\r\n\r\n if (left.length === 0) {\r\n return [right, []];\r\n }\r\n\r\n return [left, right];\r\n}\r\n\r\n/** On a narrow screen, keep the header at the top and the action bar at the bottom. */\r\nfunction compactStack(\r\n left: readonly PosWorkspacePanePlacement[],\r\n right: readonly PosWorkspacePanePlacement[],\r\n): PosWorkspacePanePlacement[] {\r\n const all = [...left, ...right];\r\n const header = all.filter((pane) => pane.id === 'header');\r\n const actionBar = all.filter((pane) => pane.id === 'actionBar');\r\n const middle = all.filter((pane) => pane.id !== 'header' && pane.id !== 'actionBar');\r\n return [...header, ...middle, ...actionBar];\r\n}\r\n\r\nfunction columnList(\r\n panes: readonly PosWorkspacePanePlacement[],\r\n column: PosWorkspaceColumn,\r\n): PosWorkspacePanePlacement[] {\r\n return panes.filter((pane) => pane.column === column).sort((a, b) => a.order - b.order);\r\n}\r\n\r\nfunction singleColumnGrid(panes: readonly PosWorkspacePanePlacement[]): PosWorkspaceGrid {\r\n const rows = panes.map((pane) => rowTrack(pane.weight));\r\n\r\n return {\r\n columns: 'minmax(0, 1fr)',\r\n rows: rows.join(' '),\r\n split: false,\r\n panes: panes.map((pane, index) => ({\r\n id: pane.id,\r\n column: 1 as const,\r\n rowStart: index + 1,\r\n rowEnd: index + 2,\r\n showResize: index < panes.length - 1,\r\n spanColumns: pane.fullWidth === true ? true : undefined,\r\n })),\r\n };\r\n}\r\n\r\nfunction splitGrid(\r\n left: readonly PosWorkspacePanePlacement[],\r\n right: readonly PosWorkspacePanePlacement[],\r\n ratio: number,\r\n): PosWorkspaceGrid {\r\n const spanLeft = left.length === 1 && right.length > 1;\r\n const spanRight = right.length === 1 && left.length > 1;\r\n\r\n if (!spanLeft && !spanRight) {\r\n if (left.length === 1 && right.length === 1) {\r\n return {\r\n columns: columnTemplate(ratio),\r\n rows: 'minmax(0, 1fr)',\r\n split: true,\r\n panes: [gridPane(left[0], 1, 1, 2, false), gridPane(right[0], 2, 1, 2, false)],\r\n };\r\n }\r\n\r\n return sharedRowGrid(left, right, ratio);\r\n }\r\n\r\n const stack = spanRight ? left : right;\r\n const spanning = spanRight ? right[0] : left[0];\r\n const stackColumn = spanRight ? 1 : 2;\r\n const spanColumn = spanRight ? 2 : 1;\r\n const rows = stackTracks(stack);\r\n\r\n return {\r\n columns: columnTemplate(ratio),\r\n rows: rows.join(' '),\r\n split: true,\r\n panes: [\r\n ...stack.map((pane, index) =>\r\n gridPane(pane, stackColumn, index + 1, index + 2, index < stack.length - 1),\r\n ),\r\n gridPane(spanning, spanColumn, 1, rows.length + 1, false),\r\n ],\r\n };\r\n}\r\n\r\n/** Row size follows weight. Weight 0 is the content height. A positive weight shares leftover height. */\r\nfunction stackTracks(stack: readonly PosWorkspacePanePlacement[]): string[] {\r\n return stack.map((pane) => rowTrack(pane.weight));\r\n}\r\n\r\nfunction sharedRowGrid(\r\n left: readonly PosWorkspacePanePlacement[],\r\n right: readonly PosWorkspacePanePlacement[],\r\n ratio: number,\r\n): PosWorkspaceGrid {\r\n const rowCount = Math.max(left.length, right.length);\r\n const rows: string[] = [];\r\n for (let index = 0; index < rowCount; index += 1) {\r\n const weight = Math.max(left[index]?.weight ?? 0, right[index]?.weight ?? 0);\r\n rows.push(weight > 0 ? rowTrack(weight) : 'auto');\r\n }\r\n\r\n const place = (list: readonly PosWorkspacePanePlacement[], column: 1 | 2) =>\r\n list.map((pane, index) =>\r\n gridPane(pane, column, index + 1, index + 2, index < list.length - 1),\r\n );\r\n\r\n return {\r\n columns: columnTemplate(ratio),\r\n rows: rows.join(' '),\r\n split: true,\r\n panes: [...place(left, 1), ...place(right, 2)],\r\n };\r\n}\r\n\r\nfunction gridPane(\r\n pane: PosWorkspacePanePlacement,\r\n column: 1 | 2,\r\n rowStart: number,\r\n rowEnd: number,\r\n showResize: boolean,\r\n): PosWorkspaceGridPane {\r\n return { id: pane.id, column, rowStart, rowEnd, showResize };\r\n}\r\n\r\nfunction columnTemplate(ratio: number): string {\r\n const start = roundWeight(clamp(ratio, MIN_RATIO, MAX_RATIO));\r\n const end = roundWeight(1 - start);\r\n return `minmax(0, ${start}fr) minmax(0, ${end}fr)`;\r\n}\r\n\r\n/** Counts CSS grid tracks. Spaces inside minmax() stay part of one track. */\r\nfunction trackCount(template: string): number {\r\n let depth = 0;\r\n let count = 0;\r\n let current = false;\r\n\r\n for (const char of template.trim()) {\r\n if (char === '(') {\r\n depth += 1;\r\n } else if (char === ')') {\r\n depth = Math.max(0, depth - 1);\r\n }\r\n\r\n if (depth === 0 && char === ' ') {\r\n current = false;\r\n continue;\r\n }\r\n\r\n if (!current) {\r\n current = true;\r\n count += 1;\r\n }\r\n }\r\n\r\n return count;\r\n}\r\n\r\nfunction rowTrack(weight: number): string {\r\n if (weight <= 0) {\r\n return 'auto';\r\n }\r\n\r\n return `minmax(0, ${roundWeight(weight)}fr)`;\r\n}\r\n\r\nfunction reindex(panes: readonly PosWorkspacePanePlacement[]): PosWorkspacePanePlacement[] {\r\n const columns: PosWorkspaceColumn[] = [0, 1];\r\n const result: PosWorkspacePanePlacement[] = [];\r\n for (const column of columns) {\r\n columnList(panes, column).forEach((pane, order) => {\r\n result.push({ ...pane, order });\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction sortPanes(panes: readonly PosWorkspacePanePlacement[]): PosWorkspacePanePlacement[] {\r\n return panes.slice().sort((a, b) => a.column - b.column || a.order - b.order);\r\n}\r\n\r\nfunction roundWeight(value: number): number {\r\n return Math.round(value * 100) / 100;\r\n}\r\n\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\n\r\nimport { POS_WORKSPACE, type PosWorkspaceMoveKey } from './pos-workspace-controller';\r\nimport { workspacePaneLabel, type PosWorkspacePaneId } from './pos-workspace-layout';\r\n\r\n@Component({\r\n selector: 'pos-workspace-pane',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-workspace-pane.html',\r\n styleUrl: './pos-workspace-pane.scss',\r\n host: {\r\n class: 'pos-workspace-pane',\r\n '[class.pos-workspace-pane--editing]': 'workspace.editing()',\r\n '[class.pos-workspace-pane--dragging]': 'dragging()',\r\n '[class.pos-workspace-pane--hidden]': 'concealed()',\r\n '[attr.data-pane]': 'paneId()',\r\n '[style.display]': 'place() ? null : \"none\"',\r\n '[style.grid-column]': 'columnStyle()',\r\n '[style.grid-row]': 'rowStyle()',\r\n },\r\n})\r\nexport class PosWorkspacePane {\r\n protected readonly workspace = inject(POS_WORKSPACE);\r\n\r\n readonly paneId = input.required<PosWorkspacePaneId>();\r\n /** Draws the unassigned-slot message. The POS replaces this by projecting the same pane id. */\r\n readonly placeholder = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly place = computed(() => this.workspace.placements().get(this.paneId()));\r\n\r\n protected readonly dragging = computed(() => this.workspace.draggingPane() === this.paneId());\r\n protected readonly columnStyle = computed(() => {\r\n const place = this.place();\r\n if (!place) {\r\n return null;\r\n }\r\n\r\n return place.spanColumns ? '1 / -1' : place.column;\r\n });\r\n protected readonly rowStyle = computed(() => {\r\n const place = this.place();\r\n return place ? `${place.rowStart} / ${place.rowEnd}` : null;\r\n });\r\n protected readonly showResize = computed(() => this.place()?.showResize === true);\r\n protected readonly concealed = computed(() => this.place()?.concealed === true);\r\n protected readonly settingsOpen = computed(\r\n () => this.workspace.settingsPane() === this.paneId(),\r\n );\r\n protected readonly fullWidth = computed(() => this.workspace.fullWidthIds().has(this.paneId()));\r\n protected readonly shown = computed(() => this.place()?.concealed !== true);\r\n protected readonly flexible = computed(() => this.workspace.flexibleIds().has(this.paneId()));\r\n protected readonly label = computed(() => workspacePaneLabel(this.paneId()));\r\n protected readonly menuAbove = computed(() => {\r\n const place = this.place();\r\n if (!place) {\r\n return false;\r\n }\r\n\r\n let maxEnd = place.rowEnd;\r\n for (const item of this.workspace.placements().values()) {\r\n maxEnd = Math.max(maxEnd, item.rowEnd);\r\n }\r\n\r\n return place.rowEnd === maxEnd && this.workspace.placements().size > 1;\r\n });\r\n protected readonly handleLabel = computed(\r\n () => `Move ${this.label()}. Arrow keys change its position.`,\r\n );\r\n protected readonly resizeLabel = computed(\r\n () => `Resize ${this.label()}. Arrow keys change its height.`,\r\n );\r\n protected readonly settingsLabel = computed(() => `${this.label()} settings`);\r\n protected readonly closeMenuLabel = computed(() => `Close ${this.label()} settings`);\r\n protected readonly removeLabel = computed(() => `Remove ${this.label()}`);\r\n\r\n protected onDragPointerDown(event: PointerEvent): void {\r\n if (!this.workspace.editing()) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.workspace.closePaneSettings(this.paneId());\r\n this.capture(event);\r\n this.workspace.beginPaneDrag(this.paneId(), event);\r\n }\r\n\r\n protected onDragPointerMove(event: PointerEvent): void {\r\n if (this.workspace.draggingPane() !== this.paneId()) {\r\n return;\r\n }\r\n\r\n this.workspace.updatePaneDrag(event);\r\n }\r\n\r\n protected onDragPointerUp(event: PointerEvent): void {\r\n if (this.workspace.draggingPane() !== this.paneId()) {\r\n return;\r\n }\r\n\r\n this.workspace.endPaneDrag(event);\r\n }\r\n\r\n protected onHandleKeydown(event: KeyboardEvent): void {\r\n if (!this.isMoveKey(event.key)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.workspace.moveByKey(this.paneId(), event.key);\r\n }\r\n\r\n protected toggleSettings(event: Event): void {\r\n event.stopPropagation();\r\n this.workspace.togglePaneSettings(this.paneId());\r\n }\r\n\r\n protected closeSettings(event: Event): void {\r\n event.stopPropagation();\r\n this.workspace.closePaneSettings(this.paneId());\r\n }\r\n\r\n protected onSettingsKeydown(event: KeyboardEvent): void {\r\n if (event.key !== 'Escape') {\r\n return;\r\n }\r\n\r\n event.stopPropagation();\r\n this.workspace.closePaneSettings(this.paneId());\r\n }\r\n\r\n protected onVisible(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.workspace.setVisible(this.paneId(), target.checked);\r\n }\r\n\r\n protected onFlexible(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.workspace.setFlexible(this.paneId(), target.checked);\r\n }\r\n\r\n protected onFullWidth(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.workspace.setFullWidth(this.paneId(), target.checked);\r\n }\r\n\r\n protected onRemove(event: Event): void {\r\n event.stopPropagation();\r\n this.workspace.closePaneSettings(this.paneId());\r\n this.workspace.removeFromLayout(this.paneId());\r\n }\r\n\r\n protected onResizePointerDown(event: PointerEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.capture(event);\r\n this.workspace.beginPaneResize(this.paneId(), event);\r\n }\r\n\r\n protected onResizePointerMove(event: PointerEvent): void {\r\n this.workspace.updatePaneResize(event);\r\n }\r\n\r\n protected onResizePointerUp(): void {\r\n this.workspace.endPaneResize();\r\n }\r\n\r\n protected onResizeKeydown(event: KeyboardEvent): void {\r\n if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.workspace.resizeByKey(this.paneId(), event.key === 'ArrowDown' ? 1 : -1);\r\n }\r\n\r\n private capture(event: PointerEvent): void {\r\n const handle = event.currentTarget;\r\n if (!(handle instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n try {\r\n handle.setPointerCapture(event.pointerId);\r\n } catch {\r\n // The pointer is not active yet. The drag still follows pointerup on the handle.\r\n }\r\n }\r\n\r\n private isMoveKey(key: string): key is PosWorkspaceMoveKey {\r\n return key === 'ArrowUp' || key === 'ArrowDown' || key === 'ArrowLeft' || key === 'ArrowRight';\r\n }\r\n}\r\n","@if (concealed()) {\r\n <p class=\"pos-workspace-pane__concealed\">Hidden on the till. {{ label() }}.</p>\r\n}\r\n\r\n<div class=\"pos-workspace-pane__content\">\r\n <ng-content />\r\n @if (placeholder()) {\r\n <p class=\"pos-workspace-pane__slot\">{{ label() }}. The POS assigns what appears here.</p>\r\n }\r\n</div>\r\n\r\n@if (workspace.editing()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace-pane__handle\"\r\n [attr.aria-label]=\"handleLabel()\"\r\n aria-keyshortcuts=\"ArrowUp ArrowDown ArrowLeft ArrowRight\"\r\n (pointerdown)=\"onDragPointerDown($event)\"\r\n (pointermove)=\"onDragPointerMove($event)\"\r\n (pointerup)=\"onDragPointerUp($event)\"\r\n (pointercancel)=\"onDragPointerUp($event)\"\r\n (keydown)=\"onHandleKeydown($event)\"\r\n >\r\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">\r\n <circle cx=\"5\" cy=\"3\" r=\"1.2\" />\r\n <circle cx=\"11\" cy=\"3\" r=\"1.2\" />\r\n <circle cx=\"5\" cy=\"8\" r=\"1.2\" />\r\n <circle cx=\"11\" cy=\"8\" r=\"1.2\" />\r\n <circle cx=\"5\" cy=\"13\" r=\"1.2\" />\r\n <circle cx=\"11\" cy=\"13\" r=\"1.2\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace-pane__settings\"\r\n [attr.aria-label]=\"settingsLabel()\"\r\n [attr.aria-expanded]=\"settingsOpen()\"\r\n (click)=\"toggleSettings($event)\"\r\n (keydown)=\"onSettingsKeydown($event)\"\r\n >\r\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">\r\n <path d=\"M2 4h12M2 8h12M2 12h12\" />\r\n <circle cx=\"6\" cy=\"4\" r=\"1.5\" />\r\n <circle cx=\"11\" cy=\"8\" r=\"1.5\" />\r\n <circle cx=\"7\" cy=\"12\" r=\"1.5\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace-pane__close\"\r\n [attr.aria-label]=\"removeLabel()\"\r\n (click)=\"onRemove($event)\"\r\n >\r\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">\r\n <path d=\"M4 4l8 8M12 4l-8 8\" />\r\n </svg>\r\n </button>\r\n\r\n @if (settingsOpen()) {\r\n <div\r\n class=\"pos-workspace-pane__menu\"\r\n [class.pos-workspace-pane__menu--above]=\"menuAbove()\"\r\n role=\"group\"\r\n [attr.aria-label]=\"settingsLabel()\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace-pane__menu-close\"\r\n [attr.aria-label]=\"closeMenuLabel()\"\r\n (click)=\"closeSettings($event)\"\r\n >\r\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">\r\n <path d=\"M4 4l8 8M12 4l-8 8\" />\r\n </svg>\r\n </button>\r\n <label class=\"pos-workspace-pane__option\">\r\n <input type=\"checkbox\" [checked]=\"shown()\" (change)=\"onVisible($event)\" />\r\n Visible\r\n </label>\r\n <label class=\"pos-workspace-pane__option\">\r\n <input type=\"checkbox\" [checked]=\"flexible()\" (change)=\"onFlexible($event)\" />\r\n Flexible height\r\n </label>\r\n <label class=\"pos-workspace-pane__option\">\r\n <input type=\"checkbox\" [checked]=\"fullWidth()\" (change)=\"onFullWidth($event)\" />\r\n Full width\r\n </label>\r\n </div>\r\n }\r\n\r\n @if (showResize()) {\r\n <div\r\n class=\"pos-workspace-pane__resize\"\r\n role=\"separator\"\r\n aria-orientation=\"horizontal\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"resizeLabel()\"\r\n aria-keyshortcuts=\"ArrowUp ArrowDown\"\r\n (pointerdown)=\"onResizePointerDown($event)\"\r\n (pointermove)=\"onResizePointerMove($event)\"\r\n (pointerup)=\"onResizePointerUp()\"\r\n (pointercancel)=\"onResizePointerUp()\"\r\n (keydown)=\"onResizeKeydown($event)\"\r\n ></div>\r\n }\r\n}\r\n","import {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChildren,\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n forwardRef,\r\n inject,\r\n input,\r\n linkedSignal,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\n\r\nimport { POS_WORKSPACE, type PosWorkspaceMoveKey } from './pos-workspace-controller';\r\nimport {\r\n addPane,\r\n dropColumn,\r\n insertionIndex,\r\n isEmptyPaneId,\r\n movePane,\r\n nextEmptyId,\r\n paneSpan,\r\n paneFillsWidth,\r\n POS_WORKSPACE_DEFAULT_LAYOUT,\r\n POS_WORKSPACE_PANE_IDS,\r\n removePane,\r\n resizeAdjacent,\r\n sameLayout,\r\n setColumnRatio,\r\n setPaneFullWidth,\r\n setPaneVisible,\r\n setPaneWeight,\r\n workspaceGrid,\r\n parseWorkspaceLayout,\r\n workspaceLayoutJson,\r\n workspacePaneLabel,\r\n type PosWorkspaceBuiltinPaneId,\r\n type PosWorkspaceColumn,\r\n type PosWorkspaceLayout,\r\n type PosWorkspacePaneId,\r\n type PosWorkspaceSpan,\r\n} from './pos-workspace-layout';\r\nimport { PosWorkspacePane } from './pos-workspace-pane';\r\n\r\ninterface PosWorkspaceDropIndicator {\r\n readonly top: number;\r\n readonly left: number;\r\n readonly width: number;\r\n readonly height: number;\r\n readonly line: boolean;\r\n}\r\n\r\ninterface PosWorkspaceDropTarget {\r\n readonly fullWidth: boolean;\r\n readonly column: PosWorkspaceColumn;\r\n readonly index: number;\r\n}\r\n\r\ninterface PosWorkspaceDropHint {\r\n readonly kind: 'top' | 'bottom' | 'dock';\r\n readonly top: number;\r\n readonly left: number;\r\n readonly width: number;\r\n readonly height: number;\r\n}\r\n\r\ninterface PosWorkspaceResizeSession {\r\n readonly id: PosWorkspacePaneId;\r\n readonly nextId: PosWorkspacePaneId;\r\n readonly startY: number;\r\n readonly startLayout: PosWorkspaceLayout;\r\n readonly span: number;\r\n}\r\n\r\nconst COMPACT_WIDTH = 720;\r\nconst DOCK_THRESHOLD = 0.7;\r\n/** Band above a docked right column where a drop spans both columns. */\r\nconst FULL_WIDTH_BAND = 72;\r\n\r\n@Component({\r\n selector: 'pos-workspace',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [PosWorkspacePane],\r\n templateUrl: './pos-workspace.html',\r\n styleUrl: './pos-workspace.scss',\r\n providers: [{ provide: POS_WORKSPACE, useExisting: forwardRef(() => PosWorkspace) }],\r\n host: {\r\n class: 'pos-workspace',\r\n '[class.pos-workspace--editing]': 'editing()',\r\n '[class.pos-workspace--dragging]': 'draggingPane() !== null',\r\n },\r\n})\r\nexport class PosWorkspace {\r\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly paneRefs = contentChildren(PosWorkspacePane);\r\n private readonly frameRef = viewChild<ElementRef<HTMLElement>>('frame');\r\n\r\n /** Draws outlines, drag handles, and resize controls. */\r\n readonly editing = input(false);\r\n /** Starting arrangement. Edits stay in this view until a new layout input arrives. */\r\n readonly layout = input<PosWorkspaceLayout>(POS_WORKSPACE_DEFAULT_LAYOUT);\r\n /** Fired when the arrangement changes. Nothing is stored beyond this view. */\r\n readonly layoutChange = output<PosWorkspaceLayout>();\r\n /** The arrangement to pass back as `layout` from the consuming POS. */\r\n readonly layoutExport = output<PosWorkspaceLayout>();\r\n\r\n private readonly layoutState = linkedSignal(() => this.layout());\r\n private readonly viewportWidth = signal(1280);\r\n private readonly dropTarget = signal<PosWorkspaceDropTarget | null>(null);\r\n private resizeSession: PosWorkspaceResizeSession | null = null;\r\n private paletteGesture: {\r\n readonly id: PosWorkspacePaneId;\r\n readonly x: number;\r\n readonly y: number;\r\n } | null = null;\r\n private ignorePaletteClick = false;\r\n protected readonly paletteOpen = signal(false);\r\n protected readonly paletteMenuLifted = signal(false);\r\n private splitting = false;\r\n private splitStartLayout: PosWorkspaceLayout | null = null;\r\n private readonly history: PosWorkspaceLayout[] = [];\r\n protected readonly canUndo = signal(false);\r\n\r\n readonly draggingPane = signal<PosWorkspacePaneId | null>(null);\r\n readonly settingsPane = signal<PosWorkspacePaneId | null>(null);\r\n readonly spans = computed(() => {\r\n const map = new Map<PosWorkspacePaneId, PosWorkspaceSpan | null>();\r\n for (const pane of this.layoutState().panes) {\r\n map.set(pane.id, paneSpan(pane));\r\n }\r\n return map;\r\n });\r\n readonly fullWidthIds = computed(() => {\r\n const ids = new Set<PosWorkspacePaneId>();\r\n for (const pane of this.layoutState().panes) {\r\n if (paneFillsWidth(pane)) {\r\n ids.add(pane.id);\r\n }\r\n }\r\n return ids;\r\n });\r\n readonly flexibleIds = computed(() => {\r\n const ids = new Set<PosWorkspacePaneId>();\r\n for (const pane of this.layoutState().panes) {\r\n if (pane.weight > 0) {\r\n ids.add(pane.id);\r\n }\r\n }\r\n return ids;\r\n });\r\n protected readonly dropIndicator = signal<PosWorkspaceDropIndicator | null>(null);\r\n protected readonly dropHints = signal<readonly PosWorkspaceDropHint[]>([]);\r\n protected readonly status = signal('');\r\n\r\n private readonly compact = computed(() => this.viewportWidth() < COMPACT_WIDTH);\r\n\r\n protected readonly grid = computed(() =>\r\n workspaceGrid(\r\n this.layoutState(),\r\n this.paneRefs().map((pane) => pane.paneId()),\r\n { compact: this.compact(), includeHidden: this.editing() },\r\n ),\r\n );\r\n\r\n /** Library components the host projected that are not on the screen yet. */\r\n protected readonly palette = computed(() => {\r\n const placed = new Set(this.layoutState().panes.map((pane) => pane.id));\r\n const projected = new Set(this.paneRefs().map((pane) => pane.paneId()));\r\n return POS_WORKSPACE_PANE_IDS.filter((id) => projected.has(id) && !placed.has(id));\r\n });\r\n\r\n /** Empty slots with no projected content. The POS fills a slot by projecting the same id. */\r\n protected readonly emptySlots = computed(() => {\r\n const projected = new Set(this.paneRefs().map((pane) => pane.paneId()));\r\n const seen = new Set<string>();\r\n const slots: `empty-${number}`[] = [];\r\n for (const pane of this.layoutState().panes) {\r\n if (!isEmptyPaneId(pane.id)) {\r\n continue;\r\n }\r\n\r\n if (projected.has(pane.id) || seen.has(pane.id)) {\r\n continue;\r\n }\r\n\r\n seen.add(pane.id);\r\n slots.push(pane.id);\r\n }\r\n\r\n return slots;\r\n });\r\n\r\n protected readonly paneLabel = workspacePaneLabel;\r\n\r\n readonly placements = computed(() => {\r\n const map = new Map<PosWorkspacePaneId, ReturnType<typeof workspaceGrid>['panes'][number]>();\r\n for (const pane of this.grid().panes) {\r\n map.set(pane.id, pane);\r\n }\r\n return map;\r\n });\r\n\r\n protected readonly showSplitter = computed(\r\n () => this.editing() && this.grid().split && !this.compact(),\r\n );\r\n\r\n /** The rows the right column occupies, so the bar stays off full-width panes. */\r\n protected readonly splitterRow = computed(() => {\r\n const splitPanes = this.grid().panes.filter((pane) => pane.column === 2);\r\n if (splitPanes.length === 0) {\r\n return '1 / -1';\r\n }\r\n\r\n const start = Math.min(...splitPanes.map((pane) => pane.rowStart));\r\n const end = Math.max(...splitPanes.map((pane) => pane.rowEnd));\r\n return `${start} / ${end}`;\r\n });\r\n\r\n protected readonly splitterLeft = computed(() => {\r\n const ratio = this.layoutState().startColumnRatio;\r\n return `calc((100% - var(--pos-space-md)) * ${ratio})`;\r\n });\r\n\r\n protected readonly ratioPercent = computed(() =>\r\n Math.round(this.layoutState().startColumnRatio * 100),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n if (!this.editing()) {\r\n this.clearInteraction();\r\n }\r\n });\r\n\r\n effect(() => {\r\n this.layout();\r\n untracked(() => {\r\n this.history.length = 0;\r\n this.canUndo.set(false);\r\n });\r\n });\r\n\r\n afterNextRender(() => {\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n const element = this.hostRef.nativeElement;\r\n const observer = new ResizeObserver((entries) => {\r\n const width = entries[0]?.contentRect.width ?? 0;\r\n if (width >= 1) {\r\n this.viewportWidth.set(width);\r\n }\r\n });\r\n observer.observe(element);\r\n this.destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n togglePaneSettings(id: PosWorkspacePaneId): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n this.settingsPane.update((current) => (current === id ? null : id));\r\n }\r\n\r\n closePaneSettings(id: PosWorkspacePaneId): void {\r\n if (this.settingsPane() === id) {\r\n this.settingsPane.set(null);\r\n }\r\n }\r\n\r\n moveByKey(id: PosWorkspacePaneId, key: PosWorkspaceMoveKey): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const layout = this.layoutState();\r\n const pane = layout.panes.find((item) => item.id === id);\r\n if (!pane) {\r\n return;\r\n }\r\n\r\n if (key === 'ArrowLeft' || key === 'ArrowRight') {\r\n if (this.compact()) {\r\n this.status.set('Widen the screen to dock a pane beside the others.');\r\n return;\r\n }\r\n\r\n const column: PosWorkspaceColumn = key === 'ArrowRight' ? 1 : 0;\r\n if (pane.column === column && paneSpan(pane) === null) {\r\n return;\r\n }\r\n\r\n const index = layout.panes.filter(\r\n (item) => item.column === column && paneSpan(item) === null,\r\n ).length;\r\n this.commit(movePane(layout, id, column, index), this.messageForMove(id, column));\r\n return;\r\n }\r\n\r\n const edge = paneSpan(pane);\r\n if (edge === 'top') {\r\n if (key === 'ArrowDown') {\r\n this.commit(\r\n movePane(layout, id, 0, 0),\r\n `${workspacePaneLabel(id)} returned to the left stack.`,\r\n );\r\n }\r\n return;\r\n }\r\n\r\n if (edge === 'bottom') {\r\n if (key === 'ArrowUp') {\r\n const index = layout.panes.filter(\r\n (item) => item.column === 0 && paneSpan(item) === null,\r\n ).length;\r\n this.commit(\r\n movePane(layout, id, 0, index),\r\n `${workspacePaneLabel(id)} returned to the left stack.`,\r\n );\r\n }\r\n return;\r\n }\r\n\r\n const siblings = layout.panes\r\n .filter((item) => item.column === pane.column && paneSpan(item) === null)\r\n .sort((a, b) => a.order - b.order);\r\n const currentIndex = siblings.findIndex((item) => item.id === id);\r\n const index = key === 'ArrowUp' ? Math.max(0, currentIndex - 1) : currentIndex + 1;\r\n this.commit(movePane(layout, id, pane.column, index), `${workspacePaneLabel(id)} moved.`);\r\n }\r\n\r\n resizeByKey(id: PosWorkspacePaneId, direction: -1 | 1): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const nextId = this.nextVisualId(id);\r\n if (!nextId) {\r\n return;\r\n }\r\n\r\n this.commit(\r\n resizeAdjacent(this.layoutState(), id, nextId, direction * 0.2),\r\n `${workspacePaneLabel(id)} height adjusted.`,\r\n );\r\n }\r\n\r\n beginPaneDrag(id: PosWorkspacePaneId, event: PointerEvent): void {\r\n if (!this.editing() || !this.isPrimaryPointer(event)) {\r\n return;\r\n }\r\n\r\n this.resizeSession = null;\r\n this.draggingPane.set(id);\r\n this.status.set(`Moving ${workspacePaneLabel(id)}. Release to place it.`);\r\n this.updatePaneDrag(event);\r\n }\r\n\r\n updatePaneDrag(event: PointerEvent): void {\r\n const id = this.draggingPane();\r\n const grid = this.gridElement();\r\n if (!id || !grid || !this.editing()) {\r\n return;\r\n }\r\n\r\n const rect = grid.getBoundingClientRect();\r\n if (rect.width <= 0 || rect.height <= 0) {\r\n return;\r\n }\r\n\r\n this.refreshDropHints(rect);\r\n\r\n const splitTop = this.splitBodyTop();\r\n if (splitTop != null && this.inFullWidthDropZone(event.clientY, rect, splitTop)) {\r\n const wideIds = this.idsAboveSplit().filter((paneId) => paneId !== id);\r\n const midpoints = wideIds.map((paneId) => {\r\n const paneRect = this.paneElement(paneId)?.getBoundingClientRect();\r\n return paneRect ? paneRect.top + paneRect.height / 2 : Number.POSITIVE_INFINITY;\r\n });\r\n const index = insertionIndex(event.clientY, midpoints);\r\n this.dropTarget.set({ fullWidth: true, column: 0, index });\r\n this.dropIndicator.set(this.fullWidthIndicator(index, wideIds, rect));\r\n return;\r\n }\r\n\r\n const xRatio = (event.clientX - rect.left) / rect.width;\r\n const threshold = this.grid().split ? this.layoutState().startColumnRatio : DOCK_THRESHOLD;\r\n const column = dropColumn(xRatio, threshold, this.compact());\r\n const ids = this.idsInVisualColumn(column).filter((paneId) => paneId !== id);\r\n const midpoints = ids.map((paneId) => {\r\n const paneRect = this.paneElement(paneId)?.getBoundingClientRect();\r\n return paneRect ? paneRect.top + paneRect.height / 2 : Number.POSITIVE_INFINITY;\r\n });\r\n const index = insertionIndex(event.clientY, midpoints);\r\n this.dropTarget.set({ fullWidth: false, column, index });\r\n this.dropIndicator.set(this.indicatorBox(column, index, ids, rect));\r\n }\r\n\r\n endPaneDrag(event?: PointerEvent): void {\r\n if (event?.type === 'pointercancel') {\r\n this.draggingPane.set(null);\r\n this.dropTarget.set(null);\r\n this.dropIndicator.set(null);\r\n this.dropHints.set([]);\r\n return;\r\n }\r\n\r\n if (event) {\r\n this.updatePaneDrag(event);\r\n }\r\n\r\n const id = this.draggingPane();\r\n const target = this.dropTarget();\r\n this.draggingPane.set(null);\r\n this.dropTarget.set(null);\r\n this.dropIndicator.set(null);\r\n this.dropHints.set([]);\r\n\r\n if (!id || !target || !this.editing()) {\r\n return;\r\n }\r\n\r\n const layout = this.layoutState();\r\n const added = !layout.panes.some((pane) => pane.id === id);\r\n const index = target.fullWidth\r\n ? this.bodyIndexForFullWidthDrop(target.index)\r\n : target.index;\r\n let next = added\r\n ? addPane(layout, id, target.column, index)\r\n : movePane(layout, id, target.column, index);\r\n if (target.fullWidth) {\r\n next = setPaneWeight(setPaneFullWidth(next, id, true), id, 0);\r\n }\r\n if (sameLayout(layout, next)) {\r\n this.status.set(`${workspacePaneLabel(id)} stayed in place.`);\r\n return;\r\n }\r\n\r\n this.commit(next, this.placeMessage(id, target, added));\r\n }\r\n\r\n protected onPalettePointerDown(\r\n kind: PosWorkspaceBuiltinPaneId | 'empty',\r\n event: PointerEvent,\r\n ): void {\r\n if (!this.editing() || !this.isPrimaryPointer(event)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const id = kind === 'empty' ? nextEmptyId(this.layoutState()) : kind;\r\n this.paletteGesture = { id, x: event.clientX, y: event.clientY };\r\n this.capture(event);\r\n this.beginPaneDrag(id, event);\r\n }\r\n\r\n protected onPalettePointerMove(event: PointerEvent): void {\r\n const gesture = this.paletteGesture;\r\n if (!gesture) {\r\n return;\r\n }\r\n\r\n if (Math.hypot(event.clientX - gesture.x, event.clientY - gesture.y) > 8) {\r\n this.paletteMenuLifted.set(true);\r\n }\r\n\r\n this.updatePaneDrag(event);\r\n }\r\n\r\n protected onPalettePointerUp(event: PointerEvent): void {\r\n const gesture = this.paletteGesture;\r\n if (!gesture) {\r\n return;\r\n }\r\n\r\n this.paletteGesture = null;\r\n this.ignorePaletteClick = true;\r\n setTimeout(() => {\r\n this.ignorePaletteClick = false;\r\n }, 0);\r\n\r\n const moved = Math.hypot(event.clientX - gesture.x, event.clientY - gesture.y) > 8;\r\n if (!moved) {\r\n this.clearDrag();\r\n this.commit(\r\n addPane(this.layoutState(), gesture.id, 0),\r\n `${workspacePaneLabel(gesture.id)} added.`,\r\n );\r\n return;\r\n }\r\n\r\n this.endPaneDrag(event);\r\n this.closePalette();\r\n }\r\n\r\n protected onPalettePointerCancel(): void {\r\n this.paletteGesture = null;\r\n this.clearDrag();\r\n this.paletteMenuLifted.set(false);\r\n }\r\n\r\n protected onPaletteClick(kind: PosWorkspaceBuiltinPaneId | 'empty'): void {\r\n if (this.ignorePaletteClick || !this.editing()) {\r\n return;\r\n }\r\n\r\n const id = kind === 'empty' ? nextEmptyId(this.layoutState()) : kind;\r\n this.commit(addPane(this.layoutState(), id, 0), `${workspacePaneLabel(id)} added.`);\r\n }\r\n\r\n protected togglePalette(): void {\r\n this.paletteOpen.update((open) => !open);\r\n if (!this.paletteOpen()) {\r\n this.paletteMenuLifted.set(false);\r\n }\r\n }\r\n\r\n protected closePalette(): void {\r\n this.paletteOpen.set(false);\r\n this.paletteMenuLifted.set(false);\r\n }\r\n\r\n protected onPaletteMenuKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.closePalette();\r\n this.hostRef.nativeElement\r\n .querySelector<HTMLElement>('.pos-workspace__palette-toggle')\r\n ?.focus();\r\n return;\r\n }\r\n\r\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') {\r\n return;\r\n }\r\n\r\n const menu = event.currentTarget;\r\n if (!(menu instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n const items = [...menu.querySelectorAll<HTMLButtonElement>('.pos-workspace__palette-item')];\r\n const current = items.indexOf(document.activeElement as HTMLButtonElement);\r\n const step = event.key === 'ArrowDown' ? 1 : -1;\r\n const next = items[(current + step + items.length) % items.length];\r\n event.preventDefault();\r\n next?.focus();\r\n }\r\n\r\n protected undoLayout(): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const previous = this.history.pop();\r\n if (!previous) {\r\n this.canUndo.set(false);\r\n return;\r\n }\r\n\r\n this.canUndo.set(this.history.length > 0);\r\n this.clearInteraction();\r\n this.layoutState.set(previous);\r\n this.publish('Last edit undone.');\r\n }\r\n\r\n protected applyDefaultLayout(): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n this.clearInteraction();\r\n this.commit(POS_WORKSPACE_DEFAULT_LAYOUT, 'Default layout restored.');\r\n }\r\n\r\n protected resetLayout(): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n this.clearInteraction();\r\n this.commit({ ...this.layoutState(), panes: [] }, 'New layout.');\r\n }\r\n\r\n protected exportLayout(): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const layout = this.layoutState();\r\n this.clearInteraction();\r\n this.layoutExport.emit(layout);\r\n this.downloadLayout(workspaceLayoutJson(layout));\r\n this.status.set('Layout exported.');\r\n }\r\n\r\n protected importLayoutFile(event: Event): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const input = event.target;\r\n if (!(input instanceof HTMLInputElement)) {\r\n return;\r\n }\r\n\r\n const file = input.files?.[0];\r\n input.value = '';\r\n if (!file) {\r\n return;\r\n }\r\n\r\n void file.text().then((text) => {\r\n try {\r\n const layout = parseWorkspaceLayout(text);\r\n this.clearInteraction();\r\n this.commit(layout, 'Layout imported.');\r\n this.status.set('Layout imported.');\r\n } catch {\r\n this.status.set('That file is not a workspace layout.');\r\n }\r\n });\r\n }\r\n\r\n setFullWidth(id: PosWorkspacePaneId, enabled: boolean): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const label = workspacePaneLabel(id);\r\n this.commit(\r\n setPaneFullWidth(this.layoutState(), id, enabled),\r\n enabled ? `${label} spans the full width.` : `${label} stays in its column.`,\r\n );\r\n }\r\n\r\n setVisible(id: PosWorkspacePaneId, visible: boolean): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const label = workspacePaneLabel(id);\r\n this.commit(\r\n setPaneVisible(this.layoutState(), id, visible),\r\n visible ? `${label} is visible on the till.` : `${label} is hidden on the till.`,\r\n );\r\n }\r\n\r\n setFlexible(id: PosWorkspacePaneId, enabled: boolean): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n const pane = this.layoutState().panes.find((item) => item.id === id);\r\n if (!pane) {\r\n return;\r\n }\r\n\r\n const weight = enabled ? (pane.weight > 0 ? pane.weight : 1) : 0;\r\n const label = workspacePaneLabel(id);\r\n this.commit(\r\n setPaneWeight(this.layoutState(), id, weight),\r\n enabled ? `${label} fills leftover height.` : `${label} sizes to its content.`,\r\n );\r\n }\r\n\r\n removeFromLayout(id: PosWorkspacePaneId): void {\r\n if (!this.editing()) {\r\n return;\r\n }\r\n\r\n this.commit(removePane(this.layoutState(), id), `${workspacePaneLabel(id)} removed.`);\r\n }\r\n\r\n beginPaneResize(id: PosWorkspacePaneId, event: PointerEvent): void {\r\n if (!this.editing() || !this.isPrimaryPointer(event)) {\r\n return;\r\n }\r\n\r\n const nextId = this.nextVisualId(id);\r\n const grid = this.gridElement();\r\n if (!nextId || !grid) {\r\n return;\r\n }\r\n\r\n const rect = grid.getBoundingClientRect();\r\n if (rect.height <= 0) {\r\n return;\r\n }\r\n\r\n this.draggingPane.set(null);\r\n this.dropIndicator.set(null);\r\n this.resizeSession = {\r\n id,\r\n nextId,\r\n startY: event.clientY,\r\n startLayout: this.layoutState(),\r\n span: rect.height,\r\n };\r\n }\r\n\r\n updatePaneResize(event: PointerEvent): void {\r\n const session = this.resizeSession;\r\n if (!session || !this.editing()) {\r\n return;\r\n }\r\n\r\n const pair = session.startLayout.panes.filter(\r\n (pane) => pane.id === session.id || pane.id === session.nextId,\r\n );\r\n const total = pair.reduce((sum, pane) => sum + (pane.weight > 0 ? pane.weight : 1), 0);\r\n const delta = ((event.clientY - session.startY) / session.span) * total;\r\n this.layoutState.set(resizeAdjacent(session.startLayout, session.id, session.nextId, delta));\r\n }\r\n\r\n endPaneResize(): void {\r\n const session = this.resizeSession;\r\n if (!session) {\r\n return;\r\n }\r\n\r\n this.resizeSession = null;\r\n if (sameLayout(session.startLayout, this.layoutState())) {\r\n return;\r\n }\r\n\r\n this.remember(session.startLayout);\r\n this.publish(`${workspacePaneLabel(session.id)} height adjusted.`);\r\n }\r\n\r\n protected onSplitterDown(event: PointerEvent): void {\r\n if (!this.isPrimaryPointer(event)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n this.capture(event);\r\n this.splitting = true;\r\n this.splitStartLayout = this.layoutState();\r\n }\r\n\r\n protected onSplitterMove(event: PointerEvent): void {\r\n if (!this.splitting) {\r\n return;\r\n }\r\n\r\n const grid = this.gridElement();\r\n if (!grid) {\r\n return;\r\n }\r\n\r\n const rect = grid.getBoundingClientRect();\r\n const style = getComputedStyle(grid);\r\n const padLeft = Number.parseFloat(style.paddingLeft) || 0;\r\n const padRight = Number.parseFloat(style.paddingRight) || 0;\r\n const gap = Number.parseFloat(style.columnGap || style.gap) || 0;\r\n const inner = rect.width - padLeft - padRight - gap;\r\n if (inner <= 0) {\r\n return;\r\n }\r\n\r\n const ratio = (event.clientX - rect.left - padLeft) / inner;\r\n this.layoutState.set(setColumnRatio(this.layoutState(), ratio));\r\n }\r\n\r\n protected onSplitterUp(): void {\r\n if (!this.splitting) {\r\n return;\r\n }\r\n\r\n this.splitting = false;\r\n const start = this.splitStartLayout;\r\n this.splitStartLayout = null;\r\n if (!start || sameLayout(start, this.layoutState())) {\r\n return;\r\n }\r\n\r\n this.remember(start);\r\n this.publish('Column width adjusted.');\r\n }\r\n\r\n protected onSplitterKeydown(event: KeyboardEvent): void {\r\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const delta = event.key === 'ArrowRight' ? 0.04 : -0.04;\r\n this.commit(\r\n setColumnRatio(this.layoutState(), this.layoutState().startColumnRatio + delta),\r\n 'Column width adjusted.',\r\n );\r\n }\r\n\r\n private commit(next: PosWorkspaceLayout, message: string): void {\r\n if (sameLayout(this.layoutState(), next)) {\r\n return;\r\n }\r\n\r\n this.remember(this.layoutState());\r\n this.layoutState.set(next);\r\n this.publish(message);\r\n }\r\n\r\n private remember(layout: PosWorkspaceLayout): void {\r\n this.history.push(layout);\r\n if (this.history.length > 30) {\r\n this.history.shift();\r\n }\r\n this.canUndo.set(true);\r\n }\r\n\r\n private downloadLayout(json: string): void {\r\n if (typeof URL.createObjectURL !== 'function') {\r\n return;\r\n }\r\n\r\n const blob = new Blob([json], { type: 'application/json' });\r\n const url = URL.createObjectURL(blob);\r\n const link = this.hostRef.nativeElement.ownerDocument.createElement('a');\r\n link.href = url;\r\n link.download = 'pos-workspace-layout.json';\r\n link.click();\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n private publish(message: string): void {\r\n this.status.set(message);\r\n this.layoutChange.emit(this.layoutState());\r\n }\r\n\r\n private placeMessage(\r\n id: PosWorkspacePaneId,\r\n target: PosWorkspaceDropTarget,\r\n added: boolean,\r\n ): string {\r\n const label = workspacePaneLabel(id);\r\n if (target.fullWidth) {\r\n return added\r\n ? `${label} added at full width.`\r\n : `${label} spans the full width.`;\r\n }\r\n\r\n if (added) {\r\n return target.column === 1 ? `${label} added on the right.` : `${label} added.`;\r\n }\r\n\r\n return this.messageForMove(id, target.column);\r\n }\r\n\r\n private messageForMove(id: PosWorkspacePaneId, column: PosWorkspaceColumn): string {\r\n const label = workspacePaneLabel(id);\r\n const current = this.layoutState().panes.find((pane) => pane.id === id);\r\n const occupants = this.layoutState().panes.filter(\r\n (pane) => pane.column === column && pane.id !== id,\r\n );\r\n\r\n if (column === 1 && occupants.length === 0) {\r\n return `${label} docked on the right, full height.`;\r\n }\r\n\r\n if (column === 0 && current?.column === 1) {\r\n return `${label} returned to the left stack.`;\r\n }\r\n\r\n return `${label} moved.`;\r\n }\r\n\r\n private refreshDropHints(gridRect: DOMRect): void {\r\n if (this.compact()) {\r\n this.dropHints.set([]);\r\n return;\r\n }\r\n\r\n const host = this.hostRef.nativeElement.getBoundingClientRect();\r\n const top = gridRect.top - host.top;\r\n const left = gridRect.left - host.left;\r\n const ratio = this.grid().split ? this.layoutState().startColumnRatio : DOCK_THRESHOLD;\r\n const hints: PosWorkspaceDropHint[] = [\r\n {\r\n kind: 'dock',\r\n top,\r\n left: left + gridRect.width * ratio,\r\n width: gridRect.width * (1 - ratio),\r\n height: gridRect.height,\r\n },\r\n ];\r\n\r\n const splitTop = this.splitBodyTop();\r\n if (splitTop != null) {\r\n const roomAbove = Math.max(0, splitTop - gridRect.top);\r\n hints.unshift({\r\n kind: 'top',\r\n top,\r\n left,\r\n width: gridRect.width,\r\n height: roomAbove > 8 ? roomAbove : FULL_WIDTH_BAND,\r\n });\r\n }\r\n\r\n this.dropHints.set(hints);\r\n }\r\n\r\n /** True when the pointer is above the docked column (or in the top band when nothing sits above it). */\r\n private inFullWidthDropZone(clientY: number, gridRect: DOMRect, splitTop: number): boolean {\r\n if (splitTop > gridRect.top + 8) {\r\n return clientY < splitTop;\r\n }\r\n\r\n return clientY < gridRect.top + FULL_WIDTH_BAND;\r\n }\r\n\r\n /** Top edge of the side-by-side region (right column). Null when nothing is docked right. */\r\n private splitBodyTop(): number | null {\r\n if (this.compact() || !this.grid().split) {\r\n return null;\r\n }\r\n\r\n let top = Number.POSITIVE_INFINITY;\r\n for (const pane of this.grid().panes) {\r\n if (pane.column !== 2) {\r\n continue;\r\n }\r\n\r\n const rect = this.paneElement(pane.id)?.getBoundingClientRect();\r\n if (rect) {\r\n top = Math.min(top, rect.top);\r\n }\r\n }\r\n\r\n return Number.isFinite(top) ? top : null;\r\n }\r\n\r\n /** Full-width rows that sit above the split, used for drop ordering in that band. */\r\n private idsAboveSplit(): PosWorkspacePaneId[] {\r\n const splitTop = this.splitBodyTop();\r\n if (splitTop == null) {\r\n return [];\r\n }\r\n\r\n return this.grid()\r\n .panes.filter((pane) => {\r\n if (pane.spanColumns !== true) {\r\n return false;\r\n }\r\n\r\n const rect = this.paneElement(pane.id)?.getBoundingClientRect();\r\n return rect != null && rect.top + rect.height / 2 < splitTop;\r\n })\r\n .sort((a, b) => a.rowStart - b.rowStart)\r\n .map((pane) => pane.id);\r\n }\r\n\r\n /** Maps a visual index among banner/full-width rows onto the body column order. */\r\n private bodyIndexForFullWidthDrop(visualIndex: number): number {\r\n const banners = new Set(\r\n this.layoutState()\r\n .panes.filter((pane) => paneSpan(pane) !== null)\r\n .map((pane) => pane.id),\r\n );\r\n const bannersAbove = this.idsAboveSplit().filter((id) => banners.has(id)).length;\r\n return Math.max(0, visualIndex - bannersAbove);\r\n }\r\n\r\n private fullWidthIndicator(\r\n index: number,\r\n ids: readonly PosWorkspacePaneId[],\r\n gridRect: DOMRect,\r\n ): PosWorkspaceDropIndicator {\r\n const host = this.hostRef.nativeElement.getBoundingClientRect();\r\n const left = gridRect.left - host.left;\r\n const width = gridRect.width;\r\n\r\n if (ids.length === 0) {\r\n const splitTop = this.splitBodyTop() ?? gridRect.top;\r\n return {\r\n top: Math.max(gridRect.top, splitTop - FULL_WIDTH_BAND / 2) - host.top,\r\n left,\r\n width,\r\n height: FULL_WIDTH_BAND,\r\n line: false,\r\n };\r\n }\r\n\r\n const anchorId = index >= ids.length ? ids[ids.length - 1] : ids[index];\r\n const anchor = this.paneElement(anchorId)?.getBoundingClientRect();\r\n if (!anchor) {\r\n return {\r\n top: gridRect.top - host.top,\r\n left,\r\n width,\r\n height: FULL_WIDTH_BAND,\r\n line: false,\r\n };\r\n }\r\n\r\n const top = index >= ids.length ? anchor.bottom - host.top : anchor.top - host.top;\r\n return { top, left, width, height: 4, line: true };\r\n }\r\n\r\n private nextVisualId(id: PosWorkspacePaneId): PosWorkspacePaneId | null {\r\n const place = this.placements().get(id);\r\n if (!place?.showResize) {\r\n return null;\r\n }\r\n\r\n const next = this.grid()\r\n .panes.filter((pane) => pane.column === place.column && pane.rowStart >= place.rowEnd)\r\n .sort((a, b) => a.rowStart - b.rowStart)[0];\r\n return next?.id ?? null;\r\n }\r\n\r\n private idsInVisualColumn(column: PosWorkspaceColumn): PosWorkspacePaneId[] {\r\n const dragging = this.draggingPane();\r\n const edges = new Set(\r\n this.layoutState()\r\n .panes.filter((pane) => paneSpan(pane) !== null)\r\n .map((pane) => pane.id),\r\n );\r\n const gridColumn = this.compact() ? 1 : column + 1;\r\n return this.grid()\r\n .panes.filter((pane) => {\r\n if (pane.id === dragging || edges.has(pane.id)) {\r\n return false;\r\n }\r\n\r\n if (this.compact() || column === 0) {\r\n return pane.spanColumns === true || pane.column === gridColumn;\r\n }\r\n\r\n return pane.column === gridColumn && pane.spanColumns !== true;\r\n })\r\n .sort((a, b) => a.rowStart - b.rowStart)\r\n .map((pane) => pane.id);\r\n }\r\n\r\n private indicatorBox(\r\n column: PosWorkspaceColumn,\r\n index: number,\r\n ids: readonly PosWorkspacePaneId[],\r\n gridRect: DOMRect,\r\n ): PosWorkspaceDropIndicator | null {\r\n const host = this.hostRef.nativeElement.getBoundingClientRect();\r\n if (ids.length === 0) {\r\n const threshold = this.grid().split ? this.layoutState().startColumnRatio : DOCK_THRESHOLD;\r\n const bandLeft = column === 1 ? gridRect.width * threshold : 0;\r\n const bandWidth = column === 1 ? gridRect.width * (1 - threshold) : gridRect.width * 0.3;\r\n return {\r\n top: gridRect.top - host.top,\r\n left: gridRect.left - host.left + bandLeft,\r\n width: bandWidth,\r\n height: gridRect.height,\r\n line: false,\r\n };\r\n }\r\n\r\n const anchorId = index >= ids.length ? ids[ids.length - 1] : ids[index];\r\n const anchor = this.paneElement(anchorId)?.getBoundingClientRect();\r\n if (!anchor) {\r\n return null;\r\n }\r\n\r\n const top = index >= ids.length ? anchor.bottom - host.top : anchor.top - host.top;\r\n return {\r\n top,\r\n left: anchor.left - host.left,\r\n width: anchor.width,\r\n height: 4,\r\n line: true,\r\n };\r\n }\r\n\r\n private paneElement(id: PosWorkspacePaneId): HTMLElement | null {\r\n return this.hostRef.nativeElement.querySelector(`[data-pane=\"${id}\"]`);\r\n }\r\n\r\n private gridElement(): HTMLElement | null {\r\n return this.frameRef()?.nativeElement ?? null;\r\n }\r\n\r\n private clearDrag(): void {\r\n this.draggingPane.set(null);\r\n this.dropTarget.set(null);\r\n this.dropIndicator.set(null);\r\n this.dropHints.set([]);\r\n }\r\n\r\n private clearInteraction(): void {\r\n this.paletteGesture = null;\r\n this.paletteOpen.set(false);\r\n this.paletteMenuLifted.set(false);\r\n this.settingsPane.set(null);\r\n this.clearDrag();\r\n this.resizeSession = null;\r\n this.splitting = false;\r\n this.splitStartLayout = null;\r\n }\r\n\r\n private isPrimaryPointer(event: PointerEvent): boolean {\r\n return event.pointerType !== 'mouse' || event.button === 0;\r\n }\r\n\r\n private capture(event: PointerEvent): void {\r\n const handle = event.currentTarget;\r\n if (!(handle instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n try {\r\n handle.setPointerCapture(event.pointerId);\r\n } catch {\r\n // The pointer is not active yet. The drag still follows later pointer events.\r\n }\r\n }\r\n}\r\n","@if (editing()) {\r\n <div class=\"pos-workspace__tools\">\r\n <div class=\"pos-workspace__palette\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-toggle\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-expanded]=\"paletteOpen()\"\r\n (click)=\"togglePalette()\"\r\n >\r\n Components\r\n </button>\r\n @if (paletteOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-backdrop\"\r\n tabindex=\"-1\"\r\n aria-label=\"Close components\"\r\n (click)=\"closePalette()\"\r\n ></button>\r\n <div\r\n class=\"pos-workspace__palette-menu\"\r\n [class.pos-workspace__palette-menu--lifted]=\"paletteMenuLifted()\"\r\n role=\"menu\"\r\n aria-label=\"Components\"\r\n (keydown)=\"onPaletteMenuKeydown($event)\"\r\n >\r\n @for (id of palette(); track id) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n [attr.data-palette]=\"id\"\r\n (pointerdown)=\"onPalettePointerDown(id, $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick(id)\"\r\n >\r\n {{ paneLabel(id) }}\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n data-palette=\"empty\"\r\n (pointerdown)=\"onPalettePointerDown('empty', $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick('empty')\"\r\n >\r\n Custom container\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"pos-workspace__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__undo\"\r\n [disabled]=\"!canUndo()\"\r\n (click)=\"undoLayout()\"\r\n >\r\n Undo\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__new\" (click)=\"resetLayout()\">New</button>\r\n <button type=\"button\" class=\"pos-workspace__default\" (click)=\"applyDefaultLayout()\">\r\n Default layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__import\" (click)=\"layoutFile.click()\">\r\n Import layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__export\" (click)=\"exportLayout()\">\r\n Export layout\r\n </button>\r\n <input\r\n #layoutFile\r\n class=\"pos-workspace__file\"\r\n type=\"file\"\r\n accept=\"application/json,.json\"\r\n aria-label=\"Import layout file\"\r\n (change)=\"importLayoutFile($event)\"\r\n />\r\n </div>\r\n </div>\r\n}\r\n\r\n<div\r\n #frame\r\n class=\"pos-workspace__grid\"\r\n [style.grid-template-columns]=\"grid().columns\"\r\n [style.grid-template-rows]=\"grid().rows\"\r\n>\r\n <ng-content />\r\n @for (slot of emptySlots(); track slot) {\r\n <pos-workspace-pane [paneId]=\"slot\" [placeholder]=\"true\" />\r\n }\r\n @if (showSplitter()) {\r\n <div\r\n class=\"pos-workspace__splitter\"\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n aria-label=\"Resize columns\"\r\n aria-valuemin=\"28\"\r\n aria-valuemax=\"72\"\r\n [attr.aria-valuenow]=\"ratioPercent()\"\r\n tabindex=\"0\"\r\n [style.grid-row]=\"splitterRow()\"\r\n [style.left]=\"splitterLeft()\"\r\n (pointerdown)=\"onSplitterDown($event)\"\r\n (pointermove)=\"onSplitterMove($event)\"\r\n (pointerup)=\"onSplitterUp()\"\r\n (pointercancel)=\"onSplitterUp()\"\r\n (keydown)=\"onSplitterKeydown($event)\"\r\n ></div>\r\n }\r\n</div>\r\n\r\n@for (hint of dropHints(); track hint.kind) {\r\n <div\r\n class=\"pos-workspace__hint\"\r\n [class.pos-workspace__hint--top]=\"hint.kind === 'top'\"\r\n [class.pos-workspace__hint--bottom]=\"hint.kind === 'bottom'\"\r\n [class.pos-workspace__hint--dock]=\"hint.kind === 'dock'\"\r\n [style.top.px]=\"hint.top\"\r\n [style.left.px]=\"hint.left\"\r\n [style.width.px]=\"hint.width\"\r\n [style.height.px]=\"hint.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n@if (dropIndicator(); as indicator) {\r\n <div\r\n class=\"pos-workspace__drop\"\r\n [class.pos-workspace__drop--line]=\"indicator.line\"\r\n [style.top.px]=\"indicator.top\"\r\n [style.left.px]=\"indicator.left\"\r\n [style.width.px]=\"indicator.width\"\r\n [style.height.px]=\"indicator.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n<div class=\"pos-workspace__status\" aria-live=\"polite\">{{ status() }}</div>\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","/*\n * Public API Surface of @retalia/pos-components\n */\n\nexport { PosLogin } from './lib/login/pos-login';\nexport type {\n PosLoginIntent,\n PosLoginSessionState,\n PosLoginSessionStatus,\n} from './lib/login/pos-login';\n\nexport { PosBasket } from './lib/basket/pos-basket';\nexport type {\n PosBasketIntent,\n PosBasketLine,\n PosBasketTotals,\n PosBasketVat,\n} from './lib/basket/pos-basket';\n\nexport { PosHeader } from './lib/header/pos-header';\nexport type { PosHeaderIntent } from './lib/header/pos-header';\n\nexport { PosTransactionActionBar } from './lib/transaction-action-bar/pos-transaction-action-bar';\nexport type { PosTransactionActionBarIntent } from './lib/transaction-action-bar/pos-transaction-action-bar';\n\nexport { PosItemEntry } from './lib/item-entry/pos-item-entry';\nexport type { PosItemEntryIntent } from './lib/item-entry/pos-item-entry';\n\nexport { PosWorkspace } from './lib/workspace/pos-workspace';\nexport { PosWorkspacePane } from './lib/workspace/pos-workspace-pane';\nexport {\n POS_WORKSPACE_BASKET_RIGHT_LAYOUT,\n POS_WORKSPACE_DEFAULT_LAYOUT,\n POS_WORKSPACE_EMPTY_LAYOUT,\n POS_WORKSPACE_HEADER_SPAN_LAYOUT,\n parseWorkspaceLayout,\n workspaceLayoutJson,\n} from './lib/workspace/pos-workspace-layout';\nexport type {\n PosWorkspaceColumn,\n PosWorkspaceLayout,\n PosWorkspacePaneId,\n PosWorkspacePanePlacement,\n PosWorkspaceSpan,\n} from './lib/workspace/pos-workspace-layout';\n\nexport { PosTender } from './lib/tender/pos-tender';\nexport type { PosTenderIntent } from './lib/tender/pos-tender';\n\nexport { PosReceipt } from './lib/receipt/pos-receipt';\nexport type {\n PosReceiptIntent,\n PosReceiptLine,\n PosReceiptTotals,\n PosReceiptVat,\n PosReceiptPayment,\n PosReceiptDocument,\n} from './lib/receipt/pos-receipt';\n\nexport { PosTokens } from './lib/tokens/pos-tokens';\nexport type { PosTokenSwatch } from './lib/tokens/pos-tokens';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["EMPTY_TOTALS"],"mappings":"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"}
|