@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.
Files changed (42) hide show
  1. package/README.md +1 -1
  2. package/esm2022/input-group/input-group-engine.mjs +53 -28
  3. package/esm2022/public-api.mjs +2 -1
  4. package/esm2022/state-machine/create-machine.mjs +38 -0
  5. package/esm2022/state-machine/create-presence.mjs +70 -0
  6. package/esm2022/state-machine/index.mjs +3 -0
  7. package/esm2022/state-machine/ngxsmk-cdk-state-machine.mjs +5 -0
  8. package/fesm2022/ngxsmk-cdk-autofocus.mjs.map +1 -1
  9. package/fesm2022/ngxsmk-cdk-click-outside.mjs.map +1 -1
  10. package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -1
  11. package/fesm2022/ngxsmk-cdk-focus-trap.mjs.map +1 -1
  12. package/fesm2022/ngxsmk-cdk-focusable.mjs.map +1 -1
  13. package/fesm2022/ngxsmk-cdk-input-group.mjs +52 -27
  14. package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -1
  15. package/fesm2022/ngxsmk-cdk-intersection-observer.mjs.map +1 -1
  16. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -1
  17. package/fesm2022/ngxsmk-cdk-live-announcer.mjs.map +1 -1
  18. package/fesm2022/ngxsmk-cdk-media-query.mjs.map +1 -1
  19. package/fesm2022/ngxsmk-cdk-resize-observer.mjs.map +1 -1
  20. package/fesm2022/ngxsmk-cdk-roving-focus.mjs.map +1 -1
  21. package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -1
  22. package/fesm2022/ngxsmk-cdk-scroll-lock.mjs.map +1 -1
  23. package/fesm2022/ngxsmk-cdk-skip-link.mjs.map +1 -1
  24. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -1
  25. package/fesm2022/ngxsmk-cdk-state-machine.mjs +113 -0
  26. package/fesm2022/ngxsmk-cdk-state-machine.mjs.map +1 -0
  27. package/fesm2022/ngxsmk-cdk-testing.mjs.map +1 -1
  28. package/fesm2022/ngxsmk-cdk-visually-hidden.mjs.map +1 -1
  29. package/fesm2022/ngxsmk-cdk.mjs +1 -0
  30. package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
  31. package/input-group/input-group-engine.d.ts +3 -0
  32. package/input-group/input-group-engine.d.ts.map +1 -1
  33. package/package.json +41 -29
  34. package/public-api.d.ts +1 -0
  35. package/public-api.d.ts.map +1 -1
  36. package/state-machine/create-machine.d.ts +37 -0
  37. package/state-machine/create-machine.d.ts.map +1 -0
  38. package/state-machine/create-presence.d.ts +29 -0
  39. package/state-machine/create-presence.d.ts.map +1 -0
  40. package/state-machine/index.d.ts +3 -0
  41. package/state-machine/index.d.ts.map +1 -0
  42. 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
- return;
163
- }
164
- // Built-in validations
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
- if (this.isUnderLength()) {
178
- this.status.set('error');
179
- this.message.set(`Minimum ${this.minLength()} characters`);
180
- this.onValidationChange()('error', `Minimum ${this.minLength()} characters`);
181
- return;
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
- const result = await asyncValidator(value);
195
- if (this.value() === value) {
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":";;AAuBA;;;AAGG;MACU,gBAAgB,CAAA;AA4D3B,IAAA,WAAA,CAAY,SAAiC,EAAE,EAAA;AAzDtC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACvB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACvB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACvB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACrB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAmB,MAAM,CAAC;AACzC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC;AACpB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;AACxB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;AACxB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACvB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAoB,EAAE,CAAC;AAQtC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC;AACxB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;AAClB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC;AACjB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;AACxB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAqB,SAAS,CAAC;AACjD,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAqB,SAAS,CAAC;AACjD,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;AACzB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;AACxB,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;QA4B9B,IAAA,CAAA,WAAW,GAAyC,IAAI;AAG9D,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM;;QAGrB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,UAAU,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,aAAa,CAAC;QACtD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC3C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;QAC7C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC;AAErD,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB;;AAGA,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAK;;AAE3B,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAK;;AAE1B,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAK;;AAE5B,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAK;;AAE3B,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,MAAK;;AAEtC,QAAA,CAAC,CAAC;;AAIF,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC;AAEpD,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAEzD,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;AAEnE,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAK;AAChC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;AAC5B,YAAA,OAAO,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK;AACxD,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAK;AACjC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;YAC5B,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK;AAC1E,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,OAAO,CAAC;AACzD,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,SAAS,CAAC;AAC7D,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,SAAS,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;AAE/F,QAAA,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,MAAK;YACnC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AAC9C,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAK;YAC/B,IAAI,IAAI,CAAC,aAAa,EAAE;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;AACrE,YAAA,OAAO,KAAK;AACd,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QAE1F,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;AAE5F,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAEnE,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAK;AAC7B,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU,EAAE;AAC9B,gBAAA,OAAO,IAAI,CAAC,eAAe,EAAE,GAAG,MAAM,GAAG,UAAU;YACrD;AACA,YAAA,OAAO,IAAI,CAAC,IAAI,EAAE;AACpB,QAAA,CAAC,CAAC;IACJ;;AAIA,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC;IACxB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AACjB,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE;IAClB;IAEA,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;IACrB;;IAIA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE;IAClB;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,MAAM,EAAE,EAAE;IACjB;;IAIA,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC;;IAIA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB;;AAIA,IAAA,QAAQ,CAAC,KAAsB,EAAA;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;IAChD;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA;QACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D;;AAIA,IAAA,SAAS,CAAC,MAAwB,EAAE,OAAO,GAAG,EAAE,EAAA;AAC9C,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5C;AAEQ,IAAA,cAAc,CAAC,KAAa,EAAA;AAClC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS;QACxC,IAAI,SAAS,EAAE;AACb,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;AAChC,YAAA,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC;YACxD;QACF;;QAGA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE;AAC7B,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;YAC1C,IAAI,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,wBAAwB,CAAC;YAC5D;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,SAAS,EAAE,CAAA,WAAA,CAAa,CAAC;AAC1D,YAAA,IAAI,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,CAAA,QAAA,EAAW,IAAI,CAAC,SAAS,EAAE,CAAA,WAAA,CAAa,CAAC;YAC5E;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,SAAS,EAAE,CAAA,WAAA,CAAa,CAAC;AAC1D,YAAA,IAAI,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,CAAA,QAAA,EAAW,IAAI,CAAC,SAAS,EAAE,CAAA,WAAA,CAAa,CAAC;YAC5E;QACF;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;;AAGrC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc;AAClD,QAAA,IAAI,cAAc,IAAI,KAAK,EAAE;YAC3B,IAAI,IAAI,CAAC,WAAW;AAAE,gBAAA,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;AACpD,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,YAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,YAAW;AACvC,gBAAA,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC;AAC1C,gBAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,EAAE;AAC1B,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;oBACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC;YACF,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,GAAG,CAAC;QACvC;IACF;;IAIA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;AAC/C,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;IACjC;;IAIA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AACD;;AC9TD;;AAEG;;;;"}
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":"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"}
@@ -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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"}