@retalia/pos-components 0.0.12 → 0.0.13

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.
@@ -861,11 +861,9 @@ function setPaneFullWidth(layout, id, enabled) {
861
861
  return pane;
862
862
  }
863
863
  if (!enabled) {
864
- const { span: _span, fullWidth: _fullWidth, ...rest } = pane;
865
- return rest;
864
+ return copyPaneWithout(pane, 'span', 'fullWidth');
866
865
  }
867
- const { span: _span, ...rest } = pane;
868
- return { ...rest, fullWidth: true };
866
+ return { ...copyPaneWithout(pane, 'span'), fullWidth: true };
869
867
  }),
870
868
  };
871
869
  }
@@ -892,8 +890,7 @@ function setPaneVisible(layout, id, visible) {
892
890
  return pane;
893
891
  }
894
892
  if (visible) {
895
- const { visible: _hidden, ...shown } = pane;
896
- return shown;
893
+ return copyPaneWithout(pane, 'visible');
897
894
  }
898
895
  return { ...pane, visible: false };
899
896
  }),
@@ -939,19 +936,25 @@ function placedPanes(layout, present) {
939
936
  }
940
937
  return panes;
941
938
  }
942
- function visualColumns(panes, compact) {
943
- const left = columnList(panes, 0);
944
- const right = columnList(panes, 1);
945
- if (compact) {
946
- return [compactStack(left, right), []];
939
+ /** Rebuilds a pane without the named optional flags so they stay absent from the layout object. */
940
+ function copyPaneWithout(pane, ...drop) {
941
+ const omit = new Set(drop);
942
+ let next = {
943
+ id: pane.id,
944
+ column: pane.column,
945
+ order: pane.order,
946
+ weight: pane.weight,
947
+ };
948
+ if (!omit.has('fullWidth') && pane.fullWidth === true) {
949
+ next = { ...next, fullWidth: true };
947
950
  }
948
- if (right.length === 0) {
949
- return [left, []];
951
+ if (!omit.has('span') && pane.span != null) {
952
+ next = { ...next, span: pane.span };
950
953
  }
951
- if (left.length === 0) {
952
- return [right, []];
954
+ if (!omit.has('visible') && pane.visible === false) {
955
+ next = { ...next, visible: false };
953
956
  }
954
- return [left, right];
957
+ return next;
955
958
  }
956
959
  /** On a narrow screen, keep the header at the top and the action bar at the bottom. */
957
960
  function compactStack(left, right) {
@@ -2062,7 +2065,7 @@ class PosWorkspace {
2062
2065
  }
2063
2066
  }
2064
2067
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: PosWorkspace, deps: [], target: i0.ɵɵFactoryTarget.Component });
2065
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: PosWorkspace, isStandalone: true, selector: "pos-workspace", inputs: { editing: { classPropertyName: "editing", publicName: "editing", isSignal: true, isRequired: false, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { layoutChange: "layoutChange", layoutExport: "layoutExport" }, host: { properties: { "class.pos-workspace--editing": "editing()", "class.pos-workspace--dragging": "draggingPane() !== null" }, classAttribute: "pos-workspace" }, providers: [{ provide: POS_WORKSPACE, useExisting: forwardRef(() => PosWorkspace) }], queries: [{ propertyName: "paneRefs", predicate: PosWorkspacePane, isSignal: true }], viewQueries: [{ propertyName: "frameRef", first: true, predicate: ["frame"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (editing()) {\r\n <div class=\"pos-workspace__tools\">\r\n <div class=\"pos-workspace__palette\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-toggle\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-expanded]=\"paletteOpen()\"\r\n (click)=\"togglePalette()\"\r\n >\r\n Components\r\n </button>\r\n @if (paletteOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-backdrop\"\r\n tabindex=\"-1\"\r\n aria-label=\"Close components\"\r\n (click)=\"closePalette()\"\r\n ></button>\r\n <div\r\n class=\"pos-workspace__palette-menu\"\r\n [class.pos-workspace__palette-menu--lifted]=\"paletteMenuLifted()\"\r\n role=\"menu\"\r\n aria-label=\"Components\"\r\n (keydown)=\"onPaletteMenuKeydown($event)\"\r\n >\r\n @for (id of palette(); track id) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n [attr.data-palette]=\"id\"\r\n (pointerdown)=\"onPalettePointerDown(id, $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick(id)\"\r\n >\r\n {{ paneLabel(id) }}\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n data-palette=\"empty\"\r\n (pointerdown)=\"onPalettePointerDown('empty', $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick('empty')\"\r\n >\r\n Custom container\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"pos-workspace__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__undo\"\r\n [disabled]=\"!canUndo()\"\r\n (click)=\"undoLayout()\"\r\n >\r\n Undo\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__new\" (click)=\"resetLayout()\">New</button>\r\n <button type=\"button\" class=\"pos-workspace__default\" (click)=\"applyDefaultLayout()\">\r\n Default layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__import\" (click)=\"layoutFile.click()\">\r\n Import layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__export\" (click)=\"exportLayout()\">\r\n Export layout\r\n </button>\r\n <input\r\n #layoutFile\r\n class=\"pos-workspace__file\"\r\n type=\"file\"\r\n accept=\"application/json,.json\"\r\n aria-label=\"Import layout file\"\r\n (change)=\"importLayoutFile($event)\"\r\n />\r\n </div>\r\n </div>\r\n}\r\n\r\n<div\r\n #frame\r\n class=\"pos-workspace__grid\"\r\n [style.grid-template-columns]=\"grid().columns\"\r\n [style.grid-template-rows]=\"grid().rows\"\r\n>\r\n <ng-content />\r\n @for (slot of emptySlots(); track slot) {\r\n <pos-workspace-pane [paneId]=\"slot\" [placeholder]=\"true\" />\r\n }\r\n @if (showSplitter()) {\r\n <div\r\n class=\"pos-workspace__splitter\"\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n aria-label=\"Resize columns\"\r\n aria-valuemin=\"28\"\r\n aria-valuemax=\"72\"\r\n [attr.aria-valuenow]=\"ratioPercent()\"\r\n tabindex=\"0\"\r\n [style.grid-row]=\"splitterRow()\"\r\n [style.left]=\"splitterLeft()\"\r\n (pointerdown)=\"onSplitterDown($event)\"\r\n (pointermove)=\"onSplitterMove($event)\"\r\n (pointerup)=\"onSplitterUp()\"\r\n (pointercancel)=\"onSplitterUp()\"\r\n (keydown)=\"onSplitterKeydown($event)\"\r\n ></div>\r\n }\r\n</div>\r\n\r\n@for (hint of dropHints(); track hint.kind) {\r\n <div\r\n class=\"pos-workspace__hint\"\r\n [class.pos-workspace__hint--top]=\"hint.kind === 'top'\"\r\n [class.pos-workspace__hint--bottom]=\"hint.kind === 'bottom'\"\r\n [class.pos-workspace__hint--dock]=\"hint.kind === 'dock'\"\r\n [style.top.px]=\"hint.top\"\r\n [style.left.px]=\"hint.left\"\r\n [style.width.px]=\"hint.width\"\r\n [style.height.px]=\"hint.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n@if (dropIndicator(); as indicator) {\r\n <div\r\n class=\"pos-workspace__drop\"\r\n [class.pos-workspace__drop--line]=\"indicator.line\"\r\n [style.top.px]=\"indicator.top\"\r\n [style.left.px]=\"indicator.left\"\r\n [style.width.px]=\"indicator.width\"\r\n [style.height.px]=\"indicator.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n<div class=\"pos-workspace__status\" aria-live=\"polite\">{{ status() }}</div>\r\n", styles: [":host{display:flex;position:relative;flex-direction:column;box-sizing:border-box;height:100%;min-height:0;color:var(--pos-color-text);font-family:var(--pos-font-family)}.pos-workspace__tools{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--pos-space-sm);padding:var(--pos-space-sm) var(--pos-space-lg) 0}.pos-workspace__palette{position:relative}.pos-workspace__palette-toggle{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-lg);border:1px dashed var(--pos-color-primary);border-radius:var(--pos-radius-md);background:var(--pos-color-surface);color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);cursor:pointer}.pos-workspace__palette-backdrop{position:fixed;z-index:5;inset:0;padding:0;border:0;background:transparent}.pos-workspace__palette-menu{position:absolute;z-index:6;top:calc(100% + var(--pos-space-xs));left:0;display:flex;flex-direction:column;min-width:14rem;max-height:min(20rem,70vh);overflow:auto;padding:var(--pos-space-xs);border:1px solid var(--pos-color-border);border-radius:var(--pos-radius-md);background:var(--pos-color-surface)}.pos-workspace__palette-menu--lifted{visibility:hidden}.pos-workspace__palette-item{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-md);border:0;border-radius:var(--pos-radius-sm);background:transparent;color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);text-align:left;cursor:grab;touch-action:none}.pos-workspace__palette-item:hover{background:color-mix(in srgb,var(--pos-color-primary) 12%,var(--pos-color-surface))}.pos-workspace__palette-toggle:focus-visible,.pos-workspace__palette-item:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}.pos-workspace__actions{display:flex;flex-wrap:wrap;gap:var(--pos-space-sm)}.pos-workspace__undo,.pos-workspace__new,.pos-workspace__default,.pos-workspace__export,.pos-workspace__import{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-lg);border:1px solid var(--pos-color-key-border);border-radius:var(--pos-radius-md);background:var(--pos-color-key);color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);cursor:pointer}.pos-workspace__file{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.pos-workspace__undo:disabled{background:var(--pos-color-disabled);color:var(--pos-color-on-disabled);cursor:default}.pos-workspace__undo:focus-visible,.pos-workspace__new:focus-visible,.pos-workspace__default:focus-visible,.pos-workspace__export:focus-visible,.pos-workspace__import:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}:host(.pos-workspace--dragging){cursor:grabbing;-webkit-user-select:none;user-select:none}.pos-workspace__grid{display:grid;position:relative;flex:1 1 auto;box-sizing:border-box;min-height:0;padding:var(--pos-space-lg);gap:var(--pos-space-md)}.pos-workspace__hint{position:absolute;z-index:2;box-sizing:border-box;border:2px dashed color-mix(in srgb,var(--pos-color-primary) 55%,transparent);border-radius:var(--pos-radius-md);background:color-mix(in srgb,var(--pos-color-primary) 8%,transparent);pointer-events:none}.pos-workspace__drop{position:absolute;z-index:3;box-sizing:border-box;border:2px dashed var(--pos-color-primary);border-radius:var(--pos-radius-md);background:color-mix(in srgb,var(--pos-color-primary) 24%,transparent);pointer-events:none}.pos-workspace__drop--line{border:0;border-radius:var(--pos-radius-pill);background:var(--pos-color-primary)}.pos-workspace__splitter{position:absolute;z-index:4;top:0;bottom:0;grid-column:1/-1;width:var(--pos-space-xl);padding:0;border:0;background:transparent;cursor:ew-resize;touch-action:none;transform:translate(-50%)}.pos-workspace__splitter:before{content:\"\";position:absolute;top:0;bottom:0;left:50%;width:var(--pos-space-xs);border-radius:var(--pos-radius-pill);background:var(--pos-color-primary);transform:translate(-50%)}.pos-workspace__splitter:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}.pos-workspace__status{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "component", type: PosWorkspacePane, selector: "pos-workspace-pane", inputs: ["paneId", "placeholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2068
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: PosWorkspace, isStandalone: true, selector: "pos-workspace", inputs: { editing: { classPropertyName: "editing", publicName: "editing", isSignal: true, isRequired: false, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { layoutChange: "layoutChange", layoutExport: "layoutExport" }, host: { properties: { "class.pos-workspace--editing": "editing()", "class.pos-workspace--dragging": "draggingPane() !== null" }, classAttribute: "pos-workspace" }, providers: [{ provide: POS_WORKSPACE, useExisting: forwardRef(() => PosWorkspace) }], queries: [{ propertyName: "paneRefs", predicate: PosWorkspacePane, isSignal: true }], viewQueries: [{ propertyName: "frameRef", first: true, predicate: ["frame"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (editing()) {\r\n <div class=\"pos-workspace__tools\">\r\n <div class=\"pos-workspace__palette\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-toggle\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-expanded]=\"paletteOpen()\"\r\n (click)=\"togglePalette()\"\r\n >\r\n Components\r\n </button>\r\n @if (paletteOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-backdrop\"\r\n tabindex=\"-1\"\r\n aria-label=\"Close components\"\r\n (click)=\"closePalette()\"\r\n ></button>\r\n <div\r\n class=\"pos-workspace__palette-menu\"\r\n [class.pos-workspace__palette-menu--lifted]=\"paletteMenuLifted()\"\r\n role=\"menu\"\r\n tabindex=\"-1\"\r\n aria-label=\"Components\"\r\n (keydown)=\"onPaletteMenuKeydown($event)\"\r\n >\r\n @for (id of palette(); track id) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n [attr.data-palette]=\"id\"\r\n (pointerdown)=\"onPalettePointerDown(id, $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick(id)\"\r\n >\r\n {{ paneLabel(id) }}\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n data-palette=\"empty\"\r\n (pointerdown)=\"onPalettePointerDown('empty', $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick('empty')\"\r\n >\r\n Custom container\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"pos-workspace__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__undo\"\r\n [disabled]=\"!canUndo()\"\r\n (click)=\"undoLayout()\"\r\n >\r\n Undo\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__new\" (click)=\"resetLayout()\">New</button>\r\n <button type=\"button\" class=\"pos-workspace__default\" (click)=\"applyDefaultLayout()\">\r\n Default layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__import\" (click)=\"layoutFile.click()\">\r\n Import layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__export\" (click)=\"exportLayout()\">\r\n Export layout\r\n </button>\r\n <input\r\n #layoutFile\r\n class=\"pos-workspace__file\"\r\n type=\"file\"\r\n accept=\"application/json,.json\"\r\n aria-label=\"Import layout file\"\r\n (change)=\"importLayoutFile($event)\"\r\n />\r\n </div>\r\n </div>\r\n}\r\n\r\n<div\r\n #frame\r\n class=\"pos-workspace__grid\"\r\n [style.grid-template-columns]=\"grid().columns\"\r\n [style.grid-template-rows]=\"grid().rows\"\r\n>\r\n <ng-content />\r\n @for (slot of emptySlots(); track slot) {\r\n <pos-workspace-pane [paneId]=\"slot\" [placeholder]=\"true\" />\r\n }\r\n @if (showSplitter()) {\r\n <div\r\n class=\"pos-workspace__splitter\"\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n aria-label=\"Resize columns\"\r\n aria-valuemin=\"28\"\r\n aria-valuemax=\"72\"\r\n [attr.aria-valuenow]=\"ratioPercent()\"\r\n tabindex=\"0\"\r\n [style.grid-row]=\"splitterRow()\"\r\n [style.left]=\"splitterLeft()\"\r\n (pointerdown)=\"onSplitterDown($event)\"\r\n (pointermove)=\"onSplitterMove($event)\"\r\n (pointerup)=\"onSplitterUp()\"\r\n (pointercancel)=\"onSplitterUp()\"\r\n (keydown)=\"onSplitterKeydown($event)\"\r\n ></div>\r\n }\r\n</div>\r\n\r\n@for (hint of dropHints(); track hint.kind) {\r\n <div\r\n class=\"pos-workspace__hint\"\r\n [class.pos-workspace__hint--top]=\"hint.kind === 'top'\"\r\n [class.pos-workspace__hint--bottom]=\"hint.kind === 'bottom'\"\r\n [class.pos-workspace__hint--dock]=\"hint.kind === 'dock'\"\r\n [style.top.px]=\"hint.top\"\r\n [style.left.px]=\"hint.left\"\r\n [style.width.px]=\"hint.width\"\r\n [style.height.px]=\"hint.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n@if (dropIndicator(); as indicator) {\r\n <div\r\n class=\"pos-workspace__drop\"\r\n [class.pos-workspace__drop--line]=\"indicator.line\"\r\n [style.top.px]=\"indicator.top\"\r\n [style.left.px]=\"indicator.left\"\r\n [style.width.px]=\"indicator.width\"\r\n [style.height.px]=\"indicator.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n<div class=\"pos-workspace__status\" aria-live=\"polite\">{{ status() }}</div>\r\n", styles: [":host{display:flex;position:relative;flex-direction:column;box-sizing:border-box;height:100%;min-height:0;color:var(--pos-color-text);font-family:var(--pos-font-family)}.pos-workspace__tools{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--pos-space-sm);padding:var(--pos-space-sm) var(--pos-space-lg) 0}.pos-workspace__palette{position:relative}.pos-workspace__palette-toggle{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-lg);border:1px dashed var(--pos-color-primary);border-radius:var(--pos-radius-md);background:var(--pos-color-surface);color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);cursor:pointer}.pos-workspace__palette-backdrop{position:fixed;z-index:5;inset:0;padding:0;border:0;background:transparent}.pos-workspace__palette-menu{position:absolute;z-index:6;top:calc(100% + var(--pos-space-xs));left:0;display:flex;flex-direction:column;min-width:14rem;max-height:min(20rem,70vh);overflow:auto;padding:var(--pos-space-xs);border:1px solid var(--pos-color-border);border-radius:var(--pos-radius-md);background:var(--pos-color-surface)}.pos-workspace__palette-menu--lifted{visibility:hidden}.pos-workspace__palette-item{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-md);border:0;border-radius:var(--pos-radius-sm);background:transparent;color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);text-align:left;cursor:grab;touch-action:none}.pos-workspace__palette-item:hover{background:color-mix(in srgb,var(--pos-color-primary) 12%,var(--pos-color-surface))}.pos-workspace__palette-toggle:focus-visible,.pos-workspace__palette-item:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}.pos-workspace__actions{display:flex;flex-wrap:wrap;gap:var(--pos-space-sm)}.pos-workspace__undo,.pos-workspace__new,.pos-workspace__default,.pos-workspace__export,.pos-workspace__import{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-lg);border:1px solid var(--pos-color-key-border);border-radius:var(--pos-radius-md);background:var(--pos-color-key);color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);cursor:pointer}.pos-workspace__file{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.pos-workspace__undo:disabled{background:var(--pos-color-disabled);color:var(--pos-color-on-disabled);cursor:default}.pos-workspace__undo:focus-visible,.pos-workspace__new:focus-visible,.pos-workspace__default:focus-visible,.pos-workspace__export:focus-visible,.pos-workspace__import:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}:host(.pos-workspace--dragging){cursor:grabbing;-webkit-user-select:none;user-select:none}.pos-workspace__grid{display:grid;position:relative;flex:1 1 auto;box-sizing:border-box;min-height:0;padding:var(--pos-space-lg);gap:var(--pos-space-md)}.pos-workspace__hint{position:absolute;z-index:2;box-sizing:border-box;border:2px dashed color-mix(in srgb,var(--pos-color-primary) 55%,transparent);border-radius:var(--pos-radius-md);background:color-mix(in srgb,var(--pos-color-primary) 8%,transparent);pointer-events:none}.pos-workspace__drop{position:absolute;z-index:3;box-sizing:border-box;border:2px dashed var(--pos-color-primary);border-radius:var(--pos-radius-md);background:color-mix(in srgb,var(--pos-color-primary) 24%,transparent);pointer-events:none}.pos-workspace__drop--line{border:0;border-radius:var(--pos-radius-pill);background:var(--pos-color-primary)}.pos-workspace__splitter{position:absolute;z-index:4;top:0;bottom:0;grid-column:1/-1;width:var(--pos-space-xl);padding:0;border:0;background:transparent;cursor:ew-resize;touch-action:none;transform:translate(-50%)}.pos-workspace__splitter:before{content:\"\";position:absolute;top:0;bottom:0;left:50%;width:var(--pos-space-xs);border-radius:var(--pos-radius-pill);background:var(--pos-color-primary);transform:translate(-50%)}.pos-workspace__splitter:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}.pos-workspace__status{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "component", type: PosWorkspacePane, selector: "pos-workspace-pane", inputs: ["paneId", "placeholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2066
2069
  }
2067
2070
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: PosWorkspace, decorators: [{
2068
2071
  type: Component,
@@ -2070,7 +2073,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
2070
2073
  class: 'pos-workspace',
2071
2074
  '[class.pos-workspace--editing]': 'editing()',
2072
2075
  '[class.pos-workspace--dragging]': 'draggingPane() !== null',
2073
- }, template: "@if (editing()) {\r\n <div class=\"pos-workspace__tools\">\r\n <div class=\"pos-workspace__palette\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-toggle\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-expanded]=\"paletteOpen()\"\r\n (click)=\"togglePalette()\"\r\n >\r\n Components\r\n </button>\r\n @if (paletteOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-backdrop\"\r\n tabindex=\"-1\"\r\n aria-label=\"Close components\"\r\n (click)=\"closePalette()\"\r\n ></button>\r\n <div\r\n class=\"pos-workspace__palette-menu\"\r\n [class.pos-workspace__palette-menu--lifted]=\"paletteMenuLifted()\"\r\n role=\"menu\"\r\n aria-label=\"Components\"\r\n (keydown)=\"onPaletteMenuKeydown($event)\"\r\n >\r\n @for (id of palette(); track id) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n [attr.data-palette]=\"id\"\r\n (pointerdown)=\"onPalettePointerDown(id, $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick(id)\"\r\n >\r\n {{ paneLabel(id) }}\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n data-palette=\"empty\"\r\n (pointerdown)=\"onPalettePointerDown('empty', $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick('empty')\"\r\n >\r\n Custom container\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"pos-workspace__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__undo\"\r\n [disabled]=\"!canUndo()\"\r\n (click)=\"undoLayout()\"\r\n >\r\n Undo\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__new\" (click)=\"resetLayout()\">New</button>\r\n <button type=\"button\" class=\"pos-workspace__default\" (click)=\"applyDefaultLayout()\">\r\n Default layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__import\" (click)=\"layoutFile.click()\">\r\n Import layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__export\" (click)=\"exportLayout()\">\r\n Export layout\r\n </button>\r\n <input\r\n #layoutFile\r\n class=\"pos-workspace__file\"\r\n type=\"file\"\r\n accept=\"application/json,.json\"\r\n aria-label=\"Import layout file\"\r\n (change)=\"importLayoutFile($event)\"\r\n />\r\n </div>\r\n </div>\r\n}\r\n\r\n<div\r\n #frame\r\n class=\"pos-workspace__grid\"\r\n [style.grid-template-columns]=\"grid().columns\"\r\n [style.grid-template-rows]=\"grid().rows\"\r\n>\r\n <ng-content />\r\n @for (slot of emptySlots(); track slot) {\r\n <pos-workspace-pane [paneId]=\"slot\" [placeholder]=\"true\" />\r\n }\r\n @if (showSplitter()) {\r\n <div\r\n class=\"pos-workspace__splitter\"\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n aria-label=\"Resize columns\"\r\n aria-valuemin=\"28\"\r\n aria-valuemax=\"72\"\r\n [attr.aria-valuenow]=\"ratioPercent()\"\r\n tabindex=\"0\"\r\n [style.grid-row]=\"splitterRow()\"\r\n [style.left]=\"splitterLeft()\"\r\n (pointerdown)=\"onSplitterDown($event)\"\r\n (pointermove)=\"onSplitterMove($event)\"\r\n (pointerup)=\"onSplitterUp()\"\r\n (pointercancel)=\"onSplitterUp()\"\r\n (keydown)=\"onSplitterKeydown($event)\"\r\n ></div>\r\n }\r\n</div>\r\n\r\n@for (hint of dropHints(); track hint.kind) {\r\n <div\r\n class=\"pos-workspace__hint\"\r\n [class.pos-workspace__hint--top]=\"hint.kind === 'top'\"\r\n [class.pos-workspace__hint--bottom]=\"hint.kind === 'bottom'\"\r\n [class.pos-workspace__hint--dock]=\"hint.kind === 'dock'\"\r\n [style.top.px]=\"hint.top\"\r\n [style.left.px]=\"hint.left\"\r\n [style.width.px]=\"hint.width\"\r\n [style.height.px]=\"hint.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n@if (dropIndicator(); as indicator) {\r\n <div\r\n class=\"pos-workspace__drop\"\r\n [class.pos-workspace__drop--line]=\"indicator.line\"\r\n [style.top.px]=\"indicator.top\"\r\n [style.left.px]=\"indicator.left\"\r\n [style.width.px]=\"indicator.width\"\r\n [style.height.px]=\"indicator.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n<div class=\"pos-workspace__status\" aria-live=\"polite\">{{ status() }}</div>\r\n", styles: [":host{display:flex;position:relative;flex-direction:column;box-sizing:border-box;height:100%;min-height:0;color:var(--pos-color-text);font-family:var(--pos-font-family)}.pos-workspace__tools{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--pos-space-sm);padding:var(--pos-space-sm) var(--pos-space-lg) 0}.pos-workspace__palette{position:relative}.pos-workspace__palette-toggle{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-lg);border:1px dashed var(--pos-color-primary);border-radius:var(--pos-radius-md);background:var(--pos-color-surface);color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);cursor:pointer}.pos-workspace__palette-backdrop{position:fixed;z-index:5;inset:0;padding:0;border:0;background:transparent}.pos-workspace__palette-menu{position:absolute;z-index:6;top:calc(100% + var(--pos-space-xs));left:0;display:flex;flex-direction:column;min-width:14rem;max-height:min(20rem,70vh);overflow:auto;padding:var(--pos-space-xs);border:1px solid var(--pos-color-border);border-radius:var(--pos-radius-md);background:var(--pos-color-surface)}.pos-workspace__palette-menu--lifted{visibility:hidden}.pos-workspace__palette-item{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-md);border:0;border-radius:var(--pos-radius-sm);background:transparent;color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);text-align:left;cursor:grab;touch-action:none}.pos-workspace__palette-item:hover{background:color-mix(in srgb,var(--pos-color-primary) 12%,var(--pos-color-surface))}.pos-workspace__palette-toggle:focus-visible,.pos-workspace__palette-item:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}.pos-workspace__actions{display:flex;flex-wrap:wrap;gap:var(--pos-space-sm)}.pos-workspace__undo,.pos-workspace__new,.pos-workspace__default,.pos-workspace__export,.pos-workspace__import{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-lg);border:1px solid var(--pos-color-key-border);border-radius:var(--pos-radius-md);background:var(--pos-color-key);color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);cursor:pointer}.pos-workspace__file{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.pos-workspace__undo:disabled{background:var(--pos-color-disabled);color:var(--pos-color-on-disabled);cursor:default}.pos-workspace__undo:focus-visible,.pos-workspace__new:focus-visible,.pos-workspace__default:focus-visible,.pos-workspace__export:focus-visible,.pos-workspace__import:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}:host(.pos-workspace--dragging){cursor:grabbing;-webkit-user-select:none;user-select:none}.pos-workspace__grid{display:grid;position:relative;flex:1 1 auto;box-sizing:border-box;min-height:0;padding:var(--pos-space-lg);gap:var(--pos-space-md)}.pos-workspace__hint{position:absolute;z-index:2;box-sizing:border-box;border:2px dashed color-mix(in srgb,var(--pos-color-primary) 55%,transparent);border-radius:var(--pos-radius-md);background:color-mix(in srgb,var(--pos-color-primary) 8%,transparent);pointer-events:none}.pos-workspace__drop{position:absolute;z-index:3;box-sizing:border-box;border:2px dashed var(--pos-color-primary);border-radius:var(--pos-radius-md);background:color-mix(in srgb,var(--pos-color-primary) 24%,transparent);pointer-events:none}.pos-workspace__drop--line{border:0;border-radius:var(--pos-radius-pill);background:var(--pos-color-primary)}.pos-workspace__splitter{position:absolute;z-index:4;top:0;bottom:0;grid-column:1/-1;width:var(--pos-space-xl);padding:0;border:0;background:transparent;cursor:ew-resize;touch-action:none;transform:translate(-50%)}.pos-workspace__splitter:before{content:\"\";position:absolute;top:0;bottom:0;left:50%;width:var(--pos-space-xs);border-radius:var(--pos-radius-pill);background:var(--pos-color-primary);transform:translate(-50%)}.pos-workspace__splitter:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}.pos-workspace__status{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"] }]
2076
+ }, template: "@if (editing()) {\r\n <div class=\"pos-workspace__tools\">\r\n <div class=\"pos-workspace__palette\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-toggle\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-expanded]=\"paletteOpen()\"\r\n (click)=\"togglePalette()\"\r\n >\r\n Components\r\n </button>\r\n @if (paletteOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-backdrop\"\r\n tabindex=\"-1\"\r\n aria-label=\"Close components\"\r\n (click)=\"closePalette()\"\r\n ></button>\r\n <div\r\n class=\"pos-workspace__palette-menu\"\r\n [class.pos-workspace__palette-menu--lifted]=\"paletteMenuLifted()\"\r\n role=\"menu\"\r\n tabindex=\"-1\"\r\n aria-label=\"Components\"\r\n (keydown)=\"onPaletteMenuKeydown($event)\"\r\n >\r\n @for (id of palette(); track id) {\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n [attr.data-palette]=\"id\"\r\n (pointerdown)=\"onPalettePointerDown(id, $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick(id)\"\r\n >\r\n {{ paneLabel(id) }}\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__palette-item\"\r\n role=\"menuitem\"\r\n data-palette=\"empty\"\r\n (pointerdown)=\"onPalettePointerDown('empty', $event)\"\r\n (pointermove)=\"onPalettePointerMove($event)\"\r\n (pointerup)=\"onPalettePointerUp($event)\"\r\n (pointercancel)=\"onPalettePointerCancel()\"\r\n (click)=\"onPaletteClick('empty')\"\r\n >\r\n Custom container\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"pos-workspace__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"pos-workspace__undo\"\r\n [disabled]=\"!canUndo()\"\r\n (click)=\"undoLayout()\"\r\n >\r\n Undo\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__new\" (click)=\"resetLayout()\">New</button>\r\n <button type=\"button\" class=\"pos-workspace__default\" (click)=\"applyDefaultLayout()\">\r\n Default layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__import\" (click)=\"layoutFile.click()\">\r\n Import layout\r\n </button>\r\n <button type=\"button\" class=\"pos-workspace__export\" (click)=\"exportLayout()\">\r\n Export layout\r\n </button>\r\n <input\r\n #layoutFile\r\n class=\"pos-workspace__file\"\r\n type=\"file\"\r\n accept=\"application/json,.json\"\r\n aria-label=\"Import layout file\"\r\n (change)=\"importLayoutFile($event)\"\r\n />\r\n </div>\r\n </div>\r\n}\r\n\r\n<div\r\n #frame\r\n class=\"pos-workspace__grid\"\r\n [style.grid-template-columns]=\"grid().columns\"\r\n [style.grid-template-rows]=\"grid().rows\"\r\n>\r\n <ng-content />\r\n @for (slot of emptySlots(); track slot) {\r\n <pos-workspace-pane [paneId]=\"slot\" [placeholder]=\"true\" />\r\n }\r\n @if (showSplitter()) {\r\n <div\r\n class=\"pos-workspace__splitter\"\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n aria-label=\"Resize columns\"\r\n aria-valuemin=\"28\"\r\n aria-valuemax=\"72\"\r\n [attr.aria-valuenow]=\"ratioPercent()\"\r\n tabindex=\"0\"\r\n [style.grid-row]=\"splitterRow()\"\r\n [style.left]=\"splitterLeft()\"\r\n (pointerdown)=\"onSplitterDown($event)\"\r\n (pointermove)=\"onSplitterMove($event)\"\r\n (pointerup)=\"onSplitterUp()\"\r\n (pointercancel)=\"onSplitterUp()\"\r\n (keydown)=\"onSplitterKeydown($event)\"\r\n ></div>\r\n }\r\n</div>\r\n\r\n@for (hint of dropHints(); track hint.kind) {\r\n <div\r\n class=\"pos-workspace__hint\"\r\n [class.pos-workspace__hint--top]=\"hint.kind === 'top'\"\r\n [class.pos-workspace__hint--bottom]=\"hint.kind === 'bottom'\"\r\n [class.pos-workspace__hint--dock]=\"hint.kind === 'dock'\"\r\n [style.top.px]=\"hint.top\"\r\n [style.left.px]=\"hint.left\"\r\n [style.width.px]=\"hint.width\"\r\n [style.height.px]=\"hint.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n@if (dropIndicator(); as indicator) {\r\n <div\r\n class=\"pos-workspace__drop\"\r\n [class.pos-workspace__drop--line]=\"indicator.line\"\r\n [style.top.px]=\"indicator.top\"\r\n [style.left.px]=\"indicator.left\"\r\n [style.width.px]=\"indicator.width\"\r\n [style.height.px]=\"indicator.height\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n}\r\n\r\n<div class=\"pos-workspace__status\" aria-live=\"polite\">{{ status() }}</div>\r\n", styles: [":host{display:flex;position:relative;flex-direction:column;box-sizing:border-box;height:100%;min-height:0;color:var(--pos-color-text);font-family:var(--pos-font-family)}.pos-workspace__tools{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--pos-space-sm);padding:var(--pos-space-sm) var(--pos-space-lg) 0}.pos-workspace__palette{position:relative}.pos-workspace__palette-toggle{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-lg);border:1px dashed var(--pos-color-primary);border-radius:var(--pos-radius-md);background:var(--pos-color-surface);color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);cursor:pointer}.pos-workspace__palette-backdrop{position:fixed;z-index:5;inset:0;padding:0;border:0;background:transparent}.pos-workspace__palette-menu{position:absolute;z-index:6;top:calc(100% + var(--pos-space-xs));left:0;display:flex;flex-direction:column;min-width:14rem;max-height:min(20rem,70vh);overflow:auto;padding:var(--pos-space-xs);border:1px solid var(--pos-color-border);border-radius:var(--pos-radius-md);background:var(--pos-color-surface)}.pos-workspace__palette-menu--lifted{visibility:hidden}.pos-workspace__palette-item{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-md);border:0;border-radius:var(--pos-radius-sm);background:transparent;color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);text-align:left;cursor:grab;touch-action:none}.pos-workspace__palette-item:hover{background:color-mix(in srgb,var(--pos-color-primary) 12%,var(--pos-color-surface))}.pos-workspace__palette-toggle:focus-visible,.pos-workspace__palette-item:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}.pos-workspace__actions{display:flex;flex-wrap:wrap;gap:var(--pos-space-sm)}.pos-workspace__undo,.pos-workspace__new,.pos-workspace__default,.pos-workspace__export,.pos-workspace__import{min-height:var(--pos-button-min-height);padding:0 var(--pos-space-lg);border:1px solid var(--pos-color-key-border);border-radius:var(--pos-radius-md);background:var(--pos-color-key);color:var(--pos-color-text);font:inherit;font-size:var(--pos-font-size-md);cursor:pointer}.pos-workspace__file{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.pos-workspace__undo:disabled{background:var(--pos-color-disabled);color:var(--pos-color-on-disabled);cursor:default}.pos-workspace__undo:focus-visible,.pos-workspace__new:focus-visible,.pos-workspace__default:focus-visible,.pos-workspace__export:focus-visible,.pos-workspace__import:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}:host(.pos-workspace--dragging){cursor:grabbing;-webkit-user-select:none;user-select:none}.pos-workspace__grid{display:grid;position:relative;flex:1 1 auto;box-sizing:border-box;min-height:0;padding:var(--pos-space-lg);gap:var(--pos-space-md)}.pos-workspace__hint{position:absolute;z-index:2;box-sizing:border-box;border:2px dashed color-mix(in srgb,var(--pos-color-primary) 55%,transparent);border-radius:var(--pos-radius-md);background:color-mix(in srgb,var(--pos-color-primary) 8%,transparent);pointer-events:none}.pos-workspace__drop{position:absolute;z-index:3;box-sizing:border-box;border:2px dashed var(--pos-color-primary);border-radius:var(--pos-radius-md);background:color-mix(in srgb,var(--pos-color-primary) 24%,transparent);pointer-events:none}.pos-workspace__drop--line{border:0;border-radius:var(--pos-radius-pill);background:var(--pos-color-primary)}.pos-workspace__splitter{position:absolute;z-index:4;top:0;bottom:0;grid-column:1/-1;width:var(--pos-space-xl);padding:0;border:0;background:transparent;cursor:ew-resize;touch-action:none;transform:translate(-50%)}.pos-workspace__splitter:before{content:\"\";position:absolute;top:0;bottom:0;left:50%;width:var(--pos-space-xs);border-radius:var(--pos-radius-pill);background:var(--pos-color-primary);transform:translate(-50%)}.pos-workspace__splitter:focus-visible{outline:2px solid var(--pos-color-ink);outline-offset:2px}.pos-workspace__status{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"] }]
2074
2077
  }], ctorParameters: () => [], propDecorators: { paneRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => PosWorkspacePane), { isSignal: true }] }], frameRef: [{ type: i0.ViewChild, args: ['frame', { isSignal: true }] }], editing: [{ type: i0.Input, args: [{ isSignal: true, alias: "editing", required: false }] }], layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: false }] }], layoutChange: [{ type: i0.Output, args: ["layoutChange"] }], layoutExport: [{ type: i0.Output, args: ["layoutExport"] }] } });
2075
2078
 
2076
2079
  const COIN_AMOUNTS = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2];