@skra/ui 0.2.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/LICENSE +201 -0
- package/NOTICE +7 -0
- package/README.md +39 -0
- package/consumer-guide/README.md +84 -0
- package/consumer-guide/accessible-names.md +80 -0
- package/consumer-guide/forms-and-binding.md +149 -0
- package/consumer-guide/layout.md +86 -0
- package/consumer-guide/overlays.md +100 -0
- package/consumer-guide/setup-and-gotchas.md +103 -0
- package/consumer-guide/theming-and-encapsulation.md +115 -0
- package/consumer-guide/wrapping-patterns.md +90 -0
- package/fesm2022/skra-ui-accordion.mjs +333 -0
- package/fesm2022/skra-ui-accordion.mjs.map +1 -0
- package/fesm2022/skra-ui-alert.mjs +110 -0
- package/fesm2022/skra-ui-alert.mjs.map +1 -0
- package/fesm2022/skra-ui-avatar.mjs +83 -0
- package/fesm2022/skra-ui-avatar.mjs.map +1 -0
- package/fesm2022/skra-ui-badge.mjs +91 -0
- package/fesm2022/skra-ui-badge.mjs.map +1 -0
- package/fesm2022/skra-ui-button.mjs +67 -0
- package/fesm2022/skra-ui-button.mjs.map +1 -0
- package/fesm2022/skra-ui-checkbox.mjs +98 -0
- package/fesm2022/skra-ui-checkbox.mjs.map +1 -0
- package/fesm2022/skra-ui-chip.mjs +82 -0
- package/fesm2022/skra-ui-chip.mjs.map +1 -0
- package/fesm2022/skra-ui-combobox.mjs +335 -0
- package/fesm2022/skra-ui-combobox.mjs.map +1 -0
- package/fesm2022/skra-ui-core.mjs +529 -0
- package/fesm2022/skra-ui-core.mjs.map +1 -0
- package/fesm2022/skra-ui-counter.mjs +53 -0
- package/fesm2022/skra-ui-counter.mjs.map +1 -0
- package/fesm2022/skra-ui-datepicker.mjs +867 -0
- package/fesm2022/skra-ui-datepicker.mjs.map +1 -0
- package/fesm2022/skra-ui-dialog.mjs +133 -0
- package/fesm2022/skra-ui-dialog.mjs.map +1 -0
- package/fesm2022/skra-ui-field.mjs +293 -0
- package/fesm2022/skra-ui-field.mjs.map +1 -0
- package/fesm2022/skra-ui-icon.mjs +54 -0
- package/fesm2022/skra-ui-icon.mjs.map +1 -0
- package/fesm2022/skra-ui-input.mjs +42 -0
- package/fesm2022/skra-ui-input.mjs.map +1 -0
- package/fesm2022/skra-ui-kbd.mjs +44 -0
- package/fesm2022/skra-ui-kbd.mjs.map +1 -0
- package/fesm2022/skra-ui-layout.mjs +119 -0
- package/fesm2022/skra-ui-layout.mjs.map +1 -0
- package/fesm2022/skra-ui-link.mjs +29 -0
- package/fesm2022/skra-ui-link.mjs.map +1 -0
- package/fesm2022/skra-ui-loading-indicator.mjs +24 -0
- package/fesm2022/skra-ui-loading-indicator.mjs.map +1 -0
- package/fesm2022/skra-ui-menu.mjs +334 -0
- package/fesm2022/skra-ui-menu.mjs.map +1 -0
- package/fesm2022/skra-ui-multi-select.mjs +179 -0
- package/fesm2022/skra-ui-multi-select.mjs.map +1 -0
- package/fesm2022/skra-ui-native-select.mjs +123 -0
- package/fesm2022/skra-ui-native-select.mjs.map +1 -0
- package/fesm2022/skra-ui-popover.mjs +158 -0
- package/fesm2022/skra-ui-popover.mjs.map +1 -0
- package/fesm2022/skra-ui-progress.mjs +57 -0
- package/fesm2022/skra-ui-progress.mjs.map +1 -0
- package/fesm2022/skra-ui-radio.mjs +92 -0
- package/fesm2022/skra-ui-radio.mjs.map +1 -0
- package/fesm2022/skra-ui-rating-display.mjs +81 -0
- package/fesm2022/skra-ui-rating-display.mjs.map +1 -0
- package/fesm2022/skra-ui-select.mjs +151 -0
- package/fesm2022/skra-ui-select.mjs.map +1 -0
- package/fesm2022/skra-ui-skeleton.mjs +65 -0
- package/fesm2022/skra-ui-skeleton.mjs.map +1 -0
- package/fesm2022/skra-ui-star-rating.mjs +110 -0
- package/fesm2022/skra-ui-star-rating.mjs.map +1 -0
- package/fesm2022/skra-ui-status-dot.mjs +61 -0
- package/fesm2022/skra-ui-status-dot.mjs.map +1 -0
- package/fesm2022/skra-ui-switch.mjs +94 -0
- package/fesm2022/skra-ui-switch.mjs.map +1 -0
- package/fesm2022/skra-ui-tabs.mjs +356 -0
- package/fesm2022/skra-ui-tabs.mjs.map +1 -0
- package/fesm2022/skra-ui-textarea.mjs +81 -0
- package/fesm2022/skra-ui-textarea.mjs.map +1 -0
- package/fesm2022/skra-ui-toast.mjs +208 -0
- package/fesm2022/skra-ui-toast.mjs.map +1 -0
- package/fesm2022/skra-ui-tooltip.mjs +252 -0
- package/fesm2022/skra-ui-tooltip.mjs.map +1 -0
- package/fesm2022/skra-ui-typography.mjs +35 -0
- package/fesm2022/skra-ui-typography.mjs.map +1 -0
- package/fesm2022/skra-ui.mjs +4 -0
- package/fesm2022/skra-ui.mjs.map +1 -0
- package/package.json +175 -0
- package/types/skra-ui-accordion.d.ts +196 -0
- package/types/skra-ui-accordion.d.ts.map +1 -0
- package/types/skra-ui-alert.d.ts +81 -0
- package/types/skra-ui-alert.d.ts.map +1 -0
- package/types/skra-ui-avatar.d.ts +71 -0
- package/types/skra-ui-avatar.d.ts.map +1 -0
- package/types/skra-ui-badge.d.ts +73 -0
- package/types/skra-ui-badge.d.ts.map +1 -0
- package/types/skra-ui-button.d.ts +45 -0
- package/types/skra-ui-button.d.ts.map +1 -0
- package/types/skra-ui-checkbox.d.ts +52 -0
- package/types/skra-ui-checkbox.d.ts.map +1 -0
- package/types/skra-ui-chip.d.ts +60 -0
- package/types/skra-ui-chip.d.ts.map +1 -0
- package/types/skra-ui-combobox.d.ts +95 -0
- package/types/skra-ui-combobox.d.ts.map +1 -0
- package/types/skra-ui-core.d.ts +314 -0
- package/types/skra-ui-core.d.ts.map +1 -0
- package/types/skra-ui-counter.d.ts +33 -0
- package/types/skra-ui-counter.d.ts.map +1 -0
- package/types/skra-ui-datepicker.d.ts +164 -0
- package/types/skra-ui-datepicker.d.ts.map +1 -0
- package/types/skra-ui-dialog.d.ts +59 -0
- package/types/skra-ui-dialog.d.ts.map +1 -0
- package/types/skra-ui-field.d.ts +181 -0
- package/types/skra-ui-field.d.ts.map +1 -0
- package/types/skra-ui-icon.d.ts +38 -0
- package/types/skra-ui-icon.d.ts.map +1 -0
- package/types/skra-ui-input.d.ts +22 -0
- package/types/skra-ui-input.d.ts.map +1 -0
- package/types/skra-ui-kbd.d.ts +33 -0
- package/types/skra-ui-kbd.d.ts.map +1 -0
- package/types/skra-ui-layout.d.ts +86 -0
- package/types/skra-ui-layout.d.ts.map +1 -0
- package/types/skra-ui-link.d.ts +20 -0
- package/types/skra-ui-link.d.ts.map +1 -0
- package/types/skra-ui-loading-indicator.d.ts +9 -0
- package/types/skra-ui-loading-indicator.d.ts.map +1 -0
- package/types/skra-ui-menu.d.ts +116 -0
- package/types/skra-ui-menu.d.ts.map +1 -0
- package/types/skra-ui-multi-select.d.ts +47 -0
- package/types/skra-ui-multi-select.d.ts.map +1 -0
- package/types/skra-ui-native-select.d.ts +74 -0
- package/types/skra-ui-native-select.d.ts.map +1 -0
- package/types/skra-ui-popover.d.ts +57 -0
- package/types/skra-ui-popover.d.ts.map +1 -0
- package/types/skra-ui-progress.d.ts +41 -0
- package/types/skra-ui-progress.d.ts.map +1 -0
- package/types/skra-ui-radio.d.ts +54 -0
- package/types/skra-ui-radio.d.ts.map +1 -0
- package/types/skra-ui-rating-display.d.ts +56 -0
- package/types/skra-ui-rating-display.d.ts.map +1 -0
- package/types/skra-ui-select.d.ts +43 -0
- package/types/skra-ui-select.d.ts.map +1 -0
- package/types/skra-ui-skeleton.d.ts +42 -0
- package/types/skra-ui-skeleton.d.ts.map +1 -0
- package/types/skra-ui-star-rating.d.ts +71 -0
- package/types/skra-ui-star-rating.d.ts.map +1 -0
- package/types/skra-ui-status-dot.d.ts +62 -0
- package/types/skra-ui-status-dot.d.ts.map +1 -0
- package/types/skra-ui-switch.d.ts +54 -0
- package/types/skra-ui-switch.d.ts.map +1 -0
- package/types/skra-ui-tabs.d.ts +191 -0
- package/types/skra-ui-tabs.d.ts.map +1 -0
- package/types/skra-ui-textarea.d.ts +55 -0
- package/types/skra-ui-textarea.d.ts.map +1 -0
- package/types/skra-ui-toast.d.ts +140 -0
- package/types/skra-ui-toast.d.ts.map +1 -0
- package/types/skra-ui-tooltip.d.ts +90 -0
- package/types/skra-ui-tooltip.d.ts.map +1 -0
- package/types/skra-ui-typography.d.ts +17 -0
- package/types/skra-ui-typography.d.ts.map +1 -0
- package/types/skra-ui.d.ts +3 -0
- package/types/skra-ui.d.ts.map +1 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* DialogSize — width bucket (Variant Surface, ADR 035 Size axis).
|
|
5
|
+
* Closed enum; extension requires an ADR 035 amendment.
|
|
6
|
+
*/
|
|
7
|
+
type DialogSize = 'sm' | 'md' | 'lg';
|
|
8
|
+
/**
|
|
9
|
+
* SkraDialog — a Component on the native `<dialog>` host (ADR 012/040/041), rendered in the
|
|
10
|
+
* browser TOP LAYER via `showModal()` (ADR 0044 — no portal, no z-index, dependency-free).
|
|
11
|
+
*
|
|
12
|
+
* Forge owns the token-driven surface + size + enter/leave motion (see `dialog.scss`) and the
|
|
13
|
+
* focus contract (ADR 0044 §3 rule 8): deterministic INITIAL focus via the native `autofocus`
|
|
14
|
+
* attribute (consumer-placed), plus a focus-RETURN safety net. Open/closed state, `role="dialog"`,
|
|
15
|
+
* `aria-modal`, Escape, the `::backdrop` scrim, scroll-lock and focus containment are NATIVE
|
|
16
|
+
* (the scrim + scroll-lock live in the global `_overlay.scss` slice). Accessible name is consumer
|
|
17
|
+
* `aria-labelledby` → projected heading (ADR 033 container carve-out — no `ariaLabel` input).
|
|
18
|
+
*
|
|
19
|
+
* Full contract: adr/specs/component-dialog-spec.md.
|
|
20
|
+
*/
|
|
21
|
+
declare class SkraDialog {
|
|
22
|
+
/** Width bucket (ADR 035). No look inputs (ADR 025); no `ariaLabel` (ADR 033). */
|
|
23
|
+
readonly size: _angular_core.InputSignal<DialogSize>;
|
|
24
|
+
/**
|
|
25
|
+
* Emitted from `showModal()` once the dialog has entered the top layer. Fills a genuine
|
|
26
|
+
* NATIVE GAP — `<dialog>` fires no "open" event, so the dialog's owner otherwise cannot
|
|
27
|
+
* observe opening decoupled from whoever called `showModal()` (lazy content, analytics, …).
|
|
28
|
+
*
|
|
29
|
+
* There is deliberately NO `closed`/`cancel` output (native-first, boundary #9): the native
|
|
30
|
+
* `<dialog>` `(close)`/`(cancel)` events already serve the owner directly on the element
|
|
31
|
+
* (with `returnValue`). A Forge output would duplicate a native event.
|
|
32
|
+
*/
|
|
33
|
+
readonly opened: _angular_core.OutputEmitterRef<void>;
|
|
34
|
+
private readonly host;
|
|
35
|
+
private previouslyFocused;
|
|
36
|
+
/** Native `.open` state (read-only proxy; open/closed stays native — ADR 0044). */
|
|
37
|
+
get open(): boolean;
|
|
38
|
+
/** Open as a modal: store the trigger for focus-return, then native `showModal()`. */
|
|
39
|
+
showModal(): void;
|
|
40
|
+
/** Close the dialog. The native `close` event drives focus-return (see `onClose`). */
|
|
41
|
+
close(returnValue?: string): void;
|
|
42
|
+
/** Restore focus to the trigger on any close path (Escape / form submit / `close()`). */
|
|
43
|
+
protected onClose(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Wrap Tab focus within the modal (ADR 0044 §3 rule 8). Native `showModal()` makes the
|
|
46
|
+
* background `inert` but does NOT cycle Tab last<->first and lets focus leave an enclosing
|
|
47
|
+
* iframe / micro-frontend boundary — the WCAG-over-native gap this minimal JS closes. Modal
|
|
48
|
+
* only (`:modal`); non-modal open dialogs are not trapped. Host-scoped DOM access only.
|
|
49
|
+
*/
|
|
50
|
+
protected onKeydown(event: KeyboardEvent): void;
|
|
51
|
+
/** Dev-only a11y nudge: native default initial focus is inconsistent without `autofocus`. */
|
|
52
|
+
private warnIfNoFocusTarget;
|
|
53
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraDialog, never>;
|
|
54
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraDialog, "dialog[skraDialog]", ["skraDialog"], { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "opened": "opened"; }, never, ["*"], true, never>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export { SkraDialog };
|
|
58
|
+
export type { DialogSize };
|
|
59
|
+
//# sourceMappingURL=skra-ui-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skra-ui-dialog.d.ts","sources":["../../../../libs/ui/dialog/src/lib/dialog/dialog.ts"],"mappings":";;AAUA;;;AAGG;AACG,KAAM,UAAU;AAsBtB;;;;;;;;;;;;AAYG;AACH,cAmBa,UAAU;;mBAER,aAAA,CAAA,WAAA,CAAA,UAAA;AAEb;;;;;;;;AAQG;qBACY,aAAA,CAAA,gBAAA;AAEf;;;;;AASA;;AAUA;;;AAYA;;;;;AAKG;AACH,+BAA2B,aAAa;;AAwBxC;oDA5EW,UAAU;sDAAV,UAAU;AAyFtB;;;;","names":[]}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { OnInit } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Root-level service generating unique, short IDs for form elements.
|
|
6
|
+
* Implements ADR 013 — deterministic IDs without bloaty UUID libraries.
|
|
7
|
+
*/
|
|
8
|
+
declare class IdGeneratorService {
|
|
9
|
+
private counter;
|
|
10
|
+
nextId(prefix?: string): string;
|
|
11
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<IdGeneratorService, never>;
|
|
12
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<IdGeneratorService>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* DI Context service provided per SkraField instance.
|
|
17
|
+
* Acts as the synchronization bus between Field, Input, Label, Hint, and Error.
|
|
18
|
+
* Implements ADR 013: Signal-based Contextual Interaction.
|
|
19
|
+
*/
|
|
20
|
+
declare class SkraFieldContext {
|
|
21
|
+
readonly fieldId: i0.WritableSignal<string>;
|
|
22
|
+
readonly hasError: i0.WritableSignal<boolean>;
|
|
23
|
+
readonly isDisabled: i0.WritableSignal<boolean>;
|
|
24
|
+
readonly isRequired: i0.WritableSignal<boolean>;
|
|
25
|
+
readonly isReadonly: i0.WritableSignal<boolean>;
|
|
26
|
+
readonly hintId: i0.Signal<string>;
|
|
27
|
+
readonly errorId: i0.Signal<string>;
|
|
28
|
+
readonly labelId: i0.Signal<string>;
|
|
29
|
+
readonly describedByIds: i0.Signal<string>;
|
|
30
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraFieldContext, never>;
|
|
31
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<SkraFieldContext>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare class SkraField implements OnInit {
|
|
35
|
+
private readonly idGen;
|
|
36
|
+
readonly context: SkraFieldContext;
|
|
37
|
+
readonly fieldId: i0.InputSignal<string | null>;
|
|
38
|
+
readonly readonly: i0.InputSignalWithTransform<boolean, unknown>;
|
|
39
|
+
readonly disabled: i0.InputSignalWithTransform<boolean, unknown>;
|
|
40
|
+
readonly required: i0.InputSignalWithTransform<boolean, unknown>;
|
|
41
|
+
readonly hasError: i0.InputSignalWithTransform<boolean, unknown>;
|
|
42
|
+
constructor();
|
|
43
|
+
ngOnInit(): void;
|
|
44
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraField, never>;
|
|
45
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraField, "skra-field", never, { "fieldId": { "alias": "fieldId"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hasError": { "alias": "hasError"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* `label[skraLabelFor]` — form-control label atom. Per ADR 040 this is a
|
|
50
|
+
* Component-on-the-native-host carrying its own `label.scss` (typography + colour
|
|
51
|
+
* + cursor) via Emulated encapsulation, replacing the ADR 038 slice branch.
|
|
52
|
+
*
|
|
53
|
+
* `<label>` is content-bearing (its text is the label), so the template MUST be
|
|
54
|
+
* `<ng-content>` — `template: ''` would discard the label text. See ADR 040 §2.
|
|
55
|
+
*
|
|
56
|
+
* Auto-links to its sibling control via `[htmlFor]` sourced from
|
|
57
|
+
* `SkraFieldContext.fieldId()` — zero manual ID passing (ADR 013). The label's
|
|
58
|
+
* error-state colour is driven by `<skra-field>[data-skra-validation="invalid"]`
|
|
59
|
+
* swapping `--skra-comp-field-label-color` through CSS variable inheritance; this
|
|
60
|
+
* SCSS is what consumes that variable (the swap was a no-op before the binding
|
|
61
|
+
* moved here from the slice).
|
|
62
|
+
*/
|
|
63
|
+
declare class SkraLabel {
|
|
64
|
+
readonly context: SkraFieldContext;
|
|
65
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraLabel, never>;
|
|
66
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraLabel, "label[skraLabelFor]", never, {}, {}, never, ["*"], true, never>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Hint component for supplementary field information.
|
|
71
|
+
* Auto-receives ID from SkraFieldContext so aria-describedby on input works automatically.
|
|
72
|
+
*/
|
|
73
|
+
declare class SkraHint {
|
|
74
|
+
readonly context: SkraFieldContext;
|
|
75
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraHint, never>;
|
|
76
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraHint, "skra-hint", never, {}, {}, never, ["*"], true, never>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Error message atom sibling to `<skra-hint>`. Renders validation feedback
|
|
81
|
+
* inside `<skra-field>` with its own a11y semantics: `role="alert"` (which
|
|
82
|
+
* carries an implicit `aria-live="assertive"` + `aria-atomic="true"`), so screen
|
|
83
|
+
* readers announce a validation error promptly. NO explicit `aria-live` — adding
|
|
84
|
+
* `aria-live="polite"` alongside `role="alert"` is contradictory (alert is
|
|
85
|
+
* assertive by definition) and behaves inconsistently across AT. Assertive is
|
|
86
|
+
* the WAI-ARIA APG pattern for validation errors (decision 2026-05-31, Batch 4
|
|
87
|
+
* cleanroom review).
|
|
88
|
+
*
|
|
89
|
+
* Per ADR 037 (agnostic atom co-existence) — does not infer error state from
|
|
90
|
+
* any binding strategy. Consumer renders or omits `<skra-error>` based on
|
|
91
|
+
* their own validation source (Signal Forms `.invalid && .touched`, Reactive
|
|
92
|
+
* Forms `ctrl.errors`, raw computed signal). The atom itself just supplies
|
|
93
|
+
* a11y wiring + visual treatment.
|
|
94
|
+
*
|
|
95
|
+
* <skra-field [hasError]="emailHasError()">
|
|
96
|
+
* <label skraLabelFor>Email</label>
|
|
97
|
+
* <input skraInput type="email" />
|
|
98
|
+
* <skra-hint>We'll never share your email.</skra-hint>
|
|
99
|
+
* @if (emailHasError()) {
|
|
100
|
+
* <skra-error>Please enter a valid email address.</skra-error>
|
|
101
|
+
* }
|
|
102
|
+
* </skra-field>
|
|
103
|
+
*
|
|
104
|
+
* Separate from `<skra-hint>` per SRP: hint is static helper text
|
|
105
|
+
* (role="note", neutral colour); error is dynamic validation feedback
|
|
106
|
+
* (role="alert", live region, error colour). One element per visual
|
|
107
|
+
* responsibility — the rejected alternative ("hint that swaps text on error")
|
|
108
|
+
* loaded two responsibilities into a single primitive.
|
|
109
|
+
*/
|
|
110
|
+
declare class SkraError {
|
|
111
|
+
readonly context: SkraFieldContext;
|
|
112
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraError, never>;
|
|
113
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraError, "skra-error", never, {}, {}, never, ["*"], true, never>;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Forge marker on a native `<fieldset>` used to group related form controls
|
|
118
|
+
* (checkbox group, radio group, or any related field cluster). Per ADR 039,
|
|
119
|
+
* Forge ships no `<skra-radio-group>` / `<skra-checkbox-group>` component
|
|
120
|
+
* wrappers — native `<fieldset>` + `<legend>` IS the WCAG-canonical group
|
|
121
|
+
* idiom, and Forge stops reinventing it.
|
|
122
|
+
*
|
|
123
|
+
* Per ADR 040 this is a Component-on-the-native-host carrying its own
|
|
124
|
+
* `fieldset.scss` (chrome reset + group layout) via Emulated encapsulation,
|
|
125
|
+
* replacing the ADR 038 slice branch. `<fieldset>` is content-bearing (it holds
|
|
126
|
+
* the grouped controls), so the template MUST be `<ng-content>` — `template: ''`
|
|
127
|
+
* would discard the entire group. See ADR 040 §2.
|
|
128
|
+
*
|
|
129
|
+
* The `[disabled]` input cascades to the native `disabled` attribute, and
|
|
130
|
+
* native `<fieldset disabled>` already disables every form control inside
|
|
131
|
+
* (browser-native behaviour). Forge does not iterate children manually.
|
|
132
|
+
*
|
|
133
|
+
* Selector is opt-in (`fieldset[skraFieldset]`) so the chrome-reset rules do
|
|
134
|
+
* not leak onto bare `<fieldset>` elements outside Forge.
|
|
135
|
+
*
|
|
136
|
+
* <fieldset skraFieldset [disabled]="form.disabled()">
|
|
137
|
+
* <legend skraLegend>Send notifications via</legend>
|
|
138
|
+
* <!-- skra-field children with checkboxes -->
|
|
139
|
+
* <skra-error *ngIf="form.channels().length === 0">Choose at least one</skra-error>
|
|
140
|
+
* </fieldset>
|
|
141
|
+
*
|
|
142
|
+
* `role="group"` is the explicit ARIA role: while the browser default for
|
|
143
|
+
* `<fieldset>` is already group semantics for most AT, declaring it explicitly
|
|
144
|
+
* is friendlier to assistive tech that may have idiosyncratic handling.
|
|
145
|
+
*
|
|
146
|
+
* Native `disabled` is sufficient — `aria-disabled` is NOT set per
|
|
147
|
+
* native-attr-first doctrine (memory `feedback_native_attr_first.md`). The
|
|
148
|
+
* `data-skra-disabled` reflection drives the visual dimming in `fieldset.scss`.
|
|
149
|
+
*/
|
|
150
|
+
declare class SkraFieldset {
|
|
151
|
+
readonly disabled: i0.InputSignalWithTransform<boolean, unknown>;
|
|
152
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraFieldset, never>;
|
|
153
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraFieldset, "fieldset[skraFieldset]", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* `legend[skraLegend]` — visible group label for `<fieldset skraFieldset>`.
|
|
158
|
+
* Per ADR 040 this is a Component-on-the-native-host carrying its own
|
|
159
|
+
* `legend.scss` (chrome reset + typography role binding per ADR 036) via Emulated
|
|
160
|
+
* encapsulation, replacing the ADR 038 slice branch.
|
|
161
|
+
*
|
|
162
|
+
* `<legend>` is content-bearing (its text is the group label), so the template
|
|
163
|
+
* MUST be `<ng-content>` — `template: ''` would discard the label. See ADR 040 §2.
|
|
164
|
+
* No host bindings, no inputs, no DI — purely a styled marker.
|
|
165
|
+
*
|
|
166
|
+
* <fieldset skraFieldset>
|
|
167
|
+
* <legend skraLegend>Account preferences</legend>
|
|
168
|
+
* ...
|
|
169
|
+
* </fieldset>
|
|
170
|
+
*
|
|
171
|
+
* HTML requires `<legend>` to be the FIRST child of `<fieldset>` for native
|
|
172
|
+
* group-label semantics. The browser HTML parser auto-corrects misplaced
|
|
173
|
+
* legends (re-parents to fieldset), but Forge documents the canonical form.
|
|
174
|
+
*/
|
|
175
|
+
declare class SkraLegend {
|
|
176
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraLegend, never>;
|
|
177
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraLegend, "legend[skraLegend]", never, {}, {}, never, ["*"], true, never>;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export { IdGeneratorService, SkraError, SkraField, SkraFieldContext, SkraFieldset, SkraHint, SkraLabel, SkraLegend };
|
|
181
|
+
//# sourceMappingURL=skra-ui-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skra-ui-field.d.ts","sources":["../../../../libs/ui/field/src/lib/id-generator/id-generator.service.ts","../../../../libs/ui/field/src/lib/field-context/field-context.ts","../../../../libs/ui/field/src/lib/field/field.component.ts","../../../../libs/ui/field/src/lib/label/label.ts","../../../../libs/ui/field/src/lib/hint/hint.component.ts","../../../../libs/ui/field/src/lib/error/error.component.ts","../../../../libs/ui/field/src/lib/fieldset/fieldset.ts","../../../../libs/ui/field/src/lib/fieldset/legend.ts"],"mappings":";;;AAEA;;;AAGG;AACH,cACa,kBAAkB;;AAG7B;yCAHW,kBAAkB;6CAAlB,kBAAkB;AAM9B;;ACXD;;;;AAIG;AACH,cACa,gBAAgB;sBACXA,EAAA,CAAA,cAAA;uBACCA,EAAA,CAAA,cAAA;yBACEA,EAAA,CAAA,cAAA;yBACAA,EAAA,CAAA,cAAA;yBACAA,EAAA,CAAA,cAAA;qBAGJA,EAAA,CAAA,MAAA;sBACCA,EAAA,CAAA,MAAA;sBAQAA,EAAA,CAAA,MAAA;6BAOOA,EAAA,CAAA,MAAA;yCAxBZ,gBAAgB;6CAAhB,gBAAgB;AA2B5B;;ACtBD,cA0Ba,SAAU,YAAW,MAAM;AACtC;sBACgB,gBAAA;sBAEAA,EAAA,CAAA,WAAA;uBACCA,EAAA,CAAA,wBAAA;uBACAA,EAAA,CAAA,wBAAA;uBACAA,EAAA,CAAA,wBAAA;uBACAA,EAAA,CAAA,wBAAA;;AAkBjB;yCA1BW,SAAS;2CAAT,SAAS;AA6BrB;;AC5DD;;;;;;;;;;;;;;AAcG;AACH,cAwBa,SAAS;sBACJ,gBAAA;yCADL,SAAS;2CAAT,SAAS;AAErB;;ACzCD;;;AAGG;AACH,cAca,QAAQ;sBACH,gBAAA;yCADL,QAAQ;2CAAR,QAAQ;AAEpB;;ACpBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;AACH,cAiBa,SAAS;sBACJ,gBAAA;yCADL,SAAS;2CAAT,SAAS;AAErB;;AClDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCG;AACH,cAca,YAAY;uBACNA,EAAA,CAAA,wBAAA;yCADN,YAAY;2CAAZ,YAAY;AAExB;;ACpDD;;;;;;;;;;;;;;;;;;AAkBG;AACH,cASa,UAAU;yCAAV,UAAU;2CAAV,UAAU;AAAG;;;;","names":["_angular_core"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
|
|
3
|
+
type IconSize = 'sm' | 'md' | 'lg';
|
|
4
|
+
/**
|
|
5
|
+
* SkraIcon — container atom for icon-shaped content (ADR 034).
|
|
6
|
+
*
|
|
7
|
+
* Forge owns geometry, layout isolation, color inheritance hook. The shape
|
|
8
|
+
* itself is supplied by the consumer via `<ng-content>` — inline SVG, `<img>`,
|
|
9
|
+
* a third-party icon library element, or a styled `<span>` are all supported
|
|
10
|
+
* equally. Forge ships no icon catalog and makes no rendering-strategy choice
|
|
11
|
+
* for the consumer.
|
|
12
|
+
*
|
|
13
|
+
* Accessibility: this host has NO default ARIA attributes (ADR 034 §3.4). The
|
|
14
|
+
* consumer MUST declare semantics explicitly:
|
|
15
|
+
* - decorative icon → `<skra-icon aria-hidden="true">`
|
|
16
|
+
* - meaningful icon → `<skra-icon role="img" aria-label="...">` (ADR 033 Path 3;
|
|
17
|
+
* `role="img"` is required — `aria-label` on the roleless host is ARIA-prohibited)
|
|
18
|
+
*
|
|
19
|
+
* @see ADR 034 — SkraIcon as a container atom
|
|
20
|
+
* @see ADR 033 — Accessible Name Contract
|
|
21
|
+
*/
|
|
22
|
+
declare class SkraIcon {
|
|
23
|
+
/**
|
|
24
|
+
* Preset size token (`'sm' | 'md' | 'lg'`). When `null`, the icon inherits
|
|
25
|
+
* `--skra-comp-icon-size` from the surrounding context — typical in button
|
|
26
|
+
* slot wrappers (ADR 030 §3.4) where the parent owns the icon size. Arbitrary
|
|
27
|
+
* dimensions are not an input (a free value would require an inline style,
|
|
28
|
+
* forbidden by ADR 021); a consumer needing a bespoke size overrides
|
|
29
|
+
* `--skra-comp-icon-size` via the sanctioned token-cascade path (ADR 029).
|
|
30
|
+
*/
|
|
31
|
+
readonly size: i0.InputSignal<IconSize | null>;
|
|
32
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraIcon, never>;
|
|
33
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraIcon, "skra-icon", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { SkraIcon };
|
|
37
|
+
export type { IconSize };
|
|
38
|
+
//# sourceMappingURL=skra-ui-icon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skra-ui-icon.d.ts","sources":["../../../../libs/ui/icon/src/lib/icon/icon.ts"],"mappings":";;AAOM,KAAM,QAAQ;AAEpB;;;;;;;;;;;;;;;;;AAiBG;AACH,cAmBa,QAAQ;AACnB;;;;;;;AAOG;mBACUA,EAAA,CAAA,WAAA,CAAA,QAAA;yCATF,QAAQ;2CAAR,QAAQ;AAUpB;;;;","names":["_angular_core"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { SkraFieldContext } from '@skra/ui/field';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `input[skraInput]` — text-input atom. Per ADR 040 this is a
|
|
6
|
+
* Component-on-a-native-host (not a directive): `<input>` is a void element, so
|
|
7
|
+
* `template: ''` is correct — there is no consumer content to project. Angular
|
|
8
|
+
* Emulated encapsulation scopes `input.scss` to the host, the same way
|
|
9
|
+
* <skra-button> carries its own CSS. Replaces the ADR 038 global slice branch.
|
|
10
|
+
*
|
|
11
|
+
* DI wiring (ADR 013), host a11y bindings (ADR 021/027), and the agnostic
|
|
12
|
+
* value posture (ADR 037 — no value channel, no @angular/forms) are unchanged
|
|
13
|
+
* from the prior directive form.
|
|
14
|
+
*/
|
|
15
|
+
declare class SkraInput {
|
|
16
|
+
readonly context: SkraFieldContext;
|
|
17
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraInput, never>;
|
|
18
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraInput, "input[skraInput]", never, {}, {}, never, never, true, never>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { SkraInput };
|
|
22
|
+
//# sourceMappingURL=skra-ui-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skra-ui-input.d.ts","sources":["../../../../libs/ui/input/src/lib/input/input.ts"],"mappings":";;;AAQA;;;;;;;;;;AAUG;AACH,cAqBa,SAAS;sBACJ,gBAAA;yCADL,SAAS;2CAAT,SAAS;AAErB;;;;","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `kbd[skraKbd]` — keyboard-key display atom (first resident of `libs/ui/content`, the
|
|
5
|
+
* text-level inline-semantics family). Renders a single key / key-name as a styled key-cap for
|
|
6
|
+
* docs, shortcut hints and help text ("press `Esc` to close"). See
|
|
7
|
+
* `adr/specs/component-kbd-spec.md`.
|
|
8
|
+
*
|
|
9
|
+
* **Component-on-the-native-host (ADR 040), NOT `<skra-kbd>`:** native `<kbd>` already carries
|
|
10
|
+
* the correct HTML semantic ("user keyboard input"), so we decorate it (ADR 012). `<kbd>` is
|
|
11
|
+
* content-bearing, so the template MUST be `<ng-content>` — `template: ''` would discard the key
|
|
12
|
+
* text (ADR 040 §2; the `label[skraLabelFor]` precedent).
|
|
13
|
+
*
|
|
14
|
+
* **Zero inputs by design.** A key display is purely presentational:
|
|
15
|
+
* - sizing is em-relative (it harmonises with the surrounding text), so there is no `size` input
|
|
16
|
+
* — an explicit size enum would be a look-input (skin-philosophy) and low-demand (90%-rule);
|
|
17
|
+
* - no coherent semantic exists for a `type`, and a `type` enum switching appearance is the SRP
|
|
18
|
+
* smell the Decision Doctrine warns against;
|
|
19
|
+
* - the monospace family is skin-owned (`--skra-comp-kbd-font-family` → `sys.font-family.code`);
|
|
20
|
+
* - key-combos ("Ctrl+C") are consumer composition of multiple `<kbd skraKbd>` (agnostic
|
|
21
|
+
* doctrine), not a `combo` input.
|
|
22
|
+
*
|
|
23
|
+
* So there is no input, no output, no `data-skra-*` state (non-interactive — State Surface
|
|
24
|
+
* all-N/A), and no `ariaLabel` (the visible text IS the accessible content, ADR 033). The host is
|
|
25
|
+
* deliberately **not** `aria-hidden`: the key name is meaningful content AT must announce.
|
|
26
|
+
*/
|
|
27
|
+
declare class SkraKbd {
|
|
28
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraKbd, never>;
|
|
29
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraKbd, "kbd[skraKbd]", never, {}, {}, never, ["*"], true, never>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { SkraKbd };
|
|
33
|
+
//# sourceMappingURL=skra-ui-kbd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skra-ui-kbd.d.ts","sources":["../../../../libs/ui/kbd/src/lib/kbd/kbd.ts"],"mappings":";;AAMA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACH,cAYa,OAAO;yCAAP,OAAO;2CAAP,OAAO;AAAG;;;;","names":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
|
|
3
|
+
type BoxPadding = 'none' | 'sm' | 'md' | 'lg';
|
|
4
|
+
type BoxDisplay = 'block' | 'inline-block' | 'flex';
|
|
5
|
+
/**
|
|
6
|
+
* SkraBox — semantically-neutral spacing/padding primitive (ADR 041).
|
|
7
|
+
*
|
|
8
|
+
* Component-on-native-host: layers onto a generic flow/sectioning container via
|
|
9
|
+
* the bounded host allowlist below — NEVER a `<skra-box>` custom element
|
|
10
|
+
* (ADR 012 §3.1 / ADR 041). Box does NOT arrange children, so list hosts
|
|
11
|
+
* (`ul`/`ol`/`menu`) are intentionally excluded from its allowlist.
|
|
12
|
+
*
|
|
13
|
+
* Box is a pure spacing primitive: it MUST NOT establish a container-query
|
|
14
|
+
* context (`container-type`/`container-name`) — that is an app-level concern
|
|
15
|
+
* (ADR 016 §3.3, amended by ADR 041).
|
|
16
|
+
*/
|
|
17
|
+
declare class SkraBox {
|
|
18
|
+
readonly padding: _angular_core.InputSignal<BoxPadding>;
|
|
19
|
+
readonly display: _angular_core.InputSignal<BoxDisplay>;
|
|
20
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraBox, never>;
|
|
21
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraBox, "div[skraBox], section[skraBox], article[skraBox], main[skraBox], nav[skraBox], aside[skraBox], header[skraBox], footer[skraBox], form[skraBox], figure[skraBox]", never, { "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type StackDirection = 'row' | 'column';
|
|
25
|
+
type StackGap = 'none' | 'sm' | 'md' | 'lg';
|
|
26
|
+
type StackAlign = 'start' | 'center' | 'end' | 'stretch';
|
|
27
|
+
type StackJustify = 'start' | 'center' | 'end' | 'between' | 'around';
|
|
28
|
+
/**
|
|
29
|
+
* SkraStack — flex layout primitive that arranges its children (ADR 041).
|
|
30
|
+
*
|
|
31
|
+
* Component-on-native-host via the bounded allowlist below. As a child-arranger
|
|
32
|
+
* it additionally accepts list hosts (`ul`/`ol`/`menu`) — their UA list styling
|
|
33
|
+
* is normalized in stack.scss per the Host Normalization Contract. List markers
|
|
34
|
+
* are restorable without `!important` via a direct `li {}` rule (a direct
|
|
35
|
+
* declaration beats the inherited `list-style: none`).
|
|
36
|
+
*
|
|
37
|
+
* Stack consumes `@container`; it MUST NOT establish a container-query context
|
|
38
|
+
* (ADR 016 §3.3, amended by ADR 041).
|
|
39
|
+
*/
|
|
40
|
+
declare class SkraStack {
|
|
41
|
+
readonly direction: _angular_core.InputSignal<StackDirection>;
|
|
42
|
+
readonly gap: _angular_core.InputSignal<StackGap>;
|
|
43
|
+
readonly align: _angular_core.InputSignal<StackAlign>;
|
|
44
|
+
readonly justify: _angular_core.InputSignal<StackJustify>;
|
|
45
|
+
readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
46
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraStack, never>;
|
|
47
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraStack, "div[skraStack], section[skraStack], article[skraStack], main[skraStack], nav[skraStack], aside[skraStack], header[skraStack], footer[skraStack], form[skraStack], figure[skraStack], ul[skraStack], ol[skraStack], menu[skraStack]", never, { "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "justify": { "alias": "justify"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
type GridColumns = '1' | '2' | '3' | '4' | '5' | '6' | 'auto-fit' | 'auto-fill';
|
|
51
|
+
type GridMin = 'sm' | 'md' | 'lg';
|
|
52
|
+
type GridGap = 'none' | 'sm' | 'md' | 'lg';
|
|
53
|
+
type GridFlow = 'row' | 'column' | 'dense';
|
|
54
|
+
type GridAlign = 'start' | 'center' | 'end' | 'stretch';
|
|
55
|
+
/**
|
|
56
|
+
* SkraGrid — 2D layout primitive that arranges its children in a CSS Grid
|
|
57
|
+
* (ADR 041, scope O-3). The bucket-only companion to Stack (1D) and Box (spacing).
|
|
58
|
+
*
|
|
59
|
+
* Component-on-native-host via the bounded allowlist below. As a child-arranger
|
|
60
|
+
* it additionally accepts list hosts (`ul`/`ol`/`menu`) — their UA list styling
|
|
61
|
+
* is normalized in grid.scss per the Host Normalization Contract.
|
|
62
|
+
*
|
|
63
|
+
* Bucket-only by design: every axis is an enumerated input reflected as a
|
|
64
|
+
* `data-skra-*` attribute → token. Arbitrary track lists, `grid-template-areas`,
|
|
65
|
+
* named lines and per-item placement are OUT of scope (bespoke = native CSS) —
|
|
66
|
+
* exposing them would force an `[style.*]` host binding (ADR 021 violation).
|
|
67
|
+
*
|
|
68
|
+
* Responsiveness: `columns="auto-fit"` (default) + `min` produce an intrinsically
|
|
69
|
+
* responsive card grid via `repeat(auto-fit, minmax(var(--min), 1fr))` — column
|
|
70
|
+
* count tracks available width with NO media/container queries. Grid consumes
|
|
71
|
+
* `@container`; it MUST NOT establish a container-query context (ADR 041 §3.3).
|
|
72
|
+
*/
|
|
73
|
+
declare class SkraGrid {
|
|
74
|
+
readonly columns: _angular_core.InputSignal<GridColumns>;
|
|
75
|
+
readonly min: _angular_core.InputSignal<GridMin>;
|
|
76
|
+
readonly gap: _angular_core.InputSignal<GridGap>;
|
|
77
|
+
readonly flow: _angular_core.InputSignal<GridFlow>;
|
|
78
|
+
readonly align: _angular_core.InputSignal<GridAlign>;
|
|
79
|
+
readonly justifyItems: _angular_core.InputSignal<GridAlign>;
|
|
80
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraGrid, never>;
|
|
81
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraGrid, "div[skraGrid], section[skraGrid], article[skraGrid], main[skraGrid], nav[skraGrid], aside[skraGrid], header[skraGrid], footer[skraGrid], form[skraGrid], figure[skraGrid], ul[skraGrid], ol[skraGrid], menu[skraGrid]", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "flow": { "alias": "flow"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "justifyItems": { "alias": "justifyItems"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export { SkraBox, SkraGrid, SkraStack };
|
|
85
|
+
export type { BoxDisplay, BoxPadding, GridAlign, GridColumns, GridFlow, GridGap, GridMin, StackAlign, StackDirection, StackGap, StackJustify };
|
|
86
|
+
//# sourceMappingURL=skra-ui-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skra-ui-layout.d.ts","sources":["../../../../libs/ui/layout/src/lib/box/box.ts","../../../../libs/ui/layout/src/lib/stack/stack.ts","../../../../libs/ui/layout/src/lib/grid/grid.ts"],"mappings":";;AAOM,KAAM,UAAU;AAChB,KAAM,UAAU;AAEtB;;;;;;;;;;;AAWG;AACH,cAiBa,OAAO;sBACF,aAAA,CAAA,WAAA,CAAA,UAAA;sBACA,aAAA,CAAA,WAAA,CAAA,UAAA;oDAFL,OAAO;sDAAP,OAAO;AAGnB;;KClCW,cAAc;AACpB,KAAM,QAAQ;AACd,KAAM,UAAU;AAChB,KAAM,YAAY;AAExB;;;;;;;;;;;AAWG;AACH,cAoBa,SAAS;wBACF,aAAA,CAAA,WAAA,CAAA,cAAA;kBACN,aAAA,CAAA,WAAA,CAAA,QAAA;oBACE,aAAA,CAAA,WAAA,CAAA,UAAA;sBACE,aAAA,CAAA,WAAA,CAAA,YAAA;mBACH,aAAA,CAAA,wBAAA;oDALF,SAAS;sDAAT,SAAS;AAMrB;;KC5CW,WAAW;AASjB,KAAM,OAAO;AACb,KAAM,OAAO;AACb,KAAM,QAAQ;AACd,KAAM,SAAS;AAErB;;;;;;;;;;;;;;;;;AAiBG;AACH,cAqBa,QAAQ;sBACH,aAAA,CAAA,WAAA,CAAA,WAAA;kBACJ,aAAA,CAAA,WAAA,CAAA,OAAA;kBACA,aAAA,CAAA,WAAA,CAAA,OAAA;mBACC,aAAA,CAAA,WAAA,CAAA,QAAA;oBACC,aAAA,CAAA,WAAA,CAAA,SAAA;2BACO,aAAA,CAAA,WAAA,CAAA,SAAA;oDANV,QAAQ;sDAAR,QAAQ;AAOpB;;;;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SkraLink — text-style anchor primitive (ADR 032 §3.6).
|
|
5
|
+
*
|
|
6
|
+
* Selector: `a[skraLink]` — `<a>` is the sole host.
|
|
7
|
+
*
|
|
8
|
+
* Per ADR 032 §3.6.3 there is no `disabled` input and no `data-skra-*`
|
|
9
|
+
* Availability reflection: a link the user cannot or should not follow should
|
|
10
|
+
* not be a link in the first place. Severity is deferred beyond MVP (§3.6.4).
|
|
11
|
+
* Accessible Name follows ADR 033 Path 1 — visible text is the accessible name;
|
|
12
|
+
* the component exposes no `ariaLabel` input.
|
|
13
|
+
*/
|
|
14
|
+
declare class SkraLink {
|
|
15
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraLink, never>;
|
|
16
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraLink, "a[skraLink]", never, {}, {}, never, ["*"], true, never>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { SkraLink };
|
|
20
|
+
//# sourceMappingURL=skra-ui-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skra-ui-link.d.ts","sources":["../../../../libs/ui/link/src/lib/link/link.ts"],"mappings":";;AAMA;;;;;;;;;;AAUG;AACH,cAQa,QAAQ;yCAAR,QAAQ;2CAAR,QAAQ;AAAG;;;;","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
|
|
3
|
+
declare class SkraLoadingIndicator {
|
|
4
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraLoadingIndicator, never>;
|
|
5
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<SkraLoadingIndicator, "[skraLoadingIndicator]", never, {}, {}, never, never, true, never>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export { SkraLoadingIndicator };
|
|
9
|
+
//# sourceMappingURL=skra-ui-loading-indicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skra-ui-loading-indicator.d.ts","sources":["../../../../libs/ui/loading-indicator/src/lib/loading-indicator.directive.ts"],"mappings":";;AAEA,cAOa,oBAAoB;yCAApB,oBAAoB;2CAApB,oBAAoB;AAAG;;;;","names":[]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { SkraPlacement } from '@skra/ui/core';
|
|
3
|
+
export { SkraPlacement } from '@skra/ui/core';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The item shape the menu keyboard controller drives. Structurally a CDK `FocusableOption`
|
|
7
|
+
* (`focus()`), plus the menu's own `getLabel()` (type-ahead) and `isDisabled()` (focusable-but-inert
|
|
8
|
+
* roving). Declared HERE — cdk-free — so the only `@angular/cdk` importer stays `menu-keyboard.ts`.
|
|
9
|
+
*/
|
|
10
|
+
interface SkraMenuKeyboardItem {
|
|
11
|
+
focus(): void;
|
|
12
|
+
getLabel(): string;
|
|
13
|
+
isDisabled(): boolean;
|
|
14
|
+
}
|
|
15
|
+
/** What a `skraMenuItem` needs from its `skra-menu` — narrow contract that breaks the menu↔item cycle. */
|
|
16
|
+
interface SkraMenuPanel {
|
|
17
|
+
/** Dismiss the menu after an item activates (native `hidePopover()` → focus returns to the trigger). */
|
|
18
|
+
requestClose(): void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* SkraMenu — a WAI-ARIA APG **Menu Button** menu: a homogeneous set of commands anchored to a
|
|
23
|
+
* trigger, navigated as one composite widget with arrow keys, where activating a command closes it.
|
|
24
|
+
* Rendered in the browser TOP LAYER via the native Popover API (`popover="auto"`), per ADR 0044.
|
|
25
|
+
*
|
|
26
|
+
* SHAPE (scope 2026-06-07): a Component on the PANEL with projected `button[skraMenuItem]` children
|
|
27
|
+
* (the Popover model, ADR 040) — NOT a directive on the trigger, NOT a data-driven `[items]` array.
|
|
28
|
+
* The trigger is the consumer's own button linked by the native `popovertarget` attribute; toggle,
|
|
29
|
+
* light-dismiss and Escape are platform-owned. The consumer MUST give `<skra-menu>` an `id`.
|
|
30
|
+
*
|
|
31
|
+
* <button skraButton popovertarget="actions" aria-haspopup="menu">Actions</button>
|
|
32
|
+
* <skra-menu id="actions">
|
|
33
|
+
* <button skraMenuItem (click)="edit()">Edit</button>
|
|
34
|
+
* <button skraMenuItem disabled (click)="archive()">Archive</button>
|
|
35
|
+
* <button skraMenuItem (click)="remove()">Delete</button>
|
|
36
|
+
* </skra-menu>
|
|
37
|
+
*
|
|
38
|
+
* Forge adds, on top of the Popover substrate: the `role="menu"` keyboard model via `SkraMenuKeyboard`
|
|
39
|
+
* (CDK `FocusKeyManager` — Down/Up roving + wrap, Home/End, type-ahead, Tab-dismiss), **focus moving
|
|
40
|
+
* INTO the menu on open** (a composite widget — unlike non-modal Popover; the per-component ADR 0044
|
|
41
|
+
* §3 rule-8 decision), and the trigger's disclosure ARIA (`aria-haspopup="menu"` / `aria-controls` /
|
|
42
|
+
* `aria-expanded`). Side effects on open/close: bind the native `(toggle)` — there is no Forge output
|
|
43
|
+
* (native-first; contrast Dialog, whose `<dialog>` has no open event). Context menus (right-click) are
|
|
44
|
+
* a recipe with a visible button, never a trigger mode (SRP + WCAG 2.1.1).
|
|
45
|
+
*
|
|
46
|
+
* Full contract: adr/specs/component-menu-spec.md.
|
|
47
|
+
*/
|
|
48
|
+
declare class SkraMenu implements SkraMenuPanel {
|
|
49
|
+
/** Placement intent; `flip`/`shift` adjust at runtime. */
|
|
50
|
+
readonly placement: i0.InputSignal<SkraPlacement>;
|
|
51
|
+
private readonly menuItems;
|
|
52
|
+
private readonly host;
|
|
53
|
+
private readonly renderer;
|
|
54
|
+
private readonly keyboard;
|
|
55
|
+
/** The consumer's `[popovertarget]` button, resolved once (lazily-idempotent via `resolved`). */
|
|
56
|
+
private trigger;
|
|
57
|
+
private resolved;
|
|
58
|
+
private positioner?;
|
|
59
|
+
constructor();
|
|
60
|
+
/** SKRA_MENU contract — close on item activation (native focus-return to the trigger). */
|
|
61
|
+
requestClose(): void;
|
|
62
|
+
/** Capture-phase guard: block clicks on an `aria-disabled` item before they reach its listeners. */
|
|
63
|
+
private readonly onCaptureClick;
|
|
64
|
+
private readonly onToggleNative;
|
|
65
|
+
private readonly onKeydownNative;
|
|
66
|
+
private onOpen;
|
|
67
|
+
private onClose;
|
|
68
|
+
/**
|
|
69
|
+
* Resolve the `[popovertarget]` trigger and establish the menu disclosure ARIA on it (sanctioned a11y
|
|
70
|
+
* wiring, ADR 013-style — not style mutation). Idempotent. Returns the trigger (or null for an orphan
|
|
71
|
+
* menu, dev-warned once).
|
|
72
|
+
*/
|
|
73
|
+
private ensureTrigger;
|
|
74
|
+
/** Read a length comp token (px/rem) off the host computed style for the positioner. */
|
|
75
|
+
private cssLenPx;
|
|
76
|
+
/** Dev-only nudge: a role="menu" with no menuitems is invalid — a link-list/content panel is a Popover. */
|
|
77
|
+
private warnIfEmpty;
|
|
78
|
+
private teardown;
|
|
79
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraMenu, never>;
|
|
80
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraMenu, "skra-menu", ["skraMenu"], { "placement": { "alias": "placement"; "required": false; "isSignal": true; }; }, {}, ["menuItems"], ["*"], true, never>;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* SkraMenuItem — a single command in a `skra-menu`, a Component on the native command host
|
|
85
|
+
* `button[skraMenuItem]` (ADR 012/040: a `<button>` is the right semantic — Enter/Space→click +
|
|
86
|
+
* focusability for free; its implicit role is overridden to `role="menuitem"` per WAI-ARIA APG).
|
|
87
|
+
*
|
|
88
|
+
* Roving focus: `tabindex="-1"` (the keyboard controller moves real focus). Implements
|
|
89
|
+
* `SkraMenuKeyboardItem` (`focus`/`getLabel`/`isDisabled`) so `SkraMenuKeyboard` (CDK `FocusKeyManager`)
|
|
90
|
+
* can drive it. On activation it asks the menu to close (native `hidePopover()` → focus returns to the
|
|
91
|
+
* trigger).
|
|
92
|
+
*
|
|
93
|
+
* **Disabled is native-attr-first (boundary #9, ADR 039 precedent): the consumer sets
|
|
94
|
+
* `aria-disabled="true"` directly — Forge OBSERVES it, exposing NO `disabled` input.** This (a) keeps a
|
|
95
|
+
* disabled item **focusable/discoverable** in the roving order (APG) — native `disabled` would remove it
|
|
96
|
+
* from focus, and (b) avoids a Forge input shadowing the native `disabled` attribute. Styling keys off
|
|
97
|
+
* `:host([aria-disabled="true"])`; activation is blocked here.
|
|
98
|
+
*
|
|
99
|
+
* Full contract: adr/specs/component-menu-spec.md.
|
|
100
|
+
*/
|
|
101
|
+
declare class SkraMenuItem implements SkraMenuKeyboardItem {
|
|
102
|
+
private readonly host;
|
|
103
|
+
private readonly menu;
|
|
104
|
+
constructor();
|
|
105
|
+
focus(): void;
|
|
106
|
+
getLabel(): string;
|
|
107
|
+
/** Soft-disabled = the consumer's `aria-disabled="true"` (native-attr-first); read live (no input). */
|
|
108
|
+
isDisabled(): boolean;
|
|
109
|
+
protected onActivate(event: MouseEvent): void;
|
|
110
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SkraMenuItem, never>;
|
|
111
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SkraMenuItem, "button[skraMenuItem]", ["skraMenuItem"], {}, {}, never, ["*"], true, never>;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export { SkraMenu, SkraMenuItem };
|
|
115
|
+
export type { SkraMenuPanel };
|
|
116
|
+
//# sourceMappingURL=skra-ui-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skra-ui-menu.d.ts","sources":["../../../../libs/ui/menu/src/lib/menu/menu-types.ts","../../../../libs/ui/menu/src/lib/menu/menu.ts","../../../../libs/ui/menu/src/lib/menu/menu-item.ts"],"mappings":";;;;AAEA;;;;AAIG;UACc,oBAAoB;;;;AAIpC;AAED;UACiB,aAAa;;;AAG7B;;ACQD;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;AACH,cAoBa,QAAS,YAAW,aAAa;;wBAE1BA,EAAA,CAAA,WAAA,CAAA,aAAA;AAElB;AAIA;AACA;AACA;;;;;;;AAoCA;;AAKA;AAWA;AAKA;AAIA;AAmBA;AAQA;;;;AAIG;AACH;;AA0CA;;AAcA;AAUA;yCAzKW,QAAQ;2CAAR,QAAQ;AAsLpB;;AClPD;;;;;;;;;;;;;;;;;AAiBG;AACH,cAea,YAAa,YAAW,oBAAoB;AACvD;AACA;;AAcA;AAGA;;AAIA;AAIA,gCAA4B,UAAU;yCA3B3B,YAAY;2CAAZ,YAAY;AAsCxB;;;;","names":["_angular_core"]}
|