@selimssevgi/cube-design-angular 0.7.0 → 0.8.0

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,9 +1,9 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import { ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, ErrorHandler, Injectable, InjectionToken, Injector, PLATFORM_ID, Renderer2, TemplateRef, afterNextRender, computed, contentChild, effect, inject, input, output, runInInjectionContext, signal, untracked, viewChild } from "@angular/core";
3
3
  import { NgTemplateOutlet, isPlatformBrowser } from "@angular/common";
4
+ import { NavigationEnd, NavigationStart, Router } from "@angular/router";
5
+ import { Subject, catchError, map, of, tap } from "rxjs";
4
6
  import { HttpClient, HttpErrorResponse } from "@angular/common/http";
5
- import { catchError, map, of, tap } from "rxjs";
6
- import { Router } from "@angular/router";
7
7
  function sizeFor(count) {
8
8
  let s = 1;
9
9
  while (s * s * s < count && s < 7) s++;
@@ -938,13 +938,24 @@ const CUBE_WHEEL_QUIET_MS = 250;
938
938
  function startsWheelGesture(lastAt, now, quietMs = 250) {
939
939
  return now - lastAt >= quietMs;
940
940
  }
941
+ const CUBE_WHEEL_STEP = 2;
942
+ function wheelWay(deltaY, sum, least = 2) {
943
+ const by = Math.abs(deltaY) >= least ? deltaY : Math.abs(sum) >= 3 * least ? sum : 0;
944
+ return by < 0 ? "in" : by > 0 ? "out" : null;
945
+ }
941
946
  const stream = {
942
947
  wheelAt: -Infinity,
943
948
  gestureAt: -Infinity,
944
949
  heard: null,
945
950
  heardAfter: -Infinity,
946
- ownedUntil: -Infinity
951
+ ownedUntil: -Infinity,
952
+ sum: 0,
953
+ decided: false
947
954
  };
955
+ function begin() {
956
+ stream.sum = 0;
957
+ stream.decided = false;
958
+ }
948
959
  let listening = false;
949
960
  function listenToThePage(quietMs) {
950
961
  const w = globalThis.window;
@@ -956,6 +967,7 @@ function listenToThePage(quietMs) {
956
967
  stream.heard = e;
957
968
  stream.heardAfter = stream.wheelAt;
958
969
  stream.wheelAt = now;
970
+ if (now - stream.heardAfter >= quietMs) begin();
959
971
  if (now - stream.heardAfter < quietMs && now < stream.ownedUntil + quietMs) {
960
972
  stream.ownedUntil = now;
961
973
  e.preventDefault();
@@ -1019,12 +1031,15 @@ var CubePinch = class CubePinch {
1019
1031
  if (this.cubePinchDisabled() || !e.ctrlKey) return;
1020
1032
  e.preventDefault();
1021
1033
  const now = performance.now();
1022
- const starts = startsWheelGesture(stream.heard === e ? stream.heardAfter : stream.wheelAt, now, this.cubePinchQuietMs());
1034
+ if (startsWheelGesture(stream.heard === e ? stream.heardAfter : stream.wheelAt, now, this.cubePinchQuietMs())) begin();
1023
1035
  stream.wheelAt = now;
1024
1036
  stream.ownedUntil = now;
1025
- if (!starts || e.deltaY === 0) return;
1026
- if (e.deltaY < 0) this.emit("in", pointAt(e.clientX, e.clientY), "wheel", e);
1027
- else this.emit("out", pointAt(e.clientX, e.clientY), "wheel", e);
1037
+ if (stream.decided) return;
1038
+ stream.sum += e.deltaY;
1039
+ const way = wheelWay(e.deltaY, stream.sum);
1040
+ if (!way) return;
1041
+ stream.decided = true;
1042
+ this.emit(way, pointAt(e.clientX, e.clientY), "wheel", e);
1028
1043
  }
1029
1044
  gestureStart(e) {
1030
1045
  if (this.cubePinchDisabled()) return;
@@ -2449,6 +2464,20 @@ function squareLayout(view, count, room, opts = {}) {
2449
2464
  open: cols * rows - n
2450
2465
  };
2451
2466
  }
2467
+ function squareCell(width, across) {
2468
+ const k = Math.max(1, Math.floor(across));
2469
+ return width > 0 ? (width - squareGap(k) * (k - 1)) / k : 0;
2470
+ }
2471
+ function squareSideAt(view, count, cell, opts = {}) {
2472
+ const l = squareLayout(view, count, {
2473
+ width: 1e6,
2474
+ tall: 1e6
2475
+ }, {
2476
+ least: opts.least ?? 0,
2477
+ maxSide: 1e6
2478
+ });
2479
+ return Math.floor(l.cols * cell + l.gap * (l.cols - 1));
2480
+ }
2452
2481
  var CubeSquareTile = class CubeSquareTile {
2453
2482
  template = inject(TemplateRef);
2454
2483
  cubeSquareTile = input(...ngDevMode ? [void 0, { debugName: "cubeSquareTile" }] : /* istanbul ignore next */ []);
@@ -2535,6 +2564,7 @@ var CubeSquare = class CubeSquare {
2535
2564
  tiles = input.required(...ngDevMode ? [{ debugName: "tiles" }] : /* istanbul ignore next */ []);
2536
2565
  view = input("square", ...ngDevMode ? [{ debugName: "view" }] : /* istanbul ignore next */ []);
2537
2566
  maxSide = input(880, ...ngDevMode ? [{ debugName: "maxSide" }] : /* istanbul ignore next */ []);
2567
+ cell = input(null, ...ngDevMode ? [{ debugName: "cell" }] : /* istanbul ignore next */ []);
2538
2568
  align = input("center", ...ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []);
2539
2569
  listRow = input(76, ...ngDevMode ? [{ debugName: "listRow" }] : /* istanbul ignore next */ []);
2540
2570
  dashed = input(false, ...ngDevMode ? [{ debugName: "dashed" }] : /* istanbul ignore next */ []);
@@ -2566,10 +2596,12 @@ var CubeSquare = class CubeSquare {
2566
2596
  };
2567
2597
  const least = this.least();
2568
2598
  const side = Math.min(width, room.tall, this.maxSide());
2599
+ const fewest = !this.dashed() ? 0 : least === "room" ? squareLeast(side) : least;
2600
+ const cell = this.cell();
2569
2601
  const opts = {
2570
- maxSide: this.maxSide(),
2602
+ maxSide: cell && cell > 0 ? Math.min(this.maxSide(), squareSideAt(this.view(), this.tiles().length, cell, { least: fewest })) : this.maxSide(),
2571
2603
  listRow: this.listRow(),
2572
- least: !this.dashed() ? 0 : least === "room" ? squareLeast(side) : least
2604
+ least: fewest
2573
2605
  };
2574
2606
  const front = this.front();
2575
2607
  if (!front) return squareLayout(this.view(), this.tiles().length, room, opts);
@@ -2816,6 +2848,13 @@ var CubeSquare = class CubeSquare {
2816
2848
  isRequired: false,
2817
2849
  transformFunction: null
2818
2850
  },
2851
+ cell: {
2852
+ classPropertyName: "cell",
2853
+ publicName: "cell",
2854
+ isSignal: true,
2855
+ isRequired: false,
2856
+ transformFunction: null
2857
+ },
2819
2858
  align: {
2820
2859
  classPropertyName: "align",
2821
2860
  publicName: "align",
@@ -3177,6 +3216,14 @@ i0.ɵɵngDeclareClassMetadata({
3177
3216
  required: false
3178
3217
  }]
3179
3218
  }],
3219
+ cell: [{
3220
+ type: i0.Input,
3221
+ args: [{
3222
+ isSignal: true,
3223
+ alias: "cell",
3224
+ required: false
3225
+ }]
3226
+ }],
3180
3227
  align: [{
3181
3228
  type: i0.Input,
3182
3229
  args: [{
@@ -3354,6 +3401,7 @@ var CubeContext = class CubeContext {
3354
3401
  source = input(null, ...ngDevMode ? [{ debugName: "source" }] : /* istanbul ignore next */ []);
3355
3402
  words = input(null, ...ngDevMode ? [{ debugName: "words" }] : /* istanbul ignore next */ []);
3356
3403
  maxSide = input(880, ...ngDevMode ? [{ debugName: "maxSide" }] : /* istanbul ignore next */ []);
3404
+ cell = input(null, ...ngDevMode ? [{ debugName: "cell" }] : /* istanbul ignore next */ []);
3357
3405
  heldKey = input((held) => held, ...ngDevMode ? [{ debugName: "heldKey" }] : /* istanbul ignore next */ []);
3358
3406
  enter = output();
3359
3407
  out = output();
@@ -3476,6 +3524,13 @@ var CubeContext = class CubeContext {
3476
3524
  isRequired: false,
3477
3525
  transformFunction: null
3478
3526
  },
3527
+ cell: {
3528
+ classPropertyName: "cell",
3529
+ publicName: "cell",
3530
+ isSignal: true,
3531
+ isRequired: false,
3532
+ transformFunction: null
3533
+ },
3479
3534
  heldKey: {
3480
3535
  classPropertyName: "heldKey",
3481
3536
  publicName: "heldKey",
@@ -3496,6 +3551,7 @@ var CubeContext = class CubeContext {
3496
3551
  [tiles]="tiles()"
3497
3552
  [dashed]="adds()"
3498
3553
  [maxSide]="maxSide()"
3554
+ [cell]="cell()"
3499
3555
  [keyOf]="keyOf"
3500
3556
  [class.cc-adds]="adds()"
3501
3557
  >
@@ -3590,6 +3646,7 @@ var CubeContext = class CubeContext {
3590
3646
  "tiles",
3591
3647
  "view",
3592
3648
  "maxSide",
3649
+ "cell",
3593
3650
  "align",
3594
3651
  "listRow",
3595
3652
  "dashed",
@@ -3639,6 +3696,7 @@ i0.ɵɵngDeclareClassMetadata({
3639
3696
  [tiles]="tiles()"
3640
3697
  [dashed]="adds()"
3641
3698
  [maxSide]="maxSide()"
3699
+ [cell]="cell()"
3642
3700
  [keyOf]="keyOf"
3643
3701
  [class.cc-adds]="adds()"
3644
3702
  >
@@ -3748,6 +3806,14 @@ i0.ɵɵngDeclareClassMetadata({
3748
3806
  required: false
3749
3807
  }]
3750
3808
  }],
3809
+ cell: [{
3810
+ type: i0.Input,
3811
+ args: [{
3812
+ isSignal: true,
3813
+ alias: "cell",
3814
+ required: false
3815
+ }]
3816
+ }],
3751
3817
  heldKey: [{
3752
3818
  type: i0.Input,
3753
3819
  args: [{
@@ -3774,6 +3840,1298 @@ i0.ɵɵngDeclareClassMetadata({
3774
3840
  }]
3775
3841
  }
3776
3842
  });
3843
+ const CUBE_ROOM_NARROW = 640;
3844
+ var CubeRoom = class CubeRoom {
3845
+ width = signal(0, ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
3846
+ narrow = signal(CubeRoom.isNarrow(), ...ngDevMode ? [{ debugName: "narrow" }] : /* istanbul ignore next */ []);
3847
+ constructor() {
3848
+ if (typeof addEventListener !== "undefined") addEventListener("resize", () => this.narrow.set(CubeRoom.isNarrow()));
3849
+ }
3850
+ static isNarrow() {
3851
+ return typeof matchMedia !== "undefined" && matchMedia(`(max-width: 639px)`).matches;
3852
+ }
3853
+ across() {
3854
+ return this.narrow() ? 3 : 4;
3855
+ }
3856
+ cell() {
3857
+ return squareCell(this.width(), this.across());
3858
+ }
3859
+ static ɵfac = i0.ɵɵngDeclareFactory({
3860
+ minVersion: "12.0.0",
3861
+ version: "22.2.4",
3862
+ ngImport: i0,
3863
+ type: CubeRoom,
3864
+ deps: [],
3865
+ target: i0.ɵɵFactoryTarget.Injectable
3866
+ });
3867
+ static ɵprov = i0.ɵɵngDeclareInjectable({
3868
+ minVersion: "12.0.0",
3869
+ version: "22.2.4",
3870
+ ngImport: i0,
3871
+ type: CubeRoom,
3872
+ providedIn: "root"
3873
+ });
3874
+ };
3875
+ i0.ɵɵngDeclareClassMetadata({
3876
+ minVersion: "12.0.0",
3877
+ version: "22.2.4",
3878
+ ngImport: i0,
3879
+ type: CubeRoom,
3880
+ decorators: [{
3881
+ type: Injectable,
3882
+ args: [{ providedIn: "root" }]
3883
+ }],
3884
+ ctorParameters: () => []
3885
+ });
3886
+ var CubeRoomMeasure = class CubeRoomMeasure {
3887
+ room = inject(CubeRoom);
3888
+ el = inject(ElementRef).nativeElement;
3889
+ seen = typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => this.measure()) : null;
3890
+ constructor() {
3891
+ this.seen?.observe(this.el);
3892
+ queueMicrotask(() => this.measure());
3893
+ }
3894
+ measure() {
3895
+ const w = this.el.clientWidth;
3896
+ if (w > 0) this.room.width.set(Math.min(w, 880));
3897
+ }
3898
+ ngOnDestroy() {
3899
+ this.seen?.disconnect();
3900
+ }
3901
+ static ɵfac = i0.ɵɵngDeclareFactory({
3902
+ minVersion: "12.0.0",
3903
+ version: "22.2.4",
3904
+ ngImport: i0,
3905
+ type: CubeRoomMeasure,
3906
+ deps: [],
3907
+ target: i0.ɵɵFactoryTarget.Directive
3908
+ });
3909
+ static ɵdir = i0.ɵɵngDeclareDirective({
3910
+ minVersion: "14.0.0",
3911
+ version: "22.2.4",
3912
+ type: CubeRoomMeasure,
3913
+ isStandalone: true,
3914
+ selector: "[cubeRoom]",
3915
+ ngImport: i0
3916
+ });
3917
+ };
3918
+ i0.ɵɵngDeclareClassMetadata({
3919
+ minVersion: "12.0.0",
3920
+ version: "22.2.4",
3921
+ ngImport: i0,
3922
+ type: CubeRoomMeasure,
3923
+ decorators: [{
3924
+ type: Directive,
3925
+ args: [{ selector: "[cubeRoom]" }]
3926
+ }],
3927
+ ctorParameters: () => []
3928
+ });
3929
+ const CUBE_ZOOM_OPTIONS = new InjectionToken("CUBE_ZOOM_OPTIONS", {
3930
+ providedIn: "root",
3931
+ factory: () => ({ keepScroll: true })
3932
+ });
3933
+ function provideCubeZoom(options) {
3934
+ return {
3935
+ provide: CUBE_ZOOM_OPTIONS,
3936
+ useValue: {
3937
+ keepScroll: true,
3938
+ ...options
3939
+ }
3940
+ };
3941
+ }
3942
+ const pathOf = (url) => url.split(/[?#]/)[0];
3943
+ const RESTORE_FOR_MS = 1500;
3944
+ const STILL_FRAMES = 12;
3945
+ const SCROLL_KEYS = /* @__PURE__ */ new Set([
3946
+ "ArrowUp",
3947
+ "ArrowDown",
3948
+ "PageUp",
3949
+ "PageDown",
3950
+ "Home",
3951
+ "End",
3952
+ " "
3953
+ ]);
3954
+ function cubeMovesThePage(e, since) {
3955
+ if (e.timeStamp < since) return false;
3956
+ if (e instanceof WheelEvent) return !e.ctrlKey;
3957
+ if (e instanceof KeyboardEvent) return SCROLL_KEYS.has(e.key);
3958
+ return true;
3959
+ }
3960
+ function cubeTrailHolds(trail, from, to) {
3961
+ if (!trail.length) return true;
3962
+ if (pathOf(trail.at(-1).url) === pathOf(from)) return true;
3963
+ return trail.some((entry) => pathOf(entry.url) === pathOf(to));
3964
+ }
3965
+ var CubeZoomService = class CubeZoomService {
3966
+ next = null;
3967
+ trail = [];
3968
+ scrolled = /* @__PURE__ */ new Map();
3969
+ restore = null;
3970
+ steppingOutTo = null;
3971
+ options = inject(CUBE_ZOOM_OPTIONS);
3972
+ router = inject(Router);
3973
+ leaving = new Subject();
3974
+ left = this.leaving.asObservable();
3975
+ constructor() {
3976
+ const router = this.router;
3977
+ router.events.subscribe((e) => {
3978
+ if (e instanceof NavigationStart) {
3979
+ this.restore = null;
3980
+ const out = this.steppingOutTo;
3981
+ this.steppingOutTo = null;
3982
+ if (e.navigationTrigger === "popstate") return;
3983
+ if (this.next?.kind === "out" && this.options.keepScroll) {
3984
+ const top = this.scrolled.get(e.url) ?? this.scrolled.get(pathOf(e.url));
3985
+ if (top) this.restore = {
3986
+ id: e.id,
3987
+ top
3988
+ };
3989
+ }
3990
+ if (router.currentNavigation()?.extras.replaceUrl) return;
3991
+ if (out !== null && pathOf(out) === pathOf(e.url)) return;
3992
+ if (!cubeTrailHolds(this.trail, router.url, e.url)) this.trail.length = 0;
3993
+ }
3994
+ if (e instanceof NavigationEnd && this.restore?.id === e.id) this.scrollBack(this.restore.top);
3995
+ });
3996
+ }
3997
+ leave(url, label) {
3998
+ this.trail.push({
3999
+ url,
4000
+ label
4001
+ });
4002
+ if (typeof window === "undefined") return;
4003
+ const top = Math.round(window.scrollY);
4004
+ this.scrolled.set(url, top);
4005
+ this.scrolled.set(pathOf(url), top);
4006
+ }
4007
+ scrollBack(top) {
4008
+ const restore = this.restore;
4009
+ const until = performance.now() + RESTORE_FOR_MS;
4010
+ let moved = false;
4011
+ let still = 0;
4012
+ let height = -1;
4013
+ const since = performance.now();
4014
+ const stop = (e) => {
4015
+ if (cubeMovesThePage(e, since)) moved = true;
4016
+ };
4017
+ const events = [
4018
+ "wheel",
4019
+ "touchstart",
4020
+ "keydown"
4021
+ ];
4022
+ events.forEach((name) => window.addEventListener(name, stop, { passive: true }));
4023
+ const done = () => {
4024
+ events.forEach((name) => window.removeEventListener(name, stop));
4025
+ if (this.restore === restore) this.restore = null;
4026
+ };
4027
+ const step = () => {
4028
+ if (moved || this.restore !== restore || performance.now() > until) return done();
4029
+ if (Math.abs(window.scrollY - top) >= 2) window.scrollTo(0, top);
4030
+ const now = document.documentElement.scrollHeight;
4031
+ still = Math.abs(window.scrollY - top) < 2 && now === height ? still + 1 : 0;
4032
+ height = now;
4033
+ if (still >= STILL_FRAMES) return done();
4034
+ requestAnimationFrame(step);
4035
+ };
4036
+ step();
4037
+ }
4038
+ previous(url) {
4039
+ const at = this.trail.findIndex((entry) => entry.url === url);
4040
+ if (at >= 0) this.trail.splice(at);
4041
+ return this.trail.at(-1) ?? null;
4042
+ }
4043
+ stepBack(to) {
4044
+ const from = this.router.url;
4045
+ this.steppingOutTo = this.trail.pop()?.url ?? null;
4046
+ this.leaving.next({
4047
+ from,
4048
+ to: this.steppingOutTo ?? to ?? null,
4049
+ via: "step"
4050
+ });
4051
+ }
4052
+ leaveAll(inside) {
4053
+ while (this.trail.length && inside(this.trail.at(-1).url)) this.trail.pop();
4054
+ const from = this.router.url;
4055
+ const to = this.trail.pop() ?? null;
4056
+ this.steppingOutTo = to?.url ?? null;
4057
+ this.leaving.next({
4058
+ from,
4059
+ to: to?.url ?? null,
4060
+ via: "all"
4061
+ });
4062
+ return to;
4063
+ }
4064
+ into(element) {
4065
+ const box = element?.getBoundingClientRect();
4066
+ this.next = {
4067
+ kind: "in",
4068
+ origin: box ? `${box.left + box.width / 2}px ${box.top + box.height / 2}px` : null
4069
+ };
4070
+ }
4071
+ outOf() {
4072
+ this.next = {
4073
+ kind: "out",
4074
+ origin: null
4075
+ };
4076
+ }
4077
+ take() {
4078
+ const next = this.next;
4079
+ this.next = null;
4080
+ if (typeof matchMedia !== "undefined" && matchMedia("(prefers-reduced-motion: reduce)").matches) return null;
4081
+ return next;
4082
+ }
4083
+ static ɵfac = i0.ɵɵngDeclareFactory({
4084
+ minVersion: "12.0.0",
4085
+ version: "22.2.4",
4086
+ ngImport: i0,
4087
+ type: CubeZoomService,
4088
+ deps: [],
4089
+ target: i0.ɵɵFactoryTarget.Injectable
4090
+ });
4091
+ static ɵprov = i0.ɵɵngDeclareInjectable({
4092
+ minVersion: "12.0.0",
4093
+ version: "22.2.4",
4094
+ ngImport: i0,
4095
+ type: CubeZoomService,
4096
+ providedIn: "root"
4097
+ });
4098
+ };
4099
+ i0.ɵɵngDeclareClassMetadata({
4100
+ minVersion: "12.0.0",
4101
+ version: "22.2.4",
4102
+ ngImport: i0,
4103
+ type: CubeZoomService,
4104
+ decorators: [{
4105
+ type: Injectable,
4106
+ args: [{ providedIn: "root" }]
4107
+ }],
4108
+ ctorParameters: () => []
4109
+ });
4110
+ var CubeZoomPinch = class CubeZoomPinch {
4111
+ host = inject(ElementRef);
4112
+ cubeZoomOut = output();
4113
+ constructor() {
4114
+ inject(CubePinch).cubePinched.subscribe((pinch) => {
4115
+ if (pinch.way === "out") this.cubeZoomOut.emit();
4116
+ else this.zoomInto(pinch.at);
4117
+ });
4118
+ }
4119
+ zoomInto(at) {
4120
+ const piece = at?.closest("[data-zoom]");
4121
+ if (piece && this.host.nativeElement.contains(piece)) piece.click();
4122
+ }
4123
+ static ɵfac = i0.ɵɵngDeclareFactory({
4124
+ minVersion: "12.0.0",
4125
+ version: "22.2.4",
4126
+ ngImport: i0,
4127
+ type: CubeZoomPinch,
4128
+ deps: [],
4129
+ target: i0.ɵɵFactoryTarget.Directive
4130
+ });
4131
+ static ɵdir = i0.ɵɵngDeclareDirective({
4132
+ minVersion: "14.0.0",
4133
+ version: "22.2.4",
4134
+ type: CubeZoomPinch,
4135
+ isStandalone: true,
4136
+ selector: "[cubeZoomPinch]",
4137
+ outputs: { cubeZoomOut: "cubeZoomOut" },
4138
+ hostDirectives: [{
4139
+ directive: CubePinch,
4140
+ inputs: [
4141
+ "cubePinchDisabled",
4142
+ "cubePinchDisabled",
4143
+ "cubePinchQuietMs",
4144
+ "cubePinchQuietMs"
4145
+ ]
4146
+ }],
4147
+ ngImport: i0
4148
+ });
4149
+ };
4150
+ i0.ɵɵngDeclareClassMetadata({
4151
+ minVersion: "12.0.0",
4152
+ version: "22.2.4",
4153
+ ngImport: i0,
4154
+ type: CubeZoomPinch,
4155
+ decorators: [{
4156
+ type: Directive,
4157
+ args: [{
4158
+ selector: "[cubeZoomPinch]",
4159
+ hostDirectives: [{
4160
+ directive: CubePinch,
4161
+ inputs: ["cubePinchDisabled", "cubePinchQuietMs"]
4162
+ }]
4163
+ }]
4164
+ }],
4165
+ ctorParameters: () => [],
4166
+ propDecorators: { cubeZoomOut: [{
4167
+ type: i0.Output,
4168
+ args: ["cubeZoomOut"]
4169
+ }] }
4170
+ });
4171
+ const CUBE_HEAD_SWIPE = 30;
4172
+ var CubeHead = class CubeHead {
4173
+ count = input(1, ...ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []);
4174
+ colours = input([], ...ngDevMode ? [{ debugName: "colours" }] : /* istanbul ignore next */ []);
4175
+ art = input("stickers", ...ngDevMode ? [{ debugName: "art" }] : /* istanbul ignore next */ []);
4176
+ whole = input(false, ...ngDevMode ? [{ debugName: "whole" }] : /* istanbul ignore next */ []);
4177
+ hint = input(false, ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
4178
+ width = input(100, ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
4179
+ title = input(null, ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
4180
+ line = input(null, ...ngDevMode ? [{ debugName: "line" }] : /* istanbul ignore next */ []);
4181
+ backLabel = input(null, ...ngDevMode ? [{ debugName: "backLabel" }] : /* istanbul ignore next */ []);
4182
+ backAria = input(null, ...ngDevMode ? [{ debugName: "backAria" }] : /* istanbul ignore next */ []);
4183
+ backDrop = input(null, ...ngDevMode ? [{ debugName: "backDrop" }] : /* istanbul ignore next */ []);
4184
+ carrying = input(false, ...ngDevMode ? [{ debugName: "carrying" }] : /* istanbul ignore next */ []);
4185
+ holds = input(false, ...ngDevMode ? [{ debugName: "holds" }] : /* istanbul ignore next */ []);
4186
+ holdMs = input(520, ...ngDevMode ? [{ debugName: "holdMs" }] : /* istanbul ignore next */ []);
4187
+ turns = input(false, ...ngDevMode ? [{ debugName: "turns" }] : /* istanbul ignore next */ []);
4188
+ regroups = input(false, ...ngDevMode ? [{ debugName: "regroups" }] : /* istanbul ignore next */ []);
4189
+ grew = input(false, ...ngDevMode ? [{ debugName: "grew" }] : /* istanbul ignore next */ []);
4190
+ back = output();
4191
+ held = output();
4192
+ turned = output();
4193
+ rot = signal(0, ...ngDevMode ? [{ debugName: "rot" }] : /* istanbul ignore next */ []);
4194
+ turning = signal(false, ...ngDevMode ? [{ debugName: "turning" }] : /* istanbul ignore next */ []);
4195
+ startX = null;
4196
+ timers = [];
4197
+ constructor() {
4198
+ inject(DestroyRef).onDestroy(() => this.timers.forEach(clearTimeout));
4199
+ }
4200
+ start(event) {
4201
+ this.startX = this.turns() && event.isPrimary ? event.clientX : null;
4202
+ }
4203
+ end(event) {
4204
+ if (this.startX === null) return;
4205
+ const moved = event.clientX - this.startX;
4206
+ this.startX = null;
4207
+ if (Math.abs(moved) >= 30) this.turn(moved < 0 ? 1 : -1);
4208
+ }
4209
+ key(event) {
4210
+ if (!this.turns() || event.defaultPrevented) return;
4211
+ if (event.target?.closest?.("input, textarea")) return;
4212
+ if (event.key === "ArrowRight") this.turn(1);
4213
+ if (event.key === "ArrowLeft") this.turn(-1);
4214
+ }
4215
+ turn(by) {
4216
+ if (this.count() < 2 || this.turning()) return;
4217
+ this.turning.set(true);
4218
+ this.timers.push(setTimeout(() => {
4219
+ if (this.regroups()) this.turned.emit(by);
4220
+ else this.rot.update((r) => r + (by === 1 ? 1 : Math.max(1, this.colours().length) - 1));
4221
+ }, 220));
4222
+ this.timers.push(setTimeout(() => this.turning.set(false), 440));
4223
+ }
4224
+ static ɵfac = i0.ɵɵngDeclareFactory({
4225
+ minVersion: "12.0.0",
4226
+ version: "22.2.4",
4227
+ ngImport: i0,
4228
+ type: CubeHead,
4229
+ deps: [],
4230
+ target: i0.ɵɵFactoryTarget.Component
4231
+ });
4232
+ static ɵcmp = i0.ɵɵngDeclareComponent({
4233
+ minVersion: "17.0.0",
4234
+ version: "22.2.4",
4235
+ type: CubeHead,
4236
+ isStandalone: true,
4237
+ selector: "cube-head",
4238
+ inputs: {
4239
+ count: {
4240
+ classPropertyName: "count",
4241
+ publicName: "count",
4242
+ isSignal: true,
4243
+ isRequired: false,
4244
+ transformFunction: null
4245
+ },
4246
+ colours: {
4247
+ classPropertyName: "colours",
4248
+ publicName: "colours",
4249
+ isSignal: true,
4250
+ isRequired: false,
4251
+ transformFunction: null
4252
+ },
4253
+ art: {
4254
+ classPropertyName: "art",
4255
+ publicName: "art",
4256
+ isSignal: true,
4257
+ isRequired: false,
4258
+ transformFunction: null
4259
+ },
4260
+ whole: {
4261
+ classPropertyName: "whole",
4262
+ publicName: "whole",
4263
+ isSignal: true,
4264
+ isRequired: false,
4265
+ transformFunction: null
4266
+ },
4267
+ hint: {
4268
+ classPropertyName: "hint",
4269
+ publicName: "hint",
4270
+ isSignal: true,
4271
+ isRequired: false,
4272
+ transformFunction: null
4273
+ },
4274
+ width: {
4275
+ classPropertyName: "width",
4276
+ publicName: "width",
4277
+ isSignal: true,
4278
+ isRequired: false,
4279
+ transformFunction: null
4280
+ },
4281
+ title: {
4282
+ classPropertyName: "title",
4283
+ publicName: "title",
4284
+ isSignal: true,
4285
+ isRequired: false,
4286
+ transformFunction: null
4287
+ },
4288
+ line: {
4289
+ classPropertyName: "line",
4290
+ publicName: "line",
4291
+ isSignal: true,
4292
+ isRequired: false,
4293
+ transformFunction: null
4294
+ },
4295
+ backLabel: {
4296
+ classPropertyName: "backLabel",
4297
+ publicName: "backLabel",
4298
+ isSignal: true,
4299
+ isRequired: false,
4300
+ transformFunction: null
4301
+ },
4302
+ backAria: {
4303
+ classPropertyName: "backAria",
4304
+ publicName: "backAria",
4305
+ isSignal: true,
4306
+ isRequired: false,
4307
+ transformFunction: null
4308
+ },
4309
+ backDrop: {
4310
+ classPropertyName: "backDrop",
4311
+ publicName: "backDrop",
4312
+ isSignal: true,
4313
+ isRequired: false,
4314
+ transformFunction: null
4315
+ },
4316
+ carrying: {
4317
+ classPropertyName: "carrying",
4318
+ publicName: "carrying",
4319
+ isSignal: true,
4320
+ isRequired: false,
4321
+ transformFunction: null
4322
+ },
4323
+ holds: {
4324
+ classPropertyName: "holds",
4325
+ publicName: "holds",
4326
+ isSignal: true,
4327
+ isRequired: false,
4328
+ transformFunction: null
4329
+ },
4330
+ holdMs: {
4331
+ classPropertyName: "holdMs",
4332
+ publicName: "holdMs",
4333
+ isSignal: true,
4334
+ isRequired: false,
4335
+ transformFunction: null
4336
+ },
4337
+ turns: {
4338
+ classPropertyName: "turns",
4339
+ publicName: "turns",
4340
+ isSignal: true,
4341
+ isRequired: false,
4342
+ transformFunction: null
4343
+ },
4344
+ regroups: {
4345
+ classPropertyName: "regroups",
4346
+ publicName: "regroups",
4347
+ isSignal: true,
4348
+ isRequired: false,
4349
+ transformFunction: null
4350
+ },
4351
+ grew: {
4352
+ classPropertyName: "grew",
4353
+ publicName: "grew",
4354
+ isSignal: true,
4355
+ isRequired: false,
4356
+ transformFunction: null
4357
+ }
4358
+ },
4359
+ outputs: {
4360
+ back: "back",
4361
+ held: "held",
4362
+ turned: "turned"
4363
+ },
4364
+ host: { listeners: { "document:keydown": "key($event)" } },
4365
+ ngImport: i0,
4366
+ template: `
4367
+ <div class="ch-back-row">
4368
+ @if (backLabel(); as b) {
4369
+ <button
4370
+ type="button"
4371
+ class="ch-back"
4372
+ [class.ch-drop]="!!backDrop() && carrying()"
4373
+ [attr.data-drop]="backDrop()"
4374
+ [attr.aria-label]="backAria() ?? b"
4375
+ (click)="back.emit()"
4376
+ >
4377
+ <span class="ch-arrow" aria-hidden="true">‹</span>
4378
+ <span class="ch-back-name">{{ b }}</span>
4379
+ </button>
4380
+ }
4381
+ </div>
4382
+ <div class="ch-cube-row">
4383
+ <div
4384
+ class="ch-circle"
4385
+ [class.ch-holds]="holds()"
4386
+ [class.ch-turns]="turns() && count() > 1"
4387
+ [class.ch-turning]="turning()"
4388
+ [class.ch-grew]="grew()"
4389
+ role="img"
4390
+ [attr.aria-label]="title() || null"
4391
+ [attr.tabindex]="holds() ? 0 : null"
4392
+ data-no-swipe
4393
+ cubeHold
4394
+ [cubeHoldDisabled]="!holds()"
4395
+ [cubeHoldMs]="holdMs()"
4396
+ (cubeHeld)="held.emit($event)"
4397
+ (pointerdown)="start($event)"
4398
+ (pointerup)="end($event)"
4399
+ (pointercancel)="startX = null"
4400
+ >
4401
+ <cube-picture
4402
+ [art]="art()"
4403
+ [count]="count()"
4404
+ [colours]="colours()"
4405
+ [width]="width()"
4406
+ [whole]="whole()"
4407
+ [hint]="hint()"
4408
+ [rot]="rot()"
4409
+ />
4410
+ </div>
4411
+ </div>
4412
+ @if (title() || line()) {
4413
+ <div class="ch-text">
4414
+ @if (title()) {
4415
+ <h1 class="ch-title" [attr.title]="title()">{{ title() }}</h1>
4416
+ }
4417
+ <!-- the line's place is kept on a phone, said or not, so the head is one height on every level -->
4418
+ <p class="ch-line">{{ line() }}</p>
4419
+ </div>
4420
+ }
4421
+ <ng-content />
4422
+ `,
4423
+ isInline: true,
4424
+ styles: [":host{display:contents}.ch-back-row{display:flex;min-height:40px;align-items:flex-start}.ch-back{display:flex;max-width:100%;height:40px;align-items:center;gap:4px;margin-left:-8px;padding:0 8px;border:1px dashed transparent;border-radius:8px;background:none;color:var(--cube-head-quiet, #6b7280);font:inherit;font-size:var(--cube-head-back-size, 14px);cursor:pointer}.ch-back:hover{color:var(--cube-head-ink, #111827)}.ch-arrow{font-size:18px;line-height:1}.ch-back-name{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ch-back.ch-drop{border-color:var(--cube-head-drop, rgb(251 191 36 / .7));color:var(--cube-head-drop-ink, rgb(252 211 77))}:host-context(.cube-carrying) .ch-back.cube-carry-over{background:var(--cube-head-drop-over, rgb(251 191 36 / .16))}.ch-cube-row{display:flex;flex-direction:column;align-items:center}.ch-circle{display:flex;align-items:center;justify-content:center;width:var(--cube-head-circle-size, 156px);height:var(--cube-head-circle-size, 156px);border-radius:999px;background:var(--cube-head-circle, #f3f4f6);box-shadow:0 0 0 1px var(--cube-head-circle-ring, #e5e7eb);touch-action:pan-y}.ch-holds{cursor:pointer}.ch-turns{cursor:grab}.ch-circle:focus-visible{outline:2px solid var(--cube-head-focus, #5f9a80);outline-offset:3px}.ch-text{text-align:center}.ch-title{margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--cube-head-ink, #111827);font-size:var(--cube-head-title-size, 24px);font-weight:700;line-height:1.33}.ch-line{max-width:34ch;height:20px;margin:0 auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--cube-head-quiet, #6b7280);font-size:var(--cube-head-line-size, 14px);line-height:20px}@media(min-width:900px){.ch-title{white-space:normal;overflow-wrap:anywhere}.ch-line{height:auto;min-height:20px;white-space:normal}}.ch-turning cube-picture{animation:ch-turn .44s ease-in-out}@keyframes ch-turn{0%{transform:perspective(600px) rotateY(0)}49%{transform:perspective(600px) rotateY(84deg)}51%{transform:perspective(600px) rotateY(-84deg)}to{transform:perspective(600px) rotateY(0)}}.ch-grew cube-picture{animation:ch-grew .9s ease-out}@keyframes ch-grew{0%{transform:scale(.7);opacity:.4}60%{transform:scale(1.06);opacity:1}to{transform:none}}@media(prefers-reduced-motion:reduce){.ch-turning cube-picture,.ch-grew cube-picture{animation:none}}\n"],
4425
+ dependencies: [{
4426
+ kind: "component",
4427
+ type: CubePicture,
4428
+ selector: "cube-picture",
4429
+ inputs: [
4430
+ "count",
4431
+ "colours",
4432
+ "width",
4433
+ "hint",
4434
+ "whole",
4435
+ "rot",
4436
+ "art"
4437
+ ]
4438
+ }, {
4439
+ kind: "directive",
4440
+ type: CubeHold,
4441
+ selector: "[cubeHold]",
4442
+ inputs: [
4443
+ "cubeHoldDisabled",
4444
+ "cubeHoldMs",
4445
+ "cubeHoldSlop",
4446
+ "cubeHoldBuzz"
4447
+ ],
4448
+ outputs: ["cubeHeld"]
4449
+ }],
4450
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
4451
+ });
4452
+ };
4453
+ i0.ɵɵngDeclareClassMetadata({
4454
+ minVersion: "12.0.0",
4455
+ version: "22.2.4",
4456
+ ngImport: i0,
4457
+ type: CubeHead,
4458
+ decorators: [{
4459
+ type: Component,
4460
+ args: [{
4461
+ selector: "cube-head",
4462
+ imports: [CubePicture, CubeHold],
4463
+ template: `
4464
+ <div class="ch-back-row">
4465
+ @if (backLabel(); as b) {
4466
+ <button
4467
+ type="button"
4468
+ class="ch-back"
4469
+ [class.ch-drop]="!!backDrop() && carrying()"
4470
+ [attr.data-drop]="backDrop()"
4471
+ [attr.aria-label]="backAria() ?? b"
4472
+ (click)="back.emit()"
4473
+ >
4474
+ <span class="ch-arrow" aria-hidden="true">‹</span>
4475
+ <span class="ch-back-name">{{ b }}</span>
4476
+ </button>
4477
+ }
4478
+ </div>
4479
+ <div class="ch-cube-row">
4480
+ <div
4481
+ class="ch-circle"
4482
+ [class.ch-holds]="holds()"
4483
+ [class.ch-turns]="turns() && count() > 1"
4484
+ [class.ch-turning]="turning()"
4485
+ [class.ch-grew]="grew()"
4486
+ role="img"
4487
+ [attr.aria-label]="title() || null"
4488
+ [attr.tabindex]="holds() ? 0 : null"
4489
+ data-no-swipe
4490
+ cubeHold
4491
+ [cubeHoldDisabled]="!holds()"
4492
+ [cubeHoldMs]="holdMs()"
4493
+ (cubeHeld)="held.emit($event)"
4494
+ (pointerdown)="start($event)"
4495
+ (pointerup)="end($event)"
4496
+ (pointercancel)="startX = null"
4497
+ >
4498
+ <cube-picture
4499
+ [art]="art()"
4500
+ [count]="count()"
4501
+ [colours]="colours()"
4502
+ [width]="width()"
4503
+ [whole]="whole()"
4504
+ [hint]="hint()"
4505
+ [rot]="rot()"
4506
+ />
4507
+ </div>
4508
+ </div>
4509
+ @if (title() || line()) {
4510
+ <div class="ch-text">
4511
+ @if (title()) {
4512
+ <h1 class="ch-title" [attr.title]="title()">{{ title() }}</h1>
4513
+ }
4514
+ <!-- the line's place is kept on a phone, said or not, so the head is one height on every level -->
4515
+ <p class="ch-line">{{ line() }}</p>
4516
+ </div>
4517
+ }
4518
+ <ng-content />
4519
+ `,
4520
+ host: { "(document:keydown)": "key($event)" },
4521
+ changeDetection: ChangeDetectionStrategy.OnPush,
4522
+ styles: [":host{display:contents}.ch-back-row{display:flex;min-height:40px;align-items:flex-start}.ch-back{display:flex;max-width:100%;height:40px;align-items:center;gap:4px;margin-left:-8px;padding:0 8px;border:1px dashed transparent;border-radius:8px;background:none;color:var(--cube-head-quiet, #6b7280);font:inherit;font-size:var(--cube-head-back-size, 14px);cursor:pointer}.ch-back:hover{color:var(--cube-head-ink, #111827)}.ch-arrow{font-size:18px;line-height:1}.ch-back-name{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ch-back.ch-drop{border-color:var(--cube-head-drop, rgb(251 191 36 / .7));color:var(--cube-head-drop-ink, rgb(252 211 77))}:host-context(.cube-carrying) .ch-back.cube-carry-over{background:var(--cube-head-drop-over, rgb(251 191 36 / .16))}.ch-cube-row{display:flex;flex-direction:column;align-items:center}.ch-circle{display:flex;align-items:center;justify-content:center;width:var(--cube-head-circle-size, 156px);height:var(--cube-head-circle-size, 156px);border-radius:999px;background:var(--cube-head-circle, #f3f4f6);box-shadow:0 0 0 1px var(--cube-head-circle-ring, #e5e7eb);touch-action:pan-y}.ch-holds{cursor:pointer}.ch-turns{cursor:grab}.ch-circle:focus-visible{outline:2px solid var(--cube-head-focus, #5f9a80);outline-offset:3px}.ch-text{text-align:center}.ch-title{margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--cube-head-ink, #111827);font-size:var(--cube-head-title-size, 24px);font-weight:700;line-height:1.33}.ch-line{max-width:34ch;height:20px;margin:0 auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--cube-head-quiet, #6b7280);font-size:var(--cube-head-line-size, 14px);line-height:20px}@media(min-width:900px){.ch-title{white-space:normal;overflow-wrap:anywhere}.ch-line{height:auto;min-height:20px;white-space:normal}}.ch-turning cube-picture{animation:ch-turn .44s ease-in-out}@keyframes ch-turn{0%{transform:perspective(600px) rotateY(0)}49%{transform:perspective(600px) rotateY(84deg)}51%{transform:perspective(600px) rotateY(-84deg)}to{transform:perspective(600px) rotateY(0)}}.ch-grew cube-picture{animation:ch-grew .9s ease-out}@keyframes ch-grew{0%{transform:scale(.7);opacity:.4}60%{transform:scale(1.06);opacity:1}to{transform:none}}@media(prefers-reduced-motion:reduce){.ch-turning cube-picture,.ch-grew cube-picture{animation:none}}\n"]
4523
+ }]
4524
+ }],
4525
+ ctorParameters: () => [],
4526
+ propDecorators: {
4527
+ count: [{
4528
+ type: i0.Input,
4529
+ args: [{
4530
+ isSignal: true,
4531
+ alias: "count",
4532
+ required: false
4533
+ }]
4534
+ }],
4535
+ colours: [{
4536
+ type: i0.Input,
4537
+ args: [{
4538
+ isSignal: true,
4539
+ alias: "colours",
4540
+ required: false
4541
+ }]
4542
+ }],
4543
+ art: [{
4544
+ type: i0.Input,
4545
+ args: [{
4546
+ isSignal: true,
4547
+ alias: "art",
4548
+ required: false
4549
+ }]
4550
+ }],
4551
+ whole: [{
4552
+ type: i0.Input,
4553
+ args: [{
4554
+ isSignal: true,
4555
+ alias: "whole",
4556
+ required: false
4557
+ }]
4558
+ }],
4559
+ hint: [{
4560
+ type: i0.Input,
4561
+ args: [{
4562
+ isSignal: true,
4563
+ alias: "hint",
4564
+ required: false
4565
+ }]
4566
+ }],
4567
+ width: [{
4568
+ type: i0.Input,
4569
+ args: [{
4570
+ isSignal: true,
4571
+ alias: "width",
4572
+ required: false
4573
+ }]
4574
+ }],
4575
+ title: [{
4576
+ type: i0.Input,
4577
+ args: [{
4578
+ isSignal: true,
4579
+ alias: "title",
4580
+ required: false
4581
+ }]
4582
+ }],
4583
+ line: [{
4584
+ type: i0.Input,
4585
+ args: [{
4586
+ isSignal: true,
4587
+ alias: "line",
4588
+ required: false
4589
+ }]
4590
+ }],
4591
+ backLabel: [{
4592
+ type: i0.Input,
4593
+ args: [{
4594
+ isSignal: true,
4595
+ alias: "backLabel",
4596
+ required: false
4597
+ }]
4598
+ }],
4599
+ backAria: [{
4600
+ type: i0.Input,
4601
+ args: [{
4602
+ isSignal: true,
4603
+ alias: "backAria",
4604
+ required: false
4605
+ }]
4606
+ }],
4607
+ backDrop: [{
4608
+ type: i0.Input,
4609
+ args: [{
4610
+ isSignal: true,
4611
+ alias: "backDrop",
4612
+ required: false
4613
+ }]
4614
+ }],
4615
+ carrying: [{
4616
+ type: i0.Input,
4617
+ args: [{
4618
+ isSignal: true,
4619
+ alias: "carrying",
4620
+ required: false
4621
+ }]
4622
+ }],
4623
+ holds: [{
4624
+ type: i0.Input,
4625
+ args: [{
4626
+ isSignal: true,
4627
+ alias: "holds",
4628
+ required: false
4629
+ }]
4630
+ }],
4631
+ holdMs: [{
4632
+ type: i0.Input,
4633
+ args: [{
4634
+ isSignal: true,
4635
+ alias: "holdMs",
4636
+ required: false
4637
+ }]
4638
+ }],
4639
+ turns: [{
4640
+ type: i0.Input,
4641
+ args: [{
4642
+ isSignal: true,
4643
+ alias: "turns",
4644
+ required: false
4645
+ }]
4646
+ }],
4647
+ regroups: [{
4648
+ type: i0.Input,
4649
+ args: [{
4650
+ isSignal: true,
4651
+ alias: "regroups",
4652
+ required: false
4653
+ }]
4654
+ }],
4655
+ grew: [{
4656
+ type: i0.Input,
4657
+ args: [{
4658
+ isSignal: true,
4659
+ alias: "grew",
4660
+ required: false
4661
+ }]
4662
+ }],
4663
+ back: [{
4664
+ type: i0.Output,
4665
+ args: ["back"]
4666
+ }],
4667
+ held: [{
4668
+ type: i0.Output,
4669
+ args: ["held"]
4670
+ }],
4671
+ turned: [{
4672
+ type: i0.Output,
4673
+ args: ["turned"]
4674
+ }]
4675
+ }
4676
+ });
4677
+ function cubeTilePicture(level, cell) {
4678
+ return Math.round(level < 2 ? Math.min(56, Math.max(28, cell * .28)) : level < 4 ? Math.max(20, cell * .24) : cell * .6);
4679
+ }
4680
+ var CubeTile = class CubeTile {
4681
+ name = input.required(...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
4682
+ line = input(null, ...ngDevMode ? [{ debugName: "line" }] : /* istanbul ignore next */ []);
4683
+ says = input(true, ...ngDevMode ? [{ debugName: "says" }] : /* istanbul ignore next */ []);
4684
+ level = input(1, ...ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []);
4685
+ cell = input(150, ...ngDevMode ? [{ debugName: "cell" }] : /* istanbul ignore next */ []);
4686
+ count = input(1, ...ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []);
4687
+ colours = input([], ...ngDevMode ? [{ debugName: "colours" }] : /* istanbul ignore next */ []);
4688
+ art = input("stickers", ...ngDevMode ? [{ debugName: "art" }] : /* istanbul ignore next */ []);
4689
+ whole = input(null, ...ngDevMode ? [{ debugName: "whole" }] : /* istanbul ignore next */ []);
4690
+ look = input("piece", ...ngDevMode ? [{ debugName: "look" }] : /* istanbul ignore next */ []);
4691
+ ticked = input(false, ...ngDevMode ? [{ debugName: "ticked" }] : /* istanbul ignore next */ []);
4692
+ tick = input("✓", ...ngDevMode ? [{ debugName: "tick" }] : /* istanbul ignore next */ []);
4693
+ tickedWord = input(null, ...ngDevMode ? [{ debugName: "tickedWord" }] : /* istanbul ignore next */ []);
4694
+ marked = input(false, ...ngDevMode ? [{ debugName: "marked" }] : /* istanbul ignore next */ []);
4695
+ picture = computed(() => cubeTilePicture(this.level(), this.cell()), ...ngDevMode ? [{ debugName: "picture" }] : /* istanbul ignore next */ []);
4696
+ classes = computed(() => `ct-l${this.level()} ct-${this.look()}` + (this.ticked() ? " ct-ticked" : "") + (this.marked() ? " ct-marked" : ""), ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
4697
+ static ɵfac = i0.ɵɵngDeclareFactory({
4698
+ minVersion: "12.0.0",
4699
+ version: "22.2.4",
4700
+ ngImport: i0,
4701
+ type: CubeTile,
4702
+ deps: [],
4703
+ target: i0.ɵɵFactoryTarget.Component
4704
+ });
4705
+ static ɵcmp = i0.ɵɵngDeclareComponent({
4706
+ minVersion: "17.0.0",
4707
+ version: "22.2.4",
4708
+ type: CubeTile,
4709
+ isStandalone: true,
4710
+ selector: "cube-tile",
4711
+ inputs: {
4712
+ name: {
4713
+ classPropertyName: "name",
4714
+ publicName: "name",
4715
+ isSignal: true,
4716
+ isRequired: true,
4717
+ transformFunction: null
4718
+ },
4719
+ line: {
4720
+ classPropertyName: "line",
4721
+ publicName: "line",
4722
+ isSignal: true,
4723
+ isRequired: false,
4724
+ transformFunction: null
4725
+ },
4726
+ says: {
4727
+ classPropertyName: "says",
4728
+ publicName: "says",
4729
+ isSignal: true,
4730
+ isRequired: false,
4731
+ transformFunction: null
4732
+ },
4733
+ level: {
4734
+ classPropertyName: "level",
4735
+ publicName: "level",
4736
+ isSignal: true,
4737
+ isRequired: false,
4738
+ transformFunction: null
4739
+ },
4740
+ cell: {
4741
+ classPropertyName: "cell",
4742
+ publicName: "cell",
4743
+ isSignal: true,
4744
+ isRequired: false,
4745
+ transformFunction: null
4746
+ },
4747
+ count: {
4748
+ classPropertyName: "count",
4749
+ publicName: "count",
4750
+ isSignal: true,
4751
+ isRequired: false,
4752
+ transformFunction: null
4753
+ },
4754
+ colours: {
4755
+ classPropertyName: "colours",
4756
+ publicName: "colours",
4757
+ isSignal: true,
4758
+ isRequired: false,
4759
+ transformFunction: null
4760
+ },
4761
+ art: {
4762
+ classPropertyName: "art",
4763
+ publicName: "art",
4764
+ isSignal: true,
4765
+ isRequired: false,
4766
+ transformFunction: null
4767
+ },
4768
+ whole: {
4769
+ classPropertyName: "whole",
4770
+ publicName: "whole",
4771
+ isSignal: true,
4772
+ isRequired: false,
4773
+ transformFunction: null
4774
+ },
4775
+ look: {
4776
+ classPropertyName: "look",
4777
+ publicName: "look",
4778
+ isSignal: true,
4779
+ isRequired: false,
4780
+ transformFunction: null
4781
+ },
4782
+ ticked: {
4783
+ classPropertyName: "ticked",
4784
+ publicName: "ticked",
4785
+ isSignal: true,
4786
+ isRequired: false,
4787
+ transformFunction: null
4788
+ },
4789
+ tick: {
4790
+ classPropertyName: "tick",
4791
+ publicName: "tick",
4792
+ isSignal: true,
4793
+ isRequired: false,
4794
+ transformFunction: null
4795
+ },
4796
+ tickedWord: {
4797
+ classPropertyName: "tickedWord",
4798
+ publicName: "tickedWord",
4799
+ isSignal: true,
4800
+ isRequired: false,
4801
+ transformFunction: null
4802
+ },
4803
+ marked: {
4804
+ classPropertyName: "marked",
4805
+ publicName: "marked",
4806
+ isSignal: true,
4807
+ isRequired: false,
4808
+ transformFunction: null
4809
+ }
4810
+ },
4811
+ host: { properties: {
4812
+ "class": "classes()",
4813
+ "attr.data-level": "level()"
4814
+ } },
4815
+ ngImport: i0,
4816
+ template: `
4817
+ @if (ticked() && level() < 4) {
4818
+ <span class="ct-tick" [attr.aria-label]="tickedWord() || null">{{ tick() }}</span>
4819
+ }
4820
+ @if (look() !== 'own') {
4821
+ <span class="ct-picture" [class.ct-push]="level() < 4">
4822
+ <cube-picture
4823
+ [art]="art()"
4824
+ [count]="count()"
4825
+ [colours]="colours()"
4826
+ [width]="picture()"
4827
+ [whole]="whole() ?? count() === 1"
4828
+ />
4829
+ </span>
4830
+ }
4831
+ @if (level() < 4 || look() === 'own') {
4832
+ <span class="ct-name">{{ look() === 'own' ? '+ ' : '' }}{{ name() }}</span>
4833
+ }
4834
+ @if (line()) {
4835
+ <span class="ct-line" [class.ct-unseen]="!(says() && level() < 3)">{{ line() }}</span>
4836
+ }
4837
+ `,
4838
+ isInline: true,
4839
+ styles: [":host{position:relative;box-sizing:border-box;display:flex;flex-direction:column;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;border:1px solid var(--cube-tile-line, #e5e7eb);background:var(--cube-tile, #ffffff);color:var(--cube-tile-ink, #111827);text-align:left;user-select:none;-webkit-user-select:none;cursor:pointer;transition:transform .12s ease}:host(:active){transform:scale(.97)}:host(:focus-visible){outline:2px solid var(--cube-tile-accent, #5f9a80);outline-offset:2px}:host(.ct-l0){border-radius:28px;padding:24px;gap:10px}:host(.ct-l1){border-radius:20px;padding:14px;gap:6px}:host(.ct-l2){border-radius:16px;padding:8px 10px;gap:2px}:host(.ct-l3){border-radius:12px;padding:6px;gap:2px}:host(.ct-l4){border-radius:9px;padding:2px;align-items:center;justify-content:center}:host(.ct-own){align-items:center;justify-content:center;border-style:dashed;border-color:var(--cube-tile-own-line, color-mix(in srgb, #5f9a80 50%, transparent));background:transparent;color:var(--cube-tile-accent, #5f9a80)}:host(.ct-dashed){border-style:dashed;border-color:var(--cube-tile-own-line, color-mix(in srgb, #5f9a80 40%, transparent));background:transparent;color:var(--cube-tile-quiet-ink, #4b5563)}:host(.ct-pale){border-style:dashed;border-color:var(--cube-tile-pale-line, #d1d5db);background:transparent;color:var(--cube-tile-pale-ink, #9ca3af)}:host(.ct-marked){border-color:var(--cube-tile-marked, color-mix(in srgb, #5f9a80 35%, transparent))}:host(.ct-ticked){box-shadow:0 0 0 1px var(--cube-tile-accent, #5f9a80)}.ct-tick{position:absolute;top:8px;right:10px;color:var(--cube-tile-accent, #5f9a80);font-size:14px;font-weight:600}.ct-picture{flex:none}.ct-push{margin-bottom:auto}.ct-name{flex:none;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere;font-weight:600;line-height:1.25}:host(.ct-own) .ct-name{font-weight:500}.ct-line{flex:none;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere;color:var(--cube-tile-quiet, #6b7280);line-height:1.375}:host(.ct-pale) .ct-line{color:var(--cube-tile-pale-ink, #9ca3af)}.ct-unseen{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:host(.ct-l0) .ct-name{font-size:26px}:host(.ct-l1) .ct-name{font-size:17px}:host(.ct-l2) .ct-name{font-size:14px}:host(.ct-l3) .ct-name{font-size:12px}:host(.ct-l0) .ct-line{font-size:16px}:host(.ct-l1) .ct-line{font-size:13px}:host(.ct-l2) .ct-line{font-size:12px}\n"],
4840
+ dependencies: [{
4841
+ kind: "component",
4842
+ type: CubePicture,
4843
+ selector: "cube-picture",
4844
+ inputs: [
4845
+ "count",
4846
+ "colours",
4847
+ "width",
4848
+ "hint",
4849
+ "whole",
4850
+ "rot",
4851
+ "art"
4852
+ ]
4853
+ }],
4854
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
4855
+ });
4856
+ };
4857
+ i0.ɵɵngDeclareClassMetadata({
4858
+ minVersion: "12.0.0",
4859
+ version: "22.2.4",
4860
+ ngImport: i0,
4861
+ type: CubeTile,
4862
+ decorators: [{
4863
+ type: Component,
4864
+ args: [{
4865
+ selector: "cube-tile",
4866
+ imports: [CubePicture],
4867
+ template: `
4868
+ @if (ticked() && level() < 4) {
4869
+ <span class="ct-tick" [attr.aria-label]="tickedWord() || null">{{ tick() }}</span>
4870
+ }
4871
+ @if (look() !== 'own') {
4872
+ <span class="ct-picture" [class.ct-push]="level() < 4">
4873
+ <cube-picture
4874
+ [art]="art()"
4875
+ [count]="count()"
4876
+ [colours]="colours()"
4877
+ [width]="picture()"
4878
+ [whole]="whole() ?? count() === 1"
4879
+ />
4880
+ </span>
4881
+ }
4882
+ @if (level() < 4 || look() === 'own') {
4883
+ <span class="ct-name">{{ look() === 'own' ? '+ ' : '' }}{{ name() }}</span>
4884
+ }
4885
+ @if (line()) {
4886
+ <span class="ct-line" [class.ct-unseen]="!(says() && level() < 3)">{{ line() }}</span>
4887
+ }
4888
+ `,
4889
+ host: {
4890
+ "[class]": "classes()",
4891
+ "[attr.data-level]": "level()"
4892
+ },
4893
+ changeDetection: ChangeDetectionStrategy.OnPush,
4894
+ styles: [":host{position:relative;box-sizing:border-box;display:flex;flex-direction:column;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;border:1px solid var(--cube-tile-line, #e5e7eb);background:var(--cube-tile, #ffffff);color:var(--cube-tile-ink, #111827);text-align:left;user-select:none;-webkit-user-select:none;cursor:pointer;transition:transform .12s ease}:host(:active){transform:scale(.97)}:host(:focus-visible){outline:2px solid var(--cube-tile-accent, #5f9a80);outline-offset:2px}:host(.ct-l0){border-radius:28px;padding:24px;gap:10px}:host(.ct-l1){border-radius:20px;padding:14px;gap:6px}:host(.ct-l2){border-radius:16px;padding:8px 10px;gap:2px}:host(.ct-l3){border-radius:12px;padding:6px;gap:2px}:host(.ct-l4){border-radius:9px;padding:2px;align-items:center;justify-content:center}:host(.ct-own){align-items:center;justify-content:center;border-style:dashed;border-color:var(--cube-tile-own-line, color-mix(in srgb, #5f9a80 50%, transparent));background:transparent;color:var(--cube-tile-accent, #5f9a80)}:host(.ct-dashed){border-style:dashed;border-color:var(--cube-tile-own-line, color-mix(in srgb, #5f9a80 40%, transparent));background:transparent;color:var(--cube-tile-quiet-ink, #4b5563)}:host(.ct-pale){border-style:dashed;border-color:var(--cube-tile-pale-line, #d1d5db);background:transparent;color:var(--cube-tile-pale-ink, #9ca3af)}:host(.ct-marked){border-color:var(--cube-tile-marked, color-mix(in srgb, #5f9a80 35%, transparent))}:host(.ct-ticked){box-shadow:0 0 0 1px var(--cube-tile-accent, #5f9a80)}.ct-tick{position:absolute;top:8px;right:10px;color:var(--cube-tile-accent, #5f9a80);font-size:14px;font-weight:600}.ct-picture{flex:none}.ct-push{margin-bottom:auto}.ct-name{flex:none;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere;font-weight:600;line-height:1.25}:host(.ct-own) .ct-name{font-weight:500}.ct-line{flex:none;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere;color:var(--cube-tile-quiet, #6b7280);line-height:1.375}:host(.ct-pale) .ct-line{color:var(--cube-tile-pale-ink, #9ca3af)}.ct-unseen{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:host(.ct-l0) .ct-name{font-size:26px}:host(.ct-l1) .ct-name{font-size:17px}:host(.ct-l2) .ct-name{font-size:14px}:host(.ct-l3) .ct-name{font-size:12px}:host(.ct-l0) .ct-line{font-size:16px}:host(.ct-l1) .ct-line{font-size:13px}:host(.ct-l2) .ct-line{font-size:12px}\n"]
4895
+ }]
4896
+ }],
4897
+ propDecorators: {
4898
+ name: [{
4899
+ type: i0.Input,
4900
+ args: [{
4901
+ isSignal: true,
4902
+ alias: "name",
4903
+ required: true
4904
+ }]
4905
+ }],
4906
+ line: [{
4907
+ type: i0.Input,
4908
+ args: [{
4909
+ isSignal: true,
4910
+ alias: "line",
4911
+ required: false
4912
+ }]
4913
+ }],
4914
+ says: [{
4915
+ type: i0.Input,
4916
+ args: [{
4917
+ isSignal: true,
4918
+ alias: "says",
4919
+ required: false
4920
+ }]
4921
+ }],
4922
+ level: [{
4923
+ type: i0.Input,
4924
+ args: [{
4925
+ isSignal: true,
4926
+ alias: "level",
4927
+ required: false
4928
+ }]
4929
+ }],
4930
+ cell: [{
4931
+ type: i0.Input,
4932
+ args: [{
4933
+ isSignal: true,
4934
+ alias: "cell",
4935
+ required: false
4936
+ }]
4937
+ }],
4938
+ count: [{
4939
+ type: i0.Input,
4940
+ args: [{
4941
+ isSignal: true,
4942
+ alias: "count",
4943
+ required: false
4944
+ }]
4945
+ }],
4946
+ colours: [{
4947
+ type: i0.Input,
4948
+ args: [{
4949
+ isSignal: true,
4950
+ alias: "colours",
4951
+ required: false
4952
+ }]
4953
+ }],
4954
+ art: [{
4955
+ type: i0.Input,
4956
+ args: [{
4957
+ isSignal: true,
4958
+ alias: "art",
4959
+ required: false
4960
+ }]
4961
+ }],
4962
+ whole: [{
4963
+ type: i0.Input,
4964
+ args: [{
4965
+ isSignal: true,
4966
+ alias: "whole",
4967
+ required: false
4968
+ }]
4969
+ }],
4970
+ look: [{
4971
+ type: i0.Input,
4972
+ args: [{
4973
+ isSignal: true,
4974
+ alias: "look",
4975
+ required: false
4976
+ }]
4977
+ }],
4978
+ ticked: [{
4979
+ type: i0.Input,
4980
+ args: [{
4981
+ isSignal: true,
4982
+ alias: "ticked",
4983
+ required: false
4984
+ }]
4985
+ }],
4986
+ tick: [{
4987
+ type: i0.Input,
4988
+ args: [{
4989
+ isSignal: true,
4990
+ alias: "tick",
4991
+ required: false
4992
+ }]
4993
+ }],
4994
+ tickedWord: [{
4995
+ type: i0.Input,
4996
+ args: [{
4997
+ isSignal: true,
4998
+ alias: "tickedWord",
4999
+ required: false
5000
+ }]
5001
+ }],
5002
+ marked: [{
5003
+ type: i0.Input,
5004
+ args: [{
5005
+ isSignal: true,
5006
+ alias: "marked",
5007
+ required: false
5008
+ }]
5009
+ }]
5010
+ }
5011
+ });
5012
+ const levelOf = (url) => url.split(/[?#]/)[0];
5013
+ var CubeQuietLine = class {
5014
+ said = signal(null, ...ngDevMode ? [{ debugName: "said" }] : /* istanbul ignore next */ []);
5015
+ note = computed(() => this.said()?.note ?? null, ...ngDevMode ? [{ debugName: "note" }] : /* istanbul ignore next */ []);
5016
+ at = computed(() => this.said()?.at ?? null, ...ngDevMode ? [{ debugName: "at" }] : /* istanbul ignore next */ []);
5017
+ say(note, at) {
5018
+ this.said.set(note ? {
5019
+ note,
5020
+ at: levelOf(at)
5021
+ } : null);
5022
+ }
5023
+ move(at) {
5024
+ const s = this.said();
5025
+ if (s) this.said.set({
5026
+ ...s,
5027
+ at: levelOf(at)
5028
+ });
5029
+ }
5030
+ clear() {
5031
+ this.said.set(null);
5032
+ }
5033
+ on(url) {
5034
+ const s = this.said();
5035
+ return s && s.at === levelOf(url) ? s.note : null;
5036
+ }
5037
+ };
5038
+ var CubeQuiet = class CubeQuiet {
5039
+ note = input(null, ...ngDevMode ? [{ debugName: "note" }] : /* istanbul ignore next */ []);
5040
+ undoWord = input(null, ...ngDevMode ? [{ debugName: "undoWord" }] : /* istanbul ignore next */ []);
5041
+ undo = output();
5042
+ static ɵfac = i0.ɵɵngDeclareFactory({
5043
+ minVersion: "12.0.0",
5044
+ version: "22.2.4",
5045
+ ngImport: i0,
5046
+ type: CubeQuiet,
5047
+ deps: [],
5048
+ target: i0.ɵɵFactoryTarget.Component
5049
+ });
5050
+ static ɵcmp = i0.ɵɵngDeclareComponent({
5051
+ minVersion: "17.0.0",
5052
+ version: "22.2.4",
5053
+ type: CubeQuiet,
5054
+ isStandalone: true,
5055
+ selector: "cube-quiet",
5056
+ inputs: {
5057
+ note: {
5058
+ classPropertyName: "note",
5059
+ publicName: "note",
5060
+ isSignal: true,
5061
+ isRequired: false,
5062
+ transformFunction: null
5063
+ },
5064
+ undoWord: {
5065
+ classPropertyName: "undoWord",
5066
+ publicName: "undoWord",
5067
+ isSignal: true,
5068
+ isRequired: false,
5069
+ transformFunction: null
5070
+ }
5071
+ },
5072
+ outputs: { undo: "undo" },
5073
+ ngImport: i0,
5074
+ template: `
5075
+ @if (note(); as n) {
5076
+ <p class="cq-line" role="status">
5077
+ <span class="cq-says">{{ n.says }}</span>
5078
+ @if (n.undo != null && undoWord()) {
5079
+ <button type="button" class="cq-undo" (click)="undo.emit(n)">{{ undoWord() }}</button>
5080
+ }
5081
+ </p>
5082
+ }
5083
+ `,
5084
+ isInline: true,
5085
+ styles: [":host{display:block}.cq-line{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:center;column-gap:8px;max-width:40ch;margin:0 auto;color:var(--cube-quiet-ink, #6b7280);font-size:var(--cube-quiet-size, 14px);line-height:20px;text-align:center}.cq-says{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}@media(min-width:900px){.cq-says{-webkit-line-clamp:unset}}.cq-undo{min-height:24px;padding:0 4px;border:0;background:none;color:var(--cube-quiet-undo, #5f9a80);font:inherit;font-weight:600;cursor:pointer}\n"],
5086
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
5087
+ });
5088
+ };
5089
+ i0.ɵɵngDeclareClassMetadata({
5090
+ minVersion: "12.0.0",
5091
+ version: "22.2.4",
5092
+ ngImport: i0,
5093
+ type: CubeQuiet,
5094
+ decorators: [{
5095
+ type: Component,
5096
+ args: [{
5097
+ selector: "cube-quiet",
5098
+ template: `
5099
+ @if (note(); as n) {
5100
+ <p class="cq-line" role="status">
5101
+ <span class="cq-says">{{ n.says }}</span>
5102
+ @if (n.undo != null && undoWord()) {
5103
+ <button type="button" class="cq-undo" (click)="undo.emit(n)">{{ undoWord() }}</button>
5104
+ }
5105
+ </p>
5106
+ }
5107
+ `,
5108
+ changeDetection: ChangeDetectionStrategy.OnPush,
5109
+ styles: [":host{display:block}.cq-line{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:center;column-gap:8px;max-width:40ch;margin:0 auto;color:var(--cube-quiet-ink, #6b7280);font-size:var(--cube-quiet-size, 14px);line-height:20px;text-align:center}.cq-says{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}@media(min-width:900px){.cq-says{-webkit-line-clamp:unset}}.cq-undo{min-height:24px;padding:0 4px;border:0;background:none;color:var(--cube-quiet-undo, #5f9a80);font:inherit;font-weight:600;cursor:pointer}\n"]
5110
+ }]
5111
+ }],
5112
+ propDecorators: {
5113
+ note: [{
5114
+ type: i0.Input,
5115
+ args: [{
5116
+ isSignal: true,
5117
+ alias: "note",
5118
+ required: false
5119
+ }]
5120
+ }],
5121
+ undoWord: [{
5122
+ type: i0.Input,
5123
+ args: [{
5124
+ isSignal: true,
5125
+ alias: "undoWord",
5126
+ required: false
5127
+ }]
5128
+ }],
5129
+ undo: [{
5130
+ type: i0.Output,
5131
+ args: ["undo"]
5132
+ }]
5133
+ }
5134
+ });
3777
5135
  const CUBE_LOADING_WAYS = ["fill", "turn"];
3778
5136
  const CUBE_LOADING_LEVELS = [
3779
5137
  "page",
@@ -3947,6 +5305,7 @@ var CubeLoading = class CubeLoading {
3947
5305
  "tiles",
3948
5306
  "view",
3949
5307
  "maxSide",
5308
+ "cell",
3950
5309
  "align",
3951
5310
  "listRow",
3952
5311
  "dashed",
@@ -4317,6 +5676,6 @@ i0.ɵɵngDeclareClassMetadata({
4317
5676
  args: [{ providedIn: "root" }]
4318
5677
  }]
4319
5678
  });
4320
- export { ART_CHOICES_KEY, CONTEXT_CUBE_SOURCE, CONTEXT_CUBE_WORDS, CONTEXT_LAST_PARTS, CONTEXT_PART_ORDER, CUBE_ARTS, CUBE_CARRY_CLASSES, CUBE_CARRY_MOVE, CUBE_DROP_OUT, CUBE_HOLD_MS, CUBE_HOLD_SLOP, CUBE_ICON_NAMES, CUBE_LOADING_COLOURS, CUBE_LOADING_LEVELS, CUBE_LOADING_STEP_MS, CUBE_LOADING_STICKERS, CUBE_LOADING_WAYS, CUBE_LOADING_WIDTH, CUBE_PINCH_APART, CUBE_PINCH_TOGETHER, CUBE_WHEEL_QUIET_MS, CubeArtChoices, CubeCarry, CubeContext, CubeHold, CubeIcon, CubeLoading, CubePicture, CubePinch, CubeSquare, CubeSquareTile, JUST_SAVED_MINUTES, MINE_SORT, PART_ICONS, REPORT_APP, REPORT_INCIDENTS_KEPT, REPORT_INCIDENTS_MS, REPORT_KINDS, ReportClient, ReportDiagnostics, ReportDraft, ReportErrorHandler, SQUARE_LEAST_CELL, SQUARE_LEAST_TALL, SQUARE_LIST_ROW, SQUARE_MAX_SIDE, SQUARE_ROOM_BELOW, TEXT_ORDERS, TURNING_BELOW, TURNING_NUDGE_UNTIL, TURNING_SIDES, VIEW_KEYS, addLevel, artFor, artLevel, bringLevel, bringOf, chooseArt, contextArtWidth, contextIcon, contextLevelFor, contextOf, contextSquare, cubeIconCells, directionWords, drawArt, drawCube, environmentOf, errorLine, findJustSaved, gridFor, hideLevel, insideOf, isArt, isView, loadingStickers, loadingWayFor, moveBefore, namesLevel, orderLevel, orderOf, orderParts, partsLevel, placesOf, provideReportDiagnostics, readArtChoices, refusalOf, reportContext, reportInterceptor, reportRefusal, reportRequest, routePattern, scrubbedPath, sizeFor, sortDirectionsLevel, sortItems, sortLevel, squareGap, squareLayout, squareLeast, squareLevelFor, squareTall, startsWheelGesture, stillStep, technicalLines, tellLevel, turningFront, turningRows, viewLevel, whereLevel, wouldLoop };
5679
+ export { ART_CHOICES_KEY, CONTEXT_CUBE_SOURCE, CONTEXT_CUBE_WORDS, CONTEXT_LAST_PARTS, CONTEXT_PART_ORDER, CUBE_ARTS, CUBE_CARRY_CLASSES, CUBE_CARRY_MOVE, CUBE_DROP_OUT, CUBE_HEAD_SWIPE, CUBE_HOLD_MS, CUBE_HOLD_SLOP, CUBE_ICON_NAMES, CUBE_LOADING_COLOURS, CUBE_LOADING_LEVELS, CUBE_LOADING_STEP_MS, CUBE_LOADING_STICKERS, CUBE_LOADING_WAYS, CUBE_LOADING_WIDTH, CUBE_PINCH_APART, CUBE_PINCH_TOGETHER, CUBE_ROOM_NARROW, CUBE_WHEEL_QUIET_MS, CUBE_WHEEL_STEP, CUBE_ZOOM_OPTIONS, CubeArtChoices, CubeCarry, CubeContext, CubeHead, CubeHold, CubeIcon, CubeLoading, CubePicture, CubePinch, CubeQuiet, CubeQuietLine, CubeRoom, CubeRoomMeasure, CubeSquare, CubeSquareTile, CubeTile, CubeZoomPinch, CubeZoomService, JUST_SAVED_MINUTES, MINE_SORT, PART_ICONS, REPORT_APP, REPORT_INCIDENTS_KEPT, REPORT_INCIDENTS_MS, REPORT_KINDS, ReportClient, ReportDiagnostics, ReportDraft, ReportErrorHandler, SQUARE_LEAST_CELL, SQUARE_LEAST_TALL, SQUARE_LIST_ROW, SQUARE_MAX_SIDE, SQUARE_ROOM_BELOW, TEXT_ORDERS, TURNING_BELOW, TURNING_NUDGE_UNTIL, TURNING_SIDES, VIEW_KEYS, addLevel, artFor, artLevel, bringLevel, bringOf, chooseArt, contextArtWidth, contextIcon, contextLevelFor, contextOf, contextSquare, cubeIconCells, cubeMovesThePage, cubeTilePicture, cubeTrailHolds, directionWords, drawArt, drawCube, environmentOf, errorLine, findJustSaved, gridFor, hideLevel, insideOf, isArt, isView, loadingStickers, loadingWayFor, moveBefore, namesLevel, orderLevel, orderOf, orderParts, partsLevel, placesOf, provideCubeZoom, provideReportDiagnostics, readArtChoices, refusalOf, reportContext, reportInterceptor, reportRefusal, reportRequest, routePattern, scrubbedPath, sizeFor, sortDirectionsLevel, sortItems, sortLevel, squareCell, squareGap, squareLayout, squareLeast, squareLevelFor, squareSideAt, squareTall, startsWheelGesture, stillStep, technicalLines, tellLevel, turningFront, turningRows, viewLevel, wheelWay, whereLevel, wouldLoop };
4321
5680
 
4322
5681
  //# sourceMappingURL=selimssevgi-cube-design-angular.mjs.map