ember-primitives 0.29.0 → 0.30.1
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/declarations/components/menu.d.ts.map +1 -1
- package/declarations/components/rating/index.d.ts +108 -0
- package/declarations/components/rating/index.d.ts.map +1 -0
- package/declarations/components/rating/public-types.d.ts +47 -0
- package/declarations/components/rating/public-types.d.ts.map +1 -0
- package/declarations/components/rating/range.d.ts +11 -0
- package/declarations/components/rating/range.d.ts.map +1 -0
- package/declarations/components/rating/stars.d.ts +13 -0
- package/declarations/components/rating/stars.d.ts.map +1 -0
- package/declarations/components/rating/state.d.ts +44 -0
- package/declarations/components/rating/state.d.ts.map +1 -0
- package/declarations/components/rating/utils.d.ts +4 -0
- package/declarations/components/rating/utils.d.ts.map +1 -0
- package/declarations/components/rating.d.ts +4 -0
- package/declarations/components/rating.d.ts.map +1 -0
- package/declarations/index.d.ts +1 -0
- package/declarations/index.d.ts.map +1 -1
- package/declarations/test-support/index.d.ts +1 -0
- package/declarations/test-support/index.d.ts.map +1 -1
- package/declarations/test-support/rating.d.ts +22 -0
- package/declarations/test-support/rating.d.ts.map +1 -0
- package/declarations/utils.d.ts +1 -1
- package/declarations/utils.d.ts.map +1 -1
- package/dist/components/menu.js +1 -1
- package/dist/components/menu.js.map +1 -1
- package/dist/components/rating/index.js +44 -0
- package/dist/components/rating/index.js.map +1 -0
- package/dist/components/rating/public-types.js +2 -0
- package/dist/components/rating/public-types.js.map +1 -0
- package/dist/components/rating/range.js +14 -0
- package/dist/components/rating/range.js.map +1 -0
- package/dist/components/rating/stars.js +18 -0
- package/dist/components/rating/stars.js.map +1 -0
- package/dist/components/rating/state.js +81 -0
- package/dist/components/rating/state.js.map +1 -0
- package/dist/components/rating/utils.js +17 -0
- package/dist/components/rating/utils.js.map +1 -0
- package/dist/components/rating.js +2 -0
- package/dist/components/rating.js.map +1 -0
- package/dist/components/scroller.js +0 -1
- package/dist/components/scroller.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/test-support/index.js +1 -0
- package/dist/test-support/index.js.map +1 -1
- package/dist/test-support/rating.js +91 -0
- package/dist/test-support/rating.js.map +1 -0
- package/dist/utils.js.map +1 -1
- package/package.json +22 -23
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/components/menu.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAM3C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGvC,OAAO,EAAW,KAAK,SAAS,IAAI,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE5E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,KAAK,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,KAAK,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC5C,KAAK,kBAAkB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAiBnE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE;QACN,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACnC,OAAO,EAAE,aAAa,CACpB,OAAO,OAAO,EACd,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,CAC3D,CAAC;gBACF,OAAO,EAAE,aAAa,CAAC,OAAO,OAAO,EAAE,iBAAiB,CAAC,CAAC;gBAC1D,OAAO,EAAE,aAAa,CACpB,OAAO,OAAO,EACd,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,gBAAgB,CAC7D,CAAC;gBACF,MAAM,EAAE,OAAO,CAAC;aACjB;SACF,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE;QAAE,OAAO,EAAE,EAAE,CAAA;KAAE,CAAC;CACzB;AAED,QAAA,MAAM,SAAS,EAAE,GAAG,CAAC,kBAAkB,CAUrC,CAAC;AAqBH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;KAAE,CAAC;IAC5C,MAAM,EAAE;QAAE,OAAO,EAAE,EAAE,CAAA;KAAE,CAAC;CACzB;AAED,QAAA,MAAM,IAAI,EAAE,GAAG,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/components/menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import Component from "@glimmer/component";
|
|
2
|
+
import { RatingRange } from './range';
|
|
3
|
+
import { Stars } from './stars';
|
|
4
|
+
import type { ComponentIcons, StringIcons } from "./public-types.ts";
|
|
5
|
+
import type { WithBoundArgs } from "@glint/template";
|
|
6
|
+
export interface Signature {
|
|
7
|
+
Element: HTMLFieldSetElement;
|
|
8
|
+
Args: (ComponentIcons | StringIcons) & {
|
|
9
|
+
/**
|
|
10
|
+
* The number of stars/whichever-icon to show
|
|
11
|
+
*
|
|
12
|
+
* Defaults to 5
|
|
13
|
+
*/
|
|
14
|
+
max?: number;
|
|
15
|
+
/**
|
|
16
|
+
* The current number of stars/whichever-icon to show as selected
|
|
17
|
+
*
|
|
18
|
+
* Defaults to 0
|
|
19
|
+
*/
|
|
20
|
+
value?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Prevents click events on the icons and sets aria-readonly.
|
|
23
|
+
*
|
|
24
|
+
* Also sets data-readonly=true on the wrapping element
|
|
25
|
+
*/
|
|
26
|
+
readonly?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Toggles the ability to interact with the rating component.
|
|
29
|
+
* When `true` (the default), the Rating component can be as a form input
|
|
30
|
+
* to gather user feedback.
|
|
31
|
+
*
|
|
32
|
+
* When false, only the `@value` will be shown, and it cannot be changed.
|
|
33
|
+
*/
|
|
34
|
+
interactive?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Callback when the selected rating changes.
|
|
37
|
+
* Can include half-ratings if the iconHalf argument is passed.
|
|
38
|
+
*/
|
|
39
|
+
onChange?: (value: number) => void;
|
|
40
|
+
};
|
|
41
|
+
Blocks: {
|
|
42
|
+
default: [
|
|
43
|
+
rating: {
|
|
44
|
+
/**
|
|
45
|
+
* The maximum rating
|
|
46
|
+
*/
|
|
47
|
+
max: number;
|
|
48
|
+
/**
|
|
49
|
+
* The maxium rating
|
|
50
|
+
*/
|
|
51
|
+
total: number;
|
|
52
|
+
/**
|
|
53
|
+
* The current rating
|
|
54
|
+
*/
|
|
55
|
+
value: number;
|
|
56
|
+
/**
|
|
57
|
+
* The name shared by the field group
|
|
58
|
+
*/
|
|
59
|
+
name: string;
|
|
60
|
+
/**
|
|
61
|
+
* If the rating can be changed
|
|
62
|
+
*/
|
|
63
|
+
isReadonly: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* If the rating can be changed
|
|
66
|
+
*/
|
|
67
|
+
isChangeable: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* The stars / items radio group
|
|
70
|
+
*/
|
|
71
|
+
Stars: WithBoundArgs<typeof Stars, "stars" | "icon" | "isReadonly" | "name" | "total" | "currentValue">;
|
|
72
|
+
/**
|
|
73
|
+
* Input range for adjusting the rating via fractional means
|
|
74
|
+
*/
|
|
75
|
+
Range: WithBoundArgs<typeof RatingRange, "max" | "value" | "name" | "handleChange">;
|
|
76
|
+
}
|
|
77
|
+
];
|
|
78
|
+
label: [
|
|
79
|
+
state: {
|
|
80
|
+
/**
|
|
81
|
+
* The current rating
|
|
82
|
+
*/
|
|
83
|
+
value: number;
|
|
84
|
+
/**
|
|
85
|
+
* The maximum rating
|
|
86
|
+
*/
|
|
87
|
+
total: number;
|
|
88
|
+
}
|
|
89
|
+
];
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export declare class Rating extends Component<Signature> {
|
|
93
|
+
name: string;
|
|
94
|
+
get icon(): string | import("@glint/template").ComponentLike<{
|
|
95
|
+
Element: HTMLElement;
|
|
96
|
+
Args: {
|
|
97
|
+
isSelected: boolean;
|
|
98
|
+
percentSelected: number;
|
|
99
|
+
value: number;
|
|
100
|
+
readonly: boolean;
|
|
101
|
+
};
|
|
102
|
+
}>;
|
|
103
|
+
get isInteractive(): boolean;
|
|
104
|
+
get isChangeable(): boolean;
|
|
105
|
+
get isReadonly(): boolean;
|
|
106
|
+
get needsDescription(): boolean;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/rating/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAK3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,WAAW,SAAS;IAOxB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,IAAI,EAAE,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG;QACrC;;;;WAIG;QACH,GAAG,CAAC,EAAE,MAAM,CAAC;QAEb;;;;WAIG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QAEf;;;;WAIG;QACH,QAAQ,CAAC,EAAE,OAAO,CAAC;QAEnB;;;;;;WAMG;QACH,WAAW,CAAC,EAAE,OAAO,CAAC;QAEtB;;;WAGG;QACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;KACpC,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE;YACP,MAAM,EAAE;gBACN;;mBAEG;gBACH,GAAG,EAAE,MAAM,CAAC;gBACZ;;mBAEG;gBACH,KAAK,EAAE,MAAM,CAAC;gBACd;;mBAEG;gBACH,KAAK,EAAE,MAAM,CAAC;gBACd;;mBAEG;gBACH,IAAI,EAAE,MAAM,CAAC;gBACb;;mBAEG;gBACH,UAAU,EAAE,OAAO,CAAC;gBACpB;;mBAEG;gBACH,YAAY,EAAE,OAAO,CAAC;gBACtB;;mBAEG;gBACH,KAAK,EAAE,aAAa,CAClB,OAAO,KAAK,EACZ,OAAO,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc,CACpE,CAAC;gBACF;;mBAEG;gBACH,KAAK,EAAE,aAAa,CAAC,OAAO,WAAW,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,CAAC,CAAC;aACrF;SACF,CAAC;QACF,KAAK,EAAE;YACL,KAAK,EAAE;gBACL;;mBAEG;gBACH,KAAK,EAAE,MAAM,CAAC;gBAEd;;mBAEG;gBACH,KAAK,EAAE,MAAM,CAAC;aACf;SACF,CAAC;KACH,CAAC;CACH;AAED,qBAAa,MAAO,SAAQ,SAAS,CAAC,SAAS,CAAC;IAC9C,IAAI,SAA0B;IAE9B,IAAI,IAAI;;;;;;;;OAEP;IAED,IAAI,aAAa,YAEhB;IAED,IAAI,YAAY,YAIf;IAED,IAAI,UAAU,YAEb;IAED,IAAI,gBAAgB,YAEnB;CAuEF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { ComponentLike } from '@glint/template';
|
|
2
|
+
/**
|
|
3
|
+
* @public
|
|
4
|
+
*/
|
|
5
|
+
export interface ComponentIcons {
|
|
6
|
+
/**
|
|
7
|
+
* It's possible to completely manage the state of an individual Icon yourself
|
|
8
|
+
* by passing a component that has ...attributes on its outer element and receives
|
|
9
|
+
* a @isSelected argument which is true for selected and false for unselected.
|
|
10
|
+
*
|
|
11
|
+
* There is also argument passed which is the percent-amount of selection if you want fractional ratings, @selectedPercent
|
|
12
|
+
*/
|
|
13
|
+
icon: ComponentLike<{
|
|
14
|
+
Element: HTMLElement;
|
|
15
|
+
Args: {
|
|
16
|
+
/**
|
|
17
|
+
* Is this item selected?
|
|
18
|
+
*/
|
|
19
|
+
isSelected: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* How much % of this item is selected?
|
|
22
|
+
*/
|
|
23
|
+
percentSelected: number;
|
|
24
|
+
/**
|
|
25
|
+
* Which number of item is this item within the overall rating group.
|
|
26
|
+
*/
|
|
27
|
+
value: number;
|
|
28
|
+
/**
|
|
29
|
+
* Should this be marked as readonly
|
|
30
|
+
*/
|
|
31
|
+
readonly: boolean;
|
|
32
|
+
};
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @public
|
|
37
|
+
*/
|
|
38
|
+
export interface StringIcons {
|
|
39
|
+
/**
|
|
40
|
+
* The symbol to use for an unselected variant of the icon
|
|
41
|
+
*
|
|
42
|
+
* Defaults to "★";
|
|
43
|
+
* Can change color when selected.
|
|
44
|
+
*/
|
|
45
|
+
icon?: string;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=public-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-types.d.ts","sourceRoot":"","sources":["../../../src/components/rating/public-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,IAAI,EAAE,aAAa,CAAC;QAClB,OAAO,EAAE,WAAW,CAAC;QACrB,IAAI,EAAE;YACJ;;eAEG;YACH,UAAU,EAAE,OAAO,CAAC;YACpB;;eAEG;YACH,eAAe,EAAE,MAAM,CAAC;YACxB;;eAEG;YACH,KAAK,EAAE,MAAM,CAAC;YACd;;eAEG;YACH,QAAQ,EAAE,OAAO,CAAC;SACnB,CAAC;KACH,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TOC } from "@ember/component/template-only";
|
|
2
|
+
export declare const RatingRange: TOC<{
|
|
3
|
+
Element: HTMLInputElement;
|
|
4
|
+
Args: {
|
|
5
|
+
name: string;
|
|
6
|
+
max: number;
|
|
7
|
+
value: number;
|
|
8
|
+
handleChange: (event: Event) => void;
|
|
9
|
+
};
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=range.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../../../src/components/rating/range.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAE1D,eAAO,MAAM,WAAW,EAAE,GAAG,CAAC;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KACtC,CAAC;CACH,CAaC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ComponentIcons, StringIcons } from "./public-types.ts";
|
|
2
|
+
import type { TOC } from "@ember/component/template-only";
|
|
3
|
+
export declare const Stars: TOC<{
|
|
4
|
+
Args: {
|
|
5
|
+
stars: number[];
|
|
6
|
+
icon: StringIcons["icon"] | ComponentIcons["icon"];
|
|
7
|
+
isReadonly: boolean;
|
|
8
|
+
name: string;
|
|
9
|
+
currentValue: number;
|
|
10
|
+
total: number;
|
|
11
|
+
};
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=stars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stars.d.ts","sourceRoot":"","sources":["../../../src/components/rating/stars.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAE1D,eAAO,MAAM,KAAK,EAAE,GAAG,CAAC;IACtB,IAAI,EAAE;QAEJ,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACnD,UAAU,EAAE,OAAO,CAAC;QAGpB,IAAI,EAAE,MAAM,CAAC;QAGb,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAsEC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import Component from "@glimmer/component";
|
|
2
|
+
export declare class RatingState extends Component<{
|
|
3
|
+
Args: {
|
|
4
|
+
max: number | undefined;
|
|
5
|
+
value: number | undefined;
|
|
6
|
+
readonly: boolean | undefined;
|
|
7
|
+
name: string;
|
|
8
|
+
onChange?: (value: number) => void;
|
|
9
|
+
};
|
|
10
|
+
Blocks: {
|
|
11
|
+
default: [
|
|
12
|
+
internalApi: {
|
|
13
|
+
stars: number[];
|
|
14
|
+
value: number;
|
|
15
|
+
total: number;
|
|
16
|
+
handleClick: (event: Event) => void;
|
|
17
|
+
handleChange: (event: Event) => void;
|
|
18
|
+
setRating: (num: number) => void;
|
|
19
|
+
},
|
|
20
|
+
publicApi: {
|
|
21
|
+
value: number;
|
|
22
|
+
total: number;
|
|
23
|
+
}
|
|
24
|
+
];
|
|
25
|
+
};
|
|
26
|
+
}> {
|
|
27
|
+
_value: number;
|
|
28
|
+
get value(): number;
|
|
29
|
+
get stars(): number[];
|
|
30
|
+
setRating: (value: number) => void;
|
|
31
|
+
setFromString: (value: unknown) => void;
|
|
32
|
+
/**
|
|
33
|
+
* Click events are captured by
|
|
34
|
+
* - radio changes (mouse and keyboard)
|
|
35
|
+
* - but only range clicks
|
|
36
|
+
*/
|
|
37
|
+
handleClick: (event: Event) => void;
|
|
38
|
+
/**
|
|
39
|
+
* Only attached to a range element, if present.
|
|
40
|
+
* Range elements don't fire click events on keyboard usage, like radios do
|
|
41
|
+
*/
|
|
42
|
+
handleChange: (event: Event) => void;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/components/rating/state.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAS3C,qBAAa,WAAY,SAAQ,SAAS,CAAC;IACzC,IAAI,EAAE;QACJ,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;QACxB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;KACpC,CAAC;IACF,MAAM,EAAE;QACN,OAAO,EAAE;YACP,WAAW,EAAE;gBACX,KAAK,EAAE,MAAM,EAAE,CAAC;gBAChB,KAAK,EAAE,MAAM,CAAC;gBACd,KAAK,EAAE,MAAM,CAAC;gBACd,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;gBACpC,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;gBACrC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;aAClC;YACD,SAAS,EAAE;gBACT,KAAK,EAAE,MAAM,CAAC;gBACd,KAAK,EAAE,MAAM,CAAC;aACf;SACF,CAAC;KACH,CAAC;CACH,CAAC;IAEiC,MAAM,EAAE,MAAM,CAAC;IAEhD,IAAI,KAAK,WAER;IAED,IACI,KAAK,aAER;IAED,SAAS,GAAI,OAAO,MAAM,UAYxB;IAEF,aAAa,GAAI,OAAO,OAAO,UAa7B;IAEF;;;;OAIG;IACH,WAAW,GAAI,OAAO,KAAK,UAazB;IAEF;;;OAGG;IACH,YAAY,GAAI,OAAO,KAAK,UAM1B;CAgBH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/rating/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,eAElC;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,WAEvC;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,UAUnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating.d.ts","sourceRoot":"","sources":["../../src/components/rating.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC"}
|
package/declarations/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export { Portal } from './components/portal';
|
|
|
14
14
|
export { PortalTargets } from './components/portal-targets';
|
|
15
15
|
export { TARGETS as PORTALS } from './components/portal-targets';
|
|
16
16
|
export { Progress } from './components/progress';
|
|
17
|
+
export { Rating } from './components/rating';
|
|
17
18
|
export { Scroller } from './components/scroller';
|
|
18
19
|
export { Shadowed } from './components/shadowed';
|
|
19
20
|
export { Switch } from './components/switch';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,YAAY,EACV,iCAAiC,EACjC,gCAAgC,EAChC,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,YAAY,EACV,iCAAiC,EACjC,gCAAgC,EAChC,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,cAAc,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-support/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-support/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test utility for interacting with the
|
|
3
|
+
* Rating component.
|
|
4
|
+
*
|
|
5
|
+
* Simulates user behavior and provides high level functions so you don't need to worry about the DOM.
|
|
6
|
+
*
|
|
7
|
+
* Actual elements are not exposed, as the elements are private API.
|
|
8
|
+
* Even as you build a design system, the DOM should not be exposed to your consumers.
|
|
9
|
+
*/
|
|
10
|
+
export declare function rating(selector?: string): RatingPageObject;
|
|
11
|
+
declare class RatingPageObject {
|
|
12
|
+
#private;
|
|
13
|
+
constructor(root: string);
|
|
14
|
+
get label(): string | undefined;
|
|
15
|
+
get stars(): string;
|
|
16
|
+
get starTexts(): string;
|
|
17
|
+
get value(): number;
|
|
18
|
+
get isReadonly(): boolean;
|
|
19
|
+
select(stars: number): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=rating.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating.d.ts","sourceRoot":"","sources":["../../src/test-support/rating.ts"],"names":[],"mappings":"AA0BA;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,oBAIvC;AAED,cAAM,gBAAgB;;gBAGR,IAAI,EAAE,MAAM;IAuBxB,IAAI,KAAK,uBAER;IAaD,IAAI,KAAK,WAMR;IAED,IAAI,SAAS,WAIZ;IAED,IAAI,KAAK,WAQR;IAED,IAAI,UAAU,YAEb;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM;CAiC3B"}
|
package/declarations/utils.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function uniqueId():
|
|
1
|
+
export declare function uniqueId(): string;
|
|
2
2
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,IAAI,MAAM,CAQjC"}
|
package/dist/components/menu.js
CHANGED
|
@@ -40,7 +40,7 @@ function focusOnHover(e) {
|
|
|
40
40
|
item?.focus();
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
const Item = setComponentTemplate(precompileTemplate("\n
|
|
43
|
+
const Item = setComponentTemplate(precompileTemplate("\n {{!-- @glint-expect-error --}}\n {{#let (if @onSelect (modifier on \"click\" @onSelect)) as |maybeClick|}}\n <button type=\"button\" role=\"menuitem\" {{!-- @glint-expect-error --}} {{maybeClick}} {{on \"pointermove\" focusOnHover}} ...attributes>\n {{yield}}\n </button>\n {{/let}}\n", {
|
|
44
44
|
strictMode: true,
|
|
45
45
|
scope: () => ({
|
|
46
46
|
on,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sources":["../../src/components/menu.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\nimport { hash } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { guidFor } from \"@ember/object/internals\";\n\nimport { modifier as eModifier } from \"ember-modifier\";\nimport { cell } from \"ember-resources\";\nimport { getTabster, getTabsterAttribute, MoverDirections, setTabsterAttribute } from \"tabster\";\n\nimport { Popover, type Signature as PopoverSignature } from \"./popover.gts\";\n\nimport type { TOC } from \"@ember/component/template-only\";\nimport type { WithBoundArgs } from \"@glint/template\";\n\ntype Cell<V> = ReturnType<typeof cell<V>>;\ntype PopoverArgs = PopoverSignature[\"Args\"];\ntype PopoverBlockParams = PopoverSignature[\"Blocks\"][\"default\"][0];\n\nconst TABSTER_CONFIG_CONTENT = getTabsterAttribute(\n {\n mover: {\n direction: MoverDirections.Both,\n cyclic: true,\n },\n deloser: {},\n },\n true,\n);\n\nconst TABSTER_CONFIG_TRIGGER = {\n deloser: {},\n};\n\nexport interface Signature {\n Args: PopoverArgs;\n Blocks: {\n default: [\n {\n arrow: PopoverBlockParams[\"arrow\"];\n trigger: WithBoundArgs<\n typeof trigger,\n \"triggerElement\" | \"contentId\" | \"isOpen\" | \"setReference\"\n >;\n Trigger: WithBoundArgs<typeof Trigger, \"triggerModifier\">;\n Content: WithBoundArgs<\n typeof Content,\n \"triggerElement\" | \"contentId\" | \"isOpen\" | \"PopoverContent\"\n >;\n isOpen: boolean;\n },\n ];\n };\n}\n\nexport interface SeparatorSignature {\n Element: HTMLDivElement;\n Blocks: { default: [] };\n}\n\nconst Separator: TOC<SeparatorSignature> = <template>\n <div role=\"separator\" ...attributes>\n {{yield}}\n </div>\n</template>;\n\n/**\n * We focus items on `pointerMove` to achieve the following:\n *\n * - Mouse over an item (it focuses)\n * - Leave mouse where it is and use keyboard to focus a different item\n * - Wiggle mouse without it leaving previously focused item\n * - Previously focused item should re-focus\n *\n * If we used `mouseOver`/`mouseEnter` it would not re-focus when the mouse\n * wiggles. This is to match native menu implementation.\n */\nfunction focusOnHover(e: PointerEvent) {\n const item = e.currentTarget;\n\n if (item instanceof HTMLElement) {\n item?.focus();\n }\n}\n\nexport interface ItemSignature {\n Element: HTMLButtonElement;\n Args: { onSelect?: (event: Event) => void };\n Blocks: { default: [] };\n}\n\nconst Item: TOC<ItemSignature> = <template>\n <button\n type=\"button\"\n role=\"menuitem\"\n {{! @glint-expect-error !}}\n {{(if @onSelect (modifier on \"click\" @onSelect))}}\n {{on \"pointermove\" focusOnHover}}\n ...attributes\n >\n {{yield}}\n </button>\n</template>;\n\nconst installContent = eModifier<{\n Element: HTMLElement;\n Args: {\n Named: {\n isOpen: Cell<boolean>;\n triggerElement: Cell<HTMLElement>;\n };\n };\n}>((element, _: [], { isOpen, triggerElement }) => {\n // focus first focusable element on the content\n const tabster = getTabster(window);\n const firstFocusable = tabster?.focusable.findFirst({\n container: element,\n });\n\n firstFocusable?.focus();\n\n // listen for \"outside\" clicks\n function onDocumentClick(e: MouseEvent) {\n if (\n isOpen.current &&\n e.target &&\n !element.contains(e.target as HTMLElement) &&\n !triggerElement.current?.contains(e.target as HTMLElement)\n ) {\n isOpen.current = false;\n }\n }\n\n // listen for the escape key\n function onDocumentKeydown(e: KeyboardEvent) {\n if (isOpen.current && e.key === \"Escape\") {\n isOpen.current = false;\n }\n }\n\n document.addEventListener(\"click\", onDocumentClick);\n document.addEventListener(\"keydown\", onDocumentKeydown);\n\n return () => {\n document.removeEventListener(\"click\", onDocumentClick);\n document.removeEventListener(\"keydown\", onDocumentKeydown);\n };\n});\n\ninterface PrivateContentSignature {\n Element: HTMLDivElement;\n Args: {\n triggerElement: Cell<HTMLElement>;\n contentId: string;\n isOpen: Cell<boolean>;\n PopoverContent: PopoverBlockParams[\"Content\"];\n };\n Blocks: { default: [{ Item: typeof Item; Separator: typeof Separator }] };\n}\n\nexport interface ContentSignature {\n Element: PrivateContentSignature[\"Element\"];\n Blocks: PrivateContentSignature[\"Blocks\"];\n}\n\nconst Content: TOC<PrivateContentSignature> = <template>\n {{#if @isOpen.current}}\n <@PopoverContent\n id={{@contentId}}\n role=\"menu\"\n data-tabster={{TABSTER_CONFIG_CONTENT}}\n tabindex=\"0\"\n {{installContent isOpen=@isOpen triggerElement=@triggerElement}}\n {{on \"click\" @isOpen.toggle}}\n ...attributes\n >\n {{yield (hash Item=Item Separator=Separator)}}\n </@PopoverContent>\n {{/if}}\n</template>;\n\ninterface PrivateTriggerModifierSignature {\n Element: HTMLElement;\n Args: {\n Named: {\n triggerElement: Cell<HTMLElement>;\n isOpen: Cell<boolean>;\n contentId: string;\n setReference: PopoverBlockParams[\"setReference\"];\n stopPropagation?: boolean;\n preventDefault?: boolean;\n };\n };\n}\n\nexport interface TriggerModifierSignature {\n Element: PrivateTriggerModifierSignature[\"Element\"];\n}\n\nconst trigger = eModifier<PrivateTriggerModifierSignature>(\n (\n element,\n _: [],\n { triggerElement, isOpen, contentId, setReference, stopPropagation, preventDefault },\n ) => {\n element.setAttribute(\"aria-haspopup\", \"menu\");\n\n if (isOpen.current) {\n element.setAttribute(\"aria-controls\", contentId);\n element.setAttribute(\"aria-expanded\", \"true\");\n } else {\n element.removeAttribute(\"aria-controls\");\n element.setAttribute(\"aria-expanded\", \"false\");\n }\n\n setTabsterAttribute(element, TABSTER_CONFIG_TRIGGER);\n\n const onTriggerClick = (event: MouseEvent) => {\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n if (preventDefault) {\n event.preventDefault();\n }\n\n isOpen.toggle();\n };\n\n element.addEventListener(\"click\", onTriggerClick);\n\n triggerElement.current = element;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n setReference(element);\n\n return () => {\n element.removeEventListener(\"click\", onTriggerClick);\n };\n },\n);\n\ninterface PrivateTriggerSignature {\n Element: HTMLButtonElement;\n Args: {\n triggerModifier: WithBoundArgs<\n typeof trigger,\n \"triggerElement\" | \"contentId\" | \"isOpen\" | \"setReference\"\n >;\n stopPropagation?: boolean;\n preventDefault?: boolean;\n };\n Blocks: { default: [] };\n}\n\nexport interface TriggerSignature {\n Element: PrivateTriggerSignature[\"Element\"];\n Blocks: PrivateTriggerSignature[\"Blocks\"];\n}\n\nconst Trigger: TOC<PrivateTriggerSignature> = <template>\n <button\n type=\"button\"\n {{@triggerModifier stopPropagation=@stopPropagation preventDefault=@preventDefault}}\n ...attributes\n >\n {{yield}}\n </button>\n</template>;\n\nconst IsOpen = () => cell<boolean>(false);\nconst TriggerElement = () => cell<HTMLElement>();\n\nexport class Menu extends Component<Signature> {\n contentId = guidFor(this);\n\n <template>\n {{#let (IsOpen) (TriggerElement) as |isOpen triggerEl|}}\n <Popover\n @flipOptions={{@flipOptions}}\n @middleware={{@middleware}}\n @offsetOptions={{@offsetOptions}}\n @placement={{@placement}}\n @shiftOptions={{@shiftOptions}}\n @strategy={{@strategy}}\n @inline={{@inline}}\n as |p|\n >\n {{#let\n (modifier\n trigger\n triggerElement=triggerEl\n isOpen=isOpen\n contentId=this.contentId\n setReference=p.setReference\n )\n as |triggerModifier|\n }}\n {{yield\n (hash\n trigger=triggerModifier\n Trigger=(component Trigger triggerModifier=triggerModifier)\n Content=(component\n Content\n PopoverContent=p.Content\n isOpen=isOpen\n triggerElement=triggerEl\n contentId=this.contentId\n )\n arrow=p.arrow\n isOpen=isOpen.current\n )\n }}\n {{/let}}\n </Popover>\n {{/let}}\n </template>\n}\n\nexport default Menu;\n"],"names":["TABSTER_CONFIG_CONTENT","getTabsterAttribute","mover","direction","MoverDirections","Both","cyclic","deloser","TABSTER_CONFIG_TRIGGER","Separator","setComponentTemplate","precompileTemplate","strictMode","templateOnly","focusOnHover","e","item","currentTarget","HTMLElement","focus","Item","scope","on","installContent","eModifier","element","_","isOpen","triggerElement","tabster","getTabster","window","firstFocusable","focusable","findFirst","container","onDocumentClick","current","target","contains","onDocumentKeydown","key","document","addEventListener","removeEventListener","Content","hash","trigger","contentId","setReference","stopPropagation","preventDefault","setAttribute","removeAttribute","setTabsterAttribute","onTriggerClick","event","toggle","Trigger","IsOpen","cell","TriggerElement","Menu","Component","guidFor","Popover"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"menu.js","sources":["../../src/components/menu.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\nimport { hash } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { guidFor } from \"@ember/object/internals\";\n\nimport { modifier as eModifier } from \"ember-modifier\";\nimport { cell } from \"ember-resources\";\nimport { getTabster, getTabsterAttribute, MoverDirections, setTabsterAttribute } from \"tabster\";\n\nimport { Popover, type Signature as PopoverSignature } from \"./popover.gts\";\n\nimport type { TOC } from \"@ember/component/template-only\";\nimport type { WithBoundArgs } from \"@glint/template\";\n\ntype Cell<V> = ReturnType<typeof cell<V>>;\ntype PopoverArgs = PopoverSignature[\"Args\"];\ntype PopoverBlockParams = PopoverSignature[\"Blocks\"][\"default\"][0];\n\nconst TABSTER_CONFIG_CONTENT = getTabsterAttribute(\n {\n mover: {\n direction: MoverDirections.Both,\n cyclic: true,\n },\n deloser: {},\n },\n true,\n);\n\nconst TABSTER_CONFIG_TRIGGER = {\n deloser: {},\n};\n\nexport interface Signature {\n Args: PopoverArgs;\n Blocks: {\n default: [\n {\n arrow: PopoverBlockParams[\"arrow\"];\n trigger: WithBoundArgs<\n typeof trigger,\n \"triggerElement\" | \"contentId\" | \"isOpen\" | \"setReference\"\n >;\n Trigger: WithBoundArgs<typeof Trigger, \"triggerModifier\">;\n Content: WithBoundArgs<\n typeof Content,\n \"triggerElement\" | \"contentId\" | \"isOpen\" | \"PopoverContent\"\n >;\n isOpen: boolean;\n },\n ];\n };\n}\n\nexport interface SeparatorSignature {\n Element: HTMLDivElement;\n Blocks: { default: [] };\n}\n\nconst Separator: TOC<SeparatorSignature> = <template>\n <div role=\"separator\" ...attributes>\n {{yield}}\n </div>\n</template>;\n\n/**\n * We focus items on `pointerMove` to achieve the following:\n *\n * - Mouse over an item (it focuses)\n * - Leave mouse where it is and use keyboard to focus a different item\n * - Wiggle mouse without it leaving previously focused item\n * - Previously focused item should re-focus\n *\n * If we used `mouseOver`/`mouseEnter` it would not re-focus when the mouse\n * wiggles. This is to match native menu implementation.\n */\nfunction focusOnHover(e: PointerEvent) {\n const item = e.currentTarget;\n\n if (item instanceof HTMLElement) {\n item?.focus();\n }\n}\n\nexport interface ItemSignature {\n Element: HTMLButtonElement;\n Args: { onSelect?: (event: Event) => void };\n Blocks: { default: [] };\n}\n\nconst Item: TOC<ItemSignature> = <template>\n {{! @glint-expect-error }}\n {{#let (if @onSelect (modifier on \"click\" @onSelect)) as |maybeClick|}}\n <button\n type=\"button\"\n role=\"menuitem\"\n {{! @glint-expect-error }}\n {{maybeClick}}\n {{on \"pointermove\" focusOnHover}}\n ...attributes\n >\n {{yield}}\n </button>\n {{/let}}\n</template>;\n\nconst installContent = eModifier<{\n Element: HTMLElement;\n Args: {\n Named: {\n isOpen: Cell<boolean>;\n triggerElement: Cell<HTMLElement>;\n };\n };\n}>((element, _: [], { isOpen, triggerElement }) => {\n // focus first focusable element on the content\n const tabster = getTabster(window);\n const firstFocusable = tabster?.focusable.findFirst({\n container: element,\n });\n\n firstFocusable?.focus();\n\n // listen for \"outside\" clicks\n function onDocumentClick(e: MouseEvent) {\n if (\n isOpen.current &&\n e.target &&\n !element.contains(e.target as HTMLElement) &&\n !triggerElement.current?.contains(e.target as HTMLElement)\n ) {\n isOpen.current = false;\n }\n }\n\n // listen for the escape key\n function onDocumentKeydown(e: KeyboardEvent) {\n if (isOpen.current && e.key === \"Escape\") {\n isOpen.current = false;\n }\n }\n\n document.addEventListener(\"click\", onDocumentClick);\n document.addEventListener(\"keydown\", onDocumentKeydown);\n\n return () => {\n document.removeEventListener(\"click\", onDocumentClick);\n document.removeEventListener(\"keydown\", onDocumentKeydown);\n };\n});\n\ninterface PrivateContentSignature {\n Element: HTMLDivElement;\n Args: {\n triggerElement: Cell<HTMLElement>;\n contentId: string;\n isOpen: Cell<boolean>;\n PopoverContent: PopoverBlockParams[\"Content\"];\n };\n Blocks: { default: [{ Item: typeof Item; Separator: typeof Separator }] };\n}\n\nexport interface ContentSignature {\n Element: PrivateContentSignature[\"Element\"];\n Blocks: PrivateContentSignature[\"Blocks\"];\n}\n\nconst Content: TOC<PrivateContentSignature> = <template>\n {{#if @isOpen.current}}\n <@PopoverContent\n id={{@contentId}}\n role=\"menu\"\n data-tabster={{TABSTER_CONFIG_CONTENT}}\n tabindex=\"0\"\n {{installContent isOpen=@isOpen triggerElement=@triggerElement}}\n {{on \"click\" @isOpen.toggle}}\n ...attributes\n >\n {{yield (hash Item=Item Separator=Separator)}}\n </@PopoverContent>\n {{/if}}\n</template>;\n\ninterface PrivateTriggerModifierSignature {\n Element: HTMLElement;\n Args: {\n Named: {\n triggerElement: Cell<HTMLElement>;\n isOpen: Cell<boolean>;\n contentId: string;\n setReference: PopoverBlockParams[\"setReference\"];\n stopPropagation?: boolean;\n preventDefault?: boolean;\n };\n };\n}\n\nexport interface TriggerModifierSignature {\n Element: PrivateTriggerModifierSignature[\"Element\"];\n}\n\nconst trigger = eModifier<PrivateTriggerModifierSignature>(\n (\n element,\n _: [],\n { triggerElement, isOpen, contentId, setReference, stopPropagation, preventDefault },\n ) => {\n element.setAttribute(\"aria-haspopup\", \"menu\");\n\n if (isOpen.current) {\n element.setAttribute(\"aria-controls\", contentId);\n element.setAttribute(\"aria-expanded\", \"true\");\n } else {\n element.removeAttribute(\"aria-controls\");\n element.setAttribute(\"aria-expanded\", \"false\");\n }\n\n setTabsterAttribute(element, TABSTER_CONFIG_TRIGGER);\n\n const onTriggerClick = (event: MouseEvent) => {\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n if (preventDefault) {\n event.preventDefault();\n }\n\n isOpen.toggle();\n };\n\n element.addEventListener(\"click\", onTriggerClick);\n\n triggerElement.current = element;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n setReference(element);\n\n return () => {\n element.removeEventListener(\"click\", onTriggerClick);\n };\n },\n);\n\ninterface PrivateTriggerSignature {\n Element: HTMLButtonElement;\n Args: {\n triggerModifier: WithBoundArgs<\n typeof trigger,\n \"triggerElement\" | \"contentId\" | \"isOpen\" | \"setReference\"\n >;\n stopPropagation?: boolean;\n preventDefault?: boolean;\n };\n Blocks: { default: [] };\n}\n\nexport interface TriggerSignature {\n Element: PrivateTriggerSignature[\"Element\"];\n Blocks: PrivateTriggerSignature[\"Blocks\"];\n}\n\nconst Trigger: TOC<PrivateTriggerSignature> = <template>\n <button\n type=\"button\"\n {{@triggerModifier stopPropagation=@stopPropagation preventDefault=@preventDefault}}\n ...attributes\n >\n {{yield}}\n </button>\n</template>;\n\nconst IsOpen = () => cell<boolean>(false);\nconst TriggerElement = () => cell<HTMLElement>();\n\nexport class Menu extends Component<Signature> {\n contentId = guidFor(this);\n\n <template>\n {{#let (IsOpen) (TriggerElement) as |isOpen triggerEl|}}\n <Popover\n @flipOptions={{@flipOptions}}\n @middleware={{@middleware}}\n @offsetOptions={{@offsetOptions}}\n @placement={{@placement}}\n @shiftOptions={{@shiftOptions}}\n @strategy={{@strategy}}\n @inline={{@inline}}\n as |p|\n >\n {{#let\n (modifier\n trigger\n triggerElement=triggerEl\n isOpen=isOpen\n contentId=this.contentId\n setReference=p.setReference\n )\n as |triggerModifier|\n }}\n {{yield\n (hash\n trigger=triggerModifier\n Trigger=(component Trigger triggerModifier=triggerModifier)\n Content=(component\n Content\n PopoverContent=p.Content\n isOpen=isOpen\n triggerElement=triggerEl\n contentId=this.contentId\n )\n arrow=p.arrow\n isOpen=isOpen.current\n )\n }}\n {{/let}}\n </Popover>\n {{/let}}\n </template>\n}\n\nexport default Menu;\n"],"names":["TABSTER_CONFIG_CONTENT","getTabsterAttribute","mover","direction","MoverDirections","Both","cyclic","deloser","TABSTER_CONFIG_TRIGGER","Separator","setComponentTemplate","precompileTemplate","strictMode","templateOnly","focusOnHover","e","item","currentTarget","HTMLElement","focus","Item","scope","on","installContent","eModifier","element","_","isOpen","triggerElement","tabster","getTabster","window","firstFocusable","focusable","findFirst","container","onDocumentClick","current","target","contains","onDocumentKeydown","key","document","addEventListener","removeEventListener","Content","hash","trigger","contentId","setReference","stopPropagation","preventDefault","setAttribute","removeAttribute","setTabsterAttribute","onTriggerClick","event","toggle","Trigger","IsOpen","cell","TriggerElement","Menu","Component","guidFor","Popover"],"mappings":";;;;;;;;;;;;AAkBA,MAAMA,yBAAyBC,mBAC7B,CAAA;AACEC,EAAAA,KAAO,EAAA;IACLC,SAAA,EAAWC,gBAAgBC,IAAI;AAC/BC,IAAAA,MAAQ,EAAA;GACV;AACAC,EAAAA,OAAA,EAAS;AACX,CACA,EAAA,IAAA,CAAA;AAGF,MAAMC,sBAAyB,GAAA;AAC7BD,EAAAA,OAAA,EAAS;AACX,CAAA;AA4BA,MAAME,SAAqC,GAAAC,oBAAA,CAAAC,kBAAA,CAI3C,uEAAA,EAAA;EAAAC,UAAA,EAAA;AAAU,CAAA,CAAA,EAAAC,YAAA,EAAA,CAAA;AAEV;;;;;;;;;;;AAWA,SAASC,YAAaA,CAAAC,CAAe,EAAA;AACnC,EAAA,MAAMC,IAAA,GAAOD,EAAEE,aAAa;EAE5B,IAAID,gBAAgBE,WAAa,EAAA;IAC/BF,IAAM,EAAAG,KAAA,EAAA;AACR;AACF;AAQA,MAAMC,IAA2B,GAAAV,oBAAA,CAAAC,kBAAA,CAcjC,+SAAA,EAAA;EAAAC,UAAA,EAAA,IAAA;AAAAS,EAAAA,KAAA,EAAAA,OAAA;IAAAC,EAAA;AAAAR,IAAAA;AAAA,GAAA;AAAU,CAAA,CAAA,EAAAD,YAAA,EAAA,CAAA;AAEV,MAAMU,cAAiB,GAAAC,QAAA,CAQpB,CAACC,SAASC,CAAO,EAAA;EAAEC,MAAM;AAAEC,EAAAA;AAAgB,CAAA,KAAA;AAC5C;AACA,EAAA,MAAMC,UAAUC,UAAW,CAAAC,MAAA,CAAA;AAC3B,EAAA,MAAMC,cAAA,GAAiBH,OAAS,EAAAI,SAAA,CAAUC,SAAU,CAAA;AAClDC,IAAAA,SAAW,EAAAV;AACb,GAAA,CAAA;EAEAO,cAAgB,EAAAb,KAAA,EAAA;AAEhB;EACA,SAASiB,eAAAA,CAAgBrB,CAAa,EAAA;AACpC,IAAA,IACEY,MAAA,CAAOU,OAAO,IACdtB,CAAA,CAAEuB,MAAM,IACR,CAACb,OAAQ,CAAAc,QAAQ,CAACxB,CAAA,CAAEuB,MAAU,CAAA,IAC9B,CAACV,cAAe,CAAAS,OAAO,EAAEE,QAAS,CAAAxB,CAAA,CAAEuB,MACpC,CAAA,EAAA;MACAX,MAAA,CAAOU,OAAO,GAAG,KAAA;AACnB;AACF;AAEA;EACA,SAASG,iBAAAA,CAAkBzB,CAAgB,EAAA;IACzC,IAAIY,OAAOU,OAAO,IAAItB,CAAE,CAAA0B,GAAG,KAAK,QAAU,EAAA;MACxCd,MAAA,CAAOU,OAAO,GAAG,KAAA;AACnB;AACF;AAEAK,EAAAA,QAAS,CAAAC,gBAAgB,CAAC,OAAS,EAAAP,eAAA,CAAA;AACnCM,EAAAA,QAAS,CAAAC,gBAAgB,CAAC,SAAW,EAAAH,iBAAA,CAAA;AAErC,EAAA,OAAO,MAAA;AACLE,IAAAA,QAAS,CAAAE,mBAAmB,CAAC,OAAS,EAAAR,eAAA,CAAA;AACtCM,IAAAA,QAAS,CAAAE,mBAAmB,CAAC,SAAW,EAAAJ,iBAAA,CAAA;GAC1C;AACF,CAAA,CAAA;AAkBA,MAAMK,OAAwC,GAAAnC,oBAAA,CAAAC,kBAAA,CAc9C,qVAAA,EAAA;EAAAC,UAAA,EAAA,IAAA;AAAAS,EAAAA,KAAA,EAAAA,OAAA;IAAArB,sBAAA;IAAAuB,cAAA;IAAAD,EAAA;IAAAwB,IAAA;IAAA1B,IAAA;AAAAX,IAAAA;AAAA,GAAA;AAAU,CAAA,CAAA,EAAAI,YAAA,EAAA,CAAA;AAoBV,MAAMkC,UAAUvB,QAAU,CACxB,CACEC,OACA,EAAAC,CAAA,EACA;EAAEE,cAAc;EAAED,MAAM;EAAEqB,SAAS;EAAEC,YAAY;EAAEC,eAAe;AAAEC,EAAAA;AAAgB,CAAA,KAAA;AAEpF1B,EAAAA,OAAQ,CAAA2B,YAAY,CAAC,eAAiB,EAAA,MAAA,CAAA;EAEtC,IAAIzB,MAAA,CAAOU,OAAO,EAAE;AAClBZ,IAAAA,OAAQ,CAAA2B,YAAY,CAAC,eAAiB,EAAAJ,SAAA,CAAA;AACtCvB,IAAAA,OAAQ,CAAA2B,YAAY,CAAC,eAAiB,EAAA,MAAA,CAAA;AACxC,GAAO,MAAA;AACL3B,IAAAA,OAAA,CAAQ4B,eAAe,CAAC,eAAA,CAAA;AACxB5B,IAAAA,OAAQ,CAAA2B,YAAY,CAAC,eAAiB,EAAA,OAAA,CAAA;AACxC;AAEAE,EAAAA,mBAAA,CAAoB7B,OAAS,EAAAjB,sBAAA,CAAA;EAE7B,MAAM+C,cAAA,GAAkBC,KAAO,IAAA;AAC7B,IAAA,IAAIN,eAAiB,EAAA;MACnBM,KAAA,CAAMN,eAAe,EAAA;AACvB;AAEA,IAAA,IAAIC,cAAgB,EAAA;MAClBK,KAAA,CAAML,cAAc,EAAA;AACtB;IAEAxB,MAAA,CAAO8B,MAAM,EAAA;GACf;AAEAhC,EAAAA,OAAQ,CAAAkB,gBAAgB,CAAC,OAAS,EAAAY,cAAA,CAAA;EAElC3B,cAAA,CAAeS,OAAO,GAAGZ,OAAA;AACzB;EACAwB,YAAa,CAAAxB,OAAA,CAAA;AAEb,EAAA,OAAO,MAAA;AACLA,IAAAA,OAAQ,CAAAmB,mBAAmB,CAAC,OAAS,EAAAW,cAAA,CAAA;GACvC;AACF,CAAA,CAAA;AAqBF,MAAMG,OAAwC,GAAAhD,oBAAA,CAAAC,kBAAA,CAQ9C,+JAAA,EAAA;EAAAC,UAAA,EAAA;AAAU,CAAA,CAAA,EAAAC,YAAA,EAAA,CAAA;AAEV,MAAM8C,MAAS,GAAAA,MAAMC,IAAK,CAAS,KAAA,CAAA;AACnC,MAAMC,cAAA,GAAiBA,MAAMD,IAAK,EAAA;AAE3B,MAAME,aAAaC,SAAU,CAAA;AAClCf,EAAAA,SAAY,GAAAgB,OAAA,CAAQ,IAAI,CAAE;AAE1B,EAAA;IAAAtD,oBAAA,CAAAC,kBAAA,CAwCA,+uBAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAS,MAAAA,KAAA,EAAAA,OAAA;QAAAsC,MAAA;QAAAE,cAAA;QAAAI,OAAA;QAAAlB,OAAA;QAAAD,IAAA;QAAAY,OAAA;AAAAb,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import Component from '@glimmer/component';
|
|
2
|
+
import { hash } from '@ember/helper';
|
|
3
|
+
import { on } from '@ember/modifier';
|
|
4
|
+
import { uniqueId } from '../../utils.js';
|
|
5
|
+
import { RatingRange } from './range.js';
|
|
6
|
+
import { Stars } from './stars.js';
|
|
7
|
+
import { RatingState } from './state.js';
|
|
8
|
+
import { precompileTemplate } from '@ember/template-compilation';
|
|
9
|
+
import { setComponentTemplate } from '@ember/component';
|
|
10
|
+
|
|
11
|
+
class Rating extends Component {
|
|
12
|
+
name = `rating-${uniqueId()}`;
|
|
13
|
+
get icon() {
|
|
14
|
+
return this.args.icon ?? "★";
|
|
15
|
+
}
|
|
16
|
+
get isInteractive() {
|
|
17
|
+
return this.args.interactive ?? true;
|
|
18
|
+
}
|
|
19
|
+
get isChangeable() {
|
|
20
|
+
const readonly = this.args.readonly ?? false;
|
|
21
|
+
return !readonly && this.isInteractive;
|
|
22
|
+
}
|
|
23
|
+
get isReadonly() {
|
|
24
|
+
return !this.isChangeable;
|
|
25
|
+
}
|
|
26
|
+
get needsDescription() {
|
|
27
|
+
return !this.isInteractive;
|
|
28
|
+
}
|
|
29
|
+
static {
|
|
30
|
+
setComponentTemplate(precompileTemplate("\n <RatingState @max={{@max}} @value={{@value}} @name={{this.name}} @readonly={{this.isReadonly}} @onChange={{@onChange}} as |r publicState|>\n <fieldset class=\"ember-primitives__rating\" data-total={{r.total}} data-value={{r.value}} data-readonly={{this.isReadonly}} {{!-- We use event delegation, this isn't a primary interactive -- we're capturing events from inputs --}} {{!-- template-lint-disable no-invalid-interactive --}} {{on \"click\" r.handleClick}} ...attributes>\n {{#let (component Stars stars=r.stars icon=this.icon isReadonly=this.isReadonly name=this.name total=r.total currentValue=r.value) as |RatingStars|}}\n\n {{#if (has-block)}}\n {{yield (hash max=r.total total=r.total value=r.value name=this.name isReadonly=this.isReadonly isChangeable=this.isChangeable Stars=RatingStars Range=(component RatingRange max=r.total value=r.value name=this.name handleChange=r.handleChange))}}\n {{else}}\n {{#if this.needsDescription}}\n {{#if (has-block \"label\")}}\n {{yield publicState to=\"label\"}}\n {{else}}\n <span visually-hidden class=\"ember-primitives__rating__label\">Rated\n {{r.value}}\n out of\n {{r.total}}</span>\n {{/if}}\n {{else}}\n {{#if (has-block \"label\")}}\n <legend>\n {{yield publicState to=\"label\"}}\n </legend>\n {{/if}}\n {{/if}}\n\n <RatingStars />\n {{/if}}\n {{/let}}\n\n </fieldset>\n </RatingState>\n ", {
|
|
31
|
+
strictMode: true,
|
|
32
|
+
scope: () => ({
|
|
33
|
+
RatingState,
|
|
34
|
+
on,
|
|
35
|
+
Stars,
|
|
36
|
+
hash,
|
|
37
|
+
RatingRange
|
|
38
|
+
})
|
|
39
|
+
}), this);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { Rating };
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/rating/index.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\nimport { hash } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\n\nimport { uniqueId } from \"../../utils.ts\";\nimport { RatingRange } from \"./range.gts\";\nimport { Stars } from \"./stars.gts\";\nimport { RatingState } from \"./state.gts\";\n\nimport type { ComponentIcons, StringIcons } from \"./public-types.ts\";\nimport type { WithBoundArgs } from \"@glint/template\";\n\nexport interface Signature {\n /*\n * The element all passed attributes / modifiers are applied to.\n *\n * This is a `<fieldset>`, becaues the rating elements are\n * powered by a group of radio buttons.\n */\n Element: HTMLFieldSetElement;\n Args: (ComponentIcons | StringIcons) & {\n /**\n * The number of stars/whichever-icon to show\n *\n * Defaults to 5\n */\n max?: number;\n\n /**\n * The current number of stars/whichever-icon to show as selected\n *\n * Defaults to 0\n */\n value?: number;\n\n /**\n * Prevents click events on the icons and sets aria-readonly.\n *\n * Also sets data-readonly=true on the wrapping element\n */\n readonly?: boolean;\n\n /**\n * Toggles the ability to interact with the rating component.\n * When `true` (the default), the Rating component can be as a form input\n * to gather user feedback.\n *\n * When false, only the `@value` will be shown, and it cannot be changed.\n */\n interactive?: boolean;\n\n /**\n * Callback when the selected rating changes.\n * Can include half-ratings if the iconHalf argument is passed.\n */\n onChange?: (value: number) => void;\n };\n\n Blocks: {\n default: [\n rating: {\n /**\n * The maximum rating\n */\n max: number;\n /**\n * The maxium rating\n */\n total: number;\n /**\n * The current rating\n */\n value: number;\n /**\n * The name shared by the field group\n */\n name: string;\n /**\n * If the rating can be changed\n */\n isReadonly: boolean;\n /**\n * If the rating can be changed\n */\n isChangeable: boolean;\n /**\n * The stars / items radio group\n */\n Stars: WithBoundArgs<\n typeof Stars,\n \"stars\" | \"icon\" | \"isReadonly\" | \"name\" | \"total\" | \"currentValue\"\n >;\n /**\n * Input range for adjusting the rating via fractional means\n */\n Range: WithBoundArgs<typeof RatingRange, \"max\" | \"value\" | \"name\" | \"handleChange\">;\n },\n ];\n label: [\n state: {\n /**\n * The current rating\n */\n value: number;\n\n /**\n * The maximum rating\n */\n total: number;\n },\n ];\n };\n}\n\nexport class Rating extends Component<Signature> {\n name = `rating-${uniqueId()}`;\n\n get icon() {\n return this.args.icon ?? \"★\";\n }\n\n get isInteractive() {\n return this.args.interactive ?? true;\n }\n\n get isChangeable() {\n const readonly = this.args.readonly ?? false;\n\n return !readonly && this.isInteractive;\n }\n\n get isReadonly() {\n return !this.isChangeable;\n }\n\n get needsDescription() {\n return !this.isInteractive;\n }\n\n <template>\n <RatingState\n @max={{@max}}\n @value={{@value}}\n @name={{this.name}}\n @readonly={{this.isReadonly}}\n @onChange={{@onChange}}\n as |r publicState|\n >\n <fieldset\n class=\"ember-primitives__rating\"\n data-total={{r.total}}\n data-value={{r.value}}\n data-readonly={{this.isReadonly}}\n {{! We use event delegation, this isn't a primary interactive -- we're capturing events from inputs }}\n {{! template-lint-disable no-invalid-interactive }}\n {{on \"click\" r.handleClick}}\n ...attributes\n >\n {{#let\n (component\n Stars\n stars=r.stars\n icon=this.icon\n isReadonly=this.isReadonly\n name=this.name\n total=r.total\n currentValue=r.value\n )\n as |RatingStars|\n }}\n\n {{#if (has-block)}}\n {{yield\n (hash\n max=r.total\n total=r.total\n value=r.value\n name=this.name\n isReadonly=this.isReadonly\n isChangeable=this.isChangeable\n Stars=RatingStars\n Range=(component\n RatingRange max=r.total value=r.value name=this.name handleChange=r.handleChange\n )\n )\n }}\n {{else}}\n {{#if this.needsDescription}}\n {{#if (has-block \"label\")}}\n {{yield publicState to=\"label\"}}\n {{else}}\n <span visually-hidden class=\"ember-primitives__rating__label\">Rated\n {{r.value}}\n out of\n {{r.total}}</span>\n {{/if}}\n {{else}}\n {{#if (has-block \"label\")}}\n <legend>\n {{yield publicState to=\"label\"}}\n </legend>\n {{/if}}\n {{/if}}\n\n <RatingStars />\n {{/if}}\n {{/let}}\n\n </fieldset>\n </RatingState>\n </template>\n}\n"],"names":["Rating","Component","name","uniqueId","icon","args","isInteractive","interactive","isChangeable","readonly","isReadonly","needsDescription","setComponentTemplate","precompileTemplate","strictMode","scope","RatingState","on","Stars","hash","RatingRange"],"mappings":";;;;;;;;;;AAkHO,MAAMA,eAAeC,SAAU,CAAA;AACpCC,EAAAA,IAAA,GAAO,CAAA,OAAA,EAAUC,QAAA,EAAA,CAAY,CAAA;EAE7B,IAAIC,IAAOA,GAAA;AACT,IAAA,OAAO,IAAI,CAACC,IAAI,CAACD,IAAI,IAAI,GAAA;AAC3B;EAEA,IAAIE,aAAgBA,GAAA;AAClB,IAAA,OAAO,IAAI,CAACD,IAAI,CAACE,WAAW,IAAI,IAAA;AAClC;EAEA,IAAIC,YAAeA,GAAA;IACjB,MAAMC,WAAW,IAAI,CAACJ,IAAI,CAACI,QAAQ,IAAI,KAAA;AAEvC,IAAA,OAAO,CAACA,QAAA,IAAY,IAAI,CAACH,aAAa;AACxC;EAEA,IAAII,UAAaA,GAAA;IACf,OAAO,CAAC,IAAI,CAACF,YAAY;AAC3B;EAEA,IAAIG,gBAAmBA,GAAA;IACrB,OAAO,CAAC,IAAI,CAACL,aAAa;AAC5B;AAEA,EAAA;IAAAM,oBAAA,CAAAC,kBAAA,CAuEA,2nDAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;QAAAC,WAAA;QAAAC,EAAA;QAAAC,KAAA;QAAAC,IAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-types.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { on } from '@ember/modifier';
|
|
2
|
+
import { precompileTemplate } from '@ember/template-compilation';
|
|
3
|
+
import { setComponentTemplate } from '@ember/component';
|
|
4
|
+
import templateOnly from '@ember/component/template-only';
|
|
5
|
+
|
|
6
|
+
const RatingRange = setComponentTemplate(precompileTemplate("\n <input ...attributes name={{@name}} type=\"range\" max={{@max}} value={{@value}} {{on \"change\" @handleChange}} />\n", {
|
|
7
|
+
strictMode: true,
|
|
8
|
+
scope: () => ({
|
|
9
|
+
on
|
|
10
|
+
})
|
|
11
|
+
}), templateOnly());
|
|
12
|
+
|
|
13
|
+
export { RatingRange };
|
|
14
|
+
//# sourceMappingURL=range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range.js","sources":["../../../src/components/rating/range.gts"],"sourcesContent":["import { on } from \"@ember/modifier\";\n\nimport type { TOC } from \"@ember/component/template-only\";\n\nexport const RatingRange: TOC<{\n Element: HTMLInputElement;\n Args: {\n name: string;\n max: number;\n value: number;\n handleChange: (event: Event) => void;\n };\n}> = <template>\n <input\n ...attributes\n name={{@name}}\n type=\"range\"\n max={{@max}}\n value={{@value}}\n {{on \"change\" @handleChange}}\n />\n</template>;\n"],"names":["RatingRange","setComponentTemplate","precompileTemplate","strictMode","scope","on","templateOnly"],"mappings":";;;;;MAIaA,WAQR,GAAAC,oBAAA,CAAAC,kBAAA,CASL,2HAAA,EAAA;EAAAC,UAAA,EAAA,IAAA;AAAAC,EAAAA,KAAA,EAAAA,OAAA;AAAAC,IAAAA;AAAA,GAAA;AAAU,CAAE,CAAA,EAAAC,YAAA,EAAA;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { uniqueId } from '../../utils.js';
|
|
2
|
+
import { isString, lte, percentSelected } from './utils.js';
|
|
3
|
+
import { precompileTemplate } from '@ember/template-compilation';
|
|
4
|
+
import { setComponentTemplate } from '@ember/component';
|
|
5
|
+
import templateOnly from '@ember/component/template-only';
|
|
6
|
+
|
|
7
|
+
const Stars = setComponentTemplate(precompileTemplate("\n <div class=\"ember-primitives__rating__items\">\n {{#each @stars as |star|}}\n {{#let (uniqueId) as |id|}}\n <span class=\"ember-primitives__rating__item\" data-number={{star}} data-percent-selected={{percentSelected star @currentValue}} data-selected={{lte star @currentValue}} data-readonly={{@isReadonly}}>\n <label for=\"input-{{id}}\">\n <span visually-hidden>{{star}} star</span>\n <span aria-hidden=\"true\">\n {{#if (isString @icon)}}\n {{@icon}}\n {{else}}\n <@icon @value={{star}} @isSelected={{lte star @currentValue}} @percentSelected={{percentSelected star @currentValue}} @readonly={{@isReadonly}} />\n {{/if}}\n </span>\n </label>\n\n <input id=\"input-{{id}}\" type=\"radio\" name={{@name}} value={{star}} readonly={{@isReadonly}} checked={{lte star @currentValue}} />\n </span>\n {{/let}}\n {{/each}}\n </div>\n", {
|
|
8
|
+
strictMode: true,
|
|
9
|
+
scope: () => ({
|
|
10
|
+
uniqueId,
|
|
11
|
+
percentSelected,
|
|
12
|
+
lte,
|
|
13
|
+
isString
|
|
14
|
+
})
|
|
15
|
+
}), templateOnly());
|
|
16
|
+
|
|
17
|
+
export { Stars };
|
|
18
|
+
//# sourceMappingURL=stars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stars.js","sources":["../../../src/components/rating/stars.gts"],"sourcesContent":["import { uniqueId } from \"../../utils.ts\";\nimport { isString, lte, percentSelected } from \"./utils.ts\";\n\nimport type { ComponentIcons, StringIcons } from \"./public-types.ts\";\nimport type { TOC } from \"@ember/component/template-only\";\n\nexport const Stars: TOC<{\n Args: {\n // Configuration\n stars: number[];\n icon: StringIcons[\"icon\"] | ComponentIcons[\"icon\"];\n isReadonly: boolean;\n\n // HTML Boilerplate\n name: string;\n\n // State\n currentValue: number;\n total: number;\n };\n}> = <template>\n <div class=\"ember-primitives__rating__items\">\n {{#each @stars as |star|}}\n {{#let (uniqueId) as |id|}}\n <span\n class=\"ember-primitives__rating__item\"\n data-number={{star}}\n data-percent-selected={{percentSelected star @currentValue}}\n data-selected={{lte star @currentValue}}\n data-readonly={{@isReadonly}}\n >\n <label for=\"input-{{id}}\">\n <span visually-hidden>{{star}} star</span>\n <span aria-hidden=\"true\">\n {{#if (isString @icon)}}\n {{@icon}}\n {{else}}\n <@icon\n @value={{star}}\n @isSelected={{lte star @currentValue}}\n @percentSelected={{percentSelected star @currentValue}}\n @readonly={{@isReadonly}}\n />\n {{/if}}\n </span>\n </label>\n\n <input\n id=\"input-{{id}}\"\n type=\"radio\"\n name={{@name}}\n value={{star}}\n readonly={{@isReadonly}}\n checked={{lte star @currentValue}}\n />\n </span>\n {{/let}}\n {{/each}}\n </div>\n</template>;\n"],"names":["Stars","setComponentTemplate","precompileTemplate","strictMode","scope","uniqueId","percentSelected","lte","isString","templateOnly"],"mappings":";;;;;;MAMaA,KAcR,GAAAC,oBAAA,CAAAC,kBAAA,CAuCL,k+BAAA,EAAA;EAAAC,UAAA,EAAA,IAAA;AAAAC,EAAAA,KAAA,EAAAA,OAAA;IAAAC,QAAA;IAAAC,eAAA;IAAAC,GAAA;AAAAC,IAAAA;AAAA,GAAA;AAAU,CAAE,CAAA,EAAAC,YAAA,EAAA;;;;"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import Component from '@glimmer/component';
|
|
2
|
+
import { cached } from '@glimmer/tracking';
|
|
3
|
+
import { assert } from '@ember/debug';
|
|
4
|
+
import { hash } from '@ember/helper';
|
|
5
|
+
import { localCopy } from 'tracked-toolbox';
|
|
6
|
+
import { precompileTemplate } from '@ember/template-compilation';
|
|
7
|
+
import { setComponentTemplate } from '@ember/component';
|
|
8
|
+
import { g, i, n } from 'decorator-transforms/runtime';
|
|
9
|
+
|
|
10
|
+
class RatingState extends Component {
|
|
11
|
+
static {
|
|
12
|
+
g(this.prototype, "_value", [localCopy("args.value")]);
|
|
13
|
+
}
|
|
14
|
+
#_value = (i(this, "_value"), void 0); // eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
15
|
+
get value() {
|
|
16
|
+
return this._value ?? 0;
|
|
17
|
+
}
|
|
18
|
+
get stars() {
|
|
19
|
+
return Array.from({
|
|
20
|
+
length: this.args.max ?? 5
|
|
21
|
+
}, (_, index) => index + 1);
|
|
22
|
+
}
|
|
23
|
+
static {
|
|
24
|
+
n(this.prototype, "stars", [cached]);
|
|
25
|
+
}
|
|
26
|
+
setRating = value => {
|
|
27
|
+
if (this.args.readonly) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (value === this._value) {
|
|
31
|
+
this._value = 0;
|
|
32
|
+
} else {
|
|
33
|
+
this._value = value;
|
|
34
|
+
}
|
|
35
|
+
this.args.onChange?.(value);
|
|
36
|
+
};
|
|
37
|
+
setFromString = value => {
|
|
38
|
+
assert("[BUG]: value from input must be a string.", typeof value === "string");
|
|
39
|
+
const num = parseFloat(value);
|
|
40
|
+
if (isNaN(num)) {
|
|
41
|
+
// something went wrong.
|
|
42
|
+
// Since we're using event delegation,
|
|
43
|
+
// this could be from an unrelated input
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.setRating(num);
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Click events are captured by
|
|
50
|
+
* - radio changes (mouse and keyboard)
|
|
51
|
+
* - but only range clicks
|
|
52
|
+
*/
|
|
53
|
+
handleClick = event => {
|
|
54
|
+
// Since we're doing event delegation on a click, we want to make sure
|
|
55
|
+
// we don't do anything on other elements
|
|
56
|
+
const isValid = event.target instanceof HTMLInputElement && event.target.name === this.args.name && event.target.type === "radio";
|
|
57
|
+
if (!isValid) return;
|
|
58
|
+
const selected = event.target?.value;
|
|
59
|
+
this.setFromString(selected);
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Only attached to a range element, if present.
|
|
63
|
+
* Range elements don't fire click events on keyboard usage, like radios do
|
|
64
|
+
*/
|
|
65
|
+
handleChange = event => {
|
|
66
|
+
const isValid = event.target !== null && "value" in event.target;
|
|
67
|
+
if (!isValid) return;
|
|
68
|
+
this.setFromString(event.target.value);
|
|
69
|
+
};
|
|
70
|
+
static {
|
|
71
|
+
setComponentTemplate(precompileTemplate("\n {{yield (hash stars=this.stars total=this.stars.length handleClick=this.handleClick handleChange=this.handleChange setRating=this.setRating value=this.value) (hash total=this.stars.length value=this.value)}}\n ", {
|
|
72
|
+
strictMode: true,
|
|
73
|
+
scope: () => ({
|
|
74
|
+
hash
|
|
75
|
+
})
|
|
76
|
+
}), this);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { RatingState };
|
|
81
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sources":["../../../src/components/rating/state.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\nimport { cached } from \"@glimmer/tracking\";\nimport { assert } from \"@ember/debug\";\nimport { hash } from \"@ember/helper\";\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-expect-error\nimport { localCopy } from \"tracked-toolbox\";\n\nexport class RatingState extends Component<{\n Args: {\n max: number | undefined;\n value: number | undefined;\n readonly: boolean | undefined;\n name: string;\n onChange?: (value: number) => void;\n };\n Blocks: {\n default: [\n internalApi: {\n stars: number[];\n value: number;\n total: number;\n handleClick: (event: Event) => void;\n handleChange: (event: Event) => void;\n setRating: (num: number) => void;\n },\n publicApi: {\n value: number;\n total: number;\n },\n ];\n };\n}> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n @localCopy(\"args.value\") declare _value: number;\n\n get value() {\n return this._value ?? 0;\n }\n\n @cached\n get stars() {\n return Array.from({ length: this.args.max ?? 5 }, (_, index) => index + 1);\n }\n\n setRating = (value: number) => {\n if (this.args.readonly) {\n return;\n }\n\n if (value === this._value) {\n this._value = 0;\n } else {\n this._value = value;\n }\n\n this.args.onChange?.(value);\n };\n\n setFromString = (value: unknown) => {\n assert(\"[BUG]: value from input must be a string.\", typeof value === \"string\");\n\n const num = parseFloat(value);\n\n if (isNaN(num)) {\n // something went wrong.\n // Since we're using event delegation,\n // this could be from an unrelated input\n return;\n }\n\n this.setRating(num);\n };\n\n /**\n * Click events are captured by\n * - radio changes (mouse and keyboard)\n * - but only range clicks\n */\n handleClick = (event: Event) => {\n // Since we're doing event delegation on a click, we want to make sure\n // we don't do anything on other elements\n const isValid =\n event.target instanceof HTMLInputElement &&\n event.target.name === this.args.name &&\n event.target.type === \"radio\";\n\n if (!isValid) return;\n\n const selected = event.target?.value;\n\n this.setFromString(selected);\n };\n\n /**\n * Only attached to a range element, if present.\n * Range elements don't fire click events on keyboard usage, like radios do\n */\n handleChange = (event: Event) => {\n const isValid = event.target !== null && \"value\" in event.target;\n\n if (!isValid) return;\n\n this.setFromString(event.target.value);\n };\n\n <template>\n {{yield\n (hash\n stars=this.stars\n total=this.stars.length\n handleClick=this.handleClick\n handleChange=this.handleChange\n setRating=this.setRating\n value=this.value\n )\n (hash total=this.stars.length value=this.value)\n }}\n </template>\n}\n"],"names":["RatingState","Component","localCopy","i","void 0","value","_value","stars","Array","from","length","args","max","_","index","n","prototype","cached","setRating","readonly","onChange","setFromString","assert","num","parseFloat","isNaN","handleClick","event","isValid","target","HTMLInputElement","name","type","selected","handleChange","setComponentTemplate","precompileTemplate","strictMode","scope","hash"],"mappings":";;;;;;;;;AASO,MAAMA,WAAoB,SAAAC,SAAA;;iCA0B9BC,SAAU,CAAA,YAAA,CAAA,CAAA,CAAA;AAAA;AAAA,EAAA,OAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,QAAA,CAAA,EAAAC,MAAA,EADX;EAGA,IAAIC,KAAQA,GAAA;AACV,IAAA,OAAO,IAAI,CAACC,MAAM,IAAI,CAAA;AACxB;EAEA,IACIC,KAAQA,GAAA;IACV,OAAOC,KAAA,CAAMC,IAAI,CAAC;AAAEC,MAAAA,MAAA,EAAQ,IAAI,CAACC,IAAI,CAACC,GAAG,IAAI;KAAK,EAAA,CAACC,CAAG,EAAAC,KAAA,KAAUA,KAAQ,GAAA,CAAA,CAAA;AAC1E;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,OAAA,EAAA,CAHCC,MAAA,CAAA,CAAA;AAAA;EAKDC,SAAY,GAACb,KAAa,IAAA;AACxB,IAAA,IAAI,IAAI,CAACM,IAAI,CAACQ,QAAQ,EAAE;AACtB,MAAA;AACF;AAEA,IAAA,IAAId,KAAU,KAAA,IAAI,CAACC,MAAM,EAAE;MACzB,IAAI,CAACA,MAAM,GAAG,CAAA;AAChB,KAAO,MAAA;MACL,IAAI,CAACA,MAAM,GAAGD,KAAA;AAChB;AAEA,IAAA,IAAI,CAACM,IAAI,CAACS,QAAQ,GAAGf,KAAA,CAAA;GACrB;EAEFgB,aAAgB,GAAChB,KAAc,IAAA;AAC7BiB,IAAAA,MAAO,CAAA,2CAAA,EAA6C,OAAOjB,KAAU,KAAA,QAAA,CAAA;AAErE,IAAA,MAAMkB,MAAMC,UAAW,CAAAnB,KAAA,CAAA;AAEvB,IAAA,IAAIoB,MAAMF,GAAM,CAAA,EAAA;AACd;AACA;AACA;AACA,MAAA;AACF;AAEA,IAAA,IAAI,CAACL,SAAS,CAACK,GAAA,CAAA;GACf;AAEF;;;;;EAKAG,WAAA,GAAeC,KAAO,IAAA;AACpB;AACA;IACA,MAAMC,OAAA,GACJD,MAAME,MAAM,YAAYC,oBACxBH,KAAM,CAAAE,MAAM,CAACE,IAAI,KAAK,IAAI,CAACpB,IAAI,CAACoB,IAAI,IACpCJ,MAAME,MAAM,CAACG,IAAI,KAAK,OAAA;IAExB,IAAI,CAACJ,OAAS,EAAA;AAEd,IAAA,MAAMK,QAAA,GAAWN,KAAM,CAAAE,MAAM,EAAExB,KAAA;AAE/B,IAAA,IAAI,CAACgB,aAAa,CAACY,QAAA,CAAA;GACnB;AAEF;;;;EAIAC,YAAA,GAAgBP,KAAO,IAAA;AACrB,IAAA,MAAMC,UAAUD,KAAM,CAAAE,MAAM,KAAK,IAAQ,IAAA,OAAA,IAAWF,MAAME,MAAM;IAEhE,IAAI,CAACD,OAAS,EAAA;IAEd,IAAI,CAACP,aAAa,CAACM,KAAM,CAAAE,MAAM,CAACxB,KAAK,CAAA;GACrC;AAEF,EAAA;IAAA8B,oBAAA,CAAAC,kBAAA,CAYA,2NAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function isString(x) {
|
|
2
|
+
return typeof x === 'string';
|
|
3
|
+
}
|
|
4
|
+
function lte(a, b) {
|
|
5
|
+
return a <= b;
|
|
6
|
+
}
|
|
7
|
+
function percentSelected(a, b) {
|
|
8
|
+
const diff = b + 1 - a;
|
|
9
|
+
if (diff < 0) return 0;
|
|
10
|
+
if (diff > 1) return 100;
|
|
11
|
+
if (a === b) return 100;
|
|
12
|
+
const percent = diff * 100;
|
|
13
|
+
return percent;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { isString, lte, percentSelected };
|
|
17
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/components/rating/utils.ts"],"sourcesContent":["export function isString(x: unknown) {\n return typeof x === 'string';\n}\n\nexport function lte(a: number, b: number) {\n return a <= b;\n}\n\nexport function percentSelected(a: number, b: number) {\n const diff = b + 1 - a;\n\n if (diff < 0) return 0;\n if (diff > 1) return 100;\n if (a === b) return 100;\n\n const percent = diff * 100;\n\n return percent;\n}\n"],"names":["isString","x","lte","a","b","percentSelected","diff","percent"],"mappings":"AAAO,SAASA,QAAQA,CAACC,CAAU,EAAE;EACnC,OAAO,OAAOA,CAAC,KAAK,QAAQ;AAC9B;AAEO,SAASC,GAAGA,CAACC,CAAS,EAAEC,CAAS,EAAE;EACxC,OAAOD,CAAC,IAAIC,CAAC;AACf;AAEO,SAASC,eAAeA,CAACF,CAAS,EAAEC,CAAS,EAAE;AACpD,EAAA,MAAME,IAAI,GAAGF,CAAC,GAAG,CAAC,GAAGD,CAAC;AAEtB,EAAA,IAAIG,IAAI,GAAG,CAAC,EAAE,OAAO,CAAC;AACtB,EAAA,IAAIA,IAAI,GAAG,CAAC,EAAE,OAAO,GAAG;AACxB,EAAA,IAAIH,CAAC,KAAKC,CAAC,EAAE,OAAO,GAAG;AAEvB,EAAA,MAAMG,OAAO,GAAGD,IAAI,GAAG,GAAG;AAE1B,EAAA,OAAOC,OAAO;AAChB;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroller.js","sources":["../../src/components/scroller.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\nimport { isDestroyed, isDestroying } from \"@ember/destroyable\";\nimport { hash } from \"@ember/helper\";\n\nimport { modifier } from \"ember-modifier\";\n\n/**\n * Utility component for helping with scrolling in any direction within\n * any of the 4 directions: up, down, left, right.\n *\n * This can be used to auto-scroll content as new content is inserted into the scrollable area, or possibly to bring focus to something on the page.\n */\nexport class Scroller extends Component<{\n /**\n * A containing element is required - in this case, a div.\n * It must be scrollable for this component to work, but can be customized.\n *\n * By default, this element will have some styling applied:\n * overflow: auto;\n *\n * By default, this element will have tabindex=\"0\" to support keyboard usage.\n *\n * The scroll-behavior is \"auto\", which can be controlled via CSS\n * https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior\n *\n */\n Element: HTMLDivElement;\n Blocks: {\n default: [\n {\n /**\n * Scroll the content to the bottom\n *\n * ```gjs\n * import { Scroller } from 'ember-primitives';\n *\n * <template>\n * <Scroller as |s|>\n * ...\n *\n * {{ (s.scrollToBottom) }}\n * </Scroller>\n * </template>\n * ```\n */\n scrollToBottom: () => void;\n /**\n * Scroll the content to the top\n *\n * ```gjs\n * import { Scroller } from 'ember-primitives';\n *\n * <template>\n * <Scroller as |s|>\n * ...\n *\n * {{ (s.scrollToTop) }}\n * </Scroller>\n * </template>\n * ```\n */\n scrollToTop: () => void;\n /**\n * Scroll the content to the left\n *\n * ```gjs\n * import { Scroller } from 'ember-primitives';\n *\n * <template>\n * <Scroller as |s|>\n * ...\n *\n * {{ (s.scrollToLeft) }}\n * </Scroller>\n * </template>\n * ```\n */\n scrollToLeft: () => void;\n /**\n * Scroll the content to the right\n *\n * ```gjs\n * import { Scroller } from 'ember-primitives';\n *\n * <template>\n * <Scroller as |s|>\n * ...\n *\n * {{ (s.scrollToRight) }}\n * </Scroller>\n * </template>\n * ```\n */\n scrollToRight: () => void;\n },\n ];\n };\n}> {\n declare withinElement: HTMLDivElement;\n\n ref = modifier((el: HTMLDivElement) => {\n this.withinElement = el;\n });\n\n #frame?: number;\n\n scrollToBottom = () => {\n if (this.#frame) {\n cancelAnimationFrame(this.#frame);\n }\n\n this.#frame = requestAnimationFrame(() => {\n if (isDestroyed(this) || isDestroying(this)) return;\n\n this.withinElement.scrollTo({\n top: this.withinElement.scrollHeight,\n behavior: \"auto\",\n });\n });\n };\n\n scrollToTop = () => {\n if (this.#frame) {\n cancelAnimationFrame(this.#frame);\n }\n\n this.#frame = requestAnimationFrame(() => {\n if (isDestroyed(this) || isDestroying(this)) return;\n\n this.withinElement.scrollTo({\n top: 0,\n behavior: \"auto\",\n });\n });\n };\n\n scrollToLeft = () => {\n if (this.#frame) {\n cancelAnimationFrame(this.#frame);\n }\n\n this.#frame = requestAnimationFrame(() => {\n if (isDestroyed(this) || isDestroying(this)) return;\n\n this.withinElement.scrollTo({\n left: 0,\n behavior: \"auto\",\n });\n });\n };\n\n scrollToRight = () => {\n if (this.#frame) {\n cancelAnimationFrame(this.#frame);\n }\n\n this.#frame = requestAnimationFrame(() => {\n if (isDestroyed(this) || isDestroying(this)) return;\n\n this.withinElement.scrollTo({\n left: this.withinElement.scrollWidth,\n behavior: \"auto\",\n });\n });\n };\n\n <template>\n <div tabindex=\"0\" ...attributes {{this.ref}}>\n {{yield\n (hash\n scrollToBottom=this.scrollToBottom\n scrollToTop=this.scrollToTop\n scrollToLeft=this.scrollToLeft\n scrollToRight=this.scrollToRight\n )\n }}\n </div>\n </template>\n}\n"],"names":["Scroller","Component","
|
|
1
|
+
{"version":3,"file":"scroller.js","sources":["../../src/components/scroller.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\nimport { isDestroyed, isDestroying } from \"@ember/destroyable\";\nimport { hash } from \"@ember/helper\";\n\nimport { modifier } from \"ember-modifier\";\n\n/**\n * Utility component for helping with scrolling in any direction within\n * any of the 4 directions: up, down, left, right.\n *\n * This can be used to auto-scroll content as new content is inserted into the scrollable area, or possibly to bring focus to something on the page.\n */\nexport class Scroller extends Component<{\n /**\n * A containing element is required - in this case, a div.\n * It must be scrollable for this component to work, but can be customized.\n *\n * By default, this element will have some styling applied:\n * overflow: auto;\n *\n * By default, this element will have tabindex=\"0\" to support keyboard usage.\n *\n * The scroll-behavior is \"auto\", which can be controlled via CSS\n * https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior\n *\n */\n Element: HTMLDivElement;\n Blocks: {\n default: [\n {\n /**\n * Scroll the content to the bottom\n *\n * ```gjs\n * import { Scroller } from 'ember-primitives';\n *\n * <template>\n * <Scroller as |s|>\n * ...\n *\n * {{ (s.scrollToBottom) }}\n * </Scroller>\n * </template>\n * ```\n */\n scrollToBottom: () => void;\n /**\n * Scroll the content to the top\n *\n * ```gjs\n * import { Scroller } from 'ember-primitives';\n *\n * <template>\n * <Scroller as |s|>\n * ...\n *\n * {{ (s.scrollToTop) }}\n * </Scroller>\n * </template>\n * ```\n */\n scrollToTop: () => void;\n /**\n * Scroll the content to the left\n *\n * ```gjs\n * import { Scroller } from 'ember-primitives';\n *\n * <template>\n * <Scroller as |s|>\n * ...\n *\n * {{ (s.scrollToLeft) }}\n * </Scroller>\n * </template>\n * ```\n */\n scrollToLeft: () => void;\n /**\n * Scroll the content to the right\n *\n * ```gjs\n * import { Scroller } from 'ember-primitives';\n *\n * <template>\n * <Scroller as |s|>\n * ...\n *\n * {{ (s.scrollToRight) }}\n * </Scroller>\n * </template>\n * ```\n */\n scrollToRight: () => void;\n },\n ];\n };\n}> {\n declare withinElement: HTMLDivElement;\n\n ref = modifier((el: HTMLDivElement) => {\n this.withinElement = el;\n });\n\n #frame?: number;\n\n scrollToBottom = () => {\n if (this.#frame) {\n cancelAnimationFrame(this.#frame);\n }\n\n this.#frame = requestAnimationFrame(() => {\n if (isDestroyed(this) || isDestroying(this)) return;\n\n this.withinElement.scrollTo({\n top: this.withinElement.scrollHeight,\n behavior: \"auto\",\n });\n });\n };\n\n scrollToTop = () => {\n if (this.#frame) {\n cancelAnimationFrame(this.#frame);\n }\n\n this.#frame = requestAnimationFrame(() => {\n if (isDestroyed(this) || isDestroying(this)) return;\n\n this.withinElement.scrollTo({\n top: 0,\n behavior: \"auto\",\n });\n });\n };\n\n scrollToLeft = () => {\n if (this.#frame) {\n cancelAnimationFrame(this.#frame);\n }\n\n this.#frame = requestAnimationFrame(() => {\n if (isDestroyed(this) || isDestroying(this)) return;\n\n this.withinElement.scrollTo({\n left: 0,\n behavior: \"auto\",\n });\n });\n };\n\n scrollToRight = () => {\n if (this.#frame) {\n cancelAnimationFrame(this.#frame);\n }\n\n this.#frame = requestAnimationFrame(() => {\n if (isDestroyed(this) || isDestroying(this)) return;\n\n this.withinElement.scrollTo({\n left: this.withinElement.scrollWidth,\n behavior: \"auto\",\n });\n });\n };\n\n <template>\n <div tabindex=\"0\" ...attributes {{this.ref}}>\n {{yield\n (hash\n scrollToBottom=this.scrollToBottom\n scrollToTop=this.scrollToTop\n scrollToLeft=this.scrollToLeft\n scrollToRight=this.scrollToRight\n )\n }}\n </div>\n </template>\n}\n"],"names":["Scroller","Component","ref","modifier","el","withinElement","scrollToBottom","cancelAnimationFrame","requestAnimationFrame","isDestroyed","isDestroying","scrollTo","top","scrollHeight","behavior","scrollToTop","scrollToLeft","left","scrollToRight","scrollWidth","setComponentTemplate","precompileTemplate","strictMode","scope","hash"],"mappings":";;;;;;;AAYO,MAAMA,QAAiB,SAAAC,SAAA;AAwF5BC,EAAAA,GAAM,GAAAC,QAAA,CAAUC,EAAI,IAAA;IAClB,IAAI,CAACC,aAAa,GAAGD,EAAA;AACvB,GAAG,CAAA;AAEH,EAAA,MAAM;EAENE,cAAiB,GAAAA,MAAA;AACf,IAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACfC,MAAAA,oBAAqB,CAAA,IAAI,CAAC,MAAM,CAAA;AAClC;AAEA,IAAA,IAAI,CAAC,MAAM,GAAGC,qBAAsB,CAAA,MAAA;MAClC,IAAIC,WAAY,CAAA,IAAI,CAAK,IAAAC,YAAA,CAAa,IAAI,CAAG,EAAA;AAE7C,MAAA,IAAI,CAACL,aAAa,CAACM,QAAQ,CAAC;AAC1BC,QAAAA,GAAA,EAAK,IAAI,CAACP,aAAa,CAACQ,YAAY;AACpCC,QAAAA,QAAU,EAAA;AACZ,OAAA,CAAA;AACF,KAAA,CAAA;GACA;EAEFC,WAAc,GAAAA,MAAA;AACZ,IAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACfR,MAAAA,oBAAqB,CAAA,IAAI,CAAC,MAAM,CAAA;AAClC;AAEA,IAAA,IAAI,CAAC,MAAM,GAAGC,qBAAsB,CAAA,MAAA;MAClC,IAAIC,WAAY,CAAA,IAAI,CAAK,IAAAC,YAAA,CAAa,IAAI,CAAG,EAAA;AAE7C,MAAA,IAAI,CAACL,aAAa,CAACM,QAAQ,CAAC;AAC1BC,QAAAA,GAAK,EAAA,CAAA;AACLE,QAAAA,QAAU,EAAA;AACZ,OAAA,CAAA;AACF,KAAA,CAAA;GACA;EAEFE,YAAe,GAAAA,MAAA;AACb,IAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACfT,MAAAA,oBAAqB,CAAA,IAAI,CAAC,MAAM,CAAA;AAClC;AAEA,IAAA,IAAI,CAAC,MAAM,GAAGC,qBAAsB,CAAA,MAAA;MAClC,IAAIC,WAAY,CAAA,IAAI,CAAK,IAAAC,YAAA,CAAa,IAAI,CAAG,EAAA;AAE7C,MAAA,IAAI,CAACL,aAAa,CAACM,QAAQ,CAAC;AAC1BM,QAAAA,IAAM,EAAA,CAAA;AACNH,QAAAA,QAAU,EAAA;AACZ,OAAA,CAAA;AACF,KAAA,CAAA;GACA;EAEFI,aAAgB,GAAAA,MAAA;AACd,IAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACfX,MAAAA,oBAAqB,CAAA,IAAI,CAAC,MAAM,CAAA;AAClC;AAEA,IAAA,IAAI,CAAC,MAAM,GAAGC,qBAAsB,CAAA,MAAA;MAClC,IAAIC,WAAY,CAAA,IAAI,CAAK,IAAAC,YAAA,CAAa,IAAI,CAAG,EAAA;AAE7C,MAAA,IAAI,CAACL,aAAa,CAACM,QAAQ,CAAC;AAC1BM,QAAAA,IAAA,EAAM,IAAI,CAACZ,aAAa,CAACc,WAAW;AACpCL,QAAAA,QAAU,EAAA;AACZ,OAAA,CAAA;AACF,KAAA,CAAA;GACA;AAEF,EAAA;IAAAM,oBAAA,CAAAC,kBAAA,CAWA,+NAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"}
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,7 @@ export { Popover } from './components/popover.js';
|
|
|
14
14
|
export { Portal } from './components/portal.js';
|
|
15
15
|
export { TARGETS as PORTALS, PortalTargets } from './components/portal-targets.js';
|
|
16
16
|
export { Progress } from './components/progress.js';
|
|
17
|
+
export { Rating } from './components/rating/index.js';
|
|
17
18
|
export { Scroller } from './components/scroller.js';
|
|
18
19
|
export { Shadowed } from './components/shadowed.js';
|
|
19
20
|
export { Switch } from './components/switch.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * DANGER: this is a *barrel file*\n *\n * It forces the whole library to be loaded and all dependencies.\n *\n * If you have a small app, you probably don't want to import from here -- instead import from each sub-path.\n */\nimport { importSync, isDevelopingApp, macroCondition } from '@embroider/macros';\n\nif (macroCondition(isDevelopingApp())) {\n importSync('./components/violations.css');\n}\n\nexport { Accordion } from './components/accordion.gts';\nexport type {\n AccordionContentExternalSignature,\n AccordionHeaderExternalSignature,\n AccordionItemExternalSignature,\n AccordionTriggerExternalSignature,\n} from './components/accordion/public.ts';\nexport { Avatar } from './components/avatar.gts';\nexport { Dialog, Dialog as Modal } from './components/dialog.gts';\nexport { ExternalLink } from './components/external-link.gts';\nexport { Form } from './components/form.gts';\nexport { Key, KeyCombo } from './components/keys.gts';\nexport { StickyFooter } from './components/layout/sticky-footer.gts';\nexport { Link } from './components/link.gts';\nexport { Menu } from './components/menu.gts';\nexport { OTP, OTPInput } from './components/one-time-password/index.gts';\nexport { Popover } from './components/popover.gts';\nexport { Portal } from './components/portal.gts';\nexport { PortalTargets } from './components/portal-targets.gts';\nexport { TARGETS as PORTALS } from './components/portal-targets.gts';\nexport { Progress } from './components/progress.gts';\nexport { Scroller } from './components/scroller.gts';\nexport { Shadowed } from './components/shadowed.gts';\nexport { Switch } from './components/switch.gts';\nexport { Toggle } from './components/toggle.gts';\nexport { ToggleGroup } from './components/toggle-group.gts';\nexport { VisuallyHidden } from './components/visually-hidden.gts';\nexport { Zoetrope } from './components/zoetrope.ts';\nexport * from './helpers.ts';\n"],"names":["macroCondition","isDevelopingApp","importSync"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * DANGER: this is a *barrel file*\n *\n * It forces the whole library to be loaded and all dependencies.\n *\n * If you have a small app, you probably don't want to import from here -- instead import from each sub-path.\n */\nimport { importSync, isDevelopingApp, macroCondition } from '@embroider/macros';\n\nif (macroCondition(isDevelopingApp())) {\n importSync('./components/violations.css');\n}\n\nexport { Accordion } from './components/accordion.gts';\nexport type {\n AccordionContentExternalSignature,\n AccordionHeaderExternalSignature,\n AccordionItemExternalSignature,\n AccordionTriggerExternalSignature,\n} from './components/accordion/public.ts';\nexport { Avatar } from './components/avatar.gts';\nexport { Dialog, Dialog as Modal } from './components/dialog.gts';\nexport { ExternalLink } from './components/external-link.gts';\nexport { Form } from './components/form.gts';\nexport { Key, KeyCombo } from './components/keys.gts';\nexport { StickyFooter } from './components/layout/sticky-footer.gts';\nexport { Link } from './components/link.gts';\nexport { Menu } from './components/menu.gts';\nexport { OTP, OTPInput } from './components/one-time-password/index.gts';\nexport { Popover } from './components/popover.gts';\nexport { Portal } from './components/portal.gts';\nexport { PortalTargets } from './components/portal-targets.gts';\nexport { TARGETS as PORTALS } from './components/portal-targets.gts';\nexport { Progress } from './components/progress.gts';\nexport { Rating } from './components/rating.gts';\nexport { Scroller } from './components/scroller.gts';\nexport { Shadowed } from './components/shadowed.gts';\nexport { Switch } from './components/switch.gts';\nexport { Toggle } from './components/toggle.gts';\nexport { ToggleGroup } from './components/toggle-group.gts';\nexport { VisuallyHidden } from './components/visually-hidden.gts';\nexport { Zoetrope } from './components/zoetrope.ts';\nexport * from './helpers.ts';\n"],"names":["macroCondition","isDevelopingApp","importSync"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA,IAAIA,cAAc,CAACC,eAAe,EAAE,CAAC,EAAE;EACrCC,UAAU,CAAC,6BAA6B,CAAC;AAC3C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { assert } from '@ember/debug';
|
|
2
|
+
import { find, findAll, click, fillIn } from '@ember/test-helpers';
|
|
3
|
+
|
|
4
|
+
const selectors = {
|
|
5
|
+
root: '.ember-primitives__rating',
|
|
6
|
+
item: '.ember-primitives__rating__item',
|
|
7
|
+
label: '.ember-primitives__rating__label'};
|
|
8
|
+
const stars = {
|
|
9
|
+
selected: '★',
|
|
10
|
+
unselected: '☆'
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Test utility for interacting with the
|
|
15
|
+
* Rating component.
|
|
16
|
+
*
|
|
17
|
+
* Simulates user behavior and provides high level functions so you don't need to worry about the DOM.
|
|
18
|
+
*
|
|
19
|
+
* Actual elements are not exposed, as the elements are private API.
|
|
20
|
+
* Even as you build a design system, the DOM should not be exposed to your consumers.
|
|
21
|
+
*/
|
|
22
|
+
function rating(selector) {
|
|
23
|
+
const root = `${selector ?? ''}${selectors.root}`;
|
|
24
|
+
return new RatingPageObject(root);
|
|
25
|
+
}
|
|
26
|
+
class RatingPageObject {
|
|
27
|
+
#root;
|
|
28
|
+
constructor(root) {
|
|
29
|
+
this.#root = root;
|
|
30
|
+
}
|
|
31
|
+
get #rootElement() {
|
|
32
|
+
const element = find(this.#root);
|
|
33
|
+
assert(`Could not find the root element for the <Rating> component. Used the selector \`${this.#root}\`. Was it rendered?`, element);
|
|
34
|
+
return element;
|
|
35
|
+
}
|
|
36
|
+
get #labelElement() {
|
|
37
|
+
const element = find(`${this.#root} ${selectors.label}`);
|
|
38
|
+
assert(`Could not find the label for the <Rating> component. Was it rendered?`, element);
|
|
39
|
+
return element;
|
|
40
|
+
}
|
|
41
|
+
get label() {
|
|
42
|
+
return this.#labelElement.textContent?.replaceAll(/\s+/g, ' ').trim();
|
|
43
|
+
}
|
|
44
|
+
get #starElements() {
|
|
45
|
+
const elements = findAll(`${this.#root} ${selectors.item}`);
|
|
46
|
+
assert(`There are no stars/items. Is the <Rating> component misconfigured?`, elements.length > 0);
|
|
47
|
+
return elements;
|
|
48
|
+
}
|
|
49
|
+
get stars() {
|
|
50
|
+
const elements = this.#starElements;
|
|
51
|
+
return elements.map(x => x.hasAttribute('data-selected') ? stars.selected : stars.unselected).join(' ');
|
|
52
|
+
}
|
|
53
|
+
get starTexts() {
|
|
54
|
+
const elements = this.#starElements;
|
|
55
|
+
return elements.map(x => x.querySelector('[aria-hidden]')?.textContent?.trim()).join(' ');
|
|
56
|
+
}
|
|
57
|
+
get value() {
|
|
58
|
+
const value = this.#rootElement.getAttribute(`data-value`);
|
|
59
|
+
assert(`data-value attribute is missing on element '${this.#root}'`, value);
|
|
60
|
+
const number = parseFloat(value);
|
|
61
|
+
return number;
|
|
62
|
+
}
|
|
63
|
+
get isReadonly() {
|
|
64
|
+
return this.#starElements.every(x => x.hasAttribute('data-readonly'));
|
|
65
|
+
}
|
|
66
|
+
async select(stars) {
|
|
67
|
+
const root = this.#rootElement;
|
|
68
|
+
const star = root.querySelector(`[data-number="${stars}"] input`);
|
|
69
|
+
if (star) {
|
|
70
|
+
await click(star);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* When we don't have an input, we require an input --
|
|
76
|
+
* which is also the only way we can choose non-integer values.
|
|
77
|
+
*
|
|
78
|
+
* Should be able to be a number input or range input.
|
|
79
|
+
*/
|
|
80
|
+
const input = root.querySelector('input[type="number"], input[type="range"]');
|
|
81
|
+
if (input) {
|
|
82
|
+
await fillIn(input, `${stars}`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const available = [...root.querySelectorAll('[data-number]')].map(x => x.getAttribute('data-number'));
|
|
86
|
+
assert(`Could not find item/star in <Rating> with value '${stars}' (or a number or range input with the same "name" value). Is the number (${stars}) correct and in-range for this component? The found available values are ${available.join(', ')}.`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export { rating };
|
|
91
|
+
//# sourceMappingURL=rating.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating.js","sources":["../../src/test-support/rating.ts"],"sourcesContent":["import { assert } from '@ember/debug';\nimport { click, fillIn, find, findAll } from '@ember/test-helpers';\n\nconst selectors = {\n root: '.ember-primitives__rating',\n item: '.ember-primitives__rating__item',\n label: '.ember-primitives__rating__label',\n\n rootData: {\n total: '[data-total]',\n value: '[data-value]',\n },\n\n itemData: {\n number: '[data-number]',\n readonly: '[data-readonly]',\n selected: '[data-selected]',\n itemPercent: '[data-percent-selected]',\n },\n};\n\nconst stars = {\n selected: '★',\n unselected: '☆',\n};\n\n/**\n * Test utility for interacting with the\n * Rating component.\n *\n * Simulates user behavior and provides high level functions so you don't need to worry about the DOM.\n *\n * Actual elements are not exposed, as the elements are private API.\n * Even as you build a design system, the DOM should not be exposed to your consumers.\n */\nexport function rating(selector?: string) {\n const root = `${selector ?? ''}${selectors.root}`;\n\n return new RatingPageObject(root);\n}\n\nclass RatingPageObject {\n #root: string;\n\n constructor(root: string) {\n this.#root = root;\n }\n\n get #rootElement() {\n const element = find(this.#root);\n\n assert(\n `Could not find the root element for the <Rating> component. Used the selector \\`${this.#root}\\`. Was it rendered?`,\n element\n );\n\n return element;\n }\n\n get #labelElement() {\n const element = find(`${this.#root} ${selectors.label}`);\n\n assert(`Could not find the label for the <Rating> component. Was it rendered?`, element);\n\n return element;\n }\n\n get label() {\n return this.#labelElement.textContent?.replaceAll(/\\s+/g, ' ').trim();\n }\n\n get #starElements() {\n const elements = findAll(`${this.#root} ${selectors.item}`);\n\n assert(\n `There are no stars/items. Is the <Rating> component misconfigured?`,\n elements.length > 0\n );\n\n return elements as HTMLElement[];\n }\n\n get stars() {\n const elements = this.#starElements;\n\n return elements\n .map((x) => (x.hasAttribute('data-selected') ? stars.selected : stars.unselected))\n .join(' ');\n }\n\n get starTexts() {\n const elements = this.#starElements;\n\n return elements.map((x) => x.querySelector('[aria-hidden]')?.textContent?.trim()).join(' ');\n }\n\n get value() {\n const value = this.#rootElement.getAttribute(`data-value`);\n\n assert(`data-value attribute is missing on element '${this.#root}'`, value);\n\n const number = parseFloat(value);\n\n return number;\n }\n\n get isReadonly() {\n return this.#starElements.every((x) => x.hasAttribute('data-readonly'));\n }\n\n async select(stars: number) {\n const root = this.#rootElement;\n\n const star = root.querySelector(`[data-number=\"${stars}\"] input`);\n\n if (star) {\n await click(star);\n\n return;\n }\n\n /**\n * When we don't have an input, we require an input --\n * which is also the only way we can choose non-integer values.\n *\n * Should be able to be a number input or range input.\n */\n const input = root.querySelector('input[type=\"number\"], input[type=\"range\"]');\n\n if (input) {\n await fillIn(input, `${stars}`);\n\n return;\n }\n\n const available = [...root.querySelectorAll('[data-number]')].map((x) =>\n x.getAttribute('data-number')\n );\n\n assert(\n `Could not find item/star in <Rating> with value '${stars}' (or a number or range input with the same \"name\" value). Is the number (${stars}) correct and in-range for this component? The found available values are ${available.join(', ')}.`\n );\n }\n}\n"],"names":["selectors","root","item","label","stars","selected","unselected","rating","selector","RatingPageObject","constructor","#rootElement","element","find","assert","#labelElement","textContent","replaceAll","trim","#starElements","elements","findAll","length","map","x","hasAttribute","join","starTexts","querySelector","value","getAttribute","number","parseFloat","isReadonly","every","select","star","click","input","fillIn","available","querySelectorAll"],"mappings":"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"}
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["// this is copy pasted from https://github.com/emberjs/ember.js/blob/60d2e0cddb353aea0d6e36a72fda971010d92355/packages/%40ember/-internals/glimmer/lib/helpers/unique-id.ts\n// Unfortunately due to https://github.com/emberjs/ember.js/issues/20165 we cannot use the built-in version in template tags\nexport function uniqueId() {\n // @ts-expect-error this one-liner abuses weird JavaScript semantics that\n // TypeScript (legitimately) doesn't like, but they're nonetheless valid and\n // specced.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/restrict-plus-operands, @typescript-eslint/no-unsafe-member-access\n return ([3e7] + -1e3 + -4e3 + -2e3 + -1e11).replace(/[0-3]/g, (a) =>\n ((a * 4) ^ ((Math.random() * 16) >> (a & 2))).toString(16)\n );\n}\n"],"names":["uniqueId","replace","a","Math","random","toString"],"mappings":"AAAA;AACA;AACO,SAASA,QAAQA,
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["// this is copy pasted from https://github.com/emberjs/ember.js/blob/60d2e0cddb353aea0d6e36a72fda971010d92355/packages/%40ember/-internals/glimmer/lib/helpers/unique-id.ts\n// Unfortunately due to https://github.com/emberjs/ember.js/issues/20165 we cannot use the built-in version in template tags\nexport function uniqueId(): string {\n // @ts-expect-error this one-liner abuses weird JavaScript semantics that\n // TypeScript (legitimately) doesn't like, but they're nonetheless valid and\n // specced.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/restrict-plus-operands, @typescript-eslint/no-unsafe-member-access\n return ([3e7] + -1e3 + -4e3 + -2e3 + -1e11).replace(/[0-3]/g, (a) =>\n ((a * 4) ^ ((Math.random() * 16) >> (a & 2))).toString(16)\n );\n}\n"],"names":["uniqueId","replace","a","Math","random","toString"],"mappings":"AAAA;AACA;AACO,SAASA,QAAQA,GAAW;AACjC;AACA;AACA;AACA;EACA,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAEC,OAAO,CAAC,QAAQ,EAAGC,CAAC,IAC9D,CAAEA,CAAC,GAAG,CAAC,GAAMC,IAAI,CAACC,MAAM,EAAE,GAAG,EAAE,KAAMF,CAAC,GAAG,CAAC,CAAE,EAAEG,QAAQ,CAAC,EAAE,CAC3D,CAAC;AACH;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ember-primitives",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.1",
|
|
4
4
|
"description": "Making apps easier to build",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"*.css"
|
|
@@ -17,16 +17,16 @@
|
|
|
17
17
|
"declarations"
|
|
18
18
|
],
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@babel/runtime": "^7.
|
|
20
|
+
"@babel/runtime": "^7.27.0",
|
|
21
21
|
"@embroider/addon-shim": "^1.9.0",
|
|
22
|
-
"@embroider/macros": "^1.
|
|
22
|
+
"@embroider/macros": "^1.17.1",
|
|
23
23
|
"@floating-ui/dom": "^1.5.3",
|
|
24
24
|
"decorator-transforms": "^2.3.0",
|
|
25
25
|
"ember-element-helper": ">= 0.8.6",
|
|
26
26
|
"form-data-utils": "^0.6.0",
|
|
27
|
-
"reactiveweb": "^1.
|
|
27
|
+
"reactiveweb": "^1.4.2",
|
|
28
28
|
"should-handle-link": "^1.2.2",
|
|
29
|
-
"tabster": "^8.2
|
|
29
|
+
"tabster": "^8.5.2",
|
|
30
30
|
"tracked-built-ins": "^4.0.0",
|
|
31
31
|
"tracked-toolbox": "^2.0.0"
|
|
32
32
|
},
|
|
@@ -39,30 +39,31 @@
|
|
|
39
39
|
"@babel/plugin-syntax-decorators": "^7.25.9",
|
|
40
40
|
"@babel/plugin-transform-class-static-block": "^7.26.0",
|
|
41
41
|
"@babel/plugin-transform-private-methods": "^7.25.9",
|
|
42
|
-
"@babel/preset-typescript": "^7.
|
|
43
|
-
"@ember/test-helpers": "^5.
|
|
44
|
-
"@ember/test-waiters": "^4.
|
|
45
|
-
"@embroider/addon-dev": "7.1
|
|
42
|
+
"@babel/preset-typescript": "^7.27.0",
|
|
43
|
+
"@ember/test-helpers": "^5.2.0",
|
|
44
|
+
"@ember/test-waiters": "^4.1.0",
|
|
45
|
+
"@embroider/addon-dev": "^7.0.1",
|
|
46
46
|
"@glimmer/component": "^2.0.0",
|
|
47
47
|
"@glimmer/tracking": "^1.1.2",
|
|
48
|
-
"@glint/core": "
|
|
49
|
-
"@glint/environment-ember-loose": "
|
|
50
|
-
"@glint/environment-ember-template-imports": "
|
|
48
|
+
"@glint/core": "1.5.2",
|
|
49
|
+
"@glint/environment-ember-loose": "1.4.1-unstable.5564fc2",
|
|
50
|
+
"@glint/environment-ember-template-imports": "1.5.2",
|
|
51
51
|
"@glint/template": "^1.5.2",
|
|
52
52
|
"@nullvoxpopuli/eslint-configs": "^5.1.1",
|
|
53
53
|
"@rollup/plugin-babel": "^6.0.4",
|
|
54
54
|
"@tsconfig/ember": "^3.0.5",
|
|
55
|
-
"babel-plugin-ember-template-compilation": "^2.
|
|
55
|
+
"babel-plugin-ember-template-compilation": "^2.4.0",
|
|
56
56
|
"concurrently": "^9.1.0",
|
|
57
57
|
"ember-modifier": "^4.1.0",
|
|
58
|
-
"ember-resources": "^7.0.
|
|
59
|
-
"ember-source": "
|
|
58
|
+
"ember-resources": "^7.0.4",
|
|
59
|
+
"ember-source": "6.5.0-alpha.2",
|
|
60
60
|
"ember-template-lint": "^7.0.1",
|
|
61
|
-
"eslint": "^9.
|
|
61
|
+
"eslint": "^9.23.0",
|
|
62
|
+
"fix-bad-declaration-output": "^1.1.4",
|
|
62
63
|
"prettier": "^3.2.5",
|
|
63
64
|
"prettier-plugin-ember-template-tag": "^2.0.4",
|
|
64
|
-
"publint": "^0.3.
|
|
65
|
-
"rollup": "~4.
|
|
65
|
+
"publint": "^0.3.9",
|
|
66
|
+
"rollup": "~4.40.0",
|
|
66
67
|
"rollup-plugin-copy": "^3.5.0",
|
|
67
68
|
"typescript": "^5.8.2"
|
|
68
69
|
},
|
|
@@ -120,12 +121,10 @@
|
|
|
120
121
|
"peerDependencies": {
|
|
121
122
|
"@ember/test-helpers": ">= 3.2.0",
|
|
122
123
|
"@ember/test-waiters": ">= 3.0.2",
|
|
123
|
-
"@glimmer/component": "
|
|
124
|
-
"@glimmer/tracking": ">= 1.1.2",
|
|
124
|
+
"@glimmer/component": "^2.0.0",
|
|
125
125
|
"@glint/template": ">= 1.0.0",
|
|
126
126
|
"ember-modifier": ">= 4.1.0",
|
|
127
|
-
"ember-resources": ">= 6.1.0"
|
|
128
|
-
"ember-source": ">= 4.12.0"
|
|
127
|
+
"ember-resources": ">= 6.1.0"
|
|
129
128
|
},
|
|
130
129
|
"peerDependenciesMeta": {
|
|
131
130
|
"@ember/test-helpers": {
|
|
@@ -143,7 +142,7 @@
|
|
|
143
142
|
"lint:js:fix": "pnpm -w exec lint js:fix",
|
|
144
143
|
"lint:hbs": "pnpm -w exec lint hbs",
|
|
145
144
|
"lint:hbs:fix": "pnpm -w exec lint hbs:fix",
|
|
146
|
-
"
|
|
145
|
+
"_lint:package": "pnpm publint",
|
|
147
146
|
"lint:published-types": "attw *.tgz || exit 0",
|
|
148
147
|
"lint:prettier:fix": "pnpm -w exec lint prettier:fix",
|
|
149
148
|
"lint:prettier": "pnpm -w exec lint prettier",
|