@underlayerdev/ui 0.18.0 → 0.18.1

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.
@@ -1499,7 +1499,7 @@ var BannerComponent = class BannerComponent {
1499
1499
  outputs: { dismissed: "dismissed" },
1500
1500
  ngImport: i0,
1501
1501
  template: "<section class=\"ul-banner ul-banner--{{ tone() }}\">\n <ul-icon class=\"ul-banner__icon\" [icon]=\"resolvedIcon()\" size=\"6\" />\n\n <div class=\"ul-banner__body\">\n <div class=\"ul-banner__title\"><ng-content select=\"[ul-banner-title]\" /></div>\n <div class=\"ul-banner__message\"><ng-content /></div>\n </div>\n\n <div class=\"ul-banner__actions\"><ng-content select=\"[ul-banner-actions]\" /></div>\n\n @if (dismissible()) {\n <ul-button\n class=\"ul-banner__close\"\n theme=\"ghost-white\"\n size=\"xs\"\n [iconOnly]=\"true\"\n [ariaLabel]=\"dismissLabel()\"\n (buttonClick)=\"dismissed.emit()\"\n >\n <ul-icon icon=\"cross\" size=\"4\" />\n </ul-button>\n }\n</section>\n",
1502
- styles: [".ul-banner{display:flex;align-items:center;gap:16px;padding:16px;border:1px solid rgba(255,255,255,.1);border-radius:12px;background-color:#232323;color:#fff}@media(max-width:767px){.ul-banner{flex-wrap:wrap;align-items:flex-start}}.ul-banner__icon{flex-shrink:0}.ul-banner__body{flex:1 1 0;min-width:0}.ul-banner__title:not(:empty){margin-block-end:4px;font-family:Underlayer Nunito Sans;line-height:24px;font-size:16px;letter-spacing:0px;font-weight:800}.ul-banner__message{font-family:Underlayer Nunito Sans;line-height:24px;font-size:16px;letter-spacing:0px;font-weight:400;color:#ffffffb3}.ul-banner__actions{display:flex;flex-shrink:0;justify-content:end;gap:8px}.ul-banner__actions:empty{display:none}@media(max-width:767px){.ul-banner__actions{order:3;width:100%}}.ul-banner__close{flex-shrink:0}@media(max-width:767px){.ul-banner__close{order:2}}.ul-banner--info{border-color:#c2a8ff}.ul-banner--alert{border-color:#ffd9af}.ul-banner--confirm{border-color:#7edc96}.ul-banner--error{border-color:#f69d9d}\n"],
1502
+ styles: [":host{display:block}.ul-banner{display:flex;align-items:center;gap:16px;padding:16px;border:1px solid rgba(255,255,255,.1);border-radius:12px;background-color:#232323;color:#fff}@media(max-width:767px){.ul-banner{flex-wrap:wrap;align-items:flex-start}}.ul-banner__icon{flex-shrink:0}.ul-banner__body{flex:1 1 0;min-width:0}.ul-banner__title:not(:empty){margin-block-end:4px;font-family:Underlayer Nunito Sans;line-height:24px;font-size:16px;letter-spacing:0px;font-weight:800}.ul-banner__message{font-family:Underlayer Nunito Sans;line-height:24px;font-size:16px;letter-spacing:0px;font-weight:400;color:#ffffffb3}.ul-banner__actions{display:flex;flex-shrink:0;justify-content:end;gap:8px}.ul-banner__actions:empty{display:none}@media(max-width:767px){.ul-banner__actions{order:3;width:100%}}.ul-banner__close{flex-shrink:0}@media(max-width:767px){.ul-banner__close{order:2}}.ul-banner--info{border-color:#c2a8ff}.ul-banner--alert{border-color:#ffd9af}.ul-banner--confirm{border-color:#7edc96}.ul-banner--error{border-color:#f69d9d}\n"],
1503
1503
  dependencies: [{
1504
1504
  kind: "component",
1505
1505
  type: ButtonComponent,
@@ -1537,7 +1537,7 @@ i0.ɵɵngDeclareClassMetadata({
1537
1537
  selector: "ul-banner",
1538
1538
  imports: [ButtonComponent, IconComponent],
1539
1539
  template: "<section class=\"ul-banner ul-banner--{{ tone() }}\">\n <ul-icon class=\"ul-banner__icon\" [icon]=\"resolvedIcon()\" size=\"6\" />\n\n <div class=\"ul-banner__body\">\n <div class=\"ul-banner__title\"><ng-content select=\"[ul-banner-title]\" /></div>\n <div class=\"ul-banner__message\"><ng-content /></div>\n </div>\n\n <div class=\"ul-banner__actions\"><ng-content select=\"[ul-banner-actions]\" /></div>\n\n @if (dismissible()) {\n <ul-button\n class=\"ul-banner__close\"\n theme=\"ghost-white\"\n size=\"xs\"\n [iconOnly]=\"true\"\n [ariaLabel]=\"dismissLabel()\"\n (buttonClick)=\"dismissed.emit()\"\n >\n <ul-icon icon=\"cross\" size=\"4\" />\n </ul-button>\n }\n</section>\n",
1540
- styles: [".ul-banner{display:flex;align-items:center;gap:16px;padding:16px;border:1px solid rgba(255,255,255,.1);border-radius:12px;background-color:#232323;color:#fff}@media(max-width:767px){.ul-banner{flex-wrap:wrap;align-items:flex-start}}.ul-banner__icon{flex-shrink:0}.ul-banner__body{flex:1 1 0;min-width:0}.ul-banner__title:not(:empty){margin-block-end:4px;font-family:Underlayer Nunito Sans;line-height:24px;font-size:16px;letter-spacing:0px;font-weight:800}.ul-banner__message{font-family:Underlayer Nunito Sans;line-height:24px;font-size:16px;letter-spacing:0px;font-weight:400;color:#ffffffb3}.ul-banner__actions{display:flex;flex-shrink:0;justify-content:end;gap:8px}.ul-banner__actions:empty{display:none}@media(max-width:767px){.ul-banner__actions{order:3;width:100%}}.ul-banner__close{flex-shrink:0}@media(max-width:767px){.ul-banner__close{order:2}}.ul-banner--info{border-color:#c2a8ff}.ul-banner--alert{border-color:#ffd9af}.ul-banner--confirm{border-color:#7edc96}.ul-banner--error{border-color:#f69d9d}\n"]
1540
+ styles: [":host{display:block}.ul-banner{display:flex;align-items:center;gap:16px;padding:16px;border:1px solid rgba(255,255,255,.1);border-radius:12px;background-color:#232323;color:#fff}@media(max-width:767px){.ul-banner{flex-wrap:wrap;align-items:flex-start}}.ul-banner__icon{flex-shrink:0}.ul-banner__body{flex:1 1 0;min-width:0}.ul-banner__title:not(:empty){margin-block-end:4px;font-family:Underlayer Nunito Sans;line-height:24px;font-size:16px;letter-spacing:0px;font-weight:800}.ul-banner__message{font-family:Underlayer Nunito Sans;line-height:24px;font-size:16px;letter-spacing:0px;font-weight:400;color:#ffffffb3}.ul-banner__actions{display:flex;flex-shrink:0;justify-content:end;gap:8px}.ul-banner__actions:empty{display:none}@media(max-width:767px){.ul-banner__actions{order:3;width:100%}}.ul-banner__close{flex-shrink:0}@media(max-width:767px){.ul-banner__close{order:2}}.ul-banner--info{border-color:#c2a8ff}.ul-banner--alert{border-color:#ffd9af}.ul-banner--confirm{border-color:#7edc96}.ul-banner--error{border-color:#f69d9d}\n"]
1541
1541
  }]
1542
1542
  }],
1543
1543
  propDecorators: {
@@ -6119,17 +6119,24 @@ var DropdownComponent = class DropdownComponent {
6119
6119
  menuTriggerIcons = input(DEFAULT_MENU_TRIGGER_ICONS, ...ngDevMode ? [{ debugName: "menuTriggerIcons" }] : /* istanbul ignore next */ []);
6120
6120
  triggerIconOnly = input(...ngDevMode ? [void 0, { debugName: "triggerIconOnly" }] : /* istanbul ignore next */ []);
6121
6121
  iconOnlyLabel = input("Open menu", ...ngDevMode ? [{ debugName: "iconOnlyLabel" }] : /* istanbul ignore next */ []);
6122
+ placeholder = input(...ngDevMode ? [void 0, { debugName: "placeholder" }] : /* istanbul ignore next */ []);
6122
6123
  selectedIndex = model(0, ...ngDevMode ? [{ debugName: "selectedIndex" }] : /* istanbul ignore next */ []);
6123
6124
  selectedItem = computed(() => {
6124
6125
  const items = this.items();
6126
+ const index = this.selectedIndex();
6127
+ const fallback = {
6128
+ label: "",
6129
+ value: void 0,
6130
+ leftIcons: [],
6131
+ rightIcons: [],
6132
+ disabled: false
6133
+ };
6134
+ const placeholder = this.placeholder();
6125
6135
  return {
6126
- ...items[this.selectedIndex()] ?? items[0] ?? {
6127
- label: "",
6128
- value: void 0,
6129
- leftIcons: [],
6130
- rightIcons: [],
6131
- disabled: false
6132
- },
6136
+ ...placeholder !== void 0 && !items[index] ? {
6137
+ ...fallback,
6138
+ label: placeholder
6139
+ } : items[index] ?? items[0] ?? fallback,
6133
6140
  ...this.menuTriggerIcons() ?? DEFAULT_MENU_TRIGGER_ICONS
6134
6141
  };
6135
6142
  }, ...ngDevMode ? [{ debugName: "selectedItem" }] : /* istanbul ignore next */ []);
@@ -6215,6 +6222,13 @@ var DropdownComponent = class DropdownComponent {
6215
6222
  isRequired: false,
6216
6223
  transformFunction: null
6217
6224
  },
6225
+ placeholder: {
6226
+ classPropertyName: "placeholder",
6227
+ publicName: "placeholder",
6228
+ isSignal: true,
6229
+ isRequired: false,
6230
+ transformFunction: null
6231
+ },
6218
6232
  selectedIndex: {
6219
6233
  classPropertyName: "selectedIndex",
6220
6234
  publicName: "selectedIndex",
@@ -6348,6 +6362,14 @@ i0.ɵɵngDeclareClassMetadata({
6348
6362
  required: false
6349
6363
  }]
6350
6364
  }],
6365
+ placeholder: [{
6366
+ type: i0.Input,
6367
+ args: [{
6368
+ isSignal: true,
6369
+ alias: "placeholder",
6370
+ required: false
6371
+ }]
6372
+ }],
6351
6373
  selectedIndex: [{
6352
6374
  type: i0.Input,
6353
6375
  args: [{
@@ -14476,6 +14498,7 @@ i0.ɵɵngDeclareClassMetadata({
14476
14498
  }]
14477
14499
  }
14478
14500
  });
14501
+ const NO_SELECTION = -1;
14479
14502
  var SelectComponent = class SelectComponent {
14480
14503
  size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
14481
14504
  theme = input("transparent-white", ...ngDevMode ? [{ debugName: "theme" }] : /* istanbul ignore next */ []);
@@ -14511,17 +14534,11 @@ var SelectComponent = class SelectComponent {
14511
14534
  effect(() => {
14512
14535
  const currentValue = this.value();
14513
14536
  const options = this.options();
14514
- if (currentValue == null) {
14515
- this.selectedIndex.set(0);
14516
- return;
14517
- }
14518
- const index = options.findIndex((opt) => opt.value === currentValue);
14519
- this.selectedIndex.set(index >= 0 ? index : 0);
14537
+ this.selectedIndex.set(currentValue == null ? NO_SELECTION : options.findIndex((opt) => opt.value === currentValue));
14520
14538
  });
14521
14539
  }
14522
- onSelectedIndexChange(index) {
14523
- const option = this.options()[index];
14524
- this.selectedIndex.set(index);
14540
+ onItemSelected(item) {
14541
+ const option = this.options().find((candidate) => candidate.value === item.value);
14525
14542
  this.value.set(option?.value ?? null);
14526
14543
  }
14527
14544
  onDropdownClosed() {
@@ -14654,7 +14671,7 @@ var SelectComponent = class SelectComponent {
14654
14671
  selectedIndex: "selectedIndexChange"
14655
14672
  },
14656
14673
  ngImport: i0,
14657
- template: "<div\n class=\"ul-select ul-select--{{ size() }}\"\n [class.ul-select--disabled]=\"disabled()\"\n [class.ul-select--error]=\"hasError()\"\n [class.ul-select--required]=\"required()\"\n [attr.aria-invalid]=\"hasError()\"\n [attr.aria-required]=\"required()\"\n [attr.aria-describedby]=\"describedBy()\"\n>\n <ul-form-field-label\n [label]=\"label()\"\n [required]=\"required()\"\n [for]=\"ids.controlId\"\n [size]=\"size()\"\n [showRequiredIndicator]=\"showRequiredIndicator()\"\n />\n\n <div\n class=\"ul-select__control\"\n [id]=\"ids.controlId\"\n [class.ul-select__control--disabled]=\"disabled()\"\n >\n <ul-dropdown\n class=\"ul-select__dropdown\"\n [theme]=\"theme()\"\n [items]=\"items()\"\n [disabled]=\"disabled()\"\n [(selectedIndex)]=\"selectedIndex\"\n (selectedIndexChange)=\"onSelectedIndexChange($event)\"\n (closed)=\"onDropdownClosed()\"\n />\n </div>\n\n <ul-form-field-helper\n [id]=\"ids.helperId\"\n [helperText]=\"helperText()\"\n [errorText]=\"errorText() || (hasError() && errors().length ? errors()[0].message : '') || null\"\n [error]=\"hasError()\"\n />\n</div>\n",
14674
+ template: "<div\n class=\"ul-select ul-select--{{ size() }}\"\n [class.ul-select--disabled]=\"disabled()\"\n [class.ul-select--error]=\"hasError()\"\n [class.ul-select--required]=\"required()\"\n [attr.aria-invalid]=\"hasError()\"\n [attr.aria-required]=\"required()\"\n [attr.aria-describedby]=\"describedBy()\"\n>\n <ul-form-field-label\n [label]=\"label()\"\n [required]=\"required()\"\n [for]=\"ids.controlId\"\n [size]=\"size()\"\n [showRequiredIndicator]=\"showRequiredIndicator()\"\n />\n\n <div\n class=\"ul-select__control\"\n [id]=\"ids.controlId\"\n [class.ul-select__control--disabled]=\"disabled()\"\n >\n <ul-dropdown\n class=\"ul-select__dropdown\"\n [theme]=\"theme()\"\n [items]=\"items()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [selectedIndex]=\"selectedIndex()\"\n (selectedItemChange)=\"onItemSelected($event)\"\n (closed)=\"onDropdownClosed()\"\n />\n </div>\n\n <ul-form-field-helper\n [id]=\"ids.helperId\"\n [helperText]=\"helperText()\"\n [errorText]=\"errorText() || (hasError() && errors().length ? errors()[0].message : '') || null\"\n [error]=\"hasError()\"\n />\n</div>\n",
14658
14675
  styles: [".ul-select{white-space:nowrap;box-sizing:border-box;display:flex;flex-direction:column;width:100%;gap:4px}.ul-select__control{display:flex;align-items:center;min-height:40px;border:2px solid rgba(255,255,255,.1);border-radius:8px;background-color:transparent;transition:border-color .25s cubic-bezier(.4,0,.2,1)}.ul-select__control:hover{border-color:#ffffff4d}.ul-select__control:focus-within{border-color:#ffffff80}.ul-select__control .ul-list-item:focus-visible,.ul-select__control .ul-list-item:focus{outline:none}.ul-select__control--disabled{opacity:.6;cursor:not-allowed}.ul-select--disabled .ul-select__control{border-color:#ffffff1a}.ul-select--disabled .ul-select__control:hover,.ul-select--disabled .ul-select__control:focus-within{border-color:#ffffff1a}.ul-select--disabled .ul-select__control{opacity:.6;cursor:not-allowed}.ul-select__dropdown{width:100%}\n"],
14659
14676
  dependencies: [
14660
14677
  {
@@ -14668,6 +14685,7 @@ var SelectComponent = class SelectComponent {
14668
14685
  "menuTriggerIcons",
14669
14686
  "triggerIconOnly",
14670
14687
  "iconOnlyLabel",
14688
+ "placeholder",
14671
14689
  "selectedIndex"
14672
14690
  ],
14673
14691
  outputs: [
@@ -14718,7 +14736,7 @@ i0.ɵɵngDeclareClassMetadata({
14718
14736
  FormFieldHelperComponent
14719
14737
  ],
14720
14738
  encapsulation: ViewEncapsulation.None,
14721
- template: "<div\n class=\"ul-select ul-select--{{ size() }}\"\n [class.ul-select--disabled]=\"disabled()\"\n [class.ul-select--error]=\"hasError()\"\n [class.ul-select--required]=\"required()\"\n [attr.aria-invalid]=\"hasError()\"\n [attr.aria-required]=\"required()\"\n [attr.aria-describedby]=\"describedBy()\"\n>\n <ul-form-field-label\n [label]=\"label()\"\n [required]=\"required()\"\n [for]=\"ids.controlId\"\n [size]=\"size()\"\n [showRequiredIndicator]=\"showRequiredIndicator()\"\n />\n\n <div\n class=\"ul-select__control\"\n [id]=\"ids.controlId\"\n [class.ul-select__control--disabled]=\"disabled()\"\n >\n <ul-dropdown\n class=\"ul-select__dropdown\"\n [theme]=\"theme()\"\n [items]=\"items()\"\n [disabled]=\"disabled()\"\n [(selectedIndex)]=\"selectedIndex\"\n (selectedIndexChange)=\"onSelectedIndexChange($event)\"\n (closed)=\"onDropdownClosed()\"\n />\n </div>\n\n <ul-form-field-helper\n [id]=\"ids.helperId\"\n [helperText]=\"helperText()\"\n [errorText]=\"errorText() || (hasError() && errors().length ? errors()[0].message : '') || null\"\n [error]=\"hasError()\"\n />\n</div>\n",
14739
+ template: "<div\n class=\"ul-select ul-select--{{ size() }}\"\n [class.ul-select--disabled]=\"disabled()\"\n [class.ul-select--error]=\"hasError()\"\n [class.ul-select--required]=\"required()\"\n [attr.aria-invalid]=\"hasError()\"\n [attr.aria-required]=\"required()\"\n [attr.aria-describedby]=\"describedBy()\"\n>\n <ul-form-field-label\n [label]=\"label()\"\n [required]=\"required()\"\n [for]=\"ids.controlId\"\n [size]=\"size()\"\n [showRequiredIndicator]=\"showRequiredIndicator()\"\n />\n\n <div\n class=\"ul-select__control\"\n [id]=\"ids.controlId\"\n [class.ul-select__control--disabled]=\"disabled()\"\n >\n <ul-dropdown\n class=\"ul-select__dropdown\"\n [theme]=\"theme()\"\n [items]=\"items()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [selectedIndex]=\"selectedIndex()\"\n (selectedItemChange)=\"onItemSelected($event)\"\n (closed)=\"onDropdownClosed()\"\n />\n </div>\n\n <ul-form-field-helper\n [id]=\"ids.helperId\"\n [helperText]=\"helperText()\"\n [errorText]=\"errorText() || (hasError() && errors().length ? errors()[0].message : '') || null\"\n [error]=\"hasError()\"\n />\n</div>\n",
14722
14740
  styles: [".ul-select{white-space:nowrap;box-sizing:border-box;display:flex;flex-direction:column;width:100%;gap:4px}.ul-select__control{display:flex;align-items:center;min-height:40px;border:2px solid rgba(255,255,255,.1);border-radius:8px;background-color:transparent;transition:border-color .25s cubic-bezier(.4,0,.2,1)}.ul-select__control:hover{border-color:#ffffff4d}.ul-select__control:focus-within{border-color:#ffffff80}.ul-select__control .ul-list-item:focus-visible,.ul-select__control .ul-list-item:focus{outline:none}.ul-select__control--disabled{opacity:.6;cursor:not-allowed}.ul-select--disabled .ul-select__control{border-color:#ffffff1a}.ul-select--disabled .ul-select__control:hover,.ul-select--disabled .ul-select__control:focus-within{border-color:#ffffff1a}.ul-select--disabled .ul-select__control{opacity:.6;cursor:not-allowed}.ul-select__dropdown{width:100%}\n"]
14723
14741
  }]
14724
14742
  }],