@cdevhub/ngx-tw 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +264 -49
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
- package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +24 -15
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +408 -215
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +144 -79
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +34 -20
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +195 -110
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +140 -73
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +393 -149
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +137 -71
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select.mjs +217 -122
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +44 -25
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +101 -51
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +11 -7
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +89 -55
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
- package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
- package/package.json +45 -20
- package/theme/index.css +10 -2
- package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
- package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
- package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
- package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
- package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
- package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
- package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
- package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
- package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
- package/types/cdevhub-ngx-tw-table.d.ts +30 -1
- package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
- package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
- package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
- package/types/cdevhub-ngx-tw.d.ts +7 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-button.mjs","sources":["../../../projects/ngx-tw/button/button.ts","../../../projects/ngx-tw/button/cdevhub-ngx-tw-button.ts"],"sourcesContent":["import {\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n type OnInit,\n} from '@angular/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the button. */\nexport type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'soft' | 'link';\n\nconst buttonVariants = tv({\n base: 'inline-flex items-center justify-center gap-1.5 rounded-md font-medium transition-colors duration-normal motion-reduce:transition-none cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n variants: {\n variant: {\n solid: '',\n outline: 'border',\n ghost: '',\n soft: '',\n link: 'underline-offset-4 hover:underline',\n },\n color: {\n primary: '',\n secondary: '',\n accent: '',\n neutral: '',\n info: '',\n success: '',\n warning: '',\n error: '',\n },\n size: {\n xs: 'px-2 py-1 text-xs',\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-sm',\n lg: 'px-5 py-2.5 text-base',\n xl: 'px-6 py-3 text-base',\n },\n disabled: {\n true: 'opacity-50 pointer-events-none',\n false: '',\n },\n loading: {\n true: 'pointer-events-none',\n false: '',\n },\n },\n compoundVariants: [\n // Solid variants use the semantic `${color}-solid` token pair so the\n // theme layer owns the AA-contrast bg/fg pairing for each color. Raw\n // `${color}-600` direct usage was violating CLAUDE.md and producing\n // sub-AA contrast for info / success in light mode.\n\n // ===== Primary =====\n { variant: 'solid', color: 'primary', class: 'bg-primary-solid text-on-primary hover:bg-primary-solid-hover' },\n { variant: 'outline', color: 'primary', class: 'border-primary-300 text-primary-700 hover:bg-primary-50' },\n { variant: 'ghost', color: 'primary', class: 'text-primary-700 hover:bg-primary-50' },\n { variant: 'soft', color: 'primary', class: 'bg-primary-50 text-primary-800 hover:bg-primary-100' },\n { variant: 'link', color: 'primary', class: 'text-primary-700' },\n\n // ===== Secondary =====\n { variant: 'solid', color: 'secondary', class: 'bg-secondary-solid text-on-secondary hover:bg-secondary-solid-hover' },\n { variant: 'outline', color: 'secondary', class: 'border-secondary-300 text-secondary-700 hover:bg-secondary-50' },\n { variant: 'ghost', color: 'secondary', class: 'text-secondary-700 hover:bg-secondary-50' },\n { variant: 'soft', color: 'secondary', class: 'bg-secondary-50 text-secondary-800 hover:bg-secondary-100' },\n { variant: 'link', color: 'secondary', class: 'text-secondary-700' },\n\n // ===== Accent =====\n { variant: 'solid', color: 'accent', class: 'bg-accent-solid text-on-accent hover:bg-accent-solid-hover' },\n { variant: 'outline', color: 'accent', class: 'border-accent-300 text-accent-700 hover:bg-accent-50' },\n { variant: 'ghost', color: 'accent', class: 'text-accent-700 hover:bg-accent-50' },\n { variant: 'soft', color: 'accent', class: 'bg-accent-50 text-accent-800 hover:bg-accent-100' },\n { variant: 'link', color: 'accent', class: 'text-accent-700' },\n\n // ===== Neutral ===== (subdued solid pairs surface-muted with text-fg; on-neutral is white and would be unreadable here)\n { variant: 'solid', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },\n { variant: 'outline', color: 'neutral', class: 'border-border text-fg hover:bg-surface-muted' },\n { variant: 'ghost', color: 'neutral', class: 'text-fg-muted hover:bg-surface-muted' },\n { variant: 'soft', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },\n { variant: 'link', color: 'neutral', class: 'text-fg-muted' },\n\n // ===== Info =====\n { variant: 'solid', color: 'info', class: 'bg-info-solid text-on-info hover:bg-info-solid-hover' },\n { variant: 'outline', color: 'info', class: 'border-info-300 text-info-700 hover:bg-info-50' },\n { variant: 'ghost', color: 'info', class: 'text-info-700 hover:bg-info-50' },\n { variant: 'soft', color: 'info', class: 'bg-info-50 text-info-800 hover:bg-info-100' },\n { variant: 'link', color: 'info', class: 'text-info-700' },\n\n // ===== Success =====\n { variant: 'solid', color: 'success', class: 'bg-success-solid text-on-success hover:bg-success-solid-hover' },\n { variant: 'outline', color: 'success', class: 'border-success-300 text-success-700 hover:bg-success-50' },\n { variant: 'ghost', color: 'success', class: 'text-success-700 hover:bg-success-50' },\n { variant: 'soft', color: 'success', class: 'bg-success-50 text-success-800 hover:bg-success-100' },\n { variant: 'link', color: 'success', class: 'text-success-700' },\n\n // ===== Warning =====\n { variant: 'solid', color: 'warning', class: 'bg-warning-solid text-on-warning hover:bg-warning-solid-hover' },\n { variant: 'outline', color: 'warning', class: 'border-warning-300 text-warning-700 hover:bg-warning-50' },\n { variant: 'ghost', color: 'warning', class: 'text-warning-700 hover:bg-warning-50' },\n { variant: 'soft', color: 'warning', class: 'bg-warning-50 text-warning-800 hover:bg-warning-100' },\n { variant: 'link', color: 'warning', class: 'text-warning-700' },\n\n // ===== Error =====\n { variant: 'solid', color: 'error', class: 'bg-error-solid text-on-error hover:bg-error-solid-hover' },\n { variant: 'outline', color: 'error', class: 'border-error-300 text-error-700 hover:bg-error-50' },\n { variant: 'ghost', color: 'error', class: 'text-error-700 hover:bg-error-50' },\n { variant: 'soft', color: 'error', class: 'bg-error-50 text-error-800 hover:bg-error-100' },\n { variant: 'link', color: 'error', class: 'text-error-700' },\n\n // ===== Link variant: strip padding =====\n { variant: 'link', size: 'xs', class: 'px-0 py-0' },\n { variant: 'link', size: 'sm', class: 'px-0 py-0' },\n { variant: 'link', size: 'md', class: 'px-0 py-0' },\n { variant: 'link', size: 'lg', class: 'px-0 py-0' },\n { variant: 'link', size: 'xl', class: 'px-0 py-0' },\n ],\n defaultVariants: {\n variant: 'solid',\n color: 'primary',\n size: 'md',\n disabled: false,\n loading: false,\n },\n}, {\n twMerge: true,\n});\n\n/**\n * Enhances a native `<button>` or `<a>` element with library styling, semantic\n * color/size variants, and disabled/loading states. The directive does not\n * expose a `clicked` output — bind `(click)` directly on the host element. When\n * `disabled` or `loading` is true, the directive intercepts clicks with\n * `preventDefault()` + `stopImmediatePropagation()` so the host handler does\n * not run.\n *\n * The directive owns no template, so visual loading affordances (spinner,\n * status text) are composed by the consumer — see the `loading` input.\n */\n@Directive({\n selector: '[twButton]',\n exportAs: 'twButton',\n host: {\n '[class]': 'classes()',\n '[attr.aria-disabled]': 'disabled() || loading() || null',\n '[attr.aria-busy]': 'loading() || null',\n '[attr.disabled]': 'isNativeButton() && (disabled() || loading()) ? true : null',\n '[attr.tabindex]': '!isNativeButton() && (disabled() || loading()) ? -1 : null',\n '(click)': 'handleClick($event)',\n },\n})\nexport class ButtonDirective implements OnInit {\n /** Controls the visual style. Defaults to `'solid'`. */\n readonly variant = input<ButtonVariant>('solid');\n\n /** Sets the semantic color palette. Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Controls the size (padding, font size, icon size). Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, prevents interaction and applies muted styling. Defaults to `false`. */\n readonly disabled = input(false);\n\n /**\n * When true, blocks clicks and sets `aria-busy=\"true\"`. Defaults to `false`.\n * The directive does not render a spinner or status text — compose them in\n * the projected content:\n *\n * ```html\n * <button twButton [loading]=\"saving()\">\n * @if (saving()) {\n * <tw-spinner twButtonIcon size=\"sm\" />\n * <span class=\"sr-only\">Saving…</span>\n * }\n * Save\n * </button>\n * ```\n *\n * The `sr-only` text gives assistive tech an explicit status announcement\n * to pair with the `aria-busy` attribute.\n */\n readonly loading = input(false);\n\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly isNativeButton = computed(\n () => this.elementRef.nativeElement.tagName === 'BUTTON',\n );\n\n readonly classes = computed(() =>\n buttonVariants({\n variant: this.variant(),\n color: this.color(),\n size: this.size(),\n disabled: this.disabled() || this.loading(),\n loading: this.loading(),\n }),\n );\n\n ngOnInit(): void {\n this.focusMonitor.monitor(this.elementRef);\n this.destroyRef.onDestroy(() => {\n this.focusMonitor.stopMonitoring(this.elementRef);\n });\n }\n\n handleClick(event: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n\n@Directive({\n selector: '[twButtonIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class ButtonIconDirective {\n /**\n * Position of the icon relative to the button label. Defaults to `'leading'`.\n *\n * The empty-string member of the union is load-bearing: Angular binds `''` to\n * the input when the selector is used as a bare attribute (`<svg twButtonIcon>`),\n * which is the canonical \"leading\" usage. Templates that omit a value still\n * have the directive attached and resolve to leading placement at runtime via\n * the `=== 'trailing'` check below.\n */\n readonly twButtonIcon = input<'' | 'leading' | 'trailing'>('leading');\n\n private readonly button = inject(ButtonDirective);\n\n readonly classes = computed(() => {\n const size = this.button.size();\n const iconSize = size === 'xs' || size === 'sm' ? 'size-4' : 'size-5';\n // `order-last` only takes effect when the button host is a flex container —\n // `ButtonDirective`'s base class includes `inline-flex`, which is the\n // contract this directive relies on for trailing-icon placement.\n const order = this.twButtonIcon() === 'trailing' ? 'order-last' : '';\n return [iconSize, 'shrink-0', order].filter(Boolean).join(' ');\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-button.mjs","sources":["../../../projects/ngx-tw/button/button.ts","../../../projects/ngx-tw/button/cdevhub-ngx-tw-button.ts"],"sourcesContent":["import {\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n type OnInit,\n} from '@angular/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the button. */\nexport type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'soft' | 'link';\n\nconst buttonVariants = tv({\n base: 'inline-flex items-center justify-center gap-1.5 rounded-md font-medium transition-colors duration-normal motion-reduce:transition-none cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n variants: {\n variant: {\n solid: '',\n outline: 'border',\n ghost: '',\n soft: '',\n link: 'underline-offset-4 hover:underline',\n },\n color: {\n primary: '',\n secondary: '',\n accent: '',\n neutral: '',\n info: '',\n success: '',\n warning: '',\n error: '',\n },\n size: {\n xs: 'px-2 py-1 text-xs',\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-sm',\n lg: 'px-5 py-2.5 text-base',\n xl: 'px-6 py-3 text-base',\n },\n disabled: {\n true: 'opacity-50 pointer-events-none',\n false: '',\n },\n loading: {\n true: 'pointer-events-none',\n false: '',\n },\n },\n compoundVariants: [\n // Solid variants use the semantic `${color}-solid` token pair so the\n // theme layer owns the AA-contrast bg/fg pairing for each color. Raw\n // `${color}-600` direct usage was violating CLAUDE.md and producing\n // sub-AA contrast for info / success in light mode.\n\n // ===== Primary =====\n { variant: 'solid', color: 'primary', class: 'bg-primary-solid text-on-primary hover:bg-primary-solid-hover' },\n { variant: 'outline', color: 'primary', class: 'border-primary-300 text-primary-700 hover:bg-primary-50' },\n { variant: 'ghost', color: 'primary', class: 'text-primary-700 hover:bg-primary-50' },\n { variant: 'soft', color: 'primary', class: 'bg-primary-50 text-primary-800 hover:bg-primary-100' },\n { variant: 'link', color: 'primary', class: 'text-primary-700' },\n\n // ===== Secondary =====\n { variant: 'solid', color: 'secondary', class: 'bg-secondary-solid text-on-secondary hover:bg-secondary-solid-hover' },\n { variant: 'outline', color: 'secondary', class: 'border-secondary-300 text-secondary-700 hover:bg-secondary-50' },\n { variant: 'ghost', color: 'secondary', class: 'text-secondary-700 hover:bg-secondary-50' },\n { variant: 'soft', color: 'secondary', class: 'bg-secondary-50 text-secondary-800 hover:bg-secondary-100' },\n { variant: 'link', color: 'secondary', class: 'text-secondary-700' },\n\n // ===== Accent =====\n { variant: 'solid', color: 'accent', class: 'bg-accent-solid text-on-accent hover:bg-accent-solid-hover' },\n { variant: 'outline', color: 'accent', class: 'border-accent-300 text-accent-700 hover:bg-accent-50' },\n { variant: 'ghost', color: 'accent', class: 'text-accent-700 hover:bg-accent-50' },\n { variant: 'soft', color: 'accent', class: 'bg-accent-50 text-accent-800 hover:bg-accent-100' },\n { variant: 'link', color: 'accent', class: 'text-accent-700' },\n\n // ===== Neutral ===== (subdued solid pairs surface-muted with text-fg; on-neutral is white and would be unreadable here)\n { variant: 'solid', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },\n { variant: 'outline', color: 'neutral', class: 'border-border text-fg hover:bg-surface-muted' },\n { variant: 'ghost', color: 'neutral', class: 'text-fg-muted hover:bg-surface-muted' },\n { variant: 'soft', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },\n { variant: 'link', color: 'neutral', class: 'text-fg-muted' },\n\n // ===== Info =====\n { variant: 'solid', color: 'info', class: 'bg-info-solid text-on-info hover:bg-info-solid-hover' },\n { variant: 'outline', color: 'info', class: 'border-info-300 text-info-700 hover:bg-info-50' },\n { variant: 'ghost', color: 'info', class: 'text-info-700 hover:bg-info-50' },\n { variant: 'soft', color: 'info', class: 'bg-info-50 text-info-800 hover:bg-info-100' },\n { variant: 'link', color: 'info', class: 'text-info-700' },\n\n // ===== Success =====\n { variant: 'solid', color: 'success', class: 'bg-success-solid text-on-success hover:bg-success-solid-hover' },\n { variant: 'outline', color: 'success', class: 'border-success-300 text-success-700 hover:bg-success-50' },\n { variant: 'ghost', color: 'success', class: 'text-success-700 hover:bg-success-50' },\n { variant: 'soft', color: 'success', class: 'bg-success-50 text-success-800 hover:bg-success-100' },\n { variant: 'link', color: 'success', class: 'text-success-700' },\n\n // ===== Warning =====\n { variant: 'solid', color: 'warning', class: 'bg-warning-solid text-on-warning hover:bg-warning-solid-hover' },\n { variant: 'outline', color: 'warning', class: 'border-warning-300 text-warning-700 hover:bg-warning-50' },\n { variant: 'ghost', color: 'warning', class: 'text-warning-700 hover:bg-warning-50' },\n { variant: 'soft', color: 'warning', class: 'bg-warning-50 text-warning-800 hover:bg-warning-100' },\n { variant: 'link', color: 'warning', class: 'text-warning-700' },\n\n // ===== Error =====\n { variant: 'solid', color: 'error', class: 'bg-error-solid text-on-error hover:bg-error-solid-hover' },\n { variant: 'outline', color: 'error', class: 'border-error-300 text-error-700 hover:bg-error-50' },\n { variant: 'ghost', color: 'error', class: 'text-error-700 hover:bg-error-50' },\n { variant: 'soft', color: 'error', class: 'bg-error-50 text-error-800 hover:bg-error-100' },\n { variant: 'link', color: 'error', class: 'text-error-700' },\n\n // ===== Link variant: strip padding =====\n { variant: 'link', size: 'xs', class: 'px-0 py-0' },\n { variant: 'link', size: 'sm', class: 'px-0 py-0' },\n { variant: 'link', size: 'md', class: 'px-0 py-0' },\n { variant: 'link', size: 'lg', class: 'px-0 py-0' },\n { variant: 'link', size: 'xl', class: 'px-0 py-0' },\n ],\n defaultVariants: {\n variant: 'solid',\n color: 'primary',\n size: 'md',\n disabled: false,\n loading: false,\n },\n}, {\n twMerge: true,\n});\n\n/**\n * Enhances a native `<button>` or `<a>` element with library styling, semantic\n * color/size variants, and disabled/loading states. The directive does not\n * expose a `clicked` output — bind `(click)` directly on the host element. When\n * `disabled` or `loading` is true, the directive intercepts clicks with\n * `preventDefault()` + `stopImmediatePropagation()` so the host handler does\n * not run.\n *\n * The directive owns no template, so visual loading affordances (spinner,\n * status text) are composed by the consumer — see the `loading` input.\n */\n@Directive({\n selector: '[twButton]',\n exportAs: 'twButton',\n host: {\n '[class]': 'classes()',\n '[attr.aria-disabled]': 'disabled() || loading() || null',\n '[attr.aria-busy]': 'loading() || null',\n '[attr.disabled]': 'isNativeButton() && (disabled() || loading()) ? true : null',\n '[attr.tabindex]': '!isNativeButton() && (disabled() || loading()) ? -1 : null',\n '(click)': 'handleClick($event)',\n },\n})\nexport class ButtonDirective implements OnInit {\n /** Controls the visual style. Defaults to `'solid'`. */\n readonly variant = input<ButtonVariant>('solid');\n\n /** Sets the semantic color palette. Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Controls the size (padding, font size, icon size). Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, prevents interaction and applies muted styling. Defaults to `false`. */\n readonly disabled = input(false);\n\n /**\n * When true, blocks clicks and sets `aria-busy=\"true\"`. Defaults to `false`.\n * The directive does not render a spinner or status text — compose them in\n * the projected content:\n *\n * ```html\n * <button twButton [loading]=\"saving()\">\n * @if (saving()) {\n * <tw-spinner twButtonIcon size=\"sm\" />\n * <span class=\"sr-only\">Saving…</span>\n * }\n * Save\n * </button>\n * ```\n *\n * The `sr-only` text gives assistive tech an explicit status announcement\n * to pair with the `aria-busy` attribute.\n */\n readonly loading = input(false);\n\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly isNativeButton = computed(\n () => this.elementRef.nativeElement.tagName === 'BUTTON',\n );\n\n readonly classes = computed(() =>\n buttonVariants({\n variant: this.variant(),\n color: this.color(),\n size: this.size(),\n disabled: this.disabled() || this.loading(),\n loading: this.loading(),\n }),\n );\n\n ngOnInit(): void {\n this.focusMonitor.monitor(this.elementRef);\n this.destroyRef.onDestroy(() => {\n this.focusMonitor.stopMonitoring(this.elementRef);\n });\n }\n\n handleClick(event: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n\n@Directive({\n selector: '[twButtonIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class ButtonIconDirective {\n /**\n * Position of the icon relative to the button label. Defaults to `'leading'`.\n *\n * The empty-string member of the union is load-bearing: Angular binds `''` to\n * the input when the selector is used as a bare attribute (`<svg twButtonIcon>`),\n * which is the canonical \"leading\" usage. Templates that omit a value still\n * have the directive attached and resolve to leading placement at runtime via\n * the `=== 'trailing'` check below.\n */\n readonly twButtonIcon = input<'' | 'leading' | 'trailing'>('leading');\n\n private readonly button = inject(ButtonDirective);\n\n readonly classes = computed(() => {\n const size = this.button.size();\n const iconSize = size === 'xs' || size === 'sm' ? 'size-4' : 'size-5';\n // `order-last` only takes effect when the button host is a flex container —\n // `ButtonDirective`'s base class includes `inline-flex`, which is the\n // contract this directive relies on for trailing-icon placement.\n const order = this.twButtonIcon() === 'trailing' ? 'order-last' : '';\n return [iconSize, 'shrink-0', order].filter(Boolean).join(' ');\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -381,10 +381,10 @@ class LuxonDateAdapter extends DateAdapter {
|
|
|
381
381
|
}
|
|
382
382
|
return earlier;
|
|
383
383
|
}
|
|
384
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
385
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
384
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: LuxonDateAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
385
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: LuxonDateAdapter });
|
|
386
386
|
}
|
|
387
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
387
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: LuxonDateAdapter, decorators: [{
|
|
388
388
|
type: Injectable
|
|
389
389
|
}] });
|
|
390
390
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-calendar-luxon.mjs","sources":["../../../projects/ngx-tw/calendar/luxon/luxon-date-adapter.ts","../../../projects/ngx-tw/calendar/luxon/provide-luxon-date-adapter.ts","../../../projects/ngx-tw/calendar/luxon/cdevhub-ngx-tw-calendar-luxon.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { DateTime, Info, Settings } from 'luxon';\nimport { DateAdapter, TZ_OVERRIDE, type TwDateNameStyle } from '@cdevhub/ngx-tw/calendar';\n\n/**\n * Display-format descriptor used by `LuxonDateAdapter.format()` and\n * `LuxonDateAdapter.parse()`.\n *\n * Two shapes are supported:\n * - `{ format: 'yyyy-LL-dd' }` — a Luxon `toFormat`/`fromFormat` token string.\n * - `{ preset: DateTime.DATE_FULL }` — a Luxon preset (an `Intl.DateTimeFormatOptions` bag).\n *\n * If both are provided, `format` (the explicit token) wins.\n */\nexport interface TwLuxonDateFormat {\n /** Luxon token string consumed by `DateTime#toFormat` / `DateTime.fromFormat`. */\n readonly format?: string;\n /** Luxon preset (e.g. `DateTime.DATE_FULL`) consumed by `DateTime#toLocaleString`. */\n readonly preset?: Intl.DateTimeFormatOptions;\n}\n\n/**\n * Luxon-backed `DateAdapter`. Honors the calendar's `TZ_OVERRIDE` injection\n * token so `today()` resolves against the consumer-configured timezone, and\n * implements the §20.2 TZ-aware virtuals (`getTimezone`, `withTimezone`,\n * `isDST`, `resolveAmbiguous`).\n *\n * `create()` accepts **1-based** months (matching the abstract contract and\n * Luxon's `DateTime.fromObject({ month })` convention), while `getMonth()`\n * returns **0-based** months (also per the abstract contract — see\n * `NativeDateAdapter`).\n */\n@Injectable()\nexport class LuxonDateAdapter extends DateAdapter<DateTime> {\n /**\n * Optional per-instance timezone override (§4.3, §7.4). Resolved lazily so\n * the constructor stays SSR-safe — Luxon's default zone reads from the host\n * environment which we want to defer until first use.\n */\n private readonly _tzOverride = inject(TZ_OVERRIDE, { optional: true });\n\n /**\n * Locale is resolved lazily on first read so the constructor stays\n * SSR-safe (no `navigator` access at class-construction time — §31.1).\n */\n private _locale: string | null = null;\n\n private get locale(): string {\n if (this._locale !== null) return this._locale;\n this._locale =\n typeof navigator !== 'undefined' && typeof navigator.language === 'string'\n ? navigator.language\n : Settings.defaultLocale ?? 'en-US';\n return this._locale;\n }\n\n /**\n * Returns the configured timezone for new dates. Precedence: per-instance\n * `TZ_OVERRIDE` → Luxon's `Settings.defaultZone` → `'local'`.\n */\n private get zone(): string {\n if (this._tzOverride) return this._tzOverride;\n const def = Settings.defaultZone;\n // `Settings.defaultZone` is a `Zone` instance — fall back to its name.\n return def && typeof def !== 'string' ? def.name : 'local';\n }\n\n /** Builds a `DateTime` in the adapter's configured zone + locale. */\n private inZone(dt: DateTime): DateTime {\n return dt.setZone(this.zone).setLocale(this.locale);\n }\n\n today(): DateTime {\n return DateTime.now().setZone(this.zone).setLocale(this.locale).startOf('day');\n }\n\n /**\n * Constructs a `DateTime`. **`month` is 1-based** — `create(2026, 1, 1)`\n * yields January 1, 2026 at 00:00 in the adapter's configured zone.\n */\n create(year: number, month: number, day: number): DateTime {\n return DateTime.fromObject(\n { year, month, day },\n { zone: this.zone, locale: this.locale },\n );\n }\n\n clone(date: DateTime): DateTime {\n // `DateTime` is immutable; reconstructing preserves zone/locale and\n // matches the defensive-copy semantics of the abstract contract.\n return DateTime.fromMillis(date.toMillis(), {\n zone: date.zone,\n locale: date.locale ?? this.locale,\n });\n }\n\n setLocale(locale: string): void {\n this._locale = locale;\n }\n\n getLocale(): string {\n return this.locale;\n }\n\n getYear(date: DateTime): number {\n return date.year;\n }\n\n /**\n * Returns the **0-based** month (0 = January, 11 = December) to match the\n * abstract `DateAdapter` contract and the `NativeDateAdapter`. Luxon's\n * `DateTime.month` is 1-based, so we subtract one.\n */\n getMonth(date: DateTime): number {\n return date.month - 1;\n }\n\n getDate(date: DateTime): number {\n return date.day;\n }\n\n /**\n * Day of week mapped to the Sunday-based scheme used by the abstract\n * contract: `0 = Sunday`, `6 = Saturday`. Luxon's `weekday` is\n * `1 = Monday … 7 = Sunday`, so Sunday gets re-anchored to `0`.\n */\n getDayOfWeek(date: DateTime): number {\n return date.weekday % 7;\n }\n\n getNumDaysInMonth(date: DateTime): number {\n return date.daysInMonth ?? 0;\n }\n\n getHours(date: DateTime): number {\n return date.hour;\n }\n\n getMinutes(date: DateTime): number {\n return date.minute;\n }\n\n getSeconds(date: DateTime): number {\n return date.second;\n }\n\n withTime(date: DateTime, hours: number, minutes: number, seconds: number): DateTime {\n return date.set({ hour: hours, minute: minutes, second: seconds, millisecond: 0 });\n }\n\n /**\n * Locale-aware first day of week (§19.2). Mirrors `NativeDateAdapter` —\n * derives from `Intl.Locale.getWeekInfo()` when available, falling back to\n * Monday (`1`) when the locale is unknown to ICU. ICU/CLDR returns\n * `1=Monday … 7=Sunday`; we normalize to the project's `0=Sunday … 6=Saturday`\n * convention so both adapters report identical values for identical locales.\n */\n getFirstDayOfWeek(): number {\n if (typeof Intl !== 'undefined' && typeof Intl.Locale === 'function') {\n try {\n const l = new Intl.Locale(this.locale) as Intl.Locale & {\n getWeekInfo?: () => { firstDay: number };\n weekInfo?: { firstDay: number };\n };\n const info = (l.getWeekInfo?.() ?? l.weekInfo) as { firstDay: number } | undefined;\n if (info && typeof info.firstDay === 'number') {\n return info.firstDay === 7 ? 0 : info.firstDay;\n }\n } catch {\n return 1;\n }\n }\n return 1;\n }\n\n getMonthNames(style: TwDateNameStyle): string[] {\n return Info.months(style, { locale: this.locale });\n }\n\n /**\n * Day-of-week names starting at Sunday. Luxon's `Info.weekdays` starts at\n * Monday, so the array is rotated to put Sunday first to match the abstract\n * contract (and the native adapter).\n */\n getDayOfWeekNames(style: TwDateNameStyle): string[] {\n const monStart = Info.weekdays(style, { locale: this.locale });\n // `[Mon, Tue, Wed, Thu, Fri, Sat, Sun]` → `[Sun, Mon, Tue, Wed, Thu, Fri, Sat]`.\n return [monStart[6], ...monStart.slice(0, 6)];\n }\n\n override getDateNames(_style: TwDateNameStyle = 'short'): string[] {\n // Use a 31-day reference month to localize numerals where needed.\n const ref = DateTime.fromObject(\n { year: 2017, month: 1, day: 1 },\n { zone: 'utc', locale: this.locale },\n );\n return Array.from({ length: 31 }, (_, i) => ref.plus({ days: i }).toFormat('d'));\n }\n\n getYearName(date: DateTime): string {\n return date.toFormat('yyyy', { locale: this.locale });\n }\n\n /**\n * Formats a date for display.\n *\n * Accepts either a Luxon token string (e.g. `'yyyy-LL-dd'`), a\n * {@link TwLuxonDateFormat} descriptor, or a Luxon preset bag\n * (`Intl.DateTimeFormatOptions`). When no format is supplied the\n * adapter falls back to a locale-aware medium date.\n */\n format(date: DateTime, displayFormat: unknown): string {\n if (!this.isValid(date)) return '';\n const localized = date.setLocale(this.locale);\n if (typeof displayFormat === 'string') {\n return localized.toFormat(displayFormat);\n }\n if (displayFormat && typeof displayFormat === 'object') {\n const desc = displayFormat as TwLuxonDateFormat;\n if (typeof desc.format === 'string') {\n return localized.toFormat(desc.format);\n }\n if (desc.preset) {\n return localized.toLocaleString(desc.preset);\n }\n // Treat a bare option-bag as a preset.\n return localized.toLocaleString(displayFormat as Intl.DateTimeFormatOptions);\n }\n return localized.toLocaleString(DateTime.DATE_MED);\n }\n\n addYears(date: DateTime, years: number): DateTime {\n return date.plus({ years });\n }\n\n addMonths(date: DateTime, months: number): DateTime {\n return date.plus({ months });\n }\n\n addDays(date: DateTime, days: number): DateTime {\n return date.plus({ days });\n }\n\n override addHours(date: DateTime, hours: number): DateTime {\n return date.plus({ hours });\n }\n\n addMinutes(date: DateTime, minutes: number): DateTime {\n return date.plus({ minutes });\n }\n\n compare(first: DateTime, second: DateTime): number {\n // Compare by calendar fields (year/month/day) so two `DateTime` instances\n // representing the same wall-clock date in different zones still compare\n // equal — matches the native adapter's behaviour.\n return (\n first.year - second.year ||\n first.month - second.month ||\n first.day - second.day\n );\n }\n\n sameDate(\n first: DateTime | null | undefined,\n second: DateTime | null | undefined,\n ): boolean {\n if (first && second) {\n const f = this.isValid(first);\n const s = this.isValid(second);\n if (f && s) return this.compare(first, second) === 0;\n return f === s;\n }\n return first === second;\n }\n\n /**\n * Start-of-day normalization in the adapter's zone. Luxon's `startOf('day')`\n * is DST-aware — on spring-forward days it returns the wall-clock instant the\n * zone considers the first valid moment of the day.\n */\n startOfDay(date: DateTime): DateTime {\n return date.setZone(this.zone).startOf('day');\n }\n\n isValid(date: DateTime): boolean {\n return date instanceof DateTime && date.isValid;\n }\n\n /** Returns Luxon's invalid sentinel (an invalid `DateTime`). */\n invalid(): DateTime {\n return DateTime.invalid('invalid');\n }\n\n /**\n * Parses a value into a `DateTime`. Accepts:\n * - `DateTime` (cloned),\n * - JS `Date` (re-anchored to the adapter's zone + locale),\n * - number (epoch milliseconds),\n * - string — when `parseFormat` is a Luxon token, uses `fromFormat`;\n * otherwise parses strict ISO 8601 only.\n *\n * The free-form-string path is intentionally narrow: SQL and RFC 2822\n * fallbacks were dropped so the Luxon adapter's acceptance surface matches\n * `NativeDateAdapter.parse()` (which only accepts strings parseable by\n * `new Date(value)`). Callers that need bespoke string formats should pass\n * an explicit `parseFormat` token.\n *\n * Returns `null` on empty input or unrecognised value types, mirroring the\n * native adapter's contract.\n */\n parse(value: unknown, parseFormat?: unknown): DateTime | null {\n if (value == null) return null;\n if (value instanceof DateTime) {\n return value.isValid ? this.clone(value) : null;\n }\n if (value instanceof Date) {\n const dt = DateTime.fromJSDate(value, { zone: this.zone }).setLocale(this.locale);\n return dt.isValid ? dt : null;\n }\n if (typeof value === 'number') {\n const dt = DateTime.fromMillis(value, { zone: this.zone, locale: this.locale });\n return dt.isValid ? dt : null;\n }\n if (typeof value === 'string') {\n if (!value.trim()) return null;\n const opts = { zone: this.zone, locale: this.locale };\n if (typeof parseFormat === 'string') {\n const dt = DateTime.fromFormat(value, parseFormat, opts);\n return dt.isValid ? dt : null;\n }\n if (parseFormat && typeof parseFormat === 'object') {\n const desc = parseFormat as TwLuxonDateFormat;\n if (typeof desc.format === 'string') {\n const dt = DateTime.fromFormat(value, desc.format, opts);\n return dt.isValid ? dt : null;\n }\n }\n const iso = DateTime.fromISO(value, opts);\n return iso.isValid ? iso : null;\n }\n return null;\n }\n\n /**\n * Coerce an incoming form value. Returns `null` for empty input, an invalid\n * `DateTime` sentinel for malformed input (so validators can flag it), and a\n * cloned valid `DateTime` otherwise.\n */\n deserialize(value: unknown): DateTime | null {\n if (value == null || value === '') return null;\n if (value instanceof DateTime) {\n return value.isValid ? this.clone(value) : this.invalid();\n }\n const parsed = this.parse(value);\n if (parsed && parsed.isValid) return parsed;\n return this.invalid();\n }\n\n /**\n * ISO 8601 date serialization (`YYYY-MM-DD`). Calendar dates have no\n * time component — `toIso` returns just the date portion.\n */\n toIso(date: DateTime): string {\n return date.toFormat('yyyy-LL-dd');\n }\n\n /**\n * Parses an ISO-8601 string to a `DateTime`. Overrides the base\n * implementation to use Luxon's optimised `fromISO` parser.\n */\n override fromIso(iso: string): DateTime | null {\n if (typeof iso !== 'string' || !iso.trim()) return null;\n const dt = DateTime.fromISO(iso, { zone: this.zone, locale: this.locale });\n return dt.isValid ? dt : null;\n }\n\n // ---------------------------------------------------------------------------\n // TZ-aware virtuals (§20.2). Luxon's `DateTime` carries zone information, so\n // these are real implementations rather than the floating no-ops in the base\n // class.\n // ---------------------------------------------------------------------------\n\n /** Returns the adapter's configured IANA zone name (e.g. `'America/New_York'`). */\n override getTimezone(): string {\n return this.zone;\n }\n\n /** Returns a copy of `date` reinterpreted in `tz`. */\n override withTimezone(date: DateTime, tz: string): DateTime {\n return date.setZone(tz);\n }\n\n /** Whether `date` is currently observing daylight-saving time in its zone. */\n override isDST(date: DateTime): boolean {\n return date.isInDST;\n }\n\n /**\n * Resolves an ambiguous wall-clock time during DST fall-back. On fall-back\n * days a single wall-clock hour repeats — e.g. 2024-11-03 01:30 in\n * `America/New_York` happens once at offset -04:00 (EDT) and again at\n * offset -05:00 (EST). Luxon's `DateTime.fromObject({...}, { zone })` always\n * returns the **earlier** of the two candidates, so we reconstruct the\n * \"later\" occurrence explicitly: rebuild the candidate at the date's\n * wall-clock fields (anchoring it on the earlier occurrence) and add one\n * hour to land on the same wall-clock's second occurrence in the\n * post-fall-back offset.\n *\n * Non-ambiguous wall-clocks return unchanged for both `prefer` values:\n * after `plus({ hour: 1 })` the wall-clock hour increments (no DST\n * repetition), so the candidate is rejected and we return `date` as-is.\n */\n override resolveAmbiguous(date: DateTime, prefer: 'earlier' | 'later'): DateTime {\n if (!date.isValid) return date;\n // Re-anchor on the earlier of the two candidates by reconstructing the\n // wall-clock from `date`'s fields in its current zone. Luxon's\n // `fromObject` deterministically picks the earlier instant when the\n // input wall-clock is ambiguous, regardless of which occurrence `date`\n // happens to represent.\n const zone = date.zoneName ?? this.zone;\n const earlier = DateTime.fromObject(\n {\n year: date.year,\n month: date.month,\n day: date.day,\n hour: date.hour,\n minute: date.minute,\n second: date.second,\n millisecond: date.millisecond,\n },\n { zone, locale: date.locale ?? this.locale },\n );\n if (!earlier.isValid) return date;\n if (prefer === 'earlier') return earlier;\n // Advancing one hour from the earlier-occurrence instant lands on the\n // same wall-clock at the post-fall-back offset on ambiguous hours, and\n // increments the wall-clock by one on non-ambiguous hours. Compare\n // wall-clock fields to distinguish the two cases.\n const later = earlier.plus({ hours: 1 });\n if (\n later.hour === earlier.hour &&\n later.day === earlier.day &&\n later.month === earlier.month &&\n later.year === earlier.year\n ) {\n return later;\n }\n return earlier;\n }\n}\n","import { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { DATE_ADAPTER } from '@cdevhub/ngx-tw/calendar';\nimport { LuxonDateAdapter } from './luxon-date-adapter';\n\n/**\n * Provides {@link LuxonDateAdapter} as the calendar's `DateAdapter`.\n *\n * Wire at app or route level so the adapter stays constant for the\n * component's lifetime (§11.7 of the calendar spec):\n *\n * ```ts\n * import { provideLuxonDateAdapter } from '@cdevhub/ngx-tw/calendar/luxon';\n *\n * bootstrapApplication(AppComponent, {\n * providers: [provideLuxonDateAdapter()],\n * });\n * ```\n */\nexport function provideLuxonDateAdapter(): EnvironmentProviders {\n return makeEnvironmentProviders([\n LuxonDateAdapter,\n { provide: DATE_ADAPTER, useExisting: LuxonDateAdapter },\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-calendar-luxon.mjs","sources":["../../../projects/ngx-tw/calendar/luxon/luxon-date-adapter.ts","../../../projects/ngx-tw/calendar/luxon/provide-luxon-date-adapter.ts","../../../projects/ngx-tw/calendar/luxon/cdevhub-ngx-tw-calendar-luxon.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { DateTime, Info, Settings } from 'luxon';\nimport { DateAdapter, TZ_OVERRIDE, type TwDateNameStyle } from '@cdevhub/ngx-tw/calendar';\n\n/**\n * Display-format descriptor used by `LuxonDateAdapter.format()` and\n * `LuxonDateAdapter.parse()`.\n *\n * Two shapes are supported:\n * - `{ format: 'yyyy-LL-dd' }` — a Luxon `toFormat`/`fromFormat` token string.\n * - `{ preset: DateTime.DATE_FULL }` — a Luxon preset (an `Intl.DateTimeFormatOptions` bag).\n *\n * If both are provided, `format` (the explicit token) wins.\n */\nexport interface TwLuxonDateFormat {\n /** Luxon token string consumed by `DateTime#toFormat` / `DateTime.fromFormat`. */\n readonly format?: string;\n /** Luxon preset (e.g. `DateTime.DATE_FULL`) consumed by `DateTime#toLocaleString`. */\n readonly preset?: Intl.DateTimeFormatOptions;\n}\n\n/**\n * Luxon-backed `DateAdapter`. Honors the calendar's `TZ_OVERRIDE` injection\n * token so `today()` resolves against the consumer-configured timezone, and\n * implements the §20.2 TZ-aware virtuals (`getTimezone`, `withTimezone`,\n * `isDST`, `resolveAmbiguous`).\n *\n * `create()` accepts **1-based** months (matching the abstract contract and\n * Luxon's `DateTime.fromObject({ month })` convention), while `getMonth()`\n * returns **0-based** months (also per the abstract contract — see\n * `NativeDateAdapter`).\n */\n@Injectable()\nexport class LuxonDateAdapter extends DateAdapter<DateTime> {\n /**\n * Optional per-instance timezone override (§4.3, §7.4). Resolved lazily so\n * the constructor stays SSR-safe — Luxon's default zone reads from the host\n * environment which we want to defer until first use.\n */\n private readonly _tzOverride = inject(TZ_OVERRIDE, { optional: true });\n\n /**\n * Locale is resolved lazily on first read so the constructor stays\n * SSR-safe (no `navigator` access at class-construction time — §31.1).\n */\n private _locale: string | null = null;\n\n private get locale(): string {\n if (this._locale !== null) return this._locale;\n this._locale =\n typeof navigator !== 'undefined' && typeof navigator.language === 'string'\n ? navigator.language\n : Settings.defaultLocale ?? 'en-US';\n return this._locale;\n }\n\n /**\n * Returns the configured timezone for new dates. Precedence: per-instance\n * `TZ_OVERRIDE` → Luxon's `Settings.defaultZone` → `'local'`.\n */\n private get zone(): string {\n if (this._tzOverride) return this._tzOverride;\n const def = Settings.defaultZone;\n // `Settings.defaultZone` is a `Zone` instance — fall back to its name.\n return def && typeof def !== 'string' ? def.name : 'local';\n }\n\n /** Builds a `DateTime` in the adapter's configured zone + locale. */\n private inZone(dt: DateTime): DateTime {\n return dt.setZone(this.zone).setLocale(this.locale);\n }\n\n today(): DateTime {\n return DateTime.now().setZone(this.zone).setLocale(this.locale).startOf('day');\n }\n\n /**\n * Constructs a `DateTime`. **`month` is 1-based** — `create(2026, 1, 1)`\n * yields January 1, 2026 at 00:00 in the adapter's configured zone.\n */\n create(year: number, month: number, day: number): DateTime {\n return DateTime.fromObject(\n { year, month, day },\n { zone: this.zone, locale: this.locale },\n );\n }\n\n clone(date: DateTime): DateTime {\n // `DateTime` is immutable; reconstructing preserves zone/locale and\n // matches the defensive-copy semantics of the abstract contract.\n return DateTime.fromMillis(date.toMillis(), {\n zone: date.zone,\n locale: date.locale ?? this.locale,\n });\n }\n\n setLocale(locale: string): void {\n this._locale = locale;\n }\n\n getLocale(): string {\n return this.locale;\n }\n\n getYear(date: DateTime): number {\n return date.year;\n }\n\n /**\n * Returns the **0-based** month (0 = January, 11 = December) to match the\n * abstract `DateAdapter` contract and the `NativeDateAdapter`. Luxon's\n * `DateTime.month` is 1-based, so we subtract one.\n */\n getMonth(date: DateTime): number {\n return date.month - 1;\n }\n\n getDate(date: DateTime): number {\n return date.day;\n }\n\n /**\n * Day of week mapped to the Sunday-based scheme used by the abstract\n * contract: `0 = Sunday`, `6 = Saturday`. Luxon's `weekday` is\n * `1 = Monday … 7 = Sunday`, so Sunday gets re-anchored to `0`.\n */\n getDayOfWeek(date: DateTime): number {\n return date.weekday % 7;\n }\n\n getNumDaysInMonth(date: DateTime): number {\n return date.daysInMonth ?? 0;\n }\n\n getHours(date: DateTime): number {\n return date.hour;\n }\n\n getMinutes(date: DateTime): number {\n return date.minute;\n }\n\n getSeconds(date: DateTime): number {\n return date.second;\n }\n\n withTime(date: DateTime, hours: number, minutes: number, seconds: number): DateTime {\n return date.set({ hour: hours, minute: minutes, second: seconds, millisecond: 0 });\n }\n\n /**\n * Locale-aware first day of week (§19.2). Mirrors `NativeDateAdapter` —\n * derives from `Intl.Locale.getWeekInfo()` when available, falling back to\n * Monday (`1`) when the locale is unknown to ICU. ICU/CLDR returns\n * `1=Monday … 7=Sunday`; we normalize to the project's `0=Sunday … 6=Saturday`\n * convention so both adapters report identical values for identical locales.\n */\n getFirstDayOfWeek(): number {\n if (typeof Intl !== 'undefined' && typeof Intl.Locale === 'function') {\n try {\n const l = new Intl.Locale(this.locale) as Intl.Locale & {\n getWeekInfo?: () => { firstDay: number };\n weekInfo?: { firstDay: number };\n };\n const info = (l.getWeekInfo?.() ?? l.weekInfo) as { firstDay: number } | undefined;\n if (info && typeof info.firstDay === 'number') {\n return info.firstDay === 7 ? 0 : info.firstDay;\n }\n } catch {\n return 1;\n }\n }\n return 1;\n }\n\n getMonthNames(style: TwDateNameStyle): string[] {\n return Info.months(style, { locale: this.locale });\n }\n\n /**\n * Day-of-week names starting at Sunday. Luxon's `Info.weekdays` starts at\n * Monday, so the array is rotated to put Sunday first to match the abstract\n * contract (and the native adapter).\n */\n getDayOfWeekNames(style: TwDateNameStyle): string[] {\n const monStart = Info.weekdays(style, { locale: this.locale });\n // `[Mon, Tue, Wed, Thu, Fri, Sat, Sun]` → `[Sun, Mon, Tue, Wed, Thu, Fri, Sat]`.\n return [monStart[6], ...monStart.slice(0, 6)];\n }\n\n override getDateNames(_style: TwDateNameStyle = 'short'): string[] {\n // Use a 31-day reference month to localize numerals where needed.\n const ref = DateTime.fromObject(\n { year: 2017, month: 1, day: 1 },\n { zone: 'utc', locale: this.locale },\n );\n return Array.from({ length: 31 }, (_, i) => ref.plus({ days: i }).toFormat('d'));\n }\n\n getYearName(date: DateTime): string {\n return date.toFormat('yyyy', { locale: this.locale });\n }\n\n /**\n * Formats a date for display.\n *\n * Accepts either a Luxon token string (e.g. `'yyyy-LL-dd'`), a\n * {@link TwLuxonDateFormat} descriptor, or a Luxon preset bag\n * (`Intl.DateTimeFormatOptions`). When no format is supplied the\n * adapter falls back to a locale-aware medium date.\n */\n format(date: DateTime, displayFormat: unknown): string {\n if (!this.isValid(date)) return '';\n const localized = date.setLocale(this.locale);\n if (typeof displayFormat === 'string') {\n return localized.toFormat(displayFormat);\n }\n if (displayFormat && typeof displayFormat === 'object') {\n const desc = displayFormat as TwLuxonDateFormat;\n if (typeof desc.format === 'string') {\n return localized.toFormat(desc.format);\n }\n if (desc.preset) {\n return localized.toLocaleString(desc.preset);\n }\n // Treat a bare option-bag as a preset.\n return localized.toLocaleString(displayFormat as Intl.DateTimeFormatOptions);\n }\n return localized.toLocaleString(DateTime.DATE_MED);\n }\n\n addYears(date: DateTime, years: number): DateTime {\n return date.plus({ years });\n }\n\n addMonths(date: DateTime, months: number): DateTime {\n return date.plus({ months });\n }\n\n addDays(date: DateTime, days: number): DateTime {\n return date.plus({ days });\n }\n\n override addHours(date: DateTime, hours: number): DateTime {\n return date.plus({ hours });\n }\n\n addMinutes(date: DateTime, minutes: number): DateTime {\n return date.plus({ minutes });\n }\n\n compare(first: DateTime, second: DateTime): number {\n // Compare by calendar fields (year/month/day) so two `DateTime` instances\n // representing the same wall-clock date in different zones still compare\n // equal — matches the native adapter's behaviour.\n return (\n first.year - second.year ||\n first.month - second.month ||\n first.day - second.day\n );\n }\n\n sameDate(\n first: DateTime | null | undefined,\n second: DateTime | null | undefined,\n ): boolean {\n if (first && second) {\n const f = this.isValid(first);\n const s = this.isValid(second);\n if (f && s) return this.compare(first, second) === 0;\n return f === s;\n }\n return first === second;\n }\n\n /**\n * Start-of-day normalization in the adapter's zone. Luxon's `startOf('day')`\n * is DST-aware — on spring-forward days it returns the wall-clock instant the\n * zone considers the first valid moment of the day.\n */\n startOfDay(date: DateTime): DateTime {\n return date.setZone(this.zone).startOf('day');\n }\n\n isValid(date: DateTime): boolean {\n return date instanceof DateTime && date.isValid;\n }\n\n /** Returns Luxon's invalid sentinel (an invalid `DateTime`). */\n invalid(): DateTime {\n return DateTime.invalid('invalid');\n }\n\n /**\n * Parses a value into a `DateTime`. Accepts:\n * - `DateTime` (cloned),\n * - JS `Date` (re-anchored to the adapter's zone + locale),\n * - number (epoch milliseconds),\n * - string — when `parseFormat` is a Luxon token, uses `fromFormat`;\n * otherwise parses strict ISO 8601 only.\n *\n * The free-form-string path is intentionally narrow: SQL and RFC 2822\n * fallbacks were dropped so the Luxon adapter's acceptance surface matches\n * `NativeDateAdapter.parse()` (which only accepts strings parseable by\n * `new Date(value)`). Callers that need bespoke string formats should pass\n * an explicit `parseFormat` token.\n *\n * Returns `null` on empty input or unrecognised value types, mirroring the\n * native adapter's contract.\n */\n parse(value: unknown, parseFormat?: unknown): DateTime | null {\n if (value == null) return null;\n if (value instanceof DateTime) {\n return value.isValid ? this.clone(value) : null;\n }\n if (value instanceof Date) {\n const dt = DateTime.fromJSDate(value, { zone: this.zone }).setLocale(this.locale);\n return dt.isValid ? dt : null;\n }\n if (typeof value === 'number') {\n const dt = DateTime.fromMillis(value, { zone: this.zone, locale: this.locale });\n return dt.isValid ? dt : null;\n }\n if (typeof value === 'string') {\n if (!value.trim()) return null;\n const opts = { zone: this.zone, locale: this.locale };\n if (typeof parseFormat === 'string') {\n const dt = DateTime.fromFormat(value, parseFormat, opts);\n return dt.isValid ? dt : null;\n }\n if (parseFormat && typeof parseFormat === 'object') {\n const desc = parseFormat as TwLuxonDateFormat;\n if (typeof desc.format === 'string') {\n const dt = DateTime.fromFormat(value, desc.format, opts);\n return dt.isValid ? dt : null;\n }\n }\n const iso = DateTime.fromISO(value, opts);\n return iso.isValid ? iso : null;\n }\n return null;\n }\n\n /**\n * Coerce an incoming form value. Returns `null` for empty input, an invalid\n * `DateTime` sentinel for malformed input (so validators can flag it), and a\n * cloned valid `DateTime` otherwise.\n */\n deserialize(value: unknown): DateTime | null {\n if (value == null || value === '') return null;\n if (value instanceof DateTime) {\n return value.isValid ? this.clone(value) : this.invalid();\n }\n const parsed = this.parse(value);\n if (parsed && parsed.isValid) return parsed;\n return this.invalid();\n }\n\n /**\n * ISO 8601 date serialization (`YYYY-MM-DD`). Calendar dates have no\n * time component — `toIso` returns just the date portion.\n */\n toIso(date: DateTime): string {\n return date.toFormat('yyyy-LL-dd');\n }\n\n /**\n * Parses an ISO-8601 string to a `DateTime`. Overrides the base\n * implementation to use Luxon's optimised `fromISO` parser.\n */\n override fromIso(iso: string): DateTime | null {\n if (typeof iso !== 'string' || !iso.trim()) return null;\n const dt = DateTime.fromISO(iso, { zone: this.zone, locale: this.locale });\n return dt.isValid ? dt : null;\n }\n\n // ---------------------------------------------------------------------------\n // TZ-aware virtuals (§20.2). Luxon's `DateTime` carries zone information, so\n // these are real implementations rather than the floating no-ops in the base\n // class.\n // ---------------------------------------------------------------------------\n\n /** Returns the adapter's configured IANA zone name (e.g. `'America/New_York'`). */\n override getTimezone(): string {\n return this.zone;\n }\n\n /** Returns a copy of `date` reinterpreted in `tz`. */\n override withTimezone(date: DateTime, tz: string): DateTime {\n return date.setZone(tz);\n }\n\n /** Whether `date` is currently observing daylight-saving time in its zone. */\n override isDST(date: DateTime): boolean {\n return date.isInDST;\n }\n\n /**\n * Resolves an ambiguous wall-clock time during DST fall-back. On fall-back\n * days a single wall-clock hour repeats — e.g. 2024-11-03 01:30 in\n * `America/New_York` happens once at offset -04:00 (EDT) and again at\n * offset -05:00 (EST). Luxon's `DateTime.fromObject({...}, { zone })` always\n * returns the **earlier** of the two candidates, so we reconstruct the\n * \"later\" occurrence explicitly: rebuild the candidate at the date's\n * wall-clock fields (anchoring it on the earlier occurrence) and add one\n * hour to land on the same wall-clock's second occurrence in the\n * post-fall-back offset.\n *\n * Non-ambiguous wall-clocks return unchanged for both `prefer` values:\n * after `plus({ hour: 1 })` the wall-clock hour increments (no DST\n * repetition), so the candidate is rejected and we return `date` as-is.\n */\n override resolveAmbiguous(date: DateTime, prefer: 'earlier' | 'later'): DateTime {\n if (!date.isValid) return date;\n // Re-anchor on the earlier of the two candidates by reconstructing the\n // wall-clock from `date`'s fields in its current zone. Luxon's\n // `fromObject` deterministically picks the earlier instant when the\n // input wall-clock is ambiguous, regardless of which occurrence `date`\n // happens to represent.\n const zone = date.zoneName ?? this.zone;\n const earlier = DateTime.fromObject(\n {\n year: date.year,\n month: date.month,\n day: date.day,\n hour: date.hour,\n minute: date.minute,\n second: date.second,\n millisecond: date.millisecond,\n },\n { zone, locale: date.locale ?? this.locale },\n );\n if (!earlier.isValid) return date;\n if (prefer === 'earlier') return earlier;\n // Advancing one hour from the earlier-occurrence instant lands on the\n // same wall-clock at the post-fall-back offset on ambiguous hours, and\n // increments the wall-clock by one on non-ambiguous hours. Compare\n // wall-clock fields to distinguish the two cases.\n const later = earlier.plus({ hours: 1 });\n if (\n later.hour === earlier.hour &&\n later.day === earlier.day &&\n later.month === earlier.month &&\n later.year === earlier.year\n ) {\n return later;\n }\n return earlier;\n }\n}\n","import { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { DATE_ADAPTER } from '@cdevhub/ngx-tw/calendar';\nimport { LuxonDateAdapter } from './luxon-date-adapter';\n\n/**\n * Provides {@link LuxonDateAdapter} as the calendar's `DateAdapter`.\n *\n * Wire at app or route level so the adapter stays constant for the\n * component's lifetime (§11.7 of the calendar spec):\n *\n * ```ts\n * import { provideLuxonDateAdapter } from '@cdevhub/ngx-tw/calendar/luxon';\n *\n * bootstrapApplication(AppComponent, {\n * providers: [provideLuxonDateAdapter()],\n * });\n * ```\n */\nexport function provideLuxonDateAdapter(): EnvironmentProviders {\n return makeEnvironmentProviders([\n LuxonDateAdapter,\n { provide: DATE_ADAPTER, useExisting: LuxonDateAdapter },\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|