@retalia/pos-components 0.0.2 → 0.0.3

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/hello-world/pos-hello-world.ts","../../../projects/pos-components/src/public-api.ts","../../../projects/pos-components/src/retalia-pos-components.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, output, signal } from '@angular/core';\n\nexport interface HelloWorldIntent {\n readonly type: 'helloWorld.acknowledge';\n}\n\n@Component({\n selector: 'pos-hello-world',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <article class=\"card\">\n <p class=\"kicker\">@retalia/pos-components</p>\n <h1>{{ label() }}</h1>\n <p class=\"lede\">\n If this card rendered, the host installed the package and can consume\n presentational POS components.\n </p>\n\n @if (confirmed()) {\n <p class=\"status\" role=\"status\" aria-live=\"polite\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9.1\" stroke=\"currentColor\" stroke-width=\"1.8\" />\n <path\n d=\"M7.5 12.4 10.6 15.4 16.5 8.8\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n Acknowledged\n </p>\n } @else {\n <button type=\"button\" (click)=\"onAcknowledge()\">Acknowledge</button>\n }\n </article>\n `,\n styles: `\n :host {\n display: block;\n color: #1a1a1a;\n font-family: 'Chakra Petch', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n font-size: 15px;\n line-height: 1.5;\n }\n\n .card {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n padding: 24px;\n background: #fff;\n border: 1px solid #ececf0;\n border-radius: 12px;\n box-shadow: 0 1px 3px rgb(0 0 0 / 0.05);\n }\n\n .kicker {\n margin: 0;\n color: #7b2ff2;\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n h1 {\n margin: 0;\n font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n font-size: 22px;\n font-weight: 700;\n letter-spacing: -0.02em;\n line-height: 1.25;\n }\n\n .lede {\n margin: 0 0 8px;\n color: #666a70;\n }\n\n button,\n .status {\n min-height: 52px;\n min-width: 160px;\n margin: 0;\n padding: 0 18px;\n border-radius: 8px;\n font: inherit;\n font-weight: 600;\n }\n\n button {\n border: 0;\n background: #16dbcc;\n color: #1a1a1a;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n\n button:focus-visible {\n outline: 3px solid #7b2ff2;\n outline-offset: 2px;\n }\n\n .status {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n background: #e4fbf5;\n color: #0ca678;\n }\n\n .status svg {\n flex-shrink: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n button {\n transition: none;\n }\n }\n `,\n})\nexport class PosHelloWorld {\n readonly label = input('Hello World library integration successful.');\n readonly acknowledge = output<HelloWorldIntent>();\n\n protected readonly confirmed = signal(false);\n\n protected onAcknowledge(): void {\n this.confirmed.set(true);\n this.acknowledge.emit({ type: 'helloWorld.acknowledge' });\n }\n}\n","/*\n * Public API Surface of @retalia/pos-components\n */\n\nexport { PosHelloWorld } from './lib/hello-world/pos-hello-world';\nexport type { HelloWorldIntent } from './lib/hello-world/pos-hello-world';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAmIa,aAAa,CAAA;AACf,IAAA,KAAK,GAAG,KAAK,CAAC,6CAA6C,4EAAC;IAC5D,WAAW,GAAG,MAAM,EAAoB;AAE9B,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,gFAAC;IAElC,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;IAC3D;wGATW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1Hd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,giCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAwFU,aAAa,EAAA,UAAA,EAAA,CAAA;kBA7HzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,eAAA,EACV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,giCAAA,CAAA,EAAA;;;AC3CH;;AAEG;;ACFH;;AAEG;;"}
1
+ {"version":3,"file":"retalia-pos-components.mjs","sources":["../../../projects/pos-components/src/lib/login/pos-login.ts","../../../projects/pos-components/src/lib/login/pos-login.html","../../../projects/pos-components/src/lib/basket/pos-basket.ts","../../../projects/pos-components/src/lib/basket/pos-basket.html","../../../projects/pos-components/src/lib/item-entry/pos-item-entry.ts","../../../projects/pos-components/src/lib/item-entry/pos-item-entry.html","../../../projects/pos-components/src/lib/tender/pos-tender.ts","../../../projects/pos-components/src/lib/tender/pos-tender.html","../../../projects/pos-components/src/lib/receipt/pos-receipt.ts","../../../projects/pos-components/src/lib/receipt/pos-receipt.html","../../../projects/pos-components/src/lib/tokens/pos-token-catalog.ts","../../../projects/pos-components/src/lib/tokens/pos-theme-css.ts","../../../projects/pos-components/src/lib/tokens/pos-tokens.ts","../../../projects/pos-components/src/lib/tokens/pos-tokens.html","../../../projects/pos-components/src/public-api.ts","../../../projects/pos-components/src/retalia-pos-components.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\n\r\nexport type PosLoginIntent =\r\n | { readonly type: 'login.key'; readonly key: string }\r\n | { readonly type: 'login.backspace' }\r\n | { readonly type: 'login.next'; readonly clerkNumber: string }\r\n | { readonly type: 'login.submit'; readonly clerkNumber: string; readonly password: string }\r\n | { readonly type: 'login.back' };\r\n\r\n/** Display-only login/session state from the host envelope — not an API DTO. */\r\nexport type PosLoginSessionStatus = 'signedOut' | 'busy' | 'signedIn';\r\n\r\nexport interface PosLoginSessionState {\r\n readonly status: PosLoginSessionStatus;\r\n readonly displayName?: string;\r\n}\r\n\r\nconst DEFAULT_SESSION: PosLoginSessionState = { status: 'signedOut' };\r\n\r\ntype LoginStage = 'clerkNumber' | 'password';\r\n\r\nconst KEYPAD_ROWS: readonly (readonly string[])[] = [\r\n ['1', '2', '3'],\r\n ['4', '5', '6'],\r\n ['7', '8', '9'],\r\n ['0', '.', '←'],\r\n];\r\n\r\n@Component({\r\n selector: 'pos-login',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-login.html',\r\n styleUrl: './pos-login.scss',\r\n host: {\r\n class: 'pos-login',\r\n },\r\n})\r\nexport class PosLogin {\r\n readonly errorMessage = input('');\r\n readonly session = input<PosLoginSessionState>(DEFAULT_SESSION);\r\n\r\n readonly titleClerkNumber = input('Enter Clerk Number');\r\n readonly titleClerkPassword = input('Enter Clerk Password');\r\n readonly nextLabel = input('Next');\r\n readonly loginLabel = input('Login');\r\n\r\n readonly action = output<PosLoginIntent>();\r\n\r\n protected readonly keypadRows = KEYPAD_ROWS;\r\n protected readonly inputValue = signal('');\r\n protected readonly stage = signal<LoginStage>('clerkNumber');\r\n private readonly clerkNumber = signal('');\r\n\r\n protected readonly title = computed(() =>\r\n this.stage() === 'clerkNumber'\r\n ? this.titleClerkNumber()\r\n : this.titleClerkPassword(),\r\n );\r\n\r\n protected readonly maskInput = computed(() => this.stage() === 'password');\r\n\r\n protected readonly showBack = computed(() => this.stage() === 'password');\r\n\r\n protected readonly primaryLabel = computed(() =>\r\n this.stage() === 'password' ? this.loginLabel() : this.nextLabel(),\r\n );\r\n\r\n protected readonly primaryEnabled = computed(\r\n () => this.inputValue().length > 0 && !this.interactionLocked(),\r\n );\r\n\r\n protected readonly interactionLocked = computed(() => {\r\n const status = this.session().status;\r\n return status === 'busy' || status === 'signedIn';\r\n });\r\n\r\n protected readonly sessionStatusText = computed(() => {\r\n const current = this.session();\r\n if (current.status === 'busy') {\r\n return 'Signing in…';\r\n }\r\n if (current.status === 'signedIn') {\r\n return current.displayName\r\n ? `Signed in as ${current.displayName}`\r\n : 'Signed in';\r\n }\r\n return '';\r\n });\r\n\r\n protected onKeypad(key: string): void {\r\n if (this.interactionLocked()) {\r\n return;\r\n }\r\n\r\n if (key === '←') {\r\n this.inputValue.update((value) => value.slice(0, -1));\r\n this.action.emit({ type: 'login.backspace' });\r\n return;\r\n }\r\n\r\n if (this.inputValue().length >= 12) {\r\n return;\r\n }\r\n\r\n this.inputValue.update((value) => value + key);\r\n this.action.emit({ type: 'login.key', key });\r\n }\r\n\r\n protected onPrimary(): void {\r\n if (this.interactionLocked()) {\r\n return;\r\n }\r\n\r\n const value = this.inputValue();\r\n if (!value) {\r\n return;\r\n }\r\n\r\n if (this.stage() === 'clerkNumber') {\r\n this.clerkNumber.set(value);\r\n this.inputValue.set('');\r\n this.stage.set('password');\r\n this.action.emit({ type: 'login.next', clerkNumber: value });\r\n return;\r\n }\r\n\r\n this.action.emit({\r\n type: 'login.submit',\r\n clerkNumber: this.clerkNumber(),\r\n password: value,\r\n });\r\n }\r\n\r\n protected onBack(): void {\r\n if (this.interactionLocked()) {\r\n return;\r\n }\r\n\r\n this.inputValue.set(this.clerkNumber());\r\n this.stage.set('clerkNumber');\r\n this.action.emit({ type: 'login.back' });\r\n }\r\n}\r\n","<section class=\"pos-login__panel\" [attr.aria-busy]=\"session().status === 'busy' ? true : null\">\r\n <header class=\"pos-login__header\">\r\n <p class=\"pos-login__kicker\">Adaptive POS</p>\r\n <h1 class=\"pos-login__title\">{{ title() }}</h1>\r\n </header>\r\n\r\n <div class=\"pos-login__status\" aria-live=\"polite\">\r\n @if (sessionStatusText()) {\r\n <p>{{ sessionStatusText() }}</p>\r\n }\r\n @if (errorMessage()) {\r\n <p class=\"pos-login__error\">{{ errorMessage() }}</p>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-login__body\">\r\n <div class=\"pos-login__display\">\r\n <input\r\n class=\"pos-login__input\"\r\n [attr.type]=\"maskInput() ? 'password' : 'text'\"\r\n [value]=\"inputValue()\"\r\n maxlength=\"12\"\r\n readonly\r\n tabindex=\"-1\"\r\n placeholder=\"· · · ·\"\r\n (keydown)=\"$event.preventDefault()\"\r\n aria-label=\"Login code\"\r\n />\r\n </div>\r\n\r\n <div class=\"pos-login__keypad\" role=\"group\" aria-label=\"Keypad\">\r\n @for (row of keypadRows; track $index) {\r\n <div class=\"pos-login__keypad-row\">\r\n @for (key of row; track key) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-login__key\"\r\n [class.pos-login__key--action]=\"key === '←' || key === '.'\"\r\n [disabled]=\"interactionLocked()\"\r\n (click)=\"onKeypad(key)\"\r\n >\r\n {{ key }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-login__actions\">\r\n @if (showBack()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-login__back\"\r\n aria-label=\"Back\"\r\n [disabled]=\"interactionLocked()\"\r\n (click)=\"onBack()\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <path\r\n d=\"M15 6 9 12l6 6\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>Back</span>\r\n </button>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-login__primary\"\r\n [class.pos-login__primary--disabled]=\"!primaryEnabled()\"\r\n [disabled]=\"!primaryEnabled()\"\r\n (click)=\"onPrimary()\"\r\n >\r\n {{ primaryLabel() }}\r\n </button>\r\n </div>\r\n </div>\r\n</section>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n output,\r\n} from '@angular/core';\r\n\r\nexport type PosBasketIntent =\r\n | {\r\n readonly type: 'basket.changeQuantity';\r\n readonly lineId: number;\r\n readonly qty: number;\r\n }\r\n | { readonly type: 'basket.voidLine'; readonly lineId: number }\r\n | { readonly type: 'basket.clear' };\r\n\r\n/** Display-only VAT from the host envelope — not calculated here. */\r\nexport interface PosBasketVat {\r\n readonly rate: number;\r\n readonly amount: number;\r\n readonly included: boolean;\r\n}\r\n\r\n/** Display-only basket line from the host envelope — not an API DTO. */\r\nexport interface PosBasketLine {\r\n readonly lineId: number;\r\n readonly sku: string;\r\n readonly name: string;\r\n readonly qty: number;\r\n readonly unitPrice: number;\r\n readonly lineTotal: number;\r\n readonly vat: PosBasketVat;\r\n readonly struckThrough: boolean;\r\n}\r\n\r\n/** Display-only totals from the host envelope — not calculated here. */\r\nexport interface PosBasketTotals {\r\n readonly gross: number;\r\n readonly net: number;\r\n readonly vat: number;\r\n readonly discount: number;\r\n readonly due: number;\r\n readonly currency: string;\r\n}\r\n\r\nconst EMPTY_TOTALS: PosBasketTotals = {\r\n gross: 0,\r\n net: 0,\r\n vat: 0,\r\n discount: 0,\r\n due: 0,\r\n currency: 'EUR',\r\n};\r\n\r\n@Component({\r\n selector: 'pos-basket',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-basket.html',\r\n styleUrl: './pos-basket.scss',\r\n host: {\r\n class: 'pos-basket',\r\n },\r\n})\r\nexport class PosBasket {\r\n readonly lines = input<readonly PosBasketLine[]>([]);\r\n readonly totals = input<PosBasketTotals>(EMPTY_TOTALS);\r\n readonly disabled = input(false);\r\n\r\n readonly title = input('Basket');\r\n readonly emptyMessage = input('Basket is empty');\r\n readonly clearLabel = input('Clear basket');\r\n\r\n readonly action = output<PosBasketIntent>();\r\n\r\n protected readonly hasLines = computed(() => this.lines().length > 0);\r\n\r\n protected readonly canClear = computed(\r\n () => this.hasLines() && !this.disabled(),\r\n );\r\n\r\n protected formatMoney(amount: number): string {\r\n return new Intl.NumberFormat(undefined, {\r\n style: 'currency',\r\n currency: this.totals().currency || 'EUR',\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n }).format(amount);\r\n }\r\n\r\n protected canChangeQuantity(line: PosBasketLine): boolean {\r\n return !this.disabled() && !line.struckThrough;\r\n }\r\n\r\n protected canDecrement(line: PosBasketLine): boolean {\r\n return this.canChangeQuantity(line) && line.qty > 1;\r\n }\r\n\r\n protected canVoid(line: PosBasketLine): boolean {\r\n return this.canChangeQuantity(line);\r\n }\r\n\r\n protected onIncrement(line: PosBasketLine): void {\r\n if (!this.canChangeQuantity(line)) {\r\n return;\r\n }\r\n\r\n this.action.emit({\r\n type: 'basket.changeQuantity',\r\n lineId: line.lineId,\r\n qty: line.qty + 1,\r\n });\r\n }\r\n\r\n protected onDecrement(line: PosBasketLine): void {\r\n if (!this.canDecrement(line)) {\r\n return;\r\n }\r\n\r\n this.action.emit({\r\n type: 'basket.changeQuantity',\r\n lineId: line.lineId,\r\n qty: line.qty - 1,\r\n });\r\n }\r\n\r\n protected onVoid(line: PosBasketLine): void {\r\n if (!this.canVoid(line)) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'basket.voidLine', lineId: line.lineId });\r\n }\r\n\r\n protected onClear(): void {\r\n if (!this.canClear()) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'basket.clear' });\r\n }\r\n}\r\n","<section\r\n class=\"pos-basket__panel\"\r\n [attr.aria-busy]=\"disabled() ? true : null\"\r\n>\r\n <header class=\"pos-basket__header\">\r\n <h2 class=\"pos-basket__title\">{{ title() }}</h2>\r\n <p class=\"pos-basket__count\">\r\n {{ lines().length }}\r\n {{ lines().length === 1 ? 'line' : 'lines' }}\r\n </p>\r\n </header>\r\n\r\n <ul class=\"pos-basket__lines\" aria-label=\"Basket lines\">\r\n @if (!hasLines()) {\r\n <li class=\"pos-basket__empty\">{{ emptyMessage() }}</li>\r\n } @else {\r\n @for (line of lines(); track line.lineId) {\r\n <li>\r\n <article\r\n class=\"pos-basket__line\"\r\n [class.pos-basket__line--voided]=\"line.struckThrough\"\r\n >\r\n <div class=\"pos-basket__line-info\">\r\n <h3 class=\"pos-basket__line-name\">{{ line.name }}</h3>\r\n <p class=\"pos-basket__line-sku\">{{ line.sku }}</p>\r\n @if (line.struckThrough) {\r\n <p class=\"pos-basket__line-voided\">Voided</p>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"pos-basket__stepper\"\r\n role=\"group\"\r\n [attr.aria-label]=\"'Quantity for ' + line.name\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"pos-basket__qty-btn\"\r\n aria-label=\"Decrease quantity\"\r\n [disabled]=\"!canDecrement(line)\"\r\n (click)=\"onDecrement(line)\"\r\n >\r\n −\r\n </button>\r\n <span class=\"pos-basket__qty\" aria-live=\"polite\">{{ line.qty }}</span>\r\n <button\r\n type=\"button\"\r\n class=\"pos-basket__qty-btn\"\r\n aria-label=\"Increase quantity\"\r\n [disabled]=\"!canChangeQuantity(line)\"\r\n (click)=\"onIncrement(line)\"\r\n >\r\n +\r\n </button>\r\n </div>\r\n\r\n <div class=\"pos-basket__line-prices\">\r\n <p class=\"pos-basket__unit-price\">{{ formatMoney(line.unitPrice) }}</p>\r\n <p class=\"pos-basket__line-total\">{{ formatMoney(line.lineTotal) }}</p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-basket__void\"\r\n [attr.aria-label]=\"'Void ' + line.name\"\r\n [disabled]=\"!canVoid(line)\"\r\n (click)=\"onVoid(line)\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M6 6l12 12M18 6 6 18\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </article>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n\r\n <footer class=\"pos-basket__footer\">\r\n <dl class=\"pos-basket__totals\" aria-live=\"polite\">\r\n <div class=\"pos-basket__total-row\">\r\n <dt>Gross</dt>\r\n <dd>{{ formatMoney(totals().gross) }}</dd>\r\n </div>\r\n <div class=\"pos-basket__total-row\">\r\n <dt>Net</dt>\r\n <dd>{{ formatMoney(totals().net) }}</dd>\r\n </div>\r\n <div class=\"pos-basket__total-row\">\r\n <dt>VAT</dt>\r\n <dd>{{ formatMoney(totals().vat) }}</dd>\r\n </div>\r\n <div class=\"pos-basket__total-row\">\r\n <dt>Discount</dt>\r\n <dd>{{ formatMoney(totals().discount) }}</dd>\r\n </div>\r\n <div class=\"pos-basket__total-row pos-basket__total-row--due\">\r\n <dt>Due</dt>\r\n <dd>{{ formatMoney(totals().due) }}</dd>\r\n </div>\r\n </dl>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pos-basket__clear\"\r\n [disabled]=\"!canClear()\"\r\n (click)=\"onClear()\"\r\n >\r\n {{ clearLabel() }}\r\n </button>\r\n </footer>\r\n</section>\r\n","import {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\n\r\nexport type PosItemEntryIntent =\r\n | { readonly type: 'itemEntry.submit'; readonly reference: string };\r\n\r\n@Component({\r\n selector: 'pos-item-entry',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-item-entry.html',\r\n styleUrl: './pos-item-entry.scss',\r\n host: {\r\n class: 'pos-item-entry',\r\n },\r\n})\r\nexport class PosItemEntry {\r\n readonly disabled = input(false);\r\n readonly errorMessage = input('');\r\n readonly autofocus = input(true);\r\n\r\n readonly label = input('Item');\r\n readonly placeholder = input('Scan or enter item');\r\n readonly addLabel = input('Add');\r\n\r\n readonly action = output<PosItemEntryIntent>();\r\n\r\n private readonly itemInput = viewChild<ElementRef<HTMLInputElement>>('itemInput');\r\n\r\n protected readonly reference = signal('');\r\n\r\n protected readonly canSubmit = computed(\r\n () => this.reference().trim().length > 0 && !this.disabled(),\r\n );\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (this.autofocus() && !this.disabled()) {\r\n this.focusInput();\r\n }\r\n });\r\n }\r\n\r\n protected onInput(event: Event): void {\r\n const target = event.target;\r\n if (!(target instanceof HTMLInputElement)) {\r\n return;\r\n }\r\n\r\n this.reference.set(target.value);\r\n }\r\n\r\n protected onSubmit(event: Event): void {\r\n event.preventDefault();\r\n\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n const reference = this.reference().trim();\r\n if (!reference) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'itemEntry.submit', reference });\r\n this.reference.set('');\r\n this.focusInput();\r\n }\r\n\r\n private focusInput(): void {\r\n this.itemInput()?.nativeElement.focus();\r\n }\r\n}\r\n","<section\r\n class=\"pos-item-entry__panel\"\r\n [attr.aria-busy]=\"disabled() ? true : null\"\r\n>\r\n <form class=\"pos-item-entry__form\" (submit)=\"onSubmit($event)\">\r\n <label class=\"pos-item-entry__field\">\r\n <span class=\"pos-item-entry__label\">{{ label() }}</span>\r\n <input\r\n #itemInput\r\n class=\"pos-item-entry__input\"\r\n type=\"text\"\r\n name=\"itemReference\"\r\n autocomplete=\"off\"\r\n spellcheck=\"false\"\r\n [attr.autocorrect]=\"'off'\"\r\n [attr.autocapitalize]=\"'none'\"\r\n enterkeyhint=\"done\"\r\n [placeholder]=\"placeholder()\"\r\n [value]=\"reference()\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\r\n (input)=\"onInput($event)\"\r\n />\r\n </label>\r\n\r\n <button\r\n type=\"submit\"\r\n class=\"pos-item-entry__add\"\r\n [class.pos-item-entry__add--disabled]=\"!canSubmit()\"\r\n [disabled]=\"!canSubmit()\"\r\n >\r\n {{ addLabel() }}\r\n </button>\r\n </form>\r\n\r\n <div class=\"pos-item-entry__status\" aria-live=\"polite\">\r\n @if (errorMessage()) {\r\n <p class=\"pos-item-entry__error\">{{ errorMessage() }}</p>\r\n }\r\n </div>\r\n</section>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\n\r\nexport type PosTenderIntent =\r\n | {\r\n readonly type: 'tender.cash';\r\n readonly amount: number;\r\n };\r\n\r\nconst KEYPAD_ROWS: readonly (readonly string[])[] = [\r\n ['1', '2', '3'],\r\n ['4', '5', '6'],\r\n ['7', '8', '9'],\r\n ['0', '.', '←'],\r\n];\r\n\r\nconst MAX_WHOLE_DIGITS = 8;\r\n\r\nfunction parseCashAmount(raw: string): number | null {\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n const amount = Number(raw);\r\n if (!Number.isFinite(amount) || amount <= 0) {\r\n return null;\r\n }\r\n\r\n return Math.round(amount * 100) / 100;\r\n}\r\n\r\nfunction appendCashKey(current: string, key: string): string {\r\n if (key === '←') {\r\n return current.slice(0, -1);\r\n }\r\n\r\n if (key === '.') {\r\n if (current.includes('.')) {\r\n return current;\r\n }\r\n return current === '' ? '0.' : `${current}.`;\r\n }\r\n\r\n if (!/^\\d$/.test(key)) {\r\n return current;\r\n }\r\n\r\n if (current === '0') {\r\n return key;\r\n }\r\n\r\n const [whole = '', fraction] = current.split('.');\r\n if (fraction !== undefined) {\r\n if (fraction.length >= 2) {\r\n return current;\r\n }\r\n return current + key;\r\n }\r\n\r\n const significant = whole.replace(/^0+/, '');\r\n if (significant.length >= MAX_WHOLE_DIGITS) {\r\n return current;\r\n }\r\n\r\n return current + key;\r\n}\r\n\r\n@Component({\r\n selector: 'pos-tender',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-tender.html',\r\n styleUrl: './pos-tender.scss',\r\n host: {\r\n class: 'pos-tender',\r\n },\r\n})\r\nexport class PosTender {\r\n /** Display-only amount due from the host envelope — not calculated here. */\r\n readonly amountDue = input(0);\r\n /** Display-only change due from the host envelope — not calculated here. */\r\n readonly changeDue = input<number | null>(null);\r\n readonly currency = input('EUR');\r\n readonly disabled = input(false);\r\n readonly errorMessage = input('');\r\n\r\n readonly title = input('Cash tender');\r\n readonly amountDueLabel = input('Amount due');\r\n readonly tenderedLabel = input('Amount tendered');\r\n readonly changeDueLabel = input('Change due');\r\n readonly tenderLabel = input('Tender cash');\r\n readonly processingLabel = input('Processing tender…');\r\n\r\n readonly action = output<PosTenderIntent>();\r\n\r\n protected readonly keypadRows = KEYPAD_ROWS;\r\n protected readonly amountInput = signal('');\r\n\r\n protected readonly parsedAmount = computed(() =>\r\n parseCashAmount(this.amountInput()),\r\n );\r\n\r\n protected readonly canTender = computed(\r\n () => this.parsedAmount() !== null && !this.disabled(),\r\n );\r\n\r\n protected readonly hasChangeDue = computed(() => this.changeDue() !== null);\r\n\r\n protected readonly displayTendered = computed(\r\n () => this.amountInput() || '0',\r\n );\r\n\r\n protected readonly statusText = computed(() => {\r\n if (this.disabled() && !this.hasChangeDue()) {\r\n return this.processingLabel();\r\n }\r\n return '';\r\n });\r\n\r\n protected formatMoney(amount: number): string {\r\n return new Intl.NumberFormat(undefined, {\r\n style: 'currency',\r\n currency: this.currency() || 'EUR',\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n }).format(amount);\r\n }\r\n\r\n protected onKeypad(key: string): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n this.amountInput.update((value) => appendCashKey(value, key));\r\n }\r\n\r\n protected onTender(): void {\r\n if (!this.canTender()) {\r\n return;\r\n }\r\n\r\n const amount = this.parsedAmount();\r\n if (amount === null) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'tender.cash', amount });\r\n }\r\n}\r\n","<section\r\n class=\"pos-tender__panel\"\r\n [attr.aria-busy]=\"disabled() ? true : null\"\r\n>\r\n <header class=\"pos-tender__header\">\r\n <p class=\"pos-tender__kicker\">Adaptive POS</p>\r\n <h2 class=\"pos-tender__title\">{{ title() }}</h2>\r\n </header>\r\n\r\n <div class=\"pos-tender__status\" aria-live=\"polite\">\r\n @if (statusText()) {\r\n <p>{{ statusText() }}</p>\r\n }\r\n @if (errorMessage()) {\r\n <p class=\"pos-tender__error\">{{ errorMessage() }}</p>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-tender__summary\">\r\n <dl class=\"pos-tender__due\">\r\n <div class=\"pos-tender__row\">\r\n <dt>{{ amountDueLabel() }}</dt>\r\n <dd>{{ formatMoney(amountDue()) }}</dd>\r\n </div>\r\n </dl>\r\n\r\n @if (hasChangeDue()) {\r\n <div class=\"pos-tender__change\" role=\"status\" aria-live=\"polite\">\r\n <p class=\"pos-tender__change-label\">{{ changeDueLabel() }}</p>\r\n <p class=\"pos-tender__change-value\">\r\n {{ formatMoney(changeDue() ?? 0) }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"pos-tender__display\"\r\n role=\"group\"\r\n [attr.aria-label]=\"tenderedLabel()\"\r\n >\r\n <p class=\"pos-tender__display-label\">{{ tenderedLabel() }}</p>\r\n <p class=\"pos-tender__display-value\" aria-live=\"polite\">\r\n <span class=\"pos-tender__currency\">{{ currency() }}</span>\r\n <span class=\"pos-tender__digits\">{{ displayTendered() }}</span>\r\n </p>\r\n </div>\r\n\r\n <div class=\"pos-tender__keypad\" role=\"group\" aria-label=\"Cash amount keypad\">\r\n @for (row of keypadRows; track $index) {\r\n <div class=\"pos-tender__keypad-row\">\r\n @for (key of row; track key) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-tender__key\"\r\n [class.pos-tender__key--action]=\"key === '←' || key === '.'\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"key === '←' ? 'Backspace' : key === '.' ? 'Decimal point' : key\"\r\n (click)=\"onKeypad(key)\"\r\n >\r\n {{ key }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-tender__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-tender__primary\"\r\n [class.pos-tender__primary--disabled]=\"!canTender()\"\r\n [disabled]=\"!canTender()\"\r\n (click)=\"onTender()\"\r\n >\r\n {{ tenderLabel() }}\r\n </button>\r\n </div>\r\n</section>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n output,\r\n} from '@angular/core';\r\n\r\nexport interface PosReceiptIntent {\r\n readonly type: 'receipt.newSale';\r\n}\r\n\r\n/** Display-only VAT from the host envelope — not calculated here. */\r\nexport interface PosReceiptVat {\r\n readonly rate: number;\r\n readonly amount: number;\r\n readonly included: boolean;\r\n}\r\n\r\n/** Display-only receipt line from the host envelope — not an API DTO. */\r\nexport interface PosReceiptLine {\r\n readonly lineId: number;\r\n readonly sku: string;\r\n readonly name: string;\r\n readonly qty: number;\r\n readonly unitPrice: number;\r\n readonly lineTotal: number;\r\n readonly vat: PosReceiptVat;\r\n readonly struckThrough: boolean;\r\n}\r\n\r\n/** Display-only totals from the host envelope — not calculated here. */\r\nexport interface PosReceiptTotals {\r\n readonly gross: number;\r\n readonly net: number;\r\n readonly vat: number;\r\n readonly discount: number;\r\n readonly due: number;\r\n readonly currency: string;\r\n}\r\n\r\n/** Display-only tender from the host envelope — not calculated here. */\r\nexport interface PosReceiptPayment {\r\n readonly tender: string;\r\n readonly amount: number;\r\n readonly tendered: number;\r\n readonly change: number;\r\n readonly state: string;\r\n}\r\n\r\n/** Display-only document metadata from the host envelope. */\r\nexport interface PosReceiptDocument {\r\n readonly number: string;\r\n readonly receiptReady: boolean;\r\n}\r\n\r\nconst EMPTY_TOTALS: PosReceiptTotals = {\r\n gross: 0,\r\n net: 0,\r\n vat: 0,\r\n discount: 0,\r\n due: 0,\r\n currency: 'EUR',\r\n};\r\n\r\nconst EMPTY_DOCUMENT: PosReceiptDocument = {\r\n number: '',\r\n receiptReady: false,\r\n};\r\n\r\n@Component({\r\n selector: 'pos-receipt',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-receipt.html',\r\n styleUrl: './pos-receipt.scss',\r\n host: {\r\n class: 'pos-receipt',\r\n },\r\n})\r\nexport class PosReceipt {\r\n readonly lines = input<readonly PosReceiptLine[]>([]);\r\n readonly totals = input<PosReceiptTotals>(EMPTY_TOTALS);\r\n readonly payments = input<readonly PosReceiptPayment[]>([]);\r\n readonly document = input<PosReceiptDocument>(EMPTY_DOCUMENT);\r\n readonly disabled = input(false);\r\n\r\n readonly title = input('Receipt');\r\n readonly emptyMessage = input('No receipt lines');\r\n readonly preparingLabel = input('Preparing receipt…');\r\n readonly readyLabel = input('Receipt ready');\r\n readonly newSaleLabel = input('New sale');\r\n readonly tenderLabel = input('Tender');\r\n readonly amountLabel = input('Amount');\r\n readonly tenderedLabel = input('Tendered');\r\n readonly changeLabel = input('Change');\r\n\r\n readonly action = output<PosReceiptIntent>();\r\n\r\n protected readonly hasLines = computed(() => this.lines().length > 0);\r\n protected readonly hasPayments = computed(() => this.payments().length > 0);\r\n protected readonly hasDocumentNumber = computed(\r\n () => this.document().number.trim().length > 0,\r\n );\r\n\r\n protected readonly statusText = computed(() =>\r\n this.document().receiptReady\r\n ? this.readyLabel()\r\n : this.preparingLabel(),\r\n );\r\n\r\n protected readonly canStartNewSale = computed(() => !this.disabled());\r\n\r\n protected formatMoney(amount: number): string {\r\n return new Intl.NumberFormat(undefined, {\r\n style: 'currency',\r\n currency: this.totals().currency || 'EUR',\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n }).format(amount);\r\n }\r\n\r\n protected onNewSale(): void {\r\n if (!this.canStartNewSale()) {\r\n return;\r\n }\r\n\r\n this.action.emit({ type: 'receipt.newSale' });\r\n }\r\n}\r\n","<section\r\n class=\"pos-receipt__panel\"\r\n [attr.aria-busy]=\"disabled() || !document().receiptReady ? true : null\"\r\n>\r\n <header class=\"pos-receipt__header\">\r\n <div class=\"pos-receipt__heading\">\r\n <p class=\"pos-receipt__kicker\">Adaptive POS</p>\r\n <h2 class=\"pos-receipt__title\">{{ title() }}</h2>\r\n </div>\r\n @if (hasDocumentNumber()) {\r\n <p class=\"pos-receipt__number\" aria-label=\"Document number\">\r\n {{ document().number }}\r\n </p>\r\n }\r\n </header>\r\n\r\n <p class=\"pos-receipt__status\" aria-live=\"polite\">{{ statusText() }}</p>\r\n\r\n <ul class=\"pos-receipt__lines\" aria-label=\"Receipt lines\">\r\n @if (!hasLines()) {\r\n <li class=\"pos-receipt__empty\">{{ emptyMessage() }}</li>\r\n } @else {\r\n @for (line of lines(); track line.lineId) {\r\n <li>\r\n <article\r\n class=\"pos-receipt__line\"\r\n [class.pos-receipt__line--voided]=\"line.struckThrough\"\r\n >\r\n <div class=\"pos-receipt__line-info\">\r\n <h3 class=\"pos-receipt__line-name\">{{ line.name }}</h3>\r\n <p class=\"pos-receipt__line-sku\">{{ line.sku }}</p>\r\n @if (line.struckThrough) {\r\n <p class=\"pos-receipt__line-voided\">Voided</p>\r\n }\r\n </div>\r\n <p class=\"pos-receipt__qty\">{{ line.qty }}</p>\r\n <div class=\"pos-receipt__line-prices\">\r\n <p class=\"pos-receipt__unit-price\">\r\n {{ formatMoney(line.unitPrice) }}\r\n </p>\r\n <p class=\"pos-receipt__line-total\">\r\n {{ formatMoney(line.lineTotal) }}\r\n </p>\r\n </div>\r\n </article>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n\r\n <div class=\"pos-receipt__summary\">\r\n <dl class=\"pos-receipt__totals\" aria-live=\"polite\">\r\n <div class=\"pos-receipt__row\">\r\n <dt>Gross</dt>\r\n <dd>{{ formatMoney(totals().gross) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row\">\r\n <dt>Net</dt>\r\n <dd>{{ formatMoney(totals().net) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row\">\r\n <dt>VAT</dt>\r\n <dd>{{ formatMoney(totals().vat) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row\">\r\n <dt>Discount</dt>\r\n <dd>{{ formatMoney(totals().discount) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row pos-receipt__row--due\">\r\n <dt>Due</dt>\r\n <dd>{{ formatMoney(totals().due) }}</dd>\r\n </div>\r\n </dl>\r\n\r\n @if (hasPayments()) {\r\n <section class=\"pos-receipt__tender\">\r\n <h3 class=\"pos-receipt__tender-title\">{{ tenderLabel() }}</h3>\r\n <ul class=\"pos-receipt__payments\">\r\n @for (payment of payments(); track $index) {\r\n <li class=\"pos-receipt__payment\">\r\n <header class=\"pos-receipt__payment-header\">\r\n <p class=\"pos-receipt__payment-tender\">{{ payment.tender }}</p>\r\n <p class=\"pos-receipt__payment-state\">{{ payment.state }}</p>\r\n </header>\r\n <dl class=\"pos-receipt__payment-amounts\">\r\n <div class=\"pos-receipt__row\">\r\n <dt>{{ amountLabel() }}</dt>\r\n <dd>{{ formatMoney(payment.amount) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row\">\r\n <dt>{{ tenderedLabel() }}</dt>\r\n <dd>{{ formatMoney(payment.tendered) }}</dd>\r\n </div>\r\n <div class=\"pos-receipt__row pos-receipt__row--change\">\r\n <dt>{{ changeLabel() }}</dt>\r\n <dd>{{ formatMoney(payment.change) }}</dd>\r\n </div>\r\n </dl>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n }\r\n </div>\r\n\r\n <div class=\"pos-receipt__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-receipt__new-sale\"\r\n [disabled]=\"!canStartNewSale()\"\r\n (click)=\"onNewSale()\"\r\n >\r\n {{ newSaleLabel() }}\r\n </button>\r\n </div>\r\n</section>\r\n","/**\n * Theme-lab catalog. Default values must stay in sync with `styles/tokens.css`.\n * The lab never writes that file; edits are live overrides only.\n */\nexport type PosTokenKind =\n | 'color'\n | 'length'\n | 'font-family'\n | 'font-weight'\n | 'other';\n\nexport type PosTokenGroup = 'color' | 'radius' | 'space' | 'type' | 'control';\n\nexport type PosTokenPreview =\n | 'color'\n | 'radius'\n | 'space'\n | 'font-size'\n | 'font-family'\n | 'font-weight'\n | 'letter-spacing'\n | 'size';\n\nexport interface PosTokenSwatch {\n readonly name: string;\n readonly variable: string;\n}\n\nexport interface PosTokenDefinition extends PosTokenSwatch {\n readonly kind: PosTokenKind;\n readonly group: PosTokenGroup;\n readonly preview: PosTokenPreview;\n readonly defaultValue: string;\n}\n\nexport interface PosTokenSample {\n readonly id: string;\n readonly label: string;\n readonly variables: readonly string[];\n}\n\nexport const POS_TOKEN_CATALOG: readonly PosTokenDefinition[] = [\n {\n name: 'Primary',\n variable: '--pos-color-primary',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#c9b5f0',\n },\n {\n name: 'On primary',\n variable: '--pos-color-on-primary',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#333333',\n },\n {\n name: 'Success',\n variable: '--pos-color-success',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#16dbcc',\n },\n {\n name: 'On success',\n variable: '--pos-color-on-success',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#333333',\n },\n {\n name: 'Danger',\n variable: '--pos-color-danger',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#fe5c73',\n },\n {\n name: 'On danger',\n variable: '--pos-color-on-danger',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#ffffff',\n },\n {\n name: 'Secondary',\n variable: '--pos-color-secondary',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#16dbcc',\n },\n {\n name: 'Warning',\n variable: '--pos-color-warning',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#f0ad4e',\n },\n {\n name: 'Text',\n variable: '--pos-color-text',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#333333',\n },\n {\n name: 'Text muted',\n variable: '--pos-color-text-muted',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#999999',\n },\n {\n name: 'Surface',\n variable: '--pos-color-surface',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#ffffff',\n },\n {\n name: 'Surface muted',\n variable: '--pos-color-surface-muted',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#f5f5f5',\n },\n {\n name: 'Panel',\n variable: '--pos-color-panel',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#f5f5f5',\n },\n {\n name: 'Panel elevated',\n variable: '--pos-color-panel-elevated',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#ffffff',\n },\n {\n name: 'Ink',\n variable: '--pos-color-ink',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#333333',\n },\n {\n name: 'Border',\n variable: '--pos-color-border',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#dddddd',\n },\n {\n name: 'Disabled',\n variable: '--pos-color-disabled',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#dddddd',\n },\n {\n name: 'On disabled',\n variable: '--pos-color-on-disabled',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#999999',\n },\n {\n name: 'Display',\n variable: '--pos-color-display',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#333333',\n },\n {\n name: 'On display',\n variable: '--pos-color-on-display',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#ffffff',\n },\n {\n name: 'Key',\n variable: '--pos-color-key',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#ffffff',\n },\n {\n name: 'Key border',\n variable: '--pos-color-key-border',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#dddddd',\n },\n {\n name: 'Key active',\n variable: '--pos-color-key-active',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#c9b5f0',\n },\n {\n name: 'On key active',\n variable: '--pos-color-on-key-active',\n kind: 'color',\n group: 'color',\n preview: 'color',\n defaultValue: '#333333',\n },\n {\n name: 'Radius sm',\n variable: '--pos-radius-sm',\n kind: 'length',\n group: 'radius',\n preview: 'radius',\n defaultValue: '4px',\n },\n {\n name: 'Radius md',\n variable: '--pos-radius-md',\n kind: 'length',\n group: 'radius',\n preview: 'radius',\n defaultValue: '8px',\n },\n {\n name: 'Radius lg',\n variable: '--pos-radius-lg',\n kind: 'length',\n group: 'radius',\n preview: 'radius',\n defaultValue: '12px',\n },\n {\n name: 'Radius pill',\n variable: '--pos-radius-pill',\n kind: 'length',\n group: 'radius',\n preview: 'radius',\n defaultValue: '9999px',\n },\n {\n name: 'Space xs',\n variable: '--pos-space-xs',\n kind: 'length',\n group: 'space',\n preview: 'space',\n defaultValue: '4px',\n },\n {\n name: 'Space sm',\n variable: '--pos-space-sm',\n kind: 'length',\n group: 'space',\n preview: 'space',\n defaultValue: '8px',\n },\n {\n name: 'Space md',\n variable: '--pos-space-md',\n kind: 'length',\n group: 'space',\n preview: 'space',\n defaultValue: '12px',\n },\n {\n name: 'Space lg',\n variable: '--pos-space-lg',\n kind: 'length',\n group: 'space',\n preview: 'space',\n defaultValue: '16px',\n },\n {\n name: 'Space xl',\n variable: '--pos-space-xl',\n kind: 'length',\n group: 'space',\n preview: 'space',\n defaultValue: '24px',\n },\n {\n name: 'Space 2xl',\n variable: '--pos-space-2xl',\n kind: 'length',\n group: 'space',\n preview: 'space',\n defaultValue: '40px',\n },\n {\n name: 'Space 3xl',\n variable: '--pos-space-3xl',\n kind: 'length',\n group: 'space',\n preview: 'space',\n defaultValue: '56px',\n },\n {\n name: 'Font family',\n variable: '--pos-font-family',\n kind: 'font-family',\n group: 'type',\n preview: 'font-family',\n defaultValue:\n \"Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif\",\n },\n {\n name: 'Font family display',\n variable: '--pos-font-family-display',\n kind: 'font-family',\n group: 'type',\n preview: 'font-family',\n defaultValue:\n \"Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif\",\n },\n {\n name: 'Font size sm',\n variable: '--pos-font-size-sm',\n kind: 'length',\n group: 'type',\n preview: 'font-size',\n defaultValue: '0.8125rem',\n },\n {\n name: 'Font size md',\n variable: '--pos-font-size-md',\n kind: 'length',\n group: 'type',\n preview: 'font-size',\n defaultValue: '0.875rem',\n },\n {\n name: 'Font size lg',\n variable: '--pos-font-size-lg',\n kind: 'length',\n group: 'type',\n preview: 'font-size',\n defaultValue: '1.125rem',\n },\n {\n name: 'Font size xl',\n variable: '--pos-font-size-xl',\n kind: 'length',\n group: 'type',\n preview: 'font-size',\n defaultValue: '1.375rem',\n },\n {\n name: 'Font weight semibold',\n variable: '--pos-font-weight-semibold',\n kind: 'font-weight',\n group: 'type',\n preview: 'font-weight',\n defaultValue: '600',\n },\n {\n name: 'Font weight bold',\n variable: '--pos-font-weight-bold',\n kind: 'font-weight',\n group: 'type',\n preview: 'font-weight',\n defaultValue: '700',\n },\n {\n name: 'Letter spacing display',\n variable: '--pos-letter-spacing-display',\n kind: 'length',\n group: 'type',\n preview: 'letter-spacing',\n defaultValue: '0.28em',\n },\n {\n name: 'Button min height',\n variable: '--pos-button-min-height',\n kind: 'length',\n group: 'control',\n preview: 'size',\n defaultValue: '48px',\n },\n {\n name: 'Keypad size',\n variable: '--pos-keypad-size',\n kind: 'length',\n group: 'control',\n preview: 'size',\n defaultValue: '3.25rem',\n },\n {\n name: 'Keypad size md',\n variable: '--pos-keypad-size-md',\n kind: 'length',\n group: 'control',\n preview: 'size',\n defaultValue: '3.75rem',\n },\n {\n name: 'Keypad size lg',\n variable: '--pos-keypad-size-lg',\n kind: 'length',\n group: 'control',\n preview: 'size',\n defaultValue: '4.25rem',\n },\n];\n\nexport const POS_TOKEN_DEFAULTS: Readonly<Record<string, string>> = Object.freeze(\n Object.fromEntries(\n POS_TOKEN_CATALOG.map((token) => [token.variable, token.defaultValue]),\n ),\n);\n\nexport const POS_TOKEN_BY_VARIABLE: ReadonlyMap<string, PosTokenDefinition> =\n new Map(POS_TOKEN_CATALOG.map((token) => [token.variable, token]));\n\nexport const POS_TOKEN_SAMPLES: readonly PosTokenSample[] = [\n {\n id: 'primary',\n label: 'Primary',\n variables: [\n '--pos-color-primary',\n '--pos-color-on-primary',\n '--pos-radius-md',\n '--pos-button-min-height',\n '--pos-font-weight-bold',\n ],\n },\n {\n id: 'success',\n label: 'Success',\n variables: [\n '--pos-color-success',\n '--pos-color-on-success',\n '--pos-radius-md',\n '--pos-button-min-height',\n '--pos-font-weight-bold',\n ],\n },\n {\n id: 'danger',\n label: 'Danger',\n variables: [\n '--pos-color-danger',\n '--pos-color-on-danger',\n '--pos-radius-md',\n '--pos-button-min-height',\n '--pos-font-weight-bold',\n ],\n },\n {\n id: 'disabled',\n label: 'Disabled',\n variables: [\n '--pos-color-disabled',\n '--pos-color-on-disabled',\n '--pos-radius-md',\n '--pos-button-min-height',\n ],\n },\n {\n id: 'text',\n label: 'Body text',\n variables: [\n '--pos-color-text',\n '--pos-color-text-muted',\n '--pos-font-family',\n '--pos-font-size-md',\n ],\n },\n {\n id: 'error',\n label: 'Danger / error message',\n variables: ['--pos-color-danger', '--pos-font-weight-semibold'],\n },\n];\n\nexport function tokensInGroup(\n group: PosTokenGroup,\n): readonly PosTokenDefinition[] {\n return POS_TOKEN_CATALOG.filter((token) => token.group === group);\n}\n\nexport function lookupPosTokens(\n variables: readonly string[],\n): readonly PosTokenDefinition[] {\n return variables.flatMap((variable) => {\n const token = POS_TOKEN_BY_VARIABLE.get(variable);\n return token ? [token] : [];\n });\n}\n","import {\n POS_TOKEN_BY_VARIABLE,\n POS_TOKEN_CATALOG,\n POS_TOKEN_DEFAULTS,\n type PosTokenKind,\n} from './pos-token-catalog';\n\nconst TOKEN_DECL = /(--pos-[a-z0-9-]+)\\s*:\\s*([^;}{]+)/gi;\n\nexport const POS_THEME_CSS_FILENAME = 'pos-theme.css';\n\nconst THEME_CSS_HEADER = `/**\n * Adaptive POS theme\n * Generated by <pos-tokens>. Load after @retalia/pos-components styles.\n * Package defaults are unchanged; this file only overrides --pos-* on :root.\n */`;\n\nexport function normalizePosTokenValue(\n kind: PosTokenKind,\n value: string,\n): string {\n const trimmed = value.trim().replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').trim();\n if (!trimmed) {\n return '';\n }\n\n if (kind === 'color') {\n const hex = parseCssHex(trimmed);\n if (hex) {\n return hex;\n }\n }\n\n return trimmed.replace(/\\s*!important$/i, '').trim();\n}\n\nexport function parseCssHex(value: string): string | null {\n const trimmed = value.trim();\n const short = /^#([0-9a-f]{3})$/i.exec(trimmed)?.[1];\n if (short && short.length === 3) {\n const [r, g, b] = short;\n return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();\n }\n\n if (/^#[0-9a-f]{6}$/i.test(trimmed)) {\n return trimmed.toLowerCase();\n }\n\n return null;\n}\n\nexport function parsePosThemeCss(css: string): Readonly<Record<string, string>> {\n const result: Record<string, string> = {};\n\n for (const match of css.matchAll(TOKEN_DECL)) {\n const variable = match[1];\n const token = POS_TOKEN_BY_VARIABLE.get(variable);\n if (!token) {\n continue;\n }\n\n const value = normalizePosTokenValue(token.kind, match[2] ?? '');\n if (value) {\n result[variable] = value;\n }\n }\n\n return result;\n}\n\nexport function resolvedPosTheme(\n overrides: Readonly<Record<string, string>>,\n): Readonly<Record<string, string>> {\n const resolved: Record<string, string> = { ...POS_TOKEN_DEFAULTS };\n for (const [variable, value] of Object.entries(overrides)) {\n if (variable in POS_TOKEN_DEFAULTS && value.trim()) {\n resolved[variable] = value;\n }\n }\n return resolved;\n}\n\nexport function overridesFromThemeValues(\n values: Readonly<Record<string, string>>,\n): Record<string, string> {\n const overrides: Record<string, string> = {};\n for (const [variable, value] of Object.entries(values)) {\n const token = POS_TOKEN_BY_VARIABLE.get(variable);\n if (!token) {\n continue;\n }\n\n const normalized = normalizePosTokenValue(token.kind, value);\n if (normalized && normalized !== token.defaultValue) {\n overrides[variable] = normalized;\n }\n }\n return overrides;\n}\n\nexport function serializePosThemeCss(\n values: Readonly<Record<string, string>>,\n): string {\n const lines = POS_TOKEN_CATALOG.map((token) => {\n const value = values[token.variable] ?? token.defaultValue;\n return ` ${token.variable}: ${value};`;\n });\n\n return `${THEME_CSS_HEADER}\\n:root {\\n${lines.join('\\n')}\\n}\\n`;\n}\n\nexport function downloadTextFile(filename: string, contents: string): void {\n const blob = new Blob([contents], { type: 'text/css;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n document.body.append(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(url);\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport {\r\n POS_TOKEN_BY_VARIABLE,\r\n POS_TOKEN_SAMPLES,\r\n type PosTokenDefinition,\r\n type PosTokenSwatch,\r\n lookupPosTokens,\r\n tokensInGroup,\r\n} from './pos-token-catalog';\r\nimport {\r\n POS_THEME_CSS_FILENAME,\r\n downloadTextFile,\r\n normalizePosTokenValue,\r\n overridesFromThemeValues,\r\n parseCssHex,\r\n parsePosThemeCss,\r\n resolvedPosTheme,\r\n serializePosThemeCss,\r\n} from './pos-theme-css';\r\n\r\nexport type { PosTokenSwatch };\r\n\r\ninterface PosTokenSelection {\r\n readonly id: string;\r\n readonly title: string;\r\n readonly variables: readonly string[];\r\n}\r\n\r\n@Component({\r\n selector: 'pos-tokens',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './pos-tokens.html',\r\n styleUrl: './pos-tokens.scss',\r\n host: {\r\n class: 'pos-tokens',\r\n '[style]': 'themeStyle()',\r\n '(keydown.escape)': 'clearSelection()',\r\n },\r\n})\r\nexport class PosTokens {\r\n protected readonly colorTokens = tokensInGroup('color');\r\n protected readonly radiusTokens = tokensInGroup('radius');\r\n protected readonly spaceTokens = tokensInGroup('space');\r\n protected readonly typeTokens = tokensInGroup('type');\r\n protected readonly controlTokens = tokensInGroup('control');\r\n\r\n private readonly overrides = signal<Record<string, string>>({});\r\n protected readonly selection = signal<PosTokenSelection | null>(null);\r\n protected readonly statusMessage = signal('');\r\n\r\n protected readonly selectedTokens = computed(() => {\r\n const selection = this.selection();\r\n return selection ? lookupPosTokens(selection.variables) : [];\r\n });\r\n\r\n protected readonly hasOverrides = computed(\r\n () => Object.keys(this.overrides()).length > 0,\r\n );\r\n\r\n protected readonly themeStyle = computed(() =>\r\n Object.entries(this.overrides())\r\n .map(([variable, value]) => `${variable}: ${value}`)\r\n .join('; '),\r\n );\r\n\r\n /** Complete :root CSS for the consuming POS. Package defaults are not written. */\r\n themeCss(): string {\r\n return serializePosThemeCss(resolvedPosTheme(this.overrides()));\r\n }\r\n\r\n /** Load a previously exported theme as live overrides. Does not mutate defaults. */\r\n loadThemeCss(css: string): void {\r\n const parsed = parsePosThemeCss(css);\r\n const knownCount = Object.keys(parsed).length;\r\n this.overrides.set(overridesFromThemeValues(parsed));\r\n\r\n if (knownCount === 0) {\r\n this.statusMessage.set('No --pos-* tokens found in that file.');\r\n return;\r\n }\r\n\r\n this.statusMessage.set(\r\n `Imported ${knownCount} tokens as live overrides. Package defaults are unchanged.`,\r\n );\r\n }\r\n\r\n resetTheme(): void {\r\n this.overrides.set({});\r\n this.statusMessage.set('Live overrides cleared. Package defaults restored in this lab.');\r\n }\r\n\r\n protected exportThemeFile(): void {\r\n downloadTextFile(POS_THEME_CSS_FILENAME, this.themeCss());\r\n this.statusMessage.set(\r\n `Downloaded ${POS_THEME_CSS_FILENAME}. Add it after the package stylesheet in the host POS.`,\r\n );\r\n }\r\n\r\n protected async onImportFile(event: Event): Promise<void> {\r\n const input = event.target;\r\n if (!(input instanceof HTMLInputElement) || !input.files?.length) {\r\n return;\r\n }\r\n\r\n const css = await input.files[0].text();\r\n this.loadThemeCss(css);\r\n input.value = '';\r\n }\r\n\r\n protected selectToken(token: PosTokenDefinition): void {\r\n this.selection.set({\r\n id: `token:${token.variable}`,\r\n title: token.name,\r\n variables: [token.variable],\r\n });\r\n }\r\n\r\n protected selectSample(sampleId: string): void {\r\n const sample = POS_TOKEN_SAMPLES.find((item) => item.id === sampleId);\r\n if (!sample) {\r\n return;\r\n }\r\n\r\n this.selection.set({\r\n id: `sample:${sample.id}`,\r\n title: sample.label,\r\n variables: sample.variables,\r\n });\r\n }\r\n\r\n protected clearSelection(): void {\r\n this.selection.set(null);\r\n }\r\n\r\n protected isTokenSelected(variable: string): boolean {\r\n const selection = this.selection();\r\n return selection?.id === `token:${variable}`;\r\n }\r\n\r\n protected isSampleSelected(sampleId: string): boolean {\r\n return this.selection()?.id === `sample:${sampleId}`;\r\n }\r\n\r\n protected isModified(variable: string): boolean {\r\n return variable in this.overrides();\r\n }\r\n\r\n protected currentValue(variable: string): string {\r\n return this.overrides()[variable] ?? POS_TOKEN_BY_VARIABLE.get(variable)?.defaultValue ?? '';\r\n }\r\n\r\n protected defaultValue(variable: string): string {\r\n return POS_TOKEN_BY_VARIABLE.get(variable)?.defaultValue ?? '';\r\n }\r\n\r\n protected colorInputValue(variable: string): string | null {\r\n return parseCssHex(this.currentValue(variable));\r\n }\r\n\r\n protected tokenFieldId(variable: string): string {\r\n return `pos-token-field-${variable.replace(/[^a-z0-9]+/gi, '-')}`;\r\n }\r\n\r\n protected onTokenInput(variable: string, event: Event): void {\r\n const target = event.target;\r\n if (!(target instanceof HTMLInputElement)) {\r\n return;\r\n }\r\n\r\n this.setTokenValue(variable, target.value);\r\n }\r\n\r\n protected resetToken(variable: string): void {\r\n this.overrides.update((current) => {\r\n if (!(variable in current)) {\r\n return current;\r\n }\r\n\r\n const next = { ...current };\r\n delete next[variable];\r\n return next;\r\n });\r\n }\r\n\r\n private setTokenValue(variable: string, raw: string): void {\r\n const token = POS_TOKEN_BY_VARIABLE.get(variable);\r\n if (!token) {\r\n return;\r\n }\r\n\r\n const normalized = normalizePosTokenValue(token.kind, raw);\r\n this.overrides.update((current) => {\r\n const next = { ...current };\r\n if (!normalized || normalized === token.defaultValue) {\r\n delete next[variable];\r\n } else {\r\n next[variable] = normalized;\r\n }\r\n return next;\r\n });\r\n }\r\n}\r\n","<article class=\"pos-tokens__page\">\r\n <header class=\"pos-tokens__intro\">\r\n <p class=\"pos-tokens__kicker\">@retalia/pos-components</p>\r\n <h1 class=\"pos-tokens__title\">Design tokens</h1>\r\n <p class=\"pos-tokens__lede\">\r\n Click a sample or token to edit it. Changes are live overrides in this lab only —\r\n package defaults are never overwritten. Export a complete <code>:root</code> CSS\r\n file for the consuming POS, and import that file back later to resume editing.\r\n </p>\r\n <div class=\"pos-tokens__toolbar\">\r\n <input\r\n #importFile\r\n class=\"pos-tokens__file\"\r\n type=\"file\"\r\n accept=\".css,text/css\"\r\n (change)=\"onImportFile($event)\"\r\n />\r\n <button type=\"button\" class=\"pos-tokens__tool pos-tokens__tool--primary\" (click)=\"exportThemeFile()\">\r\n Export CSS\r\n </button>\r\n <button type=\"button\" class=\"pos-tokens__tool\" (click)=\"importFile.click()\">\r\n Import CSS\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__tool\"\r\n [disabled]=\"!hasOverrides()\"\r\n (click)=\"resetTheme()\"\r\n >\r\n Reset overrides\r\n </button>\r\n </div>\r\n <p class=\"pos-tokens__status\" role=\"status\" aria-live=\"polite\">{{ statusMessage() }}</p>\r\n </header>\r\n\r\n <div class=\"pos-tokens__layout\">\r\n <div class=\"pos-tokens__gallery\">\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-samples\">\r\n <h2 id=\"pos-tokens-samples\" class=\"pos-tokens__heading\">In action</h2>\r\n <p class=\"pos-tokens__hint\">Click a control to edit the tokens it uses.</p>\r\n <div class=\"pos-tokens__samples\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('primary')\"\r\n [attr.aria-pressed]=\"isSampleSelected('primary')\"\r\n (click)=\"selectSample('primary')\"\r\n >\r\n <span class=\"pos-tokens__btn pos-tokens__btn--primary\">Primary</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('success')\"\r\n [attr.aria-pressed]=\"isSampleSelected('success')\"\r\n (click)=\"selectSample('success')\"\r\n >\r\n <span class=\"pos-tokens__btn pos-tokens__btn--success\">Success</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('danger')\"\r\n [attr.aria-pressed]=\"isSampleSelected('danger')\"\r\n (click)=\"selectSample('danger')\"\r\n >\r\n <span class=\"pos-tokens__btn pos-tokens__btn--danger\">Danger</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('disabled')\"\r\n [attr.aria-pressed]=\"isSampleSelected('disabled')\"\r\n (click)=\"selectSample('disabled')\"\r\n >\r\n <span class=\"pos-tokens__btn pos-tokens__btn--disabled\">Disabled</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample pos-tokens__sample--text\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('text')\"\r\n [attr.aria-pressed]=\"isSampleSelected('text')\"\r\n (click)=\"selectSample('text')\"\r\n >\r\n <span class=\"pos-tokens__sample-text\">\r\n Body text · <span class=\"pos-tokens__sample-muted\">muted</span>\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__sample pos-tokens__sample--text\"\r\n [class.pos-tokens__sample--selected]=\"isSampleSelected('error')\"\r\n [attr.aria-pressed]=\"isSampleSelected('error')\"\r\n (click)=\"selectSample('error')\"\r\n >\r\n <span class=\"pos-tokens__sample-danger\">Danger / error message</span>\r\n </button>\r\n </div>\r\n </section>\r\n\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-colors\">\r\n <h2 id=\"pos-tokens-colors\" class=\"pos-tokens__heading\">Color</h2>\r\n <ul class=\"pos-tokens__swatch-grid\">\r\n @for (token of colorTokens; track token.variable) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__pick\"\r\n [class.pos-tokens__pick--selected]=\"isTokenSelected(token.variable)\"\r\n [class.pos-tokens__pick--modified]=\"isModified(token.variable)\"\r\n [attr.aria-pressed]=\"isTokenSelected(token.variable)\"\r\n (click)=\"selectToken(token)\"\r\n >\r\n <span\r\n class=\"pos-tokens__chip\"\r\n [style.background]=\"'var(' + token.variable + ')'\"\r\n ></span>\r\n <span class=\"pos-tokens__swatch-meta\">\r\n <span class=\"pos-tokens__swatch-name\">\r\n {{ token.name }}\r\n @if (isModified(token.variable)) {\r\n <span class=\"pos-tokens__edited\">Edited</span>\r\n }\r\n </span>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n </span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-radius\">\r\n <h2 id=\"pos-tokens-radius\" class=\"pos-tokens__heading\">Radius</h2>\r\n <ul class=\"pos-tokens__radius-row\">\r\n @for (token of radiusTokens; track token.variable) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__pick\"\r\n [class.pos-tokens__pick--selected]=\"isTokenSelected(token.variable)\"\r\n [class.pos-tokens__pick--modified]=\"isModified(token.variable)\"\r\n [attr.aria-pressed]=\"isTokenSelected(token.variable)\"\r\n (click)=\"selectToken(token)\"\r\n >\r\n <span\r\n class=\"pos-tokens__radius-box\"\r\n [style.border-radius]=\"'var(' + token.variable + ')'\"\r\n ></span>\r\n <span class=\"pos-tokens__swatch-name\">\r\n {{ token.name }}\r\n @if (isModified(token.variable)) {\r\n <span class=\"pos-tokens__edited\">Edited</span>\r\n }\r\n </span>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-space\">\r\n <h2 id=\"pos-tokens-space\" class=\"pos-tokens__heading\">Space</h2>\r\n <ul class=\"pos-tokens__space-list\">\r\n @for (token of spaceTokens; track token.variable) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__pick pos-tokens__pick--row\"\r\n [class.pos-tokens__pick--selected]=\"isTokenSelected(token.variable)\"\r\n [class.pos-tokens__pick--modified]=\"isModified(token.variable)\"\r\n [attr.aria-pressed]=\"isTokenSelected(token.variable)\"\r\n (click)=\"selectToken(token)\"\r\n >\r\n <span\r\n class=\"pos-tokens__space-bar\"\r\n [style.width]=\"'var(' + token.variable + ')'\"\r\n ></span>\r\n <span class=\"pos-tokens__swatch-meta\">\r\n <span class=\"pos-tokens__swatch-name\">\r\n {{ token.name }}\r\n @if (isModified(token.variable)) {\r\n <span class=\"pos-tokens__edited\">Edited</span>\r\n }\r\n </span>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n </span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-type\">\r\n <h2 id=\"pos-tokens-type\" class=\"pos-tokens__heading\">Typography</h2>\r\n <ul class=\"pos-tokens__type-list\">\r\n @for (token of typeTokens; track token.variable) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__pick\"\r\n [class.pos-tokens__pick--selected]=\"isTokenSelected(token.variable)\"\r\n [class.pos-tokens__pick--modified]=\"isModified(token.variable)\"\r\n [attr.aria-pressed]=\"isTokenSelected(token.variable)\"\r\n (click)=\"selectToken(token)\"\r\n >\r\n <span class=\"pos-tokens__swatch-name\">\r\n {{ token.name }}\r\n @if (isModified(token.variable)) {\r\n <span class=\"pos-tokens__edited\">Edited</span>\r\n }\r\n </span>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n @switch (token.preview) {\r\n @case ('font-family') {\r\n <span\r\n class=\"pos-tokens__type-preview\"\r\n [style.font-family]=\"'var(' + token.variable + ')'\"\r\n >\r\n The quick brown fox\r\n </span>\r\n }\r\n @case ('font-size') {\r\n <span\r\n class=\"pos-tokens__type-preview\"\r\n [style.font-size]=\"'var(' + token.variable + ')'\"\r\n >\r\n The quick brown fox\r\n </span>\r\n }\r\n @case ('font-weight') {\r\n <span\r\n class=\"pos-tokens__type-preview\"\r\n [style.font-weight]=\"'var(' + token.variable + ')'\"\r\n >\r\n The quick brown fox\r\n </span>\r\n }\r\n @case ('letter-spacing') {\r\n <span\r\n class=\"pos-tokens__type-preview pos-tokens__type-preview--caps\"\r\n [style.letter-spacing]=\"'var(' + token.variable + ')'\"\r\n >\r\n Display\r\n </span>\r\n }\r\n }\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n\r\n <section class=\"pos-tokens__section\" aria-labelledby=\"pos-tokens-controls\">\r\n <h2 id=\"pos-tokens-controls\" class=\"pos-tokens__heading\">Controls</h2>\r\n <ul class=\"pos-tokens__control-list\">\r\n @for (token of controlTokens; track token.variable) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"pos-tokens__pick pos-tokens__pick--row\"\r\n [class.pos-tokens__pick--selected]=\"isTokenSelected(token.variable)\"\r\n [class.pos-tokens__pick--modified]=\"isModified(token.variable)\"\r\n [attr.aria-pressed]=\"isTokenSelected(token.variable)\"\r\n (click)=\"selectToken(token)\"\r\n >\r\n <span\r\n class=\"pos-tokens__size-box\"\r\n [style.width]=\"'var(' + token.variable + ')'\"\r\n [style.height]=\"'var(' + token.variable + ')'\"\r\n ></span>\r\n <span class=\"pos-tokens__swatch-meta\">\r\n <span class=\"pos-tokens__swatch-name\">\r\n {{ token.name }}\r\n @if (isModified(token.variable)) {\r\n <span class=\"pos-tokens__edited\">Edited</span>\r\n }\r\n </span>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n </span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </section>\r\n </div>\r\n\r\n <aside class=\"pos-tokens__inspector\" aria-labelledby=\"pos-tokens-inspector-title\">\r\n <div class=\"pos-tokens__inspector-header\">\r\n <h2 id=\"pos-tokens-inspector-title\" class=\"pos-tokens__heading\">\r\n {{ selection()?.title ?? 'Theme editor' }}\r\n </h2>\r\n @if (selection()) {\r\n <button type=\"button\" class=\"pos-tokens__tool pos-tokens__tool--quiet\" (click)=\"clearSelection()\">\r\n Close\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (!selection()) {\r\n <p class=\"pos-tokens__hint\">\r\n Select a sample or token to change its values. Export writes a complete CSS\r\n file the host POS can load after the package stylesheet.\r\n </p>\r\n } @else {\r\n <ul class=\"pos-tokens__fields\">\r\n @for (token of selectedTokens(); track token.variable) {\r\n <li class=\"pos-tokens__field\">\r\n <label class=\"pos-tokens__field-label\" [attr.for]=\"tokenFieldId(token.variable)\">\r\n {{ token.name }}\r\n </label>\r\n <code class=\"pos-tokens__swatch-var\">{{ token.variable }}</code>\r\n <div class=\"pos-tokens__field-controls\">\r\n @if (token.kind === 'color') {\r\n @if (colorInputValue(token.variable); as hex) {\r\n <input\r\n class=\"pos-tokens__color\"\r\n type=\"color\"\r\n [value]=\"hex\"\r\n [attr.aria-label]=\"token.name + ' color'\"\r\n (input)=\"onTokenInput(token.variable, $event)\"\r\n />\r\n }\r\n }\r\n <input\r\n class=\"pos-tokens__value\"\r\n type=\"text\"\r\n [id]=\"tokenFieldId(token.variable)\"\r\n [value]=\"currentValue(token.variable)\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n (input)=\"onTokenInput(token.variable, $event)\"\r\n />\r\n </div>\r\n <p class=\"pos-tokens__default\">\r\n Default\r\n <code>{{ defaultValue(token.variable) }}</code>\r\n </p>\r\n @if (isModified(token.variable)) {\r\n <button type=\"button\" class=\"pos-tokens__reset\" (click)=\"resetToken(token.variable)\">\r\n Reset to default\r\n </button>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </aside>\r\n </div>\r\n</article>\r\n","/*\r\n * Public API Surface of @retalia/pos-components\r\n */\r\n\r\nexport { PosLogin } from './lib/login/pos-login';\r\nexport type {\r\n PosLoginIntent,\r\n PosLoginSessionState,\r\n PosLoginSessionStatus,\r\n} from './lib/login/pos-login';\r\n\r\nexport { PosBasket } from './lib/basket/pos-basket';\r\nexport type {\r\n PosBasketIntent,\r\n PosBasketLine,\r\n PosBasketTotals,\r\n PosBasketVat,\r\n} from './lib/basket/pos-basket';\r\n\r\nexport { PosItemEntry } from './lib/item-entry/pos-item-entry';\r\nexport type { PosItemEntryIntent } from './lib/item-entry/pos-item-entry';\r\n\r\nexport { PosTender } from './lib/tender/pos-tender';\r\nexport type { PosTenderIntent } from './lib/tender/pos-tender';\r\n\r\nexport { PosReceipt } from './lib/receipt/pos-receipt';\r\nexport type {\r\n PosReceiptIntent,\r\n PosReceiptLine,\r\n PosReceiptTotals,\r\n PosReceiptVat,\r\n PosReceiptPayment,\r\n PosReceiptDocument,\r\n} from './lib/receipt/pos-receipt';\r\n\r\nexport { PosTokens } from './lib/tokens/pos-tokens';\r\nexport type { PosTokenSwatch } from './lib/tokens/pos-tokens';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["KEYPAD_ROWS","EMPTY_TOTALS"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retalia/pos-components",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
@@ -12,7 +12,10 @@
12
12
  "dependencies": {
13
13
  "tslib": "^2.3.0"
14
14
  },
15
- "sideEffects": false,
15
+ "sideEffects": [
16
+ "**/*.css"
17
+ ],
18
+ "style": "./styles/styles.css",
16
19
  "module": "fesm2022/retalia-pos-components.mjs",
17
20
  "typings": "types/retalia-pos-components.d.ts",
18
21
  "exports": {
@@ -0,0 +1 @@
1
+ @import './tokens.css';
@@ -0,0 +1,57 @@
1
+ :root {
2
+ /* Color — aligned with Retalia DX theme (dx.generic.Retalia-DX-Theme) */
3
+ --pos-color-primary: #c9b5f0;
4
+ --pos-color-on-primary: #333333;
5
+ --pos-color-success: #16dbcc;
6
+ --pos-color-on-success: #333333;
7
+ --pos-color-danger: #fe5c73;
8
+ --pos-color-on-danger: #ffffff;
9
+ --pos-color-secondary: #16dbcc;
10
+ --pos-color-warning: #f0ad4e;
11
+ --pos-color-text: #333333;
12
+ --pos-color-text-muted: #999999;
13
+ --pos-color-surface: #ffffff;
14
+ --pos-color-surface-muted: #f5f5f5;
15
+ --pos-color-panel: #f5f5f5;
16
+ --pos-color-panel-elevated: #ffffff;
17
+ --pos-color-ink: #333333;
18
+ --pos-color-border: #dddddd;
19
+ --pos-color-disabled: #dddddd;
20
+ --pos-color-on-disabled: #999999;
21
+ --pos-color-display: #333333;
22
+ --pos-color-on-display: #ffffff;
23
+ --pos-color-key: #ffffff;
24
+ --pos-color-key-border: #dddddd;
25
+ --pos-color-key-active: #c9b5f0;
26
+ --pos-color-on-key-active: #333333;
27
+
28
+ /* Shape / size */
29
+ --pos-radius-sm: 4px;
30
+ --pos-radius-md: 8px;
31
+ --pos-radius-lg: 12px;
32
+ --pos-radius-pill: 9999px;
33
+ --pos-button-min-height: 48px;
34
+ --pos-keypad-size: 3.25rem;
35
+ --pos-keypad-size-md: 3.75rem;
36
+ --pos-keypad-size-lg: 4.25rem;
37
+
38
+ /* Type — Inter stack matches DX Retalia theme */
39
+ --pos-font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif;
40
+ --pos-font-family-display: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif;
41
+ --pos-font-size-sm: 0.8125rem;
42
+ --pos-font-size-md: 0.875rem;
43
+ --pos-font-size-lg: 1.125rem;
44
+ --pos-font-size-xl: 1.375rem;
45
+ --pos-font-weight-semibold: 600;
46
+ --pos-font-weight-bold: 700;
47
+ --pos-letter-spacing-display: 0.28em;
48
+
49
+ /* Space */
50
+ --pos-space-xs: 4px;
51
+ --pos-space-sm: 8px;
52
+ --pos-space-md: 12px;
53
+ --pos-space-lg: 16px;
54
+ --pos-space-xl: 24px;
55
+ --pos-space-2xl: 40px;
56
+ --pos-space-3xl: 56px;
57
+ }