@obliczeniowo/elementary
Version:
Library made in Angular version 20
349 lines (341 loc) • 26.5 kB
JavaScript
import * as i0 from '@angular/core';
import { model, input, EventEmitter, effect, Output, HostBinding, Input, Component, ViewChild, NgModule } from '@angular/core';
import * as i1 from '@angular/common';
import { CommonModule } from '@angular/common';
import * as i2 from '@obliczeniowo/elementary/buttons';
import { ButtonsModule } from '@obliczeniowo/elementary/buttons';
import * as i3 from '@obliczeniowo/elementary/text-pipes';
import { TextPipesModule } from '@obliczeniowo/elementary/text-pipes';
const clearPins$1 = [true, true, true, true, true, true, true, true, true, true];
const clearBlocked = [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
];
class BowlingPinsComponent {
styles = {};
pins = model([...clearPins$1]);
blocked = [...clearBlocked];
size = input(20);
translations = input({});
displayPoints = input(true);
displayReverse = input(true);
displayCancel = input(true);
disabled;
changed = new EventEmitter();
constructor() {
effect(() => {
this.pins();
const counted = this.count();
if (this.counted !== counted) {
this.counted = counted;
this.changed.emit(counted);
}
});
effect(() => {
const size = this.size();
this.styles = {
'margin.px': size / 2,
'width.px': size,
'height.px': size,
};
return size;
});
}
counted = 0;
switch(index) {
this.pins()[index] = !this.pins()[index];
this.counted = this.count();
this.pins.set([...this.pins()]);
this.changed.emit(this.counted);
}
ngOnChanges(changes) {
if (changes.blocked) {
this.blocked.forEach((b, index) => {
if (b) {
this.pins()[index] = true;
}
});
const counted = this.count();
if (this.counted !== counted) {
this.counted = counted;
this.changed.emit(counted);
}
}
}
count() {
return this.pins().reduce((p, c) => p + ((!c && 1) || 0), 0);
}
reset() {
this.pins.set([...clearPins$1]);
this.counted = 0;
this.changed.emit(0);
}
reverse() {
this.pins().forEach((b, index) => {
if (!this.blocked[index]) {
this.pins()[index] = !b;
}
});
this.counted = this.count();
this.pins.set([...this.pins()]);
this.changed.emit(this.counted);
}
clear() {
this.pins().forEach((b, index) => {
if (!this.blocked[index]) {
this.pins()[index] = true;
}
});
this.counted = this.count();
this.changed.emit(this.counted);
}
onKeyUp(event, index) {
if (event.key === ' ' || event.key === 'Enter') {
this.onClicked(index);
}
}
onClicked(index) {
if (!this.disabled) {
this.blocked[index] === false && this.switch(index);
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: BowlingPinsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: BowlingPinsComponent, isStandalone: false, selector: "obl-bowling-pins", inputs: { pins: { classPropertyName: "pins", publicName: "pins", isSignal: true, isRequired: false, transformFunction: null }, blocked: { classPropertyName: "blocked", publicName: "blocked", isSignal: false, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, translations: { classPropertyName: "translations", publicName: "translations", isSignal: true, isRequired: false, transformFunction: null }, displayPoints: { classPropertyName: "displayPoints", publicName: "displayPoints", isSignal: true, isRequired: false, transformFunction: null }, displayReverse: { classPropertyName: "displayReverse", publicName: "displayReverse", isSignal: true, isRequired: false, transformFunction: null }, displayCancel: { classPropertyName: "displayCancel", publicName: "displayCancel", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { pins: "pinsChange", changed: "changed" }, host: { properties: { "class.disabled": "this.disabled" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"row\">\n @for (i of [9, 8, 7, 6]; track i) {\n <div tabindex=0 [class.hit]=\"!pins()[i]\" [class.blocked]=\"blocked[i]\"\n [ngStyle]=\"styles\" (click)=\"onClicked(i)\" (keyup)=\"onKeyUp($event, i)\"></div>\n }\n</div>\n\n<div class=\"row\">\n @for (i of [5, 4, 3]; track i) {\n <div tabindex=0 [class.hit]=\"!pins()[i]\" [class.blocked]=\"blocked[i]\"\n [ngStyle]=\"styles\" (click)=\"onClicked(i)\" (keyup)=\"onKeyUp($event, i)\"></div>\n }\n</div>\n\n<div class=\"row\">\n @for (i of [2, 1]; track i) {\n <div tabindex=0 [class.hit]=\"!pins()[i]\" [class.blocked]=\"blocked[i]\" [ngStyle]=\"styles\"\n (click)=\"onClicked(i)\" (keyup)=\"onKeyUp($event, i)\"></div>\n }\n</div>\n\n<div class=\"row\">\n <div [class.hit]=\"!pins()[0]\" tabindex=0 [class.blocked]=\"blocked[0]\" (click)=\"onClicked(0)\" [ngStyle]=\"styles\"\n (keyup)=\"onKeyUp($event, 0)\">\n </div>\n</div>\n<div class=\"bottom\">\n @if (displayPoints()) {\n <div class=\"row\">{{ counted }} / 10</div>\n }\n\n @if (displayReverse() || displayCancel()) {\n <div class=\"row\">\n @if(displayReverse()) {\n <button oblButton icon=\"list\" [title]=\"'Reverse' | oblTranslation : translations()\"\n [disabled]=\"disabled\" (click)=\"reverse()\"></button>\n }\n @if(displayCancel()) {\n <button oblButton icon=\"cancel\" [title]=\"'Clear' | oblTranslation : translations()\"\n [disabled]=\"disabled\" (click)=\"clear()\"></button>\n }\n </div>\n }\n</div>", styles: [":host{display:block;width:fit-content}.row{display:flex;justify-content:center}.row div{background-color:var(--obl-bowling-pin-color, white);border-radius:50%;box-sizing:border-box;box-shadow:2px 2px 2px 2px var(--obl-bowling-pin-shadow, rgba(0, 0, 0, .2))}.row div.hit{background-color:var(--obl-bowling-pin-hit-color, red)}.row div.hit[tabindex]:focus{outline:2px var(--default-border-color) dotted}.row div.blocked{background-color:var(--obl-bowling-pin-blocked-color, #ff5b5b)}.row div.blocked[tabindex]:focus{outline:2px var(--default-border-color) dotted}.row div:hover{opacity:.5}.bottom{display:flex;align-items:center;justify-content:center;gap:10px}button{--obl-default-button-padding: 5px}\n"], dependencies: [{ kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.ButtonDirective, selector: "oblButton, [oblButton]", inputs: ["oblButton", "icon", "blockWhenLoading", "loading", "toggle", "selected", "link", "target"], exportAs: ["oblButton"] }, { kind: "pipe", type: i3.TranslationPipe, name: "oblTranslation" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: BowlingPinsComponent, decorators: [{
type: Component,
args: [{ selector: 'obl-bowling-pins', standalone: false, template: "<div class=\"row\">\n @for (i of [9, 8, 7, 6]; track i) {\n <div tabindex=0 [class.hit]=\"!pins()[i]\" [class.blocked]=\"blocked[i]\"\n [ngStyle]=\"styles\" (click)=\"onClicked(i)\" (keyup)=\"onKeyUp($event, i)\"></div>\n }\n</div>\n\n<div class=\"row\">\n @for (i of [5, 4, 3]; track i) {\n <div tabindex=0 [class.hit]=\"!pins()[i]\" [class.blocked]=\"blocked[i]\"\n [ngStyle]=\"styles\" (click)=\"onClicked(i)\" (keyup)=\"onKeyUp($event, i)\"></div>\n }\n</div>\n\n<div class=\"row\">\n @for (i of [2, 1]; track i) {\n <div tabindex=0 [class.hit]=\"!pins()[i]\" [class.blocked]=\"blocked[i]\" [ngStyle]=\"styles\"\n (click)=\"onClicked(i)\" (keyup)=\"onKeyUp($event, i)\"></div>\n }\n</div>\n\n<div class=\"row\">\n <div [class.hit]=\"!pins()[0]\" tabindex=0 [class.blocked]=\"blocked[0]\" (click)=\"onClicked(0)\" [ngStyle]=\"styles\"\n (keyup)=\"onKeyUp($event, 0)\">\n </div>\n</div>\n<div class=\"bottom\">\n @if (displayPoints()) {\n <div class=\"row\">{{ counted }} / 10</div>\n }\n\n @if (displayReverse() || displayCancel()) {\n <div class=\"row\">\n @if(displayReverse()) {\n <button oblButton icon=\"list\" [title]=\"'Reverse' | oblTranslation : translations()\"\n [disabled]=\"disabled\" (click)=\"reverse()\"></button>\n }\n @if(displayCancel()) {\n <button oblButton icon=\"cancel\" [title]=\"'Clear' | oblTranslation : translations()\"\n [disabled]=\"disabled\" (click)=\"clear()\"></button>\n }\n </div>\n }\n</div>", styles: [":host{display:block;width:fit-content}.row{display:flex;justify-content:center}.row div{background-color:var(--obl-bowling-pin-color, white);border-radius:50%;box-sizing:border-box;box-shadow:2px 2px 2px 2px var(--obl-bowling-pin-shadow, rgba(0, 0, 0, .2))}.row div.hit{background-color:var(--obl-bowling-pin-hit-color, red)}.row div.hit[tabindex]:focus{outline:2px var(--default-border-color) dotted}.row div.blocked{background-color:var(--obl-bowling-pin-blocked-color, #ff5b5b)}.row div.blocked[tabindex]:focus{outline:2px var(--default-border-color) dotted}.row div:hover{opacity:.5}.bottom{display:flex;align-items:center;justify-content:center;gap:10px}button{--obl-default-button-padding: 5px}\n"] }]
}], ctorParameters: () => [], propDecorators: { blocked: [{
type: Input
}], disabled: [{
type: HostBinding,
args: ['class.disabled']
}, {
type: Input
}], changed: [{
type: Output
}] } });
const clearPins = [true, true, true, true, true, true, true, true, true, true];
class BowlingRoundComponent {
first;
second;
current = input.required();
pins = model({ first: [...clearPins], second: [...clearPins] });
translations = input({});
changed = new EventEmitter();
scores = { first: 0, second: 0 };
reverse(bowling) {
return bowling.map(b => !b);
}
ngAfterViewInit() {
this.pins().first = this.first.pins();
this.pins().second = this.second.pins();
}
onChanged(witch, score) {
this.scores[witch] = score;
this.changed.emit({ ...this.scores });
this.pins.set({ first: [...this.first.pins()], second: [...this.second.pins()] });
}
reset() {
this.first.reset();
this.second.reset();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: BowlingRoundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.0.4", type: BowlingRoundComponent, isStandalone: false, selector: "obl-bowling-round", inputs: { current: { classPropertyName: "current", publicName: "current", isSignal: true, isRequired: true, transformFunction: null }, pins: { classPropertyName: "pins", publicName: "pins", isSignal: true, isRequired: false, transformFunction: null }, translations: { classPropertyName: "translations", publicName: "translations", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pins: "pinsChange", changed: "changed" }, viewQueries: [{ propertyName: "first", first: true, predicate: ["first"], descendants: true }, { propertyName: "second", first: true, predicate: ["second"], descendants: true }], ngImport: i0, template: "<div class=\"form\">\n <div>\n <p>{{ 'First round' | oblTranslation : translations() }}</p>\n <obl-bowling-pins [pins]=\"pins().first\" (changed)=\"onChanged('first', $event)\" [translations]=\"translations()\"\n #first></obl-bowling-pins>\n </div>\n <div>\n <p>{{ 'Second round' | oblTranslation : translations() }}</p>\n <obl-bowling-pins [pins]=\"pins().second\" [blocked]=\"reverse(first.pins())\" [disabled]=\"current() > 9\"\n [translations]=\"translations()\" (changed)=\"onChanged('second', $event)\" #second></obl-bowling-pins>\n </div>\n</div>", styles: [".form{display:flex;margin-top:10px}.form p{text-align:center}\n"], dependencies: [{ kind: "component", type: BowlingPinsComponent, selector: "obl-bowling-pins", inputs: ["pins", "blocked", "size", "translations", "displayPoints", "displayReverse", "displayCancel", "disabled"], outputs: ["pinsChange", "changed"] }, { kind: "pipe", type: i3.TranslationPipe, name: "oblTranslation" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: BowlingRoundComponent, decorators: [{
type: Component,
args: [{ selector: 'obl-bowling-round', standalone: false, template: "<div class=\"form\">\n <div>\n <p>{{ 'First round' | oblTranslation : translations() }}</p>\n <obl-bowling-pins [pins]=\"pins().first\" (changed)=\"onChanged('first', $event)\" [translations]=\"translations()\"\n #first></obl-bowling-pins>\n </div>\n <div>\n <p>{{ 'Second round' | oblTranslation : translations() }}</p>\n <obl-bowling-pins [pins]=\"pins().second\" [blocked]=\"reverse(first.pins())\" [disabled]=\"current() > 9\"\n [translations]=\"translations()\" (changed)=\"onChanged('second', $event)\" #second></obl-bowling-pins>\n </div>\n</div>", styles: [".form{display:flex;margin-top:10px}.form p{text-align:center}\n"] }]
}], propDecorators: { first: [{
type: ViewChild,
args: ['first']
}], second: [{
type: ViewChild,
args: ['second']
}], changed: [{
type: Output
}] } });
class RoundsModel {
_list = [];
current = 0;
set list(list) {
if (list.length < 10) {
return;
}
this._list = list;
this.current = this.list.findIndex(i => i.first === undefined && i.second === undefined);
if (this.current === -1) {
this.current = list.length;
}
this.calculate();
}
get list() {
return this._list;
}
counted = [];
totalScore = 0;
constructor() {
this.setEmpty();
}
getCurrent() {
return this.current;
}
setEmpty() {
this._list = new Array(10).fill(0).map(() => ({}));
this.current = 0;
this.counted = [];
this.totalScore = 0;
}
add(score) {
const { current } = this;
if (current < this.max()) {
this._list[this.current] = { ...score };
this.current++;
if (this.current === 10 && this.max() === 11 && this.list.length === 10) {
this.list.push({});
}
else if (this.current === 11 && this.max() === 12 && this.list.length === 11) {
this.list.push({});
}
}
this.calculate();
}
max() {
if (this.resultType(9) === 'Strike') {
if (this.resultType(10) === 'Strike') {
return 12;
}
return 11;
}
return 10;
}
calculate() {
this.counted = [];
this.totalScore = 0;
for (let i = 0; i < 10; i++) {
this.counted.push(this.count(i));
}
this.totalScore = this.total();
}
total() {
return this.list.reduce((p, _, index) => p + (index < 10 ? this.count(index) : 0), 0);
}
count(index) {
let sum = this.sum(index);
const result = this.resultType(index);
if (result === 'Strike') {
sum += this.sum(index + 1);
if (this.resultType(index + 1) === 'Strike') {
sum += this.sum(index + 2);
}
}
else if (result === 'Spare') {
sum += this.sum(index + 1);
}
return sum;
}
/** only to use inside of class as helper */
sum(index) {
const score = this.list[index];
if (score) {
return (score.first || 0) + (score.second || 0);
}
return 0;
}
/** checking type to calculate */
resultType(index) {
const score = this.list[index];
if (score) {
if (score.first === 10) {
return 'Strike';
}
else if ((score.first || 0) + (score.second || 0) === 10) {
return 'Spare';
}
else {
return 'Open';
}
}
return undefined;
}
}
class BowlingScoreComponent {
scores = new RoundsModel();
scoring = model([]);
editMode = input(true);
translations = input({});
constructor() {
effect(() => {
this.scores.list = this.scoring();
});
}
add(round) {
this.scores.add({
...round.scores,
firstPins: [...round.pins().first],
secondPins: [...round.pins().second],
});
this.scoring.set(this.scores.list);
round.reset();
}
reset(round) {
this.scores.setEmpty();
this.scoring.set(this.scores.list);
round.reset();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: BowlingScoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: BowlingScoreComponent, isStandalone: false, selector: "obl-bowling-score", inputs: { scoring: { classPropertyName: "scoring", publicName: "scoring", isSignal: true, isRequired: false, transformFunction: null }, editMode: { classPropertyName: "editMode", publicName: "editMode", isSignal: true, isRequired: false, transformFunction: null }, translations: { classPropertyName: "translations", publicName: "translations", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { scoring: "scoringChange" }, ngImport: i0, template: "<div>\n <table>\n <thead>\n <tr>\n <td>Frame</td>\n @for (score of scores.list; track score) {\n <td colspan=\"2\">\n {{ $index + 1 }}\n </td>\n }\n <td>Total score</td>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>Scores</td>\n @for (score of scores.list; track $index) {\n <td>\n @if (score.firstPins) {\n <obl-bowling-pins\n [size]=\"3\"\n [pins]=\"score.firstPins\"\n [disabled]=\"true\"\n [displayCancel]=\"false\"\n [displayPoints]=\"false\"\n [displayReverse]=\"false\"\n ></obl-bowling-pins>\n } @else {\n {{ score.first }}\n }\n </td>\n <td>\n @if (score.secondPins) {\n <obl-bowling-pins\n [size]=\"3\"\n [pins]=\"score.secondPins\"\n [disabled]=\"true\"\n [displayCancel]=\"false\"\n [displayPoints]=\"false\"\n [displayReverse]=\"false\"\n ></obl-bowling-pins>\n } @else {\n {{ score.second }}\n }\n </td>\n }\n </tr>\n <tr>\n <td>Running total:</td>\n @for (score of scores.list; track score) {\n <td colspan=\"2\">\n {{ scores.counted[$index] }}\n </td>\n }\n <td>\n {{ scores.totalScore }}\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n\n@if (editMode()) {\n <p>Click on pin to mark it as hit</p>\n <obl-bowling-round [current]=\"scores.getCurrent()\" #round></obl-bowling-round>\n <div class=\"row\">\n <button oblButton (click)=\"add(round)\">\n {{ 'Add' | oblTranslation : translations() }}\n </button>\n <button oblButton (click)=\"reset(round)\">\n {{ 'Reset' | oblTranslation : translations() }}\n </button>\n </div>\n}\n", styles: [":host{display:flex;flex-direction:column;align-items:center;padding:10px}:host>div{max-width:100%;overflow-x:auto;scrollbar-width:thin}:host>div::-webkit-scrollbar{width:9px}:host>div::-webkit-scrollbar-track{background:transparent}:host>div::-webkit-scrollbar-thumb{background-color:#9b9b9b80;border-radius:20px;border:transparent}td{text-align:center;padding:10px;border:1px solid gray}button{display:inline;height:55px;margin-top:15px;width:120px}table{border-collapse:collapse}\n"], dependencies: [{ kind: "directive", type: i2.ButtonDirective, selector: "oblButton, [oblButton]", inputs: ["oblButton", "icon", "blockWhenLoading", "loading", "toggle", "selected", "link", "target"], exportAs: ["oblButton"] }, { kind: "component", type: BowlingPinsComponent, selector: "obl-bowling-pins", inputs: ["pins", "blocked", "size", "translations", "displayPoints", "displayReverse", "displayCancel", "disabled"], outputs: ["pinsChange", "changed"] }, { kind: "component", type: BowlingRoundComponent, selector: "obl-bowling-round", inputs: ["current", "pins", "translations"], outputs: ["pinsChange", "changed"] }, { kind: "pipe", type: i3.TranslationPipe, name: "oblTranslation" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: BowlingScoreComponent, decorators: [{
type: Component,
args: [{ selector: 'obl-bowling-score', standalone: false, template: "<div>\n <table>\n <thead>\n <tr>\n <td>Frame</td>\n @for (score of scores.list; track score) {\n <td colspan=\"2\">\n {{ $index + 1 }}\n </td>\n }\n <td>Total score</td>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>Scores</td>\n @for (score of scores.list; track $index) {\n <td>\n @if (score.firstPins) {\n <obl-bowling-pins\n [size]=\"3\"\n [pins]=\"score.firstPins\"\n [disabled]=\"true\"\n [displayCancel]=\"false\"\n [displayPoints]=\"false\"\n [displayReverse]=\"false\"\n ></obl-bowling-pins>\n } @else {\n {{ score.first }}\n }\n </td>\n <td>\n @if (score.secondPins) {\n <obl-bowling-pins\n [size]=\"3\"\n [pins]=\"score.secondPins\"\n [disabled]=\"true\"\n [displayCancel]=\"false\"\n [displayPoints]=\"false\"\n [displayReverse]=\"false\"\n ></obl-bowling-pins>\n } @else {\n {{ score.second }}\n }\n </td>\n }\n </tr>\n <tr>\n <td>Running total:</td>\n @for (score of scores.list; track score) {\n <td colspan=\"2\">\n {{ scores.counted[$index] }}\n </td>\n }\n <td>\n {{ scores.totalScore }}\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n\n@if (editMode()) {\n <p>Click on pin to mark it as hit</p>\n <obl-bowling-round [current]=\"scores.getCurrent()\" #round></obl-bowling-round>\n <div class=\"row\">\n <button oblButton (click)=\"add(round)\">\n {{ 'Add' | oblTranslation : translations() }}\n </button>\n <button oblButton (click)=\"reset(round)\">\n {{ 'Reset' | oblTranslation : translations() }}\n </button>\n </div>\n}\n", styles: [":host{display:flex;flex-direction:column;align-items:center;padding:10px}:host>div{max-width:100%;overflow-x:auto;scrollbar-width:thin}:host>div::-webkit-scrollbar{width:9px}:host>div::-webkit-scrollbar-track{background:transparent}:host>div::-webkit-scrollbar-thumb{background-color:#9b9b9b80;border-radius:20px;border:transparent}td{text-align:center;padding:10px;border:1px solid gray}button{display:inline;height:55px;margin-top:15px;width:120px}table{border-collapse:collapse}\n"] }]
}], ctorParameters: () => [] });
class BowlingPinsModule {
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: BowlingPinsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.0.4", ngImport: i0, type: BowlingPinsModule, declarations: [BowlingPinsComponent,
BowlingRoundComponent,
BowlingScoreComponent], imports: [CommonModule,
ButtonsModule,
TextPipesModule,
TextPipesModule], exports: [BowlingPinsComponent,
BowlingRoundComponent,
BowlingScoreComponent] });
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: BowlingPinsModule, imports: [CommonModule,
ButtonsModule,
TextPipesModule,
TextPipesModule] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: BowlingPinsModule, decorators: [{
type: NgModule,
args: [{
declarations: [
BowlingPinsComponent,
BowlingRoundComponent,
BowlingScoreComponent
],
imports: [
CommonModule,
ButtonsModule,
TextPipesModule,
TextPipesModule
],
exports: [
BowlingPinsComponent,
BowlingRoundComponent,
BowlingScoreComponent
]
}]
}] });
/**
* Generated bundle index. Do not edit.
*/
export { BowlingPinsComponent, BowlingPinsModule, BowlingRoundComponent, BowlingScoreComponent, RoundsModel };
//# sourceMappingURL=obliczeniowo-elementary-bowling-pins.mjs.map