@underlayerdev/ui 0.14.7 → 0.14.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -25,13 +25,13 @@ The library follows an **Industrial Arena Minimal** aesthetic:
25
25
 
26
26
  ### DFII (Design Feasibility & Impact Index)
27
27
 
28
- | Dimension | Score | Notes |
29
- |-------------------------|-------|----------------------------------------------------------------------|
30
- | Aesthetic impact | 5 | Highly distinctive neon-on-carbon look with strong brand typography. |
31
- | Context fit | 4 | Well-suited for gaming, wallet, and marketplace products. |
32
- | Implementation feasibility | 4 | Built on existing tokens (Underlayer Brand, Underlayer Nunito Sans, dark BG, neon). |
33
- | Performance safety | 4 | Minimal shadows/blur; motion kept sharp and sparse. |
34
- | Consistency risk | 2 | Rich token set; requires discipline on spacing, motion, naming. |
28
+ | Dimension | Score | Notes |
29
+ | -------------------------- | ----- | ----------------------------------------------------------------------------------- |
30
+ | Aesthetic impact | 5 | Highly distinctive neon-on-carbon look with strong brand typography. |
31
+ | Context fit | 4 | Well-suited for gaming, wallet, and marketplace products. |
32
+ | Implementation feasibility | 4 | Built on existing tokens (Underlayer Brand, Underlayer Nunito Sans, dark BG, neon). |
33
+ | Performance safety | 4 | Minimal shadows/blur; motion kept sharp and sparse. |
34
+ | Consistency risk | 2 | Rich token set; requires discipline on spacing, motion, naming. |
35
35
 
36
36
  **DFII score**: (5 + 4 + 4 + 4) − 2 = **15** → _Excellent_. Execute this direction consistently across all components.
37
37
 
@@ -1,17 +1,15 @@
1
- /**
2
- * Public Sass entry point for @underlayerdev/ui breakpoint media queries.
3
- *
4
- * Consuming apps can import this via the `pkg:` importer:
5
- *
6
- * @use 'pkg:@underlayerdev/ui/breakpoints' as bp;
7
- *
8
- * .my-component {
9
- * @include bp.up('md') {
10
- * display: flex;
11
- * }
12
- * }
13
- *
14
- * Requires Dart Sass with the Node package importer enabled (supported by
15
- * @angular/build out of the box since Angular CLI 20+).
16
- */
1
+ /// Public Sass entry point for @underlayerdev/ui breakpoint media queries.
2
+ ///
3
+ /// Consuming apps can import this via the `pkg:` importer:
4
+ ///
5
+ /// @use 'pkg:@underlayerdev/ui/breakpoints' as bp;
6
+ ///
7
+ /// .my-component {
8
+ /// @include bp.up('md') {
9
+ /// display: flex;
10
+ /// }
11
+ /// }
12
+ ///
13
+ /// Requires Dart Sass with the Node package importer enabled (supported by
14
+ /// @angular/build out of the box since Angular CLI 20+).
17
15
  @forward './breakpoints';
@@ -1,10 +1,6 @@
1
- // Keep in sync with design-tokens/_variables.scss $breakpoint-*.
2
- //
3
- // Duplicated (not imported from ../core / ../design-tokens) so the
4
- // published `./breakpoints` package export stays self-contained: Node's
5
- // package "exports" boundaries block relative imports that cross from one
6
- // exported subpath into a different one, so this file can't reach outside
7
- // its own foundations/breakpoints/ directory once published.
1
+ // Do not edit directly, this file was generated from ui/tokens/tokens/*.json.
2
+ // A self-contained copy of the tokens the published ./breakpoints subpath needs.
3
+
8
4
  $breakpoint-xs: 0px !default;
9
5
  $breakpoint-sm: 768px !default;
10
6
  $breakpoint-md: 1024px !default;
@@ -1,22 +1,20 @@
1
- /**
2
- * Public Sass entry point for @underlayerdev/ui container mixins.
3
- *
4
- * Consuming apps can import this via the `pkg:` importer to compose their
5
- * own responsive container (e.g. fluid on mobile, product on desktop)
6
- * instead of duplicating the padding scale by hand:
7
- *
8
- * @use 'pkg:@underlayerdev/ui/containers' as containers;
9
- * @use 'pkg:@underlayerdev/ui/breakpoints' as bp;
10
- *
11
- * .my-page {
12
- * @include containers.container-fluid;
13
- *
14
- * @include bp.up('md') {
15
- * @include containers.container-product;
16
- * }
17
- * }
18
- *
19
- * Requires Dart Sass with the Node package importer enabled (supported by
20
- * @angular/build out of the box since Angular CLI 20+).
21
- */
1
+ /// Public Sass entry point for @underlayerdev/ui container mixins.
2
+ ///
3
+ /// Consuming apps can import this via the `pkg:` importer to compose their
4
+ /// own responsive container (e.g. fluid on mobile, product on desktop)
5
+ /// instead of duplicating the padding scale by hand:
6
+ ///
7
+ /// @use 'pkg:@underlayerdev/ui/containers' as containers;
8
+ /// @use 'pkg:@underlayerdev/ui/breakpoints' as bp;
9
+ ///
10
+ /// .my-page {
11
+ /// @include containers.container-fluid;
12
+ ///
13
+ /// @include bp.up('md') {
14
+ /// @include containers.container-product;
15
+ /// }
16
+ /// }
17
+ ///
18
+ /// Requires Dart Sass with the Node package importer enabled (supported by
19
+ /// @angular/build out of the box since Angular CLI 20+).
22
20
  @forward './containers';
@@ -1,14 +1,9 @@
1
- // Keep in sync with design-tokens/_variables.scss $breakpoint-*/$spacing-spacing-*.
2
- //
3
- // Duplicated (not imported from ../core / ../design-tokens) so the
4
- // published `./containers` package export stays self-contained: Node's
5
- // package "exports" boundaries block relative imports that cross from one
6
- // exported subpath into a different one, so this file can't reach outside
7
- // its own foundations/containers/ directory once published.
8
- $breakpoint-md: 1024px !default;
9
- $breakpoint-xl: 1600px !default;
1
+ // Do not edit directly, this file was generated from ui/tokens/tokens/*.json.
2
+ // A self-contained copy of the tokens the published ./containers subpath needs.
10
3
 
11
4
  $spacing-spacing-4: 16px !default;
12
5
  $spacing-spacing-8: 32px !default;
13
6
  $spacing-spacing-16: 64px !default;
14
7
  $spacing-spacing-48: 192px !default;
8
+ $breakpoint-md: 1024px !default;
9
+ $breakpoint-xl: 1600px !default;
@@ -1,16 +1,14 @@
1
- /**
2
- * Elevation tokens for z-index layering.
3
- * Use these instead of hardcoded values to ensure consistent stacking order.
4
- *
5
- * Stacking order (low to high):
6
- * - base, raised: content layers
7
- * - navbar: sticky navigation
8
- * - dropdown: popovers, dropdowns
9
- * - overlay: backdrops (sidebar overlay, modal backdrop)
10
- * - drawer: sliding panels (sidebar drawer)
11
- * - modal: dialogs
12
- * - toast: notifications
13
- */
1
+ /// Elevation tokens for z-index layering.
2
+ /// Use these instead of hardcoded values to ensure consistent stacking order.
3
+ ///
4
+ /// Stacking order (low to high):
5
+ /// - base, raised: content layers
6
+ /// - navbar: sticky navigation
7
+ /// - dropdown: popovers, dropdowns
8
+ /// - overlay: backdrops (sidebar overlay, modal backdrop)
9
+ /// - drawer: sliding panels (sidebar drawer)
10
+ /// - modal: dialogs
11
+ /// - toast: notifications
14
12
 
15
13
  $elevation-base: 0 !default;
16
14
  $elevation-raised: 1 !default;
@@ -1,17 +1,15 @@
1
- /**
2
- * Public Sass entry point for @underlayerdev/ui design tokens.
3
- *
4
- * Consuming apps can import this via the `pkg:` importer:
5
- *
6
- * @use 'pkg:@underlayerdev/ui/design-tokens' as tokens;
7
- *
8
- * .my-component {
9
- * padding: tokens.$spacing-spacing-4;
10
- * color: tokens.$color-text-secondary;
11
- * }
12
- *
13
- * Requires Dart Sass with the Node package importer enabled (supported by
14
- * @angular/build out of the box since Angular CLI 20+).
15
- */
1
+ /// Public Sass entry point for @underlayerdev/ui design tokens.
2
+ ///
3
+ /// Consuming apps can import this via the `pkg:` importer:
4
+ ///
5
+ /// @use 'pkg:@underlayerdev/ui/design-tokens' as tokens;
6
+ ///
7
+ /// .my-component {
8
+ /// padding: tokens.$spacing-spacing-4;
9
+ /// color: tokens.$color-text-secondary;
10
+ /// }
11
+ ///
12
+ /// Requires Dart Sass with the Node package importer enabled (supported by
13
+ /// @angular/build out of the box since Angular CLI 20+).
16
14
  @forward 'variables';
17
15
  @forward 'elevations';
@@ -1,6 +1,4 @@
1
- /**
2
- * Do not edit directly, this file was auto-generated.
3
- */
1
+ // Do not edit directly, this file was generated from ui/tokens/tokens/*.json.
4
2
 
5
3
  $primitive-color-cyan-transparent-8-30: rgba(88, 183, 188, 0.3) !default;
6
4
  $primitive-color-cyan-transparent-8-20: rgba(88, 183, 188, 0.2) !default;
@@ -367,8 +365,6 @@ $spacing-spacing-1: 4px !default;
367
365
  $spacing-spacing-2: 8px !default;
368
366
  $spacing-spacing-3: 12px !default;
369
367
  $spacing-spacing-4: 16px !default;
370
- // Extended spacing scale for a smoother 4px rhythm
371
- // Existing components can now migrate magic numbers to these tokens.
372
368
  $spacing-spacing-5: 20px !default;
373
369
  $spacing-spacing-6: 24px !default;
374
370
  $spacing-spacing-7: 28px !default;
@@ -400,31 +396,6 @@ $spacing-spacing-104: 416px !default;
400
396
  $spacing-spacing-112: 448px !default;
401
397
  $spacing-spacing-120: 480px !default;
402
398
  $spacing-spacing-128: 512px !default;
403
-
404
- // Component control sizing tokens (heights / min-widths / icon-only sizes)
405
- // These explicitly capture the shared geometry used by buttons, inputs, and other form controls.
406
- $component-control-height-sm: 32px !default;
407
- $component-control-height-md: 40px !default;
408
- $component-control-height-lg: 48px !default;
409
- $component-control-height-xl: 64px !default;
410
-
411
- // Avatar-only — deliberately not part of the shared control-height family
412
- // above (a giant size doesn't make sense on a button or input), so it isn't
413
- // exposed through UiSize.
414
- $component-avatar-size-2xl: 128px !default;
415
- $component-avatar-size-3xl: 160px !default;
416
-
417
- $component-dropdown-list-max-height: 316px !default;
418
-
419
- $component-control-min-width-sm: 96px !default;
420
- $component-control-min-width-md: 112px !default;
421
- $component-control-min-width-lg: 144px !default;
422
-
423
- $component-control-vertical-width-lg: 164px !default;
424
-
425
- $component-icon-only-size-sm: 32px !default;
426
- $component-icon-only-size-md: 40px !default;
427
- $component-icon-only-size-lg: 48px !default;
428
399
  $radius-radius-1: 4px !default;
429
400
  $radius-radius-2: 8px !default;
430
401
  $radius-radius-3: 12px !default;
@@ -457,6 +428,20 @@ $iconography-font-line-height-12: 48px !default;
457
428
  $iconography-font-line-height-16: 64px !default;
458
429
  $iconography-font-line-height-24: 96px !default;
459
430
  $iconography-font-line-height-32: 128px !default;
431
+ $component-dropdown-list-max-height: 316px !default;
432
+ $component-control-height-sm: 32px !default;
433
+ $component-control-height-md: 40px !default;
434
+ $component-control-height-lg: 48px !default;
435
+ $component-control-height-xl: 64px !default;
436
+ $component-control-min-width-sm: 96px !default;
437
+ $component-control-min-width-md: 112px !default;
438
+ $component-control-min-width-lg: 144px !default;
439
+ $component-icon-only-size-sm: 32px !default;
440
+ $component-icon-only-size-md: 40px !default;
441
+ $component-icon-only-size-lg: 48px !default;
442
+ $component-control-vertical-width-lg: 164px !default;
443
+ $component-avatar-size-2xl: 128px !default;
444
+ $component-avatar-size-3xl: 160px !default;
460
445
  $breakpoint-xs: 0px !default;
461
446
  $breakpoint-sm: 768px !default;
462
447
  $breakpoint-md: 1024px !default;
@@ -1,92 +1,137 @@
1
- import * as i0 from '@angular/core';
2
- import { ViewEncapsulation, Component, input, output, viewChild, contentChildren, effect } from '@angular/core';
3
- import Splide from '@splidejs/splide';
4
-
5
- class CarouselItemComponent {
6
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: CarouselItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.0", type: CarouselItemComponent, isStandalone: true, selector: "ul-carousel-item", host: { classAttribute: "splide__slide ul-carousel__item" }, ngImport: i0, template: ` <ng-content /> `, isInline: true, encapsulation: i0.ViewEncapsulation.None });
8
- }
9
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: CarouselItemComponent, decorators: [{
10
- type: Component,
11
- args: [{
12
- selector: 'ul-carousel-item',
13
- template: ` <ng-content /> `,
14
- encapsulation: ViewEncapsulation.None,
15
- host: {
16
- class: 'splide__slide ul-carousel__item',
17
- },
18
- }]
19
- }] });
20
- class CarouselComponent {
21
- options = input({
22
- autoplay: true,
23
- }, /* @ts-ignore */
24
- ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
25
- autoMount = input(true, /* @ts-ignore */
26
- ...(ngDevMode ? [{ debugName: "autoMount" }] : /* istanbul ignore next */ []));
27
- mounted = output();
28
- carousel = viewChild('carousel', /* @ts-ignore */
29
- ...(ngDevMode ? [{ debugName: "carousel" }] : /* istanbul ignore next */ []));
30
- items = contentChildren(CarouselItemComponent, /* @ts-ignore */
31
- ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
32
- instance = null;
33
- constructor() {
34
- effect(() => {
35
- this.items(); // trigger change detection
36
- this.updateCarouselOnItemsChange();
37
- });
38
- }
39
- ngAfterViewInit() {
40
- this.init();
41
- }
42
- ngOnDestroy() {
43
- this.instance?.destroy();
44
- }
45
- // Get the Splide instance
46
- getInstance() {
47
- return this.instance;
48
- }
49
- // Methods to control the carousel
50
- goNext() {
51
- this.instance?.go('>');
52
- }
53
- goPrev() {
54
- this.instance?.go('<');
55
- }
56
- goTo(index) {
57
- this.instance?.go(index);
58
- }
59
- // Mount the carousel
60
- mount() {
61
- if (!this.instance) {
62
- throw new Error('Carousel instance not found');
63
- }
64
- this.instance.mount();
65
- this.mounted.emit(this.instance);
66
- }
67
- init() {
68
- const carousel = this.carousel();
69
- if (!carousel) {
70
- throw new Error('Carousel element not found');
71
- }
72
- // initialize the carousel
73
- this.instance = new Splide(carousel.nativeElement, {
74
- arrows: false,
75
- classes: {
76
- page: 'splide__pagination__page ul-carousel__pagination-dot',
77
- },
78
- ...this.options(),
79
- });
80
- // mount the carousel
81
- if (this.autoMount()) {
82
- this.mount();
83
- }
84
- }
85
- updateCarouselOnItemsChange() {
86
- this.instance?.refresh();
87
- }
88
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: CarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
89
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.0", type: CarouselComponent, isStandalone: true, selector: "ul-carousel", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, autoMount: { classPropertyName: "autoMount", publicName: "autoMount", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mounted: "mounted" }, queries: [{ propertyName: "items", predicate: CarouselItemComponent, isSignal: true }], viewQueries: [{ propertyName: "carousel", first: true, predicate: ["carousel"], descendants: true, isSignal: true }], ngImport: i0, template: `
1
+ import * as i0 from "@angular/core";
2
+ import { Component, ViewEncapsulation, contentChildren, effect, input, output, viewChild } from "@angular/core";
3
+ import Splide from "@splidejs/splide";
4
+ var CarouselItemComponent = class CarouselItemComponent {
5
+ static ɵfac = i0.ɵɵngDeclareFactory({
6
+ minVersion: "12.0.0",
7
+ version: "22.2.2",
8
+ ngImport: i0,
9
+ type: CarouselItemComponent,
10
+ deps: [],
11
+ target: i0.ɵɵFactoryTarget.Component
12
+ });
13
+ static ɵcmp = i0.ɵɵngDeclareComponent({
14
+ minVersion: "14.0.0",
15
+ version: "22.2.2",
16
+ type: CarouselItemComponent,
17
+ isStandalone: true,
18
+ selector: "ul-carousel-item",
19
+ host: { classAttribute: "splide__slide ul-carousel__item" },
20
+ ngImport: i0,
21
+ template: ` <ng-content /> `,
22
+ isInline: true,
23
+ encapsulation: i0.ViewEncapsulation.None
24
+ });
25
+ };
26
+ i0.ɵɵngDeclareClassMetadata({
27
+ minVersion: "12.0.0",
28
+ version: "22.2.2",
29
+ ngImport: i0,
30
+ type: CarouselItemComponent,
31
+ decorators: [{
32
+ type: Component,
33
+ args: [{
34
+ selector: "ul-carousel-item",
35
+ template: ` <ng-content /> `,
36
+ encapsulation: ViewEncapsulation.None,
37
+ host: { class: "splide__slide ul-carousel__item" }
38
+ }]
39
+ }]
40
+ });
41
+ var CarouselComponent = class CarouselComponent {
42
+ options = input({ autoplay: true }, ...ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []);
43
+ autoMount = input(true, ...ngDevMode ? [{ debugName: "autoMount" }] : /* istanbul ignore next */ []);
44
+ mounted = output();
45
+ carousel = viewChild("carousel", ...ngDevMode ? [{ debugName: "carousel" }] : /* istanbul ignore next */ []);
46
+ items = contentChildren(CarouselItemComponent, ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
47
+ instance = null;
48
+ constructor() {
49
+ effect(() => {
50
+ this.items();
51
+ this.updateCarouselOnItemsChange();
52
+ });
53
+ }
54
+ ngAfterViewInit() {
55
+ this.init();
56
+ }
57
+ ngOnDestroy() {
58
+ this.instance?.destroy();
59
+ }
60
+ getInstance() {
61
+ return this.instance;
62
+ }
63
+ goNext() {
64
+ this.instance?.go(">");
65
+ }
66
+ goPrev() {
67
+ this.instance?.go("<");
68
+ }
69
+ goTo(index) {
70
+ this.instance?.go(index);
71
+ }
72
+ mount() {
73
+ if (!this.instance) throw new Error("Carousel instance not found");
74
+ this.instance.mount();
75
+ this.mounted.emit(this.instance);
76
+ }
77
+ init() {
78
+ const carousel = this.carousel();
79
+ if (!carousel) throw new Error("Carousel element not found");
80
+ this.instance = new Splide(carousel.nativeElement, {
81
+ arrows: false,
82
+ classes: { page: "splide__pagination__page ul-carousel__pagination-dot" },
83
+ ...this.options()
84
+ });
85
+ if (this.autoMount()) this.mount();
86
+ }
87
+ updateCarouselOnItemsChange() {
88
+ this.instance?.refresh();
89
+ }
90
+ static ɵfac = i0.ɵɵngDeclareFactory({
91
+ minVersion: "12.0.0",
92
+ version: "22.2.2",
93
+ ngImport: i0,
94
+ type: CarouselComponent,
95
+ deps: [],
96
+ target: i0.ɵɵFactoryTarget.Component
97
+ });
98
+ static ɵcmp = i0.ɵɵngDeclareComponent({
99
+ minVersion: "17.2.0",
100
+ version: "22.2.2",
101
+ type: CarouselComponent,
102
+ isStandalone: true,
103
+ selector: "ul-carousel",
104
+ inputs: {
105
+ options: {
106
+ classPropertyName: "options",
107
+ publicName: "options",
108
+ isSignal: true,
109
+ isRequired: false,
110
+ transformFunction: null
111
+ },
112
+ autoMount: {
113
+ classPropertyName: "autoMount",
114
+ publicName: "autoMount",
115
+ isSignal: true,
116
+ isRequired: false,
117
+ transformFunction: null
118
+ }
119
+ },
120
+ outputs: { mounted: "mounted" },
121
+ queries: [{
122
+ propertyName: "items",
123
+ predicate: CarouselItemComponent,
124
+ isSignal: true
125
+ }],
126
+ viewQueries: [{
127
+ propertyName: "carousel",
128
+ first: true,
129
+ predicate: ["carousel"],
130
+ descendants: true,
131
+ isSignal: true
132
+ }],
133
+ ngImport: i0,
134
+ template: `
90
135
  <div class="splide ul-carousel" #carousel role="region" aria-roledescription="carousel">
91
136
  <div class="splide__track ul-carousel__track">
92
137
  <div class="splide__list">
@@ -94,11 +139,22 @@ class CarouselComponent {
94
139
  </div>
95
140
  </div>
96
141
  </div>
97
- `, isInline: true, styles: ["@keyframes splide-loading{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.splide__track--draggable{-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.splide__track--fade>.splide__list>.splide__slide{margin:0!important;opacity:0;z-index:0}.splide__track--fade>.splide__list>.splide__slide.is-active{opacity:1;z-index:1}.splide--rtl{direction:rtl}.splide__track--ttb>.splide__list{display:block}.splide__container{box-sizing:border-box;position:relative}.splide__list{backface-visibility:hidden;display:-ms-flexbox;display:flex;height:100%;margin:0!important;padding:0!important}.splide.is-initialized:not(.is-active) .splide__list{display:block}.splide__pagination{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;margin:0;pointer-events:none}.splide__pagination li{display:inline-block;line-height:1;list-style-type:none;margin:0;pointer-events:auto}.splide:not(.is-overflow) .splide__pagination{display:none}.splide__progress__bar{width:0}.splide{position:relative;visibility:hidden}.splide.is-initialized,.splide.is-rendered{visibility:visible}.splide__slide{backface-visibility:hidden;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0;list-style-type:none!important;margin:0;position:relative}.splide__slide img{vertical-align:bottom}.splide__spinner{animation:splide-loading 1s linear infinite;border:2px solid #999;border-left-color:transparent;border-radius:50%;contain:strict;display:inline-block;height:20px;inset:0;margin:auto;position:absolute;width:20px}.splide__sr{clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.splide__toggle.is-active .splide__toggle__play,.splide__toggle__pause{display:none}.splide__toggle.is-active .splide__toggle__pause{display:inline}.splide__track{overflow:hidden;position:relative;z-index:0}.ul-rich-text{font-family:Underlayer Nunito Sans;line-height:28px;font-size:18px;letter-spacing:0px;font-weight:400;color:#fff}.ul-rich-text p,.ul-rich-text ul,.ul-rich-text ol,.ul-rich-text blockquote,.ul-rich-text pre{margin-top:0;margin-bottom:16px}.ul-rich-text:last-child,.ul-rich-text p:last-child,.ul-rich-text ul:last-child,.ul-rich-text ol:last-child,.ul-rich-text blockquote:last-child,.ul-rich-text pre:last-child{margin-bottom:0}.ul-rich-text h1,.ul-rich-text h2,.ul-rich-text h3,.ul-rich-text h4,.ul-rich-text h5,.ul-rich-text h6{margin-top:32px;margin-bottom:12px;font-weight:1000}.ul-rich-text h1{font-family:Underlayer Nunito Sans;line-height:48px;font-size:48px;letter-spacing:-.48px;font-weight:1000}.ul-rich-text h2{font-family:Underlayer Nunito Sans;line-height:48px;font-size:40px;letter-spacing:-.4px;font-weight:1000}.ul-rich-text h3{font-family:Underlayer Nunito Sans;line-height:44px;font-size:36px;letter-spacing:-.36px;font-weight:1000}.ul-rich-text h4{font-family:Underlayer Nunito Sans;line-height:40px;font-size:32px;letter-spacing:-.32px;font-weight:1000}.ul-rich-text h5{font-family:Underlayer Nunito Sans;line-height:36px;font-size:28px;letter-spacing:-.28px;font-weight:1000}.ul-rich-text h6{font-family:Underlayer Nunito Sans;line-height:36px;font-size:24px;letter-spacing:-.24px;font-weight:1000}.ul-rich-text ul,.ul-rich-text ol{padding-left:24px}.ul-rich-text ul ul,.ul-rich-text ul ol,.ul-rich-text ol ul,.ul-rich-text ol ol{margin-top:8px;margin-bottom:8px}.ul-rich-text li{margin-top:4px;margin-bottom:4px}.ul-rich-text strong{font-weight:800}.ul-rich-text code{font-family:Roboto Mono;line-height:20px;font-size:14px;letter-spacing:0px;font-weight:400}.ul-rich-text em{font-style:italic}.ul-rich-text a{color:#c2a8ff;text-decoration:underline;text-decoration-thickness:1px}.ul-rich-text a:hover{color:#d6c5ff}.ul-rich-text a:active{color:#a781ff}.ul-rich-text pre{padding:16px;border-radius:8px;background-color:#3b3b3b;overflow-x:auto}.ul-rich-text pre code{font-family:Roboto Mono;line-height:20px;font-size:14px;letter-spacing:0px;font-weight:400}.ul-rich-text blockquote{margin-left:0;padding-left:16px;border-left-width:2px;border-left-style:solid;border-left-color:#ffffff1a;color:#ffffffb3}.ul-rich-text--muted{color:#ffffffb3}.ul-rich-text--inverse,.ul-rich-text--inverse a{color:#000}.ul-rich-text--inverse a:hover,.ul-rich-text--inverse a:active{color:#000000b3}.ul-rich-text--body-m{font-family:Underlayer Nunito Sans;line-height:24px;font-size:16px;letter-spacing:0px;font-weight:400}.ul-rich-text--compact p,.ul-rich-text--compact ul,.ul-rich-text--compact ol,.ul-rich-text--compact blockquote,.ul-rich-text--compact pre{margin-bottom:8px}.ul-rich-text--compact h1,.ul-rich-text--compact h2,.ul-rich-text--compact h3,.ul-rich-text--compact h4,.ul-rich-text--compact h5,.ul-rich-text--compact h6{margin-top:16px;margin-bottom:8px}.ul-carousel{display:grid;grid-template-columns:1fr;grid-template-rows:auto 1fr;position:relative}.ul-carousel .splide__arrows{position:absolute;inset:0;z-index:1;pointer-events:none}.ul-carousel .splide__arrow{pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border:0;border-radius:4096px;background-color:#0000004d;color:#fff;cursor:pointer;transition:background-color .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)}.ul-carousel .splide__arrow:hover:not(:disabled){background-color:#000000b3}.ul-carousel .splide__arrow svg{width:20px;height:20px;fill:currentColor}.ul-carousel .splide__arrow:disabled{opacity:.3;cursor:default}.ul-carousel .splide__arrow--prev{left:8px}.ul-carousel .splide__arrow--prev svg{transform:scaleX(-1)}.ul-carousel .splide__arrow--next{right:8px}.ul-carousel__pagination-dot{border:0;border-radius:50%;margin:1rem .2rem 0;padding:0;height:6px;width:6px;background-color:#ffffff80}.ul-carousel__pagination-dot.is-active{background-color:#fff}\n"], encapsulation: i0.ViewEncapsulation.None });
98
- }
99
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: CarouselComponent, decorators: [{
100
- type: Component,
101
- args: [{ selector: 'ul-carousel', template: `
142
+ `,
143
+ isInline: true,
144
+ styles: ["@keyframes splide-loading{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.splide__track--draggable{-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.splide__track--fade>.splide__list>.splide__slide{margin:0!important;opacity:0;z-index:0}.splide__track--fade>.splide__list>.splide__slide.is-active{opacity:1;z-index:1}.splide--rtl{direction:rtl}.splide__track--ttb>.splide__list{display:block}.splide__container{box-sizing:border-box;position:relative}.splide__list{backface-visibility:hidden;display:-ms-flexbox;display:flex;height:100%;margin:0!important;padding:0!important}.splide.is-initialized:not(.is-active) .splide__list{display:block}.splide__pagination{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;margin:0;pointer-events:none}.splide__pagination li{display:inline-block;line-height:1;list-style-type:none;margin:0;pointer-events:auto}.splide:not(.is-overflow) .splide__pagination{display:none}.splide__progress__bar{width:0}.splide{position:relative;visibility:hidden}.splide.is-initialized,.splide.is-rendered{visibility:visible}.splide__slide{backface-visibility:hidden;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0;list-style-type:none!important;margin:0;position:relative}.splide__slide img{vertical-align:bottom}.splide__spinner{animation:splide-loading 1s linear infinite;border:2px solid #999;border-left-color:transparent;border-radius:50%;contain:strict;display:inline-block;height:20px;inset:0;margin:auto;position:absolute;width:20px}.splide__sr{clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.splide__toggle.is-active .splide__toggle__play,.splide__toggle__pause{display:none}.splide__toggle.is-active .splide__toggle__pause{display:inline}.splide__track{overflow:hidden;position:relative;z-index:0}.ul-carousel{display:grid;grid-template-columns:1fr;grid-template-rows:auto 1fr;position:relative}.ul-carousel .splide__arrows{position:absolute;inset:0;z-index:1;pointer-events:none}.ul-carousel .splide__arrow{pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border:0;border-radius:4096px;background-color:#0000004d;color:#fff;cursor:pointer;transition:background-color .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)}.ul-carousel .splide__arrow:hover:not(:disabled){background-color:#000000b3}.ul-carousel .splide__arrow svg{width:20px;height:20px;fill:currentColor}.ul-carousel .splide__arrow:disabled{opacity:.3;cursor:default}.ul-carousel .splide__arrow--prev{left:8px}.ul-carousel .splide__arrow--prev svg{transform:scaleX(-1)}.ul-carousel .splide__arrow--next{right:8px}.ul-carousel__pagination-dot{border:0;border-radius:50%;margin:1rem .2rem 0;padding:0;height:6px;width:6px;background-color:#ffffff80}.ul-carousel__pagination-dot.is-active{background-color:#fff}\n"],
145
+ encapsulation: i0.ViewEncapsulation.None
146
+ });
147
+ };
148
+ i0.ɵɵngDeclareClassMetadata({
149
+ minVersion: "12.0.0",
150
+ version: "22.2.2",
151
+ ngImport: i0,
152
+ type: CarouselComponent,
153
+ decorators: [{
154
+ type: Component,
155
+ args: [{
156
+ selector: "ul-carousel",
157
+ template: `
102
158
  <div class="splide ul-carousel" #carousel role="region" aria-roledescription="carousel">
103
159
  <div class="splide__track ul-carousel__track">
104
160
  <div class="splide__list">
@@ -106,28 +162,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
106
162
  </div>
107
163
  </div>
108
164
  </div>
109
- `, encapsulation: ViewEncapsulation.None, styles: ["@keyframes splide-loading{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.splide__track--draggable{-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.splide__track--fade>.splide__list>.splide__slide{margin:0!important;opacity:0;z-index:0}.splide__track--fade>.splide__list>.splide__slide.is-active{opacity:1;z-index:1}.splide--rtl{direction:rtl}.splide__track--ttb>.splide__list{display:block}.splide__container{box-sizing:border-box;position:relative}.splide__list{backface-visibility:hidden;display:-ms-flexbox;display:flex;height:100%;margin:0!important;padding:0!important}.splide.is-initialized:not(.is-active) .splide__list{display:block}.splide__pagination{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;margin:0;pointer-events:none}.splide__pagination li{display:inline-block;line-height:1;list-style-type:none;margin:0;pointer-events:auto}.splide:not(.is-overflow) .splide__pagination{display:none}.splide__progress__bar{width:0}.splide{position:relative;visibility:hidden}.splide.is-initialized,.splide.is-rendered{visibility:visible}.splide__slide{backface-visibility:hidden;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0;list-style-type:none!important;margin:0;position:relative}.splide__slide img{vertical-align:bottom}.splide__spinner{animation:splide-loading 1s linear infinite;border:2px solid #999;border-left-color:transparent;border-radius:50%;contain:strict;display:inline-block;height:20px;inset:0;margin:auto;position:absolute;width:20px}.splide__sr{clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.splide__toggle.is-active .splide__toggle__play,.splide__toggle__pause{display:none}.splide__toggle.is-active .splide__toggle__pause{display:inline}.splide__track{overflow:hidden;position:relative;z-index:0}.ul-rich-text{font-family:Underlayer Nunito Sans;line-height:28px;font-size:18px;letter-spacing:0px;font-weight:400;color:#fff}.ul-rich-text p,.ul-rich-text ul,.ul-rich-text ol,.ul-rich-text blockquote,.ul-rich-text pre{margin-top:0;margin-bottom:16px}.ul-rich-text:last-child,.ul-rich-text p:last-child,.ul-rich-text ul:last-child,.ul-rich-text ol:last-child,.ul-rich-text blockquote:last-child,.ul-rich-text pre:last-child{margin-bottom:0}.ul-rich-text h1,.ul-rich-text h2,.ul-rich-text h3,.ul-rich-text h4,.ul-rich-text h5,.ul-rich-text h6{margin-top:32px;margin-bottom:12px;font-weight:1000}.ul-rich-text h1{font-family:Underlayer Nunito Sans;line-height:48px;font-size:48px;letter-spacing:-.48px;font-weight:1000}.ul-rich-text h2{font-family:Underlayer Nunito Sans;line-height:48px;font-size:40px;letter-spacing:-.4px;font-weight:1000}.ul-rich-text h3{font-family:Underlayer Nunito Sans;line-height:44px;font-size:36px;letter-spacing:-.36px;font-weight:1000}.ul-rich-text h4{font-family:Underlayer Nunito Sans;line-height:40px;font-size:32px;letter-spacing:-.32px;font-weight:1000}.ul-rich-text h5{font-family:Underlayer Nunito Sans;line-height:36px;font-size:28px;letter-spacing:-.28px;font-weight:1000}.ul-rich-text h6{font-family:Underlayer Nunito Sans;line-height:36px;font-size:24px;letter-spacing:-.24px;font-weight:1000}.ul-rich-text ul,.ul-rich-text ol{padding-left:24px}.ul-rich-text ul ul,.ul-rich-text ul ol,.ul-rich-text ol ul,.ul-rich-text ol ol{margin-top:8px;margin-bottom:8px}.ul-rich-text li{margin-top:4px;margin-bottom:4px}.ul-rich-text strong{font-weight:800}.ul-rich-text code{font-family:Roboto Mono;line-height:20px;font-size:14px;letter-spacing:0px;font-weight:400}.ul-rich-text em{font-style:italic}.ul-rich-text a{color:#c2a8ff;text-decoration:underline;text-decoration-thickness:1px}.ul-rich-text a:hover{color:#d6c5ff}.ul-rich-text a:active{color:#a781ff}.ul-rich-text pre{padding:16px;border-radius:8px;background-color:#3b3b3b;overflow-x:auto}.ul-rich-text pre code{font-family:Roboto Mono;line-height:20px;font-size:14px;letter-spacing:0px;font-weight:400}.ul-rich-text blockquote{margin-left:0;padding-left:16px;border-left-width:2px;border-left-style:solid;border-left-color:#ffffff1a;color:#ffffffb3}.ul-rich-text--muted{color:#ffffffb3}.ul-rich-text--inverse,.ul-rich-text--inverse a{color:#000}.ul-rich-text--inverse a:hover,.ul-rich-text--inverse a:active{color:#000000b3}.ul-rich-text--body-m{font-family:Underlayer Nunito Sans;line-height:24px;font-size:16px;letter-spacing:0px;font-weight:400}.ul-rich-text--compact p,.ul-rich-text--compact ul,.ul-rich-text--compact ol,.ul-rich-text--compact blockquote,.ul-rich-text--compact pre{margin-bottom:8px}.ul-rich-text--compact h1,.ul-rich-text--compact h2,.ul-rich-text--compact h3,.ul-rich-text--compact h4,.ul-rich-text--compact h5,.ul-rich-text--compact h6{margin-top:16px;margin-bottom:8px}.ul-carousel{display:grid;grid-template-columns:1fr;grid-template-rows:auto 1fr;position:relative}.ul-carousel .splide__arrows{position:absolute;inset:0;z-index:1;pointer-events:none}.ul-carousel .splide__arrow{pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border:0;border-radius:4096px;background-color:#0000004d;color:#fff;cursor:pointer;transition:background-color .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)}.ul-carousel .splide__arrow:hover:not(:disabled){background-color:#000000b3}.ul-carousel .splide__arrow svg{width:20px;height:20px;fill:currentColor}.ul-carousel .splide__arrow:disabled{opacity:.3;cursor:default}.ul-carousel .splide__arrow--prev{left:8px}.ul-carousel .splide__arrow--prev svg{transform:scaleX(-1)}.ul-carousel .splide__arrow--next{right:8px}.ul-carousel__pagination-dot{border:0;border-radius:50%;margin:1rem .2rem 0;padding:0;height:6px;width:6px;background-color:#ffffff80}.ul-carousel__pagination-dot.is-active{background-color:#fff}\n"] }]
110
- }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], autoMount: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoMount", required: false }] }], mounted: [{ type: i0.Output, args: ["mounted"] }], carousel: [{ type: i0.ViewChild, args: ['carousel', { isSignal: true }] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => CarouselItemComponent), { isSignal: true }] }] } });
111
-
112
- // Secondary entry point (`@underlayerdev/ui/carousel`), not re-exported from
113
- // the root barrel: CarouselComponent pulls in @splidejs/splide (~36 kB
114
- // minified), and the root entry ships as a single FESM file — anything that
115
- // imports even one symbol from it (ButtonComponent, in every app shell)
116
- // drags the whole file's dependency graph along, splide included, whether
117
- // or not that consumer ever uses a carousel. A real module boundary is what
118
- // actually stops that; nothing on the import side can.
119
- //
120
- // The component's own source lives in this folder too, not in
121
- // src/components/carousel/ re-exported from here: ng-packagr's secondary
122
- // entry points need to own their files — a public-api.ts that only
123
- // re-exports a file from outside its own directory tree makes ng-packagr's
124
- // internal dependency graph crash on external templateUrl/styleUrl
125
- // resolution ("Cannot destructure property 'pos' of
126
- // 'file.referencedFiles[index]' as it is undefined").
127
-
128
- /**
129
- * Generated bundle index. Do not edit.
130
- */
131
-
165
+ `,
166
+ encapsulation: ViewEncapsulation.None,
167
+ styles: ["@keyframes splide-loading{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.splide__track--draggable{-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.splide__track--fade>.splide__list>.splide__slide{margin:0!important;opacity:0;z-index:0}.splide__track--fade>.splide__list>.splide__slide.is-active{opacity:1;z-index:1}.splide--rtl{direction:rtl}.splide__track--ttb>.splide__list{display:block}.splide__container{box-sizing:border-box;position:relative}.splide__list{backface-visibility:hidden;display:-ms-flexbox;display:flex;height:100%;margin:0!important;padding:0!important}.splide.is-initialized:not(.is-active) .splide__list{display:block}.splide__pagination{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;margin:0;pointer-events:none}.splide__pagination li{display:inline-block;line-height:1;list-style-type:none;margin:0;pointer-events:auto}.splide:not(.is-overflow) .splide__pagination{display:none}.splide__progress__bar{width:0}.splide{position:relative;visibility:hidden}.splide.is-initialized,.splide.is-rendered{visibility:visible}.splide__slide{backface-visibility:hidden;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0;list-style-type:none!important;margin:0;position:relative}.splide__slide img{vertical-align:bottom}.splide__spinner{animation:splide-loading 1s linear infinite;border:2px solid #999;border-left-color:transparent;border-radius:50%;contain:strict;display:inline-block;height:20px;inset:0;margin:auto;position:absolute;width:20px}.splide__sr{clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.splide__toggle.is-active .splide__toggle__play,.splide__toggle__pause{display:none}.splide__toggle.is-active .splide__toggle__pause{display:inline}.splide__track{overflow:hidden;position:relative;z-index:0}.ul-carousel{display:grid;grid-template-columns:1fr;grid-template-rows:auto 1fr;position:relative}.ul-carousel .splide__arrows{position:absolute;inset:0;z-index:1;pointer-events:none}.ul-carousel .splide__arrow{pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border:0;border-radius:4096px;background-color:#0000004d;color:#fff;cursor:pointer;transition:background-color .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)}.ul-carousel .splide__arrow:hover:not(:disabled){background-color:#000000b3}.ul-carousel .splide__arrow svg{width:20px;height:20px;fill:currentColor}.ul-carousel .splide__arrow:disabled{opacity:.3;cursor:default}.ul-carousel .splide__arrow--prev{left:8px}.ul-carousel .splide__arrow--prev svg{transform:scaleX(-1)}.ul-carousel .splide__arrow--next{right:8px}.ul-carousel__pagination-dot{border:0;border-radius:50%;margin:1rem .2rem 0;padding:0;height:6px;width:6px;background-color:#ffffff80}.ul-carousel__pagination-dot.is-active{background-color:#fff}\n"]
168
+ }]
169
+ }],
170
+ ctorParameters: () => [],
171
+ propDecorators: {
172
+ options: [{
173
+ type: i0.Input,
174
+ args: [{
175
+ isSignal: true,
176
+ alias: "options",
177
+ required: false
178
+ }]
179
+ }],
180
+ autoMount: [{
181
+ type: i0.Input,
182
+ args: [{
183
+ isSignal: true,
184
+ alias: "autoMount",
185
+ required: false
186
+ }]
187
+ }],
188
+ mounted: [{
189
+ type: i0.Output,
190
+ args: ["mounted"]
191
+ }],
192
+ carousel: [{
193
+ type: i0.ViewChild,
194
+ args: ["carousel", { isSignal: true }]
195
+ }],
196
+ items: [{
197
+ type: i0.ContentChildren,
198
+ args: [i0.forwardRef(() => CarouselItemComponent), { isSignal: true }]
199
+ }]
200
+ }
201
+ });
132
202
  export { CarouselComponent, CarouselItemComponent };
133
- //# sourceMappingURL=underlayerdev-ui-carousel.mjs.map
203
+
204
+ //# sourceMappingURL=underlayerdev-ui-carousel.mjs.map