@ngxsmk/cdk 3.2.0 → 3.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 +1 -1
- package/esm2022/input-group/input-group-engine.mjs +53 -28
- package/esm2022/public-api.mjs +2 -1
- package/esm2022/state-machine/create-machine.mjs +38 -0
- package/esm2022/state-machine/create-presence.mjs +70 -0
- package/esm2022/state-machine/index.mjs +3 -0
- package/esm2022/state-machine/ngxsmk-cdk-state-machine.mjs +5 -0
- package/fesm2022/ngxsmk-cdk-autofocus.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-click-outside.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-focus-trap.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-focusable.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-input-group.mjs +52 -27
- package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-intersection-observer.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-live-announcer.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-media-query.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-resize-observer.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-roving-focus.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-scroll-lock.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-skip-link.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-state-machine.mjs +113 -0
- package/fesm2022/ngxsmk-cdk-state-machine.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-testing.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-visually-hidden.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk.mjs +1 -0
- package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
- package/input-group/input-group-engine.d.ts +3 -0
- package/input-group/input-group-engine.d.ts.map +1 -1
- package/package.json +41 -29
- package/public-api.d.ts +1 -0
- package/public-api.d.ts.map +1 -1
- package/state-machine/create-machine.d.ts +37 -0
- package/state-machine/create-machine.d.ts.map +1 -0
- package/state-machine/create-presence.d.ts +29 -0
- package/state-machine/create-presence.d.ts.map +1 -0
- package/state-machine/index.d.ts +3 -0
- package/state-machine/index.d.ts.map +1 -0
- package/state-machine/ngxsmk-cdk-state-machine.d.ts.map +1 -0
|
@@ -28,6 +28,7 @@ class InputGroupEngine {
|
|
|
28
28
|
this.fullWidth = signal(true);
|
|
29
29
|
this.floatingLabel = signal(false);
|
|
30
30
|
this._asyncTimer = null;
|
|
31
|
+
this._validationGeneration = 0;
|
|
31
32
|
this._config = config;
|
|
32
33
|
// Initialize config signals
|
|
33
34
|
this.value = signal(config.initialValue ?? '');
|
|
@@ -152,55 +153,75 @@ class InputGroupEngine {
|
|
|
152
153
|
this.message.set(message);
|
|
153
154
|
this.onValidationChange()(status, message);
|
|
154
155
|
}
|
|
156
|
+
_clearAsyncTimer() {
|
|
157
|
+
if (this._asyncTimer) {
|
|
158
|
+
clearTimeout(this._asyncTimer);
|
|
159
|
+
this._asyncTimer = null;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
155
162
|
_runValidation(value) {
|
|
163
|
+
this._clearAsyncTimer();
|
|
164
|
+
const gen = (this._validationGeneration += 1);
|
|
156
165
|
const validator = this._config.validator;
|
|
157
166
|
if (validator) {
|
|
158
167
|
const result = validator(value);
|
|
159
168
|
this.status.set(result.status);
|
|
160
169
|
this.message.set(result.message);
|
|
161
170
|
this.onValidationChange()(result.status, result.message);
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if (this.required() && !value) {
|
|
166
|
-
this.status.set('error');
|
|
167
|
-
this.message.set('This field is required');
|
|
168
|
-
this.onValidationChange()('error', 'This field is required');
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
if (this.isOverLength()) {
|
|
172
|
-
this.status.set('error');
|
|
173
|
-
this.message.set(`Maximum ${this.maxLength()} characters`);
|
|
174
|
-
this.onValidationChange()('error', `Maximum ${this.maxLength()} characters`);
|
|
175
|
-
return;
|
|
171
|
+
if (result.status === 'error') {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
176
174
|
}
|
|
177
|
-
|
|
178
|
-
this.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
175
|
+
else {
|
|
176
|
+
if (this.required() && !value) {
|
|
177
|
+
this.setStatus('error', 'This field is required');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (this.isOverLength()) {
|
|
181
|
+
this.setStatus('error', `Maximum ${this.maxLength()} characters`);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (this.isUnderLength()) {
|
|
185
|
+
this.setStatus('error', `Minimum ${this.minLength()} characters`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
182
188
|
}
|
|
183
|
-
this.status.set('none');
|
|
184
|
-
this.message.set('');
|
|
185
|
-
this.onValidationChange()('none', '');
|
|
186
|
-
// Async validation
|
|
187
189
|
const asyncValidator = this._config.asyncValidator;
|
|
188
190
|
if (asyncValidator && value) {
|
|
189
|
-
if (this._asyncTimer)
|
|
190
|
-
clearTimeout(this._asyncTimer);
|
|
191
191
|
this.status.set('pending');
|
|
192
192
|
this.message.set('');
|
|
193
|
+
this.onValidationChange()('pending', '');
|
|
193
194
|
this._asyncTimer = setTimeout(async () => {
|
|
194
|
-
|
|
195
|
-
|
|
195
|
+
try {
|
|
196
|
+
const result = await asyncValidator(value);
|
|
197
|
+
if (gen !== this._validationGeneration || this.value() !== value) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
196
200
|
this.status.set(result);
|
|
197
201
|
this.onValidationChange()(result, '');
|
|
198
202
|
}
|
|
203
|
+
catch {
|
|
204
|
+
if (gen !== this._validationGeneration || this.value() !== value) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
this.setStatus('error', 'Validation failed');
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
if (this._asyncTimer) {
|
|
211
|
+
this._asyncTimer = null;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
199
214
|
}, this._config.asyncDebounce ?? 300);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (!validator) {
|
|
218
|
+
this.setStatus('none', '');
|
|
200
219
|
}
|
|
201
220
|
}
|
|
202
221
|
// ── Reset ──
|
|
203
222
|
reset() {
|
|
223
|
+
this._validationGeneration += 1;
|
|
224
|
+
this._clearAsyncTimer();
|
|
204
225
|
this.value.set(this._config.initialValue ?? '');
|
|
205
226
|
this.focused.set(false);
|
|
206
227
|
this.touched.set(false);
|
|
@@ -209,6 +230,10 @@ class InputGroupEngine {
|
|
|
209
230
|
this.message.set('');
|
|
210
231
|
this.passwordVisible.set(false);
|
|
211
232
|
}
|
|
233
|
+
destroy() {
|
|
234
|
+
this._validationGeneration += 1;
|
|
235
|
+
this._clearAsyncTimer();
|
|
236
|
+
}
|
|
212
237
|
// ── Enable/Disable ──
|
|
213
238
|
enable() {
|
|
214
239
|
this.disabled.set(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-input-group.mjs","sources":["../../../../packages/cdk/input-group/input-group-engine.ts","../../../../packages/cdk/input-group/ngxsmk-cdk-input-group.ts"],"sourcesContent":["import { computed, signal, type WritableSignal, type Signal } from '@angular/core';\nimport type {\n InputGroupConfig,\n InputGroupAddon,\n InputGroupInputType,\n InputGroupVariant,\n InputGroupSize,\n InputGroupRadius,\n InputGroupDensity,\n ValidationStatus,\n} from './models';\n\nexport interface InputGroupEngineConfig extends InputGroupConfig {\n /** Initial value. */\n initialValue?: string;\n /** Async validator function. */\n asyncValidator?: (value: string) => Promise<ValidationStatus>;\n /** Sync validator function. */\n validator?: (value: string) => { status: ValidationStatus; message: string };\n /** Debounce for async validation in ms. */\n asyncDebounce?: number;\n}\n\n/**\n * InputGroupEngine — headless, signal-based state machine for input group behaviour.\n * Zero DOM, zero Angular template dependencies.\n */\nexport class InputGroupEngine {\n // ── Core State ──\n readonly value: WritableSignal<string>;\n readonly focused = signal(false);\n readonly hovered = signal(false);\n readonly touched = signal(false);\n readonly dirty = signal(false);\n readonly status = signal<ValidationStatus>('none');\n readonly message = signal('');\n readonly disabled = signal(false);\n readonly readonly = signal(false);\n readonly passwordVisible = signal(false);\n readonly loading = signal(false);\n readonly addons = signal<InputGroupAddon[]>([]);\n\n // ── Config ──\n readonly type: WritableSignal<InputGroupInputType>;\n readonly variant: WritableSignal<InputGroupVariant>;\n readonly size: WritableSignal<InputGroupSize>;\n readonly radius: WritableSignal<InputGroupRadius>;\n readonly density: WritableSignal<InputGroupDensity>;\n readonly placeholder = signal('');\n readonly label = signal('');\n readonly hint = signal('');\n readonly required = signal(false);\n readonly maxLength = signal<number | undefined>(undefined);\n readonly minLength = signal<number | undefined>(undefined);\n readonly showClear = signal(false);\n readonly showCounter = signal(false);\n readonly fullWidth = signal(true);\n readonly floatingLabel = signal(false);\n\n // ── Computed ──\n readonly charCount: Signal<number>;\n readonly hasContent: Signal<boolean>;\n readonly isActive: Signal<boolean>;\n readonly isOverLength: Signal<boolean>;\n readonly isUnderLength: Signal<boolean>;\n readonly hasError: Signal<boolean>;\n readonly hasSuccess: Signal<boolean>;\n readonly hasWarning: Signal<boolean>;\n readonly isInvalid: Signal<boolean>;\n readonly showPlaceholder: Signal<boolean>;\n readonly shouldFloat: Signal<boolean>;\n readonly leadingAddons: Signal<InputGroupAddon[]>;\n readonly trailingAddons: Signal<InputGroupAddon[]>;\n readonly hasLeading: Signal<boolean>;\n readonly hasTrailing: Signal<boolean>;\n readonly inputType: Signal<InputGroupInputType>;\n\n // ── Lifecycle Hooks ──\n readonly onFocus: WritableSignal<() => void>;\n readonly onBlur: WritableSignal<() => void>;\n readonly onChange: WritableSignal<(value: string) => void>;\n readonly onClear: WritableSignal<() => void>;\n readonly onValidationChange: WritableSignal<(status: ValidationStatus, message: string) => void>;\n\n private _config: InputGroupEngineConfig;\n private _asyncTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: InputGroupEngineConfig = {}) {\n this._config = config;\n\n // Initialize config signals\n this.value = signal(config.initialValue ?? '');\n this.type = signal(config.type ?? 'text');\n this.variant = signal(config.variant ?? 'outlined');\n this.size = signal(config.size ?? 'md');\n this.radius = signal(config.radius ?? 'md');\n this.density = signal(config.density ?? 'comfortable');\n this.disabled.set(config.disabled ?? false);\n this.readonly.set(config.readonly ?? false);\n this.placeholder.set(config.placeholder ?? '');\n this.label.set(config.label ?? '');\n this.hint.set(config.hint ?? '');\n this.required.set(config.required ?? false);\n this.maxLength.set(config.maxLength);\n this.minLength.set(config.minLength);\n this.showClear.set(config.showClear ?? false);\n this.showCounter.set(config.showCounter ?? false);\n this.fullWidth.set(config.fullWidth ?? true);\n this.floatingLabel.set(config.floatingLabel ?? false);\n\n if (config.initialValue) {\n this.dirty.set(true);\n this.touched.set(true);\n }\n\n // Lifecycle hooks\n this.onFocus = signal(() => {\n /* noop */\n });\n this.onBlur = signal(() => {\n /* noop */\n });\n this.onChange = signal(() => {\n /* noop */\n });\n this.onClear = signal(() => {\n /* noop */\n });\n this.onValidationChange = signal(() => {\n /* noop */\n });\n\n // ── Computed ──\n\n this.charCount = computed(() => this.value().length);\n\n this.hasContent = computed(() => this.value().length > 0);\n\n this.isActive = computed(() => this.focused() || this.hasContent());\n\n this.isOverLength = computed(() => {\n const max = this.maxLength();\n return max != null ? this.value().length > max : false;\n });\n\n this.isUnderLength = computed(() => {\n const min = this.minLength();\n return min != null && this.touched() ? this.value().length < min : false;\n });\n\n this.hasError = computed(() => this.status() === 'error');\n this.hasSuccess = computed(() => this.status() === 'success');\n this.hasWarning = computed(() => this.status() === 'warning');\n this.isInvalid = computed(() => this.hasError() || this.isOverLength() || this.isUnderLength());\n\n this.showPlaceholder = computed(() => {\n return !this.hasContent() && !this.focused();\n });\n\n this.shouldFloat = computed(() => {\n if (this.floatingLabel()) return this.isActive() || this.hasContent();\n return false;\n });\n\n this.leadingAddons = computed(() => this.addons().filter((a) => a.position === 'leading'));\n\n this.trailingAddons = computed(() => this.addons().filter((a) => a.position === 'trailing'));\n\n this.hasLeading = computed(() => this.leadingAddons().length > 0);\n this.hasTrailing = computed(() => this.trailingAddons().length > 0);\n\n this.inputType = computed(() => {\n if (this.type() === 'password') {\n return this.passwordVisible() ? 'text' : 'password';\n }\n return this.type();\n });\n }\n\n // ── Value Operations ──\n\n setValue(value: string): void {\n this.value.set(value);\n this.dirty.set(true);\n this._runValidation(value);\n this.onChange()(value);\n }\n\n clear(): void {\n this.setValue('');\n this.onClear()();\n }\n\n getValue(): string {\n return this.value();\n }\n\n // ── Focus Operations ──\n\n focus(): void {\n this.focused.set(true);\n this.onFocus()();\n }\n\n blur(): void {\n this.focused.set(false);\n this.touched.set(true);\n this._runValidation(this.value());\n this.onBlur()();\n }\n\n // ── Password ──\n\n togglePasswordVisibility(): void {\n this.passwordVisible.update((v) => !v);\n }\n\n // ── Loading ──\n\n showLoading(): void {\n this.loading.set(true);\n }\n\n hideLoading(): void {\n this.loading.set(false);\n }\n\n // ── Add-ons ──\n\n addAddon(addon: InputGroupAddon): void {\n this.addons.update((list) => [...list, addon]);\n }\n\n removeAddon(id: string): void {\n this.addons.update((list) => list.filter((a) => a.id !== id));\n }\n\n // ── Validation ──\n\n setStatus(status: ValidationStatus, message = ''): void {\n this.status.set(status);\n this.message.set(message);\n this.onValidationChange()(status, message);\n }\n\n private _runValidation(value: string): void {\n const validator = this._config.validator;\n if (validator) {\n const result = validator(value);\n this.status.set(result.status);\n this.message.set(result.message);\n this.onValidationChange()(result.status, result.message);\n return;\n }\n\n // Built-in validations\n if (this.required() && !value) {\n this.status.set('error');\n this.message.set('This field is required');\n this.onValidationChange()('error', 'This field is required');\n return;\n }\n\n if (this.isOverLength()) {\n this.status.set('error');\n this.message.set(`Maximum ${this.maxLength()} characters`);\n this.onValidationChange()('error', `Maximum ${this.maxLength()} characters`);\n return;\n }\n\n if (this.isUnderLength()) {\n this.status.set('error');\n this.message.set(`Minimum ${this.minLength()} characters`);\n this.onValidationChange()('error', `Minimum ${this.minLength()} characters`);\n return;\n }\n\n this.status.set('none');\n this.message.set('');\n this.onValidationChange()('none', '');\n\n // Async validation\n const asyncValidator = this._config.asyncValidator;\n if (asyncValidator && value) {\n if (this._asyncTimer) clearTimeout(this._asyncTimer);\n this.status.set('pending');\n this.message.set('');\n this._asyncTimer = setTimeout(async () => {\n const result = await asyncValidator(value);\n if (this.value() === value) {\n this.status.set(result);\n this.onValidationChange()(result, '');\n }\n }, this._config.asyncDebounce ?? 300);\n }\n }\n\n // ── Reset ──\n\n reset(): void {\n this.value.set(this._config.initialValue ?? '');\n this.focused.set(false);\n this.touched.set(false);\n this.dirty.set(false);\n this.status.set('none');\n this.message.set('');\n this.passwordVisible.set(false);\n }\n\n // ── Enable/Disable ──\n\n enable(): void {\n this.disabled.set(false);\n }\n\n disable(): void {\n this.disabled.set(true);\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":"ngxsmk-cdk-input-group.mjs","sources":["../../../../packages/cdk/input-group/input-group-engine.ts","../../../../packages/cdk/input-group/ngxsmk-cdk-input-group.ts"],"sourcesContent":["import { computed, signal, type WritableSignal, type Signal } from '@angular/core';\nimport type {\n InputGroupConfig,\n InputGroupAddon,\n InputGroupInputType,\n InputGroupVariant,\n InputGroupSize,\n InputGroupRadius,\n InputGroupDensity,\n ValidationStatus,\n} from './models';\n\nexport interface InputGroupEngineConfig extends InputGroupConfig {\n /** Initial value. */\n initialValue?: string;\n /** Async validator function. */\n asyncValidator?: (value: string) => Promise<ValidationStatus>;\n /** Sync validator function. */\n validator?: (value: string) => { status: ValidationStatus; message: string };\n /** Debounce for async validation in ms. */\n asyncDebounce?: number;\n}\n\n/**\n * InputGroupEngine — headless, signal-based state machine for input group behaviour.\n * Zero DOM, zero Angular template dependencies.\n */\nexport class InputGroupEngine {\n // ── Core State ──\n readonly value: WritableSignal<string>;\n readonly focused = signal(false);\n readonly hovered = signal(false);\n readonly touched = signal(false);\n readonly dirty = signal(false);\n readonly status = signal<ValidationStatus>('none');\n readonly message = signal('');\n readonly disabled = signal(false);\n readonly readonly = signal(false);\n readonly passwordVisible = signal(false);\n readonly loading = signal(false);\n readonly addons = signal<InputGroupAddon[]>([]);\n\n // ── Config ──\n readonly type: WritableSignal<InputGroupInputType>;\n readonly variant: WritableSignal<InputGroupVariant>;\n readonly size: WritableSignal<InputGroupSize>;\n readonly radius: WritableSignal<InputGroupRadius>;\n readonly density: WritableSignal<InputGroupDensity>;\n readonly placeholder = signal('');\n readonly label = signal('');\n readonly hint = signal('');\n readonly required = signal(false);\n readonly maxLength = signal<number | undefined>(undefined);\n readonly minLength = signal<number | undefined>(undefined);\n readonly showClear = signal(false);\n readonly showCounter = signal(false);\n readonly fullWidth = signal(true);\n readonly floatingLabel = signal(false);\n\n // ── Computed ──\n readonly charCount: Signal<number>;\n readonly hasContent: Signal<boolean>;\n readonly isActive: Signal<boolean>;\n readonly isOverLength: Signal<boolean>;\n readonly isUnderLength: Signal<boolean>;\n readonly hasError: Signal<boolean>;\n readonly hasSuccess: Signal<boolean>;\n readonly hasWarning: Signal<boolean>;\n readonly isInvalid: Signal<boolean>;\n readonly showPlaceholder: Signal<boolean>;\n readonly shouldFloat: Signal<boolean>;\n readonly leadingAddons: Signal<InputGroupAddon[]>;\n readonly trailingAddons: Signal<InputGroupAddon[]>;\n readonly hasLeading: Signal<boolean>;\n readonly hasTrailing: Signal<boolean>;\n readonly inputType: Signal<InputGroupInputType>;\n\n // ── Lifecycle Hooks ──\n readonly onFocus: WritableSignal<() => void>;\n readonly onBlur: WritableSignal<() => void>;\n readonly onChange: WritableSignal<(value: string) => void>;\n readonly onClear: WritableSignal<() => void>;\n readonly onValidationChange: WritableSignal<(status: ValidationStatus, message: string) => void>;\n\n private _config: InputGroupEngineConfig;\n private _asyncTimer: ReturnType<typeof setTimeout> | null = null;\n private _validationGeneration = 0;\n\n constructor(config: InputGroupEngineConfig = {}) {\n this._config = config;\n\n // Initialize config signals\n this.value = signal(config.initialValue ?? '');\n this.type = signal(config.type ?? 'text');\n this.variant = signal(config.variant ?? 'outlined');\n this.size = signal(config.size ?? 'md');\n this.radius = signal(config.radius ?? 'md');\n this.density = signal(config.density ?? 'comfortable');\n this.disabled.set(config.disabled ?? false);\n this.readonly.set(config.readonly ?? false);\n this.placeholder.set(config.placeholder ?? '');\n this.label.set(config.label ?? '');\n this.hint.set(config.hint ?? '');\n this.required.set(config.required ?? false);\n this.maxLength.set(config.maxLength);\n this.minLength.set(config.minLength);\n this.showClear.set(config.showClear ?? false);\n this.showCounter.set(config.showCounter ?? false);\n this.fullWidth.set(config.fullWidth ?? true);\n this.floatingLabel.set(config.floatingLabel ?? false);\n\n if (config.initialValue) {\n this.dirty.set(true);\n this.touched.set(true);\n }\n\n // Lifecycle hooks\n this.onFocus = signal(() => {\n /* noop */\n });\n this.onBlur = signal(() => {\n /* noop */\n });\n this.onChange = signal(() => {\n /* noop */\n });\n this.onClear = signal(() => {\n /* noop */\n });\n this.onValidationChange = signal(() => {\n /* noop */\n });\n\n // ── Computed ──\n\n this.charCount = computed(() => this.value().length);\n\n this.hasContent = computed(() => this.value().length > 0);\n\n this.isActive = computed(() => this.focused() || this.hasContent());\n\n this.isOverLength = computed(() => {\n const max = this.maxLength();\n return max != null ? this.value().length > max : false;\n });\n\n this.isUnderLength = computed(() => {\n const min = this.minLength();\n return min != null && this.touched() ? this.value().length < min : false;\n });\n\n this.hasError = computed(() => this.status() === 'error');\n this.hasSuccess = computed(() => this.status() === 'success');\n this.hasWarning = computed(() => this.status() === 'warning');\n this.isInvalid = computed(() => this.hasError() || this.isOverLength() || this.isUnderLength());\n\n this.showPlaceholder = computed(() => {\n return !this.hasContent() && !this.focused();\n });\n\n this.shouldFloat = computed(() => {\n if (this.floatingLabel()) return this.isActive() || this.hasContent();\n return false;\n });\n\n this.leadingAddons = computed(() => this.addons().filter((a) => a.position === 'leading'));\n\n this.trailingAddons = computed(() => this.addons().filter((a) => a.position === 'trailing'));\n\n this.hasLeading = computed(() => this.leadingAddons().length > 0);\n this.hasTrailing = computed(() => this.trailingAddons().length > 0);\n\n this.inputType = computed(() => {\n if (this.type() === 'password') {\n return this.passwordVisible() ? 'text' : 'password';\n }\n return this.type();\n });\n }\n\n // ── Value Operations ──\n\n setValue(value: string): void {\n this.value.set(value);\n this.dirty.set(true);\n this._runValidation(value);\n this.onChange()(value);\n }\n\n clear(): void {\n this.setValue('');\n this.onClear()();\n }\n\n getValue(): string {\n return this.value();\n }\n\n // ── Focus Operations ──\n\n focus(): void {\n this.focused.set(true);\n this.onFocus()();\n }\n\n blur(): void {\n this.focused.set(false);\n this.touched.set(true);\n this._runValidation(this.value());\n this.onBlur()();\n }\n\n // ── Password ──\n\n togglePasswordVisibility(): void {\n this.passwordVisible.update((v) => !v);\n }\n\n // ── Loading ──\n\n showLoading(): void {\n this.loading.set(true);\n }\n\n hideLoading(): void {\n this.loading.set(false);\n }\n\n // ── Add-ons ──\n\n addAddon(addon: InputGroupAddon): void {\n this.addons.update((list) => [...list, addon]);\n }\n\n removeAddon(id: string): void {\n this.addons.update((list) => list.filter((a) => a.id !== id));\n }\n\n // ── Validation ──\n\n setStatus(status: ValidationStatus, message = ''): void {\n this.status.set(status);\n this.message.set(message);\n this.onValidationChange()(status, message);\n }\n\n private _clearAsyncTimer(): void {\n if (this._asyncTimer) {\n clearTimeout(this._asyncTimer);\n this._asyncTimer = null;\n }\n }\n\n private _runValidation(value: string): void {\n this._clearAsyncTimer();\n const gen = (this._validationGeneration += 1);\n\n const validator = this._config.validator;\n if (validator) {\n const result = validator(value);\n this.status.set(result.status);\n this.message.set(result.message);\n this.onValidationChange()(result.status, result.message);\n if (result.status === 'error') {\n return;\n }\n } else {\n if (this.required() && !value) {\n this.setStatus('error', 'This field is required');\n return;\n }\n\n if (this.isOverLength()) {\n this.setStatus('error', `Maximum ${this.maxLength()} characters`);\n return;\n }\n\n if (this.isUnderLength()) {\n this.setStatus('error', `Minimum ${this.minLength()} characters`);\n return;\n }\n }\n\n const asyncValidator = this._config.asyncValidator;\n if (asyncValidator && value) {\n this.status.set('pending');\n this.message.set('');\n this.onValidationChange()('pending', '');\n this._asyncTimer = setTimeout(async () => {\n try {\n const result = await asyncValidator(value);\n if (gen !== this._validationGeneration || this.value() !== value) {\n return;\n }\n this.status.set(result);\n this.onValidationChange()(result, '');\n } catch {\n if (gen !== this._validationGeneration || this.value() !== value) {\n return;\n }\n this.setStatus('error', 'Validation failed');\n } finally {\n if (this._asyncTimer) {\n this._asyncTimer = null;\n }\n }\n }, this._config.asyncDebounce ?? 300);\n return;\n }\n\n if (!validator) {\n this.setStatus('none', '');\n }\n }\n\n // ── Reset ──\n\n reset(): void {\n this._validationGeneration += 1;\n this._clearAsyncTimer();\n this.value.set(this._config.initialValue ?? '');\n this.focused.set(false);\n this.touched.set(false);\n this.dirty.set(false);\n this.status.set('none');\n this.message.set('');\n this.passwordVisible.set(false);\n }\n\n destroy(): void {\n this._validationGeneration += 1;\n this._clearAsyncTimer();\n }\n\n // ── Enable/Disable ──\n\n enable(): void {\n this.disabled.set(false);\n }\n\n disable(): void {\n this.disabled.set(true);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-intersection-observer.mjs","sources":["../../../../packages/cdk/intersection-observer/intersection-observer.ts","../../../../packages/cdk/intersection-observer/ngxsmk-cdk-intersection-observer.ts"],"sourcesContent":["import { DestroyRef, Directive, ElementRef, inject, input, output, effect } from '@angular/core';\n\n/**\n * Monitors the visibility of an element relative to the viewport or a parent container.\n *\n * ```html\n * <div [ngxsmkIntersectionObserver] (intersecting)=\"onIntersect($event)\">…</div>\n * ```\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkIntersectionObserver]',\n})\nexport class NgxsmkIntersectionObserver {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly rootMargin = input<string>('0px');\n readonly threshold = input<number | number[]>(0);\n\n readonly intersecting = output<boolean>();\n readonly intersection = output<IntersectionObserverEntry>();\n\n private observer: IntersectionObserver | null = null;\n\n constructor() {\n if (typeof window === 'undefined' || !('IntersectionObserver' in window)) {\n return;\n }\n\n effect(() => {\n this.cleanup();\n\n const options = {\n rootMargin: this.rootMargin(),\n threshold: this.threshold(),\n };\n\n this.observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n this.intersecting.emit(entry.isIntersecting);\n this.intersection.emit(entry);\n }\n }, options);\n\n this.observer.observe(this.elementRef.nativeElement);\n });\n\n this.destroyRef.onDestroy(() => {\n this.cleanup();\n });\n }\n\n private cleanup(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;AAMG;MAKU,0BAA0B,CAAA;AAYrC,IAAA,WAAA,GAAA;AAXiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AACxD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEvC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAS,KAAK,CAAC;AACjC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAoB,CAAC,CAAC;QAEvC,IAAA,CAAA,YAAY,GAAG,MAAM,EAAW;QAChC,IAAA,CAAA,YAAY,GAAG,MAAM,EAA6B;QAEnD,IAAA,CAAA,QAAQ,GAAgC,IAAI;AAGlD,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,EAAE,sBAAsB,IAAI,MAAM,CAAC,EAAE;YACxE;QACF;QAEA,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,OAAO,EAAE;AAEd,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;aAC5B;YAED,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,OAAO,KAAI;AACnD,gBAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;oBAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;AAC5C,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC/B;YACF,CAAC,EAAE,OAAO,CAAC;YAEX,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AACtD,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,IAAI,CAAC,OAAO,EAAE;AAChB,QAAA,CAAC,CAAC;IACJ;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACtB;IACF;8GA7CW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,8BAA8B;AACzC,iBAAA;;;ACZD;;AAEG
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-intersection-observer.mjs","sources":["../../../../packages/cdk/intersection-observer/intersection-observer.ts","../../../../packages/cdk/intersection-observer/ngxsmk-cdk-intersection-observer.ts"],"sourcesContent":["import { DestroyRef, Directive, ElementRef, inject, input, output, effect } from '@angular/core';\n\n/**\n * Monitors the visibility of an element relative to the viewport or a parent container.\n *\n * ```html\n * <div [ngxsmkIntersectionObserver] (intersecting)=\"onIntersect($event)\">…</div>\n * ```\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkIntersectionObserver]',\n})\nexport class NgxsmkIntersectionObserver {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly rootMargin = input<string>('0px');\n readonly threshold = input<number | number[]>(0);\n\n readonly intersecting = output<boolean>();\n readonly intersection = output<IntersectionObserverEntry>();\n\n private observer: IntersectionObserver | null = null;\n\n constructor() {\n if (typeof window === 'undefined' || !('IntersectionObserver' in window)) {\n return;\n }\n\n effect(() => {\n this.cleanup();\n\n const options = {\n rootMargin: this.rootMargin(),\n threshold: this.threshold(),\n };\n\n this.observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n this.intersecting.emit(entry.isIntersecting);\n this.intersection.emit(entry);\n }\n }, options);\n\n this.observer.observe(this.elementRef.nativeElement);\n });\n\n this.destroyRef.onDestroy(() => {\n this.cleanup();\n });\n }\n\n private cleanup(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;AAMG;MAKU,0BAA0B,CAAA;AAYrC,IAAA,WAAA,GAAA;AAXiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AACxD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEvC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAS,KAAK,CAAC;AACjC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAoB,CAAC,CAAC;QAEvC,IAAA,CAAA,YAAY,GAAG,MAAM,EAAW;QAChC,IAAA,CAAA,YAAY,GAAG,MAAM,EAA6B;QAEnD,IAAA,CAAA,QAAQ,GAAgC,IAAI;AAGlD,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,EAAE,sBAAsB,IAAI,MAAM,CAAC,EAAE;YACxE;QACF;QAEA,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,OAAO,EAAE;AAEd,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;aAC5B;YAED,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,OAAO,KAAI;AACnD,gBAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;oBAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;AAC5C,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC/B;YACF,CAAC,EAAE,OAAO,CAAC;YAEX,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AACtD,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,IAAI,CAAC,OAAO,EAAE;AAChB,QAAA,CAAC,CAAC;IACJ;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACtB;IACF;8GA7CW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,8BAA8B;AACzC,iBAAA;;;ACZD;;AAEG;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-listbox-keyboard.mjs","sources":["../../../../packages/cdk/listbox-keyboard/listbox-keyboard.ts","../../../../packages/cdk/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.ts"],"sourcesContent":["import { ElementRef, signal } from '@angular/core';\n\n/**\n * Configuration for listbox keyboard navigation.\n *\n * @property optionSelector - CSS selector for option elements\n * @property options - Function returning the current option list\n * @property host - Optional host element for scroll queries (defaults to inject(ElementRef))\n * @property placeholderIndex - Index for the placeholder item (-1 if none)\n * @property skipDisabled - Whether to skip disabled options during navigation\n */\nexport interface ListboxKeyboardConfig {\n optionSelector: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: () => any[];\n host?: ElementRef<HTMLElement>;\n placeholderIndex?: number;\n skipDisabled?: boolean;\n}\n\n/**\n * Shared arrow-key navigation for dropdown listboxes.\n *\n * Encapsulates `activeIndex`, `move(delta)`, `scrollActiveIntoView()`, and the\n * full `onKeydown()` handler. Components provide only their option list and\n * CSS selector.\n *\n * ```ts\n * private readonly kb = new ListboxKeyboard({\n * optionSelector: '.ngxsmk-combobox__option',\n * options: () => this.filtered(),\n * host: this.host,\n * });\n * ```\n */\nexport class ListboxKeyboard {\n readonly activeIndex = signal(-1);\n\n private readonly config: ListboxKeyboardConfig;\n\n constructor(config: ListboxKeyboardConfig) {\n this.config = config;\n }\n\n /** Override the host element used for scroll queries (e.g. for portals). */\n setHost(host: ElementRef<HTMLElement>): void {\n this.config.host = host;\n }\n\n /** Move the active index by `delta` positions, wrapping around. */\n move(delta: number): void {\n const opts = this.config.options();\n if (!opts.length) return;\n\n let next = this.activeIndex() + delta;\n const min = this.config.placeholderIndex ?? 0;\n\n for (let guard = 0; guard <= opts.length; guard++) {\n if (next < min) {\n next = opts.length - 1;\n } else if (next > opts.length - 1) {\n next = min;\n }\n if (!this.config.skipDisabled || next === min || !opts[next]?.disabled) {\n break;\n }\n next += delta;\n }\n\n this.activeIndex.set(next);\n this.scrollActiveIntoView();\n }\n\n /** Scroll the active option into view within the host element. */\n scrollActiveIntoView(): void {\n requestAnimationFrame(() => {\n const host = this.config.host?.nativeElement;\n if (!host) return;\n const items = host.querySelectorAll<HTMLElement>(this.config.optionSelector);\n let idx = this.activeIndex();\n // Offset by 1 if there's a placeholder before the options\n if (this.config.placeholderIndex !== undefined && idx >= 0) {\n idx += 1;\n }\n items[idx]?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n /** Jump to the first enabled option. */\n home(): void {\n const opts = this.config.options();\n if (!opts.length) return;\n const min = this.config.placeholderIndex ?? 0;\n if (this.config.skipDisabled) {\n const first = opts.findIndex((o) => !o.disabled);\n this.activeIndex.set(first >= 0 ? first : min);\n } else {\n this.activeIndex.set(min);\n }\n this.scrollActiveIntoView();\n }\n\n /** Jump to the last option. */\n end(): void {\n const opts = this.config.options();\n if (!opts.length) return;\n this.activeIndex.set(opts.length - 1);\n this.scrollActiveIntoView();\n }\n\n /**\n * Handle a keyboard event for listbox navigation.\n *\n * @returns `true` if the event was handled, `false` if the caller should\n * handle it (e.g. for typeahead or open/close toggling).\n */\n handleKeydown(\n event: KeyboardEvent,\n callbacks: {\n onSelect?: (index: number) => void;\n onOpen?: () => void;\n onClose?: () => void;\n isOpen?: () => boolean;\n } = {},\n ): boolean {\n const opts = this.config.options();\n const isOpen = callbacks.isOpen?.() ?? true;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!isOpen) {\n callbacks.onOpen?.();\n } else {\n this.move(1);\n }\n return true;\n\n case 'ArrowUp':\n event.preventDefault();\n if (isOpen) {\n this.move(-1);\n }\n return true;\n\n case 'Home':\n if (isOpen && opts.length) {\n event.preventDefault();\n this.home();\n }\n return true;\n\n case 'End':\n if (isOpen && opts.length) {\n event.preventDefault();\n this.end();\n }\n return true;\n\n case 'Enter':\n case ' ':\n case 'Spacebar':\n if (isOpen) {\n event.preventDefault();\n const idx = this.activeIndex();\n if (idx >= 0 && opts[idx]) {\n callbacks.onSelect?.(idx);\n }\n }\n return true;\n\n case 'Escape':\n if (isOpen) {\n event.preventDefault();\n callbacks.onClose?.();\n }\n return true;\n\n default:\n return false;\n }\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":"ngxsmk-cdk-listbox-keyboard.mjs","sources":["../../../../packages/cdk/listbox-keyboard/listbox-keyboard.ts","../../../../packages/cdk/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.ts"],"sourcesContent":["import { ElementRef, signal } from '@angular/core';\n\n/**\n * Configuration for listbox keyboard navigation.\n *\n * @property optionSelector - CSS selector for option elements\n * @property options - Function returning the current option list\n * @property host - Optional host element for scroll queries (defaults to inject(ElementRef))\n * @property placeholderIndex - Index for the placeholder item (-1 if none)\n * @property skipDisabled - Whether to skip disabled options during navigation\n */\nexport interface ListboxKeyboardConfig {\n optionSelector: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: () => any[];\n host?: ElementRef<HTMLElement>;\n placeholderIndex?: number;\n skipDisabled?: boolean;\n}\n\n/**\n * Shared arrow-key navigation for dropdown listboxes.\n *\n * Encapsulates `activeIndex`, `move(delta)`, `scrollActiveIntoView()`, and the\n * full `onKeydown()` handler. Components provide only their option list and\n * CSS selector.\n *\n * ```ts\n * private readonly kb = new ListboxKeyboard({\n * optionSelector: '.ngxsmk-combobox__option',\n * options: () => this.filtered(),\n * host: this.host,\n * });\n * ```\n */\nexport class ListboxKeyboard {\n readonly activeIndex = signal(-1);\n\n private readonly config: ListboxKeyboardConfig;\n\n constructor(config: ListboxKeyboardConfig) {\n this.config = config;\n }\n\n /** Override the host element used for scroll queries (e.g. for portals). */\n setHost(host: ElementRef<HTMLElement>): void {\n this.config.host = host;\n }\n\n /** Move the active index by `delta` positions, wrapping around. */\n move(delta: number): void {\n const opts = this.config.options();\n if (!opts.length) return;\n\n let next = this.activeIndex() + delta;\n const min = this.config.placeholderIndex ?? 0;\n\n for (let guard = 0; guard <= opts.length; guard++) {\n if (next < min) {\n next = opts.length - 1;\n } else if (next > opts.length - 1) {\n next = min;\n }\n if (!this.config.skipDisabled || next === min || !opts[next]?.disabled) {\n break;\n }\n next += delta;\n }\n\n this.activeIndex.set(next);\n this.scrollActiveIntoView();\n }\n\n /** Scroll the active option into view within the host element. */\n scrollActiveIntoView(): void {\n requestAnimationFrame(() => {\n const host = this.config.host?.nativeElement;\n if (!host) return;\n const items = host.querySelectorAll<HTMLElement>(this.config.optionSelector);\n let idx = this.activeIndex();\n // Offset by 1 if there's a placeholder before the options\n if (this.config.placeholderIndex !== undefined && idx >= 0) {\n idx += 1;\n }\n items[idx]?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n /** Jump to the first enabled option. */\n home(): void {\n const opts = this.config.options();\n if (!opts.length) return;\n const min = this.config.placeholderIndex ?? 0;\n if (this.config.skipDisabled) {\n const first = opts.findIndex((o) => !o.disabled);\n this.activeIndex.set(first >= 0 ? first : min);\n } else {\n this.activeIndex.set(min);\n }\n this.scrollActiveIntoView();\n }\n\n /** Jump to the last option. */\n end(): void {\n const opts = this.config.options();\n if (!opts.length) return;\n this.activeIndex.set(opts.length - 1);\n this.scrollActiveIntoView();\n }\n\n /**\n * Handle a keyboard event for listbox navigation.\n *\n * @returns `true` if the event was handled, `false` if the caller should\n * handle it (e.g. for typeahead or open/close toggling).\n */\n handleKeydown(\n event: KeyboardEvent,\n callbacks: {\n onSelect?: (index: number) => void;\n onOpen?: () => void;\n onClose?: () => void;\n isOpen?: () => boolean;\n } = {},\n ): boolean {\n const opts = this.config.options();\n const isOpen = callbacks.isOpen?.() ?? true;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!isOpen) {\n callbacks.onOpen?.();\n } else {\n this.move(1);\n }\n return true;\n\n case 'ArrowUp':\n event.preventDefault();\n if (isOpen) {\n this.move(-1);\n }\n return true;\n\n case 'Home':\n if (isOpen && opts.length) {\n event.preventDefault();\n this.home();\n }\n return true;\n\n case 'End':\n if (isOpen && opts.length) {\n event.preventDefault();\n this.end();\n }\n return true;\n\n case 'Enter':\n case ' ':\n case 'Spacebar':\n if (isOpen) {\n event.preventDefault();\n const idx = this.activeIndex();\n if (idx >= 0 && opts[idx]) {\n callbacks.onSelect?.(idx);\n }\n }\n return true;\n\n case 'Escape':\n if (isOpen) {\n event.preventDefault();\n callbacks.onClose?.();\n }\n return true;\n\n default:\n return false;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;AAoBA;;;;;;;;;;;;;;AAcG;MACU,eAAe,CAAA;AAK1B,IAAA,WAAA,CAAY,MAA6B,EAAA;AAJhC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAK/B,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;IACtB;;AAGA,IAAA,OAAO,CAAC,IAA6B,EAAA;AACnC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI;IACzB;;AAGA,IAAA,IAAI,CAAC,KAAa,EAAA;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;QAElB,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC;AAE7C,QAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACjD,YAAA,IAAI,IAAI,GAAG,GAAG,EAAE;AACd,gBAAA,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;YACxB;iBAAO,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjC,IAAI,GAAG,GAAG;YACZ;AACA,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE;gBACtE;YACF;YACA,IAAI,IAAI,KAAK;QACf;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,oBAAoB,EAAE;IAC7B;;IAGA,oBAAoB,GAAA;QAClB,qBAAqB,CAAC,MAAK;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa;AAC5C,YAAA,IAAI,CAAC,IAAI;gBAAE;AACX,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAc,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;AAC5E,YAAA,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;;AAE5B,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,IAAI,GAAG,IAAI,CAAC,EAAE;gBAC1D,GAAG,IAAI,CAAC;YACV;AACA,YAAA,KAAK,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAClD,QAAA,CAAC,CAAC;IACJ;;IAGA,IAAI,GAAA;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC;AAC7C,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AAC5B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAChD,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC;QAChD;aAAO;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;QAC3B;QACA,IAAI,CAAC,oBAAoB,EAAE;IAC7B;;IAGA,GAAG,GAAA;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;QAClB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,oBAAoB,EAAE;IAC7B;AAEA;;;;;AAKG;AACH,IAAA,aAAa,CACX,KAAoB,EACpB,SAAA,GAKI,EAAE,EAAA;QAEN,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAClC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,IAAI,IAAI;AAE3C,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,MAAM,EAAE;AACX,oBAAA,SAAS,CAAC,MAAM,IAAI;gBACtB;qBAAO;AACL,oBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACd;AACA,gBAAA,OAAO,IAAI;AAEb,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACf;AACA,gBAAA,OAAO,IAAI;AAEb,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE;oBACzB,KAAK,CAAC,cAAc,EAAE;oBACtB,IAAI,CAAC,IAAI,EAAE;gBACb;AACA,gBAAA,OAAO,IAAI;AAEb,YAAA,KAAK,KAAK;AACR,gBAAA,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE;oBACzB,KAAK,CAAC,cAAc,EAAE;oBACtB,IAAI,CAAC,GAAG,EAAE;gBACZ;AACA,gBAAA,OAAO,IAAI;AAEb,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,UAAU;gBACb,IAAI,MAAM,EAAE;oBACV,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;oBAC9B,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;AACzB,wBAAA,SAAS,CAAC,QAAQ,GAAG,GAAG,CAAC;oBAC3B;gBACF;AACA,gBAAA,OAAO,IAAI;AAEb,YAAA,KAAK,QAAQ;gBACX,IAAI,MAAM,EAAE;oBACV,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,SAAS,CAAC,OAAO,IAAI;gBACvB;AACA,gBAAA,OAAO,IAAI;AAEb,YAAA;AACE,gBAAA,OAAO,KAAK;;IAElB;AACD;;ACtLD;;AAEG;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-live-announcer.mjs","sources":["../../../../packages/cdk/live-announcer/live-announcer.ts","../../../../packages/cdk/live-announcer/ngxsmk-cdk-live-announcer.ts"],"sourcesContent":["import { Injectable, OnDestroy, inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nexport type AnnouncerPoliteness = 'polite' | 'assertive';\n\n/**\n * Announces messages to screen readers through a visually hidden\n * `aria-live` region appended to the document body.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxsmkLiveAnnouncer implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private region: HTMLElement | null = null;\n private clearTimer: ReturnType<typeof setTimeout> | null = null;\n\n announce(message: string, politeness: AnnouncerPoliteness = 'polite'): void {\n const region = this.ensureRegion();\n region.setAttribute('aria-live', politeness);\n\n // Clear first so repeating the same message is re-announced.\n region.textContent = '';\n setTimeout(() => (region.textContent = message));\n\n if (this.clearTimer) {\n clearTimeout(this.clearTimer);\n }\n this.clearTimer = setTimeout(() => (region.textContent = ''), 10_000);\n }\n\n ngOnDestroy(): void {\n if (this.clearTimer) {\n clearTimeout(this.clearTimer);\n }\n this.region?.remove();\n }\n\n private ensureRegion(): HTMLElement {\n if (!this.region) {\n const region = this.document.createElement('div');\n region.setAttribute('aria-atomic', 'true');\n region.className = 'ngxsmk-live-announcer';\n Object.assign(region.style, {\n position: 'absolute',\n width: '1px',\n height: '1px',\n margin: '-1px',\n padding: '0',\n border: '0',\n overflow: 'hidden',\n clipPath: 'inset(100%)',\n whiteSpace: 'nowrap',\n });\n this.document.body.appendChild(region);\n this.region = region;\n }\n return this.region;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAKA;;;AAGG;MAEU,mBAAmB,CAAA;AADhC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,IAAA,CAAA,MAAM,GAAuB,IAAI;QACjC,IAAA,CAAA,UAAU,GAAyC,IAAI;AA4ChE,IAAA;AA1CC,IAAA,QAAQ,CAAC,OAAe,EAAE,UAAA,GAAkC,QAAQ,EAAA;AAClE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,QAAA,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC;;AAG5C,QAAA,MAAM,CAAC,WAAW,GAAG,EAAE;AACvB,QAAA,UAAU,CAAC,OAAO,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC;AAEhD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC;IACvE;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;IACvB;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACjD,YAAA,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;AAC1C,YAAA,MAAM,CAAC,SAAS,GAAG,uBAAuB;AAC1C,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;AAC1B,gBAAA,QAAQ,EAAE,UAAU;AACpB,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,OAAO,EAAE,GAAG;AACZ,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,QAAQ,EAAE,aAAa;AACvB,gBAAA,UAAU,EAAE,QAAQ;AACrB,aAAA,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACtC,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACtB;QACA,OAAO,IAAI,CAAC,MAAM;IACpB;8GA9CW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACTlC;;AAEG
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-live-announcer.mjs","sources":["../../../../packages/cdk/live-announcer/live-announcer.ts","../../../../packages/cdk/live-announcer/ngxsmk-cdk-live-announcer.ts"],"sourcesContent":["import { Injectable, OnDestroy, inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nexport type AnnouncerPoliteness = 'polite' | 'assertive';\n\n/**\n * Announces messages to screen readers through a visually hidden\n * `aria-live` region appended to the document body.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxsmkLiveAnnouncer implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private region: HTMLElement | null = null;\n private clearTimer: ReturnType<typeof setTimeout> | null = null;\n\n announce(message: string, politeness: AnnouncerPoliteness = 'polite'): void {\n const region = this.ensureRegion();\n region.setAttribute('aria-live', politeness);\n\n // Clear first so repeating the same message is re-announced.\n region.textContent = '';\n setTimeout(() => (region.textContent = message));\n\n if (this.clearTimer) {\n clearTimeout(this.clearTimer);\n }\n this.clearTimer = setTimeout(() => (region.textContent = ''), 10_000);\n }\n\n ngOnDestroy(): void {\n if (this.clearTimer) {\n clearTimeout(this.clearTimer);\n }\n this.region?.remove();\n }\n\n private ensureRegion(): HTMLElement {\n if (!this.region) {\n const region = this.document.createElement('div');\n region.setAttribute('aria-atomic', 'true');\n region.className = 'ngxsmk-live-announcer';\n Object.assign(region.style, {\n position: 'absolute',\n width: '1px',\n height: '1px',\n margin: '-1px',\n padding: '0',\n border: '0',\n overflow: 'hidden',\n clipPath: 'inset(100%)',\n whiteSpace: 'nowrap',\n });\n this.document.body.appendChild(region);\n this.region = region;\n }\n return this.region;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAKA;;;AAGG;MAEU,mBAAmB,CAAA;AADhC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,IAAA,CAAA,MAAM,GAAuB,IAAI;QACjC,IAAA,CAAA,UAAU,GAAyC,IAAI;AA4ChE,IAAA;AA1CC,IAAA,QAAQ,CAAC,OAAe,EAAE,UAAA,GAAkC,QAAQ,EAAA;AAClE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,QAAA,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC;;AAG5C,QAAA,MAAM,CAAC,WAAW,GAAG,EAAE;AACvB,QAAA,UAAU,CAAC,OAAO,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC;AAEhD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC;IACvE;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;IACvB;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACjD,YAAA,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;AAC1C,YAAA,MAAM,CAAC,SAAS,GAAG,uBAAuB;AAC1C,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;AAC1B,gBAAA,QAAQ,EAAE,UAAU;AACpB,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,OAAO,EAAE,GAAG;AACZ,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,QAAQ,EAAE,aAAa;AACvB,gBAAA,UAAU,EAAE,QAAQ;AACrB,aAAA,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACtC,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACtB;QACA,OAAO,IAAI,CAAC,MAAM;IACpB;8GA9CW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACTlC;;AAEG;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-media-query.mjs","sources":["../../../../packages/cdk/media-query/media-query.ts","../../../../packages/cdk/media-query/ngxsmk-cdk-media-query.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Signal, inject, signal } from '@angular/core';\n\n/**\n * Reactive media query. Must be called in an injection context.\n *\n * ```ts\n * private readonly isMobile = injectMediaQuery('(max-width: 767px)');\n * ```\n */\nexport function injectMediaQuery(query: string): Signal<boolean> {\n const window = inject(DOCUMENT).defaultView;\n const matches = signal(false);\n\n const media = window?.matchMedia?.(query);\n if (media) {\n matches.set(media.matches);\n const listener = (event: MediaQueryListEvent) => matches.set(event.matches);\n media.addEventListener('change', listener);\n inject(DestroyRef).onDestroy(() => media.removeEventListener('change', listener));\n }\n\n return matches.asReadonly();\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAGA;;;;;;AAMG;AACG,SAAU,gBAAgB,CAAC,KAAa,EAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW;AAC3C,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;IAE7B,MAAM,KAAK,GAAG,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC;IACzC,IAAI,KAAK,EAAE;AACT,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAC1B,QAAA,MAAM,QAAQ,GAAG,CAAC,KAA0B,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAC3E,QAAA,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC1C,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnF;AAEA,IAAA,OAAO,OAAO,CAAC,UAAU,EAAE;AAC7B;;ACvBA;;AAEG
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-media-query.mjs","sources":["../../../../packages/cdk/media-query/media-query.ts","../../../../packages/cdk/media-query/ngxsmk-cdk-media-query.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Signal, inject, signal } from '@angular/core';\n\n/**\n * Reactive media query. Must be called in an injection context.\n *\n * ```ts\n * private readonly isMobile = injectMediaQuery('(max-width: 767px)');\n * ```\n */\nexport function injectMediaQuery(query: string): Signal<boolean> {\n const window = inject(DOCUMENT).defaultView;\n const matches = signal(false);\n\n const media = window?.matchMedia?.(query);\n if (media) {\n matches.set(media.matches);\n const listener = (event: MediaQueryListEvent) => matches.set(event.matches);\n media.addEventListener('change', listener);\n inject(DestroyRef).onDestroy(() => media.removeEventListener('change', listener));\n }\n\n return matches.asReadonly();\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAGA;;;;;;AAMG;AACG,SAAU,gBAAgB,CAAC,KAAa,EAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW;AAC3C,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;IAE7B,MAAM,KAAK,GAAG,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC;IACzC,IAAI,KAAK,EAAE;AACT,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAC1B,QAAA,MAAM,QAAQ,GAAG,CAAC,KAA0B,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAC3E,QAAA,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC1C,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnF;AAEA,IAAA,OAAO,OAAO,CAAC,UAAU,EAAE;AAC7B;;ACvBA;;AAEG;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-resize-observer.mjs","sources":["../../../../packages/cdk/resize-observer/resize-observer.ts","../../../../packages/cdk/resize-observer/ngxsmk-cdk-resize-observer.ts"],"sourcesContent":["import { DestroyRef, Directive, ElementRef, inject, input, output } from '@angular/core';\n\n/**\n * Emits when the host element's dimensions change.\n *\n * ```html\n * <div [ngxsmkResizeObserver] (resized)=\"onResize($event)\">…</div>\n * ```\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkResizeObserver]',\n})\nexport class NgxsmkResizeObserver {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly debounceMs = input<number>(0);\n readonly resized = output<ResizeObserverEntry>();\n\n private observer: ResizeObserver | null = null;\n private timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n if (typeof window === 'undefined' || !('ResizeObserver' in window)) {\n return;\n }\n\n this.observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) {\n return;\n }\n\n const debounce = this.debounceMs();\n if (debounce > 0) {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n this.timeoutId = setTimeout(() => {\n this.resized.emit(entry);\n }, debounce);\n } else {\n this.resized.emit(entry);\n }\n });\n\n this.observer.observe(this.elementRef.nativeElement);\n\n this.destroyRef.onDestroy(() => {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n if (this.observer) {\n this.observer.disconnect();\n }\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;AAMG;MAKU,oBAAoB,CAAA;AAU/B,IAAA,WAAA,GAAA;AATiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AACxD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEvC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAS,CAAC,CAAC;QAC7B,IAAA,CAAA,OAAO,GAAG,MAAM,EAAuB;QAExC,IAAA,CAAA,QAAQ,GAA0B,IAAI;QACtC,IAAA,CAAA,SAAS,GAAyC,IAAI;AAG5D,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,EAAE,gBAAgB,IAAI,MAAM,CAAC,EAAE;YAClE;QACF;QAEA,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AAC7C,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,EAAE;gBACV;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE;AAClC,YAAA,IAAI,QAAQ,GAAG,CAAC,EAAE;AAChB,gBAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,oBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC9B;AACA,gBAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;AAC/B,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC1B,CAAC,EAAE,QAAQ,CAAC;YACd;iBAAO;AACL,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1B;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAEpD,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;YAC9B;AACA,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;YAC5B;AACF,QAAA,CAAC,CAAC;IACJ;8GA5CW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,wBAAwB;AACnC,iBAAA;;;ACZD;;AAEG
|
|
1
|
+
{"version":3,"file":"ngxsmk-cdk-resize-observer.mjs","sources":["../../../../packages/cdk/resize-observer/resize-observer.ts","../../../../packages/cdk/resize-observer/ngxsmk-cdk-resize-observer.ts"],"sourcesContent":["import { DestroyRef, Directive, ElementRef, inject, input, output } from '@angular/core';\n\n/**\n * Emits when the host element's dimensions change.\n *\n * ```html\n * <div [ngxsmkResizeObserver] (resized)=\"onResize($event)\">…</div>\n * ```\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkResizeObserver]',\n})\nexport class NgxsmkResizeObserver {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly debounceMs = input<number>(0);\n readonly resized = output<ResizeObserverEntry>();\n\n private observer: ResizeObserver | null = null;\n private timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n if (typeof window === 'undefined' || !('ResizeObserver' in window)) {\n return;\n }\n\n this.observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) {\n return;\n }\n\n const debounce = this.debounceMs();\n if (debounce > 0) {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n this.timeoutId = setTimeout(() => {\n this.resized.emit(entry);\n }, debounce);\n } else {\n this.resized.emit(entry);\n }\n });\n\n this.observer.observe(this.elementRef.nativeElement);\n\n this.destroyRef.onDestroy(() => {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n if (this.observer) {\n this.observer.disconnect();\n }\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;AAMG;MAKU,oBAAoB,CAAA;AAU/B,IAAA,WAAA,GAAA;AATiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AACxD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEvC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAS,CAAC,CAAC;QAC7B,IAAA,CAAA,OAAO,GAAG,MAAM,EAAuB;QAExC,IAAA,CAAA,QAAQ,GAA0B,IAAI;QACtC,IAAA,CAAA,SAAS,GAAyC,IAAI;AAG5D,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,EAAE,gBAAgB,IAAI,MAAM,CAAC,EAAE;YAClE;QACF;QAEA,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AAC7C,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,EAAE;gBACV;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE;AAClC,YAAA,IAAI,QAAQ,GAAG,CAAC,EAAE;AAChB,gBAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,oBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC9B;AACA,gBAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;AAC/B,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC1B,CAAC,EAAE,QAAQ,CAAC;YACd;iBAAO;AACL,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1B;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAEpD,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;YAC9B;AACA,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;YAC5B;AACF,QAAA,CAAC,CAAC;IACJ;8GA5CW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,wBAAwB;AACnC,iBAAA;;;ACZD;;AAEG;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-cdk-roving-focus.mjs","sources":["../../../../packages/cdk/roving-focus/roving-focus.ts","../../../../packages/cdk/roving-focus/ngxsmk-cdk-roving-focus.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n InjectionToken,\n OnDestroy,\n WritableSignal,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nexport type NgxsmkRovingOrientation = 'horizontal' | 'vertical' | 'both';\n\nexport interface NgxsmkRovingFocusContext {\n register(item: NgxsmkRovingFocusItem): void;\n unregister(item: NgxsmkRovingFocusItem): void;\n focusNext(current: NgxsmkRovingFocusItem): void;\n focusPrev(current: NgxsmkRovingFocusItem): void;\n focusFirst(): void;\n focusLast(): void;\n activeItem: WritableSignal<NgxsmkRovingFocusItem | null>;\n orientation: () => NgxsmkRovingOrientation;\n loop: () => boolean;\n}\n\nexport const NGXSMK_ROVING_FOCUS_GROUP = new InjectionToken<NgxsmkRovingFocusContext>(\n 'NGXSMK_ROVING_FOCUS_GROUP',\n);\n\n/**\n * Universal signals-native Roving Focus container directive.\n * Manages keyboard navigation (Arrow keys, Home, End) across a set of items,\n * keeping only the currently active item focusable via Tab (`tabindex=\"0\"` vs `\"-1\"`).\n *\n * ```html\n * <div ngxsmkRovingFocusGroup orientation=\"horizontal\" [loop]=\"true\">\n * <button ngxsmkRovingFocusItem>Tab 1</button>\n * <button ngxsmkRovingFocusItem>Tab 2</button>\n * </div>\n * ```\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkRovingFocusGroup]',\n providers: [\n {\n provide: NGXSMK_ROVING_FOCUS_GROUP,\n useExisting: NgxsmkRovingFocusGroup,\n },\n ],\n})\nexport class NgxsmkRovingFocusGroup implements NgxsmkRovingFocusContext {\n readonly orientation = input<NgxsmkRovingOrientation>('horizontal');\n readonly loop = input(true, { transform: booleanAttribute });\n\n private readonly items = signal<NgxsmkRovingFocusItem[]>([]);\n readonly activeItem = signal<NgxsmkRovingFocusItem | null>(null);\n\n register(item: NgxsmkRovingFocusItem): void {\n this.items.update((list) => [...list, item]);\n if (this.activeItem() === null && !item.disabled()) {\n this.activeItem.set(item);\n }\n }\n\n unregister(item: NgxsmkRovingFocusItem): void {\n this.items.update((list) => list.filter((i) => i !== item));\n if (this.activeItem() === item) {\n const remaining = this.items().filter((i) => !i.disabled());\n this.activeItem.set(remaining.length > 0 ? remaining[0] : null);\n }\n }\n\n focusNext(current: NgxsmkRovingFocusItem): void {\n const list = this.items().filter((i) => !i.disabled());\n const idx = list.indexOf(current);\n if (idx === -1) return;\n\n if (idx < list.length - 1) {\n const next = list[idx + 1];\n this.setActiveAndFocus(next);\n } else if (this.loop()) {\n const first = list[0];\n this.setActiveAndFocus(first);\n }\n }\n\n focusPrev(current: NgxsmkRovingFocusItem): void {\n const list = this.items().filter((i) => !i.disabled());\n const idx = list.indexOf(current);\n if (idx === -1) return;\n\n if (idx > 0) {\n const prev = list[idx - 1];\n this.setActiveAndFocus(prev);\n } else if (this.loop()) {\n const last = list[list.length - 1];\n this.setActiveAndFocus(last);\n }\n }\n\n focusFirst(): void {\n const list = this.items().filter((i) => !i.disabled());\n if (list.length > 0) {\n this.setActiveAndFocus(list[0]);\n }\n }\n\n focusLast(): void {\n const list = this.items().filter((i) => !i.disabled());\n if (list.length > 0) {\n this.setActiveAndFocus(list[list.length - 1]);\n }\n }\n\n private setActiveAndFocus(item: NgxsmkRovingFocusItem): void {\n this.activeItem.set(item);\n item.focus();\n }\n}\n\n/**\n * Item in a Roving Focus group. Binds `[tabindex]` dynamically based on active state.\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkRovingFocusItem]',\n host: {\n '[attr.tabindex]': 'tabIndex()',\n '(keydown)': 'handleKeydown($event)',\n '(focus)': 'handleFocus()',\n },\n})\nexport class NgxsmkRovingFocusItem implements OnDestroy {\n private readonly group = inject(NGXSMK_ROVING_FOCUS_GROUP);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly focused = output<void>();\n\n readonly isActive = computed(() => this.group.activeItem() === this);\n readonly tabIndex = computed(() => {\n if (this.disabled()) return -1;\n return this.isActive() ? 0 : -1;\n });\n\n constructor() {\n this.group.register(this);\n }\n\n ngOnDestroy(): void {\n this.group.unregister(this);\n }\n\n focus(): void {\n this.elRef.nativeElement.focus();\n }\n\n protected handleFocus(): void {\n if (!this.disabled()) {\n this.group.activeItem.set(this);\n this.focused.emit();\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n\n const orient = this.group.orientation();\n const isHoriz = orient === 'horizontal' || orient === 'both';\n const isVert = orient === 'vertical' || orient === 'both';\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n if ((event.key === 'ArrowRight' && isHoriz) || (event.key === 'ArrowDown' && isVert)) {\n event.preventDefault();\n this.group.focusNext(this);\n }\n break;\n\n case 'ArrowLeft':\n case 'ArrowUp':\n if ((event.key === 'ArrowLeft' && isHoriz) || (event.key === 'ArrowUp' && isVert)) {\n event.preventDefault();\n this.group.focusPrev(this);\n }\n break;\n\n case 'Home':\n event.preventDefault();\n this.group.focusFirst();\n break;\n\n case 'End':\n event.preventDefault();\n this.group.focusLast();\n break;\n }\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":"ngxsmk-cdk-roving-focus.mjs","sources":["../../../../packages/cdk/roving-focus/roving-focus.ts","../../../../packages/cdk/roving-focus/ngxsmk-cdk-roving-focus.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n InjectionToken,\n OnDestroy,\n WritableSignal,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nexport type NgxsmkRovingOrientation = 'horizontal' | 'vertical' | 'both';\n\nexport interface NgxsmkRovingFocusContext {\n register(item: NgxsmkRovingFocusItem): void;\n unregister(item: NgxsmkRovingFocusItem): void;\n focusNext(current: NgxsmkRovingFocusItem): void;\n focusPrev(current: NgxsmkRovingFocusItem): void;\n focusFirst(): void;\n focusLast(): void;\n activeItem: WritableSignal<NgxsmkRovingFocusItem | null>;\n orientation: () => NgxsmkRovingOrientation;\n loop: () => boolean;\n}\n\nexport const NGXSMK_ROVING_FOCUS_GROUP = new InjectionToken<NgxsmkRovingFocusContext>(\n 'NGXSMK_ROVING_FOCUS_GROUP',\n);\n\n/**\n * Universal signals-native Roving Focus container directive.\n * Manages keyboard navigation (Arrow keys, Home, End) across a set of items,\n * keeping only the currently active item focusable via Tab (`tabindex=\"0\"` vs `\"-1\"`).\n *\n * ```html\n * <div ngxsmkRovingFocusGroup orientation=\"horizontal\" [loop]=\"true\">\n * <button ngxsmkRovingFocusItem>Tab 1</button>\n * <button ngxsmkRovingFocusItem>Tab 2</button>\n * </div>\n * ```\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkRovingFocusGroup]',\n providers: [\n {\n provide: NGXSMK_ROVING_FOCUS_GROUP,\n useExisting: NgxsmkRovingFocusGroup,\n },\n ],\n})\nexport class NgxsmkRovingFocusGroup implements NgxsmkRovingFocusContext {\n readonly orientation = input<NgxsmkRovingOrientation>('horizontal');\n readonly loop = input(true, { transform: booleanAttribute });\n\n private readonly items = signal<NgxsmkRovingFocusItem[]>([]);\n readonly activeItem = signal<NgxsmkRovingFocusItem | null>(null);\n\n register(item: NgxsmkRovingFocusItem): void {\n this.items.update((list) => [...list, item]);\n if (this.activeItem() === null && !item.disabled()) {\n this.activeItem.set(item);\n }\n }\n\n unregister(item: NgxsmkRovingFocusItem): void {\n this.items.update((list) => list.filter((i) => i !== item));\n if (this.activeItem() === item) {\n const remaining = this.items().filter((i) => !i.disabled());\n this.activeItem.set(remaining.length > 0 ? remaining[0] : null);\n }\n }\n\n focusNext(current: NgxsmkRovingFocusItem): void {\n const list = this.items().filter((i) => !i.disabled());\n const idx = list.indexOf(current);\n if (idx === -1) return;\n\n if (idx < list.length - 1) {\n const next = list[idx + 1];\n this.setActiveAndFocus(next);\n } else if (this.loop()) {\n const first = list[0];\n this.setActiveAndFocus(first);\n }\n }\n\n focusPrev(current: NgxsmkRovingFocusItem): void {\n const list = this.items().filter((i) => !i.disabled());\n const idx = list.indexOf(current);\n if (idx === -1) return;\n\n if (idx > 0) {\n const prev = list[idx - 1];\n this.setActiveAndFocus(prev);\n } else if (this.loop()) {\n const last = list[list.length - 1];\n this.setActiveAndFocus(last);\n }\n }\n\n focusFirst(): void {\n const list = this.items().filter((i) => !i.disabled());\n if (list.length > 0) {\n this.setActiveAndFocus(list[0]);\n }\n }\n\n focusLast(): void {\n const list = this.items().filter((i) => !i.disabled());\n if (list.length > 0) {\n this.setActiveAndFocus(list[list.length - 1]);\n }\n }\n\n private setActiveAndFocus(item: NgxsmkRovingFocusItem): void {\n this.activeItem.set(item);\n item.focus();\n }\n}\n\n/**\n * Item in a Roving Focus group. Binds `[tabindex]` dynamically based on active state.\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkRovingFocusItem]',\n host: {\n '[attr.tabindex]': 'tabIndex()',\n '(keydown)': 'handleKeydown($event)',\n '(focus)': 'handleFocus()',\n },\n})\nexport class NgxsmkRovingFocusItem implements OnDestroy {\n private readonly group = inject(NGXSMK_ROVING_FOCUS_GROUP);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly focused = output<void>();\n\n readonly isActive = computed(() => this.group.activeItem() === this);\n readonly tabIndex = computed(() => {\n if (this.disabled()) return -1;\n return this.isActive() ? 0 : -1;\n });\n\n constructor() {\n this.group.register(this);\n }\n\n ngOnDestroy(): void {\n this.group.unregister(this);\n }\n\n focus(): void {\n this.elRef.nativeElement.focus();\n }\n\n protected handleFocus(): void {\n if (!this.disabled()) {\n this.group.activeItem.set(this);\n this.focused.emit();\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n\n const orient = this.group.orientation();\n const isHoriz = orient === 'horizontal' || orient === 'both';\n const isVert = orient === 'vertical' || orient === 'both';\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n if ((event.key === 'ArrowRight' && isHoriz) || (event.key === 'ArrowDown' && isVert)) {\n event.preventDefault();\n this.group.focusNext(this);\n }\n break;\n\n case 'ArrowLeft':\n case 'ArrowUp':\n if ((event.key === 'ArrowLeft' && isHoriz) || (event.key === 'ArrowUp' && isVert)) {\n event.preventDefault();\n this.group.focusPrev(this);\n }\n break;\n\n case 'Home':\n event.preventDefault();\n this.group.focusFirst();\n break;\n\n case 'End':\n event.preventDefault();\n this.group.focusLast();\n break;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|