@ship-ui/core 0.22.3 → 0.22.5

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 (31) hide show
  1. package/assets/mcp/components.json +32 -32
  2. package/bin/ship-fg-scanner +0 -0
  3. package/fesm2022/ship-ui-core-ship-blueprint.mjs +1 -1
  4. package/fesm2022/ship-ui-core-ship-blueprint.mjs.map +1 -1
  5. package/fesm2022/ship-ui-core-ship-button-group.mjs +2 -2
  6. package/fesm2022/ship-ui-core-ship-button-group.mjs.map +1 -1
  7. package/fesm2022/ship-ui-core-ship-button.mjs +6 -4
  8. package/fesm2022/ship-ui-core-ship-button.mjs.map +1 -1
  9. package/fesm2022/ship-ui-core-ship-chip.mjs +6 -4
  10. package/fesm2022/ship-ui-core-ship-chip.mjs.map +1 -1
  11. package/fesm2022/ship-ui-core-ship-color-picker.mjs +1 -1
  12. package/fesm2022/ship-ui-core-ship-color-picker.mjs.map +1 -1
  13. package/fesm2022/ship-ui-core-ship-kbd.mjs +96 -0
  14. package/fesm2022/ship-ui-core-ship-kbd.mjs.map +1 -0
  15. package/fesm2022/ship-ui-core-ship-list.mjs +2 -2
  16. package/fesm2022/ship-ui-core-ship-list.mjs.map +1 -1
  17. package/fesm2022/ship-ui-core-ship-select.mjs +22 -3
  18. package/fesm2022/ship-ui-core-ship-select.mjs.map +1 -1
  19. package/fesm2022/ship-ui-core-ship-spotlight.mjs +590 -0
  20. package/fesm2022/ship-ui-core-ship-spotlight.mjs.map +1 -0
  21. package/fesm2022/ship-ui-core-ship-table.mjs +12 -6
  22. package/fesm2022/ship-ui-core-ship-table.mjs.map +1 -1
  23. package/fesm2022/ship-ui-core-ship-theme-toggle.mjs +1 -1
  24. package/fesm2022/ship-ui-core-ship-theme-toggle.mjs.map +1 -1
  25. package/package.json +9 -1
  26. package/types/ship-ui-core-ship-button.d.ts +2 -1
  27. package/types/ship-ui-core-ship-chip.d.ts +2 -1
  28. package/types/ship-ui-core-ship-kbd.d.ts +19 -0
  29. package/types/ship-ui-core-ship-select.d.ts +1 -0
  30. package/types/ship-ui-core-ship-spotlight.d.ts +83 -0
  31. package/types/ship-ui-core-ship-table.d.ts +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-ui-core-ship-spotlight.mjs","sources":["../../../projects/ship-ui/ship-spotlight/ship-spotlight.ts","../../../projects/ship-ui/ship-spotlight/ship-spotlight.service.ts","../../../projects/ship-ui/ship-spotlight/ship-ui-core-ship-spotlight.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n InjectionToken,\n Provider,\n} from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipList } from '@ship-ui/core/ship-list';\nimport { ShipKbd } from '@ship-ui/core/ship-kbd';\n\nexport interface ShipSpotlightItem {\n id: string;\n label: string;\n category?: string;\n description?: string;\n icon?: string;\n shortcut?: string;\n data?: any;\n}\n\nexport interface ShipSpotlightServiceOptions {\n items?: ShipSpotlightItem[];\n placeholder?: string;\n shortcut?: string;\n customFilter?: boolean;\n searchQuery?: string;\n}\n\nexport interface ShipSpotlightConfig {\n defaultItems?: ShipSpotlightItem[];\n enableShortcuts?: boolean;\n}\n\nexport const SHIP_SPOTLIGHT_CONFIG = new InjectionToken<ShipSpotlightConfig>('SHIP_SPOTLIGHT_CONFIG');\n\nexport function provideShipSpotlight(config: ShipSpotlightConfig): Provider {\n return {\n provide: SHIP_SPOTLIGHT_CONFIG,\n useValue: config,\n };\n}\n\n@Component({\n selector: 'sh-spotlight',\n styleUrl: './ship-spotlight.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipIcon, ShipList, ShipKbd],\n template: `\n <div class=\"sh-spotlight-container\">\n <div class=\"sh-spotlight-search-bar\">\n <sh-icon class=\"sh-spotlight-search-icon\">magnifying-glass</sh-icon>\n <input\n #inputRef\n type=\"text\"\n class=\"sh-spotlight-input\"\n [placeholder]=\"mergedPlaceholder()\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onKeyDown($event)\" />\n @if (searchQuery()) {\n <button class=\"sh-spotlight-clear-btn\" (click)=\"clearSearch()\">\n <sh-icon>x-bold</sh-icon>\n </button>\n }\n </div>\n\n <div #resultsRef class=\"sh-spotlight-results\">\n @if (groupedFilteredItems().length > 0) {\n @for (group of groupedFilteredItems(); track group.category) {\n <div class=\"sh-spotlight-category\">\n <div class=\"sh-spotlight-category-title\">{{ group.category }}</div>\n <sh-list class=\"type-b\">\n @for (itemWithIdx of group.items; track itemWithIdx.item.id) {\n <button\n action\n type=\"button\"\n [class.active]=\"itemWithIdx.flatIndex === activeOptionIndex()\"\n (mouseenter)=\"activeOptionIndex.set(itemWithIdx.flatIndex)\"\n (click)=\"selectItem(itemWithIdx.item)\">\n @if (itemWithIdx.item.icon) {\n <sh-icon>{{ itemWithIdx.item.icon }}</sh-icon>\n }\n <div class=\"text-group\">\n <span class=\"label\">{{ itemWithIdx.item.label }}</span>\n @if (itemWithIdx.item.description) {\n <span class=\"description\">{{ itemWithIdx.item.description }}</span>\n }\n </div>\n @if (itemWithIdx.item.shortcut) {\n <span class=\"shortcut\">\n @for (key of parseShortcutKeys(itemWithIdx.item.shortcut); track key) {\n <sh-kbd\n [meta]=\"key === 'meta' || key === 'cmd' || key === 'command'\"\n [shift]=\"key === 'shift'\"\n [alt]=\"key === 'alt' || key === 'option'\"\n [ctrl]=\"key === 'ctrl' || key === 'control'\"\n [enter]=\"key === 'enter' || key === 'return'\"\n [escape]=\"key === 'escape' || key === 'esc'\"\n [backspace]=\"key === 'backspace'\"\n >\n @if (!['meta', 'cmd', 'command', 'shift', 'alt', 'option', 'ctrl', 'control', 'enter', 'return', 'escape', 'esc', 'backspace'].includes(key)) {\n {{ key }}\n }\n </sh-kbd>\n }\n </span>\n }\n </button>\n }\n </sh-list>\n </div>\n }\n } @else {\n <div class=\"sh-spotlight-no-results\">\n <sh-icon class=\"sh-spotlight-no-results-icon\">warning-octagon</sh-icon>\n <span class=\"sh-spotlight-no-results-text\">No results found for \"{{ searchQuery() }}\"</span>\n </div>\n }\n </div>\n\n <div class=\"sh-spotlight-footer\">\n <span class=\"sh-spotlight-footer-tip\">\n <sh-kbd>↓</sh-kbd> <sh-kbd>↑</sh-kbd>\n to navigate\n </span>\n <span class=\"sh-spotlight-footer-tip\">\n <sh-kbd enter></sh-kbd>\n to select\n </span>\n <span class=\"sh-spotlight-footer-tip\">\n <sh-kbd escape></sh-kbd>\n to close\n </span>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipSpotlight {\n inputRef = viewChild<ElementRef<HTMLInputElement>>('inputRef');\n resultsRef = viewChild<ElementRef<HTMLDivElement>>('resultsRef');\n\n // Input config passed from ShipDialogService\n data = input<ShipSpotlightServiceOptions>();\n\n // Standard inputs (fallback)\n items = input<ShipSpotlightItem[]>([]);\n placeholder = input<string>('Search actions, settings, or pages...');\n customFilter = input<boolean>(false);\n searchQuery = model<string>('');\n\n itemSelected = output<ShipSpotlightItem>();\n closed = output<void>();\n\n // Merged config properties\n mergedItems = computed(() => this.data()?.items ?? this.items());\n mergedPlaceholder = computed(() => this.data()?.placeholder ?? this.placeholder());\n mergedCustomFilter = computed(() => this.data()?.customFilter ?? this.customFilter());\n\n activeOptionIndex = signal<number>(0);\n\n // Computes the scored and filtered flat list of items\n flatFilteredItems = computed(() => {\n const query = this.searchQuery().toLowerCase().trim();\n const allItems = this.mergedItems();\n\n if (this.mergedCustomFilter() || !query) {\n return allItems;\n }\n\n const scored = allItems\n .map((item) => {\n const labelScore = this.#calculateMatchScore(item.label.toLowerCase(), query);\n const descScore = item.description ? this.#calculateMatchScore(item.description.toLowerCase(), query) : 0;\n return { item, score: Math.max(labelScore, descScore) };\n })\n .filter((x) => x.score > 0)\n .sort((a, b) => b.score - a.score);\n\n return scored.map((x) => x.item);\n });\n\n // Groups flat list of items by category and precomputes flat indices\n groupedFilteredItems = computed(() => {\n const flat = this.flatFilteredItems();\n const groups: { category: string; items: { item: ShipSpotlightItem; flatIndex: number }[] }[] = [];\n let currentFlatIndex = 0;\n\n flat.forEach((item) => {\n const cat = item.category || 'Actions';\n let group = groups.find((g) => g.category === cat);\n if (!group) {\n group = { category: cat, items: [] };\n groups.push(group);\n }\n group.items.push({ item, flatIndex: currentFlatIndex++ });\n });\n\n return groups;\n });\n\n constructor() {\n // Sync initial search query if provided in dialog data\n effect(() => {\n const initialQuery = this.data()?.searchQuery;\n if (initialQuery !== undefined) {\n this.searchQuery.set(initialQuery);\n }\n });\n\n // Auto-focus input when the view is initialized\n effect(() => {\n const inputEl = this.inputRef()?.nativeElement;\n if (inputEl && typeof inputEl.focus === 'function') {\n setTimeout(() => inputEl.focus(), 50);\n }\n });\n\n // Scroll active item into view\n effect(() => {\n const index = this.activeOptionIndex();\n if (index > -1) {\n queueMicrotask(() => this.scrollToActiveItem());\n }\n });\n }\n\n validateItemsEffect = effect(() => {\n const items = this.mergedItems();\n for (const item of items) {\n if (item.shortcut) {\n this.#validateShortcut(item.shortcut);\n }\n }\n });\n\n onSearchInput(event: Event) {\n const val = (event.target as HTMLInputElement).value;\n this.searchQuery.set(val);\n this.activeOptionIndex.set(0);\n }\n\n clearSearch() {\n this.searchQuery.set('');\n const inputEl = this.inputRef()?.nativeElement;\n if (inputEl) {\n inputEl.value = '';\n if (typeof inputEl.focus === 'function') {\n inputEl.focus();\n }\n }\n this.activeOptionIndex.set(0);\n }\n\n onKeyDown(event: KeyboardEvent) {\n // Check if the event matches any item shortcut\n const allItems = this.mergedItems();\n const shortcutMatch = allItems.find((item) => item.shortcut && this.#checkShortcutMatch(event, item.shortcut));\n\n if (shortcutMatch) {\n event.preventDefault();\n event.stopPropagation();\n // Delay selection to ensure the browser honors preventDefault before the DOM node is potentially destroyed\n setTimeout(() => this.selectItem(shortcutMatch), 10);\n return;\n }\n\n const flat = this.flatFilteredItems();\n if (flat.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n const nextIdx = (this.activeOptionIndex() + 1) % flat.length;\n this.activeOptionIndex.set(nextIdx);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n const prevIdx = (this.activeOptionIndex() - 1 + flat.length) % flat.length;\n this.activeOptionIndex.set(prevIdx);\n } else if (event.key === 'Tab') {\n event.preventDefault();\n if (event.shiftKey) {\n const prevIdx = (this.activeOptionIndex() - 1 + flat.length) % flat.length;\n this.activeOptionIndex.set(prevIdx);\n } else {\n const nextIdx = (this.activeOptionIndex() + 1) % flat.length;\n this.activeOptionIndex.set(nextIdx);\n }\n } else if (event.key === 'Enter') {\n event.preventDefault();\n const selected = flat[this.activeOptionIndex()];\n if (selected) {\n this.selectItem(selected);\n }\n }\n }\n\n selectItem(item: ShipSpotlightItem) {\n this.itemSelected.emit(item);\n this.closed.emit();\n }\n\n scrollToActiveItem() {\n const resultsEl = this.resultsRef()?.nativeElement;\n if (!resultsEl) return;\n\n const activeEl = resultsEl.querySelector('[action].active') as HTMLElement;\n if (activeEl && typeof activeEl.scrollIntoView === 'function') {\n activeEl.scrollIntoView({ block: 'nearest' });\n }\n }\n\n parseShortcutKeys(shortcut: string): string[] {\n if (!shortcut) return [];\n return shortcut.split('+').map((s) => s.trim().toLowerCase());\n }\n\n #validateShortcut(shortcut: string) {\n const normalized = shortcut\n .toLowerCase()\n .split('+')\n .map((k) => k.trim())\n .join('+');\n\n const reserved = [\n 'meta+n', 'ctrl+n',\n 'meta+t', 'ctrl+t',\n 'meta+w', 'ctrl+w',\n 'meta+q', 'ctrl+q',\n 'meta+r', 'ctrl+r',\n 'meta+l', 'ctrl+l',\n 'meta+shift+n', 'ctrl+shift+n',\n 'meta+shift+t', 'ctrl+shift+t',\n 'meta+shift+w', 'ctrl+shift+w',\n 'cmd+n', 'cmd+t', 'cmd+w', 'cmd+q', 'cmd+r', 'cmd+l',\n 'cmd+shift+n', 'cmd+shift+t', 'cmd+shift+w',\n ];\n\n if (reserved.includes(normalized)) {\n throw new Error(\n `[ShipUI Error] The shortcut \"${shortcut}\" uses a reserved browser hotkey that cannot be reliably prevented (e.g. New Window, New Tab). Please choose a different shortcut.`\n );\n }\n }\n\n #checkShortcutMatch(event: KeyboardEvent, shortcut: string): boolean {\n if (!shortcut) return false;\n const keys = this.parseShortcutKeys(shortcut);\n\n const needsMeta = keys.includes('meta') || keys.includes('cmd') || keys.includes('command');\n const needsCtrl = keys.includes('ctrl') || keys.includes('control');\n const needsAlt = keys.includes('alt') || keys.includes('option');\n const needsShift = keys.includes('shift');\n\n if (event.metaKey !== needsMeta) return false;\n if (event.ctrlKey !== needsCtrl) return false;\n if (event.altKey !== needsAlt) return false;\n if (event.shiftKey !== needsShift) return false;\n\n const mainKeys = keys.filter(\n (k) => !['meta', 'cmd', 'command', 'ctrl', 'control', 'alt', 'option', 'shift'].includes(k),\n );\n\n if (mainKeys.length === 1) {\n return event.key.toLowerCase() === mainKeys[0].toLowerCase();\n }\n\n return false;\n }\n\n #calculateMatchScore(option: string, input: string): number {\n if (!input) return 0;\n\n let score = 0;\n let lastIndex = -1;\n let matchCount = 0;\n let inSequence = true;\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n if (option.length > lastIndex + 1 && option[lastIndex + 1] === char) {\n score += i === 0 ? 100 : 150;\n lastIndex++;\n matchCount++;\n } else {\n const charIndex = option.indexOf(char, lastIndex + 1);\n\n if (i > 0) {\n inSequence = false;\n }\n\n if (charIndex === -1) {\n return 0;\n }\n\n score += 100;\n lastIndex = charIndex;\n matchCount++;\n }\n }\n\n if (inSequence && input.length === matchCount) {\n score += 1000;\n }\n\n score += matchCount * 20;\n return score;\n }\n}\n","import { computed, DOCUMENT, inject, Injectable, OutputEmitterRef, signal, DestroyRef } from '@angular/core';\nimport { ShipDialogService } from '@ship-ui/core/ship-dialog';\nimport { ShipSpotlight, ShipSpotlightItem, ShipSpotlightServiceOptions, SHIP_SPOTLIGHT_CONFIG } from './ship-spotlight';\n\nexport interface ShipSpotlightInstance {\n close: () => void;\n itemSelected: OutputEmitterRef<ShipSpotlightItem>;\n closed: OutputEmitterRef<any>;\n}\n\ninterface SpotlightItemRegistryEntry {\n id: number;\n items: ShipSpotlightItem[];\n overwrite: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ShipSpotlightService {\n #document = inject(DOCUMENT);\n #dialogService = inject(ShipDialogService);\n #config = inject(SHIP_SPOTLIGHT_CONFIG, { optional: true });\n\n #nextId = 0;\n #registries = signal<SpotlightItemRegistryEntry[]>([]);\n\n #globalItemSelected = signal<ShipSpotlightItem | null>(null);\n globalItemSelected = this.#globalItemSelected.asReadonly();\n\n #isShortcutsEnabled = signal(false);\n isShortcutsEnabled = this.#isShortcutsEnabled.asReadonly();\n\n #aggregatedItems = computed(() => {\n const registries = this.#registries();\n const defaults = this.#config?.defaultItems ?? [];\n let aggregated: ShipSpotlightItem[] = [...defaults];\n\n for (const entry of registries) {\n if (entry.overwrite) {\n aggregated = [...entry.items];\n } else {\n aggregated.push(...entry.items);\n }\n }\n return aggregated;\n });\n\n hasOverwriteItems = computed(() => this.#registries().some((r) => r.overwrite));\n\n constructor() {\n if (this.#config?.enableShortcuts !== false) {\n this.enableGlobalShortcuts();\n }\n }\n\n registerItems(items: ShipSpotlightItem[], overwrite = false): () => void {\n const id = this.#nextId++;\n this.#registries.update((regs) => [...regs, { id, items, overwrite }]);\n\n const cleanup = () => {\n this.#registries.update((regs) => regs.filter((r) => r.id !== id));\n };\n\n try {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(cleanup);\n } catch {\n // Ignore if not called in injection context\n }\n\n return cleanup;\n }\n\n #contextualRegistryId: number | null = null;\n\n setContextualItems(items: ShipSpotlightItem[], overwrite = false) {\n if (this.#contextualRegistryId !== null) {\n const oldId = this.#contextualRegistryId;\n this.#registries.update((regs) => regs.filter((r) => r.id !== oldId));\n }\n const id = this.#nextId++;\n this.#contextualRegistryId = id;\n this.#registries.update((regs) => [...regs, { id, items, overwrite }]);\n }\n\n clearContextualItems() {\n if (this.#contextualRegistryId !== null) {\n const oldId = this.#contextualRegistryId;\n this.#registries.update((regs) => regs.filter((r) => r.id !== oldId));\n this.#contextualRegistryId = null;\n }\n }\n\n #globalShortcutListener: ((event: KeyboardEvent) => void) | null = null;\n #globalShortcutOptions: Partial<ShipSpotlightServiceOptions> | null = null;\n\n enableGlobalShortcuts(options?: Partial<ShipSpotlightServiceOptions>): void {\n if (this.#globalShortcutListener) {\n this.disableGlobalShortcuts();\n }\n \n if (options) {\n this.#globalShortcutOptions = options;\n }\n\n this.#isShortcutsEnabled.set(true);\n\n this.#globalShortcutListener = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n event.preventDefault();\n\n const instance = this.open(this.#globalShortcutOptions || undefined);\n\n const sub = instance.itemSelected.subscribe((item) => {\n this.#globalItemSelected.set(item);\n });\n\n instance.closed.subscribe(() => sub.unsubscribe());\n }\n };\n\n this.#document.addEventListener('keydown', this.#globalShortcutListener);\n }\n\n disableGlobalShortcuts(): void {\n if (this.#globalShortcutListener) {\n this.#document.removeEventListener('keydown', this.#globalShortcutListener);\n this.#globalShortcutListener = null;\n }\n this.#isShortcutsEnabled.set(false);\n }\n\n open(options?: ShipSpotlightServiceOptions): ShipSpotlightInstance {\n const finalOptions = {\n ...options,\n items: options?.items ?? this.#aggregatedItems(),\n };\n\n const dialogRef = this.#dialogService.open(ShipSpotlight, {\n data: finalOptions,\n class: 'spotlight-dialog',\n closeOnOutsideClick: true,\n closeOnEsc: true,\n width: '600px',\n maxWidth: '90vw',\n });\n\n return {\n close: () => dialogRef.close(),\n itemSelected: dialogRef.component.itemSelected,\n closed: dialogRef.closed,\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -171,14 +171,14 @@ class ShipStickyColumns {
171
171
  }
172
172
  }
173
173
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipStickyColumns, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
174
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: ShipStickyColumns, isStandalone: true, selector: "[shStickyColumns]", inputs: { shStickyColumns: { classPropertyName: "shStickyColumns", publicName: "shStickyColumns", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.sticky": "shStickyColumns() === \"start\"", "class.sticky-end": "shStickyColumns() === \"end\"" } }, ngImport: i0 }); }
174
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: ShipStickyColumns, isStandalone: true, selector: "[shStickyColumns]", inputs: { shStickyColumns: { classPropertyName: "shStickyColumns", publicName: "shStickyColumns", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.sticky": "shStickyColumns() === \"start\" || shStickyColumns() === \"\"", "class.sticky-end": "shStickyColumns() === \"end\"" } }, ngImport: i0 }); }
175
175
  }
176
176
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipStickyColumns, decorators: [{
177
177
  type: Directive,
178
178
  args: [{
179
179
  selector: '[shStickyColumns]',
180
180
  host: {
181
- '[class.sticky]': 'shStickyColumns() === "start"',
181
+ '[class.sticky]': 'shStickyColumns() === "start" || shStickyColumns() === ""',
182
182
  '[class.sticky-end]': 'shStickyColumns() === "end"',
183
183
  },
184
184
  }]
@@ -369,7 +369,10 @@ class ShipTable {
369
369
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipTable, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
370
370
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: ShipTable, isStandalone: true, selector: "sh-table", inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, sortByColumn: { classPropertyName: "sortByColumn", publicName: "sortByColumn", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dataChange: "dataChange", sortByColumn: "sortByColumnChange" }, host: { listeners: { "scroll": "onScroll()", "window:resize": "onResize($event)" }, properties: { "class": "hostClasses()", "style.grid-template-columns": "columnSizes()", "class.resizing": "resizing()", "class.can-scroll-x": "canScrollX()", "class.can-scroll-y": "canScrollY()", "class.scrolled-x": "scrollXState() >= 0", "class.scrolled-x-end": "scrollXState() === 1", "class.scrolled-y": "scrollYState() >= 0", "class.scrolled-y-end": "scrollYState() === 1" } }, viewQueries: [{ propertyName: "thead", first: true, predicate: ["thead"], descendants: true, isSignal: true }, { propertyName: "tbody", first: true, predicate: ["tbody"], descendants: true, isSignal: true }], ngImport: i0, template: `
371
371
  <div class="actionbar">
372
- <ng-content select="[actionbar]" />
372
+ <ng-content select="[actionbar]:not([align-right])" />
373
+ <div class="actionbar-right">
374
+ <ng-content select="[actionbar][align-right]" />
375
+ </div>
373
376
  </div>
374
377
 
375
378
  @if (loading()) {
@@ -390,13 +393,16 @@ class ShipTable {
390
393
  <ng-content select="[table-no-rows]" />
391
394
  </div>
392
395
  }
393
- `, isInline: true, styles: ["sh-table{--table-bc: var(--base-4);--table-th-bg: var(--base-1);--table-tr-bg: var(--base-1);--table-td-bg: var(--base-1);--table-th-c: var(--base-8);--table-th-f: var(--paragraph-30);--table-td-c: var(--base-8);--table-td-f: var(--paragraph-30);--table-th-p: 0 1.25rem;--table-td-p: 0 1.25rem;--table-th-mh: 3rem;--table-td-mh: 4.875rem;--table-th-g: .25rem;--table-td-g: .5rem;--table-ws: nowrap;--table-th-bw: 0;--table-td-bw: .0625rem 0 0;--table-columns: 1fr 1fr 1fr max-content;--table-sticky-bw: .0625rem}sh-table.type-a tbody>th,sh-table.type-a tbody>td,sh-table.type-a thead>th,sh-table.type-a thead>td{padding-right:0}sh-table.type-a tbody>th:first-child,sh-table.type-a tbody>td:first-child,sh-table.type-a thead>th:first-child,sh-table.type-a thead>td:first-child{padding:0}sh-table.type-a.scrolled-x.can-scroll-x [shStickyColumns=\"\"],sh-table.type-a.scrolled-x.can-scroll-x th.sticky,sh-table.type-a.scrolled-x.can-scroll-x td.sticky{border-right-width:.0625rem}sh-table.type-a:not(.scrolled-x-end).can-scroll-x [shStickyColumns=end],sh-table.type-a:not(.scrolled-x-end).can-scroll-x th.sticky-end,sh-table.type-a:not(.scrolled-x-end).can-scroll-x td.sticky-end{border-left-width:.0625rem}sh-table.type-b{--table-th-p: 0 .75rem;--table-td-p: 0 .75rem;--table-th-mh: 2.25rem;--table-td-mh: 3.5rem;--table-th-bw: .0625rem 0 .0625rem .0625rem;--table-td-bw: 0 0 .0625rem .0625rem;--table-th-bg: var(--base-2);--table-sticky-bw: .125rem}sh-table.type-b th:first-child{border-left-width:0;padding:var(--table-th-p)}sh-table.type-b td:first-child{border-left-width:0;padding:var(--table-td-p)}sh-table.type-b [shStickyColumns=end]{border-left-width:.125rem}sh-table.type-b.scrolled-x [shStickyColumns=\"\"]{border-right-width:.125rem}sh-table.type-b.scrolled-x-end [shStickyColumns=end]{border-left-width:.0625rem}sh-table.type-b td.sticky,sh-table.type-b th.sticky{border-left-width:0;border-right-width:.0625rem}sh-table.type-b td.sticky+*,sh-table.type-b th.sticky+*{border-left-width:0}sh-table.type-b tr:hover td{background-color:var(--base-2)}sh-table.type-b div[table-header] tr:first-child th{border-bottom:0}sh-table.type-b .actionbar{background-color:var(--base-2);border-width:.0625rem 0 0}sh-table{width:100%;display:grid;overflow:auto;grid-template-columns:var(--table-columns);position:relative}sh-table.resizing{-webkit-user-select:none;user-select:none}sh-table:has([shTableResize]) td{overflow:auto}sh-table.no-resize .sh-resizer{display:none}sh-table.no-resize td{overflow:initial}sh-table .actionbar{display:grid;grid-column:1/-1;align-items:start;gap:.5rem;grid-template-rows:1fr;grid-auto-flow:column;grid-auto-columns:max-content;padding:.5rem;border:var(--border-10);border-width:.0625rem 0;opacity:1;transition:grid-template-rows .3s ease-out,padding .3s ease-out,border-width .3s ease-out,opacity .3s ease-out;overflow:hidden}sh-table .actionbar:empty{grid-template-rows:0fr;padding-top:0;padding-bottom:0;border-width:0;opacity:0;pointer-events:none}sh-table .actionbar>*{min-height:0}sh-table tbody{position:relative}sh-table tbody:has(tr.sticky){position:sticky;top:0;z-index:1}sh-table thead{position:relative}sh-table thead:has(tr.sticky){position:sticky;top:0;z-index:2}sh-table sh-progress-bar{grid-column:1/-1;position:absolute;top:100%;transform:translateY(-50%);z-index:200}sh-table tbody,sh-table thead,sh-table tr{display:grid;grid-column:1/-1;grid-template-columns:subgrid}sh-table tr{background:var(--table-tr-bg);position:relative;z-index:0}sh-table tr.sticky{position:sticky;top:0;z-index:1}sh-table tr.sticky-end{position:sticky;bottom:0;z-index:3}sh-table tr:has(th.sticky-end) th:nth-last-child(2){padding:var(--table-th-p)}sh-table tr:has(td.sticky-end) td:nth-last-child(2){padding:var(--table-td-p)}sh-table th{display:flex;align-items:center;padding:var(--table-th-p);min-height:var(--table-th-mh);font:var(--table-th-f);line-height:1em;white-space:var(--table-ws);color:var(--table-th-c);border:0;border-color:var(--table-bc);border-style:solid;border-width:var(--table-th-bw);background:var(--table-th-bg);gap:var(--table-th-g);z-index:100}sh-table th:has(.sh-resizer){position:relative}sh-table th.sortable{--caret-color: var(--base-10);--caret-size: .375rem;cursor:pointer;-webkit-user-select:none;user-select:none}sh-table th.sortable sh-icon{opacity:.35;transition:opacity 125ms ease-in-out}sh-table th.sortable:hover sh-icon{opacity:.7}sh-table th.sortable.sort-asc sh-icon,sh-table th.sortable.sort-desc sh-icon{opacity:1}sh-table th.sortable:not(:has(sh-icon)):after{content:\"\";border:var(--caret-size) solid transparent;width:0;height:0;opacity:0;transition:opacity 125ms ease-in-out}sh-table th.sortable:not(:has(sh-icon)).sort-desc:after{opacity:1;transform:translateY(-4px);border-bottom-color:var(--caret-color)}sh-table th.sortable:not(:has(sh-icon)).sort-asc:after{opacity:1;transform:translateY(4px);border-top-color:var(--caret-color)}sh-table th .sh-resizer{width:10px;height:100%;position:absolute;top:0;right:0;cursor:col-resize}sh-table th .sh-resizer:before,sh-table th .sh-resizer:after{content:\"\";position:absolute;top:50%;transform:translateY(-50%);height:.75rem;right:.1875rem;width:.0625rem;background-color:var(--base-4)}sh-table th .sh-resizer:hover:before,sh-table th .sh-resizer:hover:after{background-color:var(--primary-8)}sh-table th .sh-resizer:before{left:.1875rem}sh-table td{display:flex;align-items:center;padding:var(--table-td-p);min-height:var(--table-td-mh);gap:var(--table-td-g);color:var(--table-td-c);font:var(--table-td-f);white-space:var(--table-ws);border-color:var(--table-bc);border-style:solid;border-width:var(--table-td-bw);background:var(--table-td-bg)}sh-table td+td.sticky-end:last-child{padding:var(--table-td-p)}sh-table th.sticky,sh-table th.sticky-end,sh-table td.sticky,sh-table td.sticky-end{position:sticky;overflow:hidden;right:auto;left:0;z-index:1;padding:var(--table-td-p)}sh-table th.sticky:first-child,sh-table th.sticky-end:first-child,sh-table td.sticky:first-child,sh-table td.sticky-end:first-child{padding:var(--table-th-p)}sh-table th.sticky-end,sh-table td.sticky-end{right:0;left:auto}sh-table th.sticky,sh-table th.sticky-end{background:var(--table-th-bg);padding:var(--table-th-p);z-index:101}sh-table th.sticky:first-child,sh-table th.sticky-end:first-child{padding:var(--table-th-p)}sh-table [shStickyColumns]{display:grid;grid-template-columns:subgrid;position:sticky;left:0;z-index:1000;border:0;border-color:var(--table-bc);border-style:solid}sh-table [shStickyColumns=end]{left:auto;right:0}sh-table thead>[shStickyColumns]{border-width:var(--table-th-bw)}sh-table tbody>[shStickyColumns]{border-width:var(--table-td-bw)}sh-table .span-all{grid-column:1/-1;white-space:initial;align-items:flex-start;padding:0;border-left-width:0}sh-table .no-rows{display:none;grid-column:1/-1}sh-table tbody:empty+.no-rows{display:block}\n"], dependencies: [{ kind: "component", type: ShipProgressBar, selector: "sh-progress-bar", inputs: ["value", "color", "variant"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
396
+ `, isInline: true, styles: ["sh-table{--table-bc: var(--base-4);--table-th-bg: var(--base-2);--table-tr-bg: var(--base-1);--table-td-bg: var(--base-1);--table-th-c: var(--base-8);--table-th-f: var(--paragraph-30);--table-td-c: var(--base-8);--table-td-f: var(--paragraph-30);--table-th-p: 0 1.25rem;--table-td-p: 0 1.25rem;--table-th-mh: 3rem;--table-td-mh: 4.875rem;--table-th-g: .25rem;--table-td-g: .5rem;--table-ws: nowrap;--table-th-bw: 0;--table-td-bw: .0625rem 0 0;--table-columns: 1fr 1fr 1fr max-content;--table-sticky-bw: .0625rem}sh-table.type-a tbody>th,sh-table.type-a tbody>td,sh-table.type-a thead>th,sh-table.type-a thead>td{padding-right:0}sh-table.type-a tbody>th:first-child,sh-table.type-a tbody>td:first-child,sh-table.type-a thead>th:first-child,sh-table.type-a thead>td:first-child{padding:0}sh-table.type-b{--table-th-p: 0 .75rem;--table-td-p: 0 .75rem;--table-th-mh: 2.25rem;--table-td-mh: 3.5rem;--table-th-bw: .0625rem 0 .0625rem .0625rem;--table-td-bw: 0 0 .0625rem .0625rem;--table-sticky-bw: .0625rem}sh-table.type-b th:first-child{border-left-width:0;padding:var(--table-th-p)}sh-table.type-b td:first-child{border-left-width:0;padding:var(--table-td-p)}sh-table.type-b td.sticky,sh-table.type-b th.sticky{border-left-width:0;border-right:var(--table-sticky-bw) solid var(--table-bc)}sh-table.type-b [shStickyColumns] th,sh-table.type-b [shStickyColumns] td{border-right:var(--table-sticky-bw) solid var(--table-bc)}sh-table.type-b th.sticky-end,sh-table.type-b td.sticky-end,sh-table.type-b [shStickyColumns=end] th,sh-table.type-b [shStickyColumns=end] td{border-left:var(--table-sticky-bw) solid var(--table-bc);border-right:0}sh-table.type-b .sticky+th,sh-table.type-b .sticky+td,sh-table.type-b [shStickyColumns]+th,sh-table.type-b [shStickyColumns]+td{border-left-width:0}sh-table.type-b tr:hover td{background-color:var(--base-2)}sh-table.type-b div[table-header] tr:first-child th{border-bottom:0}sh-table.type-b tbody tr:last-child td{border-bottom-width:0}sh-table.type-b .actionbar{background-color:var(--base-2);border-width:.0625rem 0 0}sh-table{width:100%;display:grid;overflow:auto;overscroll-behavior-x:none;grid-template-columns:var(--table-columns);position:relative;container-type:inline-size}sh-table.resizing{-webkit-user-select:none;user-select:none}sh-table:has([shTableResize]) td{overflow:auto}sh-table.no-resize .sh-resizer{display:none}sh-table.no-resize td{overflow:initial}sh-table .actionbar{display:flex;align-items:center;gap:.5rem;grid-column:1/-1;position:sticky;left:0;z-index:10;background-color:var(--base-1);width:100cqw;box-sizing:border-box;padding:.5rem;border:var(--border-10);border-width:.0625rem 0;opacity:1;transition:padding .3s ease-out,border-width .3s ease-out,opacity .3s ease-out;overflow:hidden}sh-table .actionbar:empty,sh-table .actionbar:not(:has(>:not(.actionbar-right))):has(>.actionbar-right:empty){display:none}sh-table .actionbar>*{min-height:0}sh-table .actionbar .actionbar-right{display:flex;align-items:center;gap:.5rem;margin-left:auto;flex-shrink:0}sh-table .actionbar .actionbar-right:empty{display:none}sh-table tbody{position:relative}sh-table tbody:has(tr.sticky){position:sticky;top:0;z-index:1}sh-table thead{position:relative}sh-table thead:has(tr.sticky){position:sticky;top:0;z-index:2}sh-table sh-progress-bar{grid-column:1/-1;position:absolute;top:100%;transform:translateY(-50%);z-index:200}sh-table tbody,sh-table thead,sh-table tr{display:grid;grid-column:1/-1;grid-template-columns:subgrid}sh-table tr{background:var(--table-tr-bg);position:relative;z-index:0}sh-table tr.sticky{position:sticky;top:0;z-index:1}sh-table tr.sticky-end{position:sticky;bottom:0;z-index:3}sh-table tr:has(th.sticky-end) th:nth-last-child(2){padding:var(--table-th-p)}sh-table tr:has(td.sticky-end) td:nth-last-child(2){padding:var(--table-td-p)}sh-table th{display:flex;align-items:center;padding:var(--table-th-p);min-height:var(--table-th-mh);font:var(--table-th-f);line-height:1em;white-space:var(--table-ws);color:var(--table-th-c);border:0;border-color:var(--table-bc);border-style:solid;border-width:var(--table-th-bw);background:var(--table-th-bg);gap:var(--table-th-g);z-index:100}sh-table th:has(.sh-resizer){position:relative}sh-table th.sortable{--caret-color: var(--base-10);--caret-size: .375rem;cursor:pointer;-webkit-user-select:none;user-select:none}sh-table th.sortable sh-icon{opacity:.35;transition:opacity 125ms ease-in-out}sh-table th.sortable:hover sh-icon{opacity:.7}sh-table th.sortable.sort-asc sh-icon,sh-table th.sortable.sort-desc sh-icon{opacity:1}sh-table th.sortable:not(:has(sh-icon)):after{content:\"\";border:var(--caret-size) solid transparent;width:0;height:0;opacity:0;transition:opacity 125ms ease-in-out}sh-table th.sortable:not(:has(sh-icon)).sort-desc:after{opacity:1;transform:translateY(-4px);border-bottom-color:var(--caret-color)}sh-table th.sortable:not(:has(sh-icon)).sort-asc:after{opacity:1;transform:translateY(4px);border-top-color:var(--caret-color)}sh-table th .sh-resizer{width:10px;height:100%;position:absolute;top:0;right:0;cursor:col-resize}sh-table th .sh-resizer:before,sh-table th .sh-resizer:after{content:\"\";position:absolute;top:50%;transform:translateY(-50%);height:.75rem;right:.1875rem;width:.0625rem;background-color:var(--base-4)}sh-table th .sh-resizer:hover:before,sh-table th .sh-resizer:hover:after{background-color:var(--primary-8)}sh-table th .sh-resizer:before{left:.1875rem}sh-table td{display:flex;align-items:center;padding:var(--table-td-p);min-height:var(--table-td-mh);gap:var(--table-td-g);color:var(--table-td-c);font:var(--table-td-f);white-space:var(--table-ws);border-color:var(--table-bc);border-style:solid;border-width:var(--table-td-bw);background:var(--table-td-bg)}sh-table td+td.sticky-end:last-child{padding:var(--table-td-p)}sh-table th.sticky,sh-table th.sticky-end,sh-table td.sticky,sh-table td.sticky-end{position:sticky;overflow:hidden;right:auto;left:0;z-index:1;padding:var(--table-td-p)}sh-table th.sticky:first-child,sh-table th.sticky-end:first-child,sh-table td.sticky:first-child,sh-table td.sticky-end:first-child{padding:var(--table-th-p)}sh-table th.sticky-end,sh-table td.sticky-end{right:0;left:auto}sh-table th.sticky,sh-table th.sticky-end{background:var(--base-1);padding:var(--table-th-p);z-index:101}sh-table th.sticky:first-child,sh-table th.sticky-end:first-child{padding:var(--table-th-p)}sh-table [shStickyColumns]{display:grid;grid-template-columns:subgrid;position:sticky;left:0;z-index:1000;border:0;border-color:var(--table-bc);border-style:solid}sh-table [shStickyColumns] th{background-color:var(--base-1)}sh-table [shStickyColumns=end]{left:auto;right:0}sh-table .span-all{grid-column:1/-1;white-space:initial;align-items:flex-start;padding:0;border-left-width:0;position:sticky;left:0;width:100cqw;box-sizing:border-box}sh-table .no-rows{display:none;grid-column:1/-1}sh-table tbody:empty+.no-rows{display:block}\n"], dependencies: [{ kind: "component", type: ShipProgressBar, selector: "sh-progress-bar", inputs: ["value", "color", "variant"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
394
397
  }
395
398
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipTable, decorators: [{
396
399
  type: Component,
397
400
  args: [{ selector: 'sh-table', encapsulation: ViewEncapsulation.None, imports: [ShipProgressBar], template: `
398
401
  <div class="actionbar">
399
- <ng-content select="[actionbar]" />
402
+ <ng-content select="[actionbar]:not([align-right])" />
403
+ <div class="actionbar-right">
404
+ <ng-content select="[actionbar][align-right]" />
405
+ </div>
400
406
  </div>
401
407
 
402
408
  @if (loading()) {
@@ -428,7 +434,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
428
434
  '[class.scrolled-x-end]': 'scrollXState() === 1',
429
435
  '[class.scrolled-y]': 'scrollYState() >= 0',
430
436
  '[class.scrolled-y-end]': 'scrollYState() === 1',
431
- }, styles: ["sh-table{--table-bc: var(--base-4);--table-th-bg: var(--base-1);--table-tr-bg: var(--base-1);--table-td-bg: var(--base-1);--table-th-c: var(--base-8);--table-th-f: var(--paragraph-30);--table-td-c: var(--base-8);--table-td-f: var(--paragraph-30);--table-th-p: 0 1.25rem;--table-td-p: 0 1.25rem;--table-th-mh: 3rem;--table-td-mh: 4.875rem;--table-th-g: .25rem;--table-td-g: .5rem;--table-ws: nowrap;--table-th-bw: 0;--table-td-bw: .0625rem 0 0;--table-columns: 1fr 1fr 1fr max-content;--table-sticky-bw: .0625rem}sh-table.type-a tbody>th,sh-table.type-a tbody>td,sh-table.type-a thead>th,sh-table.type-a thead>td{padding-right:0}sh-table.type-a tbody>th:first-child,sh-table.type-a tbody>td:first-child,sh-table.type-a thead>th:first-child,sh-table.type-a thead>td:first-child{padding:0}sh-table.type-a.scrolled-x.can-scroll-x [shStickyColumns=\"\"],sh-table.type-a.scrolled-x.can-scroll-x th.sticky,sh-table.type-a.scrolled-x.can-scroll-x td.sticky{border-right-width:.0625rem}sh-table.type-a:not(.scrolled-x-end).can-scroll-x [shStickyColumns=end],sh-table.type-a:not(.scrolled-x-end).can-scroll-x th.sticky-end,sh-table.type-a:not(.scrolled-x-end).can-scroll-x td.sticky-end{border-left-width:.0625rem}sh-table.type-b{--table-th-p: 0 .75rem;--table-td-p: 0 .75rem;--table-th-mh: 2.25rem;--table-td-mh: 3.5rem;--table-th-bw: .0625rem 0 .0625rem .0625rem;--table-td-bw: 0 0 .0625rem .0625rem;--table-th-bg: var(--base-2);--table-sticky-bw: .125rem}sh-table.type-b th:first-child{border-left-width:0;padding:var(--table-th-p)}sh-table.type-b td:first-child{border-left-width:0;padding:var(--table-td-p)}sh-table.type-b [shStickyColumns=end]{border-left-width:.125rem}sh-table.type-b.scrolled-x [shStickyColumns=\"\"]{border-right-width:.125rem}sh-table.type-b.scrolled-x-end [shStickyColumns=end]{border-left-width:.0625rem}sh-table.type-b td.sticky,sh-table.type-b th.sticky{border-left-width:0;border-right-width:.0625rem}sh-table.type-b td.sticky+*,sh-table.type-b th.sticky+*{border-left-width:0}sh-table.type-b tr:hover td{background-color:var(--base-2)}sh-table.type-b div[table-header] tr:first-child th{border-bottom:0}sh-table.type-b .actionbar{background-color:var(--base-2);border-width:.0625rem 0 0}sh-table{width:100%;display:grid;overflow:auto;grid-template-columns:var(--table-columns);position:relative}sh-table.resizing{-webkit-user-select:none;user-select:none}sh-table:has([shTableResize]) td{overflow:auto}sh-table.no-resize .sh-resizer{display:none}sh-table.no-resize td{overflow:initial}sh-table .actionbar{display:grid;grid-column:1/-1;align-items:start;gap:.5rem;grid-template-rows:1fr;grid-auto-flow:column;grid-auto-columns:max-content;padding:.5rem;border:var(--border-10);border-width:.0625rem 0;opacity:1;transition:grid-template-rows .3s ease-out,padding .3s ease-out,border-width .3s ease-out,opacity .3s ease-out;overflow:hidden}sh-table .actionbar:empty{grid-template-rows:0fr;padding-top:0;padding-bottom:0;border-width:0;opacity:0;pointer-events:none}sh-table .actionbar>*{min-height:0}sh-table tbody{position:relative}sh-table tbody:has(tr.sticky){position:sticky;top:0;z-index:1}sh-table thead{position:relative}sh-table thead:has(tr.sticky){position:sticky;top:0;z-index:2}sh-table sh-progress-bar{grid-column:1/-1;position:absolute;top:100%;transform:translateY(-50%);z-index:200}sh-table tbody,sh-table thead,sh-table tr{display:grid;grid-column:1/-1;grid-template-columns:subgrid}sh-table tr{background:var(--table-tr-bg);position:relative;z-index:0}sh-table tr.sticky{position:sticky;top:0;z-index:1}sh-table tr.sticky-end{position:sticky;bottom:0;z-index:3}sh-table tr:has(th.sticky-end) th:nth-last-child(2){padding:var(--table-th-p)}sh-table tr:has(td.sticky-end) td:nth-last-child(2){padding:var(--table-td-p)}sh-table th{display:flex;align-items:center;padding:var(--table-th-p);min-height:var(--table-th-mh);font:var(--table-th-f);line-height:1em;white-space:var(--table-ws);color:var(--table-th-c);border:0;border-color:var(--table-bc);border-style:solid;border-width:var(--table-th-bw);background:var(--table-th-bg);gap:var(--table-th-g);z-index:100}sh-table th:has(.sh-resizer){position:relative}sh-table th.sortable{--caret-color: var(--base-10);--caret-size: .375rem;cursor:pointer;-webkit-user-select:none;user-select:none}sh-table th.sortable sh-icon{opacity:.35;transition:opacity 125ms ease-in-out}sh-table th.sortable:hover sh-icon{opacity:.7}sh-table th.sortable.sort-asc sh-icon,sh-table th.sortable.sort-desc sh-icon{opacity:1}sh-table th.sortable:not(:has(sh-icon)):after{content:\"\";border:var(--caret-size) solid transparent;width:0;height:0;opacity:0;transition:opacity 125ms ease-in-out}sh-table th.sortable:not(:has(sh-icon)).sort-desc:after{opacity:1;transform:translateY(-4px);border-bottom-color:var(--caret-color)}sh-table th.sortable:not(:has(sh-icon)).sort-asc:after{opacity:1;transform:translateY(4px);border-top-color:var(--caret-color)}sh-table th .sh-resizer{width:10px;height:100%;position:absolute;top:0;right:0;cursor:col-resize}sh-table th .sh-resizer:before,sh-table th .sh-resizer:after{content:\"\";position:absolute;top:50%;transform:translateY(-50%);height:.75rem;right:.1875rem;width:.0625rem;background-color:var(--base-4)}sh-table th .sh-resizer:hover:before,sh-table th .sh-resizer:hover:after{background-color:var(--primary-8)}sh-table th .sh-resizer:before{left:.1875rem}sh-table td{display:flex;align-items:center;padding:var(--table-td-p);min-height:var(--table-td-mh);gap:var(--table-td-g);color:var(--table-td-c);font:var(--table-td-f);white-space:var(--table-ws);border-color:var(--table-bc);border-style:solid;border-width:var(--table-td-bw);background:var(--table-td-bg)}sh-table td+td.sticky-end:last-child{padding:var(--table-td-p)}sh-table th.sticky,sh-table th.sticky-end,sh-table td.sticky,sh-table td.sticky-end{position:sticky;overflow:hidden;right:auto;left:0;z-index:1;padding:var(--table-td-p)}sh-table th.sticky:first-child,sh-table th.sticky-end:first-child,sh-table td.sticky:first-child,sh-table td.sticky-end:first-child{padding:var(--table-th-p)}sh-table th.sticky-end,sh-table td.sticky-end{right:0;left:auto}sh-table th.sticky,sh-table th.sticky-end{background:var(--table-th-bg);padding:var(--table-th-p);z-index:101}sh-table th.sticky:first-child,sh-table th.sticky-end:first-child{padding:var(--table-th-p)}sh-table [shStickyColumns]{display:grid;grid-template-columns:subgrid;position:sticky;left:0;z-index:1000;border:0;border-color:var(--table-bc);border-style:solid}sh-table [shStickyColumns=end]{left:auto;right:0}sh-table thead>[shStickyColumns]{border-width:var(--table-th-bw)}sh-table tbody>[shStickyColumns]{border-width:var(--table-td-bw)}sh-table .span-all{grid-column:1/-1;white-space:initial;align-items:flex-start;padding:0;border-left-width:0}sh-table .no-rows{display:none;grid-column:1/-1}sh-table tbody:empty+.no-rows{display:block}\n"] }]
437
+ }, styles: ["sh-table{--table-bc: var(--base-4);--table-th-bg: var(--base-2);--table-tr-bg: var(--base-1);--table-td-bg: var(--base-1);--table-th-c: var(--base-8);--table-th-f: var(--paragraph-30);--table-td-c: var(--base-8);--table-td-f: var(--paragraph-30);--table-th-p: 0 1.25rem;--table-td-p: 0 1.25rem;--table-th-mh: 3rem;--table-td-mh: 4.875rem;--table-th-g: .25rem;--table-td-g: .5rem;--table-ws: nowrap;--table-th-bw: 0;--table-td-bw: .0625rem 0 0;--table-columns: 1fr 1fr 1fr max-content;--table-sticky-bw: .0625rem}sh-table.type-a tbody>th,sh-table.type-a tbody>td,sh-table.type-a thead>th,sh-table.type-a thead>td{padding-right:0}sh-table.type-a tbody>th:first-child,sh-table.type-a tbody>td:first-child,sh-table.type-a thead>th:first-child,sh-table.type-a thead>td:first-child{padding:0}sh-table.type-b{--table-th-p: 0 .75rem;--table-td-p: 0 .75rem;--table-th-mh: 2.25rem;--table-td-mh: 3.5rem;--table-th-bw: .0625rem 0 .0625rem .0625rem;--table-td-bw: 0 0 .0625rem .0625rem;--table-sticky-bw: .0625rem}sh-table.type-b th:first-child{border-left-width:0;padding:var(--table-th-p)}sh-table.type-b td:first-child{border-left-width:0;padding:var(--table-td-p)}sh-table.type-b td.sticky,sh-table.type-b th.sticky{border-left-width:0;border-right:var(--table-sticky-bw) solid var(--table-bc)}sh-table.type-b [shStickyColumns] th,sh-table.type-b [shStickyColumns] td{border-right:var(--table-sticky-bw) solid var(--table-bc)}sh-table.type-b th.sticky-end,sh-table.type-b td.sticky-end,sh-table.type-b [shStickyColumns=end] th,sh-table.type-b [shStickyColumns=end] td{border-left:var(--table-sticky-bw) solid var(--table-bc);border-right:0}sh-table.type-b .sticky+th,sh-table.type-b .sticky+td,sh-table.type-b [shStickyColumns]+th,sh-table.type-b [shStickyColumns]+td{border-left-width:0}sh-table.type-b tr:hover td{background-color:var(--base-2)}sh-table.type-b div[table-header] tr:first-child th{border-bottom:0}sh-table.type-b tbody tr:last-child td{border-bottom-width:0}sh-table.type-b .actionbar{background-color:var(--base-2);border-width:.0625rem 0 0}sh-table{width:100%;display:grid;overflow:auto;overscroll-behavior-x:none;grid-template-columns:var(--table-columns);position:relative;container-type:inline-size}sh-table.resizing{-webkit-user-select:none;user-select:none}sh-table:has([shTableResize]) td{overflow:auto}sh-table.no-resize .sh-resizer{display:none}sh-table.no-resize td{overflow:initial}sh-table .actionbar{display:flex;align-items:center;gap:.5rem;grid-column:1/-1;position:sticky;left:0;z-index:10;background-color:var(--base-1);width:100cqw;box-sizing:border-box;padding:.5rem;border:var(--border-10);border-width:.0625rem 0;opacity:1;transition:padding .3s ease-out,border-width .3s ease-out,opacity .3s ease-out;overflow:hidden}sh-table .actionbar:empty,sh-table .actionbar:not(:has(>:not(.actionbar-right))):has(>.actionbar-right:empty){display:none}sh-table .actionbar>*{min-height:0}sh-table .actionbar .actionbar-right{display:flex;align-items:center;gap:.5rem;margin-left:auto;flex-shrink:0}sh-table .actionbar .actionbar-right:empty{display:none}sh-table tbody{position:relative}sh-table tbody:has(tr.sticky){position:sticky;top:0;z-index:1}sh-table thead{position:relative}sh-table thead:has(tr.sticky){position:sticky;top:0;z-index:2}sh-table sh-progress-bar{grid-column:1/-1;position:absolute;top:100%;transform:translateY(-50%);z-index:200}sh-table tbody,sh-table thead,sh-table tr{display:grid;grid-column:1/-1;grid-template-columns:subgrid}sh-table tr{background:var(--table-tr-bg);position:relative;z-index:0}sh-table tr.sticky{position:sticky;top:0;z-index:1}sh-table tr.sticky-end{position:sticky;bottom:0;z-index:3}sh-table tr:has(th.sticky-end) th:nth-last-child(2){padding:var(--table-th-p)}sh-table tr:has(td.sticky-end) td:nth-last-child(2){padding:var(--table-td-p)}sh-table th{display:flex;align-items:center;padding:var(--table-th-p);min-height:var(--table-th-mh);font:var(--table-th-f);line-height:1em;white-space:var(--table-ws);color:var(--table-th-c);border:0;border-color:var(--table-bc);border-style:solid;border-width:var(--table-th-bw);background:var(--table-th-bg);gap:var(--table-th-g);z-index:100}sh-table th:has(.sh-resizer){position:relative}sh-table th.sortable{--caret-color: var(--base-10);--caret-size: .375rem;cursor:pointer;-webkit-user-select:none;user-select:none}sh-table th.sortable sh-icon{opacity:.35;transition:opacity 125ms ease-in-out}sh-table th.sortable:hover sh-icon{opacity:.7}sh-table th.sortable.sort-asc sh-icon,sh-table th.sortable.sort-desc sh-icon{opacity:1}sh-table th.sortable:not(:has(sh-icon)):after{content:\"\";border:var(--caret-size) solid transparent;width:0;height:0;opacity:0;transition:opacity 125ms ease-in-out}sh-table th.sortable:not(:has(sh-icon)).sort-desc:after{opacity:1;transform:translateY(-4px);border-bottom-color:var(--caret-color)}sh-table th.sortable:not(:has(sh-icon)).sort-asc:after{opacity:1;transform:translateY(4px);border-top-color:var(--caret-color)}sh-table th .sh-resizer{width:10px;height:100%;position:absolute;top:0;right:0;cursor:col-resize}sh-table th .sh-resizer:before,sh-table th .sh-resizer:after{content:\"\";position:absolute;top:50%;transform:translateY(-50%);height:.75rem;right:.1875rem;width:.0625rem;background-color:var(--base-4)}sh-table th .sh-resizer:hover:before,sh-table th .sh-resizer:hover:after{background-color:var(--primary-8)}sh-table th .sh-resizer:before{left:.1875rem}sh-table td{display:flex;align-items:center;padding:var(--table-td-p);min-height:var(--table-td-mh);gap:var(--table-td-g);color:var(--table-td-c);font:var(--table-td-f);white-space:var(--table-ws);border-color:var(--table-bc);border-style:solid;border-width:var(--table-td-bw);background:var(--table-td-bg)}sh-table td+td.sticky-end:last-child{padding:var(--table-td-p)}sh-table th.sticky,sh-table th.sticky-end,sh-table td.sticky,sh-table td.sticky-end{position:sticky;overflow:hidden;right:auto;left:0;z-index:1;padding:var(--table-td-p)}sh-table th.sticky:first-child,sh-table th.sticky-end:first-child,sh-table td.sticky:first-child,sh-table td.sticky-end:first-child{padding:var(--table-th-p)}sh-table th.sticky-end,sh-table td.sticky-end{right:0;left:auto}sh-table th.sticky,sh-table th.sticky-end{background:var(--base-1);padding:var(--table-th-p);z-index:101}sh-table th.sticky:first-child,sh-table th.sticky-end:first-child{padding:var(--table-th-p)}sh-table [shStickyColumns]{display:grid;grid-template-columns:subgrid;position:sticky;left:0;z-index:1000;border:0;border-color:var(--table-bc);border-style:solid}sh-table [shStickyColumns] th{background-color:var(--base-1)}sh-table [shStickyColumns=end]{left:auto;right:0}sh-table .span-all{grid-column:1/-1;white-space:initial;align-items:flex-start;padding:0;border-left-width:0;position:sticky;left:0;width:100cqw;box-sizing:border-box}sh-table .no-rows{display:none;grid-column:1/-1}sh-table tbody:empty+.no-rows{display:block}\n"] }]
432
438
  }], propDecorators: { loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], dataChange: [{ type: i0.Output, args: ["dataChange"] }], sortByColumn: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortByColumn", required: false }] }, { type: i0.Output, args: ["sortByColumnChange"] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], thead: [{ type: i0.ViewChild, args: ['thead', { isSignal: true }] }], tbody: [{ type: i0.ViewChild, args: ['tbody', { isSignal: true }] }], onResize: [{
433
439
  type: HostListener,
434
440
  args: ['window:resize', ['$event']]
@@ -1 +1 @@
1
- {"version":3,"file":"ship-ui-core-ship-table.mjs","sources":["../../../projects/ship-ui/ship-table/ship-table.ts","../../../projects/ship-ui/ship-table/ship-ui-core-ship-table.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, DestroyRef, Directive, effect, ElementRef, HostListener, inject, input, model, output, Renderer2, signal, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ShipProgressBar } from '@ship-ui/core/ship-progress-bar';\nimport { observeChildren } from '@ship-ui/core';\nimport { shipComponentClasses } from '@ship-ui/core';\nimport { ShipColor, ShipTableVariant } from '@ship-ui/core';\n\n@Directive({\n selector: '[shResize]',\n standalone: true,\n})\nexport class ShipResize {\n #el = inject(ElementRef) as ElementRef<HTMLTableCellElement>;\n #renderer = inject(Renderer2);\n #table = inject(ShipTable);\n\n resizable = input<boolean>(true);\n minWidth = input<number>(50);\n maxWidth = input<number | null>(null);\n\n #startX!: number;\n #startWidth!: number;\n #resizing = false;\n #animationFrameRequest: number | null = null; // Store request ID\n\n ngOnInit() {\n if (!this.#table) {\n console.error('shTableResize directive must be used within a sh-table component.');\n return;\n }\n\n if (this.resizable()) {\n const resizer = this.#renderer.createElement('div');\n this.#renderer.addClass(resizer, 'sh-resizer');\n this.#renderer.appendChild(this.#el.nativeElement, resizer);\n this.#renderer.listen(resizer, 'mousedown', this.#onMouseDown.bind(this));\n }\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent) {\n if (!this.#resizing) return;\n\n this.#scheduleResize(event);\n }\n\n @HostListener('document:mouseup', ['$event'])\n onMouseUp(event: MouseEvent) {\n if (this.#resizing) {\n this.#resizing = false;\n this.#table.resizing.set(false);\n\n if (this.#animationFrameRequest !== null) {\n cancelAnimationFrame(this.#animationFrameRequest);\n this.#animationFrameRequest = null;\n }\n }\n }\n\n @HostListener('document:click', ['$event']) onClick(event: MouseEvent) {\n if (this.#resizing) {\n event.stopPropagation();\n }\n }\n\n #onMouseDown(event: MouseEvent) {\n event.stopPropagation();\n\n if (!this.resizable()) return;\n\n this.#table.resizing.set(true);\n this.#resizing = true;\n this.#startX = event.pageX;\n this.#startWidth = this.#el.nativeElement.offsetWidth;\n }\n\n #scheduleResize(event: MouseEvent) {\n if (this.#animationFrameRequest !== null) {\n cancelAnimationFrame(this.#animationFrameRequest);\n }\n\n this.#animationFrameRequest = requestAnimationFrame(() => {\n this.#resizeColumn(event);\n this.#animationFrameRequest = null;\n });\n }\n\n #resizeColumn(event: MouseEvent) {\n const width = this.#startWidth + (event.pageX - this.#startX);\n const constrainedWidth = Math.max(\n this.minWidth(),\n this.maxWidth() ? Math.min(width, this.maxWidth() ?? width) : width\n );\n\n this.#renderer.setAttribute(this.#el.nativeElement, 'size', `${constrainedWidth}px`);\n this.#table.updateColumnSizes();\n }\n\n ngOnDestroy() {\n if (this.#animationFrameRequest !== null) {\n cancelAnimationFrame(this.#animationFrameRequest);\n }\n }\n}\n\n@Directive({\n selector: '[shSort]',\n standalone: true,\n host: {\n class: 'sortable',\n '(mousedown)': 'toggleSort()',\n '[class.sort-asc]': 'sortAsc()',\n '[class.sort-desc]': 'sortDesc()',\n },\n})\nexport class ShipSort {\n #table = inject(ShipTable);\n shSort = input<string>();\n\n sortAsc = computed(() => {\n const currentSort = this.#table.sortByColumn();\n const thisColumn = this.shSort();\n\n if (!currentSort || !thisColumn) return false;\n\n return currentSort === thisColumn;\n });\n\n sortDesc = computed(() => {\n const currentSort = this.#table.sortByColumn();\n const thisColumn = this.shSort();\n\n if (!currentSort || !thisColumn) return false;\n\n return currentSort === `-${thisColumn}`;\n });\n\n toggleSort() {\n const sortCol = this.shSort();\n\n if (!sortCol) return;\n\n this.#table.toggleSort(sortCol);\n }\n}\n\n@Directive({\n selector: '[shStickyColumns]',\n\n host: {\n '[class.sticky]': 'shStickyColumns() === \"start\"',\n '[class.sticky-end]': 'shStickyColumns() === \"end\"',\n },\n})\nexport class ShipStickyColumns {\n #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n #renderer = inject(Renderer2);\n\n shStickyColumns = input<'start' | 'end' | (string & {})>('start');\n\n ngAfterContentInit() {\n this.#applyGridColumnStyle();\n }\n\n #applyGridColumnStyle() {\n const nativeElement = this.#elementRef.nativeElement;\n const cellChildren = nativeElement.querySelectorAll<HTMLTableCellElement>(':scope > th, :scope > td');\n const columnSpanCount = cellChildren.length;\n\n if (columnSpanCount > 0) {\n const position = this.shStickyColumns();\n\n this.#renderer.setStyle(\n nativeElement,\n 'grid-column',\n position === 'end' ? `-${columnSpanCount + 1} / -1` : `1 / ${columnSpanCount + 1}`\n );\n }\n }\n}\n\nconst SCROLL_TOLERANCE = 1.5;\ntype ScrollState = -1 | 0 | 1;\n\n@Component({\n selector: 'sh-table',\n styleUrl: './ship-table.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipProgressBar],\n template: `\n <div class=\"actionbar\">\n <ng-content select=\"[actionbar]\" />\n </div>\n\n @if (loading()) {\n <sh-progress-bar class=\"indeterminate primary\" />\n }\n\n <thead #thead>\n <ng-content select=\"th\" />\n <ng-content select=\"[thead]\" />\n </thead>\n\n <tbody #tbody>\n <ng-content />\n </tbody>\n\n @if (!loading()) {\n <div class=\"no-rows\">\n <ng-content select=\"[table-no-rows]\" />\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[style.grid-template-columns]': 'columnSizes()',\n '[class.resizing]': 'resizing()',\n '(scroll)': 'onScroll()',\n '[class.can-scroll-x]': 'canScrollX()',\n '[class.can-scroll-y]': 'canScrollY()',\n '[class.scrolled-x]': 'scrollXState() >= 0',\n '[class.scrolled-x-end]': 'scrollXState() === 1',\n '[class.scrolled-y]': 'scrollYState() >= 0',\n '[class.scrolled-y-end]': 'scrollYState() === 1',\n },\n})\nexport class ShipTable {\n #el = inject(ElementRef);\n\n loading = input<boolean>(false);\n data = input<any>([]);\n dataChange = output<any>();\n sortByColumn = model<string | null>(null);\n\n color = input<ShipColor | null>(null);\n variant = input<ShipTableVariant | null>(null);\n\n hostClasses = shipComponentClasses('table', {\n color: this.color,\n variant: this.variant,\n });\n\n thead = viewChild<ElementRef<HTMLTableSectionElement>>('thead');\n tbody = viewChild<ElementRef<HTMLTableSectionElement>>('tbody');\n columns = observeChildren<HTMLTableColElement>(this.thead, ['tr:first-child th']);\n\n stickyHeaderHeight = signal<number>(0);\n\n #destroyRef = inject(DestroyRef);\n #resizeObserver: ResizeObserver | null = null;\n\n theadEffect = effect(() => {\n const head = this.thead()?.nativeElement;\n \n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n this.#resizeObserver = null;\n }\n\n if (head && typeof ResizeObserver !== 'undefined') {\n this.#resizeObserver = new ResizeObserver((entries) => {\n const height = head.clientHeight;\n this.stickyHeaderHeight.set(height);\n });\n this.#resizeObserver.observe(head);\n }\n });\n\n #cleanup = this.#destroyRef.onDestroy(() => {\n this.#resizeObserver?.disconnect();\n });\n\n bodyEffect = effect(() => {\n const body = this.tbody()?.nativeElement;\n const head = this.thead()?.nativeElement;\n\n if (!body || !head) return;\n\n const stickyHeaderHeight = this.stickyHeaderHeight();\n\n queueMicrotask(() => {\n const hasStickyRowHeaderStartElement = head.querySelectorAll('tr.sticky').length > 0;\n const stickyBodyRows = body.querySelectorAll('tr.sticky');\n const hasStickyRowStartElement = stickyBodyRows.length > 0;\n\n if (hasStickyRowStartElement && hasStickyRowHeaderStartElement) {\n for (let index = 0; index < stickyBodyRows.length; index++) {\n (stickyBodyRows[index] as HTMLElement).style.top = `${stickyHeaderHeight}px`;\n }\n }\n });\n });\n\n resizing = signal(false);\n sizeTrigger = signal(true);\n #initialData: any | null = null;\n #initialDataSet = signal(false);\n scrollXState = signal<ScrollState>(-1);\n scrollYState = signal<ScrollState>(-1);\n canScrollX = signal(false);\n canScrollY = signal(false);\n\n columnSizes = computed(() => {\n this.sizeTrigger();\n const colSignal = this.columns.signal();\n\n return colSignal.reduce((acc: string, col: any, index: number) => {\n const colEl = col;\n const colSize = colEl.getAttribute('size');\n const last = index === colSignal.length - 1;\n\n if (colSize) {\n return `${acc} ${colSize}`;\n }\n\n if (colEl.classList.contains('sticky') || colEl.classList.contains('sticky-end')) {\n return `${acc} min-content`;\n }\n\n if (last) {\n return `${acc} 1fr`;\n }\n\n return `${acc} 1fr`;\n }, '');\n });\n\n updateColumnSizes() {\n this.sizeTrigger.set(!this.sizeTrigger());\n }\n\n onScroll(): void {\n this.#checkScroll();\n }\n\n @HostListener('window:resize', ['$event'])\n onResize(event: Event) {\n this.#checkScroll();\n }\n\n ngAfterViewInit() {\n queueMicrotask(() => this.#checkScroll());\n }\n\n e = effect(() => {\n const sortByColumn = this.sortByColumn();\n\n if (sortByColumn === null) {\n if (!this.#initialDataSet()) {\n this.#initialData = this.data();\n this.#initialDataSet.set(true);\n }\n\n return this.dataChange.emit(structuredClone(this.#initialData));\n }\n\n const column = sortByColumn.startsWith('-') ? sortByColumn.slice(1) : sortByColumn;\n const isDescending = sortByColumn.startsWith('-');\n\n const sortedData = this.data().sort((a: any, b: any) => {\n const valueA = a[column] as any;\n const valueB = b[column] as any;\n\n let comparison = 0;\n\n if (typeof valueA === 'number' && typeof valueB === 'number') {\n comparison = valueA - valueB;\n }\n\n if (valueA instanceof Date && valueB instanceof Date) {\n comparison = valueA.getTime() - valueB.getTime();\n }\n\n if (typeof valueA === 'string' && typeof valueB === 'string') {\n comparison = valueA.localeCompare(valueB, undefined, { sensitivity: 'base' });\n }\n\n return isDescending ? -comparison : comparison;\n });\n\n this.dataChange.emit(sortedData);\n });\n\n toggleSort(column: string) {\n const currentSort = this.sortByColumn();\n const sortDir = currentSort === column ? `-${column}` : currentSort === `-${column}` ? null : column;\n\n this.sortByColumn.set(sortDir);\n }\n\n #checkScroll(): void {\n const element = this.#el.nativeElement as HTMLElement;\n let nextXState: ScrollState = -1;\n let nextYState: ScrollState = -1;\n\n const canScrollX = element.scrollWidth > element.clientWidth + SCROLL_TOLERANCE;\n\n if (canScrollX) {\n const isAtStartX = element.scrollLeft <= SCROLL_TOLERANCE;\n const isAtEndX = element.scrollWidth - (element.scrollLeft + element.clientWidth) < SCROLL_TOLERANCE;\n\n if (isAtEndX) {\n nextXState = 1;\n } else if (!isAtStartX) {\n nextXState = 0;\n }\n }\n\n this.scrollXState.set(nextXState);\n this.canScrollX.set(canScrollX);\n\n const canScrollY = element.scrollHeight > element.clientHeight + SCROLL_TOLERANCE;\n\n if (canScrollY) {\n const isAtStartY = element.scrollTop <= SCROLL_TOLERANCE;\n const isAtEndY = element.scrollHeight - (element.scrollTop + element.clientHeight) < SCROLL_TOLERANCE;\n\n if (isAtEndY) {\n nextYState = 1;\n } else if (!isAtStartY) {\n nextYState = 0;\n }\n }\n\n this.scrollYState.set(nextYState);\n this.canScrollY.set(canScrollY);\n }\n}\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-table.mjs","sources":["../../../projects/ship-ui/ship-table/ship-table.ts","../../../projects/ship-ui/ship-table/ship-ui-core-ship-table.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, DestroyRef, Directive, effect, ElementRef, HostListener, inject, input, model, output, Renderer2, signal, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ShipProgressBar } from '@ship-ui/core/ship-progress-bar';\nimport { observeChildren } from '@ship-ui/core';\nimport { shipComponentClasses } from '@ship-ui/core';\nimport { ShipColor, ShipTableVariant } from '@ship-ui/core';\n\n@Directive({\n selector: '[shResize]',\n standalone: true,\n})\nexport class ShipResize {\n #el = inject(ElementRef) as ElementRef<HTMLTableCellElement>;\n #renderer = inject(Renderer2);\n #table = inject(ShipTable);\n\n resizable = input<boolean>(true);\n minWidth = input<number>(50);\n maxWidth = input<number | null>(null);\n\n #startX!: number;\n #startWidth!: number;\n #resizing = false;\n #animationFrameRequest: number | null = null; // Store request ID\n\n ngOnInit() {\n if (!this.#table) {\n console.error('shTableResize directive must be used within a sh-table component.');\n return;\n }\n\n if (this.resizable()) {\n const resizer = this.#renderer.createElement('div');\n this.#renderer.addClass(resizer, 'sh-resizer');\n this.#renderer.appendChild(this.#el.nativeElement, resizer);\n this.#renderer.listen(resizer, 'mousedown', this.#onMouseDown.bind(this));\n }\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent) {\n if (!this.#resizing) return;\n\n this.#scheduleResize(event);\n }\n\n @HostListener('document:mouseup', ['$event'])\n onMouseUp(event: MouseEvent) {\n if (this.#resizing) {\n this.#resizing = false;\n this.#table.resizing.set(false);\n\n if (this.#animationFrameRequest !== null) {\n cancelAnimationFrame(this.#animationFrameRequest);\n this.#animationFrameRequest = null;\n }\n }\n }\n\n @HostListener('document:click', ['$event']) onClick(event: MouseEvent) {\n if (this.#resizing) {\n event.stopPropagation();\n }\n }\n\n #onMouseDown(event: MouseEvent) {\n event.stopPropagation();\n\n if (!this.resizable()) return;\n\n this.#table.resizing.set(true);\n this.#resizing = true;\n this.#startX = event.pageX;\n this.#startWidth = this.#el.nativeElement.offsetWidth;\n }\n\n #scheduleResize(event: MouseEvent) {\n if (this.#animationFrameRequest !== null) {\n cancelAnimationFrame(this.#animationFrameRequest);\n }\n\n this.#animationFrameRequest = requestAnimationFrame(() => {\n this.#resizeColumn(event);\n this.#animationFrameRequest = null;\n });\n }\n\n #resizeColumn(event: MouseEvent) {\n const width = this.#startWidth + (event.pageX - this.#startX);\n const constrainedWidth = Math.max(\n this.minWidth(),\n this.maxWidth() ? Math.min(width, this.maxWidth() ?? width) : width\n );\n\n this.#renderer.setAttribute(this.#el.nativeElement, 'size', `${constrainedWidth}px`);\n this.#table.updateColumnSizes();\n }\n\n ngOnDestroy() {\n if (this.#animationFrameRequest !== null) {\n cancelAnimationFrame(this.#animationFrameRequest);\n }\n }\n}\n\n@Directive({\n selector: '[shSort]',\n standalone: true,\n host: {\n class: 'sortable',\n '(mousedown)': 'toggleSort()',\n '[class.sort-asc]': 'sortAsc()',\n '[class.sort-desc]': 'sortDesc()',\n },\n})\nexport class ShipSort {\n #table = inject(ShipTable);\n shSort = input<string>();\n\n sortAsc = computed(() => {\n const currentSort = this.#table.sortByColumn();\n const thisColumn = this.shSort();\n\n if (!currentSort || !thisColumn) return false;\n\n return currentSort === thisColumn;\n });\n\n sortDesc = computed(() => {\n const currentSort = this.#table.sortByColumn();\n const thisColumn = this.shSort();\n\n if (!currentSort || !thisColumn) return false;\n\n return currentSort === `-${thisColumn}`;\n });\n\n toggleSort() {\n const sortCol = this.shSort();\n\n if (!sortCol) return;\n\n this.#table.toggleSort(sortCol);\n }\n}\n\n@Directive({\n selector: '[shStickyColumns]',\n\n host: {\n '[class.sticky]': 'shStickyColumns() === \"start\" || shStickyColumns() === \"\"',\n '[class.sticky-end]': 'shStickyColumns() === \"end\"',\n },\n})\nexport class ShipStickyColumns {\n #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n #renderer = inject(Renderer2);\n\n shStickyColumns = input<'start' | 'end' | (string & {})>('start');\n\n ngAfterContentInit() {\n this.#applyGridColumnStyle();\n }\n\n #applyGridColumnStyle() {\n const nativeElement = this.#elementRef.nativeElement;\n const cellChildren = nativeElement.querySelectorAll<HTMLTableCellElement>(':scope > th, :scope > td');\n const columnSpanCount = cellChildren.length;\n\n if (columnSpanCount > 0) {\n const position = this.shStickyColumns();\n\n this.#renderer.setStyle(\n nativeElement,\n 'grid-column',\n position === 'end' ? `-${columnSpanCount + 1} / -1` : `1 / ${columnSpanCount + 1}`\n );\n }\n }\n}\n\nconst SCROLL_TOLERANCE = 1.5;\ntype ScrollState = -1 | 0 | 1;\n\n@Component({\n selector: 'sh-table',\n styleUrl: './ship-table.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipProgressBar],\n template: `\n <div class=\"actionbar\">\n <ng-content select=\"[actionbar]:not([align-right])\" />\n <div class=\"actionbar-right\">\n <ng-content select=\"[actionbar][align-right]\" />\n </div>\n </div>\n\n @if (loading()) {\n <sh-progress-bar class=\"indeterminate primary\" />\n }\n\n <thead #thead>\n <ng-content select=\"th\" />\n <ng-content select=\"[thead]\" />\n </thead>\n\n <tbody #tbody>\n <ng-content />\n </tbody>\n\n @if (!loading()) {\n <div class=\"no-rows\">\n <ng-content select=\"[table-no-rows]\" />\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[style.grid-template-columns]': 'columnSizes()',\n '[class.resizing]': 'resizing()',\n '(scroll)': 'onScroll()',\n '[class.can-scroll-x]': 'canScrollX()',\n '[class.can-scroll-y]': 'canScrollY()',\n '[class.scrolled-x]': 'scrollXState() >= 0',\n '[class.scrolled-x-end]': 'scrollXState() === 1',\n '[class.scrolled-y]': 'scrollYState() >= 0',\n '[class.scrolled-y-end]': 'scrollYState() === 1',\n },\n})\nexport class ShipTable {\n #el = inject(ElementRef);\n\n loading = input<boolean>(false);\n data = input<any>([]);\n dataChange = output<any>();\n sortByColumn = model<string | null>(null);\n\n color = input<ShipColor | null>(null);\n variant = input<ShipTableVariant | null>(null);\n\n hostClasses = shipComponentClasses('table', {\n color: this.color,\n variant: this.variant,\n });\n\n thead = viewChild<ElementRef<HTMLTableSectionElement>>('thead');\n tbody = viewChild<ElementRef<HTMLTableSectionElement>>('tbody');\n columns = observeChildren<HTMLTableColElement>(this.thead, ['tr:first-child th']);\n\n stickyHeaderHeight = signal<number>(0);\n\n #destroyRef = inject(DestroyRef);\n #resizeObserver: ResizeObserver | null = null;\n\n theadEffect = effect(() => {\n const head = this.thead()?.nativeElement;\n \n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n this.#resizeObserver = null;\n }\n\n if (head && typeof ResizeObserver !== 'undefined') {\n this.#resizeObserver = new ResizeObserver((entries) => {\n const height = head.clientHeight;\n this.stickyHeaderHeight.set(height);\n });\n this.#resizeObserver.observe(head);\n }\n });\n\n #cleanup = this.#destroyRef.onDestroy(() => {\n this.#resizeObserver?.disconnect();\n });\n\n bodyEffect = effect(() => {\n const body = this.tbody()?.nativeElement;\n const head = this.thead()?.nativeElement;\n\n if (!body || !head) return;\n\n const stickyHeaderHeight = this.stickyHeaderHeight();\n\n queueMicrotask(() => {\n const hasStickyRowHeaderStartElement = head.querySelectorAll('tr.sticky').length > 0;\n const stickyBodyRows = body.querySelectorAll('tr.sticky');\n const hasStickyRowStartElement = stickyBodyRows.length > 0;\n\n if (hasStickyRowStartElement && hasStickyRowHeaderStartElement) {\n for (let index = 0; index < stickyBodyRows.length; index++) {\n (stickyBodyRows[index] as HTMLElement).style.top = `${stickyHeaderHeight}px`;\n }\n }\n });\n });\n\n resizing = signal(false);\n sizeTrigger = signal(true);\n #initialData: any | null = null;\n #initialDataSet = signal(false);\n scrollXState = signal<ScrollState>(-1);\n scrollYState = signal<ScrollState>(-1);\n canScrollX = signal(false);\n canScrollY = signal(false);\n\n columnSizes = computed(() => {\n this.sizeTrigger();\n const colSignal = this.columns.signal();\n\n return colSignal.reduce((acc: string, col: any, index: number) => {\n const colEl = col;\n const colSize = colEl.getAttribute('size');\n const last = index === colSignal.length - 1;\n\n if (colSize) {\n return `${acc} ${colSize}`;\n }\n\n if (colEl.classList.contains('sticky') || colEl.classList.contains('sticky-end')) {\n return `${acc} min-content`;\n }\n\n if (last) {\n return `${acc} 1fr`;\n }\n\n return `${acc} 1fr`;\n }, '');\n });\n\n updateColumnSizes() {\n this.sizeTrigger.set(!this.sizeTrigger());\n }\n\n onScroll(): void {\n this.#checkScroll();\n }\n\n @HostListener('window:resize', ['$event'])\n onResize(event: Event) {\n this.#checkScroll();\n }\n\n ngAfterViewInit() {\n queueMicrotask(() => this.#checkScroll());\n }\n\n e = effect(() => {\n const sortByColumn = this.sortByColumn();\n\n if (sortByColumn === null) {\n if (!this.#initialDataSet()) {\n this.#initialData = this.data();\n this.#initialDataSet.set(true);\n }\n\n return this.dataChange.emit(structuredClone(this.#initialData));\n }\n\n const column = sortByColumn.startsWith('-') ? sortByColumn.slice(1) : sortByColumn;\n const isDescending = sortByColumn.startsWith('-');\n\n const sortedData = this.data().sort((a: any, b: any) => {\n const valueA = a[column] as any;\n const valueB = b[column] as any;\n\n let comparison = 0;\n\n if (typeof valueA === 'number' && typeof valueB === 'number') {\n comparison = valueA - valueB;\n }\n\n if (valueA instanceof Date && valueB instanceof Date) {\n comparison = valueA.getTime() - valueB.getTime();\n }\n\n if (typeof valueA === 'string' && typeof valueB === 'string') {\n comparison = valueA.localeCompare(valueB, undefined, { sensitivity: 'base' });\n }\n\n return isDescending ? -comparison : comparison;\n });\n\n this.dataChange.emit(sortedData);\n });\n\n toggleSort(column: string) {\n const currentSort = this.sortByColumn();\n const sortDir = currentSort === column ? `-${column}` : currentSort === `-${column}` ? null : column;\n\n this.sortByColumn.set(sortDir);\n }\n\n #checkScroll(): void {\n const element = this.#el.nativeElement as HTMLElement;\n let nextXState: ScrollState = -1;\n let nextYState: ScrollState = -1;\n\n const canScrollX = element.scrollWidth > element.clientWidth + SCROLL_TOLERANCE;\n\n if (canScrollX) {\n const isAtStartX = element.scrollLeft <= SCROLL_TOLERANCE;\n const isAtEndX = element.scrollWidth - (element.scrollLeft + element.clientWidth) < SCROLL_TOLERANCE;\n\n if (isAtEndX) {\n nextXState = 1;\n } else if (!isAtStartX) {\n nextXState = 0;\n }\n }\n\n this.scrollXState.set(nextXState);\n this.canScrollX.set(canScrollX);\n\n const canScrollY = element.scrollHeight > element.clientHeight + SCROLL_TOLERANCE;\n\n if (canScrollY) {\n const isAtStartY = element.scrollTop <= SCROLL_TOLERANCE;\n const isAtEndY = element.scrollHeight - (element.scrollTop + element.clientHeight) < SCROLL_TOLERANCE;\n\n if (isAtEndY) {\n nextYState = 1;\n } else if (!isAtStartY) {\n nextYState = 0;\n }\n }\n\n this.scrollYState.set(nextYState);\n this.canScrollY.set(canScrollY);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -93,7 +93,7 @@ class ShipThemeToggle {
93
93
  <sh-icon class="small-icon">moon-bold</sh-icon>
94
94
  }
95
95
  </button>
96
- `, isInline: true, styles: ["ship-theme-toggle{display:flex;align-items:center;justify-content:center;position:relative}ship-theme-toggle [shButton].small sh-icon.small-icon{font-size:.625rem}ship-theme-toggle:has(sh-icon.small-icon) [shButton].small{gap:0}ship-theme-toggle:has(sh-icon.small-icon) sh-icon:first-child{transform:translate(-.0625rem,-.25rem)}ship-theme-toggle:has(sh-icon.small-icon) sh-icon:last-child{transform:translate(.0625rem,.25rem)}ship-theme-toggle:has(sh-icon.small-icon):after{content:\"\";height:1rem;width:1px;background:var(--base-12);position:absolute;inset:0;margin:auto;transform:rotate(30deg)}\n"], dependencies: [{ kind: "component", type: ShipIcon, selector: "sh-icon", inputs: ["color", "size"] }, { kind: "component", type: ShipButton, selector: "[shButton]", inputs: ["color", "variant", "size", "readonly"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
96
+ `, isInline: true, styles: ["ship-theme-toggle{display:flex;align-items:center;justify-content:center;position:relative}ship-theme-toggle [shButton].small sh-icon.small-icon{font-size:.625rem}ship-theme-toggle:has(sh-icon.small-icon) [shButton].small{gap:0}ship-theme-toggle:has(sh-icon.small-icon) sh-icon:first-child{transform:translate(-.0625rem,-.25rem)}ship-theme-toggle:has(sh-icon.small-icon) sh-icon:last-child{transform:translate(.0625rem,.25rem)}ship-theme-toggle:has(sh-icon.small-icon):after{content:\"\";height:1rem;width:1px;background:var(--base-12);position:absolute;inset:0;margin:auto;transform:rotate(30deg)}\n"], dependencies: [{ kind: "component", type: ShipIcon, selector: "sh-icon", inputs: ["color", "size"] }, { kind: "component", type: ShipButton, selector: "[shButton]", inputs: ["color", "variant", "size", "readonly", "noBg"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
97
97
  }
98
98
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipThemeToggle, decorators: [{
99
99
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"ship-ui-core-ship-theme-toggle.mjs","sources":["../../../projects/ship-ui/ship-theme-toggle/ship-theme-state.ts","../../../projects/ship-ui/ship-theme-toggle/ship-theme-toggle.ts","../../../projects/ship-ui/ship-theme-toggle/ship-ui-core-ship-theme-toggle.ts"],"sourcesContent":["import { isPlatformServer } from '@angular/common';\nimport { DOCUMENT, effect, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\n\nexport type ShipThemeOption = 'light' | 'dark' | null;\nexport const THEME_ORDER: ShipThemeOption[] = ['light', 'dark', null];\n\nimport { InjectionToken } from '@angular/core';\n\nexport const WINDOW = new InjectionToken<Window>('WindowToken', {\n providedIn: 'root',\n factory: () => (typeof window !== 'undefined' ? window : ({} as Window)),\n});\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ShipThemeState {\n #document = inject(DOCUMENT);\n #window = inject(WINDOW);\n #platformId = inject(PLATFORM_ID);\n #storedDarkMode = this.localStorage()?.getItem('shipTheme') as ShipThemeOption;\n #theme = signal<ShipThemeOption>(this.#storedDarkMode);\n\n theme = this.#theme.asReadonly();\n\n darkModeEffect = effect(() => {\n const theme = this.#theme();\n\n if (theme === null) {\n this.#document.documentElement.classList.remove('dark');\n this.#document.documentElement.classList.remove('light');\n return;\n }\n\n if (theme === 'dark') {\n this.#document.documentElement.classList.add('dark');\n this.#document.documentElement.classList.remove('light');\n } else {\n this.#document.documentElement.classList.add('light');\n this.#document.documentElement.classList.remove('dark');\n }\n });\n\n localStorage() {\n if (isPlatformServer(this.#platformId)) return null;\n\n return this.#window.localStorage;\n }\n\n toggleTheme() {\n const nextTheme = this.#theme() === null ? THEME_ORDER[0] : THEME_ORDER[THEME_ORDER.indexOf(this.#theme()) + 1];\n\n this.setTheme(nextTheme);\n }\n\n setTheme(theme: ShipThemeOption) {\n if (theme === null) {\n this.localStorage()?.removeItem('shipTheme');\n this.#theme.set(null);\n return;\n }\n\n this.localStorage()?.setItem('shipTheme', theme);\n this.#theme.set(theme);\n }\n}\n","import { ChangeDetectionStrategy, Component, inject, ViewEncapsulation } from '@angular/core';\nimport { ShipButton } from '@ship-ui/core/ship-button';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipThemeOption, ShipThemeState } from './ship-theme-state';\n\n@Component({\n selector: 'ship-theme-toggle',\n styleUrl: './ship-theme-toggle.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipIcon, ShipButton],\n template: `\n <button shButton size=\"small\" (click)=\"toggleTheme()\">\n @if (theme() === 'dark') {\n <sh-icon>moon-bold</sh-icon>\n } @else if (theme() === 'light') {\n <sh-icon>sun-bold</sh-icon>\n } @else if (theme() === null) {\n <sh-icon class=\"small-icon\">sun-bold</sh-icon>\n <sh-icon class=\"small-icon\">moon-bold</sh-icon>\n }\n </button>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipThemeToggle {\n #themeState = inject(ShipThemeState);\n\n theme = this.#themeState.theme;\n\n toggleTheme() {\n this.#themeState.toggleTheme();\n }\n\n setTheme(theme: ShipThemeOption) {\n this.#themeState.setTheme(theme);\n }\n}\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-theme-toggle.mjs","sources":["../../../projects/ship-ui/ship-theme-toggle/ship-theme-state.ts","../../../projects/ship-ui/ship-theme-toggle/ship-theme-toggle.ts","../../../projects/ship-ui/ship-theme-toggle/ship-ui-core-ship-theme-toggle.ts"],"sourcesContent":["import { isPlatformServer } from '@angular/common';\nimport { DOCUMENT, effect, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\n\nexport type ShipThemeOption = 'light' | 'dark' | null;\nexport const THEME_ORDER: ShipThemeOption[] = ['light', 'dark', null];\n\nimport { InjectionToken } from '@angular/core';\n\nexport const WINDOW = new InjectionToken<Window>('WindowToken', {\n providedIn: 'root',\n factory: () => (typeof window !== 'undefined' ? window : ({} as Window)),\n});\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ShipThemeState {\n #document = inject(DOCUMENT);\n #window = inject(WINDOW);\n #platformId = inject(PLATFORM_ID);\n #storedDarkMode = this.localStorage()?.getItem('shipTheme') as ShipThemeOption;\n #theme = signal<ShipThemeOption>(this.#storedDarkMode);\n\n theme = this.#theme.asReadonly();\n\n darkModeEffect = effect(() => {\n const theme = this.#theme();\n\n if (theme === null) {\n this.#document.documentElement.classList.remove('dark');\n this.#document.documentElement.classList.remove('light');\n return;\n }\n\n if (theme === 'dark') {\n this.#document.documentElement.classList.add('dark');\n this.#document.documentElement.classList.remove('light');\n } else {\n this.#document.documentElement.classList.add('light');\n this.#document.documentElement.classList.remove('dark');\n }\n });\n\n localStorage() {\n if (isPlatformServer(this.#platformId)) return null;\n\n return this.#window.localStorage;\n }\n\n toggleTheme() {\n const nextTheme = this.#theme() === null ? THEME_ORDER[0] : THEME_ORDER[THEME_ORDER.indexOf(this.#theme()) + 1];\n\n this.setTheme(nextTheme);\n }\n\n setTheme(theme: ShipThemeOption) {\n if (theme === null) {\n this.localStorage()?.removeItem('shipTheme');\n this.#theme.set(null);\n return;\n }\n\n this.localStorage()?.setItem('shipTheme', theme);\n this.#theme.set(theme);\n }\n}\n","import { ChangeDetectionStrategy, Component, inject, ViewEncapsulation } from '@angular/core';\nimport { ShipButton } from '@ship-ui/core/ship-button';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipThemeOption, ShipThemeState } from './ship-theme-state';\n\n@Component({\n selector: 'ship-theme-toggle',\n styleUrl: './ship-theme-toggle.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipIcon, ShipButton],\n template: `\n <button shButton size=\"small\" (click)=\"toggleTheme()\">\n @if (theme() === 'dark') {\n <sh-icon>moon-bold</sh-icon>\n } @else if (theme() === 'light') {\n <sh-icon>sun-bold</sh-icon>\n } @else if (theme() === null) {\n <sh-icon class=\"small-icon\">sun-bold</sh-icon>\n <sh-icon class=\"small-icon\">moon-bold</sh-icon>\n }\n </button>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipThemeToggle {\n #themeState = inject(ShipThemeState);\n\n theme = this.#themeState.theme;\n\n toggleTheme() {\n this.#themeState.toggleTheme();\n }\n\n setTheme(theme: ShipThemeOption) {\n this.#themeState.setTheme(theme);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ship-ui/core",
3
3
  "license": "MIT",
4
- "version": "0.22.3",
4
+ "version": "0.22.5",
5
5
  "peerDependencies": {
6
6
  "@angular/common": ">=20",
7
7
  "@angular/core": ">=20",
@@ -142,6 +142,10 @@
142
142
  "types": "./types/ship-ui-core-ship-icon.d.ts",
143
143
  "default": "./fesm2022/ship-ui-core-ship-icon.mjs"
144
144
  },
145
+ "./ship-kbd": {
146
+ "types": "./types/ship-ui-core-ship-kbd.d.ts",
147
+ "default": "./fesm2022/ship-ui-core-ship-kbd.mjs"
148
+ },
145
149
  "./ship-list": {
146
150
  "types": "./types/ship-ui-core-ship-list.d.ts",
147
151
  "default": "./fesm2022/ship-ui-core-ship-list.mjs"
@@ -182,6 +186,10 @@
182
186
  "types": "./types/ship-ui-core-ship-spinner.d.ts",
183
187
  "default": "./fesm2022/ship-ui-core-ship-spinner.mjs"
184
188
  },
189
+ "./ship-spotlight": {
190
+ "types": "./types/ship-ui-core-ship-spotlight.d.ts",
191
+ "default": "./fesm2022/ship-ui-core-ship-spotlight.mjs"
192
+ },
185
193
  "./ship-stepper": {
186
194
  "types": "./types/ship-ui-core-ship-stepper.d.ts",
187
195
  "default": "./fesm2022/ship-ui-core-ship-stepper.mjs"
@@ -5,9 +5,10 @@ declare class ShipButton {
5
5
  variant: _angular_core.InputSignal<"" | "simple" | "outlined" | "flat" | "raised" | null>;
6
6
  size: _angular_core.InputSignal<"" | "small" | "xsmall" | null>;
7
7
  readonly: _angular_core.InputSignal<boolean>;
8
+ noBg: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
8
9
  hostClasses: _angular_core.Signal<string>;
9
10
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShipButton, never>;
10
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShipButton, "[shButton]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
11
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShipButton, "[shButton]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "noBg": { "alias": "noBg"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
11
12
  }
12
13
 
13
14
  export { ShipButton };
@@ -7,9 +7,10 @@ declare class ShipChip {
7
7
  sharp: _angular_core.InputSignal<boolean | undefined>;
8
8
  dynamic: _angular_core.InputSignal<boolean | undefined>;
9
9
  readonly: _angular_core.InputSignal<boolean>;
10
+ noBg: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
10
11
  hostClasses: _angular_core.Signal<string>;
11
12
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShipChip, never>;
12
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShipChip, "sh-chip", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "sharp": { "alias": "sharp"; "required": false; "isSignal": true; }; "dynamic": { "alias": "dynamic"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
13
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShipChip, "sh-chip", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "sharp": { "alias": "sharp"; "required": false; "isSignal": true; }; "dynamic": { "alias": "dynamic"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "noBg": { "alias": "noBg"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
13
14
  }
14
15
 
15
16
  export { ShipChip };
@@ -0,0 +1,19 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ declare class ShipKbd {
4
+ #private;
5
+ meta: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
6
+ shift: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
7
+ alt: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
8
+ ctrl: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
9
+ enter: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
10
+ escape: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
11
+ backspace: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
12
+ isMac: _angular_core.Signal<boolean>;
13
+ hasContent: _angular_core.Signal<boolean>;
14
+ displayKeys: _angular_core.Signal<string[]>;
15
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShipKbd, never>;
16
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShipKbd, "sh-kbd, [sh-kbd]", never, { "meta": { "alias": "meta"; "required": false; "isSignal": true; }; "shift": { "alias": "shift"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "ctrl": { "alias": "ctrl"; "required": false; "isSignal": true; }; "enter": { "alias": "enter"; "required": false; "isSignal": true; }; "escape": { "alias": "escape"; "required": false; "isSignal": true; }; "backspace": { "alias": "backspace"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
17
+ }
18
+
19
+ export { ShipKbd };
@@ -56,6 +56,7 @@ declare class ShipSelect {
56
56
  _inputValue: string;
57
57
  inputValueEffect: _angular_core.EffectRef;
58
58
  inputRefElEffect: _angular_core.EffectRef;
59
+ inputReadonlyEffect: _angular_core.EffectRef;
59
60
  selectedLabels: _angular_core.Signal<string>;
60
61
  inputState: _angular_core.Signal<"selected" | "loading" | "open-searching" | "open" | "searching" | "closed">;
61
62
  hasSearch: _angular_core.Signal<boolean>;
@@ -0,0 +1,83 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, ElementRef, Provider, OutputEmitterRef } from '@angular/core';
3
+
4
+ interface ShipSpotlightItem {
5
+ id: string;
6
+ label: string;
7
+ category?: string;
8
+ description?: string;
9
+ icon?: string;
10
+ shortcut?: string;
11
+ data?: any;
12
+ }
13
+ interface ShipSpotlightServiceOptions {
14
+ items?: ShipSpotlightItem[];
15
+ placeholder?: string;
16
+ shortcut?: string;
17
+ customFilter?: boolean;
18
+ searchQuery?: string;
19
+ }
20
+ interface ShipSpotlightConfig {
21
+ defaultItems?: ShipSpotlightItem[];
22
+ enableShortcuts?: boolean;
23
+ }
24
+ declare const SHIP_SPOTLIGHT_CONFIG: InjectionToken<ShipSpotlightConfig>;
25
+ declare function provideShipSpotlight(config: ShipSpotlightConfig): Provider;
26
+ declare class ShipSpotlight {
27
+ #private;
28
+ inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
29
+ resultsRef: _angular_core.Signal<ElementRef<HTMLDivElement> | undefined>;
30
+ data: _angular_core.InputSignal<ShipSpotlightServiceOptions | undefined>;
31
+ items: _angular_core.InputSignal<ShipSpotlightItem[]>;
32
+ placeholder: _angular_core.InputSignal<string>;
33
+ customFilter: _angular_core.InputSignal<boolean>;
34
+ searchQuery: _angular_core.ModelSignal<string>;
35
+ itemSelected: _angular_core.OutputEmitterRef<ShipSpotlightItem>;
36
+ closed: _angular_core.OutputEmitterRef<void>;
37
+ mergedItems: _angular_core.Signal<ShipSpotlightItem[]>;
38
+ mergedPlaceholder: _angular_core.Signal<string>;
39
+ mergedCustomFilter: _angular_core.Signal<boolean>;
40
+ activeOptionIndex: _angular_core.WritableSignal<number>;
41
+ flatFilteredItems: _angular_core.Signal<ShipSpotlightItem[]>;
42
+ groupedFilteredItems: _angular_core.Signal<{
43
+ category: string;
44
+ items: {
45
+ item: ShipSpotlightItem;
46
+ flatIndex: number;
47
+ }[];
48
+ }[]>;
49
+ constructor();
50
+ validateItemsEffect: _angular_core.EffectRef;
51
+ onSearchInput(event: Event): void;
52
+ clearSearch(): void;
53
+ onKeyDown(event: KeyboardEvent): void;
54
+ selectItem(item: ShipSpotlightItem): void;
55
+ scrollToActiveItem(): void;
56
+ parseShortcutKeys(shortcut: string): string[];
57
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShipSpotlight, never>;
58
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShipSpotlight, "sh-spotlight", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "customFilter": { "alias": "customFilter"; "required": false; "isSignal": true; }; "searchQuery": { "alias": "searchQuery"; "required": false; "isSignal": true; }; }, { "searchQuery": "searchQueryChange"; "itemSelected": "itemSelected"; "closed": "closed"; }, never, never, true, never>;
59
+ }
60
+
61
+ interface ShipSpotlightInstance {
62
+ close: () => void;
63
+ itemSelected: OutputEmitterRef<ShipSpotlightItem>;
64
+ closed: OutputEmitterRef<any>;
65
+ }
66
+ declare class ShipSpotlightService {
67
+ #private;
68
+ globalItemSelected: _angular_core.Signal<ShipSpotlightItem | null>;
69
+ isShortcutsEnabled: _angular_core.Signal<boolean>;
70
+ hasOverwriteItems: _angular_core.Signal<boolean>;
71
+ constructor();
72
+ registerItems(items: ShipSpotlightItem[], overwrite?: boolean): () => void;
73
+ setContextualItems(items: ShipSpotlightItem[], overwrite?: boolean): void;
74
+ clearContextualItems(): void;
75
+ enableGlobalShortcuts(options?: Partial<ShipSpotlightServiceOptions>): void;
76
+ disableGlobalShortcuts(): void;
77
+ open(options?: ShipSpotlightServiceOptions): ShipSpotlightInstance;
78
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShipSpotlightService, never>;
79
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShipSpotlightService>;
80
+ }
81
+
82
+ export { SHIP_SPOTLIGHT_CONFIG, ShipSpotlight, ShipSpotlightService, provideShipSpotlight };
83
+ export type { ShipSpotlightConfig, ShipSpotlightInstance, ShipSpotlightItem, ShipSpotlightServiceOptions };