duck-dev-lib 0.0.75 → 0.0.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{duck-dev-lib-en-BUr6Xr1h.mjs → duck-dev-lib-en-XYugblp4.mjs} +62 -3
- package/fesm2022/{duck-dev-lib-ru-BxtBEpPE.mjs.map → duck-dev-lib-en-XYugblp4.mjs.map} +1 -1
- package/fesm2022/{duck-dev-lib-ru-BxtBEpPE.mjs → duck-dev-lib-ru-BBQhEnLr.mjs} +62 -3
- package/fesm2022/{duck-dev-lib-en-BUr6Xr1h.mjs.map → duck-dev-lib-ru-BBQhEnLr.mjs.map} +1 -1
- package/fesm2022/duck-dev-lib.mjs +431 -15
- package/fesm2022/duck-dev-lib.mjs.map +1 -1
- package/package.json +1 -1
- package/types/duck-dev-lib.d.ts +88 -2
|
@@ -5956,6 +5956,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImpor
|
|
|
5956
5956
|
|
|
5957
5957
|
class DuckDevSegmentNeobrutal {
|
|
5958
5958
|
cdr = inject(ChangeDetectorRef);
|
|
5959
|
+
destroyRef = inject(DestroyRef);
|
|
5960
|
+
host = inject(ElementRef);
|
|
5959
5961
|
value = input(undefined, { ...(ngDevMode ? { debugName: "value" } : {}) });
|
|
5960
5962
|
color = input(AccentEnumColor.White, { ...(ngDevMode ? { debugName: "color" } : {}) });
|
|
5961
5963
|
valueChange = output();
|
|
@@ -5967,15 +5969,22 @@ class DuckDevSegmentNeobrutal {
|
|
|
5967
5969
|
indicatorPosition = 0;
|
|
5968
5970
|
indicatorWidth = 0;
|
|
5969
5971
|
segmentStyle = computed(() => this.getSegmentStyle(this.color()), { ...(ngDevMode ? { debugName: "segmentStyle" } : {}) });
|
|
5972
|
+
resizeObserver = null;
|
|
5973
|
+
intersectionObserver = null;
|
|
5974
|
+
frameId = null;
|
|
5975
|
+
settleFrameId = null;
|
|
5970
5976
|
constructor() {
|
|
5971
5977
|
afterNextRender(() => {
|
|
5972
5978
|
this.rebuildButtons();
|
|
5973
5979
|
if (!this.selectedValue && this.buttons.length > 0) {
|
|
5974
5980
|
this.selectedValue = this.buttons[0].value;
|
|
5975
5981
|
}
|
|
5976
|
-
this.
|
|
5982
|
+
this.watchContainerSize();
|
|
5983
|
+
this.watchHostVisibility();
|
|
5984
|
+
this.scheduleIndicatorUpdate();
|
|
5977
5985
|
this.cdr.markForCheck();
|
|
5978
5986
|
});
|
|
5987
|
+
this.destroyRef.onDestroy(() => this.destroyObservers());
|
|
5979
5988
|
}
|
|
5980
5989
|
ngAfterContentInit() {
|
|
5981
5990
|
this.rebuildButtons();
|
|
@@ -5983,7 +5992,7 @@ class DuckDevSegmentNeobrutal {
|
|
|
5983
5992
|
this.selectedValue = incoming ?? this.selectedValue;
|
|
5984
5993
|
this.segmentButtons.changes.subscribe(() => {
|
|
5985
5994
|
this.rebuildButtons();
|
|
5986
|
-
|
|
5995
|
+
this.scheduleIndicatorUpdate();
|
|
5987
5996
|
});
|
|
5988
5997
|
}
|
|
5989
5998
|
selectButton(value, index) {
|
|
@@ -5994,7 +6003,7 @@ class DuckDevSegmentNeobrutal {
|
|
|
5994
6003
|
this.selectedValue = value;
|
|
5995
6004
|
this.valueChange.emit(value);
|
|
5996
6005
|
this.ionChange.emit({ detail: { value } });
|
|
5997
|
-
this.
|
|
6006
|
+
this.scheduleIndicatorUpdate(index);
|
|
5998
6007
|
}
|
|
5999
6008
|
rebuildButtons() {
|
|
6000
6009
|
const btns = this.segmentButtons?.toArray() ?? [];
|
|
@@ -6014,6 +6023,63 @@ class DuckDevSegmentNeobrutal {
|
|
|
6014
6023
|
const button = buttonElements[index];
|
|
6015
6024
|
this.indicatorWidth = button.offsetWidth;
|
|
6016
6025
|
this.indicatorPosition = button.offsetLeft;
|
|
6026
|
+
this.cdr.markForCheck();
|
|
6027
|
+
}
|
|
6028
|
+
}
|
|
6029
|
+
scheduleIndicatorUpdate(index = this.getSelectedIndex()) {
|
|
6030
|
+
if (this.frameId !== null) {
|
|
6031
|
+
cancelAnimationFrame(this.frameId);
|
|
6032
|
+
}
|
|
6033
|
+
this.frameId = requestAnimationFrame(() => {
|
|
6034
|
+
this.updateIndicator(index);
|
|
6035
|
+
this.frameId = requestAnimationFrame(() => {
|
|
6036
|
+
this.updateIndicator(index);
|
|
6037
|
+
this.frameId = null;
|
|
6038
|
+
});
|
|
6039
|
+
});
|
|
6040
|
+
}
|
|
6041
|
+
watchContainerSize() {
|
|
6042
|
+
const container = this.buttonsContainer().nativeElement;
|
|
6043
|
+
if (typeof ResizeObserver === 'undefined') {
|
|
6044
|
+
return;
|
|
6045
|
+
}
|
|
6046
|
+
this.resizeObserver = new ResizeObserver(() => {
|
|
6047
|
+
this.scheduleSettledIndicatorUpdate();
|
|
6048
|
+
});
|
|
6049
|
+
this.resizeObserver.observe(container);
|
|
6050
|
+
}
|
|
6051
|
+
watchHostVisibility() {
|
|
6052
|
+
if (typeof IntersectionObserver === 'undefined') {
|
|
6053
|
+
return;
|
|
6054
|
+
}
|
|
6055
|
+
this.intersectionObserver = new IntersectionObserver((entries) => {
|
|
6056
|
+
const entry = entries[0];
|
|
6057
|
+
if (entry?.isIntersecting) {
|
|
6058
|
+
this.scheduleSettledIndicatorUpdate();
|
|
6059
|
+
}
|
|
6060
|
+
});
|
|
6061
|
+
this.intersectionObserver.observe(this.host.nativeElement);
|
|
6062
|
+
}
|
|
6063
|
+
scheduleSettledIndicatorUpdate() {
|
|
6064
|
+
this.scheduleIndicatorUpdate();
|
|
6065
|
+
if (this.settleFrameId !== null) {
|
|
6066
|
+
cancelAnimationFrame(this.settleFrameId);
|
|
6067
|
+
}
|
|
6068
|
+
this.settleFrameId = requestAnimationFrame(() => {
|
|
6069
|
+
this.settleFrameId = requestAnimationFrame(() => {
|
|
6070
|
+
this.scheduleIndicatorUpdate();
|
|
6071
|
+
this.settleFrameId = null;
|
|
6072
|
+
});
|
|
6073
|
+
});
|
|
6074
|
+
}
|
|
6075
|
+
destroyObservers() {
|
|
6076
|
+
this.resizeObserver?.disconnect();
|
|
6077
|
+
this.intersectionObserver?.disconnect();
|
|
6078
|
+
if (this.frameId !== null) {
|
|
6079
|
+
cancelAnimationFrame(this.frameId);
|
|
6080
|
+
}
|
|
6081
|
+
if (this.settleFrameId !== null) {
|
|
6082
|
+
cancelAnimationFrame(this.settleFrameId);
|
|
6017
6083
|
}
|
|
6018
6084
|
}
|
|
6019
6085
|
getSegmentStyle(color) {
|
|
@@ -6330,11 +6396,53 @@ class DuckDevBreadcrumbNeobrutal {
|
|
|
6330
6396
|
color = input(AccentEnumColor.White, { ...(ngDevMode ? { debugName: "color" } : {}) });
|
|
6331
6397
|
isMobile = input(false, { ...(ngDevMode ? { debugName: "isMobile" } : {}), transform: booleanAttribute });
|
|
6332
6398
|
navigate = output();
|
|
6333
|
-
|
|
6334
|
-
|
|
6399
|
+
listRef = viewChild('listEl', { ...(ngDevMode ? { debugName: "listRef" } : {}) });
|
|
6400
|
+
visibleItems = computed(() => this.items(), { ...(ngDevMode ? { debugName: "visibleItems" } : {}) });
|
|
6335
6401
|
breadcrumbStyle = computed(() => this.getPalette(this.color()), { ...(ngDevMode ? { debugName: "breadcrumbStyle" } : {}) });
|
|
6336
6402
|
activePopoverIndex = signal(null, { ...(ngDevMode ? { debugName: "activePopoverIndex" } : {}) });
|
|
6403
|
+
isDragging = signal(false, { ...(ngDevMode ? { debugName: "isDragging" } : {}) });
|
|
6404
|
+
dragStartX = 0;
|
|
6405
|
+
scrollStartX = 0;
|
|
6406
|
+
hasDragged = false;
|
|
6407
|
+
destroyRef = inject(DestroyRef);
|
|
6408
|
+
onMouseMove = (e) => {
|
|
6409
|
+
const el = this.listRef()?.nativeElement;
|
|
6410
|
+
if (!el)
|
|
6411
|
+
return;
|
|
6412
|
+
e.preventDefault();
|
|
6413
|
+
const dx = e.clientX - this.dragStartX;
|
|
6414
|
+
el.scrollLeft = this.scrollStartX - dx;
|
|
6415
|
+
if (Math.abs(dx) > 3) {
|
|
6416
|
+
this.hasDragged = true;
|
|
6417
|
+
}
|
|
6418
|
+
};
|
|
6419
|
+
onMouseUp = () => {
|
|
6420
|
+
this.isDragging.set(false);
|
|
6421
|
+
document.removeEventListener('mousemove', this.onMouseMove);
|
|
6422
|
+
document.removeEventListener('mouseup', this.onMouseUp);
|
|
6423
|
+
};
|
|
6424
|
+
onListMouseDown(e) {
|
|
6425
|
+
const el = this.listRef()?.nativeElement;
|
|
6426
|
+
if (!el || el.scrollWidth <= el.clientWidth)
|
|
6427
|
+
return;
|
|
6428
|
+
this.isDragging.set(true);
|
|
6429
|
+
this.hasDragged = false;
|
|
6430
|
+
this.dragStartX = e.clientX;
|
|
6431
|
+
this.scrollStartX = el.scrollLeft;
|
|
6432
|
+
document.addEventListener('mousemove', this.onMouseMove);
|
|
6433
|
+
document.addEventListener('mouseup', this.onMouseUp);
|
|
6434
|
+
}
|
|
6435
|
+
constructor() {
|
|
6436
|
+
this.destroyRef.onDestroy(() => {
|
|
6437
|
+
document.removeEventListener('mousemove', this.onMouseMove);
|
|
6438
|
+
document.removeEventListener('mouseup', this.onMouseUp);
|
|
6439
|
+
});
|
|
6440
|
+
}
|
|
6337
6441
|
onNavigate(item, index) {
|
|
6442
|
+
if (this.hasDragged) {
|
|
6443
|
+
this.hasDragged = false;
|
|
6444
|
+
return;
|
|
6445
|
+
}
|
|
6338
6446
|
if (!this.isMobile()) {
|
|
6339
6447
|
this.navigate.emit(item);
|
|
6340
6448
|
return;
|
|
@@ -6409,12 +6517,12 @@ class DuckDevBreadcrumbNeobrutal {
|
|
|
6409
6517
|
}
|
|
6410
6518
|
}
|
|
6411
6519
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: DuckDevBreadcrumbNeobrutal, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6412
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.1", type: DuckDevBreadcrumbNeobrutal, isStandalone: true, selector: "dd-breadcrumb-neobrutal", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, isMobile: { classPropertyName: "isMobile", publicName: "isMobile", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navigate: "navigate" }, ngImport: i0, template: "<nav\n class=\"neo-bc\"\n [class.neo-bc--mobile]=\"isMobile()\"\n
|
|
6520
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.1", type: DuckDevBreadcrumbNeobrutal, isStandalone: true, selector: "dd-breadcrumb-neobrutal", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, isMobile: { classPropertyName: "isMobile", publicName: "isMobile", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navigate: "navigate" }, viewQueries: [{ propertyName: "listRef", first: true, predicate: ["listEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<nav\n class=\"neo-bc\"\n [class.neo-bc--mobile]=\"isMobile()\"\n aria-label=\"Breadcrumb\"\n [ngStyle]=\"breadcrumbStyle()\"\n>\n <ol\n class=\"neo-bc__list\"\n #listEl\n [class.neo-bc__list--dragging]=\"isDragging()\"\n (mousedown)=\"onListMouseDown($event)\"\n >\n @for (item of visibleItems(); track $index; let last = $last) {\n <li\n class=\"neo-bc__item\"\n animate.enter=\"neo-bc__item--enter\"\n animate.leave=\"neo-bc__item--leave\"\n >\n @if (!last && item.url) {\n <button\n class=\"neo-bc__link\"\n [class.neo-bc__link--popover-open]=\"isPopoverOpen($index)\"\n type=\"button\"\n [attr.aria-label]=\"item.label\"\n (click)=\"onNavigate(item, $index)\"\n (keydown.escape)=\"closePopover()\"\n >\n <span class=\"neo-bc__chip\">\n <span class=\"neo-bc__label\">{{ item.label }}</span>\n </span>\n <span class=\"neo-bc__popover\" role=\"tooltip\">{{ item.label }}</span>\n </button>\n } @else {\n <span\n class=\"neo-bc__current\"\n [class.neo-bc__current--popover-open]=\"isPopoverOpen($index)\"\n tabindex=\"0\"\n [attr.aria-current]=\"last ? 'page' : null\"\n [attr.aria-label]=\"item.label\"\n (click)=\"onCurrentClick($index)\"\n (keydown.enter)=\"onCurrentClick($index)\"\n (keydown.space)=\"$event.preventDefault(); onCurrentClick($index)\"\n (keydown.escape)=\"closePopover()\"\n >\n <span class=\"neo-bc__chip neo-bc__chip--active\">\n <span class=\"neo-bc__label\">{{ item.label }}</span>\n </span>\n <span class=\"neo-bc__popover\" role=\"tooltip\">{{ item.label }}</span>\n </span>\n }\n <span\n class=\"neo-bc__arrow\"\n [class.neo-bc__arrow--visible]=\"!last\"\n aria-hidden=\"true\"\n ></span>\n </li>\n }\n </ol>\n</nav>\n", styles: [":root{--dd-appear-time: .5s;--dd-gray-0: #ffffff;--dd-gray-100: #f8f5f6;--dd-gray-200: #f2f4f5;--dd-gray-300: #eaeaea;--dd-gray-400: #999999;--dd-gray-500: #252525;--dd-gray-600: #121312;--dd-success: #a7ffb5ba;--dd-secondary: #6829ff;--dd-accent-orange: #fe7b20;--dd-orange-active: #e5350f;--dd-accent-pink: #fd6ca9;--dd-accent-yellow: #ffd027;--dd-accent-blue: #3254f3;--dd-base-0: var(--dd-gray-0);--dd-base-100: var(--dd-gray-100);--dd-base-200: var(--dd-gray-200);--dd-base-300: var(--dd-gray-300);--dd-base-400: var(--dd-gray-400);--dd-base-500: var(--dd-gray-500);--dd-base-600: var(--dd-gray-600);--dd-background: var(--dd-gray-200);--dd-base-success: var(--dd-success);--dd-base-secondary: var(--dd-secondary);--dd-base-accent-orange: var(--dd-accent-orange);--dd-base-active-orange: var(--dd-orange-active);--dd-base-accent-pink: var(--dd-accent-pink);--dd-base-accent-yellow: var(--dd-accent-yellow);--dd-base-accent-blue: var(--dd-accent-blue);--dd-neo-ink: var(--dd-gray-600);--dd-neo-paper: var(--dd-gray-0);--dd-neo-shadow: var(--dd-gray-600)}[ddTheme=dark]{--dd-base-0: var(--dd-gray-600);--dd-base-100: var(--dd-gray-500);--dd-base-200: var(--dd-gray-400);--dd-base-300: var(--dd-gray-300);--dd-base-400: var(--dd-gray-200);--dd-base-500: var(--dd-gray-100);--dd-base-600: var(--dd-gray-0);--dd-background: var(--dd-gray-500);--dd-base-accent-yellow: #934032;--dd-neo-ink: var(--dd-secondary);--dd-neo-paper: var(--dd-gray-600);--dd-neo-shadow: rgba(0, 0, 0, .55)}[ddTheme=violet]{--dd-base-50: var(--dd-magenta-500)}:host{display:block;box-sizing:border-box}.neo-bc{--neo-bc-row-height: 31px;--neo-bc-block-padding-y: 20px;--neo-bc-border-y: 6px;--neo-bc-arrow-gap: 8px;--neo-bc-arrow-top: 6px;--neo-bc-arrow-bottom: 6px;--neo-bc-arrow-left: 8px;--neo-bc-arrow-space: calc( var(--neo-bc-arrow-gap) + var(--neo-bc-arrow-left) + var(--neo-bc-arrow-gap) );display:block;width:100%;height:calc(var(--neo-bc-row-height) + var(--neo-bc-block-padding-y) + var(--neo-bc-border-y));box-sizing:border-box;padding:10px 14px;border:3px solid var(--dd-neo-ink);background:var(--neo-bc-surface);box-shadow:5px 5px 0 var(--neo-bc-shadow),5px 5px 0 3px var(--dd-neo-shadow);transition:padding .2s ease,box-shadow .2s ease}.neo-bc__list{display:flex;align-items:center;width:100%;height:100%;min-width:0;margin:0;padding:0;list-style:none;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:thin;cursor:grab}.neo-bc__list--dragging{cursor:grabbing;-webkit-user-select:none;user-select:none}.neo-bc__item{position:relative;display:flex;align-items:center;flex-shrink:0;min-width:0}.neo-bc__chip{display:flex;align-items:center;width:100%;min-width:0;max-width:100%;box-sizing:border-box;padding:5px 12px;border:2px solid var(--neo-bc-link);background:transparent;color:var(--neo-bc-link);font-size:.78rem;font-weight:900;line-height:1.1;letter-spacing:.08em;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:transform .16s ease,background .16s ease,box-shadow .16s ease}.neo-bc__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.neo-bc__link{position:relative;display:flex;align-items:center;padding:0;border:none;background:transparent;font:inherit;cursor:pointer;touch-action:pan-x}.neo-bc__link:hover .neo-bc__chip{transform:translate(-1px,-1px);box-shadow:2px 2px 0 var(--dd-neo-shadow);background:color-mix(in srgb,var(--neo-bc-shadow) 14%,transparent)}.neo-bc__link:focus-visible .neo-bc__chip{outline:3px solid var(--neo-bc-link);outline-offset:1px}.neo-bc__current{position:relative;display:flex;align-items:center;touch-action:pan-x}.neo-bc__current:focus-visible .neo-bc__chip{outline:3px solid var(--neo-bc-link);outline-offset:1px}.neo-bc__chip--active{border-color:var(--dd-neo-ink);background:var(--neo-bc-separator);color:var(--neo-bc-active)}.neo-bc__arrow{display:inline-block;flex-shrink:0;width:0;height:0;margin-left:0;border-style:solid;border-width:0;border-color:transparent transparent transparent var(--neo-bc-separator);opacity:0;transform-origin:left center;transform:scaleX(.2);transition:margin-left .2s ease,border-width .2s ease,opacity .2s ease,transform .2s ease}.neo-bc__arrow--visible{margin-right:var(--neo-bc-arrow-gap);margin-left:var(--neo-bc-arrow-gap);border-width:var(--neo-bc-arrow-top) 0 var(--neo-bc-arrow-bottom) var(--neo-bc-arrow-left);opacity:1;transform:scaleX(1)}.neo-bc__popover{position:absolute;left:0;top:calc(100% + 6px);z-index:2;display:block;max-width:min(320px,100vw - 32px);padding:6px 10px;border:2px solid var(--dd-neo-ink);background:var(--neo-bc-surface);box-shadow:3px 3px 0 var(--neo-bc-shadow),3px 3px 0 2px var(--dd-neo-shadow);color:var(--neo-bc-link);font-size:.72rem;font-weight:900;line-height:1.2;overflow-wrap:anywhere;text-transform:none;opacity:0;visibility:hidden;transform:translate(-2px,-2px);pointer-events:none;transition:opacity .14s ease,transform .14s ease,visibility .14s ease}.neo-bc:not(.neo-bc--mobile) .neo-bc__link:hover .neo-bc__popover,.neo-bc:not(.neo-bc--mobile) .neo-bc__link:focus .neo-bc__popover,.neo-bc:not(.neo-bc--mobile) .neo-bc__current:hover .neo-bc__popover,.neo-bc:not(.neo-bc--mobile) .neo-bc__current:focus .neo-bc__popover{opacity:1;visibility:visible;transform:translate(0)}.neo-bc__link--popover-open .neo-bc__popover,.neo-bc__current--popover-open .neo-bc__popover{opacity:1;visibility:visible;transform:translate(0)}@keyframes neo-bc-item-enter{0%{opacity:0;transform:scale(.96)}50%{opacity:.5}to{opacity:1;transform:scale(1)}}@keyframes neo-bc-item-leave{0%{opacity:1;transform:scale(1)}50%{opacity:0}to{opacity:0;transform:scale(.96)}}.neo-bc__item--enter{animation:neo-bc-item-enter .34s cubic-bezier(.16,1,.3,1) both}.neo-bc__item--leave{animation:neo-bc-item-leave .24s cubic-bezier(.4,0,1,1) both}@media(max-width:768px){.neo-bc{--neo-bc-row-height: 28px;--neo-bc-block-padding-y: 16px;--neo-bc-arrow-gap: 6px;--neo-bc-arrow-top: 5px;--neo-bc-arrow-bottom: 5px;--neo-bc-arrow-left: 7px;padding:8px 10px;box-shadow:4px 4px 0 var(--neo-bc-shadow),4px 4px 0 3px var(--dd-neo-shadow)}.neo-bc__chip{padding:4px 10px;font-size:.72rem}}@media(max-width:480px){.neo-bc{--neo-bc-border-y: 4px;--neo-bc-arrow-gap: 4px;--neo-bc-arrow-top: 4px;--neo-bc-arrow-bottom: 4px;--neo-bc-arrow-left: 6px;padding:8px;border-width:2px;box-shadow:3px 3px 0 var(--neo-bc-shadow),3px 3px 0 2px var(--dd-neo-shadow)}.neo-bc__chip{padding:5px 8px;border-width:2px;font-size:.68rem;letter-spacing:.05em}.neo-bc__popover{max-width:min(260px,100vw - 24px);font-size:.68rem}}@media(max-width:360px){.neo-bc{--neo-bc-row-height: 24px;--neo-bc-block-padding-y: 12px;--neo-bc-arrow-gap: 3px;--neo-bc-arrow-top: 3px;--neo-bc-arrow-bottom: 3px;--neo-bc-arrow-left: 5px;padding:6px}.neo-bc__chip{padding:4px 6px;font-size:.62rem;letter-spacing:.03em}}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
6413
6521
|
}
|
|
6414
6522
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: DuckDevBreadcrumbNeobrutal, decorators: [{
|
|
6415
6523
|
type: Component,
|
|
6416
|
-
args: [{ selector: 'dd-breadcrumb-neobrutal', standalone: true, imports: [NgStyle], template: "<nav\n class=\"neo-bc\"\n [class.neo-bc--mobile]=\"isMobile()\"\n
|
|
6417
|
-
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], isMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "isMobile", required: false }] }], navigate: [{ type: i0.Output, args: ["navigate"] }] } });
|
|
6524
|
+
args: [{ selector: 'dd-breadcrumb-neobrutal', standalone: true, imports: [NgStyle], template: "<nav\n class=\"neo-bc\"\n [class.neo-bc--mobile]=\"isMobile()\"\n aria-label=\"Breadcrumb\"\n [ngStyle]=\"breadcrumbStyle()\"\n>\n <ol\n class=\"neo-bc__list\"\n #listEl\n [class.neo-bc__list--dragging]=\"isDragging()\"\n (mousedown)=\"onListMouseDown($event)\"\n >\n @for (item of visibleItems(); track $index; let last = $last) {\n <li\n class=\"neo-bc__item\"\n animate.enter=\"neo-bc__item--enter\"\n animate.leave=\"neo-bc__item--leave\"\n >\n @if (!last && item.url) {\n <button\n class=\"neo-bc__link\"\n [class.neo-bc__link--popover-open]=\"isPopoverOpen($index)\"\n type=\"button\"\n [attr.aria-label]=\"item.label\"\n (click)=\"onNavigate(item, $index)\"\n (keydown.escape)=\"closePopover()\"\n >\n <span class=\"neo-bc__chip\">\n <span class=\"neo-bc__label\">{{ item.label }}</span>\n </span>\n <span class=\"neo-bc__popover\" role=\"tooltip\">{{ item.label }}</span>\n </button>\n } @else {\n <span\n class=\"neo-bc__current\"\n [class.neo-bc__current--popover-open]=\"isPopoverOpen($index)\"\n tabindex=\"0\"\n [attr.aria-current]=\"last ? 'page' : null\"\n [attr.aria-label]=\"item.label\"\n (click)=\"onCurrentClick($index)\"\n (keydown.enter)=\"onCurrentClick($index)\"\n (keydown.space)=\"$event.preventDefault(); onCurrentClick($index)\"\n (keydown.escape)=\"closePopover()\"\n >\n <span class=\"neo-bc__chip neo-bc__chip--active\">\n <span class=\"neo-bc__label\">{{ item.label }}</span>\n </span>\n <span class=\"neo-bc__popover\" role=\"tooltip\">{{ item.label }}</span>\n </span>\n }\n <span\n class=\"neo-bc__arrow\"\n [class.neo-bc__arrow--visible]=\"!last\"\n aria-hidden=\"true\"\n ></span>\n </li>\n }\n </ol>\n</nav>\n", styles: [":root{--dd-appear-time: .5s;--dd-gray-0: #ffffff;--dd-gray-100: #f8f5f6;--dd-gray-200: #f2f4f5;--dd-gray-300: #eaeaea;--dd-gray-400: #999999;--dd-gray-500: #252525;--dd-gray-600: #121312;--dd-success: #a7ffb5ba;--dd-secondary: #6829ff;--dd-accent-orange: #fe7b20;--dd-orange-active: #e5350f;--dd-accent-pink: #fd6ca9;--dd-accent-yellow: #ffd027;--dd-accent-blue: #3254f3;--dd-base-0: var(--dd-gray-0);--dd-base-100: var(--dd-gray-100);--dd-base-200: var(--dd-gray-200);--dd-base-300: var(--dd-gray-300);--dd-base-400: var(--dd-gray-400);--dd-base-500: var(--dd-gray-500);--dd-base-600: var(--dd-gray-600);--dd-background: var(--dd-gray-200);--dd-base-success: var(--dd-success);--dd-base-secondary: var(--dd-secondary);--dd-base-accent-orange: var(--dd-accent-orange);--dd-base-active-orange: var(--dd-orange-active);--dd-base-accent-pink: var(--dd-accent-pink);--dd-base-accent-yellow: var(--dd-accent-yellow);--dd-base-accent-blue: var(--dd-accent-blue);--dd-neo-ink: var(--dd-gray-600);--dd-neo-paper: var(--dd-gray-0);--dd-neo-shadow: var(--dd-gray-600)}[ddTheme=dark]{--dd-base-0: var(--dd-gray-600);--dd-base-100: var(--dd-gray-500);--dd-base-200: var(--dd-gray-400);--dd-base-300: var(--dd-gray-300);--dd-base-400: var(--dd-gray-200);--dd-base-500: var(--dd-gray-100);--dd-base-600: var(--dd-gray-0);--dd-background: var(--dd-gray-500);--dd-base-accent-yellow: #934032;--dd-neo-ink: var(--dd-secondary);--dd-neo-paper: var(--dd-gray-600);--dd-neo-shadow: rgba(0, 0, 0, .55)}[ddTheme=violet]{--dd-base-50: var(--dd-magenta-500)}:host{display:block;box-sizing:border-box}.neo-bc{--neo-bc-row-height: 31px;--neo-bc-block-padding-y: 20px;--neo-bc-border-y: 6px;--neo-bc-arrow-gap: 8px;--neo-bc-arrow-top: 6px;--neo-bc-arrow-bottom: 6px;--neo-bc-arrow-left: 8px;--neo-bc-arrow-space: calc( var(--neo-bc-arrow-gap) + var(--neo-bc-arrow-left) + var(--neo-bc-arrow-gap) );display:block;width:100%;height:calc(var(--neo-bc-row-height) + var(--neo-bc-block-padding-y) + var(--neo-bc-border-y));box-sizing:border-box;padding:10px 14px;border:3px solid var(--dd-neo-ink);background:var(--neo-bc-surface);box-shadow:5px 5px 0 var(--neo-bc-shadow),5px 5px 0 3px var(--dd-neo-shadow);transition:padding .2s ease,box-shadow .2s ease}.neo-bc__list{display:flex;align-items:center;width:100%;height:100%;min-width:0;margin:0;padding:0;list-style:none;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:thin;cursor:grab}.neo-bc__list--dragging{cursor:grabbing;-webkit-user-select:none;user-select:none}.neo-bc__item{position:relative;display:flex;align-items:center;flex-shrink:0;min-width:0}.neo-bc__chip{display:flex;align-items:center;width:100%;min-width:0;max-width:100%;box-sizing:border-box;padding:5px 12px;border:2px solid var(--neo-bc-link);background:transparent;color:var(--neo-bc-link);font-size:.78rem;font-weight:900;line-height:1.1;letter-spacing:.08em;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:transform .16s ease,background .16s ease,box-shadow .16s ease}.neo-bc__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.neo-bc__link{position:relative;display:flex;align-items:center;padding:0;border:none;background:transparent;font:inherit;cursor:pointer;touch-action:pan-x}.neo-bc__link:hover .neo-bc__chip{transform:translate(-1px,-1px);box-shadow:2px 2px 0 var(--dd-neo-shadow);background:color-mix(in srgb,var(--neo-bc-shadow) 14%,transparent)}.neo-bc__link:focus-visible .neo-bc__chip{outline:3px solid var(--neo-bc-link);outline-offset:1px}.neo-bc__current{position:relative;display:flex;align-items:center;touch-action:pan-x}.neo-bc__current:focus-visible .neo-bc__chip{outline:3px solid var(--neo-bc-link);outline-offset:1px}.neo-bc__chip--active{border-color:var(--dd-neo-ink);background:var(--neo-bc-separator);color:var(--neo-bc-active)}.neo-bc__arrow{display:inline-block;flex-shrink:0;width:0;height:0;margin-left:0;border-style:solid;border-width:0;border-color:transparent transparent transparent var(--neo-bc-separator);opacity:0;transform-origin:left center;transform:scaleX(.2);transition:margin-left .2s ease,border-width .2s ease,opacity .2s ease,transform .2s ease}.neo-bc__arrow--visible{margin-right:var(--neo-bc-arrow-gap);margin-left:var(--neo-bc-arrow-gap);border-width:var(--neo-bc-arrow-top) 0 var(--neo-bc-arrow-bottom) var(--neo-bc-arrow-left);opacity:1;transform:scaleX(1)}.neo-bc__popover{position:absolute;left:0;top:calc(100% + 6px);z-index:2;display:block;max-width:min(320px,100vw - 32px);padding:6px 10px;border:2px solid var(--dd-neo-ink);background:var(--neo-bc-surface);box-shadow:3px 3px 0 var(--neo-bc-shadow),3px 3px 0 2px var(--dd-neo-shadow);color:var(--neo-bc-link);font-size:.72rem;font-weight:900;line-height:1.2;overflow-wrap:anywhere;text-transform:none;opacity:0;visibility:hidden;transform:translate(-2px,-2px);pointer-events:none;transition:opacity .14s ease,transform .14s ease,visibility .14s ease}.neo-bc:not(.neo-bc--mobile) .neo-bc__link:hover .neo-bc__popover,.neo-bc:not(.neo-bc--mobile) .neo-bc__link:focus .neo-bc__popover,.neo-bc:not(.neo-bc--mobile) .neo-bc__current:hover .neo-bc__popover,.neo-bc:not(.neo-bc--mobile) .neo-bc__current:focus .neo-bc__popover{opacity:1;visibility:visible;transform:translate(0)}.neo-bc__link--popover-open .neo-bc__popover,.neo-bc__current--popover-open .neo-bc__popover{opacity:1;visibility:visible;transform:translate(0)}@keyframes neo-bc-item-enter{0%{opacity:0;transform:scale(.96)}50%{opacity:.5}to{opacity:1;transform:scale(1)}}@keyframes neo-bc-item-leave{0%{opacity:1;transform:scale(1)}50%{opacity:0}to{opacity:0;transform:scale(.96)}}.neo-bc__item--enter{animation:neo-bc-item-enter .34s cubic-bezier(.16,1,.3,1) both}.neo-bc__item--leave{animation:neo-bc-item-leave .24s cubic-bezier(.4,0,1,1) both}@media(max-width:768px){.neo-bc{--neo-bc-row-height: 28px;--neo-bc-block-padding-y: 16px;--neo-bc-arrow-gap: 6px;--neo-bc-arrow-top: 5px;--neo-bc-arrow-bottom: 5px;--neo-bc-arrow-left: 7px;padding:8px 10px;box-shadow:4px 4px 0 var(--neo-bc-shadow),4px 4px 0 3px var(--dd-neo-shadow)}.neo-bc__chip{padding:4px 10px;font-size:.72rem}}@media(max-width:480px){.neo-bc{--neo-bc-border-y: 4px;--neo-bc-arrow-gap: 4px;--neo-bc-arrow-top: 4px;--neo-bc-arrow-bottom: 4px;--neo-bc-arrow-left: 6px;padding:8px;border-width:2px;box-shadow:3px 3px 0 var(--neo-bc-shadow),3px 3px 0 2px var(--dd-neo-shadow)}.neo-bc__chip{padding:5px 8px;border-width:2px;font-size:.68rem;letter-spacing:.05em}.neo-bc__popover{max-width:min(260px,100vw - 24px);font-size:.68rem}}@media(max-width:360px){.neo-bc{--neo-bc-row-height: 24px;--neo-bc-block-padding-y: 12px;--neo-bc-arrow-gap: 3px;--neo-bc-arrow-top: 3px;--neo-bc-arrow-bottom: 3px;--neo-bc-arrow-left: 5px;padding:6px}.neo-bc__chip{padding:4px 6px;font-size:.62rem;letter-spacing:.03em}}\n"] }]
|
|
6525
|
+
}], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], isMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "isMobile", required: false }] }], navigate: [{ type: i0.Output, args: ["navigate"] }], listRef: [{ type: i0.ViewChild, args: ['listEl', { isSignal: true }] }] } });
|
|
6418
6526
|
|
|
6419
6527
|
class BreadcrumbBlock {
|
|
6420
6528
|
colorViolet = AccentEnumColor.Violet;
|
|
@@ -6432,12 +6540,35 @@ class BreadcrumbBlock {
|
|
|
6432
6540
|
{ label: 'Navigation', url: '/navigation' },
|
|
6433
6541
|
{ label: 'Breadcrumb' },
|
|
6434
6542
|
];
|
|
6543
|
+
sampleLabels = [
|
|
6544
|
+
'Settings', 'Profile', 'Dashboard', 'Analytics', 'Reports', 'Users', 'Permissions',
|
|
6545
|
+
];
|
|
6546
|
+
interactiveItems = signal([
|
|
6547
|
+
{ label: 'Home', url: '/' },
|
|
6548
|
+
{ label: 'Components', url: '/components' },
|
|
6549
|
+
{ label: 'Breadcrumb' },
|
|
6550
|
+
], { ...(ngDevMode ? { debugName: "interactiveItems" } : {}) });
|
|
6435
6551
|
lastNavigated = signal('', { ...(ngDevMode ? { debugName: "lastNavigated" } : {}) });
|
|
6436
6552
|
onNavigate(item) {
|
|
6437
6553
|
this.lastNavigated.set(item.label);
|
|
6438
6554
|
}
|
|
6555
|
+
addBreadcrumb() {
|
|
6556
|
+
const current = this.interactiveItems();
|
|
6557
|
+
const label = this.sampleLabels[current.length % this.sampleLabels.length];
|
|
6558
|
+
const updated = current.map(item => ({ ...item, url: item.url || `/${item.label.toLowerCase()}` }));
|
|
6559
|
+
updated.push({ label });
|
|
6560
|
+
this.interactiveItems.set(updated);
|
|
6561
|
+
}
|
|
6562
|
+
removeBreadcrumb() {
|
|
6563
|
+
const current = this.interactiveItems();
|
|
6564
|
+
if (current.length <= 1)
|
|
6565
|
+
return;
|
|
6566
|
+
const updated = current.slice(0, -1);
|
|
6567
|
+
updated[updated.length - 1] = { label: updated[updated.length - 1].label };
|
|
6568
|
+
this.interactiveItems.set(updated);
|
|
6569
|
+
}
|
|
6439
6570
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: BreadcrumbBlock, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6440
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.1", type: BreadcrumbBlock, isStandalone: true, selector: "app-breadcrumb-block", ngImport: i0, template: "<div class=\"demo-container\">\n <h1>{{ 'breadcrumbDoc.title' | transloco }}</h1>\n\n <dd-card-section>\n <h2>{{ 'breadcrumbDoc.basic.title' | transloco }}</h2>\n <p class=\"description\">{{ 'breadcrumbDoc.basic.description' | transloco }}</p>\n\n <div class=\"usage-block\">\n <h3>{{ 'breadcrumbDoc.basic.usage' | transloco }}</h3>\n <pre><code><dd-breadcrumb-classic\n [items]=\"breadcrumbs\"\n (navigate)=\"onNavigate($event)\"\n/>\n\n<dd-breadcrumb-neobrutal\n [items]=\"breadcrumbs\"\n [color]=\"colorViolet\"\n (navigate)=\"onNavigate($event)\"\n/></code></pre>\n </div>\n\n <div class=\"inputs-block\">\n <h3>{{ 'breadcrumbDoc.basic.inputs' | transloco }}</h3>\n <ul>\n <li><strong>items</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.items' | transloco }}</li>\n <li><strong>separator</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.separator' | transloco }}</li>\n <li><strong>color</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.color' | transloco }}</li>\n <li><strong>navigate</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.navigate' | transloco }}</li>\n </ul>\n </div>\n\n <div class=\"examples-block\">\n <h3>{{ 'breadcrumbDoc.basic.examples' | transloco }}</h3>\n\n <div class=\"example-row\">\n <div class=\"example-item\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.classic' | transloco }}</p>\n <dd-breadcrumb-classic [items]=\"basicItems\" (navigate)=\"onNavigate($event)\" />\n </div>\n\n <div class=\"example-item\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.classicLong' | transloco }}</p>\n <dd-breadcrumb-classic\n [items]=\"longItems\"\n separator=\">\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalWhite' | transloco }}</p>\n <dd-breadcrumb-neobrutal [items]=\"basicItems\" (navigate)=\"onNavigate($event)\" />\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalViolet' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"basicItems\"\n [color]=\"colorViolet\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalOrange' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"longItems\"\n [color]=\"colorOrange\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalDark' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"basicItems\"\n [color]=\"colorDark\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n @if (lastNavigated()) {\n <div class=\"state-hint state-hint--neobrutal\">\n <span>{{ 'breadcrumbDoc.labels.navigated' | transloco }}: </span>\n <b>{{ lastNavigated() }}</b>\n </div>\n }\n </div>\n </dd-card-section>\n</div>\n", styles: [".demo-container{max-width:1200px;margin:0 auto;padding:40px 20px}.demo-container h1{font-size:36px;font-weight:700;color:var(--dd-base-600);margin-bottom:40px;text-align:center;border-bottom:3px solid var(--dd-base-accent-blue);padding-bottom:20px}.demo-container h2{font-size:28px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;border-left:4px solid var(--dd-base-accent-blue);padding-left:15px}.demo-container .description{font-size:16px;line-height:1.6;color:var(--dd-base-400);margin-bottom:25px;padding:15px;background:var(--dd-base-100);border-radius:8px;border-left:3px solid var(--dd-base-300)}.demo-container h3{font-size:20px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;margin-top:25px}.demo-container .usage-block{margin-bottom:25px}.demo-container .usage-block pre{background:var(--dd-base-600);color:var(--dd-base-100);padding:20px;border-radius:8px;overflow-x:auto;margin:0}.demo-container .usage-block pre code{font-family:Courier New,Courier,monospace;font-size:14px;line-height:1.5}.demo-container .inputs-block{margin-bottom:25px}.demo-container .inputs-block ul{list-style:none;padding:0;margin:0}.demo-container .inputs-block ul li{padding:12px 15px;margin-bottom:8px;background:var(--dd-base-100);border-radius:6px;border-left:3px solid var(--dd-base-accent-blue);font-size:15px;line-height:1.5;color:var(--dd-base-500)}.demo-container .inputs-block ul li strong{color:var(--dd-base-accent-blue);font-weight:600}.demo-container .examples-block .example-row{display:flex;gap:20px;margin-bottom:20px;flex-wrap:wrap}.demo-container .examples-block .example-row .example-item{flex:1;min-width:280px;padding:20px;background:var(--dd-base-100);border-radius:8px;border:2px solid var(--dd-base-300);display:flex;flex-direction:column;gap:15px;transition:all .3s ease}.demo-container .examples-block .example-row .example-item:hover{border-color:var(--dd-base-accent-blue);box-shadow:0 4px 12px var(--dd-base-300)}.demo-container .examples-block .example-row .example-item .example-label{font-size:14px;font-weight:600;color:var(--dd-base-400);margin:0;text-align:left}.demo-container .examples-block .example-row .example-item.example-item--neobrutal{gap:18px;border-radius:0;border-width:3px;border-color:var(--dd-neo-ink);background:linear-gradient(135deg,color-mix(in srgb,var(--dd-base-accent-yellow) 18%,transparent) 0 14%,transparent 14% 100%),var(--dd-base-0);box-shadow:8px 8px 0 var(--dd-base-accent-blue)}.demo-container .examples-block .state-hint--neobrutal{display:inline-flex;align-items:center;gap:8px;padding:6px 10px;border:2px solid var(--dd-neo-ink);background:var(--dd-base-accent-yellow);color:var(--dd-base-600);font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase}@media(max-width:768px){.demo-container{padding:20px 15px}.demo-container h1{font-size:28px}.demo-container .examples-block .example-row{flex-direction:column}.demo-container .examples-block .example-row .example-item{min-width:100%}}\n"], dependencies: [{ kind: "component", type: DuckDevCardSection, selector: "dd-card-section" }, { kind: "component", type: DuckDevBreadcrumbClassic, selector: "dd-breadcrumb-classic", inputs: ["items", "separator"], outputs: ["navigate"] }, { kind: "component", type: DuckDevBreadcrumbNeobrutal, selector: "dd-breadcrumb-neobrutal", inputs: ["items", "color", "isMobile"], outputs: ["navigate"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
|
|
6571
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.1", type: BreadcrumbBlock, isStandalone: true, selector: "app-breadcrumb-block", ngImport: i0, template: "<div class=\"demo-container\">\n <h1>{{ 'breadcrumbDoc.title' | transloco }}</h1>\n\n <dd-card-section>\n <h2>{{ 'breadcrumbDoc.basic.title' | transloco }}</h2>\n <p class=\"description\">{{ 'breadcrumbDoc.basic.description' | transloco }}</p>\n\n <div class=\"usage-block\">\n <h3>{{ 'breadcrumbDoc.basic.usage' | transloco }}</h3>\n <pre><code><dd-breadcrumb-classic\n [items]=\"breadcrumbs\"\n (navigate)=\"onNavigate($event)\"\n/>\n\n<dd-breadcrumb-neobrutal\n [items]=\"breadcrumbs\"\n [color]=\"colorViolet\"\n (navigate)=\"onNavigate($event)\"\n/></code></pre>\n </div>\n\n <div class=\"inputs-block\">\n <h3>{{ 'breadcrumbDoc.basic.inputs' | transloco }}</h3>\n <ul>\n <li><strong>items</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.items' | transloco }}</li>\n <li><strong>separator</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.separator' | transloco }}</li>\n <li><strong>color</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.color' | transloco }}</li>\n <li><strong>navigate</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.navigate' | transloco }}</li>\n </ul>\n </div>\n\n <div class=\"examples-block\">\n <h3>{{ 'breadcrumbDoc.basic.examples' | transloco }}</h3>\n\n <div class=\"example-row\">\n <div class=\"example-item\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.classic' | transloco }}</p>\n <dd-breadcrumb-classic [items]=\"basicItems\" (navigate)=\"onNavigate($event)\" />\n </div>\n\n <div class=\"example-item\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.classicLong' | transloco }}</p>\n <dd-breadcrumb-classic\n [items]=\"longItems\"\n separator=\">\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalWhite' | transloco }}</p>\n <dd-breadcrumb-neobrutal [items]=\"basicItems\" (navigate)=\"onNavigate($event)\" />\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalViolet' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"basicItems\"\n [color]=\"colorViolet\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalOrange' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"longItems\"\n [color]=\"colorOrange\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalDark' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"basicItems\"\n [color]=\"colorDark\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n @if (lastNavigated()) {\n <div class=\"state-hint state-hint--neobrutal\">\n <span>{{ 'breadcrumbDoc.labels.navigated' | transloco }}: </span>\n <b>{{ lastNavigated() }}</b>\n </div>\n }\n </div>\n </dd-card-section>\n\n <dd-card-section>\n <h2>{{ 'breadcrumbDoc.interactive.title' | transloco }}</h2>\n <p class=\"description\">{{ 'breadcrumbDoc.interactive.description' | transloco }}</p>\n\n <div class=\"interactive-controls\">\n <button class=\"interactive-btn interactive-btn--add\" type=\"button\" (click)=\"addBreadcrumb()\">\n + {{ 'breadcrumbDoc.interactive.add' | transloco }}\n </button>\n <button\n class=\"interactive-btn interactive-btn--remove\"\n type=\"button\"\n [disabled]=\"interactiveItems().length <= 1\"\n (click)=\"removeBreadcrumb()\"\n >\n \u2212 {{ 'breadcrumbDoc.interactive.remove' | transloco }}\n </button>\n <span class=\"interactive-count\">\n {{ 'breadcrumbDoc.interactive.count' | transloco }}: {{ interactiveItems().length }}\n </span>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal example-item--wide\">\n <dd-breadcrumb-neobrutal\n [items]=\"interactiveItems()\"\n [color]=\"colorViolet\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n </dd-card-section>\n</div>\n", styles: [".demo-container{max-width:1200px;margin:0 auto;padding:40px 20px}.demo-container h1{font-size:36px;font-weight:700;color:var(--dd-base-600);margin-bottom:40px;text-align:center;border-bottom:3px solid var(--dd-base-accent-blue);padding-bottom:20px}.demo-container h2{font-size:28px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;border-left:4px solid var(--dd-base-accent-blue);padding-left:15px}.demo-container .description{font-size:16px;line-height:1.6;color:var(--dd-base-400);margin-bottom:25px;padding:15px;background:var(--dd-base-100);border-radius:8px;border-left:3px solid var(--dd-base-300)}.demo-container h3{font-size:20px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;margin-top:25px}.demo-container .usage-block{margin-bottom:25px}.demo-container .usage-block pre{background:var(--dd-base-600);color:var(--dd-base-100);padding:20px;border-radius:8px;overflow-x:auto;margin:0}.demo-container .usage-block pre code{font-family:Courier New,Courier,monospace;font-size:14px;line-height:1.5}.demo-container .inputs-block{margin-bottom:25px}.demo-container .inputs-block ul{list-style:none;padding:0;margin:0}.demo-container .inputs-block ul li{padding:12px 15px;margin-bottom:8px;background:var(--dd-base-100);border-radius:6px;border-left:3px solid var(--dd-base-accent-blue);font-size:15px;line-height:1.5;color:var(--dd-base-500)}.demo-container .inputs-block ul li strong{color:var(--dd-base-accent-blue);font-weight:600}.demo-container .examples-block .example-row{display:flex;gap:20px;margin-bottom:20px;flex-wrap:wrap}.demo-container .examples-block .example-row .example-item{flex:1;min-width:280px;padding:20px;background:var(--dd-base-100);border-radius:8px;border:2px solid var(--dd-base-300);display:flex;flex-direction:column;gap:15px;transition:all .3s ease}.demo-container .examples-block .example-row .example-item:hover{border-color:var(--dd-base-accent-blue);box-shadow:0 4px 12px var(--dd-base-300)}.demo-container .examples-block .example-row .example-item .example-label{font-size:14px;font-weight:600;color:var(--dd-base-400);margin:0;text-align:left}.demo-container .examples-block .example-row .example-item.example-item--neobrutal{gap:18px;border-radius:0;border-width:3px;border-color:var(--dd-neo-ink);background:linear-gradient(135deg,color-mix(in srgb,var(--dd-base-accent-yellow) 18%,transparent) 0 14%,transparent 14% 100%),var(--dd-base-0);box-shadow:8px 8px 0 var(--dd-base-accent-blue)}.demo-container .examples-block .state-hint--neobrutal{display:inline-flex;align-items:center;gap:8px;padding:6px 10px;border:2px solid var(--dd-neo-ink);background:var(--dd-base-accent-yellow);color:var(--dd-base-600);font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase}.demo-container .interactive-controls{display:flex;align-items:center;gap:12px;margin-bottom:20px;flex-wrap:wrap}.demo-container .interactive-btn{padding:8px 16px;border:3px solid var(--dd-neo-ink);font-size:14px;font-weight:900;text-transform:uppercase;letter-spacing:.08em;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease}.demo-container .interactive-btn:hover:not(:disabled){transform:translate(-2px,-2px);box-shadow:4px 4px 0 var(--dd-neo-ink)}.demo-container .interactive-btn:disabled{opacity:.4;cursor:not-allowed}.demo-container .interactive-btn--add{background:var(--dd-base-accent-blue);color:var(--dd-base-0)}.demo-container .interactive-btn--remove{background:var(--dd-base-accent-pink);color:var(--dd-base-0)}.demo-container .interactive-count{padding:6px 10px;border:2px solid var(--dd-neo-ink);background:var(--dd-base-accent-yellow);color:var(--dd-base-600);font-size:12px;font-weight:900;letter-spacing:.08em;text-transform:uppercase}.demo-container .example-item--wide{flex:1 1 100%;min-width:100%}@media(max-width:768px){.demo-container{padding:20px 15px}.demo-container h1{font-size:28px}.demo-container .examples-block .example-row{flex-direction:column}.demo-container .examples-block .example-row .example-item{min-width:100%}}\n"], dependencies: [{ kind: "component", type: DuckDevCardSection, selector: "dd-card-section" }, { kind: "component", type: DuckDevBreadcrumbClassic, selector: "dd-breadcrumb-classic", inputs: ["items", "separator"], outputs: ["navigate"] }, { kind: "component", type: DuckDevBreadcrumbNeobrutal, selector: "dd-breadcrumb-neobrutal", inputs: ["items", "color", "isMobile"], outputs: ["navigate"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
|
|
6441
6572
|
}
|
|
6442
6573
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: BreadcrumbBlock, decorators: [{
|
|
6443
6574
|
type: Component,
|
|
@@ -6446,7 +6577,290 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImpor
|
|
|
6446
6577
|
DuckDevCardSection,
|
|
6447
6578
|
DuckDevBreadcrumbClassic,
|
|
6448
6579
|
DuckDevBreadcrumbNeobrutal,
|
|
6449
|
-
], template: "<div class=\"demo-container\">\n <h1>{{ 'breadcrumbDoc.title' | transloco }}</h1>\n\n <dd-card-section>\n <h2>{{ 'breadcrumbDoc.basic.title' | transloco }}</h2>\n <p class=\"description\">{{ 'breadcrumbDoc.basic.description' | transloco }}</p>\n\n <div class=\"usage-block\">\n <h3>{{ 'breadcrumbDoc.basic.usage' | transloco }}</h3>\n <pre><code><dd-breadcrumb-classic\n [items]=\"breadcrumbs\"\n (navigate)=\"onNavigate($event)\"\n/>\n\n<dd-breadcrumb-neobrutal\n [items]=\"breadcrumbs\"\n [color]=\"colorViolet\"\n (navigate)=\"onNavigate($event)\"\n/></code></pre>\n </div>\n\n <div class=\"inputs-block\">\n <h3>{{ 'breadcrumbDoc.basic.inputs' | transloco }}</h3>\n <ul>\n <li><strong>items</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.items' | transloco }}</li>\n <li><strong>separator</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.separator' | transloco }}</li>\n <li><strong>color</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.color' | transloco }}</li>\n <li><strong>navigate</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.navigate' | transloco }}</li>\n </ul>\n </div>\n\n <div class=\"examples-block\">\n <h3>{{ 'breadcrumbDoc.basic.examples' | transloco }}</h3>\n\n <div class=\"example-row\">\n <div class=\"example-item\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.classic' | transloco }}</p>\n <dd-breadcrumb-classic [items]=\"basicItems\" (navigate)=\"onNavigate($event)\" />\n </div>\n\n <div class=\"example-item\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.classicLong' | transloco }}</p>\n <dd-breadcrumb-classic\n [items]=\"longItems\"\n separator=\">\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalWhite' | transloco }}</p>\n <dd-breadcrumb-neobrutal [items]=\"basicItems\" (navigate)=\"onNavigate($event)\" />\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalViolet' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"basicItems\"\n [color]=\"colorViolet\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalOrange' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"longItems\"\n [color]=\"colorOrange\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalDark' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"basicItems\"\n [color]=\"colorDark\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n @if (lastNavigated()) {\n <div class=\"state-hint state-hint--neobrutal\">\n <span>{{ 'breadcrumbDoc.labels.navigated' | transloco }}: </span>\n <b>{{ lastNavigated() }}</b>\n </div>\n }\n </div>\n </dd-card-section>\n</div>\n", styles: [".demo-container{max-width:1200px;margin:0 auto;padding:40px 20px}.demo-container h1{font-size:36px;font-weight:700;color:var(--dd-base-600);margin-bottom:40px;text-align:center;border-bottom:3px solid var(--dd-base-accent-blue);padding-bottom:20px}.demo-container h2{font-size:28px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;border-left:4px solid var(--dd-base-accent-blue);padding-left:15px}.demo-container .description{font-size:16px;line-height:1.6;color:var(--dd-base-400);margin-bottom:25px;padding:15px;background:var(--dd-base-100);border-radius:8px;border-left:3px solid var(--dd-base-300)}.demo-container h3{font-size:20px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;margin-top:25px}.demo-container .usage-block{margin-bottom:25px}.demo-container .usage-block pre{background:var(--dd-base-600);color:var(--dd-base-100);padding:20px;border-radius:8px;overflow-x:auto;margin:0}.demo-container .usage-block pre code{font-family:Courier New,Courier,monospace;font-size:14px;line-height:1.5}.demo-container .inputs-block{margin-bottom:25px}.demo-container .inputs-block ul{list-style:none;padding:0;margin:0}.demo-container .inputs-block ul li{padding:12px 15px;margin-bottom:8px;background:var(--dd-base-100);border-radius:6px;border-left:3px solid var(--dd-base-accent-blue);font-size:15px;line-height:1.5;color:var(--dd-base-500)}.demo-container .inputs-block ul li strong{color:var(--dd-base-accent-blue);font-weight:600}.demo-container .examples-block .example-row{display:flex;gap:20px;margin-bottom:20px;flex-wrap:wrap}.demo-container .examples-block .example-row .example-item{flex:1;min-width:280px;padding:20px;background:var(--dd-base-100);border-radius:8px;border:2px solid var(--dd-base-300);display:flex;flex-direction:column;gap:15px;transition:all .3s ease}.demo-container .examples-block .example-row .example-item:hover{border-color:var(--dd-base-accent-blue);box-shadow:0 4px 12px var(--dd-base-300)}.demo-container .examples-block .example-row .example-item .example-label{font-size:14px;font-weight:600;color:var(--dd-base-400);margin:0;text-align:left}.demo-container .examples-block .example-row .example-item.example-item--neobrutal{gap:18px;border-radius:0;border-width:3px;border-color:var(--dd-neo-ink);background:linear-gradient(135deg,color-mix(in srgb,var(--dd-base-accent-yellow) 18%,transparent) 0 14%,transparent 14% 100%),var(--dd-base-0);box-shadow:8px 8px 0 var(--dd-base-accent-blue)}.demo-container .examples-block .state-hint--neobrutal{display:inline-flex;align-items:center;gap:8px;padding:6px 10px;border:2px solid var(--dd-neo-ink);background:var(--dd-base-accent-yellow);color:var(--dd-base-600);font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase}@media(max-width:768px){.demo-container{padding:20px 15px}.demo-container h1{font-size:28px}.demo-container .examples-block .example-row{flex-direction:column}.demo-container .examples-block .example-row .example-item{min-width:100%}}\n"] }]
|
|
6580
|
+
], template: "<div class=\"demo-container\">\n <h1>{{ 'breadcrumbDoc.title' | transloco }}</h1>\n\n <dd-card-section>\n <h2>{{ 'breadcrumbDoc.basic.title' | transloco }}</h2>\n <p class=\"description\">{{ 'breadcrumbDoc.basic.description' | transloco }}</p>\n\n <div class=\"usage-block\">\n <h3>{{ 'breadcrumbDoc.basic.usage' | transloco }}</h3>\n <pre><code><dd-breadcrumb-classic\n [items]=\"breadcrumbs\"\n (navigate)=\"onNavigate($event)\"\n/>\n\n<dd-breadcrumb-neobrutal\n [items]=\"breadcrumbs\"\n [color]=\"colorViolet\"\n (navigate)=\"onNavigate($event)\"\n/></code></pre>\n </div>\n\n <div class=\"inputs-block\">\n <h3>{{ 'breadcrumbDoc.basic.inputs' | transloco }}</h3>\n <ul>\n <li><strong>items</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.items' | transloco }}</li>\n <li><strong>separator</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.separator' | transloco }}</li>\n <li><strong>color</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.color' | transloco }}</li>\n <li><strong>navigate</strong> \u2014 {{ 'breadcrumbDoc.inputsDesc.navigate' | transloco }}</li>\n </ul>\n </div>\n\n <div class=\"examples-block\">\n <h3>{{ 'breadcrumbDoc.basic.examples' | transloco }}</h3>\n\n <div class=\"example-row\">\n <div class=\"example-item\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.classic' | transloco }}</p>\n <dd-breadcrumb-classic [items]=\"basicItems\" (navigate)=\"onNavigate($event)\" />\n </div>\n\n <div class=\"example-item\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.classicLong' | transloco }}</p>\n <dd-breadcrumb-classic\n [items]=\"longItems\"\n separator=\">\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalWhite' | transloco }}</p>\n <dd-breadcrumb-neobrutal [items]=\"basicItems\" (navigate)=\"onNavigate($event)\" />\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalViolet' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"basicItems\"\n [color]=\"colorViolet\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalOrange' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"longItems\"\n [color]=\"colorOrange\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'breadcrumbDoc.examples.neobrutalDark' | transloco }}</p>\n <dd-breadcrumb-neobrutal\n [items]=\"basicItems\"\n [color]=\"colorDark\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n\n @if (lastNavigated()) {\n <div class=\"state-hint state-hint--neobrutal\">\n <span>{{ 'breadcrumbDoc.labels.navigated' | transloco }}: </span>\n <b>{{ lastNavigated() }}</b>\n </div>\n }\n </div>\n </dd-card-section>\n\n <dd-card-section>\n <h2>{{ 'breadcrumbDoc.interactive.title' | transloco }}</h2>\n <p class=\"description\">{{ 'breadcrumbDoc.interactive.description' | transloco }}</p>\n\n <div class=\"interactive-controls\">\n <button class=\"interactive-btn interactive-btn--add\" type=\"button\" (click)=\"addBreadcrumb()\">\n + {{ 'breadcrumbDoc.interactive.add' | transloco }}\n </button>\n <button\n class=\"interactive-btn interactive-btn--remove\"\n type=\"button\"\n [disabled]=\"interactiveItems().length <= 1\"\n (click)=\"removeBreadcrumb()\"\n >\n \u2212 {{ 'breadcrumbDoc.interactive.remove' | transloco }}\n </button>\n <span class=\"interactive-count\">\n {{ 'breadcrumbDoc.interactive.count' | transloco }}: {{ interactiveItems().length }}\n </span>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal example-item--wide\">\n <dd-breadcrumb-neobrutal\n [items]=\"interactiveItems()\"\n [color]=\"colorViolet\"\n (navigate)=\"onNavigate($event)\"\n />\n </div>\n </div>\n </dd-card-section>\n</div>\n", styles: [".demo-container{max-width:1200px;margin:0 auto;padding:40px 20px}.demo-container h1{font-size:36px;font-weight:700;color:var(--dd-base-600);margin-bottom:40px;text-align:center;border-bottom:3px solid var(--dd-base-accent-blue);padding-bottom:20px}.demo-container h2{font-size:28px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;border-left:4px solid var(--dd-base-accent-blue);padding-left:15px}.demo-container .description{font-size:16px;line-height:1.6;color:var(--dd-base-400);margin-bottom:25px;padding:15px;background:var(--dd-base-100);border-radius:8px;border-left:3px solid var(--dd-base-300)}.demo-container h3{font-size:20px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;margin-top:25px}.demo-container .usage-block{margin-bottom:25px}.demo-container .usage-block pre{background:var(--dd-base-600);color:var(--dd-base-100);padding:20px;border-radius:8px;overflow-x:auto;margin:0}.demo-container .usage-block pre code{font-family:Courier New,Courier,monospace;font-size:14px;line-height:1.5}.demo-container .inputs-block{margin-bottom:25px}.demo-container .inputs-block ul{list-style:none;padding:0;margin:0}.demo-container .inputs-block ul li{padding:12px 15px;margin-bottom:8px;background:var(--dd-base-100);border-radius:6px;border-left:3px solid var(--dd-base-accent-blue);font-size:15px;line-height:1.5;color:var(--dd-base-500)}.demo-container .inputs-block ul li strong{color:var(--dd-base-accent-blue);font-weight:600}.demo-container .examples-block .example-row{display:flex;gap:20px;margin-bottom:20px;flex-wrap:wrap}.demo-container .examples-block .example-row .example-item{flex:1;min-width:280px;padding:20px;background:var(--dd-base-100);border-radius:8px;border:2px solid var(--dd-base-300);display:flex;flex-direction:column;gap:15px;transition:all .3s ease}.demo-container .examples-block .example-row .example-item:hover{border-color:var(--dd-base-accent-blue);box-shadow:0 4px 12px var(--dd-base-300)}.demo-container .examples-block .example-row .example-item .example-label{font-size:14px;font-weight:600;color:var(--dd-base-400);margin:0;text-align:left}.demo-container .examples-block .example-row .example-item.example-item--neobrutal{gap:18px;border-radius:0;border-width:3px;border-color:var(--dd-neo-ink);background:linear-gradient(135deg,color-mix(in srgb,var(--dd-base-accent-yellow) 18%,transparent) 0 14%,transparent 14% 100%),var(--dd-base-0);box-shadow:8px 8px 0 var(--dd-base-accent-blue)}.demo-container .examples-block .state-hint--neobrutal{display:inline-flex;align-items:center;gap:8px;padding:6px 10px;border:2px solid var(--dd-neo-ink);background:var(--dd-base-accent-yellow);color:var(--dd-base-600);font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase}.demo-container .interactive-controls{display:flex;align-items:center;gap:12px;margin-bottom:20px;flex-wrap:wrap}.demo-container .interactive-btn{padding:8px 16px;border:3px solid var(--dd-neo-ink);font-size:14px;font-weight:900;text-transform:uppercase;letter-spacing:.08em;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease}.demo-container .interactive-btn:hover:not(:disabled){transform:translate(-2px,-2px);box-shadow:4px 4px 0 var(--dd-neo-ink)}.demo-container .interactive-btn:disabled{opacity:.4;cursor:not-allowed}.demo-container .interactive-btn--add{background:var(--dd-base-accent-blue);color:var(--dd-base-0)}.demo-container .interactive-btn--remove{background:var(--dd-base-accent-pink);color:var(--dd-base-0)}.demo-container .interactive-count{padding:6px 10px;border:2px solid var(--dd-neo-ink);background:var(--dd-base-accent-yellow);color:var(--dd-base-600);font-size:12px;font-weight:900;letter-spacing:.08em;text-transform:uppercase}.demo-container .example-item--wide{flex:1 1 100%;min-width:100%}@media(max-width:768px){.demo-container{padding:20px 15px}.demo-container h1{font-size:28px}.demo-container .examples-block .example-row{flex-direction:column}.demo-container .examples-block .example-row .example-item{min-width:100%}}\n"] }]
|
|
6581
|
+
}] });
|
|
6582
|
+
|
|
6583
|
+
class DuckDevSelectorOption {
|
|
6584
|
+
value = input.required({ ...(ngDevMode ? { debugName: "value" } : {}) });
|
|
6585
|
+
contentId = input(undefined, { ...(ngDevMode ? { debugName: "contentId" } : {}) });
|
|
6586
|
+
templateRef = viewChild.required('contentTpl');
|
|
6587
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: DuckDevSelectorOption, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6588
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.0.1", type: DuckDevSelectorOption, isStandalone: true, selector: "duck-dev-selector-option", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, contentId: { classPropertyName: "contentId", publicName: "contentId", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "templateRef", first: true, predicate: ["contentTpl"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
6589
|
+
<ng-template #contentTpl>
|
|
6590
|
+
<ng-content />
|
|
6591
|
+
</ng-template>
|
|
6592
|
+
`, isInline: true, styles: [":host{display:none}\n"] });
|
|
6593
|
+
}
|
|
6594
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: DuckDevSelectorOption, decorators: [{
|
|
6595
|
+
type: Component,
|
|
6596
|
+
args: [{ selector: 'duck-dev-selector-option', imports: [], template: `
|
|
6597
|
+
<ng-template #contentTpl>
|
|
6598
|
+
<ng-content />
|
|
6599
|
+
</ng-template>
|
|
6600
|
+
`, styles: [":host{display:none}\n"] }]
|
|
6601
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], contentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentId", required: false }] }], templateRef: [{ type: i0.ViewChild, args: ['contentTpl', { isSignal: true }] }] } });
|
|
6602
|
+
|
|
6603
|
+
function getNeobrutalSelectorStyle(color) {
|
|
6604
|
+
switch (color) {
|
|
6605
|
+
case AccentEnumColor.Violet:
|
|
6606
|
+
return {
|
|
6607
|
+
'--neo-selector-surface': 'var(--dd-base-secondary)',
|
|
6608
|
+
'--neo-selector-active': 'color-mix(in srgb, var(--dd-base-secondary) 78%, var(--dd-base-0))',
|
|
6609
|
+
'--neo-selector-text': 'var(--dd-base-0)',
|
|
6610
|
+
'--neo-selector-shadow': 'var(--dd-base-accent-blue)',
|
|
6611
|
+
'--neo-selector-accent': 'var(--dd-base-accent-yellow)',
|
|
6612
|
+
};
|
|
6613
|
+
case AccentEnumColor.Orange:
|
|
6614
|
+
return {
|
|
6615
|
+
'--neo-selector-surface': 'var(--dd-base-accent-orange)',
|
|
6616
|
+
'--neo-selector-active': 'color-mix(in srgb, var(--dd-base-accent-yellow) 68%, var(--dd-base-0))',
|
|
6617
|
+
'--neo-selector-text': 'var(--dd-base-600)',
|
|
6618
|
+
'--neo-selector-shadow': 'var(--dd-base-accent-pink)',
|
|
6619
|
+
'--neo-selector-accent': 'var(--dd-base-accent-yellow)',
|
|
6620
|
+
};
|
|
6621
|
+
case AccentEnumColor.Gray:
|
|
6622
|
+
return {
|
|
6623
|
+
'--neo-selector-surface': 'var(--dd-base-200)',
|
|
6624
|
+
'--neo-selector-active': 'var(--dd-base-0)',
|
|
6625
|
+
'--neo-selector-text': 'var(--dd-base-600)',
|
|
6626
|
+
'--neo-selector-shadow': 'var(--dd-base-accent-blue)',
|
|
6627
|
+
'--neo-selector-accent': 'var(--dd-base-accent-orange)',
|
|
6628
|
+
};
|
|
6629
|
+
case AccentEnumColor.Dark:
|
|
6630
|
+
return {
|
|
6631
|
+
'--neo-selector-surface': 'var(--dd-base-600)',
|
|
6632
|
+
'--neo-selector-active': 'color-mix(in srgb, var(--dd-base-600) 84%, var(--dd-base-400))',
|
|
6633
|
+
'--neo-selector-text': 'var(--dd-base-0)',
|
|
6634
|
+
'--neo-selector-shadow': 'var(--dd-base-accent-orange)',
|
|
6635
|
+
'--neo-selector-accent': 'var(--dd-base-accent-yellow)',
|
|
6636
|
+
};
|
|
6637
|
+
case AccentEnumColor.White:
|
|
6638
|
+
default:
|
|
6639
|
+
return {
|
|
6640
|
+
'--neo-selector-surface': 'var(--dd-base-0)',
|
|
6641
|
+
'--neo-selector-active': 'var(--dd-base-accent-yellow)',
|
|
6642
|
+
'--neo-selector-text': 'var(--dd-base-600)',
|
|
6643
|
+
'--neo-selector-shadow': 'var(--dd-base-600)',
|
|
6644
|
+
'--neo-selector-accent': 'var(--dd-base-accent-orange)',
|
|
6645
|
+
};
|
|
6646
|
+
}
|
|
6647
|
+
}
|
|
6648
|
+
|
|
6649
|
+
class DuckDevSelectorDrum {
|
|
6650
|
+
destroyRef = inject(DestroyRef);
|
|
6651
|
+
value = input(undefined, { ...(ngDevMode ? { debugName: "value" } : {}) });
|
|
6652
|
+
color = input(AccentEnumColor.White, { ...(ngDevMode ? { debugName: "color" } : {}) });
|
|
6653
|
+
showHints = input(true, { ...(ngDevMode ? { debugName: "showHints" } : {}) });
|
|
6654
|
+
hintAlign = input('center', { ...(ngDevMode ? { debugName: "hintAlign" } : {}) });
|
|
6655
|
+
valueChange = output();
|
|
6656
|
+
ionChange = output();
|
|
6657
|
+
options = contentChildren(DuckDevSelectorOption, { ...(ngDevMode ? { debugName: "options" } : {}) });
|
|
6658
|
+
drumEl = viewChild.required('drum');
|
|
6659
|
+
selectorStyle = computed(() => getNeobrutalSelectorStyle(this.color()), { ...(ngDevMode ? { debugName: "selectorStyle" } : {}) });
|
|
6660
|
+
optionsList = computed(() => {
|
|
6661
|
+
return this.options().map((opt) => ({
|
|
6662
|
+
value: opt.value(),
|
|
6663
|
+
contentId: opt.contentId(),
|
|
6664
|
+
template: opt.templateRef(),
|
|
6665
|
+
}));
|
|
6666
|
+
}, { ...(ngDevMode ? { debugName: "optionsList" } : {}) });
|
|
6667
|
+
faceCount = computed(() => Math.max(3, this.optionsList().length), { ...(ngDevMode ? { debugName: "faceCount" } : {}) });
|
|
6668
|
+
faceAngle = computed(() => 360 / this.faceCount(), { ...(ngDevMode ? { debugName: "faceAngle" } : {}) });
|
|
6669
|
+
radius = computed(() => {
|
|
6670
|
+
const faceHeight = 70;
|
|
6671
|
+
return faceHeight / (2 * Math.tan(Math.PI / this.faceCount()));
|
|
6672
|
+
}, { ...(ngDevMode ? { debugName: "radius" } : {}) });
|
|
6673
|
+
currentAngle = signal(0, { ...(ngDevMode ? { debugName: "currentAngle" } : {}) });
|
|
6674
|
+
isDragging = signal(false, { ...(ngDevMode ? { debugName: "isDragging" } : {}) });
|
|
6675
|
+
isAnimating = signal(false, { ...(ngDevMode ? { debugName: "isAnimating" } : {}) });
|
|
6676
|
+
isIdle = computed(() => !this.isDragging() && !this.isAnimating(), { ...(ngDevMode ? { debugName: "isIdle" } : {}) });
|
|
6677
|
+
startY = 0;
|
|
6678
|
+
startAngle = 0;
|
|
6679
|
+
lastY = 0;
|
|
6680
|
+
lastTime = 0;
|
|
6681
|
+
velocity = 0;
|
|
6682
|
+
animationId = null;
|
|
6683
|
+
boundPointerMove = this.onPointerMove.bind(this);
|
|
6684
|
+
boundPointerUp = this.onPointerUp.bind(this);
|
|
6685
|
+
constructor() {
|
|
6686
|
+
afterNextRender(() => {
|
|
6687
|
+
this.syncAngleToValue();
|
|
6688
|
+
});
|
|
6689
|
+
this.destroyRef.onDestroy(() => {
|
|
6690
|
+
if (this.animationId !== null) {
|
|
6691
|
+
cancelAnimationFrame(this.animationId);
|
|
6692
|
+
}
|
|
6693
|
+
document.removeEventListener('pointermove', this.boundPointerMove);
|
|
6694
|
+
document.removeEventListener('pointerup', this.boundPointerUp);
|
|
6695
|
+
});
|
|
6696
|
+
}
|
|
6697
|
+
ngAfterContentInit() {
|
|
6698
|
+
this.syncAngleToValue();
|
|
6699
|
+
}
|
|
6700
|
+
onStepPrev() {
|
|
6701
|
+
if (this.isAnimating())
|
|
6702
|
+
return;
|
|
6703
|
+
this.isAnimating.set(true);
|
|
6704
|
+
const angle = this.faceAngle();
|
|
6705
|
+
this.settleToAngle(this.currentAngle() - angle);
|
|
6706
|
+
}
|
|
6707
|
+
onStepNext() {
|
|
6708
|
+
if (this.isAnimating())
|
|
6709
|
+
return;
|
|
6710
|
+
this.isAnimating.set(true);
|
|
6711
|
+
const angle = this.faceAngle();
|
|
6712
|
+
this.settleToAngle(this.currentAngle() + angle);
|
|
6713
|
+
}
|
|
6714
|
+
onPointerDown(event) {
|
|
6715
|
+
event.preventDefault();
|
|
6716
|
+
if (this.animationId !== null) {
|
|
6717
|
+
cancelAnimationFrame(this.animationId);
|
|
6718
|
+
this.animationId = null;
|
|
6719
|
+
}
|
|
6720
|
+
this.isDragging.set(true);
|
|
6721
|
+
this.isAnimating.set(false);
|
|
6722
|
+
this.startY = event.clientY;
|
|
6723
|
+
this.startAngle = this.currentAngle();
|
|
6724
|
+
this.lastY = event.clientY;
|
|
6725
|
+
this.lastTime = performance.now();
|
|
6726
|
+
this.velocity = 0;
|
|
6727
|
+
document.addEventListener('pointermove', this.boundPointerMove);
|
|
6728
|
+
document.addEventListener('pointerup', this.boundPointerUp);
|
|
6729
|
+
}
|
|
6730
|
+
onPointerMove(event) {
|
|
6731
|
+
const deltaY = event.clientY - this.startY;
|
|
6732
|
+
const sensitivity = 0.5;
|
|
6733
|
+
const newAngle = this.startAngle + deltaY * sensitivity;
|
|
6734
|
+
const now = performance.now();
|
|
6735
|
+
const dt = now - this.lastTime;
|
|
6736
|
+
if (dt > 0) {
|
|
6737
|
+
this.velocity = (event.clientY - this.lastY) / dt;
|
|
6738
|
+
}
|
|
6739
|
+
this.lastY = event.clientY;
|
|
6740
|
+
this.lastTime = now;
|
|
6741
|
+
this.currentAngle.set(newAngle);
|
|
6742
|
+
}
|
|
6743
|
+
onPointerUp() {
|
|
6744
|
+
document.removeEventListener('pointermove', this.boundPointerMove);
|
|
6745
|
+
document.removeEventListener('pointerup', this.boundPointerUp);
|
|
6746
|
+
this.isDragging.set(false);
|
|
6747
|
+
this.isAnimating.set(true);
|
|
6748
|
+
// Convert pointer velocity (px/ms) to angular velocity (deg/frame at 60fps)
|
|
6749
|
+
const angularVelocity = this.velocity * 0.5 * (1000 / 60);
|
|
6750
|
+
this.spinWithFriction(angularVelocity);
|
|
6751
|
+
}
|
|
6752
|
+
spinWithFriction(angularVelocity) {
|
|
6753
|
+
const friction = 0.985;
|
|
6754
|
+
const snapThreshold = 0.15;
|
|
6755
|
+
let vel = angularVelocity;
|
|
6756
|
+
let lastTime = performance.now();
|
|
6757
|
+
const step = (now) => {
|
|
6758
|
+
const dt = (now - lastTime) / 16.667; // normalize to 60fps
|
|
6759
|
+
lastTime = now;
|
|
6760
|
+
vel *= Math.pow(friction, dt);
|
|
6761
|
+
this.currentAngle.update((a) => a + vel * dt);
|
|
6762
|
+
if (Math.abs(vel) > snapThreshold) {
|
|
6763
|
+
this.animationId = requestAnimationFrame(step);
|
|
6764
|
+
}
|
|
6765
|
+
else {
|
|
6766
|
+
// Velocity died — settle to nearest face
|
|
6767
|
+
const angle = this.faceAngle();
|
|
6768
|
+
const targetSnap = Math.round(this.currentAngle() / angle) * angle;
|
|
6769
|
+
this.settleToAngle(targetSnap);
|
|
6770
|
+
}
|
|
6771
|
+
};
|
|
6772
|
+
this.animationId = requestAnimationFrame(step);
|
|
6773
|
+
}
|
|
6774
|
+
settleToAngle(target) {
|
|
6775
|
+
const start = this.currentAngle();
|
|
6776
|
+
const diff = target - start;
|
|
6777
|
+
// If already very close, just set it
|
|
6778
|
+
if (Math.abs(diff) < 0.5) {
|
|
6779
|
+
this.currentAngle.set(target);
|
|
6780
|
+
this.isAnimating.set(false);
|
|
6781
|
+
this.emitCurrentValue();
|
|
6782
|
+
return;
|
|
6783
|
+
}
|
|
6784
|
+
// Spring-like settle: longer for bigger gaps, min 300ms, max 700ms
|
|
6785
|
+
const duration = Math.min(700, Math.max(300, Math.abs(diff) * 8));
|
|
6786
|
+
const startTime = performance.now();
|
|
6787
|
+
const step = (now) => {
|
|
6788
|
+
const elapsed = now - startTime;
|
|
6789
|
+
const t = Math.min(elapsed / duration, 1);
|
|
6790
|
+
// Smooth ease-out with slight overshoot for natural feel
|
|
6791
|
+
const eased = 1 - Math.pow(1 - t, 2.5);
|
|
6792
|
+
this.currentAngle.set(start + diff * eased);
|
|
6793
|
+
if (t < 1) {
|
|
6794
|
+
this.animationId = requestAnimationFrame(step);
|
|
6795
|
+
}
|
|
6796
|
+
else {
|
|
6797
|
+
this.animationId = null;
|
|
6798
|
+
this.currentAngle.set(target);
|
|
6799
|
+
this.isAnimating.set(false);
|
|
6800
|
+
this.emitCurrentValue();
|
|
6801
|
+
}
|
|
6802
|
+
};
|
|
6803
|
+
this.animationId = requestAnimationFrame(step);
|
|
6804
|
+
}
|
|
6805
|
+
emitCurrentValue() {
|
|
6806
|
+
const angle = this.faceAngle();
|
|
6807
|
+
const opts = this.optionsList();
|
|
6808
|
+
if (opts.length === 0)
|
|
6809
|
+
return;
|
|
6810
|
+
const normalizedAngle = ((this.currentAngle() % 360) + 360) % 360;
|
|
6811
|
+
const index = Math.round(normalizedAngle / angle) % opts.length;
|
|
6812
|
+
const value = opts[index].value;
|
|
6813
|
+
this.valueChange.emit(value);
|
|
6814
|
+
this.ionChange.emit({ detail: { value } });
|
|
6815
|
+
}
|
|
6816
|
+
syncAngleToValue() {
|
|
6817
|
+
const incoming = this.value();
|
|
6818
|
+
const opts = this.optionsList();
|
|
6819
|
+
if (!incoming || opts.length === 0)
|
|
6820
|
+
return;
|
|
6821
|
+
const index = opts.findIndex((o) => o.value === incoming);
|
|
6822
|
+
if (index >= 0) {
|
|
6823
|
+
this.currentAngle.set(index * this.faceAngle());
|
|
6824
|
+
}
|
|
6825
|
+
}
|
|
6826
|
+
getFaceTransform(index) {
|
|
6827
|
+
const angle = this.faceAngle();
|
|
6828
|
+
const r = this.radius();
|
|
6829
|
+
return `rotateX(${index * angle}deg) translateZ(${r}px)`;
|
|
6830
|
+
}
|
|
6831
|
+
isActiveFace(index) {
|
|
6832
|
+
const angle = this.faceAngle();
|
|
6833
|
+
const opts = this.optionsList();
|
|
6834
|
+
if (opts.length === 0)
|
|
6835
|
+
return false;
|
|
6836
|
+
const normalizedAngle = ((this.currentAngle() % 360) + 360) % 360;
|
|
6837
|
+
const activeIndex = Math.round(normalizedAngle / angle) % opts.length;
|
|
6838
|
+
return activeIndex === index;
|
|
6839
|
+
}
|
|
6840
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: DuckDevSelectorDrum, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6841
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.1", type: DuckDevSelectorDrum, isStandalone: true, selector: "duck-dev-selector-drum", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, showHints: { classPropertyName: "showHints", publicName: "showHints", isSignal: true, isRequired: false, transformFunction: null }, hintAlign: { classPropertyName: "hintAlign", publicName: "hintAlign", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", ionChange: "ionChange" }, queries: [{ propertyName: "options", predicate: DuckDevSelectorOption, isSignal: true }], viewQueries: [{ propertyName: "drumEl", first: true, predicate: ["drum"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"dd-drum\"\n [class.dd-drum--hints-start]=\"hintAlign() === 'start'\"\n [class.dd-drum--hints-end]=\"hintAlign() === 'end'\"\n [ngStyle]=\"selectorStyle()\"\n>\n @if (showHints()) {\n <button class=\"dd-drum__hint dd-drum__hint--top\" type=\"button\" (click)=\"onStepPrev()\">\n ▲\n </button>\n }\n\n <div class=\"dd-drum__scene\">\n <div\n class=\"dd-drum__prism\"\n [class.dd-drum__prism--idle]=\"isIdle()\"\n #drum\n [style.transform]=\"'rotateX(' + -currentAngle() + 'deg)'\"\n (pointerdown)=\"onPointerDown($event)\"\n >\n @for (opt of optionsList(); track opt.value; let i = $index) {\n <div\n class=\"dd-drum__face\"\n [class.dd-drum__face--active]=\"isActiveFace(i)\"\n [style.transform]=\"getFaceTransform(i)\"\n >\n <span class=\"dd-drum__face-copy\">\n <ng-container *ngTemplateOutlet=\"opt.template\" />\n </span>\n </div>\n }\n </div>\n </div>\n\n @if (showHints()) {\n <button class=\"dd-drum__hint dd-drum__hint--bottom\" type=\"button\" (click)=\"onStepNext()\">\n ▼\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:inline-block}.dd-drum{--neo-selector-surface: var(--dd-base-0);--neo-selector-active: var(--dd-base-accent-yellow);--neo-selector-text: var(--dd-base-600);--neo-selector-shadow: var(--dd-base-600);--neo-selector-accent: var(--dd-base-accent-orange);display:inline-flex;flex-direction:column;align-items:center;-webkit-user-select:none;user-select:none;touch-action:none}.dd-drum--hints-start{align-items:flex-start}.dd-drum--hints-end{align-items:flex-end}.dd-drum__hint{font-size:14px;color:var(--neo-selector-shadow);opacity:.35;transition:opacity .3s ease,transform .2s ease;line-height:1;background:none;border:none;padding:4px 12px;cursor:pointer;font-family:inherit;-webkit-tap-highlight-color:transparent}.dd-drum__hint:hover{opacity:.85}.dd-drum__hint:active{opacity:1}.dd-drum__hint--top{animation:hint-bob-up 2s ease-in-out infinite}.dd-drum__hint--top:hover{animation:none;transform:translateY(-2px)}.dd-drum__hint--bottom{animation:hint-bob-down 2s ease-in-out infinite}.dd-drum__hint--bottom:hover{animation:none;transform:translateY(2px)}@keyframes hint-bob-up{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}@keyframes hint-bob-down{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}.dd-drum:hover .dd-drum__hint{opacity:.6}.dd-drum__scene{perspective:600px;perspective-origin:center center;width:220px;height:140px;display:flex;align-items:center;justify-content:center;cursor:grab}.dd-drum__scene:active{cursor:grabbing}.dd-drum__prism{width:100%;height:70px;position:relative;transform-style:preserve-3d;transition:transform .15s ease}.dd-drum__prism--idle{animation:drum-idle 3.5s ease-in-out infinite}.dd-drum__scene:hover .dd-drum__prism--idle{animation:drum-hover 1.8s ease-in-out infinite}@keyframes drum-idle{0%,to{transform:rotateY(0)}33%{transform:rotateY(1.5deg)}66%{transform:rotateY(-1.5deg)}}@keyframes drum-hover{0%,to{transform:rotateY(0) rotateX(0)}25%{transform:rotateY(2.5deg) rotateX(-4deg)}75%{transform:rotateY(-2.5deg) rotateX(4deg)}}.dd-drum__face{position:absolute;width:100%;height:70px;top:0;left:0;display:flex;align-items:center;justify-content:center;border:4px solid var(--dd-neo-ink);background:var(--neo-selector-surface);box-shadow:4px 4px 0 var(--neo-selector-shadow);backface-visibility:hidden;box-sizing:border-box;transition:background .2s ease}.dd-drum__face--active{background:var(--neo-selector-active)}.dd-drum__face-copy{display:inline-flex;align-items:center;justify-content:center;font-size:.88rem;font-weight:900;letter-spacing:.14em;line-height:1.1;text-transform:uppercase;color:var(--neo-selector-text)}@media(max-width:640px){.dd-drum__scene{width:180px;height:120px}.dd-drum__prism,.dd-drum__face{height:60px}.dd-drum__face-copy{font-size:.76rem;letter-spacing:.11em}}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
6842
|
+
}
|
|
6843
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: DuckDevSelectorDrum, decorators: [{
|
|
6844
|
+
type: Component,
|
|
6845
|
+
args: [{ selector: 'duck-dev-selector-drum', imports: [NgStyle, NgTemplateOutlet], template: "<div\n class=\"dd-drum\"\n [class.dd-drum--hints-start]=\"hintAlign() === 'start'\"\n [class.dd-drum--hints-end]=\"hintAlign() === 'end'\"\n [ngStyle]=\"selectorStyle()\"\n>\n @if (showHints()) {\n <button class=\"dd-drum__hint dd-drum__hint--top\" type=\"button\" (click)=\"onStepPrev()\">\n ▲\n </button>\n }\n\n <div class=\"dd-drum__scene\">\n <div\n class=\"dd-drum__prism\"\n [class.dd-drum__prism--idle]=\"isIdle()\"\n #drum\n [style.transform]=\"'rotateX(' + -currentAngle() + 'deg)'\"\n (pointerdown)=\"onPointerDown($event)\"\n >\n @for (opt of optionsList(); track opt.value; let i = $index) {\n <div\n class=\"dd-drum__face\"\n [class.dd-drum__face--active]=\"isActiveFace(i)\"\n [style.transform]=\"getFaceTransform(i)\"\n >\n <span class=\"dd-drum__face-copy\">\n <ng-container *ngTemplateOutlet=\"opt.template\" />\n </span>\n </div>\n }\n </div>\n </div>\n\n @if (showHints()) {\n <button class=\"dd-drum__hint dd-drum__hint--bottom\" type=\"button\" (click)=\"onStepNext()\">\n ▼\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:inline-block}.dd-drum{--neo-selector-surface: var(--dd-base-0);--neo-selector-active: var(--dd-base-accent-yellow);--neo-selector-text: var(--dd-base-600);--neo-selector-shadow: var(--dd-base-600);--neo-selector-accent: var(--dd-base-accent-orange);display:inline-flex;flex-direction:column;align-items:center;-webkit-user-select:none;user-select:none;touch-action:none}.dd-drum--hints-start{align-items:flex-start}.dd-drum--hints-end{align-items:flex-end}.dd-drum__hint{font-size:14px;color:var(--neo-selector-shadow);opacity:.35;transition:opacity .3s ease,transform .2s ease;line-height:1;background:none;border:none;padding:4px 12px;cursor:pointer;font-family:inherit;-webkit-tap-highlight-color:transparent}.dd-drum__hint:hover{opacity:.85}.dd-drum__hint:active{opacity:1}.dd-drum__hint--top{animation:hint-bob-up 2s ease-in-out infinite}.dd-drum__hint--top:hover{animation:none;transform:translateY(-2px)}.dd-drum__hint--bottom{animation:hint-bob-down 2s ease-in-out infinite}.dd-drum__hint--bottom:hover{animation:none;transform:translateY(2px)}@keyframes hint-bob-up{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}@keyframes hint-bob-down{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}.dd-drum:hover .dd-drum__hint{opacity:.6}.dd-drum__scene{perspective:600px;perspective-origin:center center;width:220px;height:140px;display:flex;align-items:center;justify-content:center;cursor:grab}.dd-drum__scene:active{cursor:grabbing}.dd-drum__prism{width:100%;height:70px;position:relative;transform-style:preserve-3d;transition:transform .15s ease}.dd-drum__prism--idle{animation:drum-idle 3.5s ease-in-out infinite}.dd-drum__scene:hover .dd-drum__prism--idle{animation:drum-hover 1.8s ease-in-out infinite}@keyframes drum-idle{0%,to{transform:rotateY(0)}33%{transform:rotateY(1.5deg)}66%{transform:rotateY(-1.5deg)}}@keyframes drum-hover{0%,to{transform:rotateY(0) rotateX(0)}25%{transform:rotateY(2.5deg) rotateX(-4deg)}75%{transform:rotateY(-2.5deg) rotateX(4deg)}}.dd-drum__face{position:absolute;width:100%;height:70px;top:0;left:0;display:flex;align-items:center;justify-content:center;border:4px solid var(--dd-neo-ink);background:var(--neo-selector-surface);box-shadow:4px 4px 0 var(--neo-selector-shadow);backface-visibility:hidden;box-sizing:border-box;transition:background .2s ease}.dd-drum__face--active{background:var(--neo-selector-active)}.dd-drum__face-copy{display:inline-flex;align-items:center;justify-content:center;font-size:.88rem;font-weight:900;letter-spacing:.14em;line-height:1.1;text-transform:uppercase;color:var(--neo-selector-text)}@media(max-width:640px){.dd-drum__scene{width:180px;height:120px}.dd-drum__prism,.dd-drum__face{height:60px}.dd-drum__face-copy{font-size:.76rem;letter-spacing:.11em}}\n"] }]
|
|
6846
|
+
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], showHints: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHints", required: false }] }], hintAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "hintAlign", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], ionChange: [{ type: i0.Output, args: ["ionChange"] }], options: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DuckDevSelectorOption), { isSignal: true }] }], drumEl: [{ type: i0.ViewChild, args: ['drum', { isSignal: true }] }] } });
|
|
6847
|
+
|
|
6848
|
+
class SelectorBlock {
|
|
6849
|
+
drumSelected = signal('rush', { ...(ngDevMode ? { debugName: "drumSelected" } : {}) });
|
|
6850
|
+
lastEvent = signal('', { ...(ngDevMode ? { debugName: "lastEvent" } : {}) });
|
|
6851
|
+
colorViolet = AccentEnumColor.Violet;
|
|
6852
|
+
colorOrange = AccentEnumColor.Orange;
|
|
6853
|
+
colorDark = AccentEnumColor.Dark;
|
|
6854
|
+
colorGray = AccentEnumColor.Gray;
|
|
6855
|
+
onIonChange(e) {
|
|
6856
|
+
this.lastEvent.set(e.detail.value);
|
|
6857
|
+
}
|
|
6858
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: SelectorBlock, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6859
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.1", type: SelectorBlock, isStandalone: true, selector: "app-selector-block", ngImport: i0, template: "<div class=\"demo-container\">\n <h1>{{ 'selectorDoc.title' | transloco }}</h1>\n\n <dd-card-section>\n <h2>{{ 'selectorDoc.basic.title' | transloco }}</h2>\n <p class=\"description\">{{ 'selectorDoc.basic.description' | transloco }}</p>\n\n <div class=\"usage-block\">\n <h3>{{ 'selectorDoc.basic.usage' | transloco }}</h3>\n <pre><code><duck-dev-selector-drum [value]=\"selected()\" (valueChange)=\"selected.set($event)\">\n <duck-dev-selector-option value=\"rush\">Rush</duck-dev-selector-option>\n <duck-dev-selector-option value=\"strategy\">Strategy</duck-dev-selector-option>\n <duck-dev-selector-option value=\"rpg\">RPG</duck-dev-selector-option>\n</duck-dev-selector-drum></code></pre>\n </div>\n\n <div class=\"inputs-block\">\n <h3>{{ 'selectorDoc.basic.inputs' | transloco }}</h3>\n <ul>\n <li><strong>value</strong> \u2014 {{ 'selectorDoc.inputsDesc.value' | transloco }}</li>\n <li>\n <strong>valueChange</strong> \u2014 {{ 'selectorDoc.inputsDesc.valueChange' | transloco }}\n </li>\n <li><strong>ionChange</strong> \u2014 {{ 'selectorDoc.inputsDesc.ionChange' | transloco }}</li>\n <li><strong>color</strong> \u2014 {{ 'selectorDoc.inputsDesc.color' | transloco }}</li>\n <li>\n <strong>duck-dev-selector-option[value]</strong> \u2014\n {{ 'selectorDoc.inputsDesc.optionValue' | transloco }}\n </li>\n </ul>\n </div>\n\n <div class=\"examples-block\">\n <h3>{{ 'selectorDoc.drum.title' | transloco }}</h3>\n <p class=\"description\">{{ 'selectorDoc.drum.description' | transloco }}</p>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'selectorDoc.examples.drumWhite' | transloco }}</p>\n <duck-dev-selector-drum\n [value]=\"drumSelected()\"\n (valueChange)=\"drumSelected.set($event)\"\n (ionChange)=\"onIonChange($event)\"\n >\n <duck-dev-selector-option value=\"rush\">{{\n 'selectorDoc.labels.rush' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"strategy\">{{\n 'selectorDoc.labels.strategy' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"rpg\">{{\n 'selectorDoc.labels.rpg' | transloco\n }}</duck-dev-selector-option>\n </duck-dev-selector-drum>\n <div class=\"state-hint state-hint--neobrutal\">\n <span>{{ 'selectorDoc.labels.selected' | transloco }}: </span>\n <b>{{ drumSelected() }}</b>\n <span class=\"divider\">|</span>\n <span\n >ionChange: <b>{{ lastEvent() }}</b></span\n >\n </div>\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'selectorDoc.examples.drumViolet' | transloco }}</p>\n <duck-dev-selector-drum [value]=\"'rush'\" [color]=\"colorViolet\">\n <duck-dev-selector-option value=\"rush\">{{\n 'selectorDoc.labels.rush' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"strategy\">{{\n 'selectorDoc.labels.strategy' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"rpg\">{{\n 'selectorDoc.labels.rpg' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"arcade\">{{\n 'selectorDoc.labels.arcade' | transloco\n }}</duck-dev-selector-option>\n </duck-dev-selector-drum>\n </div>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'selectorDoc.examples.drumOrange' | transloco }}</p>\n <duck-dev-selector-drum [value]=\"'draft'\" [color]=\"colorOrange\">\n <duck-dev-selector-option value=\"draft\">{{\n 'selectorDoc.labels.draft' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"launch\">{{\n 'selectorDoc.labels.launch' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"archive\">{{\n 'selectorDoc.labels.archive' | transloco\n }}</duck-dev-selector-option>\n </duck-dev-selector-drum>\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'selectorDoc.examples.drumDark' | transloco }}</p>\n <duck-dev-selector-drum [value]=\"'strategy'\" [color]=\"colorDark\">\n <duck-dev-selector-option value=\"strategy\">{{\n 'selectorDoc.labels.strategy' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"research\">{{\n 'selectorDoc.labels.research' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"prototype\">{{\n 'selectorDoc.labels.prototype' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"validate\">{{\n 'selectorDoc.labels.validate' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"deliver\">{{\n 'selectorDoc.labels.deliver' | transloco\n }}</duck-dev-selector-option>\n </duck-dev-selector-drum>\n </div>\n </div>\n </div>\n </dd-card-section>\n</div>\n", styles: [".demo-container{max-width:1200px;margin:0 auto;padding:40px 20px}.demo-container h1{font-size:36px;font-weight:700;color:var(--dd-base-600);margin-bottom:40px;text-align:center;border-bottom:3px solid var(--dd-base-accent-blue);padding-bottom:20px}.demo-container h2{font-size:28px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;border-left:4px solid var(--dd-base-accent-blue);padding-left:15px}.demo-container .description{font-size:16px;line-height:1.6;color:var(--dd-base-400);margin-bottom:25px;padding:15px;background:var(--dd-base-100);border-radius:8px;border-left:3px solid var(--dd-base-300)}.demo-container h3{font-size:20px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;margin-top:25px}.demo-container .usage-block{margin-bottom:25px}.demo-container .usage-block pre{background:var(--dd-base-600);color:var(--dd-base-100);padding:20px;border-radius:8px;overflow-x:auto;margin:0}.demo-container .usage-block pre code{font-family:Courier New,Courier,monospace;font-size:14px;line-height:1.5}.demo-container .inputs-block{margin-bottom:25px}.demo-container .inputs-block ul{list-style:none;padding:0;margin:0}.demo-container .inputs-block ul li{padding:12px 15px;margin-bottom:8px;background:var(--dd-base-100);border-radius:6px;border-left:3px solid var(--dd-base-accent-blue);font-size:15px;line-height:1.5;color:var(--dd-base-500)}.demo-container .inputs-block ul li strong{color:var(--dd-base-accent-blue);font-weight:600}.demo-container .examples-block .example-row{display:flex;gap:20px;margin-bottom:20px;flex-wrap:wrap}.demo-container .examples-block .example-row.example-row--roadsign{align-items:flex-start}.demo-container .examples-block .example-row .example-item{flex:1;min-width:280px;padding:20px;background:var(--dd-base-100);border-radius:8px;border:2px solid var(--dd-base-300);display:flex;flex-direction:column;align-items:center;gap:15px;transition:all .3s ease}.demo-container .examples-block .example-row .example-item:hover{border-color:var(--dd-base-accent-blue);box-shadow:0 4px 12px var(--dd-base-300)}.demo-container .examples-block .example-row .example-item .example-label{font-size:14px;font-weight:600;color:var(--dd-base-400);margin:0;text-align:left;width:100%}.demo-container .examples-block .example-row .example-item .state-hint{font-size:14px;color:var(--dd-base-400)}.demo-container .examples-block .example-row .example-item .state-hint .divider{margin:0 8px;color:var(--dd-base-300)}.demo-container .examples-block .example-row .example-item.example-item--neobrutal{gap:18px;border-radius:0;border-width:3px;border-color:var(--dd-neo-ink);background:linear-gradient(135deg,color-mix(in srgb,var(--dd-base-accent-yellow) 18%,transparent) 0 14%,transparent 14% 100%),var(--dd-base-0);box-shadow:8px 8px 0 var(--dd-base-accent-blue)}.demo-container .examples-block .example-row .example-item .state-hint--neobrutal{display:inline-flex;width:fit-content;align-items:center;gap:8px;padding:6px 10px;border:2px solid var(--dd-neo-ink);background:var(--dd-base-accent-yellow);color:var(--dd-base-600);font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase}@media(max-width:768px){.demo-container{padding:20px 15px}.demo-container h1{font-size:28px}.demo-container .examples-block .example-row{flex-direction:column}.demo-container .examples-block .example-row .example-item{min-width:100%}}\n"], dependencies: [{ kind: "component", type: DuckDevCardSection, selector: "dd-card-section" }, { kind: "component", type: DuckDevSelectorDrum, selector: "duck-dev-selector-drum", inputs: ["value", "color", "showHints", "hintAlign"], outputs: ["valueChange", "ionChange"] }, { kind: "component", type: DuckDevSelectorOption, selector: "duck-dev-selector-option", inputs: ["value", "contentId"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
|
|
6860
|
+
}
|
|
6861
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: SelectorBlock, decorators: [{
|
|
6862
|
+
type: Component,
|
|
6863
|
+
args: [{ selector: 'app-selector-block', imports: [TranslocoPipe, DuckDevCardSection, DuckDevSelectorDrum, DuckDevSelectorOption], template: "<div class=\"demo-container\">\n <h1>{{ 'selectorDoc.title' | transloco }}</h1>\n\n <dd-card-section>\n <h2>{{ 'selectorDoc.basic.title' | transloco }}</h2>\n <p class=\"description\">{{ 'selectorDoc.basic.description' | transloco }}</p>\n\n <div class=\"usage-block\">\n <h3>{{ 'selectorDoc.basic.usage' | transloco }}</h3>\n <pre><code><duck-dev-selector-drum [value]=\"selected()\" (valueChange)=\"selected.set($event)\">\n <duck-dev-selector-option value=\"rush\">Rush</duck-dev-selector-option>\n <duck-dev-selector-option value=\"strategy\">Strategy</duck-dev-selector-option>\n <duck-dev-selector-option value=\"rpg\">RPG</duck-dev-selector-option>\n</duck-dev-selector-drum></code></pre>\n </div>\n\n <div class=\"inputs-block\">\n <h3>{{ 'selectorDoc.basic.inputs' | transloco }}</h3>\n <ul>\n <li><strong>value</strong> \u2014 {{ 'selectorDoc.inputsDesc.value' | transloco }}</li>\n <li>\n <strong>valueChange</strong> \u2014 {{ 'selectorDoc.inputsDesc.valueChange' | transloco }}\n </li>\n <li><strong>ionChange</strong> \u2014 {{ 'selectorDoc.inputsDesc.ionChange' | transloco }}</li>\n <li><strong>color</strong> \u2014 {{ 'selectorDoc.inputsDesc.color' | transloco }}</li>\n <li>\n <strong>duck-dev-selector-option[value]</strong> \u2014\n {{ 'selectorDoc.inputsDesc.optionValue' | transloco }}\n </li>\n </ul>\n </div>\n\n <div class=\"examples-block\">\n <h3>{{ 'selectorDoc.drum.title' | transloco }}</h3>\n <p class=\"description\">{{ 'selectorDoc.drum.description' | transloco }}</p>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'selectorDoc.examples.drumWhite' | transloco }}</p>\n <duck-dev-selector-drum\n [value]=\"drumSelected()\"\n (valueChange)=\"drumSelected.set($event)\"\n (ionChange)=\"onIonChange($event)\"\n >\n <duck-dev-selector-option value=\"rush\">{{\n 'selectorDoc.labels.rush' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"strategy\">{{\n 'selectorDoc.labels.strategy' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"rpg\">{{\n 'selectorDoc.labels.rpg' | transloco\n }}</duck-dev-selector-option>\n </duck-dev-selector-drum>\n <div class=\"state-hint state-hint--neobrutal\">\n <span>{{ 'selectorDoc.labels.selected' | transloco }}: </span>\n <b>{{ drumSelected() }}</b>\n <span class=\"divider\">|</span>\n <span\n >ionChange: <b>{{ lastEvent() }}</b></span\n >\n </div>\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'selectorDoc.examples.drumViolet' | transloco }}</p>\n <duck-dev-selector-drum [value]=\"'rush'\" [color]=\"colorViolet\">\n <duck-dev-selector-option value=\"rush\">{{\n 'selectorDoc.labels.rush' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"strategy\">{{\n 'selectorDoc.labels.strategy' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"rpg\">{{\n 'selectorDoc.labels.rpg' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"arcade\">{{\n 'selectorDoc.labels.arcade' | transloco\n }}</duck-dev-selector-option>\n </duck-dev-selector-drum>\n </div>\n </div>\n\n <div class=\"example-row\">\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'selectorDoc.examples.drumOrange' | transloco }}</p>\n <duck-dev-selector-drum [value]=\"'draft'\" [color]=\"colorOrange\">\n <duck-dev-selector-option value=\"draft\">{{\n 'selectorDoc.labels.draft' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"launch\">{{\n 'selectorDoc.labels.launch' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"archive\">{{\n 'selectorDoc.labels.archive' | transloco\n }}</duck-dev-selector-option>\n </duck-dev-selector-drum>\n </div>\n\n <div class=\"example-item example-item--neobrutal\">\n <p class=\"example-label\">{{ 'selectorDoc.examples.drumDark' | transloco }}</p>\n <duck-dev-selector-drum [value]=\"'strategy'\" [color]=\"colorDark\">\n <duck-dev-selector-option value=\"strategy\">{{\n 'selectorDoc.labels.strategy' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"research\">{{\n 'selectorDoc.labels.research' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"prototype\">{{\n 'selectorDoc.labels.prototype' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"validate\">{{\n 'selectorDoc.labels.validate' | transloco\n }}</duck-dev-selector-option>\n <duck-dev-selector-option value=\"deliver\">{{\n 'selectorDoc.labels.deliver' | transloco\n }}</duck-dev-selector-option>\n </duck-dev-selector-drum>\n </div>\n </div>\n </div>\n </dd-card-section>\n</div>\n", styles: [".demo-container{max-width:1200px;margin:0 auto;padding:40px 20px}.demo-container h1{font-size:36px;font-weight:700;color:var(--dd-base-600);margin-bottom:40px;text-align:center;border-bottom:3px solid var(--dd-base-accent-blue);padding-bottom:20px}.demo-container h2{font-size:28px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;border-left:4px solid var(--dd-base-accent-blue);padding-left:15px}.demo-container .description{font-size:16px;line-height:1.6;color:var(--dd-base-400);margin-bottom:25px;padding:15px;background:var(--dd-base-100);border-radius:8px;border-left:3px solid var(--dd-base-300)}.demo-container h3{font-size:20px;font-weight:600;color:var(--dd-base-500);margin-bottom:15px;margin-top:25px}.demo-container .usage-block{margin-bottom:25px}.demo-container .usage-block pre{background:var(--dd-base-600);color:var(--dd-base-100);padding:20px;border-radius:8px;overflow-x:auto;margin:0}.demo-container .usage-block pre code{font-family:Courier New,Courier,monospace;font-size:14px;line-height:1.5}.demo-container .inputs-block{margin-bottom:25px}.demo-container .inputs-block ul{list-style:none;padding:0;margin:0}.demo-container .inputs-block ul li{padding:12px 15px;margin-bottom:8px;background:var(--dd-base-100);border-radius:6px;border-left:3px solid var(--dd-base-accent-blue);font-size:15px;line-height:1.5;color:var(--dd-base-500)}.demo-container .inputs-block ul li strong{color:var(--dd-base-accent-blue);font-weight:600}.demo-container .examples-block .example-row{display:flex;gap:20px;margin-bottom:20px;flex-wrap:wrap}.demo-container .examples-block .example-row.example-row--roadsign{align-items:flex-start}.demo-container .examples-block .example-row .example-item{flex:1;min-width:280px;padding:20px;background:var(--dd-base-100);border-radius:8px;border:2px solid var(--dd-base-300);display:flex;flex-direction:column;align-items:center;gap:15px;transition:all .3s ease}.demo-container .examples-block .example-row .example-item:hover{border-color:var(--dd-base-accent-blue);box-shadow:0 4px 12px var(--dd-base-300)}.demo-container .examples-block .example-row .example-item .example-label{font-size:14px;font-weight:600;color:var(--dd-base-400);margin:0;text-align:left;width:100%}.demo-container .examples-block .example-row .example-item .state-hint{font-size:14px;color:var(--dd-base-400)}.demo-container .examples-block .example-row .example-item .state-hint .divider{margin:0 8px;color:var(--dd-base-300)}.demo-container .examples-block .example-row .example-item.example-item--neobrutal{gap:18px;border-radius:0;border-width:3px;border-color:var(--dd-neo-ink);background:linear-gradient(135deg,color-mix(in srgb,var(--dd-base-accent-yellow) 18%,transparent) 0 14%,transparent 14% 100%),var(--dd-base-0);box-shadow:8px 8px 0 var(--dd-base-accent-blue)}.demo-container .examples-block .example-row .example-item .state-hint--neobrutal{display:inline-flex;width:fit-content;align-items:center;gap:8px;padding:6px 10px;border:2px solid var(--dd-neo-ink);background:var(--dd-base-accent-yellow);color:var(--dd-base-600);font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase}@media(max-width:768px){.demo-container{padding:20px 15px}.demo-container h1{font-size:28px}.demo-container .examples-block .example-row{flex-direction:column}.demo-container .examples-block .example-row .example-item{min-width:100%}}\n"] }]
|
|
6450
6864
|
}] });
|
|
6451
6865
|
|
|
6452
6866
|
class MainDocumentationPage {
|
|
@@ -6470,6 +6884,7 @@ class MainDocumentationPage {
|
|
|
6470
6884
|
{ id: 'segment', label: this.translocoService.translate('tabs.segment') },
|
|
6471
6885
|
{ id: 'slider', label: this.translocoService.translate('tabs.slider') },
|
|
6472
6886
|
{ id: 'breadcrumb', label: this.translocoService.translate('tabs.breadcrumb') },
|
|
6887
|
+
{ id: 'selector', label: this.translocoService.translate('tabs.selector') },
|
|
6473
6888
|
{ id: 'svg', label: this.translocoService.translate('tabs.svg') },
|
|
6474
6889
|
];
|
|
6475
6890
|
activeTab = signal(this.tabs[0], { ...(ngDevMode ? { debugName: "activeTab" } : {}) });
|
|
@@ -6477,7 +6892,7 @@ class MainDocumentationPage {
|
|
|
6477
6892
|
this.activeTab.set(tab);
|
|
6478
6893
|
}
|
|
6479
6894
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: MainDocumentationPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6480
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.1", type: MainDocumentationPage, isStandalone: true, selector: "duck-dev-main-documentation-page", ngImport: i0, template: "<duck-dev-tab-vertical [tabs]=\"tabs\" (tabChange)=\"onTabChange($event)\">\n @switch (activeTab().id) {\n @case ('quick-start') {\n <app-quick-start-block />\n }\n @case ('accordion') {\n <app-accordion-block />\n }\n @case ('buttons') {\n <app-button-block />\n }\n @case ('loaders') {\n <app-loader-block />\n }\n @case ('progress') {\n <app-progress-bar-block />\n }\n @case ('tabs') {\n <app-tabs-block />\n }\n @case ('tooltip') {\n <app-tooltip-block />\n }\n @case ('badge') {\n <app-badge-block />\n }\n @case ('directives') {\n <app-directive-block />\n }\n @case ('card') {\n <app-card-block />\n }\n @case ('speaker-bubble') {\n <app-speaker-bubble-block />\n }\n @case ('modal') {\n <app-modal-block />\n }\n @case ('input') {\n <app-input-block />\n }\n @case ('notifications') {\n <app-notification-block />\n }\n @case ('slider') {\n <app-slider-block />\n }\n @case ('segment') {\n <app-segment-block />\n }\n @case ('breadcrumb') {\n <app-breadcrumb-block />\n }\n @case ('svg') {\n <app-duck-dev-svg-block />\n }\n }\n</duck-dev-tab-vertical>\n<duck-dev-notification-container />\n", styles: [":host{display:block;height:100%}\n"], dependencies: [{ kind: "component", type: ButtonBlock, selector: "app-button-block" }, { kind: "component", type: LoaderBlock, selector: "app-loader-block" }, { kind: "component", type: TabsBlock, selector: "app-tabs-block" }, { kind: "component", type: DuckDevSvgBlock, selector: "app-duck-dev-svg-block" }, { kind: "component", type: DuckDevTabVertical, selector: "duck-dev-tab-vertical", inputs: ["tabs"], outputs: ["tabChange"] }, { kind: "component", type: InputBlock, selector: "app-input-block" }, { kind: "component", type: NotificationBlock, selector: "app-notification-block" }, { kind: "component", type: DuckDevNotificationContainer, selector: "duck-dev-notification-container" }, { kind: "component", type: BadgeBlock, selector: "app-badge-block" }, { kind: "component", type: DirectiveBlock, selector: "app-directive-block" }, { kind: "component", type: AccordionBlock, selector: "app-accordion-block" }, { kind: "component", type: SliderBlock, selector: "app-slider-block" }, { kind: "component", type: CardBlock, selector: "app-card-block" }, { kind: "component", type: TooltipBlock, selector: "app-tooltip-block" }, { kind: "component", type: QuickStartBlock, selector: "app-quick-start-block" }, { kind: "component", type: ModalBlock, selector: "app-modal-block" }, { kind: "component", type: SegmentBlock, selector: "app-segment-block" }, { kind: "component", type: ProgressBarBlock, selector: "app-progress-bar-block" }, { kind: "component", type: SpeakerBubbleBlock, selector: "app-speaker-bubble-block" }, { kind: "component", type: BreadcrumbBlock, selector: "app-breadcrumb-block" }] });
|
|
6895
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.1", type: MainDocumentationPage, isStandalone: true, selector: "duck-dev-main-documentation-page", ngImport: i0, template: "<duck-dev-tab-vertical [tabs]=\"tabs\" (tabChange)=\"onTabChange($event)\">\n @switch (activeTab().id) {\n @case ('quick-start') {\n <app-quick-start-block />\n }\n @case ('accordion') {\n <app-accordion-block />\n }\n @case ('buttons') {\n <app-button-block />\n }\n @case ('loaders') {\n <app-loader-block />\n }\n @case ('progress') {\n <app-progress-bar-block />\n }\n @case ('tabs') {\n <app-tabs-block />\n }\n @case ('tooltip') {\n <app-tooltip-block />\n }\n @case ('badge') {\n <app-badge-block />\n }\n @case ('directives') {\n <app-directive-block />\n }\n @case ('card') {\n <app-card-block />\n }\n @case ('speaker-bubble') {\n <app-speaker-bubble-block />\n }\n @case ('modal') {\n <app-modal-block />\n }\n @case ('input') {\n <app-input-block />\n }\n @case ('notifications') {\n <app-notification-block />\n }\n @case ('slider') {\n <app-slider-block />\n }\n @case ('segment') {\n <app-segment-block />\n }\n @case ('breadcrumb') {\n <app-breadcrumb-block />\n }\n @case ('selector') {\n <app-selector-block />\n }\n @case ('svg') {\n <app-duck-dev-svg-block />\n }\n }\n</duck-dev-tab-vertical>\n<duck-dev-notification-container />\n", styles: [":host{display:block;height:100%}\n"], dependencies: [{ kind: "component", type: ButtonBlock, selector: "app-button-block" }, { kind: "component", type: LoaderBlock, selector: "app-loader-block" }, { kind: "component", type: TabsBlock, selector: "app-tabs-block" }, { kind: "component", type: DuckDevSvgBlock, selector: "app-duck-dev-svg-block" }, { kind: "component", type: DuckDevTabVertical, selector: "duck-dev-tab-vertical", inputs: ["tabs"], outputs: ["tabChange"] }, { kind: "component", type: InputBlock, selector: "app-input-block" }, { kind: "component", type: NotificationBlock, selector: "app-notification-block" }, { kind: "component", type: DuckDevNotificationContainer, selector: "duck-dev-notification-container" }, { kind: "component", type: BadgeBlock, selector: "app-badge-block" }, { kind: "component", type: DirectiveBlock, selector: "app-directive-block" }, { kind: "component", type: AccordionBlock, selector: "app-accordion-block" }, { kind: "component", type: SliderBlock, selector: "app-slider-block" }, { kind: "component", type: CardBlock, selector: "app-card-block" }, { kind: "component", type: TooltipBlock, selector: "app-tooltip-block" }, { kind: "component", type: QuickStartBlock, selector: "app-quick-start-block" }, { kind: "component", type: ModalBlock, selector: "app-modal-block" }, { kind: "component", type: SegmentBlock, selector: "app-segment-block" }, { kind: "component", type: ProgressBarBlock, selector: "app-progress-bar-block" }, { kind: "component", type: SpeakerBubbleBlock, selector: "app-speaker-bubble-block" }, { kind: "component", type: BreadcrumbBlock, selector: "app-breadcrumb-block" }, { kind: "component", type: SelectorBlock, selector: "app-selector-block" }] });
|
|
6481
6896
|
}
|
|
6482
6897
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImport: i0, type: MainDocumentationPage, decorators: [{
|
|
6483
6898
|
type: Component,
|
|
@@ -6502,12 +6917,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.1", ngImpor
|
|
|
6502
6917
|
ProgressBarBlock,
|
|
6503
6918
|
SpeakerBubbleBlock,
|
|
6504
6919
|
BreadcrumbBlock,
|
|
6505
|
-
|
|
6920
|
+
SelectorBlock,
|
|
6921
|
+
], template: "<duck-dev-tab-vertical [tabs]=\"tabs\" (tabChange)=\"onTabChange($event)\">\n @switch (activeTab().id) {\n @case ('quick-start') {\n <app-quick-start-block />\n }\n @case ('accordion') {\n <app-accordion-block />\n }\n @case ('buttons') {\n <app-button-block />\n }\n @case ('loaders') {\n <app-loader-block />\n }\n @case ('progress') {\n <app-progress-bar-block />\n }\n @case ('tabs') {\n <app-tabs-block />\n }\n @case ('tooltip') {\n <app-tooltip-block />\n }\n @case ('badge') {\n <app-badge-block />\n }\n @case ('directives') {\n <app-directive-block />\n }\n @case ('card') {\n <app-card-block />\n }\n @case ('speaker-bubble') {\n <app-speaker-bubble-block />\n }\n @case ('modal') {\n <app-modal-block />\n }\n @case ('input') {\n <app-input-block />\n }\n @case ('notifications') {\n <app-notification-block />\n }\n @case ('slider') {\n <app-slider-block />\n }\n @case ('segment') {\n <app-segment-block />\n }\n @case ('breadcrumb') {\n <app-breadcrumb-block />\n }\n @case ('selector') {\n <app-selector-block />\n }\n @case ('svg') {\n <app-duck-dev-svg-block />\n }\n }\n</duck-dev-tab-vertical>\n<duck-dev-notification-container />\n", styles: [":host{display:block;height:100%}\n"] }]
|
|
6506
6922
|
}] });
|
|
6507
6923
|
|
|
6508
6924
|
const DuckDevLibTranslations = {
|
|
6509
|
-
en: import('./duck-dev-lib-en-
|
|
6510
|
-
ru: import('./duck-dev-lib-ru-
|
|
6925
|
+
en: import('./duck-dev-lib-en-XYugblp4.mjs'),
|
|
6926
|
+
ru: import('./duck-dev-lib-ru-BBQhEnLr.mjs'),
|
|
6511
6927
|
};
|
|
6512
6928
|
|
|
6513
6929
|
/*
|
|
@@ -6518,5 +6934,5 @@ const DuckDevLibTranslations = {
|
|
|
6518
6934
|
* Generated bundle index. Do not edit.
|
|
6519
6935
|
*/
|
|
6520
6936
|
|
|
6521
|
-
export { AccentEnumColor, Badge, BadgeNeobrutalSlab, BadgeNeobrutalStamp, BadgeNeobrutalTicket, ButtonBlurLift, ButtonCasper, ButtonFlip, ButtonGlideOver, ButtonNeobrutalBurst, ButtonNeobrutalSlab, ButtonNeobrutalSticker, ButtonNeobrutalTag, ButtonNeobrutalTape, ButtonNeobrutalZigzag, DdFlexDirectionDirective, DdTabPanel, DuckDevAccordionComponent as DuckDevAccordion, DuckDevAccordionNeobrutalComponent as DuckDevAccordionNeobrutal, DuckDevAccordionNeobrutalTapeComponent as DuckDevAccordionNeobrutalTape, DuckDevBreadcrumbClassic, DuckDevBreadcrumbNeobrutal, DuckDevCardAccent, DuckDevCardMinimal, DuckDevCardNeobrutalPoster, DuckDevCardNeobrutalSlab, DuckDevCardNeobrutalStamp, DuckDevCardNeobrutalTicket, DuckDevCardOutline, DuckDevCardSection, DuckDevCardSignal, DuckDevIcon, DuckDevInput, DuckDevInputNeobrutalPoster, DuckDevInputNeobrutalRadio, DuckDevInputNeobrutalSlab, DuckDevInputNeobrutalStrip, DuckDevInputNeobrutalToggle, DuckDevLibTranslations, DuckDevModalClassic, DuckDevNotification, DuckDevNotificationContainer, DuckDevNotificationService, DuckDevProgressLine, DuckDevProgressMeter, DuckDevProgressNeobrutalSlab, DuckDevProgressNeobrutalStamp, DuckDevProgressNeobrutalTicket, DuckDevProgressStack, DuckDevSegmentButton, DuckDevSegmentClassic, DuckDevSegmentNeobrutal, DuckDevSegmentNeobrutalVertical, DuckDevSpeakerBubbleClassic, DuckDevSpeakerBubbleNeobrutalSlab, DuckDevSpeakerBubbleNeobrutalTicket, DuckDevSpeakerBubbleOutline, DuckDevSpeakerBubbleSoft, DuckDevTab, DuckDevTabNeobrutal, DuckDevTabVertical, DuckDevTooltip, DuckDevTooltipNeobrutalComponent, LoaderClassic, LoaderLoadingBubble, LoaderNeobrutalBars, LoaderNeobrutalMarquee, LoaderNeobrutalStamp, LoaderThreeDots, MainDocumentationPage, SliderClassic, getClassicSpeakerBubbleStyle, getNeobrutalSpeakerBubbleStyle, useSpeakerBubbleTail };
|
|
6937
|
+
export { AccentEnumColor, Badge, BadgeNeobrutalSlab, BadgeNeobrutalStamp, BadgeNeobrutalTicket, ButtonBlurLift, ButtonCasper, ButtonFlip, ButtonGlideOver, ButtonNeobrutalBurst, ButtonNeobrutalSlab, ButtonNeobrutalSticker, ButtonNeobrutalTag, ButtonNeobrutalTape, ButtonNeobrutalZigzag, DdFlexDirectionDirective, DdTabPanel, DuckDevAccordionComponent as DuckDevAccordion, DuckDevAccordionNeobrutalComponent as DuckDevAccordionNeobrutal, DuckDevAccordionNeobrutalTapeComponent as DuckDevAccordionNeobrutalTape, DuckDevBreadcrumbClassic, DuckDevBreadcrumbNeobrutal, DuckDevCardAccent, DuckDevCardMinimal, DuckDevCardNeobrutalPoster, DuckDevCardNeobrutalSlab, DuckDevCardNeobrutalStamp, DuckDevCardNeobrutalTicket, DuckDevCardOutline, DuckDevCardSection, DuckDevCardSignal, DuckDevIcon, DuckDevInput, DuckDevInputNeobrutalPoster, DuckDevInputNeobrutalRadio, DuckDevInputNeobrutalSlab, DuckDevInputNeobrutalStrip, DuckDevInputNeobrutalToggle, DuckDevLibTranslations, DuckDevModalClassic, DuckDevNotification, DuckDevNotificationContainer, DuckDevNotificationService, DuckDevProgressLine, DuckDevProgressMeter, DuckDevProgressNeobrutalSlab, DuckDevProgressNeobrutalStamp, DuckDevProgressNeobrutalTicket, DuckDevProgressStack, DuckDevSegmentButton, DuckDevSegmentClassic, DuckDevSegmentNeobrutal, DuckDevSegmentNeobrutalVertical, DuckDevSelectorDrum, DuckDevSelectorOption, DuckDevSpeakerBubbleClassic, DuckDevSpeakerBubbleNeobrutalSlab, DuckDevSpeakerBubbleNeobrutalTicket, DuckDevSpeakerBubbleOutline, DuckDevSpeakerBubbleSoft, DuckDevTab, DuckDevTabNeobrutal, DuckDevTabVertical, DuckDevTooltip, DuckDevTooltipNeobrutalComponent, LoaderClassic, LoaderLoadingBubble, LoaderNeobrutalBars, LoaderNeobrutalMarquee, LoaderNeobrutalStamp, LoaderThreeDots, MainDocumentationPage, SliderClassic, getClassicSpeakerBubbleStyle, getNeobrutalSelectorStyle, getNeobrutalSpeakerBubbleStyle, useSpeakerBubbleTail };
|
|
6522
6938
|
//# sourceMappingURL=duck-dev-lib.mjs.map
|