@underlayerdev/ui 0.13.4 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@underlayerdev/ui",
3
- "version": "0.13.4",
3
+ "version": "0.14.0",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^22.0.0",
6
6
  "@angular/common": "^22.0.0",
@@ -346,6 +346,81 @@ declare class CardComponent {
346
346
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardComponent, "ul-card", never, { "focused": { "alias": "focused"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "cardDirection": { "alias": "cardDirection"; "required": false; "isSignal": true; }; "cardCaptionSize": { "alias": "cardCaptionSize"; "required": false; "isSignal": true; }; "footerDist": { "alias": "footerDist"; "required": false; "isSignal": true; }; "mediaAspectRatio": { "alias": "mediaAspectRatio"; "required": false; "isSignal": true; }; "mediaBlur": { "alias": "mediaBlur"; "required": false; "isSignal": true; }; "mediaGrayscale": { "alias": "mediaGrayscale"; "required": false; "isSignal": true; }; "cardCaption": { "alias": "cardCaption"; "required": false; "isSignal": true; }; "cardTitle": { "alias": "cardTitle"; "required": false; "isSignal": true; }; "cardTitleSingleLine": { "alias": "cardTitleSingleLine"; "required": false; "isSignal": true; }; "cardSubtitle": { "alias": "cardSubtitle"; "required": false; "isSignal": true; }; "cardSubtitleSingleLine": { "alias": "cardSubtitleSingleLine"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, never, ["[ulCardMedia]", "[ulCardMediaOverlay]", "[ulCardMediaAction]", "[ulCardFooter]"], true, never>;
347
347
  }
348
348
 
349
+ interface CategoryPickerNode {
350
+ id: string;
351
+ parentId: string | null;
352
+ label: string;
353
+ icon?: string;
354
+ isLeaf: boolean;
355
+ }
356
+ /**
357
+ * Picker for a hierarchical category tree of unbounded depth: a closed field
358
+ * that opens a drill-down + search modal (one level of children at a time,
359
+ * with a breadcrumb trail back to root) and resolves to a single leaf
360
+ * node's id. Implements FormValueControl for Signal Forms [formField]. Use
361
+ * [(value)] for two-way binding.
362
+ *
363
+ * Rows are real buttons (ul-list-item), so Tab/Shift+Tab and Enter/Space
364
+ * already give full keyboard access without extra arrow-key wiring — unlike
365
+ * ul-search-select's single-line combobox overlay, there's no need for
366
+ * ComboboxState here.
367
+ *
368
+ * @example
369
+ * <ul-category-picker label="Category" [nodes]="categoryNodes" [(value)]="categoryId" />
370
+ */
371
+ declare class CategoryPickerComponent implements FormValueControl<string | null> {
372
+ readonly size: _angular_core.InputSignal<UiSize>;
373
+ readonly label: _angular_core.InputSignal<string | null>;
374
+ readonly helperText: _angular_core.InputSignal<string | null>;
375
+ readonly errorText: _angular_core.InputSignal<string | null>;
376
+ readonly error: _angular_core.InputSignal<boolean>;
377
+ readonly disabled: _angular_core.InputSignal<boolean>;
378
+ readonly required: _angular_core.InputSignal<boolean>;
379
+ readonly showRequiredIndicator: _angular_core.InputSignal<boolean>;
380
+ readonly placeholder: _angular_core.InputSignal<string>;
381
+ readonly searchPlaceholder: _angular_core.InputSignal<string>;
382
+ readonly modalTitle: _angular_core.InputSignal<string>;
383
+ readonly rootLabel: _angular_core.InputSignal<string>;
384
+ readonly noResultsText: _angular_core.InputSignal<string>;
385
+ readonly nodes: _angular_core.InputSignal<CategoryPickerNode[]>;
386
+ readonly invalid: _angular_core.InputSignal<boolean>;
387
+ readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
388
+ /** Emitted when the modal closes, whether or not a value was picked — mirrors ul-select's touch. */
389
+ readonly touch: _angular_core.OutputEmitterRef<void>;
390
+ readonly value: _angular_core.ModelSignal<string | null>;
391
+ protected readonly ids: {
392
+ controlId: string;
393
+ helperId: string;
394
+ errorId: string;
395
+ };
396
+ protected readonly open: _angular_core.WritableSignal<boolean>;
397
+ protected readonly currentParentId: _angular_core.WritableSignal<string | null>;
398
+ protected readonly query: _angular_core.WritableSignal<string>;
399
+ protected readonly hasError: _angular_core.Signal<boolean>;
400
+ protected readonly describedBy: _angular_core.Signal<string | undefined>;
401
+ private readonly nodesById;
402
+ protected readonly selectedNode: _angular_core.Signal<CategoryPickerNode | null>;
403
+ protected readonly selectedLabel: _angular_core.Signal<string>;
404
+ protected readonly currentChildren: _angular_core.Signal<CategoryPickerNode[]>;
405
+ /** Root→current ancestor chain, for the breadcrumb trail (empty at the root level). */
406
+ protected readonly breadcrumb: _angular_core.Signal<CategoryPickerNode[]>;
407
+ private readonly normalizedQuery;
408
+ protected readonly isSearching: _angular_core.Signal<boolean>;
409
+ protected readonly searchResults: _angular_core.Signal<{
410
+ node: CategoryPickerNode;
411
+ breadcrumb: string;
412
+ }[]>;
413
+ protected readonly hasNoResults: _angular_core.Signal<boolean>;
414
+ openPicker(): void;
415
+ closePicker(): void;
416
+ selectNode(node: CategoryPickerNode): void;
417
+ goToBreadcrumb(parentId: string | null): void;
418
+ private ancestorNodes;
419
+ private ancestorLabels;
420
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CategoryPickerComponent, never>;
421
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CategoryPickerComponent, "ul-category-picker", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showRequiredIndicator": { "alias": "showRequiredIndicator"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "modalTitle": { "alias": "modalTitle"; "required": false; "isSignal": true; }; "rootLabel": { "alias": "rootLabel"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "touch": "touch"; "value": "valueChange"; }, never, never, true, never>;
422
+ }
423
+
349
424
  type CheckboxZoneType = 'none' | 'accessible' | 'visible' | 'checked-visible';
350
425
  /**
351
426
  * Checkbox component. Implements FormCheckboxControl for Signal Forms [formField].
@@ -2107,5 +2182,5 @@ declare class TextareaComponent implements FormValueControl<string> {
2107
2182
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextareaComponent, "ul-textarea", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showRequiredIndicator": { "alias": "showRequiredIndicator"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "resize": { "alias": "resize"; "required": false; "isSignal": true; }; "groupFocused": { "alias": "groupFocused"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "touch": "touch"; "value": "valueChange"; "inputBlur": "inputBlur"; "inputFocus": "inputFocus"; }, ["customField"], ["[ul-textarea-left-elements]", "[ul-textarea-field]", "[ul-textarea-right-elements]"], true, never>;
2108
2183
  }
2109
2184
 
2110
- export { AccordionComponent, AccordionItemComponent, AreaCodeComponent, AvatarComponent, AvatarGroupComponent, BreadcrumbComponent, ButtonComponent, CalendarComponent, CardComponent, CheckboxComponent, CollapseComponent, CustomCurrencyPipe, DockComponent, DockItemComponent, DockItemContentSlotDirective, DropdownComponent, FileInputComponent, FooterComponent, FormFieldHelperComponent, FormFieldLabelComponent, HeroComponent, IconComponent, ImageCropperComponent, ImageNotFoundComponent, ImageNotFoundDirective, InputComponent, ListItemComponent, LongPressDirective, MenuComponent, MenuItemsComponent, MenuTriggerComponent, ModalComponent, NavbarAppNameSlotDirective, NavbarAvatarSlotDirective, NavbarComponent, NavbarLogoSlotDirective, NavbarSearchSlotDirective, PeHeroActionsSlotDirective, PeHeroBadgesSlotDirective, PeHeroContentSlotDirective, PeHeroSubtitleSlotDirective, PeHeroTitleSlotDirective, PillComponent, PriceButtonComponent, RadialComponent, RadioComponent, RadioGroupComponent, RichTextComponent, SearchInputComponent, SearchSelectComponent, SelectComponent, SelectableRowComponent, SidebarComponent, SkeletonComponent, StatusComponent, StepperComponent, TableComponent, TextareaComponent, TextareaFieldDirective, ToastContainerComponent, ToastService, ToggleComponent, TooltipComponent, createFormFieldIds, getFormFieldDescribedBy, toastIcon };
2111
- export type { ActionsDistribution, AvatarData, AvatarSize, BreadcrumbItem, BreadcrumbSeparator, CalendarDay, CalendarMode, CardCaptionSize, CardDirection, CheckboxZoneType, CollapseVariant, Currency, DockItemVariant, DropdownItem, FileInputAppearance, HeroAction, HeroAlignment, HeroSize, IconName, IconSize, IconWeight, ImageCropperShape, InputAppearance, InputType, ListItemTheme, MediaAspectRatio, MenuItem, ModalVariant, PillSize, PillTheme, PillVariant, RadioGroupOption, RichTextSize, RichTextTone, SalePosition, SearchSelectOption, SearchSuggestion, SelectOption, SidebarItem, SkeletonBorderRadius, SkeletonVariant, SortDirection, Status, TableColumn, TextareaResize, TimeSelection, ToastConfig, ToastKind, ToastWithRole, TooltipPosition };
2185
+ export { AccordionComponent, AccordionItemComponent, AreaCodeComponent, AvatarComponent, AvatarGroupComponent, BreadcrumbComponent, ButtonComponent, CalendarComponent, CardComponent, CategoryPickerComponent, CheckboxComponent, CollapseComponent, CustomCurrencyPipe, DockComponent, DockItemComponent, DockItemContentSlotDirective, DropdownComponent, FileInputComponent, FooterComponent, FormFieldHelperComponent, FormFieldLabelComponent, HeroComponent, IconComponent, ImageCropperComponent, ImageNotFoundComponent, ImageNotFoundDirective, InputComponent, ListItemComponent, LongPressDirective, MenuComponent, MenuItemsComponent, MenuTriggerComponent, ModalComponent, NavbarAppNameSlotDirective, NavbarAvatarSlotDirective, NavbarComponent, NavbarLogoSlotDirective, NavbarSearchSlotDirective, PeHeroActionsSlotDirective, PeHeroBadgesSlotDirective, PeHeroContentSlotDirective, PeHeroSubtitleSlotDirective, PeHeroTitleSlotDirective, PillComponent, PriceButtonComponent, RadialComponent, RadioComponent, RadioGroupComponent, RichTextComponent, SearchInputComponent, SearchSelectComponent, SelectComponent, SelectableRowComponent, SidebarComponent, SkeletonComponent, StatusComponent, StepperComponent, TableComponent, TextareaComponent, TextareaFieldDirective, ToastContainerComponent, ToastService, ToggleComponent, TooltipComponent, createFormFieldIds, getFormFieldDescribedBy, toastIcon };
2186
+ export type { ActionsDistribution, AvatarData, AvatarSize, BreadcrumbItem, BreadcrumbSeparator, CalendarDay, CalendarMode, CardCaptionSize, CardDirection, CategoryPickerNode, CheckboxZoneType, CollapseVariant, Currency, DockItemVariant, DropdownItem, FileInputAppearance, HeroAction, HeroAlignment, HeroSize, IconName, IconSize, IconWeight, ImageCropperShape, InputAppearance, InputType, ListItemTheme, MediaAspectRatio, MenuItem, ModalVariant, PillSize, PillTheme, PillVariant, RadioGroupOption, RichTextSize, RichTextTone, SalePosition, SearchSelectOption, SearchSuggestion, SelectOption, SidebarItem, SkeletonBorderRadius, SkeletonVariant, SortDirection, Status, TableColumn, TextareaResize, TimeSelection, ToastConfig, ToastKind, ToastWithRole, TooltipPosition };