@retalia/pos-components 0.0.8 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retalia/pos-components",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
package/styles/styles.css CHANGED
@@ -1 +1,2 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@300;400;500;600;700&display=swap');
1
2
  @import './tokens.css';
package/styles/tokens.css CHANGED
@@ -1,5 +1,5 @@
1
1
  :root {
2
- /* Color — aligned with Retalia DX theme (dx.generic.Retalia-DX-Theme) */
2
+ /* Color — white surfaces from the POS POC. Coral, mint, and lilac stay on confirm, cancel, and primary actions. */
3
3
  --pos-color-primary: #c9b5f0;
4
4
  --pos-color-on-primary: #333333;
5
5
  --pos-color-success: #16dbcc;
@@ -8,22 +8,22 @@
8
8
  --pos-color-on-danger: #ffffff;
9
9
  --pos-color-secondary: #16dbcc;
10
10
  --pos-color-warning: #f0ad4e;
11
- --pos-color-text: #333333;
12
- --pos-color-text-muted: #999999;
11
+ --pos-color-text: #1a1a1a;
12
+ --pos-color-text-muted: #666a70;
13
13
  --pos-color-surface: #ffffff;
14
- --pos-color-surface-muted: #f5f5f5;
15
- --pos-color-panel: #f5f5f5;
14
+ --pos-color-surface-muted: #f5f5f7;
15
+ --pos-color-panel: #ffffff;
16
16
  --pos-color-panel-elevated: #ffffff;
17
- --pos-color-ink: #333333;
18
- --pos-color-border: #dddddd;
17
+ --pos-color-ink: #1a1a1a;
18
+ --pos-color-border: #ececf0;
19
19
  --pos-color-disabled: #dddddd;
20
20
  --pos-color-on-disabled: #999999;
21
- --pos-color-display: #333333;
21
+ --pos-color-display: #1a1a1a;
22
22
  --pos-color-on-display: #ffffff;
23
23
  --pos-color-key: #ffffff;
24
- --pos-color-key-border: #dddddd;
25
- --pos-color-key-active: #c9b5f0;
26
- --pos-color-on-key-active: #333333;
24
+ --pos-color-key-border: #ececf0;
25
+ --pos-color-key-active: #f0e6fd;
26
+ --pos-color-on-key-active: #1a1a1a;
27
27
 
28
28
  /* Shape / size */
29
29
  --pos-radius-sm: 4px;
@@ -35,16 +35,22 @@
35
35
  --pos-keypad-size-md: 3.75rem;
36
36
  --pos-keypad-size-lg: 4.25rem;
37
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;
38
+ /* Type — Chakra Petch body and Helvetica Neue headlines, matching the POS POC */
39
+ --pos-font-family: 'Chakra Petch', ui-sans-serif, system-ui, sans-serif;
40
+ --pos-font-family-display: 'Helvetica Neue', Helvetica, Arial, sans-serif;
41
41
  --pos-font-size-sm: 0.8125rem;
42
- --pos-font-size-md: 0.875rem;
42
+ --pos-font-size-md: 0.90625rem;
43
43
  --pos-font-size-lg: 1.125rem;
44
44
  --pos-font-size-xl: 1.375rem;
45
45
  --pos-font-weight-semibold: 600;
46
46
  --pos-font-weight-bold: 700;
47
47
  --pos-letter-spacing-display: 0.28em;
48
+ --pos-letter-spacing-brand: 0.08em;
49
+ --pos-letter-spacing-tight: -0.03em;
50
+
51
+ /* Elevation */
52
+ --pos-shadow-key: 0 1px 3px color-mix(in srgb, var(--pos-color-ink) 8%, transparent);
53
+ --pos-shadow-overlay: 0 var(--pos-space-md) var(--pos-space-2xl) color-mix(in srgb, var(--pos-color-ink) 14%, transparent);
48
54
 
49
55
  /* Space */
50
56
  --pos-space-xs: 4px;
@@ -25,27 +25,50 @@ type LoginStage = 'clerkNumber' | 'password';
25
25
  declare class PosLogin {
26
26
  readonly errorMessage: _angular_core.InputSignal<string>;
27
27
  readonly session: _angular_core.InputSignal<PosLoginSessionState>;
28
+ readonly heading: _angular_core.InputSignal<string>;
28
29
  readonly titleClerkNumber: _angular_core.InputSignal<string>;
29
30
  readonly titleClerkPassword: _angular_core.InputSignal<string>;
30
31
  readonly nextLabel: _angular_core.InputSignal<string>;
31
32
  readonly loginLabel: _angular_core.InputSignal<string>;
33
+ /** Shop context beside the keypad. Off leaves the keypad on its own. */
34
+ readonly showAside: _angular_core.InputSignal<boolean>;
35
+ /** Draws a frame around the login shell. Off by default. */
36
+ readonly bordered: _angular_core.InputSignal<boolean>;
37
+ /** When false, the brand image is omitted, including the built-in mark. */
38
+ readonly showBrandImage: _angular_core.InputSignal<boolean>;
39
+ /** Partner image URL. Empty, while `showBrandImage` is true, uses the built-in Retalia mark. */
40
+ readonly brandImage: _angular_core.InputSignal<string>;
41
+ /** Wordmark after the image. Empty shows no text. */
42
+ readonly brandLabel: _angular_core.InputSignal<string>;
43
+ /** First address line under the brand. Empty hides it. */
44
+ readonly locationName: _angular_core.InputSignal<string>;
45
+ /** Second address line. Empty hides it. */
46
+ readonly terminalLine: _angular_core.InputSignal<string>;
47
+ /** Shop line. Empty hides it. */
48
+ readonly shopName: _angular_core.InputSignal<string>;
49
+ readonly dateLabel: _angular_core.InputSignal<string>;
50
+ readonly posNumberLabel: _angular_core.InputSignal<string>;
51
+ /** Empty hides the POS number tile. */
52
+ readonly posNumber: _angular_core.InputSignal<string>;
32
53
  readonly action: _angular_core.OutputEmitterRef<PosLoginIntent>;
33
- protected readonly keypadRows: readonly (readonly string[])[];
54
+ protected readonly digitKeys: readonly string[];
34
55
  protected readonly inputValue: _angular_core.WritableSignal<string>;
35
56
  protected readonly stage: _angular_core.WritableSignal<LoginStage>;
36
57
  private readonly clerkNumber;
37
58
  protected readonly title: _angular_core.Signal<string>;
38
59
  protected readonly maskInput: _angular_core.Signal<boolean>;
60
+ protected readonly hasEntry: _angular_core.Signal<boolean>;
61
+ protected readonly displayText: _angular_core.Signal<string>;
39
62
  protected readonly showBack: _angular_core.Signal<boolean>;
40
63
  protected readonly primaryLabel: _angular_core.Signal<string>;
41
- protected readonly primaryEnabled: _angular_core.Signal<boolean>;
42
64
  protected readonly interactionLocked: _angular_core.Signal<boolean>;
65
+ protected readonly shownDate: _angular_core.Signal<string>;
43
66
  protected readonly sessionStatusText: _angular_core.Signal<string>;
44
67
  protected onKeypad(key: string): void;
45
68
  protected onPrimary(): void;
46
69
  protected onBack(): void;
47
70
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PosLogin, never>;
48
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosLogin, "pos-login", never, { "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "session": { "alias": "session"; "required": false; "isSignal": true; }; "titleClerkNumber": { "alias": "titleClerkNumber"; "required": false; "isSignal": true; }; "titleClerkPassword": { "alias": "titleClerkPassword"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "loginLabel": { "alias": "loginLabel"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
71
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosLogin, "pos-login", never, { "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "session": { "alias": "session"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "titleClerkNumber": { "alias": "titleClerkNumber"; "required": false; "isSignal": true; }; "titleClerkPassword": { "alias": "titleClerkPassword"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "loginLabel": { "alias": "loginLabel"; "required": false; "isSignal": true; }; "showAside": { "alias": "showAside"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "showBrandImage": { "alias": "showBrandImage"; "required": false; "isSignal": true; }; "brandImage": { "alias": "brandImage"; "required": false; "isSignal": true; }; "brandLabel": { "alias": "brandLabel"; "required": false; "isSignal": true; }; "locationName": { "alias": "locationName"; "required": false; "isSignal": true; }; "terminalLine": { "alias": "terminalLine"; "required": false; "isSignal": true; }; "shopName": { "alias": "shopName"; "required": false; "isSignal": true; }; "dateLabel": { "alias": "dateLabel"; "required": false; "isSignal": true; }; "posNumberLabel": { "alias": "posNumberLabel"; "required": false; "isSignal": true; }; "posNumber": { "alias": "posNumber"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
49
72
  }
50
73
 
51
74
  type PosBasketIntent = {
@@ -88,12 +111,12 @@ declare class PosBasket {
88
111
  readonly lines: _angular_core.InputSignal<readonly PosBasketLine[]>;
89
112
  readonly totals: _angular_core.InputSignal<PosBasketTotals>;
90
113
  readonly disabled: _angular_core.InputSignal<boolean>;
114
+ /** Draws the panel frame. Off by default so the host can sit the basket flush. */
115
+ readonly bordered: _angular_core.InputSignal<boolean>;
91
116
  readonly title: _angular_core.InputSignal<string>;
92
117
  readonly emptyMessage: _angular_core.InputSignal<string>;
93
- readonly clearLabel: _angular_core.InputSignal<string>;
94
118
  readonly action: _angular_core.OutputEmitterRef<PosBasketIntent>;
95
119
  protected readonly hasLines: _angular_core.Signal<boolean>;
96
- protected readonly canClear: _angular_core.Signal<boolean>;
97
120
  protected formatMoney(amount: number): string;
98
121
  protected canChangeQuantity(line: PosBasketLine): boolean;
99
122
  protected canDecrement(line: PosBasketLine): boolean;
@@ -101,9 +124,59 @@ declare class PosBasket {
101
124
  protected onIncrement(line: PosBasketLine): void;
102
125
  protected onDecrement(line: PosBasketLine): void;
103
126
  protected onVoid(line: PosBasketLine): void;
104
- protected onClear(): void;
105
127
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PosBasket, never>;
106
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosBasket, "pos-basket", never, { "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "totals": { "alias": "totals"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
128
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosBasket, "pos-basket", never, { "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "totals": { "alias": "totals"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
129
+ }
130
+
131
+ interface PosHeaderIntent {
132
+ readonly type: 'header.signOut';
133
+ }
134
+ declare class PosHeader {
135
+ readonly title: _angular_core.InputSignal<string>;
136
+ readonly context: _angular_core.InputSignal<string>;
137
+ /** When false, the brand image is omitted, including the built-in mark. */
138
+ readonly showBrandImage: _angular_core.InputSignal<boolean>;
139
+ /** Partner image URL. Empty, while `showBrandImage` is true, uses the built-in Retalia mark. */
140
+ readonly brandImage: _angular_core.InputSignal<string>;
141
+ /** Wordmark after the image. Empty shows no text. */
142
+ readonly brandLabel: _angular_core.InputSignal<string>;
143
+ readonly clerkName: _angular_core.InputSignal<string>;
144
+ readonly clerkRole: _angular_core.InputSignal<string>;
145
+ readonly signOutLabel: _angular_core.InputSignal<string>;
146
+ readonly menuLabel: _angular_core.InputSignal<string>;
147
+ readonly canSignOut: _angular_core.InputSignal<boolean>;
148
+ readonly disabled: _angular_core.InputSignal<boolean>;
149
+ readonly action: _angular_core.OutputEmitterRef<PosHeaderIntent>;
150
+ protected readonly menuOpen: _angular_core.WritableSignal<boolean>;
151
+ protected readonly initial: _angular_core.Signal<string>;
152
+ protected toggleMenu(): void;
153
+ protected closeMenu(): void;
154
+ protected onSignOut(): void;
155
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PosHeader, never>;
156
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosHeader, "pos-header", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "context": { "alias": "context"; "required": false; "isSignal": true; }; "showBrandImage": { "alias": "showBrandImage"; "required": false; "isSignal": true; }; "brandImage": { "alias": "brandImage"; "required": false; "isSignal": true; }; "brandLabel": { "alias": "brandLabel"; "required": false; "isSignal": true; }; "clerkName": { "alias": "clerkName"; "required": false; "isSignal": true; }; "clerkRole": { "alias": "clerkRole"; "required": false; "isSignal": true; }; "signOutLabel": { "alias": "signOutLabel"; "required": false; "isSignal": true; }; "menuLabel": { "alias": "menuLabel"; "required": false; "isSignal": true; }; "canSignOut": { "alias": "canSignOut"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
157
+ }
158
+
159
+ type PosTransactionActionBarIntent = {
160
+ readonly type: 'actionBar.clearBasket';
161
+ } | {
162
+ readonly type: 'actionBar.tender';
163
+ };
164
+ interface TransactionButton {
165
+ readonly id: 'clearBasket' | 'tender';
166
+ readonly label: string;
167
+ readonly className: string;
168
+ readonly intent: PosTransactionActionBarIntent;
169
+ }
170
+ declare class PosTransactionActionBar {
171
+ /** Action ids from the envelope. A button is shown only when its id is listed. */
172
+ readonly availableActions: _angular_core.InputSignal<readonly string[]>;
173
+ /** Locks the shown buttons while the host is busy. Does not choose which actions exist. */
174
+ readonly disabled: _angular_core.InputSignal<boolean>;
175
+ readonly action: _angular_core.OutputEmitterRef<PosTransactionActionBarIntent>;
176
+ protected readonly buttons: _angular_core.Signal<TransactionButton[]>;
177
+ protected onPress(button: TransactionButton): void;
178
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PosTransactionActionBar, never>;
179
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosTransactionActionBar, "pos-transaction-action-bar", never, { "availableActions": { "alias": "availableActions"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
107
180
  }
108
181
 
109
182
  type PosItemEntryIntent = {
@@ -112,11 +185,15 @@ type PosItemEntryIntent = {
112
185
  };
113
186
  declare class PosItemEntry {
114
187
  readonly disabled: _angular_core.InputSignal<boolean>;
188
+ /** Draws the panel frame. Off by default so the host can sit the field flush. */
189
+ readonly bordered: _angular_core.InputSignal<boolean>;
115
190
  readonly errorMessage: _angular_core.InputSignal<string>;
116
191
  readonly autofocus: _angular_core.InputSignal<boolean>;
117
192
  readonly label: _angular_core.InputSignal<string>;
118
193
  readonly placeholder: _angular_core.InputSignal<string>;
119
- readonly addLabel: _angular_core.InputSignal<string>;
194
+ readonly scannerStatus: _angular_core.InputSignal<string>;
195
+ /** Key that moves focus to the field. Empty hides the hint and the shortcut. */
196
+ readonly focusHotkey: _angular_core.InputSignal<string>;
120
197
  readonly action: _angular_core.OutputEmitterRef<{
121
198
  readonly type: "itemEntry.submit";
122
199
  readonly reference: string;
@@ -125,16 +202,19 @@ declare class PosItemEntry {
125
202
  protected readonly reference: _angular_core.WritableSignal<string>;
126
203
  protected readonly canSubmit: _angular_core.Signal<boolean>;
127
204
  constructor();
205
+ protected onDocumentKeydown(event: KeyboardEvent): void;
128
206
  protected onInput(event: Event): void;
129
207
  protected onSubmit(event: Event): void;
130
208
  private focusInput;
131
209
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PosItemEntry, never>;
132
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosItemEntry, "pos-item-entry", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "addLabel": { "alias": "addLabel"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
210
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosItemEntry, "pos-item-entry", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "scannerStatus": { "alias": "scannerStatus"; "required": false; "isSignal": true; }; "focusHotkey": { "alias": "focusHotkey"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
133
211
  }
134
212
 
135
213
  type PosTenderIntent = {
136
214
  readonly type: 'tender.cash';
137
215
  readonly amount: number;
216
+ } | {
217
+ readonly type: 'tender.cancel';
138
218
  };
139
219
  declare class PosTender {
140
220
  /** Display-only amount due from the host envelope — not calculated here. */
@@ -149,23 +229,30 @@ declare class PosTender {
149
229
  readonly tenderedLabel: _angular_core.InputSignal<string>;
150
230
  readonly changeDueLabel: _angular_core.InputSignal<string>;
151
231
  readonly tenderLabel: _angular_core.InputSignal<string>;
232
+ readonly cancelLabel: _angular_core.InputSignal<string>;
233
+ readonly hint: _angular_core.InputSignal<string>;
152
234
  readonly processingLabel: _angular_core.InputSignal<string>;
153
- readonly action: _angular_core.OutputEmitterRef<{
154
- readonly type: "tender.cash";
155
- readonly amount: number;
156
- }>;
157
- protected readonly keypadRows: readonly (readonly string[])[];
158
- protected readonly amountInput: _angular_core.WritableSignal<string>;
235
+ readonly action: _angular_core.OutputEmitterRef<PosTenderIntent>;
236
+ protected readonly coins: readonly number[];
237
+ protected readonly notes: readonly number[];
238
+ protected readonly given: _angular_core.WritableSignal<number>;
159
239
  protected readonly parsedAmount: _angular_core.Signal<number | null>;
160
240
  protected readonly canTender: _angular_core.Signal<boolean>;
161
241
  protected readonly hasChangeDue: _angular_core.Signal<boolean>;
162
- protected readonly displayTendered: _angular_core.Signal<string>;
242
+ protected readonly displayGiven: _angular_core.Signal<string>;
243
+ protected readonly quickAmounts: _angular_core.Signal<number[]>;
163
244
  protected readonly statusText: _angular_core.Signal<string>;
164
245
  protected formatMoney(amount: number): string;
165
- protected onKeypad(key: string): void;
246
+ protected denominationLabel(amount: number): string;
247
+ protected quickLabel(amount: number): string;
248
+ protected isExact(amount: number): boolean;
249
+ protected addAmount(amount: number): void;
250
+ protected setAmount(amount: number): void;
251
+ protected resetAmount(): void;
166
252
  protected onTender(): void;
253
+ protected onCancel(): void;
167
254
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PosTender, never>;
168
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosTender, "pos-tender", never, { "amountDue": { "alias": "amountDue"; "required": false; "isSignal": true; }; "changeDue": { "alias": "changeDue"; "required": false; "isSignal": true; }; "currency": { "alias": "currency"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "amountDueLabel": { "alias": "amountDueLabel"; "required": false; "isSignal": true; }; "tenderedLabel": { "alias": "tenderedLabel"; "required": false; "isSignal": true; }; "changeDueLabel": { "alias": "changeDueLabel"; "required": false; "isSignal": true; }; "tenderLabel": { "alias": "tenderLabel"; "required": false; "isSignal": true; }; "processingLabel": { "alias": "processingLabel"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
255
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosTender, "pos-tender", never, { "amountDue": { "alias": "amountDue"; "required": false; "isSignal": true; }; "changeDue": { "alias": "changeDue"; "required": false; "isSignal": true; }; "currency": { "alias": "currency"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "amountDueLabel": { "alias": "amountDueLabel"; "required": false; "isSignal": true; }; "tenderedLabel": { "alias": "tenderedLabel"; "required": false; "isSignal": true; }; "changeDueLabel": { "alias": "changeDueLabel"; "required": false; "isSignal": true; }; "tenderLabel": { "alias": "tenderLabel"; "required": false; "isSignal": true; }; "cancelLabel": { "alias": "cancelLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "processingLabel": { "alias": "processingLabel"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
169
256
  }
170
257
 
171
258
  interface PosReceiptIntent {
@@ -216,6 +303,8 @@ declare class PosReceipt {
216
303
  readonly payments: _angular_core.InputSignal<readonly PosReceiptPayment[]>;
217
304
  readonly document: _angular_core.InputSignal<PosReceiptDocument>;
218
305
  readonly disabled: _angular_core.InputSignal<boolean>;
306
+ /** Draws the panel frame. Off by default so the host can sit the receipt flush. */
307
+ readonly bordered: _angular_core.InputSignal<boolean>;
219
308
  readonly title: _angular_core.InputSignal<string>;
220
309
  readonly emptyMessage: _angular_core.InputSignal<string>;
221
310
  readonly preparingLabel: _angular_core.InputSignal<string>;
@@ -234,7 +323,7 @@ declare class PosReceipt {
234
323
  protected formatMoney(amount: number): string;
235
324
  protected onNewSale(): void;
236
325
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PosReceipt, never>;
237
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosReceipt, "pos-receipt", never, { "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "totals": { "alias": "totals"; "required": false; "isSignal": true; }; "payments": { "alias": "payments"; "required": false; "isSignal": true; }; "document": { "alias": "document"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "preparingLabel": { "alias": "preparingLabel"; "required": false; "isSignal": true; }; "readyLabel": { "alias": "readyLabel"; "required": false; "isSignal": true; }; "newSaleLabel": { "alias": "newSaleLabel"; "required": false; "isSignal": true; }; "tenderLabel": { "alias": "tenderLabel"; "required": false; "isSignal": true; }; "amountLabel": { "alias": "amountLabel"; "required": false; "isSignal": true; }; "tenderedLabel": { "alias": "tenderedLabel"; "required": false; "isSignal": true; }; "changeLabel": { "alias": "changeLabel"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
326
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosReceipt, "pos-receipt", never, { "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "totals": { "alias": "totals"; "required": false; "isSignal": true; }; "payments": { "alias": "payments"; "required": false; "isSignal": true; }; "document": { "alias": "document"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "preparingLabel": { "alias": "preparingLabel"; "required": false; "isSignal": true; }; "readyLabel": { "alias": "readyLabel"; "required": false; "isSignal": true; }; "newSaleLabel": { "alias": "newSaleLabel"; "required": false; "isSignal": true; }; "tenderLabel": { "alias": "tenderLabel"; "required": false; "isSignal": true; }; "amountLabel": { "alias": "amountLabel"; "required": false; "isSignal": true; }; "tenderedLabel": { "alias": "tenderedLabel"; "required": false; "isSignal": true; }; "changeLabel": { "alias": "changeLabel"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
238
327
  }
239
328
 
240
329
  /**
@@ -242,8 +331,8 @@ declare class PosReceipt {
242
331
  * The lab never writes that file; edits are live overrides only.
243
332
  */
244
333
  type PosTokenKind = 'color' | 'length' | 'font-family' | 'font-weight' | 'other';
245
- type PosTokenGroup = 'color' | 'radius' | 'space' | 'type' | 'control';
246
- type PosTokenPreview = 'color' | 'radius' | 'space' | 'font-size' | 'font-family' | 'font-weight' | 'letter-spacing' | 'size';
334
+ type PosTokenGroup = 'color' | 'radius' | 'space' | 'type' | 'shadow' | 'control';
335
+ type PosTokenPreview = 'color' | 'radius' | 'space' | 'font-size' | 'font-family' | 'font-weight' | 'letter-spacing' | 'shadow' | 'size';
247
336
  interface PosTokenSwatch {
248
337
  readonly name: string;
249
338
  readonly variable: string;
@@ -265,6 +354,7 @@ declare class PosTokens {
265
354
  protected readonly radiusTokens: readonly PosTokenDefinition[];
266
355
  protected readonly spaceTokens: readonly PosTokenDefinition[];
267
356
  protected readonly typeTokens: readonly PosTokenDefinition[];
357
+ protected readonly shadowTokens: readonly PosTokenDefinition[];
268
358
  protected readonly controlTokens: readonly PosTokenDefinition[];
269
359
  private readonly overrides;
270
360
  protected readonly selection: _angular_core.WritableSignal<PosTokenSelection | null>;
@@ -296,5 +386,5 @@ declare class PosTokens {
296
386
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PosTokens, "pos-tokens", never, {}, {}, never, never, true, never>;
297
387
  }
298
388
 
299
- export { PosBasket, PosItemEntry, PosLogin, PosReceipt, PosTender, PosTokens };
300
- export type { PosBasketIntent, PosBasketLine, PosBasketTotals, PosBasketVat, PosItemEntryIntent, PosLoginIntent, PosLoginSessionState, PosLoginSessionStatus, PosReceiptDocument, PosReceiptIntent, PosReceiptLine, PosReceiptPayment, PosReceiptTotals, PosReceiptVat, PosTenderIntent, PosTokenSwatch };
389
+ export { PosBasket, PosHeader, PosItemEntry, PosLogin, PosReceipt, PosTender, PosTokens, PosTransactionActionBar };
390
+ export type { PosBasketIntent, PosBasketLine, PosBasketTotals, PosBasketVat, PosHeaderIntent, PosItemEntryIntent, PosLoginIntent, PosLoginSessionState, PosLoginSessionStatus, PosReceiptDocument, PosReceiptIntent, PosReceiptLine, PosReceiptPayment, PosReceiptTotals, PosReceiptVat, PosTenderIntent, PosTokenSwatch, PosTransactionActionBarIntent };