@ship-ui/core 0.22.15 → 0.22.17

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.
Files changed (69) hide show
  1. package/assets/mcp/components.json +213 -47
  2. package/bin/src/subset.ts +6 -6
  3. package/bin/src/utilities.ts +14 -14
  4. package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs +12 -86
  5. package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs.map +1 -1
  6. package/fesm2022/ship-ui-core-ship-accordion.mjs +4 -3
  7. package/fesm2022/ship-ui-core-ship-accordion.mjs.map +1 -1
  8. package/fesm2022/ship-ui-core-ship-alert.mjs +1 -4
  9. package/fesm2022/ship-ui-core-ship-alert.mjs.map +1 -1
  10. package/fesm2022/ship-ui-core-ship-blueprint.mjs +17 -11
  11. package/fesm2022/ship-ui-core-ship-blueprint.mjs.map +1 -1
  12. package/fesm2022/ship-ui-core-ship-checkbox.mjs +3 -2
  13. package/fesm2022/ship-ui-core-ship-checkbox.mjs.map +1 -1
  14. package/fesm2022/ship-ui-core-ship-color-picker.mjs +66 -62
  15. package/fesm2022/ship-ui-core-ship-color-picker.mjs.map +1 -1
  16. package/fesm2022/ship-ui-core-ship-datepicker.mjs +24 -16
  17. package/fesm2022/ship-ui-core-ship-datepicker.mjs.map +1 -1
  18. package/fesm2022/ship-ui-core-ship-dialog.mjs +4 -0
  19. package/fesm2022/ship-ui-core-ship-dialog.mjs.map +1 -1
  20. package/fesm2022/ship-ui-core-ship-editor.mjs +0 -42
  21. package/fesm2022/ship-ui-core-ship-editor.mjs.map +1 -1
  22. package/fesm2022/ship-ui-core-ship-form-field.mjs +0 -1
  23. package/fesm2022/ship-ui-core-ship-form-field.mjs.map +1 -1
  24. package/fesm2022/ship-ui-core-ship-kbd.mjs +0 -6
  25. package/fesm2022/ship-ui-core-ship-kbd.mjs.map +1 -1
  26. package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs +241 -0
  27. package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs.map +1 -0
  28. package/fesm2022/ship-ui-core-ship-menu.mjs +7 -10
  29. package/fesm2022/ship-ui-core-ship-menu.mjs.map +1 -1
  30. package/fesm2022/ship-ui-core-ship-popover.mjs +5 -20
  31. package/fesm2022/ship-ui-core-ship-popover.mjs.map +1 -1
  32. package/fesm2022/ship-ui-core-ship-radio.mjs +3 -2
  33. package/fesm2022/ship-ui-core-ship-radio.mjs.map +1 -1
  34. package/fesm2022/ship-ui-core-ship-range-slider.mjs +7 -9
  35. package/fesm2022/ship-ui-core-ship-range-slider.mjs.map +1 -1
  36. package/fesm2022/ship-ui-core-ship-select.mjs.map +1 -1
  37. package/fesm2022/ship-ui-core-ship-sidenav.mjs +2 -2
  38. package/fesm2022/ship-ui-core-ship-sidenav.mjs.map +1 -1
  39. package/fesm2022/ship-ui-core-ship-sortable.mjs +262 -68
  40. package/fesm2022/ship-ui-core-ship-sortable.mjs.map +1 -1
  41. package/fesm2022/ship-ui-core-ship-spotlight.mjs +0 -11
  42. package/fesm2022/ship-ui-core-ship-spotlight.mjs.map +1 -1
  43. package/fesm2022/ship-ui-core-ship-stepper.mjs +1 -1
  44. package/fesm2022/ship-ui-core-ship-stepper.mjs.map +1 -1
  45. package/fesm2022/ship-ui-core-ship-table.mjs +426 -23
  46. package/fesm2022/ship-ui-core-ship-table.mjs.map +1 -1
  47. package/fesm2022/ship-ui-core-ship-toggle.mjs +3 -2
  48. package/fesm2022/ship-ui-core-ship-toggle.mjs.map +1 -1
  49. package/fesm2022/ship-ui-core-ship-tree.mjs +1 -9
  50. package/fesm2022/ship-ui-core-ship-tree.mjs.map +1 -1
  51. package/fesm2022/ship-ui-core.mjs +37 -53
  52. package/fesm2022/ship-ui-core.mjs.map +1 -1
  53. package/package.json +5 -1
  54. package/types/ship-ui-core-ship-a11y-keybindings.d.ts +0 -55
  55. package/types/ship-ui-core-ship-accordion.d.ts +7 -7
  56. package/types/ship-ui-core-ship-blueprint.d.ts +2 -1
  57. package/types/ship-ui-core-ship-checkbox.d.ts +2 -3
  58. package/types/ship-ui-core-ship-color-picker.d.ts +1 -25
  59. package/types/ship-ui-core-ship-datepicker.d.ts +2 -3
  60. package/types/ship-ui-core-ship-editor.d.ts +10 -10
  61. package/types/ship-ui-core-ship-list-item-swipe.d.ts +25 -0
  62. package/types/ship-ui-core-ship-menu.d.ts +1 -2
  63. package/types/ship-ui-core-ship-radio.d.ts +2 -3
  64. package/types/ship-ui-core-ship-range-slider.d.ts +6 -6
  65. package/types/ship-ui-core-ship-sortable.d.ts +31 -9
  66. package/types/ship-ui-core-ship-table.d.ts +12 -1
  67. package/types/ship-ui-core-ship-toggle.d.ts +2 -3
  68. package/types/ship-ui-core-ship-tree.d.ts +20 -25
  69. package/types/ship-ui-core.d.ts +17 -24
@@ -1 +1 @@
1
- {"version":3,"file":"ship-ui-core-ship-tree.mjs","sources":["../../../projects/ship-ui/ship-tree/ship-tree.ts","../../../projects/ship-ui/ship-tree/ship-tree.html","../../../projects/ship-ui/ship-tree/ship-ui-core-ship-tree.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n ElementRef,\n inject,\n input,\n model,\n output,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipSortable } from '@ship-ui/core/ship-sortable';\n\n@Directive({ selector: 'sh-icon[openIcon]', standalone: true })\nexport class ShipTreeOpenIcon {\n readonly el = inject(ElementRef<HTMLElement>);\n}\n\n@Directive({ selector: 'sh-icon[closedIcon]', standalone: true })\nexport class ShipTreeClosedIcon {\n readonly el = inject(ElementRef<HTMLElement>);\n}\n\n@Directive({ selector: 'sh-icon[itemIcon]', standalone: true })\nexport class ShipTreeItemIcon {\n readonly el = inject(ElementRef<HTMLElement>);\n}\n\n@Component({\n selector: 'sh-tree',\n standalone: true,\n imports: [NgTemplateOutlet, ShipIcon, ShipSortable],\n templateUrl: './ship-tree.html',\n styleUrl: './ship-tree.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.sh-tree]': 'true',\n },\n})\nexport class ShipTree {\n /** The flat list of all tree nodes. */\n readonly items = model<any[]>([]);\n\n /** Optional Writable/Readable WritableSignal manager created by createTreeSortableManager. */\n readonly sortableManager = input<any>(null);\n\n /** Currently selected node ID. */\n readonly selectedId = model<string | null>(null);\n\n // Mappings\n readonly getId = input<(item: any) => string>((item) => item.id);\n readonly getName = input<(item: any) => string>((item) => item.name);\n readonly getParentId = input<(item: any) => string | null>((item) => item.parentId);\n readonly isFolder = input<(item: any) => boolean>((item) => item.type === 'dir');\n readonly getIsOpen = input<(item: any) => boolean>((item) => !!item.isOpen);\n readonly setIsOpen = input<(item: any, isOpen: boolean) => void>((item, open) => {\n item.isOpen = open;\n });\n\n /** Function returning a custom icon name for a node. */\n readonly getIcon = input<(item: any) => string | null>(() => null);\n\n // Read projected icons via lightweight directives\n readonly openIconDir = contentChild(ShipTreeOpenIcon);\n readonly closedIconDir = contentChild(ShipTreeClosedIcon);\n readonly itemIconDir = contentChild(ShipTreeItemIcon);\n\n openIconName = computed(() => this.openIconDir()?.el.nativeElement.textContent?.trim() || null);\n closedIconName = computed(() => this.closedIconDir()?.el.nativeElement.textContent?.trim() || null);\n itemIconName = computed(() => this.itemIconDir()?.el.nativeElement.textContent?.trim() || null);\n\n // Outputs\n readonly nodeClick = output<any>();\n readonly nodeToggle = output<{ node: any; isOpen: boolean }>();\n\n readonly nodeTemplate = contentChild<TemplateRef<any>>('nodeTemplate');\n readonly dirTemplate = contentChild<TemplateRef<any>>('dirTemplate');\n\n /** Filter the full flat array down to only visible nodes (whose parents are all expanded). */\n visibleNodes = computed(() => {\n const manager = this.sortableManager();\n if (manager && typeof manager.visibleNodes === 'function') {\n return manager.visibleNodes();\n }\n\n const list = this.items();\n const visible: any[] = [];\n\n const isNodeVisible = (node: any): boolean => {\n let currentParentId = this.getParentId()(node);\n while (currentParentId !== null && currentParentId !== undefined) {\n const parent = list.find((n) => this.getId()(n) === currentParentId);\n if (!parent || !this.getIsOpen()(parent)) {\n return false;\n }\n currentParentId = this.getParentId()(parent);\n }\n return true;\n };\n\n for (const node of list) {\n const parentId = this.getParentId()(node);\n if (parentId === null || parentId === undefined || isNodeVisible(node)) {\n visible.push(node);\n }\n }\n return visible;\n });\n\n toggleNode(node: any, event: MouseEvent) {\n event.stopPropagation();\n const open = !this.getIsOpen()(node);\n\n this.items.update((list) =>\n list.map((item) => {\n if (this.getId()(item) === this.getId()(node)) {\n const updated = { ...item };\n this.setIsOpen()(updated, open);\n return updated;\n }\n return item;\n })\n );\n\n this.nodeToggle.emit({ node, isOpen: open });\n }\n\n handleNodeClick(node: any, event: MouseEvent) {\n const target = event.target as HTMLElement;\n const isIconClick = !!target.closest('sh-icon') && !target.closest('.sh-tree-node-actions') && !target.closest('sh-tree-node-actions') && !target.closest('.caret-container');\n\n if (isIconClick && this.isFolder()(node)) {\n this.toggleNode(node, event);\n } else {\n this.selectNode(node);\n }\n }\n\n selectNode(node: any) {\n this.selectedId.set(this.getId()(node));\n this.nodeClick.emit(node);\n }\n\n getDepthArray(depth: number): number[] {\n return Array.from({ length: depth }, (_, i) => i);\n }\n\n getNodeDepth(node: any): number {\n const list = this.items();\n let depth = 0;\n let currentParentId = this.getParentId()(node);\n while (currentParentId !== null && currentParentId !== undefined) {\n const parent = list.find((n) => this.getId()(n) === currentParentId);\n if (!parent) break;\n depth++;\n currentParentId = this.getParentId()(parent);\n }\n return depth;\n }\n\n getNodeIcon(node: any): string | null {\n const customIcon = this.getIcon()(node);\n if (customIcon) return customIcon;\n\n if (this.isFolder()(node)) {\n const open = this.getIsOpen()(node);\n return open ? this.openIconName() : this.closedIconName();\n }\n return this.itemIconName() || 'file';\n }\n}\n\n@Component({\n selector: 'sh-tree-node',\n template: `\n <div class=\"sh-tree-node-left\">\n <ng-content select=\"sh-icon\" />\n <span class=\"sh-tree-node-label\">\n <ng-content />\n </span>\n </div>\n <div class=\"sh-tree-node-actions\">\n <ng-content select=\"[actions], sh-tree-node-actions\" />\n </div>\n `,\n host: {\n '[class.sh-tree-node-layout]': 'true',\n },\n})\nexport class ShipTreeNode {}\n\n@Component({\n selector: 'sh-tree-node-actions',\n template: `\n <ng-content />\n `,\n host: {\n '[class.sh-tree-node-actions]': 'true',\n },\n})\nexport class ShipTreeNodeActions {}\n","@if (sortableManager()) {\n <div\n class=\"sh-tree-container\"\n [shSortable]=\"sortableManager()\"\n [treeItems]=\"visibleNodes()\"\n sortingMode=\"tree\"\n role=\"tree\"\n >\n @for (node of visibleNodes(); track getId()(node)) {\n <div\n class=\"sh-tree-node\"\n [class.is-folder]=\"isFolder()(node)\"\n [class.is-expanded]=\"getIsOpen()(node)\"\n [class.is-selected]=\"selectedId() === getId()(node)\"\n draggable=\"true\"\n [attr.sortable-dir]=\"isFolder()(node) ? 'true' : null\"\n [style.--tree-depth]=\"getNodeDepth(node)\"\n (click)=\"handleNodeClick(node, $event)\"\n role=\"treeitem\"\n [attr.aria-expanded]=\"isFolder()(node) ? getIsOpen()(node) : null\"\n >\n <!-- Indent guides -->\n @for (i of getDepthArray(getNodeDepth(node)); track i) {\n <div class=\"indent-guide\" [style.--guide-index]=\"i\"></div>\n }\n\n <!-- Folder Caret -->\n @if (isFolder()(node) && !dirTemplate()) {\n <span class=\"caret-container\">\n <button class=\"caret-btn\" (click)=\"toggleNode(node, $event)\" type=\"button\">\n @if (getIsOpen()(node)) {\n <sh-icon size=\"small\">caret-down</sh-icon>\n } @else {\n <sh-icon size=\"small\">caret-right</sh-icon>\n }\n </button>\n </span>\n }\n\n <!-- Node Icon -->\n @if (getNodeIcon(node)) {\n @if (getNodeIcon(node) === 'file') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">file</sh-icon>\n } @else if (getNodeIcon(node) === 'folder') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">folder</sh-icon>\n } @else if (getNodeIcon(node) === 'folder-open') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">folder-open</sh-icon>\n } @else {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">\n {{ getNodeIcon(node) }}\n </sh-icon>\n }\n }\n\n <!-- Node Content -->\n <div class=\"node-content\">\n <ng-container *ngTemplateOutlet=\"isFolder()(node) && dirTemplate() ? dirTemplate() : (nodeTemplate() || defaultTemplate); context: { $implicit: node }\"></ng-container>\n </div>\n </div>\n } @empty {\n <div class=\"empty-state\">\n <ng-content select=\"[emptyState]\">\n No items in tree\n </ng-content>\n </div>\n }\n </div>\n} @else {\n <div class=\"sh-tree-container\" role=\"tree\">\n @for (node of visibleNodes(); track getId()(node)) {\n <div\n class=\"sh-tree-node\"\n [class.is-folder]=\"isFolder()(node)\"\n [class.is-expanded]=\"getIsOpen()(node)\"\n [class.is-selected]=\"selectedId() === getId()(node)\"\n [style.--tree-depth]=\"getNodeDepth(node)\"\n (click)=\"handleNodeClick(node, $event)\"\n role=\"treeitem\"\n [attr.aria-expanded]=\"isFolder()(node) ? getIsOpen()(node) : null\"\n >\n <!-- Indent guides -->\n @for (i of getDepthArray(getNodeDepth(node)); track i) {\n <div class=\"indent-guide\" [style.--guide-index]=\"i\"></div>\n }\n\n <!-- Folder Caret -->\n @if (isFolder()(node) && !dirTemplate()) {\n <span class=\"caret-container\">\n <button class=\"caret-btn\" (click)=\"toggleNode(node, $event)\" type=\"button\">\n @if (getIsOpen()(node)) {\n <sh-icon size=\"small\">caret-down</sh-icon>\n } @else {\n <sh-icon size=\"small\">caret-right</sh-icon>\n }\n </button>\n </span>\n }\n\n <!-- Node Icon -->\n @if (getNodeIcon(node)) {\n @if (getNodeIcon(node) === 'file') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">file</sh-icon>\n } @else if (getNodeIcon(node) === 'folder') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">folder</sh-icon>\n } @else if (getNodeIcon(node) === 'folder-open') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">folder-open</sh-icon>\n } @else {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">\n {{ getNodeIcon(node) }}\n </sh-icon>\n }\n }\n\n <!-- Node Content -->\n <div class=\"node-content\">\n <ng-container *ngTemplateOutlet=\"isFolder()(node) && dirTemplate() ? dirTemplate() : (nodeTemplate() || defaultTemplate); context: { $implicit: node }\"></ng-container>\n </div>\n </div>\n } @empty {\n <div class=\"empty-state\">\n <ng-content select=\"[emptyState]\">\n No items in tree\n </ng-content>\n </div>\n }\n </div>\n}\n\n<ng-template #defaultTemplate let-node>\n <span class=\"node-name\">{{ getName()(node) }}</span>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ship-ui-core-ship-tree.mjs","sources":["../../../projects/ship-ui/ship-tree/ship-tree.ts","../../../projects/ship-ui/ship-tree/ship-tree.html","../../../projects/ship-ui/ship-tree/ship-ui-core-ship-tree.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n ElementRef,\n inject,\n input,\n model,\n output,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipSortable } from '@ship-ui/core/ship-sortable';\n\n@Directive({ selector: 'sh-icon[openIcon]', standalone: true })\nexport class ShipTreeOpenIcon {\n el = inject(ElementRef<HTMLElement>);\n}\n\n@Directive({ selector: 'sh-icon[closedIcon]', standalone: true })\nexport class ShipTreeClosedIcon {\n el = inject(ElementRef<HTMLElement>);\n}\n\n@Directive({ selector: 'sh-icon[itemIcon]', standalone: true })\nexport class ShipTreeItemIcon {\n el = inject(ElementRef<HTMLElement>);\n}\n\n@Component({\n selector: 'sh-tree',\n standalone: true,\n imports: [NgTemplateOutlet, ShipIcon, ShipSortable],\n templateUrl: './ship-tree.html',\n styleUrl: './ship-tree.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.sh-tree]': 'true',\n },\n})\nexport class ShipTree {\n \n items = model<any[]>([]);\n\n \n sortableManager = input<any>(null);\n\n \n selectedId = model<string | null>(null);\n\n \n getId = input<(item: any) => string>((item) => item.id);\n getName = input<(item: any) => string>((item) => item.name);\n getParentId = input<(item: any) => string | null>((item) => item.parentId);\n isFolder = input<(item: any) => boolean>((item) => item.type === 'dir');\n getIsOpen = input<(item: any) => boolean>((item) => !!item.isOpen);\n setIsOpen = input<(item: any, isOpen: boolean) => void>((item, open) => {\n item.isOpen = open;\n });\n\n \n getIcon = input<(item: any) => string | null>(() => null);\n\n \n openIconDir = contentChild(ShipTreeOpenIcon);\n closedIconDir = contentChild(ShipTreeClosedIcon);\n itemIconDir = contentChild(ShipTreeItemIcon);\n\n openIconName = computed(() => this.openIconDir()?.el.nativeElement.textContent?.trim() || null);\n closedIconName = computed(() => this.closedIconDir()?.el.nativeElement.textContent?.trim() || null);\n itemIconName = computed(() => this.itemIconDir()?.el.nativeElement.textContent?.trim() || null);\n\n \n nodeClick = output<any>();\n nodeToggle = output<{ node: any; isOpen: boolean }>();\n\n nodeTemplate = contentChild<TemplateRef<any>>('nodeTemplate');\n dirTemplate = contentChild<TemplateRef<any>>('dirTemplate');\n\n \n visibleNodes = computed(() => {\n const manager = this.sortableManager();\n if (manager && typeof manager.visibleNodes === 'function') {\n return manager.visibleNodes();\n }\n\n const list = this.items();\n const visible: any[] = [];\n\n const isNodeVisible = (node: any): boolean => {\n let currentParentId = this.getParentId()(node);\n while (currentParentId !== null && currentParentId !== undefined) {\n const parent = list.find((n) => this.getId()(n) === currentParentId);\n if (!parent || !this.getIsOpen()(parent)) {\n return false;\n }\n currentParentId = this.getParentId()(parent);\n }\n return true;\n };\n\n for (const node of list) {\n const parentId = this.getParentId()(node);\n if (parentId === null || parentId === undefined || isNodeVisible(node)) {\n visible.push(node);\n }\n }\n return visible;\n });\n\n toggleNode(node: any, event: MouseEvent) {\n event.stopPropagation();\n const open = !this.getIsOpen()(node);\n\n this.items.update((list) =>\n list.map((item) => {\n if (this.getId()(item) === this.getId()(node)) {\n const updated = { ...item };\n this.setIsOpen()(updated, open);\n return updated;\n }\n return item;\n })\n );\n\n this.nodeToggle.emit({ node, isOpen: open });\n }\n\n handleNodeClick(node: any, event: MouseEvent) {\n const target = event.target as HTMLElement;\n const isIconClick = !!target.closest('sh-icon') && !target.closest('.sh-tree-node-actions') && !target.closest('sh-tree-node-actions') && !target.closest('.caret-container');\n\n if (isIconClick && this.isFolder()(node)) {\n this.toggleNode(node, event);\n } else {\n this.selectNode(node);\n }\n }\n\n selectNode(node: any) {\n this.selectedId.set(this.getId()(node));\n this.nodeClick.emit(node);\n }\n\n getDepthArray(depth: number): number[] {\n return Array.from({ length: depth }, (_, i) => i);\n }\n\n getNodeDepth(node: any): number {\n const list = this.items();\n let depth = 0;\n let currentParentId = this.getParentId()(node);\n while (currentParentId !== null && currentParentId !== undefined) {\n const parent = list.find((n) => this.getId()(n) === currentParentId);\n if (!parent) break;\n depth++;\n currentParentId = this.getParentId()(parent);\n }\n return depth;\n }\n\n getNodeIcon(node: any): string | null {\n const customIcon = this.getIcon()(node);\n if (customIcon) return customIcon;\n\n if (this.isFolder()(node)) {\n const open = this.getIsOpen()(node);\n return open ? this.openIconName() : this.closedIconName();\n }\n return this.itemIconName() || 'file';\n }\n}\n\n@Component({\n selector: 'sh-tree-node',\n template: `\n <div class=\"sh-tree-node-left\">\n <ng-content select=\"sh-icon\" />\n <span class=\"sh-tree-node-label\">\n <ng-content />\n </span>\n </div>\n <div class=\"sh-tree-node-actions\">\n <ng-content select=\"[actions], sh-tree-node-actions\" />\n </div>\n `,\n host: {\n '[class.sh-tree-node-layout]': 'true',\n },\n})\nexport class ShipTreeNode {}\n\n@Component({\n selector: 'sh-tree-node-actions',\n template: `\n <ng-content />\n `,\n host: {\n '[class.sh-tree-node-actions]': 'true',\n },\n})\nexport class ShipTreeNodeActions {}\n","@if (sortableManager()) {\n <div\n class=\"sh-tree-container\"\n [shSortable]=\"sortableManager()\"\n [treeItems]=\"visibleNodes()\"\n sortingMode=\"tree\"\n role=\"tree\"\n >\n @for (node of visibleNodes(); track getId()(node)) {\n <div\n class=\"sh-tree-node\"\n [class.is-folder]=\"isFolder()(node)\"\n [class.is-expanded]=\"getIsOpen()(node)\"\n [class.is-selected]=\"selectedId() === getId()(node)\"\n draggable=\"true\"\n [attr.sortable-dir]=\"isFolder()(node) ? 'true' : null\"\n [style.--tree-depth]=\"getNodeDepth(node)\"\n (click)=\"handleNodeClick(node, $event)\"\n role=\"treeitem\"\n [attr.aria-expanded]=\"isFolder()(node) ? getIsOpen()(node) : null\"\n >\n <!-- Indent guides -->\n @for (i of getDepthArray(getNodeDepth(node)); track i) {\n <div class=\"indent-guide\" [style.--guide-index]=\"i\"></div>\n }\n\n <!-- Folder Caret -->\n @if (isFolder()(node) && !dirTemplate()) {\n <span class=\"caret-container\">\n <button class=\"caret-btn\" (click)=\"toggleNode(node, $event)\" type=\"button\">\n @if (getIsOpen()(node)) {\n <sh-icon size=\"small\">caret-down</sh-icon>\n } @else {\n <sh-icon size=\"small\">caret-right</sh-icon>\n }\n </button>\n </span>\n }\n\n <!-- Node Icon -->\n @if (getNodeIcon(node)) {\n @if (getNodeIcon(node) === 'file') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">file</sh-icon>\n } @else if (getNodeIcon(node) === 'folder') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">folder</sh-icon>\n } @else if (getNodeIcon(node) === 'folder-open') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">folder-open</sh-icon>\n } @else {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">\n {{ getNodeIcon(node) }}\n </sh-icon>\n }\n }\n\n <!-- Node Content -->\n <div class=\"node-content\">\n <ng-container *ngTemplateOutlet=\"isFolder()(node) && dirTemplate() ? dirTemplate() : (nodeTemplate() || defaultTemplate); context: { $implicit: node }\"></ng-container>\n </div>\n </div>\n } @empty {\n <div class=\"empty-state\">\n <ng-content select=\"[emptyState]\">\n No items in tree\n </ng-content>\n </div>\n }\n </div>\n} @else {\n <div class=\"sh-tree-container\" role=\"tree\">\n @for (node of visibleNodes(); track getId()(node)) {\n <div\n class=\"sh-tree-node\"\n [class.is-folder]=\"isFolder()(node)\"\n [class.is-expanded]=\"getIsOpen()(node)\"\n [class.is-selected]=\"selectedId() === getId()(node)\"\n [style.--tree-depth]=\"getNodeDepth(node)\"\n (click)=\"handleNodeClick(node, $event)\"\n role=\"treeitem\"\n [attr.aria-expanded]=\"isFolder()(node) ? getIsOpen()(node) : null\"\n >\n <!-- Indent guides -->\n @for (i of getDepthArray(getNodeDepth(node)); track i) {\n <div class=\"indent-guide\" [style.--guide-index]=\"i\"></div>\n }\n\n <!-- Folder Caret -->\n @if (isFolder()(node) && !dirTemplate()) {\n <span class=\"caret-container\">\n <button class=\"caret-btn\" (click)=\"toggleNode(node, $event)\" type=\"button\">\n @if (getIsOpen()(node)) {\n <sh-icon size=\"small\">caret-down</sh-icon>\n } @else {\n <sh-icon size=\"small\">caret-right</sh-icon>\n }\n </button>\n </span>\n }\n\n <!-- Node Icon -->\n @if (getNodeIcon(node)) {\n @if (getNodeIcon(node) === 'file') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">file</sh-icon>\n } @else if (getNodeIcon(node) === 'folder') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">folder</sh-icon>\n } @else if (getNodeIcon(node) === 'folder-open') {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">folder-open</sh-icon>\n } @else {\n <sh-icon class=\"node-icon\" [class.folder]=\"isFolder()(node)\" size=\"small\">\n {{ getNodeIcon(node) }}\n </sh-icon>\n }\n }\n\n <!-- Node Content -->\n <div class=\"node-content\">\n <ng-container *ngTemplateOutlet=\"isFolder()(node) && dirTemplate() ? dirTemplate() : (nodeTemplate() || defaultTemplate); context: { $implicit: node }\"></ng-container>\n </div>\n </div>\n } @empty {\n <div class=\"empty-state\">\n <ng-content select=\"[emptyState]\">\n No items in tree\n </ng-content>\n </div>\n }\n </div>\n}\n\n<ng-template #defaultTemplate let-node>\n <span class=\"node-name\">{{ getName()(node) }}</span>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -188,15 +188,15 @@ class ShipTooltipWrapper {
188
188
  if (!this.SUPPORTS_ANCHOR) {
189
189
  setTimeout(() => {
190
190
  const scrollableParent = this.#findScrollableParent(tooltipEl);
191
- scrollableParent.addEventListener('scroll', () => this.calculateTooltipPosition(), {
191
+ scrollableParent.addEventListener('scroll', () => this.#calculateTooltipPosition(), {
192
192
  signal: this.#positionAbort?.signal,
193
193
  passive: true,
194
194
  });
195
- window?.addEventListener('resize', () => this.calculateTooltipPosition(), {
195
+ window?.addEventListener('resize', () => this.#calculateTooltipPosition(), {
196
196
  signal: this.#positionAbort?.signal,
197
197
  passive: true,
198
198
  });
199
- this.calculateTooltipPosition();
199
+ this.#calculateTooltipPosition();
200
200
  });
201
201
  }
202
202
  });
@@ -210,7 +210,6 @@ class ShipTooltipWrapper {
210
210
  }
211
211
  }
212
212
  catch (e) {
213
- // Ignore if already hidden or other errors
214
213
  }
215
214
  }
216
215
  this.#positionAbort?.abort();
@@ -218,7 +217,7 @@ class ShipTooltipWrapper {
218
217
  }
219
218
  }, /* @ts-ignore */
220
219
  ...(ngDevMode ? [{ debugName: "openEffect" }] : /* istanbul ignore next */ []));
221
- this.calculateTooltipPosition = () => {
220
+ this.#calculateTooltipPosition = () => {
222
221
  if (!this.anchorEl())
223
222
  return;
224
223
  const hostRect = this.anchorEl().nativeElement.getBoundingClientRect();
@@ -227,7 +226,6 @@ class ShipTooltipWrapper {
227
226
  if (tooltipRect.width === 0 && tooltipRect.height === 0)
228
227
  return;
229
228
  const BASE_SPACE = 8;
230
- // Position generators
231
229
  const topCenter = (t, m) => ({
232
230
  left: t.left + t.width / 2 - m.width / 2,
233
231
  top: t.top - m.height - BASE_SPACE,
@@ -274,6 +272,7 @@ class ShipTooltipWrapper {
274
272
  }
275
273
  return this.#document.documentElement;
276
274
  }
275
+ #calculateTooltipPosition;
277
276
  #applyPosition(pos, element) {
278
277
  this.#renderer.setStyle(element, 'left', `${pos.left}px`);
279
278
  this.#renderer.setStyle(element, 'top', `${pos.top}px`);
@@ -338,8 +337,8 @@ class ShipTooltip {
338
337
  this.#elementRef = inject((ElementRef));
339
338
  this.#viewContainerRef = inject(ViewContainerRef);
340
339
  this.#environmentInjector = inject(EnvironmentInjector);
341
- this.debounceTimer = null;
342
- this.DEBOUNCE_DELAY = 50;
340
+ this.#debounceTimer = null;
341
+ this.#DEBOUNCE_DELAY = 50;
343
342
  this.anchorName = `--${generateUniqueId()}`;
344
343
  this.isOpen = signal(false, /* @ts-ignore */
345
344
  ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
@@ -349,42 +348,44 @@ class ShipTooltip {
349
348
  #elementRef;
350
349
  #viewContainerRef;
351
350
  #environmentInjector;
351
+ #debounceTimer;
352
+ #DEBOUNCE_DELAY;
352
353
  onMouseEnter(event) {
353
354
  event.stopPropagation();
354
355
  if (openRef?.component.anchorName !== this.anchorName) {
355
- this.cleanupTooltip();
356
+ this.#cleanupTooltip();
356
357
  }
357
358
  else {
358
- this.cancelCleanupTimer();
359
+ this.#cancelCleanupTimer();
359
360
  }
360
- this.showTooltip();
361
+ this.#showTooltip();
361
362
  // queueMicrotask(() => );
362
363
  }
363
364
  onMouseLeave(event) {
364
365
  event.stopPropagation();
365
- this.startCleanupTimer();
366
+ this.#startCleanupTimer();
366
367
  }
367
368
  ngOnDestroy() {
368
- this.cancelCleanupTimer();
369
- this.cleanupTooltip();
369
+ this.#cancelCleanupTimer();
370
+ this.#cleanupTooltip();
370
371
  }
371
- startCleanupTimer() {
372
- this.cancelCleanupTimer();
373
- this.debounceTimer = setTimeout(() => {
374
- this.cleanupTooltip();
375
- }, this.DEBOUNCE_DELAY);
372
+ #startCleanupTimer() {
373
+ this.#cancelCleanupTimer();
374
+ this.#debounceTimer = setTimeout(() => {
375
+ this.#cleanupTooltip();
376
+ }, this.#DEBOUNCE_DELAY);
376
377
  }
377
- cancelCleanupTimer() {
378
- if (this.debounceTimer) {
379
- clearTimeout(this.debounceTimer);
380
- this.debounceTimer = null;
378
+ #cancelCleanupTimer() {
379
+ if (this.#debounceTimer) {
380
+ clearTimeout(this.#debounceTimer);
381
+ this.#debounceTimer = null;
381
382
  }
382
383
  if (this.destroyTimeout) {
383
384
  clearTimeout(this.destroyTimeout);
384
385
  this.destroyTimeout = null;
385
386
  }
386
387
  }
387
- showTooltip() {
388
+ #showTooltip() {
388
389
  if (openRef?.wrapperComponentRef || !this.shTooltip()) {
389
390
  if (openRef?.component === this && openRef?.wrapperComponentRef) {
390
391
  openRef.wrapperComponentRef.setInput('content', this.shTooltip());
@@ -401,23 +402,23 @@ class ShipTooltip {
401
402
  openRef.wrapperComponentRef.setInput('anchorEl', this.#elementRef);
402
403
  openRef.wrapperComponentRef.setInput('isOpen', this.isOpen);
403
404
  openRef.wrapperComponentRef.setInput('content', this.shTooltip());
404
- openRef.wrapperComponentRef.setInput('close', () => this.cleanupTooltip());
405
+ openRef.wrapperComponentRef.setInput('close', () => this.#cleanupTooltip());
405
406
  openRef.wrapperComponentRef.changeDetectorRef.detectChanges();
406
407
  openRef.wrapperComponentRef.location.nativeElement.addEventListener('mouseenter', (event) => {
407
408
  event.stopPropagation();
408
- this.cancelCleanupTimer();
409
+ this.#cancelCleanupTimer();
409
410
  });
410
411
  openRef.wrapperComponentRef.location.nativeElement.addEventListener('mouseleave', (event) => {
411
412
  event.stopPropagation();
412
- this.startCleanupTimer();
413
+ this.#startCleanupTimer();
413
414
  });
414
415
  setTimeout(() => {
415
416
  this.isOpen.set(true);
416
417
  });
417
418
  }
418
- cleanupTooltip() {
419
+ #cleanupTooltip() {
419
420
  if (openRef?.wrapperComponentRef) {
420
- openRef.component.cancelCleanupTimer();
421
+ openRef.component.#cancelCleanupTimer();
421
422
  openRef.component.isOpen.set(false);
422
423
  openRef.wrapperComponentRef.location.nativeElement.hidePopover();
423
424
  this.destroyTimeout = setTimeout(() => {
@@ -425,7 +426,7 @@ class ShipTooltip {
425
426
  openRef?.wrapperComponentRef.destroy();
426
427
  openRef = null;
427
428
  });
428
- }, this.DEBOUNCE_DELAY);
429
+ }, this.#DEBOUNCE_DELAY);
429
430
  }
430
431
  }
431
432
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipTooltip, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
@@ -899,11 +900,11 @@ function createInputSignal(input, options) {
899
900
  Object.defineProperty(input, 'value', {
900
901
  configurable: true,
901
902
  get() {
902
- const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(input), 'value'); // Use Object.getPrototypeOf
903
+ const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(input), 'value');
903
904
  return descriptor.get.call(this);
904
905
  },
905
906
  set(newVal) {
906
- const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(input), 'value'); // Use Object.getPrototypeOf
907
+ const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(input), 'value');
907
908
  descriptor.set.call(this, newVal);
908
909
  const inputEvent = new CustomEvent('inputValueChanged', {
909
910
  bubbles: true,
@@ -951,43 +952,32 @@ function shipComponentClasses(componentName, inputs) {
951
952
  const config = inject(SHIP_CONFIG, { optional: true });
952
953
  return computed(() => {
953
954
  const componentConfig = config?.[componentName];
954
- // Resolve variant (Input > Component Config > Global Legacy Mappings > empty)
955
955
  let variant = inputs.variant?.();
956
956
  if (!variant) {
957
957
  variant = componentConfig?.variant;
958
958
  }
959
- // Legacy mapping for alert
960
959
  if (!variant && componentName === 'alert' && config?.alertVariant) {
961
960
  variant = config.alertVariant;
962
961
  }
963
- // Legacy mapping for card
964
962
  if (!variant && componentName === 'card' && config?.cardType) {
965
963
  variant = config.cardType;
966
964
  }
967
- // Legacy mapping for table
968
965
  if (!variant && componentName === 'table' && config?.tableType) {
969
966
  variant = config.tableType;
970
967
  }
971
- // Resolve color (Input > Component Config > empty)
972
968
  const color = inputs.color?.() || componentConfig?.color;
973
969
  if (!variant) {
974
970
  variant = 'base';
975
971
  }
976
- // Resolve size (Input > Component Config > empty)
977
972
  const size = inputs.size?.() || componentConfig?.size;
978
- // Resolve sharp (Input > Component Config > false)
979
973
  const sharp = (inputs.sharp?.() ?? componentConfig?.sharp) || false;
980
- // Resolve dynamic (Input > Component Config > false)
981
974
  const dynamic = (inputs.dynamic?.() ?? componentConfig?.dynamic) || false;
982
- // Resolve readonly (Input > Component Config > false)
983
975
  const readonly = (inputs.readonly?.() ?? componentConfig?.readonly) || false;
984
- // Resolve alwaysShow (Input > Component Config > false)
985
976
  const alwaysShow = (inputs.alwaysShow?.() ?? componentConfig?.alwaysShow) || false;
986
977
  const classList = [];
987
978
  if (color)
988
979
  classList.push(color);
989
980
  if (variant) {
990
- // Handle type-a, type-b etc. If it doesn't already have the prefix but it's meant to be one of those
991
981
  if (['a', 'b', 'c', 'd'].includes(variant)) {
992
982
  classList.push(`type-${variant}`);
993
983
  }
@@ -1012,15 +1002,15 @@ function shipComponentClasses(componentName, inputs) {
1012
1002
  class ShipSelectionGroup {
1013
1003
  #keybindings;
1014
1004
  constructor(itemSelector, activeClass, options) {
1015
- this.itemSelector = itemSelector;
1016
- this.activeClass = activeClass;
1017
- this.options = options;
1018
1005
  this.hostElement = inject((ElementRef)).nativeElement;
1019
1006
  this.#keybindings = inject(ShipA11yKeybindingsService);
1020
1007
  this.value = model(null, /* @ts-ignore */
1021
1008
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1022
1009
  this.closable = input(false, { ...(ngDevMode ? { debugName: "closable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1023
1010
  this.manualActivation = input(false, { ...(ngDevMode ? { debugName: "manualActivation" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1011
+ this.itemSelector = itemSelector;
1012
+ this.activeClass = activeClass;
1013
+ this.options = options;
1024
1014
  if (this.options?.hostRole) {
1025
1015
  this.hostElement.setAttribute('role', this.options.hostRole);
1026
1016
  }
@@ -1103,7 +1093,6 @@ class ShipSelectionGroup {
1103
1093
  if (this.#keybindings.matches(event, 'selection-group.select')) {
1104
1094
  const item = targetEl?.closest?.(this.itemSelector);
1105
1095
  if (item && this.hostElement.contains(item) && item.hasAttribute('value')) {
1106
- // Only prevent default for space to avoid scrolling, let enter naturally click if it's a link/button
1107
1096
  const isSpace = event.key === ' ' || event.key === 'Spacebar';
1108
1097
  if (isSpace)
1109
1098
  event.preventDefault();
@@ -1134,7 +1123,7 @@ class ShipSelectionGroup {
1134
1123
  nextIndex = activeIndex <= 0 ? items.length - 1 : activeIndex - 1;
1135
1124
  }
1136
1125
  else {
1137
- return; // Let other keys propagate natively
1126
+ return;
1138
1127
  }
1139
1128
  event.preventDefault();
1140
1129
  const nextItem = items[nextIndex];
@@ -1171,11 +1160,6 @@ const __SHIP_BUTTON_GROUP_VARIANTS = [''];
1171
1160
  const __SHIP_FORM_FIELD_VARIANTS = ['base', 'horizontal', 'auto-width', 'autosize', ''];
1172
1161
  const __SHIP_RANGE_SLIDER_VARIANTS = ['simple', 'base', 'thick', 'outlined', 'flat', 'raised', ''];
1173
1162
 
1174
- /*
1175
- * Public API Surface of ship-ui (Core utilities, directives, and configs)
1176
- */
1177
- // Global directives
1178
-
1179
1163
  /**
1180
1164
  * Generated bundle index. Do not edit.
1181
1165
  */